히트맵 (heatmap)
민서가 penguins 데이터셋을 가져와 여러 변수들이 서로 얼마나 관련 있는지 알고 싶었습니다. 부리 길이와 날개 길이는 관련 있을까? 체중과 부리 깊이는?
"상관계수 행렬을 히트맵으로 그려봐. 숫자 행렬을 색으로 바꿔주거든."
이 차트가 보여주는 것
히트맵은 숫자로 이루어진 행렬(2차원 데이터)을 색의 진하기로 표현합니다. 색이 진할수록 값이 크고, 연할수록 값이 작습니다. 상관계수 행렬에 적용하면 어떤 변수 쌍이 강하게 연결되어 있는지 한눈에 볼 수 있습니다.
상관행렬 히트맵
import seaborn as snsimport matplotlib.pyplot as pltpenguins = sns.load_dataset("penguins").dropna()# 수치형 컬럼만 선택하여 상관계수 계산corr = penguins.select_dtypes(include="number").corr()sns.heatmap(corr, annot=True, fmt=".2f", cmap="coolwarm")plt.title("펭귄 데이터 상관계수 히트맵")plt.show()
annot=True: 각 셀에 숫자 값을 표시합니다.fmt=".2f": 소수점 둘째 자리까지 표시합니다.cmap="coolwarm": 파란색(음의 상관)→흰색(0)→빨간색(양의 상관) 팔레트입니다.
annot, linewidths 옵션
import seaborn as snsimport matplotlib.pyplot as pltpenguins = sns.load_dataset("penguins").dropna()corr = penguins.select_dtypes(include="number").corr()fig, axes = plt.subplots(1, 2, figsize=(14, 5))# 기본sns.heatmap(corr, annot=True, fmt=".2f", cmap="coolwarm", ax=axes[0])axes[0].set_title("기본 히트맵")# 셀 구분선 추가sns.heatmap( corr, annot=True, fmt=".2f", cmap="coolwarm", linewidths=0.5, linecolor="white", ax=axes[1])axes[1].set_title("linewidths 추가")plt.tight_layout()plt.show()
linewidths=0.5는 각 셀 사이에 얇은 흰색 구분선을 그어 가독성을 높입니다.
마스크로 삼각형만 표시
상관계수 행렬은 대각선을 기준으로 대칭입니다. 아래쪽 삼각형만 보여주면 정보는 같으면서 더 깔끔합니다.
import seaborn as snsimport matplotlib.pyplot as pltimport numpy as nppenguins = sns.load_dataset("penguins").dropna()corr = penguins.select_dtypes(include="number").corr()# 위쪽 삼각형을 마스크로 가리기mask = np.triu(np.ones_like(corr, dtype=bool))sns.heatmap( corr, mask=mask, # 위쪽 삼각형 숨기기 annot=True, fmt=".2f", cmap="coolwarm", vmin=-1, vmax=1, # 색 범위 고정 linewidths=0.5, square=True # 각 셀을 정사각형으로)plt.title("하삼각 상관계수 히트맵")plt.show()
np.triu는 행렬의 위쪽 삼각형 영역을 True로 만들고, mask에 넣으면 해당 영역이 표시되지 않습니다.
컬러맵 선택 가이드
| 데이터 특성 | 추천 컬러맵 | 이유 |
|---|---|---|
| 음수~양수 (상관계수) | coolwarm, RdBu_r |
0을 중심으로 두 색 |
| 0 이상 (빈도, 밀도) | Blues, YlOrRd |
단방향 색 변화 |
| 범주 비교 | Set2, tab10 |
색이 명확히 구분 |
vmin과 vmax를 설정하면 색 범위를 고정해 데이터의 실제 범위가 아닌 의미 있는 기준으로 색을 맵핑합니다. 상관계수라면 vmin=-1, vmax=1이 항상 적절합니다.
자주 쓰는 파라미터 정리
| 파라미터 | 역할 | 예시 |
|---|---|---|
annot |
셀 안에 숫자 표시 | annot=True |
fmt |
숫자 형식 | fmt=".2f" |
cmap |
컬러맵 | cmap="coolwarm" |
vmin, vmax |
색 범위 고정 | vmin=-1, vmax=1 |
mask |
특정 영역 숨기기 | mask=np.triu(...) |
linewidths |
셀 구분선 너비 | linewidths=0.5 |
square |
셀을 정사각형으로 | square=True |