【年代別】フルマラソンの平均タイムを調査!サブ3、サブ4の割合は?

★2021/5/12更新:年代別に分析した内容を加筆しました★

 東京マラソンは毎年3万人以上のランナーが出走する大きな大会のため、データの収集にはもってこいです。

 東京マラソンの公式HPには過去大会の簡単なデータは公開されているものの、調べた限りタイム分布や平均タイムは公開されていませんでした。そこで本記事では、東京マラソンの日本人2年間の全記録(56237人分)を収集し、年代別に分析してみることにしました。

平均タイム・タイム分布の記事リンク

年齢別

中学
高校
一般

大会別

MKディスタンス
日体大記録会

平均タイム・タイム分布

 2018年2019年日本人男女の全記録を収集しました(2020年は新型コロナの影響で出場人数の制限があったので収集していません)。収集したのはグロスタイムではなくネットタイムです。

全年代

平均 サブ2.5 サブ3 サブ3.5 サブ4 サブ4.5 サブ5
男子 4:34'20 0.6% 5.7% 15.2% 32.4% 48.8% 65.8%
女子 4:58'16 0.0% 1.3% 7.6% 17.5% 30.8% 48.6%

見切れている場合横にスクロールできます

 フルマラソンの平均タイム(全年代)は、男子が4時間34分20秒、女子が4時間58分16秒でした。

 サブ3の割合は男子が5.7%、女子が1.3%でした。また、サブ4の割合は男子が32.4%、女子が17.5%でした。

 次にタイム分布をみてみます。横軸はひとつの階級で5分ごとに区分けしています。縦軸相対度数(データ数の割合)です。

フルマラソンのタイム分布

フルマラソンのタイム分布(全年齢)

 男女どちらのグラフも3時間半、4時間のようなキリのいいタイムを切ったところで上に飛び出ていることが分かります。これはサブ3.5、サブ4を目指しているランナーの集団ができているためであると思われます。グラフにここまで顕著に出てくるとは思ってなかったので集団の力のすごさを思い知らされました。

 また制限時間である7時間ギリギリのランナーがほとんどいないのは、グロスタイムでは7時間を超えてしまっていて結果に残っていない(つまり失格になっている)ためだと考えられます。女子のグラフの山が右に寄っていますが、7時間付近のランナーを含めれば左右対称な形に近づくと考えられます。

20代

 男子3715人、女子1399人の結果をまとめました。20代としていますが、正確には19歳の記録も含めています。

平均 サブ2.5 サブ3 サブ3.5 サブ4 サブ4.5 サブ5
男子 4:25'53 4.0% 16.5% 25.1% 37.9% 50.1% 65.0%
女子 5:02'58 0.1% 3.6% 10.0% 17.1% 26.2% 43.5%

見切れている場合横にスクロールできます

 20代のフルマラソンの平均タイムは、男子が4時間25分53秒、女子が5時間02分16秒でした。意外なことに、20代女子の平均タイムは60代以上の次に遅いタイムでした。

 男子はサブ2.5を達成したランナーが4.0%もいました。サブ3の割合は男子が16.5%、女子が3.6%、またサブ4の割合は男子が37.9%、女子が17.1%でした。

 タイム分布は以下の通りです。

20代のフルマラソンのタイム分布

20代のフルマラソンのタイム分布

 男女ともにサブ5の割合は全年代とほとんど変わりませんが、サブ2.5やサブ3の割合は一番大きいです。これは、20代はエリート準エリート枠のランナーが多いためだと思われます。

30代

 男子9240人、女子2256人の結果をまとめました。

平均 サブ2.5 サブ3 サブ3.5 サブ4 サブ4.5 サブ5
男子 4:29'14 1.0% 10.0% 20.5% 36.9% 50.9% 66.7%
女子 4:59'23 0.0% 2.4% 9.9% 18.5% 29.8% 46.1%

見切れている場合横にスクロールできます

 30代のフルマラソンの平均タイムは、男子が4時間29分14秒、女子が4時間59分23秒でした。

 サブ3の割合は男子が10.0%、女子が2.4%でした。また、サブ4の割合は男子が36.9%、女子が18.5%でした。

 サブ2.5~サブ3までの割合は20代よりも小さいですが、サブ4.5~サブ5の割合は20代よりも大きくなっています。

 タイム分布は以下の通りです。

30代のフルマラソンのタイム分布

30代のフルマラソンのタイム分布

 20代のタイム分布は2時間台前半~6時間台後半まで幅広く分布していましたが、30代のタイム分布は20代よりも中心(平均タイム)に寄った形状をしています。

40代

 男子14819人、女子4043人の結果をまとめました。東京マラソンの出走数は40代が一番多かったです。

