未分類

「RをWEBアプリケーションに」Shinyを使ってみた(お試し編)

こんにちは、mergyです。前回までテキスト自動要約の手法を書いていたのですが、一旦お休みして、今回は趣向を変えたテーマで書きたいと思います。
Rのpackage「Shiny」を紹介します。

Shinyとは

Rは解析をするのにとっても便利ですが、解析結果を誰かに見せるときに意外と不便だったりしますよね。
Shinyは、そんな悩みを解決する、Rで書いたスクリプトを簡単にWEBアプリに出来るパッケージです。

動作環境

Mac Yosemite 10.10.4
RStudio Version 0.98.1103
R version 3.2.0

Shiny使い方

RStudioのメニューから「File」→「New Project」を選択し、
「Create project from:」の画面が表示されたら「Shiny Web Application」を選びましょう。

new_project

その後はディレクトリ名を決めて「Create Project」を押すだけです。

directly_name

実はRstudioでは最初からサンプルが用意されており、projectを作成した後に以下のコマンドを入力するだけでサンプルを実行することが出来ます。

実行した結果が以下になります。

Old_Faithful_Geyser_Data

このようにブラウザでRの解析結果を見ることが出来ます。
Shinyは内部でtwitter bootstrapを利用しているのでUIもキレイです。

注目すべきは、左側のスライダーです。これを変更すると…

Old_Faithful_Geyser_Data2

動的にグラフが描画されます。とても便利ですね。

GithubにShinyのexampleがあるので、git cloneしておくとよいでしょう。
試しに「050-kmeans-example」を使ってみます。

Iris_k-means_clustering

「050-kmeans-example」の場合、X軸変数、Y軸変数、クラスター数を動的に変更することが出来ます。
このように簡単に解析結果をブラウザで表示し、直感的な操作で動的に結果を変更することが可能です。

まとめ

Rのpackage「Shiny」を試しに使ってみました。
次回はもう一歩踏み込んで、サーバーでの実行について書きたいと思います。

Microsoft Project Oxford の Face API で顔認識をしてみる

少し前にHow-Old.netがバズっていましたね。
How-Old.netはProject OxfordのFaceAPIを使っているらしいです。

本日は、この Project Oxford の FaceAPI を使って顔写真から顔を認識する方法を紹介したいと思います。

subscription-keyを取得する

Azureのアカウントが必要になりますので、登録しましょう。
AzureのMarket PlaceよりFaceAPIを追加します。

face_api_on_azure

追加が完了するとsubscription-keyが取得できます。

サンプルコード(PHP)

画像のurlをGETで渡して顔認識するサンプルコードです。
FaceAPIへのリクエストにはPEARのHTTP_Request2を使ってます。
11行目のsubscription-keyは上記で取得したものに置き換えてください。

実行結果

上記のサンプルコードを実行すると下記のような形で結果が返ってきます。
http://[your_serve_address]/face_api_sample.php?url=[img_url]

faceRectangle は認識した顔の画像上の位置です。
attributes内のgenderは性別、ageは年齢ですね。

いろんな人を認識してみた

face_api_female

Photo by tommerton2010


varanasi - uttar pradesh - india

Photo by nevil zaveri


face_api_kids

Photo by ND Strupler

おわりに

ざっと見る感じ、そこそこ良い精度で認識できていそうですね。
最後の子供2人の写真は両方ともfemaleで認識されていますが…

顔認識のといえば、AlchemyAPI Face DetectionFace++が有名でしたが、
MSのAPIの登場で勢力が一変しました。

Project Oxfordは顔認識以外にも面白そうなAPIが多いので色々いじってみたいと思います。

階層ベイズモデルでサッカーチームの攻撃力と守備力を推定する【リーガ・エスパニョーラ編】

以前プレミアリーグの主要チームの攻撃力・守備力の推定を行いました。
今回はリーガ・エスパニョーラのチームの攻撃力と守備力を以前と同様の階層ベイズモデルで推定を行いたいと思います。

はじめに

利用したデータ

前回と同様、データは football-data.co.uk のデータを10年分使用しています。

team_participation_laliga

各チームごとに1部リーグに参加した年は黒丸をプロットしています。
X軸に記載されている年は、その年から始まるリーグを意味しています。2005だったら、2005-2006シーズンのデータです。

分析対象とするチーム

