LapCenterの成績を可視化する

ラップデータの解析は、オリエンテーリングの魅力の一つだと思います。総合タイムや順位、各レッグのタイム ぐらいは他の陸上スポーツにもあるデータだと思いますが、桜井・羽鳥メソッドによってミスタイム・巡航速度の解析はオリエンテーリング特有のものでしょう。

レース後は当然のようにラップデータを見てレースの反省をすると思います。しかし、これはある1レースにおけるそのレースの参加者間での相対評価です。前回のレース成績を思い出して、なんとなく巡航が落ちた・ミス率が上がったという評価はできるかもしれませんがそれはなんとなくに過ぎないでしょう。

そこでLapCenterの成績を時系列でまとめることで違った視点で反省ができると思いました。巡航・ミス率の推移をグラフ化することでトレーニングの効果を確かめることができたり、スプリント・ロング・ミドルどの競技タイプが得意・苦手なのか、登りや距離と巡航速度の相関もわかりそうです。

今のLapCenterのマイページ機能には自分の成績をまとめてグラフ化する機能はありません。加えて名前でのイベント検索もできません。今後の追加に期待ですが、どうせなら自分で作ってしまえばいいと思い、作りました。

3月4日追記:サイトを公開しました。

cola119.hatenablog.com

データの収集

(技術的な話になるので興味ない人は飛ばしてください)

LapCenterには4700ものイベントが掲載されています。その一つ一つを手動でまとめるほど暇ではないので、今回はPythonを使ってスクレイピングしました。退屈なことはPythonにやらせましょう

まずイベントトップページ(https://mulka2.com/lapcenter/index.jsp?event=EVENTID)から大会名・日付・掲載者・テレインなどを取得します。これは簡単にできますね。

次に個人成績を取得したいのですが、これは2つの方法が考えられました。一つはイベントページにあるLapCombat2用ファイル(https://mulka2.com/lapcenter-static/EVENTID/XXXX/lap.lxm)を読み込んでそのデータを解析する方法。もう一つはラップ解析ページ(https://mulka2.com/lapcenter/lapcombat2/split-list.jsp?event=EVENTID&file=X&class=X&content=analysis)から取得する方法です。

LapCombat2用ファイルはXML形式なので解析は簡単です。さらにEカード番号も書かれているのでEカード番号も収集することができます。しかし、巡航速度・ミス率のデータが書かれていないので、あとからこちらで巡航速度・ミス率を計算する必要があります。

2つ目の方法では巡航速度・ミス率も取得できるので計算する必要はありませんが、Eカード番号を取得することができません。あとひとつ目の方法よりページ遷移が多く複雑な解析になりがちです。

はじめは1つ目の方法でスクレイピングをしていたのですが、あとから巡航速度・ミス率を計算する段階で挫折しました。ラップ解析のアルゴリズム通り実装してもペナであったりユニット不良などの例外処理でうまく計算値が合いませんでした。なのでEカード番号は諦めて、2つ目の方法でスクレイピングしました。

2001年から2018年で、個人成績数は50万弱でした。

最大ミス率 大巡航速度
f:id:cola119:20181225032544p:plain:w300 f:id:cola119:20181225032559p:plain:w300

可視化する

大会数の推移

まずは大会数の推移をグラフにしてみようと思います。身内イベントを含むLapCenterに掲載されているイベントの数≒大会数とします。

f:id:cola119:20181224205457p:plain
掲載大会数(身内イベントを含む)
結構な勢いで右肩上がりに増え続けていることがわかりました。ここ数年はイベントのバッティングが増えている印象なので、このまま右肩上がりに増え続けるかはわかりませんね。
f:id:cola119:20181224211000p:plain
2016,2017,2018年の大会数
月ごとの大会数ですが、わかりやすい傾向はあまりないように見えます。強いて言えば1月4月10月は少ない傾向にあります。ですが2018年は4月8月のイベントが多く、これは新歓イベントが増えたこととインカレが9月開催だったからかもしれません(適当)

個人成績の推移

本来の目的である個人成績の推移を見ていきます。 まずはある3選手の巡航速度(speed)とミス率(loss_rate)の相関を見てみます。1

f:id:cola119:20181225024326p:plain

このグラフから3選手のタイプを判断してみます。 赤い選手は左上の図から、巡航速度が遅いということがわかります。また、左下の図から巡航速度の変化に対してミス率の変化量が少ないです。よって、フィジカルが弱く、その弱さを低ミス率でカバーしているような選手と言えます。
青い選手は左上の図より巡航速度が速い傾向にありますが、右下の図よりミス率も高い傾向にあります。巡航とミス率の相関も強く、だめなレースはとことんミスを重ねてしまうような選手でしょう。
紫の選手は巡航は100~105の割合が非常に多く、テールも短いので分散が小さく安定している選手と言えます。

安定して好成績を残している選手は紫のような分布(左上・右下の図)になると思います。赤い選手は巡航速度を上げるようトレを積むべきであり、青い選手はミス率を抑えるよう意識すると紫の分布に近づくでしょう。

次にコース距離・登距離との関係を見てみます。

f:id:cola119:20181225030225p:plain

赤い選手は距離・登りが増えるとミス率が下がる傾向にあります。また、やはり紫の選手は非常に安定していることがわかります。

作ったサイト

せっかくなのでウェブサイトで成績を検索して簡単なグラフを表示できるサイトを作りました。まだ簡単なグラフを表示する機能しかないのであまり面白いものではないです。
名前・クラブ名などで検索して成績を追加します。本来はecard番号で検索できるようにしたかった。

f:id:cola119:20181225031128p:plain:w300
成績検索

追加するとマイページからグラフを見ることができます。

散布図 時系列
f:id:cola119:20181225031245p:plain:w300 f:id:cola119:20181225031301p:plain:w300

PHPフレームワークにはLaravelを用いました。初めて書いたので良い勉強になりました。グラフ描画はD3.jsです。

現在はラップデータは個人情報と主張する方がいるみたいなので非公開(部内のみ公開)にしています

まとめ

分かる人はわかると思いますが、かなり適当な分析しかできませんでした。せっかくデータをまとめられたのでもっと真面目な解析をできればと思っています。例えば、スプリント・ロング・ミドル別の解析、トレーニング量との相関、団体の強さの定量化、レースの難易度の定量化、など。
あとは今流行りのオリエンティアランキングへの応用もできればいいなと思います。今後もこのブログで書いていこうと思うのでよろしくお願いします。

ちなみに例で挙げた3選手は○○さんと○○くんと○○です。


  1. 回帰直線を引くにはデータ数が少なすぎるので、この分析はかなり適当なものです。特にコース距離・登距離は記載されていないイベントが多く、十分なデータ数になっていません。統計に自信ニキさんごめんなさい。