主成分分析: R の mtcars データセットを使った実例

UB3/statistics/pca/pca_r_mtcars

このページの最終更新日: 2024/09/30

  1. R による主成分分析
  2. 結果のプロット

広告

主成分分析の関数

このページでは、R を用いた主成分分析の方法をまとめる。主成分分析の概念などについては、主成分分析のメインページ を参照のこと。

mtcars という 組み込みデータセット を用いる。

Rの組み込みデータセット mtcars

これは以下のような車の性能を集めたデータセットで、ほとんどの数値は連続変数であるが、vs と am は、エンジン (0 = V-shaped, 1 = straight) と Transmission (0 = automatic, 1 = manual) で、0 または 1 の二値変数である。

主成分分析は連続変数に対して行うものなので、これらの列はあとで除くことになる。

mtcars には mpg, cyl などのさまざまな性能の指標が含まれているが、これらの次元を減らし、それぞれの車の特徴をわかりやすく理解することが目的である。

たとえば、「走行性能」と「かっこよさ」という 2 つのパラメーターに特徴を落とし込むようなものである (ただし、もちろん主成分分析では PC1, PC2... が「何」を表しているのかは出てこない)。

以下に 2 つ関数を示す。結果が微妙に違うので、どちらを使えばいいのかよくわからない。何かわかったら更新。

prcomp() 関数

まずは、文献 1 を参考に、prcomp() 関数を検討。mtcars から select() 関数 で vs, am を除き、prcomp に入れる。

summary で解析結果を表示させると、以下のように PC1 から PC9 までのデータが出てくる。

princomp() 関数

princomp() 関数も、同じように主成分分析を行う関数である。名前は違うものの、主成分としては同じ値が計算される。

結果のプロット

biplot() 関数

まず、結果を biplot() で図示する。prcomp() と princomp() の結果を両方表示してみよう。上が prcomp、下が princomp での結果である。

結果が違っているのが非常に気に入らない。2 つの関数の違いはあとで調べるとして、とりあえずこの図の解釈 (2,3)。

  • 赤い矢印の向きは、2 つの主成分に対する各変数の方向を示す。
  • 赤の矢印の長さは、各変数と各主成分の相関の強さを示す。
  • 下と左の目盛がスコア用、上と右が負荷量。これらは異なる概念だが、便宜的に 1 つのグラフで表示している。

したがって、たとえば PC1 は cyl, disp, wt, hp などと相関が強い。これらはそれぞれ車のシリンダー数 (大きいほどパワフル)、排気量、重量、馬力であり、PC1 は「車のパワー」的な概念と解釈できそうである。

この PC1 は mpg とは逆相間している。mpg は燃費なので、「パワーがある車は、燃料を食う」ということがデータに表れている。

PCA biplot
PCA biplot

ggbiplot() 関数

biplot() 関数 よりも、ggbiplot() 関数の方があらゆる面で良さそうである。インストールが必要であるが、こちらを中心に使っていきたい。

インストールは github から。devtool が入っていれば、以下のようにしてインストール。

ただし、個人的には devtool は問題が生じることが多い。多くのパッケージに依存している ためらしい (4)。devtools の install_github は、remotes というパッケージの関数を流用しているに過ぎないので、以下のコマンドで ggbiplot がインストールできるはず。

インストールしたら、mtcars.pca を引数として実行する。デフォルトだと、車の名前は出ずに、店がプロットされる。軸に寄与率が表示されているのはいい。

PCA ggbiplot

ここにオプションを追加していく。ggbiplot の RDocumentation も参考に。

labels

それぞれの点を文字列にする。この場合は、labels = rownames(mtcars) として、行の名前を表示させる。

mtcars.pca はリストであり、mtcars.pca[[x]] にオリジナルデータのラベルが含まれている。このデータにラベルをつけることになるので、mtcars.pca[[x]] とrownames(mtcars) が一致していることを確かめておくと良いだろう。

ellipse

ellipse = TRUE or FALSE. デフォルトは FALSE で、TRUE にするとデータをグループに分ける楕円が追加される。

groups

グループ分けを指定。別途ベクターを作り、それを参照するとスクリプトが見やすくなる。順番は、labels と同じく x の順番である。


たとえば、日本車、ヨーロッパ車、アメリカ車のグループ分けを追加するとこうなる。

日本車は PC1 が低く、アメリカ車は高い。ヨーロッパ車にはその両方があることがはっきり視覚化される。

PCA ggbiplot

広告

References

  1. R PCA Turtial. Link: Last access 2022/12/30.
  2. 主成分分析を理解する ~Rでデータ分析編~ Link: Last access 2022/12/30.
  3. Rの主成分分析. Link: Last access 2022/12/30.
  4. 専用パッケージを導入せず GitHub 上の R パッケージをインストールする. Link: Last access 2022/12/30.
  5. Principal Component Analysis in R Tutorial. Link: Last access 2023/01/01.

コメント欄

サーバー移転のため、コメント欄は一時閉鎖中です。サイドバーから「管理人への質問」へどうぞ。