よしたく blog

ほぼ週刊で記事を書いています

FC Pythonでサッカーのデータ分析を学ぶ -パスマップ編-

「FC Python でサッカーのデータ分析を学ぶことができる。 コンテンツは英語しかないが簡単な内容であり、1 つ 1 つのコンテンツも短いので翻訳サイトを使いながらでも進めることはできる。 これが無料で展開されているのはありがたい! 今回はパスの表現を学んだのでまとめる。

fcpython.com

作るもののイメージ

今回は次のようなサッカーのピッチと 3 本のパスを描く。

「FC Pythonのページとしては下記のページを参考にした。

f:id:yoshitaku_jp:20210227120608p:plain

開発環境

検証で使う開発環境は手軽に始められる Google Colaboratory を使用する。

colab.research.google.com

ライブラリ

ライブラリは次のものを使用する。

  • pandas
  • numpy
  • matplotlib

実際に作成する

ピッチを描く

まずはピッチを描いてみる。 直線 1 本ずつ組み合わせて描いていく形になる。 最後にセンターサークルで円を描いている。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Arc

%matplotlib inline

fig=plt.figure()
ax=fig.add_subplot(1,1,1)

# ゴールライン、タッチライン
plt.plot([0,0],[0,90], color="black")
plt.plot([0,130],[90,90], color="black")
plt.plot([130,130],[90,0], color="black")
plt.plot([130,0],[0,0], color="black")

# センターライン
plt.plot([65,65],[0,90], color="black")

#左ペナルティエリア
plt.plot([16.5,16.5],[65,25],color="black")
plt.plot([0,16.5],[65,65],color="black")
plt.plot([16.5,0],[25,25],color="black")

#右ペナルティエリア
plt.plot([130,113.5],[65,65],color="black")
plt.plot([113.5,113.5],[65,25],color="black")
plt.plot([113.5,130],[25,25],color="black")

#左ゴールエリア
plt.plot([0,5.5],[54,54],color="black")
plt.plot([5.5,5.5],[54,36],color="black")
plt.plot([5.5,0.5],[36,36],color="black")

#右ゴールエリア
plt.plot([130,124.5],[54,54],color="black")
plt.plot([124.5,124.5],[54,36],color="black")
plt.plot([124.5,130],[36,36],color="black")

#センターサークル
centreCircle = plt.Circle((65,45),9.15,color="black",fill=False)
ax.add_patch(centreCircle)

plt.show()

plt.show()を実行するとピッチが表示される。

f:id:yoshitaku_jp:20210227120701p:plain

パスを描く

次はパスを描く。 パスを描くと言っても大げさなものではなく、こちらも直線で表現する。 今回のパスのイメージは、次の 3 本を想定している。

  1. ボランチからバックパス
  2. ボランチから逆サイドへの展開
  3. ボランチから縦パス

まずは 1 のボランチからのバックパスを表現する。 ピッチを描いたコードの最下部に追加をする。

#センターサークル (これより上は省略)
centreCircle = plt.Circle((65,45),9.15,color="black",fill=False)
ax.add_patch(centreCircle)

#追加部分ここから
data = pd.DataFrame(np.array([[45, 25, 60, 45]]),
                   columns=['Xstart', 'Xend', 'Ystart', 'Yend'])

plt.plot([int(data["Xstart"][0]),int(data["Xend"][0])],
            [int(data["Ystart"][0]),int(data["Yend"][0])],
            color="blue")
plt.plot(int(data["Xstart"][0]),int(data["Ystart"][0]),"o", color="green")
#追加部分ここまで

plt.show()

これでボランチからのバックパスを表現できた。 青の線の端に緑の点があるが、これはパスの始点を想定している。

f:id:yoshitaku_jp:20210227120812p:plain

ボランチからバックパス」、「ボランチから逆サイドへの展開」「ボランチから縦パス」を表現するために、データを追加する。 また、途中の処理もループに変更する。

#センターサークル (これより上は省略)
centreCircle = plt.Circle((65,45),9.15,color="black",fill=False)
ax.add_patch(centreCircle)

#追加部分ここから

data = pd.DataFrame(np.array([[45, 25, 60, 45],[55, 90, 65, 30],[60, 120, 50, 70]]),
                   columns=['Xstart', 'Xend', 'Ystart', 'Yend'])

for i in range(len(data)):
    plt.plot([int(data["Xstart"][i]),int(data["Xend"][i])],
             [int(data["Ystart"][i]),int(data["Yend"][i])],
             color="blue")
    plt.plot(int(data["Xstart"][i]),int(data["Ystart"][i]),"o", color="green")
#追加部分ここまで


plt.show()

f:id:yoshitaku_jp:20210227120906p:plain

まとめ

「FC Python のコンテンツを通してパスマップの描き方を学ぶことができた。 「FC Python には他にも Python を使ったサッカーの分析を学べるコンテンツが揃っている。 サッカーのデータ分析の知見はなかなか見かけないのでどんどん使いこなしていくぞ!!

fcpython.com