통계(Statistics)

박스 플롯(box plot) 설명

leebaro 2017. 9. 20.
728x90

오늘 아는 분이 박스 플롯의 의미가 무엇이고 어떻게 그리는지 궁금하다고 말씀하셔서 이야기 나온김에 정리를 해본다.  

 

박스 플롯을 사용하는 이유는 많은 데이터를 눈으로 확인하기 어려울 때 그림을 이용해 데이터 집합의 범위와 중앙값을 빠르게 확인할 수 있는 목적으로 사용한다. 또한 통계적으로 이상치(outlier)가 있는지도 확인이 가능하다.

 

 

'박스 플롯'은 '상자 수염 그림'(Box-and-Whisker Plot) '상자 그림' 등 다양한 이름으로 불린다.

 

 

기술 통계학에서 박스 플롯은 수치적 자료를 표현하는 그래프이다. 이 그래프는 자료에서 얻은 다섯 수치 요약(five number summary)을 가지고 그린다.

 

다섯 수치 요약은 아래와 같다.

  1. 최솟값 : 제 1사분위에서 1.5 IQR[각주:1]을 뺀 위치이다.
  2. 제 1사분위(Q1) : 25%의 위치를 의미한다.
  3. 제 2사분위(Q2) : 50%의 위치로 중앙값(median)을 의미한다.
  4. 제 3사분위(Q3) : 75%의 위치를 의미한다.
  5. 최댓값 : 제 3사분위에서 1.5 IQR을 더한 위치이다.
최솟값과 최댓값을 넘어가는 위치에 있는 값을 이상치(Outlier)라고 부른다.
 
IQR은 아래와 예제와 같이 구할 수 있다.
 
예를 들어, 데이터가 7, 9, 16, 36, 39, 45, 46, 48, 51인 경우
  • Q1 = 16
  • Q2(중위수) = 39
  • Q3 = 46
  • 사분위간 범위(IQR) = 30
  • 1.5 IQR = 32 x 1.5 = 45

아웃라이어 범위:

  • 하한값: -29.0
  • 상한값: 91.0

 

 
박스 플롯을 그리는 방법은 아래와 같다.
  1. 주어진 데이터에서 각 사분위수를 계산한다.
  2. 그래프에서 제 1사분위수와 제 3사분위수를 기준으로 박스를 그린다.
  3. 제 2사분위수에 해당하는 위치에 선을 긎는다.
  4. 제 3사분위수에서 1.5IQR을 더한 위치에 가로 선을 긎고 제 3사분위수부터 가로선까지 세로선을 긎는다.
  5. 제 1사분위수에서 1.5IQR을 뺀 위치에 가로 선을 긎고 제 1사분위수부터 가로선까지 세로선을 긎는다.
  6. 4,5번에 그은 직선을 넘어서는 위치에 존재하는 값은 동그라미와 같은 기호로 표시한다.(이상치 의미) 

 

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# 데이터 정의
data = [7, 9, 16, 36, 39, 45, 46, 48, 51]

# Seaborn을 사용하여 Boxplot 그리기
plt.figure(figsize=(10, 6))
sns.boxplot(data=data)
plt.title('Boxplot')
plt.ylabel('값')
plt.show()

# 추가 설명
print("\n박스플롯 해석:")
print("- 박스의 아래쪽 경계: Q1 (1사분위수)")
print("- 박스 내부의 선: Q2 (중앙값)")
print("- 박스의 위쪽 경계: Q3 (3사분위수)")
print("- 수염(whisker)의 끝: 최소값과 최대값 (이상치 제외)")
print("- 박스의 높이: IQR (Q3 - Q1)")

# 사분위수 계산 및 출력
Q1 = np.percentile(data, 25)
Q2 = np.percentile(data, 50)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1

print(f"\n계산된 값:")
print(f"Q1: {Q1}")
print(f"Q2 (중앙값): {Q2}")
print(f"Q3: {Q3}")
print(f"IQR: {IQR}")

# 아웃라이어 계산
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

outliers = [x for x in data if x < lower_bound or x > upper_bound]

print(f"\n아웃라이어 범위:")
print(f"하한값: {lower_bound}")
print(f"상한값: {upper_bound}")
print(f"아웃라이어: {outliers}")

 

 


Reference

 

https://ko.wikipedia.org/wiki/%EC%83%81%EC%9E%90_%EC%88%98%EC%97%BC_%EA%B7%B8%EB%A6%BC

http://goodtogreate.tistory.com/entry/%EC%9D%B4%EC%83%81%EC%B9%98-%EC%A0%9C%EA%B1%B0-Boxplot-%ED%95%B4%EC%84%9D%EC%9D%84-%ED%86%B5%ED%95%9C

http://newmkka.tistory.com/348

http://flowingdata.com/2008/02/15/how-to-read-and-use-a-box-and-whisker-plot/

https://support.minitab.com/ko-kr/minitab/18/help-and-how-to/graphs/how-to/boxplot/interpret-the-results/quartiles/

  1. IQR : Interquartile range의 약어이며 제 3분위 - 제 1분위의 값을 의미한다. [본문으로]
 
728x90

'통계(Statistics)' 카테고리의 다른 글

코헨의 카파 계수  (0) 2024.08.19
t-test를 이용해서 두 집단간의 차이를 검정하는 방법  (0) 2022.12.23
중심극한정리  (0) 2017.09.08