🇬🇧

UK JOBS DATA QUALITY

Grading the ONS labour-market statistics and building alternatives from job adverts

bzhmacro bzhmacro.com
UK labour market

The official numbers are noisier than they look — so read them alongside the adverts.

The Labour Force Survey now gets fewer than a quarter of its households to respond. The HMRC payroll flash gets revised by more than the monthly change it reports. And the two disagree on direction almost half the time. This page measures each problem, then builds a demand-side cross-check from Indeed, Textkernel, ONS vacancies, the claimant count, the BoE Decision Maker Panel and public-sector job boards.

Every chart: ⧉ copy the image to paste · png 2× raster for slides · svg vector, editable · csv the numbers actually plotted · ⧉ data the same numbers as TSV for a spreadsheet. Exports carry title, units and source.

01

Verdict: which series to trust, for what

Graded on four tests: sample health, revisions, coherence with the other sources, and sensitivity to seasonal adjustment. Red: don't use it alone for month-to-month calls. Amber: usable with a band around it. Green: fit for purpose.

SeriesMain problemKey measureGradeUse it for
02

Labour Force Survey: a sample that stopped answering

The response rate counts the households that complete the interview out of all those approached. Wave 1 is the first interview; later waves interview the same households again.

Response rate, %

ONS LFS performance and quality monitoring reports. "Incl. partial" counts households with some proxy or partial responses.

Achieved sample and implied standard error

Individuals interviewed per quarter (left, thousands). Standard error relative to 2019 Q4 assumes simple random sampling, √(n2019Q4/n).

Employment level (16+, 000s) as published in each vintage

The same months, as published in successive Labour Market releases. Re-weightings shift the whole history at once.

Revisions to the monthly change, first print to latest

SeriesMean |rev| 2016–19Mean |rev| 2022–26Mean rev 2022–26Jun 2024: first → rev

Revision = latest estimate of the 3-month-on-3-month change minus the first published one. Levels in thousands; rates in percentage points.

The rates, employment (LF24) and unemployment (MGSX), hold up much better than the level. Re-weighting moves the numerator and denominator together. Use the rates, not the level (MGRZ), and treat changes under ~0.2pp as noise.
03

HMRC PAYE RTI: the flash is a first guess

The RTI flash for month t comes out about three weeks after the month ends. It is filled in for late filers and revised for a year or more.

Monthly change in payrolled employees, 000s: flash vs latest

Bars: revision (latest − flash). Lines: the flash and the current vintage.

Revision record by window

WindownMean rev, 2ndMean rev, latestMAE, latestRevised upSD of change

000s. "SD of change" is the standard deviation of the latest monthly changes in that window: the signal the flash is trying to measure.

Largest flash misses since 2023

MonthFlashLatestMiss
04

Revisions by sector: where the noise comes from

Every published release of the industry tables, back to the first that carried them: . To keep seasonality from looking like dispersion, each source is measured on its natural change. RTI: monthly change, seasonally adjusted. Workforce Jobs: quarterly change, seasonally adjusted. LFS EMP13: annual change, because the table is not seasonally adjusted. A revision is the latest estimate minus the first published one.

Revision record by sector

SectorMean revMean |rev|SD of change|rev| ÷ |change|Share of total revisionRevised up

Cross-sector dispersion: first print vs latest

Interquartile range of the sector changes in each period, 000s. If the first-print line sits above the latest, early sector numbers are more scattered than the truth they converge to.

Job changes by sector: this month against history

SectorLatestFlashRevisedRevisionHistory medianHistory middle halfLatest vs history

Thousands of jobs. "Latest vs history" flags a latest value beyond the whiskers, i.e. unusual for that sector over the chosen history.

05

Coherence: three measures, three stories

Employees, index 2019 = 100

LFS employees (household survey), PAYE RTI payrolled employees (tax records), Workforce Jobs employee jobs (employer survey, quarterly).

Annual growth, %: LFS employees vs RTI

12-month log growth.

06

Seasonal adjustment: not leaky, but the method matters

Two separate questions. Does the published seasonally adjusted series still contain seasonality? (Tested with the QS and F-tests on 2022–26.) And how much would the answer change under a different, equally defensible method: X-13 re-run on today's data, STL, or 2019's factors held fixed?

LFS unemployment rate, %: four adjustments

The same unadjusted data run through each method.

RTI monthly change, 000s: four adjustments

Spread between methods vs the size of a typical monthly move.

RTI seasonal factors: 2026 minus 2019, implied 000s

