😎
クラスタリングとは?
クラスタリング(Clustering)とは、データを類似したグループ(クラスタ)に分ける機械学習の手法の一つです。教師なし学習の一種であり、データにラベルが与えられていない場合でも、データのパターンを自動的に見つけ出すことができます。
クラスタリングは、顧客セグメンテーション、異常検知、画像分類、テキストマイニングなど、さまざまな分野で活用されています。
代表的なクラスタリング手法
クラスタリングにはいくつかの手法があり、それぞれに特徴があります。代表的な手法として以下のものが挙げられます。
1. K-Means クラスタリング
K-Means は最も一般的なクラスタリング手法の一つで、データを K個 のクラスタに分割します。
アルゴリズムの流れ
- クラスタ数 K を決める。
- K個の初期クラスタ中心(セントロイド)をランダムに選ぶ。
- 各データポイントを最も近いクラスタ中心に割り当てる。
- 各クラスタのデータポイントの平均を求め、新たなクラスタ中心とする。
- クラスタ中心が収束(変化しなくなる)するまで繰り返す。
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 はデータの密度に基づいたクラスタリング手法で、異常値(アウトライアー)を自然に扱えるのが特徴です。
アルゴリズムの流れ
- ある点を中心に一定の距離内にある点の数をカウントする。
- 十分な密度がある場合、その点をクラスタの一部とする。
- 同様に隣接する点もクラスタに追加し、密度が低い点はノイズとみなす。
メリット・デメリット
メリット
- クラスタ数を事前に決める必要がない。
- 異常値を自動的に認識できる。
デメリット
- パラメータ(ε, 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