Xリーグ X1 AreaチームのオフェンスプレーをAIが予想してランキングしてみた ~2022 ver~

#はじめに
アサヒ飲料クラブチャレンジャーズでアナライジングスタッフをやっている宇佐見です。

この記事はやってみた + アナライジングスタッフ募集の記事です。
※2021年バージョンは[こちら](https://qiita.com/shunnakamu/items/e2a049e8905249c02d28)

## Xリーグとは
アメリカンフットボールの社会人リーグです。
アサヒ飲料は2022年シーズンはトップリーグのX1SUPERに所属しています。

## アメリカンフットボールとは
ボールを持って走ったり、投げたりして相手陣地に持ち込み点を取り合うスポーツです。ディフェンスはタックルで止めたり、パスをカットしたりして進行を邪魔します。
![pic_11.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278943/e5cc2b23-1a67-745d-2b7b-40afe06694e5.jpeg)


## アナライジングスタッフとは
相手チームの戦略や自チームの特徴を分析し、コーチの戦略立案を助けるポジションです。
試合中も相手の戦略をリアルタイムに分析することもあります。

## アナライジングスタッフのおもしろポイント
スタッフという立場でありながら、チームの勝敗に直接的に貢献できるところが大きなポイントです。アメリカンフットボールは相手の特徴や戦略に合わせた戦略を選ぶことが相手に勝利する上で非常に重要で、アナライジングスタッフはその一翼を担うことができます。

## この記事を読む上で知ってほしいポイント
- 攻撃、守備があり、交代制
- 攻撃側も守備側も作戦を用意して、様々な要素から作戦を決定する
- 作戦には有利/不利があるため、攻撃側も守備側も相手の作戦を予想しながら決定する 
- 予想がうまくいくと、勝利に近づくことが出来る

# やったこと

## Xリーグ公式サイトから試合スタッツ(通称PlayByPlay)を入手
Xリーグでは試合結果が公開されており[詳細リンク](https://xleague.jp/score/15906)からPDFを入手することが出来ます。

## PyMuPDFを用いてPDFから情報を抽出
前回の記事ではOCRによって情報を抽出しましたが、今回はPDFからテキスト情報を抽出できる[PyMuPDF](https://pymupdf.readthedocs.io/en/latest/index.html)を用いて情報を抽出してみます。
情報を抽出した後整形すると以下のようなデータになります。

![スクリーンショット 2022-01-28 21.30.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278943/af5ca973-c524-d186-4061-0d8437874b03.png)


各列の意味は以下の通りです。

| 列の名前 | 意味 |
|:-:|:-:|
| down  |何回目のダウンか   |
|dist   |1stdown更新までの残りヤード数   |
|hash   | 攻撃方向からみて左右方向のボールの位置 |
|playtype   |  オフェンスが選択したプレイがPASSかRUNか |
|offteam | オフェンスチーム名  |
|qtr   | 第何クォーターか  |
|point_diff | 攻撃側から見た得失点差  |
| fp  |フィールド内のボール位置   |
| sectime  | クォーター残り時間（秒換算）  |

となっています。
fpに関しては自陣ゴールラインを0とした時の現在の位置（従って1~99の値)になっています。また、クォーター残り時間に関しては、ある攻撃の開始時間しかスタッツからは読み取れないため、実際の時間とは乖離があることに注意してください。また、offteamはどのチームかを分けるために使っているので、AIの学習には使いません。

## 特定のチームの攻撃プレーだけを抽出
アメリカンフットボールでは守備とキッキングをしているプレーがありますが、それは除去しました。

## 学習用、推定用のデータに分割
AIに学習させる際、学習用と推論用にデータを分割して評価します。
今回は[Stratified 5-Fold Cross Validation](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html)を使います。Stratified K-foldを使ったのは、チームによってRUN/PASSの偏りがある可能性を考慮したためです。
それぞれのチームごとにAIモデルは変えて作成するので、各チームごとに学習データ75%, テストデータ25%にまず分けた後に、学習データをさらに75%, 25%に分けて学習とバリデーションテストを行います。このテストを5回行ってハイパーパラメータチューニング(チューニングには[optuna](https://optuna.org/)を用います)を行なったのち、学習画像全体で再度学習して、はじめに分けておいたテストデータでのスコアを評価指標とします。
一部情報抽出に適さない形式のPDFがあったため全試合を抽出はできなかったのですが、上手く抽出できた33試合分のデータを使ってAIを学習してみます。

## LightGBMで分類
去年はscikit-learnの勾配ブースティング木を用いましたが、今回は勾配ブースティング木モデルの[LightGBM](https://lightgbm.readthedocs.io/en/latest/index.html)で分類モデルを作成します。

## 結果（正解しやすさランキング）
| チーム名 |スコア   |
|:-:|:-:|
|名古屋サイクロンズ	|0.691723|
|警視庁イーグルス	|0.688331|
|BULLSフットボールクラブ	|0.626224|
|アズワンブラックイーグルス	|0.613937|
|富士フイルムミネルヴァAFC	|0.611194|
|アサヒ飲料クラブチャレンジャーズ	|0.584997|
|アサヒビールシルバースター	|0.57622|
|PentaOceanパイレーツ	|0.558506|
|イコールワン福岡SUNS	|0.493953|
|電通キャタピラーズ	|0.484117|
|ディアーズフットボールクラブ	|0.471951|
|ブルザイズ東京	|0.404118|


※スコアにはmean average precision(RUN/PASSそれぞれの当たりやすさを考慮した正答率のようなもの)を使っています
今年は名古屋サイクロンズが一番予想しやすく、ブルザイズ東京が一番予想しにくいという結果になりました。ブルザイズ東京は去年から引き続き最も当てにくくなっていますが、今回使っていなかったような情報でプレイを考えているのか、はたまたテストに使ったデータが何か偏った特徴を持っていたのでしょうか。我らがアサヒ飲料に関しては去年に比べるとかなり当てやすい方に動いてますね（昨年は下から2番目）。

※あくまでこのランキングはAIがRUN/PASSを予想した結果に過ぎず、チームの強弱や良し悪しを反映しているわけではないことはご了承ください。

## AIの予想の解釈
さて、AIがある程度RUN/PASSを予想できるとは分かりましたが、その予想の根拠が気になるところです。
AIの予想の解釈の方法としていろいろありますが、ここでは[SHAP](https://shap.readthedocs.io/en/latest/index.html)という手法を使って解釈してみようと思います。SHAPはshapley値というゲーム理論においてプレーヤーの貢献度を計算する方法をベースにした解釈方法です。つまり、AIの学習に使われた各特徴量（フィールドポジションとか、得失点差など）がどれくらい予想に寄与したかを示すことができます。

![feature_importance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278943/75d7fa74-3835-be83-bd29-683e0bd7bc18.png)


上の図は、あるチームのAIモデルにおいて、各特徴量が予想に寄与した大きさを示しています。ここでclass0はPass, class1はRunを意味します。棒グラフが長いほど、予想に大きく寄与したということになります。フィールドポジションや得失点差、残りディスタンスが上の方に来ているのは分かりやすいですが、qtr_3やHash_Mも上位に来ています。この特徴量はqtrが3であるとかどうかとHashがMiddleであるかどうかを意味するので、このチームのRUN/PASSの判断には第3クォーターかどうかとHashがMiddleかどうかがそれなりに寄与しているとAIは学習したということになります。

![bee_swarm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278943/bf7f7f95-c775-39fd-5e54-23088f59c1ca.png)


もう一つ図を上げてみましょう。この図は一つの点が1データを表していて、あるデータに対して各列の特徴がどれだけShapley値の大小に寄与したかを示します。右にある点ほどShapley値を大きくする方向（今回はRUNと予測する方向）、左にある点ほどShapley値を小さくする方向（PASSと予測する方向）に寄与したということになります。また、各点の色は赤いほどその点の値が大きく、青いほど小さいことを示します。例えばフィールドポジションなら赤いほど敵陣に入っていて、青いほど自陣でプレイした時のデータということになります。
さて、図に戻りますと一番上の行がfpとなっていますが、これはフィールドポジションを意味します。図の上では赤色が高い値（敵陣に攻め込んでいる）ことになり、青色が低い値(自陣浅いところにいる)ことになります。見たところ中心より右側が青く、左側がに赤い点が多く見られることから、自陣浅いところにいるほどRUNをする傾向にあると学習したことになります。
面白いのはやはりqtr_3とHash_Mでしょうか。上述の通り、qtr_3は第3クォーターかどうか、Hash_MはHash Middleかどうかを示します。従って２値の情報なので、赤色が1(第3クォーター/Hash Middleである)ことを示し、青色が0(ではない)ことを示します。従って、第3クォーターであることと、Hash MiddleでないことがRUNを選択することに寄与していると学習していることになります。もちろんこの特徴単体の貢献度なので、実際には第3クォーターであったときや、Hash MiddleでないときにRUNしやすい状況であった（distが短いとか）可能性もありますが、闇雲に分析するよりは、分析の方向性を決めるのには役立つ情報でないでしょうか。

# 最後に
アサヒ飲料クラブチャレンジャーズでは、このような取り組みも含めて、アナライジングスタッフを大募集しています！

- アメリカンフットボールが好き
- スポーツが好き
- データ分析したい
- コーチと一緒に考えたい

などなど、少しでも興味が湧いた方は是非ともご応募ください。
必須ではありませんが、フットボールの知識はあるとなおよしです。
基本的に土日練習（両日必ず参加しないといけないわけではないです。応相談です。）、場所は尼崎になります


募集ページ: https://challengers-net.com/news/2021/12/01/news220/
問い合わせ先: info@challengers-net.com

ご応募お待ちしております！