막대 그래프 (barplot, countplot)
민서가 요일별로 계산 금액의 평균을 비교하고 싶었습니다. 바로 barplot이 필요한 상황입니다.
강주원 선배가 덧붙였습니다.
"barplot은 단순히 막대 높이만 보여주는 게 아니야. 막대 위의 선이 신뢰구간이거든. 저 선이 짧을수록 평균이 안정적이라는 거야."
이 차트가 보여주는 것
barplot은 각 범주 안의 y값 평균(기본값)을 막대 높이로 표현합니다. 막대 위의 오차 막대(error bar)는 95% 신뢰구간입니다. 평균 외에 중앙값, 합계 등 다른 통계량으로도 바꿀 수 있습니다.
기본 barplot
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.barplot(data=tips, x="day", y="total_bill", hue="sex")plt.title("요일과 성별에 따른 평균 계산 금액")plt.ylabel("평균 계산 금액 (달러)")plt.show()
hue="sex"를 추가하면 같은 요일 안에서 성별로 막대가 나뉩니다.
집계 함수 바꾸기
estimator 파라미터로 집계 방법을 바꿉니다.
import seaborn as snsimport matplotlib.pyplot as pltimport numpy as nptips = sns.load_dataset("tips")fig, axes = plt.subplots(1, 3, figsize=(15, 4))# 평균 (기본)sns.barplot(data=tips, x="day", y="total_bill", estimator="mean", ax=axes[0])axes[0].set_title("평균")# 중앙값sns.barplot(data=tips, x="day", y="total_bill", estimator="median", ax=axes[1])axes[1].set_title("중앙값")# 합계sns.barplot(data=tips, x="day", y="total_bill", estimator="sum", ax=axes[2])axes[2].set_title("합계")plt.suptitle("집계 함수에 따른 차이", y=1.02)plt.tight_layout()plt.show()
countplot: 빈도를 세는 막대 그래프
countplot은 각 범주에 데이터가 몇 개 있는지 세어줍니다. y축 변수를 지정할 필요 없이 x축 변수만 있으면 됩니다.
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.countplot(data=tips, x="day", hue="smoker")plt.title("요일별 손님 수 (흡연 여부 구분)")plt.ylabel("손님 수")plt.show()
"일요일과 토요일에 손님이 많고, 금요일이 가장 적다"는 것을 한눈에 볼 수 있습니다.
Matplotlib과의 비교
Matplotlib으로 hue가 있는 barplot을 그리려면 직접 집계하고 위치를 계산해야 합니다.
import seaborn as snsimport matplotlib.pyplot as pltimport numpy as nptips = sns.load_dataset("tips")fig, axes = plt.subplots(1, 2, figsize=(12, 4))# Matplotlib 방식 (직접 집계)days = ["Thur", "Fri", "Sat", "Sun"]x = np.arange(len(days))width = 0.35male_means = [tips[(tips["day"] == d) & (tips["sex"] == "Male")]["total_bill"].mean() for d in days]female_means = [tips[(tips["day"] == d) & (tips["sex"] == "Female")]["total_bill"].mean() for d in days]axes[0].bar(x - width/2, male_means, width, label="Male")axes[0].bar(x + width/2, female_means, width, label="Female")axes[0].set_xticks(x)axes[0].set_xticklabels(days)axes[0].legend()axes[0].set_title("Matplotlib")# Seaborn 방식sns.barplot(data=tips, x="day", y="total_bill", hue="sex", ax=axes[1])axes[1].set_title("Seaborn")plt.tight_layout()plt.show()
자주 쓰는 파라미터 정리
| 파라미터 | 설명 | 예시 |
|---|---|---|
x |
범주 변수 | x="day" |
y |
집계할 연속 변수 | y="total_bill" |
hue |
그룹 구분 | hue="sex" |
estimator |
집계 함수 | estimator="median" |
errorbar |
오차 막대 방식 | errorbar=None |
order |
범주 표시 순서 | order=["Sun", "Sat", "Fri", "Thur"] |