女子卓球レーティング

囲碁将棋などで有名な実力計算方式である"イロレーティング"を卓球に応用し、ITTFランキングでは測れない「実力」を試算しました。イロレーティングをもとに、トーナメントドローに応じたモンテカルロシミュレーションを加えた勝敗予想を提供します。さらにイロレーティングを超える「AIレーティング」を開発しています。

【テクニカル】Pythonによるイロレーティング計算の概略

Pythonによるイロレーティング計算の概略をメモしておきます。

AI等のデータ処理は一般的に、データの収集や整形等の前処理、モデル作成、推論という処理を組み合わせて実現します。女子卓球レーティングの一連の処理では、先日解説したクローリングがデータ収集、スクレイピングが前処理に相当し、今回解説するイロレーティング計算がモデル作成に相当します(厳密に言うと、イロレーティングというモデルに当てはめて、モデルのパラメータである各プレイヤーのレーティング値を計算する処理です)。さらに、後で解説する予定のモンテカルロ・シミュレーションが推論に相当します。

多くの場合、データの収集や整形等の前処理にかなり手間がかかり、きれいなデータを得た後のモデル作成や推論は比較的容易です。今回の例でも、モデル作成であるイロレーティング計算は、比較的容易な処理内容になっています。

以下に主要なソースを示します(細かいところは省略しています)。

# 説明1
matches.sort(key=lambda x: x.sortkey(tournaments))
# 説明2
for match in matches:
    indexA = match.playerA_index(players)
    indexX = match.playerX_index(players)
    # 説明3
    win_ratingA = 1 / (10 ** ((players[indexX].rating - players[indexA].rating) / 400) + 1)
    # 説明4
    win_ratingX = 1 - win_ratingA
    # 説明5
    if players[indexA].is_valid_rating() and (not players[indexX].is_valid_rating()):
        K_A = 0
        K_X = 128
    elif (not players[indexA].is_valid_rating()) and players[indexX].is_valid_rating():
        K_A = 128
        K_X = 0
    else:
        K_A = 32
        K_X = 32
    # 説明6
    players[indexA].rating += K_A * (match.winA() - win_ratingA)
    players[indexX].rating += K_X * (match.winX() - win_ratingX)

ソースに記載している「説明」箇所の説明です。なお、全般的な参考資料としては、 イロレーティング - Wikipediaを参照してください。

説明内容
1 前処理の最終段階として大量の試合データを時系列に並び替えます。sortkey(tournaments)というのが別に定義している時系列順番を表すソートキーです。大会の日付、予選か本戦か、トーナメントラウンドなどの情報をもとに、おおよその時系列順番を算出します。
2 時系列の試合を順に適用してイロレーティングの計算を繰り返すためのループです。
3 イロレーティングの肝となる勝率の計算です。ここではPlayerAから見た勝率を計算しています。Wikiに書かれている計算式をそのままpythonコードにしています。**はpythonでのべき乗記号です。イロレーティングの特性として、レート差が同じ、例えば1700対1600(レート差100)の勝率と、1600対1500(レート差100)の勝率は、同じになります。またレートが等しい(レート差0)なら、当たり前ですが勝率は50%になります。
4 ここではPlayerXから見た勝率を計算しています。説明3と同様の式を書いてもよいですが、当然ながら、100% - PlayerAの勝率 となります。
5 以前に記載した定義4、定義5にしたがって、PlayerA、PlayerXそれぞれの変数Kの値を設定します。関数is_valid_rating()は、適用10試合未満の新規プレイヤーを見分けるためのものです。当然ながら、各プレイヤーの試合数の計算も同時に行っていくことが必要ですが、それは記載省略しています。
6 説明3で計算したレーティング差による予測勝率と、実際の勝ち負けを比較して、レーティングに補正を行います。補正にあたっては、変数Kを掛けることで、個々の試合の結果が適切なウエイトでレーティングに反映されるようになります。

いかがでしょうか。ご参考になりましたら幸いです。