フルマラソンの完走タイム

あまりの運動不足から最近ランニングをはじめ、継続するための目標としてフルマラソンを走ってみたいと思っている。 フルマラソンをとても走れるとは思えなかったが、調べると意外と走れるようである。 走れるといってもそう簡単にできるものではないので、下調べをしていると 自分がどの程度で走れるのか、また、ほかの人がどの程度で走っているのかに興味が出てきた。

スポロクリザルトというサイトで一部マラソン大会の結果が公表されていたので、 一般市民が参加しそうで比較的有名そうな金沢マラソンの記録をもとに、マラソン大会出場者の完走タイムについて簡単に調べてみた。

# パッケージの読込
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()

f:id:jerrarrdan:20200101154447p:plain

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")

f:id:jerrarrdan:20200101154513p:plain

サブ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分を加えたタイムが、同じ走力を持つ女子と考えられる。