R Advent Calendar 2015 第14日目の記事です。
年に1回のAdvent Calendarの場ですが,個人的に興味があったデータを集めて,どんな感じか見てみたという内容で申し訳ないのと,そ,そして,後に登場するshinyappは一部エラー処理を施していないところもありますが,後日,修正しますので宜しくお願い致します。m(')m
#1. はじめに
##1.1. Triathlon とは
Triathlonとは,Swim,Bike,Runの3種目を続けて行う競技です。
##1.2. 種類
###(1) 距離
Triathlon というと,とっても辛いというイメージがあるかもしれませんが,距離の違いにより様々なタイプがあります。
Type | Swim | Bike | Run | e.g. |
---|---|---|---|---|
Super sprint | 400m | 10km | 2.5km | |
Sprint | 750m | 20km | 5km | 横浜シーサイドトライアスロン |
Short(Olympic) | 1.5km | 40km | 10km | Ironman 5i50 九十九里トライアスロン |
Middle(half) | 1.9km | 90km | 21km | Ironman 70.3 |
Long | 3.8km | 180km | 42km | Ironman, 全日本トライアスロン宮古島, 佐渡国際トライアスロン |
###(2) 競技タイプ
競技タイプはエリート,エイジ,そしてリレーがあります。
プロをエリート,一般競技者がエイジ,3種目を2名または3名で行うタイプをリレーといいます。
マラソン大会などでは,総合順位および男女別順位が公表されますが,トライアスロン(エイジ)では,総合順位,男女別順位,に加えて,性別×年代で順位を争います。
#2. Ironman シリーズ
トライアスロンのレースで最も有名なレースがIronmanシリーズです。
#2.1. いろいろなIronman
Ironman には,IronKids,Ironman 5i50, Ironman 70.3, Ironmanと様々な距離タイプがあり,世界中の国や地域で開催されています。
Ironman のHPに行けば同様のマップが確認できますが,先日開催された Japan.R 2015で @kazutan さんからleafletを教わりました[1]ので,せっかくなので大会情報をプロットしてみましょう。
まずは,大会の開催情報を取得します。
library(rvest)
library(dplyr)
# データ収集
html <- read_html("http://ap.ironman.com/events/triathlon-races.aspx")
race <- data.frame(
area = html %>%
html_nodes(xpath = '//article/header/span') %>%
html_text(),
date = html%>%
html_nodes(xpath = '//article/time')%>%
html_text(),
type = html%>%
html_nodes(xpath = '//article/p')%>%
html_text(),
stringsAsFactors = FALSE
)
leafletでプロットしたいので,開催地(area)の情報から位置(緯度経度)情報を取得します。
# area情報から位置情報を取得する
library(ggmap)
geo <- lapply(race$area,function(x){geocode(location=x,source="google",output="latlon")})
race$lon <- sapply(geo,function(x) as.numeric(x["lon"]))
race$lat <- sapply(geo,function(x) as.numeric(x["lat"]))
IRONMAN(フル)の大会のみをmap上にプロットしてみます。(下図はpngファイルです)
欧米を中心に,アジア地域でも開催されています。
library(leaflet)
race %>% filter(type=="IRONMAN") %>% leaflet() %>% addTiles() %>%
addMarkers(lng=~lon,lat=~lat)
おやおや,日本にはピンが立っていないゾ???と思われた方もいらっしゃるかもしれませんが,実は,昨年と今年(2015年)は8月に北海道で行われていたのですが,バイクコース上の橋が崩落してしまい,来年(2016年)は開催されないことが決定されたのです(><)っ。でも,Ironman 70.3は毎年6月に愛知県のセントレアで開催されていますので,是非!
さて,距離タイプ別に大会の数を集計してみると,IRONMAN 70.3が最も多く,93レースも行われていることがわかります。5i50は最近増えてきているようですが,まだ他に比べると少ないですね。
main.types <- c("IRONMAN","IRONMAN 70.3","5i50")
race %>% filter(type%in%main.types) %>%
group_by(type) %>% summarise(count=n())%>%slice(match(main.types, type))
type | count | |
---|---|---|
1 | IRONMAN | 40 |
2 | IRONMAN 70.3 | 93 |
3 | 5i50 | 14 |
#2.2. World Championship
このように,年中,世界中でIronmanの大会が行われているわけですが,各大会で上位に入賞した人(主に年代別1位)は,Champion大会に出場する権利が与えられ,Champion大会で優勝者たちが競い合います。
特に,Ironman(フル)のChampion大会は,毎年10月にHawaii の KONAで開催されており,トライアスロンをする人の多くが一度は出てみたいと夢見る大会なのです。
#3. World Championship Kona
そこで,Ironman World Championship KONAに出場している人たちがどれくらいのレベルなのか,目に焼き付けておくべく,データを収集し簡単に集計しましたので,以下にまとめます。
#3.1. データ収集
・ データ取得月 : 2015年12月
・ 対象とする大会 : 2011年から2015年までの5年間
※ 大会成績のデータも上記大会情報と同様に{rvest}パッケージを使用してスクレイピングを行いましたが,コードの掲載は割愛させていただきます。renkun氏のコメント[2]を参考にしています。
#3.2. Shinyapp作成
興味のあるエイジグループの水準感の確認と,自身の今のレベルを比較できるような簡単なアウトプットにしてあります。
input項目は下図のように,性別,年代の選択と,自分の記録の入力ができます。
outputは,種目別にタブが分かれており,それぞれ,過去5年間の当該エイジクループの記録のヒストグラムと基本統計量が表で現れます。
自分の記録を入力した場合には,下図のように,赤いラインで位置を示しレベルの違いを痛感します。
また,"Top 10"タブには,過去5年間の記録の上位10名と下位10名の記録が表示されます。
こうしてみると,やはり欧米強いですねー,という印象を持ちます。
"Finish Rate"タブには,エントリー,DNS,出走者,完走者,そしてDNFの人数がまとめられています。
Champion大会だけあって完走率は高いですね。
"compare"タブでは,inputにかかわらず,種目別のboxplotが全ての年代別について横並びに確認できます。
基本的には,若いほどタイムが早く,高齢になる程遅いのですが,Bikeの男性の記録は40代前半頃まで横ばいなところは,機材(バイク)の性能でタイムが上がっていることの現れなのかな,なんて考えちゃったりしますね。
shinyapp urlはこちら
https://aich08.shinyapps.io/im_kona
#4. まとめと今後の課題
2011年から2015年分のIronman Konaの記録を収集し, 基本的な統計量が確認できるアプリを作りました。
該当者なしのエイジに対するエラー処理を施していないため,後日,処理を追加します。
また,処理が遅いので,負荷のかかるところを軽くなるように改善します。
今後は,参加者の地域を可視化する機能も追加したいと思います。UIももうちょっと可愛らしくしなくちゃですね。(^^;)
Enjoy!!
#参考文献
##[1] kazutan, leafletではじめるRによる地図プロット, https://rpubs.com/kazutan/leaflet_slide
##[2] renkun-ken, Scraping college rankings data? #17, https://github.com/hadley/rvest/issues/17