【テニス】データ分析でロジャー・フェデラーのプレーを読み解く❗
機械学習でロジャー・フェデラー🎾のプレーを分析しました。
データ分析により、趣味の世界が広く深くクリアに見えてくる気がしました…✨️
テニスが好きな人なら一度は思ったことがあるはずです。
「フェデラーって、昔と今でプレースタイル変わってるよね?」
「全盛期はもっと攻撃的だった」
「でもそれって『本当?』なんとなく分かるけど…」
今回、私はこの長年のモヤモヤに終止符を打つべく、趣味(テニス) × データ分析
という最高の組み合わせで検証してみました。
検証目的:趣味とPythonをかけ合わせたかった
きっかけとしては、せっかく学んだ機械学習の知識をプライベートにも活かしてみたいと思ったからです。
私はアイコンからもわかる通り?テニスが趣味なぶーちゃんです。
中学生の頃からよく夜更かしし、グランドスラム(世界規模で大きな4大会)のTV放映を見たものです・・・📺️
また「テニスの王子様」も大好きで、全巻集めていました。作中に出てくる乾くんというデータマンも好きです笑
乾くんほどではないにしろ、データサイエンティストとして「テニスという競技にデータ分析を活用してみたい」と思うようになりました・・・
というわけで取り組んでみたのが・・・
ロジャー・フェデラーのプレースタイルの変化をデータから紐解く❗️
です笑
テニスをしたことがある人なら誰もが知っているであろう、フェデラー。
彼は長年ツアーの第一線で活躍してきたからこそ、そのプレースタイルも様々な変遷を辿ってきました。
巷では様々な通説が囁かれていますが、それが本当なのか? データ分析により検証しようと思ったのです❗️
更に後半ではテニスの勝敗予測モデルを作成し、キャリアの全盛期と晩年で、フェデラーの勝利を支えた要素がなんだったのか、分析しました。

ちなみに、今回は趣味とPython、機械学習をかけ合わせることが目的だったので、有識者からするとツッコミ所は多いかもしれません、ご了承ください。
分析の流れ🔬
●分析データの入手🔢
フェデラーに限らず、プロテニス選手の試合ごとのスタッツは「TennisAbstract」というサイトで入手することができます。
主要な選手のデータはしっかり保存されており、フェデラーほど長く活躍し続けた選手のデータはなかなかのボリュームがあります。分析には十分な量です💪
こちらのデータをCSV化し、Pythonで分析していきたいと思います🖥️
(詳細なデータ項目、定義についてはサイトをご参照ください。)
⬇️Tennis Abstract⬇️
https://www.tennisabstract.com/
●分析条件の設定⚖️
キャリア全体を3つの時代カテゴリに分けました。定義は以下のとおり。
全盛期:2003~2007年
晩年:2017~2021年
その他:上記以外のデータ
また、各スタッツのデータ欠損値はカラムごとの平均値で穴埋め(fillna)しますが、平均は上記3のカテゴリごとに算出しました。(全盛期と晩年を合わせたデータで平均を取ると、時代ごとの傾向が薄れてしまうため。)

●勝敗予測モデルの選定🧠
勝敗予測のモデルには、機械学習モデルの中でも扱いやすく精度が高い、計算も早いと言われる「LightGBM(ライト・ジービーエム)」 という手法を使いました。
ざっくり言うと…
大量の特徴(サーブ成功率・ネットプレー率・ラリー長など)を用いて、“決定木の分岐”でどんどん仕分けて、勝敗に強く寄与する要素はなにかを見つけてくれるモデル
です。
またLightGBMは多くの学習特徴量にも対応しており、
feature importance(どの要素が強く影響したか)
SHAP(影響度の可視化)
などの可視化もできるため、「視覚的にも結果がわかりやすい」のが強みです。

⬇️LightGBMの概要⬇️
機械学習モデルに関して学びたい方は以下書籍もおすすめです。
こちらを見ながらKaggleやSIGNATEに参加すればぐんぐんスキルが向上するでしょう⤴️
Amazonのアソシエイトとして、ゆるパパのーとは適格販売により収入を得ています
分析結果📒
①時代ごとのプレースタイルの変化
データを項目ごとに棒グラフ化し、キャリアを通じてどのように数値変化があったのかを可視化しました。
各年の棒の高さは、項目ごとにその年のすべての試合に数値を平均したものです。
以下画像は、全盛期と晩年で傾向変化が強く出た項目をピックアップしました。
この結果を見ると、例えば以下の見解が得られます。
晩年は全盛期よりも、ドロップショットを打つ頻度が多い。
ラリーの積極性(攻撃性)も、晩年は高い数値を示している。
▶晩年は全盛期に比べると、自ら仕掛けてラリーを早めに終わらせようとしているのではないか。

