Rで主成分分析

Posted on 05月 28, 2014

こんにちは、SI部の杉です。
前回までで単回帰重回帰の分析方法に関して説明させていただきました。
Rを用いて基本的な分析の方法を客観的にご覧いただけたと思います。
今回は、解析方法として回帰分析とは違った切り口で分析を行う手段である、主成分分析について説明したいと思います。
主成分分析とは何かを説明した上で、実際の解析手法をRを用いて客観的にお見せします。

主成分分析とは何か?

データが少ない場合はグラフや基本統計量(平均や分散)を見てデータの構造を把握することができますが、
データが多くなった場合、データ自体の構造が複雑になり、これらを客観的に理解することが困難になります。
主成分分析とは多くのまとまった変数データに対して、
変数の間ごとの相関関係を少数の合成変数でまとめて分析を行う手法です。

例を挙げて考えてみましょう。
算数、国語、理科、社会のテストの点数表があったとします。

算数 国語 理科 社会
A 45 60 55 80
B 55 80 65 90
C 100 60 60 55
D 65 50 40 60
E 70 45 70 65
F 25 65 50 75
G 55 75 45 55

Cの算数の点がいい、あるいは、算数が得意な生徒は理科の点数も良いと考えるかもしれません。
しかし、当然ながら別々の科目を同列に比較などできません。
この場合、各データ(ここでは算数や国語の点数)の相関関係を見て、
その傾向を主成分としてプロットすると
各データの持っている傾向が読み取れるようになるのではないでしょうか。
この時、

  1.  算数、理科の『理系科目』
  2.  国語、社会の『文系科目』

の2つの主成分に分かれることになります。
理系科目の得点、文系科目の得点でカテゴライズができるということですね。
つまり、主成分分析とはこの例を用いると、

『各生徒の得点を教科ごとの相関関係から求めた主成分ごとに合成変数(理系科目や文系科目など)を用いて分析する』

という解釈ができます。
別の言い方をすれば、実測される変数の間の因果関係を見出すことができるという点が実現可能になります。

主成分分析の事例

食品の栄養成分表に記載されるように、どの成分が何%を占めているのかを導き出すこともできます。

例えば、コンビニの店舗エリアマネージャーがコンビニで扱う缶コーヒーの陳列について効果的な方法を考えたとします。
その場合、コーヒーに含まれる成分や酸味、苦味、コクなどを主成分分析を用いて統計建てることが可能となります。
主成分分析によって、コーヒーの特色ごとにカテゴライズして商品を並べることが可能となるのです。
そうした緻密なマーケティングが利益に結びついていくことにもなりうるわけです。
また、ビッグデータのように膨大なデータの中から、全体を要約し、
データ本来の特色を掴む際に主成分分析は恰好な手段となり得るでしょう。
もう少し実用的なデータを用いて解析を行ってみましょう。

実際に主成分分析を行う

実際にRを用いて主成分分析行ってみたいと思います。 まずは以下のデータをご覧下さい。
2013年度のメジャーリーグのシーズン成績を元に各球団のエース級ピッチャー11人の成績を出してみました。

番号 防御率 勝ち 投球回数 被安打率 被本塁打 与四死球 奪三振 ゴロ/フライ率 WHIP
バーランダー 1 3.46 13 281.1 0.229 19 79 217 0.672 1.32
シャーザー 2 2.90 21 214.1 0.181 18 60 240 0.624 0.97
ヘルナンデス 3 3.04 12 204.1 0.224 15 49 216 1.122 1.13
岩隈 4 2.66 14 219.2 0.206 25 44 185 1.015 1.01
ダルビッシュ 5 2.83 13 209.2 0.171 26 88 277 0.731 1.07
レスター(BOS) 6 3.75 15 213.1 0.231 19 74 177 0.849 1.29
ガスリー 7 4.04 15 211.2 0.261 30 67 111 0.801 1.39
黒田 8 3.31 11 201.1 0.231 20 45 150 0.902 1.16
プライス 9 3.33 10 186.2 0.241 16 30 151 0.894 1.10
ヒメネス 10 3.30 13 182.2 0.209 16 83 194 0.831 1.33
CJ・ウィルソン 11 3.39 17 212.1 0.219 15 93 188 0.837 1.34

※メジャーリーグの規定投球回数を満たした先発投手に限定しています。各項目の説明を簡単にしてみましょう。

  • 防御率           ・・・   1ゲーム9イニングの中での平均失点(ただし、味方のエラー絡みによる失点は含まれない)
  • 勝ち                ・・・   先発が5回以上を投げてチームがリードしたまま試合を終了した数
  • 投球回数          ・・・   シーズン通しての投球回数の合計
  • 被打率             ・・・   打者一人に対して安打を打たれる確率
  • 被本塁打         ・・・   シーズン通してホームランを打たれた数
  • 四死球             ・・・   シーズン通してのデッドボール、フォアボールの合計
  • 奪三振             ・・・   シーズン通してピッチャーが三振を取った数
  • ゴロ/フライ率  ・・・   ゴロアウト数÷フライアウトの数
          • ※ヘルナンデスの場合、1.122なのでフライアウトよりゴロの方が多い。
  • WHIP              ・・・   1回あたりの与四球+被安打
          • ※1回あたり何人の走者を出したかを表す数値。

このデータを客観的に見てみると、以下のことがわかります。

  1. シャーザーの成績が一番良い
    • (実際この年のシャーザーは投手最高峰のサイ・ヤング賞を受賞)
  2. ダルビッシュの奪三振がダントツ
    • (実際この年の最多奪三振はダルビッシュが受賞)
  3. CJ・ウィルソンが防御率のワリに勝っている
    • (勝ち星は運の要素が強いため)

