第2回データマイニング+WEB 勉強会@東京 (Tokyo.Webmining)

id:hamadakoichiさん主催の第2回データマイニング+WEB 勉強会@東京 (Tokyo.Webmining)に参加してきました。




今回はクラスター分析のお話が中心でした。


発表資料はこちら。
はじめてでもわかる R言語によるクラスター分析 - 似ているものをグループ化する-


id:nokuno:20100320に早くもレポートがあがってます。


さて、発表資料を見ながらRで復習をしてみます。

資料とは順番が前後しますが、アヤメのデータのクラスター分析を先にやってみます。
フィッシャーのアヤメのデータはWikipediaに載っているぐらい有名な古典的なデータセットです。
Iris flower data set - Wikipedia, the free encyclopedia


手法はウォード法で。

data(iris)
x <- iris[,1:4]
d <- dist(x)^2 # ここはユークリッド平方距離にしています
hc <- hclust(d, "ward")
plot(hc)
hc.cut <- cutree(hc, 3) # 三つのクラスタに分割
table(iris[,5], hc.cut) # クラスター分析の結果と品種とのクロス表
#            hc.cut
#              1  2  3
#  setosa     50  0  0
#  versicolor  0 49  1
#  virginica   0 15 35


発表資料ではユークリッド距離を使われていますが、群馬大青木先生の『Rによる統計解析』には「ウォード法と重心法を採用する場合にはユークリッド平方距離を使うべきである」とあるので、ここではユークリッド平行距離を使っています。
setosa と versicolor はばっちりですが、virginicaはいまいちですね。


クラスター分析手法の評価の指標として、エントロピー、純度、F尺度が紹介されました。Rのコードも紹介されているエントロピーと純度を試してみます。


エントロピー(Entropy)は重なり具合を表す。値が小さいほど結果が良好。
純度 (Purity)は正解クラスタをどの程度含むか。値が大きいほど結果が良好。


実験用に正解に近い例“X1”と上手くいっていない例“X2”を用意

X1 <- matrix(c(49,  0,  0,
                0, 49,  1,
                1,  1, 47), 3, byrow=TRUE)

X2 <- matrix(c(25, 12, 10,
               15, 25, 15,
               10, 13, 25), 3, byrow=TRUE)


まずは関数の定義

# エントロピーを算出する関数の定義
calcEntropy <- function(ct){
  - sum((apply(ct, 1, sum) / sum(ct))
  * apply(ct, 1, calcEntropy0)) / log(ncol(ct))
  }

calcEntropy0 <- function(pv){
  p1 <- pv / sum(pv)
  p2 <- p1[p1 != 0]
  sum(p2 * log(p2))
  }

# 純度を算出する関数の定義
calcPurity <- function(ct){
  sum(apply(ct, 1, max) / sum(ct))
  }


実験用データで試してみます。

# エントロピー
calcEntropy(X1)
# [1] 0.0900658
calcEntropy(X2)
# [1] 0.9424362

# 純度
calcPurity(X1)
# [1] 0.9797297
calcPurity(X2)
# [1] 0.5

なるほど。


最後はなにやらおかしな方向に話が行っていましたが……
ちょっとお話できるネタを探してみます。