今回は10年間1部リーグでプレイし続けているチームに関して、チームの攻撃力と守備力の推定結果を紹介します。
該当するチームはAthletic Bilbao、Atlético Madrid、Barcelona、Espanol、Getafe、RealMadrid、Sevilla、Valencia の8チームでした。
今回はこの8チームに関して、攻撃力と守備力を定量的に見てましょう。

その他細かい点

その他、モデルのコードや数値の見方等は前回の記事を参照してください。
今回はn.iter=10000, n.burnin=1000, n.chains=3で全てのパラメータが収束しました。

 

分析結果

アスレティック・ビルバオ

AthBilbaoAttackStrength
AthBilbaoDefenseStrength

 

アトレティコ・マドリード

AthMadridAttackStrength
AthMadridDefenseStrength

 

バルセロナ

BarcelonaAttackStrength
BarcelonaDefenseStrength

 

エスパニョール

EspanolAttackStrength
EspanolDefenseStrength

 

ヘタフェ

GetafeAttackStrength
GetafeDefenseStrength

 

レアル・マドリード

RealMadridAttackStrength
RealMadridDefenseStrength

 

セビージャ

SevillaAttackStrength
SevillaDefenseStrength

 

バレンシア

ValenciaAttackStrength
ValenciaDefenseStrength

やはり、バルセロナ、レアル・マドリードが圧倒、次いでアトレティコ・マドリードですね。
今季の攻撃力・守備力のチーム間比較は下記の通り。

2014-2015シーズンの攻撃力・守備力のチーム間比較

LaligaAttack2015
LaligaDefense2015

レアル・マドリード、バルセロナの攻撃力は群を抜いています。
また、守備はバルセロナ、次いでアトレティコ・マドリードが抜けています。
攻撃のレアル、守備のアトレティコ、高いレベルでバランスの良いバルセロナと言えそうですね。

優勝争いはバルセロナとレアルになりそうですが、残り5節。要注目です。

AzureのVirtual Machineで大規模データ解析もサクサクこなせるR環境を構築する

分析を進めるにあたって試行錯誤のスピードを上げるのって大事ですよね。

そこそこのマシンでも、ちょっとした集計なんかは対して時間がかかりませんが、
機械学習やMCMCなどの計算処理をブン回したいときは非力なマシンだと時間がかかってしょうがないです。

計算処理の高速化はそれこそ様々な手法がありますが、
今回はAzureを使って計算リソースのスケールアップすることができるRStudio Server環境の構築方法を紹介したいと思います。

Ubuntu14.04で構築することを前提に進めていきます。

 

1. Virtual Machineを作成する

Azureの管理ポータルからVirtual Machineを作成します。
DNA NAME, SIZE, NEW PASSWORD, CONFIRM, REGION の各項目を入力して、CREATE A VIRTUAL MACHINE をクリックします。

create-virtual-machine

2. SSHでログインする

Virtual Machineを作る際に設定したパスワードを入力し、ログインします。

 

3. Rのインストール

あとは、分析の際に使うパッケージを入れてください。
Ubuntuの場合

で大体入ります。

見つからない場合は、下記レポジトリを追加してみましょう。

 

4. Rstudio Serverのインストール

バージョンは今日現在の情報ですので、最新版はこちらを参考にしてください。

 

5. ポート開放

Rstudio Server はデフォルトで8787ポートを使います。
Azureでは管理ポータルからポート開放をする必要があります。
open-port

6. Rstudio Server にログインする

login-to-rstudio
Rstudio Server には Linux のユーザーアカウントでログインできます。
ID : azureuser
Pass : {Virtual Machine 作成時に設定した PASSWORD}
ですね。

 

7. 計算リソースのスケールアップの仕方

Virtual Machineを停止させ、CONFIGURE画面から、VIRTUAL MACHINE SIZE を変更することができます。
適したサイズを選んで、再度 Virtual Machine を起動させましょう。
試しに、D14インスタンス(CPU 16コア、Memory 112GB)を立ち上げてみます。
scale-up

CPUコア数

cpu-cores
 

メモリ容量

memory-amount
 

という感じでスケールアップが自由自在な分析マシンが構築できました。
インスタンスサイズには注意しつつ、使いましょう!


参考サイト
cran2deb4ubuntu | The Ubuntu R Blog
RStudio – Download RStudio Server
Getting Started – RStudio Support

