Seaborn 분포 시각화
데이터의 분포를 이해하는 것은 모든 분석의 시작점입니다. Seaborn은 히스토그램, KDE(커널 밀도 추정), ECDF(경험적 누적분포), pairplot 등 분포를 탐색하는 다양한 도구를 제공합니다.
학습 목표
- histplot으로 히스토그램과 KDE를 함께 그릴 수 있다
- kdeplot으로 밀도 곡선을 시각화할 수 있다
- pairplot으로 모든 변수 쌍의 관계를 한 번에 탐색할 수 있다
- 분포의 형태(정규, 편향, 다봉)를 시각적으로 판단할 수 있다
왜 중요한가
피처의 분포 형태는 전처리 방법 선택(스케일링, 변환), 이상치 처리, 모델 선택의 근거가 됩니다. pairplot은 EDA 초기에 변수 간 관계를 빠르게 스캔하는 핵심 도구입니다.
histplot
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
np.random.seed(42)
df = pd.DataFrame({
'height': np.random.normal(170, 10, 500),
'weight': np.random.normal(65, 12, 500),
'gender': np.random.choice(['남', '여'], 500)
})
# 기본 히스토그램 + KDE
fig, ax = plt.subplots(figsize=(8, 5))
sns.histplot(data=df, x='height', kde=True, ax=ax, color='#4a9eca')
ax.set_title('키 분포')
plt.tight_layout()
plt.show()
# 그룹별 히스토그램
fig, ax = plt.subplots(figsize=(8, 5))
sns.histplot(data=df, x='height', hue='gender', kde=True, ax=ax,
palette='Set2', alpha=0.6)
ax.set_title('성별 키 분포')
plt.tight_layout()
plt.show()
kdeplot — 커널 밀도 추정
fig, ax = plt.subplots(figsize=(8, 5))
sns.kdeplot(data=df, x='height', hue='gender', ax=ax,
fill=True, alpha=0.4, palette='Set2')
ax.set_title('키 밀도 추정')
plt.tight_layout()
plt.show()
# 2D KDE
fig, ax = plt.subplots(figsize=(8, 6))
sns.kdeplot(data=df, x='height', y='weight', ax=ax,
fill=True, cmap='Blues', levels=10)
ax.set_title('키-체중 2D 밀도')
plt.tight_layout()
plt.show()
ecdfplot — 경험적 누적분포
fig, ax = plt.subplots(figsize=(8, 5))
sns.ecdfplot(data=df, x='height', hue='gender', ax=ax, palette='Set2')
ax.set_title('키 누적분포')
ax.axhline(y=0.5, color='gray', linestyle='--', alpha=0.5, label='중앙값')
ax.legend()
plt.tight_layout()
plt.show()
pairplot — 변수 쌍 탐색
# 모든 수치형 변수 쌍의 산점도 + 대각선 히스토그램
sns.pairplot(df, hue='gender', palette='Set2', diag_kind='kde',
plot_kws={'alpha': 0.5})
plt.suptitle('변수 쌍 탐색', y=1.02)
plt.show()
pairplot은 변수가 많으면 시간이 오래 걸립니다. 5개 이하의 주요 변수만 선택하여 사용하세요: sns.pairplot(df[['var1', 'var2', 'var3', 'target']]).
AI/ML에서의 활용
- 분포 확인: 각 피처의 분포 형태를 파악하여 스케일링 전략을 결정합니다
- 정규성 확인: KDE 곡선으로 정규분포 가정의 타당성을 시각적으로 판단합니다
- 변수 관계: pairplot으로 피처 간 상관관계와 다중공선성을 탐색합니다
- 클래스 분리: hue로 타겟 클래스별 피처 분포를 비교하여 피처의 판별력을 평가합니다
histplot()은 Axes 수준 함수로 기존 ax에 그릴 수 있고, displot()은 Figure 수준 함수로 FacetGrid를 반환합니다. 서브플롯에 넣을 때는 histplot()을 사용하세요.
체크리스트
다음 문서