본문 바로가기
Programming/Machine Learning

Seaborn boxplot으로 five-number summary 이해하기

by a voyager 2021. 5. 3.
728x90
반응형

Seaborn boxplot with 'tips' dataset 

seaborn 라이브러리에서 제공하는 "tips" 데이타셋으로 five-number summary에 대해서 알아보자. 다음과 같이 데이터를 로딩한다. 

 

import seaborn as sns 

tips = sns.load_dataset("tips")

tips

 

 

 

 

위의 표에서 보듯이 총 7개의 컬럼이 있다. 이중 'total_bill' 컬럼 데이터에 대한 boxplot을 그려 보자. 참고로 x축의 tick의 개수는 'set_major_locator' 매서드와 matplotlib의 ticker로 조절할 수 있다. 

 

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

ax = sns.boxplot(x=tips["total_bill"], color='orange')
ax.set_title("boxplot for total_bill")

ax.axes.set_title("boxplot for total_bill",fontsize=20)
ax.set_xlabel("total_bill",fontsize=20)
ax.tick_params(labelsize=20)

ax.xaxis.set_major_locator(ticker.MultipleLocator(10))
ax.xaxis.set_major_formatter(ticker.ScalarFormatter())

plt.show()

 

 

 

five-number summary 

위의 그림에서 파란색으로 쓴 다섯개의 수를 five-number summary라고 한다. 이들은 데이터의 분포의 특징짓는 넘버가 된다. 

 

  • Q2는 중간값이다. 전체 데이터의 최소값과 최대값의 평균이다. 
  • Q1은 lower quartile으로 전체 데이터의 하위 25% 값이다. 이것은 전체 데이터의 최소값과 Q2의 중간값이다. 
  • Q3은 upper quartile으로 전체 데이터의 상위 25% 값이다. 이것은 전체 데이터의 최대값과 Q2의 중간값이다. 

 

나머지 두 개의 값, lower and upper fence를 찾기 위해서는 interquartile range (줄여서 IQR)를 계산해야 한다. 이것은 간단하게 Q3-Q1이 된다. 

 

  • Lower fence = Q1 - 1.5* IQR
  • upper fence = Q3 + 1.5* IQR

 

이 fence의 범위를 벗어난 데이터의 값들은 outlier가 되며 boxplot에서는 점으로 표시된다. 이 outlier들은 분포에서 멀리 벗어난 값들로 통계적으로 의미 있는 값이 아닌 에러나 예외적인 값으로 간주할 수 있다. 

 

이 다섯개의 값들을 numpy와 pandas 라이브러리를 이용해 직접 구해 볼 수 있다.

a. Numpy 

Q1, Q2, Q3 = np.percentile(tips["total_bill"], [25, 50, 75])


print('Q1: %3.3f'%(Q1))
print('Q2: %3.3f'%(Q2))
print('Q3: %3.3f'%(Q3))
print("")

IQR = Q3 - Q1
print('IQR: %3.3f'%(IQR))
print("")


print('lower fence: %3.3f < %3.3f'%(Q1 - IQR*1.5, tips["total_bill"].min() ))
print('upper fence: %3.3f < %3.3f'%(Q3 + IQR*1.5, tips["total_bill"].max() ))

 

 

위 결과에서 lower fence의 값이 "total_bill"의 최소값 보다 작기 때문에 boxplot에서 lower fence 보다 작은 outlier가 표시되지 않았다. 반면, upper fence의 값은 "total_bill"의 최대값 보다 작기 때문에 upper fence를 넘어가는 outlier가 boxplot에 그려진 것을 알 수 있다. 

 

b. Pandas 

tips["total_bill"].quantile(q=[0.25, 0.5, 0.75])

 

 

 

references 

728x90
반응형

댓글