階層的クラスタリング完全ガイド:デンドログラムの読み方・主要アルゴリズムと実装のコツ
階層的クラスタリングとは — 概要
階層的クラスタリング(hierarchical clustering)は、データを階層構造(ツリー状)でグルーピングする手法の総称です。各データ点を細かいクラスタから順に統合していく「凝集型(agglomerative)」、逆に全データを1つの塊から順に分割していく「分割型(divisive)」の2方向があります。生成される木構造(デンドログラム)を切ることで任意の粒度のクラスタ数を得られる点が特徴です。
代表的なアルゴリズムと考え方
- 凝集型(Agglomerative):最初は各点が1つのクラスタ。距離(または類似度)が近いクラスタ同士を順に結合していき、最終的に1つのクラスタになる。実装が多く、可視化しやすい。
- 分割型(Divisive):最初は全点を1クラスタとし、最もばらつきの大きなクラスタを分割していく。計算負荷が高く実用例は少ないが、全体最適な分割を目指せる。
類似度/距離とリンク関数(連結法)
クラスタ間の距離の定義(リンク関数)によって結果は大きく変わります。代表的なものを挙げます。
- 単一リンク(single linkage):2つのクラスタ間で最も近い点同士の距離。チェイニング(連鎖)効果により細長いクラスタができやすい。
- 完全リンク(complete linkage):最も離れた点同士の距離。比較的コンパクトで均一なクラスタを作る傾向。
- 群平均(average linkage, UPGMA):クラスタ間の全点間距離の平均。単一・完全の中間的な挙動。
- ウォード法(Ward’s method):クラスタ内分散の増加を最小にする結合法。コンパクトで球状のクラスタを好み、通常はユークリッド距離(二乗距離)と組み合わせて使うのが標準。
距離(類似度)指標
データの性質に応じて距離を選びます。代表例:
- ユークリッド距離(連続値)
- マンハッタン距離(L1)
- コサイン類似度(文書・高次元ベクトル)
- ガワー距離(Gower:混合データ型の扱い)
注意:ウォード法は本質的に分散最小化に基づくため、ユークリッド距離との併用が前提となるケースが多いです。コサイン等を直接使うと理論的整合性が損なわれる場合があります。
デンドログラムの読み方とクラスタ数の決め方
デンドログラムは各マージ(結合)の高さがクラスタ間距離(または不一致度)を示します。切る位置(高さ)を変えることで任意のクラスタ数を取得できます。クラスタ数の決定方法:
- 高さの大きなギャップ(エルボー)的に切る
- 事前に決めたクラスタ数 k に合わせて下位から k クラスタにする
- シルエットスコア、ギャップ統計量等の外部指標で最良の k を選ぶ
- 不一致係数(inconsistency)やコフェネティック相関(cophenetic correlation)でツリーの妥当性を評価
評価指標と検証
- シルエットスコア:個々の点のクラスタ内距離と最近接他クラスタとの距離から算出。-1〜1で高いほど良好。
- コフェネティック相関係数(cophenetic correlation):元の距離行列とデンドログラム由来のコフェネティック距離の相関。1に近いほどデンドログラムが元データの距離構造を反映。
- 内部指標・外部指標:内部は距離や分散に基づく指標、外部はラベルがある場合の正解ラベルとの一致など。
アルゴリズムの計算量と実装上の注意
一般に凝集型クラスタリングは距離行列(n×n)の計算が必要になるためメモリがO(n^2)となり、大規模データには向きません。単純実装の計算時間はO(n^3)ですが、実務的なライブラリ(SciPyなど)は改善されており、一般にはO(n^2)時間・O(n^2)メモリが目安です。単一リンク用のSLINKアルゴリズムはO(n^2)時間・O(n)メモリで動作します。
実装時の注意点:
- データの標準化(スケーリング)は必須に近い。尺度が異なる特徴があると距離が片寄る。
- 外れ値の影響が大きい。必要に応じて外れ値処理やロバストな距離を使う。
- カテゴリ変数が混在する場合はGower距離やワンホット変換の検討が必要。
利点と欠点
- 利点:ツリー構造でクラスタの階層関係を直感的に把握できる。クラスタ数を事前に決める必要がない。小~中規模データで非常に有用。
- 欠点:大規模データでは計算資源を大量に消費する。初期の誤った結合は取り消せない(貪欲法)。リンク関数の選択に敏感で、結果の安定性が課題。
実務での使いどころ(ユースケース)
- 顧客セグメンテーション(顧客の階層的な類似性を可視化)
- バイオインフォマティクス(遺伝子発現データの階層分類)
- 文書クラスタリング(類似文書の階層的可視化)
- 探索的データ解析(初期のパターン発見、サンプル群の確認)
大規模データに対する対策
- 代表点(サンプリング)で階層を推定し、残りは割り当てる手法
- BIRCHやCUREなど、近似的に階層構造を作るアルゴリズム
- まずk-meansやミニバッチKMeansで大まかなクラスタを作り、その代表点に対して階層化を行うハイブリッド手法
- 距離計算がボトルネックのため近似近傍探索や次元削減(PCA, UMAP)を事前に行う
主要ライブラリと実装メモ
- SciPy:scipy.cluster.hierarchy(linkage, dendrogram, cophenetなど)。linkageは( n-1 )×4 のリンク行列を返す。
- scikit-learn:sklearn.cluster.AgglomerativeClustering。ツリー自体は全ての情報を返さないが、children_やconnectivityなどで制約付きクラスタリングが可能。Ward法や各種連結法に対応。
- 注意:scikit-learnのAgglomerativeClusteringはデフォルトでは距離行列を返さないため、デンドログラムを描くにはSciPyのlinkageを使うか、距離情報を保持する工夫が必要。
実践的なアドバイス
- まずデータを可視化して特徴量の分布やスケールを確認する(標準化等を実施)。
- 複数のリンク法で結果を比較し、目的に合った法を選ぶ(チェイニングを避けたいなら単一リンクは避ける等)。
- クラスタ数の決定にはシルエットやギャップ統計を併用する。デンドログラムの高さのギャップも目安になる。
- 混合型データでは距離の定義(Gower等)に特に注意する。
- 大規模データでは近似法やハイブリッド法の採用を検討する。
まとめ
階層的クラスタリングは、データの階層的構造を可視化・解析する強力なツールです。小~中規模データの探索分析や、クラスタ間の関係性を直観的に示したい場面で特に有効です。一方で、計算量や距離・リンクの選択による影響が大きいため、前処理(スケーリング、外れ値処理)、距離・連結法の慎重な選定、評価指標の併用が重要です。大規模データでは近似手法やハイブリッド手法を検討してください。


