박스플롯
박스플롯
개요
박스플(Box Plot), 또는 상 수염 그림(Box-and-isker Plot) 데이터의 분포와 산포도를 시각적으로 표현하는 통 그래프이다. 주로 연속형 데이터 중심 경향, 산포, 왜도, 이상치(outlier) 등을 한눈에 파악할 수 있도록 설계되어 있으며, 특히 여러 그룹 간의 분포를 비교할 때 매우 유용하다. 박스플롯은 1977년 미국의 통계학자 존 터키(John Tukey)에 의해 제안되었으며, 탐색적 데이터 분석(EDA, Exploratory Data Analysis)에서 핵심 도구로 널리된다.
구성 요소
박스플롯은 다음과 같은 주요 구성 요소로 이루어진다:
- 상자(Box): 제1사분위수(Q1, 25번째 백분위수)와 제3사분위수(Q3, 75번째 백분위수) 사이의 범위를 나타내며, 사분위 범위(IQR, Interquartile Range)를 시각화한다.
- IQR = Q3 - Q1
- 중앙값(Median, Q2): 상자 안에 있는 선으로 표시되며, 데이터의 중앙 위치를 나타낸다.
- 수염(Whiskers): 상자의 양 끝에서 확장된 선으로, 일반적으로 Q1 - 1.5×IQR에서 Q3 + 1.5×IQR까지의 범위를 나타낸다.
- 이상치(Outliers): 수염의 범위를 벗어난 데이터 포인트로, 점이나 별표(*)로 표시된다.
시각적 요약 예시
○
┌───┴───┐
│ ┌───┼───┐
└───┘ │ │
└───┴───┘
└─────────────────┘
Q1 Q2 Q3
○
: 이상치- 상자: Q1에서 Q3까지
- 중앙 선: Q2 (중앙값)
- 수염 끝: 정상 범위의 최소/최대값
사용 목적과 장점
1. 분포 특성 파악
- 데이터의 중심(중앙값), 산포(IQR), 대칭성 등을 직관적으로 확인할 수 있다.
- 예: 중앙값이 상자의 왼쪽에 치우쳐 있으면 오른쪽 꼬리가 긴 우왜도(positive skew) 분포임을 의미한다.
2. 이상치 탐지
- 수염 밖의 점들은 통계적으로 이상한 값으로 간주되며, 데이터 품질 검토나 이상 행동 탐지에 활용된다.
3. 그룹 간 비교
- 여러 범주(예: 성별, 지역, 연도 등)에 대한 데이터 분포를 나란히 배치하여 쉽게 비교할 수 있다.
- 예: 서울, 부산, 대구의 월평균 기온 분포 비교.
4. 비모수적 접근
- 데이터의 분포가 정규분포가 아닐 경우에도 유용하며, 평균과 표준편차보다 로버스트(robust)하다.
박스플롯의 변형
기본적인 박스플롯 외에도 다양한 변형이 존재한다:
종류 | 설명 |
---|---|
수평 박스플롯 | 상자가 가로로 배치되어, 특히 범주가 많은 경우 시각적 정리에 유리하다. |
그룹화된 박스플롯 | 두 개 이상의 범주를 기준으로 데이터를 분할하여 비교 (예: 성별 × 연령대). |
바이올린 플롯(Violin Plot) | 박스플롯과 커널 밀도 추정을 결합한 그래프로, 분포의 형태(예: 이중봉우리)를 더 잘 보여준다. |
노치 박스플롯(Notched Box Plot) | 중앙값 주변에 "노치"(notch)를 추가하여 중앙값의 신뢰구간을 시각화한다. 두 박스의 노치가 겹치지 않으면 중앙값이 통계적으로 유의미하게 다름을 의미한다. |
활용 예시 (코드 기반)
다음은 Python의 [matplotlib](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/[Python](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%20%EC%96%B8%EC%96%B4/Python)/matplotlib)
과 [seaborn](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Python/seaborn)
라이브러리를 사용하여 박스플롯을 그리는 예시이다.
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
# 샘플 데이터 생성
np.random.seed(42)
data = pd.DataFrame({
'그룹': np.repeat(['A', 'B', 'C'], 100),
'값': np.concatenate([
np.random.normal(50, 10, 100),
np.random.normal(55, 15, 100),
np.random.normal(60, 8, 100)
])
})
# 박스플롯 그리기
plt.figure(figsize=(10, 6))
sns.boxplot(x='그룹', y='값', data=data)
plt.title('그룹별 값의 분포 (박스플롯)')
plt.xlabel('그룹')
plt.ylabel('값')
plt.show()
이 코드는 세 그룹(A, B, C)의 데이터 분포를 비교하는 박스플롯을 생성하며, 각 그룹의 중앙값, IQR, 이상치 등을 시각적으로 표현한다.
주의사항
- 이상치 정의의 제한: 1.5×IQR 기준은 경험적 규칙이며, 모든 이상치가 반드시 오류를 의미하지는 않는다.
- 데이터 크기 영향: 데이터 수가 매우 적을 경우 박스플롯의 해석이 왜곡될 수 있다.
- 분포 형태의 제한: 박스플롯은 다봉분포(multimodal) 같은 복잡한 분포 형태를 제대로 반영하지 못한다. 이 경우 히스토그램이나 바이올린 플롯이 더 적합할 수 있다.
관련 문서 및 참고 자료
- 탐색적 데이터 분석 (EDA)
- 사분위수
- John Tukey, "Exploratory Data Analysis", 1977
- Seaborn 공식 문서 - Boxplot
- Matplotlib - Boxplot Demo
박스플롯은 데이터 과학에서 기본적이면서도 강력한 시각화 도구로, 빠르게 데이터의 특성을 파악하고 의사결정을 지원하는 데 중요한 역할을 한다. 특히 탐색적 분석 초기 단계에서 필수적으로 활용되며, 데이터 리터러시를 높이는 데 기여한다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.