今週のテーマは クラスタリング その2です。前回は階層的クラスタリングでしたが,今回ご紹介するのは 非階層的クラスタリング と呼ばれる手法になります。

非階層的クラスタリングって?

階層的クラスタリングが,まとめたクラスターのクタスター,クラスターのクラスターのクラスター,というように次々レベルを積み上げていったのに対し,非階層的クラスタリングはそういう積み上げをしない方式です。代表的な手法は* kmeans法 *と呼ばれています。

どうやってまとめるか

詳しい説明はこのサイトが詳しい。

http://tech.nitoyon.com/ja/blog/2009/04/09/kmeans-visualise/

やってみましょう

irisデータを使います。

data(iris)
head(iris[1:4])
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1          5.1         3.5          1.4         0.2
## 2          4.9         3.0          1.4         0.2
## 3          4.7         3.2          1.3         0.2
## 4          4.6         3.1          1.5         0.2
## 5          5.0         3.6          1.4         0.2
## 6          5.4         3.9          1.7         0.4
result.km <- kmeans(iris[1:4],3) #クラスタ数を3にする
result.km$cluster
##   [1] 3 1 1 1 3 3 3 3 1 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 1 3 3 3 1
##  [36] 3 3 3 1 3 3 1 1 3 3 1 3 1 3 3 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2
##  [71] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2
## [106] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [141] 2 2 2 2 2 2 2 2 2 2
iris$cluster <- result.km$cluster
xtabs(~Species+cluster,data=iris)
##             cluster
## Species       1  2  3
##   setosa     17  0 33
##   versicolor  4 46  0
##   virginica   0 50  0
plot(iris[1:4],pch=as.numeric(iris$Species),col=iris$cluster+1)  #形は種類,色はクラスタ

plot of chunk unnamed-chunk-1

気付いた人もいるかもしれないが,kmeans法は階層的クラスタリングと違って先にクラスタ数を決めておかなければならない。 正解がわからないとどうなるだろうか。

result.km2 <- kmeans(iris[1:4],4) #クラスタ数を4にする
result.km2$cluster
##   [1] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
##  [36] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 1 1 1 2 1 2 1 2 1 2 2 2 2 1 2 1 2 2 1 2
##  [71] 1 2 1 1 1 1 1 1 1 2 2 2 2 1 2 1 1 1 2 2 2 1 2 2 2 2 2 1 2 2 3 1 3 3 3
## [106] 3 2 3 3 3 1 1 3 1 1 3 3 3 3 1 3 1 3 1 3 3 1 1 3 3 3 3 3 1 1 3 3 3 1 3
## [141] 3 3 1 3 3 3 1 1 3 1
iris$cluster2 <- result.km2$cluster
xtabs(~Species+cluster2,data=iris)
##             cluster2
## Species       1  2  3  4
##   setosa      0  0  0 50
##   versicolor 23 27  0  0
##   virginica  17  1 32  0
plot(iris[1:4],pch=as.numeric(iris$Species),col=iris$cluster2+1)  #形は種類,色はクラスタ

plot of chunk unnamed-chunk-2

このように,結果が意味するところがわかりにくくなることもある。

kmeans法の特徴

解決策

探索的な研究の場合は。クラスタ数が事前にわかっていることが少ない。 そのほか色々改良がなされている。

x-means,改良k-meansについてはこちらのサイトを参照 http://aaaazzzz036.hatenablog.com/archive/category/R

ここでは下二つを紹介する。 以下はRにパッケージを追加するので,インターネットに接続されている環境で実行すること。

c-means

ファジィなクラスタリング,というのはしっかり区別するんじゃなくて,クラスターに入る確率を求め,その確率が最も高いところを採用しますけど,というやり方。

library(e1071)
result.cm <- cmeans(iris[1:4],3)
head(result.cm$membership)
##           1        2        3
## [1,] 0.9966 0.001072 0.002304
## [2,] 0.9759 0.007498 0.016651
## [3,] 0.9798 0.006415 0.013761
## [4,] 0.9674 0.010108 0.022467
## [5,] 0.9945 0.001768 0.003762
## [6,] 0.9346 0.020621 0.044809
iris$cluster3 <- result.cm$cluster
xtabs(~Species+cluster3,data=iris)
##             cluster3
## Species       1  2  3
##   setosa     50  0  0
##   versicolor  0  3 47
##   virginica   0 37 13
plot(iris[1:4],pch=as.numeric(iris$Species),col=iris$cluster3+1)  #形は種類,色はクラスタ

plot of chunk unnamed-chunk-3

モデルに基づいたクラスタリング

データが発生する確率モデルがあるとして,それに基づいてデータが出現すると考えると,最も適切なクラスタ数は幾つか,というモデルに基づいたクラスタリングをするのがこちら。

library(mclust)
## Package 'mclust' version 4.4
## Type 'citation("mclust")' for citing this R package in publications.
result.MC <- Mclust(iris[1:4])
result.MC
## 'Mclust' model object:
##  best model: ellipsoidal, equal shape (VEV) with 2 components
plot(result.MC,"BIC") #幾つかのモデルによる適合度

plot of chunk unnamed-chunk-4

iris$cluster4 <- result.MC$classification
xtabs(~Species+cluster4,data=iris)
##             cluster4
## Species       1  2
##   setosa     50  0
##   versicolor  0 50
##   virginica   0 50
plot(iris[1:4],pch=as.numeric(iris$Species),col=iris$cluster4+1)  #形は種類,色はクラスタ

plot of chunk unnamed-chunk-4

クラスタリングのまとめ

  1. 多変量解析=まとめること
  2. まとめかたにはいろいろある。
    • クラスタリングとクラスタリング以外
    • 階層的クラスタリングと非階層的クラスタリング
    • 非階層的クラスタリングの中にもkmeans,改良kmeans,xmeans,cmeans
    • モデルに基づいたクラスタリング,基づかないクラスタリング
  3. いずれにせよ,データに基づきつつ有用な情報を取り出す切り口を探すこと

本日の課題