都道府県別の飲み物の購入額をk-means法でクラスタリングするでは、Python3とscikit-learnを使ってk-means法によるクラスタリングを行ったが、このときにクラスター数は思いつきの5にした。この5という数字には何の根拠もないので、実際はベターなクラスター数がありうる。k-means法のクラスター数を決める方法としてシルエット分析とエルボー法があるので、この2つの方法で最適なクラスター数を求めてみる。参照は以下のサイト。
都道府県別の飲み物の購入額をk-means法でクラスタリングすると同じで、以下の環境とe-Statの全国消費実態調査 平成21年全国消費実態調査 全国 購入先・購入地域編の[二人以上の世帯] 【品目別1世帯当たり1か月間の支出】 地域,購入地域,購入先別データセット。
Bash on Ubuntu on Windows
Jupyter Notebook
シルエット分析では各点(ここでは都道府県)のシルエット値を計算する。シルエット値とは、MathWorksのサイトシルエット プロットによると「他のクラスターの点と比べて、その点が自身のクラスター内の他の点にどれくらい相似しているかを示す尺度」で、-1から1の範囲の値。シルエット値が1に近く、かつシルエット値をプロットしたシルエット図でクラスター間の幅の差が最も少ないクラスター数が最適となる。
クラスター数を変えてクラスタリングしたときの各SSE(クラスター内誤差の平方和)をプロットしたエルボー図で、ひじのように曲がっているところのクラスター数が最適というもの。scikit-learnのKMeansクラスではfitメソッドを適用したあとに得られるinertia_ (Sum of squared distances of samples to their closest cluster center)がSSEに当たるらしい。
データをPnadasのDataFframeにするまでは都道府県別の飲み物の購入額をk-means法でクラスタリングするとコードは同じ。今回はクラスター数2~8の中からシルエット分析とエルボー法で最適なクラスター数を選ぶ。シルエット分析のコードはSelecting the number of clusters with silhouette analysis on KMeans clusteringのコードをほぼそのまま使えるが、長くなるのでクラスター数ごとの平均シルエット値を算出するコードのみ掲載しておく。エルボー図はinertia_をプロットしているだけ。
クラスター数ごとの平均シルエット値では、クラスター数5のときが1に最も近い。
別途シルエット図もプロットしてみたが、クラスター数5のときがクラスターごとのプロット幅が最も均等になった。以下はクラスター数5のときのシルエット図(左)と、「緑茶」「紅茶」の散布図(右)。
エルボー図ではクラスター数5のところがひじの箇所になるので、5が最適クラスター数となる。
シルエット分析でも、エルボー法でも、たまたま選んだクラスター数5が最適という結果になった。
- k-meansの最適なクラスター数を調べる方法
- Scikit Learn - K-Means - Elbow - criterion
- Selecting the number of clusters with silhouette analysis on KMeans clustering
環境とクラスタリングするデータ
都道府県別の飲み物の購入額をk-means法でクラスタリングすると同じで、以下の環境とe-Statの全国消費実態調査 平成21年全国消費実態調査 全国 購入先・購入地域編の[二人以上の世帯] 【品目別1世帯当たり1か月間の支出】 地域,購入地域,購入先別データセット。
Bash on Ubuntu on Windows
Jupyter Notebook
シルエット分析
シルエット分析では各点(ここでは都道府県)のシルエット値を計算する。シルエット値とは、MathWorksのサイトシルエット プロットによると「他のクラスターの点と比べて、その点が自身のクラスター内の他の点にどれくらい相似しているかを示す尺度」で、-1から1の範囲の値。シルエット値が1に近く、かつシルエット値をプロットしたシルエット図でクラスター間の幅の差が最も少ないクラスター数が最適となる。
エルボー法
クラスター数を変えてクラスタリングしたときの各SSE(クラスター内誤差の平方和)をプロットしたエルボー図で、ひじのように曲がっているところのクラスター数が最適というもの。scikit-learnのKMeansクラスではfitメソッドを適用したあとに得られるinertia_ (Sum of squared distances of samples to their closest cluster center)がSSEに当たるらしい。
シルエット分析とエルボー法のPython3コード
データをPnadasのDataFframeにするまでは都道府県別の飲み物の購入額をk-means法でクラスタリングするとコードは同じ。今回はクラスター数2~8の中からシルエット分析とエルボー法で最適なクラスター数を選ぶ。シルエット分析のコードはSelecting the number of clusters with silhouette analysis on KMeans clusteringのコードをほぼそのまま使えるが、長くなるのでクラスター数ごとの平均シルエット値を算出するコードのみ掲載しておく。エルボー図はinertia_をプロットしているだけ。
import codecs
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
%matplotlib inline
from IPython.core.pylabtools import figsize
import matplotlib.pyplot as plt
def select_n_cluster(X):
# クラスター数2~8を比べる
range_n_clusters = [i for i in range(2, 9)]
sse = []
for n_clusters in range_n_clusters:
clusterer = KMeans(init='k-means++', n_clusters=n_clusters, random_state=0)
cluster_labels = clusterer.fit_predict(X)
kmeans = clusterer.fit(X)
# SSE(クラスター内誤差の平方和)
sse.append(kmeans.inertia_)
# シルエット値(-1~1)の平均
silhouette_avg = silhouette_score(X, cluster_labels)
print('For n_clusters =', n_clusters,
'The average silhouette_score is :', silhouette_avg)
# エルボー図のプロット
plt.plot(range_n_clusters, sse, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
plt.show()
if __name__ == '__main__':
# csvのデータを読み込んでPandasのDataFrameに
df = import_estat_csv()
# 「緑茶」「紅茶」「コーヒー」の合計に対する割合を計算
df = calc_rate(df)
# 平均シルエット値の算出とエルボー図のプロット
select_n_cluster(df.as_matrix())
最適なクラスター数
クラスター数ごとの平均シルエット値では、クラスター数5のときが1に最も近い。
別途シルエット図もプロットしてみたが、クラスター数5のときがクラスターごとのプロット幅が最も均等になった。以下はクラスター数5のときのシルエット図(左)と、「緑茶」「紅茶」の散布図(右)。

エルボー図ではクラスター数5のところがひじの箇所になるので、5が最適クラスター数となる。

シルエット分析でも、エルボー法でも、たまたま選んだクラスター数5が最適という結果になった。
0 件のコメント:
コメントを投稿