メインコンテンツへスキップ

シルエットスコア:クラスタリング品質の評価方法

シルエットスコアの実践ガイド。数式、解釈の目安、scikit-learnの例、最適なクラスタ数の選び方、他のクラスタリング指標との比較を網羅します。
更新 2026年7月31日  · 12 分 読む

AIで探索

ChatGPTで開くClaudeで開くPerplexityで開く

クラスタリングモデルを学習させたあと、そのクラスタは本当に良いと言えるのでしょうか?

普遍的な答えはありません。従来の教師あり学習では、予測と実際のラベルを比較して精度を算出できますが、クラスタリングではそれができません。たとえば k=5 を選んだとしても、別の k の方が良い可能性もあります。ラベルがなければ、アルゴリズムが構造を見つけたのか、単にデータを無作為に分割しただけなのかを判断できません。

そこで役立つのがシルエットスコアです。これは各点が割り当てられたクラスタにどれだけ適合しているかを、次に近いクラスタとの比較で示す指標で、最も広く使われているメトリクスの一つです。ラベルが不要で、解釈もしやすいのが特長です。

本記事では、数式とその読み解き方を説明し、scikit-learnを用いたPythonの例を紹介し、適しているケース・そうでないケースも取り上げます。

クラスタリングが初めての方は、まずこちらをご覧ください:scikit-learnで学ぶk-meansクラスタリング入門。アルゴリズムの仕組みとPythonでの使い方を解説しています。 

シルエットスコアとは?

シルエットスコアは-1から1の間の数値で、各点が自分のクラスタにどれだけ適合しているかを示します。

この数値は次の2点を表します:

  1. その点が所属クラスタ内の他の点にどれだけ近いか
  2. 所属していない最も近いクラスタからどれだけ離れているか

その点が自クラスタの内部にしっかり位置し、他のクラスタから遠ければスコアは高くなります。境界付近にあり、自クラスタより隣のクラスタに近ければスコアは低くなります。

要するに、シルエットスコアはこのバランスを示します。各クラスタ内で点がどれだけ密にまとまっているか、そしてクラスタ同士がどれだけ明確に分離しているかの両方を含みます。どちらも同じくらい重要です。点がうまくまとまっていてもクラスタ同士が重なっていれば役に立たず、逆にクラスタ同士がよく分離していても内部で点が散らばっていれば有用ではありません。

Well-separated clusters compared with overlapping clusters

よく分離したクラスタと重なり合うクラスタの比較

スコアが高いほど、クラスタが明確に定義されています。1に近いスコアは、点が自クラスタ内に密に位置し、他から遠いことを意味します。0に近いスコアは、クラスタが重なっているか境界が曖昧であることを意味します。負のスコアは、その点が割り当てられたクラスタより別のクラスタに近いことを示します。

シルエットスコアの仕組み

各点にはそれぞれシルエットスコアが割り当てられ、その値は2つの距離から求められます。

1つ目は、その点が所属クラスタ内の他の点から平均してどれだけ離れているかです。小さければ自クラスタの他の点に近く、大きければ自クラスタへの結びつきが弱いことを意味します。

2つ目は、その点が最も近い隣接クラスタ内の点から平均してどれだけ離れているかです。大きければ他クラスタから明確に分離されており、小さければ境界に近いことを示します。

Distance of a point to the clusters

点から各クラスタまでの距離

シルエット値はこの2つの数値を比較します。クラスタ内部にしっかり位置し、他クラスタから遠い点は高スコアになります。境界付近(別のクラスタに近い)にある点は低スコアに、自クラスタより他クラスタに近い点は負のスコアになります。

ここで覚えておきたいのは、どちらの距離も単独では十分でないということです。 

密なクラスタ同士がすぐ隣に位置することもありますし、よく分離したクラスタでも内部が散らばっていることがあります。割り当てを信頼するには両方の距離が必要です。

シルエットスコアの式

単一点に対する式は次のとおりです:

Silhouette score formula

