Skip to content
주제
Seaborn
Seaborn 히트맵: Python에서 히트맵 생성하는 완전 가이드

Seaborn 히트맵: Python에서 히트맵 생성하는 완전 가이드

Updated on

수십 개의 변수가 있는 데이터 세트가 있습니다. 어떤 기능이 상관관계가 있는지, 패턴이 어디에 숨어 있는지, 또는 머신러닝 모델이 왜 계속 오작동하는지 이해해야 합니다. 숫자의 행과 열을 응시해도 거의 아무것도 알 수 없습니다. 이것이 바로 seaborn 히트맵이 해결하는 문제입니다. 밀도 높은 값 행렬을 뇌가 몇 초 안에 파싱할 수 있는 색상 코드 그리드로 변환합니다.

히트맵은 데이터 과학에서 가장 널리 사용되는 시각화 유형 중 하나이며, Python의 seaborn 라이브러리는 이를 만드는 것을 매우 간단하게 만듭니다. 상관 행렬을 구축하든, 혼동 행렬을 분석하든, 시계열 패턴을 시각화하든, sns.heatmap()은 몇 줄의 코드만으로 게시 가능한 차트를 제공합니다.

이 가이드는 모든 것을 안내합니다: 기본 구문, 사용자 정의 옵션, 클러스터링된 히트맵과 같은 고급 기법, 전체 매개변수 참조 테이블. 모든 코드 예제는 복사하여 붙여넣기만 하면 됩니다.

📚

기본 Seaborn 히트맵 구문

핵심 함수는 sns.heatmap()입니다. 이는 2차원 데이터 세트(일반적으로 pandas DataFrame 또는 NumPy 배열)를 받아 색상 그리드로 렌더링합니다.

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
 
# Create sample data
data = np.random.rand(5, 7)
ax = sns.heatmap(data)
plt.title("Basic Seaborn Heatmap")
plt.show()

이것이 가장 간단한 히트맵입니다. 각 셀의 색상은 숫자 값을 나타내며 seaborn은 오른쪽에 자동으로 색상 막대를 추가합니다. 그러나 실제 사용에는 거의 항상 더 많은 구성이 포함되며, 다음에 다룰 예정입니다.

상관 행렬 히트맵 생성

seaborn 히트맵의 가장 일반적인 사용 사례는 상관 행렬 시각화입니다. 이는 데이터 세트의 각 변수 쌍이 얼마나 강하게 관련되어 있는지 알려줍니다.

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
 
# Load a built-in dataset
df = sns.load_dataset("mpg").select_dtypes(include="number")
 
# Compute the correlation matrix
corr = df.corr()
 
# Plot the heatmap
plt.figure(figsize=(10, 8))
sns.heatmap(
    corr,
    annot=True,
    fmt=".2f",
    cmap="coolwarm",
    center=0,
    square=True,
    linewidths=0.5
)
plt.title("Correlation Matrix - MPG Dataset")
plt.tight_layout()
plt.show()

여기서 일어나는 주요 사항:

  • annot=True는 각 셀 내부에 상관 계수를 인쇄합니다.
  • fmt=".2f"는 이러한 숫자를 소수점 두 자리로 형식화합니다.
  • cmap="coolwarm"은 발산 색상 팔레트를 사용하여 음의 상관관계는 파란색, 양의 상관관계는 빨간색입니다.
  • center=0은 0 상관관계가 중립 중간점 색상에 매핑되도록 합니다.
  • square=True는 각 셀을 완벽한 정사각형으로 만들어 더 깔끔한 시각적 효과를 제공합니다.

사용자 정의 옵션

색상 팔레트 (cmap 매개변수)

cmap 매개변수는 색상 구성표를 제어합니다. 올바른 팔레트 선택은 데이터 유형에 따라 다릅니다.

팔레트 유형예제 이름최적 용도
순차적"YlOrRd", "Blues", "viridis"낮음에서 높음까지의 데이터 (카운트, 크기)
발산"coolwarm", "RdBu_r", "seismic"의미 있는 중심점이 있는 데이터 (상관관계, 잔차)
질적"Set2", "Paired"범주형 데이터 (히트맵에는 일반적이지 않음)
지각적으로 균일"viridis", "magma", "inferno"접근성 및 정확한 인식 보장
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
 
