학습/데이터 분석
Python 시각화 정리 - Matplotlib & Seaborn 기초 2탄
DataJ
2025. 5. 12. 13:31
🎻 1. 바이올린 플롯 (violinplot)
import seaborn as sns
import matplotlib.pyplot as plt
df = sns.load_dataset("tips")
sns.violinplot(x="day", y="total_bill", data=df)
plt.title("violin_total_bill_by_day")
plt.show()
- 박스플롯 + 커널 밀도 추정(KDE)이 결합된 형태
커널 밀도 추정 (KDE: Kernel Density Estimation)
단순한 빈도수 막대 대신, 데이터가 어떻게 퍼져 있는지를 곡선 형태로 보여줌
Seaborn에서는 kde=True로 켜는 경우 많음
데이터의 분포 형태를 부드러운 곡선으로 나타내는 기법 (히스토그램의 매끄러운 버전)
- 분포의 모양까지 시각적으로 보여줌
→ 각 요일의 주문 금액 분포가 대칭적인지, 한쪽으로 쏠렸는지를 한눈에 확인 가능
🐝 2. 스웜 플롯 (swarmplot)
sns.swarmplot(x="day", y="total_bill", data=df)
plt.title("swarm_total_bill_by_day")
plt.show()
- 실제 데이터 점들을 겹치지 않게 표시
- 분포와 밀집도 확인에 유용
→ 각 점은 실제 하나의 관측값, 군집 정도도 시각적으로 확인 가능
🔄 3. 페어 플롯 (pairplot)
sns.pairplot(df[["total_bill", "tip", "size"]])
plt.suptitle("pairplot_total_bill_tip_size", y=1.02) #y는 제목위치
plt.show()
- 여러 수치형 변수들의 쌍(pair) 간 관계를 일괄 시각화
- 대각선은 히스토그램, 나머지는 산점도
→ total_bill과 tip 사이의 선형 관계를 가장 명확히 보여줌
🗂 4. 페이싯그리드 (FacetGrid)
g = sns.FacetGrid(df, col="sex", row="smoker")
g.map(sns.scatterplot, "total_bill", "tip")
plt.suptitle("facet_total_bill_vs_tip_by_sex_and_smoker", y=1.02)
#plt.title() → 단일 그래프에만 사용
#plt.suptitle() → 복수 subplot이나 grid 시각화의 전체 제목으로 사용
plt.show()
- 두 개 이상의 범주형 변수에 따라 subplot 분할
- 행/열 방향으로 구간 나눠서 시각화
→ 성별 + 흡연자 여부에 따라 총금액-팁 관계를 나눠서 비교 가능
✅ subplot이란?
하나의 창에 여러 개의 그래프를 배치하는 기능
- plt.subplot() 또는 plt.subplots()로 사용
- 행(row)과 열(col)의 구조로 나눔
- 각각의 그래프는 작은 axes 객체로 구성됨
🔢 1. 기본 사용법 - plt.subplot()
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1) # (1행, 2열, 1번째) 위치
plt.plot([1, 2, 3], [1, 4, 9])
plt.title("Left Plot")
plt.subplot(1, 2, 2) # (1행, 2열, 2번째) 위치
plt.plot([1, 2, 3], [3, 2, 1])
plt.title("Right Plot")
plt.tight_layout()
plt.show()
✅ 해석:
- 1, 2, 1: 1행 2열 중 첫 번째 위치
- 1, 2, 2: 1행 2열 중 두 번째 위치
- tight_layout(): 그래프 사이 간격 자동 정리
🧩 2. 고급 버전 - plt.subplots()
fig, axes = plt.subplots(2, 2, figsize=(8, 6)) # 2행 2열
axes[0, 0].plot([1, 2, 3], [1, 2, 3])
axes[0, 0].set_title("Top Left")
axes[1, 1].plot([1, 2, 3], [3, 2, 1])
axes[1, 1].set_title("Bottom Right")
plt.tight_layout()
plt.show()
✅ 이건 더 직관적이고 반복 처리에 유리
- axes[행, 열] 형태로 접근
- 전체 subplot을 하나의 fig 안에서 관리 가능
✅ fig와 axes의 의미
📦 fig (Figure 객체)
- 전체 캔버스(도화지) 역할
- 여러 개의 Axes(그래프)를 담는 틀
- plt.figure()와 유사한 개념
- fig.suptitle("All 4 Plots in One Figure")
📊 axes (Axes 객체들)
- 각각의 그래프가 그려지는 영역
- subplot 하나하나를 의미함
🧠 언제 사용하나?
여러 그래프를 한눈에 비교하고 싶을 때 | ex) 분포 vs 평균 |
동일한 스타일로 반복 시각화 | ex) 고객군 A, B, C 비교 |
FacetGrid 대신 직접 배치 제어하고 싶을 때 | 사용자 맞춤 구성 가능 |
✅ 요약 정리
그래프 목적 장점
violinplot | 분포 + 밀도 | 대칭성 시각화 |
swarmplot | 분포의 실제값 시각화 | 겹치지 않는 점 표시 |
pairplot | 여러 변수 관계 탐색 | 자동 쌍플롯 |
FacetGrid | 범주형 조건별 비교 | subplot 구성 |