2015年 3月 の投稿一覧

サッカーの勝敗予測モデルをベイズモデル化する

以前、サッカーの試合の勝敗をポアソン回帰を使って予測を行いました。
今回は上記モデルをベイズモデル化し、今後の発展的分析につなげていきたいと思います。

 

ベイズ統計と頻度統計の違い

厳密ではありませんが、おおざっぱに言うと下記です。
データの捉え方と母数の捉え方が違います。
 

頻度統計の考え方

・唯一無二のパラメータが決まっている(パラメータ=固定)
・得られたデータはサンプリングの結果たまたま得られたものとして扱う(データ=確率変数)
・得られたデータよって唯一無二のパラメータを推定する

 

ベイズ統計の考え方

・得られたデータを変更のしようがない唯一のものと考える (データ=固定)
・パラメータが確率的に変動するものとする(パラメータ=確率変数)
・得られたデータと事前分布によってパラメータを分布として推定する

 

分析内容

データ

プレミアリーグ2013-2014シーズンの全試合、2014-2015シーズンの1-19節
 

モデル

今回用いたJAGSコードは下記の通りです。

前回の記事同様、baselineと攻撃力・守備力・ホーム効果によってポアソン分布のパラメータであるラムダを推測するモデルです。
各パラメータの事前分布に関して、平均0の正規分布を仮定しています。

結果

結果は下記の通りです。いずれもRhat < 1.1となっているので収束していると判断することができます。  

攻撃力

attack

守備力

defense

その他のパラメータ

other

 
各チームの攻撃力・守備力をキャタピラプロットしてみると下記のようになっています。
一般化線形モデルで予測したものとほぼ同等の値となっています。
大きく違うのは、パラメータを唯一の値ではなく、分布として推定している点です。
下図の細線は2.5%-97.5%区間、太線は25%-75%区間、点は中央値です。
 

攻撃力

attack2

守備力

defense2

 
今回は事前分布の平均を0と仮定しています。
が、今回得られた値を事前分布に組み込むことで、
チームごとの各能力の推移を時系列でプロットできそうですね。
今後もベイズ統計の思想を使いながら、分析を掘り下げていきたいと思います。

Ruby + NokogiriでWebスクレイピング入門

Webスクレイピングとは ※1

