Human Development and Social Indicators

measurement
indicators
statistics
R
visualization
tutorial
BA
MA
How the Human Development Index and its gender-sensitive relatives are constructed, what the choice of geometric aggregation encodes, and why directly measured education, health, and infrastructure indicators are often more informative than any composite.
Author

Claudius Gräbner-Radkowitsch

Published

September 16, 2026

Modified

September 16, 2026

1 Introduction

The indicators on this page share a common motivation: income tells you what an economy produces, not whether people live well. Two responses to that gap are covered here.

The first is to build a composite index that combines several dimensions of wellbeing into one number — the approach of the Human Development Index and its relatives. The second is to measure the things you care about directly: literacy, life expectancy, child mortality, access to electricity. The second approach is less headline-friendly and frequently more informative, and it is underused in student work.

Both rest on choices about what wellbeing consists of, and the aggregation step of the first approach is a particularly clear example of a theoretical commitment encoded as a formula — see The Theory-Ladenness of Observation.

Packages and the caching helper
library(WDI)
library(dplyr)
library(tidyr)
library(readr)
library(readxl)
library(tibble)
library(ggplot2)
library(ggpubr)
library(ggrepel)
library(kableExtra)

wdi_cached <- function(indicators, file, ...) {
  path <- file.path("data", file)
  if (!file.exists(path)) {
    message("Cache miss - downloading from the World Bank API ...")
    write_csv(WDI(indicator = indicators, ...), path)
  }
  out <- read_csv(path, show_col_types = FALSE)
  # Guard against a retired indicator code (which returns silently without its
  # column) and against a cache file written by a different query
  stopifnot(all(names(indicators) %in% names(out)))
  out
}

2 The Human Development Index

2.1 Origins and construction

The HDI was introduced in 1990 as a deliberate challenge to GDP’s dominance in development debate. It drew on Amartya Sen’s capability approach (Sen 2000), which locates development in the expansion of people’s real freedoms to live lives they have reason to value. A second design goal pulled in the opposite direction: the index had to stay simple, transparent, and computable for almost every country. The HDI is the compromise between those two aims, and most criticisms of it are really criticisms of the compromise.

It combines three dimensions:

  1. A long and healthy life — life expectancy at birth
  2. Knowledge — mean years of schooling (adults 25+) and expected years of schooling (children entering school)
  3. A decent standard of living — GNI per capita (PPP), in logs

Each component is rescaled to \([0, 1]\) against fixed goalposts, and the three dimension indices are combined as a geometric mean. Countries are then grouped into Very High (\(\geq 0.800\)), High (0.700–0.799), Medium (0.550–0.699) and Low (\(< 0.550\)) human development.

NoteWhy the geometric mean matters

Until 2010 the HDI used an arithmetic mean, under which a dimension index of 0.9 and one of 0.3 give the same result as two of 0.6 — strong performance on one dimension fully compensates for weakness on another. The geometric mean does not allow this: \(\sqrt[3]{0.9 \times 0.3 \times 0.6} = 0.54\) against \(\sqrt[3]{0.6^3} = 0.60\). Imbalance is penalised.

The switch was a substantive claim, not a technical refinement. It says that health, education, and income are imperfect substitutes — that wealth does not compensate for dying young. The logging of GNI makes a second such claim: that an extra dollar matters less the more dollars you already have. Both commitments are defensible and both are contestable, and neither is visible unless you read the methodology.

Sources: UNDP Human Development Reports; components separately from WHO (life expectancy), UNESCO (education), and the World Bank (GNI).

Captures: a multidimensional view in a single comparable number; a simple and transparent method; wide recognition; series from 1990 onward.

Misses: equal weighting of the three dimensions is a convention with no deeper justification; important dimensions — political freedom, environmental quality, personal security — are excluded, largely because data are unavailable; aggregation hides trade-offs between dimensions; and, being built from national averages, the HDI is silent on inequality within countries. (The UNDP’s inequality-adjusted IHDI addresses the last point and is worth using when available.)

2.2 The Gender Development Index and the Gender Inequality Index

These are two distinct instruments, and they are routinely confused.

The GDI computes the HDI separately for women and men and reports the ratio. A value of 1 means parity. It is a gender gap in human development, expressed in the HDI’s own terms.

The GII is not an HDI ratio. It uses different dimensions, chosen to capture constraints that bear specifically on women:

  • Reproductive health — maternal mortality, adolescent birth rates
  • Empowerment — parliamentary representation, secondary education
  • Economic status — labour force participation

Higher GII values mean greater inequality, which is the opposite direction to the HDI and GDI — a reliable source of misread tables.

