Skip to content

ProjectConnected World

The world,
connected.

I joined 11 open datasets on 170 countries, from every international football match since 1872 to Big Mac prices and Nobel prizes, then tested which statistics really move together once you account for money.

01The big picture

Most things that look connected are really about money.

What moves together across countries

hover a statistic
Data table

Links that survive once income is held fixed

Partial rank correlation controlling for GDP per person; Benjamini-Hochberg q < 0.01; at least 60 countries. Association, not cause.

02Ten connected stories

Who beats the odds, and by how much.

Each story joins at least two sources. Where a model is involved, “expected” means what a country’s population and income predict across all countries, so the outliers stand out.

01 · Wealth × happiness

Gapminder (World Happiness Report life evaluations, GDP per person at PPP)

Life evaluation vs income

each dot a country · log scale
Data table

02 · Sport × size × wealth

Olympedia results, Summer Games 2000 to 2020 · Gapminder population and income

Medals won vs medals expected

Summer Games 2000 to 2020
Data table

03 · Football × population

International results since 1872 (Elo computed in this pipeline) · Gapminder population

Football strength vs population

Elo rating · log scale
Data table

04 · Mobility × wealth

Passport Index data, February 2026 · Gapminder income

Destinations open without a prior visa vs income

log scale
Data table

05 · Prices × income

The Economist, Big Mac index (price and GDP per person, same survey)

Big Macs bought by a day of GDP per person

Data table

06 · Science × migration

    Nobel Prize data, 1901 to 2016 (Physics, Chemistry, Medicine), present-day borders

    Laureates born in a country vs working there when they won

    science prizes
    Data table

    07 · Music × geography × language

      Eurovision finals 1975 to 2022 · borders and languages from mledoze/countries

      Average points given per final

      pairs with 10+ finals together
      Data table

      08 · Growth × emissions

      Our World in Data, CO2 dataset (GDP, territorial and consumption-based CO2)

      Change in GDP vs change in CO2, 2005 to

      countries of 1M+
      Data table

      09 · Energy × time

      Our World in Data, energy dataset (Ember, Energy Institute)

      Solar and wind share of electricity

      2015 → latest · fastest risers
      Data table

      10 · Health spending × lifespan

      World Bank health expenditure per person (PPP) · Gapminder life expectancy

      Life expectancy vs health spending per person

      log scale
      Data table

      03How I built it

      Eleven sources,
      one tested model.

      The hard part is not the charts. It is making 11 sources agree on what a country is, rebuilding ratings from raw results, and proving every number before it ships. The patterns are the ones I use on a production financial data platform.

      Rules that keep it honest.

      • Hold income fixed.Rich countries score higher on almost everything, so every link is also tested as a partial correlation controlling for GDP per person. Only links that survive are drawn.
      • Correct for testing 351 pairs.Benjamini-Hochberg false-discovery control (q < 0.01), at least 60 countries per link, countries under 500,000 people left out.
      • One country, one key.A 605-entry crosswalk maps football teams, Olympic codes, Eurovision names and historical birthplaces (“Prussia (Poland)”) to ISO codes. A test fails the build if coverage drops.
      • Count like the scorekeepers.A relay gold is one medal, not four; Youth Olympic events are excluded; only FIFA-recognised teams are rated, so regional sides never enter the Elo pool.
      • Latest, but not stale.Each country uses its latest value from 2015 onwards; projections in the source series are ignored.

      Every source, mapped.

      Rows per source after staging, and the share that maps onto the country dimension (the rest is excluded on purpose: historical states and non-FIFA teams).

      dbt Python model excerpt, the partial correlation:

      # mart_connection_pairs.py (excerpt)
      ra, rb, ri = (d[c].rank() for c in (a, b, income))
      ea, eb = residual(ra, ri), residual(rb, ri)
      partial = np.corrcoef(ea, eb)[0, 1]

      04Sources and licences

      Every number has an origin.

      Independent portfolio project built only from public open data. Figures are my own aggregations and models, provided as-is; they are not official statistics, and where they differ the publishers’ figures prevail. Correlations show association, not cause. Country names follow the source data. Not affiliated with or endorsed by any data publisher. Spotted an error? Email hanialnaber@gmail.com and I will correct it.