Introducción

Con la intención de generar un código reproducible, fácil y entendible, se elabora el siguiente código para poder generar un primer análisis del Cuestionario Sociodemográfico de la ENOE. El código abarca los siguientes pasos:

Sin antes se ha de mencionar que, al ser un análisis sencillo no se profundiza teóricamente el diseño de muestra y en los supuestos de regresión, por lo que es tarea de la persona lectora de este código buscar la información complementaría.

Asimismo, se agradece cualquier tipo de comentario para mejorar el código. :D

Contexto

De acuerdo con el sitio oficial de INEGI, la Encuesta Nacional de Ocupación y Empleo (ENOE) es la principal fuente de información sobre el mercado laboral mexicano al ofrecer datos mensuales y trimestrales de la fuerza de trabajo, la ocupación, la informalidad laboral, la subocupación y la desocupación. Constituye también el proyecto estadístico continuo más grande del país al proporcionar cifras nacionales y de cuatro tamaños de localidad, de cada una de las 32 entidades federativas y para un total de 39 ciudades.

Objetivos Generales de la ENOE

La base de datos de la ENOE está conformada por cinco tablas, la Vivienda, el Hogar, el Sociodemográfico y el Cuestionario de Ocupación y Empleo el cual se divide en dos tablas por su longitud, en estas se almacena toda la información captada por la encuesta. En cada una de las tablas de datos se describe el nombre del mnemónico de los campos que la conforman y para cada uno de ellos, se define su tipo de datos (numérico o alfanumérico), su longitud, sus códigos válidos y su descripción referencial. Sí se utiliza la base de datos de cualquier año a partir de 2009 en adelante, se deben de tomar en cuenta la estructura de las tablas de datos en su versión ampliada.

Marco de la Muestra

El diseño muestral de la ENOE se caracteriza por ser probabilístico, por lo cual los resultados obtenidos de la encuesta se generalizan a toda la población, a su vez es bietápico, estratificado y por conglomerados, donde la unidad última de observación es la persona que al momento de la entrevista tenga 15 años cumplidos o más de edad.

Para la selección de la submuestra de la encuesta se utilizó la Muestra Maestra 2012, a partir de la cual se seleccionan las submuestras para todas las encuestas en viviendas que realiza el INEGI. El diseño de la Muestra Maestra es probabilístico, estratificado, unietápico y por conglomerados, estos últimos constituyen las unidades primarias de muestreo, pues es en ellos donde se seleccionan, en una segunda etapa, las viviendas que integran las muestras de las diferentes encuestas.

Cuestionario Sociodemográfico

En la tabla sociodemográfico se almacenan las Características de los residentes de hogar, como es la condición de residencia, la edad, el sexo, etc., datos que son captados en las preguntas 5 a 23 del cuestionario sociodemográfico.

La información de carácter sociodemográfico, junto con la de características ocupacionales, permiten conocer el contexto familiar y social que determina la participación o no de la población en el mercado laboral, lo cual, además de su importancia intrínseca, amplía las posibilidades de los análisis con enfoque de género, situación que quedaba muy limitada bajo los esquemas tradicionales de información.

A partir del tercer trimestre de 2021, la ENOEN aplica una versión actualizada de dichos instrumentos, en el que se incluyen preguntas de migración en el cuestionario sociodemográfico y preguntas de lugar de trabajo en el cuestionario de ocupación y empleo.

Utilizaremos este cuestionario como fuente de datos e información para realizar el análisis y regresión.

Previos

Preparar ambiente de trabajo

Se recomienda iniciar un nuevo proyecto de trabajo en R, y seguir la siguiente estructura de carpetas:

Directorio: enoe

  • data
    • raw
      • ENOE_SDEMTxxx.xxx
    • process
  • src
    • 00-Descarga_Lecutra
    • 01-Limpieza
    • 02-Inferencia
    • 03-Regresion
  • img
  • complementos (pdfs de diseño, manuales, etc, referentes a la enoe)

Librerías de trabajo

A continuación, se enlistas las librerías a utilizar, mismas que serán mencionadas a lo largo del código para poder identificar el uso que tienen.

El siguiente código instala las paqueterías necesarias en caso de no contar previamente con ellas y posteriormente las carga.

if(!require('pacman')) install.packages('pacman')
pacman::p_load(tidyverse,#manipulación de datos
               janitor,#limpieza y tablas de frecuencia
               foreign,#abrir archivos de distintas extenciones
               survey, srvyr, # diseño de encuestas
               scales,#escalas numericas
               broom,#formatos tidy
               GGally,#graficos simultaneos
               tidymodels)#modelos
options(scipen = 999) #notación cientifica

Descarga

Con el siguiente código descargamos los datos directamente de INEGI y creamos un directorio temporal de trabajo para no cargar la descarga en el actual y liberar memoria, asimismo, se descarga en la dirección de carpetas previamente creada (data/raw) y descomprime, posteriormente se carga el Cuestionario Sociodemográfico SDEMT en nuestro ambiente de trabajo y se elimina el directorio temporal y se librera de la memoria los objetos creados. Para este ejercicio, utilizaremos los datos correspondientes al primer trimestre del 2024.

