科学の箱

科学・IT・登山の話題

R

主成分分析

投稿日:2014年1月16日 更新日:

pca_excel02Rで提供されているirisを使って主成分分析を実施する。

主成分分析の手順

  • データが分離できるか検証する
  • 主成分負荷量と寄与率を求める
  • 新しい変数に名前を付ける
  • 変量プロット
  • 主成分プロット

今回はRで提供されているirisを使う。主成分分析の前段階である検証はRで実施するが主成分分析の実行はエクセルのソルバーを用いる。

主成分分析を数学的に解く手順

  • 制約条件 / 分散最大
  • ラグランジェの解法
  • 固有値問題への帰結
  • 累乗法
  • 固有値
  • 固有値を主成分の分散に変換

主成分分析のメモ

  • 主成分分析で求めるのは主成分負荷量。求められた主成分負荷量が採用できるかは寄与率で判断する。
  • 寄与率は 主成分の分散 / トータルの分散 で求める。
  • 主成分には分散が大きな変数が寄与するので、各変数の分散を求めれば主成分負荷量の大きさについてある程度目安が立つ。
  • 主成分負荷量が求められたら、その大きさによって名前付けを行う。名前付けをすればその変数が求められた背景が理解できる。

データの検証

irisデータを読み込み、それぞれのデータについて相関を見てみる。

> 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
> str(iris)'data.frame':   150 obs. of  5 variables: 
$ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... 
$ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... 
$ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... 
$ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... 
$ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
> pairs(iris[1:4], main="Iris", pch=19, col=as.numeric(iris$Species)+1)

iris

データをエクセルで取り扱るようにcsvで出力

> getwd()
[1] “C:/Users/UserA/Documents”
> write.table(iris, “iris.csv”, sep=”,”)

エクセルによる主成分分析

主成分分析表を作成

データを取り込みソルバーで分析するための準備をする。

pca_excel02

  • 主成分負荷量の初期値
    C2:F2は主成分負荷量を設定する。あらかじめ0.5に設定しておく。
    この値はa^2+b^2+c^2+d^2=1となる制約条件に対して初期値がa=b=c=dとなるとき、4a^2=1 よって a=0.5から算出している。
  • 制約条件  =C2^2+D2^2+E2^2+F2^2
  • 主成分 U  =SUMPRODUCT($C$2:$F$2,C3:F3)

pca_excel03

それぞれの項目について分散を計算しておく。

  • 分散 =VARP(C3:C152)
  • 総分散 =SUM(C154:F154)
  • 寄与率 =G154/G156

ソルバー

pca_excel04

ソルバーを使って主成分分析を実行する。

目的とするセルは主成分uの分散である。変化する値は主成分負荷量。制約条件として∑主成分負荷量i^2=1となるのでこれを設定してソルバーを実行する。

実行結果

pca_excel05

実行した結果は以下のようになった。

u = 0.364 x Sepal.Length + .0859 x Petal.Length + 0.359 x Petal.Width

Sepal.Widthはuに対して全く貢献していないことがわかる。

さらに寄与度を計算してみると92%となり、主成分は全体の情報の92%と非常に高い程度で情報を説明していることがわかる。

pca_excel06

第二主成分

第二主成分も合わせて取得する。

第二主成分を分析するための表を作成する。

pca_excel07

フォーマットは第一主成分と同じであるが変数uの影響を取り除いている。

例) レコード1のSepal.Length C3-($G3*C$2)

C3はオリジナルのSepal.Length、C$2はSepal.Lengthの主因数負荷量、G3は第一主因数である。

実行結果は以下のようになった。

pca_excel08

v = 0.570 x Sepal.Length + 0.822 x Sepal.Width

pca_excel09

寄与率は66%となった。

Rによる主成分分析

Rではprincompを使って主成分分析を実行する。

> iris.princomp <- princomp(iris[,1:4], scale=TRUE)
> iris.princomp
Call:
princomp(x = iris[, 1:4], scale = TRUE)

