Scoring methodology
Version: scoring-methodology-v1.0
Every figure on this site is reproducible. Two analysts running this specification on the same course geometry get the same number — that is what makes a claim like “the flattest UK marathon for a PB” defensible and citable. The formulae and parameters below are published verbatim and version-locked: any change increments the version, triggers a full recompute, and is logged.
Why raw elevation numbers can’t be compared
The same course returns wildly different elevation totals depending on the device, the trackpoint density, and the smoothing the source applied — we have seen one course reported as roughly 932 ft of climb by one source and 748 ft by another. Publishing either as fact would be misleading.
So we never ingest a source’s elevation total. We ingest the course geometry (coordinates) and run every course through one identical pipeline. The output is comparable across every course because it was produced by the same code with the same fixed, published parameters.
How we normalise a course profile
Given the geometry (latitude/longitude, plus raw elevation where present), we apply the following deterministic steps. Where raw elevation is sparse or noisy, we derive it from a public, keyless elevation dataset by coordinate and record which source was used per course.
- Resample to a fixed step of Δ = 10 m by linear interpolation, removing trackpoint-density bias.
- Smooth with a rolling median over W = 50 m, then a light Gaussian with σ = 20 m.
- Accumulate gain and loss with a hysteresis of τ = 1 m, which kills GPS-noise inflation.
- Classify every resampled segment into grade buckets and record the percentage of distance spent in each.
- Integrate the published grade-to-energy-cost function over the course to produce the GAP factor.
- Stamp the output with the methodology version and a recompute hash = sha256(geometry snapshot + methodology version) so any number can be reproduced.
What is the GAP factor, and how is it computed?
GAP (Grade-Adjusted Pace) factor expresses how much slower a course is than a flat one, as a percentage, purely from its gradient profile. It uses the Minetti et al. (2002) energy cost of running, Cr(i), a fifth-order polynomial in the gradient i (rise over run as a fraction). The exact coefficients are published below and never change without a version bump.
We compute Cr(i) = a₅·i⁵ + a₄·i⁴ + a₃·i³ + a₂·i² + a₁·i + a₀ at every resampled segment, take the ratio to the flat cost Cr(0) = 3.6, weight by segment distance, and integrate over the course. The GAP factor is that distance-weighted mean cost ratio, expressed as “X% slower than flat”.
Lower is faster. Because the function and the coefficients are fixed and public, the same geometry always yields the same GAP factor — which is what makes our “flattest” and “fastest course” rankings reproducible.
Finisher distributions and the Field-Quality Index
For each race edition we compute an aggregate-only distribution — the count, median, the 10th/25th/75th/90th percentiles, the fraction of finishers below each distance-appropriate threshold band, and the DNF rate. We never store, index, or republish individual finisher rows; aggregation happens in memory and the rows are discarded.
Fast events attract fast fields, which would make a fast course look even faster for the wrong reason. The Field-Quality Index (FQI) corrects for this: we benchmark the edition’s fast tail (its 10th percentile) against the all-UK baseline for that same distance, producing a field-strength multiplier. The empirical-speed signal is de-confounded by FQI before it feeds the score, so we measure how fast people run once we control for who showed up.
How is PB-potential calculated?
PB-potential is the headline score and the hard-to-copy one, because it fuses two independent signals: the course should be fast (physics), and runners actually do run fast there once you control for the field (empirical). It is a weighted sum of three terms:
pb_potential = w₁·gap_term + w₂·empirical_term + w₃·conditions_term
The gap_term comes from the GAP factor (lower GAP scores higher); the empirical_term is the field-normalised real finish speed from the distribution (de-confounded by FQI); the conditions_term is the typical race-date temperature favourability. The default weights are published below, and we publish a sensitivity table alongside them.
Why the weights are trustworthy (the sensitivity table)
A score is only honest if its ranking does not lurch when a weight is nudged. We publish a sensitivity table that perturbs each PB-potential weight by a fixed amount and reports how much the resulting ranking moves (rank-correlation against the baseline ordering). A stable, high rank-correlation under perturbation means the headline ordering is driven by the data, not by a fragile choice of weight.
If a methodology change ever made the ranking sensitive to small weight changes, that is a signal to revisit the weights — and any such change would itself be a version bump, recompute, and log entry.
Value, conditions, beginner-friendliness and organisation
Value is the total cost to the start line — entry fee plus modelled travel and modelled accommodation by origin region — per finisher, benchmarked across the distance. Travel and lodging are labelled modelled estimates, not live prices, which is deliberate: it lets us avoid booking APIs while still surfacing the real ~£500+ outlay of which entry fee is only about a tenth.
Conditions favourability scores the typical race-date weather: no penalty inside the optimal temperature window, with published penalties per degree outside it and per unit of typical precipitation and wind above a floor.
Beginner-friendliness rewards a generous cutoff, a supportive field size, high support density, low gradient and a high flat-bucket percentage — especially meaningful at the half and 10k, the beginner-heavy distances.
Organisation is a counts-weighted aggregate of review sentiment (ratings and counts only — never verbatim review text).
The overall score (no black box)
The overall score is a published weighted composite of the five sub-scores, with the weights shown below. Crucially, every sub-score is shown independently on every page: there is no hidden roll-up, so a reader who cares only about value or only about flatness can see exactly that input rather than trusting a single opaque number.