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 | 개별 데이터 위치 | 실제 데이터가 정확히 어디 있나 |