테마
Seaborn 수치형 시각화
학습 목표
- histplot/displot으로 수치형 데이터의 분포를 시각화할 수 있다
- kdeplot으로 커널 밀도 추정 그래프를 그릴 수 있다
- regplot/lmplot으로 회귀선과 산점도를 그릴 수 있다
- heatmap으로 상관관계를 시각화할 수 있다
- pairplot으로 변수 간 관계를 한눈에 파악할 수 있다
- 상관계수(correlation)의 의미와 해석 방법을 이해한다
전체 구조
1. histplot / displot - 히스토그램과 KDE
Seaborn의 최신 분포 시각화는 histplot, displot, kdeplot을 중심으로 이해하면 된다. histplot은 axes-level API, displot은 figure-level API다.
주의:
sns.distplot은 Seaborn 0.11부터 deprecated 되었고, 현재는histplot,displot,kdeplot조합으로 옮기는 것이 권장된다.
python
import seaborn as sns
import matplotlib.pyplot as plt
# 결측치 제거 후 분양가격 분포
price = df_last.loc[df_last["평당분양가격"].notnull(), "평당분양가격"]
# 현재 권장 방식: axes-level
sns.histplot(price, kde=True)
# figure-level 인터페이스: FacetGrid와 함께 쓰기 좋음
sns.displot(data=df_last, x="평당분양가격", kind="hist", kde=True)
# 레거시 방식
# sns.distplot(price)어떤 함수를 먼저 쓰면 좋을까?
- 하나의 축에서 빠르게 확인할 때는
histplot - 여러 조건을 facet으로 나눠 비교할 때는
displot - 분포의 모양만 부드럽게 보고 싶을 때는
kdeplot
KDE(Kernel Density Estimate)란?
왼쪽 y축의 값은 빈도수가 아니라 **밀도(density)**이다. KDE 곡선 아래의 전체 면적이 1이 되도록 정규화된 값이다.
histplot 옵션
python
# KDE만 표시 (히스토그램 없이)
sns.kdeplot(price)
# bins(구간) 조정
sns.histplot(price, bins=30, kde=True)
# rug 추가 (하단에 빈도 표시)
sns.histplot(price, kde=True)
sns.rugplot(price)2. kdeplot - 커널 밀도 추정
kdeplot은 KDE 곡선만 단독으로 그린다.
python
# KDE 곡선만
sns.kdeplot(price)
# 누적(cumulative) 그래프
sns.kdeplot(price, cumulative=True)3. FacetGrid로 서브플롯 (Ridge Plot)
지역별로 분양가격 분포를 비교하는 Ridge Plot(산마루 플롯)을 그릴 수 있다.
python
# FacetGrid를 활용한 Ridge Plot
g = sns.FacetGrid(df_last, row="지역명",
height=1.5, aspect=4)
g.map(sns.histplot, "평당분양가격", kde=True)4. regplot - 산점도와 회귀선
regplot은 두 수치형 변수 사이의 관계를 산점도(scatter)와 회귀선(regression line)으로 보여준다.
python
# 연도 vs 평당분양가격 회귀분석
sns.regplot(data=df_last, x="연도", y="평당분양가격")lmplot - hue와 서브플롯 지원
regplot에는 hue 옵션이 없다. 색상별 구분이 필요하면 lmplot을 사용한다.
python
# 전용면적별 색상 구분
sns.lmplot(data=df_last.sample(1000),
x="연도", y="평당분양가격",
hue="전용면적")
# 서브플롯으로 분리
sns.lmplot(data=df_last.sample(1000),
x="연도", y="평당분양가격",
hue="전용면적",
col="전용면적",
col_wrap=3)5. 상관계수(Correlation) 분석
피어슨 상관계수는 두 변수 간의 선형 관계 강도를 -1 ~ +1 사이 값으로 나타낸다.
| 범위 | 의미 |
|---|---|
| +0.7 ~ +1.0 | 강한 양의 상관관계 |
| +0.3 ~ +0.7 | 보통의 양의 상관관계 |
| -0.3 ~ +0.3 | 거의 무시할 수 있는 관계 |
| -0.7 ~ -0.3 | 보통의 음의 상관관계 |
| -1.0 ~ -0.7 | 강한 음의 상관관계 |
python
# 상관계수 계산
corr = df[["위도", "경도"]].corr()
print(corr)6. heatmap - 상관관계 시각화
python
# 기본 히트맵
sns.heatmap(corr)
# 숫자 표시 + 색상 지정
sns.heatmap(corr, annot=True, cmap="Blues", fmt=".2f")피벗 테이블 히트맵
python
# 연도 x 지역 평당분양가격 히트맵
t = pd.pivot_table(df, index="연도", columns="지역명",
values="평당분양가격").round()
plt.figure(figsize=(15, 7))
sns.heatmap(t.T, annot=True, fmt=".0f", cmap="Greens")대각선 마스킹
상관행렬의 대칭적 특성 때문에 한쪽만 표시하는 것이 깔끔하다.
python
import numpy as np
# 대각선 위쪽 마스킹
mask = np.triu(np.ones_like(corr))
sns.heatmap(corr, annot=True, cmap="Blues", mask=mask)7. pairplot - 변수 쌍 관계 한눈에 보기
pairplot은 DataFrame의 모든 수치형 변수 쌍에 대해 산점도와 히스토그램을 자동으로 그린다.
python
# 기본 pairplot
sns.pairplot(df_subset)
# hue로 색상 구분
sns.pairplot(df_subset, hue="전용면적")8. 기술 통계값 개별 확인
python
# 개별 기술통계
print("개수:", df["위도"].count())
print("평균:", df["위도"].mean())
print("중앙값:", df["위도"].median())
print("최대값:", df["위도"].max())
print("최소값:", df["위도"].min())
print("표준편차:", df["위도"].std())
print("분산:", df["위도"].var())
print("1사분위:", df["위도"].quantile(0.25))
print("3사분위:", df["위도"].quantile(0.75))평균값에 선 표시
python
sns.histplot(df["위도"], kde=True)
# 평균값 표시 (빨간 점선)
plt.axvline(df["위도"].mean(), color="r", linestyle=":")
# 중앙값 표시 (녹색 파선)
plt.axvline(df["위도"].median(), color="g", linestyle="--")핵심 정리
- histplot/displot: Seaborn의 최신 분포 시각화 기본 축이다.
histplot은 axes-level,displot은 figure-level 인터페이스다 - kdeplot: 커널 밀도 추정 곡선만 그린다.
cumulative=True로 누적 그래프 가능 - regplot: 산점도 + 회귀선, lmplot: regplot + hue/서브플롯 지원
- heatmap: 상관행렬이나 피벗 테이블을 색상 농도로 시각화한다
- pairplot: 모든 수치형 변수 쌍의 관계를 한눈에 파악한다
- 상관계수는 -1 ~ +1 범위이며, 절대값 0.7 이상은 흔히 강한 상관관계로 해석하지만 데이터 특성과 도메인에 따라 기준은 달라질 수 있다
plt.axvline으로 평균/중앙값 참조선을 그래프 위에 표시할 수 있다