三流院生のデータ解析忘備録

データ解析等の情報をメモ書き程度のクオリティーで更新。Python, Fortran, bash, ArcGIS, Microsoft Office (Word, Excel, PowerPoint).

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

-----

 

デンドログラムの色分けだけでなく、グルーピング後の番号の振り分けもできるのはありがたい。