②勝敗予測モデルの作成、時代ごとの勝敗寄与要因
また、各スタッツと勝敗結果のデータを用いて、勝敗予測モデルを構築しました。
モデルは前述の通りLightGBMを使用。特徴量は少なめですが、以下を直感で8つ選定しました。(後述しますが、反省点。。。)
モデルの学習結果・精度としては以下のとおりです。
データ数が何万試合とあるわけではないので、ROCの形は角ばっておりますが、AUCスコアは0.90、Accuracyも0.81と高水準。
・・・しかし、これはズルをした結果なのだった・・・最後の「反省」をご覧ください。。。

作成したモデルでは、特徴量ごとの重要度は以下図のようになった。(SHAP)
図の見方としては、特徴量ごとの値が高いと赤のプロット、低いと青のプロットになります。また横軸は勝敗予測への寄与度の大きさであり、右にある点ほど勝ちに、左にある点ほど負けに寄与するというものです。
例えば「重要なポイントの獲得率」が低い(青い)と負け予測につながる(プロットが左にある)ことは直感的にも分かりやすいかと思います。
逆に勝つためには「2ndサーブの積極性」や「ラリーの積極性」は高い方が良いと思いましたが、モデル上では正反対の結果となり意外でした😯
これはフェデラーの晩年に「ラリーの積極性」が向上したものの、試合の勝率は落ち込んでいた、などの事情もあるかもしれません。

また全盛期⇔晩年でSHAP図を比較すれば、時代ごとで勝敗に寄与した特徴量に違いがある(≒勝ち方の変化が見える)かもと思いましたが、明確な違いはありませんでした😅
これは分析手法の悪さもあるかもですが、プレースタイルの変化よりも、「いかに無理せずミスを減らし、重要なポイントを奪えるか」という「テニスという競技の特性」が強くでたのかなと(都合よく)解釈しています。笑

(参考:SHAPの見方)
所感🔥
趣味とPythonをかけあわせてみることで、身近な題材にもデータ分析は活かせるんだなと実感できてよかったです!
またテニスという競技を改めて俯瞰的な観点で見つめることができたとも思います⭐️
しかし反省も・・・⤵️
ただ、分析手法や特徴量選定には反省の余地があったなと思います‥
というのも、勝敗予測モデルが少し「リーク※してしまっている」のではないか。という点です。
リーク:本来は学習時に知り得ない未来の情報や答えが、誤ってモデルに混入してしまう現象のこと。
これが起きると、モデルは不正に高い精度を出してしまい、実運用では全く役に立ちません。
▶ 一言で言うと “カンニングしたモデルになる” ということ。
今回の例でいうと、「重要なポイントの獲得率」という特徴量は、言ってしまえばポイントを獲得したという『結果系』だったのです。
そんな特徴量を使えば、「重要なポイントを多く取る=勝ちに近づく」「重要なポイントを多く落とす=負けに近づく」という 当たり前の結果予測となっているのです。
分析をすべて終えた後に、知人に指摘されました・・・😭
実務ではこんなミスを侵さないように、事前の条件検討をしっかりしないとですね❗️
みなさんもお気をつけください。。。
また、特徴量エンジニアリングもろくに行わずに、使えそうな特徴量をテニスプレーヤーとしての感覚で選定しただけなので、実務ではもっと吟味するべきですね。。。笑
💤最後に
今回の内容は、私がデータサイエンティストとして駆け出しの頃に取り組んだものでした。
今自分で振り返ってみても、色々と思うところはあります。。。笑
まぁ時間があればもう一度取り組んでみてもいいですし、フェデラーに限らず全選手のデータを使った勝敗予測モデルとか作ってみても面白いかもです。
データ分析は身近な様々な問題に活用できそうなので、一生の趣味として続けていきたいなと思いました❗
「こんな観点でも分析してみたら?」とか「こんな分析もしてほしい!」といったご意見など、是非コメントで聞かせてください❗
それではまた‥💤
