matplotlib에서 boxplot 예쁘게 그리기

1 분 소요

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

댓글남기기