Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

1.6.4. seaborn (Python)

Q's Laboratory

seaborn은 matplotlib 기반의 고급 통계 시각화 라이브러리입니다.

1.6.4.1. 기본 사용 (Python 3.13)

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 테마 설정
sns.set_theme(style="darkgrid")
sns.set_palette("husl")

# 샘플 데이터
df = sns.load_dataset('tips')

1.6.4.2. 분포 시각화

# 히스토그램 + KDE
sns.histplot(df['total_bill'], kde=True)
plt.show()

# KDE 플롯
sns.kdeplot(data=df, x='total_bill', hue='time', fill=True)
plt.show()

# 박스플롯
sns.boxplot(data=df, x='day', y='total_bill', hue='time')
plt.show()

# 바이올린 플롯
sns.violinplot(data=df, x='day', y='total_bill', hue='sex', split=True)
plt.show()

# 스웜 플롯
sns.swarmplot(data=df, x='day', y='total_bill', hue='sex')
plt.show()

1.6.4.3. 관계 시각화

# 산점도
sns.scatterplot(data=df, x='total_bill', y='tip', hue='time', size='size')
plt.show()

# 회귀선이 있는 산점도
sns.regplot(data=df, x='total_bill', y='tip')
plt.show()

# lmplot (facet 지원)
sns.lmplot(data=df, x='total_bill', y='tip', hue='time', col='day')
plt.show()

# 페어 플롯 (산점도 행렬)
sns.pairplot(df, hue='time', corner=True)
plt.show()

1.6.4.4. 범주형 데이터

# 막대 차트
sns.barplot(data=df, x='day', y='total_bill', hue='sex', errorbar='sd')
plt.show()

# 카운트 플롯
sns.countplot(data=df, x='day', hue='sex')
plt.show()

# 포인트 플롯
sns.pointplot(data=df, x='day', y='total_bill', hue='time')
plt.show()

1.6.4.5. 히트맵

# 상관관계 히트맵
numeric_cols = df.select_dtypes(include=[np.number])
corr = numeric_cols.corr()

sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm', center=0,
            square=True, linewidths=1)
plt.title('Correlation Heatmap')
plt.show()

# 피벗 테이블 히트맵
pivot = df.pivot_table(values='tip', index='day', columns='time', aggfunc='mean')
sns.heatmap(pivot, annot=True, fmt='.1f', cmap='YlGnBu')
plt.show()

1.6.4.6. FacetGrid

# 조건부 서브플롯
g = sns.FacetGrid(df, col='time', row='sex', hue='smoker')
g.map(sns.scatterplot, 'total_bill', 'tip')
g.add_legend()
plt.show()

# catplot
sns.catplot(data=df, x='day', y='total_bill', hue='sex', col='time', kind='box')
plt.show()

1.6.4.7. 조인트 플롯

# 산점도 + 분포
sns.jointplot(data=df, x='total_bill', y='tip', kind='scatter', hue='time')
plt.show()

# 육각형 빈
sns.jointplot(data=df, x='total_bill', y='tip', kind='hex')
plt.show()

# KDE
sns.jointplot(data=df, x='total_bill', y='tip', kind='kde')
plt.show()

# 회귀
sns.jointplot(data=df, x='total_bill', y='tip', kind='reg')
plt.show()

1.6.4.8. 스타일과 색상

# 스타일
sns.set_style("whitegrid")  # whitegrid, darkgrid, white, dark, ticks

# 컨텍스트 (크기 조정)
sns.set_context("paper")  # paper, notebook, talk, poster

# 색상 팔레트
sns.set_palette("husl")
sns.set_palette("Set2")
sns.color_palette("viridis", as_cmap=True)

# 커스텀 팔레트
custom_palette = ["#FF6B6B", "#4ECDC4", "#45B7D1"]
sns.set_palette(custom_palette)

1.6.4.9. 저장

# 현재 figure 저장
plt.savefig('plot.png', dpi=300, bbox_inches='tight')

# 고해상도 PDF
plt.savefig('plot.pdf', format='pdf', bbox_inches='tight')