Skip to content

Anchor bus fare distribution to DfT BUS05ai and NTS0705a - #447

Merged
vahid-ahmadi merged 2 commits into
mainfrom
bus-fare-distribution-anchoring
Jul 22, 2026
Merged

Anchor bus fare distribution to DfT BUS05ai and NTS0705a#447
vahid-ahmadi merged 2 commits into
mainfrom
bus-fare-distribution-anchoring

Conversation

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator

What changed

calibrate_bus_fare_spending now applies three anchors instead of one:

  1. National total (existing): DfT BUS05aii passenger fare receipts, England → UK.
  2. Within-England regional split (new): DfT BUS05ai receipts — London £1,347m / outside London £2,070m of England's £3,417m.
  3. Income distribution (new): England quintile fare shares anchored to population-weighted NTS0705a local-bus trip rates (2024: Q1 47.6 … Q5 13.0 trips/person/year), assuming a common average fare per trip.

Anchors 2 and 3 alternate in a small IPF loop that preserves the national total. Devolved nations are untouched.

Why

  • The LCFS imputation under-captures London bus fares (Oyster/contactless spend is poorly separated in household diaries). With national-only calibration the shortfall is smeared across the other English regions: the built dataset put London at ~£0.44bn vs BUS05ai's £1.35bn, overstating outside-London fare exposure by ~47%. This directly distorts any England-outside-London policy analysis (e.g. the 2027 £2 bus fare cap).
  • The raw LCFS income gradient runs opposite to NTS evidence: richer households record more bus & coach spend, while NTS0705a shows the lowest income quintile makes ~3.7× the local-bus trips of the highest. Anchoring to trip rates flips the distributional impact of fare policies to the NTS-consistent direction.

This is the published-tables version of anchoring the imputation to the NTS; a follow-up could use NTS trip-level microdata (UKDS) to impute person-level trips directly.

Tests

tests/test_bus_fare_distribution.py validates the built Enhanced FRS via the existing baseline fixture (skips when the dataset has not been rebuilt), so the assertions run after a rebuild rather than against unbuilt code:

  • national total within 5% of the BUS05aii target
  • London share of England fares within 3 points of BUS05ai
  • quintile fare totals decline with income per the NTS gradient

🤖 Generated with Claude Code

calibrate_bus_fare_spending now applies three anchors: the existing
BUS05aii national total, the BUS05ai London/outside-London receipts
split within England, and NTS0705a local-bus trip rates by household
income quintile, alternated in a small IPF loop that preserves the
national total.

The LCFS imputation under-captures London fares (Oyster/contactless is
poorly separated in diaries), so national-only calibration overstated
outside-London fare exposure by ~47% (model London GBP 0.44bn vs
BUS05ai GBP 1.35bn). The raw LCFS income gradient also runs opposite to
NTS evidence (richer households record more spend; NTS shows Q1 makes
~3.7x the local-bus trips of Q5).

Post-build tests validate the built Enhanced FRS via the existing
baseline fixture (skipping when the dataset has not been rebuilt), so
they run after a rebuild rather than against unbuilt code.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vahid-ahmadi
vahid-ahmadi merged commit 2b389d1 into main Jul 22, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant