2018/07/27ツイートテニスの試合の流れを可視化したく、勝率の推移をプロットしてみました試合のゲームスコア、統計スタッツ以外で試合の内容を伝えられるデータ可視化方法はないかなあ、と前から考えてました。いうのも、テニスは数時間戦うスポーツで、どうしても試合の中でアップダウンがあります。その試合の流れというか、選手の優勢・劣勢の推移を表現できれば、より試合の全体像が伝えられるんじゃないか。そんな思いもあって、試合の流れを可視化することにトライしてみました。その時点での試合の勝率を計算し、ポイント毎の変化を見える化して試合の流れを表現します。2018ウィンブルドン3回戦の錦織・キリオス戦の勝率推移をプロットしてみると↓のようになります。横軸が何ポイント目かを表し、縦軸が勝率%を表してます。直近30ポイントのサーブポイント率を算出し、そのポイント率で残りの試合を進行させたときの勝率を確率シミュレーションにて計算し、その推移をプロットしてます。この試合、錦織がセットカウント3-0で勝ち、終始錦織優勢で進んだ試合だったかと思います。勝率プロットもそれを表しており、第1セットで勝率を上げていき、第2セット以降は、5-6の場面で勝率を72%に落としますが、その後は、ずっと80%以上の勝率で試合を進めて勝ちました。実際に試合をみましたが、試合をみたイメージとだいたい合っていて、全体の流れの傾向は捉えられているんじゃないかなあ、と思ってます。グルビス戦、負けてもおかしくないぎりぎりの戦いだった次は、ウィンブルドン4回戦、グルビス戦も勝率推移をプロットしてみました。4-6、7-6(5)、7-6(10)、6-1とセットカウント3-1で勝った試合ですが、第2セット、第3セットと非常に苦しかったことがわかります。第2セットは、勝率としてはグルビスがずっと80%以上。サービスゲームはグルビスがあっさりキープするのに対して、錦織はぎりぎりのキープという展開でしたので、サーブポイント率はグルビスが上回り、計算結果としての勝率もグルビスが優勢となるようなプロットとなってます。錦織の勝率が50%を越えたのは最終セットになってから。ポイント率の計算を30ポイントの範囲で広くとっているため、実際の流れはもう少しはやく来ていた可能性はありますが、第2・第3セットは劣勢ながらもとれたセットで、ぎりぎりの試合というかよく勝てた試合だったなあ、と思っています。勝率の計算方法について、簡単ですが説明します。計算のイメージ図は↓のようになっています。サーブポイント率を計算し、それをもとに確率シミュレーションを行います。確率シミュレーションではどちらの選手が勝つかを判定し、それを1000回行い、1000回中何回勝つかをみて勝率を計算します。勝率を計算したら、次のポイントに移行し、サーブポイント率の計算・確率シミュレーションと前のポイントと同じようにして勝率を計算します。して全ポイントの勝率を計算していきます。各選手のサーブポイント率を計算するどうやってサーブポイント率を計算しているか説明しましょう。↓の表は錦織とグルビスのどちらがポイントを取得したかを示しています。錦織が○、グルビスが×になっていれば錦織がポイントをとったことになります。34ポイント目のポイント率を計算する場合、その前10ポイントが計算対象となります。(実際は、直近30ポイントで計算してますが、表が長くなるので説明では10ポイントとします)サーブのポイント率を計算するので、錦織であれば錦織のサーブ10ポイント(黄色)、グルビスであればグルビスのサーブ10ポイント(オレンジ色)となります。錦織は○が4つあるので、4/10で40%のサーブポイント率グルビスは○が9つあるので、9/10で90%のサーブポイント率となります。(実際は、1stサーブと2ndサーブそれぞれのポイント率を算出してます。1stサーブのIn率も計算してます。)確率シミュレーションにて残りのポイントを進行させ、勝つか負けるかを判定させる計算したサーブポイント率で残りのポイントを進行させた場合、試合に勝つか負けるかを判定させます。34ポイント目の次の35ポイント目は、錦織のサーブなので、40%の確率で錦織が○になり、60%の確率でグルビスが×となるように、ランダムシミレーションを実施します。プログラムコードはPythonで書いてます。36ポイント目以降~試合が終わるまでこのやり方で計算して試合を進行させ、最終的に錦織とグルビスのどちらが勝つかを判定します。確率シミュレーションを1000回繰り返して、勝った回数から勝率を計算する↑のランダム計算による勝ち負け判定を1000回繰り返し、錦織が200回勝ち、グルビスが800回勝つという結果になれば、このときの錦織の勝率は20%となります。これで34ポイント目の勝率計算は終了し、次の35ポイント目の勝率の計算に進みます。前のポイントと同じように、サーブポイント率と確率シミュレーションを実施し、勝率を計算します。これを最後までやることで前述した全ポイントの勝率プロットが得られます。以上、こんな感じで勝率の計算をしています。計算は全てPythonで書いたコードで実施しています。汚いコードなので公開は控えます。公式サイトでも試合の流れを可視化している参考情報ですが、ウィンブルドン公式サイトでもMomentumという名前で、試合の流れを可視化しています。棒グラフの大きさがその時点での試合全体の趨勢、色がどちらに流れがシフトしたかを表していそうです。「連続ポイント」「サービスブレイク」を重要なパラメータとして計算しているっぽいのですが、それ以上はわからずブラックボックスです。公式サイトとの細かいところの比較はまだできていません。あと肝心のジョコビッチの試合分析ができていませんね。ジョコビッチ戦の勝率プロットは↓です。第1セット、ブレイクされたあとにブレイクし返し、勝率50%まで持ち直しはしましたが。ブレイクして3-1にしたぐらいから錦織の勝率は上がりはじめてセット奪取。第3セット、2-3でブレイクされて2-4となってそのままセットをとられてしまいました。2-2まではスコアイーブンだけど、試合の流れとしてはジョコビッチ側でジョコ優勢の中でサービスブレイクされた感じでした。最終セットは、良いところなくジョコビッチペースで試合終了でした。トミック戦の勝率プロットは↓です。第3セットをとられたら危ない試合だったかもしれません。~ポイント率、サーブコース・速度など~準優勝に終わったブリスベン国際の決勝戦(ディミトロフ戦)。2019年まとめ昨年投稿したブログ15記事をまとめてみました。link購読するサイトについて「データ」×「テニス」をキーワードにブログを書いたり、データを公開したり、データ分析用のツール開発を進めてます。詳細は「サイトについて」にて。ツイッターもやってます。データテニス【DataTennis】サイト管理人がつくったテニスのスコア記録用のアプリです。otakomaサイトリンクテニス・ライブスコア(FlashScore)・男子ATP/女子WTAツアー/チャレンジャーなどほぼ全てのテニストッププロの試合のライブスコアを確認することができます。