# url del archivo
url <- "https://www.inegi.org.mx/contenidos/programas/enoe/15ymas/microdatos/enoe_2024_trim1_dbf.zip"
# creación de directorio temporal
td <- tempdir()
# descarga del archivo temporal
tf <-  tempfile(tmpdir=td, fileext=".zip")
download.file(url, tf)
# unzip y crear ruta de carpetas
unzip(tf, exdir="data/raw", overwrite=TRUE)
# cargo en ambiente
sdemt124_raw <-read.dbf('data/raw/ENOE_SDEMT124.dbf')
# elimino td
unlink(td)
unlink(tf)
rm(td,tf,url)

Limpieza

Una forma adecuada de trabajar con los datos es teniendo las variables de forma homogénea y en el formato adecuado. Para ello, observamos cuál es la estructura de nuestra base de datos.

La estructura de la base del cuestionario sdem es la siguiente:

#Estructura de la base de datos
glimpse(sdemt124_raw)
#Alternativamente
#skimr::skim_without_charts(sdemt124)

Observamos que las variables están en mayúsculas, con espacios definidos por guiones y sin acentos. La función ‘clean_names’ de la librería janitor, convierte los nombres de las variables en un formato de minúsculas, sin acentos y con separaciones por guiones.

sdemt124 <- sdemt124_raw %>% 
  janitor::clean_names()#titulos formato snake_case

Para aplicar el filtro y debido a que el código en dbf se obtiene con la variable edad en tipo factor, convertimos está a tipo numérica en una nueva columna para facilitar la tarea, asimismo, con la variable lugar de nacimiento sucede lo mismo.

#Edad
sdemt124$edad <- as.numeric(as.character(sdemt124$eda))
class(sdemt124$edad)
## [1] "numeric"
#Lugar de nacimiento
sdemt124$lnac <- as.numeric(as.character(sdemt124$l_nac_c))

Filtro general de la ENOE

La ENOE para el cuestionario SDEM tiene un filtro el cual debe ser aplicado para obtener los datos con los cuales se presentan las cifras oficiales. Estos filtros contemplan:

  • Población mayor de 15 años
  • Entrevistas completas
  • Personas residentes
#Criterio general: R_DEF=’00’ AND (C_RES=’1’ OR C_RES=’3’) AND (EDA>=’15’ AND EDA<=’98’)
#r_def == 00 : Entrevista Completa
#c_res == 01 | 03 : Residentes
#edad  >= 15 & <= 98 : En edad legal de laborar

#Confirmación INEGI: 59,120,905 población ocupada
sdemt124 %>% 
  filter(r_def == "00",
        (c_res == "1" | c_res == "3"),
        edad >= 15 & edad <=98)%>%
  filter(clase2 == 1) %>%
  summarise(total = sum(fac_tri))
##      total
## 1 59120905

Al obtener el resultado del código anterior podemos cruzar los resultados con los tabulados de la ENOE, sin embargo, para realizar inferencia estadística, es necesario aplicar el diseño con el cual fue construida la muestra, para ello, se utilizan las librerías surve y srvyr, ambas pueden combinarse, por lo que, para el filtrado de datos, podemos utilizar srvyr ya que es una versión más actualizada que se construyó con dplyr.

Diseño Muestral

Para establecer el diseño de la encuesta haremos uso de la función svydesign. Comenzaremos especificando nuestro conjunto de datos, a continuación, dentro de la función establecemos los siguientes argumentos: id = ~upm para identificar las Unidades Primarias de Muestreo (UPM). La opción strata = ~est_d_tri nos permite definir las estratificaciones dentro de nuestra muestra. Por otro lado, weights = ~fac_tri asigna la variable que actúa como ponderador o factor de expansión, el cual es esencial para ajustar los resultados a la población total. Cabe mencionar que, dentro de las variables, la terminación _tri, corresponde a los factores trimestrales, ya que, si ocupamos los valores mensuales, debemos indicar _men, para este caso, Finalmente, el parámetro nest = TRUE indica que las UPM pueden estar organizadas en estructuras más complejas, reconociendo así la presencia de niveles (o capas anidadas) dentro de la muestra.

# Escenario 1: Muestreo aleatorio
dma <- svydesign(id = ~1,#indica el Muestreo Aleatorio Simple
                 data = sdemt124)
svy1 <- svymean(~ingocup,#variable
                dma,#diseño de muestra
                na.rm=TRUE,#elima na
                deff = TRUE)#calcula el efecto de diseño

#Calcular en porcentaje el Coeficiente de Variación de la estimación svy1
cv1 <- (cv(svy1) * 100) %>% round(3)
# Escenario 2: Muestreo por conglomerados
dms <- svydesign(id = ~upm,#UPM 
                 weights = ~fac_tri,#Pesos
                 data = sdemt124,#datos
                 nest = TRUE)#datos anidados en UPM
svy2 <- svymean(~ingocup, dms, na.rm=TRUE, deff = TRUE)
cv2 <- (cv(svy2) * 100) %>% round(3)