Capture: disparities that national aggregates conceal; multiple dimensions of gender inequality; progress tracking over time.

Miss: data availability is a severe constraint, especially in low-income countries; both indices are restricted to a male/female binary, so people outside it are not counted at all; and cross-country standardisation sits uneasily with the culturally specific forms gender inequality takes.

2.3 Application: how much do the components add?

A composite index is only worth its complexity if its components carry independent information. If life expectancy, schooling, and income all measured the same underlying thing, the HDI would be a more laborious way of computing GNI per capita. Let us check.

The data are the UNDP statistical annex, read directly from the Excel file.

Reading the UNDP statistical annex
# The annex has a multi-row header and interleaved section rows, so we take
# only the rectangle holding the data, and drop unnamed spacer columns.
hdi <- read_xlsx("data/hdi-table-2025.xlsx", range = "A6:O199") |>
  select(-starts_with("..."))

components <- c(
  "Life expectancy at birth",
  "Expected years of schooling",
  "Mean years of schooling",
  "Gross national income (GNI) per capita"
)

dim(hdi)
[1] 193   9
Code
bind_rows(
  slice_min(hdi, `Human Development Index (HDI)`, n = 5),
  slice_max(hdi, `Human Development Index (HDI)`, n = 5)
) |>
  ggplot(aes(x = reorder(Country, `Human Development Index (HDI)`),
             y = `Human Development Index (HDI)`)) +
  geom_col(fill = "steelblue", alpha = 0.95) +
  coord_flip() +
  labs(x = NULL, y = "HDI (2023)",
       caption = "Data: UNDP Human Development Report 2025.") +
  theme_minimal()
Figure 1: The five highest- and five lowest-ranked countries by HDI, 2023.

Now the components against each other:

Code
hdi_plot <- hdi |>
  mutate(`GNI pc (log)` = log(`Gross national income (GNI) per capita`)) |>
  rename(`Schooling (expected)` = `Expected years of schooling`,
         `Schooling (mean)`     = `Mean years of schooling`,
         `Life expectancy`      = `Life expectancy at birth`)

pairs <- list(
  c("Life expectancy", "Schooling (expected)"),
  c("Life expectancy", "Schooling (mean)"),
  c("Life expectancy", "GNI pc (log)"),
  c("Schooling (mean)", "Schooling (expected)"),
  c("Schooling (mean)", "GNI pc (log)"),
  c("Schooling (expected)", "GNI pc (log)")
)

plots <- lapply(pairs, function(p) {
  ggplot(hdi_plot, aes(x = .data[[p[1]]], y = .data[[p[2]]])) +
    geom_point(alpha = 0.6, colour = "#1f77b4") +
    geom_smooth(method = "lm", se = FALSE, colour = "#d62728") +
    theme_minimal()
})

ggarrange(plotlist = plots, ncol = 3, nrow = 2,
          labels = paste0(LETTERS[1:6], ")"))
Figure 2: Pairwise relationships between the HDI components. GNI per capita is shown in logs, as it enters the index.
Code
hdi |>
  select(all_of(components)) |>
  cor(use = "pairwise.complete.obs") |>
  as.data.frame() |>
  rownames_to_column("var1") |>
  pivot_longer(-var1, names_to = "var2", values_to = "correlation") |>
  filter(var1 != var2) |>
  mutate(a = pmin(var1, var2), b = pmax(var1, var2)) |>
  distinct(a, b, .keep_all = TRUE) |>
  select(`Component 1` = a, `Component 2` = b, Correlation = correlation) |>
  arrange(desc(Correlation)) |>
  kable(digits = 2) |>
  kable_styling(full_width = FALSE)
Table 1: Pairwise correlations between the HDI components, ordered from strongest to weakest.
Component 1 Component 2 Correlation
Expected years of schooling Mean years of schooling 0.77
Expected years of schooling Life expectancy at birth 0.76
Gross national income (GNI) per capita Life expectancy at birth 0.74
Life expectancy at birth Mean years of schooling 0.74
Gross national income (GNI) per capita Mean years of schooling 0.65
Expected years of schooling Gross national income (GNI) per capita 0.64

The correlations fall between roughly 0.64 and 0.77 — substantial, but a long way from redundancy. The components pick up a shared underlying gradient (countries doing well on one tend to do well on all) while each retains considerable independent variation, which is what justifies combining them.

Two details are worth noting. The most closely related pair is the two schooling measures, which is unsurprising since both count years of education. And the two weakest pairings both involve GNI per capita — income is the component that diverges most from the others. That is precisely the point the HDI was built to make: how much a country produces is a genuinely imperfect guide to how long and how educated its people’s lives are.

Note🎓 MA / PhD

