Seaborn boxplot, “한 장으로 분포를 설명”하는 가장 빠른 그래프

레스토랑에서 하루 종일 손님이 왔다 갔다 하면, “언제 얼마를 쓰는지” 감으로만 느끼기 쉽죠. 이럴 때 seaborn boxplot 하나만 잘 그려도 요일별 결제 금액 분포와 흡연자/비흡연자 차이를 단번에 확인할 수 있습니다.
지난 번 heatmap 데이터 시각화에 이어 이번 글에서는 seaborn boxplot 기본 코드 한 줄 한 줄을 뜯어보면서, 실무에서 바로 써먹을 수 있는 데이터 시각화 포인트까지 정리해볼게요.
seaborn boxplot 예제 코드 소개
이번에 사용할 코드는 海生이 기본으로 제공하는 tips 데이터셋을 박스플롯으로 그리는 예제입니다.
import seaborn as sns
sns.set_theme(style="ticks", palette="pastel")
# Load the example tips dataset
tips = sns.load_dataset("tips")
# Draw a nested boxplot to show bills by day and time
sns.boxplot(
x="day",
y="total_bill",
hue="smoker",
palette=["m", "g"],
data=tips
)
sns.despine(offset=10, trim=True)코드는 짧지만, 시각화 관점에서는 꽤 많은 내용을 담고 있습니다. 스타일 설정, 데이터 적재, 축 변수 선택, hue로 그룹 나누기, 팔레트 변경, 그리고 테두리 정리까지 한 번에 경험할 수 있어요.
tips 데이터셋이 말해주는 것들
tips 데이터셋에는 레스토랑 계산서 정보가 들어 있습니다.
- total_bill: 손님이 지불한 총 금액
- day: 방문 요일 (Thur, Fri, Sat, Sun)
- smoker: 일행 중 흡연자가 있는지 여부
이 세 가지를 조합하면 “요일별 매출 분포 + 흡연 여부에 따른 차이”라는 꽤 현실적인 분석 질문을 던질 수 있습니다. 박스플롯은 바로 이런 “분포 비교”에 최적화된 도구이기 때문에 선택이 아주 좋죠.
코드 한 줄씩 뜯어보기
- 전역 스타일 설정
- sns.set_theme(style=”ticks”, palette=”pastel”)
- 전체 그래프 스타일을 틱이 있는 깨끗한 스타일로 바꾸고, 기본 색은 파스텔 톤으로 맞춥니다. 이후 그리는 모든 그래프에 공통으로 적용돼서 “한 보고서 안의 그래프 분위기”가 통일됩니다.
- 데이터 불러오기
- tips = sns.load_dataset(“tips”)
- 별도 CSV를 다운받지 않아도 즉시 예제 데이터를 사용할 수 있습니다. 실무에서는 여기만 여러분의 실제 DataFrame으로 바꿔 쓰면 돼요.
- 박스플롯의 핵심 매핑
- x=”day”: x축에 요일을 카테고리로 배치
- y=”total_bill”: y축에 결제 금액(숫자)를 올려 분포 표현
- hue=”smoker”: 같은 요일 안에서 흡연자/비흡연자를 나눠서 박스를 두 개씩 그리기
이 덕분에 “요일별” + “흡연 여부별” 분포를 동시에 볼 수 있습니다.
- 팔레트 커스터마이징
- palette=[“m”, “g”]
- hue 그룹(흡연자/비흡연자)에 사용할 색을 직접 지정합니다. seaborn의 기본 팔레트 대신, 팀 브랜드 컬러나 프레젠테이션 테마에 맞춰 색을 세밀하게 조정할 수 있는 지점이에요.
- 테두리 정리
- sns.despine(offset=10, trim=True)
- 상단·우측 spine(테두리)을 제거해서 조금 더 미니멀한 스타일로 바꿉니다. 보고서용 그래프에서 자잘한 선을 줄이면 훨씬 세련된 느낌을 줄 수 있어요.
박스플롯에서 읽을 수 있는 핵심 인사이트

실제로 그래프를 그려보면 요일별로 박스(사분위 범위) 높이가 다르고, 일부 요일은 점(이상치)이 더 멀리 튀어나와 있는 것을 보게 됩니다.
- 어떤 요일이 매출이 전반적으로 높은지 (박스 위치 자체가 위로 올라간 요일)
- 흡연자 그룹과 비흡연자 그룹의 중앙값이 얼마나 차이 나는지
- 특정 요일에만 유난히 큰 결제 금액 이상치가 많은지
이 정보만 가지고도 “언제 고가 메뉴 프로모션을 집중할지”, “어떤 요일에 테이블 회전율을 신경 써야 할지” 같은 실무 아이디어가 바로 나오죠.
조금 더 자세히 위 그래프를 보면 요일·흡연 여부에 따라 결제 금액 패턴이 꽤 뚜렷하게 갈립니다.
- 전체적으로 주말(Sat, Sun) 로 갈수록 박스가 위로 올라가고 길어지면서,
평일(Thur, Fri)에 비해 계산서 금액 수준이 전반적으로 높고 변동 폭도 크다는 걸 알 수 있습니다. - 흡연자(보라색) 和 비흡연자(연두색) 를 비교해 보면
- Thur, Fri에서는 두 그룹의 중앙값과 박스 높이가 거의 비슷해서, 요일별 평균 소비 패턴이 크게 다르지 않아 보입니다.
- 하지만 Sat, Sun에서는 보라색 박스가 연두색보다 위에 있고 더 길며, 위쪽으로 튀어나간 동그라미(이상치)도 더 많이 보입니다.
→ 주말에는 흡연자 그룹에서 고가 결제와 큰 변동이 더 자주 발생한다고 해석할 수 있습니다.
- 特别是 일요일(Sun) 의 흡연자 박스는
- 중앙값이 약 25~30 근처로 가장 높고
- 윗수염과 이상치가 40, 45 이상까지 올라가
“일요일 흡연 손님 + 고액 결제”라는 조합이 꽤 자주 나타난다는 신호로 볼 수 있습니다.
- 반대로 비흡연자 그룹是
- 주말에도 박스 높이가 상대적으로 낮고
- 이상치 개수도 흡연자보다 적어
전체적으로 더 안정적인 소비 패턴을 보입니다.
정리하면, 이 박스플롯 하나만으로도
- 평일보다 주말 매출이 크고 변동성이 크다는 점,
- 그 중에서도 주말 흡연자 테이블이 고액 결제의 주요 구간이라는 점,
두 가지 핵심 인사이트를 바로 뽑아낼 수 있습니다.
실무에서 seaborn boxplot 응용하기
tips 예제 대신, 여러분의 실제 데이터를 떠올려보면 더 재미있습니다.
- 직원별 근무시간 분포 비교 (팀별, 직급별)
- 설문 점수 분포 비교 (부서별, 직군별)
- 프로젝트 리드타임 비교 (연도별, 팀별)
필요한 건 딱 세 가지입니다.
여기서 hue는 matplotlib에서 legend와 같습니다.
범례를 말하는 겁니다.
- x축에 비교하고 싶은 카테고리
- y축에 분포를 보고 싶은 숫자 컬럼
- hue에 추가로 나누고 싶은 그룹
이 패턴만 기억하면, 거의 모든 “분포 비교” 문제를 seaborn boxplot으로 빠르게 데이터 시각화를 할 수 있어요.






