Matplotlib에서 boxplot 예쁘게 그리기
📑 목차 (Contents)
boxplot을 예쁘게 그립시다.
- 지금 값들에 outlier가 있는가 없는가를 확인하려면 boxplot을 그리는 게 좋습니당. 아웃라이어가 얼마나 많은지, 어느 정도에서 다른 값들을 모두 버리는게 좋은지 등등은 boxplot으로 확인하는게 좋다고 생각해도 될것 같아요.
- 요즘 생각하는데 저는 기본기를 코딩하면서 다시 배우고 있다는 생각이 듭니다. 코딩 최고….최고…
boxplot이 뭔가요.
- 전체 분포를
sorted(list)형태로 정렬한 다음에 다음의 형태로 그림을 그린다. 아래는 사각형을 구성함.- Q1: 전체 분포 상에서 왼쪽 1/4에 위치한 값
- median: 전체 분포의 중간에 위치한 값(평균 아님, 실제로 중간에 위치해 있는 값)
- Q3: 전체 분포 상에서 왼쪽 3/4에 위치한 값
- Interquantile range(IQR): Q3-Q1
- 그 다음에 위로, 아래로 가상의 선을 그립니다. 각각 Q3, Q1에서 1.5IQR 떨어져 있는 가상의 선에서, 만약 전체 데이터 분포에서 가장 큰 값, 그리고 가장 작은 값이 Q3 부터 Q3+ 1.5IQR 사이에 있다면 선으로 그리고, 가상의 선을 넘어갈 경우에는 동그라미로 그립니다.
- 자 말이 길었습니다. 그림 보면 간단해요.

자 이제 그려봅시다.
- 참 간단하고 쉽군요 햐하하핫.
## boxplot 해보기
import numpy as np
plt.figure(figsize=(12, 6))
sample_size = 1000
dist_dict = {
"uniform":[np.random.uniform() for i in range(0, sample_size)],
"norm({}, {})".format(0, 0.25): [np.random.normal(0, 0.25) for i in range(0, sample_size)],
"norm({}, {})".format(0, 2): [np.random.normal(0,2) for i in range(0, sample_size)],
"exponential({})".format(1): [np.random.exponential(1) for i in range(0, sample_size)],
}
plt.boxplot(
list(dist_dict.values()),
vert=False, # make the plot vertical
notch=True, # if it is False, it will be box
whis=1.5
"""
가상의 선을 어떻게 그을 것인가에 대한 값. 기존은 1.5* IQR이기 때문에 1.5가 디폴트.
동그라미가 너무 많으면 혼잡해 보일 때 이 값을 늘리면 조금 예뻐보임.
"""
)
plt.gca().set_yticklabels(dist_dict.keys(),
rotation=0, fontsize=20)
plt.savefig('../../assets/images/markdown_img/boxplot_201805161556.svg')
plt.show()
reference
GitHub에서 이 글의 마크다운 원본 보기 & 수정 제안src/content/posts/2018-05-16-boxplot