すだちキャンパス

すだちキャンパス

やってみたこと、学んだことなどのメモ。

Rで主成分分析

こんにちは。
Rを用いて主成分分析をしてみました。

主成分分析とは

説明変数がたくさんある時に、それらを全て用いるよりも、データ説明に重要な変数を抽出した方が良い場合があります。
この時に用いられるのが、主成分分析です。これもまた数式で色々説明があったりするのですが、とりあえず置いておきます。

Rで主成分分析

Rで主成分分析をするには、次のように書きます。
ここでは、サンプルデータとして提供されている"seiseki.csv"を用いました。

seiseki <- read.csv("seiseki.csv", header = T)
result <- prcomp(seiseki, scale = T)
summary(result)
biplot(result)
round(result$rotation,3)

すると、このような図が出てきます。
f:id:sweetgohan:20181207094956j:plain
これは、横軸が第一主成分(総合点)で、縦軸が第二主成分(体育)です。右に行くほど座学の成績の良い人が増え、下に行くほど体育の成績が良い人が増える、ということがわかります。
また、round(result$rotation,3) を用いたことでコンソールに次のような表が表示されると思います。
f:id:sweetgohan:20181207095707p:plain
これは、PCnが第n主成分のことを表していて、その下の数字はそこにどれだけ寄与しているかを表しています。
例えば、第2主成分は体育の絶対値が最も大きいので、体育の成績に関する情報が主だとわかります。

Rで因子分析

また、因子分析というものもあります。
これは、説明変数同士の関係を見たり、説明変数からどのようなことが読み取れるかを考えたりする時に用います(多分)。

r = factanal(seiseki, factors = 2)
plot(NULL, xlim = c(-1,1), ylim = c(-1,1), xlab = "factor1", ylab = c(-1,1))
text(r$loadings, names(seiseki))

すると、次のような図が出てきます。
f:id:sweetgohan:20181207100317j:plain
これを見ると、横軸は「座学の軸」で縦軸は「技能系の軸」と予想できます。
また、社会と数学は近い関係にあり、体育は離れている・・・などがわかります。なんとなくイメージ通りですね。

エラー

最後に、私が出会って困ったエラーを紹介します。
因子分析をする時に、このようなエラーが出たことがありました。
"solve.default(cv) でエラー:
システムは数値的に特異です: 条件数の逆数 = 4.23969e-17
"
これが何を言っているかというと、
「条件数の逆数がとても小さくて、逆行列が作れません」
ということだと思われます。
なぜ突然逆行列が出てきたかというと、正則行列を作ろうとしているからです。
原因としては、説明変数に、他の説明変数の和で表されるような変数を入れていると、このようなエラーが起こります。
つまり、線形従属なものがあるせいで、正則行列が作れないということです。
色々書きましたが、このようなエラーに出くわしたらとりあえず、
「他の変数の和で表されるような変数を用いていないか」
をチェックするといいと思います!

あとは、もしかすると要素数が少なすぎてもこのようなエラーが起きるかもしれません・・・。

参考記事

主成分分析の考え方 | Logics of Blue
意味がわかる主成分分析 - Qiita

RStudioではじめるRプログラミング入門

RStudioではじめるRプログラミング入門