シルエットスコアの式

ここで:

  • a は、その点から同一クラスタ内のすべての点までの平均距離

  • b は、その点から最も近い隣接クラスタ内のすべての点までの平均距離

式は、ba の差を、その2つのうち大きい方で割ります。 

一般的には、次のように解釈できます:

  • ba より大幅に大きい場合: その点は他クラスタから遠く、自クラスタに近い。分子は b に近く、分母も b なので、スコアは1に近い

  • ab より大幅に大きい場合: その点は自クラスタより他クラスタに近い。分子は -a に近い大きな負の数、分母は a で、スコアは-1に近い

  • ab がほぼ等しい場合: その点は2つのクラスタの境界にある。分子は0に近く、スコアも0に近い

詳細は次で説明します。

シルエットスコアの解釈方法

シルエットスコアの大まかな読み方は次のとおりです:

  • 1に近い: 点は自クラスタの内部にしっかり位置し、他クラスタから遠い
  • 0.7前後: 良好なクラスタリング。グループは明確で、点は自クラスタ内の他の点の近くにある
  • 0.5前後: まずまずのクラスタリング。クラスタ間に多少の重なりはあるが、区別は可能
  • 0に近い: クラスタが重なるか境界が不明瞭。構造自体が実在しない可能性がある
  • 0未満: 点が誤ったクラスタの方に近い。クラスタ数の選択が不適切、またはそもそもデータがクラスタ化に適していないときに起こりうる

上の区切りはあくまで目安です。良いシルエットスコアかどうかはデータセットによって変わります。

スパースで高次元のデータでは、クラスタが良くてもスコアが低くなりがちです。高密度でよく分離したデータでは0.7を超えることもあります。普遍的な閾値と比べるのではなく、同じデータセット上でモデル間のスコアを比較してください。

シルエットスコアの計算方法

シルエットスコアは1点ずつ計算します。単一点での手順は次のとおりです。

ステップ1: a(その点から自クラスタ内の他の全点までの平均距離)を計算する。たとえば、同じクラスタに4点あり、それぞれの距離が1.2、1.5、1.0、1.3の場合:

Silhouette score calculation (1)

シルエットスコアの計算(1)

ステップ2: 最も近い隣接クラスタ(自クラスタ以外で、その点からの平均距離が最小のクラスタ)を見つける。次に b(その点からそのクラスタ内の全点までの平均距離)を計算する。たとえば、最も近いクラスタ内の5点までの距離が2.4、2.8、3.0、2.6、2.7の場合:

Silhouette score calculation (2)

シルエットスコアの計算(2)

ステップ3: ab を式に代入する:

Silhouette score calculation (3)

シルエットスコアの計算(3)

ステップ4: これをデータセット内のすべての点に対して繰り返す。クラスタリング全体のシルエットスコアは、各点のスコアの平均です。

Pythonでのシルエットスコアの例

scikit-learnにはシルエットスコアを計算する2つの関数があり、どちらも sklearn.metrics 内にあります:

  • silhouette_score() はクラスタリング全体の平均スコアを返す

  • silhouette_samples() は各点のスコアを返す

以下は、合成データセットにKMeansを適用して使う方法です:

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score, silhouette_samples

# Synthetic data with 4 clusters
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)

# Clustering model
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
labels = kmeans.fit_predict(X)

# Overall silhouette score
score = silhouette_score(X, labels)
print(f"Overall silhouette score: {score:.3f}")

# Per-point silhouette values
sample_scores = silhouette_samples(X, labels)
print(f"First 5 point scores: {sample_scores[:5]}")

上のコードスニペットを実行すると、次のような出力が得られます:

Python example output

Pythonの例の出力

全体スコア0.791は、4つのクラスタがよく定義され、分離されていることを意味します。

各点のスコアを使えば、あらゆるデータ点を詳細に分析できます。 

個々のスコアが高い点は自クラスタ内にしっかり位置しています。低いまたは負のスコアの点は境界上か誤割り当てであり、外れ値の検出や境界付近の点の確認に役立ちます。

