본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 1. · 14 Views
Seaborn으로 통계 시각화 완벽 가이드
데이터 분석의 꽃이라 불리는 통계 시각화를 Seaborn으로 쉽고 아름답게 구현하는 방법을 배웁니다. 분포, 범주형, 관계 시각화부터 히트맵까지 실무에서 바로 활용할 수 있는 핵심 기법을 다룹니다.
목차
1. Seaborn 설치 및 테마
데이터 분석팀에 새로 합류한 김개발 씨는 첫 번째 과제로 매출 데이터 시각화를 맡았습니다. matplotlib으로 그래프를 그렸지만, 팀장님은 고개를 저었습니다.
"이건 좀 투박해 보이네요. Seaborn 써보신 적 있어요?"
Seaborn은 matplotlib을 기반으로 만들어진 파이썬 통계 시각화 라이브러리입니다. 마치 스마트폰의 기본 카메라와 전문 보정 앱의 관계처럼, matplotlib이 기본 기능을 제공한다면 Seaborn은 그 위에 세련된 통계 시각화 기능을 얹어줍니다.
몇 줄의 코드만으로 학술 논문 수준의 그래프를 만들 수 있습니다.
다음 코드를 살펴봅시다.
# Seaborn 설치 (터미널에서 실행)
# pip install seaborn
import seaborn as sns
import matplotlib.pyplot as plt
# 기본 테마 설정 - 깔끔한 흰색 배경
sns.set_theme(style="whitegrid")
# 다양한 테마 옵션
# darkgrid: 어두운 격자 배경 (기본값)
# whitegrid: 흰색 격자 배경
# dark: 어두운 배경, 격자 없음
# white: 흰색 배경, 격자 없음
# ticks: 축 눈금만 표시
# 컬러 팔레트 설정
sns.set_palette("husl") # 선명한 색상 팔레트
# 샘플 데이터로 테스트
tips = sns.load_dataset("tips")
print(tips.head())
김개발 씨는 입사 첫 주에 데이터 시각화라는 큰 산을 만났습니다. 엑셀로 그래프를 그리던 시절과는 차원이 다른 세계였습니다.
matplotlib으로 꾸역꾸역 그래프를 그렸지만, 결과물은 어딘가 아마추어 느낌이 물씬 풍겼습니다. 팀의 시니어 데이터 분석가 박시니어 씨가 김개발 씨의 모니터를 슬쩍 들여다보았습니다.
"아, matplotlib만 쓰셨구나. Seaborn 한번 써보세요.
세상이 달라질 거예요." 그렇다면 Seaborn이란 정확히 무엇일까요? 쉽게 비유하자면, Seaborn은 마치 인테리어 전문가와 같습니다.
빈 방에 가구를 배치하는 것은 누구나 할 수 있지만, 전문가가 손을 대면 같은 가구로도 완전히 다른 분위기의 공간이 탄생합니다. matplotlib이 기본 가구라면, Seaborn은 그 가구들을 멋지게 배치하고 조명까지 세팅해주는 전문가인 셈입니다.
Seaborn이 등장하기 전에는 어땠을까요? 개발자들은 matplotlib으로 그래프 하나를 예쁘게 만들기 위해 수십 줄의 설정 코드를 작성해야 했습니다.
색상 조합을 고민하고, 폰트 크기를 조절하고, 격자선의 두께까지 일일이 지정해야 했습니다. 통계 시각화에 특화된 차트를 그리려면 복잡한 계산까지 직접 구현해야 했습니다.
바로 이런 불편함을 해결하기 위해 Seaborn이 등장했습니다. Seaborn을 사용하면 set_theme 함수 하나로 전체 시각화 스타일을 한 번에 설정할 수 있습니다.
darkgrid, whitegrid, dark, white, ticks 다섯 가지 테마 중에서 선택하기만 하면 됩니다. 학술 발표용이라면 whitegrid가, 프레젠테이션용이라면 dark가 어울립니다.
위의 코드를 살펴보겠습니다. 먼저 **sns.set_theme(style="whitegrid")**를 호출합니다.
이 한 줄로 이후에 그리는 모든 그래프에 깔끔한 흰색 격자 배경이 적용됩니다. **sns.set_palette("husl")**는 색상 팔레트를 설정합니다.
husl은 색상 간 명도 차이가 균일해서 여러 데이터를 구분하기 좋습니다. sns.load_dataset은 Seaborn이 제공하는 샘플 데이터셋을 불러옵니다.
tips 데이터셋은 레스토랑 팁 정보를 담고 있어서 다양한 시각화 연습에 안성맞춤입니다. 실제 현업에서는 어떻게 활용할까요?
예를 들어 대시보드를 만든다고 가정해봅시다. 경영진에게 보여줄 자료라면 whitegrid 테마에 차분한 색상 팔레트를 선택합니다.
마케팅팀의 SNS용 자료라면 좀 더 선명한 색상을 사용할 수 있습니다. 테마 설정 한 줄만 바꾸면 전체 분위기가 달라지니 상황에 맞게 유연하게 대응할 수 있습니다.
하지만 주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수 중 하나는 테마 설정을 그래프를 그린 후에 하는 것입니다.
set_theme은 이후에 그리는 그래프에만 적용되므로, 반드시 시각화 코드 전에 호출해야 합니다. 또한 Jupyter Notebook에서는 커널을 재시작하면 테마 설정이 초기화된다는 점도 기억해두세요.
다시 김개발 씨의 이야기로 돌아가 봅시다. 박시니어 씨의 조언대로 Seaborn을 설치하고 테마를 적용한 김개발 씨는 눈이 휘둥그레졌습니다.
같은 데이터인데 완전히 다른 느낌의 그래프가 나왔기 때문입니다. Seaborn의 테마 시스템을 제대로 이해하면 일관성 있고 전문적인 시각화 결과물을 쉽게 만들 수 있습니다.
이제 본격적으로 다양한 차트를 그려볼 준비가 되었습니다.
실전 팁
💡 - set_theme은 항상 시각화 코드 맨 앞에 배치하세요
- 발표 자료용은 font_scale 파라미터로 글자 크기를 키우면 좋습니다
- sns.set_palette("colorblind")는 색맹 친화적 팔레트입니다
2. 분포 시각화
김개발 씨가 고객 연령대 데이터를 분석하던 중 문득 궁금해졌습니다. "이 데이터가 어떤 모양으로 분포되어 있는지 한눈에 볼 수 없을까?" 옆자리 박시니어 씨가 힐끗 보더니 말했습니다.
"histplot이랑 kdeplot 써봤어요?"
분포 시각화는 데이터가 어떤 값에 몰려 있고, 어떻게 퍼져 있는지를 보여주는 시각화 기법입니다. 마치 학교 시험 점수 분포표를 보면 학급의 전체적인 성적 경향을 파악할 수 있는 것처럼, 분포 시각화를 통해 데이터의 전체적인 특성을 직관적으로 이해할 수 있습니다.
다음 코드를 살펴봅시다.
import seaborn as sns
import matplotlib.pyplot as plt
# 샘플 데이터 로드
tips = sns.load_dataset("tips")
# 히스토그램 - 데이터의 빈도 분포
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# histplot: 막대 형태로 빈도 표시
sns.histplot(data=tips, x="total_bill", bins=20, ax=axes[0])
axes[0].set_title("Total Bill Distribution (Histogram)")
# kdeplot: 부드러운 곡선으로 밀도 추정
sns.kdeplot(data=tips, x="total_bill", fill=True, ax=axes[1])
axes[1].set_title("Total Bill Distribution (KDE)")
plt.tight_layout()
plt.show()
# 두 가지를 함께 표시할 수도 있습니다
sns.histplot(data=tips, x="total_bill", kde=True)
plt.show()
김개발 씨는 마케팅팀으로부터 긴급 요청을 받았습니다. 고객들의 구매 금액 분포를 분석해달라는 것이었습니다.
단순히 평균값만 알려주면 될 줄 알았는데, 마케팅팀장은 더 자세한 그림을 원했습니다. "평균이 5만원이라고요?
그런데 대부분의 고객이 5만원 근처에서 구매하는 건가요, 아니면 1만원대와 10만원대로 나뉘어 있는 건가요?" 좋은 질문이었습니다. 평균값만으로는 데이터의 진짜 모습을 알 수 없습니다.
바로 이럴 때 분포 시각화가 필요합니다. histplot은 히스토그램을 그리는 함수입니다.
마치 투표함에 표를 분류해서 쌓아두는 것처럼, 데이터를 일정 구간(bin)으로 나누고 각 구간에 몇 개의 데이터가 있는지 막대 높이로 보여줍니다. bins 파라미터로 구간 개수를 조절할 수 있습니다.
너무 적으면 세부 정보가 사라지고, 너무 많으면 노이즈가 생깁니다. kdeplot은 커널 밀도 추정(Kernel Density Estimation)을 시각화합니다.
히스토그램이 계단식이라면, KDE는 부드러운 곡선입니다. 마치 히스토그램의 막대들을 부드럽게 연결한 것처럼 보입니다.
fill=True 옵션을 주면 곡선 아래를 색으로 채워서 더 직관적으로 볼 수 있습니다. 위의 코드를 단계별로 살펴보겠습니다.
**plt.subplots(1, 2, figsize=(12, 5))**로 가로로 나란한 두 개의 그래프 영역을 만듭니다. 왼쪽에는 히스토그램을, 오른쪽에는 KDE 플롯을 그립니다.
ax=axes[0] 파라미터로 어떤 위치에 그릴지 지정합니다. 가장 실용적인 것은 마지막 줄입니다.
kde=True 옵션 하나만 추가하면 히스토그램 위에 KDE 곡선이 함께 그려집니다. 막대로 실제 빈도를 보면서 동시에 전체적인 분포 형태를 파악할 수 있어서, 실무에서 가장 많이 사용하는 조합입니다.
실제 현업에서는 어떻게 활용할까요? 쇼핑몰 데이터를 분석한다고 가정해봅시다.
주문 금액 분포를 그려보면 흥미로운 패턴이 보일 수 있습니다. 만약 분포가 오른쪽으로 긴 꼬리를 가지고 있다면, 소수의 고액 구매자가 있다는 의미입니다.
두 개의 봉우리가 보인다면, 서로 다른 두 고객 집단이 있을 수 있습니다. 주의할 점도 있습니다.
bins 값을 정할 때 데이터 개수를 고려해야 합니다. 데이터가 100개인데 bins를 50으로 설정하면 각 막대에 평균 2개의 데이터만 들어가서 의미 있는 패턴을 찾기 어렵습니다.
일반적으로 데이터 개수의 제곱근 정도가 적당한 출발점입니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
분포 시각화 결과를 본 마케팅팀장은 만족스러운 표정을 지었습니다. 구매 금액이 2만원대와 8만원대에 두 개의 봉우리를 가진다는 사실을 발견했기 때문입니다.
이를 바탕으로 두 가지 다른 프로모션 전략을 세울 수 있게 되었습니다.
실전 팁
💡 - bins="auto"를 사용하면 Seaborn이 자동으로 적절한 구간 수를 계산합니다
- hue 파라미터로 그룹별 분포를 겹쳐서 비교할 수 있습니다
- 데이터에 이상치가 있으면 xlim으로 표시 범위를 제한하세요
3. 범주형 시각화
프로젝트 회의에서 팀장님이 물었습니다. "성별에 따라 구매 금액 차이가 있나요?
요일별로는 어떻고요?" 김개발 씨는 평균값을 계산해서 표로 보여드렸지만, 팀장님은 아쉬운 표정이었습니다. "표로는 감이 잘 안 오네요.
시각화해서 보여줄 수 있어요?"
범주형 시각화는 카테고리별로 데이터를 비교할 때 사용합니다. 마치 여러 반의 시험 성적을 나란히 비교하는 것처럼, 서로 다른 그룹 간의 차이를 직관적으로 보여줍니다.
boxplot은 분포의 요약 통계를, violinplot은 분포의 전체 모양을 보여줍니다.
다음 코드를 살펴봅시다.
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# boxplot: 중앙값, 사분위수, 이상치를 한눈에
sns.boxplot(data=tips, x="day", y="total_bill", hue="sex", ax=axes[0])
axes[0].set_title("Total Bill by Day (Boxplot)")
# violinplot: 분포의 전체 형태를 보여줌
sns.violinplot(data=tips, x="day", y="total_bill", hue="sex",
split=True, ax=axes[1])
axes[1].set_title("Total Bill by Day (Violinplot)")
plt.tight_layout()
plt.show()
# 추가: stripplot으로 개별 데이터 포인트 표시
sns.boxplot(data=tips, x="day", y="total_bill")
sns.stripplot(data=tips, x="day", y="total_bill",
color="red", alpha=0.3, size=4)
plt.show()
김개발 씨는 난감했습니다. 성별, 요일, 식사 시간대별로 구매 금액을 비교해야 하는데, 평균값만으로는 뭔가 부족했습니다.
남성 평균이 여성보다 높다고 해서 모든 남성이 더 많이 쓰는 걸까요? 데이터의 퍼짐 정도는 어떨까요?
박시니어 씨가 조언했습니다. "범주형 데이터 비교할 때는 boxplot이랑 violinplot이 최고예요.
평균만 보면 놓치는 게 많거든요." boxplot은 마치 데이터의 신체검사표와 같습니다. 상자의 중앙선은 중앙값을, 상자의 위아래 경계는 1사분위수와 3사분위수를 나타냅니다.
상자에서 뻗어 나온 수염은 데이터의 범위를, 수염 바깥의 점들은 이상치를 보여줍니다. 이 하나의 그림으로 데이터의 중심, 퍼짐, 치우침, 이상치를 모두 파악할 수 있습니다.
violinplot은 boxplot의 확장판입니다. 마치 바이올린처럼 생긴 이 그래프는 양옆의 곡선으로 데이터의 밀도를 보여줍니다.
넓은 부분은 데이터가 많이 몰려 있는 구간이고, 좁은 부분은 데이터가 적은 구간입니다. boxplot이 요약 통계라면, violinplot은 분포의 전체 그림입니다.
위의 코드에서 핵심적인 부분을 살펴보겠습니다. hue="sex" 파라미터가 중요합니다.
이 옵션 하나로 각 요일 안에서 성별로 나누어 비교할 수 있습니다. 파란색은 남성, 주황색은 여성처럼 색상으로 구분됩니다.
violinplot의 split=True 옵션은 특별합니다. 하나의 바이올린을 반으로 쪼개서 왼쪽에는 한 그룹, 오른쪽에는 다른 그룹을 표시합니다.
공간을 절약하면서도 두 그룹을 직접 비교할 수 있어서 매우 유용합니다. 마지막 코드 블록은 실무에서 자주 쓰는 테크닉입니다.
boxplot 위에 stripplot을 겹쳐서 그립니다. 요약 통계와 함께 실제 데이터 점들이 어디에 있는지 볼 수 있습니다.
alpha=0.3으로 투명도를 주어 점들이 겹쳐도 밀도를 파악할 수 있게 했습니다. 실제 현업에서는 어떻게 활용할까요?
A/B 테스트 결과를 분석한다고 가정해봅시다. 단순히 "A그룹 평균이 B그룹보다 5% 높다"고 보고하는 것보다, boxplot으로 두 그룹의 분포를 보여주는 것이 훨씬 설득력 있습니다.
B그룹의 분산이 크다면, 그 5% 차이가 통계적으로 의미 있는지 의문을 가질 수 있기 때문입니다. 주의할 점도 있습니다.
데이터가 너무 적으면 violinplot이 오해를 불러일으킬 수 있습니다. 10개의 데이터로 그린 바이올린 모양은 실제 분포와 다를 수 있습니다.
데이터가 적을 때는 boxplot에 stripplot을 겹치는 방식이 더 정직한 표현입니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
boxplot을 보여드리자 팀장님의 눈이 반짝였습니다. "일요일 남성 고객의 구매 금액 분산이 크네요.
이상치도 많고. 이 그룹을 좀 더 분석해볼까요?" 데이터의 숨겨진 이야기가 드러나는 순간이었습니다.
실전 팁
💡 - 데이터 개수가 적으면 boxplot + stripplot 조합을 사용하세요
- order 파라미터로 카테고리 순서를 지정할 수 있습니다
- palette 파라미터로 색상 테마를 바꿀 수 있습니다
4. 관계 시각화
데이터 분석 보고서를 작성하던 김개발 씨가 혼잣말을 했습니다. "총 금액이 높으면 팁도 많이 주려나?" 그 말을 들은 박시니어 씨가 대답했습니다.
"궁금하면 직접 확인해보는 게 좋죠. scatterplot 그려보세요."
관계 시각화는 두 변수 사이의 관계를 탐색할 때 사용합니다. 마치 키와 몸무게의 관계를 보듯이, 한 변수가 변할 때 다른 변수가 어떻게 변하는지 패턴을 찾을 수 있습니다.
scatterplot은 두 변수의 관계를, pairplot은 여러 변수 쌍의 관계를 한 번에 보여줍니다.
다음 코드를 살펴봅시다.
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
# scatterplot: 두 연속형 변수의 관계
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# 기본 산점도 + 회귀선
sns.regplot(data=tips, x="total_bill", y="tip", ax=axes[0])
axes[0].set_title("Total Bill vs Tip (with regression)")
# 그룹별로 구분한 산점도
sns.scatterplot(data=tips, x="total_bill", y="tip",
hue="time", style="sex", size="size", ax=axes[1])
axes[1].set_title("Total Bill vs Tip (by groups)")
plt.tight_layout()
plt.show()
# pairplot: 여러 변수 쌍을 한 번에 비교
sns.pairplot(tips, hue="sex",
vars=["total_bill", "tip", "size"])
plt.show()
김개발 씨의 질문은 데이터 분석에서 가장 기본적이면서도 중요한 질문입니다. 변수들 사이에 어떤 관계가 있을까?
이 관계를 파악하는 것이 바로 분석의 시작입니다. scatterplot은 마치 지도 위에 점을 찍는 것과 같습니다.
x축에 한 변수를, y축에 다른 변수를 놓고, 각 데이터를 점으로 표시합니다. 점들이 모인 패턴을 보면 두 변수의 관계가 드러납니다.
오른쪽 위로 올라가는 패턴이라면 양의 상관관계, 오른쪽 아래로 내려가면 음의 상관관계입니다. 코드의 첫 번째 그래프에서 regplot을 사용했습니다.
이 함수는 산점도와 함께 회귀선을 그려줍니다. 연한 색 영역은 신뢰구간을 나타냅니다.
회귀선을 보면 두 변수의 전반적인 관계를 한눈에 파악할 수 있습니다. 두 번째 그래프의 scatterplot은 더 많은 정보를 담고 있습니다.
**hue="time"**으로 점심과 저녁을 색상으로 구분하고, **style="sex"**로 성별을 마커 모양으로 구분합니다. **size="size"**는 일행 수에 따라 점의 크기를 다르게 표시합니다.
이렇게 하면 2차원 그래프에서 4개 변수의 관계를 동시에 볼 수 있습니다. pairplot은 탐색적 데이터 분석의 강력한 도구입니다.
마치 데이터의 전체 지도를 펼쳐 보는 것과 같습니다. 지정한 변수들의 모든 조합에 대해 산점도를 그리고, 대각선에는 각 변수의 분포를 표시합니다.
어떤 변수 쌍이 강한 관계를 가지는지, 그룹 간에 패턴 차이가 있는지 한눈에 파악할 수 있습니다. 위의 코드에서 **vars=["total_bill", "tip", "size"]**는 분석할 변수를 지정합니다.
변수를 지정하지 않으면 모든 수치형 변수에 대해 그리는데, 변수가 많으면 그래프가 너무 커질 수 있습니다. **hue="sex"**로 성별에 따른 패턴 차이도 함께 볼 수 있습니다.
실제 현업에서는 어떻게 활용할까요? 신규 서비스의 사용자 행동을 분석한다고 가정해봅시다.
체류 시간, 클릭 수, 구매 금액, 방문 횟수 등 여러 지표가 있습니다. pairplot을 그리면 어떤 지표들이 서로 관련되어 있는지 빠르게 파악할 수 있습니다.
체류 시간과 구매 금액 사이에 강한 양의 상관관계가 보인다면, 체류 시간을 늘리는 전략이 매출 증가로 이어질 수 있다는 가설을 세울 수 있습니다. 주의할 점도 있습니다.
산점도에서 보이는 패턴이 항상 인과관계를 의미하는 것은 아닙니다. 상관관계는 있지만 인과관계는 없을 수 있습니다.
또한 데이터가 너무 많으면 점들이 겹쳐서 패턴을 파악하기 어렵습니다. 이럴 때는 alpha 값을 낮추거나, 2D 히스토그램(histplot의 변형)을 사용하는 것이 좋습니다.
다시 김개발 씨의 이야기로 돌아가 봅시다. 산점도를 그려본 김개발 씨는 예상대로 총 금액과 팁 사이에 양의 상관관계가 있음을 확인했습니다.
그런데 흥미로운 점도 발견했습니다. 저녁 시간대의 점들이 더 넓게 퍼져 있었습니다.
저녁에는 팁을 후하게 주는 사람과 짜게 주는 사람의 차이가 더 크다는 것이었습니다.
실전 팁
💡 - 데이터가 많으면 alpha 값을 0.5 이하로 낮춰서 겹침을 파악하세요
- regplot에서 ci=None 옵션으로 신뢰구간을 숨길 수 있습니다
- pairplot의 corner=True 옵션은 중복되는 하단 삼각형만 표시합니다
5. 히트맵
프로젝트 막바지에 김개발 씨는 변수들 간의 상관관계를 정리해야 했습니다. 10개가 넘는 변수의 관계를 어떻게 한눈에 보여줄 수 있을까요?
pairplot을 그리자니 그래프가 너무 복잡해질 것 같았습니다. 박시니어 씨가 해답을 알려주었습니다.
"상관관계 행렬을 히트맵으로 그려봐요."
히트맵은 행렬 형태의 데이터를 색상으로 시각화하는 방법입니다. 마치 온도 지도처럼, 값의 크기를 색상의 강도로 표현합니다.
상관관계 행렬을 히트맵으로 표현하면 어떤 변수들이 서로 강하게 연관되어 있는지 직관적으로 파악할 수 있습니다.
다음 코드를 살펴봅시다.
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
tips = sns.load_dataset("tips")
# 상관관계 행렬 계산 (수치형 컬럼만)
numeric_cols = tips.select_dtypes(include=[np.number])
correlation_matrix = numeric_cols.corr()
# 기본 히트맵
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix,
annot=True, # 셀에 값 표시
cmap="coolwarm", # 색상 팔레트
center=0, # 0을 기준으로 색상 대칭
fmt=".2f", # 소수점 2자리
square=True, # 정사각형 셀
linewidths=0.5) # 셀 경계선
plt.title("Correlation Heatmap")
plt.show()
# 마스크로 상삼각형만 표시 (중복 제거)
mask = np.triu(np.ones_like(correlation_matrix, dtype=bool))
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, mask=mask, annot=True,
cmap="coolwarm", center=0, fmt=".2f")
plt.title("Correlation Heatmap (Lower Triangle)")
plt.show()
김개발 씨의 고민은 많은 데이터 분석가들이 겪는 문제입니다. 변수가 많아질수록 그들 간의 관계를 파악하기가 어려워집니다.
10개의 변수가 있다면 가능한 조합은 45개나 됩니다. 이걸 일일이 산점도로 그린다면 보고서가 그래프로 가득 찰 것입니다.
히트맵은 이 문제를 우아하게 해결합니다. 마치 날씨 앱의 기온 지도처럼, 색상만으로 정보를 전달합니다.
빨간색이 진할수록 강한 양의 상관관계, 파란색이 진할수록 강한 음의 상관관계를 나타냅니다. 한 번의 시선으로 전체 관계 패턴을 파악할 수 있습니다.
코드를 단계별로 살펴보겠습니다. 먼저 **correlation_matrix = numeric_cols.corr()**로 상관관계 행렬을 계산합니다.
Pandas의 corr() 메서드는 모든 수치형 변수 쌍에 대해 피어슨 상관계수를 계산합니다. 결과는 변수 x 변수 크기의 정사각 행렬입니다.
heatmap 함수의 주요 파라미터를 살펴보겠습니다. annot=True는 각 셀에 실제 값을 표시합니다.
색상만으로는 정확한 값을 알기 어려우니, 숫자를 함께 표시하는 것이 좋습니다. **cmap="coolwarm"**은 색상 팔레트로, 파란색에서 빨간색으로 이어지는 직관적인 색상 체계입니다.
center=0은 중요한 옵션입니다. 상관계수는 -1에서 1 사이의 값을 가지는데, 0을 기준으로 색상이 대칭이 되어야 양의 상관관계와 음의 상관관계를 공정하게 비교할 수 있습니다.
**fmt=".2f"**는 소수점 둘째 자리까지 표시하라는 의미입니다. 두 번째 코드 블록은 실무에서 자주 쓰는 테크닉입니다.
상관관계 행렬은 대각선을 기준으로 대칭입니다. A와 B의 상관관계는 B와 A의 상관관계와 같기 때문입니다.
mask를 사용하면 상삼각형을 숨겨서 중복을 제거하고, 더 깔끔한 시각화를 만들 수 있습니다. np.triu는 상삼각 행렬을 만드는 NumPy 함수입니다.
이것을 마스크로 사용하면 해당 영역이 표시되지 않습니다. 실제 현업에서는 어떻게 활용할까요?
머신러닝 모델을 개발한다고 가정해봅시다. 히트맵으로 특성 간 상관관계를 보면 다중공선성 문제를 미리 발견할 수 있습니다.
두 특성의 상관관계가 0.9 이상이면 둘 중 하나는 제거하는 것이 좋습니다. 중복된 정보를 담고 있기 때문입니다.
주의할 점도 있습니다. 히트맵의 색상 선택이 중요합니다.
무지개색 팔레트는 피하는 것이 좋습니다. 색상의 밝기가 일정하지 않아서 값의 크기를 왜곡할 수 있습니다.
coolwarm, RdBu, viridis 같은 지각적으로 균일한 팔레트를 사용하세요. 다시 김개발 씨의 이야기로 돌아가 봅시다.
히트맵을 보고서에 포함시킨 김개발 씨는 팀장님의 칭찬을 받았습니다. "한눈에 들어오네요.
total_bill과 tip이 강한 양의 상관관계라는 게 바로 보여요." 복잡한 관계를 단순하게 보여주는 것, 그것이 좋은 시각화의 핵심입니다.
실전 팁
💡 - 변수가 많으면 clustermap을 사용해 비슷한 변수들을 묶어서 표시할 수 있습니다
- vmin과 vmax로 색상 범위를 직접 지정할 수 있습니다
- 상관관계 외에도 혼동 행렬, 피벗 테이블 등 다양한 행렬 데이터에 활용하세요
6. Pandas와 연동 활용
김개발 씨는 지금까지 배운 Seaborn 기능들을 실제 프로젝트에 적용하려고 했습니다. 그런데 막상 실무 데이터를 다루려니 막막했습니다.
데이터 전처리는 어떻게 하고, Seaborn과 어떻게 연결해야 할까요? 박시니어 씨가 말했습니다.
"Seaborn은 Pandas와 찰떡궁합이에요. 둘을 함께 쓰면 시너지가 폭발하죠."
Seaborn은 Pandas DataFrame과 완벽하게 통합됩니다. 마치 맞춤 정장처럼, DataFrame의 컬럼명을 그대로 파라미터로 사용할 수 있습니다.
데이터 전처리부터 시각화까지 하나의 자연스러운 흐름으로 연결됩니다.
다음 코드를 살펴봅시다.
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
# CSV 파일 읽기 (실무 시나리오)
# df = pd.read_csv("sales_data.csv")
# 예제: tips 데이터 사용
df = sns.load_dataset("tips")
# Pandas로 데이터 전처리
df["tip_rate"] = df["tip"] / df["total_bill"] * 100 # 팁 비율 계산
df["bill_category"] = pd.cut(df["total_bill"],
bins=[0, 15, 30, 100],
labels=["Low", "Medium", "High"])
# 전처리된 데이터로 바로 시각화
fig, axes = plt.subplots(2, 2, figsize=(14, 12))
# 새로 만든 파생 변수 시각화
sns.histplot(data=df, x="tip_rate", hue="time", ax=axes[0, 0])
axes[0, 0].set_title("Tip Rate Distribution by Time")
# 그룹별 집계 후 시각화
day_stats = df.groupby("day")["total_bill"].mean().reset_index()
sns.barplot(data=day_stats, x="day", y="total_bill", ax=axes[0, 1])
axes[0, 1].set_title("Average Bill by Day")
# 범주화된 변수로 시각화
sns.boxplot(data=df, x="bill_category", y="tip_rate", ax=axes[1, 0])
axes[1, 0].set_title("Tip Rate by Bill Category")
# FacetGrid: 조건별 분리 시각화
g = sns.FacetGrid(df, col="time", row="sex", height=4)
g.map(sns.scatterplot, "total_bill", "tip")
plt.show()
실무에서 데이터 시각화는 단독으로 이루어지지 않습니다. 데이터를 불러오고, 정제하고, 변환하고, 그 다음에 시각화합니다.
이 모든 과정이 자연스럽게 연결되어야 효율적인 분석이 가능합니다. Seaborn이 강력한 이유 중 하나는 Pandas와의 완벽한 통합입니다.
DataFrame을 만들고 컬럼명만 문자열로 전달하면 됩니다. 복잡한 데이터 변환 없이 바로 시각화할 수 있습니다.
코드를 살펴보겠습니다. 먼저 Pandas로 파생 변수를 만듭니다.
**df["tip_rate"]**는 팁 비율을 계산한 새로운 컬럼입니다. 이렇게 만든 컬럼을 Seaborn에서 바로 사용할 수 있습니다.
**histplot(data=df, x="tip_rate")**처럼 컬럼명을 문자열로 전달하면 됩니다. pd.cut 함수는 연속형 변수를 범주형으로 바꿉니다.
총 금액을 Low, Medium, High 세 구간으로 나누었습니다. 이렇게 범주화하면 boxplot이나 barplot 같은 범주형 시각화를 적용할 수 있습니다.
groupby로 집계한 결과도 바로 시각화할 수 있습니다. day_stats는 요일별 평균 금액을 담은 새로운 DataFrame입니다.
이것을 barplot의 data 파라미터로 전달하면 막대 그래프가 그려집니다. 가장 강력한 기능 중 하나는 FacetGrid입니다.
이것은 조건별로 그래프를 분리해서 보여주는 기능입니다. **col="time"**으로 점심/저녁을 가로로 분리하고, **row="sex"**로 성별을 세로로 분리합니다.
결과적으로 2x2, 총 4개의 그래프가 생성됩니다. 각 그룹의 패턴을 직접 비교할 수 있어서 매우 유용합니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 월별 매출 데이터를 분석한다고 가정해봅시다.
먼저 Pandas로 데이터를 불러옵니다. 날짜 컬럼을 파싱하고, 월과 요일 정보를 추출합니다.
이상치를 제거하고, 필요한 파생 변수를 만듭니다. 이 모든 전처리가 끝난 DataFrame을 Seaborn에 그대로 전달하면 됩니다.
별도의 데이터 변환 과정이 필요 없습니다. 주의할 점도 있습니다.
Seaborn은 **결측값(NaN)**이 있으면 해당 행을 자동으로 제외합니다. 이것은 편리하지만, 때로는 의도치 않은 결과를 낳을 수 있습니다.
결측값이 많은 변수를 사용할 때는 미리 확인하고, 필요하다면 명시적으로 처리하는 것이 좋습니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
Pandas와 Seaborn을 함께 사용하는 방법을 익힌 김개발 씨는 데이터 분석 속도가 크게 빨라졌습니다. 전처리하고 시각화하는 과정이 하나의 자연스러운 흐름이 되었기 때문입니다.
이제 김개발 씨는 더 이상 시각화를 두려워하지 않습니다. Seaborn이라는 든든한 도구가 있으니까요.
여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요. 데이터가 말하는 이야기가 눈앞에 펼쳐질 것입니다.
실전 팁
💡 - DataFrame의 dtypes를 먼저 확인하고, 필요하면 형변환을 하세요
- FacetGrid의 col_wrap 파라미터로 한 줄에 표시할 그래프 수를 지정할 수 있습니다
- melt 함수로 wide format을 long format으로 바꾸면 hue 파라미터 활용이 쉬워집니다
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.
보안 아키텍처 구성 완벽 가이드
프로젝트의 보안을 처음부터 설계하는 방법을 배웁니다. AWS 환경에서 VPC부터 WAF, 암호화, 접근 제어까지 실무에서 바로 적용할 수 있는 보안 아키텍처를 단계별로 구성해봅니다.
AWS Organizations 완벽 가이드
여러 AWS 계정을 체계적으로 관리하고 통합 결제와 보안 정책을 적용하는 방법을 실무 스토리로 쉽게 배워봅니다. 초보 개발자도 바로 이해할 수 있는 친절한 설명과 실전 예제를 제공합니다.
AWS KMS 암호화 완벽 가이드
AWS KMS(Key Management Service)를 활용한 클라우드 데이터 암호화 방법을 초급 개발자를 위해 쉽게 설명합니다. CMK 생성부터 S3, EBS 암호화, 봉투 암호화까지 실무에 필요한 모든 내용을 담았습니다.
AWS Secrets Manager 완벽 가이드
AWS에서 데이터베이스 비밀번호, API 키 등 민감한 정보를 안전하게 관리하는 Secrets Manager의 핵심 개념과 실무 활용법을 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.