Seabornのclustermap
関数によるクラスタリング後の結果行列を取得する方法の備忘録
clustermap関数の仕様
公式ドキュメントによると、clustermapは戻り値としてClusterGridオブジェクトを返す。クラスタリング後に並び替えられた行・列インデックス情報はClusterGridオブジェクトのdendrogram_row.reordered_ind
、dendrogram_col.reordered_ind
のプロパティから取得できる。以下にアヤメ(iris)データセットを利用したコード例を記載する。
クラスタリング後の行・列インデックス取得例
import seaborn as sns
iris = sns.load_dataset("iris")
species = iris.pop("species")
iris = iris[:10] # テスト確認用にデータ削減
g = sns.clustermap(iris, figsize=(10, 4))
print("> Original data")
print("rows = ", list(iris.index))
print("columns = ", list(iris.columns))
print("> Clustering data")
print("rows = ", g.dendrogram_row.reordered_ind)
print("columns = ", g.dendrogram_col.reordered_ind)
コード実行の出力結果・図
> Original data
rows = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
> Clustering data
rows = [5, 7, 0, 4, 8, 1, 9, 6, 2, 3]
columns = [2, 3, 0, 1]
出力結果・図からクラスタリング後に並び替えられた行・列の各インデックス情報を正しく取得できていることが確認できる。
クラスタリング後の結果行列取得
クラスタリング後に並び替えられた行・列インデックス情報を元に、下記コードでクラスタリング後の結果行列を取得できることを確認できた。
import seaborn as sns
iris = sns.load_dataset("iris")
species = iris.pop("species")
iris = iris[:10]
g = sns.clustermap(iris[:10], figsize=(10, 4))
reordered_index = iris.index[g.dendrogram_row.reordered_ind]
reordered_columns = iris.columns[g.dendrogram_col.reordered_ind]
clustered_iris = iris.loc[reordered_index, reordered_columns]
print(clustered_iris)
出力結果
petal_length petal_width sepal_length sepal_width
5 1.7 0.4 5.4 3.9
7 1.5 0.2 5.0 3.4
0 1.4 0.2 5.1 3.5
4 1.4 0.2 5.0 3.6
8 1.4 0.2 4.4 2.9
1 1.4 0.2 4.9 3.0
9 1.5 0.1 4.9 3.1
6 1.4 0.3 4.6 3.4
2 1.3 0.2 4.7 3.2
3 1.5 0.2 4.6 3.1