학습/데이터 분석

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 구성