フローサービスでイロレーティングのシステムを作りましょう

チェス、将棋などの競技業界では、「イロレーティング」という算出法で棋士の強さを示します。現在、国際チェス連盟、韓国棋院、中国棋院などの競技組織はイロレーティングを利用して棋士のレートランキングを計算して管理しています。少し前には、イロレーティングで各国サッカー代表チームのランキングを作ってみたら、FIFAランキングより説得力があるという話もありました。個人でイロレーティングシステムを作るのは難しいでしょうか? ASTERIA WARPのフローサービスを利用すれば、誰でも簡単にイロレーティングのシステムを作れます。今回はイロレーティングを使って、今年行われたFIFAワールドカップの予選リーグの結果を予想してみます。

イロレーティングは次のようなものです

  1. 一般的に、イロレーティングの使い方は2つです:
    1. 試合の結果により、棋士・選手・チームのレートを計算して更新する
    2. 対戦相手のレートにより、次の試合の勝負を予想する
    今回紹介するのは、2で、イロレーティングにより、試合の勝負を計算して予想します。
  2. イロレーティングによる勝率の計算方法は次です:
    elo1.png
    この計算は難しいので、一般的には、勝率表を参照して計算します。
    今回は、CSVで勝率表を保存します。

 

 

勝率の計算

勝率表の準備

以下のような内容のCSVファイルを作っておいてください:
0,0.5
10,0.514
20,0.529
30,0.543
40,0.557
1列目はイロレーティングの点数の差の絶対値で、2列目は(強い方の)勝率です。ここに書いたものは勝率表の一部です。完全な勝率表は添付ファイルにあります。

勝率の生成

フローデザイナーで「EloRating」というプロジェクトを作成して、「Ratio」というフローを作ってください。
フローは次のようになります:
 elo2.png

フローに4つのフロー変数を追加します。これらの変数に対戦相手の情報(名前とレート)を設定します。
elo3.png

マッパーで勝率を生成します
elo4.png
まずはSubtract関数とAbs関数で2人のレートの差の絶対値を計算します。そしてTable関数で勝率表を参照します。「ファイルパス」プロパティーに先の勝率表のcsvファイルを指定し、キーと値の列の位置も指定します。勝率表の値は強い方の勝率なので、Subtract関数で「1 - 強い方の勝率」の方法で弱い方の勝率を計算します。それから、If関数で2つの勝率を選択します。2人のレートの差は0より大きい場合、つまりplayer1のレートの方が高い場合、強い方の勝率を出力します。それに対して、0より小さい場合、弱い方の勝率を出力します。
これで、player1の勝率がフローの結果として出力されます。
ここのサンプルでは、両者のレートの差は「2700 - 2600 = 100」なので、フローを実行すると結果は0.64(つまり64%)となります。

 

FIFAワールドカップのシミュレーション

試合の勝率を計算できるなら、大会の結果を予想することもできます。それでは、今年の一大イベント――サッカーのワールドカップの予選リーグを例として予想しましょう。
ちなみに、サッカーでは、FIFAランキングという公式なランキングがあります。このランキングを使えば、各グループの順位を予想できますが、勝ち点の計算はできません。そして、ホームアドバンテージの計算もできません。それに対して、イロレーティングなら勝ち点の計算もホームアドバンテージの計算も簡単にできます。

計算方法

勝ち点の計算

イロレーティングはチェスのために開発されたものです。チェスの大会では、勝者は1点、敗者は0点、そして引き分けの場合は両者とも0.5点を獲得します。そのため、イロレーティングで勝ち点を計算するとき、引き分けを半分勝ち、半分負けだと考えます。しかしサッカーの試合では、勝者は3点、敗者は0点、引き分けの場合は両者は1点です。引き分けの場合の勝ち点は、勝者の勝ち点の半分ではないので、引き分けの場合はチェスのような計算方法にはできません。
統計結果により、サッカーの引き分けの確率は全体的に25%ぐらいです。しかし、両チームの実力の差により、引き分けの確率は明らかに変わります。両チームの実力の差が大きければ大きいほど、引き分けの確率は低くなるはずです。こういう統計数字はなさそうなので、ここでは「引き分けの確率は弱い方の勝率と同じだ」という仮説を使用します。これで、弱い方の勝率が低い場合、引き分けの確率もそれに応じて低くなります。
上記の仮説を利用して勝ち点の計算式を考えましょう。例えば、自分のチームは弱い方で、イロレーティングでの勝率をrとします。すると、相手の勝率は1-rとなります。ここのrと1-rは、引き分けを含む数字です。イロレーティングでは引き分けを半分勝ち、半分負けと考えるので、引き分けの確率をdとしたら、それぞれの引き分けの確率はd/2となります。
elo14.png
上の図を見ると、弱い方の実際の勝率は「r-d/2」となります。そして最初に「引き分けの確率は弱い方の勝率と同じだ」という仮説をたてましたので、次の方程式になります:
elo15.png方程式を整理すると、次のようになります:
elo16.png「引き分けの確率は弱い方の勝率と同じだ」という仮説により、弱い方の勝率は引き分けの確率dと同じになるので、2r/3となります。
次に勝ち点を計算します。勝利の場合は3点、引き分けの場合は1点なので、勝ち点の期待値を次のように計算できます:elo17.png
同じ方法で強い方の勝ち点の期待値を計算できます:elo18.png
elo19.png
elo20.png

ホームアドバンテージの計算

