Gapminder data set analysis

Python
26Summer
data: gapminder.csv
Author

Vava, Namitha, Renna

Published

February 5, 2026

Introduction

This presentation explores how GDP per capita relates to life expectancy across countries, revealing patterns that connect economic strength with public well‑being. By comparing these two indicators, we can see which nations convert economic growth into longer, healthier lives, and which ones lag behind. These insights help us understand global development gaps and identify opportunities for more inclusive progress.

First, let’s have a brief look into the data

Show code
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import country_converter as coco
import plotly.express as px
import scipy.stats as stats

#read the data as df
df = pd.read_csv('../../../../data/gapminder.csv')
df.head()
country year pop continent lifeExp gdpPercap
0 Afghanistan 1952 8425333.0 Asia 28.801 779.445314
1 Afghanistan 1957 9240934.0 Asia 30.332 820.853030
2 Afghanistan 1962 10267083.0 Asia 31.997 853.100710
3 Afghanistan 1967 11537966.0 Asia 34.020 836.197138
4 Afghanistan 1972 13079460.0 Asia 36.088 739.981106

World population

Now, let’s have a look into the world population in 1952-2007

Show code
# Covert Code ISO Alpha-3
cc = coco.CountryConverter()
df['iso_alpha'] = cc.convert(names=df['country'], to='iso3')

# Make world map with Plotly
px.choropleth(
    data_frame=df,
    locations='iso_alpha',
    color='pop',
    hover_name='country',
    animation_frame='year',
    color_continuous_scale='Magma',
    title='Population'
)

Gross domestic product (GDP) per capita

Next, let’s have a look into the GDP

Show code
df1 = (
    df.groupby(['year', 'continent'])['gdpPercap']
      .mean()
      .reset_index()
)

df1['rank'] = (
    df1
    .groupby('year')['gdpPercap']
    .rank(ascending=False)
    .astype(int)
)

fig = px.bar(
    df1,
    x="gdpPercap",
    y="continent",
    color="gdpPercap",
    animation_frame="year",
    animation_group="continent",
    orientation="h",
    title="GDP per Capita Ranking by Continents",
    labels={"gdpPercap": "GDP per Capita"},
)

fig.show()
Show code
# GDP Map
#convert country name
cc = coco.CountryConverter()
df['iso_alpha'] = cc.convert(names=df['country'], to='iso3')

# Make GDP Map
fig = px.choropleth(
    data_frame=df,
    locations='iso_alpha',
    color='gdpPercap',
    hover_name='country',
    animation_frame='year',
    color_continuous_scale='Magma',
    title='GDP per Capita'
)
fig.show()

Life expectancy

We’ll inspect people’s life expectancy

Show code
plt.figure(figsize=(10, 6))
sns.lineplot(
    data=df,
    x='year',
    y='lifeExp',
    hue='continent',
    marker='s'
)
plt.savefig("python_tb-VavaGapminder.png")

Life expectancy per continent
Show code
#LifeExp map
# Covert Code ISO Alpha-3
cc = coco.CountryConverter()
df['iso_alpha'] = cc.convert(names=df['country'], to='iso3')
# Make world map with Plotly
fig = px.choropleth(
    data_frame=df,
    locations='iso_alpha',
    color='lifeExp',
    hover_name='country',
    animation_frame='year',
    color_continuous_scale='Magma',
    title='Life Expectancy'
)
fig.show()

Correlation between GDP and life expectancy

Overall correlation per continent

Show code
# Overall scatter plot
sns.relplot(data = df, x = "gdpPercap", y = "lifeExp", hue = "continent")

Show code
# Statistics

africa = df[df["continent"]=="Africa"].gdpPercap
americas = df[df["continent"]=="Americas"].gdpPercap
asia = df[df["continent"]=="Asia"].gdpPercap
europe = df[df["continent"]=="Europe"].gdpPercap
oceania = df[df["continent"]=="Oceania"].gdpPercap

print("For overall GDP per Capita:\n",stats.f_oneway(africa, americas, asia, europe, oceania))

a = df[df["continent"]=="Africa"].lifeExp
am = df[df["continent"]=="Americas"].lifeExp
asi = df[df["continent"]=="Asia"].lifeExp
eu = df[df["continent"]=="Europe"].lifeExp
o = df[df["continent"]=="Oceania"].lifeExp

