Skip to content
Open
1 change: 1 addition & 0 deletions changelog.d/gb-scope-dwp-targets.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Calibrate DWP and OBR welfare targets only on households in the countries their source covers. DWP's statistics and the "DWP social security" lines of OBR EFO table 4.9 cover Great Britain, as Northern Ireland runs its own social security, but their loss-matrix columns summed over every UK household. These targets now set `countries` to Great Britain. The OBR lines for disability living allowance and PIP, attendance allowance, carer's allowance and winter fuel payment, whose executive competence passed to the Scottish Government, cover England and Wales, as do DWP's PIP claimant counts. Child benefit (HMRC) stays UK-wide.
4 changes: 4 additions & 0 deletions policyengine_uk_data/targets/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ class Unit(str, Enum):
# DWP statistics cover Great Britain: benefits for Northern Ireland residents
# are the Northern Ireland Executive's responsibility.
GREAT_BRITAIN = ("ENGLAND", "SCOTLAND", "WALES")
# For benefits whose executive competence passed to the Scottish Government
# (disability benefits, Carer's Allowance, Winter Fuel Payment), DWP's
# statistics cover England and Wales only.
ENGLAND_AND_WALES = ("ENGLAND", "WALES")


class Target(BaseModel):
Expand Down
34 changes: 33 additions & 1 deletion policyengine_uk_data/targets/sources/dwp.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@
children/family type, two-child limit breakdowns, and Scotland UC
households with child under 1.

DWP's statistics cover Great Britain: benefits for Northern Ireland
residents are the Northern Ireland Executive's, so every target here sets
``countries``. The PIP statistics cover England and Wales, since Adult
Disability Payment replaced PIP in Scotland.

