www.crosshyou.info

政府統計の総合窓口のデータや、OECDやUCIやのデータを使って、Rの練習をしています。ときどき、読書記録も載せています。

全国輸出入コンテナ貨物流動調査のデータの分析3 - R言語で主成分分析

 

www.crosshyou.info

 の続きです。

 

Rクックブック

Rクックブック

 

 今回はこの本を参考にして、主成分分析を行ってみようと思います。

主成分分析はデータセットの変数を減らすことのようです。

データセットにN個の変数がある場合に主成分分析によって変数の数をN個よりも少なくできるかもしれないです。

早速やってみます。

まずは、データがどんなのか、確認します。

f:id:cross_hyou:20190526123627j:plain

str関数でデータ構造を確認しました。22の観測で変数の数が6つですから多い気がします。

prcomp関数を使うようです。

f:id:cross_hyou:20190526124223j:plain

まず、attach関数で、df_Analysisをアタッチします。

f:id:cross_hyou:20190526124311j:plain

prcomp関数の結果をsummary関数で呼び出しました。PC1で分散が72%、PC2で分散が24%でこの二つで分散の98%を占めていますので、6つも変数はいらず、2つの変数でdf_Analaysisのデータは説明できるということかな?

plot関数でグラフを描いてみます。

f:id:cross_hyou:20190526124641j:plain

f:id:cross_hyou:20190526124654j:plain

predict関数でデータを主成分へ回転するらしいです。

f:id:cross_hyou:20190526125143j:plain

よくわからないです。。。PC1とPC2だけのデータフレームを作ります。

f:id:cross_hyou:20190526125710j:plain

PC1とPC2の散布図を描きます。

f:id:cross_hyou:20190526130002j:plain

f:id:cross_hyou:20190526130020j:plain

この散布図に港の名前を表示したいですね。どうするのかな?

text関数で港の名前を追加すればいいですね。

f:id:cross_hyou:20190526131042j:plain

f:id:cross_hyou:20190526131106j:plain

できました。〇が表示されていると、文字と重なって見えにくくなるので、〇は表示しないで、文字だけにしましょう。

f:id:cross_hyou:20190526131615j:plain

f:id:cross_hyou:20190526131626j:plain

できました。

高松、堺泉北、石狩湾新などは似ている港、ということですね。

今回は以上です。

最後のdf_PC12をデタッチしておきましょう。

f:id:cross_hyou:20190526131911j:plain

今回のR言語のコードです。

# df_Analysisの確認
str(df_Analysis)

# attach関数でdf_Analysisをアタッチ
attach(df_Analysis)

# prcomp関数で主成分分析
r <- prcomp( ~ ExAmt + ExPx + ExPxT + InAmt + InPx + InPxT)
summary(r)

# plot関数で視覚化
plot(r)

# predict関数
predict(r)

# PC1とPC2だけのデータフレーム
df_PC12 <- predict(r)
df_PC12 <- as.data.frame(df_PC12)
df_PC12 <- df_PC12[ , c(1,2)]
rownames(df_PC12) <- rownames(df_Analysis)
df_PC12

# detach関数でdf_Analysisをデタッチ
detach(df_Analysis)

# attach関数でdf_PC12をアタッチ
attach(df_PC12)

# plot関数でPC1とPC2の散布図
plot(PC1, PC2)

# text関数で港の名前を追加
text(PC1, PC2,labels=rownames(df_PC12))

# plot関数で港の名前だけを表示
plot(PC1, PC2, type = "n")
text(PC1, PC2, labels = rownames(df_PC12))

# df_PC12をデタッチ
detach(df_PC12)