第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
なるほど。
最後はなにやらおかしな方向に話が行っていましたが……
ちょっとお話できるネタを探してみます。