<< トップページへ

<< 目次へ

最終更新日: 2008.11.26

主成分分析モデルの応用



 主成分分析モデルとは、潜在変数を従属変数として2変量以上の独立変数でそれを説明しようとする回帰分析モデルである。換言すれば、主成分分析は2つ以上の変数から、新たな1つの合成変数を作り出す手法といえる。すなわち、多変量データを集約し、より少ない次元で表現しようとするものである。

 観測変数X1, X2, ..., Xnがあったとき、新たに作られる合成変数Z1, Z2, ..., Znは次式によって表現される。

Z1 = w1X1 + w2X2 + ... + wnXn
Z2 = w1X1 + w2X2 + ... + wnXn


Zn = w1X1 + w2X2 + ... + wnXn

 主成分分析では新たに作られる合成変数のことを特に主成分という(これが主成分分析と呼ばれる"ゆえん"である)。また、上式が示すように、主成分分析ではn個の観測変数と同じ数の合成変数(主成分)が作成されることになる。そして、観測変数Xの係数wは、回帰分析における偏回帰係数と同じものであると考えればよく、合成変数Zを観測変数Xが説明する度合い(この度合いのことを"重み"という)のことである。

 まずは極端なデータセットを用いて、主成分分析を実際に行ってみることにしよう。表1は16人の被験者に対して、異性のパートナーを選ぶ際に重要だと考えられる4つの項目について、各項目10点満点で評価してもらったデータである。

表1 異性パートナーを選ぶ基準
被験者No. スタイル 話し方 態度
1 8 10 2 1
2 8 7 1 3
3 9 10 1 2
4 10 10 3 2
5 9 9 3 3
6 9 10 2 1
7 8 7 1 2
8 8 9 2 1
9 1 2 10 7
10 1 2 8 8
11 2 2 9 9
12 3 1 10 9
13 2 3 8 9
14 3 3 9 10
15 4 1 7 8
16 3 2 8 8

 Rには主成分分析を行うためにprcomp()とprincomp()という2つの関数が用意されている。どちらも大きな違いはないが、prcomp()はサンプルサイズが変数の数よりも少ない場合にも適用できる、という利点をもっている。また、prcomp()は計算時に不偏分散を用いるのに対して、princomp()では標本分散を用いている。両者に若干の違いはあるが、基本的にはどちらを使っても構わないだろう。

# 以下のようなデータフレームを用意しておく
> mydata
   face style talk response
1     8    10    2        1
2     8     7    1        3
3     9    10    1        2
4    10    10    3        2
5     9     9    3        3
6     9    10    2        1
7     8     7    1        2
8     8     9    2        1
9     1     2   10        7
10    1     2    8        8
11    2     2    9        9
12    3     1   10        9
13    2     3    8        9
14    3     3    9       10
15    4     1    7        8
16    3     2    8        8

# princomp()を使って主成分分析を行う
# 引数cor=TRUEは原データを標準化して解析することを指定するものである
> result <- princomp(mydata, cor=TRUE)

# summary()の引数にloadings=TRUEとすることで、主成分負荷量が出力される
> summary(result, loadings=TRUE)
Importance of components:
                          Comp.1     Comp.2     Comp.3     Comp.4
Standard deviation     1.9471673 0.30051060 0.28652740 0.19009186
Proportion of Variance 0.9478651 0.02257665 0.02052449 0.00903373
Cumulative Proportion  0.9478651 0.97044178 0.99096627 1.00000000

Loadings:
         Comp.1 Comp.2 Comp.3 Comp.4
