コンテンツにスキップ

第08回: クラスタリングの安定性評価

資料のダウンロード

ファイル 内容
exercise.py ハンズオン演習スクリプト

ヒントの使い方

python exercise.py --hint 1            # 方向性ヒント
python exercise.py --hint 1 --level 2  # より具体的なヒント
python exercise.py --hint 1 --level 3  # コード例
python exercise.py --check             # 提出前の自己チェック

演習問題への取り組み方

  1. 下の講義ノートを読む(事前学習・2時間目安)
  2. exercise.py を実行してグラフを確認する
  3. 演習問題(5問)に取り組む
  4. python exercise.py --check で確認する
  5. exercise.py を提出する(締切は授業後1週間)

詰まったとき

# ヒントを見る
python exercise.py --hint N --level 1

# AIに質問する
python ../../ask.py "質問内容"

解決しない場合は Q&A ページの投稿フォームを使ってください。


講義ノート

1. なぜ「安定性評価」が必要か

前回は k-means でクラスタリングを行い、エルボー法で k を選んだ。しかし「惰性が減少し始めた点」は視覚的な判断であり、人によって読み取り方が異なる。さらに根本的な問題として、「クラスタリング結果が偶然のものではなく、データに本当に存在する構造を反映しているか」を確かめる手段が必要である。

今回学ぶシルエット分析とブートストラップ安定性評価は、クラスタリングの品質を定量的に測るための主要な指標であり、「k=5 で本当によいのか」という問いに答える道具として機能する。


2. シルエット係数の定義と解釈

定義

データ点 \(i\) のシルエット係数 \(s(i)\) は次のように定義される。

\[s(i) = \frac{b(i) - a(i)}{\max(a(i),\, b(i))}\]
  • \(a(i)\):点 \(i\) と、同じクラスタ内の全点との平均距離(クラスタ内凝集度)
  • \(b(i)\):点 \(i\) と、最も近い別クラスタ内の全点との平均距離(クラスタ間分離度)

値の解釈

値の範囲 意味
\(s(i) \approx 1\) 点 \(i\) は適切なクラスタに属している(\(a(i) \ll b(i)\))
\(s(i) \approx 0\) 点 \(i\) は 2 つのクラスタの境界付近にいる
\(s(i) < 0\) 点 \(i\) は誤ったクラスタに割り当てられている可能性が高い(\(a(i) > b(i)\))

全点の \(s(i)\) の平均をシルエットスコアと呼ぶ。スコアが高い(\(\approx 0.5\) 以上)ほど、クラスタがコンパクトかつ互いに分離されていることを示す。

シルエットプロットの読み方

シルエットプロットでは、クラスタごとに \(s(i)\) を降順で横棒グラフとして並べる。良いクラスタリングでは次の特徴が見られる。

  1. 全クラスタの棒が赤い垂直線(平均値)を超えている:どのクラスタも平均以上の質を保持している。
  2. 棒の幅(長さ)がクラスタ間でほぼ揃っている:クラスタサイズが均等で、特定のクラスタへの偏りが少ない。
  3. 負の値(\(s < 0\))の棒がない:誤割当の点が存在しない。

逆に、あるクラスタだけ棒が極端に短かったり、負の値を多く含んでいたりする場合は、そのクラスタが不適切であることを示唆する。


3. ブートストラップによる安定性評価の手順

シルエット分析は1回のクラスタリング結果の品質を測る。一方、ブートストラップ安定性評価は「別のサブサンプルでクラスタリングしても同じ構造が現れるか」を繰り返し検証する手法である。

手順

  1. サブサンプリング:データから全体の 80% をランダムに抽出する(復元なしサンプリング)。これを2セット(サブサンプル A・B)用意する。
  2. 独立クラスタリング:A・B それぞれに k-means を実行し、クラスタラベルを得る。
  3. クラスタ対応の評価:A と B の共通インデックス上で、どのクラスタ同士が最もよく対応するかを調べ、Jaccard 係数で定量化する。
  4. 反復:上記を 100 回繰り返し、Jaccard 係数の分布を得る。

Jaccard 係数とは

2 つの集合 \(P\) と \(Q\) の Jaccard 係数は次式で定義される。

\[J(P, Q) = \frac{|P \cap Q|}{|P \cup Q|}\]

クラスタリングの安定性評価では、「A のクラスタ \(i\)」と「B のクラスタ \(j\)」で最もよくマッチする組み合わせを全クラスタについて探し、その平均 Jaccard 係数を1回の試行のスコアとする。\(J \approx 1\) ならば2つのサブサンプルで同じ構造が再現されており、安定していると言える。

安定の目安

一般的な実践的指針として、中央値 Jaccard \(\geq 0.75\) が安定の目安とされることが多い(Lange et al. 2004 による提案)。ただし絶対的なしきい値はなく、比較対象(他の k との相対評価)として使うことが重要である。


4. k 選択の総合判断基準

第07回のエルボー法、今回のシルエット分析・安定性評価を合わせると、以下の3軸で k を総合的に評価できる。

指標 見るポイント 限界
エルボー法(慣性) 慣性の減少が緩やかになる「肘」 肘が不明瞭な場合が多い
シルエットスコア スコアが高く、クラスタ間でばらつきが少ない k クラスタ形状が非球状だと低く出やすい
ブートストラップ安定性(Jaccard) 中央値が高く、分布が狭い k サンプル数が少ないとノイズが大きい

判断の進め方

  1. エルボー法でおおよその範囲(例:k=4〜7)を絞る。
  2. その範囲でシルエットスコアを比較し、スコアが高くかつシルエットプロットが均一な k を候補とする。
  3. 候補 k でブートストラップ安定性を評価し、Jaccard 中央値が高い k を選ぶ。
  4. 最終的に、解釈可能性(ドメイン知識との整合) も加味して k を決定する。数値指標だけでなく「クラスタに意味のある名前を付けられるか」が実務上の重要な判断基準となる。

5. 解釈と応用

シルエット係数が低い地点(\(s < 0\))は、「どのクラスタにも属しにくい境界的な地点」である。都市空間データでは、例えば「公園に隣接する商業施設」や「住宅地の中にある小型駅前」がこれに該当しやすい。これらの地点を外れ値として除外するか、別途分析するかは分析目的による。

一方、安定性が低い(Jaccard 中央値 < 0.75)の k は、わずかなデータの変化でクラスタ構成が大きく変わることを意味する。このような k のクラスタリング結果に基づいて政策立案を行うことは避けるべきである。


参考・発展

  • Rousseeuw (1987) "Silhouettes: A graphical aid to the interpretation and validation of cluster analysis" — シルエット分析の原論文。
  • Lange, Roth, Braun & Buhmann (2004) "Stability-Based Validation of Clustering Solutions" — ブートストラップ安定性評価の体系的枠組み。
  • sklearn.metrics.silhouette_score ドキュメント: https://scikit-learn.org/stable/modules/generated/sklearn.metrics.silhouette_score.html
  • 次回(第09回)は PLS 回帰を用い、「どの特徴量が幸福感を予測するか」へと分析を進める。