クラスター分析
Pythonサンプルスクリプト
クラスター分析を試みた。データは幾つかの都市の平年降水量であり、図1に示すものである。国土交通省のウェブサイト
https://www.mlit.go.jp/river/toukei_chousa/kasen/jiten/toukei/birn38p.html
に掲載されているものから値を読み込んで、Excelファイル(rain.xlsx)とした(2024年6月作成)。
図1 平年降水量(rain.xlsx)
クラスター分析を行うスクリプトは、リスト1のように用意した。スクリプトファイルと図1のデータファイルは、まとめて圧縮ファイルcfiles.zipとした。
リスト1のスクリプトを実行すると、Excelファイルrain.xlsxを読み込み、まずWard法によるクラスタリングが次のスクリプトにより行われる。
row_clusters = linkage(data_v, method
= 'ward')
fig = plt.figure(figsize = (7, 7))
row_dendr = dendrogram(row_clusters,
labels = cities,
orientation = 'right', leaf_font_size = 10)
図1のデータdata_vを関数linkageによりクラスター分析した結果を関数dendrogramにより樹状図を作成している。
リスト1のスクリプトにより、図2のように樹状図が表示される。
図2 Ward法によるクラスター分析
次に、図1のデータに対して非類似度を算出してcomplete法によりクラスター分析を行ってみた。
非類似度は、各月における平年降水量の差を求め、その和を非類似度とした。スクリプトは以下の通りである。
n = len(cities)
dists = np.empty((n,n))
for i in range(n):
for j in range(n):
dists[i][j]
= np.sum(np.abs(data_v[i] - data_v[j]))
この非類似度distsを用いて、complete法(Farthest Point Algorithm, or Voor Hees Algorithm)により次のスクリプトでクラスター分析を行った。
row_clusters = linkage(dists, method =
'complete')
fig = plt.figure(figsize = (7, 7),
facecolor = 'white')
row_dendr = dendrogram(row_clusters,
labels = cities,
orientation = 'right', leaf_font_size = 10)
図3に示す樹状図が得られた。
図3 Complete法によるクラスター分析
図2では大きく3つのクラスターに分かれていたが、図3では2つである。クラスターの内部もかなり異なっている。Ward法の観点と、complete法の観点とで、平均雨量のパターンの異なった側面が捉えられているといえる。
なお、k-means法によるクラスター分析はこのウェブサイトに示した。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from scipy.cluster.hierarchy import
linkage
from scipy.cluster.hierarchy import
dendrogram
# ExcelファイルをPandasのDataFrame型として読み込む
fl_nm = 'rain.xlsx'
with pd.ExcelFile(fl_nm) as xlfile:
df = pd.read_excel(xlfile)
cities = df.values[:,0]
data_v = np.array(df.values[:,1:],
dtype=float)
#
# Ward法によるクラスタリング
#
row_clusters = linkage(data_v, method
= 'ward')
fig = plt.figure(figsize = (7, 7))
row_dendr = dendrogram(row_clusters,
labels = cities,
orientation
= 'right', leaf_font_size = 10)
plt.title('Clustering by Ward method',
fontsize=14)
plt.tight_layout()
plt.savefig('FigClusterWard.png')
plt.show()
#
#
都市間の非類似度
#
n = len(cities)
dists = np.empty((n,n))
for i in range(n):
for j in range(n):
dists[i][j] = np.sum(np.abs(data_v[i] - data_v[j]))
print('dists =\n', dists)
#
#
Complete法によるクラスタリング
#
row_clusters = linkage(dists, method =
'complete')
fig = plt.figure(figsize = (7, 7),
facecolor = 'white')
row_dendr = dendrogram(row_clusters,
labels = cities,
orientation = 'right', leaf_font_size = 10)
plt.title('Clustering by Complete
method', fontsize = 14)
plt.tight_layout()
plt.savefig('FigClusterComplete.png')
plt.show()
なお、Pythonデータ分析の入門書<岡本安晴「いまさら聞けないPythonでデータ分析」丸善出版>を上梓した。