はじめに

みなさんは何かスポーツの経験, もしくは好んで観ているスポーツなどはありますか?
また, 経験してきたスポーツor好きなスポーツのデータというものに注目したことがありますでしょうか. 例えば野球であれば,

  • 打率
  • 防御率
  • 投球のトラッキングデータ

などです.

選手であれば自分の練習記録や試合記録を参考にしてレベルアップを目指しますし, 指導者であればこういった指標や自身の経験などを用いて意思決定をします.

近年ではチームや選手個人の問題解決の手段としてスポーツアナリティクスが注目されており, 分析ツールも数多く存在しますが多くは有料であり, なかなか金銭的余裕のないアマチュアチームなどでは活用できていないのも現状です.

プロ野球など比較的金銭的に豊かなチームであればアナリストを雇うことが可能です. ここで簡単に説明すればスポーツアナリストは,

  1. データ獲得
  2. データ編集
  3. モデリング・シミュレーション・分析
  4. 評価・解釈

を1サイクルとして問題解決に取り組みます.
もちろん対象はプレーヤーや監督にとどまらず, 経営陣やファンに対して向けられることもあります.

まだまだ日本ではスポーツアナリストが大きく注目されてはいませんが, 海外ではチームのアナリストに物理学博士号取得者を獲得するなどその重要性が認識されています.

話が少しそれてしまった感がありますが, このコラムではフリー統計解析ソフトであるRを用いてサッカー場を描画し, デモとしてシュートデータをピッチ上にプロットしてみたいと思います.
少しでもスポーツアナリティクスを身近に感じてもらえたら幸いです.

パッケージの準備

R自体にはサッカーのピッチを描く関数は用意されていませんので, パッケージをインストールする必要があります.
ここではggsoccerパッケージというものを用います.

install.packages("ggsoccer")

インストールが完了したので, 次にパッケージを読み込みます.

library(ggsoccer)

でももちろんOKですが, 今回はそれ以外にも使うパッケージがあるのでpacmanパッケージを使うとまとめて読み込めて便利です.

今回は,

  • ggplot2
  • tidyverse
  • ggsoccer

パッケージを使用します.
※ggplot2, tidyverseパッケージをインストールされていない場合は各自でインストールをお願いします.

library(pacman)
#p_load()で読み込むパッケージを指定
p_load(ggplot2, tidyverse, ggsoccer)

How to

それでは実際にピッチを描画していきます.

annotate_pointで描画に必要な引数を指定します. dimensionsでピッチの寸法を指定できますが詳しくは

help("annotate_pitch")

などで確認してください.
以下がピッチ描画のコードとなります.

ggplot() +
  annotate_pitch(
  #ラインカラー
  colour = "white",
  #コートカラー
  fill = "green",
  #プロット制限を調整するか
  limits = TRUE,
  #ピッチの寸法を指定
  dimensions = pitch_opta) +
  #これをつけるとピッチだけになって軸の目盛りがなくなる
  theme_pitch()

緑色のピッチが描けました.

ピッチサイズは競技場によって様々なのでアレンジ可能となっています. 以下pitch_customで調整します.

pitch_custom <- list(
  #横
  length = 105,
  #縦
  width = 68,
  #ペナルティエリア
  penalty_box_length = 25,
  penalty_box_width = 50,
  #ゴールエリア
  six_yard_box_length = 8,
  six_yard_box_width = 26,
  #PKポイントの指定
  penalty_spot_distance = 16,
  #ゴールの幅
  goal_width = 12,
  origin_x = 0,
  origin_y = 0
)
ggplot() +
  annotate_pitch(
  colour = "white",
  fill = "lightblue",
  limits = TRUE,
  #カスタムした寸法をここで適用
  dimensions = pitch_custom) +
  theme_pitch()

分析例

それでは最後に描画したピッチに架空のシュートデータをプロットしてみます. データにはそれぞれシュートが外れたか(Miss)ゴールしたか(Goal)も含まれています. ちなみに座標はピッチ左下が原点(0, 0)となっています

#シュートデータの作成
df_shots <- tibble(
  X = c(90, 85, 82, 78, 83, 74, 94, 91),
  Y = c(43, 40, 52, 56, 44, 71, 60, 54),
  Kind = c("Miss", "Miss", "Miss", "Miss", "Miss", "Miss", "Goal", "Goal")) %>%
  mutate(Kind = as.factor(Kind))
#データフレームの表示
df_shots

#シュートデータのプロット
ggplot(data = df_shots,
       aes(x = X, y = Y)) +
  annotate_pitch(
  colour = "white",
  fill = "green",
  limits = TRUE,
  dimensions = pitch_opta) +
  geom_point(aes(colour = Kind)) +
  theme_pitch()

今回は簡単のため, 2種類で分けましたが必要に応じてキーパーがキャッチしたのか, ポスト直撃なのか, などイベント内容を細かくすることは可能です.

展望

活用方法としては実際に選手やボールにGPSロガーをつけるなどして撮影動画と紐付けイベントデータを作成することでより詳細な分析が可能になります. パス方向の可視化やフォーメーションの分析も可能でしょう. 実際にプロチームでもGPSデータから運動量などを測定し練習や試合にフィードバックしているそうです.

おわりに

今回はこのあたりで失礼します. 次は野球場でも描いてみましょうか...
最後までお読みいただきありがとうございました.

参考

ggsoccerパッケージの詳細は下記URL, またはggsoccerパッケージのヘルプをご参照ください.
https://github.com/Torvaney/ggsoccer