Correlations this high invite a natural question: why not extract the common factor with principal components analysis and use that instead of an equally weighted geometric mean? The statistical answer is that you could, and the first principal component would track the HDI closely.

The reason the UNDP does not is instructive. PCA weights dimensions by how much variance they explain, which makes the weights a property of the sample rather than of the concept — add or remove countries and the definition of human development shifts. Fixed equal weights are arbitrary but stable and transparent: a reader can see what was assumed. This is a general trade-off in index construction between statistical efficiency and interpretability, and composite indices intended for public argument almost always choose the latter.

3 Directly Measured Social Indicators

Composite indices are useful for headlines and rankings. For most research questions, a directly measured indicator is sharper: it says what it means, it requires no aggregation assumptions, and the reader can see immediately what is being claimed. If your question concerns child health, use child mortality — not the HDI.

3.1 Education

Indicator What it measures WDI code
Adult literacy rate Share of 15+ able to read and write SE.ADT.LITR.ZS
Mean years of schooling Average years completed, adults 25+ — (UNDP)
Expected years of schooling Years a child entering school can expect — (UNDP)
Net enrolment ratio Share of school-age children enrolled SE.PRM.NENR
Primary completion rate Share completing primary education SE.PRM.CMPT.ZS

Sources: UNESCO Institute for Statistics; World Bank WDI; DHS surveys.

Miss: all of these measure exposure, not learning. Two countries with identical enrolment can differ enormously in what pupils actually acquire — which is why learning-outcome measures (PISA, TIMSS, the World Bank’s Learning Poverty indicator) have become central. National averages also conceal rural–urban and socioeconomic gaps.

3.2 Health

Indicator What it measures WDI code
Life expectancy at birth Years, at current mortality rates SP.DYN.LE00.IN
Infant mortality rate Deaths under age 1 per 1,000 live births SP.DYN.IMRT.IN
Under-5 mortality rate Deaths under age 5 per 1,000 live births SH.DYN.MORT
Maternal mortality ratio Maternal deaths per 100,000 live births SH.STA.MMRT
Immunisation, measles Share of children aged 12–23 months SH.IMM.MEAS

Sources: WHO Global Health Observatory; World Bank WDI; UN Population Division.

Miss: outcomes are shaped by much besides healthcare — nutrition, sanitation, conflict, environment. Mental health and non-communicable disease are poorly represented. Data quality varies sharply where vital registration is incomplete, which is precisely where mortality is highest.

3.3 Access to basic services

Indicator What it measures WDI code
Access to electricity Share of population EG.ELC.ACCS.ZS
Safely managed drinking water Share of population SH.H2O.SMDW.ZS
Safely managed sanitation Share of population SH.STA.SMSS.ZS
Individuals using the internet Share of population IT.NET.USER.ZS

Sources: WHO/UNICEF Joint Monitoring Programme; World Bank WDI; ITU.

Miss: access is binary and says nothing about reliability, quality, or affordability. A grid connection with six hours of power a day counts as access. Definitions of “improved” vary across contexts, and data collection tends to have an urban bias.

3.4 Application: the gender literacy gap

Direct indicators can be combined into something more informative than either component alone. The gender literacy gap — male minus female adult literacy — is a compact measure of unequal access to basic capabilities.1

Code
literacy <- wdi_cached(
  indicators = c(
    LiteracyMale   = "SE.ADT.LITR.MA.ZS",
    LiteracyFemale = "SE.ADT.LITR.FE.ZS",
    GDPpc          = "NY.GDP.PCAP.PP.CD"
  ),
  file    = "wdi-literacy-gender.csv",
  country = "all",
  start   = 2018,
  end     = 2022,
  extra   = TRUE
)

gender_gap <- literacy |>
  filter(!is.na(region), region != "Aggregates") |>
  summarise(
    across(c(LiteracyMale, LiteracyFemale, GDPpc), \(x) mean(x, na.rm = TRUE)),
    .by = country
  ) |>
  filter(if_all(c(LiteracyMale, LiteracyFemale, GDPpc), \(x) !is.nan(x))) |>
  mutate(gap = LiteracyMale - LiteracyFemale)

nrow(gender_gap)
[1] 105
Code
highlighted <- c("Egypt, Arab Rep.", "Iran, Islamic Rep.", "Lesotho", "Nepal")

model <- lm(gap ~ poly(log(GDPpc), 2), data = gender_gap)