Standard deviations:
   Comp.1    Comp.2    Comp.3    Comp.4 
2.0494032 0.4909714 0.2787259 0.1538707 

 4  variables and  150 observations.
> summary(iris.princomp)
Importance of components:
                          Comp.1     Comp.2     Comp.3      Comp.4
Standard deviation     2.0494032 0.49097143 0.27872586 0.153870700
Proportion of Variance 0.9246187 0.05306648 0.01710261 0.005212184
Cumulative Proportion  0.9246187 0.97768521 0.99478782 1.000000000

固有ベクトルはloadingsに設定されている。

> iris.princomp$loadings

Loadings:
             Comp.1 Comp.2 Comp.3 Comp.4
Sepal.Length  0.361 -0.657 -0.582  0.315
Sepal.Width         -0.730  0.598 -0.320
Petal.Length  0.857  0.173        -0.480
Petal.Width   0.358         0.546  0.754

               Comp.1 Comp.2 Comp.3 Comp.4
SS loadings      1.00   1.00   1.00   1.00
Proportion Var   0.25   0.25   0.25   0.25
Cumulative Var   0.25   0.50   0.75   1.00

各項目のスコアはscoresに設定されている。

> iris.princomp$scores
             Comp.1       Comp.2       Comp.3        Comp.4
  [1,] -2.684125626 -0.319397247 -0.027914828  0.0022624371
  [2,] -2.714141687  0.177001225 -0.210464272  0.0990265503
  [3,] -2.888990569  0.144949426  0.017900256  0.0199683897

主成分負荷量を求める

> t(iris.princomp$sd * t(iris.princomp$loadings) ) [, drop = FALSE]
                 Comp.1      Comp.2      Comp.3      Comp.4
Sepal.Length  0.7406268 -0.32236633 -0.16222677  0.04854424
Sepal.Width  -0.1732207 -0.35848840  0.16665321 -0.04919602
Petal.Length  1.7556635  0.08512102  0.02124897 -0.07383316
Petal.Width   0.7342790  0.03705902  0.15213733  0.11596580

有効な主成分の範囲を特定する。

 plot(iris.princomp, type="lines", col="blue")

variance

これによると第二主因数までで95%以上の分散が説明されていることがわかるので第二主因数までを使えばよいことがわかる。

検証

第一主因数と第二主因数でプロットする。

メタ情報

inarticle



メタ情報

inarticle



-R
-,

執筆者:


  1. foo-bar-baz より:

    [Rではprincompを使って主成分分析を実行する。]
    オンラインヘルプでも,prcomp を使う方が推奨されています[ A preferred method of calculation is to use svd on x, as is done in prcomp.]

  2. admin より:

    コメントありがとうございます。次回はprcompを使ってみます。

foo-bar-baz へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

データの縦・横展開

stack()関数を用いて横長のデータを縦長にできることを教わった。このようなデータ形式の変換はよくあることなのでもう少し調べてみた。 scoreデータは以下のような形式となっている。 > he …

no image

Rに関するmemo

グループ毎に度数分布を作成する by(housing$VAL, housing$SERIALNO, length) グループで平均値を計算するための式 DT[,mean(pwgtp15),by=SEX …

no image

R – ElemStatLearn – Coutries

データの概要 国ごとの相違を距離で表しているクロス表 > dim(countries) [1] 12 12 > names(countries) NULL > str(countri …

no image

Rで%>%を利用する。

rvestでスクレイピングをしようとしたら、%>%という記述が大量頻出。これ何かということで調べてみた。 https://stackoverflow.com/questions/24536154 …

no image

Rによるやさしい統計学/4-母集団と標本

言葉の定義 推測統計、推定、点推定、区間推定、検定 標本、標本統計量、推定量、標本抽出、確率変数、確率分布、標本誤差 標本分布、標本統計量、平均、標準偏差、標準誤差 4.5 標本分布 標本平均の標本分 …

2014年1月
« 12月   2月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  

side bar top



アーカイブ

カテゴリー