Hamburger Icon
Trazando el camino con pandas (III): Analizando el PIB per cápita en Europa

Trazando el camino con pandas (III): Analizando el PIB per cápita en Europa

Pandas es una herramienta fantástica para hacer análsisis estadísticos de datasets. En este post vamos a ver cómo sacar información de provecho a partir de un dataset con información real sobre el PIB per cápita en europa.

En anteriores post ya vimos muchas de las cosas que podemos hacer con pandas:

Si has llegado hasta aquí, ya estás listo para empezar a trabajar con datasets y a mancharte las manos con posos de realidad estadística. Sé que esto del análisis económico suena a muermazo, pero te animo a seguir aunque no tengas ningún interés en estos temas, quizá despierte algo dentro de ti que no te esperas.

Qué haremos

A partir de este dataset oficial sobre el PIB per cápita en europa entre 2020 y 2022, vamos a hacer un análisis exploratorio de datos, a transformar posibles valores nulos, a añadir nueva información útil en el dataset calculada a partir de la existente, a filtrar y seleccionar datos, a visualizar información mediante gráficos y a promediar y consultar datos relevantes.

Conceptos previos

Antes de empezar, vamos a definir dos conceptos que nos ayudará a entender el contexto de los datos que vamos a analizar.

Empecemos por el PIB. Estas son las siglas de Producto Interior Bruto, en inglés GDP o Gross Domestic Product (la mayoría de datasets con los que te topes van a estar en inglés). Podemos definir el PIB por su valor real o su valor nominal, pero vamos a quedarnos con una explicación sencilla, ya que para el propósito de este post es más que suficiente.

Cuando vas al chino de al lado a comprar horquillas para el pelo, haces subir el PIB del país. Cuando vas a comprar medio pollo el domingo al mediodía porque tienes cero ganas de cocinar, haces subir el PIB del país. Cuando pides un Uber un sábado noche a las 3:00 AM porque estás demasiado trompa para conducir hasta casa, haces subir el PIB del país. Cuando te compras un nuevo vehículo, haces subir el PIB del país. ¿Se va entendiendo no? Cuando compras bienes o servicios, el PIB sube. Cuando lo hace la vecina del segundo, también. ¿Quiere decir eso que cuando vendo algo, el PIB baja? No, el PIB sube ya que otra persona está comprando lo que vendes.

Contra más compras (y más grandes) hagan los habitantes de un país, más sube el PIB de ese país, y viceversa. El PIB mide el valor monetario de bienes y servicios finales adquiridos por los consumidores en un período de tiempo determinado, normalmente un año. Si divides el PIB por el número total de habitantes de un país, obtienes el PIB per cápita. Todo esto se usa para comparar la economía entre regiones geográficas.

Por lo tanto, el PIB per cápita es un reflejo del nivel de riqueza de los habitantes de un país, aunque ten en cuenta que la riqueza está repartida de forma desigual y no debe tomarse como único indicador de bienestar social.

Empezamos con lo básico

Primero cargamos el dataset e imprimimos las primeras filas, a ver con qué información nos enfrentamos:

import pandas as pd

gdp_data = pd.read_csv("dataset.csv")

print(gdp_data.head())

"""
               DATAFLOW        LAST UPDATE freq           unit na_item geo  TIME_PERIOD  OBS_VALUE OBS_FLAG
0  ESTAT:SDG_08_10(1.0)  20/12/23 23:00:00    A  CLV10_EUR_HAB    B1GQ  AL         2000     1700.0      NaN
1  ESTAT:SDG_08_10(1.0)  20/12/23 23:00:00    A  CLV10_EUR_HAB    B1GQ  AL         2001     1850.0      NaN
2  ESTAT:SDG_08_10(1.0)  20/12/23 23:00:00    A  CLV10_EUR_HAB    B1GQ  AL         2002     1940.0      NaN
3  ESTAT:SDG_08_10(1.0)  20/12/23 23:00:00    A  CLV10_EUR_HAB    B1GQ  AL         2003     2060.0      NaN
4  ESTAT:SDG_08_10(1.0)  20/12/23 23:00:00    A  CLV10_EUR_HAB    B1GQ  AL         2004     2180.0      NaN
"""

Bien, vemos que tenemos varias columnas y, sobre todo, las que nos interesan son geo, TIME_PERIOD y OBS_VALUE, que hacen referencia a entidad geopolítica (país o agrupación de países), año y valor del PIB per cápita, respectivamente.

