iBetter Books
수정

히스토그램 (histplot)

민서가 팁 금액이 얼마씩 주로 주어지는지 궁금해졌습니다. 평균 말고, 실제로 어느 금액대에 가장 많이 몰려 있는지가 알고 싶었습니다.

"히스토그램 써봐. 데이터를 구간별로 나눠서 각 구간에 몇 개가 있는지 막대로 보여줘."

이 차트가 보여주는 것

히스토그램은 연속 변수의 전체 범위를 일정 간격(bin)으로 나누고, 각 구간에 데이터가 몇 개 들어있는지 막대 높이로 표현합니다. 막대가 높은 구간에 데이터가 많이 몰려 있습니다.

import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.histplot(data=tips, x="total_bill", bins=20)plt.title("계산 금액 분포")plt.xlabel("계산 금액 (달러)")plt.ylabel("빈도")plt.show()

실행 결과

bins: 구간 수가 모양을 바꾼다

bins 수에 따라 히스토그램의 모양이 크게 달라집니다.

import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")fig, axes = plt.subplots(1, 3, figsize=(15, 4))for ax, bins in zip(axes, [5, 20, 50]):    sns.histplot(data=tips, x="total_bill", bins=bins, ax=ax)    ax.set_title(f"bins={bins}")    ax.set_xlabel("계산 금액 (달러)")plt.suptitle("bins 수에 따른 히스토그램 모양 변화", y=1.02)plt.tight_layout()plt.show()

실행 결과

bins가 너무 적으면 데이터의 세부 모양을 잃고, 너무 많으면 노이즈가 두드러집니다. 데이터의 특성에 맞게 조절합니다.

kde=True: 밀도 곡선 오버레이

kde=True를 추가하면 히스토그램 위에 KDE 곡선이 함께 그려집니다. 분포의 전체적인 형태를 더 부드럽게 파악할 수 있습니다.

import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.histplot(data=tips, x="total_bill", bins=20, kde=True)plt.title("계산 금액 분포 (KDE 포함)")plt.xlabel("계산 금액 (달러)")plt.show()

실행 결과

hue로 그룹별 비교

import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")fig, axes = plt.subplots(1, 3, figsize=(15, 4))# layer (기본): 겹쳐서 표시sns.histplot(data=tips, x="total_bill", hue="time", multiple="layer",             alpha=0.5, ax=axes[0])axes[0].set_title("multiple='layer' (겹쳐서)")# dodge: 나란히 표시sns.histplot(data=tips, x="total_bill", hue="time", multiple="dodge",             ax=axes[1])axes[1].set_title("multiple='dodge' (나란히)")# stack: 쌓아서 표시sns.histplot(data=tips, x="total_bill", hue="time", multiple="stack",             ax=axes[2])axes[2].set_title("multiple='stack' (쌓아서)")plt.suptitle("multiple 옵션 비교 (점심 vs 저녁)", y=1.02)plt.tight_layout()plt.show()

실행 결과

자주 쓰는 파라미터 정리

파라미터 역할 예시
x 분포를 볼 변수 x="total_bill"
bins 구간 수 bins=20
kde 밀도 곡선 오버레이 kde=True
hue 그룹 구분 hue="time"
multiple 그룹 표시 방식 "layer", "dodge", "stack"
stat y축 통계량 stat="density", stat="probability"

stat 파라미터: y축이 의미하는 것을 바꾼다

기본값 stat="count"는 각 bin에 몇 개의 데이터가 있는지 보여줍니다. stat="density"로 바꾸면 y축이 밀도가 되어 다른 크기의 데이터셋과 비교하기 편합니다.

import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")fig, axes = plt.subplots(1, 2, figsize=(10, 4))sns.histplot(data=tips, x="total_bill", stat="count", ax=axes[0])axes[0].set_title("stat='count' (빈도)")sns.histplot(data=tips, x="total_bill", stat="density", ax=axes[1])axes[1].set_title("stat='density' (밀도)")plt.tight_layout()plt.show()

실행 결과