Seaborn — 선언적 시각화
이 토픽을 마치면
Seaborn의 선언적 문법이 matplotlib과 어떻게 다른지 이해하고, boxplot, countplot, heatmap을 한 줄로 그릴 수 있습니다.
matplotlib이 불편해지는 순간
matplotlib로 "부서별 연봉 분포"를 그리려면 이런 코드가 됩니다:
import matplotlib.pyplot as pltimport numpy as np
departments = df['department'].unique()positions = range(len(departments))
fig, ax = plt.subplots()for i, dept in enumerate(departments): salaries = df[df['department'] == dept]['salary'] ax.boxplot(salaries, positions=[i], widths=0.6)
ax.set_xticks(positions)ax.set_xticklabels(departments)ax.set_ylabel('연봉')ax.set_title('부서별 연봉 분포')plt.show()루프를 돌려서 데이터를 분리하고, 위치를 계산하고, 라벨을 직접 설정합니다. Seaborn으로 같은 그래프를:
import seaborn as sns
sns.boxplot(data=df, x='department', y='salary')plt.show()두 줄입니다. "뭘 보여줄지"만 말하면 나머지는 Seaborn이 처리합니다. 이것이 선언적(declarative) 문법입니다.
명령형 vs 선언적
| matplotlib (명령형) | Seaborn (선언적) | |
|---|---|---|
| 관점 | "어떻게 그릴지" 단계별 지시 | "무엇을 보여줄지" 선언 |
| 데이터 분리 | 직접 루프/필터링 | 자동 (x, y, hue) |
| 색상/범례 | 수동 지정 | 자동 생성 |
| 커스터마이징 | 매우 세밀 | 대부분 자동, 세밀한 건 matplotlib |
Seaborn은 matplotlib 위에 만들어진 래퍼입니다. 기본 설정으로 예쁜 그래프를 빠르게 만들고, 세밀한 조정이 필요하면 matplotlib으로 내려갑니다.
핵심 그래프 5가지
1. 분포 — histplot
sns.histplot(data=df, x='salary', bins=20, kde=True)kde=True를 추가하면 밀도 추정선(부드러운 커브)이 겹쳐서 그려집니다.
2. 범주별 분포 — boxplot
sns.boxplot(data=df, x='department', y='salary')중앙값, 사분위, 이상치를 한눈에 봅니다. 부서 간 연봉 차이를 비교할 때 가장 효과적입니다.
3. 개수 세기 — countplot
sns.countplot(data=df, x='department', hue='gender')각 카테고리의 빈도를 막대로 보여줍니다. hue로 성별 같은 하위 분류를 추가하면 색상으로 나뉩니다.
4. 관계 — scatterplot
sns.scatterplot(data=df, x='experience', y='salary', hue='department')두 수치 변수의 관계를 점으로 찍습니다. 경력과 연봉이 비례하는지 한눈에 보입니다.
5. 상관관계 — heatmap
corr = df[['salary', 'experience', 'age']].corr()sns.heatmap(corr, annot=True, cmap='coolwarm', vmin=-1, vmax=1)annot=True로 숫자를 표시하고, cmap으로 색상 팔레트를 지정합니다. 양의 상관(빨강), 음의 상관(파랑)이 색상으로 구분됩니다.
hue — 세 번째 변수
Seaborn의 가장 강력한 기능입니다:
# hue 없이 — 전체 산점도sns.scatterplot(data=df, x='experience', y='salary')
# hue 추가 — 부서별로 색상 분리sns.scatterplot(data=df, x='experience', y='salary', hue='department')hue는 세 번째 변수를 색상으로 인코딩합니다. matplotlib로 이걸 하려면 루프를 돌면서 색상을 직접 지정해야 합니다. Seaborn은 한 단어면 됩니다.
스타일 설정
# 전체 스타일 변경sns.set_theme(style='whitegrid')
# 팔레트 변경sns.set_palette('Set2')
# 개별 그래프에서sns.boxplot(data=df, x='dept', y='salary', palette='pastel')스타일 옵션:
darkgrid— 기본값, 회색 배경 + 격자whitegrid— 흰 배경 + 격자dark— 격자 없는 회색 배경white— 깔끔한 흰 배경ticks— 축 눈금만
Seaborn + matplotlib 조합
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
sns.boxplot(data=df, x='dept', y='salary', ax=axes[0])axes[0].set_title('부서별 연봉')
sns.histplot(data=df, x='salary', bins=20, ax=axes[1])axes[1].set_title('전체 연봉 분포')
plt.tight_layout()plt.show()ax 파라미터로 matplotlib의 Axes에 Seaborn 그래프를 넣을 수 있습니다. 레이아웃은 matplotlib로, 그래프 내용은 Seaborn으로 — 이 조합이 실전 패턴입니다.
핵심
Seaborn은 "무엇을 보여줄지"만 선언하면 알아서 그려주는 시각화 라이브러리입니다.
hue한 단어로 세 번째 변수를 색상으로 인코딩 — 이것이 Seaborn의 핵심 강점입니다. 빠른 탐색은 Seaborn, 세밀한 조정은 matplotlib — 둘 다 쓸 줄 알아야 합니다.