R筋

プログラミングと時々育児

【R】主成分分析でベビーカーを分類

主成分分析とは、色々な項目で計測されているサンプルに対して、主成分と呼ばれる新しく合成した少数の尺度を使って分析する手法です。
例えば、BMIは身長と体重から算出される肥満度を表す指標ですが、これがあることで、1つの指標だけで複数のサンプルを比較することが容易になります。
スマホのスペックには、バッテリー容量、画面解像度、重量、バイブの強さがあるとします。これらから主成分を抽出する場合、バイブの強さはあまりスマホによって変わらないので、情報量が少ない(分散が少ない)ため、尺度を減らす上で捨てられることになりそうです。またバッテリー容量と重量は相関がありそうなため、一つにまとめて新たな尺度にできるのではないでしょうか。
このような形で、スマホのスペックをいくつかの尺度で説明することで、特徴を把握し、機種の分類に役立てます。

主成分分析は次の流れで行います。
1)分散共分散行列(相関行列)を作成する
分散共分散行列→各計測値の単位が同じときに使用
相関行列→各計測値の単位がバラバラの場合に標準化できる
2)主成分を求める
分散共分散行列(相関行列)から固有値ベクトルを算出する

Rでは標準でprcomp()関数が用意されており、上記の計算をまとめて実施してくれます。レッツトライ!

あまりいい例になりませんでしたが、妻のブログでベビーカーのスペックをまとめていたので、この主成分分析を行います。
adijo.hatenablog.com

商品毎に、価格、重量、カゴ容量を表にした
babycar.csvを作りました。
f:id:anpontan382:20180108164332p:plain

#取り込み
library(readr)
baby <- read_csv("~/babycar.csv")
baby <- as.data.frame(baby)
#商品名を列名に設定
rownames(baby) <- c(baby$product)

#商品名以外を再度取り出し
baby <- baby[,2:4]

#主成分分析を実行
#scale=Tは相関行列での計算
result <- prcomp(baby,scale=T)

 summary(result)
#Importance of components%s:
#                         PC1    PC2    PC3
#Standard deviation     1.2063 0.9330 0.8212
#Proportion of Variance 0.4851 0.2902 0.2248
#Cumulative Proportion  0.4851 0.7752 1.0000

Proportion of Variancとは、各主成分の寄与率を表し、
Cumulative Proportion とは、累積寄与率を表します。
各主成分の寄与率とは、その主成分で全体のどれだけを表せるかを示しており、
第1主成分~第N主成分までで、全体のどれだけを表せるかの表示となります。
今回のケースでは第2主成分までで77%を説明できることになります。
一般的にも70%を超えるまで主成分を取り出すことが目安になっています。

resule$rotation
#               PC1        PC2        PC3
#price    0.6385902 -0.1918353 -0.7452528
#weight   0.5982140 -0.4854510  0.6375557
#capacity 0.4840895  0.8529575  0.1952457

$rotationが主成分を表す固有ベクトルです。

result$x
#                            PC1        PC2         PC3
#Runfee ef            -1.3555083 -0.3347032  0.34179979
#PATTAN               -1.3742207  0.5686794  0.51548585
#Premige               0.6631685 -1.2076507 -0.84968911
#MECHACAL HANDY       -0.3616031 -0.1325712 -0.96859595
#NEMURIE               0.4879116 -0.5742262 -0.12697994
#LUXUNA Comfort        1.2294453  1.2064958 -0.98609744
#SMOOOVE premium       1.7452139  0.9801604  1.16819540
#magical air plus     -1.5209180  0.7904333 -0.08955709
#Air Buggy COCO BRAKE  0.4865108 -1.2966176  0.99543849

$xは主成分得点と呼ばれます。
Σ各固有ベクトル×各計測値で算出され、
固有ベクトルによって描画するにあたり、その座標の意味を持っています。

cor(result$x,baby)
#         price     weight  capacity
#PC1  0.7703448  0.7216382 0.5839673
#PC2 -0.1789771 -0.4529125 0.7957860
#PC3 -0.6119936  0.5235539 0.1603336

主成分と計測値との相関係数を求めることで、主成分負荷量を算出します。
この数値が大きいほど、各変数が主成分に与える影響力が大きいことを表します。
この例では、第1主成分と相関が高いのは同じ位で、price,weightで第2主成分ではcapacityです。

biplot(resule,choices=c(1,2))

f:id:anpontan382:20180108210607p:plain
biplotは個体と変数を重ねて主成分空間上に描画します。

この図を見ると、価格・容量が高い「ラクーナコンフォート」「スムーブ」グループと、重量・価格が高い「Premige」「エアバギー」グループ、安い「PATTAN」「マジカルエアープラス」グループがあることがわかります。

重量と容量などは似た数値なので、この例だとイマイチ結果から言えることが少ないですが、「走行性」「安全性」「重量」などそれぞれ異なる項目をうまいこと数値化できると、それぞれの性質ごとにグループ分けすることができそうですね。このくらいの商品数なら全部の数値を見ていっても自分にあったベビーカーを選ぶことはできそうですが、もしベビーカーが1,000種類位あって、そのデータが全部取れて入れば、まず主成分分析をして、自分が重視する商品グループ決めた上で、その中で一番合っている商品を選ぶみたいな活用ができるかもですね。