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:
- Trazando el camino con pandas (I): Descubriendo la Poderosa Herramienta de Análisis de Datos en Python
- Trazando el camino con pandas (II): Simplificando el Análisis de Datos Tabulares en Python
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:
Esto nos ayuda a hacer comparaciones más visuales:
¿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?