Delay Contagion: How Late Flights Infect the Network
Flight delay behaves like an infectious disease, and the carrier is the airframe itself. An aircraft that lands late departs late; that departure lands late somewhere else; by evening, a thunderstorm that cleared Chicago at noon is still rippling through Portland. This study follows every aircraft in the federal on-time data through its day, leg by leg, and measures the epidemic directly: how much delay survives an airport turn, which airports generate delay and which merely relay it, and which corridors carry the infection between hubs.
Picture a 737 pushing back from O'Hare thirty-five minutes late on a January morning. The schedule says it flies to Denver, turns in fifty minutes, continues to Seattle, turns again, and finishes the night in Anchorage. Nothing else needs to go wrong today. That one late pushback is now aboard the aircraft, and every downstream city will negotiate with it. Some of it dies in the turn: crews hustle, taxiways cooperate, schedules carry padding for exactly this. The rest is handed on.
Three questions, then:
- How much of an inbound delay survives the turn? The transfer curve, and its slope: the contagion coefficient.
- Which airports originate delay, and which just pass it along? Pressure versus conductivity.
- Where does delay travel? The spillover network between airports.
Following the tail
The trick that turns a table of flights into an epidemic study is to follow each aircraft through its day. Sort every airframe's legs by departure time and look one leg back: each flight now knows where its aircraft just landed, when, and how late. A rotation counts as linked when the plane departs from the airport it just landed at, within 24 hours. The inbound arrival delay is the exposure; the outbound departure delay is the symptom.
Q1: How much delay survives the turn?
Bin every linked rotation by how late the aircraft arrived, and ask how late it departed. The resulting curve has three regimes, each a piece of airline operations made visible. Left of zero, early arrivals depart with only the system's baseline lateness; early time cannot be banked. From zero to about half an hour, the curve stays nearly flat. This is the turn buffer doing its job, schedule padding and hustle quietly absorbing small delays. Beyond that, the buffer is overwhelmed and the curve turns linear and steep. The slope of that linear regime is the network's contagion coefficient: the fraction of each extra inbound minute that survives the turn and rides on to the next city.
| in_bin | n | mean_out | med_out |
|---|---|---|---|
| -30 | 154992 | 0.5765071745638485 | -5 |
| -15 | 171677 | 1.9885540870355376 | -4 |
| 0 | 78687 | 7.649840507326496 | -1 |
| 15 | 33665 | 16.08801425813159 | 9 |
| 30 | 17529 | 26.208682754292887 | 21 |
| 45 | 10486 | 34.21762349799733 | 34 |
The verdict: an aircraft that arrives early still departs 1.3 minutes late on average. That is the network's noise floor, lateness that comes from the airport rather than the airframe. But past the half-hour mark, each additional inbound minute costs 0.49 minutes on the next departure. Read that number the hopeful way and it says the turn is a sponge that never quite gives up: even deep in the red, crews and schedule padding claw back about half of every late minute. Read it the other way and it says the other half always gets on the plane.
Q2: Pressure versus conductivity
There are two ways for an airport to look bad in a delay table, and they demand opposite
fixes. An airport can originate delay (weather, congestion, a runway closed for the
season) or it can transmit it, dutifully passing on lateness that arrived aboard
someone else's problem. The table splits the two: pct_late is how often departures run
late, while pct_inbound_late is how often the aircraft showed up already infected. A
high second column with a modest first is a conductor, not a source. Sort by each and
compare who tops the lists.
| origin | n_dep | mean_dep_delay | frac_late | frac_inbound_late |
|---|---|---|---|---|
| ASE | 970 | 35.728865979381446 | 0.35876288659793815 | 0.33964248159831756 |
| JAC | 586 | 28.18941979522184 | 0.2525597269624573 | 0.22300884955752212 |
| HSV | 620 | 28.15967741935484 | 0.2838709677419355 | 0.3054945054945055 |
| BZN | 767 | 25.23728813559322 | 0.24511082138200782 | 0.27030625832223704 |
| DAY | 559 | 24.76386404293381 | 0.22540250447227192 | 0.2418426103646833 |
| EGE | 722 | 21.952908587257618 | 0.29778393351800553 | 0.28370786516853935 |
| ICT | 746 | 21.619302949061662 | 0.19436997319034852 | 0.21666666666666667 |
| COS | 961 | 18.416233090530696 | 0.2060353798126951 | 0.264026402640264 |
| origin | n_dep | mean_dep_delay | pct_late | pct_inbound_late |
|---|---|---|---|---|
| ASE | 970 | 35.7 | 35.9 | 34 |
| JAC | 586 | 28.2 | 25.3 | 22.3 |
| HSV | 620 | 28.2 | 28.4 | 30.5 |
| BZN | 767 | 25.2 | 24.5 | 27 |
| DAY | 559 | 24.8 | 22.5 | 24.2 |
| EGE | 722 | 22 | 29.8 | 28.4 |
| ICT | 746 | 21.6 | 19.4 | 21.7 |
| COS | 961 | 18.4 | 20.6 | 26.4 |
| SJU | 3139 | 18.1 | 25.6 | 26.7 |
| SGF | 631 | 17.6 | 24.1 | 25 |
| ATW | 552 | 17.2 | 19.6 | 23.3 |
| FAR | 600 | 16.8 | 22 | 24.1 |
| VPS | 529 | 16.1 | 19.5 | 20.3 |
| PWM | 537 | 16 | 15.3 | 20.7 |
| PGD | 705 | 15.9 | 25.1 | 28.9 |
| AVL | 591 | 15.9 | 19.8 | 21.3 |
| SDF | 1588 | 15.8 | 16.4 | 18.6 |
| SYR | 882 | 15.7 | 18.5 | 25.7 |
| EYW | 735 | 15.6 | 26.1 | 23.8 |
| ALB | 852 | 15.2 | 20.4 | 21.7 |
| IAH | 8706 | 15.1 | 22.3 | 21.2 |
| DFW | 23469 | 15.1 | 23.4 | 21.7 |
| PBI | 2886 | 15 | 26.9 | 29.1 |
| ATL | 22580 | 14.5 | 22.4 | 19.5 |
| FAT | 912 | 14.5 | 17.4 | 17.8 |
| SBN | 604 | 14.4 | 21.2 | 24.5 |
| XNA | 897 | 14.4 | 18.3 | 20.7 |
| SAV | 1210 | 14.3 | 17 | 20.3 |
| PNS | 798 | 13.9 | 16.5 | 20 |
| SFB | 787 | 13.7 | 26.6 | 28.8 |
| LEX | 582 | 13.5 | 18.6 | 20.1 |
| CID | 688 | 13.4 | 17.6 | 18.3 |
| ROC | 837 | 13.3 | 21 | 24 |
| MIA | 9939 | 13.1 | 22.1 | 21.7 |
| ORF | 1378 | 13.1 | 15.5 | 19.9 |
| DSM | 1025 | 13 | 18 | 19 |
| DTW | 9102 | 13 | 21 | 21.3 |
| TYS | 919 | 12.9 | 19.7 | 25.5 |
| FLL | 7695 | 12.8 | 24.7 | 23 |
| IAD | 3872 | 12.6 | 18.5 | 18.5 |
| DEN | 24350 | 12.6 | 23.4 | 20.2 |
| SRQ | 1470 | 12.3 | 18.6 | 21.4 |
| CHS | 1498 | 12 | 15.9 | 19.3 |
| DCA | 10619 | 11.9 | 20.6 | 21 |
| ORD | 21200 | 11.8 | 19.6 | 19.4 |
| JAX | 2138 | 11.8 | 17 | 20.6 |
| FSD | 539 | 11.8 | 16.7 | 19.6 |
| PHL | 6492 | 11.5 | 17.6 | 19.5 |
| BHM | 1130 | 11.4 | 17 | 21.9 |
| MCI | 3183 | 11.3 | 16.2 | 16.8 |
| GRR | 1312 | 11.2 | 16.5 | 19.1 |
| MSN | 936 | 11.1 | 15.9 | 21.7 |
| BUF | 1355 | 10.6 | 18.7 | 23.9 |
| CVG | 2294 | 10.4 | 16 | 21.8 |
| MCO | 12817 | 10.2 | 21.3 | 19.6 |
| MSP | 8372 | 10.1 | 17.1 | 15.9 |
| CLE | 2858 | 10.1 | 17.3 | 20.6 |
| MEM | 1459 | 10 | 17.6 | 21.5 |
| TPA | 6314 | 10 | 19.6 | 22.1 |
| STL | 4384 | 9.8 | 17.5 | 16.5 |
| HPN | 946 | 9.8 | 17.4 | 20.4 |
| GSO | 692 | 9.8 | 13.4 | 20.5 |
| BWI | 6777 | 9.7 | 19.7 | 14.3 |
| SNA | 3414 | 9.7 | 15.8 | 15.1 |
| MSY | 3782 | 9.7 | 17.6 | 18.4 |
| OMA | 1850 | 9.6 | 16.4 | 19.8 |
| LIT | 900 | 9.6 | 18.4 | 20 |
| MAF | 746 | 9.4 | 15.7 | 19.9 |
| RIC | 1155 | 9.3 | 15.8 | 18.4 |
| SAN | 7049 | 9.3 | 16.8 | 18.5 |
| JFK | 8164 | 9.3 | 17.1 | 17.4 |
| RDU | 4077 | 9.3 | 14.9 | 17.8 |
| MKE | 1882 | 9 | 15.5 | 21 |
| CLT | 16083 | 9 | 17.7 | 16.1 |
| BDL | 1729 | 9 | 15.7 | 20.6 |
| BTV | 517 | 8.8 | 15.3 | 22.3 |
| LAS | 14803 | 8.7 | 18.5 | 18.7 |
| OKC | 1666 | 8.6 | 14.3 | 20.9 |
| PSC | 514 | 8.4 | 14.8 | 15.3 |
| DAL | 5453 | 8.4 | 18.6 | 15.3 |
| AUS | 5984 | 8.2 | 16.3 | 18.4 |
| BNA | 7078 | 8.1 | 17.1 | 17 |
| CMH | 3209 | 7.9 | 15.2 | 18.5 |
| LGA | 10566 | 7.8 | 16.9 | 21.2 |
| EWR | 9908 | 7.8 | 17.2 | 17.7 |
| TUL | 1239 | 7.8 | 14.9 | 21.8 |
| EUG | 558 | 7.5 | 16.5 | 18.8 |
| SAT | 2987 | 7.5 | 16.1 | 20.9 |
| ONT | 1901 | 7.5 | 14.6 | 14.5 |
| AZA | 553 | 7.2 | 19 | 20.2 |
| RSW | 3481 | 7.2 | 17.9 | 22 |
| SBA | 555 | 7.1 | 14.1 | 15.7 |
| IND | 3344 | 7.1 | 14.3 | 18.2 |
| HOU | 3858 | 7 | 16.9 | 15.7 |
| MDW | 5080 | 6.9 | 18.6 | 16.6 |
| HNL | 5059 | 6.9 | 11.2 | 11 |
| SEA | 11719 | 6.9 | 16.9 | 16.9 |
| PIT | 3001 | 6.8 | 14.6 | 17.6 |
| SLC | 9248 | 6.8 | 15 | 14.2 |
| BOS | 10356 | 6.8 | 15.2 | 16.2 |
| RNO | 1659 | 6.7 | 14.9 | 15.8 |
| OGG | 2187 | 6.5 | 10.3 | 7.6 |
| GSP | 1050 | 6.4 | 15 | 20.7 |
| SFO | 10720 | 6.4 | 13.9 | 15.1 |
| PVD | 1074 | 6.3 | 16.7 | 22.6 |
| LAX | 14958 | 5.8 | 13.9 | 15.2 |
| PDX | 4344 | 5.5 | 12.6 | 15.7 |
| PHX | 15770 | 5.5 | 14.3 | 13.9 |
| LIH | 1283 | 5.3 | 10.3 | 8.8 |
| SMF | 4096 | 5.1 | 13 | 13.8 |
| ELP | 1307 | 5.1 | 13.2 | 18.3 |
| ANC | 1161 | 5.1 | 15.2 | 23.7 |
| BUR | 2276 | 4.8 | 14.1 | 14.1 |
| GEG | 1233 | 4.7 | 12.6 | 18 |
| ABQ | 1757 | 4.7 | 12.9 | 16.2 |
| MYR | 684 | 4.2 | 13.3 | 15.8 |
| PSP | 1436 | 3.9 | 11.4 | 12.9 |
| KOA | 1352 | 3.6 | 9.4 | 8.4 |
| OAK | 2834 | 3.4 | 13.3 | 11.4 |
| ITO | 556 | 3.2 | 7.9 | 9.2 |
| BOI | 1827 | 3.1 | 12.9 | 17.6 |
| LGB | 1325 | 3.1 | 10.7 | 11.2 |
| PIE | 647 | 2.9 | 15.9 | 19.2 |
| TUS | 1834 | 2.6 | 11.8 | 16.8 |
| SJC | 3646 | 2.5 | 10.5 | 11.1 |
Q3: The contagion network
Delay doesn't just happen at airports; it travels between them on the tail of a late aircraft. Each arrow below is a spillover corridor: an aircraft landed late and carried that delay to its next destination. The layout finds the epidemic's structure on its own. Hubs pull into the center, and the thickest corridors are the network's super-spreaders. Drag nodes, scroll to zoom; node size is traffic, color is how often that airport's departures inherit a late inbound.
The outbreak calendar
Contagion needs an index case, and in aviation the index case is usually weather. Fold the window into days and the epidemics announce themselves. Tall bars are days the system ran hot, and the color says how widespread the lateness was: a tall dark bar is a localized problem, a tall bright one is a system-wide outbreak, delay reproducing faster than turns can absorb it.
Here is the attack rate. With "late" defined as ≥ 15 min, only 18.2% of all departures in the window ran late. But among aircraft that arrived 15+ minutes behind, the next departure was late 53.3% of the time. Exposure to an infected airframe multiplies the odds of infection several-fold, and that ratio, more than any single storm, is what makes delay a network phenomenon rather than a local one.
Every worst offender, on demand
Aggregates tell the story; the receipts are one click away. Each row below is a single infected rotation: this tail, this day, arrived this late, left this late. Sort, search, and page through all of them, worst first.
| date | carrier | tail | origin | dest | dep_delay | prev_arr_delay | turn_min |
|---|---|---|---|---|---|---|---|
| 2025-01-09 | AA | N9015D | JAC | ORD | 2646 | 1595 | 1083 |
| 2025-01-23 | AA | N815AW | RDU | PHL | 2214 | -12 | 35 |
| 2025-01-15 | AA | N806AW | MFE | DFW | 2127 | 8 | 1419 |
| 2025-01-15 | AA | N805NN | STL | CLT | 2063 | -10 | 46 |
| 2025-01-07 | AA | N447AN | SNA | CLT | 1771 | 4 | 977 |
| 2025-01-05 | OH | N602NN | IAH | PHL | 1630 | 355 | 1305 |
| 2025-01-09 | AA | N9015D | ORD | JAC | 1546 | 27 | 56 |
| 2025-01-16 | AA | N468AN | LIH | PHX | 1447 | -20 | 415 |
| 2025-01-10 | OH | N550NN | PNS | CLT | 1425 | 374 | 496 |
| 2025-01-05 | OO | N797SK | IAH | ASE | 1417 | 130 | 720 |
| 2025-01-05 | B6 | N3162J | DFW | BOS | 1412 | 30 | 1435 |
| 2025-01-08 | OH | N703PS | LAN | DCA | 1392 | 66 | 1356 |
| 2025-01-12 | OH | N572NN | PHL | BNA | 1387 | -20 | 80 |
| 2025-01-22 | OH | N528EG | BDL | DCA | 1374 | -16 | 1438 |
| 2025-01-21 | AA | N335SN | STT | MIA | 1353 | 27 | 1376 |
What the window says
Delay is infectious, and the vector is the airframe itself. Past the turn buffer, each inbound minute puts 0.49 minutes on the next departure; the turn claws back the rest, and what survives rides on. Exposure drives the attack rate from 18.2% to 53.3% at the 15-minute threshold. And the spillover concentrates on a handful of hub corridors, the same super-spreader structure every epidemic finds.
The remedies write themselves in the same vocabulary. You can't vaccinate the weather,
but you can size the sponge (turn buffers where the coefficient bites), quarantine the
corridors (spare airframes at conductor hubs), and test any remedy against this same data
by moving one slider. Widen MONTHS in config to 1:12 and the whole argument
recomputes over seven million flights.
Behind the story: a reactive notebook over a DuckDB file. The heavy stages cache and restore, every chart re-queries when the slider moves, and one config range scales the same document from half a million flights to seven million.