階層的クラスタリング(Hierarchical Clustering)の理論と実践ガイド:手法・指標・実装・注意点
概要:階層的クラスタリングとは
階層的クラスタリング(hierarchical clustering)は、データ間の類似度(あるいは距離)に基づいて、データを階層的な木構造(デンドログラム)として表現する非階層型のクラスタリング手法群です。クラスタ数を事前に決める必要がない点や、クラスタの包含関係を可視化できる点が特徴で、探索的データ解析に適しています。大別すると下から結合していく凝集型(agglomerative)と、上から分割していく分割型(divisive)が存在します。
基本アルゴリズム(凝集型の流れ)
初期化:各データ点を1つのクラスタと見なす。
距離行列の計算:クラスタ間の距離(類似度)をペアごとに計算する。距離尺度としてはユークリッド距離、マンハッタン距離、コサイン距離などが使われます。
繰り返し:最も近い(類似度が高い)2つのクラスタを結合し、新しいクラスタを作る。クラスタ間距離はリンク関数により更新される。
終了:全データが1つのクラスタになるまで続け、デンドログラム(結合高さの情報を含む木)を生成する。
代表的なリンク関数(結合法)
シングルリンク(single linkage):2つのクラスタ間の最小距離を採用。チェイニング(長い鎖状のクラスタ化)を生じやすいが、ノイズに比較的強い。
コンプリートリンク(complete linkage):最大距離を採用。コンパクトなクラスタを作るが、アウトライヤに敏感。
平均連結(average linkage, UPGMA):2クラスタの全ペア距離の平均を採用。バランスの取れた挙動。
ウォード法(Ward):クラスタ内分散の増加を最小化する結合法。ユークリッド距離の二乗を用いることが前提で、球形で類似した大きさのクラスタを好む。
重心法・メディアン法(centroid/median):クラスタの代表点(重心)を使う。マージ後に逆転現象(非単調性)が起きることがある。
距離尺度の選択
距離尺度は結果に大きな影響を与えます。特徴量が連続値であればユークリッド距離がよく使われますが、スケール(単位)が異なる特徴量が混在する場合は標準化(zスコア)や正規化が必須です。テキストや高次元ベクトルではコサイン類似度が有効なことが多く、カテゴリ変数がある場合はジャッカード係数や混合距離を検討します。
デンドログラムとクラスタの切り方
デンドログラムは各結合の高さ(距離)を示します。適切なクラスタ数を決める方法は複数あります:
しきい値で切る:デンドログラムの高さに閾値を設定して切断する。
最大ギャップ法(elbow法に類似):結合距離の増加が急になる点を基準にする。
内部評価指標を用いる:シルエット係数、キャリンスキー・ハラバス(Calinski-Harabasz)、ダビス・ボールディン(Davies-Bouldin)などで最適クラスタ数を探索する。
コフェネティック相関係数(cophenetic correlation):元の距離とデンドログラムのコフェネティック距離の相関を測り、階層の忠実度を評価する。
計算量と実装上の工夫
凝集型階層クラスタリングの一般的な実装では、距離行列の計算にO(n^2)のメモリが必要です。単純な反復実装はO(n^3)の時間を要しますが、優先度付きキューや効率的な更新を用いることでO(n^2 log n)まで改善できます。特定のリンク(例:single linkage)にはSLINKのようなO(n^2)時間・O(n)メモリの最適アルゴリズムがあります。Ward法やaverageリンクを高速に実装したライブラリ(fastclusterなど)を利用すると実務での処理が現実的になります。
クラスタリングの評価指標
シルエット係数:各点のクラスタ内距離と最近接クラスタへの距離を比較して評価。
コフェネティック相関係数:デンドログラムの再現性を元の距離行列と比較。
外部指標(ラベルがある場合):正解ラベルと比較するためのARI(Adjusted Rand Index)やNMI(Normalized Mutual Information)。
クラスタの安定性評価:サンプリングやブートストラップでクラスタの再現性を確認。
実践的な前処理と注意点
特徴量スケーリング:距離ベースの手法では特に重要。標準化(平均0、分散1)を推奨。
欠損値の処理:距離計算に影響するため補完(平均・kNN補完等)や距離の定義を変更する。
アウトライヤ対策:階層的クラスタリングは外れ値に敏感。前処理で検出・除外またはロバスト距離を使用。
カテゴリ変数の取り扱い:ワンホット化やカテゴリ用の距離尺度を検討。
よくある誤解と落とし穴
クラスタ数を自動で最適化する魔法のアルゴリズムではない:デンドログラムは探索的に使い、ドメイン知識や評価指標と併用する必要がある。
リンクや距離の選択で結果が大きく変わる:同じデータでもsingle/complete/Wardで全く異なるクラスタが得られることがある。
高次元データでは距離の意味が希薄になる(次元の呪い):次元削減(PCA, t-SNE, UMAPなど)を組み合わせることを検討。
実装とツール(概要と注意)
Python:scipy.cluster.hierarchy(dendrogram, linkage, cophenet)、scikit-learnのAgglomerativeClustering(高速だが完全なデンドログラム情報を返さない場合がある)。高速ライブラリとしてfastclusterがある。
R:hclust, dendextend, pvclust(ブートストラップでクラスタ信頼度を評価)などが代表的。
ユースケース(実務での適用例)
生物情報学:遺伝子発現データの階層的クラスタリングにより、発現パターンの類似性から遺伝子群やサンプル群の関係を可視化する。
マーケティング:顧客の行動や購買履歴に基づく階層的セグメンテーション。
文書クラスタリング:コサイン距離+階層クラスタリングでトピックの包含関係を探索。
画像処理:ピクセルや領域の類似性に基づく階層的セグメンテーション。
実務でのチェックリスト(短く)
目的は探索か決定か?(探索的ならデンドログラム重視、決定なら評価指標で最適数を選ぶ)
特徴量のスケーリングと欠損値処理を行ったか?
距離尺度・リンク関数の候補を複数試し、評価・可視化で比較したか?
計算コストに応じてfastclusterやSLINKのような最適化実装を検討したか?
まとめ
階層的クラスタリングは理解しやすい可視化(デンドログラム)を提供し、クラスタ数を事前に決める必要がないため探索的解析に適しています。一方で、距離やリンクの選択、前処理、計算コスト、外れ値への感度など実務的な注意点が多数あります。実装では既存の最適化ライブラリを利用し、複数の評価指標とドメイン知識を組み合わせて信頼できる解析を行うことが重要です。
参考文献
- Hierarchical clustering — Wikipedia
- scipy.cluster.hierarchy — SciPy Documentation
- Clustering — scikit-learn
- fastcluster — R package
- SLINK — Wikipedia(単一連結の最適アルゴリズム)
- Ward's method — Wikipedia


