第10回(12月24日) Task Check and Weekly Assignment
課題 □バッターのデータを使ってクラスター分析をし,クラスターの特徴を描写してください。
前回の「MDS」から少し話を進める。
アヤメのデータがプロットされるのは示した通り。
data(iris)
summary(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min. :4.30 Min. :2.00 Min. :1.00 Min. :0.1
## 1st Qu.:5.10 1st Qu.:2.80 1st Qu.:1.60 1st Qu.:0.3
## Median :5.80 Median :3.00 Median :4.35 Median :1.3
## Mean :5.84 Mean :3.06 Mean :3.76 Mean :1.2
## 3rd Qu.:6.40 3rd Qu.:3.30 3rd Qu.:5.10 3rd Qu.:1.8
## Max. :7.90 Max. :4.40 Max. :6.90 Max. :2.5
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
head(iris[, -5]) #ラベルの部分を除く記法
## 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
iris.dist <- dist(iris[, -5], method = "euclidean")
iris.cmd <- cmdscale(iris.dist)
plot(iris.cmd, type = "n")
text(iris.cmd, labels = iris[, 5], col = unclass(iris[, 5]))
これがわかりやすいのは,「確かに三つの種類に分かれてるねえ」ということがわかるからであり,これがわかるのは図を見て(主観的に)そう思うだけになっている。 そこで,この分類の結果をもう少し客観的に表現することを考える。分類をこなす統計技法はクラスター分析である。 クラスター分析は階層的なものとそうでないもの(非階層的)の二種類がある。いずれも変数間の距離行列を使う。 まずは階層的クラスター分析から。
result.hcl <- hclust(iris.dist, method = "ward")
plot(result.hcl)
プロットされた「デンドログラム」をみて,(主観的判断は残るが),三つのグループがいいんじゃないかと思ったりする。 では,データを三つのグループに分けてみよう。
result.hcl.cut <- cutree(result.hcl, 3)
xtabs(~result.hcl.cut + iris$Species)
## iris$Species
## result.hcl.cut setosa versicolor virginica
## 1 50 0 0
## 2 0 50 14
## 3 0 0 36
ほぼ間違いなく分類されていることがわかる。
非階層的なクラスタリングはkmeans法が有名である。詳しくは http://tech.nitoyon.com/ja/blog/2009/04/09/kmeans-visualise/ や http://www.cs.osakafu-u.ac.jp/hi/honda/k-means.htm を参照のこと。コードは至って簡単。
result.kmeans <- kmeans(iris.dist, 3)
xtabs(~result.kmeans$cluster + iris$Species)
## iris$Species
## result.kmeans$cluster setosa versicolor virginica
## 1 0 1 37
## 2 50 0 0
## 3 0 49 13
少し精度は落ちているが,sentosaとversicolorについてはほぼ問題ないレベルだろう。kmeans法はデータが大量になっても分析に耐える実行制度を持っているので,大規模調査の時等に用いられやすい。ただし,事前に分けるクラスターの数を決めておかなければならないことに注意である。 ちなみに,ふたつのクラスター分析の比較をしてみると次のようになる。
xtabs(~result.hcl.cut + result.kmeans$cluster)
## result.kmeans$cluster
## result.hcl.cut 1 2 3
## 1 0 50 0
## 2 2 0 62
## 3 36 0 0
?hcるstこれらクラスター分析で示したのは,類似度行列からの分類である。これができるようになると,複数のパターンを含んでいるかもしれないデータ群を切り分けて,グループ毎に適切なモデルを書く(多母集団同時分析等)ことができるようになる。データが一枚岩でない可能性がある時は,試してみても良いかもしれない。
クラスター分析は行方向にも列方向にも応用することができ,距離行列だけでなく相関行列を対象にした分類をしてもよい。ひとまず分類することによって,大規模データを小包に分解してから詳細に検討する,といった用途に使うことができる。
以下,課題の参考までに。
batter <- read.csv("base_bat.csv")
batter.dist <- dist(batter)
result.hcl <- hclust(batter.dist, method = "ward")
plot(result.hcl)
batter$clust <- cutree(result.hcl, 3)
table(batter$clust)
##
## 1 2 3
## 30 9 18