今週のテーマは クラスタリング です。

多変量解析の基本

多変量解析とは,要約すること,まとめあげること,でもあるわけです。 まとめたものを同じ「クラスター」に入れる。これを機械的にするのがクラスタリングです。

どうやってまとめるか

基本は似ているもの同士をまとめていきます。

似ているって何

数字と数字が似ている=距離が近い,です。距離は引き算で出します。データで見ていきましょう。アイリスデータです。

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とか)との距離は?ということを考えることになる。 まとめ方は色々ある。

  • 最も近いもの同士をまとめる 最近隣法
  • 最も遠いもの同士をまとめる 最遠隣法
  • 二つのクラスターを統合したときに差がハッキリ別れるようにする ward法

順次まとめて束ね上げていく

顎の長さデータをつかって,階層的クラスター分析をやってみよう。

kyori <- dist(iris[,1])
result.cl <- hclust(kyori,method="ward.D2") #ward法
plot(result.cl)

plot of chunk unnamed-chunk-5

このような図をデンドログラムという。これを見ながら,いくつのグループに分けるかを考える。

カットしてから考える

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)

plot of chunk unnamed-chunk-8

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)

plot of chunk unnamed-chunk-10

これは変数同士,似ているものを分けたことになる。顎(Sepal)の幅と花弁(Petal)の長さは似ているということ。

つまり,多くのケースをまとめあげるもよし,多くの変数をまとめあげるもよし,ということである。 多変量解析とはまとめあげることであり,データに対して特に複雑なメカニズムを仮定しないクラスター分析は最も簡単な分類法のひとつと言えるだろう。

本日の課題

  • 先週のサンプルデータをつかって,100人のサンプルをクラスター分析しなさい。
  • 分類されたクラスターはどういう特徴をもっているか,記述統計量や統計的検定をして説明しなさい。