Skip to content

Add LA-level household land value calibration targets #370

@vahid-ahmadi

Description

@vahid-ahmadi

Summary

Add ons/household_land_value/{la_code} calibration targets for all 360 UK local authorities, generalising the regional method introduced in #315.

Motivation

targets/sources/mhclg_regional_land.py distributes the ONS National Balance Sheet household land total across the 11 GB regions using dwellings × avg_house_price. There is no equivalent at local-authority level, so:

  • The LA reweighting loss (datasets/local_areas/local_authorities/loss.py) currently has no property- or land-value anchor — its targets cover age, income, UC, tenure and rent only. As a result, per-LA avg household land values from LA-reweighted microdata are compressed at the top end and noisy at the bottom (e.g. Kensington and Chelsea averaging ~£240k, East Renfrewshire below £50k, neither of which matches the UK HPI ordering).
  • Downstream analyses that want an LA map of household land value — e.g. a UK LVT blog post using this dataset, or constituency-level reform impacts — currently have to bolt on ad-hoc methods.

Proposed approach

Direct generalisation of the regional formula:

share_la  = (households_la × avg_house_price_la) / Σ_LAs
target_la = share_la × HOUSEHOLD_LAND_VALUES[year]

Data sources (all already used elsewhere in the repo):

  • HM Land Registry UK HPI — average house price by LA, monthly. Same source used for regional_land_values.csv, just at LA granularity.
  • LA household counts — derived from the existing storage/local_authority_weights.h5 matrix (sum of each LA's weight row), which keeps household-count semantics consistent with the rest of the LA calibration.
  • National anchorHOUSEHOLD_LAND_VALUES in targets/sources/_land.py (ONS National Balance Sheet 2025).

The new targets/sources/la_land.py module exports 360 Target objects with geographic_level=GeographicLevel.LOCAL_AUTHORITY, following the mhclg_regional_land.py layout.

Acceptance criteria

  • 360 targets named ons/household_land_value/{code} registered via get_all_targets().
  • LA targets sum to the national HOUSEHOLD_LAND_VALUES[year] for each year in the series (within 1e-6).
  • Avg household land value in Kensington and Chelsea > 3× Blackpool.
  • London boroughs dominate the top quintile of LAs by avg household land value.
  • CSV covers all four UK countries (E/W/S/NI) and every code in local_authorities_2021.csv.
  • Existing test_regional_land_value_targets.py stays green (filter by GeographicLevel.REGION where it previously filtered by name prefix only).

Out of scope for this issue

Wiring these targets into datasets/local_areas/local_authorities/loss.py so the LA reweighting actually calibrates against them. That should be a follow-up PR once this one lands.

References

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions