scikit-learnでk-meansを調べていると、いくつか便利な関数が用意されているのに気付いたのでシンプルに実行できる形をまとめておく。
まずは読み込み
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# データセットを読み込み
df = pd.read_csv("http://pythondatascience.plavox.info/wp-content/uploads/2016/05/Wholesale_customers_data.csv")
# 前処理。対象とすべき数値のみにする
del(df['Channel'])
del(df['Region'])
df.head(10)
# ほんとはここで欠損値・外れ値などに対する前処理を行っておく
----------------
Fresh Milk Grocery Frozen Detergents_Paper Delicassen
0 12669 9656 7561 214 2674 1338
1 7057 9810 9568 1762 3293 1776
2 6353 8808 7684 2405 3516 7844
3 13265 1196 4221 6404 507 1788
4 22615 5410 7198 3915 1777 5185
5 9413 8259 5126 666 1795 1451
6 12126 3199 6975 480 3140 545
7 7579 4956 9426 1669 3321 2566
8 5963 3648 6192 425 1716 750
9 6006 11093 18881 1159 7425 2098
- fit()メソッド:与えられた数値の平均や偏差などを記録する(変換はしない)
- transform()メソッド:fitで作成した計算式を元に実際に変換する
fit_transform()メソッドは上二つを連続で行う
*インスタンスはクラス(データの処理をまとめたルール)を実体化させる
scaler = StandardScaler() # インスタンス作成
df_scaler = scaler.fit_transform(df) # 正規化
df_scaler
--------------
array([[ 0.05293319, 0.52356777, -0.04111489, -0.58936716, -0.04356873,
-0.06633906],
[-0.39130197, 0.54445767, 0.17031835, -0.27013618, 0.08640684,
0.08915105],
[-0.44702926, 0.40853771, -0.0281571 , -0.13753572, 0.13323164,
2.24329255],
...,
[ 0.20032554, 1.31467078, 2.34838631, -0.54337975, 2.51121768,
0.12145607],
[-0.13538389, -0.51753572, -0.60251388, -0.41944059, -0.56977032,
0.21304614],
[-0.72930698, -0.5559243 , -0.57322717, -0.62009417, -0.50488752,
-0.52286938]])
あとは同じ。
kmeans = KMeans(n_clusters=4, random_state=0)
clusters = kmeans.fit(df_scaler)
df["cluster"] = clusters.labels_ # labelを付与
df.head(15)
-----------------
Fresh Milk Grocery Frozen Detergents_Paper Delicassen cluster
0 12669 9656 7561 214 2674 1338 0
1 7057 9810 9568 1762 3293 1776 2
2 6353 8808 7684 2405 3516 7844 2
3 13265 1196 4221 6404 507 1788 0
4 22615 5410 7198 3915 1777 5185 0
5 9413 8259 5126 666 1795 1451 0
6 12126 3199 6975 480 3140 545 0
7 7579 4956 9426 1669 3321 2566 0
8 5963 3648 6192 425 1716 750 0
9 6006 11093 18881 1159 7425 2098 2
10 3366 5403 12974 4400 5977 1744 2
11 13146 1124 4523 1420 549 497 0
12 31714 12319 11757 287 3881 2931 2
13 21217 6208 14982 3095 6707 602 2
14 24653 9465 12091 294 5058 2168 2