스와플롯과 스트립플롯 (swarmplot, stripplot)
boxplot과 violinplot은 요약된 통계를 보여줍니다. 하지만 때로는 "실제로 데이터가 몇 개나 있지? 정확히 어디에 분포하지?"를 직접 눈으로 확인하고 싶을 때가 있습니다.
그럴 때 쓰는 것이 stripplot과 swarmplot입니다. 두 차트 모두 개별 데이터 포인트 하나하나를 점으로 찍습니다.
이 차트가 보여주는 것
stripplot은 점들에 약간의 무작위 흔들림(jitter)을 주어 완전히 겹치지 않도록 합니다. swarmplot은 점들이 겹치지 않도록 알고리즘으로 배치하여 벌집 모양을 만듭니다.
stripplot: 점에 약간의 흔들림을 준다
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.stripplot( data=tips, x="day", y="total_bill", hue="smoker", jitter=True, # 기본값. False로 하면 일직선으로 나열 dodge=True, # hue별로 위치를 나란히 분리 alpha=0.7)plt.title("요일별 계산 금액 (개별 데이터)")plt.show()
dodge=True는 hue 범주별로 점 무리를 좌우로 분리합니다. 없으면 흡연자와 비흡연자 점이 섞입니다.
swarmplot: 점들이 겹치지 않도록 배치
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.swarmplot( data=tips, x="day", y="total_bill", hue="smoker", dodge=True, size=4 # 점 크기)plt.title("요일별 계산 금액 (swarmplot)")plt.show()
swarmplot은 점들이 겹치지 않도록 자동으로 옆으로 밀어냅니다. 각 점이 데이터 하나를 정확히 표현하기 때문에 데이터 수도 한눈에 파악됩니다.
boxplot과 swarmplot 조합
boxplot이 요약 통계를 보여주고, 그 위에 swarmplot으로 실제 점을 함께 표시하면 두 차트의 장점이 합쳐집니다.
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")fig, ax = plt.subplots(figsize=(8, 5))sns.boxplot( data=tips, x="day", y="total_bill", color="lightgray", width=0.5, fliersize=0, # boxplot의 이상치 점 숨기기 (swarmplot이 표시하므로) ax=ax)sns.swarmplot( data=tips, x="day", y="total_bill", hue="smoker", dodge=False, size=4, alpha=0.8, ax=ax)plt.title("요일별 계산 금액: boxplot + swarmplot 조합")plt.ylabel("계산 금액 (달러)")plt.show()
fliersize=0으로 boxplot의 이상치 점을 숨깁니다. swarmplot이 모든 점을 이미 보여주기 때문입니다.
데이터가 많을 때 swarmplot의 한계
swarmplot은 점들을 겹치지 않게 배치하기 위해 계산을 많이 합니다. 데이터가 수천 개를 넘어가면 두 가지 문제가 생깁니다.
첫째, 렌더링 속도가 느려집니다. 둘째, 점이 너무 많아 차트가 혼잡해집니다.
이 경우 대안을 고려합니다.
import seaborn as snsimport matplotlib.pyplot as plt# 데이터가 많을 때 대안 1: stripplot + alpha 낮추기penguins = sns.load_dataset("penguins")fig, axes = plt.subplots(1, 2, figsize=(12, 4))sns.stripplot( data=penguins, x="species", y="body_mass_g", alpha=0.3, jitter=True, ax=axes[0])axes[0].set_title("많은 데이터: stripplot (alpha 낮춤)")# 대안 2: violinplot으로 전환sns.violinplot( data=penguins, x="species", y="body_mass_g", inner="quart", ax=axes[1])axes[1].set_title("많은 데이터: violinplot 전환")plt.tight_layout()plt.show()
| 차트 | 장점 | 단점 | 권장 데이터 수 |
|---|---|---|---|
| stripplot | 빠름, 겹침 허용 | 점이 겹쳐 정확한 수 파악 어려움 | 수십~수천 |
| swarmplot | 겹침 없음, 데이터 수 파악 가능 | 데이터 많으면 느리고 혼잡 | 수십~수백 |