# Escenario 3: Muestreo complejo
dmc <- svydesign(id = ~upm,#Unidades Primarias de Muestreo
                 strata = ~est_d_tri, #Estrato del diseño
                 weights = ~fac_tri, #Factor de expansión
                 data = sdemt124,
                 nest = TRUE) #Diseño anidado
svy3 <- svymean(~ingocup, dmc, na.rm=TRUE, deff = TRUE)
cv3 <- (cv(svy3) * 100) %>% round(3)


comparacion <- t(c(cv1, cv2, cv3)) %>% #vector transpuesto 
  data.frame()#crear data.frame
colnames(comparacion) <- c("Aleatorio simple", "Conglomerados", "Complejo: conglomerados y estratificado")#nombres de columnas


resultados <- bind_rows(
  data.frame(Escenario = "Muestreo aleatorio simple",#nombre en fila de columna Escenario
             Estimador = coef(svy1)[[1]],#selecciona el primer elemento, que es la estimación de la media.
             CV = cv1),#variable creada con el valor de cv1
  data.frame(Escenario = "Muestreo por conglomerados",
             Estimador = coef(svy2)[[1]],
             CV = cv2),
  data.frame(Escenario = "Muestreo complejo",
             Estimador = coef(svy3)[[1]],
             CV = cv3)
)

print(resultados)
##                              Escenario Estimador ingocup
## ingocup...1  Muestreo aleatorio simple  3068.296   0.328
## ingocup...2 Muestreo por conglomerados  2803.294   0.887
## ingocup...3          Muestreo complejo  2803.294   0.735
rm(dma,dmc,dms,cv1, cv2,cv3, svy1,svy2,svy3, comparacion, resultados)

Como se observa en los resultados, al aplicar el diseño de la muestra a los datos, se obtienen estimadores diferentes al aplicar diferentes diseños de muestra, por lo que se debe tener cuidado con las conclusiones que se realizan cuando se trabaja con datos de muestra compleja.

Análisis Inferencial

Bajo el supuesto de que los datos se comportan como una distribución normal, tal que se observa de la siguiente manera:

ggplot(data = data.frame(x = c(-3,  3)),    aes(x)) +
  stat_function(fun = dnorm,    n   = 1000, args    = list(mean = 0,    sd  = 1))   + ylab("")  +
  scale_y_continuous(breaks = NULL)+ 
  labs(title = "Distribución normal")+
  theme_minimal()

Realizamos las siguientes pruebas para evaluar la validez de las estimaciones, a pesar de que como se mencionó antes, ambas librerías pueden combinarse, se realiza el código para las dos para comparar los resultados y conocer el código en cada una.

#Prueba de survey
sdemt124_survey <- svydesign(id = ~upm,#Unidades Primarias de Muestreo
                             strata = ~est_d_tri, #Estrato del diseño
                             weights = ~fac_tri, #Factor de expansión
                             data = sdemt124,
                             nest = TRUE)#Diseño anidado 

sdemt124_survey2 <- subset(sdemt124_survey,
                           subset = (r_def == "00" & (c_res == "1" | c_res == "3") & edad >= 15 & edad <= 98 & clase2 == 1))

Con la librería srvyr podemos realizar operaciones con el pipe %>%, esto es útil para poder realizar el filtrado de nuestras variables en la base de datos de una manera más fácil.

#Prueba con srvyr
sdemt124_srvy <- sdemt124 %>%
  as_survey_design(
    ids = upm, # Unidades Primarias de Muestreo
    strata = est_d_tri, # Estrato del diseño
    weights = fac_tri, # Factor de expansión
    nest = TRUE # Diseño anidado
  )

sdemt124_srvy <- sdemt124_srvy %>% 
  filter(r_def == "00",
        (c_res == "1" | c_res == "3"),
        edad >= 15 & edad <=98)%>% 
  filter(clase2 == 1)

# Calcular población ocupada
sdemt124_srvy %>% 
  filter(r_def == "00",
        (c_res == "1" | c_res == "3"),
        edad >= 15 & edad <=98)%>% 
  filter(clase2 == 1) %>% 
  summarise(total = sum(fac_tri))
## # A tibble: 1 × 1
##      total
##      <int>
## 1 59120905

Al calcular el resultado total, comprobamos que se obtienen los mismos resultados que con el filtro realizado solamente con el ponderador, por lo que podemos guardar nuestra base como un nuevo objeto para poder realizar la inferencia y las estimaciones con esta.

#Prime diseño
ts.survey <- svyttest(ingocup ~ 1, sdemt124_survey2)

#Segundo diseño
ts.srvyr <- svyttest(ingocup ~ 1, sdemt124_srvy)

# Extraer la información relevante
results <- data.frame(
  Test = c("ts.survey", "ts.srvyr"),
  Mean = c(ts.survey$estimate, ts.srvyr$estimate),
  `95% CI Lower` = c(confint(ts.survey)[1, 1], confint(ts.srvyr)[1, 1]),
  `95% CI Upper` = c(confint(ts.survey)[1, 2], confint(ts.srvyr)[1, 2]),
  P.value = c(ts.survey$p.value, ts.srvyr$p.value),
  Statistic = c(ts.survey$statistic[[1]], ts.srvyr$statistic[[1]]),
  DF = c(ts.survey$parameter[[1]], ts.srvyr$parameter[[1]])
)

