このページはまだ書きかけです


*はじめに [#l1e65d6c]



*準備 [#j4c98aa4]

データ
#geshi(rsplus){{
> data(iris)
}}

*主成分分析 [#o8b5e7da]

主成分分析は,''多変量解析''の一手法で,高次元の数値データに対して合成成分を作る手法です.

この合成成分のことを''主成分''といい,次のように表されます.
\[ \begin{array}{c@{}c@{}c} z_1 &=& a_{1,1} x_{1} + a_{1,2} x_{2} + \dots + a_{1,p} x_{p} \\ z_2 &=& a_{2,1}  x_{1} + a_{2,2} x_{2} + \dots + a_{2,p} x_{p} \\ \vdots & & \\ z_p &=& a_{p,1} x_{1} + a_{p,2} x_{2} + \dots  + a_{p,p} x_{p} \end{array} \]
ここで,[math]z_1[/math] を第1主成分,[math]z_2[/math] を第2主成分,つまり,[math]z_i[/math] を第 [math]i[/math] 主成分といいます.

次元数が [math]p[/math] のとき,主成分は [math]p[/math] 個できます.
このうちの第1主成分からいくつかだけを使ってデータを表現できないかということを考えます.

例として,次のような2次元のデータを考えてみます.
#ref(pca_0.png,nolink,50%)

2次元の場合,主成分(合成成分)は次のようになります.
(図では変数が [math]x[/math], [math]y[/math] になっていますが,これを [math]x_1[/math], [math]x_2[/math]とします.)
\[ \begin{array}{c@{}c@{}c} z_1 &=& a_{1,1} x_{1} + a_{1,2} x_{2} \\ z_2 &=& a_{2,1}  x_{1} + a_{2,2} x_{2} \end{array} \]

このデータは2変数で表現されていますが,これを第1主成分だけで表現するとしたら,どのように第1主成分を選ぶ,つまり,どのように第1主成分の係数 [math]a_{1,1}[/math], [math]a_{1,2}[/math] を選ぶのがいいのかを考えます.

合成成分である第1主成分だけでデータを表現するということは,データを1次元で表現するということですから,データから第1主成分を表す直線に垂線を下ろし,その値でデータを表現するということになります.

下の図のように,データから第1主成分である直線に垂線を下ろしたときに同じような場所になってしまう,つまり,分散が小さいのはよくありません.
#ref(pca_2.png,nolink,50%)

逆に,下の図のように,データから第1主成分である直線に垂線を下ろしたときにバラツキが大きくなる,つまり,分散が大きくなるほうが,データを良く表していると考えます.
#ref(pca_1.png,nolink,50%)

そこで,垂線を下ろしたときに分散が最も大きくなる直線を第1主成分とします.

第2主成分は,第1主成分と直行する直線の中で,データから垂線を下ろしたときに分散が最も大きくなる直線とし,以後同様に,第 [math]i+1[/math] 成分は第 [math]i[/math] 主成分と直行する直線の中で,データから垂線を下ろしたときに分散が最も大きくなる直線とします.
最後の主成分である第 [math]p[/math] 主成分は,選ぶことができずに決まります.

今回の例は2次元なので,第2主成分は第1主成分に直行する直線に決まってしまい,下の図のようになります.
#ref(pca_3.png,nolink,50%)

主成分を求めるには,まず各変数を平均0,標準偏差1に正規化し,分散共分散行列の''固有値''と''固有ベクトル''を求めます.
分散共分散行列は [math]p \times p[/math] 正方行列なので,固有値は [math]p[/math] 個求まり,大きい順に [math]\lambda_1[/math], [math]\lambda_2[/math], [math]\dots[/math], [math]\lambda_p[/math] とすると,[math]i[/math] 番目の固有値 [math]\lambda_i[/math] が第 [math]i[/math] 主成分の分散になります.

ある固有値を固有値全部の合計で割った値を''主成分寄与率''といいます.
つまり,第 [math]i[/math] 主成分の寄与率は以下の式で表されます.
\[ \frac{\lambda_i}{\sum_{j=1}^{p} \lambda_{j}} \]
固有値は分散を表していますから,寄与率は主成分全体の分散のうちその主成分の分散の割合を表しています.

また,主成分全体の分散のうち第1主成分から第 [math]i[/math] 主成分までの分散の和の割合を''累積寄与率''といい,以下の式で表されます.
\[ \frac{\sum_{j=1}^{i} \lambda_j}{\sum_{j=1}^{p} \lambda_{j}} \]
この累積寄与率が0.8あればいいとか,0.9あればいいというように決めて,どこまでの主成分を採用するかを決めます.

上の例では,第1主成分の分散は約1.96,第2主成分の分散は0.04です.
したがって,第1主成分の寄与率は約0.98,第2主成分の寄与率は0.02です.
また,累積寄与率は,第1主成分までで約0.98,第2主成分までで1となります.

ここで,累積寄与率が0.9まででいいとするなら,第2主成分は採用せずに第1主成分だけでデータを表現してもいいことになります.
当然のことですが,情報量は落ちるので注意が必要です.



*主成分分析を実行する [#xcf07f9a]
主成分分析を実行
#geshi(rsplus){{
> iris.pc <- princomp(~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width, data=iris, cor=T)
}}

