DataTennis. NET

データテニス ドットネット

【試合の流れの可視化】勝率推移シミュレーション、データ集計から勝率チャート作成まで自動出力できるようにしました

公開日:
最終更新日:2019/07/22

      2019/07/22

こんにちは。

個人でテニスのデータ分析ツールをつくってる@otakoです。

前々から試合の流れを可視化するための「勝率推移シミュレーション」をつくっていて、一気通貫で計算できるようにしたので紹介します。ちなみにコードも公開しているので、興味のある方はあれこれ遊んでいただけると嬉しいです。

勝率推移シミュレーションとは、↓のようにポイント時点での勝てる確率の推移をチャートで表現したものです。試合の流れを視覚化するためにつくりました。

詳しくはテニスの試合の流れを可視化したく、確率シミュレーションを用いて勝率の推移をプロットしてみました【2018ウィンブルドン錦織】をご覧になってください。

今回、データ集計から勝率チャート作成まで、一気通貫で自動作成できるようにしています。自分の環境ではものの5分ぐらいでデータ収集~チャート作成まで完了します。

フローは、データ収集⇒設定値変更⇒シミュレーション実施⇒勝率チャート作成

Pythonコードは、github.com/taikoma/TennisWinProbSimにて公開してます。
リポジトリ名はTennisWinProbSim、スクリプトはWinProbSim.ipynbファイルにあり、JupyterNotebook上で実行できる形になってます。 

計算には試合のポイント履歴データが必要

勝率推移シミュレーションは、直近30ポイントのデータから残りの試合を乱数計算、いわゆるモンテカルロシミュレーションで進行させて、勝率を算出するものです。
ですので、入力データとして試合のポイント履歴が必要となります。ポイント履歴とは、どちらの選手がポイントをとったのかの記録です。

ポイント履歴はスクレイピングでデータ入手できるようにしてます。試合のスコアをスクレイピングでデータ入手し、↓のような形に整形してcsvファイルとして出力します。

上から順番に各ポイントで、どちらがポイント取得したか、サーバーがどちらだったかを並べています。
wonAが1でwonBが0⇒playerAがポイント取得
wonBが0でwonAが1⇒playerBがポイント取得
と、ポイントを取ったプレイヤー側を1にして、取られた側を0にしてます。playerA、playerBがどちらの選手になるかはinit.jsonファイルで設定します。やり方は下で説明します。
firstsecondは全て1にしてください。1stと2ndと分けて計算する場合は、1と2を入れるための列ですが、今回は全て1にしてます。

ポイント履歴のデータ収集用スクリプトは、公開するとサイト様にご迷惑をおかけする可能性があるため、公開は控えさせていただきます。
ポイント履歴のサンプルファイルがありますので、シミュレーションを実行してみたい、という方はそちらをご使用ください。

シミュレーションの準備(設定値変更など)

「init.json」ファイルを開いてシミュレーション条件の設定をします。
スクリプトの実行時に、こちらのjsonファイルを参照して計算するので、事前準備でこのjsonファイルを書き換えます。

・file 読み込むファイルを指定します。
ここでは、サンプルファイルとなる「2019AusFinalOsaka.csv」とします。

・firstsecond
1stサーブと2ndサーブをわけて計算しないので0のままにしてください。

・playera playerb
2選手の名前を入力してください。
csvファイルのserverに入力している文字と同じ文字を入れてください。

・set1 set2 set3
セット1~3のセットスコアを入力してください。
2セットで終了した場合は、set3は空にするか適当な数値を入力してください。

・plength
サーブポイント率を計算する範囲を設定します。デフォルトは30でこの場合、直近30ポイントのサーブポイント率を算出してシミュレーション実行します。
plengthの値次第で、勝率推移はけっこう変わります。
数値が小さければ、1ポイントの影響が大きいため勝率変化は大きくなりますし、逆に大きければ勝率変化は小さくなります。
何が最適な値かは私もわかっていませんが、30ポイント程度が映像をみた実感と合うためデフォルト値を30としています。

・ngames
勝率を計算するのに何試合分のポイントを進行させるかを設定します。
この数値を小さくすると計算は速くなりますが、計算毎のばらつきが大きくなります。デフォルト設定の1000を推奨します。

シミュレーション実施

WinProbSim.ipynbファイルの1番目のスクリプト部分を実行します。
(一番上に#This Script is for Win Probability Simulationと書いてます)

実行すると、乱数計算がはじまります。1000試合分の計算をするので終わるまで待ちます。

計算が終わると各ポイント毎の勝率推移結果ファイル(**_output.csv)を出力します。

チャート画像作成

Pythonのグラフ描画ライブラリであるMatplotlibでチャートを作成します。

WinProbSim.ipynbファイルの2番目のスクリプト部分を実行します。
(一番上に#Create Graph as png fileと書いてます)

そうすると、↓のようなチャートが作成されます。

選手名、スコア、セットの境目となる青線は、データを参照して自動で出力します。

Gifアニメーション作成

こちらもMatplotlibで作成します。gif動画をつくる場合imagemagickも入れる必要があります。
gifファイルを作成する場合、事前準備が必要です。こちらのサイトmatplotlibで簡単にアニメーションをつくる(mp4, gif)を参考にして設定してください。

WinProbSim.ipynbファイルの2番目のスクリプト部分を実行すると、↓のようなgifアニメーションが作成されます。
(一番上に#Create Animation Graph as gif fileと書いてます)

最後に

以上、データ収集や、勝率チャートグラフ、gifアニメーションの作成方法について説明しました。

こちら、勝率推移シミュレーションは試合の流れを可視化するためのものです。まだ用途や活用先などは考えられていませんが、試合の概要を伝える一つの手法となればいいなあと思っています。

また、プロの試合に限らず一般プレーヤーの方でもポイント履歴のデータさえつくればチャートを作成することができます。
是非、スクリプトを手元に置いてあれこれやって楽しんでもらいたいと思います。

 - blog, データ分析, 試合シミュレータ