Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Seaborn sns.clustermap에 사전 계산된 거리 행렬을 전달하는 방법

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")처럼 metricmethod 매개변수를 지정하면, seaborn 내부적으로 지정한 거리 측도와 연결 방식으로 클러스터링을 자동 수행합니다. 기존에 계산해 둔 링크(linkage) 결과가 있다면 row_linkage, col_linkage 인자에 직접 전달하는 방법도 가능합니다.