# Imprimir la tabla de resultados
print(results)
##        Test     Mean X95..CI.Lower X95..CI.Upper P.value Statistic    DF
## 1 ts.survey 6140.826      6058.876      6222.776       0  146.8761 20390
## 2  ts.srvyr 6140.826      6058.876      6222.776       0  146.8761 20390
rm(results, ts.srvyr, ts.survey, sdemt124_survey2)

Análisis de la insersión laboral de las personas migrantes en México

A partir de aquí, los datos referidos se realizan en función de las personas migrantes, para lo cual se observa que la variable codificada como l_nac_c identifica de acuerdo al lugar de nacimiento a las personas migrantes.

# Escenario Muestreo complejo
sdemt124_srvy <- as_survey_design(
  .data = sdemt124,
  ids = upm, # Unidades Primarias de Muestreo
  strata = est_d_tri, # Estrato del diseño
  weights = fac_tri, # Factor de expansión
  nest = TRUE # Diseño anidado
  )

# Personas nacidas en México ocupadas
nmig_srvy <- sdemt124_srvy %>% 
  filter(r_def == "00",
        (c_res == "1" | c_res == "3"),
        edad >= 15 & edad <=98)%>% 
  filter(clase2 == 1) %>% 
  filter(lnac < 32)

# Personas Migrantes Ocupadas
mig_srvy <- sdemt124_srvy %>% 
  filter(r_def == "00",
        (c_res == "1" | c_res == "3"),
        edad >= 15 & edad <=98)%>% 
  filter(clase2 == 1) %>% 
  filter(lnac > 33)

#General
grnl_srvy <- sdemt124_srvy %>% 
  filter(r_def == "00",
        (c_res == "1" | c_res == "3"),
        edad >= 15 & edad <=98)%>% 
  filter(clase2 == 1)

Cabe resaltar que, existe una no respuesta al ingreso, por lo que de acuerdo con la consideración que se tome respecto al objetivo del estudio, se aplicará la estrategia adecuada para eliminar o estimar el ingreso de las personas que no lo reportan, respecto a esto, existen diferentes investigaciones realizadas para estimar o impputar el ingreso no reportado. Para este caso y con fines prácticos, omitiremos aplicar algun método para estimar el ingreso no reportado.

Breve Análisis inferencial

#Promedio
grnl_srvy %>%
  summarize(media = survey_mean(ingocup, na.rm = TRUE))
## # A tibble: 1 × 2
##   media media_se
##   <dbl>    <dbl>
## 1 6141.     41.8
# Test
svyttest(ingocup ~ 1, grnl_srvy)
## 
##  Design-based one-sample t-test
## 
## data:  ingocup ~ 1
## t = 146.88, df = 20390, p-value < 0.00000000000000022
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  6058.876 6222.776
## sample estimates:
##     mean 
## 6140.826

De acuerdo a lo resultados, el ingreso promedio de las personas ocupadas en México es de 6,140.82 pesos, con un intervalo de confianza al 95% entre 6,085.87 y 6,222.77 pesos.

Diferencia entre dos medias
#Variable Persona Migrante
grnl_srvy <- grnl_srvy %>%
  mutate(migrante = ifelse(lnac > 33, 1, 0))

# Calcular el ingreso promedio para migrantes y no migrantes
grnl_srvy %>%
  group_by(migrante) %>%
  summarize(media_ingreso = survey_mean(ingocup, na.rm = TRUE))
## # A tibble: 2 × 3
##   migrante media_ingreso media_ingreso_se
##      <dbl>         <dbl>            <dbl>
## 1        0         6140.             41.9
## 2        1         6303.            417.
# Prueba t para comparar las medias
svyttest(ingocup ~ migrante, design = grnl_srvy)
## 
##  Design-based t-test
## 
## data:  ingocup ~ migrante
## t = 0.3911, df = 20390, p-value = 0.6957
## alternative hypothesis: true difference in mean is not equal to 0
## 95 percent confidence interval:
##  -656.1413  983.2518
## sample estimates:
## difference in mean 
##           163.5553

Prueba de Hipotesís

\[H_{o}: μ_{1} – μ_{2} = 0\] \[H_{a}: μ_{1} – μ_{2} ≠ 0\]

Respecto al ingreso de las personas migrantes y no migrantes, se obtiene que el ingreso de las personas migrantes es de 6,303.47 pesos y para las personas no migrantes de 6,139.91 pesos. Con un intervalo de confianza al 95% la diferencia de ingresos se encuentra entre -656.14 y 983.25 pesos, con un promedio de 163.55 pesos. Sin embargo, con el valor p de 0.6957 el cual es considerablemente mayor que el umbral típico de 0.05, significa que no hay evidencia estadísticamente significativa para rechazar la hipótesis nula. En otras palabras, no podemos concluir que hay una diferencia real en los ingresos ocupacionales entre migrantes y no migrantes

Análisis Descriptivo