平均 サブ2.5 サブ3 サブ3.5 サブ4 サブ4.5 サブ5
男子 4:29'23 0.1% 5.3% 17.1% 36.2% 53.2% 69.5%
女子 4:52'27 0.0% 0.9% 9.3% 20.7% 35.4% 52.9%

見切れている場合横にスクロールできます

 40代のフルマラソンの平均タイムは、男子が4時間29分23秒、女子が4時間52分27秒でした。女子は40代の平均タイムが一番速いという結果になりました。

 サブ3の割合は男子が5.3%、女子が0.9%といずれも30代より減少しました。また、サブ4の割合は男子が36.2%、女子が20.7%でした。

 タイム分布は以下の通りです。

40代のフルマラソンのタイム分布

40代のフルマラソンのタイム分布

 男子のタイム分布は、30代と比べて大きく変わりませんでした。

 一方女子のタイム分布は、30代と比べると山の頂点が左側にシフトしています。つまり、5時間付近の選手が30代と比べて多くなったことが、全年代で一番平均タイムが速いことに結びついています。

50代

 男子12277人、女子3158人の結果をまとめました。

平均 サブ2.5 サブ3 サブ3.5 サブ4 サブ4.5 サブ5
男子 4:36'45 0.0% 1.6% 10.6% 30.1% 48.7% 67.0%
女子 4:57'47 0.0% 0.2% 4.4% 15.9% 31.5% 50.5%

見切れている場合横にスクロールできます

 50代のフルマラソンの平均タイムは、男子が4時間36分45秒、女子が4時間57分47秒でした。

 サブ3の割合は男子が1.6%、女子が0.2%でした。また、サブ4の割合は男子が30.1%、女子が15.9%でした。

 タイム分布は以下の通りです。

50代のフルマラソンのタイム分布

50代のフルマラソンのタイム分布

 男女ともに、タイム分布は全体的に右側にシフトしています。30代と40代では大きく変わっていませんでしたが、50代になると少し体力が衰えてしまうようです。

 とはいっても、50代女子の平均タイムは20代よりも5分ほど速いです。20代よりも速く走れるというのは素晴らしいことだと思います。

60代以上

 男子4544人、女子786人の結果をまとめました。最高齢は男子が84歳、女子が83歳でした。

平均 サブ2.5 サブ3 サブ3.5 サブ4 サブ4.5 サブ5
男子 5:01'18 0.0% 0.0% 2.6% 12.9% 29.3% 49.8%
女子 5:18'32 0.0% 0.0% 1.0% 5.1% 15.4% 35.4%

見切れている場合横にスクロールできます

 60代以上のフルマラソンの平均タイムは、男子が5時間01分18秒、女子が5時間18分32秒でした。

 サブ4の割合は男子が12.9%、女子が5.1%でした。また、サブ5の割合は男子が49.8%、女子が35.4%でした。

 タイム分布は以下の通りです。

60代以上のフルマラソンのタイム分布

60代以上のフルマラソンのタイム分布

 当然ながらタイム分布は50代のときよりも右側にシフトしていますが、完走するだけでもすごいことだと思います。

【参考】データの収集方法

 参考までにデータの収集方法を載せておきます。3万人以上のデータを手動で集めるのは不可能に近いので、PythonWebスクレイピング(ソフトウェア技術を用いたデータ収集)を行いました。以下に2018年の日本人男子のデータ収集を例に、ソースコードと簡単な解説をします。

 日体大記録会のデータ収集の場合では、組ごとにURLが異なる静的ページであったため、beautifulsoapというスクレイピング用のライブラリを使って簡単にデータ収集ができました。

 しかしながら東京マラソンのサイトではJavaScriptが使用されていて、URLが変わらないのにページ内のボタンを押すことで表示内容が変わる動的ページであったため、beautifulsoapのみではデータ収集ができないことが分かりました。

 そこで、seleniumというブラウザ操作用のライブラリを用いて、beautifulsoapと連携してデータを収集することにしました。

import time from selenium import webdriver from selenium.webdriver.support.select import Select from bs4 import BeautifulSoup import pandas as pd import matplotlib.pyplot as plt import numpy as np #ページにアクセス url = "https://www.marathon.tokyo/2018/result/index.php" driver = webdriver.Chrome("../chromedriver.exe") driver.get(url) #マラソン男子を選択 element = driver.find_element_by_id("category") select = Select(element) select.select_by_value('1') #日本を選択 element = driver.find_element_by_id("country") select = Select(element) select.select_by_value('JPN') #検索ボタンをクリック element = driver.find_element_by_id("btn_submit") element.click()

 まず、seleniumで東京マラソンの結果検索画面を開きます。今回はフルマラソンの日本人男子の結果を検索するので、種目をフルマラソン男子、国籍を日本人にして検索ボタンをクリックします。