Change in each calendar month's factor, converted to employees at today's level. Only January to August: 2026 factors exist only for months already published.

Residual seasonality, p-values (p < 0.05 = seasonality left in)

Series2010–192022–26
07

Job adverts: a demand gauge with no response problem

Advert counts measure demand for labour, not employment, and they lead it. Textkernel is the advert feed the ONS itself publishes. It had a known scraping break from Nov 2023 to Jul 2024, which X-13 treats as outliers.

Labour demand, Feb 2020 = 100

Indeed postings (monthly mean of daily index), Textkernel adverts (X-13 SA), ONS Vacancy Survey (AP2Y).

Indeed postings: the UK vs peers, Feb 2020 = 100

Indeed Hiring Lab aggregate postings index, seasonally adjusted.

Vacancies per claimant (labour-market tightness)

ONS vacancies and Textkernel adverts (thousands) per claimant (thousands, SA). The claimant count is affected by Universal Credit rules, so read it for direction, not level.

08

Composite: what demand says employment should be doing

One dynamic factor is estimated over the annual growth of Indeed, Textkernel, ONS vacancies, the inverted claimant count and DMP realised employment growth. The factor is then mapped onto RTI annual growth, with 2020-03 to 2021-09 left out of the fit. The shaded band is ±1.96 × the regression standard error.

Annual employee growth, %: demand-implied vs official

Can adverts nowcast the next RTI flash?

09

Aggregate payrolls: the pay bill against prices

The employee pay bill is employees × hours × hourly pay. It is built two independent ways: from the survey side (LFS employees × LFS average weekly hours × AWE pay per hour) and from HMRC's own PAYE aggregate pay. Both are deflated by CPI (or CPIH), fetched through bzhmacro econdata. Annual growth is split exactly, in logs: jobs + hours + hourly pay − CPI = real growth.

Pay bill and prices, 2019 = 100

What drives the real pay bill: annual growth, percentage points

Survey-side pay bill. Bars: contributions to annual log growth from jobs (LFS employees), average weekly hours, hourly pay (AWE ÷ hours) and prices (minus CPI). They add up exactly to the line, the real pay bill's growth. Dotted: the same real growth on HMRC aggregate pay. From 2022: the furlough years' swings in jobs and hours (±20pp) would swamp the scale.

Cohorts: whose pay bill is growing in real terms?

CohortShare of pay bill£bn / monthJobsMean payNominal pay billCPIReal pay bill

Log changes, %. HMRC PAYE RTI aggregate pay and payrolled employees by cohort; mean pay = pay bill ÷ employees. RTI has no hours by cohort, so jobs and mean pay are the split here. Under-18s are a tiny, volatile group.

Real pay bill by cohort, 2019 = 100

Deflated by CPI. Pick up to four cohorts.

10

Public sector: hiring by the state, from adverts and payrolls

Payrolled employees, Dec 2019 = 100

RTI by industry: public administration, education, health & social work vs everything else. These industries include private providers, so read this as an upper bound on the public sector.

Indeed postings: public-facing vs other sectors, Feb 2020 = 100

Equal-weight geometric mean of Indeed's sector indices. Indeed doesn't publish weights.

Textkernel adverts by public-sector occupation, 12m avg, Dec 2019 = 100

Groups of SOC 4-digit codes. A month is left blank where the ONS suppressed any component cell.

Live advert stocks from public job boards

Board · facetLive adverts

Latest daily snapshot.

The collector began on and runs daily. It needs about 12 months of history before it can be seasonally adjusted. Teaching Vacancies has an official open API. NHS Jobs has no API, so only the headline "jobs found" count is recorded, in line with its terms. Civil Service Jobs puts every request behind a human check, which we don't get around, so it isn't collected.
11

Method & sources

Pipeline. pipeline/fetch.py downloads every raw file and records it in raw/manifest.json with its URL, hash and timestamp. vintages.py rebuilds the LFS first-print history from archived Labour Market releases. diagnostics.py runs the quality tests (sections 02–05). alternatives.py builds the demand indicators, factor model and nowcast (06–08). public_sector.py appends a daily snapshot of the job boards. Seasonal adjustment uses X-13ARIMA-SEATS (US Census binary) through statsmodels, plus STL.

Not yet included. Adzuna (needs an API key; the next source to add, for vacancies by region and salary). REC/KPMG Report on Jobs and the PMI employment indices are paywalled. DWP Find a Job returned 503 to automated requests.