レーティングアルゴリズムGlicko2を使ったランキング予測

色々紆余曲折有り、最近またプログラミングをやっています。半分趣味、半分仕事とでも言うか。しかし久しぶりにコード書くと(しかも仕事じゃなく趣味として書くと)すごく楽しい。この1〜2ヶ月リハビリ的にちょこちょこ書いていたせいで大分感が戻ってきた。相変わらずテストコード書かないし、汚いコーディングなのだけど。。
さてそんなこんなで今試してみているのはGlicko2というチェスや将棋の順位付けの為のレーティングアルゴリズムを使った色々な実験。
日本棋士国内レーティング計算詳細
Glicko rating system - Wikipedia
このアルゴリズムは、全員と対戦をしなくても少ない対戦数である程度の確度の高いレーティングを出せるというもの。計算のステップ概要は下記

    1. レーティング値を用いて期待勝率を計算(レーティングの差が大きいほど期待勝利が大きくなる)
    2. レーティングの信頼度(本来の強さへの信頼度)とボラティリティ(変動幅)を設定
    3. Glicko2アルゴリズム(それぞれ独立にある平均と標準偏差をもつ正規分布に従うと仮定したベイズの定理を適用)を用いてレーティングの計算を行う(詳細は理解できていませんが…。)

というようなもの。簡単に言うと強い人に勝つとレーティングが大きく上がるが、弱い人に勝手もレーティングはほんの少ししか上がらないというようなもの。そこにレーティングの信頼度(連続して試合をすると信頼度が高く、間隔があくと低い)とレーティングの変動幅を用いて調整している感じ。
Glicko2のアルゴリズムGithubPHPで実装したものが有ったのでそちらを利用。
https://github.com/Zarel/glicko2-php
データは今年(2012年)のJ1の試合データを使ってみた。
http://www.j-league.or.jp/data/2/?league=j1&genre=week
試合が進むごとにすこしづつ信頼性を高めに設定。また変動幅も試合が進むごとに少なくなるよう設定。
J1の試合は18チームが総当たりでホームとアウェイの2回対戦で全34節306試合。Glicko2アルゴリズムを用いて計算してみるとだいたい15節ぐらいで最終34節の結果にだいぶ近づいてくる。最終節の順位とGlicko2で算出した途中節の順位の誤差の合計は下記

    1. 第1節:96
    2. 第2節:106
    3. 第3節:90
    4. 第4節:74
    5. 第5節:72
    6. 第6節:68
    7. 第7節:76
    8. 第8節:60
    9. 第9節:62
    10. 第10節:60
    11. 第11節:62
    12. 第12節:52
    13. 第13節:54
    14. 第14節:44
    15. 第15節:38
    16. 第16節:34
    17. 第17節:24…


最終34節でも26の誤差が有りますが、Jリーグの順位計算法は基本的には積み上げ式なのに対して、Glicko2は統計と確率からの予測なので誤差が発生します。Jリーグももっと試合数が多ければこちらの順位に近づくのかも。。下記実際のスクリプトの出力画面。

上記の「org」は17節時のJ1集計ルールによるオリジナルの順位を表しています。オリジナルの順位に比べるとFC東京、磐田、鹿島あたりは最終順位に近い数値を出しているし、全体的にオリジナルの17節時の順位よりも最終順位に近い数値が出ています。
対戦順とかを動的に組み合わせ有られるならばもっと早く確度の高いレーティングは出せそうなので、次回はもっと素早く確度の高いレーティングを出すための対戦組み合わせを考えるアルゴリズムを作ってみたい。難しそうだが。。