今回は、教師なし学習の主要な手法であるクラスタリングについて解説します。
クラスタリングの中でも特に、階層型クラスタリングを詳しく説明します。
また、階層型クラスタリングをPythonで実装する方法も解説していきます。
動画で詳しく学習したい方はこちらもおすすめ
クラスタリングとは
データを自然なグループに分割するプロセスを指します。
教師なし学習のひとつであり、画像データを特徴量ごとに分類するときなど、様々な分野で活用されています。
階層型クラスタリング
クラスタリングの手法のひとつである階層型クラスタリングについて解説します。
階層型クラスタリングとは
階層型クラスタリングとは、その名の通り、データを階層的に分類するクラスタリング手法です。
各データを個別のクラスタとして開始し、近い(似ている)データを統合してクラスタを形成していきます。

デンドログラムによる可視化
階層型クラスタリングの結果はデンドログラムというグラフよって可視化できます。
デンドログラムのイメージは以下です。

デンドログラムからクラスタ数kを決めることも可能です。
以下のようにデータを切り分ける数により、クラスタ数kを決定できます。
このようにデンドログラムを作成し、いくつにデータを切り分けられそうかをみつけ、クラスタ数kを決定します。

特徴
メリット
- データ間の関係性を理解しやすい
- クラスタ数を事前に決定する必要がない
デメリット
- 計算コストが高い
- 外れ値の影響を受けやすい
Python実践 階層型クラスタリング
それではPythonを使用し、階層型クラスタリングを実装してみましょう!
scikit-learn
ライブラリを使用します。
使い方は以下の通りです。
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
# 階層型クラスタリングの実施
Z = linkage(X, method=’ward’)
# デンドログラムの描画
dendrogram(Z)
# クラスタリングの切り分け
clusters = fcluster(Z, t=6, criterion=’distance’)
linkage()
: データ間の距離を計算し、階層的にグループ化
dendrogram()
: 階層構造をグラフ化
fcluster()
: t
で指定した距離に基づいてクラスタを切り分け
これらをもとにした階層型クラスタリングのサンプルコードは以下の通りです。
import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# サンプルデータの生成
X, y = make_blobs(n_samples=50, centers=3, random_state=42, cluster_std=1.5)
# 階層型クラスタリングの実行(ウォード法)
Z = linkage(X, method='ward')
# デンドログラムの描画
plt.figure(figsize=(10, 7))
dendrogram(Z)
plt.title("Dendrogram for Hierarchical Clustering")
plt.xlabel("Sample Index")
plt.ylabel("Distance")
plt.show()
# クラスタの切り分け(例: 距離が6以下でクラスタ化)
clusters = fcluster(Z, t=6, criterion='distance')
# 散布図の描画
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=clusters, cmap='viridis', s=50)
plt.title("Scatter Plot with Hierarchical Clustering Results")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
実行結果


まとめ
クラスタリングの中でも一般的な階層型クラスタリングについて解説しました。
階層型クラスタリングとは、近いデータを徐々に統合していき、クラスタリングしていくのが特徴のアルゴリズムです。
また、デンドログラムという階層型クラスタリングを可視化する方法を紹介しました。
階層型クラスタリングをPythonで実装する方法は以下の通りです。
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
# 階層型クラスタリングの実施
Z = linkage(X, method=’ward’)
# デンドログラムの描画
dendrogram(Z)
# クラスタリングの切り分け
clusters = fcluster(Z, t=6, criterion=’distance’)
ここまで読んでくださりありがとうございます。