Pythonで階層クラスター分析(Ward法) デンドログラムの作成
階層クラスター分析(ward法)に必要なライブラリはNumpy と Matplotlib, Scipy。
n人の生徒を3つの情報(例えば数学・国語・英語の点数)を使ってクラスタリングする場合を考える。
入力データ(score.csv)の並びは、
A1,1 B2,1 C3,1
A1,2 B2,2 C3,2
︙ ︙ ︙
A1,n B2,n C3,n
となる。
以下、スクリプト例
-----
# -*- coding:utf-8 -*-
# 使用ライブラリ
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster, set_link_color_palette
# 1. 入力データの読み込み
X = np.loadtxt('score.csv', delimiter=',')
# 2. クラスター分析(ward法)を行う
z = linkage(X, method='ward')
# 3. 図のフォーマットを指定
plt.figure(figsize=(40, 25))
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 50
plt.title('Hierarchical Clustering Dendrogram', fontsize=60)
plt.xlabel('Observation Points', fontsize=55)
plt.ylabel('Distance', fontsize=55)
# 4. デンドログラムの作成
set_link_color_palette(['purple', 'lawngreen', 'green', 'blue', 'orange', 'red']) # 6クラスタまでの色を指定
dendrogram(z, leaf_font_size=20., # 横軸の文字の大きさを指定
color_threshold=7., # ユークリッド平方距離が7以上を同色で表示
above_threshold_color='black') # ユークリッド平方距離が7以上を黒色に指定
plt.show()
# 5. 各地点のクラスタ―番号の出力
#group = fcluster(z, 10, criterion='distance') # ユークリッド平方距離で分けたい場合
group = fcluster(z, 6, criterion='maxclust') # クラスタ数で分けたい場合
print group
-----
デンドログラムの色分けだけでなく、グルーピング後の番号の振り分けもできるのはありがたい。