El siguiente paso es describir la dinamica de la inserción laboral de las personas migrantes y las caracteristicas de las personas migrantes ocupadas dentro del mercado de trabajo en México. Para ello, revisaremos por variable las siguientes:

  • Ocupación
  • Escolaridad, Edad, Sexo
  • Sector
  • Actividad
  • Ingreso

Aunque puede realizarse un análisis más profundo con la información proporcionada por la ENOE, omitiremos esto con el fin de hacer práctico el análisis.

Ocupación

Respecto a la inserción de personas migrantes en el mercado de trabajo en México, se tienen los siguietes tabulados:

#Número de personas migrantes en México
sdemt124_srvy %>% 
  filter(r_def == "00",
        (c_res == "1" | c_res == "3"),
        edad <=98)%>% 
  filter(lnac > 33) %>% 
  group_by(sex) %>% 
  summarise(total = survey_total()) %>% 
  mutate(percentage = total / sum(total) * 100) %>% 
  adorn_totals()
##    sex  total total_se percentage
##      1 465578 22075.06   49.69123
##      2 471364 22889.02   50.30877
##  Total 936942 44964.08  100.00000

En México hay 936,942 personas migrantes, de las cuales 465,578 son hombres (49.70%) y 471,364 son mujeres (50.30%).

#Número de personas migrantes ocupadas en México
sdemt124_srvy %>% 
  filter(r_def == "00",
        (c_res == "1" | c_res == "3"),
        edad >= 15 & edad <=98)%>% 
  filter(clase2 == 1) %>% 
  filter(lnac > 33) %>% 
  group_by(sex) %>% 
  summarise(total = survey_total()) %>%
  select(-total_se) %>% 
  mutate(percentage = total / sum(total) * 100) %>% 
  adorn_totals()
##    sex  total percentage
##      1 195641   59.65592
##      2 132308   40.34408
##  Total 327949  100.00000

Del total de personas migrantes en el país, 327,949 personas, es decir, el 35%, estan ocupadas, de las cuales el 59.66% son hombres y 40.34% mujeres. Por otra parte, el 63.60% se encuentra ocupada en la informalidad laboral, es decir, 208,604 personas migrantes, donde las mujeres representan el 39.29% y los hombres el 60.71%.

#Condición de ocupación
informalidad <- sdemt124_srvy %>% 
  filter(r_def == "00",
        (c_res == "1" | c_res == "3"),
        edad >= 15 & edad <=98)%>% 
  filter(clase2 == 1) %>%
  filter(lnac > 33) %>%
  filter(emp_ppal == 1) %>% 
  group_by(sex) %>% summarise(total = survey_total()) %>%
  select(-total_se) %>% 
  mutate(percentage = total / sum(total) * 100) %>% 
  as.data.frame()

print(informalidad)
##   sex  total percentage
## 1   1 126651    60.7136
## 2   2  81953    39.2864
informalidad %>% 
  ggplot()+
  geom_col(aes(y=total,x=sex, fill = sex), width = .5)+
  labs(title = "Número de personas migrantes en formalidad laboral vs informalidad laboral",
       subtitle = "Clasificación respecto de la primera actividad",
       caption = "Elaboración propia con datos de la ENOE, 2024-1T",
       y = "", 
       x= "")+
  scale_x_discrete(labels =c("Hombre", "Mujer"))+
  scale_y_continuous(labels = comma)+
  scale_fill_manual(values = c("1" = "#581845", "2" = "#FF5733"))+
  theme_minimal()+
  theme(legend.position = "none")  # Quitar la leyenda

Labores domésticas

A pesar de que en México las labores de cuidado no son reconocidas legalmente como labores formales, se halla que, el 86% de las mujeres se encuentran en situación de inactividad por condición que quehaceres domésticos. Sin embargo, al desagregar la información respecto a la población economicamente activa y con quehaceres domésticos, el 54.42 de los hombres se encuentran en esta situación, mientras que las mujeres en un 45.58%.

#Pob No Activa y Disponible por condición de inactividad en quehaceres domésticos
sdemt124_srvy %>% 
  filter(r_def == "00",
        (c_res == "1" | c_res == "3"))%>% 
  filter(lnac > 33) %>% 
  group_by(c_inac5c == 2, sex) %>% 
  summarise(total = sum(fac_tri)) %>%
  mutate(percentage = total / sum(total) * 100) 
## # A tibble: 4 × 4
## # Groups:   c_inac5c == 2 [2]
##   `c_inac5c == 2` sex    total percentage
##   <lgl>           <fct>  <int>      <dbl>
## 1 FALSE           1     449303       54.8
## 2 FALSE           2     370648       45.2
## 3 TRUE            1      16275       13.9
## 4 TRUE            2     100716       86.1
#PEA por condición de actividad de quehaceres domésticos
sdemt124_srvy %>% 
  filter(r_def == "00",
        (c_res == "1" | c_res == "3"))%>% 
  filter(lnac > 33) %>% 
  group_by(domestico == 3, sex) %>% 
  summarise(total = survey_total()) %>%
  select(-total_se) %>% 
  mutate(percentage = total / sum(total) * 100)