face     -0.500         0.744 -0.434
style    -0.500  0.676 -0.111  0.530
talk      0.499  0.730        -0.466
response  0.501         0.659  0.560

 前述したように、主成分分析では観測変数の数と同じ数の合成変数が作成されることになるので、適当な数だけ合成変数を採用して、それ以降の合成変数は切り捨てる必要がある。その判断基準となるのがStandard deviation(標準偏差)とCumulative Proportion(累積寄与率)である。

 ここでいう標準偏差とは、合成変数の標準偏差のことであり、例えば、第1合成変数の標準偏差は1.95である。主成分分析では、作成される合成変数の分散が最大になるように重み(w)が計算されるので、この値が大きいほど"よい合成変数である"ということがいえる。判断の基準としては、大まかにいって1以上の合成変数を採用し、それ以下の合成変数を切り捨てるというのが一般的である。

 一方で累積寄与率もいくつの合成変数を採用するかの判断基準として役立つ。簡単にいえば、この累積寄与率とは第n番目までの合成変数がデータ全体を説明している割合のことである。慣例的に80%(0.80)という寄与率があれば、十分にデータ全体を説明していると判断される。したがって、今回の場合は第1番目の合成変数(Comp. 1)だけでも、すでにデータ全体の95%(0.95)を説明していることになるので、第2番目以降の合成変数は切り捨てればよいことになる。

 さて、Loadingsに記されている数値は合成変数を説明する各変数の重み(w)である。この重み(w)のことを、特に主成分負荷量というが、前述したように回帰分析における偏回帰係数に当たるものである。

 これにしたがって、第1番目の合成変数(第1主成分)は次のように表される。

Comp. 1 = - 0.500 * face - 0.500 * style + 0.499 * talk + 0.501 * response

 新たに作られた合成変数Comp. 1はどういった変数なのか分析者には分からない(そういう意味でこれを潜在変数と考えることができる)。主成分分析を行う際には、しばしば分析者がこの合成変数にラベルをつけることがある。例えば、「異性の判断基準値」などというラベルをつけることができるかもしれないし、「離婚の可能性」というラベルをつけることができるかもしれない。

 こういった合成変数のラベル付け(ラベリング)は分析者の主観によるものなので、どれほど妥当性のあるものであるか、なかなか難しいところである。というのも、原データが少し異なっているだけでも、全く異なった結果が得られることもあるので、あるケースでは全く別のラベリングがなされる可能性もあるのからである。いいかえれば、このケースでのラベリングは別のケースでは全く意味を持たないこともありえるということである。

 それでは第1主成分の解釈はどのようになるかを考えてみよう。変数face(顔)とstyle(スタイル)はいずれもマイナスの符号を持っているので、Comp. 1に対して負の効果をもたらしていることが分かる。逆に変数talk(会話)とresponse(態度)はプラスの符号を持っているので、Comp. 1に対して正の効果をもっているといえる。そしてこれら4つの変数の効果量はどれも同じ程度であることが分かる(どの変数の係数も約0.55である)。

 仮にComp. 1を「異性の判断基準値」としたならば、faceやstyleのように外見を重視する人はComp. 1の値はマイナス方向に大きな値をとるといえるだろう。それに対してtalkやresponseといった内面的な要素を重視する人はプラス方向に大きな値をとるだろうということが分かる。

 そこで主成分得点を求めてプロットしてみると、その傾向が顕著に見てとれる(図1)。主成分得点とは、回帰分析でいうところの予測値のようなものである。例えば、被験者No.1のデータ{face, style, talk, response} = {8, 10, 2, 1}の平均偏差値を第1合成変数の式に代入することによって被験者No.1の主成分得点が得られる。

 ただし、これは原データを標準化せずに主成分分析を行った場合にいえることである。今回の例では原データを標準化して行ったので、代入する値も標準化されたデータの平均偏差値でなくてはならない。これについては実際にやってみせないので、興味のあるものは多変量解析に関する参考書を読んでみるとよいだろう。

 Rでは次のようにして簡単に主成分得点を得ることができる(今回、見るべきなのはComp. 1の主成分得点のみである)。

> result$scores
         Comp.1       Comp.2       Comp.3      Comp.4
 [1,] -2.083127  0.178410538 -0.345297966  0.06772526
 [2,] -1.520295 -0.564240732  0.140169589  0.09191751
 [3,] -2.233419  0.009637521  0.085185142  0.23119187
 [4,] -2.101801  0.456844578  0.298651584 -0.16950473
 [5,] -1.663361  0.254115110  0.292568570 -0.01730910
 [6,] -2.237360  0.207204773 -0.115764737 -0.06619967
 [7,] -1.667161 -0.575879891 -0.052746896 -0.07208819
 [8,] -1.945785 -0.007163854 -0.314764236 -0.07800974
 [9,]  2.119832  0.235741999 -0.614528965 -0.24373271