data = np.random.rand(6, 6)
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
 
cmaps = ["viridis", "coolwarm", "YlOrRd"]
for ax, cmap in zip(axes, cmaps):
    sns.heatmap(data, cmap=cmap, ax=ax, annot=True, fmt=".2f")
    ax.set_title(f'cmap="{cmap}"')
 
plt.tight_layout()
plt.show()

주석 (annot 및 fmt 매개변수)

주석은 각 셀 내부에 숫자 값을 표시합니다. 형식을 제어할 수 있습니다:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
 
data = np.random.randint(0, 1000, size=(4, 5))
 
plt.figure(figsize=(8, 5))
sns.heatmap(
    data,
    annot=True,
    fmt="d",            # integer format
    cmap="Blues",
    annot_kws={"size": 14, "weight": "bold"}  # customize font
)
plt.title("Heatmap with Integer Annotations")
plt.show()

일반적인 fmt 값: ".2f"는 소수점 두 자리, "d"는 정수, ".1%"는 백분율, ".1e"는 과학 표기법.

그림 크기 및 종횡비

Seaborn 히트맵은 matplotlib 그림에서 크기를 상속합니다. sns.heatmap()을 호출하기 전에 설정하세요:

plt.figure(figsize=(12, 8))  # width=12, height=8 inches
sns.heatmap(data, cmap="viridis")
plt.show()

정사각형 셀의 경우 sns.heatmap()square=True를 전달합니다. 이는 그림의 종횡비를 재정의하여 각 셀을 동일한 크기로 만듭니다.

상위 또는 하위 삼각형 마스킹

상관 행렬은 대칭입니다. 양쪽 절반을 모두 표시하는 것은 중복입니다. NumPy의 triu 또는 tril을 사용하여 절반을 마스킹합니다:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
 
df = sns.load_dataset("mpg").select_dtypes(include="number")
corr = df.corr()
 
# Create a mask for the upper triangle
mask = np.triu(np.ones_like(corr, dtype=bool))
 
plt.figure(figsize=(10, 8))
sns.heatmap(
    corr,
    mask=mask,
    annot=True,
    fmt=".2f",
    cmap="coolwarm",
    center=0,
    square=True,
    linewidths=0.5
)
plt.title("Lower Triangle Correlation Heatmap")
plt.tight_layout()
plt.show()

mask 매개변수는 데이터와 동일한 모양의 부울 배열을 받습니다. mask=True인 셀은 숨겨집니다.

히트맵 매개변수 참조 테이블

매개변수설명기본값
data2차원 데이터 세트 (DataFrame, ndarray)필수
vmin / vmax컬러맵 스케일링을 위한 최소값/최대값데이터에서 자동
cmap컬러맵 이름 또는 객체None (seaborn 기본값)
center컬러맵을 중심으로 할 값None
annot셀에 숫자 값 표시False
fmt주석의 형식 문자열".2g"
annot_kws주석 텍스트를 위한 키워드 인수 딕셔너리{}
linewidths셀을 분리하는 선의 너비0
linecolor셀 테두리 선의 색상"white"
cbar색상 막대 표시True
cbar_kws색상 막대를 위한 키워드 인수 딕셔너리{}
square셀을 정사각형으로 강제False
mask부울 배열; True 셀은 표시되지 않음None
xticklabelsx축 눈금 레이블자동
yticklabelsy축 눈금 레이블자동
ax그릴 Matplotlib Axes 객체현재 Axes

고급 예제

sns.clustermap을 사용한 클러스터링 히트맵

유사한 행과 열을 함께 그룹화하려는 경우 sns.clustermap()은 계층적 클러스터링을 적용하고 자동으로 축을 재정렬합니다:

import seaborn as sns
import matplotlib.pyplot as plt
 
df = sns.load_dataset("mpg").select_dtypes(include="number").dropna()
corr = df.corr()
 
g = sns.clustermap(
    corr,
    annot=True,
    fmt=".2f",
    cmap="vlag",
    center=0,
    linewidths=0.5,
    figsize=(8, 8),
    dendrogram_ratio=0.15
)
g.ax_heatmap.set_title("Clustered Correlation Heatmap", pad=60)
plt.show()