階層ベイズモデルでサッカーチームの攻撃力と守備力を推定する【プレミアリーグ編】

階層ベイズモデルを用いて、プレミアリーグの主要チームの攻撃力と守備力を時系列で推定しました。
過去に書いた、一般化線形モデルのポアソン回帰を用いて攻撃力と守備力を推定した記事と、サッカーの勝敗予想をベイズモデル化した記事の合わせ技 + αな内容となっております。

目次

 

はじめに

利用したデータ

データは football-data.co.uk のプレミアリーグのデータを10年分使用しています。
どの国のリーグでも言えることですが、下位チームの降格、下位リーグの上位チームの昇格があります。
下図の通り、シーズンごとにプレミアリーグに参加しているチームが異なっています。

team_participation

各チームごとにプレミアリーグに参加した年は黒丸をプロットしています。
X軸に記載されている年は、その年から始まるリーグを意味しています。2005だったら、2005-2006シーズンのデータです。
また、今シーズンのデータに関しては、2015年3月22日に行われた試合までを対象としています。

分析対象とするチーム

今回は10年間プレミアリーグでプレイし続けているチームに関して、チームの攻撃力と守備力の推定結果を紹介します。
該当するチームはArsenal、Aston Villa、Chelsea、Everton、Manchester City、Manchester United、Tottenham の7チームでした。
この7チームに関して、攻撃力と守備力を定量的に見てましょう。
 

モデル

前提

以前の記事と同様、ゴール数はポアソン分布に従うという前提のもとモデルを構築しています。
ポアソン分布のパラメータであるλをいかに推定するかという問題になるわけですが、
ざっくり表現すると、

LambdaHome = exp(Baseline + HomeAttack - AwayDefense + HomeEffect)\\LambdaAway = exp(Baseline + AwayAttack - HomeDefense)

という形でλを推定しています。

このモデルの前提として、
・各チームの攻撃力・守備力は前年の攻撃力・守備力を平均とする正規分布に従う(分析初年度の2005年を除く)
・各チームの攻撃力・守備力のばらつきはチームごとに定義され、10年間で一定である
・各チームの攻撃力・守備力はシーズン中の変化しない

詳しくは下記コードで。

モデルのJAGSコード

RからJagsを叩いており、Rから下記のパラメータを投げています。

YH ホームチームの得点数
YA アウェイチームの得点数
XHT ホームチーム
XAT アウェイチーム
XS シーズン
XNG 10年間の総試合数
XNT 10年間にプレミアリーグでプレーしたチーム数
XNS シーズン数


MCMCの計算と結果

n.iter=105000, n.burnin=5000, n.chains=3で収束しました。※1


分析結果の見方

結果のサンプル

ArsenalAttackStrength



こんな感じで10年分の変化をプロットします。

Y軸の数値の意味

上で紹介したホームチームのλの計算式を分解すると、

LambdaHome\\= exp(Baseline + HomeAttack + AwayDefense + HomeEffect)\\= exp(Baseline)\times exp(HomeAttack)\times exp(AwayDefense)\times exp(HomeEffect)
ここでBaselineは

2005 0.04590155
2006 0.019349518
2007 0.047285737
2008 0.021237398
2009 0.059335881
2010 0.10370445
2011 0.123273471
2012 0.112604102
2013 0.082352007
2014 0.045952234



という結果になっています。
話を単純化するため、BaselineとHomeAttackだけを見てみましょう。
今年の攻撃力の値を見るとして、2014年のBaselineを仮定します。

exp(Baseline)\times exp(HomeAttack)\\= exp(0.045952234)\times exp(HomeAttack)
でホームチームの攻撃力が0.5だとすると

= exp(0.045952234)\times exp(0.5)\\\approx 1.047 \times 1.648
λを押し上げる分だけを考慮すると

\approx 1.047 \times 0.648= 0.678
となり、攻撃力が0.5ということはλを0.678だけ押し上げる要因となります。

λってなんだったっけ

今回のモデルは最終的にはλを推定しているわけですが、このλが何だったか、今一度確認しておきましょう。
推定しているのはポアソン分布のパラメータであるλです。

