Country Standard Index

Methodology

Everything on this site is reproducible from the scripts in the repository. Data built 2026-10-04.

1. What the index is

The Country Standard Index is a single 0–100 score per country per year that summarises quality of life along 7 components: affordability and income, health and healthcare access, jobs, education, safety, freedom, and environment and infrastructure. It is built only from published statistics (28 indicators), with no survey of opinion run by us and no hand-adjusted values.

It is designed to be decomposed. Every country page shows the index, the contribution of each component in index points, the indicators inside each component, and the raw official series with the year each value was observed.

2. Structure and weights

Index = Σ (wc × componentc) ÷ Σ wc over the components that have data (at least 5 of 7 are required). Component = simple mean of its available indicator scores. Default weights are equal; there is no official basis for weighting one dimension of life above another, so the ranking page lets you set your own.

ComponentWeightIndicators
Affordability & income1GNI per capita, PPP · Price level of household consumption · Consumer price inflation · Gini index
Health & healthcare access1Life expectancy at birth · UHC service coverage index · Physicians per 1,000 people · Out-of-pocket share of health spending · Infant mortality rate
Jobs & employment1Unemployment rate · Youth unemployment rate (15–24) · Employment-to-population ratio (15+) · Vulnerable employment
Education level & access1Adults with a bachelor's degree or higher · Adults who completed upper secondary school · Tertiary enrolment, gross · Learning-adjusted years of school · Mean years of schooling (adults 25+)
Safety & security1Intentional homicides · Political stability & absence of violence/terrorism · Rule of law
Freedom & voice1Voice and accountability · Control of corruption · Freedom of expression & alternative sources of information
Environment & infrastructure1PM2.5 air pollution exposure · Safely managed drinking water · Access to electricity · Individuals using the Internet

3. Scoring each indicator

  1. Transform. Income, infant mortality, homicide and PM2.5 are log-transformed so that differences at the low end count more than the same absolute difference at the high end. Inflation below zero is set to zero; gross tertiary enrolment is capped at 100%.
  2. Goalposts. For each indicator the worst and best goalposts are the 2.5th and 97.5th percentiles of all observed country-years from 2000 to 2024, pooled. They are the same for every year, which is what makes history meaningful: a country's score moves only when its own numbers move. The 2.5/97.5 trim stops one extreme country-year (a hyperinflation, a war) from compressing everyone else into a narrow band.
  3. Score. 100 × (value − worst) ÷ (best − worst), clipped to 0–100, with the direction flipped for indicators where lower is better.

Every indicator page spells these steps out for that series (native scale, transform, goalposts in both raw and transformed units, flip, clipping), and every value on a country page or indicator table can be opened to show the arithmetic applied to that exact number. The build is checked by npm run data:verify, which recomputes all ~124,000 stored scores from the raw values and the published goalposts and confirms each indicator is monotone in the stated direction.

4. Missing data

  • Carry-forward. If a year has no published value, the most recent observation is carried forward for at most maxCarry years (2–10 depending on how often the source publishes; see table). Every carried value is flagged on the country and indicator pages, and each score shows what share of its inputs is carried.
  • Missing indicators. A component is computed from whichever of its indicators are available; the country page shows “n/m indicators”. A country needs at least 5 components to get an index, and at least 70% of all indicators to be ranked. Countries below that threshold still have a score, shown with a warning, and can be included from the ranking page.
  • Nothing is imputed from other countries. We never fill a country's gap with a regional average; the gap stays visible.

5. Indicators and sources

Every series links to two places: downloaded from is the exact URL our pipeline fetched (the closest point to the number on this site), and built from is the chain of organisations behind it. Where a value is assembled from several sources, each entry says what that source contributes; the indicator page also shows the data provider's own source statement verbatim, and every country row has a link to the series filtered to that country.

Type: direct measures the thing itself; proxy stands in for something not measured consistently across countries. Source type: statistical = counts, registers or household surveys compiled by statistical agencies; modelled = statistical estimates (ILO, UN IGME, GBD) that fill gaps between reported years; expert = assessments aggregated from expert and survey sources (WGI, V-Dem).

