본문 바로가기
공부 목록/IT & 프로그래밍

박스차트를 그려주는 python의 boxplot() 함수

by 독학박사 2023. 5. 22.

목차


     데이터 분석을 수행할 때 각양각색의 데이터 가시화를 해야 합니다. 파이썬 라이브러리에 포함되어 있는 boxplot()은 박스차트를 그려주는 함수로 데이터의 종류별 분포(데이터가 쏠려 있는지, 이상치가 있는지 등)를 확인하는 데 사용됩니다. 보고자료를 작성할 때도 박스차트는 훌륭한 인사이트를 제공하기 때문에 잘 알아두면 유용하게 사용할 수 있습니다.

     

    박스차트를 그려주는 boxplot() 함수
    박스차트를 그려주는 boxplot() 함수

     

    1. 박스 차트란?

     박스차트는 데이터의 분포와 이상치를 시각적으로 확인하는 데 도움이 됩니다. 주요한 통계적 측면을 한눈에 파악할 수 있으며, 데이터 집합의 중앙값과 사분위수 범위(IQR)를 쉽게 확인할 수 있습니다. 또한, 이상치의 존재를 확인하고 데이터의 대표성과 특성을 평가하는 데 도움이 됩니다. 박스차트에는 아래와 같은 정보를 포함하고 있습니다.

     

    최소값(Minimum): 데이터의 최솟값을 나타냅니다.
    제1사분위수(First Quartile, Q1): 전체 데이터의 25%에 해당하는 값입니다.
    중앙값(Median 또는 Second Quartile, Q2): 전체 데이터의 50%에 해당하는 값입니다.
    제3사분위수(Third Quartile, Q3): 전체 데이터의 75%에 해당하는 값입니다.
    최대값(Maximum): 데이터의 최댓값을 나타냅니다.
    이상치(Outliers): 일반적인 데이터 분포에서 벗어난 값들입니다. 이상치는 주어진 데이터 집합에서 특이한 값으로 간주됩니다.

     

     박스차트는 다른 변수나 그룹 간의 비교를 수행하기 위해 여러 개의 상자를 동시에 그리는 데에도 사용될 수 있습니다. 이를 통해 데이터 분포의 차이를 시각적으로 비교할 수 있습니다. 즉, 데이터의 분포와 이상치를 시각화하여 데이터의 특성을 파악하고 비교하는 데에 유리한 도구입니다.

     

     

     2. boxplot() 함수 사용법

    matplotlib 홈페이지에서 제공하는 boxplot() 함수의 정의 코드는 아래와 같습니다.

     

    matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None,
    		whis=None, positions=None, widths=None, patch_artist=None,
            	bootstrap=None, usermedians=None, conf_intervals=None,
            	meanline=None, showmeans=None, showcaps=None, showbox=None,
            	showfliers=None, boxprops=None, labels=None, flierprops=None,
            	medianprops=None, meanprops=None, capprops=None,
            	whiskerprops=None, manage_ticks=True, autorange=False,
            	zorder=None, capwidths=None, *, data=None)

     

    수많은 인자들이 존재하는데 모두 다 확인할 수는 없고 주요 인자들에 대해서만 언급하고 지나가겠습니다.

     

    x (필수 인자): 상자그림을 그릴 데이터 배열입니다. 1차원 배열 또는 2차원 배열 형태로 입력할 수 있습니다.

    notch (옵션): 상자의 중앙에 홈을 만들어 중앙값의 신뢰 구간을 나타내는 홈 형태의 상자그림을 그립니다. 기본값은 False입니다.

    sym (옵션): 이상치를 나타내는 기호를 설정합니다. 기본값은 'b+'로 파란색 플러스 기호입니다.

    vert (옵션): 상자를 수직 또는 수평으로 그릴 지를 설정합니다. 기본값은 True로 수직으로 그립니다.

    whis (옵션): 상자의 수염 길이를 설정합니다. 기본값은 1.5로 IQR(제3사분위수 - 제1사분위수)의 1.5배를 수염의 길이로 사용합니다.

    positions (옵션): 상자그림의 위치를 설정합니다. 1차원 배열로 지정할 수 있으며, 기본값은 [1, 2, ..., n]으로 데이터 개수에 따라 자동으로 설정됩니다.

    widths (옵션): 상자의 너비를 설정합니다. 스칼라 값이면 모든 상자의 너비가 동일하게 설정됩니다. 또는 1차원 배열로 지정하여 각 상자의 너비를 개별적으로 설정할 수도 있습니다.

    patch_artist (옵션): 상자의 패치 아티스트를 사용할지 여부를 설정합니다. 기본값은 False로, Line2D 아티스트가 사용됩니다.

    기타 옵션들: meanline, showmeans, showcaps, showbox, showfliers, boxprops, labels, 등 상자그림의 다른 요소들을 설정할 수 있는 옵션들이 있습니다.

     

    3. boxplot() 기본 예제 코드

     10개의 변수가 있는 데이터 셋의 박스차트를 그리는 기본 코드를 공유합니다. x_labels를 만들어 줄 때 리스트의 for 형태를 사용했습니다. boxplot()의 인자가 많이 있지만 data만 넣어도 그래프를 그려주니 편리하게 사용할 수 있습니다. 인풋 데이터의 포맷만 잘 맞춰주면 사용하는데 큰 무리가 없을 겁니다.

     

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 10개의 변수로 이루어진 데이터셋 생성
    data = np.random.rand(100, 10)
    
    # 상자그림 그리기
    plt.boxplot(data)
    
    # x축에 변수 이름 설정
    x_labels = [f'Var{i+1}' for i in range(10)]
    plt.xticks(range(1, 11), x_labels)
    
    plt.show()

     

     위의 코드는 10개의 변수로 이루어진 100개의 데이터를 생성하고, 이를 plt.boxplot() 함수를 통해 박스차트로 시각화합니다. x_labels 리스트는 각 변수의 이름을 저장하며, plt.xticks() 함수를 사용하여 x축에 변수 이름을 설정합니다. 실행하면 10개의 변수에 대한 상자그림이 표시되고, x축에 변수 이름이 표시됩니다. 데이터의 각 변수에 대한 분포와 이상치를 확인할 수 있습니다.

     

    boxplot() 기본 형태 코드의 결과물
    boxplot() 기본 형태 코드의 결과물

     

     4. boxplot() 인자별 예제 코드

     boxplot()의 몇몇 인자들이 어떻게 반영되는지 예제 코드를 통해 알아보도록 하겠습니다. 아래코드에는 코드를 설명하는 주석들도 있으니 참고하시면 도움이 될 겁니다.

     

    import matplotlib.pyplot as plt
    import numpy as np
    
    
    plt.subplot(2, 2, 1)
    
    # 0에서 100까지의 랜덤한 값으로 구성된 100개의 데이터 생성
    data = np.random.randint(0, 100, 100)
    
    # 기본 상자그림 그리기
    plt.boxplot(data)
    plt.title('Basic boxchart')
    
    
    plt.subplot(2, 2, 2)
    group1 = np.random.randint(0, 50, 50)
    group2 = np.random.randint(50, 100, 50)
    data = [group1, group2]
    
    # 홈 형태의 상자그림 그리기
    plt.boxplot(data, notch=True)
    plt.title('Notch boxchart')
    
    plt.subplot(2, 2, 3)
    
    data = np.random.randint(0, 100, 100)
    
    # 수평으로 그려진 상자그림 그리기
    plt.boxplot(data, vert=False)
    plt.title('Horizontal boxchart')
    
    
    plt.subplot(2, 2, 4)
    # 0에서 100까지의 랜덤한 값으로 구성된 100개의 데이터 생성
    data = np.random.randint(0, 100, 100)
    
    # 다른 이상치 기호와 수염 길이 설정
    plt.boxplot(data, sym='ro', whis=0.75)
    plt.title('whis_lenth boxchart')
    
    # 그래프 간의 간격 조정
    plt.tight_layout()
    plt.show()

     

    plt.subplot()을 이용해 총 4개의 그래프를 비교하도록 그려보았습니다. 마지막 두 번째 줄에 plt.tight_layout() 함수를 사용하였는데, subplot() 함수를 사용 시에는 꼭 같이 사용하는 것을 권장합니다. 그렇지 않으면 그래프들이 겹쳐지는 현상이 일어날 수 있기 때문입니다.

     

    boxplot의 인자 변경 예제 코드
    boxplot의 인자 변경 예제 코드

     

     

     

    5. 마치며

     그래프 중에 데이터의 형태를 확인하기 위해 사용되는 박스차트를 구현해 주는 파이썬의 boxplot() 함수에 대해 알아보았습니다. 수많은 인자들을 포함하고 있는데, 박스차트를 꾸며주는 인자들을 잘 활용하면 눈에 잘 띄는 그래프를 얻을 수 있습니다. 제가 박스차트를 자주 사용하는 부분은 데이터 내 이상치를 확인하기 위함입니다. 박스차트의 원리는 데이터 전처리 시 이상치 제거를 위해 사용되기도 합니다. 아래는 제가 이상치 제거에 관련하여 쓴 글입니다. 

     

    https://lifelong-education-dr-kim.tistory.com/entry/python-pandas-series-type에서-이상치-outlier-제거-하기

     

    python, pandas series type에서 이상치(outlier) 제거 하기

    데이터 관련하여 포스팅하면서 가장 어려운 부분이 대상 데이터를 만드는 것이다. 실제 데이터는 회사 내에서 추출이 안되니 내가 경험했던 것과 유사한 데이터를 임의로 만들야 하기 때문이다

    lifelong-education-dr-kim.tistory.com

     

    댓글