凝集型クラスタリングは、教師なし学習における代表的な階層型クラスタリング手法の一つです。
データの類似構造を段階的に把握できるため、分析結果の解釈や説明が求められる場面で特に重宝されます。
本記事では、概念 → アルゴリズム → 距離と結合法 → デンドログラム → 実装上の注意 → 実務での使いどころという流れで、誤解が生じやすいポイントを補正しながら詳しく解説します。
凝集型クラスタリングとは
基本的な考え方
凝集型クラスタリングは、
各データ点を1つのクラスタとして開始し、 類似度の高いクラスタ同士を段階的に結合していく
という bottom-up(下から上) の手法です。
最初は細かく分かれているクラスタが、徐々に統合されていき、最終的にはすべてのデータが1つのクラスタになります。
これに対して、
- 分割型クラスタリング(Divisive Clustering) は
1つのクラスタから分割していく top-down アプローチです。
アルゴリズムの基本的な流れ
凝集型クラスタリングの手順は次の通りです。
初期化
- 各データ点をそれぞれ1つのクラスタとして扱う
クラスタ間距離の計算
- すべてのクラスタの組み合わせについて距離を計算
最も近いクラスタを結合
- 距離が最小となる2つのクラスタを1つにまとめる
距離の再計算
- 新しいクラスタと、他クラスタとの距離を再定義
停止条件まで繰り返す
- クラスタが1つになるまで
- 指定したクラスタ数に達するまで
- ある距離しきい値以上の結合を行わない、など
※ 実装や目的によって、どの条件で停止するかは異なります。
距離の定義と結合法(Linkage)
凝集型クラスタリングの結果は、距離の定義とクラスタ間距離の計算方法(結合法)によって大きく変わります。
データ点間の距離の例
- ユークリッド距離(数値データで最も一般的)
- マンハッタン距離
- コサイン距離(テキスト・埋め込みベクトル)
- 相関距離 など
クラスタ間距離の結合法
単連結法(Single Linkage)
- クラスタ間の最短距離で定義
- 細長いクラスタ(chaining)ができやすい
- ノイズや外れ値の影響を受けやすい傾向
完全連結法(Complete Linkage)
- クラスタ間の最大距離で定義
- コンパクトなクラスタが形成されやすい
- 外れ値の影響を受けやすい場合がある
平均連結法(Average Linkage)
- すべての点の平均距離
- Single / Complete の中間的性質
- 安定性が高く実務向き
ウォード法(Ward’s Method)
- クラスタ内分散の増加が最小になる結合を選択
- 結果は K-means に近い性質を持つ
- 数値データ分析で非常に多用される
重要な注意点
- Ward法は ユークリッド距離を前提とする手法
- scikit-learn でも
linkage="ward"の場合、距離指標はeuclideanのみ使用可能 - コサイン距離や相関距離とは組み合わせられません
デンドログラム(Dendrogram)
デンドログラムとは
凝集型クラスタリングの結合過程を樹形図として可視化したものがデンドログラムです。
デンドログラムで分かること
- クラスタがどの順序で結合されたか
- どの距離で結合されたか
- クラスタ数をどこで切るのが自然か
クラスタ数の決定
- 距離が大きく跳ね上がる位置でカット
- ビジネス的・解釈的に意味のある分割点を選択
※ scikit-learn 単体では linkage matrix(Z)が直接得られないため、SciPy の scipy.cluster.hierarchy を用いてデンドログラムを描画するのが一般的です。
K-means との違い
| 観点 | 凝集型クラスタリング | K-means |
|---|---|---|
| クラスタ数 | 探索段階では不要 | 事前指定が必要 |
| 初期値依存 | なし | あり |
| 可視化 | デンドログラム可 | 不可 |
| 計算コスト | 高い | 低い |
| 大規模データ | 不向き | 向いている |
※ 階層構造を一度作っておけば、後から任意のクラスタ数で切れる点が大きな違いです。
計算量とスケーラビリティ
- 時間計算量:
多くの主要な結合法で O(n²)
手法や実装によっては O(n³) になる場合もある - メモリ使用量:
距離行列を保持するため O(n²)
このため、凝集型クラスタリングは小〜中規模データ向きであり、大規模データでは別手法を検討する必要があります。
Python(scikit-learn)での基本例
from sklearn.cluster import AgglomerativeClustering
model = AgglomerativeClustering(
n_clusters=3,
linkage="ward"
)
labels = model.fit_predict(X)
実装上の注意
- Ward法を使う場合は 特徴量のスケーリング(標準化)を推奨
metric/affinityの指定方法は sklearn のバージョン依存- デンドログラム描画は SciPy 側で実施する
実務・マーケティングでの活用例
- 顧客セグメンテーション
- ユーザー行動ログの類型化
- 記事・コンテンツの類似性分析
- 検索クエリのグルーピング
- アンケート自由記述の整理
特に、「なぜこの分類になったのか」を説明する必要がある分析では、デンドログラムが強い説得力を持ちます。
まとめ
- 凝集型クラスタリングは 階層構造を可視化できる教師なし学習手法
- 距離の定義と結合法が結果を大きく左右する
- Ward法は強力だが ユークリッド距離前提
- 小〜中規模データ、説明責任がある分析に最適
以上、凝集型クラスタリングについてでした。
最後までお読みいただき、ありがとうございました。