## # A tibble: 4 × 4
## # Groups:   domestico == 3 [2]
##   `domestico == 3` sex    total percentage
##   <lgl>            <fct>  <dbl>      <dbl>
## 1 FALSE            1     326634       47.9
## 2 FALSE            2     354989       52.1
## 3 TRUE             1     138944       54.4
## 4 TRUE             2     116375       45.6
Seguridad Social

Respecto al acceso a servicios de seguridad social como servicios de salud, entre otros, de las poco más de trecientas mil personas migrantes ocupadas tan solo 83,388 mil personas cuentan con seguridad social, de las cuales el 57.41% son los hombres, mientras que tan solo el 42.59% de las mujeres trabajadoras tiene acceso a estos servicios.

# Población migrante ocupada con prestaciones sociales
sdemt124_srvy %>% 
  filter(r_def == "00",
        (c_res == "1" | c_res == "3"),
        edad >= 15 & edad <=98)%>% 
  filter(clase2 == 1) %>% 
  filter(lnac > 33) %>% 
  filter(medica5c == 3) %>% 
  group_by(sex) %>% 
  summarise(total = survey_total()) %>%
  select(-total_se) %>% 
  mutate(percentage = total / sum(total) * 100) %>% 
  adorn_totals()
##    sex total percentage
##      1 47876   57.41354
##      2 35512   42.58646
##  Total 83388  100.00000
Escolaridad

En lo que respecta a la escolaridad de las personas migrantes ocupadas en México, se encuentra que:

## # A tibble: 1 × 2
##   `Años de Escolaridad` `Años de Escolaridad_se`
##                   <dbl>                    <dbl>
## 1                  12.8                    0.271
## # A tibble: 2 × 3
##   sex   `Años de Escolaridad` `Años de Escolaridad_se`
##   <fct>                 <dbl>                    <dbl>
## 1 1                      12.5                    0.352
## 2 2                      13.1                    0.339

De acuerdo a los datos, la escolaridad promedio de las personas migrantes ocupadas es de 12.75 años, por sexo se tiene que los hombres tienen en promedio 12.50 años de escolaridad mientras que las mujeres tienen en promedio 13.12 años de escolaridad.

# Filtramos los datos validos para años de educación
mig_srvy %>%
  filter(anios_esc < 98) %>% 
# Creamos una nueva variable que agrupe la edad en rangos de cinco años
  mutate(edad_rango = cut(edad, breaks = seq(0, 100, by = 5), labels = paste(seq(0, 95, by = 5), "-", seq(5, 100, by = 5), sep = ""))) %>% 
# Creamos el gráfico de cajas
  ggplot(aes(x = edad_rango, y = anios_esc)) +
  geom_boxplot() +
  labs(title= "Distribución de los años de escolaridad por sexo y edad",
       x = "Edad (Rangos de 5 años)", y = "Años de Escolaridad",
       caption = "Elaboración propia con datos de la ENOE, 2024-1T") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+  # Rotamos los etiquetas del eje x para mejor
  facet_wrap(~sex, labeller = as_labeller(c("1" = "Hombre","2" = "Mujer")))

Lo que observamos en las anteriores grafícas refleja que las mujeres de mayor edad tienen más años de estudios en comparación con los hombres, quienes mantienen en promedio de los 20 a los 65 el mismo promedio en años de estudios, a difirencia de las mujeres quienes tienen mayores variaciones por encima del promedio para el mismo rango de edad.

Sector y Actividad económica de las personas migrantes

Respecto al principal sector de actividad en el cual se hallan ocupadas las personas migrantes es el sector de las actividades de servicios, mismo que abarca el 46.16% de las personas migrantes ocupadas, es decir, 1,513,366 personas; seguido a este sector de actividades, el comercio con el 18.42% de personas migrantes ocupadas y el sector manufacturero con el 8.41%.

#Personas migrantes ocupadas por sector de actividad
ram_act <- mig_srvy %>%
  mutate(rama = factor(rama, labels = c("Construcción","Industria manufacturera","Comercio","Servicio","Agropecuario","Otros","No especificado"),
                  levels = c(1,2,3,4,5,6,7))) %>% 
  group_by(rama) %>%
  summarise(total = survey_total()) %>%
  mutate(porcentaje = round(total / sum(total) * 100, 2)) %>% 
  adorn_totals() %>%
  select(-total_se) %>% 
  as.data.frame()
