K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

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

中級

06.7.29

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

最終更新 2026-03-06 読了時間 2 分
まとめ
デンドログラムは、凝集型の階層的クラスタリングが「最も近い 2 つを結合する」操作を繰り返した履歴を、下から上に伸びるツリーとして描いた図です。横に並ぶ葉がサンプル、縦軸が結合したときの距離(ここではウォード距離)で、低い位置で結ばれた 2 つほど似ています。SciPy では linkage(data, method="ward") が結合履歴の行列 Z を返し、dendrogram(Z, labels=...) がそれをツリーに変換します。読み終えると、水平線を高さ 8 で引いたときに枝が 3 本に分かれる理由と、color_threshold がその高さを境に枝を色分けする仕組みを理解し、クラスター数を決める前の探索に同じ図を使えるようになります。

直感 #

りんご・みかん・トマト・鶏肉など 15 種類の食品に「甘さ・水分・たんぱく質」の 3 つの数値があるとします。階層的クラスタリングは、まず 15 個の中で最も近い 2 つ(たとえばりんごとみかん)を 1 つの束にし、次に残りの中で最も近い 2 つを束ね、最後に全部が 1 つになるまで続けます。デンドログラムはその結合の順番と、結合したときの「遠さ」を記録した図です。早い段階(ウォード距離が小さい位置)で結ばれた葉どうしは似ていて、果物の束と肉魚の束が結ばれるのは最後の方(距離 15 前後)になります。どの高さで横に切るかを決めると、その高さを横切る枝の本数がクラスター数になります。

Python で描く #

次のコードは、果物・野菜・肉魚の 3 グループそれぞれ 5 品を、平均の異なる 3 次元の正規乱数で作ります。linkage でウォード法の結合履歴を計算し、dendrogram で描いたツリーに高さ 8 の赤い破線を重ねて、3 クラスターに切れる様子を見せます。

 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()

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

実行結果の読み方 #

図の下側で低い高さに結ばれているペア(りんごとみかん、豚肉と牛肉など)が最も似ている組み合わせです。高さ 8 の赤い破線は縦の枝を 3 本横切っており、この高さで切ると果物・野菜・肉魚の 3 クラスターになります。注目するのは枝の高さの「跳び」で、3 クラスターから 2 クラスターへ結合する枝が 8 からいきなり 15 付近まで伸びていれば、そこが自然な区切りだと判断できます。クラスター数の候補が迷うときは、この跳びが最も大きい直前の本数を目安にします。

何が起きているか(ステップで見る) #

コードを読む前に、この手法が図の上で何をしているかを追ってみましょう。「再生」を押すか、スライダーを動かすと 1 手順ずつ進みます。

見るポイント:結合距離が急に大きくなる直前が、クラスター数の目安(デンドログラムの切る高さ)。

使いどころと落とし穴 #

デンドログラムは、クラスター数を事前に決められない探索の段階で、結合の履歴を見ながらカット位置を決めるのに向いています。サンプル数が 100 を超えると葉のラベルが潰れて読めなくなるので、truncate_mode="lastp" で下位の枝を省略するか、代表サンプルを選んでから描きます。結果は method に大きく依存し、ward / average / complete / single で枝の形が変わるため、cophenet で得られるコフェネティック相関係数を比べて元の距離を最もよく保つ手法を選んでください。特徴量のスケールが揃っていないと、値の大きい列だけで距離が決まってしまうので、linkage に渡す前に StandardScaler で標準化します。サンプルが数千を超えるなら t-SNE や UMAP で 2 次元に落とした散布図、クラスター数が決まっているなら k-means の方が速く扱えます。