16. Seaborn으로 통계 시각화
- Seaborn으로 통계 그래프를 더 적은 코드로 예쁘게 그린다
- 산점도·카운트플롯·히스토그램·페어플롯·히트맵을 그린다
- Matplotlib과 Seaborn을 언제 쓰는지 구분한다
import seaborn as sns와 import matplotlib.pyplot as plt를 함께 실행하세요.먼저: Seaborn이 뭔가요?
Seaborn(시본)은 통계 그래프를 쉽고 예쁘게 그리도록 Matplotlib을 감싼 라이브러리입니다. 같은 그래프를 Matplotlib보다 짧은 코드로, 기본값이 더 보기 좋게 그려 줍니다. 특히 데이터프레임과 찰떡궁합이라, 열 이름만 지정하면 알아서 그려 줍니다.
import seaborn as sns import matplotlib.pyplot as plt
🔑 새 용어 — sns
Seaborn의 관례적 별명은sns입니다. (라이브러리 개발자가 어떤 드라마 캐릭터 이름에서 따왔다는 유래가 있지만, 그냥 "시본은 sns"로 외우면 됩니다.)
Seaborn에는 연습용 데이터가 내장돼 있어 바로 불러와 쓸 수 있습니다.
tips = sns.load_dataset("tips") # 식당 팁 데이터 print(tips.head())
실행 결과:
total_bill tip sex smoker day time size 0 16.99 1.01 Female No Sun Dinner 2 1 10.34 1.66 Male No Sun Dinner 3 2 21.01 3.50 Male No Sun Dinner 3 3 23.68 3.31 Male No Sun Dinner 2 4 24.59 3.61 Female No Sun Dinner 4
load_dataset은 인터넷에서 예제 데이터를 받아옵니다(연결 필요). tips(팁), iris(붓꽃), titanic(타이타닉) 등이 유명합니다.산점도 (scatterplot)
두 숫자 열의 관계를 봅니다. 데이터프레임과 열 이름만 주면 됩니다.
import seaborn as sns import matplotlib.pyplot as plt tips = sns.load_dataset("tips") sns.scatterplot(data=tips, x="total_bill", y="tip") plt.title("Bill vs Tip") plt.show()
나오는 그래프: 총 식사 금액(x)과 팁(y)의 산점도가 나옵니다. 점들이 오른쪽 위로 퍼져, "식사 금액이 클수록 팁도 많아지는" 경향이 보입니다.
Seaborn의 강점은 세 번째 정보를 색·크기로 더하는 것입니다.
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="sex", size="size") plt.title("Bill vs Tip by Sex") plt.show()
나오는 그래프: 같은 산점도인데, 성별(hue)에 따라 점 색이 갈리고, 일행 인원(size)에 따라 점 크기가 달라집니다. 한 그래프에 네 가지 정보가 담깁니다.
🔑 새 용어 — hue
"색조"라는 뜻으로, 어떤 열을 기준으로 색을 나눌지 정합니다.hue="sex"면 성별마다 다른 색으로 표시하고 범례도 자동으로 붙습니다. Seaborn 대부분의 그래프에서 쓸 수 있는 강력한 옵션입니다.
카운트플롯 (countplot): 범주별 개수
범주형 열의 값별 개수를 막대로 그립니다. 14장의 value_counts를 그래프로 보는 셈입니다.
sns.countplot(data=tips, x="day") plt.title("Count by Day") plt.show()
나오는 그래프: 요일별 손님 팀 수가 막대로 나옵니다. 토·일(주말)이 목·금보다 높아 주말 손님이 많음을 보여 줍니다.
hue로 더 쪼갤 수 있습니다.
sns.countplot(data=tips, x="day", hue="sex") plt.title("Count by Day and Sex") plt.show()
나오는 그래프: 각 요일 막대가 성별로 둘씩 나뉘어, 요일별·성별 손님 수를 함께 비교할 수 있습니다.
히스토그램 (histplot): 분포 보기
distplot은 더 이상 쓰지 마세요예전 자료에는 분포를 그릴 때
sns.distplot(...)이 자주 나오는데, 이 함수는 deprecated(권장 중단)되어 Seaborn 0.14.0에서 제거됩니다. 지금은 다음 둘로 나뉘었습니다.histplot: 축 하나에 그리는 히스토그램 (가장 많이 씀)displot: 더 유연한 분포 전용 함수 (여러 그룹을 격자로 나눠 그리기 좋음)
옛 코드를 따라 하다
distplot 경고가 뜨면 histplot으로 바꾸면 됩니다.import seaborn as sns import matplotlib.pyplot as plt tips = sns.load_dataset("tips") sns.histplot(data=tips, x="total_bill", bins=20) plt.title("Total Bill Distribution") plt.show()
나오는 그래프: 식사 금액의 분포가 막대로 나옵니다. 10~20달러 구간이 가장 높아, 그 부근 금액의 손님이 가장 많음을 보여 줍니다.
분포 곡선(KDE)을 얹을 수도 있습니다.
sns.histplot(data=tips, x="total_bill", kde=True) plt.title("Distribution with KDE") plt.show()
나오는 그래프: 히스토그램 위에 부드러운 분포 곡선이 겹쳐 그려집니다.
🔑 새 용어 — KDE
KDE(Kernel Density Estimate, 커널 밀도 추정)는 데이터 분포를 부드러운 곡선으로 추정한 것입니다. 막대(히스토그램)의 울퉁불퉁함을 매끈한 선으로 보여 줘서 전체 모양을 파악하기 쉽습니다. 지금은 "분포를 매끄러운 곡선으로 그린 것" 정도로 이해하면 충분합니다.
박스플롯 (boxplot): 그룹별 분포 비교
범주별로 값의 분포와 이상치를 한눈에 비교합니다.
sns.boxplot(data=tips, x="day", y="total_bill") plt.title("Bill by Day") plt.show()
나오는 그래프: 요일마다 상자 하나씩 그려집니다. 각 상자는 그 요일 금액의 중앙값(상자 가운데 선)과 퍼짐 정도를, 위아래 점들은 유난히 크거나 작은 값(이상치)을 나타냅니다.
페어플롯 (pairplot): 모든 쌍 한 번에
여러 숫자 열의 모든 조합을 한 번에 산점도로 그립니다. 데이터 전체를 빠르게 훑을 때 좋습니다.
iris = sns.load_dataset("iris") sns.pairplot(iris, hue="species") plt.show()
나오는 그래프: 붓꽃 데이터의 숫자 열들(꽃잎 길이·너비 등)을 가로세로로 교차한 격자 그래프가 나옵니다. 대각선은 각 열의 분포, 나머지 칸은 두 열의 산점도이며, hue="species" 덕분에 품종별로 색이 갈립니다. 품종이 어떤 특징으로 구분되는지 한눈에 보입니다.
히트맵 (heatmap): 표를 색으로
숫자 표를 색의 진하기로 표현합니다. 특히 상관관계를 볼 때 많이 씁니다.
import seaborn as sns import matplotlib.pyplot as plt tips = sns.load_dataset("tips") corr = tips[["total_bill", "tip", "size"]].corr() # 상관관계 표 sns.heatmap(corr, annot=True, cmap="Blues") plt.title("Correlation") plt.show()
나오는 그래프: 세 숫자 열 사이의 상관관계가 색칠된 격자로 나옵니다. 색이 진할수록 관계가 강하며, annot=True 덕분에 각 칸에 수치(예: 0.68)가 적힙니다. total_bill과 tip이 짙게 나와 둘의 관계가 강함을 보여 줍니다.
🔑 새 용어 — 상관관계(correlation)와 corr()
두 값이 함께 변하는 정도입니다. -1~1 사이 값으로, 1에 가까우면 "한쪽이 커질 때 다른 쪽도 커진다", -1이면 반대, 0이면 관계가 약합니다.df.corr()이 숫자 열들의 상관관계 표를 만들어 줍니다. (상관관계는 "함께 움직임"이지 "원인-결과"가 아님에 유의하세요.)
Matplotlib vs Seaborn: 언제 무엇을?
| Matplotlib | Seaborn | |
|---|---|---|
| 성격 | 기본·범용, 세밀한 제어 | 통계 특화, 짧은 코드·예쁜 기본값 |
| 데이터프레임 | 직접 x·y 지정 | 열 이름만 지정 (data=, x=, hue=) |
| 언제 | 그래프를 세밀하게 다듬을 때 | 통계 그래프를 빠르게 그릴 때 |
plt.title()·plt.xlabel() 같은 Matplotlib 명령으로 세부를 다듬습니다. 위 예제들이 이미 그렇게 섞어 쓰고 있었죠.🛠 미니 챌린지
tips = sns.load_dataset("tips")로 시작하세요.
- 흡연 여부(
smoker)별 손님 수를 카운트플롯으로 그리세요. - 시간대(
time)별 총 금액(total_bill) 분포를 박스플롯으로 비교하세요. total_bill의 분포를 히스토그램으로 그리세요. (distplot 말고!)
✅ 미니 챌린지 해설
import seaborn as sns import matplotlib.pyplot as plt tips = sns.load_dataset("tips") # 1. 카운트플롯 sns.countplot(data=tips, x="smoker") plt.title("Count by Smoker") plt.show()
나오는 그래프: 흡연/비흡연 두 막대. 비흡연(No)이 더 높습니다.
# 2. 박스플롯 sns.boxplot(data=tips, x="time", y="total_bill") plt.title("Bill by Time") plt.show()
나오는 그래프: 점심(Lunch)·저녁(Dinner) 두 상자. 저녁의 금액이 대체로 더 큼이 보입니다.
# 3. 히스토그램 (histplot 사용!) sns.histplot(data=tips, x="total_bill", bins=20) plt.title("Total Bill Distribution") plt.show()
나오는 그래프: 금액 분포 막대. 10~20달러 구간이 가장 높습니다.
이 장에서 배운 것
- Seaborn(
sns)은 Matplotlib 위에서 통계 그래프를 짧고 예쁘게 그린다. data=,x=,y=,hue=로 데이터프레임 열만 지정하면 된다.- 산점도·카운트플롯·히스토그램·박스플롯·페어플롯·히트맵이 핵심이다.
distplot은 제거되므로 분포는histplot(또는displot)으로 그린다.- Seaborn으로 그리고 Matplotlib으로 다듬는 식으로 둘을 함께 쓴다.
✍️ 확인 문제
- Seaborn에서 "세 번째 정보를 색으로 더하는" 옵션의 이름은 무엇인가요?
- 분포를 그릴 때
distplot대신 무엇을 써야 하나요? 왜인가요? - 히트맵은 주로 무엇을 시각화할 때 쓰며,
annot=True는 무슨 역할인가요?
다음 부에서는 날짜·시간 데이터를 다루는 법을 배웁니다. 시간에 따른 데이터(시계열)는 분석에서 아주 흔하게 만납니다.
👉 17. 날짜와 시간 다루기