Up

クラスター分析

Pythonサンプルスクリプト

 

クラスター分析を試みた。データは幾つかの都市の平年降水量であり、図1に示すものである。国土交通省のウェブサイト

https://www.mlit.go.jp/river/toukei_chousa/kasen/jiten/toukei/birn38p.html

に掲載されているものから値を読み込んで、Excelファイル(rain.xlsx)とした(20246月作成)。

図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法によるクラスター分析はこのウェブサイトに示した。

 

 

 

リスト1 クラスター分析

 

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ファイルをPandasDataFrame型として読み込む

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でデータ分析」丸善出版>を上梓した。

 

Home