IndicatorComponentTypeNative scale → scoreGoalposts (0 → 100)CountriesCarriedMax carryDownloaded fromBuilt from
GNI per capita, PPP
NY.GNP.PCAP.PP.KD · constant 2021 international $
Afford.official statistical
positive, unbounded (dollars per person)
ln(value); higher is better
1409 → 85,0261973%3 yWorld Bank API v2, series NY.GNP.PCAP.PP.KD (World Development Indicators)
series page · updated 2026-07-13
Price level of household consumption
PA.NUS.PRVT.PLI · index, United States = 100
Afford.official statistical
positive, unbounded; United States = 100
value (no transform); lower is better → flipped
133 → 24.22082%3 yWorld Bank API v2, series PA.NUS.PRVT.PLI (World Development Indicators)
series page · updated 2026-07-13
Consumer price inflation
FP.CPI.TOTL.ZG · annual %
Afford.official statistical
percent, can be negative (deflation) or very large
max(0, value); lower is better → flipped
30.6 → 0.0001931%2 yWorld Bank API v2, series FP.CPI.TOTL.ZG (World Development Indicators)
series page · updated 2026-07-13
Gini index
SI.POV.GINI · 0 = perfect equality, 100 = perfect inequality
Afford.official statistical
0 (perfect equality) to 100 (one person has everything)
value (no transform); lower is better → flipped
55.0 → 25.316847%8 yWorld Bank API v2, series SI.POV.GINI (World Development Indicators)
series page · updated 2026-07-13
Life expectancy at birth
SP.DYN.LE00.IN · years
Healthofficial statistical
years, positive
value (no transform); higher is better
50.9 → 83.22170%3 yWorld Bank API v2, series SP.DYN.LE00.IN (World Development Indicators)
series page · updated 2026-07-13
UHC service coverage index
SH_UHC_SCI · 0–100
Healthofficial statistical
0 to 100 index points
value (no transform); higher is better
23.0 → 86.01934%5 yWorld Bank API v2, series SH_UHC_SCI (World Development Indicators)
series page · updated 2026-07-13
Physicians per 1,000 people
SH.MED.PHYS.ZS · per 1,000
Healthproxy statistical
doctors per 1,000 people, positive
value (no transform); higher is better
0.043 → 5.3019534%5 yWorld Bank API v2, series SH.MED.PHYS.ZS (World Development Indicators)
series page · updated 2026-07-13
Out-of-pocket share of health spending
SH.XPD.OOPC.CH.ZS · % of current health expenditure
Healthproxy statistical
0 to 100 percent
value (no transform); lower is better → flipped
75.5 → 3.341934%3 yWorld Bank API v2, series SH.XPD.OOPC.CH.ZS (World Development Indicators)
series page · updated 2026-07-13
Infant mortality rate
SP.DYN.IMRT.IN · per 1,000 live births
Healthofficial modelled
deaths per 1,000 live births, positive
ln(value); lower is better → flipped
88.6 → 2.201960%3 yWorld Bank API v2, series SP.DYN.IMRT.IN (World Development Indicators)
series page · updated 2026-07-13
Unemployment rate
SL.UEM.TOTL.ZS · % of labour force (ILO modelled)
Jobsofficial modelled
0 to 100 percent
value (no transform); lower is better → flipped
24.4 → 0.8511870%2 yWorld Bank API v2, series SL.UEM.TOTL.ZS (World Development Indicators)
series page · updated 2026-07-13
Youth unemployment rate (15–24)
SL.UEM.1524.ZS · % of youth labour force (ILO modelled)
Jobsofficial modelled
0 to 100 percent
value (no transform); lower is better → flipped
50.1 → 1.551870%2 yWorld Bank API v2, series SL.UEM.1524.ZS (World Development Indicators)
series page · updated 2026-07-13
Employment-to-population ratio (15+)
SL.EMP.TOTL.SP.ZS · % of population aged 15+ (ILO modelled)
Jobsofficial modelled
0 to 100 percent
value (no transform); higher is better
32.4 → 81.41870%2 yWorld Bank API v2, series SL.EMP.TOTL.SP.ZS (World Development Indicators)
series page · updated 2026-07-13
Vulnerable employment
SL.EMP.VULN.ZS · % of total employment (ILO modelled)
Jobsproxy modelled
0 to 100 percent
value (no transform); lower is better → flipped
86.8 → 3.181870%2 yWorld Bank API v2, series SL.EMP.VULN.ZS (World Development Indicators)
series page · updated 2026-07-13
  • ILO modelled estimates (ILOEST), ILOSTAT (produces the series) — Status-in-employment data from labour force surveys, harmonised and gap-filled by the ILO's estimation model.
  • World Bank staff estimates (produces the series) — Sums own-account and contributing family workers as a share of total employment, with staff estimates where the ILO series is incomplete.