print("For overall Life expectancy:\n",stats.f_oneway(a,am,asi,eu,o))
For overall GDP per Capita:
 F_onewayResult(statistic=np.float64(126.57025005465235), pvalue=np.float64(1.1721255922609946e-94))
For overall Life expectancy:
 F_onewayResult(statistic=np.float64(408.7284326738497), pvalue=np.float64(8.323262721675936e-247))
Show code
# GDP VS Life expectancy
df2 = df[df["continent"].isin(["Africa", "Oceania"])]
plt.figure(figsize=(8, 4))

sns.scatterplot(
    data=df2,
    x="gdpPercap",
    y="lifeExp",
    hue="continent",
    palette={"Africa": "blue", "Oceania": "red"}
)

sns.regplot(
    data=df2[df2["continent"] == "Africa"],
    x="gdpPercap",
    y="lifeExp",
)

sns.regplot(
    data=df2[df2["continent"] == "Oceania"],
    x="gdpPercap",
    y="lifeExp",
    color="red",
)

plt.xscale("log")
plt.xlabel("GDP per Capita (log scale)")
plt.ylabel("Life Expectancy (years)")
plt.title("GDP vs Life Expectancy: Africa vs Oceania")
Text(0.5, 1.0, 'GDP vs Life Expectancy: Africa vs Oceania')

Show code
# Statistics for Africa and Oceania
df3 = df.loc[
    df["continent"].isin(["Africa", "Oceania"]),
    ["continent", "gdpPercap", "lifeExp"],
]
df3["gdpPercap"].cov(df3["lifeExp"])
df3["gdpPercap"].corr(df3["lifeExp"])
lm=stats.linregress(x=df3["gdpPercap"],y=df3["lifeExp"])
print("pvalue:\n",lm.pvalue)
print("\n")

df4=df3.groupby("continent")
print(df4.describe())
print("\n")

print("Correlation:\n",df4.corr())
print("\n")
print("Kendall method:\n",df4.corr(method='kendall'))
print("\n")
print("Spearman method:\n",df4.corr(method='spearman'))
print("\n")
print("Variance:\n",df4.var())
print("\n")
print("Skew:\n",df4.skew())
pvalue:
 1.6346700940711586e-63


          gdpPercap                                                         \
              count          mean          std           min           25%   
continent                                                                    
Africa        624.0   2193.754578  2827.929863    241.165876    761.247010   
Oceania        24.0  18621.609223  6358.983321  10039.595640  14141.858697   

                                                   lifeExp             \
                    50%           75%          max   count       mean   
continent                                                               
Africa      1192.138217   2377.417422  21951.21176   624.0  48.865330   
Oceania    17983.303955  22214.117110  34435.36744    24.0  74.326208   

                                                               
                std     min      25%     50%      75%     max  
continent                                                      
Africa     9.150210  23.599  42.3725  47.792  54.4115  76.442  
Oceania    3.795611  69.120  71.2050  73.665  77.5525  81.235  


Correlation:
                      gdpPercap   lifeExp
continent                               
Africa    gdpPercap   1.000000  0.425608
          lifeExp     0.425608  1.000000
Oceania   gdpPercap   1.000000  0.956474
          lifeExp     0.956474  1.000000


Kendall method:
                      gdpPercap   lifeExp
continent                               
Africa    gdpPercap   1.000000  0.342953
          lifeExp     0.342953  1.000000
Oceania   gdpPercap   1.000000  0.905797
          lifeExp     0.905797  1.000000


Spearman method:
                      gdpPercap   lifeExp
continent                               
Africa    gdpPercap   1.000000  0.489389
          lifeExp     0.489389  1.000000
Oceania   gdpPercap   1.000000  0.981739
          lifeExp     0.981739  1.000000


Variance:
               gdpPercap    lifeExp
continent                         
Africa     7.997187e+06  83.726347
Oceania    4.043667e+07  14.406663


Skew:
            gdpPercap   lifeExp
continent                     
Africa      3.546631  0.565884
Oceania     0.805711  0.418820

Inference

The analysis concluded that Africa has a high variability in both GDP and life expectancy whereas for Oceania with its strong correlation values infers that GDP can be a good predictor of life expectancy.