今週のテーマは クラスタリング です。
多変量解析とは,要約すること,まとめあげること,でもあるわけです。 まとめたものを同じ「クラスター」に入れる。これを機械的にするのがクラスタリングです。
基本は似ているもの同士をまとめていきます。
数字と数字が似ている=距離が近い,です。距離は引き算で出します。データで見ていきましょう。アイリスデータです。
data(iris)
head(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
Sepal.Length(顎の長さ)に注目します。
iris[1,1] #case1,1列目
## [1] 5.1
iris[2,1] #case2,1列目
## [1] 4.9
iris[3,1] #case3,1列目
## [1] 4.7
iris[1,1]-iris[2,1] #case1とcase2の距離
## [1] 0.2
iris[2,1]-iris[3,1] #case2とcase3の距離
## [1] 0.2
iris[1,1]-iris[3,1] #case1とcase3の距離
## [1] 0.4
これをみると,case1-2の距離はcase1-3より近い。
こうした組み合わせをひとつずつ計算するのは面倒だけど,dist関数を使うと簡単。
dist(head(iris[,1])) #1列目について,最初の6行分だけ,距離を計算する
## 1 2 3 4 5
## 2 0.2
## 3 0.4 0.2
## 4 0.5 0.3 0.1
## 5 0.1 0.1 0.3 0.4
## 6 0.3 0.5 0.7 0.8 0.4
こうして,近い方から「これは同じクラスタだね」とまとめていく。例えばcase1とcase5は距離が0.1しかないから同じクラスタにする。簡単ですね。
顎の長さだけでなく,顎の幅も考えたい,というときは,ユークリッド距離を算出する。
dist(head(iris[,1:2]))
## 1 2 3 4 5
## 2 0.5385
## 3 0.5000 0.2828
## 4 0.6403 0.3162 0.1414
## 5 0.1414 0.6083 0.5000 0.6403
## 6 0.5000 1.0296 0.9899 1.1314 0.5000
変数が三つ以上になっても基本的に同じである。 ### 距離を順にまとめていく。 まとまったclusterをAとする。次は,cluster Aとcase2,3,4,6はどこが近いかな?あるいは他のクラスターB(case4と3とか)との距離は?ということを考えることになる。 まとめ方は色々ある。
顎の長さデータをつかって,階層的クラスター分析をやってみよう。
kyori <- dist(iris[,1])
result.cl <- hclust(kyori,method="ward.D2") #ward法
plot(result.cl)
このような図をデンドログラムという。これを見ながら,いくつのグループに分けるかを考える。
4つのグループかしら?というあたりをつけたら,カットする。
cutree(result.cl,4)
## [1] 1 1 1 1 1 2 1 1 1 1 2 1 1 1 2 2 2 1 2 1 2 1 1 1 1 1 1 1 1 1 1 2 1 2 1
## [36] 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 4 3 2 4 2 4 1 4 1 1 4 4 4 2 4 2 2 4 2
## [71] 4 4 4 4 4 4 3 4 4 2 2 2 2 4 2 4 4 4 2 2 2 4 2 1 2 2 2 4 1 2 4 2 3 4 4
## [106] 3 1 3 4 3 4 4 3 2 2 4 4 3 3 4 3 2 3 4 4 3 4 4 4 3 3 3 4 4 4 3 4 4 4 3
## [141] 4 3 2 3 4 4 4 4 4 4
これって,種類の違いと関係あるかしら?
iris$CLUST <- cutree(result.cl,4)
xtabs(~Species+CLUST,data=iris)
## CLUST
## Species 1 2 3 4
## setosa 40 10 0 0
## versicolor 5 19 3 23
## virginica 1 5 17 27
イマイチかも。データを全部使ってみる。
kyori2 <- dist(iris[,1:4])
result.cl2 <- hclust(kyori2,method="ward.D2")
plot(result.cl2)
3クラスタにしてみようかなー?
iris$CLUST2 <- cutree(result.cl2,3)
xtabs(~Species+CLUST2,data=iris)
## CLUST2
## Species 1 2 3
## setosa 50 0 0
## versicolor 0 49 1
## virginica 0 15 35
そこそこ当てはまった,といえるだろうか。
今回は「種の違い」という正解があったので検証することができたが,探索的な研究ではそうした正解がない。 とりあえず多くのデータがあって困っているときに,いくつかのグループに分けて,グループごとの平均や相関などをみて,このクラスターはこういう特徴だったのだと事後的に解釈することが少なくない。そのために,検定や群ごとのモデリングをしたりする。
次の分析をしてみよう。
t(head(iris[,1:4])) # tは転置(縦横ひっくり返す)を意味する
## 1 2 3 4 5 6
## Sepal.Length 5.1 4.9 4.7 4.6 5.0 5.4
## Sepal.Width 3.5 3.0 3.2 3.1 3.6 3.9
## Petal.Length 1.4 1.4 1.3 1.5 1.4 1.7
## Petal.Width 0.2 0.2 0.2 0.2 0.2 0.4
kyori3 <- dist(t(iris[,1:4]))
result.cl3 <- hclust(kyori3,method="ward.D2")
plot(result.cl3)
これは変数同士,似ているものを分けたことになる。顎(Sepal)の幅と花弁(Petal)の長さは似ているということ。
つまり,多くのケースをまとめあげるもよし,多くの変数をまとめあげるもよし,ということである。 多変量解析とはまとめあげることであり,データに対して特に複雑なメカニズムを仮定しないクラスター分析は最も簡単な分類法のひとつと言えるだろう。