El objetivo de estas notas es simplemente mostrar cómo, de forma sencilla, es posible automatizar la obtención de datos del INE, descargando exclusivamente aquellos ficheros que os interesan y realizar un estudio sencillo.
Es decir, en estas notas no pretendemos hacer un estudio de brecha salarial. Esto queda para usted o para otro post
Asumamos que nos interesa analizar la brecha salarial a partir de las encuestas de estructura salarial del INE.
Si miramos la web que contiene los microdatos de la Encuesta
de Estructura Salarial vemos que están ordenados por año y, además, los ficheros de microdatos están en
la
url https://www.ine.es/ftp/microdatos/salarial/
.
Además, vemos que los ficheros están comprimidos.
A nosotros no nos interesará descargar el fichero comprimido para luego descomprimirlo en el ordenador.
Lo que haremos será descargarr exclusivamente el fichero que nos interesa y que está dentro del fichero zip:
el
fichero que nos interesa tiene terminación csv
.
Además, nos interesará descargar los diseños de registro, con terminación xlsx
, para analizar
las
preguntas que nos iteresan.
Nota: En esta aplicación los ficheros son relativamente pequeños. Pero cuandos ficheros son muy grandes nos ouede interesar descargar solamente la información que necesitamos.
import requests, zipfile, io, os
import pandas as pd
# Leemos las encuestas directamente del INE y nos quedamos exclusivamente con los ficheros csv y xlsx
# que son los que no interesan
anos = ["2010", "2014","2018" ]
for i in anos:
url = f"https://www.ine.es/ftp/microdatos/salarial/datos_" + i + ".zip"
r = requests.get(url)
z = zipfile.ZipFile(io.BytesIO(r.content))
for fileName in z.namelist():
# Vamos a extraer solo si terminan en csv
if fileName.endswith('.csv'):
# extraemos solo el fichero que nos interesa
z.extract(fileName)
# Extraemos solo el fichero de registro
if fileName.endswith('.xlsx'):
z.extract(fileName)
# El paquete glob me permite trabajar con todos aquellos ficheros que comparten caracteristicas
# Importante: mirar el directorio que se ha creado con el
import glob
files = glob.glob('./CSV/*.csv', recursive = True)
files_xl = glob.glob('*.xlsx', recursive = True)
# Variables de trabajo
variables_salario = ["salbase", "comsal", "extraorm", "phextra"]
variables_horas = ["jsp1", "jsp2", "hextra"]
variables_demograficas = ["sexo", "estu", "cno1", "cnace", "estrato2"]
variables_brecha = variables_salario + variables_horas + variables_demograficas
import re
# https://pythex.org/
# Vamos a leer los ficheros y crear una variable año para cada fichero leido
# Aqui extraemos todas las variables y concatenamos los data frames
brecha_df = pd.DataFrame()
for f in range(0,len(files)):
data = pd.read_csv(files[f], sep = "\t")
data.columns = data.columns.str.lower()
#Me quedo con las variables que me interesan
data = data.loc[:,variables_brecha]
#Creo una variable "year" que recoge el año de la encuesta a partir de la información del fichero
data["year"] = (re.findall("(\d{4})", files[f])[0])
brecha_df = pd.concat([brecha_df,data], ignore_index = True)
df_dr = pd.read_excel("dr_EES_2018.xlsx", header = 1)
df_dr.columns = df_dr.columns.str.lower()
# Crear un dictionario para guardar las variables
variables = {}
variables["2018"] = list(df_dr["variable"].str.lower().dropna())
#IMPORTANTE: HAY QUE HACERLO PARA TODOS LOS AÑOS: IDEA, IR ITERANDO AÑOA AÑO, VER SI ESTAN TODAS
#LAS VARIABLES Y DECIR ALGO SI NO LO ESTAN
# Verificar si estas variables están en los ficheros
v_salario = list(set(variables_salario).intersection(set(variables["2018"])))
v_horas = list(set(variables_horas).intersection(set(variables["2018"])))
v_demograficas = list(set(variables_demograficas).intersection(set(variables["2018"])))
brecha_df["salmes"] = brecha_df["salbase"] + brecha_df["comsal"] + brecha_df["extraorm"] + brecha_df["phextra"]
# JMP1=(JSP1+JSP2/60)*4.35 + HEXTRA
brecha_df["horas"] = (brecha_df["jsp1"] + brecha_df["jsp2"]/60)*4.35 + brecha_df["hextra"]
brecha_df["salario_hora"] = brecha_df["salmes"] / brecha_df["horas"]
brecha_df.groupby(["year", "sexo"])["salario_hora"].describe()
count | mean | std | min | 25% | 50% | 75% | max | ||
---|---|---|---|---|---|---|---|---|---|
year | sexo | ||||||||
2010 | 1 | 123657.0 | 13.370933 | 10.907306 | 0.222011 | 7.861609 | 10.705230 | 15.495575 | 960.944061 |
6 | 93112.0 | 10.579038 | 7.144453 | 0.358678 | 6.547528 | 8.620690 | 12.471204 | 775.019157 | |
2014 | 1 | 119943.0 | 13.530866 | 10.680618 | 0.178161 | 8.159391 | 10.948843 | 15.804655 | 698.952069 |
6 | 89493.0 | 11.030174 | 6.763554 | 0.277866 | 6.953448 | 9.102931 | 13.017507 | 209.023264 | |
2018 | 1 | 122558.0 | 14.278176 | 13.494233 | 0.268936 | 8.411681 | 11.270197 | 16.330693 | 954.505862 |
6 | 94168.0 | 11.855716 | 7.574360 | 0.206836 | 7.273192 | 9.677887 | 14.051888 | 335.665517 |
# Podemos extraer solo la media
brecha_df.groupby(["year", "sexo"])["salario_hora"].describe().loc[:, "mean"]
year sexo 2010 1 13.370933 6 10.579038 2014 1 13.530866 6 11.030174 2018 1 14.278176 6 11.855716 Name: mean, dtype: float64
# Una forma de obtener la brecha salarial (sin ajustar)
for i in anos:
brecha = (brecha_df.groupby(["year", "sexo"])["salario_hora"].describe().loc[:, "mean"][(i,6)] -
brecha_df.groupby(["year", "sexo"])["salario_hora"].describe().loc[:, "mean"][(i,1)])
print(f"La brecha salarial media no ajustada para el año {i} es {brecha: .4f} euros por hora")
La brecha salarial media no ajustada para el año 2010 es -2.7919 euros por hora La brecha salarial media no ajustada para el año 2014 es -2.5007 euros por hora La brecha salarial media no ajustada para el año 2018 es -2.4225 euros por hora
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import kde
# Graficamos la densidad del salario por hora ajustada no parametricamente.
year_df = brecha_df.groupby("year")["salario_hora"]
for yrs in year_df.groups.keys():
data = brecha_df.loc[year_df.groups[yrs], "salario_hora"]
density = kde.gaussian_kde(data)
x = np.linspace(1,50,100)
y = density(x)
plt.plot(x, y, label = yrs)
plt.title("Densidad del salario por hora")
plt.xlabel("Euros por hora")
plt.legend()
plt.show()