馃摱Analysis of Spanish population_Part II
Purpose
To get visualizations related to Spanish population by connecting with Python libraries.
Data Package
Spanish population taken by INE (National Statistics Institute of Spain).
Source: https://www.ine.es/index.htm
Instructions
Use of libraries: pandas, numpy, seaborn, matplotlib, datatime, os.
Perform graphs to understand Spanish population trends among the years.
Requirement
Connect with python libraries to get visualizations about the analyzed data.
Conclusions
The line graph shows that the Spanish population has been growing progressively over the last 5 decades (from 1970 to 2020).
Men's and women's populations have increased gradually, though the line graph illustrates ladies' rate grew up slightly higher than men's one.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import datetime
import os
pwd
os.chdir('\\Users\\Goda\\anaconda3\\envs\\unicornenv\\conda-meta')
df = pd.read_csv('poblacion_INE_limpio.csv')
df
df.info()
#Arriba vemos que la fecha esta en formato objeto y no fecha, por lo que hay que cambiarlo\
#Podemos cambiarlo al momento de la importacion de datos, para ello generamos una variable
#donde vamos a guardar una funcion landa que va a contener un parceo para las fechas...
dateparse = lambda dates: datetime.datetime.strptime(dates, '%Y-%m-%d')
#Una vez cambiada la fecha en formato fecha, volvemos a importar el archivo para ello...
#Indicamos que importe el archivo sobre el cual se esta trabajando...
#Solicitamos que lo parsee con parse_dates = [columna con fechas],
#Indicamos como queremos que realice el parse
df = pd.read_csv('poblacion_INE_limpio[1].csv', parse_dates = ['fecha'], date_parser = dateparse)
dateparse = lambda dates: datetime.datetime.strptime(dates, '%Y-%m-%d')
df = pd.read_csv('poblacion_INE_limpio[1].csv', parse_dates = ['fecha'], date_parser = dateparse)
df.info()
df.to_csv('poblacion_INE_limpio[1].csv', index = False)
#Aqui index = False, permite que no duplique los indices
df = pd.read_csv('poblacion_INE_limpio[1].csv')
df
df.fecha[df.tipo_dato == 'Total']
df.poblacion[df.tipo_dato == 'Total']
plt.figure(figsize = (9,4))
plt.plot(df.fecha[df.tipo_dato == 'Total'], df.poblacion[df.tipo_dato == 'Total']/1000000, color = 'tab:red')
plt.xlabel('Fecha')
plt.ylabel('Poblacion (millones)')
plt.title('Poblacion Total')
plt.show()
df.tipo_dato.unique()
#Aqui creamos una funcion de manera que se creen graficos de manera automatica...
def plot_df(x, y, title, xlabel, ylabel):
plt.figure(figsize = (9,4))
plt.plot(x, y/1000000, color = 'tab:red')
plt.xlabel(xlabel)
plt.ylabel(ylabel)
plt.title(title)
plt.show()
#Creamos un bucle for para automatizar la funcion...
for i in df.tipo_dato.unique():
plot_df(df.fecha[df.tipo_dato == i], df.poblacion[df.tipo_dato == i], 'Poblacion {0}'.format(i), 'Fecha', 'Poblacion (millones)');
import matplotlib as mpl
#Para requerir d ela biblioteca el listado de colores
mpl.colors.XKCD_COLORS.keys()
list(mpl.colors.XKCD_COLORS.keys())
#Para cargar 3 colores al azar utilizamos numpy
#Numpy tiene una funcin para tomar algo al azar, se debe poner una semilla
#Creamos una funcion que tome al azar colores sobre una df de cualquier longitud (lo automatozamos)
np.random.seed(35)
mycolors = np.random.choice(list(mpl.colors.XKCD_COLORS.keys()), len(df.tipo_dato.unique()), replace = False);
mycolors
#Aqui vemos que tomo los colores, rosado, verde grisaseoa y azul oscuro
np.random.seed(35)
mycolors = np.random.choice(list(mpl.colors.XKCD_COLORS.keys()), len(df.tipo_dato.unique()), replace = False);
mycolors
#Vamos a realizar la grafica personalizada...
#Creamos un bucle for...
#Vemos que necesitamos el tipo se serie (hombres, mujeres), pero no lo puedo pasar a mi lista de colores
#ya que no diferencia colores hombre y colores mujeres, para ello,
#usamos funcion enumerate (permite recorrer una lista y su indoce al mismo tiempo)
#Se le indica lo que va en el eje de las x 'fecha' y las y ' poblacion'
#la leyenda lo colocamos fuera del bucle for... plt.legend()
plt.figure(figsize = (9, 4), dpi = 80)
for i, d in enumerate(df.tipo_dato.unique()):
plt.plot('fecha', 'poblacion', data = df[df.tipo_dato == d], color = mycolors[i], label = d)
plt.legend()
plt.xlabel('Fecha')
plt.ylabel('Poblacion (millones)')
plt.title('Poblacion espanola (1971 - 2022)', fontsize = 15, pad = 20)
plt.show()
#plt.plot(df.fecha[df.tipo_dato == 'Total'], df.poblacion[df.tipo_dato == 'Total']/1000000, color = 'tab:red')
#Para realizar lo mismo con la biblioteca Seaborn...
#Agregamos una variebla diferenciadora hue = df.tipo_dato...
#Aunque presenta limitaciones, leyenda tipo_dato, se puede cambiar, falta titulo del grafico
sns.lineplot(x = df.fecha, y = df.poblacion/1000000, hue = df.tipo_dato);
#Aqui combinamos Seaborn (Sns) con Matplotlib (plt)
sns.lineplot(x = df.fecha, y = df.poblacion/1000000, hue = df.tipo_dato)
plt.title('Poblacion espanola (1971 - 2022)', fontsize = 15, pad = 20)
plt.legend(title = 'Series');
#Para personalizar el grafico desde seaborn...
sns.set_theme(style = 'whitegrid')
sns.lineplot(x = df.fecha, y = df.poblacion/1000000, hue = df.tipo_dato)
plt.title('Poblacion espanola (1971 - 2022)', fontsize = 15, pad = 20)
plt.legend(title = 'Series');
#Si queremos restringir a hombres y mujeres...
#Cambiamos el titulo, ya no es poblacion espanola sino hombres vs mujeres
sns.lineplot(x = df.fecha[df.tipo_dato != 'Total'], y = df.poblacion[df.tipo_dato != 'Total']/1000000, hue = df.tipo_dato)
plt.title('Poblacion espanola (1971 - 2022), Mujeres vs. Hombres', fontsize = 15, pad = 20)
plt.legend(title = 'Series', labels = ['Mujeres', 'Hombres']);
#Para estudiar la distribucion de la poblacion espanola podemos realizar un grafico de box.plot (de cajas y bigotes)
sns.boxplot(x = 'tipo_dato', y = df.poblacion/1000000, data = df)
plt.xlabel('Fecha')
plt.ylabel('Poblacion (millones)')
plt.title('Poblacion espanola (1971 - 2022)', fontsize = 15, pad = 20)
plt.show()
#Si queremos visualizar los puntos...usamos sns.swarm.plot()
plt.figure(figsize = (9, 7), dpi = 80)
sns.swarmplot(x = 'tipo_dato', y = df.poblacion/1000000, data = df)
plt.xlabel('Fecha')
plt.ylabel('Poblacion (millones)')
plt.title('Poblacion espanola (1971 - 2022)', fontsize = 15, pad = 20)
plt.show()
#Definimos una variable g usando un grafico de tipo catplot
#inner para que conjuge swarmplot con el grafico de violin
g = sns.catplot(x = 'tipo_dato', y = df.poblacion/1000000, data = df, kind = 'violin', inner = None)
sns.swarmplot(x = 'tipo_dato', y = df.poblacion/1000000, data = df, ax = g.ax, color = 'k', size = 3)
plt.xlabel('Fecha')
plt.ylabel('Poblaci贸n (millones)')
plt.title('Poblaci贸n espa帽ola (1971-2022)', fontsize = 15, pad = 20)
plt.show()
g = sns.catplot(x='tipo_dato', y='poblacion_millones', data=df, kind='violin', inner=None)
sns.swarmplot(x='tipo_dato', y='poblacion_millones', data=df, ax=g.ax, color='k', size=3)
plt.xlabel('Fecha')
plt.ylabel('Poblaci贸n (millones)')
plt.title('Poblaci贸n espa帽ola (1971-2022)', fontsize = 15, pad = 20)
plt.show()
#Definomos los axes, con subplots, de 1 fila y 2 columnas (graficos de barras)...
fig, axes = plt.subplots(1,2,figsize=(15,5), dpi=80)
sns.barplot(x='tipo_dato', y=df.poblacion/1000000, data=df, ax=axes[0])
sns.barplot(x='mes', y=df.poblacion/1000000, data=df[(df.tipo_dato == 'Total') & (df.a帽o.isin([1980, 2022]))])
axes[0].set_title('Poblaci贸n Espa帽ola por serie (1971-2022)', fontsize=15, pad = 10)
for p in axes[1].patches: #Para pintar el calculo de la media
axes[1].annotate(f'media:\n{p.get_height():0.2f}', (p.get_x() + p.get_width() / 2., p.get_height() / 2),
ha='center', va='center', xytext=(0, 10), textcoords='offset points')
axes[1].set_title('Poblacion espanola Total (1980 - 2022)', fontsize=15, pad=10)
plt.show()
#Aqui podemos ver como va variando la poblacion a lo largo de las decadas
plt.figure(figsize=(15,6), dpi = 80)
sns.barplot(x='decadas', y=df.poblacion/1000000, data=df[df.tipo_dato == 'Total'], hue = 'mes')
plt.xticks(rotation = 45);
df.groupby(['tipo_dato', 'decadas', 'mes']).incremento_pob.sum()
plt.figure(figsize=(15,6), dpi= 80)
sns.barplot(x='decadas', y=df.poblacion/1000000, data=df[df.tipo_dato == 'Total'], hue = 'mes')
plt.xticks(rotation = 45);