Pythonの階層的クラスタリングについて

Python,イメージ

AI実装検定のご案内

階層的クラスタリング(Hierarchical Clustering)は、データ間の距離関係をもとに、クラスタを段階的に結合または分割し、階層構造として表現する教師なし学習手法です。

クラスタリング結果はツリー状の構造として表され、一般にデンドログラム(樹形図)と呼ばれる可視化手法によって確認されます。

この手法の最大の特徴は、データ全体の構造を「どのデータ同士が、どの程度の距離感でまとまっているのか」という観点から直感的に把握できる点にあります。

なお、階層構造そのものはクラスタ数を事前に指定せずに構築できますが、最終的に各データにクラスタラベルを割り当てる場合には、クラスタ数や距離の切断基準を決める必要がある点には注意が必要です。

目次

階層的クラスタリングの2つの方式

階層的クラスタリングには、大きく分けて次の2種類があります。

凝集型(Agglomerative Clustering)

  • 各データ点を1つのクラスタとして開始
  • 距離が最も近いクラスタ同士を順に結合
  • 最終的に1つのクラスタになるまで繰り返す

Pythonで一般的に利用される階層的クラスタリングは、この凝集型です。

SciPyやscikit-learnで提供されている実装も、基本的にこの方式を採用しています。

分割型(Divisive Clustering)

  • 全データを1クラスタとして開始
  • 距離の遠いデータを基準に分割していく

分割型は計算コストが高く、Pythonの主要ライブラリでは一般的な実装が少ないため、実務ではほとんどの場合、凝集型が選択されます

距離尺度(Distance Metric)の重要性

階層的クラスタリングは、距離の定義に結果が大きく左右される手法です。

代表的な距離尺度には以下があります。

  • ユークリッド距離:数値データで最も一般的
  • マンハッタン距離:外れ値の影響をやや抑えたい場合
  • コサイン距離:方向の類似度を重視(テキスト・埋め込みベクトルなど)
  • 相関距離:時系列や変動パターンの類似性を見る場合

ただし注意点として、すべての距離尺度がすべてのリンク法と組み合わせられるわけではありません

特に後述するWard法は、実質的にユークリッド距離を前提とした手法であり、コサイン距離などとは整合しません。

リンク法(Linkage Method)

リンク法は「クラスタ間の距離をどのように定義するか」を決めるルールであり、階層的クラスタリングの結果を大きく左右します。

  • single linkage
    クラスタ間の最短距離で評価
    → 鎖状(chaining)クラスタが生じやすく、ノイズに弱い
  • complete linkage
    クラスタ間の最長距離で評価
    → コンパクトなクラスタになりやすいが、外れ値の影響を受けやすい
  • average linkage
    クラスタ間の平均距離で評価
    → バランスの取れた結果になりやすい
  • ward法
    クラスタ内分散の増加量が最小になるように結合
    → 数値データにおいて非常に安定した結果を出しやすい

実務では、数値データ+標準化済み+Ward法という組み合わせが最もよく使われます。

ただしWard法はユークリッド距離前提であるため、テキストデータなどでコサイン距離を用いる場合は、averageやcompleteを選ぶのが一般的です。

SciPyによる階層的クラスタリング

SciPyは階層的クラスタリングの解析・可視化に非常に強く、デンドログラムの作成が容易です。

  • linkage:階層構造の計算
  • dendrogram:樹形図の描画
  • fcluster:クラスタ数または距離で切断し、ラベルを付与

クラスタ数を指定して切断する場合だけでなく、「距離が一定以上になったところで切る」といった分析的な使い方ができる点が、SciPyの大きな強みです。

scikit-learnによる実務向け実装

scikit-learnの AgglomerativeClustering は、最終的なクラスタ分割が明確に決まっているケースに適しています。

  • n_clusters を指定してクラスタリング
  • Ward法を使う場合、距離はユークリッド距離固定

scikit-learn自体にはデンドログラムを直接描画する関数はありませんが、children_ などの内部情報を利用すれば、SciPyのデンドログラム関数と組み合わせて可視化することは可能です。

計算量とスケーラビリティ

階層的クラスタリングは計算コストが高い手法です。

  • メモリ使用量:O(n²)(距離行列がボトルネック)
  • 時間計算量:O(n²)〜O(n³)(実装・リンク法に依存)

そのため、データ数が数万を超える場合は現実的でないことが多く、PCAやUMAPなどによる次元削減、あるいは他のクラスタリング手法の検討が必要になります。

実務での重要な注意点

  • スケーリングは必須
    スケールの違いは距離計算に直結するため、標準化や正規化を行わないと結果が歪みます。
  • 外れ値の影響を受けやすい
    外れ値処理やロバストな前処理が重要です。
  • カテゴリ変数の扱いに注意
    そのまま距離計算に使うのは危険で、適切なエンコーディングや距離設計が必要です。
  • デンドログラムは「高さ」を見る
    結合距離が急激に伸びるポイントは、自然なクラスタ境界を示唆します。

他のクラスタリング手法との位置づけ

階層的クラスタリングは、高速性よりも「構造理解・解釈性」を重視する場面に向いています。

  • 大規模・高速処理 → K-means
  • ノイズ耐性 → DBSCAN / HDBSCAN
  • 構造把握・可視化 → 階層的クラスタリング

まとめ

階層的クラスタリングは、教師なし学習の中でもデータ構造を深く理解するための非常に強力な手法です。

Pythonでは、解析・可視化に強いSciPyと、実務実装向けのscikit-learnを用途に応じて使い分けることで、高い効果を発揮します。

距離尺度・リンク法・前処理を正しく選ぶことが、結果の品質を大きく左右する点を理解した上で活用することが重要です。

以上、Pythonの階層的クラスタリングについてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次