主成分分析の結果
#geshi(rsplus){{
> iris.pc
Call:
princomp(formula = ~Sepal.Length + Sepal.Width + Petal.Length + 
    Petal.Width, data = iris, cor = T)

Standard deviations:
   Comp.1    Comp.2    Comp.3    Comp.4 
1.7083611 0.9560494 0.3830886 0.1439265 

 4  variables and  150 observations.
}}

固有ベクトル
#geshi(rsplus){{
> unclass(loadings(iris.pc))
                 Comp.1      Comp.2     Comp.3     Comp.4
Sepal.Length  0.5210659 -0.37741762  0.7195664  0.2612863
Sepal.Width  -0.2693474 -0.92329566 -0.2443818 -0.1235096
Petal.Length  0.5804131 -0.02449161 -0.1421264 -0.8014492
Petal.Width   0.5648565 -0.06694199 -0.6342727  0.5235971
}}

固有値
#geshi(rsplus){{
> iris.pc$sd^2
    Comp.1     Comp.2     Comp.3     Comp.4 
2.91849782 0.91403047 0.14675688 0.02071484 
}}

因子寄与率(主成分寄与率)
#geshi(rsplus){{
> iris.pc$sd^2/sum(iris.pc$sd^2)
     Comp.1      Comp.2      Comp.3      Comp.4 
0.729624454 0.228507618 0.036689219 0.005178709 
}}

因子負荷量(主成分負荷量)
#geshi(rsplus){{
> t(iris.pc$sd * t(iris.pc$loadings))[, drop=F]
                 Comp.1      Comp.2      Comp.3      Comp.4
Sepal.Length  0.8901688 -0.36082989  0.27565767  0.03760602
Sepal.Width  -0.4601427 -0.88271627 -0.09361987 -0.01777631
Petal.Length  0.9915552 -0.02341519 -0.05444699 -0.11534978
Petal.Width   0.9649790 -0.06399985 -0.24298265  0.07535950
}}
tは行列などを転置する関する,drop=F は行列と表示するオプション.

*主成分分析の結果をグラフに表示する [#abbae3e6]
#geshi(rsplus){{
> biplot(iris.pc)
}}
#ref(pca.png,nolink,50%)

*主成分スコアを求める [#ea60779f]
データの行列と固有ベクトルの内積を求める
#geshi(rsplus){{
> data.matrix(iris[,c(1,2,3,4)]) %*% unclass(loadings(iris.pc)[,c(1,2)])
}}
%*% は行列の積.

これをグラフにプロットする.
#geshi(rsplus){{
> plot(data.matrix(iris[,c(1,2,3,4)]) %*% unclass(loadings(iris.pc)[,c(1,2)]))
}}
#ref(pc.png,nolink,50%)
トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS