なんとなく生きてます

雑記帳備忘録チラシの裏

「冬はヒルクライムのタイムが遅くなる」のか、PythonとStrava APIを使って検証しました

まえがき

個人的に興味があったタイトルの疑問について、手に入る範囲のデータで検証をしてみました。ちなみに、前回の記事

emeraldwar.hatenablog.com

は割とふざけた調子で書いていましたが、今回は真面目なトーンで書いていくつもりです。

 

事の発端

きっかけは下記の動画でした。

某有名サイクリストさんの動画で、いろんな峠の予習によく拝見するのですが、13:08から興味深いキャプションが出てきます。

 

「冬になると空気が重くなるからTTに不向きと聞くけど 知らんがな...誤差誤差^^」

 

筆者はもちろん所謂TTガチ勢ではありませんし、そもそもヒルクライムレースにも出たことすらありませんが、とても面白そうな話です。(そして「知らんがな...誤差誤差^^」と切り捨ててこのタイムを出すかっこよさ。)気になって色々と調べてみると、理論上の説明はあるようで、とてもわかり易くまとめられている記事が某有名自転車ブロガーさんの

https://rbs.ta36.com/?p=17148

という記事。個人的にはここで述べられている「衣服の重さ」というのは確実に効いてくる気がします。

と、理解しつつも、自分としては暑さでやられてしまう夏よりも冬の方が力が出る感触を確かに感じていたり、冬だとボトルも少ないし軽くなるなんてことは?なんて思ったりします。こうなった以上、私も一応理系の人間、(まだまだ1年目の駆け出しですが)データサイエンティスト的な仕事をしている人間としては、なんとかして走行データを集めて検証してみたくなります。仮に差があるなら、実際のタイムにしてどれほどの違いがあるのか、というのも気になります。とはいえ、最新の設備を使って空力実験をするわけにも、実際にプロのサイクリストに1年を通して同条件で走行してもらってタイムを収集させてもらうわけにも行きません。

 

Strava、使ってますか~?

そこで、今回は身近で手に入るStravaのデータを利用しましょう。Stravaの詳細はここでは割愛しますが、ざっくりと言うと「サイクリストやランナーが特定の道路や峠などの箇所を走った際のタイムをアップロードして交流するSNS」といったところでしょうか。近年、本格的に日本での展開が活発化したりと、徐々にサイクリストにとってなくてはならないツールになりつつあります。このStrava上では、例えば上記の動画で紹介されている和田峠ですと、

といった具合に上位からずらっと実走時のタイムが公開されています。これはなんだか使えそうです。なお、この各アカウントのタイムがズラっと並んだものをリーダーボードと呼びます。以降も何度か出てくるので頭の片隅においておいてください。しかし、実際にタイトルの疑問を検証するためにはこんな数人のデータではなく、もっと上位から下位までごっそりデータが欲しいわけです。

はい、それができるんですよ、Stravaなら。StravaではAPIという枠組みでデータを外部公開してくれており、これによって多少のプログラミング言語スクリプト的な何かが扱える人間であれば、割と自由にデータを利用することができます。今回はこのStravaから収集したデータを用いて、「冬はヒルクライムのタイムが遅くなるのか?」という疑問を検証してみようというワケです。

なお、ちょくちょくエンジニア向け (といっても大したことありませんが、主な読者層を自転車クラスタと想定していますので。) な単語やプログラムが出てくることもありますが、そうした箇所が本旨の理解の妨げにならないよう、読み飛ばしても支障の無いように書いていこうと思います。

 

閑話休題

ところで、本来は企業側が自社で収集したデータというものはあまりに貴重な資産であり、なかなか外部においそれと公開してくれるものではありません。言わずもがな、Amazonは膨大なユーザの購買履歴を分析し「よく一緒に購入されている商品」を提示して購買促進を図ることで世界のeコマース事業のトップの位置を確固たるものにしました。また、当然こうしたデータは他社からしても喉から手が出るほど欲しいもので、自社サービスを運営しながら収集したデータを他社に販売するようなビジネスモデルで成り立つ企業も数多くあります。もちろん、規約等同意をとった上で、ですが。最近では某就職支援企業が「内定辞退予測データ」なるものを他企業に販売していたというニュースも記憶に新しいものです。と、言うわけで、適切なプロセスを経て収集され、適切なアクセシビリティが確保されている状況下にあれば「データ」とは「金のなる木」と言っても過言では無く、このStravaのように、我々一般ユーザでも自由にデータを外部公開してくれるというのはもう非常にレアなケースなわけです。

とは言え、ここまで言っといて何ですが、実際の海外発サービスですとこうしたケースはそんなに珍しくもなく、例えば皆様の多くが使われているであろうGoogle Mapは、Googleが自社で車を走らせたり、重いカメラを背負って苦労してかき集めたデータを惜しげもなく全世界に無制限、無料で公開して成り立っているものです。こうした背景には、自社のデータを隠し持っておくより、オープンに公開して他企業のサービスとの相乗効果で利益を生み出そう、という強気の戦略*1が見え隠れします。

 

 

 

