Modeled from observed gaps between buses, with riders assumed to arrive at random times and stops weighted equally. The typical wait is the median; the 5% figure is the 95th percentile.
What this is. The same On Time Service Delivered
metric shown on the weekly dashboard, scoped
to this route. An eligible scheduled stop arrival counts toward the metric
only if the bus arrived between 1 minute early and 7 minutes
late (−60 s ≤ delay ≤ 420 s). Stops outside that window
remain in the denominator but do not count toward the metric; this includes
eligible stops where the bus was never observed. The denominator includes
wholly unobserved trips but excludes route origins, final terminals, and
stops where GTFS prohibits pickup.
On Time Service Delivered = qualifying stops ÷ eligible scheduled stops × 100.
Qualifying events come
from BigQuery and the complete denominator comes from archived GTFS;
the exact counts are reused from the weekly roll-up.
Time resolution. The left chart is the true On Time Service Delivered percentage per day (the finest count-based resolution we precompute). The right chart adds hourly context: median (p50) and p95 delay by hour of day, with the shaded band marking the accepted −1…+7 min window — hours whose line sits inside the band mostly fall within the rider window, while hours above it are running late. Finer (e.g. 15-min) On Time Service Delivered data would require a new aggregation in the stats pipeline.
Headway CV means coefficient of variation (standard deviation ÷ mean); lower values mean more even spacing.
CV is the coefficient of variation (standard deviation ÷ mean) near six points from the start to the end of the route. Lower is more even.
Inspired by Jason Cole's Bus-teresis analysis, which charts median wait time at a stop as the time a passenger arriving at a uniformly random moment would have to wait for the next bus. Cole worked from the TfL "next bus" prediction feed; we don't have predictions, so we derive the same quantity from observed arrivals.
How it's computed. For every (stop, day) we
line up consecutive bus arrivals within the same route direction
and measure the gap between them (the headway). Every
recorded arrival is retained even if the trip later times out;
stops the bus never reached have no arrival and do not enter the
sequence. Under the inspection
paradox a random passenger lands in a gap of length
h with probability proportional to h
and then waits uniformly on (0, h), so the
wait-time density is (1 − FH(w)) / E[H]
and the mean wait is E[H²] / (2 · E[H]). The
histogram below is exactly that density, normalized; the cards
show the mean and median wait.
Caveats. Headways shorter than 30 s are dropped (finalize-time duplicate rows) and headways longer than 90 min are dropped (route overnight shutdown). Each stop on the route contributes equally — we don't have ridership weights, so a quiet end-of-line stop counts the same as a busy downtown stop.
Each cell is the average wait someone would experience if they arrived at a uniformly random time within that one-hour window. A bus-to-bus gap that crosses an hour boundary is split at the boundary, so each rider-arrival minute belongs to exactly one hour. The larger number is the wait derived from observed arrivals; sched is the wait if buses followed the published schedule. A dash means no later arrival formed a usable gap for that hour.
Wait-equivalent service interval makes each wait easier to picture: it is twice the average wait, representing the perfectly regular service interval that would give a randomly arriving rider the same average wait. For example, a 12-minute average wait is equivalent to perfectly regular service every 24 minutes. Because real gaps vary, this is a rider-experience equivalent—not the literal average or maximum time measured between buses.
Per-leg average speed is computed in
tripToRows as
(distance between consecutive stops) / (time between
consecutive actual arrivals). The histograms below
aggregate those per-leg speeds across every observed leg of
this route in the selected week, grouped by direction (inbound
/ outbound), day-of-week type, and hour of day in Pacific
time. Hours with fewer than 10 legs are dropped to avoid
percentile noise; outliers above 78 mph are filtered in the
BigQuery aggregation as projection glitches.
Left column: central tendency — solid line is the mean, dashed is p50 (median). Right column: speed spread and dispersion — a shaded 5–95th percentile band with the standard deviation line drawn on top. Blue = weekday, pink = weekend. Hover any chart to see all values for that hour.
direction_id = 1
direction_id = 1
direction_id = 0
direction_id = 0
Circle color: green = on time, yellow = moderately late, red = significantly delayed.
Circle size: larger = more extreme delay or variability at that stop.