Boston 2014, 31,842 finishers, one world record

Distribution fitting and Extreme Value Theory

The marathon record is faster than every Boston finisher

Meb Keflezighi won the 2014 Boston Marathon in 2:08:37. Sabastian Sawe's world record, 1:59:30, is 9 minutes 7 seconds faster than that, and off the fast end of the whole 31,842-runner field: 2.4 standard deviations below the mean. The median finisher took 94% longer than the record.

3:52

Median finish time. The field is close to log-normal, with a mean of 4:03 and a slow tail running out to the 7:00 cut-off.

0 of 31,842

Finishers faster than 1:59:30. The closest was the winner, at 2:09.

ξ = −0.15

Generalized Pareto shape on the fastest 5%. Below zero, so the fast tail has a finite end.

92.6%

Share of the field a 3:00 marathon finishes ahead of. A 4:00 is ahead of 43.2%.

At a glance

Question
Where does the 1:59:30 marathon world record sit against a full race field?
Data
Boston Marathon 2014, runners only, 2:00 to 7:00: n = 31,842 finishers
Method
Shifted log-normal fit to the body; generalized Pareto on the fastest 5% (1,593 runners under 2:56)
Check
Counted, not fitted: finishers faster than the record, against the winner's 2:09
Result
0 of 31,842 beat it; the record is 2.4 SD below the mean of 4:03, and the 3:52 median is 94% slower. Tail shape ξ = −0.147 (bounded)
Limitation
One qualifying race in one year, so the field is faster than a general-entry marathon. No holdout race.

Start · the question

Two points on one axis

I have run 14 marathons, with a best of 2:48 in Berlin. Put a club runner's time and the world record on the same time axis and they become two points on one curve: the curve a whole marathon field makes.

The curve here is the 2014 Boston Marathon, from the public llimllib/bostonmarathon mirror. I kept runners only (no wheelchair or handcycle entries) with times between 2 and 7 hours, which leaves 31,842 finishers.

Body · log-normal fit

A marathon field is log-normal

A shifted log-normal with its floor at 118 minutes tracks the histogram closely. The median is 3:52, and the slow tail pulls the mean to 4:03 (standard deviation 51 minutes). The shape is lopsided: a runner can finish hours behind the middle of the field, while the winner was 1:43 ahead of it. Then there is the gap on the left, between the record and the winner, where nobody in the field ran.

Nobody in the field ran inside the gap between 1:59:30 and 2:09

Hover the chart, or focus it and use the arrow keys, to read a bar.

Finishers per two-minute bin. The line is the log-normal fit to the whole field, scaled to the bars, so it only matches under "Everyone". Data from tables/web_continuum.json, written by export_web.py from the file analyze.py reads.

Tail · Peaks-Over-Threshold

The fast tail has a finite end

ξ = −0.15

Generalized Pareto shape, fitted to the 1,593 finishers under 2:56.

The body fit says little about the extreme fast end, so the tail gets a model of its own. I set the threshold at the fastest 5% of the field (2:56), measured how far each of those 1,593 runners beat it, and fitted a generalized Pareto distribution to those gaps. The shape parameter is −0.147.

A negative shape means the distribution is bounded: fast performances stop at some finite point. Peaks-Over-Threshold can tell whether such a bound exists but is poor at saying where it is, so I report the shape and leave out any estimate of a fastest possible time.

Histogram of minutes under the 2:56 threshold for the fastest 5 percent of finishers, with a generalized Pareto curve of shape -0.15 falling toward zero.
Exceedances below the 2:56 threshold and the fitted generalized Pareto curve, as drawn by analyze.py.

Lookup · your race

Where your time lands

Enter a marathon time and, if you like, narrow the comparison to your gender and Boston's age group. The share is counted directly from the finishers, one-minute bins, with no fitted curve involved.

Finish-time lookupBoston 2014 field

h:mm:ss or h:mm, between 2:00 and 7:00

  

For reference, the fixed rows in tables/you_vs_goat.csv, printed as a pace band. Each cell gives a finish time, the share of the field behind it, and how much longer it takes than the record.

2:3099.7% behind+25.5%
2:4598.1% behind+38.1%
3:0092.6% behind+50.6%
3:3070.6% behind+75.7%
4:0043.2% behind+100.8%
4:3026.3% behind+125.9%
5:0014.4% behind+151.0%
6:002.8% behind+201.3%

A 4:00 marathon takes just over twice as long as the record.

Limits · one field, one year

What this doesn't show

Boston is a qualifying race, and almost everyone in this field had to run a qualifying time to enter, so the curve sits faster than a general-entry marathon would. When the lookup says a 3:00 is ahead of 92.6%, it means ahead of this field; a slower field would push the record further out. The age-group comparison inherits the same bias, because Boston's qualifying times loosen with age.

The field is one race in one year, Boston 2014. The 2013 race is left out because it was stopped partway through.

I don't give the record's rarity as "1 in N". That needs the fitted density far past the last data point, so the record is described by what was observed: faster than all 31,842 finishers and 2.4 standard deviations below the mean.

The record used is Sabastian Sawe's 1:59:30 (London, 26 April 2026), which World Athletics ratified on 23 July 2026; it is the value set in analyze.py. It replaced Kelvin Kiptum's 2:00:35, and the change moved the record mark and the percent-slower figures and none of the field statistics.

Finish · how it was built

Where the numbers come from

Data
Boston 2014 official results from the llimllib/bostonmarathon mirror, runners only, 2:00 to 7:00
Sample
31,842 finishers: 14,316 women and 17,526 men
Body fit
Shifted log-normal (floor 118 min), scipy.stats.lognorm
Tail fit
Peaks-Over-Threshold, generalized Pareto on the fastest 5% (scipy.stats.genpareto)
Reported
Tail shape ξ only; no endpoint estimate
Page data
export_web.py writes one-minute histograms by gender and age group and the log-normal curve to tables/web_continuum.json
Built with
Python, pandas, NumPy, SciPy, matplotlib; the charts here are plain SVG

Find your time on the curve, then look left