Data Analysis

Python/Matplotlip(시각화)

[Python] Matplotlib (10) 박스 플롯 그리기

Holy_Water 2022. 11. 29. 11:56

박스 플롯 (Box plot) 또는 박스-위스커 플롯 (Box-Whisker plot)은 수치 데이터를 표현하는 하나의 방식입니다.

 

일반적으로 박스 플롯은 전체 데이터로부터 얻어진 아래의 다섯 가지 요약 수치를 사용해서 그려집니다.

- 최소값
- 제 1사분위 수 (Q1)
- 제 2사분위 수 또는 중위수 (Q2)
- 제 3사분위 수 (Q3)
- 최대값

 

- 사분위 수는 데이터를 4등분한 지점을 의미합니다. 예를 들어, 제 1사분위 수는 전체 데이터 중 하위 25%에 해당하는 값이고, 제 3사분위 수는 전체 데이터 중 상위 25%에 해당하는 값입니다.
- 이번 페이지에서는 박스 플롯을 통해 데이터의 분포를 시각화하고, 다양한 방식으로 꾸미는 방법에 대해 소개합니다.
- Keyword: 박스 플롯 (Box plot), 박스-위스커 플롯 (Box-Whisker plot), IQR (Inter Quartile Range), boxplot(), get_ydata(), notch, whis, vert

 

 

 

기본 사용

# 1. 기본 스타일 설정
plt.style.use('default')
plt.rcParams['figure.figsize'] = (4, 3)
plt.rcParams['font.size'] = 12

# 2. 데이터 준비
np.random.seed(0)
data_a = np.random.normal(0, 2.0, 1000)
data_b = np.random.normal(-3.0, 1.5, 500)
data_c = np.random.normal(1.2, 1.5, 1500)

# 3. 그래프 그리기
fig, ax = plt.subplots()

ax.boxplot([data_a, data_b, data_c])
ax.set_ylim(-10.0, 10.0)
ax.set_xlabel('Data Type')
ax.set_ylabel('Value')

plt.show()

- ax.boxplot()은 주어진 데이터 어레이로부터 얻어진 요약 수치를 박스 형태로 나타냅니다.
- np.random 모듈의 normal() 함수는 정규 분포로부터 난수를 생성합니다.
- 세 개의 난수 데이터 어레이를 리스트 형태로 입력했습니다.
- 가운데 박스 모양으로부터 그려지는 중심선을 수염 (Whisker)이라고 합니다.
- boxplot() 함수는 기본적으로 박스의 위쪽 경계로부터 Q3 + whis*(Q3-Q1)까지,
- 박스의 아래쪽 경계로부터 Q1 - whis*(Q3-Q1)까지 수염 (Whisker)을 나타냅니다.

- whis 파라미터의 디폴트 값은 1.5이며, 수염 외부의 데이터 포인트 (Outlier)는 개별적으로 표시됩니다.

 

 

 

 

노치 표시하기

# 1. 기본 스타일 설정
plt.style.use('default')
plt.rcParams['figure.figsize'] = (4, 3)
plt.rcParams['font.size'] = 12

# 2. 데이터 준비
np.random.seed(0)
data_a = np.random.normal(0, 2.0, 1000)
data_b = np.random.normal(-3.0, 1.5, 500)
data_c = np.random.normal(1.2, 1.5, 1500)

# 3. 그래프 그리기
fig, ax = plt.subplots()

ax.boxplot([data_a, data_b, data_c], notch=True, whis=2.5)
ax.set_ylim(-10.0, 10.0)
ax.set_xlabel('Data Type')
ax.set_ylabel('Value')

plt.show()

- ax.boxplot()의 notch 파라미터를 True로 지정하면 중앙값 (Median)의 95% 신뢰 구간을 노치 형태로 표시한 Notched Boxplot을 나타냅니다.
- 위 그림에서 노치의 범위를 결정하는 IQR (Inter Quartile Range)은 사분위 범위이며, (Q3-Q1)으로 주어집니다.

 

수평 박스 플롯 나타내기

# 1. 기본 스타일 설정
plt.style.use('default')
plt.rcParams['figure.figsize'] = (4, 3)
plt.rcParams['font.size'] = 12

# 2. 데이터 준비
np.random.seed(0)
data_a = np.random.normal(0, 2.0, 1000)
data_b = np.random.normal(-3.0, 1.5, 500)
data_c = np.random.normal(1.2, 1.5, 1500)

# 3. 그래프 그리기
fig, ax = plt.subplots()

ax.boxplot([data_a, data_b, data_c], notch=True, whis=2.5, vert=False)
ax.set_xlim(-10.0, 10.0)
ax.set_xlabel('Value')
ax.set_ylabel('Data Type')

plt.show()

- ax.boxplot()의 vert 파라미터를 False로 지정하면 수평 방향의 박스 플롯이 나타납니다.
- 디폴트는 수직 방향의 박스 플롯입니다.