Adults with a bachelor's degree or higher
SE.TER.CUAT.BA.ZS · % of population aged 25+
Educ.official statistical
0 to 100 percent
value (no transform); higher is better
1.07 → 37.418847%8 yWorld Bank API v2, series SE.TER.CUAT.BA.ZS (World Development Indicators)
series page · updated 2026-07-13
Adults who completed upper secondary school
SE.SEC.CUAT.UP.ZS · % of population aged 25+
Educ.official statistical
0 to 100 percent
value (no transform); higher is better
6.43 → 92.019542%8 yWorld Bank API v2, series SE.SEC.CUAT.UP.ZS (World Development Indicators)
series page · updated 2026-07-13
Tertiary enrolment, gross
SE.TER.ENRR · % of the five-year age group after secondary school
Educ.proxy statistical
percent; can exceed 100 (mature and repeat students)
min(100, value); higher is better
1.89 → 97.219518%4 yWorld Bank API v2, series SE.TER.ENRR (World Development Indicators)
series page · updated 2026-07-13
Learning-adjusted years of school
HD.HCI.LAYS · years
Educ.official statistical
years, 0 to about 14
value (no transform); higher is better
2.86 → 12.017271%10 yWorld Bank API v2, series HD.HCI.LAYS (Human Capital Index)
series page · updated 2020-09-21
Mean years of schooling (adults 25+)
UNDP_MYS · years
Educ.official statistical
years, 0 to about 14
value (no transform); higher is better
1.86 → 13.31934%3 yUNDP HDR 2025 composite indices time series (CSV), column mys_YYYY
series page · updated HDR 2025
Intentional homicides
VC.IHR.PSRC.P5 · per 100,000 people
Safetyofficial statistical
homicides per 100,000 people, 0 or positive
ln(1 + value); lower is better → flipped
45.6 → 0.32819520%4 yWorld Bank API v2, series VC.IHR.PSRC.P5 (World Development Indicators)
series page · updated 2026-07-13
Political stability & absence of violence/terrorism
GOV_WGI_PV_EST · estimate, roughly −2.5 to +2.5
Safetyofficial expert
standard-normal units, roughly −2.5 (worst) to +2.5 (best), world mean 0
value (no transform); higher is better
-2.25 → 1.412064%2 yWorld Bank API v2, series GOV_WGI_PV_EST (World Development Indicators)
series page · updated 2026-07-13
Rule of law
GOV_WGI_RL_EST · estimate, roughly −2.5 to +2.5
Safetyofficial expert
standard-normal units, roughly −2.5 (worst) to +2.5 (best), world mean 0
value (no transform); higher is better
-1.71 → 1.842064%2 yWorld Bank API v2, series GOV_WGI_RL_EST (World Development Indicators)
series page · updated 2026-07-13
Voice and accountability
GOV_WGI_VA_EST · estimate, roughly −2.5 to +2.5
Freedomofficial expert
standard-normal units, roughly −2.5 (worst) to +2.5 (best), world mean 0
value (no transform); higher is better
-1.81 → 1.692064%2 yWorld Bank API v2, series GOV_WGI_VA_EST (World Development Indicators)
series page · updated 2026-07-13
Control of corruption
GOV_WGI_CC_EST · estimate, roughly −2.5 to +2.5
Freedomofficial expert
standard-normal units, roughly −2.5 (worst) to +2.5 (best), world mean 0
value (no transform); higher is better
-1.54 → 2.112064%2 yWorld Bank API v2, series GOV_WGI_CC_EST (World Development Indicators)
series page · updated 2026-07-13
Freedom of expression & alternative sources of information
VDEM_FREEXPR · index 0–1
Freedomofficial expert
0 (least free) to 1 (most free)
value (no transform); higher is better
0.032 → 0.9761730%2 yOur World in Data grapher CSV, column freeexpr_vdem__estimate_best
series page · updated V-Dem v15 via OWID
PM2.5 air pollution exposure
EN.ATM.PM25.MC.M3 · µg/m³, population-weighted annual mean
Envir.official modelled
micrograms per cubic metre, positive
ln(value); lower is better → flipped
62.1 → 4.442004%4 yWorld Bank API v2, series EN.ATM.PM25.MC.M3 (World Development Indicators)
series page · updated 2026-07-13
Safely managed drinking water
SH.H2O.SMDW.ZS · % of population
Envir.official statistical
0 to 100 percent
value (no transform); higher is better
7.71 → 1001510%3 yWorld Bank API v2, series SH.H2O.SMDW.ZS (World Development Indicators)
series page · updated 2026-07-13
Access to electricity
EG.ELC.ACCS.ZS · % of population
Envir.official statistical
0 to 100 percent
value (no transform); higher is better
9.30 → 1002150%3 yWorld Bank API v2, series EG.ELC.ACCS.ZS (World Development Indicators)
series page · updated 2026-07-13
Individuals using the Internet
IT.NET.USER.ZS · % of population
Envir.proxy statistical
0 to 100 percent
value (no transform); higher is better
0.222 → 96.32103%3 yWorld Bank API v2, series IT.NET.USER.ZS (World Development Indicators)
series page · updated 2026-07-13