分析

前置きが長くなりましたが、ここから分析編です。タイトル通りの分析を行うには

  • ある程度の数の走行タイムが蓄積されている
  • 走行タイムの記録時期に季節の大きな偏りがない

という条件を満たすヒルクライムの走行タイムを集める必要があります。乗鞍や富士スバルラインは人気の峠で多くのサイクリストの走行タイムが蓄積されていますが、こうした峠はマイカー規制や通行規制の影響によりバイアスが掛かってしまいます。そこで、関東で人気の「ヤビツ峠」、関西のクライマーの聖地「十三峠」を分析対象とすることとします。念の為セグメント区間は、該当する峠を含むセグメントでスター数の最も多いものを選びました。

 

データ抽出  

兎にも角にもまずはデータを抽出しなければ始まりません。一応参考にPythonのコードを貼っておきます。json形式のレスポンスが返ってくるのでpandasのDataFrameに変換してCSVに保存しています。

 

gist571345df0afaa305df43b8483ebb51aa

 

これでとりあえずリーダーボードを抽出することができました。リーダーボードの生のデータは(ここでは、見やすいように表形式にしていますが)こんな感じ。内容は当然公開されているリーダーボードと同じですが、念の為にアカウント名は塗りつぶしています。各行が各アカウントのタイムで、athlete_name の列がアカウント名、elapsed_time の列が実質の走行タイムとなり、Stravaのセグメントのタイムとして採用されるのもこの elapsed_time です。

f:id:emeraldwar:20190924235326p:plain

とまあ、こんな具合でデータを抽出することができます。上記は上位5人までのタイムを切り取って表示していますが、当然ながらStrava APIを用いることでStravaのページ上で公開されているタイムだけでなく、全てのタイムを取得することができます。

 

こうして、記事執筆時点で記録されているヤビツ峠の走行タイムが9515人分、十三峠の走行タイムが3313人分が手に入りました*2。さて、これで材料が揃いましたので分析を初めて行きます。

 

 

データ前処理

今回のテーマは、冬になるとヒルクライムのタイムは遅くなるのか?というものでした。そして、冒頭でも紹介したとおり、その原因は、単位体積あたりの空気の密度にせよ衣服の重さにせよ、どうやら気温が影響しているらしい、と。そこで、上記で抽出したデータを気温によるタイムへの影響をはっきりと比較するため、「夏に記録されたタイム」と「冬に記録されたタイム」と分割して比較することにします。なお、「夏」と「冬」についてはWikipediaの項目をそれぞれ参照し、「6月、7月、8月」を夏、「12月、1 月、2月」を冬としてデータを処理します。具体的には、先程紹介した表の start_date_local の列を上から順に見ていき、夏に記録されたものか、冬に記録されたものかをチェックして2つの表に分割していきます。もちろん人間がこれをするのは大変ですので今回もPythonを使います。分割後の表をお見せしてもわかりにくいので今回はグラフで可視化して説明します。

gist60aa2df2bc25b980da344078fcf06c42

 

まず、こちらは最初にお見せしたヤビツ峠の全季節のタイムのヒストグラムです。横軸は走行時間(秒)、縦軸が人数で、横軸は左に行くほどタイムが遅くなることに注意してください。2000秒~3000秒に人数が集中していることが見て取れます。割と予想通りでは無いでしょうか。

f:id:emeraldwar:20190925232440p:plain

そして、それぞれ順に夏と冬のヒストグラムです。

夏)

f:id:emeraldwar:20190925232721p:plain

冬)

f:id:emeraldwar:20190925232734p:plain

冬はだいぶ人数が少なくなりますが、概ね両者同様の分布が見て取れます。ただ、これだけでは冬の方がタイムが遅くなる、とは言い切れなさそうです。

 

次は、十三峠のデータです。まずは全季節でのヒストグラムです。こちらはだいたい1000秒台前半に集中していますね。こちらも実際に走ってみた感覚に近いのではないでしょうか。

f:id:emeraldwar:20190925233103p:plain

そして、同様にそれぞれ、夏と冬の走行タイムの分布。

夏)

f:id:emeraldwar:20190925233218p:plain

冬) 

f:id:emeraldwar:20190925233237p:plain

こちらはグラフからもやや冬の方が500秒ほど遅いタイムに人数が集中しているような印象が伺えます。。。。これはもしや、本当に冬になるとタイムが遅くなるのでは。期待できます。 (゚A゚;)ゴクリ

 

検証

では、いよいよ核心に迫ります。ここからPythonを使って本当に「冬のヒルクライムのタイムが夏よりも遅いのか?」を客観的に数値として計算してみましょう。内容は後述しますが、参考に検証時のPythonスクリプトを貼っておきます。

 

gist25a226e02e33599717ee11ef8a615617

 

