第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]))

plot of chunk unnamed-chunk-1

これがわかりやすいのは,「確かに三つの種類に分かれてるねえ」ということがわかるからであり,これがわかるのは図を見て(主観的に)そう思うだけになっている。 そこで,この分類の結果をもう少し客観的に表現することを考える。分類をこなす統計技法はクラスター分析である。 クラスター分析は階層的なものとそうでないもの(非階層的)の二種類がある。いずれも変数間の距離行列を使う。 まずは階層的クラスター分析から。

result.hcl <- hclust(iris.dist, method = "ward")
plot(result.hcl)

plot of chunk unnamed-chunk-2

プロットされた「デンドログラム」をみて,(主観的判断は残るが),三つのグループがいいんじゃないかと思ったりする。 では,データを三つのグループに分けてみよう。

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)

plot of chunk unnamed-chunk-6

batter$clust <- cutree(result.hcl, 3)
table(batter$clust)
## 
##  1  2  3 
## 30  9 18