Delay Contagion: How Late Flights Infect the Network

Abstract

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:

  1. How much of an inbound delay survives the turn? The transfer curve, and its slope: the contagion coefficient.
  2. Which airports originate delay, and which just pass it along? Pressure versus conductivity.
  3. 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_binnmean_outmed_out
-301549920.5765071745638485-5
-151716771.9885540870355376-4
0786877.649840507326496-1
153366516.088014258131599
301752926.20868275429288721
451048634.2176234979973334

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.

originn_depmean_dep_delayfrac_latefrac_inbound_late
ASE97035.7288659793814460.358762886597938150.33964248159831756
JAC58628.189419795221840.25255972696245730.22300884955752212
HSV62028.159677419354840.28387096774193550.3054945054945055
BZN76725.237288135593220.245110821382007820.27030625832223704
DAY55924.763864042933810.225402504472271920.2418426103646833
EGE72221.9529085872576180.297783933518005530.28370786516853935
ICT74621.6193029490616620.194369973190348520.21666666666666667
COS96118.4162330905306960.20603537981269510.264026402640264
originn_depmean_dep_delaypct_latepct_inbound_late
ASE97035.735.934
JAC58628.225.322.3
HSV62028.228.430.5
BZN76725.224.527
DAY55924.822.524.2
EGE7222229.828.4
ICT74621.619.421.7
COS96118.420.626.4
SJU313918.125.626.7
SGF63117.624.125
ATW55217.219.623.3
FAR60016.82224.1
VPS52916.119.520.3
PWM5371615.320.7
PGD70515.925.128.9
AVL59115.919.821.3
SDF158815.816.418.6
SYR88215.718.525.7
EYW73515.626.123.8
ALB85215.220.421.7
IAH870615.122.321.2
DFW2346915.123.421.7
PBI28861526.929.1
ATL2258014.522.419.5
FAT91214.517.417.8
SBN60414.421.224.5
XNA89714.418.320.7
SAV121014.31720.3
PNS79813.916.520
SFB78713.726.628.8
LEX58213.518.620.1
CID68813.417.618.3
ROC83713.32124
MIA993913.122.121.7
ORF137813.115.519.9
DSM1025131819
DTW9102132121.3
TYS91912.919.725.5
FLL769512.824.723
IAD387212.618.518.5
DEN2435012.623.420.2
SRQ147012.318.621.4
CHS14981215.919.3
DCA1061911.920.621
ORD2120011.819.619.4
JAX213811.81720.6
FSD53911.816.719.6
PHL649211.517.619.5
BHM113011.41721.9
MCI318311.316.216.8
GRR131211.216.519.1
MSN93611.115.921.7
BUF135510.618.723.9
CVG229410.41621.8
MCO1281710.221.319.6
MSP837210.117.115.9
CLE285810.117.320.6
MEM14591017.621.5
TPA63141019.622.1
STL43849.817.516.5
HPN9469.817.420.4
GSO6929.813.420.5
BWI67779.719.714.3
SNA34149.715.815.1
MSY37829.717.618.4
OMA18509.616.419.8
LIT9009.618.420
MAF7469.415.719.9
RIC11559.315.818.4
SAN70499.316.818.5
JFK81649.317.117.4
RDU40779.314.917.8
MKE1882915.521
CLT16083917.716.1
BDL1729915.720.6
BTV5178.815.322.3
LAS148038.718.518.7
OKC16668.614.320.9
PSC5148.414.815.3
DAL54538.418.615.3
AUS59848.216.318.4
BNA70788.117.117
CMH32097.915.218.5
LGA105667.816.921.2
EWR99087.817.217.7
TUL12397.814.921.8
EUG5587.516.518.8
SAT29877.516.120.9
ONT19017.514.614.5
AZA5537.21920.2
RSW34817.217.922
SBA5557.114.115.7
IND33447.114.318.2
HOU3858716.915.7
MDW50806.918.616.6
HNL50596.911.211
SEA117196.916.916.9
PIT30016.814.617.6
SLC92486.81514.2
BOS103566.815.216.2
RNO16596.714.915.8
OGG21876.510.37.6
GSP10506.41520.7
SFO107206.413.915.1
PVD10746.316.722.6
LAX149585.813.915.2
PDX43445.512.615.7
PHX157705.514.313.9
LIH12835.310.38.8
SMF40965.11313.8
ELP13075.113.218.3
ANC11615.115.223.7
BUR22764.814.114.1
GEG12334.712.618
ABQ17574.712.916.2
MYR6844.213.315.8
PSP14363.911.412.9
KOA13523.69.48.4
OAK28343.413.311.4
ITO5563.27.99.2
BOI18273.112.917.6
LGB13253.110.711.2
PIE6472.915.919.2
TUS18342.611.816.8
SJC36462.510.511.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.

output

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.

datecarriertailorigindestdep_delayprev_arr_delayturn_min
2025-01-09AAN9015DJACORD264615951083
2025-01-23AAN815AWRDUPHL2214-1235
2025-01-15AAN806AWMFEDFW212781419
2025-01-15AAN805NNSTLCLT2063-1046
2025-01-07AAN447ANSNACLT17714977
2025-01-05OHN602NNIAHPHL16303551305
2025-01-09AAN9015DORDJAC15462756
2025-01-16AAN468ANLIHPHX1447-20415
2025-01-10OHN550NNPNSCLT1425374496
2025-01-05OON797SKIAHASE1417130720
2025-01-05B6N3162JDFWBOS1412301435
2025-01-08OHN703PSLANDCA1392661356
2025-01-12OHN572NNPHLBNA1387-2080
2025-01-22OHN528EGBDLDCA1374-161438
2025-01-21AAN335SNSTTMIA1353271376
Showing 15 of 89162 rows

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.