東京マラソン2018結果

 検索結果画面はこのように出てきます。この画面でタイム一覧が出てきてくれれば嬉しかったのですが、個人の名前をクリックしないとタイムが見れなそうです。

 そのため時間がかかりますが、「個人名をクリック → タイム取得 → 戻る → 50人分取得したら次のページに進む」という操作を22414人分繰り返し行うことにしました。

#検索の範囲 start_num = 1 end_num = 22415 #パラメータ num = start_num index = (start_num - 1) % 50 + 1 page = (start_num - 1) // 50 #再スタートの場合はコメントアウト results = [] #再スタートの場合はcsv読み込み #df = pd.read_csv('Tokyo-Marathon-2018_Results_Men.csv', header=None) #results = list(df[0].values) #開始ページに移動 driver.execute_script(f'javascript:page({page});') #繰り返し処理スタート while num <= end_num: #選手名クリック element = driver.find_element_by_xpath(f'//*[@id="result_content"]/div[1]/div/table/tbody/tr[{index+1}]/td[4]/a') element.click() time.sleep(0.2) trials = 0 for i in range(10): try: html = driver.page_source.encode('utf-8') soup = BeautifulSoup(html, 'lxml') #タイム取得(通常) if len(driver.find_elements_by_xpath('//*[@id="result_content"]/div/div/table[2]/tbody/tr')) == 7: result = soup.select('#result_content > div > div > table:nth-of-type(2) > tbody > tr:nth-of-type(6) > td') [0].getText() results.append(result) #都道府県データがない選手 else: result = soup.select('#result_content > div > div > table:nth-child(2) > tbody > tr:nth-child(5) > td') [0].getText() results.append(result) break #タイム取得に失敗したら1秒待機し再取得 except IndexError: time.sleep(1) trials += 1 #戻る driver.back() #10回取得しようとても失敗した場合 if trials == 10: results.append(f'{num}:None') driver.execute_script(f'javascript:page({page});') #パラメータの更新 num += 1 index += 1 #50人取得したら次のページに進んで10秒待機 if index == 51: element = driver.find_element_by_xpath(f'//a[contains(@href,"page({page + 1})")]') element.click() page += 1 index = 1 time.sleep(10) #csvに保存 df = pd.DataFrame(results) df.to_csv('Tokyo-Marathon-2018_Results_Men.csv', header=False, index=False)

 タイム取得の失敗seleniumで選手の名前をクリックしてから、パソコンの動作が追い付かず詳細ページが表示される前にbeautifulsoapでのスクレイピングが実行されてしまったときに起こります。そのため、取得に失敗したら1秒待って再度スクレイピングを実行するようにしています

 このように、ブラウザ自体を動かしながらデータを収集しているのでかなりの時間(1000人で15分くらいのペース)がかかりました。1日で男女2年間分のデータを収集することはできないので、1日の終わりに取得したデータをcsvに保存し、翌日csvを読み取って途中から再スタートできるようにしました。

 データの収集が終了したら、取得データを秒単位の数値に変換し、ヒストグラムにして可視化します。コードは日体大記録会のデータ収集のときとほとんど同じです。

おすすめ記事

日体大記録会5000m全記録をデータ化!平均タイム、タイム分布は?

日体大記録会5000m全記録をデータ化!平均タイム、タイム分布は?

日体大長距離記録会といえば、学生をはじめ多数のランナーが自己ベストを狙って出場する有名な記録会です。本記事では、日体大長距離記録会の中でも最も出場人数の多い5000mの記録をデータ化してまとめてみました。

【年齢別】50m走の平均タイム|100mとの換算も紹介

【年齢別】50m走の平均タイム|100mとの換算も紹介

 学生時代は誰もが走ったであろう50m走の平均タイムを年齢別(20代以上も対応)に紹介します。また100m走を走った場合、どれくらいのタイムが予想されるかの換算表も紹介します。 目次1 50m走の平均タイム1.1 小学生 […]

【永久保存版】陸上50m〜400mのタイム相関(換算)表

【永久保存版】陸上50m〜400mのタイム相関(換算)表

短距離選手なら練習でよく60mや150mを走ることがあると思います。本記事では、50m, 60m, 80m, 100m, 120m, 150m, 200m, 250m, 300m, 400mのタイムの相関(換算)について詳しくまとめました。

【学年別】中学生陸上部の100m、200m、400mの平均タイム

【学年別】中学生陸上部の100m、200m、400mの平均タイム

中学生陸上部の100m、200m、400m(男子のみ)の平均タイムとタイム分布を調べてみたので紹介します。