iBetter Books
수정

막대 그래프 (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"]