【pythonチートシート】階層的クラスタリングとデンドログラムの作成方法

スポンサーリンク
この記事は 約5 分で読めます。

今回は、Pythonで階層的クラスタリングを使ったデンドログラム図の作成方法について、ご紹介します。

なつめ
なつめ

本記事は「ある程度他のプログラミング言語の経験はあるけど、あまりPythonは使ったことがない人を対象としたチートシート」です。私自身の備忘録的な感じでまとめています。

スポンサーリンク

階層的クラスタリングのチートシート

  • scipyからモジュールをimport
    • from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
  • linkageを使ってクラスタリング
    • method:single, average, complete, weighted, wardなど
    • metric:braycurtis, canberra, chebyshev, cityblock, correlation, cosine, euclidean, hamming, jaccardなど
  • dendrogramで図を描画
    • labels:データラベル
    • orientation:向き
    • color_threshold:色分けの閾値

階層的クラスタリングのやり方

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster

# データ生成
data_labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
df = pd.DataFrame(np.random.rand(100*10).reshape(10,100), index = data_labels) # 乱数で10行100列のデータを模擬

# クラスタリング(ウォード法、ユークリッド距離)
Z = linkage(df, method = "ward", metric = "euclidean")

# デンドログラム図の描画
fig = plt.figure()

dendrogram(Z,
labels = data_labels, # データラベルの設定
orientation = 'right', # デンドログラム図を横向きにする
color_threshold = 4) # デンドログラム図の色分けの閾値
plt.show()

スポンサーリンク

linkageの結果の理解

linkageの計算結果(上記では変数z)はこんな感じのは行列になります。

print(z)

# array([[ 4. , 5. , 3.40106098, 2. ],
# [ 2. , 6. , 3.75083259, 2. ],
# [ 0. , 8. , 3.82715696, 2. ],
# [ 9. , 11. , 3.89128773, 3. ],
# [ 1. , 10. , 4.11740704, 3. ],
# [ 3. , 12. , 4.12783319, 3. ],
# [ 7. , 14. , 4.40790915, 4. ],
# [15. , 16. , 4.63592748, 7. ],
# [13. , 17. , 4.82317537, 10. ]])
  • 列項目
    • 1〜2列目:元々のデータフレームのindexを表示
    • 3列目:データ1とデータ2の距離(今回はユークリッド距離)
    • 4列目:グルーピングしたデータの個数
  • 行項目
    • 元データのindex数を超えるindex(今回は10以上の値)は、グルーピングされたデータの集合を示す
    • グルーピングされたデータの集合との距離を計算する場合、グループ内の重心を使う
スポンサーリンク

まとめ

今回は、Pythonで階層的クラスタリングを使ったデンドログラム図の作成方法ついてまとめました。

なつめ
なつめ

なんとなく、dendrogram図が書けると分析した感が出ますね。

Pocket

コメント