デンドログラムで階層的クラスタリングを可視化

中級

6.7.29

デンドログラムで階層的クラスタリングを可視化

最終更新 2026-03-06 読了時間 1 分
まとめ
  • 階層的クラスタリングの結果をツリー構造で描画し、クラスター間の距離と統合順序を読み解く。
  • scipy.cluster.hierarchylinkage + dendrogram で実装できる。
  • クラスター数を決める前の探索や、グループ間の類似関係を把握したいときに使う。

デンドログラムは凝集型クラスタリングの統合過程をツリー形式で描いたもの。Y 軸が統合時の距離を表し、水平に切断する高さでクラスター数が決まる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage, dendrogram

rng = np.random.default_rng(42)
labels = [
    "りんご", "みかん", "バナナ", "いちご", "ぶどう",
    "トマト", "にんじん", "ほうれん草", "キャベツ", "大根",
    "鶏肉", "豚肉", "牛肉", "鮭", "えび",
]

# 3グループ(果物・野菜・肉魚)の合成特徴量
data = np.vstack([
    rng.normal([5, 8, 2], [1, 1.5, 0.5], size=(5, 3)),   # 果物
    rng.normal([3, 2, 7], [0.8, 0.6, 1.0], size=(5, 3)),  # 野菜
    rng.normal([8, 3, 5], [1.2, 1.0, 0.8], size=(5, 3)),  # 肉・魚
])

Z = linkage(data, method="ward")

fig, ax = plt.subplots(figsize=(10, 5))
dn = dendrogram(
    Z, labels=labels, ax=ax,
    leaf_rotation=45, leaf_font_size=10,
    color_threshold=8, above_threshold_color="#999999",
)
ax.set_ylabel("ウォード距離")
ax.set_title("食品の階層的クラスタリング(デンドログラム)")
ax.axhline(y=8, color="#ef4444", linestyle="--", linewidth=1, label="カット閾値")
ax.legend(loc="upper right")
ax.grid(axis="y", alpha=0.2)

fig.tight_layout()
plt.show()

食品の階層的クラスタリングのデンドログラム

読み方のポイント #

  • Y 軸の高さが低い位置でつながっているアイテム同士は類似度が高い。
  • 水平線(カット閾値)を引くと、その高さで切断したときのクラスター数が読める。上の例では閾値 8 で 3 クラスターに分かれる。
  • 枝の色は color_threshold で自動着色され、異なる色が異なるクラスターを示す。

いつ使うか #

  • 適している場面: クラスター数を事前に決められないとき、統合の過程を可視化して適切なカット位置を決めたい場合。生物の系統樹や文書の類似関係にも使われる。
  • 不向きな場面: サンプル数が 100 を超えるとラベルが潰れて読めない。大規模データでは代表サンプルを選ぶか、ヒートマップ付きデンドログラムに切り替える。
  • 代替手段: サンプル数が多い場合は t-SNE / UMAP で 2D に圧縮して散布図。クラスター数が決まっているなら k-means で直接分割。

よくある失敗パターン #

  • リンケージ手法の未検討: ward / average / complete / single で結果が大きく変わる。コフェネティック相関係数で比較し、最適な手法を選ぶ。
  • スケール未統一: 特徴量のスケールが異なると距離計算が歪む。事前に StandardScaler で標準化してからクラスタリングする。