iBetter Books
수정

ECDF와 rugplot

민서가 데이터를 분석하다 이런 질문을 했습니다.

"계산 금액이 20달러 이하인 손님은 전체의 몇 퍼센트나 될까요?"

히스토그램으로는 대략적으로 짐작할 수 있지만 정확하게 읽기 어렵습니다. 이때 쓰는 것이 ECDF입니다.

ecdfplot: 전체의 몇 %가 이 값 이하인가

ECDF(Empirical Cumulative Distribution Function, 경험적 누적 분포 함수)는 x 위치까지의 데이터가 전체에서 차지하는 비율(0~1)을 y축에 표시합니다.

"x=20에서 y=0.6이다"는 뜻은 "계산 금액이 20달러 이하인 손님이 전체의 60%이다"입니다.

import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.ecdfplot(data=tips, x="total_bill")plt.title("계산 금액의 누적 분포 (ECDF)")plt.xlabel("계산 금액 (달러)")plt.ylabel("누적 비율")plt.axvline(x=20, color="red", linestyle="--", alpha=0.7, label="$20")plt.legend()plt.show()

실행 결과

plt.axvline(x=20)으로 20달러 선을 그으면, 곡선이 그 선과 만나는 y값에서 20달러 이하의 비율을 바로 읽을 수 있습니다.

hue로 그룹 비교

import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.ecdfplot(data=tips, x="total_bill", hue="time")plt.title("식사 시간에 따른 계산 금액 누적 분포")plt.xlabel("계산 금액 (달러)")plt.ylabel("누적 비율")plt.show()

실행 결과

두 곡선이 왼쪽으로 치우칠수록 해당 그룹의 값들이 작다는 뜻입니다. 점심(Lunch)과 저녁(Dinner)의 곡선이 어느 금액대에서 갈라지는지 보면 두 그룹의 차이를 파악할 수 있습니다.

rugplot: 개별 데이터 위치를 축 위에 표시

rugplot은 각 데이터 포인트의 위치를 x축(또는 y축) 위에 짧은 세로선으로 표시합니다. 단독으로 쓰이기보다 다른 차트 위에 레이어로 추가하는 경우가 많습니다.

import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.histplot(data=tips, x="total_bill", bins=20, kde=True)sns.rugplot(data=tips, x="total_bill", height=0.05, color="darkblue", alpha=0.5)plt.title("히스토그램 + KDE + rugplot")plt.xlabel("계산 금액 (달러)")plt.show()

실행 결과

height=0.05는 세로선 높이를 축 전체 높이의 5%로 설정합니다. x축 바로 위에 짧은 막대들이 실제 데이터 위치를 보여줍니다.

histplot + rugplot 조합

rugplot을 추가하면 히스토그램의 각 막대가 어떤 실제 값들로 이루어져 있는지 확인할 수 있습니다.

import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")fig, axes = plt.subplots(1, 2, figsize=(12, 4))# histplot만sns.histplot(data=tips, x="total_bill", bins=15, ax=axes[0])axes[0].set_title("histplot만")# histplot + rugplotsns.histplot(data=tips, x="total_bill", bins=15, ax=axes[1])sns.rugplot(data=tips, x="total_bill", height=0.06, ax=axes[1], color="red", alpha=0.6)axes[1].set_title("histplot + rugplot")plt.tight_layout()plt.show()

실행 결과

세 차트의 용도 정리

차트 y축이 말하는 것 적합한 질문
histplot 각 구간의 빈도 어디에 데이터가 몰려 있나
kdeplot 각 위치의 상대적 밀도 분포의 전체 모양은 어떤가
ecdfplot 해당 값까지의 누적 비율 전체의 몇 %가 이 값 이하인가
rugplot 개별 데이터 위치 실제 데이터가 정확히 어디 있나