sns.clustermap()을 사용하면 데이터셋을 계층적 클러스터링 히트맵으로 시각화할 수 있습니다. 이 글에서는 iris(붓꽃) 데이터셋을 예로 들어 클러스터맵을 그리는 기본 절차를 단계별로 살펴보고, 나아가 미리 계산된 거리 행렬을 활용하는 방법까지 함께 소개합니다.
구현 절차
- sns.set_theme() 메서드를 사용해 여러 테마 매개변수를 한 번에 설정합니다.
- 온라인 저장소에서 예제 데이터셋을 불러옵니다(인터넷 연결 필요).
- DataFrame의 pop() 메서드로 특정 열을 추출하여 원본 프레임에서 제거합니다. 해당 열이 없으면 KeyError가 발생합니다.
- clustermap() 메서드를 사용하여 행렬 형태의 데이터를 계층적 클러스터링 히트맵으로 그립니다.
- 그래프를 화면에 표시하려면 plt.show() 메서드를 호출합니다.
예제 코드
from matplotlib import pyplot as plt
import seaborn as sns
# figure 크기 및 자동 레이아웃 설정
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
sns.set_theme(color_codes=True)
# iris 데이터셋 불러오기
iris = sns.load_dataset("iris")
species = iris.pop("species") # species 열 분리
# 계층적 클러스터링 히트맵 생성
g = sns.clustermap(iris)
plt.show()출력 결과
위 코드를 실행하면 iris 데이터셋의 수치형 변수들이 유사도를 기준으로 행과 열 방향으로 군집화된 히트맵이 출력됩니다. 덴드로그램이 상단과 왼쪽에 함께 표시되어 클러스터 구조를 한눈에 확인할 수 있습니다.
미리 계산된 거리 행렬 사용하기
직접 거리 행렬을 계산한 후 클러스터맵에 전달하고 싶다면, scipy의 거리 계산 함수와 연계할 수 있습니다. 정사각형 대칭 행렬(DataFrame)을 clustermap에 전달하면 seaborn은 이를 관측치 간 거리로 간주하여 클러스터링을 수행합니다.
from scipy.spatial.distance import pdist, squareform
import pandas as pd
# 유클리드 거리 행렬 사전 계산
dist_matrix = pd.DataFrame(
squareform(pdist(iris)),
index=iris.index,
columns=iris.index
)
# 사전 계산된 거리 행렬을 clustermap에 전달
g = sns.clustermap(dist_matrix)또는 sns.clustermap(data, metric="euclidean", method="ward")처럼 metric과 method 매개변수를 지정하면, seaborn 내부적으로 지정한 거리 측도와 연결 방식으로 클러스터링을 자동 수행합니다. 기존에 계산해 둔 링크(linkage) 결과가 있다면 row_linkage, col_linkage 인자에 직접 전달하는 방법도 가능합니다.