How it works
Methodology
Data source
All data comes from the BTS Marketing Carrier On-Time Performance dataset, published monthly by the U.S. Bureau of Transportation Statistics. It covers US domestic scheduled passenger service from January 2018 through April 2026 — approximately 69 million non-cancelled departures across 395 airports.
Why 2018
BTS switched to the Marketing Carrier format in January 2018, which attributes each flight to the carrier that sold the ticket rather than the one that operated it. Records before 2018 use a different schema and aren't directly comparable.
Cancelled and diverted flights
Cancelled flights are excluded from all delay metrics — they represent a separate outcome and would otherwise distort average delay figures. Diverted flights are excluded from arrival delay calculations because they never reach the destination airport; they may appear in departure figures if a departure time was recorded.
What counts as a delay
BTS officially counts a flight as on-time if it arrives within 15 minutes of schedule. KYF uses a stricter three-tier breakdown:
On-time or early: within 5 minutes of schedule. Minor delay: 5–15 minutes late. Disruptive delay: more than 15 minutes late.
Average delay figures include all non-cancelled flights, not just delayed ones. Early arrivals have negative delay values; on-time arrivals are near zero. This produces a more realistic picture of a typical passenger's experience than averaging only the late flights.
Delay rate
Delay rate = flights arriving (or departing) 15 or more minutes late, divided by total non-cancelled flights. The map uses departure delay rate. Route pages report both departure and arrival delay rate — departure reflects operational performance at the origin, arrival reflects the end-to-end travel experience.
Carrier performance
Each carrier on a route is ranked by average arrival delay across all their non-cancelled flights on that leg. The count shown is total flights operated, not seats sold. Per-carrier annual breakdowns require at least 30 flights in that year to be shown, to avoid unreliable averages from very thin samples.
Time-of-day and seasonal patterns
The polar chart shows the percentage of flights delayed 15 or more minutes, broken out by month and by day of week. Values are computed from all non-cancelled flights in the selected year range that fall within each month-day combination. Hovering a month segment reveals the day-of-week breakdown for that month.
Which routes are included
Any route with at least one recorded flight appears on the map. Annual breakdowns on route pages require at least 50 flights in a given year to be shown, to keep per-year averages statistically meaningful.
Year range selection
When you filter by year range, all statistics are recalculated using only flights within those years. Years are weighted by flight count, so busier years have proportionally more influence on combined averages.
2020 and 2021
COVID-19 cut US air traffic by roughly 60% in 2020 and 40% in 2021. Delay rates fell not because operations improved but because reduced congestion meant fewer cascading delays. These years are included but worth filtering out for a pre-pandemic baseline.
2026 partial year
BTS publishes data with a two-to-three month lag. The last available month at the time of the most recent build was April 2026, so 2026 covers only January through April and is not comparable to a full year.
Pipeline
Raw BTS monthly CSV files are converted to Parquet and partitioned by year and month. Aggregations are computed from those files using DuckDB. Two build passes run over the data: the first produces map data (airport and route summaries, broken out by year); the second builds one JSON file per route containing all the breakdowns shown on route pages. The site is fully static — no computation happens at request time. Year-range filtering recalculates weighted averages from per-year fields pre-embedded in each JSON file.
Questions about the methodology? Get in touch.