クラスタリング手法の比較【k-means・DBSCAN・階層クラスタリングの使い分け】

クラスタリング手法の比較【k-means・DBSCAN・階層クラスタリングの使い分け】 AI資格・学習

はじめに

クラスタリング(教師なし学習)は「ラベルがないデータをグループ分けする」手法です。顧客のセグメント分類・異常検知・データの探索的分析など幅広く使われます。代表的な3つの手法の特徴と使い分けを解説します。

k-means法

from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib

# サンプルデータ(顧客の購買行動)
np.random.seed(42)
X = np.vstack([
    np.random.normal([2, 2], 0.5, (100, 2)),   # グループA
    np.random.normal([8, 8], 0.5, (100, 2)),   # グループB
    np.random.normal([2, 8], 0.5, (100, 2)),   # グループC
])

# 最適なクラスタ数をシルエットスコアで決める
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

scores = []
for k in range(2, 8):
    km = KMeans(n_clusters=k, random_state=42)
    labels = km.fit_predict(X_scaled)
    score = silhouette_score(X_scaled, labels)
    scores.append(score)
    print(f'k={k}: シルエットスコア={score:.3f}')

best_k = scores.index(max(scores)) + 2
print(f'最適クラスタ数: {best_k}')

# 最適kでクラスタリング
km = KMeans(n_clusters=best_k, random_state=42)
labels = km.fit_predict(X_scaled)

# 可視化
plt.figure(figsize=(10, 5))
for i in range(best_k):
    mask = labels == i
    plt.scatter(X[mask, 0], X[mask, 1], label=f'クラスタ {i}', s=30)
plt.scatter(km.cluster_centers_[:, 0] * scaler.scale_[0] + scaler.mean_[0],
           km.cluster_centers_[:, 1] * scaler.scale_[1] + scaler.mean_[1],
           marker='★', s=200, c='black', label='重心')
plt.title(f'k-means クラスタリング(k={best_k})')
plt.legend()
plt.show()

DBSCAN(密度ベースクラスタリング)

from sklearn.cluster import DBSCAN

# DBSCANは不規則な形のクラスタや外れ値検出に強い
dbscan = DBSCAN(eps=0.5, min_samples=5)
db_labels = dbscan.fit_predict(X_scaled)

n_clusters = len(set(db_labels)) - (1 if -1 in db_labels else 0)
n_noise = list(db_labels).count(-1)
print(f'検出クラスタ数: {n_clusters}')
print(f'外れ値(ノイズ)数: {n_noise}')

3手法の使い分け

k-meansは球状のクラスタに向いており、速く大規模データに適用可能です。ただしクラスタ数を事前に指定する必要があり、外れ値に弱いです。DBSCANは不規則な形のクラスタに強く、外れ値を自動検出できます。ただしeps・min_samplesのパラメータ設定が難しいです。階層クラスタリングはクラスタ数を事前に決める必要がなく、デンドログラムで関係性を可視化できます。ただし大規模データには不向きです。

まとめ

クラスタリングはデータの「探索」に使うものです。球状のクラスタならk-means、外れ値検出を兼ねるならDBSCAN、クラスタ数が不明なら階層クラスタリングから試してみましょう。シルエットスコアでクラスタの品質を客観的に評価することを忘れずに。

📌 プログラミング・AI学習のおすすめスクール

※本記事にはアフィリエイトリンクが含まれます。

コメント

タイトルとURLをコピーしました