06.7.29
デンドログラムで階層的クラスタリングを可視化
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 クラスターに切れる様子を見せます。
| |

実行結果の読み方 #
図の下側で低い高さに結ばれているペア(りんごとみかん、豚肉と牛肉など)が最も似ている組み合わせです。高さ 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 の方が速く扱えます。
- 相関ヒートマップ — 変数間の類似度を色で表現
- ツリーマップ — 階層構造を面積で可視化
- コホートヒートマップ — 時間×コホートの行列表示