まえおき
Hamee Advent Calendar 24日目の記事です。サンタさんにはWiiUとスプラトゥーンのセットをお願いしました。
今回のテーマ
ずっと積んどくしていたこの本を読みきったので、実際に身近なデータを使用してかんたんな分析にチャレンジしてみようと思っていました。
が、話が長くなるのと適切なお題を見つけられなかったのでRubyを使うのは次回以降に回したいと思います。
ちなみにこの本では、Rubyでデータの取得やシュミレーションをして、Rを使って様々な分析をしています。
Rubyも統計も一通り経験のある方にはおすすめの本ですのでぜひ。例題の通りに動かしてみると結構楽しいです。
Rを使ってみる
今回は、まずRを導入・使ってみるところをご紹介します。
1.インストールはこちらから:R for Mac OS X
2.インストールすればコマンドから起動できます。
3.デモを表示してみましょう
> demo(graphics)
とすると、このようないろいろなデモ分析結果をグラフで出してくれます。グラフにもいろんな種類がありますね。
自分が把握している範囲でですが、以下の様な統計手法を扱うことができます。
- 相関関係
- x2検定(カイ二乗検定)
- t検定
- 分散分析(1要因・2要因)
- 重回帰分析
- クラスタ分析
- 因子分析
ためしてみる
では実際にRを使って、折れ線グラフを作成してみます。
また、せっかくなので 相関関係 にも少し触れてみたいと思います。
相関関係とは
2つの変数(項目)に対し、どれだけ結びつきが強いかを測ります。
今回のお題
年の瀬も迫ってまいりました。つまりそろそろ箱根駅伝の時期ということです。
毎年10選手の合計タイムなどいろんなデータが事前に出ていますが、その数字通りにいかないところが駅伝の面白いところです。
箱根駅伝は全10区間ですが、長距離駅伝なので最後に大逆転ということはほぼありません。
では、何区の時点で何位だと安心できるのでしょうか。
過去91大会のデータを基にグラフを作成してみましょう。
データを打ち込む
優勝校が各区で何位であったかを集計します。
まず、以下の形式に沿ってx軸とy軸のデータを決める必要があります。
> x <- c() # ()内にカンマ区切りで値を設定する
> y <- c()
今回x軸(横軸)となるのは「 区間 」
1区〜10区地点のうち10区=ゴールなので、1〜9までの連続した数値を横軸の値とします。
ここでは変数distinct
に値を設定します。
ちなみに1〜9などの連続した数字を設定する場合、2通りの方法があります。
直接値を入れてもいいですし、min:max
とするとその連続値を設定できます。
どちらも結果は同じです。
次にy軸(縦軸)ですが、こちらは「 各区通過時点での順位別の優勝回数の合計 」とします。
例えば、1区で1位だった大学が優勝した回数が23回、2区で1位だった大学が優勝した回数が35回・・・という9区分までの値を、変数rank1
に設定します。
同様に、1区で2位だった大学が・・・(以下略)をrank2
として、
今回は1〜3位までを集計の対象とします。
rank1
,rank2
,rank3
という3つの指標を以下のように作成しました。
(本来ならこのデータを集めるところからやりたいですが、そのためにはCSVやDBを使用する方が楽なので今回は集計済みのものを使用します。出典:http://www13.plala.or.jp/jwmiurat/yuusyou/yusyou001.html )
では、上記のデータをグラフに起こしましょう。
今回は折れ線グラフを使用します。
plot(x軸, y軸, type="o", ann=F, xlim=c(横軸の目盛り), ylim=c(横軸の目盛り), col=rgb(1,0,0), pch=0)
plot
関数はデモにも出てくるように、二次元グラフに点を打つ形式のグラフを描画します。
type="o"
オプションをつけるとそのプロットを線で繋いで、折れ線グラフにすることができます。
基本的に相関関係を書く場合は1グラフなので、
折れ線グラフにして複数グラフを表示する場合には軸の設定が必要になります。
-
ann=F
:軸名を非表示にする - デフォルトでは自動的に目盛りが設定されるので複数重ねると軸も重なってしまうのを防ぐため
-
xlim=c(1,9)
:横軸の目盛り。今回は区間なので1〜9とします。(軸名非表示にしたので明示的に指定している) -
ylim=c(0,100)
:縦軸の目盛り。最大値が83なので0〜100としました。
col=rgb(1,0,0), pch=0
は表示オプションで、カラーとプロットの形を設定します。
上記を踏まえて、今回の3つの値をグラフに描画してみます。
rank2,3の前にそれぞれpar(new=T)
を読んでいますが、これは同じグラフ上に続けてグラフを描画するために必要な関数です。
今回、
1位 => 赤□
2位 => 緑◯
3位 => 青△ という設定にしてみました。
相関関係の分析
これらは遷移のデータではありますが、
最終的な順位と各区間の順位の相関関係も算出してみます。
- mean:平均値
- sd:標準偏差
- 偏差、というのは個々の平均との差のこと
- 標準偏差は、データの分布のばらつきの指標
- cor:相関係数
- ±.00〜±1.00までの範囲で、2つの変数にどれだけ関連性があるかを示す指標
- +であれば正の相関、-は負の相関(否定の関係)
平均値と標準偏差は各区間1位のケースについて出してみました。
各区間1位の相関係数が+0.98
なので、これは高い相関があると言えます。当然ですね。
また、これも当たり前の話ですが、優勝(最後に1位)であることと、各区間を2位で通過していることはあまり関連がありません。
逆に、優勝であること=各区間を3位で通過していないことは、結びつきが強いという負の相関になります。
ちなみに実際の統計では、有意水準などどれだけ信頼できる値であるかなどの分析や考察も必要になります。
考察
やはり優勝するためには最初から1位をキープすることが大事なようですが、
特に5区以降に首位を守れると優勝確率が高くなるようです。
また、今回は回数基準で出したので確率には触れていませんが、
優勝校が8区通過時点で3位以上にいる確率は100%となっています。
8区通過時点で4位だと優勝は不可能ということですね。
繰り返しますが、数字通りにいかないところが箱根駅伝の醍醐味なので、
優勝校に限らず、最後に急ブレーキしてしまうこともあります。(去年の中央大学みたいに)
来年の箱根駅伝も、今回のデータ通りなのか、それとも番狂わせがあるのかなど、少し意識しながら見れたら面白いですね。
その他Rの使い方
まずは基礎的なRの使い方を見てみましたが、
わかりやすいまとめがいくつかあったのでそちらを参考にしてみてください。
上記で触れましたが、データを処理するのにCSVやDBを使用する方法です。
また、RubyからRを使えるgemもあります。
リンクと同様ですが、Rubyで以下のようにRの関数を使うことができます。
require 'rsruby'
r = RSRuby::instance
puts r.sum(1,2,3) # => 6
RSRuby導入方法(かんたんに記述だけ)
$ export R_HOME=/Library/Frameworks/R.framework/Resources
$ sudo gem install rsruby -- --with-R-include=/Library/Frameworks/R.framework/Headers --with-R-lib=/Library/Frameworks/R.framework/Libraries
Password:
Building native extensions with: '--with-R-include=/Library/Frameworks/R.framework/Headers --with-R-lib=/Library/Frameworks/R.framework/Libraries'
This could take a while...
Successfully installed rsruby-0.5.1.1
Parsing documentation for rsruby-0.5.1.1
Installing ri documentation for rsruby-0.5.1.1
Done installing documentation for rsruby after 1 seconds
1 gem installed
$ gem list # 入っていることを確認
〜〜 中略 〜〜
rsruby (0.5.1.1)
〜〜 中略 〜〜
$ irb #実行確認
irb(main):001:0> require 'rsruby'
=> true
irb(main):002:0> r = RSRuby.instance
=> #<RSRuby:0x007fb8a9214b20 @default_mode=-1, @class_table={}, @proc_table={}, @caching=true, @cache={"get"=>#<RObj:0x007fb8a92147d8 @conversion=4, @wrap=false>, "T"=>true, "TRUE"=>true, "F"=>false, "FALSE"=>false, "parse"=>#<RObj:0x007fb8a9216b28 @conversion=4, @wrap=false>, "eval"=>#<RObj:0x007fb8a985fe08 @conversion=4, @wrap=false>, "NA"=>-2147483648, "NaN"=>NaN, "help"=>#<RObj:0x007fb8a985cbb8 @conversion=4, @wrap=0>, "helpfun"=>#<RObj:0x007fb8a985cbb8 @conversion=4, @wrap=0>}>
irb(main):003:0>
さいごに
大学でRというソフトも先生に言われるままにコマンドを打ち込んで使っていましたが、
このような形で卒業後に使うことになるとは思わなかったです。
社内にいろんなデータが転がっているのでそれを使えるともっと面白いと思います。
いろんなデータを解析して結びつきとか考えるのは楽しいですね!