クラスタリングで最適なクラスタ数を見つけるための評価指標

## 概要
クラスタリングは、機械学習のアンサンブル技術で、データのパターンを見つけ出すために使用されます。しかし、最適なクラスタ数を決定するのは一般的に難しいタスクです。そのため、各種の評価指標が提案されています。今回は、Pythonの機械学習ライブラリ`sklearn`を用いて、クラスタリング結果を評価する主要な指標を使い分ける方法を解説します。

## コード
以下のコードは、sklearnの組み込みデータセットであるアヤメのデータセットを用いて、2から9までのクラスタ数でKMeansクラスタリングを行い、その結果を以下の4つの評価指標で評価するものです。

- Inertia
- Silhouette Score
- Davies-Bouldin Score
- Calinski-Harabasz Score

```python
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score, davies_bouldin_score, calinski_harabasz_score

# データセットをロード
iris = load_iris()
X = iris.data

# 探索範囲の指定
clusters_range = range(2, 10)

# 評価指標を格納するための配列
inertia_values = []
silhouette_scores = []
db_scores = []
ch_scores = []

# KMeansでクラスタ数ごとに評価指標を算出
for n_clusters in clusters_range:
    kmeans = KMeans(n_clusters=n_clusters, random_state=42)
    kmeans.fit(X)
    
    # Inertia (Sum of squared distances of samples to their closest cluster center)
    inertia_values.append(kmeans.inertia_)

    # Silhouette Score
    silhouette_scores.append(silhouette_score(X, kmeans.labels_))

    # Davies-Bouldin Score
    db_scores.append(davies_bouldin_score(X, kmeans.labels_))

    # Calinski-Harabasz Score
    ch_scores.append(calinski_harabasz_score(X, kmeans.labels_))

# 評価指標の可視化
fig, axs = plt.subplots(4, figsize=(6, 18))

# Inertia (Elbow Method)
axs[0].plot(clusters_range, inertia_values, 'r-')
axs[0].set_xlabel('Number of clusters (k)')
axs[0].set_ylabel('Inertia')
axs[0].grid(True)

# Silhouette Score
axs[1].plot(clusters_range, silhouette_scores, 'b-')
axs[1].set_xlabel('Number of clusters (k)')
axs[1].set_ylabel('Silhouette Score')
axs[1].grid(True)

# Davies-Bouldin
axs[2].plot(clusters_range, db_scores, 'g-')
axs[2].set_xlabel('Number of clusters (k)')
axs[2].set_ylabel('Davies-Bouldin Index')
axs[2].grid(True)

# Calinski-Harabasz
axs[3].plot(clusters_range, ch_scores, 'm-')
axs[3].set_xlabel('Number of clusters (k)')
axs[3].set_ylabel('Calinski-Harabasz Index')
axs[3].grid(True)

plt.tight_layout()
plt.show()
```

ここで得られた結果は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318305/26777585-1518-1fcc-2ede-0dde95608f4f.png)


## 各評価指標について

### Inertia

Inertiaは各クラスタ内のサンプルの中心からの距離の二乗和を表します。これは、クラスタ内のサンプルがどれほど離れているかを示す指標で、値が小さいほど良いクラスタリングとされます。Inertiaは通常「Elbow Method（エルボー法）」と併用され、曲線が折れ曲がる点（"エルボー"）を最適なクラスタ数とする手法が一般的です。今回の結果では、クラスタ数が増えるにつれてInertiaの値が減少しています。エルボーが明確に見えるかは難しいですが、クラスタ数4あたりで急降下が緩やかになっているため、そこが一つの候補と言えます。

### Silhouette Score

Silhouette Scoreは各サンプルがどれほど密にまとまっているかを示します。この指標は-1から1の範囲の値を取り、高い値ほどサンプルが適切にクラスタリングされていると評価されます。今回の結果では、クラスタ数2のときに最も高い値を示しており、その後は値が減少しています。したがって、シルエットスコアを基準にすると、クラスタ数2が最適となります。

### Davies-Bouldin Score

Davies-Bouldin Scoreはクラスタ間の類似度を測るための指標で、値が小さいほど良いクラスタリングとされます。今回の結果では、クラスタ数2のときに最も低い値を示しています。したがって、この指標を基準にすると、クラスタ数2が最適となります。

### Calinski-Harabasz Score

Calinski-Harabasz Scoreもクラスタの密度を測る指標で、値が大きいほど良いクラスタリングとされます。今回の結果では、クラスタ数3のときに最も高い値を示しています。したがって、この指標を基準にすると、クラスタ数3が最適となります。


以上の結果から、様々な評価指標によって最適なクラスタ数の解釈が異なることがわかります。評価指標の選択は、問題の性質や目的によります。また、これらの評価指標はすべてヒューリスティックなものであり、絶対的な基準ではないため、最終的な判断は問題の文脈やドメイン知識等に基づいて行う必要があります。


## まとめ
以上、クラスタリングで最適なクラスタ数を見つけるための評価指標について解説しました。様々な評価指標を理解し、自身の問題設定に最適な指標を選択することで、より質の高いクラスタリングを行うことができるでしょう。