ウェブスクレイピング(Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。ウェブ・クローラー(Web crawler) あるいはウェブ・スパイダー(Web spider)とも呼ばれる。

Webサイト上のテキストデータを活用したいけど、APIやCSV等が提供されていないというケースは結構多いですよね。
今回はウェブサイトからテキストデータを取得する方法を紹介をしたいと思います。

RubyのNokogiriというライブラリを使います。

 

環境構築

構築環境はUbuntu 14.04です。

という環境が構築できました。

Nokogiriの1.6系のものが入ります。
1.5系まではlibxml2やlibxsltも自分でインストールする必要があったのですが、
libxml2やlibxsltのバージョンの関係で動作しないケースが多々あったみたいです。
1.6系から依存ライブラリを同梱し、Nokogiriのインストール時に環境に合わせてビルドされるようになりました。※2

 

とりあえず動かしてみる

Yahooファイナンスから日経平均株価のヒストリカルデータを取得し、
CSVとして保存するサンプルです。

1-3行目:

必要ライブラリを読み込み

5行目:

スクレイピング先のURLを指定

7-11行目:

スクレイピング先の文字コードとHTMLの取得

13行目:

取得したHTMLをパースしてDOM化

15-23行目:

必要なデータの取得し、CSV化
必要データの抽出にはxpathで指定する方法※3とcssセレクタ※4で指定する方法の大きく2つの方法があります。上記ではxpath方式を使ってDOMを取得しています。

25-27行目:

CSVファイルの出力

 

Nokogiriを使ったWebスクレイピングまとめ

Nokogiriを使ったWebスクレイピングは下記プロセスでほとんど対応できるかと。

スクレイピング先のURLの指定
 ↓
HTMLの取得
 ↓
取得したHTMLをDOM化
 ↓
必要情報の抽出
 ↓
データの保存

あとは、xpathなりcssセレクタを良い感じに書くこと。
各方式の書き方は下記※3※4を参考にしてください。


※1 Wikipedia – ウェブスクレイピング
※2 http://qiita.com/suu_g/items/fcf549e16c797a9d7dc0
※3 実際に書くにあたってはこのサイトや、チートシートが大変役に立ちます。
※4 CSSセレクタの基本的な内容はこのサイトとかを参考に。

競馬の記述統計 【中山芝2000m編】

以前、ロジスティック回帰を使って競走馬の勝敗予測を行いました。
説明変数として、過去2年間の出走成績を用いたのですが、
もっと良い説明変数があるんではないでしょうか。
より良い変数を検討するため、集計・検定を行ってみたいと思います。

 

使用データ

競馬場 : 中山
距離 : 2000m
馬場 : 芝
本賞金額 : 1600万円以上
期間 : 2004年1月1日 ~ 2014年12月31日

 

今回の集計・検定対象

・馬齢
・馬体重
・枠番

 

馬齢

Screen Shot 2015-03-09 at 2.37.57

Screen Shot 2015-03-09 at 2.38.04

barei

2歳および9歳以上は、サンプル数が少ないため、信頼性は低いですが、
グラフを見てわかる通り、4歳の1-3着以内の比率が多くなっています。

 

馬体重

Screen Shot 2015-03-09 at 3.05.12

Screen Shot 2015-03-09 at 3.05.20

bataijyu

420kg台、550kg台の比率が多くなっていますが、サンプル数が少ないからです。
ざっと見た印象だと、どの馬体重も大きな差が無いように見えます。

 

枠番

Screen Shot 2015-03-09 at 3.31.09

Screen Shot 2015-03-09 at 3.31.19

wakuban

4枠の1-3着以内比率が低くなっています。

 

t検定

1-3着以内と4着以降の馬の対象変数(馬齢、馬体重、枠番)の母平均に差があるかどうかを検定します。
帰無仮説 : 母平均に差がない
対立仮説 : 母平均に差がある
有効水準は0.05とする。

Screen Shot 2015-03-09 at 3.54.52

 

結論と今後

馬齢、馬体重、枠番とも、有意差がないという結論となりました。
ただし、今回は検証データは中山芝2000mとしているため、他の競技場の場合は別の結論になるかもしれません。

次回以降では一般の競馬ファンが考慮している、前走成績や前走距離などの検証も行いたいと思います。
乞うご期待!

JAGSとRでマルコフ連鎖モンテカルロ法

今日はベイズモデリングに必要なマルコフ連鎖モンテカルロ法を行うための設定と、
簡単なサンプルを紹介したいと思います。
マルコフ連鎖モンテカルロ法を行うライブラリは様々なものがあるのですが、※1
今回はJAGSをRから使えるように設定していきたいと思います。

 

ざっくり、マルコフ連鎖モンテカルロ法とは

「マルコフ連鎖モンテカルロ法」とは確率分布のサンプリングを行うアルゴリズムで、
「マルコフ連鎖」と「モンテカルロ法」の2つの言葉から成り立っています。

 
マルコフ連鎖
マルコフ連鎖とはマルコフ性をもつ確率過程(時間とともに変化する確率変数)のうち、取りうる事象が離散的なものをいいます。
次の状態が過去の状態に依存せず現在の状態のみによって決まる性質です。※2

 
モンテカルロ法
乱数をつかってシミュレーションや数値計算を行う手法のことです。

 

JAGSのインストール

マルコフ連鎖モンテカルロ法(MCMC)をおこなうためのライブラリです。
MACの場合、こちら からダウンロードしてください。
dmgファイルで落とせるので、展開して、pkgファイルをインストールすれば完了です。
簡単ですね!

 

R2jagsのインストール

JAGSをRから使えるようにするにはライブラリを入れる必要があります。
今回はR2jagsを設定します。

Rを立ち上げます

sudo R

Rにて

install.packages(‘R2jags’)

以上です。こちらも非常に簡単です。

 

テストデータによるベイズモデリング

前々回のサッカーの勝敗予測の記事でポアソン分布を使ったので、
ポアソン分布でテストしてみましょう。

テストデータで使用した係数を未知として、MCMCで推定します。

 
alphaの推定結果
RplotAlpha

 
betaの推定結果
RplotBeta

Screen Shot 2015-03-01 at 17.31.24

という形でalpha、betaそれぞれの分布を推定した結果、
alphaの分布の平均値は0.447 (テストデータは0.5)、betaの平均値は2.037(テストデータは2)と推定することができました。
Rhatも1.1以下となっているので収束していると判断できます。※3

競馬の勝敗(ロジスティック回帰)サッカーの勝敗予想(ポアソン回帰)のベイズモデル化にも取り組んで行きたいと思います。

 

環境

OS : Mac OSX 10.9.5
R version : 3.1.2


※1 WinBUGSとかOpenBUGSとかStanとか。こちらによくまとまっています → http://www7.atwiki.jp/hayatoiijima/pages/61.html
※2 こういった応用事例もあります → マルコフ連鎖で日本語をもっともらしく要約する
※3 http://takehiko-i-hayashi.hatenablog.com/entry/20100512/1273643029