Where Americans and Puerto Ricans fly, where airlines put seats, and what drives both, from 33 years of US flight data.
Demand = trips per resident by airport market. Supply = departing seats.
Hover for values. Shaded years are shocks.
Rank correlation between every pair of variables. Dot = not significant at 5%.
Log scale. The band is within a factor of 2. Magenta = Puerto Rico pairs.
Three tests. Higher is better in each; the dashed line in the third panel is a coin flip.
Version 1 listed the biggest city pairs with no nonstop. A network planner and an econometrician checked it independently.
Domestic scheduled flights, stacked by airport. Marked: Hurricane María (Sep 2017) and COVID (Apr 2020).
O&D passengers per day in 2024, both directions. Label = nonstop service from SJU in Mar–May 2026 (BTS T-100), plus announced changes.
How PR compares with peers, what the gap is made of, and what would lift it for Puerto Ricans.
What PR domestic tickets cost, and what travelers keep because PR fares sit below comparable mainland routes.
| Scenario | Fare discount | Saved per year | Saved per one-way ticket |
|---|---|---|---|
| Low | 10% | $292 M | $26 |
| Base | 15% | $464 M | $41 |
| High | 17% | $538 M | $47 |
I wanted a map that shows where people want to fly and where airlines actually put seats, so I could spot places that are underserved, starting with Puerto Rico, where tickets often feel expensive. Before drawing anything I needed to know what drives demand in the first place, so I wrote down seven hypotheses and one gate in advance: if the model could not beat a naive forecast on data it had never seen, the "gap" layer would not go on the map.
Everything here is public. The US Department of Transportation publishes a 10% sample of domestic airline tickets every quarter since 1993 (DB1B) and a monthly count of every scheduled flight segment (T-100). Both are US government works in the public domain. The BTS website blocked my build machine, so I pulled the same tables from two public GitHub mirrors and checked them against BTS press releases: 2019 scheduled domestic passengers came out at 818.7 million against 811.4 million reported, and December 2024 at 72.4 million against 72.1 million. County population and income come from the Census ACS 2015–19, Puerto Rico's municipio income from ACS 2013–17, and the country comparison from Airbus and the Maddison Project through Our World in Data.
An airport has no residents, so I built catchments. Each county's people are shared among nearby airport markets in proportion to seats divided by distance squared, a Huff model whose settings I fixed before looking at results. Airports less than 60 km apart, like Orlando and Sanford, count as one market. A trip belongs to the place where its ticket starts, which matters later: one-way tickets make leisure places look busier than they are.
For places, I regressed trips per resident on income, population, distance to a large hub, fares and visitor share, with robust errors and checks for collinearity. For routes, I fit a Poisson gravity model on 15,576 city pairs and tested it three ways. On pairs it never saw it explains 93% of the variation, every year from 2015 to 2024. As a next-year forecast it loses to "same as last year". And its "gap" did not predict where airlines launched routes in 2025 (AUC 0.48, a coin flip). That last test failed the gate.
When the first version was done, six independent reviewers, each playing a different specialist (a network planner and an econometrician among them), tried to break it without seeing my reasoning. I changed the page because of what they found.
I worked with Claude, Anthropic's AI model, as my analyst. It found the data mirrors, wrote the Python pipeline (pandas, statsmodels, scipy) and the D3 charts, ran the tests and ran the review as separate agents. I chose the questions, the scope (the US plus Puerto Rico), what counted as a pass or a fail, and what this page should say, and I checked the results against what I know from flying in and out of San Juan.
San Juan's international traffic (12.5% of SJU passengers in 2025) is not in BTS data, and two of my guesses about why Puerto Rico flies less, an older population and less business travel, are still untested. Those come next.
| Source | Used for | Data date | License | Commercial use |
|---|---|---|---|---|
| BTS DB1B (via AirportData mirror) | Trips, fares, routes | 1993–2025 | US government, public domain; mirror license not stated | Yes |
| BTS T-100 (via ADAN8888 and AirportData) | Seats, load factor, service | 1990–May 2026 | US government, public domain; mirror license not stated | Yes |
| Census ACS 2015–19 and 2013–17 (via OpenIntro usdata, JHU CSSE lookup) | County and municipio population and income | 2013–2019 | Census: public domain; JHU lookup: CC BY 4.0 | Yes, with attribution |
| Census county boundaries (Plotly GeoJSON) | Maps | 2010 | Public domain | Yes |
| OurAirports | Airport locations | 2026 | Public domain | Yes |
| Our World in Data: Airbus trips per capita; Maddison Project GDP | Country S-curve | 2018–2019 | OWID CC BY 4.0; Maddison CC BY 4.0; Airbus figure third-party | Check Airbus terms |
| BLS CPI-U; World Bank GDP (via datasets on GitHub) | Inflation, real income | 1990–Aug 2026 | Public domain / ODC-PDDL | Yes |
| Wikipedia: PR municipio income, Stateside Puerto Ricans | PR income, diaspora by metro | ACS 2013–20 | CC BY-SA 4.0 | Yes, with attribution and share-alike |
| PR Planning Board; CUNY Centro | Gross Product; population change | FY2019; 2010–2020 | Public figures, cited | Yes, cited |
| Metro PR, Deep Arrival | Route pauses and returns | Nov 2025–Aug 2026 | News, cited as facts | Facts only |
| D3 7.9.0, topojson-client 3.1.0, d3-composite-projections 1.4.0; Google Fonts | Charts, maps, type | — | ISC, ISC, BSD-3-Clause; SIL OFL | Yes |