フルマラソンの完走タイム
あまりの運動不足から最近ランニングをはじめ、継続するための目標としてフルマラソンを走ってみたいと思っている。 フルマラソンをとても走れるとは思えなかったが、調べると意外と走れるようである。 走れるといってもそう簡単にできるものではないので、下調べをしていると 自分がどの程度で走れるのか、また、ほかの人がどの程度で走っているのかに興味が出てきた。
スポロクリザルトというサイトで一部マラソン大会の結果が公表されていたので、 一般市民が参加しそうで比較的有名そうな金沢マラソンの記録をもとに、マラソン大会出場者の完走タイムについて簡単に調べてみた。
# パッケージの読込 library(tidyverse) library(rvest) library(lubridate)
# データの取得 ## 男子総合の結果を順次取得する ## 時間もかかるため、ここでは読み込んだ既に取得したデータを読み込むことにする # # 男子 # adress = "https://sporoku.jp/result/kanazawa_20191027/list?race_id=696&div_id=584&page=" # pages = 1:209 # # # dt_male = list() # for(i in pages){ # dt_male[i] = # read_html(paste0(adress, pages[i])) %>% # html_table() # } # saveRDS(dt_male,"kanazawa_marathon_male.rds") # # # 女子 # adress = "https://sporoku.jp/result/kanazawa_20191027/list?race_id=696&div_id=585&page=" # pages = 1:67 # # dt_female = list() # for(i in pages){ # dt_female[i] = # read_html(paste0(adress, pages[i])) %>% # html_table() # } # saveRDS(dt_female,"kanazawa_marathon_female.rds") dt_male = readRDS("kanazawa_marathon_male.rds") dt_female = readRDS("kanazawa_marathon_female.rds") data = map(list(dt_male, dt_female), ~ do.call("rbind",.x)) %>% map(~ .x[,1:4] %>% as_tibble() %>% mutate(time = lubridate::hms(タイム), ranking = str_replace(順位,"位","") %>% as.integer())) %>% map2(c("male", "female"), ~ mutate(.x, gender = .y)) data = do.call("rbind",data) data = group_by(data, gender) %>% mutate(ranking_percentile = ranking/max(ranking)) %>% ungroup()
# 順位パーセンタイル値と完走時間の関係をプロット data %>% ggplot(aes(ranking_percentile, time, color = gender))+ geom_point()+ scale_y_time()
4人に1人はサブ4を達成していることが分かる。 このままでは詳細が見ずらいので、順位のパーセンタイル値ごとに完走時刻をプロットする。
data %>% mutate(percentile_factor = cut(ranking_percentile,breaks = seq(0,1,by=.1))) %>% ggplot(aes(ranking_percentile, time, color=gender))+ geom_point()+ scale_y_time() + scale_x_continuous(breaks=seq(0,1,by=.1))+ facet_wrap(~percentile_factor, scales = "free")
サブ3.5を達成すると上位10%に入ることができるようである。
また、サブ4, サブ5近辺でグラフの傾きが少し変わっていることが確認できる。
これは、それぞれの時間内で完走を目指すためだろう。
## 完走時間のパーセンタイル値 data %>% select(time, gender) %>% group_split(gender) %>% map(~ pull(.x,time) %>% as.numeric() %>% quantile(seq(0,1,by=.05)) %>% data_frame(percentage = names(.),value=.) %>% mutate(h = floor(value/3600), m = floor((value-h*3600)/60), s = floor(value-h*3600-m*60)) %>% mutate(time = paste(h,m,s, sep = ":") %>% hms()) %>% select(percentage, time)) %>% map2(.y=c("female","male"),~mutate(.x,gender=.y)) %>% do.call(what="rbind",args=.) %>% spread(gender, time, convert=T) %>% mutate(num=str_extract(percentage,"\\d+") %>% as.integer()) %>% arrange(num) %>% select(-num) %>% mutate_at(vars(ends_with("male")), hms) %>% mutate(diff_time = as.duration(female - male)) %>% knitr::kable(format="markdown")
percentage | female | male | diff_time |
---|---|---|---|
0% | 2H 34M 52S | 2H 11M 36S | 1396s (~23.27 minutes) |
5% | 3H 44M 25S | 3H 14M 22S | 1803s (~30.05 minutes) |
10% | 4H 0M 18S | 3H 30M 22S | 1796s (~29.93 minutes) |
15% | 4H 15M 23S | 3H 44M 18S | 1865s (~31.08 minutes) |
20% | 4H 28M 6S | 3H 54M 24S | 2022s (~33.7 minutes) |
25% | 4H 37M 35S | 4H 1M 3S | 2192s (~36.53 minutes) |
30% | 4H 46M 56S | 4H 12M 57S | 2039s (~33.98 minutes) |
35% | 4H 55M 21S | 4H 22M 52S | 1949s (~32.48 minutes) |
40% | 5H 1M 54S | 4H 29M 53S | 1921s (~32.02 minutes) |
45% | 5H 13M 17S | 4H 39M 50S | 2007s (~33.45 minutes) |
50% | 5H 22M 27S | 4H 48M 48S | 2019s (~33.65 minutes) |
55% | 5H 30M 23S | 4H 56M 20S | 2043s (~34.05 minutes) |
60% | 5H 39M 5S | 5H 4M 27S | 2078s (~34.63 minutes) |
65% | 5H 47M 47S | 5H 15M 21S | 1946s (~32.43 minutes) |
70% | 5H 56M 13S | 5H 26M 49S | 1764s (~29.4 minutes) |
75% | 6H 6M 0S | 5H 38M 33S | 1647s (~27.45 minutes) |
80% | 6H 16M 25S | 5H 49M 52S | 1593s (~26.55 minutes) |
85% | 6H 28M 3S | 6H 2M 59S | 1504s (~25.07 minutes) |
90% | 6H 37M 51S | 6H 19M 38S | 1093s (~18.22 minutes) |
95% | 6H 49M 7S | 6H 39M 38S | 569s (~9.48 minutes) |
100% | 7H 0M 19S | 7H 1M 55S | 96s (~1.6 minutes) |
上記の結果から、男子のタイムに30分を加えたタイムが、同じ走力を持つ女子と考えられる。