Sources:
- DWP benefit statistics: https://www.gov.uk/government/statistics/dwp-benefit-statistics-february-2026/dwp-benefit-statistics-february-2026
- DWP PIP statistics: https://www.gov.uk/government/statistics/personal-independence-payment-statistics-to-january-2026
Expand All @@ -13,7 +18,12 @@
- DWP two-child limit: https://www.gov.uk/government/statistics/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025
"""

from policyengine_uk_data.targets.schema import Target, Unit
from policyengine_uk_data.targets.schema import (
ENGLAND_AND_WALES,
GREAT_BRITAIN,
Target,
Unit,
)


_DWP_BENEFIT_STATS_FEB_2026 = (
Expand All @@ -40,6 +50,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2025: 1_283_000},
countries=ENGLAND_AND_WALES,
is_count=True,
reference_url=_PIP_STATS_JAN_2026,
)
Expand All @@ -51,6 +62,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2025: 1_608_000},
countries=ENGLAND_AND_WALES,
is_count=True,
reference_url=_PIP_STATS_JAN_2026,
)
Expand All @@ -69,6 +81,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2025: 999_000},
countries=GREAT_BRITAIN,
is_count=True,
reference_url=_DWP_BENEFIT_STATS_FEB_2026,
),
Expand All @@ -78,6 +91,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2025: 620_000},
countries=GREAT_BRITAIN,
is_count=True,
reference_url=_DWP_BENEFIT_STATS_FEB_2026,
),
Expand All @@ -87,6 +101,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2025: 180_000},
countries=GREAT_BRITAIN,
is_count=True,
reference_url=_DWP_BENEFIT_STATS_FEB_2026,
),
Expand All @@ -96,6 +111,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2025: 71_000},
countries=GREAT_BRITAIN,
is_count=True,
reference_url=_DWP_BENEFIT_STATS_FEB_2026,
),
Expand All @@ -110,6 +126,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2025: 110_637},
countries=GREAT_BRITAIN,
is_count=True,
reference_url="https://www.gov.uk/government/statistics/benefit-cap-number-of-households-capped-to-november-2025/benefit-cap-number-of-households-capped-to-november-2025",
)
Expand All @@ -123,6 +140,7 @@ def get_targets() -> list[Target]:
# Uses the November 2025 point-in-time cap distribution midpoint by band,
# annualized to align with the model's yearly benefit_cap_reduction output.
values={2025: 320_866_000},
countries=GREAT_BRITAIN,
reference_url="https://www.gov.uk/government/statistics/benefit-cap-number-of-households-capped-to-november-2025/benefit-cap-number-of-households-capped-to-november-2025",
)
)
Expand All @@ -135,6 +153,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2025: 14_000},
countries=("SCOTLAND",),
is_count=True,
reference_url="https://stat-xplore.dwp.gov.uk/",
)
Expand All @@ -156,6 +175,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2025: count},
countries=GREAT_BRITAIN,
is_count=True,
reference_url="https://stat-xplore.dwp.gov.uk/",
)
Expand All @@ -177,6 +197,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2025: count_k * 1e3},
countries=GREAT_BRITAIN,
is_count=True,
reference_url="https://stat-xplore.dwp.gov.uk/",
)
Expand All @@ -194,6 +215,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2025: 6_700_000, 2026: 7_200_000},
countries=GREAT_BRITAIN,
is_count=True,
reference_url="https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026",
)
Expand All @@ -207,6 +229,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2026: 453_600},
countries=GREAT_BRITAIN,
is_count=True,
reference_url="https://www.gov.uk/government/statistics/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025",
)
Expand All @@ -218,6 +241,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2026: 1_613_980},
countries=GREAT_BRITAIN,
is_count=True,
reference_url="https://www.gov.uk/government/statistics/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025",
)
Expand All @@ -229,6 +253,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2026: 580_400},
countries=GREAT_BRITAIN,
is_count=True,
reference_url="https://www.gov.uk/government/statistics/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025",
)
Expand All @@ -249,6 +274,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2026: households},
countries=GREAT_BRITAIN,
is_count=True,
reference_url="https://www.gov.uk/government/statistics/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025",
)
Expand All @@ -260,6 +286,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2026: children},
countries=GREAT_BRITAIN,
is_count=True,
reference_url="https://www.gov.uk/government/statistics/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025",
)
Expand All @@ -274,6 +301,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2026: 62_260},
countries=GREAT_BRITAIN,
is_count=True,
reference_url="https://www.gov.uk/government/statistics/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025",
),
Expand All @@ -283,6 +311,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2026: 225_320},
countries=GREAT_BRITAIN,
is_count=True,
reference_url="https://www.gov.uk/government/statistics/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025",
),
Expand All @@ -292,6 +321,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2026: 124_560},
countries=GREAT_BRITAIN,
is_count=True,
reference_url="https://www.gov.uk/government/statistics/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025",
),
Expand All @@ -301,6 +331,7 @@ def get_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2026: 462_660},
countries=GREAT_BRITAIN,
is_count=True,
reference_url="https://www.gov.uk/government/statistics/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025",
),
Expand Down Expand Up @@ -330,6 +361,7 @@ def _uc_payment_distribution_targets() -> list[Target]:
source="dwp",
unit=Unit.COUNT,
values={2025: float(row.household_count)},
countries=GREAT_BRITAIN,
is_count=True,
breakdown_variable="universal_credit",
lower_bound=float(lower),
Expand Down
23 changes: 22 additions & 1 deletion policyengine_uk_data/targets/sources/obr.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,12 @@
import openpyxl
import requests

from policyengine_uk_data.targets.schema import GREAT_BRITAIN, Target, Unit
from policyengine_uk_data.targets.schema import (
ENGLAND_AND_WALES,
GREAT_BRITAIN,
Target,
Unit,
)
from policyengine_uk_data.targets.sources._common import (
HEADERS,
load_config,
Expand Down Expand Up @@ -556,6 +561,21 @@ def read_49(row_num: int) -> dict[int, float]:
"jsa",
),
}
# Table 4.9 lists DWP's spending under "DWP social security", the figures
# DWP's benefit expenditure and caseload tables (Spring Forecast 2026)
# give as "DWP Social Security (GB)": Northern Ireland's benefits are the
# table's "NI social security" rows. Those tables leave out Scotland for
# benefits whose executive competence passed to the Scottish Government
# (Notes K, L and N): Carer's Allowance from 2018-19, disability benefits
# from 2020-21 and Winter Fuel Payment from 2024-25. Child benefit is
# HMRC's and covers the UK. Every other line here is DWP's GB figure.
countries = {
"pip": ENGLAND_AND_WALES,
"attendance_allowance": ENGLAND_AND_WALES,
"carers_allowance": ENGLAND_AND_WALES,
"winter_fuel_allowance": ENGLAND_AND_WALES,
"child_benefit": None,
}

targets = []
# Welfare cap section (rows 6-36)
Expand All @@ -571,6 +591,7 @@ def read_49(row_num: int) -> dict[int, float]:
source="obr",
unit=Unit.GBP,
values=values,
countries=countries.get(name, GREAT_BRITAIN),
reference_url=ref,
forecast_vintage=vintage,
)
Expand Down
Loading
Loading