ggplot(gender_gap, aes(x = GDPpc, y = gap)) +
  geom_hline(yintercept = 0, linetype = "dashed", colour = "grey50") +
  geom_smooth(method = "lm", formula = y ~ poly(x, 2), se = TRUE,
              colour = "#2ca02c", linewidth = 1) +
  geom_point(data = \(d) filter(d, !country %in% highlighted),
             alpha = 0.7, colour = "#1f77b4", size = 2) +
  geom_point(data = \(d) filter(d, country %in% highlighted),
             alpha = 0.9, colour = "#d62728", size = 2.5) +
  geom_label_repel(data = \(d) filter(d, country %in% highlighted),
                   aes(label = country), colour = "#d62728", size = 3) +
  scale_x_log10(labels = scales::dollar_format()) +
  labs(
    subtitle = paste0("R² = ", round(summary(model)$r.squared, 3)),
    x = "GDP per capita (PPP, log scale)",
    y = "Literacy gap (male % − female %)"
  ) +
  theme_minimal()
Figure 3: The gender literacy gap against income per capita, averaged over 2018–2022. The fitted curve is a quadratic in log income. Positive values indicate higher male literacy.

The relationship is negative and non-linear: richer countries have smaller gaps, with the gap closing fastest in the middle of the income range. But note what this does not establish. The correlation is equally consistent with “reducing gender inequality makes countries richer” and “richer countries find it easier to close gender gaps”, and it is consistent with both being driven by something omitted from the picture entirely. Distinguishing these requires panel data and an identification strategy — see Reasoning with DAGs and Panel Data and Fixed Effects in R.

The outliers are often more interesting than the trend:

Code
gender_gap |>
  mutate(residual = residuals(model)) |>
  filter(country %in% highlighted) |>
  select(Country = country, `GDP pc` = GDPpc,
         Male = LiteracyMale, Female = LiteracyFemale,
         Gap = gap, Residual = residual) |>
  arrange(desc(Gap)) |>
  kable(digits = c(0, 0, 1, 1, 1, 1)) |>
  kable_styling(full_width = FALSE)
Table 2: Countries whose literacy gap departs most from the fitted relationship.
Country GDP pc Male Female Gap Residual
Nepal 4420 79.8 59.4 20.3 10.0
Egypt, Arab Rep. 14806 86.7 74.5 12.2 8.9
Iran, Islamic Rep. 15560 91.9 83.7 8.2 5.1
Lesotho 2613 83.9 94.7 -10.8 -25.5
  • Nepal has the largest gap in the sample — over 20 percentage points — at a low income level. Adult literacy reflects schooling received decades earlier, so the figure records the exclusion of girls from education in the past rather than current enrolment, which is now close to parity. Adult stock indicators lag policy change by a generation, and this is a general caution when reading them as evidence about present conditions.
  • Egypt and Iran carry large gaps despite relatively high incomes. One hypothesis is that resource exports raised income without requiring a broadly educated workforce — consistent with the resource-curse pattern discussed in Income, Output, and Complexity Indicators.
  • Lesotho has a strongly negative gap: women are markedly more literate than men. Male labour migration to South African mines has historically pulled boys out of school, while policy has emphasised girls’ education.

These cases make the general point. A scatter plot summarises; the residuals tell you where the summary fails, and that is usually where the research question is.

4 Summary

  • The HDI combines health, education, and income into one number. Its geometric aggregation encodes a substantive claim: the dimensions are imperfect substitutes.
  • The GDI is an HDI ratio between women and men; the GII uses different dimensions and runs in the opposite direction. They are not interchangeable.
  • HDI components are strongly correlated but not redundant — the composite adds information over income alone.
  • For most research questions, a directly measured indicator beats a composite: it states what it means and needs no aggregation assumptions.
  • Every direct indicator has a characteristic blind spot — enrolment is not learning, access is not reliability, national averages are not distributions.
  • Outliers from a fitted relationship are frequently the most informative part of an analysis.

References

Sen, Amartya. 2000. Development as Freedom. Alfred Knopf.

Footnotes

  1. As is common, data are published for women and men only; other genders are generally not recorded.↩︎

Citation

BibTeX citation:
@inreference{graebner2026-human-development-and-social-indicators,
  author = {Gräbner-Radkowitsch, Claudius},
  editor = {Gräbner-Radkowitsch, Claudius},
  title = {Human {Development} and {Social} {Indicators}},
  booktitle = {Method and Inquiry},
  date = {2026-09-16},
  url = {https://euf-methodology-hub.netlify.app/resources/human-development-and-social-indicators},
  langid = {en}
}
For attribution, please cite this work as:
Gräbner-Radkowitsch, Claudius. 2026. “Human Development and Social Indicators.” In Method and Inquiry, edited by Claudius Gräbner-Radkowitsch. September 16. https://euf-methodology-hub.netlify.app/resources/human-development-and-social-indicators.