Rについて
をベースに学んでいく。
今回はクラスター分析(PP.106-125)を扱う。
9. クラスター分析
データ構造の側面から似ている個体(変数)を同じグループに仕分けて分類を行う方法のうち、データのパターンが似ている個体を同じグループにまとめる分析手法がクラスター分析である。どの個体がどのグループに属するかに関する事前情報を用いずにグルーピングする教師無し学習の1つである。
クラスタリングは類似性という基準に基づいてデータをグループ化する手法であり、個体間の関係を理解するのに有用な手法である。
9.1 階層的クラスター分析
個体間(とクラスター間)の類似度(または距離)に基づいて最も似ている個体から順に集めてクラスター(集団)を作成する方法を階層的クラスター分析という。階層的クラスター分析においてクラスターがつくられる様子は樹形図(デンドログラム)と呼ぶ。
(1) | データから距離(または類似度)を計算する。 | |
(2) | クラスター分析の手法を選択する。 | |
(3) | 選択された方法のコーフェン(cophenetic)行列を求める。 | |
(4) | コーフェン行列に基づいて樹形図を作成する。 | |
(5) | 結果を検討する。 |
階層的クラスター分析は、データから距離行列を求め、距離行列からcophenetic行列を求める。そしてcophenetic行列に基づいて樹形図を描く。
データ行列 |
距離行列 |
cophenetic行列 |
結果 |
|||
樹形図を描く |
距離行列からcophenetic行列を生成する方法はいくつかある。第1段階はすべて同じで、最も距離が近い2つの個体間の距離をcophenetic距離とする。この後新たにcophenetic距離を求める方法はクラスター分析の方法によって異なる。
9.1.2 クラスター間距離
データ集合間における任意のデータ間の距離を求めた後、最も距離の小さい個体同士で1つのクラスターを形成する。するとクラスターと各個体との距離およびクラスター間の距離を定義する必要がある。
いま観測された個体の次元データをとし、このを分類対象とする。データ集合に含まれる任意の個体に対して
とする。この個体間距離に基づいて形成された2つのクラスターをとする。このとき
(1) | 最短距離法 | 2つのクラスターに含まれる任意の個体間の距離のうち最も小さいものをそのクラスター間距離とする。すなわちとする。 | |
(2) | 最長距離法 | 2つのクラスターに含まれる任意の個体間の距離のうち最も大きいものをそのクラスター間距離とする。すなわちとする。 | |
(3) | 群平均法 | 2つのクラスターに含まれるすべての個体間距離の平均値をクラスター間の距離とする。すなわちとする。 | |
(4) | 重心法 | クラスターの標本平均ベクトル間の距離をクラスター間の距離とする。すなわちである。 | |
(5) | メディアン法 | 重心法と同様に重心を決定する。ただし合成したクラスターの重心を中点とする。 |
といった方法がある。最短距離法や最長距離法、群平均法では任意の距離を利用できる一方で、重心法やメディアン法では(平方)Euclid距離に限られる。
9.1.3 Ward法
クラスタリングにおいてデータの散らばりを定量的に測る指標に基づいて逐次クラスターを形成する分類法で(平方)Euclid距離に基づく方法をWard法という。
(1) | 各クラスター内のデータが1個*2の段階において散らばりの尺度とする。 | |
(2) | 散らばりの尺度が最も小さくなるような2つのクラスターを融合させて、クラスターの数を1つ減らす。 | |
(3) | クラスターの数が1つならば終了させる。そうでなければ(2)に戻る。 |
1次元データ集合をWard法で融合していくことを考える場合、偏差平方和
を用いる。いまが個のクラスター
に分割されたとする。このとき各クラスター内の偏差平方和を、クラスターに所属する個体数をとすれば、
で計算し、クラスター内全偏差平方和を
で定義する。ウォード法では2つのクラスター
があったときにこれらを融合したの偏差平方和をとして
で融合の水準を定義する。この融合の水準が最も小さいものを融合させる。
分類対象が個の次元データ集合からなるときは、基本的に偏差平方和行列
を用いて定義する。このとき
のいずれかで測ることができる。前者は偏差平方和の総和であり、後者は一般化分散と呼ばれる。
いまが個のクラスター
に分割されたとする。このとき各クラスター内の偏差平方和行列をとすれば、
で散らばりを計算し、クラスター内全体の散らばりを
で定義する。各クラスターが1つのデータから成る初期状態ではとする。
2つのクラスター
があったときにこれらを融合したの偏差平方和をとして
で融合の水準を定義する。この融合の水準が最も小さいものを融合させる。
9.2 非階層的クラスター分析
階層的クラスター分析は個体数が多いと計算量が膨大になるため、大量のデータの解析には向いていない。大規模データには非階層的クラスター分析が用いられる。代表的なのは-法である。
(1) | 個のクラスターに対して中心の初期値を適当に与える。 | |
(2) | すべてのデータについて個のクラスター中心との距離を求め、各データを最も近いクラスターに分類する。 | |
(3) | 形成されたクラスターの中心を求め直す。 | |
(4) | (3)において計算し直した中心がその前の値から変わらないのであれば終了、そうでなければ(2)に戻る。 |
9.3 モデルに基づいたクラスター分析
混合分布によるクラスター分析、潜在クラスター分析と呼ばれる。観測データが異なる確率分布による混合分布に従うと仮定し、個体が属するクラスのラベルを隠れた変数として推定する。理論上は確率分布の指定が無いものの、現状では楕円分布(正規分布をより一般化したもの)を用いる。
9.3.1 混合正規モデルを用いたクラスター分析
混合比率を用いて
という確率モデルを考えたとき、これを混合正規モデルという。より一般に複数の確率分布の線形結合で表される確率分布を混合分布モデルという。
統計学の枠組みに基づくと、混合分布モデルに基づきデータの分類ができる。第番目の群を特徴づける混合分布とする。これはデータが第群から生成されたとする場合の条件付き尤度と言える。また対応する混合比率は、その群を選択する事前確率と解釈できる。そこでの定理から、データが群から生成されたという事後確率は
で与えられる。そこで、混合分布モデルが推定できれば、個の事後確率の中でその値が最も大きい群にデータに属するとする。このように分類の対象とするデータでモデルを推定し、事後確率最大化により各データを分類すればよい。
9.3.2 EMアルゴリズムによるモデル推定
混合分布モデルの母数推定にはアルゴリズムをはじめとする数値的な最適化法を用いる。
混合比率、平均ベクトルおよび分散共分散行列に対して初期値を設定する。また事前に収束判定条件としてを定めておく。
- とし、初期値を設定する。
- 番目のデータが群から生成されたという事後確率を計算する。
- とし、それに対応する混合比率、平均ベクトルおよび分散共分散行列をで更新する。
- 観測データに基づく尤度関数についてが以下ならばステップを終了する。そうでなければ2.に戻る。
ここまで、混合分布モデルの成分数を固定した上でモデルを推定してきた。このがクラスター数に相当する。その決定は、として赤池情報量基準やベイズ情報量基準によって評価・選択する方法がある。
9.4 Rでのケーススタディ
###################### ### クラスター分析 ### ###################### library(ggplot2) library(MASS) # データの準備 df_scores <- data.frame("arithmetics" = c(89,57,80,40,78,55,90), "science" = c(80,70,90,60,85,65,85), "japanese" = c(67,80,35,50,45,80,88), "english" = c(46,85,40,45,55,75,92), "socialstudy" = c(50,90,50,55,60,85,95)) row.names(df_scores) <- c("田中","佐藤","鈴木","本田","川端","吉野","斎藤") ### 階層的クラスター分析 df_scores_dist <- dist(df_scores, method = "euclid") ls_clust <- hclust(d = df_scores_dist, method = "ward.D") summary(ls_clust) #クラスター形成の履歴: (個体数-1)行2列 # 行番号:クラスター形成の順番 ls_clust$merge # 樹形図の枝の長さ ls_clust$height # デンドログラムを図示 plot(ls_clust) plot(ls_clust,hang = -1) rect.hclust(ls_clust, k =2, border = c(2,4)) cutree(tree = ls_clust,k = 2) # 所属するクラスター # ヒートマップでの各クラスの特徴分析 heatmap(as.matrix(df_scores)) # cophenetic行列の確認 cophenetic(ls_clust) # 妥当性確認:距離行列とcophenetic行列の相関係数を見る cor(df_scores_dist,cophenetic(ls_clust)) ### 非階層的クラスター分析 # k-means法 km_scores <- kmeans(df_scores,2) summary(km_scores) km_scores$cluster # 分類されたクラスター ### モデルに基づいたクラスター分析 library("mclust") data(iris) # まずは指定するクラスター数を推計する mclust_BIC_iris <- mclustBIC(iris[,-5]) plot(mclust_BIC_iris) # mclustではBICが「大きい」方を良いものとする=通常と逆 colnames(mclust_BIC_iris)[which(mclust_BIC_iris[3,]==max(mclust_BIC_iris[3,],na.rm = F))] # NoC=3で一番BICが大きいモデル # ただしhcにVEVが無いため、2番目を用いる iris_hc <- hc(modelName = colnames(mclust_BIC_iris)[which(mclust_BIC_iris[3,]==max(mclust_BIC_iris[3,-12],na.rm = F))], data = iris[,-5]) iris_hcl <- hclass(iris_hc,3) table(iris[,5],iris_hcl) clPairs(data = iris[,-5],cl = iris_hcl)