目次
はじめに
この記事は「スポーツアナリティクス Advent Calendar 2020」の23日目の記事です。
主催の@JFanalyst様今年もありがとうございます!
今回は、昨年のAdvent Calendar記事で紹介したフィギュアスケートのトラッキング技術「アイスコープ」のデータを教師データとし、機械学習のアルゴリズムとDjangoのフレームワークを使ってジャンプの出来栄え点の予測アプリを作ってみたので、その概要を記していきます!(なおシングル競技対象です)
※本記事は一般人の試験的な試み、勉強の過程の一つの記録です。実現場への応用可能性は示唆できるものの、すぐに現場で使えるようなものではないものをご了承の上お読みください。
開発環境
- Python 3.7
- Google Colaboratory
- Django 3.0
フィギュアスケートのジャンプの点数の付け方
最初に簡単にフィギュアスケートのジャンプの得点の付け方について説明します。
フィギュアスケートのジャンプの得点は、技に応じて予め定まっている”基礎点”と評価によって加減される”出来栄え点”の足し算によって算出されます。

今回対象にするのは、”技の出来栄え点”です。技の出来栄え点は加点・減点それぞれでガイドラインが決まっており、-5 ~ +5までの11段階で評価が付きます。
なお+ 4 および+ 5 には,太字で強調表示されている最初の3つの項目が満たされている必要があります。
加点のガイドライン(今回扱うデータである18−19シーズンのもの)
- 高さおよび距離が非常に良い
- 踏切及び着氷が良い
- 開始から終了まで無駄な力が全く無い
- ジャンプの前にステップ、予想外または創造的な入り方
- 踏切から着氷までの姿勢が非常に良い
- 要素が音楽に合っている
減点のガイドライン(今回扱うデータである18−19シーズンのもの)

ご覧のように減点の場合は少し複雑になるので、今回は加点面のみを対象にします。
教師データの作成
トラッキングデータ
アイスコープのデータは放映に用いられるのみで、計測結果はオープンにされていません。
そのため、YoutubeでISUが公式配信している2019年世界選手権女子の放映映像からダブルアクセルのデータのみを取得しました。
(アイスコープの計測結果が表示されている試合がほとんど見当たりませんでした。。。ご存知の方は情報希望です笑)
アイスコープではジャンプの幅・高さ・着氷速度が算出されています。

このデータをショートプログラムとフリースケーティングの動画からポチポチ取得していきました。
今回は全てのジャッジが出来栄え点0以上をつけたものを教師データとして採用しました。総データ数は40件でした。(今後の蓄積に期待)
ジャンプの前の工夫
加点のガイドラインの4つ目にジャンプの前にステップを入れたり、独創的な入り方をしているかどうかが問われています。
40件という比較的小さなデータセットなので、今回は国内でフィギュアスケートの審判資格を持つ方に簡易的に0 or 1で工夫があるといえるかどうか、アノテーションを行ってもらいました。
正解データの取得
フィギュアスケートの採点結果は全てウェブ上で公開されています。
こちらから該当ジャンプの出来栄え点の正解データを取得しました。なお、GOEは赤字で囲っているものから最低点と最高点を除外して平均を取ったものを使用しており、実際に最終得点に加点された得点ではありません。本モデルは、0〜5の間で何点だったかを表示します。

特徴量
以上を踏まえ、今回予測に使った特徴量(説明変数)は以下のとおりです。
- GROUP:滑走グループ[1-7](大会公式結果)
- FREE:ショートかフリーか[0-1](大会公式結果)
- UNIQUE E:ジャンプの入りの工夫の有無[0-1](審判資格を持つ方のアノテーション)
- DISTANCE:ジャンプの幅[m](アイスコープ)
- HEIGHT:ジャンプの高さ[m](アイスコープ)
- SPEED:ジャンプの着氷スピード[km/h](アイスコープ)
こちらが用いる変数のサマリーです。特に目的変数であるGOEの最小値が0.57、最大値が3.86程度までのデータしかないため、満点付近の点数を予測したいとすると外挿の問題が生じます。このあたりも今後のデータの蓄積が必要ですね。
予測モデルと学習の結果
今回は予測モデルとして、勾配ブースティング機械学習モデルであるLightGBMを用いました。
予測モデルの精度を検証するために、データの8割を学習に使い、2割(といっても8件ですけど、、)をテストに使いました。評価指標としてRMSEと順位相関係数をみてみました。
<真値と予測の誤差>

<RMSE>

GOEは0〜5の範囲なので、RMSE0.6強でも少し大きな誤差となりますが、まずまずかなといったところでしょうか。
また、順位相関係数は約0.76でした。
なお、変数重要度(gain)は以下の通りで、滑走グループの他に幅と高さが相対的に大きく出ました。

Djangoでのアプリケーションの開発
上記で作った予測モデルを使って、DjangoのフレームワークでWEBアプリケーション化しました。なお、アプリ実装版においては40件全てを教師データとして学習させたものを使っています。
コードはGithubで公開しています。
インターフェイス
ログイン認証画面を作成しています。
ログイン画面

トップ画面
ジャンプを測定するか、過去に測定したリストを確認するか選択します。

データ入力画面
予測に用いるデータを入力し、セーブボタンをクリックすると推論に移ります。

推測結果表示画面
入力した変数から推論を行った結果が表示されます。また得点に応じてコメントをつけています。

過去データ閲覧画面
これまで登録したジャンプのデータを表示します。

参考
Djangoを用いたアプリ開発にはこちらの本を参考に使用しました。
新品価格 |
![]() |

おわりに
今回初めて機械学習モデルを使ったアプリケーションの実装を行ってみました。
フィギュアスケートでもトラッキング技術が導入されたため、今後このようなデータが蓄積されてくれば、さらに色々なことができるのではないかという可能性を見出すことができました。
今年もU++さんから始まった Advent Calendarもラスト2!
完走を楽しみにしております!!