スタートページ> JavaScript> 他言語> R言語
青字部分をGoogle Colaboratryの「コード」部分にコピーアンドペースト(ペーストは Cntl+V)して実行すれば結果が表示されます。
次の6つの特性(科目成績)を持つ20組(学生)のデータから、第1主成分と第2主成分を求めます。
# 〓〓〓 0 入力データ # 成績表 → 科目 m <- matrix(c(3, 4, 4, 5, 4, 4, # ↓学生 A 6, 6, 7, 8, 7, 7, # B 6, 5, 7, 5, 5, 6, # C 6, 7, 5, 4, 6, 5, # D 5, 7, 6, 5, 5, 5, # E 4, 5, 5, 5, 6, 6, # F 6, 6, 7, 6, 4, 4, # G 5, 5, 4, 5, 5, 6, # H 6, 6, 6, 7, 7, 6, # I 6, 5, 6, 6, 5, 5, # J 5, 4, 4, 5, 5, 5, # K 5, 5, 6, 5, 4, 5, # L 6, 6, 5, 5, 6, 5, # M 5, 5, 4, 4, 5, 3, # N 5, 6, 4, 5, 6, 6, # O 6, 6, 6, 4, 4, 5, # P 4, 4, 3, 6, 5, 6, # Q 6, 6, 7, 4, 5, 5, # R 5, 3, 4, 3, 5, 4, # S 4, 6, 6, 3, 5, 4 # T ), nrow=20, byrow=T) df <- data.frame(m) # 扱いやすいようにデータフレームにする colnames(df) <- c('x1','x2','x3','x4','x5','x6') # 科目名 rownames(df) <- c('A','B','C','D','E','F','G','H','I','J', # 学生名 'K','L','M','N','O','P','Q','R','S','T')
# 〓〓〓 1 単純に最終結果を得る 結果 <- prcomp(df, scale=T) summary(結果) biplot(結果)
結果 <- prcomp(df, scale=T) prcompは、主成分分析を行うアドオンライブラリ scale=T:相関行列から主成分分析を行う scale=F:分散共分散行列から主成分分析を行う summary(結果) Importance of components: PC1 PC2 PC3 PC4 PC5 PC6 # 第n主成分 Standard deviation 1.6405 1.2335 0.8453 0.69439 0.57795 0.50658 # 標準偏差 Proportion of Variance 0.4485 0.2536 0.1191 0.08036 0.05567 0.04277 # 寄与率 Cumulative Proportion 0.4485 0.7021 0.8212 0.90156 0.95723 1.00000 # 累積寄与率 第1成分だけで45%、第1成分と第2成分で70%の説明ができる biplot(結果) 横軸に第1主成分、縦軸に第2主成分をとったときの各科目の関係と各標本の位置 x1,x2,x3 は理系項目、x4,x5,x6 は文系項目のように人間が解釈する
# 〓〓〓 2 主成分の式 round(結果$rotation, 3) # 固有ベクトル(主成分軸の係数) round(結果$x, 3) # 主成分得点
結果$rotation 固有ベクトル(主成分軸の係数)を求める(round で小数点以下3位)。各成分と各科目の関係を示す。 PC1 PC2 PC3 PC4 PC5 PC6 x1 0.431 -0.354 -0.056 0.766 0.005 0.315 x2 0.400 -0.385 0.467 -0.538 0.122 0.411 x3 0.387 -0.488 -0.377 -0.210 -0.172 -0.629 x4 0.406 0.378 -0.526 -0.163 0.602 0.163 x5 0.404 0.371 0.592 0.199 0.206 -0.517 x6 0.420 0.457 -0.099 -0.112 -0.742 0.204 │ └ 第2主成分:-0.354*x1 - 0.385*x2 + … + 0.457*x6 │ 理系(-)と文系(+)で差が出るようにしている └ 第1主成分:0.431*x1 + 0.400*x2 + … + 0.420*x6 全体の成績で差が出るようにしている。 結果$x 各学生の各成分での得点(上のグラフ参照) PC1 PC2 PC3 PC4 PC5 PC6 A -2.997 0.856 -0.760 -1.109 0.574 -0.200 # 全体の成績が悪い B 3.799 1.362 -0.571 -0.157 0.292 -0.546 # 全体の成績が良い G 0.473 -1.920 -1.383 -0.210 0.911 0.286 # 文系と理系での差が大きい(理系が良い) J 0.666 -0.277 -0.973 0.582 0.394 0.023 # 平均的 Q -1.169 2.517 -0.500 -0.228 -0.091 0.630 # 文系と理系での差が大きい(文系が良い)
# 〓〓〓 3 因子負荷量 主成分に強く寄与している科目 fc.l <- sweep(結果$rotation, MARGIN=2, 結果$sdev, FUN="*") 項目 <- c('1','2','3','4','5','6') # x1, x2 としたいのだが1文字の制約 plot(fc.l[,1], pch=項目, ylim=c(-1,1), main="fc1") # 第1主成分への影響 plot(fc.l[,2], pch=項目, ylim=c(-1,1), main="fc2") # 第2主成分への影響
このプロセスは、私は理解していません。 左図:第1主成分には、全ての科目が+で影響している 右図:第2主成分には、x1, x2, x3 は-、x4, x5, x6 は+で影響している
# 〓〓〓 4 第1主成分-第2主成分平面での各科目の位置 plot(fc.l[,1], fc.l[,2], pch=項目, xlim=c(-1,1), ylim=c(-1,1), main="fc1-fc2")
各科目のグループ化をしたグラフ
# 〓〓〓 5 各標本の入力データと第1主成分-第2主成分平面での各科目の位置 pc1 <- round(as.matrix(結果$x[,"PC1"]), 2) pc2 <- round(as.matrix(結果$x[,"PC2"]), 2) mm <- cbind(m, pc1) mm <- cbind(mm, pc2) mm
# x1 x2 x3 x4 x5 x6 PC1 PC2 A 3 4 4 5 4 4 -3.00 0.86 B 6 6 7 8 7 7 3.80 1.36 C 6 5 7 5 5 6 1.07 -0.50 D 6 7 5 4 6 5 0.91 -0.84 : Q 4 4 3 6 5 6 -1.17 2.52 R 6 6 7 4 5 5 0.69 -1.66 S 5 3 4 3 5 4 -2.64 0.23 T 4 6 6 3 5 4 -1.35 -1.26