Para dar inicio a esta pagina en la que voy a ir compartiendo mis proyectos formativos como especialista en datos hoy les traigo un primer análisis exploratorio.
Este análisis lo realicé en base a datos obtenidos de la pagina DatosMacro: https://datosmacro.expansion.com/
Esta pagina contiene datos de diferentes índices y ratings económicos, demográficos y sociales de diferentes países del mundo. Se acompañan con gráficos interactivos y se puede indicar que los valores monetarios sean expresados tanto en dólares como en euros. Se las recomiendo a quienes, como yo, disfrutan el análisis comparativo de la situación en diferentes lugares del mundo.
Para empezar extraje seleccionando y copiando los datos de los ratings correspondientes al Índice Gini, Índice de felicidad, Desarrollo Humano, Déficit, Expectativa de vida, DoingBusiness (Mide la facilidad para crear y desarrollar negocios en los países), IPC (Precios al consumidor), Salario medio y por último PBI per cápita.
Mi intención inicial es tratar de ver que relación directa, indirecta o nula existe entre estas diferentes variables.
Una vez copiados los datos en varias hojas de un archivo Excel, cree un proyecto nuevo de Jupyter Notebook e importe Pandas, Seaborn, Numpy y Matplotlib.
import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Extraje los datos de cada uno de los indicadores del archivo Excel en DataFrames de Pandas y los unifiqué, en una sola tabla con el método "Merge":
Gini=pd.read_excel("Indicadores.xlsx",sheet_name="Gini")
Felicidad=pd.read_excel("Indicadores.xlsx",sheet_name="Felicidad")
DHumano=pd.read_excel("Indicadores.xlsx",sheet_name="Desarrollo Humano")
Deficit=pd.read_excel("Indicadores.xlsx",sheet_name="Deficit")
EVida=pd.read_excel("Indicadores.xlsx",sheet_name="Esperanza de Vida")
DoingBusiness=pd.read_excel("Indicadores.xlsx",sheet_name="DoingBusiness")
IPC=pd.read_excel("Indicadores.xlsx",sheet_name="IPC")
SMedio=pd.read_excel("Indicadores.xlsx",sheet_name="Salario Medio")
Desempleo=pd.read_excel("Indicadores.xlsx",sheet_name="Desempleo")
PBIPC=pd.read_excel("Indicadores.xlsx",sheet_name="PBIPC")
Gini=Gini[['Países','Índice de Gini']]
Felicidad=Felicidad[['Países', 'Índice Felicidad']]
DHumano=DHumano[['Países', 'IDH']]
Deficit=Deficit[['Países', 'Déficit (%PIB)']]
EVida=EVida[['Países','Esperanza de vida']]
DoingBusiness["DoingBusiness"]=DoingBusiness["Índice"]
DoingBusiness=DoingBusiness[['Países', 'DoingBusiness']]
IPC=IPC[['Países', 'IPC Interanual']]
SMedio=SMedio[['Países','Salario Medio']]
Desempleo=Desempleo[['Países', 'Tasa de desempleo']]
tabla=pd.merge(left=Gini,right=Felicidad,how="outer",on="Países")
tabla=pd.merge(left=tabla,right=DHumano,how="outer",on="Países")
tabla=pd.merge(left=tabla,right=Deficit,how="outer",on="Países")
tabla=pd.merge(left=tabla,right=EVida,how="outer",on="Países")
tabla=pd.merge(left=tabla,right=DoingBusiness,how="outer",on="Países")
tabla=pd.merge(left=tabla,right=IPC,how="outer",on="Países")
tabla=pd.merge(left=tabla,right=SMedio,how="outer",on="Países")
tabla=pd.merge(left=tabla,right=Desempleo,how="outer",on="Países")
tabla=pd.merge(left=tabla,right=PBIPC,how="outer",on="Países")
El dataframe resultante es el que sigue:
tabla.head()
| Países | Índice de Gini | Índice Felicidad | IDH | Déficit (%PIB) | Esperanza de vida | DoingBusiness | IPC Interanual | Salario Medio | Tasa de desempleo | PIB Per Capita | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | España [+] | 31.5 | 6.436 | 0.905 | -0.0364 | 83.08 | 77.94 | 0.032 | 29863.0 | 0.115 | 32530 |
| 1 | Alemania [+] | 29.3 | 6.892 | 0.942 | -0.0250 | 80.70 | 79.71 | 0.022 | 57958.0 | 0.032 | 52824 |
| 2 | Reino Unido [+] | 33.5 | 6.796 | 0.929 | -0.0551 | 80.70 | 83.55 | 0.032 | 52278.0 | 0.042 | 45943 |
| 3 | Francia [+] | 29.8 | 6.661 | 0.903 | -0.0550 | 82.30 | 76.80 | 0.023 | 43742.0 | 0.074 | 44460 |
| 4 | Italia [+] | 32.7 | 6.405 | 0.895 | -0.0740 | 82.80 | 72.85 | 0.013 | 35649.0 | 0.075 | 38221 |
tabla.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 197 entries, 0 to 196 Data columns (total 11 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Países 197 non-null object 1 Índice de Gini 169 non-null float64 2 Índice Felicidad 136 non-null float64 3 IDH 191 non-null float64 4 Déficit (%PIB) 192 non-null float64 5 Esperanza de vida 194 non-null float64 6 DoingBusiness 177 non-null float64 7 IPC Interanual 96 non-null float64 8 Salario Medio 43 non-null float64 9 Tasa de desempleo 46 non-null float64 10 PIB Per Capita 197 non-null int64 dtypes: float64(9), int64(1), object(1) memory usage: 18.5+ KB
Como se ve cuenta con 10 columnas y consta de 197 registros.
Como primer paso del análisis, usé el método .describe() para ver las principales métricas de estadística descriptiva:
tabla.describe()
| Índice de Gini | Índice Felicidad | IDH | Déficit (%PIB) | Esperanza de vida | DoingBusiness | IPC Interanual | Salario Medio | Tasa de desempleo | PIB Per Capita | |
|---|---|---|---|---|---|---|---|---|---|---|
| count | 169.000000 | 136.000000 | 191.000000 | 192.000000 | 194.000000 | 177.000000 | 96.000000 | 43.000000 | 46.000000 | 197.000000 |
| mean | 36.487574 | 5.533750 | 0.720576 | -0.026602 | 71.328144 | 62.757571 | 0.139406 | 37446.069767 | 0.065609 | 18801.390863 |
| std | 7.667333 | 1.141883 | 0.150661 | 0.060055 | 7.768110 | 13.923886 | 0.459833 | 23448.321220 | 0.046727 | 30163.868088 |
| min | 21.600000 | 1.859000 | 0.385000 | -0.198800 | 52.530000 | 20.040000 | -0.012000 | 4964.000000 | 0.025000 | 320.000000 |
| 25% | 31.200000 | 4.702500 | 0.599500 | -0.058050 | 65.670000 | 53.840000 | 0.023000 | 17338.000000 | 0.038750 | 2280.000000 |
| 50% | 35.300000 | 5.672500 | 0.739000 | -0.031950 | 71.860000 | 62.290000 | 0.038500 | 35496.000000 | 0.058000 | 6671.000000 |
| 75% | 40.700000 | 6.331000 | 0.835000 | -0.005500 | 76.985000 | 74.290000 | 0.068500 | 56501.000000 | 0.076750 | 22874.000000 |
| max | 63.000000 | 7.804000 | 0.962000 | 0.437500 | 85.600000 | 86.760000 | 3.397000 | 105735.000000 | 0.327000 | 239437.000000 |
De esas variables talvez las mas interesantes para describir los datos sean la media (mean) y el desvío estándar (std) ya que nos indica cuales son respectivamente el valor promedio y la dispersión media de los valores. Así se observa, por ejemplo que el PBI per cápita medio es de 18.801,39 dólares, con un desvío estándar de 30.163.86 (Lo cual indica que la variación respecto de esa media es altísima, lo cual tiene sentido si se observa que el mínimo es de 320 dólares y el máximo de 239.437 dólares).
Si utilizo el metodo de .pairplot(), Seaborn genera la siguiente matriz:
sns.pairplot(tabla)
<seaborn.axisgrid.PairGrid at 0x2681de36470>
La imagen es muy grande para verla a simple vista porque tiene muchas variables, pero lo que permite es obtener muy rápidamente una serie de diagramas de dispersión (scatterplots) que cruzan cada una de las variables entre sí. Asimismo, en la intersección de cada variable con esa misma variable, se dispone un histograma que permite observar la distribución de los valores para esa variable.
A la distancia se puede ver que algunas combinaciones de variables generan distribuciones aproximadamente lineales o curvas, lo que sugiere una posible correlación, mientras que en otras combinaciones no se observa a priori relación alguna.
Valores extremos¶
Como se observa en las variables: "Déficit (%PIB)", "IPC Interanual" y "PIB Per Capita" los datos aparecen concentrados en una franja vertical muy estrecha. Esto se debe posiblemente a la existencia de valores extremos (outliers), es decir, unos pocos valores muy por encima o muy por debajo la mayoría de los datos, que distorsionan la distribución haciendo difícil la medición de regularidades en la generalidad de los datos.
Los valores extremos pueden ser, según el caso, errores en la recolección o limpieza de los datos, o también pueden ser datos validos pero que pueden resultar problemáticos, ya que distorsionan mucho los resultados cuando queremos describir la generalidad de los casos.
Si se piensa, es esperable de estas tres variables que, si bien la mayoría de los países compartan valores relativamente similares, algunos pocos presenten valores en extremo distintos.
Estos valores extremos podemos observarlos usando diagramas de caja (boxplot) como los siguientes:
sns.boxplot(tabla,x="Déficit (%PIB)")
<AxesSubplot:xlabel='Déficit (%PIB)'>
sns.boxplot(tabla,x="IPC Interanual")
<AxesSubplot:xlabel='IPC Interanual'>
sns.boxplot(tabla,x="PIB Per Capita")
<AxesSubplot:xlabel='PIB Per Capita'>
La manera de interpretar un diagrama de caja es la siguiente. La línea en el medio de la caja azul representa la mediana (el valor que, si ordenamos los datos, separa al conjunto por la mitad). El extremo izquierdo y derecho de la caja representan el cuartil primero y tercero (es decir, la primera y tercer líneas que separan en cuartos el conjunto los datos ordenados).
Las líneas cortadas (bigotes) que se proyectan a la izquierda y derecha de la caja equivalen al rango intercuartílico (el valor de la distancia entre el primer y tercer cuartil, es decir, el ancho de la caja) multiplicado por 1,5.
¿Para que sirven esos "bigotes"? Para marcar la distancia a partir de la cual (por convención) elegimos considerar a los datos más distantes como valores extremos. En los diagramas, los puntos que aparecen a la izquierda y derecha de donde terminan los bigotes son los valores extremos.
¿Qué vamos a hacer con los valores extremos? Borrarlos, para evitar que afecten la escala de los gráficos y distorsionen las métricas que podemos usar para representar a la mayoría de los datos.
Esto lo voy a hacer aplicando la siguiente función, que va a convertir en nulos los valores que excedan 1.5*el rango Inter cuartil:
tabla_back=tabla.copy()
def limpiar_outliers(df,columna):
q1 = df[columna].quantile(0.25)
q3 = df[columna].quantile(0.75)
iqr = q3 - q1
bigote_inferior = q1 - 1.5 * iqr
bigote_superior = q3 + 1.5 * iqr
df.loc[(df[columna] < bigote_inferior) | (df[columna] > bigote_superior),columna]=np.nan
return df
tabla=limpiar_outliers(tabla,"PIB Per Capita")
tabla=limpiar_outliers(tabla,"IPC Interanual")
tabla=limpiar_outliers(tabla,"Déficit (%PIB)")
Comparemos ahora la distribución del PBI par cápita antes:
sns.histplot(tabla_back,x="PIB Per Capita")
<AxesSubplot:xlabel='PIB Per Capita', ylabel='Count'>
Y después de eliminar los valores extremos:
sns.histplot(tabla,x="PIB Per Capita")
<AxesSubplot:xlabel='PIB Per Capita', ylabel='Count'>
Ahora hagamos lo mismo con el IPC Interanual.
Antes:
sns.histplot(tabla_back,x="IPC Interanual")
<AxesSubplot:xlabel='IPC Interanual', ylabel='Count'>
Y despues:
sns.histplot(tabla,x="IPC Interanual")
<AxesSubplot:xlabel='IPC Interanual', ylabel='Count'>
Coeficientes de correlación de Pearson¶
En las siguientes imágenes aplique el metodo .corr() de la librería Pandas en combinación con el método .heatmap() de la librería Seaborn.
El resultado son mapas de calor que muestran los valores de una matriz que expresa el coeficiente de correlación de Pearson entre los datos de cada una de las variables entre sí. Este coeficiente expresa como 1 una correlación directa perfecta, como -1 una correlación inversa perfecta y como cero la ausencia absoluta de correlación.
La primera visualización muestra los coeficientes de correlación de la tabla de datos original:
sns.heatmap(tabla_back.corr(),annot=True)
<AxesSubplot:>
La segunda visualización, muestra los coeficientes de correlación de la tabla a la que se le quitaron los valores extremos.
sns.heatmap(tabla.corr(),annot=True)
<AxesSubplot:>
Como puede observarse la correlación entre las variables a las que se le eliminaron valores extremos en la segunda tabla tiende a ser más alta, tanto para las correlaciones directas como para las inversas.
Comparando las métricas descriptivas de esos conjuntos de datos podemos ver como cambiaron las medias y las desviaciones estándar para las columnas a las que eliminamos valores extremos. En todos los casos se observa que al eliminar los valores extremos las métricas dan valores más representativos de lo que es la normalidad de los casos.
tabla_back.describe()
| Índice de Gini | Índice Felicidad | IDH | Déficit (%PIB) | Esperanza de vida | DoingBusiness | IPC Interanual | Salario Medio | Tasa de desempleo | PIB Per Capita | |
|---|---|---|---|---|---|---|---|---|---|---|
| count | 169.000000 | 136.000000 | 191.000000 | 192.000000 | 194.000000 | 177.000000 | 96.000000 | 43.000000 | 46.000000 | 197.000000 |
| mean | 36.487574 | 5.533750 | 0.720576 | -0.026602 | 71.328144 | 62.757571 | 0.139406 | 37446.069767 | 0.065609 | 18801.390863 |
| std | 7.667333 | 1.141883 | 0.150661 | 0.060055 | 7.768110 | 13.923886 | 0.459833 | 23448.321220 | 0.046727 | 30163.868088 |
| min | 21.600000 | 1.859000 | 0.385000 | -0.198800 | 52.530000 | 20.040000 | -0.012000 | 4964.000000 | 0.025000 | 320.000000 |
| 25% | 31.200000 | 4.702500 | 0.599500 | -0.058050 | 65.670000 | 53.840000 | 0.023000 | 17338.000000 | 0.038750 | 2280.000000 |
| 50% | 35.300000 | 5.672500 | 0.739000 | -0.031950 | 71.860000 | 62.290000 | 0.038500 | 35496.000000 | 0.058000 | 6671.000000 |
| 75% | 40.700000 | 6.331000 | 0.835000 | -0.005500 | 76.985000 | 74.290000 | 0.068500 | 56501.000000 | 0.076750 | 22874.000000 |
| max | 63.000000 | 7.804000 | 0.962000 | 0.437500 | 85.600000 | 86.760000 | 3.397000 | 105735.000000 | 0.327000 | 239437.000000 |
tabla.describe()
| Índice de Gini | Índice Felicidad | IDH | Déficit (%PIB) | Esperanza de vida | DoingBusiness | IPC Interanual | Salario Medio | Tasa de desempleo | PIB Per Capita | |
|---|---|---|---|---|---|---|---|---|---|---|
| count | 169.000000 | 136.000000 | 191.000000 | 182.000000 | 194.000000 | 177.000000 | 85.000000 | 43.000000 | 46.000000 | 177.000000 |
| mean | 36.487574 | 5.533750 | 0.720576 | -0.033273 | 71.328144 | 62.757571 | 0.039706 | 37446.069767 | 0.065609 | 10996.615819 |
| std | 7.667333 | 1.141883 | 0.150661 | 0.036428 | 7.768110 | 13.923886 | 0.028622 | 23448.321220 | 0.046727 | 12663.982201 |
| min | 21.600000 | 1.859000 | 0.385000 | -0.132700 | 52.530000 | 20.040000 | -0.012000 | 4964.000000 | 0.025000 | 320.000000 |
| 25% | 31.200000 | 4.702500 | 0.599500 | -0.058150 | 65.670000 | 53.840000 | 0.022000 | 17338.000000 | 0.038750 | 2119.000000 |
| 50% | 35.300000 | 5.672500 | 0.739000 | -0.032500 | 71.860000 | 62.290000 | 0.035000 | 35496.000000 | 0.058000 | 5598.000000 |
| 75% | 40.700000 | 6.331000 | 0.835000 | -0.008475 | 76.985000 | 74.290000 | 0.052000 | 56501.000000 | 0.076750 | 15427.000000 |
| max | 63.000000 | 7.804000 | 0.962000 | 0.059700 | 85.600000 | 86.760000 | 0.122000 | 105735.000000 | 0.327000 | 53051.000000 |
Observaciones sobre la correlación de los datos¶
sns.heatmap(tabla.corr(),annot=True)
<AxesSubplot:>
Observando la matriz de correlaciones, puede percibirse que la variable "Déficit (%PIB)" presenta una correlación muy baja con todas las demás variables. Lo mismo puede decirse de la variable "IPC Interanual".
Por otro lado "PIB Per Cápita" presenta una correlación directa alta con "Índice Felicidad", "IDH" (Desarrollo Humano),"Esperanza de vida", una correlación relativamente alta con el índice "DoingBusiness" (Facilidad para hacer negocios, medido por el Banco Mundial) y una correlación altísima (91) con "Salario Medio", lo cual, si bien no demuestra (correlación no implica causalidad), sí se condice con la observación que hacen muchos economistas de que la productividad de la economía es el principal factor que determina el nivel de los salarios.
Esta correlación, que es la más alta de las observadas (0.93) se observa con mucha claridad en el siguiente gráfico:
sns.lmplot(tabla,x="PIB Per Capita",y="Salario Medio")
<seaborn.axisgrid.FacetGrid at 0x268262be140>
Al mismo tiempo "PIB Per Capita" presenta una cierta correlación inversa con las variables "Índice de Gini" (mide la desigualdad de ingresos), "IPC Interanual" y "Tasa de desempleo".
"Indice de Gini" tiene una correlación muy baja, tendiendo levemente a ser inversa con casi todas los demás índices salvo "Tasa de Desempleo" (Correlación de 0.48). Con lo que puede suponerse que el desempleo probablemente sea un predictor significativo de la desigualdad en un país.
Por último el índice "DoingBusiness" (Facilidad para hacer negocios) correlaciona positivamente con "Por último el indice "DoingBusiness" (Facilidad para hacer negocios) correlaciona positivamente con "PIB Per Capita", "Salario Medio", "Experanza de vida", "IDH" (Desarrollo Humano) y "Indice Felicidad"
Comentarios
Publicar un comentario