7,092 views
この記事は最終更新から 1809日 が経過しています。
octaveで主成分分析をやってみます。
「主成分分析とは?」については、そのまんまググると親切なページがたくさんあります。
以下のページはとても参考になります。
はじめよう多変量解析
主成分分析の適用例
テーマは野球選手の総合評価
個人的には、何でもそつなくこなす選手が好きですので、
本塁打、打点、打率などの単一項目での評価でなく、各項目を複合した選手能力の物差しに興味があります。
入力データは2014年8月8日のセリーグ打者成績打率上位30人です。
主成分分析の対象とする変量(打者成績項目)は、以下の14項目とします。
打席数、安打、二塁打、三塁打、本塁打、塁打数、打点、得点、三振、四球、死球、犠打、犠飛、盗塁
octaveで主成分分析を実行
前述の打者成績をCSVファイルに保存しておき、これをoctaveでロードします。
主成分分析ではoctaveの statistics パッケージを使用するので、これもロードしておきます。
octave:1> pkg load statistics
octave:2> X=csvread('bbscore.csv')
X =
410 127 24 0 11 184 62 40 44 36 4 0 5 2
466 135 32 1 21 232 65 77 63 54 7 2 4 9
375 111 20 4 13 178 59 62 59 37 5 0 2 8
431 130 21 2 8 179 54 64 42 31 3 5 2 2
439 126 24 2 7 175 41 61 58 19 2 32 4 19
440 131 9 2 2 150 24 68 38 26 5 4 2 21
441 120 20 2 7 165 52 74 55 62 2 1 3 9
404 114 14 2 17 183 62 70 74 41 0 1 0 9
436 112 19 4 15 184 45 69 63 69 2 0 3 19
332 80 8 0 23 157 51 48 75 57 2 0 2 1
412 107 20 0 10 157 39 55 56 36 2 4 4 18
420 107 24 1 18 187 80 54 109 45 5 0 2 1
340 86 19 1 17 158 61 44 71 38 0 0 2 1
390 96 16 5 6 140 25 66 64 46 3 5 1 12
388 100 16 1 7 139 39 46 60 29 3 3 2 6
416 101 22 0 9 150 66 48 48 52 1 4 4 2
399 98 23 3 9 154 45 52 85 45 5 2 1 26
356 85 12 2 16 149 65 40 38 45 4 0 5 2
406 99 14 0 33 212 90 61 135 32 6 0 3 2
391 93 13 0 13 145 43 33 51 27 7 0 2 2
376 88 11 3 6 123 28 48 63 22 7 11 0 5
332 77 19 1 11 131 37 30 40 25 5 0 4 0
347 76 17 0 11 126 34 32 42 42 3 0 1 0
292 60 6 1 2 74 18 27 48 15 3 26 2 2
302 67 13 0 18 134 41 35 44 15 3 2 3 1
338 71 10 1 4 95 24 34 34 22 3 16 0 15
367 73 12 1 1 90 19 42 38 24 3 31 1 8
octave:3> size(X)
ans =
27 14
打者項目によって数値の範囲にばらつきがあるため、平均0、分散1に標準化しておきます。
でも、項目によって価値がだいぶ違うものもあるので、項目別の重み付けも必要かも…
octave:4> Xm=repmat(mean(X), size(X,1),1); octave:5> Xs=repmat(std(X), size(X,1),1); octave:6> Xv = (X - Xm) ./ Xs Xv = 0.5116564 1.3186125 1.1697424 -1.0347284 -0.0921100 0.8600634 0.8131214 -0.7577263 -0.6692737 -0.0519840 0.2470689 -0.5821085 1.8196848 -0.7253695 1.7514394 1.6938698 2.4995549 -0.3183780 1.2895402 2.2243744 0.9757456 1.7655023 0.1701821 1.2112265 1.7864982 -0.3711430 1.1276920 0.2009470 -0.2632079 0.5680979 0.5048362 1.8306732 0.1842200 0.6895245 0.6504971 0.7425718 -0.0065455 0.0181944 0.7602120 -0.5821085 -0.2562936 0.0686160 0.9765750 1.4593340 0.6710628 0.3979724 -0.5066051 0.7179476 0.3794566 0.8789625 -0.7576375 -0.4028758 -0.2660742 -0.0546948 -0.2562936 -0.7253695 1.1536869 1.2717054 1.1697424 0.3979724 -0.6447701 0.6042551 -0.3252485 0.6743764 -0.0507273 -1.2450161 -0.7792173 2.7933393 1.1276920 1.5242563 1.1758259 1.5062412 -1.3236559 0.3979724 -1.3355952 -0.1063236 -1.2467861 1.1517440 -0.9343650 -0.7537676 0.7602120 -0.1601775 -0.2562936 1.7889181 1.1979649 0.9902624 0.5048362 0.3979724 -0.6447701 0.3200236 0.2710405 1.5609162 -0.1832730 1.7726534 -0.7792173 -0.4766257 0.4356992 0.2009470 0.3788226 0.7088194 -0.4925231 0.3979724 0.7368801 0.8316402 0.8131214 1.2881347 0.6561828 0.2989078 -1.8055035 -0.4766257 -1.6402792 0.2009470 1.0872699 0.6150050 0.3386097 1.8306732 0.4605501 0.8600634 -0.1084162 1.2199394 0.1701821 2.2639020 -0.7792173 -0.5821085 0.4356992 1.5242563 -1.2151841 -0.8860242 -1.4898825 -1.0347284 1.5658703 0.0926384 0.2168324 -0.2121634 0.7003647 1.4217616 -0.7792173 -0.5821085 -0.2562936 -0.8577005 0.5559344 0.3804692 0.5048362 -1.0347284 -0.2302750 0.0926384 -0.4336647 0.2652042 -0.1390911 -0.0519840 -0.7792173 -0.1601775 1.1276920 1.3919253 0.7330463 0.3804692 1.1697424 -0.3183780 0.8750452 0.9453328 1.7888670 0.1970088 2.2025487 0.5796213 0.7602120 -0.5821085 -0.2562936 -0.8577005 -1.0380722 -0.6045812 0.3386097 -0.3183780 0.7368801 0.1210616 0.7589133 -0.4849448 0.5236371 0.0883728 -1.8055035 -0.5821085 -0.2562936 -0.8577005 0.0688768 -0.1355096 -0.1600700 2.5470236 -0.7829351 -0.3905551 -1.1925780 1.0153533 0.2143640 0.6497996 -0.2660742 -0.0546948 -0.9482864 0.5979398 0.0245989 0.0521191 -0.1600700 -0.3183780 -0.6447701 -0.4189782 -0.4336647 -0.3485541 0.0376364 -0.5432325 -0.2660742 -0.2656602 -0.2562936 -0.1960458 0.6444903 0.0990262 0.8372893 -1.0347284 -0.3684401 -0.1063236 1.0299537 -0.2121634 -0.4925462 1.0708698 -1.2923604 -0.1601775 1.1276920 -0.7253695 0.2681277 -0.0416953 1.0035159 1.1143228 -0.3684401 0.0073690 -0.1084162 0.0606181 1.1421835 0.5796213 0.7602120 -0.3711430 -0.9482864 2.4505728 -0.6838485 -0.6514884 -0.8249762 0.3979724 0.5987151 -0.1347468 0.9757456 -0.7577263 -0.9343650 0.5796213 0.2470689 -0.5821085 1.8196848 -0.7253695 0.4231005 0.0052119 -0.4925231 -1.0347284 2.9475205 1.6559115 2.3309479 0.6743764 3.3512777 -0.3326974 1.2733551 -0.5821085 0.4356992 -0.7253695 0.0910158 -0.2762311 -0.6587497 -1.0347284 0.1842200 -0.2484394 -0.2168324 -1.2350939 -0.3600005 -0.6835892 1.7864982 -0.5821085 -0.2562936 -0.7253695 -0.2410689 -0.5107669 -0.9912028 1.1143228 -0.7829351 -0.8737486 -1.0299537 -0.2121634 0.1701821 -1.0344810 1.7864982 0.5782017 -1.6402792 -0.3283767 -1.2151841 -1.0267457 0.3386097 -0.3183780 -0.0921100 -0.6463634 -0.5420809 -1.4396800 -0.8460012 -0.8239460 0.7602120 -0.5821085 1.1276920 -0.9900314 -0.8830993 -1.0736529 0.0061565 -1.0347284 -0.0921100 -0.7884792 -0.7047052 -1.3032892 -0.7576375 0.3690862 -0.2660742 -0.5821085 -0.9482864 -0.9900314 -2.1007433 -1.8241675 -1.8223356 -0.3183780 -1.3355952 -2.2664828 -1.5720347 -1.6442661 -0.4925462 -1.5257296 -0.2660742 2.1604428 -0.2562936 -0.7253695 -1.8793535 -1.4958174 -0.6587497 -1.0347284 0.8750452 -0.5610940 -0.3252485 -1.0987031 -0.6692737 -1.5257296 -0.2660742 -0.3711430 0.4356992 -0.8577005 -1.0823502 -1.3081887 -1.1574294 -0.3183780 -1.0592652 -1.6695967 -1.2467861 -1.1668985 -1.1110925 -1.0344810 -0.2660742 1.1056154 -1.6402792 0.9949325 -0.4403197 -1.2143744 -0.8249762 -0.3183780 -1.4737603 -1.8117124 -1.5178266 -0.6213356 -0.9343650 -0.8941243 -0.2660742 2.6878565 -0.9482864 0.0686160
corr 関数で共分散行列を求めます。
octave:7> R1 = corr(Xv)
R1 =
1.000000 0.917441 0.625741 0.241142 0.038235 0.705647 0.358418 0.802930 0.231084 0.439883 0.134384 -0.140606 0.238704 0.450093
0.917441 1.000000 0.630642 0.251153 0.065308 0.774014 0.398038 0.797047 0.144070 0.353524 0.082908 -0.219885 0.309752 0.370394
0.625741 0.630642 1.000000 0.066154 0.180789 0.669949 0.483119 0.423836 0.176020 0.399652 0.067315 -0.231639 0.444052 0.142541
0.241142 0.251153 0.066154 1.000000 -0.277890 0.071350 -0.200134 0.504802 0.022182 0.236108 0.039272 0.037135 -0.294460 0.493017
0.038235 0.065308 0.180789 -0.277890 1.000000 0.665591 0.788719 0.176485 0.674144 0.344464 0.127254 -0.564090 0.265990 -0.352778
0.705647 0.774014 0.669949 0.071350 0.665591 1.000000 0.794679 0.704416 0.535209 0.513877 0.143400 -0.518031 0.404411 0.070216
0.358418 0.398038 0.483119 -0.200134 0.788719 0.794679 1.000000 0.327019 0.623625 0.441877 0.047074 -0.549370 0.409742 -0.327218
0.802930 0.797047 0.423836 0.504802 0.176485 0.704416 0.327019 1.000000 0.352701 0.519591 -0.045163 -0.178053 0.025209 0.472583
0.231084 0.144070 0.176020 0.022182 0.674144 0.535209 0.623625 0.352701 1.000000 0.259144 0.166485 -0.269422 -0.105222 -0.014600
0.439883 0.353524 0.399652 0.236108 0.344464 0.513877 0.441877 0.519591 0.259144 1.000000 -0.212427 -0.535086 0.184152 0.111574
0.134384 0.082908 0.067315 0.039272 0.127254 0.143400 0.047074 -0.045163 0.166485 -0.212427 1.000000 -0.127532 0.024786 -0.048946
-0.140606 -0.219885 -0.231639 0.037135 -0.564090 -0.518031 -0.549370 -0.178053 -0.269422 -0.535086 -0.127532 1.000000 -0.174581 0.230993
0.238704 0.309752 0.444052 -0.294460 0.265990 0.404411 0.409742 0.025209 -0.105222 0.184152 0.024786 -0.174581 1.000000 -0.140228
0.450093 0.370394 0.142541 0.493017 -0.352778 0.070216 -0.327218 0.472583 -0.014600 0.111574 -0.048946 0.230993 -0.140228 1.000000
eig 関数で固有ベクトル(v), 固有値(l)を求めます。
octave:8> [v,l] = eig(R1)
v =
4.4396e-16 7.3627e-01 5.9575e-02 -4.9581e-02 -2.0468e-01 -2.8964e-01 -1.1990e-01 9.3614e-02 2.6179e-01 7.4887e-02 -1.3007e-01 -1.4152e-01 2.7837e-01 3.3823e-01
4.5372e-01 -4.4766e-01 4.1276e-01 -2.2866e-02 -1.2642e-01 1.1162e-01 1.5779e-01 3.1094e-02 3.6749e-01 2.6054e-02 -1.0274e-01 -2.0307e-01 2.5139e-01 3.4325e-01
1.2803e-01 1.4641e-02 -1.2618e-01 1.4752e-01 2.2232e-01 2.6215e-01 -5.4187e-01 -5.2239e-01 -2.3418e-01 -1.2928e-02 -2.6486e-02 -3.2816e-01 6.6633e-02 3.0530e-01
5.9420e-02 1.8642e-01 1.5468e-01 -8.0449e-02 -1.3009e-01 1.4551e-01 4.2724e-01 -4.3635e-01 -3.5653e-01 -3.2416e-01 4.6928e-02 3.5864e-01 3.9079e-01 6.7460e-02
4.6211e-01 2.9483e-01 1.5904e-01 -9.3213e-02 5.2435e-01 9.2512e-02 1.6145e-01 1.9032e-01 -1.7222e-01 1.1479e-01 -2.9410e-02 2.1363e-01 -4.1345e-01 2.4386e-01
-7.4878e-01 -7.2006e-02 3.3896e-01 -5.2543e-02 2.7470e-01 1.8110e-01 1.3650e-01 1.2349e-02 4.8061e-02 5.8699e-02 -8.1210e-02 -1.8860e-02 -6.0432e-02 4.1604e-01
2.7741e-16 -1.0435e-01 -3.8506e-01 -6.6686e-01 -3.4413e-01 3.7267e-02 9.5506e-02 -1.8962e-01 1.3864e-02 1.4983e-01 1.4150e-02 1.2576e-02 -3.1325e-01 3.3182e-01
1.7452e-15 -1.4345e-01 -6.4493e-01 3.2915e-01 2.9056e-01 -1.2294e-01 2.9327e-01 4.1657e-02 1.7134e-01 1.1541e-01 4.6305e-02 1.7267e-01 2.9102e-01 3.2946e-01
8.3822e-16 -1.0575e-01 1.3567e-01 4.3200e-01 -4.3527e-01 -7.9053e-02 -1.8090e-01 -3.4551e-02 -2.1802e-01 3.9566e-01 -2.1254e-01 4.6694e-01 -1.8405e-01 2.3022e-01
-6.3512e-16 -2.2003e-01 1.5979e-01 -1.0944e-01 8.3585e-02 -6.1368e-01 -2.6445e-01 5.8435e-02 -1.6279e-01 -2.8035e-01 5.0428e-01 1.3893e-01 1.2460e-02 2.7979e-01
-1.2478e-16 -1.5082e-01 -1.0002e-01 -8.6817e-02 9.6465e-02 -2.8574e-01 -7.2603e-02 5.7974e-02 -9.9587e-02 -4.6940e-01 -7.8942e-01 4.1213e-02 -5.4695e-02 4.4772e-02
-3.9566e-16 -1.0101e-01 1.3125e-01 -2.3130e-01 2.5080e-01 -4.3098e-01 1.2837e-01 -2.5471e-01 -2.3276e-01 6.0320e-01 -1.8316e-01 -1.4585e-01 2.5143e-01 -2.3023e-01
9.6730e-16 1.3293e-02 -5.0913e-02 2.5686e-01 -2.3142e-01 -1.0234e-01 3.8679e-01 2.1451e-01 -5.0819e-01 -5.4992e-02 5.0236e-02 -5.9730e-01 -1.5163e-01 1.6746e-01
-3.2694e-16 -7.9032e-02 -8.9866e-02 -2.8050e-01 -1.7434e-02 3.0850e-01 -2.6595e-01 5.7797e-01 -3.9567e-01 1.1716e-01 -3.3058e-02 9.6885e-02 4.7065e-01 6.6918e-02
l =
Diagonal Matrix
2.2204e-16 0 0 0 0 0 0 0 0 0 0 0 0 0
0 3.7856e-02 0 0 0 0 0 0 0 0 0 0 0 0
0 0 5.3203e-02 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1.0939e-01 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1.8701e-01 0 0 0 0 0 0 0 0 0
0 0 0 0 0 3.2360e-01 0 0 0 0 0 0 0 0
0 0 0 0 0 0 4.3619e-01 0 0 0 0 0 0 0
0 0 0 0 0 0 0 4.7192e-01 0 0 0 0 0 0
0 0 0 0 0 0 0 0 5.1286e-01 0 0 0 0 0
0 0 0 0 0 0 0 0 0 8.6176e-01 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1.2015e+00 0 0 0
0 0 0 0 0 0 0 0 0 0 0 1.5022e+00 0 0
0 0 0 0 0 0 0 0 0 0 0 0 2.8874e+00 0
0 0 0 0 0 0 0 0 0 0 0 0 0 5.4151e+00
主成分のランク付けがしやすいように、寄与率を算出してみます。
octave:9> r = l / sum(l(:)) r = Diagonal Matrix 1.5860e-17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.7040e-03 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3.8002e-03 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7.8135e-03 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.3358e-02 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.3114e-02 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3.1156e-02 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3.3709e-02 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3.6633e-02 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6.1554e-02 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8.5818e-02 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0730e-01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.0624e-01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3.8680e-01
寄与率が大きいものは、
第1主成分 r(14) 38.7%
第2主成分 r(13) 20.6%
第3主成分 r(12) 10.7%
第4主成分 r(11) 8.6%
第5主成分 r(10) 6.2%
ここまでで 84.8% です。
選んだ5種類の主成分(=主成分スコア)を算出しておきます。
octave:10> scr14 = Xv * v(:,14); octave:11> scr13 = Xv * v(:,13); octave:12> scr12 = Xv * v(:,12); octave:13> scr11 = Xv * v(:,11); octave:14> scr10 = Xv * v(:,10);
これで計算が完了!
結果を見てみる
(1) 第1主成分
固有ベクトルを見ると、出場が多く、長打が多く、打点も得点も多く、いわゆるスラッガーが高評価される物差しのようです。
結果は…
(2) 第2主成分
固有ベクトルを見ると、よく出場し、よく打ち、よく走り、よく得点し、だけど非力、いわゆるリードオフマンが高評価される物差しのようです。
結果は…
なかなか面白いです(^^)