😎

クラスタリングとは?

2025/03/03に公開

クラスタリング(Clustering)とは、データを類似したグループ(クラスタ)に分ける機械学習の手法の一つです。教師なし学習の一種であり、データにラベルが与えられていない場合でも、データのパターンを自動的に見つけ出すことができます。

クラスタリングは、顧客セグメンテーション、異常検知、画像分類、テキストマイニングなど、さまざまな分野で活用されています。

代表的なクラスタリング手法

クラスタリングにはいくつかの手法があり、それぞれに特徴があります。代表的な手法として以下のものが挙げられます。

1. K-Means クラスタリング

K-Means は最も一般的なクラスタリング手法の一つで、データを K個 のクラスタに分割します。

アルゴリズムの流れ

  1. クラスタ数 K を決める。
  2. K個の初期クラスタ中心(セントロイド)をランダムに選ぶ。
  3. 各データポイントを最も近いクラスタ中心に割り当てる。
  4. 各クラスタのデータポイントの平均を求め、新たなクラスタ中心とする。
  5. クラスタ中心が収束(変化しなくなる)するまで繰り返す。

K-Means のメリット・デメリット

メリット

  • 計算量が比較的少なく、大規模データにも適用しやすい。
  • 実装がシンプル。

デメリット

  • K の値を事前に決める必要がある。
  • 初期値の選択によって結果が変わる。
  • 楕円形や非線形なクラスタには適用しにくい。

Python による実装

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

# ダミーデータの生成
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# K-Means クラスタリングの実行
kmeans = KMeans(n_clusters=4, random_state=0)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

# 結果の可視化
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red', marker='X')
plt.title("K-Means Clustering")
plt.show()

2. 階層的クラスタリング(Hierarchical Clustering)

階層的クラスタリングは、データを階層的に分割または統合し、ツリー構造(デンドログラム)を作成する手法です。

アルゴリズムの種類

  • 凝集型(Agglomerative): 各データポイントを最初は個別のクラスタとし、近いクラスタ同士を統合していく。
  • 分割型(Divisive): すべてのデータを1つのクラスタとし、段階的に分割していく。

Python による実装(凝集型)

import scipy.cluster.hierarchy as sch
from sklearn.cluster import AgglomerativeClustering

# デンドログラムの作成
dendrogram = sch.dendrogram(sch.linkage(X, method='ward'))
plt.title("Dendrogram")
plt.show()

# クラスタリングの実行
hc = AgglomerativeClustering(n_clusters=4, affinity='euclidean', linkage='ward')
y_hc = hc.fit_predict(X)

# 結果の可視化
plt.scatter(X[:, 0], X[:, 1], c=y_hc, cmap='rainbow')
plt.title("Hierarchical Clustering")
plt.show()

3. DBSCAN (Density-Based Spatial Clustering of Applications with Noise)

DBSCAN はデータの密度に基づいたクラスタリング手法で、異常値(アウトライアー)を自然に扱えるのが特徴です。

アルゴリズムの流れ

  1. ある点を中心に一定の距離内にある点の数をカウントする。
  2. 十分な密度がある場合、その点をクラスタの一部とする。
  3. 同様に隣接する点もクラスタに追加し、密度が低い点はノイズとみなす。

メリット・デメリット

メリット

  • クラスタ数を事前に決める必要がない。
  • 異常値を自動的に認識できる。

デメリット

  • パラメータ(ε, min_samples)の調整が必要。
  • データの密度が大きく異なる場合、うまく機能しないことがある。

Python による実装

from sklearn.cluster import DBSCAN

dbscan = DBSCAN(eps=0.3, min_samples=5)
y_dbscan = dbscan.fit_predict(X)

# 結果の可視化
plt.scatter(X[:, 0], X[:, 1], c=y_dbscan, cmap='plasma')
plt.title("DBSCAN Clustering")
plt.show()

クラスタリング手法の選び方

手法 特徴 メリット デメリット
K-Means セントロイドを中心とする シンプルで計算量が少ない Kの選択が必要、初期値に依存
階層的クラスタリング ツリー構造を作る Kを事前に決める必要がない 計算量が多い
DBSCAN 密度ベース 異常値に強く、Kを決めなくて良い パラメータ調整が難しい

まとめ

クラスタリングはデータをグループ化する強力な手法であり、K-Means、階層的クラスタリング、DBSCAN などの手法が用途に応じて活用されます。それぞれの特性を理解し、適切な手法を選ぶことで、より良い分析結果を得ることができます。

ぜひ実際に Python を使って試してみてください!

Discussion