테마
Seaborn 범주형 시각화
학습 목표
- Seaborn의 특징과 Matplotlib과의 관계를 이해한다
- barplot으로 범주별 평균과 신뢰구간을 시각화할 수 있다
- boxplot, boxenplot, violinplot으로 분포를 비교할 수 있다
- countplot으로 빈도수를 시각화할 수 있다
- catplot과 hue 옵션으로 서브플롯을 그릴 수 있다
- swarmplot으로 개별 데이터 분포를 확인할 수 있다
전체 구조
1. Seaborn의 특징
Seaborn은 Matplotlib 기반의 고수준 시각화 라이브러리다. Pandas에서는 groupby나 pivot_table로 직접 연산해야 했지만, Seaborn은 내부에서 통계 연산을 자동으로 수행한다.
python
import seaborn as sns
import matplotlib.pyplot as plt
# 한글 폰트 설정
plt.rc("font", family="AppleGothic") # macOS
plt.rc("axes", unicode_minus=False)2. barplot - 평균과 신뢰구간
python
# 지역별 평당 분양가격 평균 (자동 계산)
plt.figure(figsize=(10, 3))
sns.barplot(data=df_last, x="지역명", y="평당분양가격")신뢰구간(CI)과 estimator
barplot 위의 검은 막대는 **95% 신뢰구간(Confidence Interval)**을 나타낸다.
주의: Seaborn 0.12+에서는
ci파라미터가errorbar로 변경되었다.
python
# 기본: 95% 신뢰구간 표시
sns.barplot(data=df_last, x="지역명", y="평당분양가격")
# 표준편차(SD)로 변경 (Seaborn 0.12+)
sns.barplot(data=df_last, x="지역명", y="평당분양가격", errorbar="sd")
# 신뢰구간 제거
sns.barplot(data=df_last, x="지역명", y="평당분양가격", errorbar=None)
# 단일 색상 지정
sns.barplot(data=df_last, x="지역명", y="평당분양가격",
errorbar=None, color="b")CI(Confidence Interval): 95%로 샘플링했을 때 값이 포함되는 범위이다. 추정(estimate) 과정이 있어 그래프 그리는 시간이 오래 걸릴 수 있으므로, 속도가 느릴 때는
errorbar=None으로 제거한다.레거시 호환: Seaborn 0.12 미만에서는
ci=95,ci="sd",ci=None을 사용한다.
3. boxplot - 5가지 요약 수치
python
# 연도별 평당분양가격 박스 플롯
plt.figure(figsize=(10, 4))
sns.boxplot(data=df, x="연도", y="평당분양가격")박스 플롯 구성: 최소값, Q1, 중앙값, Q3, 최대값, 이상치(점)
boxenplot - 상세 분포 표현
boxenplot은 boxplot과 violinplot의 중간 형태로, 박스 내부의 분포를 더 세밀하게 표현한다.
python
# boxenplot
plt.figure(figsize=(10, 4))
sns.boxenplot(data=df, x="연도", y="평당분양가격")4. violinplot - 밀도 + 박스
바이올린 플롯은 박스 플롯 안에 밀도(density) 정보를 추가로 표현한다. 바이올린 모양의 너비가 데이터 밀도를 나타낸다.
python
# 연도별 바이올린 플롯
plt.figure(figsize=(10, 4))
sns.violinplot(data=df, x="연도", y="평당분양가격")violinplot + swarmplot 겹쳐 그리기
python
plt.figure(figsize=(12, 4))
sns.violinplot(data=df, x="연도", y="평당분양가격")
sns.swarmplot(data=df, x="연도", y="평당분양가격",
color="black", size=2)5. swarmplot - 개별 데이터 분포
swarmplot은 모든 데이터를 점으로 찍되, 겹치지 않도록 옆으로 번지게 배치한다. scatter plot의 단점(점 겹침)을 보완한다.
python
# 연도별 swarmplot
plt.figure(figsize=(12, 5))
sns.swarmplot(data=df, x="연도", y="평당분양가격",
hue="지역명")
# 범례(legend)를 그래프 바깥에 표시
plt.legend(bbox_to_anchor=(1.02, 1), loc="upper left")주의: swarmplot은 점을 하나씩 찍기 때문에 데이터가 많으면 매우 느리다. 적절한 양의 데이터(수천 건 이내)에서 사용하는 것이 좋다.
6. countplot - 빈도수 시각화
python
# 상권업종 대분류별 빈도수
plt.figure(figsize=(10, 3))
sns.countplot(data=df, x="상권업종대분류명")countplot은 value_counts()의 시각화 버전이다. y축에 빈도수가 자동으로 표시된다.
7. hue 옵션 - 색상으로 범주 구분
python
# 연도별 평당분양가격, 전용면적별 색상 구분
plt.figure(figsize=(12, 4))
sns.boxplot(data=df_last, x="연도", y="평당분양가격",
hue="전용면적")8. catplot - 서브플롯 자동 생성
catplot은 범주형 데이터의 서브플롯을 쉽게 그려준다. col 또는 row 옵션으로 분할 기준을 지정한다.
python
# 지역별 서브플롯 (pointplot 형태)
sns.catplot(
data=df_last,
x="연도",
y="평당분양가격",
kind="point",
col="지역명", # 컬럼 방향으로 분할
col_wrap=4 # 한 줄에 4개씩
)catplot의 kind 옵션
9. relplot - 수치형 서브플롯
relplot은 수치형 데이터의 서브플롯을 그린다. scatter와 line 두 가지 kind를 지원한다.
python
# 지역별 scatter 서브플롯
sns.relplot(
data=df_last,
x="연도",
y="평당분양가격",
kind="scatter",
col="지역명",
col_wrap=4
)핵심 정리
- Seaborn은 Matplotlib 기반이며 통계 연산을 자동으로 수행한다
- barplot: 평균 + 신뢰구간,
ci옵션으로 표준편차/제거 선택 - boxplot/boxenplot/violinplot: 분포 시각화, 세밀도가 점점 증가
- swarmplot: 개별 점 분포, 데이터 적을 때 유용
- countplot: 빈도수 시각화 (value_counts의 그래프 버전)
- hue: 범주별 색상 구분, catplot/relplot: 서브플롯 자동 생성
- 사용법이 거의 동일하므로
kind또는 함수명만 바꾸면 다양한 그래프를 그릴 수 있다