box plot은 사분위수(상위 25%, 50%, 75%를 각각 Q1, Q2, Q3 표현)를 그림으로 나타낸 것이다. Q1 ~ Q3 사이의 상위 25~75% 구간이 가운데 box로 나타내지고, Q2(상위 50%)는 박스 중간에 직선으로 표시된다. Q1 - (Q3 - Q1) * 1.5 이하와 Q3 + (Q3 - Q1) * 1.5 이상의 구간에 존재하는 샘플들은 이상치(outlier)로 간주되며 점으로 표시된다. 이 범위 내의 최소값(minimum)과 최대값(maximum)을 양 끝의 수직선으로 나타낸다.
아래 코드는 https://stackoverflow.com/questions/50554235/how-to-base-seaborn-boxplot-whiskers-on-percentiles 의 코드를 수정한 것인데, seaborn box plot을 이해하기에 좋은 예제인 것 같다.
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
a1 = tips["total_bill"]
ax = sns.boxplot(x=tips["total_bill"], whis=[5, 95])
plt.grid(True)
plt.figure()
ax = sns.boxplot(x=tips["total_bill"])
plt.grid(True)
print(tips["total_bill"].describe())
실행결과
[229 rows x 16 columns]
count 244.000000
mean 19.785943
std 8.902412
min 3.070000
25% 13.347500
50% 17.795000
75% 24.127500
max 50.810000
Name: total_bill, dtype: float64
아래 그림은 5%와 95%를 minimum, maximum으로 구분한 플롯.
아래 그림은 원래 함수의 디폴트에 따라 minimum, maximum으로 구분한 플롯.
https://jimmy-ai.tistory.com/51에서는
"참고로, 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에 해당하는 것을 참고하세요."
라고 설명하고 있다. 그런데, Q1 - (Q3 - Q1) * 1.5 이하와 Q3 + (Q3 - Q1) * 1.5 이상의 구간을 끝 선으로 나타낸다면, 박스로부터 양 끝으로부터 양 끝 선(수직선)까지 길이가 같아야하는데 다르다. 그래서 검색해보니,
https://datagy.io/seaborn-boxplot/ 에서 제대로 설명하고 있다.
위 그림은 https://flowingdata.com/2008/02/15/how-to-read-and-use-a-box-and-whisker-plot/ 에서 설명하고 있는 그림인데, minumum을 25%의 1.5배보다 작은 것이라고 설명하고 있는데 잘못 설명하여 헷갈리게 만든다.