Skip to content

Demographic data model

Every demographic projection is built from the same base reference tables, one coherent choice of which vintage of each to use, plus optional fine-tuning. This page is the methodology reference: the tables, every input and button in the tool, what the outputs mean, and where the data comes from. Country-specific data sets live on each country’s page; a step-by-step walkthrough is in How to model demography.

Table Dimensions Value column Unit Used by
population_base age 0–100 × sex (M/F) count persons demography (start)
fertility age 0–100 asfr_per_1000 births per 1000 women demography
mortality age 0–100 × sex qx annual death probability demography
migration age 0–100 × sex net_migration persons per year demography
recipient_share age 0–100 × sex share fraction 0–1 pensions (later)

The first four are the four demographic variables: the starting population and the three yearly flows — births (fertility), deaths (mortality) and net migration. recipient_share is coverage for the pensions model, not demography.

  • CSV, long format, one row per cell, header row.
  • Ages 0–100 inclusive; age 100 is a closed terminal group.
  • Sex coded M / F; array order male, then female.
  • No gaps or NaN — an incomplete table is rejected at load time.

The schema is identical for every country, so adding a country means supplying these tables — nothing in the engine changes.

Each parameter is a boxed block with a + / − collapse toggle; collapsed, it shows a one-line summary so many scenarios stay compact.

  • Model — projection period. Start from (year, ≥ the population dataset’s base year) and Forecast N years → horizon. A confidence badge grades the horizon: ≤25 yr high, 26–50 moderate, 51–75 low, >75 indicative only.
  • Population. Dropdown of population datasets (the start-of-projection age–sex structure).
  • Fertility / Mortality / Migration. A dataset dropdown, plus a fine-tuning trend (see below). Migration’s dropdown carries preset time paths (e.g. the national statistics office’s projection variants) instead of a single set.
  • Show projections button (each block) — opens a read-only preview (below).
  • Scenario name and Add scenario — runs the projection and adds the result to the chart and the scenario list.

Each flow variable can follow a “trend then plateau” path via its checkbox: the coefficient changes by ±X% per year for N years, then holds constant. Unchecked (or 0) leaves it flat.

  • Mortality is enabled by default and improves 0.5%/yr for 10 years, then plateaus — a conservative stand-in for ongoing mortality improvement.
  • Fertility and migration are stable unless enabled.
  • Choosing a preset migration scenario (already dynamic) auto-clears its trend; you can re-enable it to multiply the preset.

The right panel shows the assumption before running:

  • Population — an age–sex pyramid with total / male / female summary.
  • Fertility / mortality / migration — the age curve of the set. If a trend is active, a faint dotted curve shows where it lands by the horizon, with a one-line “was → became” summary (life expectancy e0 for mortality, TFR for fertility, net total for migration).
  • Distribution / Total-by-year toggle (fertility, mortality, migration): the second view plots the summary over time — migration’s net total per year (revealing how a preset scenario ramps down), fertility’s TFR by year, mortality’s e0 by year.

Population evolves year by year: each cohort ages and survives by qx, births are added at age 0 (asfr × female population, split by the sex ratio at birth), and net migration is applied. By default coefficients are held flat; the trend adjustment scales them per year as above.

Main chart (Inputs/Outputs) — the population forecast: one line per visible scenario (the “fan of forecasts”), with a table of each scenario’s data set, horizon and adjustments.

Outputs tab (controls on the left, chart on the right, ⬇ CSV export):

  • Age-sex structure — the population pyramid, animated across the whole projection (play / slider) or a Compare of two chosen years. Shows ageing and the shifting shape of the population.
  • Cohorts — population of any age band (presets 0–15, 16–64, 65+, 75+, 80+ or a custom range) by sex, one line per visible scenario. The 16–64 vs 65+ split is the core of old-age dependency and pension pressure.

The History tab shows the historical data behind a country (only where it is available):

  • Life expectancy — e0 (or e_x at any chosen age) from the earliest year the country’s HMD series covers, per sex. Tick Add model projections to overlay each scenario’s projected life expectancy (base mortality × its trend) as dotted lines — past and modelled future on one timeline. A year From/To range sets the horizontal scale.
  • Historical mortality — heatmap — qx by age × year (colour, real-qx colourbar), with optional iso-qx isolines and age guides (65/80); sex Female / Male / Both.
  • qx at ages — qx at 65, 80 and a custom age over time (log axis).
  • Deaths — age-sex tree — an animated pyramid of historical deaths.
  • Healthy life expectancy (HALE) — WHO HALE at birth and at 60 with 95% uncertainty bands, per sex. Shipped for Spain and Russia only, for now.
Source Used for
Human Mortality Database mortality qx, life tables, historical deaths
WHO Global Health Observatory Healthy life expectancy (HALE)
INE (Spain) population, fertility, migration + projections
Rosstat (Russia) population, fertility, mortality, migration
US Census Bureau, SSA, NCHS (USA) population, mortality, fertility, migration
ONS, DWP (UK) population, fertility, mortality, migration

Which vintages feed the baseline for each country, and the extra series shipped, are listed on the country pages.