Veamos ahora alguna información general sobre estos datos:

print(gdp_data.info())

"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1805 entries, 0 to 1804
Data columns (total 9 columns):
 #   Column       Non-Null Count  Dtype
---  ------       --------------  -----
 0   DATAFLOW     1805 non-null   object
 1   LAST UPDATE  1805 non-null   object
 2   freq         1805 non-null   object
 3   unit         1805 non-null   object
 4   na_item      1805 non-null   object
 5   geo          1805 non-null   object
 6   TIME_PERIOD  1805 non-null   int64
 7   OBS_VALUE    1805 non-null   float64
 8   OBS_FLAG     103 non-null    object
dtypes: float64(1), int64(1), object(7)
memory usage: 127.0+ KB
None
"""

Perfecto, con esta información sabemos que estamos ante 1805 registros y que la columna geo son cadenas de texto, TIME\PERIOD son enteros y OBS_VALUE son números flotantes. ¿Te parece si vemos un resumen estadístico de estos datos? Mira:

print(gdp_data.describe())

"""
       TIME_PERIOD     OBS_VALUE
count  1805.000000   1805.000000
mean   2010.958449  12518.081717
std       6.562673  17765.797336
min    2000.000000    -15.200000
25%    2005.000000      2.100000
50%    2011.000000   1850.000000
75%    2017.000000  23100.000000
max    2022.000000  88250.000000
"""

Esto... vale. Como puedes ver, no nos resulta demasiado útil saber que la mediana del año del registro es 2010 (es obvio, al tratarse de información entre 2000 y 2022). Tampoco nos interesan demasido los datos de percentiles y máximos para la columna de año, pero quizá la información de la columna de valor del PIB per cápita sí nos esté dando algo más de información útil:

  • la media del PIB entre 2000 y 2022 es de 12.512,08 €
  • la desviación estándar (o volatilidad) de los valores es de 17.765,80 €
  • el valor mínimo es -15,20 €
  • el percentil 25 es 2,10 €
  • el percentil 50 es 1.850,00 €
  • el percentil 75 es 23.100,00 €
  • el valor máximo es 88.250,00 €

Esto ya nos dice bastante. La media en las últimas décadas parece bastante baja si lo comparamos con EEUU, pero muy aceptable si lo comparamos con oriente medio y países asiáticos. La volatilidad nos indica que hay bastante desigualdad entre los países más ricos y más pobres de Europa, nada nuevo bajo el Sol.

El valor negativo que vemos en el mínimo, nos indica que la economía de alguno de los países está bastante tocada, posiblemente en recesión o cerca de estarlo. Los datos de percentiles nos indican que hay un 25% de países europeos con un PIB per cápita que ronda ese valor o es menor, que el PIB per cápita del 50% es 1.850,00 € o menos y que en el 75% de países no se supera un PIB per cápita de 23.100,00 €. Además, hay algún país que tiene un PIB per cápita de 88.250,00 €, algo nada desdeñable. Ya te digo que ese no es España 😅.

El caso es que con muy poco esfuerzo, somos capaces de analizar un conjunto de datos más o menos grande y sacar información relevante en cuestión de minutos.

¿No te parece suficiente?

Pues sigue leyendo y verás.

Continuamos con algo más avanzado

Primero, veamos si tenemos valores nulos que debamos gestionar:

print(gdp_data.isnull().sum())

"""
DATAFLOW          0
LAST UPDATE       0
freq              0
unit              0
na_item           0
geo               0
TIME_PERIOD       0
OBS_VALUE         0
OBS_FLAG       1702
dtype: int64
"""

En las columnas que usamos no tenemos nulos, por lo que no hace falta que hagamos nada especial para continuar con nuestro análisis, aunque esto ya lo sabíamos después de ejecutar antes la función info(), fíjate más arriba que su salida contiene una columna de conteo de nulos.

Vamos a hacer algo interesante. Intentaremos añadir información adicional al dataset calculada a partir de la información existente. ¿Qué tal si calculamos la tasa de crecimiento anual del PIB per cápita para cada entidad geopolítica de la lista? Veámoslo:

# agrupamos los datos por unidad geopolítica y calculamos la tasa de crecimiento del PIB per cápita
gdp_data["Tasa Crecimiento"] = gdp_data.groupby("geo")["OBS_VALUE"].pct_change() * 100

# filtramos los datos de EU28 y ESPAÑA
tasa_eu28 = gdp_data[
    (gdp_data["geo"] == "EU28") &
    (gdp_data["unit"] == "CLV10_EUR_HAB")
][["TIME_PERIOD", "OBS_VALUE", "Tasa Crecimiento"]]

tasa_spa = gdp_data[
    (gdp_data["geo"] == "ES") &
    (gdp_data["unit"] == "CLV10_EUR_HAB")
][["TIME_PERIOD", "OBS_VALUE", "Tasa Crecimiento"]]


print("UNION EUROPEA")
print(tasa_eu28)

print("ESPAÑA")
print(tasa_spa)

"""
UNION EUROPEA
     TIME_PERIOD  OBS_VALUE  Tasa Crecimiento