왼쪽과 상단의 덴드로그램은 클러스터링 계층 구조를 보여줍니다. 가장 밀접하게 상관된 변수가 서로 인접하게 배치되어 패턴을 훨씬 쉽게 발견할 수 있습니다.

사용자 정의 색상 범위 (vmin, vmax)

기본적으로 seaborn은 데이터의 최소값과 최대값으로 색상을 조정합니다. 이를 재정의하여 동일한 척도로 여러 히트맵을 비교하거나 특정 범위를 강조 표시할 수 있습니다:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
 
np.random.seed(42)
data = np.random.uniform(-1, 1, size=(8, 8))
 
plt.figure(figsize=(8, 6))
sns.heatmap(
    data,
    vmin=-1,
    vmax=1,
    center=0,
    cmap="RdBu_r",
    annot=True,
    fmt=".2f"
)
plt.title("Heatmap with Fixed Color Range (-1 to 1)")
plt.show()

상관 행렬이나 이론적 범위를 알고 있는 정규화된 데이터를 플로팅할 때 vmin=-1vmax=1을 설정하는 것이 특히 유용합니다.

혼동 행렬 히트맵

또 다른 실용적인 응용 프로그램은 분류 모델의 혼동 행렬을 시각화하는 것입니다:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import confusion_matrix
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
 
# Train a quick model
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.3, random_state=42
)
clf = RandomForestClassifier(random_state=42)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
 
# Build and plot the confusion matrix
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(7, 5))
sns.heatmap(
    cm,
    annot=True,
    fmt="d",
    cmap="Blues",
    xticklabels=iris.target_names,
    yticklabels=iris.target_names
)
plt.xlabel("Predicted")
plt.ylabel("Actual")
plt.title("Confusion Matrix - Iris Classification")
plt.tight_layout()
plt.show()

대각선은 올바른 예측을 보여줍니다. 비대각선 셀은 모델이 한 클래스를 다른 클래스와 혼동하는 위치를 드러냅니다.

시계열 히트맵

히트맵은 시간 차원에서 패턴을 발견하는 데에도 효과적입니다. 다음은 요일과 시간별 활동을 보여주는 예입니다:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
 
np.random.seed(0)
hours = list(range(24))
days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
data = pd.DataFrame(
    np.random.poisson(lam=20, size=(7, 24)),
    index=days,
    columns=hours
)
 
plt.figure(figsize=(14, 5))
sns.heatmap(data, cmap="YlOrRd", linewidths=0.3, annot=False)
plt.xlabel("Hour of Day")
plt.ylabel("Day of Week")
plt.title("Activity Heatmap by Day and Hour")
plt.tight_layout()
plt.show()

Seaborn 히트맵 vs Matplotlib imshow

matplotlib.pyplot.imshow()로도 히트맵과 유사한 시각화를 만들 수 있습니다. 두 가지를 비교하면 다음과 같습니다:

기능sns.heatmap()plt.imshow()
내장 색상 막대예, 자동수동 (plt.colorbar())
셀 주석annot=True수동 텍스트 배치
DataFrame 허용예, 자동 레이블 포함아니요, 배열 필요
눈금 레이블 처리DataFrame 인덱스/열에서 자동수동 설정
마스킹 지원내장 mask 매개변수np.ma로 수동
클러스터링sns.clustermap() 통해내장되지 않음
셀 간격linewidths 매개변수직접 지원되지 않음
학습 곡선일반적인 사용 사례에서 낮음더 낮은 수준, 더 수동
사용자 정의 상한높음 (matplotlib 상속)매우 높음 (완전한 제어)

결론: 최소한의 코드로 깔끔하고 잘 레이블이 지정된 히트맵을 원할 때 sns.heatmap()을 사용하세요. 픽셀 수준 제어가 필요하거나 표 형식 데이터가 아닌 이미지 데이터로 작업하는 경우 imshow()로 되돌아가세요.

대화형 대안: PyGWalker

정적 히트맵은 보고서와 논문에 강력하지만, 탐색적 데이터 분석 중에는 코드를 다시 작성하지 않고 데이터와 상호 작용(필터링, 피벗, 드릴다운, 차트 유형 전환)하고 싶을 때가 많습니다.

