iBetter Books
수정

스와플롯과 스트립플롯 (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 겹침 없음, 데이터 수 파악 가능 데이터 많으면 느리고 혼잡 수십~수백