主成分分析: R の mtcars データセットを使った実例
UB3/statistics/pca/pca_r_mtcars
このページの最終更新日: 2025/01/05広告
主成分分析の関数
このページでは、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 は燃費なので、「パワーがある車は、燃料を食う」ということがデータに表れている。


ggbiplot() 関数
biplot() 関数 よりも、ggbiplot() 関数の方があらゆる面で良さそうである。インストールが必要であるが、こちらを中心に使っていきたい。
インストールは github から。devtool が入っていれば、以下のようにしてインストール。
ただし、個人的には devtool は問題が生じることが多い。
インストールしたら、mtcars.pca を引数として実行する。デフォルトだと、車の名前は出ずに、店がプロットされる。軸に寄与率が表示されているのはいい。

ここにオプションを追加していく。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 が低く、アメリカ車は高い。ヨーロッパ車にはその両方があることがはっきり視覚化される。

広告
References
- R PCA Turtial. Link: Last access 2022/12/30.
- 主成分分析を理解する ~Rでデータ分析編~ Link: Last access 2022/12/30.
- Rの主成分分析. Link: Last access 2022/12/30.
- 専用パッケージを導入せず GitHub 上の R パッケージをインストールする. Link: Last access 2022/12/30.
- Principal Component Analysis in R Tutorial. Link: Last access 2023/01/01.
コメント欄
サーバー移転のため、コメント欄は一時閉鎖中です。サイドバーから「管理人への質問」へどうぞ。