読者です 読者をやめる 読者になる 読者になる

あれもPython,これもPython

Pythonで世界を包みたい

データサイエンスをPythonで試す(3_クラスタリング)

引き続き、この本を基にデータサイエンスの手法を勉強します。

手を動かしながら学ぶ ビジネスに活かすデータマイニング

手を動かしながら学ぶ ビジネスに活かすデータマイニング

今回は第五章のクラスタリングです。

準備

from scipy.cluster.hierarchy import dendrogram,ward,leaves_list
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

% matplotlib inline

データの用意

ec = pd.read_csv("ch5_3.txt",sep = " ")
ec.head()
#   books   cloths  cosmetics   foods   liquors
#0  43  0   3   4   10
#1  25  5   5   3   11

ECの購買データのようです。

階層クラスタリング

階層クラスタリングはscipyで行います。
書籍内ではWard法でやっていたので、
Ward法でやっていきます。

h_cls = ward(ec)
dendrogram(h_cls)

その他、pdistで距離計算を指定したり、
Ward法以外も指定できるようです。

クラスターはleaves_list()で出せるようですが、
枝切のほうがわからず。。。
どなたかご存知でしたら、教えください。

k-means

続いて、非階層クラスタリングを。
今度はsklearnを使います。

k_cls = KMeans(n_clusters=3)
k_cls.fit(ec)
cls_labels= k_cls.labels_

sklearnの基本的な使い方通り、
modelを用意、データをfitで渡す。
で、終わりです。
クラスターのラベルは.labels_で出せます。

ラベル付の状態の可視化

書籍内では、各変数内のラベルの付き方を可視化していたので、
それをやります。
(今回はkmeansのみ)

ec["cls"] = cls_labels
# クラスターのラベル毎にグループに分けて、平均値を出す
# ついでに四捨五入しておく
pd.groupby(ec,"cls").mean().round()
#   books   cloths  cosmetics   foods   liquors
#cls                    
#0  46  11  5   5   5
#1  29  10  4   5   6
#2  9   14  5   4   8

これを積み上げグラフにする。

# グラフ用に転置する
res = pd.DataFrame(np.array(pd.groupby(ec,"cls").mean().round()).T)
res.columns = ["0","1","2"]
res.index = ec.columns
res.plot(kind="bar",stacked=True,alpha=0.5)

f:id:esu-ko:20160307172607p:plain

最後が少しアクロバットになりすぎた気がするけど、本と同じようになりました。

前回記事はこちら。

esu-ko.hatenablog.com