階層クラスタ分析の理論と実践:手法・評価・実装ガイド

はじめに — 階層クラスタ分析とは

階層クラスタ分析(hierarchical clustering、階層的クラスタリング)は、データ点間の類似度(距離)に基づいて階層構造(ツリー状のクラスタ階層)を構築するクラスタリング手法です。結果はデンドログラム(樹形図)として可視化され、データ集合の階層的なまとまりや分布を直感的に把握できます。代表的な用途は探索的データ解析、マーケティングの顧客セグメンテーション、遺伝子発現データの解析、情報検索などです。

基本概念と分類

階層クラスタ分析は大きく分けて凝集型(agglomerative、ボトムアップ)と分割型(divisive、トップダウン)です。凝集型は各点を1つのクラスタとして開始し、類似したクラスタを繰り返し結合していきます。一方、分割型は全データを1クラスタとして開始し、分割を繰り返します。実務では凝集型が広く使われます。

距離(類似度)指標

  • ユークリッド距離: 連続変数に対して最も一般的。Ward法など分散を扱う手法と相性が良い。

  • マンハッタン距離(L1): 外れ値や異常値にやや頑健。

  • コサイン類似度: ベクトルの方向性(テキストやTF-IDF)を重視する場合に有効。ただし類似度なので距離に変換する必要あり(1 - コサイン類似度など)。

  • ガワー距離(Gower distance): 数値・カテゴリ混在データに対応。

  • カテゴリデータ: ジャッカード係数やハミング距離など。

距離選択は解析結果に大きく影響します。前処理でスケーリング(標準化や正規化)を適切に行うことが重要です。

リンク法(結合基準)の種類と特徴

クラスタ間距離の定義(リンク法)により結果が変わります。主要な手法は以下の通りです。

  • 単連結法(single linkage): 2クラスタ間の最短距離を採用。鎖状の結合(チェイニング)を引き起こしやすいが、非球状クラスタを検出しやすい。計算効率の良いSLINKアルゴリズムが存在する。

  • 完全連結法(complete linkage): 最長距離を採用。コンパクトで球状のクラスタを生成しやすいが、外れ値に敏感。

  • 平均連結法(average linkage、UPGMA): 全ての要素対の平均距離を用いる。バランスの良い結果を出しやすい。

  • 重心法(centroid linkage): クラスタの重心間距離を用いる。結合時にクラスタの重心が変化するため非単調な距離増加が起きることがある。

  • Ward法: クラスタ内分散の増加を最小化する結合を選ぶ手法で、球状クラスタを好む。ユークリッド距離との組合せが標準的。

デンドログラムの読み方と切り方

デンドログラムはクラスタ結合の履歴を高さ(距離)で示します。水平にカットすることで任意のクラスタ数に分割できますが、適切な切り方を決めるための指標がいくつかあります。

  • 距離のギャップ: デンドログラムの結合距離に大きな飛躍がある位置で切る。

  • コフェネティック相関係数(cophenetic correlation coefficient): 元の距離行列とデンドログラムから得られるコフェネティック距離の相関を計算し、ツリーの忠実度を測る(scipyに実装あり)。

  • シルエットスコア: 切った後のクラスタの分離度を評価する指標。階層クラスタでクラスタ数を決める際に利用可能。

  • ブートストラップによる安定性解析: 例えばRのpvclustパッケージのように再標本化でクラスタの信頼度を評価する手法。

前処理と実務上の注意点

  • スケーリング: 各特徴量のスケール差は距離評価に直接影響する。標準化(平均0, 分散1)や正規化が一般的。

  • 欠損値の扱い: 欠損をそのまま距離計算に含めることはできないため、補完(平均補完、k近傍補完、モデルベース補完など)を検討。

  • 次元削減: 高次元データでは距離の意味が薄れる(次元の呪い)。主成分分析(PCA)やt-SNE、UMAPなどで次元を落とした後に実行する手法もある。

  • カテゴリ変数: 単純にワンホット化すると次元と距離の影響を増やすことがある。ガワー距離や適切なエンコーディングを検討。

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

距離行列を事前計算する場合、メモリはO(n^2)を要します。アルゴリズムの計算時間は実装によりますが、単純な凝集的実装ではO(n^3)の最悪ケースをとることがあります。とはいえ、Lance–Williams更新式や近傍鎖アルゴリズムなどを用いることで、多くのケースでO(n^2)まで改善できます。大規模データ(数万点以上)には階層クラスタは一般的に不向きで、代替としてミニバッチK-meansや近似的な手法を検討します。

実装とツール(Python/R)

代表的なライブラリと関数:

  • Python: scipy.cluster.hierarchy.linkage / dendrogram / cophenet、scikit-learnのAgglomerativeClustering(sklearn.cluster.AgglomerativeClustering)。scipyはデンドログラム表示と距離行列操作が充実、scikit-learnは大きなデータやパイプライン統合に便利。

  • R: hclust関数、agnes(clusterパッケージ)、pvclust(クラスタの再標本評価)など。Rは統計解析・可視化のためのパッケージが豊富。

注意点: Ward法はユークリッド距離と組み合わせることが前提とされることが多く、他の距離を使うと分散増加の解釈が崩れる場合があります。また、scikit-learnのAgglomerativeClusteringは近年のバージョンで疎行列や接続制約(connectivity constraints)を扱う機能があり、大規模データでの速度向上に貢献します。

評価と検証

クラスタリングは教師なし学習であるため真のラベルがないことが通常です。評価手法は内部評価(シルエット、ダビース・ボルディン指数など)、外部評価(もし真のラベルがあればARI、NMIなど)、及び安定性評価(再標本化によるクラスタの一貫性)があります。階層クラスタではデンドログラムの解釈性も評価の一部です。

利点・欠点

  • 利点: 結果を階層構造で示せるため解釈が直感的。クラスタ数を事前に指定する必要がない(任意の高さで切って決められる)。非球状クラスタの検出が可能(特に単連結など)。

  • 欠点: 計算コストとメモリ消費が大きくスケールしにくい。ノイズや外れ値に敏感な手法がある。リンク法や距離選択で結果が大きく変わる。

実務的なワークフロー例

  • データ理解 → 欠損と外れ値処理 → スケーリングや適切な距離の選定 → 階層クラスタの実行(複数のリンク法で試行) → デンドログラムの可視化 → クラスタ切断と評価(シルエット等) → 安定性チェック(再標本化) → 解釈・業務適用。

よくある誤解と対処法

  • 「デンドログラムの枝の長さがクラスタの重要さを直接示す」: 距離が大きくてもデータ分布や尺度の影響があるため、必ずしも業務上の重要性と一致しない。補助指標で検証すること。

  • 「ワンショットで最適な手法が得られる」: 前処理・距離・リンク法の組合せで結果が変わるため、複数候補を比較するのが現実的。

まとめ

階層クラスタ分析は、データの階層的構造を可視化し、解釈性の高いクラスタリングを提供する強力な手法です。一方でスケーラビリティや前処理、距離やリンク法の選択が結果に大きく影響するため、用途に応じた慎重な設計と評価が必要です。小~中規模データや探索的解析、可視化を重視する場面で特に有用です。

参考文献