階層クラスタリングとデンドログラム
階層クラスタリング(Hierarchical Clustering)は、教師なし学習の手法の一つで、データを階層的にクラスタに分割するアルゴリズムです。この手法は、クラスタの数をあらかじめ指定する必要がなく、データの構造に基づいて自然なグループを形成することができます。階層クラスタリングの結果はデンドログラムと呼ばれるツリーストラクチャーとして視覚化できます。この記事では、階層クラスタリングの概念とデンドログラムの描画方法を解説します。
階層クラスタリングとは?
階層クラスタリングは、データを小さいクラスタから大きいクラスタへと結合する「凝集型」と、大きいクラスタを分割していく「分割型」の2つのアプローチがあります。最も一般的なのは凝集型階層クラスタリングです。
- 凝集型階層クラスタリング: 各データ点を1つのクラスタとみなし、近接するクラスタを次々に結合していきます。クラスタ間の距離が最小になるようにクラスタを結合し、最終的に1つのクラスタになるまで続けます。
- 分割型階層クラスタリング: 逆に、全データを1つのクラスタとみなし、徐々に分割していく方法です。
距離の定義と結合基準
クラスタリングでは、クラスタ間の距離やデータ点間の距離をどのように定義するかが重要です。以下のような距離や結合基準が一般的です。
- ユークリッド距離: データ点間の直線距離
- マンハッタン距離: データ点間の縦横の距離
- ウォード法: データ内の分散が最も少なくなるようにクラスタを結合する手法
階層クラスタリングの実装例
以下に、Scikit-learnを使った階層クラスタリングのPython実装例を示します。デンドログラムの描画にはSciPyライブラリを使用します。
from sklearn.datasets import make_blobs
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# サンプルデータの生成
X, y = make_blobs(n_samples=100, centers=3, random_state=42)
# 階層クラスタリングの実行 (ウォード法)
Z = linkage(X, method='ward')
# デンドログラムの描画
plt.figure(figsize=(10, 7))
dendrogram(Z)
plt.title('デンドログラム')
plt.xlabel('サンプルインデックス')
plt.ylabel('距離')
plt.show()
このコードでは、`make_blobs` 関数を使ってサンプルデータを生成し、`linkage` 関数を使ってウォード法で階層クラスタリングを実行しています。結果として、デンドログラムが描画され、クラスタ間の結合の順序と距離が視覚化されます。
デンドログラムの解釈
デンドログラムは、クラスタリングの結果をツリー状に視覚化したもので、X軸にはデータポイントが、Y軸にはクラスタ間の距離が表示されます。
- クラスタの切り分け: デンドログラムを任意の高さで切ることで、いくつかのクラスタにデータを分割することができます。Y軸の距離が大きくなる地点で切ると、少数の大きなクラスタに分けることができ、低い地点で切ると、多くの小さなクラスタに分けることができます。
- クラスタの分割数の決定: デンドログラムから最適なクラスタ数を決める際は、切り分けた結果で得られるクラスタのバランスを観察します。
クラスタリングの実装 (指定クラスタ数)
階層クラスタリングでは、特定のクラスタ数を指定してクラスタ分割を行うことも可能です。以下のコードでは、3つのクラスタにデータを分類します。
from sklearn.cluster import AgglomerativeClustering
# 階層クラスタリングのモデル作成
hc = AgglomerativeClustering(n_clusters=3, affinity='euclidean', linkage='ward')
# クラスタの予測
y_hc = hc.fit_predict(X)
# クラスタごとのプロット
plt.scatter(X[y_hc == 0, 0], X[y_hc == 0, 1], s=100, c='red', label='Cluster 1')
plt.scatter(X[y_hc == 1, 0], X[y_hc == 1, 1], s=100, c='blue', label='Cluster 2')
plt.scatter(X[y_hc == 2, 0], X[y_hc == 2, 1], s=100, c='green', label='Cluster 3')
plt.title('階層クラスタリングによる分類')
plt.xlabel('X座標')
plt.ylabel('Y座標')
plt.legend()
plt.show()
このコードでは、`AgglomerativeClustering` を使って階層クラスタリングを実装し、3つのクラスタに分類しています。結果は2Dのプロットで視覚化され、それぞれのクラスタが異なる色で示されています。
階層クラスタリングの応用
階層クラスタリングは、主に次のような場面で利用されます。
- マーケティング: 顧客セグメンテーションを行い、異なる顧客グループに対して適切なマーケティング戦略を立てることができます。
- バイオインフォマティクス: 遺伝子の分類や進化的な関係を調べる際に階層クラスタリングが用いられます。
- テキストマイニング: 文書をクラスタリングして、類似したトピックを持つ文書グループを見つけることができます。
まとめ
階層クラスタリングは、クラスタ数を事前に指定せずにデータの構造を探索できる教師なし学習の手法です。デンドログラムによって視覚的にクラスタ間の関係性を把握でき、マーケティング、バイオインフォマティクス、テキストマイニングなど多くの分野で応用されています。ウォード法やユークリッド距離といったさまざまな距離基準を使ってクラスタリングが行われます。