バルセロナのシュートデータを可視化する

先日の記事にて、機械学習を使ってバルセロナのゴール期待値(xG)を算出し、MSNの凄さを分析しました。

Expected Goals (xG)…シュートが得点につながる確率を0~1の範囲で表したもの

前回はいきなり分析結果を紹介しましたが、今回からはxGモデル構築について話していきます。

今日はデータ可視化編になります。

流れとしては、StatsBombのオープンデータを読み込み、シュートデータを可視化して理解する、というところまで。

StatsBomb Open Data

StatsBombは海外のデータ分析会社であり、メディアやチームに対してサッカーに関するデータを提供しています。

彼らはオープンデータも提供しており、その一部にメッシが出場したLa Ligaのイベントデータがあります↓

画像10

データベース作成には相当なリソースを割いたようで、公式ブログに苦労話が記されています。

彼らの熱意を無駄にしないためにも、存分に使わせてもらいましょう。

データの読み込み

それではデータを使っていきましょう。

今回使用したコードはGitHubに置いていますので、適宜ご参照ください。

データはjson形式で提供されています。

pandasなどでそのまま読み込んでもいいのですが、StatsBombデータをcsvに変換してくれる便利なパッケージがあるため、そちらを利用しましょう。

competitions.jsonには大会・リーグ名が格納されています。

Competitions()クラスを使うと、competitons.jsonに納められているデータを一気に取得することができます。

中身を見てみましょう。

コメント 2019-12-25 225812

上の画像では見えませんが、表の下部にかけてLa Ligaの04/05~15/16シーズンのデータが納められています。

先述の通り、メッシが出場した試合に限定されているので注意です。

次に、La Ligaのcompetition_idが11であることを利用し、matches.jsonからLa Ligaの試合データを抜き出します。

肝心のシュートデータはevents.jsonの中にあるため、match_idと紐付けてシュートデータだけ抜き出します。

さらに、今回はバルサのシュートに着目したいので、チーム名を指定して該当のシュートだけ取ってきます。

これでシュートデータの取得は完了です↓

コメント 2019-12-10 094630

次に、変数名(列名)をリストアップし、どのようなデータが納められているかチェックします。

中身が気になる変数に関してはユニーク要素もリストアップしてみましょう。

コメント 2019-12-10 102649

35個の変数があり、シュートに関する多くの情報が納められていることがわかります。

例えば、outcome列はその名の通りシュートの結果を示しています。その中には「宇宙開発」的なシュートを表すWaywardもあります苦笑

データの前処理

本企画の狙いはシュートのゴール確率を予測することなので、シュートがゴールだったか否かを示す教師データが必要です。

outcome列の中にGoal要素があるため、これを元にgoal列を作成しておきます。

さらに、新たな特徴量を作成しておきます。追加した特徴量は以下のとおり。

  • body_part…”Left Foot”および”Right Foot”でのシュートを”Foot”に統一
  • distance…シュート位置からゴール中心部までの距離
  • angle…シュート位置→右ポストのベクトルと、シュート位置→左ポストのベクトルが成す角度

次に欠損値処理を行います。

カテゴリカル変数は1 or nullで記録されているので、可視化の障害にならぬようnull値を0で置き換えておきます。

次回のために、この時点でのDataFrameをcsvとして保存しておきます。

データの可視化

前処理が終わったので可視化に入ります。

各変数に対するシュート数・ゴール率の関係性を調べ、データに対する理解を深めていきます。

18/19シーズンのシュートに対して予測を行いたいので、可視化段階では17/18シーズンまでのデータのみ可視化します(学習段階でleakageに繋がってしまうため)。

変数の数が多いので重要そうなものだけ見ていくことにします。

まずはplay_pattern。攻撃開始時のプレーの種類を表します。

ダウンロード

注目すべきは、カウンター(From Counter)から生まれたシュートの決定率が3割と高い点でしょうか。

サッカーではカウンター時に生まれる得点が多いと言われるため、納得できる結果です。

その他(Other)が飛び抜けて決定率が高いですが、これはPKが含まれているからですね。

次はシュートの種類を示すtype列。

ダウンロード (2)

当然ですが、シュート数に関してはオープンプレーが最も多くなっています。

決定率はPKが最も高く、8割ほどの決定率。

各国リーグにおけるPKの決定率は8割程度と言われていますが、それはバルセロナも例外ではないようです。

次にシュート位置を見ていきますが、その前にピッチ座標についての理解を深めましょう。

StatsBombのデータでは、ピッチ縦方向をX軸、横方向をY軸とし、それぞれ0~120、0~80の範囲の座標系になっています↓

コメント 2019-12-11 000921

それを踏まえて、まずはX座標のグラフをご覧ください。

ダウンロード (3)

ピッチ縦方向に着目すると、100~110の位置で放たれたシュートが多いことがわかります。

ペナルティエリアに入ったあたりでのシュートが多いわけですね。

そして、当然ながらゴールへ近ければ近いほど決定率は高くなります。

センターライン付近(60)からの決定率が少し高くなっていますが、恐らく相手GKが飛び出していた状況でのシュートだったのでしょう。

ピッチ横方向に関しては、ゴール正面からのシュートが多く決定率も高いことが見て取れます。

ダウンロード (4)

distanceとangleについても可視化を行っておきましょう。

当然ながら、ゴールに近ければ近いほど、角度が大きければ大きいほどゴールは決まりやすくなっています。

ダウンロード (5)
ダウンロード (6)

もう少しビジュアル的に優れた可視化をしたいので、カーネル密度推定という手法を使い、シュート位置のヒートマップを作成してみます。

ダウンロード (7)

先程のグラフより直感的に理解しやすくなりました。

ペナルティエリア中央を中心として、楕円を描くようにシュート位置が分布しています。

バイタルエリアにも分布が広がっているので、ミドルシュートもそれなりに多かったみたいですね。

せっかくなのでゴール位置のヒートマップも作ってみましょう。

ダウンロード (8)

おっと、一気にスポットが小さくなりました…!

色が濃い箇所の大部分がペナルティエリアに入っており、ボックス内での決定率の高さが伺えます。

おわりに

可視化編はこれにて終了です。

次回は今回得たシュートデータの肌感を活かし、機械学習モデルを構築していきます。

バルセロナのゴール期待値をLightGBMで予測する

最後に…

先日DAZNでマンチェスター・ダービーを観ていたのですが、実況の下田さんが試合前にxGについて話していました…!

「xGを基準にして考えると、ユナイテッドはもっと点を取っていてもおかしくない」という現地の報道を紹介していました。

今後、試合中継にもxGが登場する機会が増えると嬉しいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です