[10,]  1.980847 -0.171031664 -0.405545693  0.18704467
[11,]  2.116406  0.078608140  0.008870628  0.08373961
[12,]  2.242441  0.131034393  0.260904194 -0.32930615
[13,]  1.836138  0.054976122 -0.013629709  0.36286044
[14,]  1.971697  0.304615927  0.400786611  0.25955538
[15,]  1.512567 -0.479429764  0.321621119 -0.22707927
[16,]  1.672382 -0.113443195  0.053520766 -0.08080518

 Comp. 1の主成分得点の様子をbarplot()で表してみると、各被験者の「異性の判断基準値」がよく分かる。どうやら被験者1〜8は外見を重視するタイプで、被験者9〜16は内面的な要素を重視するタイプだということがいえそうである。

> barplot(result$scores[,1])


図1 主成分得点のプロット

 以上のように、主成分分析は多変量データの情報を集約して、より低次元に視覚化すること(x軸とy軸でプロットすること)ができる。しかしながら、主成分分析の応用の仕方は単に2次元平面に集約されたデータをプロットするということに限らない。

 つづいて、今回の解析で得られた主成分得点を独立変数としてさらなる解析を行ってみよう。例えば、表1のデータに加えて、表2のようなデータが取られていたとしよう。

表2 異性パートナーを選ぶ基準と離婚の有無
被験者No. スタイル 話し方 態度 離婚の有無
1 8 10 2 1 1
2 8 7 1 3 1
3 9 10 1 2 1
4 10 10 3 2 0
5 9 9 3 3 1
6 9 10 2 1 0
7 8 7 1 2 1
8 8 9 2 1 1
9 1 2 10 7 0
10 1 2 8 8 1
11 2 2 9 9 1
12 3 1 10 9 0
13 2 3 8 9 0
14 3 3 9 10 0
15 4 1 7 8 0
16 3 2 8 8 0

 表2には「離婚の有無」という2値データ(有: 1, 無: 0)の変数が加えられている。これを従属変数とするならば、モデル式は

離婚の有無 = 異性パートナーの判断基準

と書くことができる。そしてこれは2値ロジットモデルである。つまり、異性パートナーの判断基準値によって離婚の有無の確率を求めるということをするわけである。

 Rのglm()でロジスティック回帰分析(2値ロジットモデル)を行ってみる。

# 離婚の有無
> divorce <- c(1,1,1,0,1,0,1,1,0,1,1,0,0,0,0,0)

# 第1主成分得点
> partner <- result2.2$scores[,1]

# glm()でロジットモデル解析
> logit.model <- glm(divorce ~ partner, binomial)

# 係数表の出力(一部の結果を省略してある)
> summary(logit.model)

Coefficients:
              Estimate Std. Error z value Pr(>|z|)  
(Intercept)  0.0004431  0.5600355   0.001   0.9994  
partner     -0.5006489  0.2895561  -1.729   0.0838 .

# 予測確率の出力
> fitted(logit.model)
        1         2         3         4         5         6         7         8 
0.7394975 0.6816961 0.7537293 0.7412945 0.6970318 0.7540953 0.6974334 0.7260351 
        9        10        11        12        13        14        15        16 
0.2571473 0.2706621 0.2574751 0.2455974 0.2851989 0.2715674 0.3193367 0.3022021

 ロジスティック回帰分析において、成功の確率(今回のケースでは離婚有の確率となる)は

f(X) = exp(α + βX) / (1 + exp(α + βX))

という関数によって求められるのであった(これが関数fitted()で得られた値である)。

 ここでx軸にpartnerを、y軸に予測確率として散布図を描いてみると、図2のようなグラフが描かれる。これを見ると明らかだが、異性パートナーの判断基準値が小さいほど(外見を重視する人ほど)離婚をしている確率が高く、判断基準値が大きいほど(内面的な要素を重視する人ほど)離婚をしている確率が低くなっていることがわかる。


図2 異性パートナーの判断基準値と予測確率


参考文献