ポアソン分布は下記の式で定義される確率分布です。
P(X = k) = \frac{\lambda^k\mathrm{e}^{-\lambda}}{k!}
「単位時間中に平均で λ 回発生する事象がちょうど k 回発生する確率」
今回のケースにあてはめて意訳すると
「90分間に平均で λ 得点するチームがちょうど k 点いれる確率」
つまり、1試合で期待される得点数ですね。(実際ポアソン分布の期待値はλです)

というわけで、「攻撃力が0.5ということは、λを0.678だけ押し上げる」ということは
「攻撃力が0.5ということは、1試合で期待される得点数を0.678点押し上げる効果がある」
という意味です。

これは単純化した話なので、実際にはこれらに加え、相手チームの守備力・ホームチームの効果が加味されます。

濃いグレー・薄いグレー

図中の黒実線のまわりの濃いグレーはMCMCによって推定されたパラメータの50%区間、
さらにその外側の薄いグレーの部分は95%区間を示しています。

 
図の前提の説明が長くなりましたが、結果をみてみましょう。

 

分析結果

Arsenal

ArsenalAttackStrength
ArsenalDefenseStrength

今シーズンは攻撃が過去最高クラスになっている模様。
また、2012シーズンには前年に比べ、守備が結果を出しています。
2012シーズンってコシールニーがフェルメーレンからレギュラーを勝ち取ったシーズンです。

 

Aston Villa

AstonVillaAttackStrength
AstonVillaDefenseStrength

緩やかに衰退しています。特に攻撃。
守備力は2012シーズンから徐々に上がっています。
2012シーズンの夏って現主将でディフェンダーのロン・フラールが加入した年なんですよね。

 

Chelsea

ChelseaAttackStrength
ChelseaDefenseStrength

近年チェルシーといえば、2009シーズンですね。
リーグ戦優勝、FAカップ優勝と2冠を達成した年です。シーズン通算で103得点し、当時の最高記録を塗り替えました。
その後に低迷し、徐々に盛り返している模様。
今シーズンはジエゴコスタ等、攻撃陣の補強がうまくいき、2009シーズンに近い水準の攻撃力となっています。

 

Everton

EvertonAttackStrength
EvertonDefenseStrength

順調に伸び、2012シーズン、2013シーズンあたりがピークです。
今シーズンは良くないですね。

 

Liverpool

LiverpoolAttackStrength
LiverpoolDefenseStrength

攻撃は2,3シーズンごとに好不調を繰り返しています。守備は徐々に衰退。
2012シーズンと2013シーズンは攻撃力が大きく伸びていますが、完全にスアレスの仕業です。

 

Manchester City

ManCityAttackStrength
ManCityDefenseStrength

攻撃・守備ともに0付近だったのが、今や、リーグトップクラスです。
そもそも2005シーズンとか15位ですから、わりと降格ギリギリなわけです。
皆さんご存知の2008年にUAEの投資グループ、アブダビ・ユナイテッド・グループに買収されてからの躍進が凄いですね。

 

Manchester United

ManUnitedAttackStrength
ManUnitedDefenseStrength

昨シーズンは結果を残せませんでした。とは言え、2005シーズンとほぼ同等の実力となっています。
チェルシーやシティなどがこれを上回る実力をつけているため、リーグ内の順位という結果には結びついていないようです。
今期は攻撃陣を大型補強したにも関わらず、守備陣の方が結果をだしているように見えますね。

 

Tottenham

TottenhamAttackStrength
TottenhamDefenseStrength

守備力は2011シーズンを境に絶賛下落中です。
2013シーズンが始まる前の夏に大型補強を行なったにも関わらず、2013シーズンは結果が出ていませんね。

 

おわりに

というわけでプレミアリーグ編でした。
次回は別のリーグのチームごとの能力を推定します。
Jリーグも分析したい。乞うご期待!



参考サイト
http://www.sumsar.net/blog/2013/07/modeling-match-results-in-la-liga-part-one/
http://heartruptcy.blog.fc2.com/blog-entry-68.html

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

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

 

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

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

頻度統計の考え方

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

 

ベイズ統計の考え方

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

 

分析内容

データ

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

モデル

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

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

結果

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

攻撃力

attack

守備力

defense

その他のパラメータ

other

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

攻撃力

attack2

守備力

defense2

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

競馬の記述統計 【中山芝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

プレミアリーグのチームごとの攻撃力・守備力を可視化する

前回はポアソン回帰を使って、勝敗の予測をしました。
今回は回帰結果の係数を使って、チームごとの攻撃力・守備力の可視化を行いたいと思います。