最適なクラスタ数の選択

シルエットスコアの最も一般的な用途の一つは、KMeansにおける適切な k の選定です。 

手順は次の3ステップです:

  1. 複数の k の値でKMeansを学習させる
  2. 各学習結果に対してシルエットスコアを計算する
  3. スコアが最も高い k を選ぶ

コードは次のとおりです:

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score

X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)

# Fit KMeans for k=2 to k=10 and keep track of the silhouette score for each
k_values = range(2, 11)
scores = []
for k in k_values:
    kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
    labels = kmeans.fit_predict(X)
    scores.append(silhouette_score(X, labels))
    print(f"k={k}: silhouette = {scores[-1]:.3f}")

k に対して次のようなスコアが得られます:

Silhouette score across different values of k

kの値ごとのシルエットスコア

最も高いスコアは k=4 にあります。これが選ぶべき値です。

ただし、シルエットスコアはドメイン知識の代わりにはなりません。ビジネス上は顧客セグメントが5つ必要なのに、スコアが4で最も高いからといって、機械的に4を選ぶべきではありません。メトリクスはデータが最もきれいな構造を持つ場所を示しますが、正しいクラスタ数は、問題設定で意味のあるものに対応している場合もあります。

シルエットスコアと他のクラスタリング指標の比較

シルエットスコアはおそらく最も一般的なクラスタリング評価指標ですが、それだけではありません。代替手法との比較は次のとおりです。

シルエットスコア vs. エルボー法

エルボー法はKMeansにおける k の選択に使う視覚的手法です。複数の k でモデルを学習させ、慣性(クラスタ内平方和)を k に対してプロットし、曲線が鋭く曲がる点を選びます。

エルボー法は素早く簡単に実行できる利点がありますが、「肘」が明確でない場合もあります。データが雑然としていると、曲線が滑らかになり、曲がりどころが判別できないことがあります。

シルエットスコアは各 k に対し実数値を与えるため、より意味のある比較が可能です。計算はやや遅くなりますが、視覚的解釈に判断を委ねずに済みます。

エルボー法は簡易なチェックに、シルエットスコアは確証を持って判断したいときに使ってください。

シルエットスコア vs. Davies-Bouldin指数

Davies-Bouldin指数(DBI)は、各クラスタと最も類似したクラスタとの平均的な類似度を測ります。DBIは低いほど良く、理想値は0です。

DBIはクラスタの重心を用いて類似度を計算するため、大規模データではシルエットスコアより高速です。密でよく分離したクラスタを評価する直観はシルエットと似ています。

ただし、DBIはクラスタリング全体についてしか教えてくれません。シルエットスコアは点ごとのスコアも得られるため、境界上の点や外れ値を見つけられます。

データセットが大きく速度が重要な場合はDBIを、個々の点を見たい場合はシルエットスコアを使いましょう。

シルエットスコア vs. Calinski-Harabasz指数

Calinski-Harabasz指数(CH、分散比規準とも)は、クラスタ間分散とクラスタ内分散の比です。スコアは高いほど良く、上限はありません。

CHはクラスタレベルの統計のみを用いるため高速で、大規模データでも有効です。シルエットやDBIと同様、凸でよく分離したクラスタに適しています。

またCHは自然な尺度を持たないため、異なるデータセット間で比較はできず、同一データセット上のモデル間でのみ比較可能です。

データセットが大きく、素早い結果が必要なときはCHを。解釈性や個々のデータ点に関する洞察が欲しいときはシルエットスコアを使いましょう。

内部指標と外部指標

上記の指標(シルエット、DBI、CH、エルボー法)はいずれも内部指標です。これは正解ラベルを用いず、データそのものだけでクラスタリングを評価します。そのため、実世界のクラスタリング問題(ラベルが存在しない)で標準的に用いられます。