PyGWalker (opens in a new tab) (Graphic Walker의 Python 바인딩)는 모든 pandas DataFrame을 Jupyter Notebook 내에서 직접 Tableau와 유사한 대화형 UI로 변환합니다. 시각화 코드를 전혀 작성하지 않고 필드를 드래그 앤 드롭하여 히트맵, 산점도, 막대 차트 등을 구축할 수 있습니다.

pip install pygwalker
import pandas as pd
import pygwalker as pyg
 
df = pd.read_csv("your_data.csv")
walker = pyg.walk(df)

대화형 인터페이스가 시작되면 다음을 수행할 수 있습니다:

  • 범주형 변수를 행으로, 다른 변수를 열로, 측정값을 색상으로 드래그하여 히트맵을 만듭니다.
  • 다른 차트 유형 (막대, 선, 산점도)으로 즉시 전환합니다.
  • 추가 코드를 작성하지 않고 필터링 및 집계합니다.

이는 최종 seaborn 히트맵에 포함할 변수를 아직 탐색하고 있을 때 특히 유용합니다. 탐색 단계에서는 PyGWalker를 사용하고 공유를 위해 sns.heatmap()으로 최종 정적 시각화를 고정합니다.

자주 묻는 질문

seaborn 히트맵의 크기를 변경하려면 어떻게 해야 하나요?

sns.heatmap()을 호출하기 전에 plt.figure(figsize=(width, height))를 사용하여 그림 크기를 설정합니다. 예를 들어, plt.figure(figsize=(12, 8))는 12×8인치 그림을 만듭니다. 서브플롯을 사용하는 경우 ax 매개변수를 전달할 수도 있습니다.

seaborn 히트맵에 값을 주석으로 추가하려면 어떻게 해야 하나요?

sns.heatmap()annot=True를 전달합니다. fmt 매개변수로 숫자 형식을 제어합니다 (예: fmt=".2f"는 소수점 두 자리). annot_kws를 사용하여 글꼴 속성을 사용자 정의합니다. 예: annot_kws={"size": 12, "weight": "bold"}.

sns.heatmap과 sns.clustermap의 차이점은 무엇인가요?

sns.heatmap()은 원래 행과 열 순서로 데이터를 표시합니다. sns.clustermap()은 계층적 클러스터링을 적용하여 행과 열을 재정렬하여 유사한 값을 함께 그룹화하고 클러스터링 구조를 보여주는 덴드로그램을 추가합니다.

상관 히트맵의 절반을 마스킹하려면 어떻게 해야 하나요?

NumPy를 사용하여 부울 마스크를 만듭니다. 상위 삼각형의 경우: mask = np.triu(np.ones_like(corr, dtype=bool)). 그런 다음 sns.heatmap()mask=mask를 전달합니다. 하위 삼각형의 경우 대신 np.tril()을 사용합니다.

seaborn 히트맵을 이미지 파일로 저장할 수 있나요?

예. 히트맵을 만든 후 plt.show() 전에 plt.savefig("heatmap.png", dpi=300, bbox_inches="tight")를 호출합니다. Seaborn 히트맵은 PNG, SVG, PDF, EPS를 포함한 모든 matplotlib 출력 형식을 지원합니다.

결론

seaborn 히트맵은 데이터 과학자의 시각화 툴킷에서 가장 다재다능한 도구 중 하나입니다. 상관 분석부터 혼동 행렬, 시계열 패턴 감지까지, sns.heatmap()은 깔끔한 구문과 게시 품질의 출력으로 이 모든 것을 처리합니다.

기본부터 시작하세요. 데이터를 전달하고 컬러맵을 선택합니다. 그런 다음 분석 요구에 따라 주석, 마스킹, 사용자 정의 범위 및 클러스터링을 계층화합니다. 최종 시각화를 고정하기 전의 탐색 단계에서는 PyGWalker (opens in a new tab)와 같은 도구를 사용하여 대화형 드래그 앤 드롭 차트로 워크플로를 가속화할 수 있습니다.

이 가이드의 코드 예제는 모두 복사하여 붙여넣기만 하면 됩니다. 사용 사례에 가장 가까운 것을 선택하고 데이터를 교체하면 1분 이내에 명확하고 유익한 히트맵을 얻을 수 있습니다.

📚