Main findings from my quantitative research: how three “beyond-GDP” measures of human wellbeing (Human Development Index, Social Progress Index, SDG Index) relate to the Ecological Footprint and Biocapacity across the five Nordic countries, 2000–2022. Built on the National Footprint & Biocapacity Accounts I compiled. The wider mapping of each Nordic country’s national wellbeing framework against the OECD Wellbeing dimensions and the UN SDG framework is in the full write-up (linked at the bottom). An interactive summary. By Marina Ermina, MA Environment & Natural Resources, University of Iceland.
This is a quantitative comparison. For the five Nordic countries across 2000–2022, it sets three “beyond-GDP” measures of human wellbeing — the Human Development Index (HDI), the Social Progress Index (SPI) and the SDG Index (SDGI) — against the Ecological Footprint and Biocapacity from the National Footprint & Biocapacity Accounts I compiled. It asks, in turn: how each country scores on wellbeing and on its ecological account; whether the footprint decouples from rising wellbeing over time; how strongly each index correlates with the footprint (Pearson r); and — looking past the flattering headline scores — which individual SPI and SDGI indicators quietly underperform.
Each value shown against the world benchmark. The idea: judge progress not by one number (like GDP) but by a set of wellbeing indicators alongside the ecological account.
Selected wellbeing indicator (switch HDI / SPI / SDGI above) vs Ecological Footprint per capita. The dashed line is Earth’s biocapacity per person — a “one-planet” fair share; every Nordic country sits far to its right.
Footprint (consumption) vs Biocapacity (regeneration), per capita — selected period. Red = ecological deficit.
Trend across the three periods for : the selected wellbeing indicator rising while Ecological Footprint per capita falls. Each series has its own axis (left / right) so they read independently.
Pearson correlation with Ecological Footprint, by country.
Overall SPI (~90) and SDG Index (~78–86) make all five Nordics look uniformly excellent. Disaggregating to the indicator level tells a different story: a consistent set of weak spots — housing affordability, health, diet, and the environmental / global-responsibility goals — that a single number hides entirely.
These are excerpts from my actual analysis SQL — multi-CTE statistical queries joining three MySQL databases: the National Footprint & Biocapacity Accounts I produced, plus the HDI and SDG-Index tables. The full analysis lives in CLUSTER.sql and All_research_ideas.sql.
-- MEAN
SELECT
ef.country,
CASE
WHEN ef.year BETWEEN 2000 AND 2007 THEN '2000-2007'
WHEN ef.year BETWEEN 2008 AND 2015 THEN '2008-2015'
WHEN ef.year BETWEEN 2016 AND 2022 THEN '2016-2022'
END AS period,
ROUND(AVG(ef.total),2) AS mean_efc,
ROUND(AVG(hdi.hdi),2) AS mean_hdi,
-- ROUND(sp.SPI_score,2) as mean_spi,
ROUND(AVG(sd.SDG_index_score),2) AS mean_sdgi,
ROUND(AVG(ef.Crop_Land),2) AS mean_crop_land,
ROUND(AVG(ef.Grazing_Land), 2) AS mean_grazing_land,
ROUND(AVG(ef.Forest_Land), 2) AS mean_forest_land,
ROUND(AVG(ef.Fishing_Ground), 2) AS mean_fishing_ground,
ROUND(AVG(ef.Built_up_Land), 2) AS mean_built_up_land,
ROUND(AVG(ef.Carbon), 2) AS mean_carbon
FROM
`footprint_24_ult6_final2`.`Summary_Results` ef
JOIN `6599_marina`.`HDI_data_all_ult` hdi
ON ef.country = hdi.country AND ef.year = hdi.year
JOIN 6599_marina.SDG_index sd
ON ef.country = sd.country AND ef.year = sd.year
-- JOIN `6599_marina`.`SPI` sp
-- ON ef.country = sp.country and ef.year = sp.year
WHERE
ef.record = 'EFConsPerCap'
AND ef.year between 2000 and 2022
GROUP BY
ef.country, period
ORDER BY
ef.country, period;-- INCLUDE. Pearson Correlation for 2000-2022 with interpretation
WITH base_data AS (
SELECT
ef.country,
ef.year,
ef.total AS efc,
hdi.hdi AS hdi
FROM `footprint_24_ult6_final2`.`Summary_Results` AS ef
JOIN `6599_marina`.`HDI_data_all_ult` hdi
ON ef.country = hdi.country AND ef.year = hdi.year
WHERE ef.record = "EFConsPerCap"
AND ef.year BETWEEN 2000 AND 2022
),
means AS (
SELECT
country,
AVG(efc) AS mean_efc,
AVG(hdi) AS mean_hdi
FROM base_data
GROUP BY country
),
stats AS (
SELECT
b.country,
COUNT(*) AS n,
AVG((b.efc - m.mean_efc) * (b.hdi - m.mean_hdi)) AS covariance,
SQRT(AVG(POWER(b.efc - m.mean_efc, 2))) AS stddev_efc,
SQRT(AVG(POWER(b.hdi - m.mean_hdi, 2))) AS stddev_hdi
FROM base_data b
JOIN means m ON b.country = m.country
GROUP BY b.country
)
SELECT
country,
ROUND(covariance, 6) AS covariance,
ROUND(stddev_efc, 6) AS stddev_efc,
ROUND(stddev_hdi, 6) AS stddev_hdi,
ROUND(covariance / (stddev_efc * stddev_hdi), 4) AS pearson_r,
CASE
WHEN ABS(ROUND(covariance / (stddev_efc * stddev_hdi), 4)) < 0.2 THEN 'Neutral'
WHEN ROUND(covariance / (stddev_efc * stddev_hdi), 4) < -0.8 THEN 'Very strong negative correlation'
WHEN ROUND(covariance / (stddev_efc * stddev_hdi), 4) < -0.6 THEN 'Strong negative correlation'
WHEN ROUND(covariance / (stddev_efc * stddev_hdi), 4) < -0.4 THEN 'Moderate negative correlation'
WHEN ROUND(covariance / (stddev_efc * stddev_hdi), 4) < 0 THEN 'Mild negative correlation'
WHEN ROUND(covariance / (stddev_efc * stddev_hdi), 4) < 0.4 THEN 'Mild positive correlation'
WHEN ROUND(covariance / (stddev_efc * stddev_hdi), 4) < 0.6 THEN 'Moderate positive correlation'
WHEN ROUND(covariance / (stddev_efc * stddev_hdi), 4) < 0.8 THEN 'Strong positive correlation'
ELSE 'Very positive correlation'
END AS interpretation
FROM stats
ORDER BY country;-- INCLUDE. separte cluster_labels based on Country_biocapacit for period 2000 - 2022
SELECT
n.country,
n.year,
n.hdi,
n.sdg_index_score,
n.ecological_footprint,
n.country_biocapacity,
n.ef_to_biocap_country,
CONCAT(
CASE
WHEN n.hdi < 0.550 THEN 'Low HDI'
WHEN n.hdi >= 0.550 AND n.hdi < 0.700 THEN 'Medium HDI'
WHEN n.hdi >= 0.700 AND n.hdi < 0.800 THEN 'High HDI'
WHEN n.hdi >= 0.800 THEN 'Very High HDI'
END
) AS cluster_label_HDI,
CONCAT(
CASE
WHEN n.sdg_index_score >= 70 THEN 'High perfomance SDG'
WHEN n.sdg_index_score >= 50 AND n.sdg_index_score < 70 THEN 'Medium performance SDG'
ELSE 'Low performance SDG'
END
) AS cluster_label_SDGI,
CONCAT(
CASE
WHEN n.ef_to_biocap_country > 1 THEN 'Unsustainable'
ELSE 'Sustainable'
END
) AS cluster_label_EFC
FROM (
SELECT
h.country,
h.year,
h.hdi,
s.sdg_index_score,
ef.Total AS ecological_footprint,
country_bio.Total AS country_biocapacity,
(ef.Total / country_bio.Total) AS ef_to_biocap_country
FROM `6599_marina`.`HDI_data_all_ult` h
JOIN `6599_marina`.`SDG_index` s
ON h.country = s.country AND h.year = s.year
JOIN `footprint_24_ult6_final2`.`Summary_Results` ef
ON h.country = ef.country AND h.year = ef.year
JOIN `footprint_24_ult6_final2`.`Summary_Results` country_bio
ON ef.year = country_bio.year AND ef.country=country_bio.country
WHERE
ef.record = 'EFConsPerCap'
AND h.year BETWEEN 2000 and 2022
AND s.year BETWEEN 2000 and 2022
AND ef.year BETWEEN 2000 and 2022
AND country_bio.record = 'BiocapPerCap'
AND country_bio.year BETWEEN 2000 and 2022
) n
ORDER BY n.country, n.year;-- EFC component correlation against HDI
WITH base_data AS (
SELECT
ef.country,
ef.year,
ef.Carbon,
ef.Crop_Land,
ef.Grazing_Land,
ef.Forest_Land,
ef.Fishing_Ground,
ef.Built_up_Land,
ef.Total,
hdi.hdi,
hdi.hdicode
FROM `footprint_24_ult6_final2`.`Summary_Results` ef
JOIN `6599_marina`.`HDI_data_all_ult` hdi
ON ef.country = hdi.country AND ef.year = hdi.year
WHERE ef.record = 'EFConsPerCap'
AND ef.year BETWEEN 2000 AND 2022
),
means AS (
SELECT
country,
AVG(Carbon) AS mean_carbon,
AVG(Crop_Land) AS mean_crop,
AVG(Grazing_Land) AS mean_grazing,
AVG(Forest_Land) AS mean_forest,
AVG(Fishing_Ground) AS mean_fishing,
AVG(Built_up_Land) AS mean_built,
AVG(Total) AS mean_total,
AVG(hdi) AS mean_hdi
FROM base_data
GROUP BY country
),
stats AS (
SELECT
b.country,
b.hdi,
b.hdicode,
-- Carbon
AVG((b.Carbon - m.mean_carbon) * (b.hdi - m.mean_hdi)) AS cov_carbon,
SQRT(AVG(POWER(b.Carbon - m.mean_carbon, 2))) AS std_carbon,
-- Crop
AVG((b.Crop_Land - m.mean_crop) * (b.hdi - m.mean_hdi)) AS cov_crop,
SQRT(AVG(POWER(b.Crop_Land - m.mean_crop, 2))) AS std_crop,
-- Grazing
AVG((b.Grazing_Land - m.mean_grazing) * (b.hdi - m.mean_hdi)) AS cov_grazing,
SQRT(AVG(POWER(b.Grazing_Land - m.mean_grazing, 2))) AS std_grazing,
-- Forest
AVG((b.Forest_Land - m.mean_forest) * (b.hdi - m.mean_hdi)) AS cov_forest,
SQRT(AVG(POWER(b.Forest_Land - m.mean_forest, 2))) AS std_forest,
-- Fishing
AVG((b.Fishing_Ground - m.mean_fishing) * (b.hdi - m.mean_hdi)) AS cov_fishing,
SQRT(AVG(POWER(b.Fishing_Ground - m.mean_fishing, 2))) AS std_fishing,
-- Built-up
AVG((b.Built_up_Land - m.mean_built) * (b.hdi - m.mean_hdi)) AS cov_built,
SQRT(AVG(POWER(b.Built_up_Land - m.mean_built, 2))) AS std_built,
-- Total
AVG((b.Total - m.mean_total) * (b.hdi - m.mean_hdi)) AS cov_total,
SQRT(AVG(POWER(b.Total - m.mean_total, 2))) AS std_total,
-- HDI std
SQRT(AVG(POWER(b.hdi - m.mean_hdi, 2))) AS std_hdi
FROM base_data b
JOIN means m ON b.country = m.country
GROUP BY b.country
)
SELECT
country,
ROUND(cov_carbon / (std_carbon * std_hdi), 4) AS r_carbon,
ROUND(cov_crop / (std_crop * std_hdi), 4) AS r_crop,
ROUND(cov_grazing / (std_grazing * std_hdi), 4) AS r_grazing,
ROUND(cov_forest / (std_forest * std_hdi), 4) AS r_forest,
ROUND(cov_fishing / (std_fishing * std_hdi), 4) AS r_fishing,
ROUND(cov_built / (std_built * std_hdi), 4) AS r_built,
ROUND(cov_total / (std_total * std_hdi), 4) AS r_total,
hdi,
hdicode
FROM stats
ORDER BY country;These are my original queries, verbatim from All_research ideas_INTERNSHIP.sql and CLUSTER.sql — the Pearson r values, cluster labels and period means used across this dashboard all come from them.
Averages flatter the Nordics. A GDP-style single score would call them a success. Setting three wellbeing indices (HDI, Social Progress, SDG Index) against the Ecological Footprint shows the fuller picture: world-leading wellbeing, a real decoupling signal (footprint falling as wellbeing rises), but persistent ecological overshoot — extreme in Iceland, whose footprint runs many times its biocapacity.
But drilling deeper flips the picture. The detailed indicators expose clear failures in specific places — land and water (SDG 14 & 15), consumption and the impacts embodied in imports (SDG 12 — from e-waste to imported deforestation), and housing. A single headline score hides every one of them — which is exactly why the disaggregated, beyond-GDP view of the data matters.
Further reading: the full analysis — including the mapping of each Nordic country’s national wellbeing framework onto the OECD Wellbeing dimensions and the UN SDGs — is in the thesis: Exploring Indicators of Human Wellbeing and Ecological Sustainability in the Nordic Countries →
nordic_analysis.py), then visualised here as an interactive summary. Full indicator tables are in the thesis appendix.