343         2000    22990.0               NaN
344         2001    23470.0          2.087864
345         2002    23710.0          1.022582
346         2003    23930.0          0.927879
347         2004    24430.0          2.089427
348         2005    24830.0          1.637331
349         2006    25570.0          2.980266
350         2007    26230.0          2.581150
351         2008    26250.0          0.076249
352         2009    25040.0         -4.609524
353         2010    25520.0          1.916933
354         2011    25910.0          1.528213
355         2012    25750.0         -0.617522
356         2013    25780.0          0.116505
357         2014    26180.0          1.551590
358         2015    26710.0          2.024446
359         2016    27140.0          1.609884
360         2017    27800.0          2.431835
361         2018    28270.0          1.690647
362         2019    28690.0          1.485674


ESPAÑA
     TIME_PERIOD  OBS_VALUE  Tasa Crecimiento
297         2000    21460.0               NaN
298         2001    22190.0          3.401678
299         2002    22430.0          1.081568
300         2003    22680.0          1.114579
301         2004    23020.0          1.499118
302         2005    23420.0          1.737619
303         2006    24000.0          2.476516
304         2007    24380.0          1.583333
305         2008    24200.0         -0.738310
306         2009    23100.0         -4.545455
307         2010    23040.0         -0.259740
308         2011    22770.0         -1.171875
309         2012    22080.0         -3.030303
310         2013    21850.0         -1.041667
311         2014    22220.0          1.693364
312         2015    23090.0          3.915392
313         2016    23780.0          2.988307
314         2017    24440.0          2.775442
315         2018    24890.0          1.841244
316         2019    25180.0          1.165127
317         2020    22250.0        -11.636219
318         2021    23690.0          6.471910
319         2022    24910.0          5.149852
"""

Si comparamos España con el total de la Unión Europea, no parece que tengamos una tasa de crecimiento envidiable. Aunque en los años recientes haya sido superior, cabe destacar que eso es debido a que ya estábamos en un pozo previamente.

Comparémoslo con la tasa de crecimiento de Estonia y Portugal, países con, quizá, mejores proyecciones a futuro que España:

# filtramos los datos de ESTONIA y PORTUGAL
tasa_ee = gdp_data[
    (gdp_data["geo"] == "EE") &
    (gdp_data["unit"] == "CLV10_EUR_HAB")
][["TIME_PERIOD", "OBS_VALUE", "Tasa Crecimiento"]]

tasa_pt = gdp_data[
    (gdp_data["geo"] == "PT") &
    (gdp_data["unit"] == "CLV10_EUR_HAB")
][["TIME_PERIOD", "OBS_VALUE", "Tasa Crecimiento"]]


print("ESTONIA")
print(tasa_ee)

print("PORTUGAL")
print(tasa_pt)

"""
ESTONIA
     TIME_PERIOD  OBS_VALUE  Tasa Crecimiento
251         2000     7540.0               NaN
252         2001     8040.0          6.631300
253         2002     8640.0          7.462687
254         2003     9350.0          8.217593
255         2004    10050.0          7.486631
256         2005    11070.0         10.149254
257         2006    12230.0         10.478771
258         2007    13230.0          8.176615
259         2008    12590.0         -4.837491
260         2009    10770.0        -14.455917
261         2010    11060.0          2.692665
262         2011    11890.0          7.504521
263         2012    12320.0          3.616484
264         2013    12540.0          1.785714
265         2014    12960.0          3.349282
266         2015    13230.0          2.083333
267         2016    13620.0          2.947846
268         2017    14410.0          5.800294
269         2018    14920.0          3.539209
270         2019    15450.0          3.552279
271         2020    15260.0         -1.229773
272         2021    16350.0          7.142857
273         2022    16250.0         -0.611621


