1.0000>この相関行列から、固有値と固有ベクトルを求めてみる。eigen()関数を使う。これで相関行列のスペクトル分解が一瞬で行われる。0.5326次に、主成分分析を実行してみる。べつに上記の固有値分解を先にやっておかなくても分析は行える。これで、主成分にかかる固有ベクトルが分かる。0.5326この、Rotationというところは固有ベクトルをタテに束ねた行列であり、主成分負荷量ではない点に注意が必要である。PC1という列にタテに並んでいる数字は、各科目の得点を合成して第1主成分を表すときの、各変数の重み(係数)を表している。この表は、「タテに見る」ことが多いものだと気をつけること。いうのも、因子分析だと因子負荷行列を出力するが、あれはだいたいヨコに見るものなので混同しないようにしないといけないわけである。ちなみに、主成分分析をprincomp()という関数で実行することもできるのだが、こちらは固有ベクトルをタテに束ねた行列が「$loadings」という要素に入っているので、なおさら、因子負荷量(主成分負荷量)のことかと勘違いしやすい。1.00さてprcomp()の結果に戻る。これで、寄与率と累積寄与率もみることができる。1.00000>これで、第2主成分までみれば、全体の情報量の98.6%が説明できることがわかる。つぎに主成分得点を表示してみる。これで主成分得点がみれる。-0.089856主成分得点というのは、各サンプルが、主成分PC1〜PC4に対して持っている値であり、言ってみればPC1〜PC4が座標軸だった場合の、それぞれの軸に関する座標である。(この場合、4次元空間になるので図示できないが。)で、たとえば「サンプル番号1」の人のPC1〜PC4に対する主成分得点と、各主成分に含まれる「国語」の係数(重み)、つまりさっきの$rotationの値をかけ算して合計すると、サンプル番号1の人の国語の得点を標準化した値になる。検算のためにやってみる。scale()関数はデータを標準化する関数。標準化した成績表の1行1列の値を取ってる。0.9541prcomp()関数を使うときの注意点さて、Rのprcomp()関数を使うときの注意点として、さしあたり私が学んだことが3つある。1つは既に述べたとおり、主成分の固有ベクトルが出力されている表を主成分負荷量と間違えないことだ。2つ目は「標準化」をするようにきちんと設定するということで、3つ目は、主成分得点の計算アルゴリズムが他の関数と異なるということである。以下、2つ目と3つ目についてメモっておく。prcomp()はデフォルトでは、データを標準化しないで分析を行う。出発する場合の2種類があると言われる場合の、後者のパターンである。標準化するのであれば、scaleという引数にscale=TRUEを設定しないといけない。さきほどの計算時には、TRUEを設定しておいた。これのデフォルト値がFALSEになっているので、そのままだと標準化されない。問題は、青木先生の掲示板(このスレッド)でも述べられているように、標準化しなくても良いケースなんて、実際にはほとんど無いということである。尺度(単位)が同じで等分散でなければならないからだ。そんな、実務的に有り得ない仮定を置くぐらいだったら、最初から標準化するのを基本にしておけばいいはずである。scale.つまり、S言語(R言語のもとになった、古い言語)のときにデフォルト値はFALSEになっていたので、それを引きずってますが、基本的にはTRUEにしとくのがオススメですよとわざわざ書いてある。主成分分析の結果に関する注意点としては、下記のページに関数間の比較として詳しい解説がのってるのだが、ここで3つ目の問題が解説されてる。RjpWiki標準化するしないは単に設定すればすむ問題だが、主成分得点を求める際に、主成分得点の不偏分散が固有値に一致するように計算される(prcomp関数)か、主成分得点の標本分散が固有値に一致するように計算される(princomp関数)かという違いがあるようである。R、Pythonの勉強の過程をメモっていくノートです。初心者なのであまり信用なさらぬよう。間違いについてはコメント等でご指摘頂ければ幸いです。(1)月別アーカイブつぶやき@statsbeginnerさんのツイートはてなブログをはじめよう!midnightseminarさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。