print(ram_act)
##                      rama  total porcentaje
## 1            Construcción  18755       5.72
## 2 Industria manufacturera  27568       8.41
## 3                Comercio  45854      13.98
## 4                Servicio 151366      46.16
## 5            Agropecuario   1431       0.44
## 6                   Otros  22578       6.88
## 7         No especificado  60397      18.42
## 8                   Total 327949     100.01
#Personas migrantes ocupadas por sector de actividad por tipo de condición
mig_srvy %>%
  mutate(rama = factor(rama, labels = c("Construcción","Industria manufacturera","Comercio","Servicio","Agropecuario","Otros","No especificado"),
                  levels = c(1,2,3,4,5,6,7))) %>% 
  group_by(rama, sex, emp_ppal) %>% 
  summarise(total = sum(fac_tri)) %>% 
  ggplot()+
  geom_col(aes(x=reorder(rama, total, decreasing = TRUE), y=total, fill = factor(emp_ppal)),
           position = "dodge")+
  scale_fill_manual(values = c("1" = "#1f77b4", "2" = "#ff7f0e"),
                    name = "Tipo de condición",
                    labels = c("1" = "Informal", "2" = "Formal")) +
  scale_y_continuous(labels = comma)+
  labs(title = "Personas migrantes ocupadas por sector de actividad",
       subtitle = "por sexo y tipo de condición formar e informal",
       caption = "Elaboración propia con datos de la ENOE, 2024-1T",
       x = "Subsector de actividad")+
  facet_wrap(~sex,
             labeller = as_labeller(c("1" = "Hombres","2" = "Mujeres")),
             scales = "free",
             ncol = 1)+
  theme_minimal()

#Personas migrantes ocupadas por sector de actividad por tipo de condición
mig_srvy %>%
  mutate(rama = factor(rama, labels = c("Construcción","Industria manufacturera","Comercio","Servicio","Agropecuario","Otros","No especificado"),
                  levels = c(1,2,3,4,5,6,7))) %>%
  filter(emp_ppal==1) %>% 
  group_by(rama, sex) %>% 
  summarise(total = survey_total()) %>%
  select(-total_se) %>% 
  pivot_wider(names_from = sex, 
              values_from = total,
              values_fill = 0) %>% 
  rename(Hombre = `1`, Mujer = `2`) %>% 
  adorn_totals() %>% 
  adorn_percentages("col") %>% 
  adorn_pct_formatting()
##                     rama Hombre  Mujer
##             Construcción  10.9%   0.1%
##  Industria manufacturera   5.5%   7.8%
##                 Comercio  12.7%  16.5%
##                 Servicio  30.8%  41.4%
##                    Otros  14.1%   5.0%
##          No especificado  26.0%  29.2%
##                    Total 100.0% 100.0%

Respecto a la condición de informalidad laboral, el 41.4% de las mujeres que se emplean en la informalidad laboral se emplean en actividades del sector servicios, mientras que los hombres representan el 30.8%, seguido de este sector de actividad, otras actictividades no identificadas dentro de un sector de acuerdo a los criterios de INEGI se tiene un gran porsentaje de ocupación.

Ingreso laboral de las personas migrantes

Como se comento previamente, el análisis se realizo en determinadas variables por lo que este proceso puede realizarse con el resto de variables del cuestionario sociodemográfico, ya sea para profundizar en el tema y conocer más respecto a la población migrante o para responder directamente a las preguntas de nuestro intéres. Para este caso, finalmente analizaremos el ingreso.

#Ingres por hora
mig_srvy %>%
  summarise("Ingreso por Hora" = survey_mean(ing_x_hrs, vartype = c("ci", "cv")))
## # A tibble: 1 × 4
##   `Ingreso por Hora` `Ingreso por Hora_low` `Ingreso por Hora_upp`
##                <dbl>                  <dbl>                  <dbl>
## 1               43.0                   35.1                   50.9
## # ℹ 1 more variable: `Ingreso por Hora_cv` <dbl>
#Ingreso mensual
mig_srvy %>% 
  group_by(sex) %>% 
  summarise("Ingreso Mensual" = survey_mean(ingocup, vartype = c("ci", "cv")))
## # A tibble: 2 × 5
##   sex   `Ingreso Mensual` `Ingreso Mensual_low` `Ingreso Mensual_upp`
##   <fct>             <dbl>                 <dbl>                 <dbl>
## 1 1                 7289.                 6218.                 8360.
## 2 2                 4847.                 3780.                 5914.
## # ℹ 1 more variable: `Ingreso Mensual_cv` <dbl>

Respecto al ingreso, se estima que el ingreso por hora es de 42.98 pesos y el ingreso mensual de 6303.474 pesos. Por sexo, los hombres ganan 7288.57 pesos mensuales mientras que las mujeres 4846.82 pesos.

#Ingresos por grado de estudios
mig_srvy %>% 
  filter(anios_esc < 98) %>% 
  group_by(anios_esc, sex) %>% 
  summarise(ingreso_mensual = survey_mean(ingocup)) %>% 
  select(-ends_with("_se")) %>% 
  pivot_wider(names_from = sex,
              values_from = ingreso_mensual,
              values_fill = 0) %>% 
  rename(Hombre = `1`, Mujer = `2`)
## # A tibble: 24 × 3
## # Groups:   anios_esc [24]
##    anios_esc Hombre Mujer
##        <int>  <dbl> <dbl>
##  1         0  3806. 1859.
##  2         1     0  7206.
##  3         2  9267. 4019.
##  4         3  9546. 4810.
##  5         4  5879. 7099.
##  6         5  7740. 3469.
##  7         6  8419. 2778.
##  8         7   961. 2150 
##  9         8  1590. 2286.
## 10         9  5767. 3386.
## # ℹ 14 more rows
#Gráfico ingresos por años de escolaridad
mig_srvy %>% 
  filter(anios_esc < 98,
         ingocup != 0) %>% 
  group_by(anios_esc, sex) %>% 
  summarise(ingreso_mensual = survey_mean(ingocup)) %>% 
  select(-ingreso_mensual_se) %>% 
  ggplot()+
  geom_point(aes(x=anios_esc, y=ingreso_mensual))+
  facet_wrap(~sex, 
             scales = "free",
             labeller = as_labeller(c("1" = "Hombres","2" = "Mujeres")))+
  theme_minimal()+
  labs(title = "Ingreso promedio por años de escolaridad",
       caption = "Elaboración propia con datos de la ENOE, 2024-1T",
       x = "años de escolaridad")

