En este post voy a bajarme del INE un csv de la población por provincias de España con el objetivo de ver como ha ido evolucionando la población de Madrid a lo largo de los años¶
Cargo las librerias necesarias¶
import requests # Para poder descargar
import pandas as pd # Para trabajar dataframes
import warnings # Para evitar warnings jupyter
import matplotlib.pyplot as plt # Librería de gráficos
import plotly.express as px # Gráficos interactivos
warnings.filterwarnings("ignore")
Descargo el dataset de la url y lo guardo en un dataframe de pandas¶
url = 'https://www.ine.es/jaxiT3/files/t/es/csv_bdsc/2852.csv?nocab=1'
myfile = requests.get(url)
open('poblacion_provincias.csv', 'wb').write(myfile.content)
pob_df = pd.read_csv('poblacion_provincias.csv', sep = ';')
Veo las columnas con las que contamos¶
pob_df.columns
Index(['Provincias', 'Sexo', 'Periodo', 'Total'], dtype='object')
Y los años de los que tenemos histórico¶
pob_df['Periodo'].unique()
array([2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000, 1999, 1998, 1997, 1996], dtype=int64)
Podemos ver como ha ido cambiando la población en Madrid a lo largo de los años, pero hay que ver el nombre con el que viene¶
pob_df['Provincias'].unique()
array(['Total', '02 Albacete', '03 Alicante/Alacant', '04 Almería', '01 Araba/Álava', '33 Asturias', '05 Ávila', '06 Badajoz', '07 Balears, Illes', '08 Barcelona', '48 Bizkaia', '09 Burgos', '10 Cáceres', '11 Cádiz', '39 Cantabria', '12 Castellón/Castelló', '13 Ciudad Real', '14 Córdoba', '15 Coruña, A', '16 Cuenca', '20 Gipuzkoa', '17 Girona', '18 Granada', '19 Guadalajara', '21 Huelva', '22 Huesca', '23 Jaén', '24 León', '25 Lleida', '27 Lugo', '28 Madrid', '29 Málaga', '30 Murcia', '31 Navarra', '32 Ourense', '34 Palencia', '35 Palmas, Las', '36 Pontevedra', '26 Rioja, La', '37 Salamanca', '38 Santa Cruz de Tenerife', '40 Segovia', '41 Sevilla', '42 Soria', '43 Tarragona', '44 Teruel', '45 Toledo', '46 Valencia/València', '47 Valladolid', '49 Zamora', '50 Zaragoza', '51 Ceuta', '52 Melilla'], dtype=object)
Vienen con el código, así que aprovechamos para separar código y nombre en dos columnas, quitando primero la del total, que no tiene código¶
pob_df = pob_df[pob_df['Provincias'] != 'Total']
pob_df = pob_df.reset_index()
pob_df['Provincias'].unique()
array(['02 Albacete', '03 Alicante/Alacant', '04 Almería', '01 Araba/Álava', '33 Asturias', '05 Ávila', '06 Badajoz', '07 Balears, Illes', '08 Barcelona', '48 Bizkaia', '09 Burgos', '10 Cáceres', '11 Cádiz', '39 Cantabria', '12 Castellón/Castelló', '13 Ciudad Real', '14 Córdoba', '15 Coruña, A', '16 Cuenca', '20 Gipuzkoa', '17 Girona', '18 Granada', '19 Guadalajara', '21 Huelva', '22 Huesca', '23 Jaén', '24 León', '25 Lleida', '27 Lugo', '28 Madrid', '29 Málaga', '30 Murcia', '31 Navarra', '32 Ourense', '34 Palencia', '35 Palmas, Las', '36 Pontevedra', '26 Rioja, La', '37 Salamanca', '38 Santa Cruz de Tenerife', '40 Segovia', '41 Sevilla', '42 Soria', '43 Tarragona', '44 Teruel', '45 Toledo', '46 Valencia/València', '47 Valladolid', '49 Zamora', '50 Zaragoza', '51 Ceuta', '52 Melilla'], dtype=object)
Corto la cadena de la columna para quedarme con la seguna parte tras el primer espacio y vemos que nos quedamos con las 52¶
lista_prov = list(pob_df.Provincias.str.split(" ",1))
pob_df['Provincia'] = ''
for i in range(len(lista_prov)):
pob_df['Provincia'][i] = lista_prov[i][1]
len(pob_df['Provincia'].unique())
52
Me quedo solo con las de Madrid, con los totales, y como busco en este siglo, desde el 2000¶
# Elijo solo Madrid
pob_mad = pob_df[pob_df['Provincia'] == 'Madrid']
# Elijo solo los totales
pob_mad = pob_mad[pob_mad['Sexo'] == 'Total']
# Desde el año 2000
pob_mad = pob_mad[pob_mad['Periodo'] > 1999]
# Paso a enteros las columnas numéricas
pob_mad.Periodo = pob_mad.Periodo.astype(int)
pob_mad.Total = pob_mad.Total.str.replace('.', '').astype(int)
Ya lo tengo preparado, por lo que que puedo graficar¶
plt.plot(pob_mad.Periodo, pob_mad.Total)
plt.xlabel("Año")
plt.ylabel("Población (millones)")
plt.title("Evolución población de Madrid desde año 2000")
plt.xticks(pob_mad.Periodo, rotation = 70)
plt.fill_between(pob_mad.Periodo, pob_mad.Total)
plt.show()
Ahora si vamos a distiguir entre sexos y ver la evolución. Además voy a utilizar un gráfico interactivo de plotly¶
# Repito pasos muy similares, como en el anterior
pob_mad_sex = pob_df[pob_df['Provincia'] == 'Madrid']
pob_mad_sex = pob_mad_sex[pob_mad_sex['Sexo'] != 'Total']
pob_mad_sex = pob_mad_sex[pob_mad_sex['Periodo'] > 1999]
pob_mad_sex.Periodo = pob_mad_sex.Periodo.astype(int)
pob_mad_sex.Total = pob_mad_sex.Total.str.replace('.', '').astype(int)
Grafico lo que buscamos¶
#fig = px.line(pob_mad_sex, x='Periodo', y="Total", color='Sexo')
#fig.show()
Se observa una evolución positiva, salvo una ligera bajada en 2015. También se observa que hay más mujeres que hombres, en toda la evolución¶
Por último veamos que porcentaje de más en distintos años, para ver si también ha ido aumentando esta diferencia entre sexos¶
# Agrupo y pivoto las columnas
porc_mad = pob_mad_sex.reset_index().groupby(['Periodo', 'Sexo'])['Total'].aggregate('first').unstack()
# Muestro resultado
porc_mad
Sexo | Hombres | Mujeres |
---|---|---|
Periodo | ||
2000 | 2501285 | 2704123 |
2001 | 2584779 | 2787654 |
2002 | 2663407 | 2863745 |
2003 | 2760877 | 2958065 |
2004 | 2804962 | 2999867 |
2005 | 2887718 | 3076425 |
2006 | 2908654 | 3099529 |
2007 | 2943778 | 3137911 |
2008 | 3040658 | 3230980 |
2009 | 3094874 | 3292058 |
2010 | 3124438 | 3334246 |
2011 | 3132844 | 3356836 |
2012 | 3130241 | 3368319 |
2013 | 3123724 | 3371827 |
2014 | 3099641 | 3354799 |
2015 | 3087022 | 3349974 |
2016 | 3098631 | 3368365 |
2017 | 3115522 | 3391662 |
2018 | 3147872 | 3430207 |
2019 | 3187312 | 3476082 |
2020 | 3243793 | 3536095 |
Hago el cálculo de la columna que nos interesa con el porcentaje¶
porc_mad['porcentaje'] = (1-(porc_mad.Hombres/porc_mad.Mujeres))*100
Lo paso a un dataframe y reseteo index para después graficar¶
porc_mad_df = pd.DataFrame(porc_mad['porcentaje']).reset_index()
Grafico¶
plt.plot(porc_mad_df.Periodo, porc_mad_df.porcentaje)
plt.xlabel("Año")
plt.ylabel("Porcentaje %")
plt.title("Evolución del porcentaje de más mujeres que hombres en Madrid")
plt.xticks(porc_mad_df.Periodo, rotation = 70)
plt.fill_between(porc_mad_df.Periodo, porc_mad_df.porcentaje, color = "m")
plt.show()
Espero te haya parecido interesante. Si tienes alguna sugerencia o duda, por favor, deja tu comentario.