Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@ node_modules/
.next/
.vercel/
.vercel
data/*.h5
.venv/
18 changes: 7 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# £2 bus fare cap analysis

Source-backed analysis of the £2 bus fare cap announced by the UK government on 22 July 2026, with PolicyEngine UK distributional context from the Enhanced FRS.
Source-backed analysis of the £2 bus fare cap announced by the UK government on 22 July 2026, with PolicyEngine UK distributional context from the certified Microcosm UK dataset.

**Live dashboard:** https://bus-fare-cap.vercel.app

Expand All @@ -15,11 +15,11 @@ The dashboard estimates the fiscal cost independently. The government figure is

## Analysis

PolicyEngine projects household bus and coach fare spending to 2027 by English region outside London, family type, age and income quintile. Household fares are imputed from the LCFS and calibrated to DfT Annual Bus Statistics in `policyengine-uk-data`, then allocated to household members by `person_bus_fare_spending` in `policyengine-uk`, which applies an NTS-derived age profile. This repo contains only the reform modelling and the dashboard.
PolicyEngine projects bus fare spending in 2027 by English region outside London, family type, age and income quintile. The simulation runs through `policyengine.py`'s `managed_microsimulation`, which pins `policyengine-uk` and the certified Microcosm UK dataset together; the results JSON records the policyengine and policyengine-uk versions and the dataset name, build revision and SHA-256. In `policyengine-uk`, `person_bus_fare_spending` prices each person's imputed local-bus trips at DfT passenger receipts per fare-paying boarding, and concessionary pass holders pay nothing. Current law in `policyengine-uk` already applies the £2 cap from January 2027, so the pipeline holds the cap at £3 to measure the base. This repo contains only the reform modelling and the dashboard.

Distributional calibration of household fares — DfT's London/outside-London receipts split (BUS05ai) and NTS0705a local-bus trip rates by income quintile — happens upstream in the policyengine-uk-data build (PolicyEngine/policyengine-uk-data#447); this repo consumes the calibrated dataset. The pipeline applies a 12.5% all-ticket reduction (range 10–15%), derived from Table 6 of DfT's £2-cap evaluation re-weighted for the £3-cap counterfactual and cap-era ticket mix.
The pipeline applies a 12.5% all-ticket reduction (range 10–15%), derived from Table 6 of DfT's £2-cap evaluation re-weighted for the £3-cap counterfactual and cap-era ticket mix.

Results are reported against two counterfactuals. The **fare reduction** (~£273m) assumes a £3 cap runs throughout 2027. **Versus funding expiry** (~£409m) reflects current law, under which £3 funding ends on 31 March 2027, so nine of twelve months would otherwise be uncapped; it adds an 8.3% cap-existence wedge derived from the £151m one-year cost of the £3 cap. The second figure is the like-for-like comparison with the government's £400m of England funding. Household savings sum to the modelled fiscal cost; average household effects divide each group's savings by all households in that group. The official funding figures are not inputs.
Results are reported against two counterfactuals. The **fare reduction** (~£354m) assumes a £3 cap runs throughout 2027. **Versus funding expiry** (~£531m) reflects current law, under which £3 funding ends on 31 March 2027, so nine of twelve months would otherwise be uncapped; it adds an 8.3% cap-existence wedge derived from the £151m one-year cost of the £3 cap. The second figure is the like-for-like comparison with the government's £400m of England funding. Household savings sum to the modelled fiscal cost; average household effects divide each group's savings by all households in that group. The official funding figures are not inputs.

## Layout

Expand All @@ -31,23 +31,19 @@ Results are reported against two counterfactuals. The **fare reduction** (~£273

```bash
pip install -e ".[dev]"
export HF_TOKEN=hf_xxx
export HUGGING_FACE_TOKEN=hf_xxx # or a saved `huggingface-cli login`
python -m bus_fare_cap --year 2027
```

The default private Enhanced FRS dataset is pinned for reproducibility. The optional Populace path remains available:

```bash
BUS_FARE_CAP_POPULACE=1 python -m bus_fare_cap --year 2027
```
The Microcosm UK dataset is private. `uv.lock` pins `policyengine` 6.10.2, which certifies `policyengine-uk` 2.132.6 and the `microcosm_uk_2024_25` build it uses.

## Caveats

- Operator participation and detailed reimbursement rules for 2027 are not yet represented.
- London and the devolved nations are excluded from the policy-geography analysis.
- The 12.5% reduction is a derived re-weighting of 2023 £2-cap evidence, not an observed £3→£2 outcome.
- Existing local £2-or-lower fares and individual ticket prices cannot be identified.
- People in fare-spending households are an exposure proxy, not observed passengers or confirmed beneficiaries.
- People with modelled fare spending are an exposure proxy, not observed passengers or confirmed beneficiaries. Microcosm UK gives every person at least a few imputed local-bus trips a year, so everyone not eligible for a concessionary pass has some modelled fare spending.
- The estimate is static and excludes induced demand. Route/operator fare data would enable a stronger ticket-level model.

## Dashboard
Expand Down
14 changes: 9 additions & 5 deletions dashboard/app/page.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,11 @@ function Dashboard() {
<TabLink onSelect={() => handleTabChange("baseline")}>Baseline</TabLink> tab shows the
projected baseline bus fares by age and region. The{" "}
<TabLink onSelect={() => handleTabChange("methodology")}>Methodology</TabLink> tab explains
how every result is computed, with a source for every assumption. The estimate applies
DfT&apos;s observed 6.3% all-ticket reduction to simulated household fare spending.
how every result is computed, with a source for every assumption. The estimate applies a
12.5% all-ticket reduction (range 10–15%) for the £3-to-£2 step to simulated household
fare spending. We derive it from DfT&apos;s evaluation of the previous £2 cap, which
observed a 6.3% all-ticket fall on a pre-cap ticket mix; against current law, the headline
also counts the cap&apos;s continued existence once the £3 cap&apos;s funding expires.
</p>

<div className="mb-8 mt-8 flex w-fit flex-wrap border-b-2 border-slate-200">
Expand Down Expand Up @@ -120,10 +123,11 @@ function Dashboard() {
PolicyEngine/bus-fare-cap
</a>
. Built with{" "}
<a href="https://pypi.org/project/policyengine-uk/" target="_blank" rel="noreferrer">
policyengine-uk
<a href="https://pypi.org/project/policyengine/" target="_blank" rel="noreferrer">
policyengine
</a>{" "}
v{data?.policyengine_uk_version || "2.89.2"}.
v{data?.policyengine_version} (policyengine-uk v{data?.policyengine_uk_version}) on{" "}
{data?.dataset_name}.
</p>
</footer>
</main>
Expand Down
Loading
Loading