前回、下記の式を使って、各係数の推定を行いました。
 
log\lambda = \alpha + \beta_0 Team + \beta_1 Opponent + \beta_2 Home

Team : 得点を推定したいチーム
Opponent : 対戦相手
Home : ホームグラウンドか否か
をあらわしていますので、
それぞれにつく係数は
\beta_0 : 攻撃力
\beta_1 : 守備力
\beta_2 : ホームグラウンド効果
を意味します。

 

プレミアリーグ2014-2015シーズンの各チームの攻撃力・攻撃力

前回と同様プレミアリーグのデータを用いるのですが、2014-2015シーズンの前半(第1節 ~ 第19節)で計算しなおしました。
リーグ内の平均値を0とし、プロットすると下記のようになります。

Screen Shot 2015-02-22 at 18.02.07

攻撃も守備も優れるチーム : チェルシー、マンチェスター・シティ、マンチェスターユナイテッド、サウサンプトン
攻撃は優れるが、守備が劣るチーム : エバートン、(リバプール)
攻撃は劣るが、守備が優れるチーム : トッテナム、スウォンジー、ストーク
攻撃も劣り、守備も劣るチーム : その他

という形でチームの力が視覚的に分かりやすくなりました。

 

プレミアリーグ2013-2014シーズンの各チームの攻撃力・攻撃力

プレミアリーグ2013-2014 (第1節 ~ 第38節)のデータをもとにプロットすると下記のようになります。
特に変化が大きいチームに関して、変化の要因を移籍情報から推察してみましょう。

Screen Shot 2015-02-22 at 18.01.22

リバプール

守備はさほど変わっていないのですが、今期は攻撃力が大きく下降しています。
大きく要因として考えられるのは昨シーズンの得点王であったルイス・スアレスの移籍と
得点ランク2位だったダニエル・スタリッジの負傷による離脱でしょう。
また、スアレスの穴を埋めるべく、マリオ・バロテッリをACミランから獲得しているのですが、活躍できていないのがデータにも現れています。

ウェストハム

一方攻撃力を大きく伸ばしたのがウェストハムです。
今シーズン獲得したディアフラ・サコを8得点、2013-2014シーズンの終わりごろに加入したアンディ・キャロルは5点と、
フォワードの補強がうまくいった結果、攻撃力が伸びています。

チェルシー

昨シーズンは守備力に偏っていたチェルシーですが、
ディエゴ・コスタ、ディディエ・ドログバ、ロイク・レミーと今シーズンはフォワードを厚めに獲得した結果、攻撃力の補強に貢献しています。
特にディエゴ・コスタは今シーズンで17得点をあげており、マンチェスター・シティのアグエロと同点で暫定得点王となっています。

 

チーム軸・プレーヤー軸

今回はチームとその得点を軸に分析、考察しましたが、
チームを形作っているのはそれぞれのプレーヤーです。
プレーヤーごとの分析、たとえば、得点への貢献度など推定できたら面白いですね。
今後はチームベースの分析も行いつつ、選手ごとの分析にも着手していきたいと思います。

なんにせよ、今後もプレミアリーグから目が離せませんね!

ポアソン回帰を使ったサッカーの勝敗予測

統計モデルを使ったサッカーの予測をしてみたいと思います。
今回はサッカーの得点数をポアソン分布へあてはめることで、
それぞれのチームが勝つ確率がどの程度あるのかを計算します。
 

ポアソン分布

サッカー試合の得点数はポアソン分布に従うと言われています。※1

ポアソン分布は、下記の式で定義される確率分布です。
 
P(X = k) = \frac{\lambda^k\mathrm{e}^{-\lambda}}{k!}
Pは単位時間中に平均でλ回発生する事象がちょうどk回発生する確率で、
サッカーでいうと、「1試合という時間内」に「得点する」という事象が起こる回数の確率です。
1年間の地震の発生件数や台風の上陸件数、一定期間内の交通事故や火災の発生件数などのあてはめにも用いられています。

 

ポアソン回帰

ポアソン分布にあてはめるにあたり、パラメータλを求める必要があります。
λは単位時間内の平均発生回数です。

しかし、サッカーの場合対戦相手等によって、平均発生回数(期待得点数)が異なることが想定できます。
例えば、柏レイソルが、レアルマドリードと対戦するのと、草サッカーチームと対戦するのでは、
平均発生回数(期待得点数)が違うでしょう。

