목차
데이터 분석을 수행할 때 각양각색의 데이터 가시화를 해야 합니다. 파이썬 라이브러리에 포함되어 있는 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축에 변수 이름이 표시됩니다. 데이터의 각 변수에 대한 분포와 이상치를 확인할 수 있습니다.
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() 함수를 사용 시에는 꼭 같이 사용하는 것을 권장합니다. 그렇지 않으면 그래프들이 겹쳐지는 현상이 일어날 수 있기 때문입니다.
5. 마치며
그래프 중에 데이터의 형태를 확인하기 위해 사용되는 박스차트를 구현해 주는 파이썬의 boxplot() 함수에 대해 알아보았습니다. 수많은 인자들을 포함하고 있는데, 박스차트를 꾸며주는 인자들을 잘 활용하면 눈에 잘 띄는 그래프를 얻을 수 있습니다. 제가 박스차트를 자주 사용하는 부분은 데이터 내 이상치를 확인하기 위함입니다. 박스차트의 원리는 데이터 전처리 시 이상치 제거를 위해 사용되기도 합니다. 아래는 제가 이상치 제거에 관련하여 쓴 글입니다.
https://lifelong-education-dr-kim.tistory.com/entry/python-pandas-series-type에서-이상치-outlier-제거-하기
댓글