통계(Statistics)

박스 플롯(box plot) 설명

leebaro 2017. 9. 20. 11:47
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