都道府県別の飲み物の購入額を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 件のコメント:
コメントを投稿