などなど。 ここで、各ピッチャーの持っている特性や傾向を数値で可視化してみたいと思います。
Rのコンソールを開いて、以下のコマンドを実行します。

# CSVデータの読み込み
 data = read.csv('ファイルのパス.ファイル名.csv',head=T,row.names=1)

# データの標準化(割合であったり、回数であったりするためデータの単純比較ができないので)
 pca = prcomp(data, scale=T)
# 主成分分析結果の表示
 pca

# 主成分分析の結果をプロットします。
 biplot(pca)

R言語では主成分分析の関数として、
prcomp と、princomp が用意されていますが、prcomp を使用してください。
( princomp の場合、制約があるのと、計算方法が少し異なる ) データを読み込んで標準化し、プロットに出力しました。
実はこれで主成分分析自体は終了なのです。
ここでの結果は以下の様になります。

ⅰ)  出力結果 :

pca1

ⅱ) プロットグラフ :

pca2
この結果から何が読み取れるでしょうか? ①  まずは主成分2から。

PC2(縦軸)に着目すると、下方向にゴロ・フライ率が、上方向に四死球や被本塁打が固まっています。
ゴロ・フライ率が高い=バッターにゴロを打たせるということなので、緻密なコントロールが要求されます。
逆にこの割合が低いと、失投となり四球やフォアボールを、場合によっては本塁打を与えてしまいます。
従って、主成分2は下へ行くほどコントロールタイプとなり、上へ行くほど速球タイプとなると考えられます。

②  主成分1について。

PC1(横軸)に着目すると、右の方が奪三振率が高いのはわかりますが、
防御率や被安打率、WHIPに関しては低いほうが良いので
奪三振率、防御率、被安打率、WHIPは横軸の右に行くほど優秀となります。
これらの要素はランナーを塁に出さない指標なので、
右に行くほど打たれにくい、左に行くほど打たれやすい傾向にあるようです。

これらより、以下のことがわかります。

  • 主成分1:ピッチング能力(打たれにくさ)
  • 主成分2:投球タイプ(制球重視か、速球重視か) ※中心に行くほどバランス型になる

pca3
以上を踏まえたうえで、もう一度Rを立ち上げてみましょう。
プロットした選手の名前が数値になっていたので、別途名前のファイルを読み込んでプロットに表示してみます。


# データの読み込み
data = read.csv('データのパス',head=T,row.names=1)

# 名前の読み込み(プロット表示用)
name = read.csv('表示用の名前のパス', head=T)

# 主成分分析
prcomp.obj = prcomp(data, scale=T)

# 主成分分析の分析結果:主成分1
pca1 = prcomp.obj$x[,1]

# 主成分分析の分析結果:主成分2
pca2 = prcomp.obj$x[,2]

# plot(横軸:主成分1、 縦軸:主成分2)
plot(pca1, pca2, type="n")

# 表示項目に名前を表示する
text(pca1, pca2, colnames(name))

pca5 このグラフから読み取れる一例として、

  1. ダルビッシュ 、 シャーザーは打たれにくいという点でメジャーの精鋭の中でも群を抜いている。
  2. バーランダー と CJ・ウィルソン は投球の傾向が殆ど同じ。
  3. ダルビッシュ、シャーザー、ヒメネスは制球タイプでも速球タイプでもないバランス型である。

※上記はほんの一部分です。様々な傾向が隠れているため、それらを見出すこともデータ解析には不可欠な要素です。
余談ですが、アメリカの野球は超データ重視とも言われ、例に挙げた項目以外にも様々な指標があります。
このような統計的手法を用いて選手の評価や戦略を考える分析手法をセイバーメトリクスと呼びます。
オークランド・アスレチックスでは、球団の主力選手が引退したり、放出されたことで1990年代後半から低迷期を迎えることとなりました。

しかし、予算も限られる中でこのセイバーメトリクスを用いて独自の分析を行い、選手を育成することで2000年代前半には二年連続でシーズン100勝を達成することに成功します。(詳しくはマネーボールを参照のこと)

尤も、主成分分析だけでデータの概要を全て把握するのには無理があります。
例に挙げたプロットに関しても全体の概要の2/3までしか説明しきっていないのです。
PC2におけるCumulative Proportion ( 累積寄与率 ) をみると、0.64 とあります。
全体の64%までしか説明できていないという意味です。(下図参照)
pca4
この累積寄与率が70~80%の範囲であれば 『 データの概要をうまく説明できている 』 と定義されます。

この累積寄与率が低い場合の対処法としては、

①.主成分を第三まで取る

( この場合、累積寄与率は0.7957なのでPC3までを考慮すると制度が上がることになります。 )

②.不要な項目を消して再度統計を取り直す

( この場合、勝ち数は投手のタイプに依存しない傾向が強いため消して再度取り直してもよい )

③.スクリープロットというグラフを用いて

主成分の固有値が、各データ変量の標準化されている分散の値である1を越えている主成分を取る

今回は概要を知っていただくため、上記の対応までは入れておりません。

※ あくまで上記の範囲は参考までです。項目名が増えればそれだけ低くなるので。

まとめ

今回はご覧の結果となりましたが、如何だったでしょうか?
かなり容易に主成分分析が実現できることを実感できたのではないでしょうか?

また、さらに精度が上がるようにPC3まで取って3次元グラフにしてみるとより優れた解析結果が出てくるので

ぜひトライしてみてください。
他にもより、身近なデータを使って傾向を分析してみると思いもよらぬ発見があるかもしれません。
以上で、Rを用いた主成分分析の紹介は終わりになります。
ありがとうございました。


採用情報

  • Profile
    キャスレーコンサルティングの技術ブログです。
    当社エンジニアが技術面でのTips、技術系イベント等についてご紹介いたします。
  • CSV社長ブログ
  • チーム・キャスレーブログ