そこで、対戦する状況に応じた得点数を推定するためポアソン回帰分析を行います。
ポアソン回帰分析とは、一般化線形モデルのひとつで、
被説明変数がポアソン分布すると仮定する場合に用いられる回帰モデルです。

 

回帰式と変数

今回構築したモデルは下記の通り。

log\lambda = \alpha + \beta_0 Team + \beta_1 Opponent + \beta_2 Home
Team : 得点を推定したいチーム
Opponent : 対戦相手
Home : ホームグラウンドか否か

今回は、自チーム、対戦相手、ホームか否かを説明変数として用います。
λを上記のように推定することで、対戦相手やホームどうかに応じた平均発生回数(期待得点数)を推定することができます。

それぞれの係数は
\beta_0 : 攻撃力
\beta_1 : 守備力
\beta_2 : ホームグラウンド効果
であると言えます。

 

回帰結果

データはプレミアリーグ2013-2014シーズンと2014-2015シーズンの前半(19節まで)を用いました。

Screen Shot 2015-02-20 at 19.12.03

例えば、チェルシー(ホーム) vs エバートン(アウェイ) の場合、

チェルシーの平均発生回数(期待得点数)は
exp(Intercept + TeamChelsea + OpponentEverton + Home)
= exp(0.25707 + 0.07575 + 0.07904 + 0.27688)
= 1.99120

エバートンの平均発生回数(期待得点数)は
exp(Intercept + TeamEverton + OpponentChelsea)
= exp(0.25707 - 0.12072 - 0.44405)
= 0.73513

 
これらをλとしてポアソン分布にあてはめると、下記のようになります。
Screen Shot 2015-02-20 at 19.38.56
チェルシーの方がエバートンよりも得点を多くとる確率が高いことが分かります。
これらを用いて試合の”勝敗”を予測する方法を説明します。

 

勝敗の予測

ポアソン分布にあてはめを行うことで、発生回数(得点数)が実現する確率を計算することができます。
対戦相手同士の得点数は独立であると仮定すると、ホームチームがx点とって、
アウェイチームがy点とるといった事象は同時確率を計算することで求めることができます。
例えば、チェルシー(ホーム)が得点数の確率を
P(X = x)
エバートン(アウェイ)の得点数の確率を
P(Y = y)
とし、チェルシーが2点とって、エバートンが1点とる確率は、
P(X = 2) = \frac{1.99120^2 \mathrm{e}^{-1.99120}}{2!} = 0.27068
P(Y = 1) = \frac{0.73513^1 \mathrm{e}^{-0.73513}}{1!} = 0.35245
P(X = 2, Y = 1) = P(X = 2) P(Y = 1) = 0.09581
といった形で計算することができます。
およそ9.5%の確率であることがわかります。
 
チェルシーが勝つという事象はエバートンより多く得点をとることなので、
P(X > y)がチェルシーの勝つ確率であり、
P(Y > x)がエバートンの勝つ確率、
P(X = y, Y=x)が引き分けの確率であると言えます。

全て計算すると下記のようになります。

Screen Shot 2015-02-21 at 0.04.46

青い部分がチェルシーが勝つ確率であるP(X > y)、緑の部分がエバートンが勝つ確率であるP(Y > x)、グレーの部分が引き分けの確率であるP(X = y, Y=x)となっています。

P(X > y) = 0.66888
P(Y > x) = 0.20260
P(X = y, Y=x) = 0.12853

ということでチェルシーの勝つ確率が高いということが分かりました。

 

2014-2015シーズン20節 ~ 25節での検証

上記の方法で確率を計算し、確率が最大な結果を予想とする方法で正解率を計算しました。
試合数 : 60
正解数 : 31
正解率 : 51.67%

勝ち・引き分け・負けを完全にランダムに選ぶとしたら、確率が33.33%であるものを
半分程度の精度であてることができるという結果となりました。

【参考】予想結果
Screen Shot 2015-02-21 at 0.45.07


※1 例えば
・Maher M.J. (1982), Modelling Association Football scores. Statistica Neerlandica, 36, 109-118
・Mark J. Dixon and Coles S.G. (1997) Modeling Association Football Scores and Inefficiencies in the Football Betting Market, Applied Statistics, Volume 46, Issue 2, 265-280