と言ってもそんなに大したことはしていません。上記のスクリプトではまず、各峠の夏と冬の走行タイム分布における中央値、平均値といった基本的な統計量を計算しています。以下にピックアップして結果を示します。ざっくりと小数点以下を四捨五入しています。なお、一応補足ですが、中央値というのは全員の走行タイムを順に並べた際にちょうど真ん中に来るタイムを表しています。

  • ヤビツ峠の夏の走行タイムの平均値、中央値はそれぞれ、2881秒、2649秒
  • ヤビツ峠の冬の走行タイムの平均値、中央値はそれぞれ、2982秒、 2795秒
  • 十三峠の夏の走行タイムの平均値、中央値はそれぞれ、1489秒、1370秒 
  • 十三峠の冬の走行タイムの平均値、中央値はそれぞれ、1570秒、1469秒

 

なんと、

  • ヤビツ峠の場合、夏は冬よりも平均値、中央値でそれぞれ、101秒、146秒
  • 十三峠の場合、夏は冬よりも平均値、中央値でそれぞれ、81秒、99秒

速くなるという結果が出ているではありませんか!!

 

上記のコードではもうちょっと検証しています。もしかすると、たまたまある年の夏にヤビツ峠や十三峠の近辺である強いチームが合宿をしていてヤビツを走りまくって平均タイムを下げていた、なんて「偶然」があるかもしれません。厳密にデータを扱う際には、こうした差が「偶然」の結果である可能性を排除するため、検定を行います。検定方法には様々なものが存在しますが、ここではマン・ホイットニーのU検定というものを行い、そのp値を算出してみます*3。まあ、詳しいことは置いておいて、このp値がだいたい0.05よりも小さければ、この結果が「偶然」の産物ではないと言っても良いとされています。で、実際に計算してみた結果、

  • ヤビツ峠の夏、冬のタイムでU検定を行った際のp値は 0.0000076
  • 十三峠の夏、冬のタイムでU検定を行った際のp値は 0.0000000061

すなわち、両方の峠のデータでこの差が偶然の産物ではない、と言えそうです。

 

結論

 今回 Strava API から抽出したヤビツ峠と十三峠の夏と冬の走行タイムのを比較した結果、冬のほうが夏よりもわずかにタイムが遅くなる、という結果が得られました。

 

 

ただし、実はこの検証には数カ所ツッコミどころがあります。一番のツッコミどころは、本来タイトルに示した疑問を検証したければ、同一のサイクリストが同一の峠を夏と冬に何回も走ってみた走行タイムを収集して比較、検定を行うのが自然です。したがって、今回は手に入る範囲のデータでできるだけのことをとりあえずやってみた、という域を出ていません。もし、もっと厳密な検証のできるプロの方には是非とも検証を行ってほしいものです*4

 

とはいえ、Stravaのデータだけでもこれだけの結果が得られるのは面白いものです。ヤビツ峠で1分から2分タイムが変わるというのは衝撃的ではないでしょうか?上記のツッコミどころも踏まえて、この結果をどう受け止めるかは個人にお任せします。筆者としてはどちらかというと、ふと疑問に思ったことをデータを集めて分析して検証する、というプロセスに面白さを感じていただければ幸いです。

 

 

おまけ

上記で説明したとおり、各アカウントの記録を抽出することができることはご理解いただけたと思います。そこで、おまけとして、「ヒルクライム偏差値計算機」なるものを作ってみました。

https://mattari-hillclimb-hsa.site/mapapp/main/

サイトにアクセスして、峠のタイムを入力すると、あなたのヒルクライム「偏差値」が計算できます。 思っていたとおり皆さん結構早いようで、55くらいの偏差値が出れば「国立大の工学部は行けるんじゃない?」みたいな感じで自身を持っていただいてもいいんじゃないかとw

*1:蛇足ですが、今や多くの企業の上層部は経営だけでなく最低限のこうしたデータ分析やその利活用、AI(機械学習)に関する素養があることが求められ、さもなくば淘汰される時代であるのは明確でしょう。

*2:鋭い方はここで、実際にStravaで公開されているタイムの人数が上記の数値よりも少ないことを指摘されるかもしれません。この点について正直なところ原因を突き止めることがはできていませんが、APIから入手できるリーダーボードには「アカウント名 (Twitter等の一般的なwebサービスで 'screen name' に相当するもの) が同一だが、Strava側が割り振るアカウントを一意に特定するIDが異なる」と思われるレコードが幾らか含まれており、このあたりに原因がありそうだと見ています。すみません、詳細は未検証です。。

*3:このデータでこの検定はおかしい、という御指摘があればお願い致します。

*4:ただし、これも簡単な話ではありません。仮に同じプロの選手に同条件で夏と冬にTTを走ってもらってデータを大量に集めるとは言っても、そこで得られた結果が「偶然」の産物でないと言い切る、すなわち検定を突破するには少なく見積もっても数十回は夏と冬それぞれでタイムを集める必要があるでしょうし、それを何人もの選手で繰り返す必要があります。が、これってどうでしょうか?こうした実験には学習効果というものがつきもので、何回も同じコースを走っていればそのうち選手も上達してタイムが早くなるでしょう。様々なノイズを除去して大量のデータを集めるのは、その方法を考えるだけでもなかなか骨の折れる話です。