Not scored but shown for cross-checking: Population, total (World Bank WDI (UN World Population Prospects, national statistical offices, Eurostat)); Human Development Index (UNDP) (UNDP Human Development Report 2025).

6. Where official numbers are missing, and proposed proxies

Housing affordability (rent or house price relative to income)
Status: No official series covers all countries. OECD publishes price-to-income and rent-to-income ratios for ~45 economies; Eurostat publishes the housing-cost-overburden rate for the EU. Crowd-sourced sites are not official and are excluded.
Proposed proxy: Use the ICP household-consumption price level (included) as the general cost-of-living signal. Proxy for housing specifically: OECD price-to-income where published; elsewhere, the ratio of GNI per capita to the price level index, with a flag that it is a proxy. Add OECD/Eurostat series as optional indicators that score only where they exist.
Share of adults with a university degree (where UNESCO attainment data are missing or stale)
Status: SE.TER.CUAT.BA.ZS is observed only in census or survey years; many countries have no observation in the last 8 years.
Proposed proxy: Proxy from the education component itself: countries that score high on tertiary gross enrolment and mean years of schooling will, after a lag, have a high share of graduates. Concretely, use tertiary enrolment lagged five years (the typical time from enrolment to degree) as a stand-in, or UNDP mean years of schooling of 13+ as a threshold for degree-level attainment, and label the value as a proxy.
Healthcare waiting times and ease of getting an appointment
Status: Only the OECD publishes waiting-time statistics, for a subset of members and procedures.
Proposed proxy: Physicians per 1,000 and the UHC service coverage index (both included) stand in. Where OECD waiting-time data exist they could be added as an optional indicator with the same fixed-goalpost scoring.
Job vacancies / ease of finding a job
Status: Vacancy rates are published by Eurostat, the US BLS and a few others; there is no global series.
Proposed proxy: The unemployment, youth unemployment and employment-to-population ratios (ILO modelled, all countries) are the available official measures; vulnerable employment stands in for job quality.
Freedom of expression in the ~40 small states not covered by V-Dem
Status: V-Dem covers 173 of the 217 World Bank economies. The WGI Voice & Accountability estimate covers 206.
Proposed proxy: The freedom component falls back to the WGI estimate alone for those countries, and the coverage figure on the country page shows that one indicator is missing.
Crime other than homicide (assault, theft, perceived safety)
Status: Reported-crime statistics are not comparable across countries because of differences in reporting and legal definitions; victimisation surveys exist for a few dozen countries.
Proposed proxy: Intentional homicide (UNODC) is the only comparable crime series and is used; the WGI political stability estimate adds the political-violence dimension. The Gallup World Poll 'feel safe walking alone at night' question would be the natural addition but is not open data.
Values for the most recent year
Status: Most series are published with a one to two year lag; governance and labour series are the quickest.
Proposed proxy: The last observation is carried forward for a limited number of years (set per indicator) and every carried value is flagged, with the share of carried values shown next to each score.

7. Known limitations

  • Equal weights are a choice, not a finding. Use the sliders to test how sensitive the ranking is.
  • Governance and freedom indicators are expert assessments, not counts. They are the standard sources (used by the UN, EU and World Bank) but carry a standard error; the WGI publish it.
  • Small states have thin data and are easily unranked; this is a data limitation, not a judgement about them.
  • Carry-forward keeps recent years comparable but means that a country's latest score can be partly last year's. The carried share is always shown.
  • National averages hide inequality within countries; the Gini index is the only distributional measure included.

8. Reproducing the data

npm run data:fetch   # pull all series from the World Bank API, UNDP and OWID into data/raw/
npm run data:build   # compute scores, components, index, ranks → data/*.json
npm run build        # build the site

The indicator catalogue (ids, directions, transforms, carry limits, sources) is a single file, scripts/indicators.mjs; add a row there and re-run to extend the index.