外部指標は、クラスタ割り当てを既知のラベルと比較します。Adjusted Rand Index(ARI)、Normalized Mutual Information(NMI)、均一性(homogeneity)などが一般的です。ラベルがある状況で、クラスタリングアルゴリズムの適合度を検証する際に使われます。

ラベルがない(典型的な)場合は内部指標を、ラベル付きデータでクラスタリング手法をベンチマークする場合は外部指標を使用してください。

主要な指標を横並びでおさらいします:

Method Range Best value Speed Use it for
Silhouette score -1 to 1 Close to 1 Slow on large datasets Interpretability and per-point insights
Elbow method 0 to infinity Look for the elbow Fast Quick checks
Davies-Bouldin index 0 to infinity Close to 0 Fast Large datasets
Calinski-Harabasz index 0 to infinity Higher is better Fast Large, unlabeled datasets

シルエットスコアと代替指標の比較

シルエットスコアの限界

シルエットスコアには知っておくべき限界があります:

  • 距離ベースのクラスタリングを前提: 既定ではユークリッド距離に基づきます。KMeansなど重心ベースのアルゴリズムには適しますが、DBSCANのように任意形状で明確な重心を持たない密度ベース手法には適合しません
  • 小さくよく分離したクラスタで最も有効: この指標は、密で球状かつ離間したクラスタを高く評価します。クラスタが近接または重なっているデータでは、クラスタリングが正しくてもスコアは低くなります
  • 不規則なクラスタ形状には不向き: 現実世界のクラスタが常に凸とは限りません。その場合、割り当てが正しくてもシルエットスコアは低くなります
  • 大規模データでの計算コスト: シルエットスコアの計算には点同士の全組み合わせの距離が必要で、計算量は O(n^2) にスケールします。数百万点のデータでは高コストになります
  • 距離指標の選択に対する感度:ユークリッド、マンハッタン、コサインなど、どの距離を使うかでスコアは変わります。データがユークリッドの前提に合わない場合、シルエットスコアは誤解を招く可能性があります

シルエットスコア活用のベストプラクティス

シルエットスコアは、いくつかの基本的な実践に従うと最も効果を発揮します:

  • 複数のクラスタリング解を比較する:単一のシルエットスコアだけで判断しないでください。異なる k(または異なるアルゴリズム)でモデルを学習し、スコアを横並びで比較しましょう
  • スコアと併せてクラスタを可視化する: 数値だけでは全体像は見えません。クラスタをプロットして、形が妥当か確認してください
  • 最高スコアだけを最適化しない: k=2 のクラスタリングは、問題設定で5クラスタが意味を持つ場合でも、しばしば k=5 より高いスコアになります
  • ドメイン知識と組み合わせる: スコアはデータの最もきれいな構造を示し、ドメイン知識は実務的に有用な構造を示します。両方を使いましょう
  • 複数のクラスタリング指標で評価する: シルエット、DBI、CHなどは品質を異なる観点で測ります。一致していれば順調ですが、食い違う場合はデータを精査しましょう

まとめ

シルエットスコアは、点のまとまりの強さとクラスタ間の分離の良さを同時に示す、クラスタリング評価として直感的な方法の一つです。 

各点について計算し、平均して-1から1の単一の数値を得ます。1に近いスコアは明確に定義されたクラスタを、0付近や負のスコアは構造が実在しない可能性を示します。

ただし、シルエットスコアはあくまで出発点です。クラスタの可視化、そして何よりも問題に関するドメイン知識と組み合わせてください。これらが同じ方向性を示すときにこそ、結果を信頼できます。

シルエットスコアは、より大きなトピックである Pythonによる教師なし学習 の一部です。ぜひ受講し、ラベルなしデータのクラスタリング、変換、可視化、洞察抽出を学んでください。

トピック

DataCampで学ぶ

Courses

Rによるクラスター分析

4時間
44.1K
階層クラスタリングとk-meansクラスタリングの仕組みを直感的に理解し、データから洞察を引き出す方法を学びます。
詳細を見るRight Arrow
コースを開始
もっと見るRight Arrow