PORTUGAL
     TIME_PERIOD  OBS_VALUE  Tasa Crecimiento
723         2000    16230.0               NaN
724         2001    16430.0          1.232286
725         2002    16470.0          0.243457
726         2003    16250.0         -1.335762
727         2004    16500.0          1.538462
728         2005    16600.0          0.606061
729         2006    16840.0          1.445783
730         2007    17230.0          2.315914
731         2008    17260.0          0.174115
732         2009    16710.0         -3.186559
733         2010    16990.0          1.675643
734         2011    16720.0         -1.589170
735         2012    16110.0         -3.648325
736         2013    16050.0         -0.372439
737         2014    16260.0          1.308411
738         2015    16620.0          2.214022
739         2016    17010.0          2.346570
740         2017    17650.0          3.762493
741         2018    18190.0          3.059490
742         2019    18670.0          2.638813
743         2020    17100.0         -8.409213
744         2021    18090.0          5.789474
745         2022    19310.0          6.744057
"""

Tienen un PIB per cápita inferior, pero sus economías crecen más que la de España, que parece estancada desde hace veinte años, lo podemos ver reflejado en la media de estos valores:

media_eu28 = tasa_eu28["Tasa Crecimiento"].dropna().mean()
media_spa = tasa_spa["Tasa Crecimiento"].dropna().mean()
media_ee = tasa_ee["Tasa Crecimiento"].dropna().mean()
media_pt = tasa_pt["Tasa Crecimiento"].dropna().mean()

print(f"UNION EUROPEA: {media_eu28}")
print(f"ESPAÑA: {media_spa}")
print(f"ESTONIA: {media_ee}")
print(f"PORTUGAL: {media_pt}")

"""
UNION EUROPEA: 1.185864700457848
ESPAÑA: 0.7487035815978196
ESTONIA: 3.7037514578048127
PORTUGAL: 0.8433446864420223
"""

Podemos ver claramente como la media de crecimiento del PIB per cápita de España es la peor entre estos datos. Ojo, no pretendo hacer ninguna crítica, simplemente exponer la información del dataset, España saldría ganando si la comparamos con Rumanía o Grecia.

Para ver esta información sobre un gráfico podemos usar las librerías matplotlib y seaborn:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

gdp_data = pd.read_csv("dataset.csv")

# Gráfico de línea para mostrar la evolución del PIB per cápita en Alemania
pib_deu = gdp_data[gdp_data["geo"] == 'DE']

plt.figure(figsize=(12, 8))
sns.lineplot(x='TIME_PERIOD', y='OBS_VALUE', data=pib_deu)
plt.title('Evolución del PIB per cápita en Alemania (2000-2022)')
plt.xlabel('Año')
plt.ylabel('PIB per cápita (en euros)')
plt.show()

Veremos un gráfico como este:

https://a.storyblok.com/f/96536/911x425/c57372eb27/pandas_pib_alemania_evo.jpeg

Esto nos ayuda a hacer comparaciones más visuales:

https://a.storyblok.com/f/96536/940x564/4da3a64669/pandas_pib_espana_evo.jpeg

https://a.storyblok.com/f/96536/902x612/a5d7258364/pandas_pib_estonia_evo.jpeg

¿Increíble verdad? Tenemos un sinfín de datos que sacar con unas pocas instrucciones y además podemos hacer comparaciones visuales con gráficos.

Conclusiones

En este análisis utilizando pandas, hemos explorado el PIB per cápita en Europa entre 2000 y 2022 mediante un dataset con datos reales. Después de cargar y explorar los datos, hemos calculado la tasa de crecimiento anual del PIB per cápita para diferentes países.

Hemos podido destacar la situación de España, cuyo crecimiento parece estancado y ha sido superado por países como Estonia y Portugal. Hemos podido ver que la desigualdad económica entre los países europeos parece evidente, y la visualización gráfica nos ha proporcionado una perspectiva clara de las tendencias a lo largo del tiempo.

En resumen, pandas nos ha facilitado un análisis detallado, revelando insights significativos sobre la economía europea y la posición relativa de España.

¿Te imaginas todo lo que puedes hacer con pandas?