Python/Matplotlib

[Matplotlib] seaborn 이용 파이썬 box plot 그리기

jimmy_AI 2021. 12. 5. 17:43
반응형

파이썬 seaborn box plot 예시 코드 : sns.boxplot 함수

이번 글에서는 데이터의 분포를 한 눈에 살펴볼 수 있는 box plot을

파이썬의 seaborn 라이브러리를 이용해서 시각화해보도록 하겠습니다.

 

데이터셋은 kaggle 자전거 수요 예측에서 사용한 데이터 중

train data에 해당하는 csv 파일을 사용하였습니다.

이 데이터프레임이 df 변수에 저장되어있다고 가정하겠습니다.

 

먼저, 가장 기본형의 그래프부터 살펴보도록 하겠습니다.

자전거 대여 대수의 전체 분포를 살펴보겠습니다.

import matplotlib.pyplot as plt
import seaborn as sns

# 세로 그래프
plt.figure(figsize = (4, 7))
sns.boxplot(y = 'count', data = df)
plt.title('vertical graph', size = 15)
plt.show()

# 가로 그래프
plt.figure(figsize = (7, 4))
sns.boxplot(x = 'count', data = df)
plt.title('horizontal graph', size = 15)
plt.show()

 

sns.boxplot 함수에 x축과 y축에 들어갈 column 이름, 그리고 data로 사용할

데이터프레임 변수를 input으로 지정하면 box plot을 그릴 수 있습니다.

 

위의 예시는 x축 혹은 y축만 지정한 가장 간단한 형태의 box plot입니다.

 

참고로, box plot은 사분위수(상위 25, 50, 75% 숫자 : Q1, Q2, Q3)를 기준으로

Q1 ~ Q3 사이의 상위 25~75% 구간이 가운데 box로 색칠되고,

 

Q1 - (Q3 - Q1) * 1.5 이하와 Q3 + (Q3 - Q1) * 1.5 이상의 구간을 끝 선으로 나타내고

 

이 밖의 범위에 해당하는 숫자는 이상치(점으로 표시)로 취급하는 그림입니다.

 

박스의 끝점이 Q1, Q3에 해당하고, 박스 가운데 선이 Q2에 해당하는 것을 참고하세요.

 

box plot x, y축 모두 설정

이번에는 계절별자전거 대여 대수의 분포를 살펴보도록 하겠습니다.

plt.figure(figsize = (10, 7))
# 계절별 대여수 분포
sns.boxplot(x = 'season', y = 'count', data = df)

# x축 이름 설정
plt.xticks(range(4), ['spring', 'summer', 'autumn', 'winter'])
plt.show()

각 계절별 자전거 대여 수의 분포를 한 눈에 확인해볼 수 있었습니다.

여름, 가을이 봄, 겨울보다는 평균적으로 더 많은 자전거를 대여한 듯 합니다.

 

box plot 색상, 선 굵기, 박스 너비 지정

이번에는 box plot의 색상, 선 굵기, 박스 너비를 지정해보는 예시를 살펴보겠습니다.

위 코드에서 가운데 sns.boxplot 함수 부분만 다음과 같이 변경하면 됩니다.

반응형
# 색 팔레트, 선 굵기, 박스 너비 지정
sns.boxplot(x = 'season', y = 'count', data = df, palette = 'Spectral', linewidth = 3, width = 0.5)

색상은 palette 인자로 지정 가능한데, seaborn에서 제공하는 기능으로

커스텀이 얼마든지 가능합니다.

 

선 굵기는 linewidth, 박스 너비는 width 인자로 조절했음을 참고해주세요.

 

box plot 2가지 변수에 대한 영향 살피기 (hue)

이번에는 계절뿐만 아니라 주말 여부까지 포함해서 총 두가지 인자에 대한

자전거 대여 수 분포 차이를 살펴보겠습니다.

plt.figure(figsize = (10, 7))
# 색 팔레트, 선 굵기, 박스 너비 지정
bx = sns.boxplot(x = 'season', y = 'count', hue = 'workingday', data = df, palette = 'Set2')

# x축 이름 설정
plt.xticks(range(4), ['spring', 'summer', 'autumn', 'winter'])

# legend name 변경
bx.legend_.texts[0].set_text('weekday')
bx.legend_.texts[1].set_text('weekend')

plt.show()

weekday와 weekend를 기준으로 분포 그래프 분리가 되었습니다.

hue 인자를 통해서 분리할 column의 이름을 지정해주면 됩니다.

 

참고로, 범례 이름을 바꾸는 방법도 윗 코드에 포함해보았습니다.

 

이 외에도, 이상치 범위를 지정하는 whis 변수,

라벨의 순서를 바꾸는(여름, 가을, 봄, 겨울 식으로) order 변수,

hue로 나눈 그래프를 겹쳐서 그릴 수 있는 dodge 변수

sns.boxplot 함수에서 다루는 기능은 더 많다는 점을 참고해주시면 좋습니다.

 

더 상세한 기능이 필요하신분들은 공식 document를 참고해주시고,

여기서는 이 정도로 글을 마무리해보도록 하겠습니다.