サッカーにはホームアドバンテージというものが存在しています。第19回の南アフリカ大会まで、ワールドカップがアメリカ大陸では7回開催され、全部アメリカ大陸のチームの優勝となり、それに対してヨーロッパでは10回開催され、ヨーロッパのチームが9回優勝しました。やはりワールドカップのホームアドバンテージは信じられないほど大きいですね。
イギリスのリーグの統計結果により、アウェイチームの勝率は大体26%です。ホームアドバンテージでホームチームは強くなるからです。つまり、ホームアドバンテージでホームチームのレートは上がります。上記の弱い方の勝率計算式を利用すると、
elo21.pngとなり、イロレーティングの勝率rは0.39となります。強い方の勝率は1-rなので0.61となります。勝率表を見ると、両チームのレートの差は80ぐらいです。つまり、イロレーティングを利用するとき、ホームチームのレートに80点を足すと、ホームアドバンテージの影響を計算できます。今年の大会はアメリカ大陸のブラジルで開催されるので、すべてのアメリカ大陸のチームのレートに80点を足します。

データの準備

次のような内容のCSVファイルを作っておいてください。ここではファイル名を「ranking.csv」にします。
Brazil,2113,A,TRUE,7
Mexico,1820,A,TRUE,7
Croatia,1787,A,FALSE,3
Cameroon,1602,A,FALSE,0
1列目は国名、2列目はレートの数値、3列目はワールドカップのグループ名、4列目はホームアドバンテージの設定(アメリカ大陸のチームは「TRUE」、それ以外のチームは「FALSE」)、最後の列は実際の勝ち点です。ここの実際の勝ち点は結果を比較するために結果ファイルに出力されるもので、これからの勝ち点の予想の計算には使用していません。

フローの作成

上記の分析より、今回のシミュレーションの流れはこんな感じです:
elo22.png
この流れを参照して、フローデザイナーで「WorldCup」という名前のフローを作ります。
elo5.png


チームデータの読み込みとループ

elo23.png
まずはすべてのチームをループします。RecordGetコンポーネントを利用して上記のCSVファイルを読み込みます。
elo6.png
次はマッパーで読み込んだデータをフローに保存します。画像のようにチームデータとして6つのフロー変数を作ってマッピングします。「totalPoint」はシミュレーションの結果なのでマッピングしません。「home」はホームアドバンテージなので、初期値を80にします。レートを保存する前に、まずはAdd関数でホームアドバンテージのあるレートを計算して、そしてCSVファイルの最後の列のBooleanによって、元々のレートなのかホームアドバンテージのあるレートかを選択して保存します。

グループ相手のループ

チームを読み込んだ後、当チームのグループ相手を探します。
elo7.png
まずはもう1回チームのCSVを読み込みます。RecordGetコンポーネントの属性は前記のRecordGetコンポーネントと同じです。それから、2つの条件式でそのチームは相手なのかを確認します。1番目の条件式は同じグループなのかを確認して、異なる場合はループを中止します。2番目の条件式は同じチームなのかを確認して、同じになる場合はループを中止します。同じグループの違うチームの場合のみ試合をシミュレートします。

試合のシミュレーション

elo8.png
試合の両方を確定したので、3つのマッパーで試合をシミュレートします。1番目のマッパーで試合相手のデータを処理し、2番目のマッパーで自分の勝率を計算し、3番目のマッパーで勝ち点を計算します。
elo9.png
1番目のマッパーで相手のチームの名前、レートとグループ情報をマッピングします。レートを設定するとき、上記の方法と同じようにホームアドバンテージを計算します。
2番目のマッパーで勝率を計算します。マッパーの内容は「勝率の計算」部分と同じです。

elo10.png
勝率を取得した後、前記の公式で勝ち点を計算します。まずはMultiply、Substract、Divine関数で(10r-1)/3と8r/3の結果を計算して、そしてIf関数で勝率と0.5を比較して、勝率が0.5より大きい場合、つまり自分が強い方の場合、(10r-1)/3の結果を選択し、逆の場合は8r/3の結果を選択します。この数字はこの試合の勝ち点です。それからフロー変数の「totalPoint」と足し算したら、今までの勝ち点は計算完了です。

結果の保存

elo11.png
最後に、結果を保存します。1つのBranchEndコンポーネントと2つのLoopEndコンポーネントで上記の分岐とループを終了します。そしてマッパーで結果を保存します。見やすいために、チームの勝ち点を保存する前にRound関数の四捨五入で勝ち点を整数にします。そしてFilePutコンポーネントでCSVファイルに結果を出力します。

結果の分析と感想

elo12.png
シミュレーションの結果見ましょう。いくつかのダークホースがありますが、計算の結果と実際の勝ち点は大体合っています。そしてイロレーティングでの32チームの総勝ち点は136、実際の32チームの総勝ち点は135なので、ほぼ同じです。引き分けの確率については仮説をたてましたが、それほど誤った仮説ではなかったようです。
elo13.png

次はイロレーティングとFIFAランキングの予想結果を比較しましょう。上記の計算結果とワールドカップの直前のFIFAランキングを利用して、各グループの決勝トーナメント進出チームをリストしました。異なる予想は3グループです。DグループではイロレーティングもFIFAランキングも予想失敗、やはりコスタリカは今大会の一番のダークホースでしたね。AグループとGグループではFIFAランキングの予想は外れましたが、イロレーティングは見事に予想的中です。両方ともアメリカ大陸のチームは自分より強そうなヨーロッパチームを制して決勝トーナメントへ進出しました。これこそがイロレーティングの強みです、つまりホームアドバンテージを数学的に計算することができます。

イロレーティングでワールドカップの予想を行ってみましたがいかがでしょうか?
ASTERIA WARPを利用して、好きな競技大会の優勝者を予想したいと思いませんか?
それでは、また。
この記事は役に立ちましたか?
1人中1人がこの記事が役に立ったと言っています

他のキーワードで検索する