Skip to content

Seaborn 범주형 시각화


학습 목표

  1. Seaborn의 특징과 Matplotlib과의 관계를 이해한다
  2. barplot으로 범주별 평균과 신뢰구간을 시각화할 수 있다
  3. boxplot, boxenplot, violinplot으로 분포를 비교할 수 있다
  4. countplot으로 빈도수를 시각화할 수 있다
  5. catplot과 hue 옵션으로 서브플롯을 그릴 수 있다
  6. 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 또는 함수명만 바꾸면 다양한 그래프를 그릴 수 있다