階層クラスタリングとデンドログラム | クラスタリング | Pythonによる機械学習を学ぶ

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
ad. 価格範囲を指定して商品を探せます

階層クラスタリングとデンドログラム

階層クラスタリング(Hierarchical Clustering)は、教師なし学習の手法の一つで、データを階層的にクラスタへまとめていくアルゴリズムです。この手法は、クラスタ数を事前に決めなくてもデータの構造を把握できることが特徴です。階層クラスタリングの結果は、デンドログラムと呼ばれる樹形図として視覚化できます。この記事では、階層クラスタリングの基本概念とデンドログラムの読み方、Pythonでの実装方法について解説します。

階層クラスタリングとデンドログラムを図で理解する

階層クラスタリングとデンドログラムを図で理解する

階層クラスタリングとは?

階層クラスタリングは、似ているデータ同士を少しずつ結合してクラスタを作っていく手法です。その結合の過程を樹形図として表したものがデンドログラムです。

階層クラスタリングには、大きく分けて「凝集型(Agglomerative)」と「分割型(Divisive)」の2つのアプローチがあります。

  • 凝集型階層クラスタリング:各データを1つのクラスタとして開始し、最も近いクラスタ同士を順番に結合していきます。実務で最も広く利用される方法です。
  • 分割型階層クラスタリング:すべてのデータを1つのクラスタとして開始し、徐々に分割していく方法です。理論的には重要ですが、実際の利用例は比較的少ないです。

距離の定義と結合基準

階層クラスタリングでは、データ同士の距離やクラスタ同士の距離をどのように定義するかが重要です。

  • ユークリッド距離:2点間を直線で結んだ距離
  • マンハッタン距離:格子状の道を移動するような縦横方向の距離の合計
  • ウォード法:クラスタ内の分散の増加が最小になるようにクラスタを結合する手法

特にウォード法は、比較的バランスのよいクラスタを形成しやすいため、よく利用されます。

階層クラスタリングの実装例

以下に、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()

このコードでは、サンプルデータに対してウォード法による階層クラスタリングを実行し、デンドログラムとして表示しています。

デンドログラムの解釈

デンドログラムは、データ同士やクラスタ同士がどの順番で結合されたかを示す樹形図です。

  • X軸:各データサンプル
  • Y軸:クラスタが結合された距離

Y軸方向に大きな間隔がある部分で水平線を引くことで、自然なクラスタ数を推定できます。

  • 高い位置で切る:少数の大きなクラスタになる
  • 低い位置で切る:多数の小さなクラスタになる

この特徴により、デンドログラムは適切なクラスタ数を決める際の参考として利用されます。

クラスタ数を指定した階層クラスタリング

階層クラスタリングでは、クラスタ数を指定して分類することも可能です。

from sklearn.cluster import AgglomerativeClustering

# 階層クラスタリングモデル
hc = AgglomerativeClustering(
    n_clusters=3,
    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()

このコードでは、凝集型階層クラスタリングを用いてデータを3つのクラスタに分類しています。

階層クラスタリングの応用

階層クラスタリングは、データ同士の類似性を調べたい場面で広く利用されています。

  • マーケティング:顧客の購買行動を分析し、顧客グループを発見する
  • バイオインフォマティクス:遺伝子やタンパク質の類似性分析
  • テキスト分析:類似する文書やトピックのグループ化
  • 商品分析:類似商品の分類やレコメンド分析

まとめ

階層クラスタリングは、データの類似性に基づいて階層的にグループ化を行う教師なし学習手法です。デンドログラムを利用することで、クラスタ同士の関係や適切なクラスタ数を視覚的に確認できます。クラスタ数を事前に決めなくてもデータ構造を把握できるため、探索的データ分析や顧客分析、テキスト分析など幅広い分野で活用されています。