kmeansで楽できる(かもしれない)パッケージを作った

k-means法は、非階層的クラスタリングの代表的な手法ですごく便利ですが、使って行く上で、以下の2つが問題になってきます。

  • 初期値がランダムなので、結果がぶれる
  • 最適なクラスタ数が分からない

この2つの弱点に対して拡張版や手法が提案されていますが、すごくシンプルな方法で解決するパッケージを作ってみました。
その名もykmeansパッケージ・・・!


このパッケージは、上記の二つの問題に対して、以下のアプローチで対応しています。

  • N回(デフォルトは100)実行して、一番分類されたクラスタを採用する
  • 任意の変数のクラスタ内分散の平均値が小さくなるクラスタ数を採用する

N回実行して一番多く分類されたクラスタを採用する

例えば、あるデータで100回実行して、そのクラスタの平均値をプロットすると、↓のようにクラスタの中心が結構ぶれます。

http://i.gyazo.com/a32a20645d641732e371fdb864a04cc4.png

クラスタの中心がずれると、当然分類されるクラスタが変わってしまうデータが出てきます。
なので、1回だけの実行では中々不安になってきます。


そこで、このパッケージでは、
「とりあえず100回くらい実行すれば安定するだろう」
という仮定のもとに、100回実行して、一番多く分類されたクラスタを採用しています。
(※回数は指定出来ます)

任意の変数のクラスタ内分散の平均値が小さくなるクラスタ数を採用する

自分がクラスタリングを使うときは、目的にもよりますが、ある程度クラスタ数の範囲は事前に決めています。
多すぎると解釈や説明がつらくなってくるので、3〜6、多くて10くらいに設定するのが多いです。
また、「クラスタリングして終わり」ではなく、各クラスタのKPIを比較するなど別の分析があります。
なので、クラスタ内で、見ようと思っているKPIが出来るだけ近い方が都合が良いです。


そこで、このパッケージでは、
「見ようと思っている変数が、クラスタ内でなるべく散らばらないクラスタ数」
を採用しています。


使い方

  • ykmeans (x, variable.names, target.name, k.list, n)
x データフレーム
variable.names クラスタリングの時の使う説明変数名
target.name クラスタ間で比較しようと思っている変数名
k.list クラスタ数候補
n 試行回数
実行例
  • 使うデータ
library(ykmeans)

head(actData)
##       y x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17
## 1 17030  7  3  4  3  3  3  3  2  3   3   1   2   3   2   2   2   2
## 2  1360  5  3  4  4  2  4  3  0  4   2   2   2   2   1   2   2   1
## 3  1360  7  4  3  4  2  4  3  3  2   3   2   2   2   2   2   2   1
## 4   100  5  2  3  2  3  1  2  3  2   1   2   1   1   2   1   0   1
## 5   320  4  3  3  2  3  1  2  2  1   1   2   2   1   1   2   1   0
## 6  2820  7  4  3  4  3  4  3  3  2   3   3   1   2   2   2   1   1
  • ykmeans関数の実行
ykm <- ykmeans(actData, paste0("x", 1:17), "y", 3:6)
table(ykm$cluster)
## 
##   1   2   3   4   5 
## 140  92  16 148 104
    • このデータでは、3〜6個のクラスタ数を試して「5」が採用されています。