Se observa que conforme aumentan los años de escolaridad, el ingreso promedio mensual aumenta, asimismo también es observable que al cambiar la escala de ingresos se visualiza la diferencia en los ingresos para las mujeres a comparación a los hombres.

#Prueba T
svyttest(ingocup ~ sex, mig_srvy)
## 
##  Design-based t-test
## 
## data:  ingocup ~ sex
## t = -3.3818, df = 751, p-value = 0.0007575
## alternative hypothesis: true difference in mean is not equal to 0
## 95 percent confidence interval:
##  -3859.203 -1024.300
## sample estimates:
## difference in mean 
##          -2441.751

Respecto a la igualdad de ingresos, se obtiene que la media de los ingresos para hombres y mujeres tiene una diferencia en promedio de 2,441.75 pesos.

#Ingresos formalidad vs informalidad
mig_srvy %>%
  filter(anios_esc < 98, ingocup != 0) %>%
  mutate(emp_ppal = factor(emp_ppal, labels = c("Informalidad", "Formalidad"))) %>%
  group_by(anios_esc, sex, emp_ppal) %>%
  summarise(ingreso_mensual = survey_mean(ingocup)) %>%
  select(-ingreso_mensual_se) %>%
  ggplot(aes(x = anios_esc, y = ingreso_mensual, color = emp_ppal)) +
  geom_point() +
  facet_grid(sex ~ emp_ppal,
             labeller = labeller(sex = c("1" = "Hombres", "2" = "Mujeres"),
                                 emp_ppal = c("Informalidad", "Formalidad")),
             scales = "free") +
  scale_color_manual(values = c("Informalidad" = "#1f77b4", "Formalidad" = "#ff7f0e")) +
  theme_minimal() +
  labs(title = "Ingreso promedio por años de escolaridad",
       caption = "Elaboración propia con datos de la ENOE, 2024-1T") +
  guides(color = "none") # Quita guías por la variable de color

En el gráfico anterior se observa que, los ingresos para hombres y mujeres son mayores en promedio estando en la formalidad laboral.

#Ingreso por Sector de Actividad
mig_srvy %>% 
  mutate(rama = factor(rama, labels = c("Construcción","Industria manufacturera","Comercio","Servicio","Agropecuario","Otros","No especificado"),
                  levels = c(1,2,3,4,5,6,7))) %>% 
  group_by(rama) %>%
  summarise(ingreso_mensual = round(survey_mean(ingocup),2)) %>% 
  select(-ends_with("_se"))
## # A tibble: 7 × 2
##   rama                    ingreso_mensual
##   <fct>                             <dbl>
## 1 Construcción                    10468. 
## 2 Industria manufacturera          7125. 
## 3 Comercio                         7099. 
## 4 Servicio                         7893. 
## 5 Agropecuario                    33832. 
## 6 Otros                            4473. 
## 7 No especificado                    79.4

Por sector de actividad, los ingresos de las personas migrantes ocupadas en el sector agropecuario es el más alto, en promedio se tienen ingresos de 33,832.42 pesos al mes; en segundo 0lugar, los ingresos por actividades del sector de construcción tienden a ser en promedio de 10,468.50 pesos; y en tercer lugar las actividades de servicios, con un ingreso promedio de 7,893.09 pesos.

mig_srvy %>% 
  mutate(rama = factor(rama, labels = c("Construcción", "Industria manufacturera", "Comercio", "Servicio", "Agropecuario", "Otros", "No especificado"),
                       levels = c(1, 2, 3, 4, 5, 6, 7)),
         sex = factor(sex, levels = c(1, 2), labels = c("Hombres", "Mujeres"))) %>% 
  group_by(sex, rama) %>% 
  summarise(ingreso_mensual = round(survey_mean(ingocup), 2)) %>% 
  select(-ends_with("_se")) %>% 
  ggplot(aes(x = rama, y = ingreso_mensual, fill = sex)) +
  geom_col(position = "dodge") +
  scale_fill_manual(values = c("Hombres" = "#581845", "Mujeres" = "#FF5733"),
                    name = "Sexo") +
  scale_y_continuous(labels = comma) +
  labs(title = "Ingreso mensual promedio por sector de actividad",
       subtitle = "comparativo entre mujeres y hombres",
       caption = "Elaboración propia con datos de la ENOE, 2024-1T",
       x = "",
       y = "") +
  theme_minimal()+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Por sexo, se identifica que en todos los sectores de actividad los hombres perciben ingresos mayores a las mujeres.

Bibliografía

Diseño ENOE