Reconstrucción de variables

Análisis Demográfico

Jacob Hernández

2020-11-23

Archivos de la ENOE

read_enoe <- function(x) {
  foreign::read.dbf(x, as.is = TRUE) %>% 
  as_tibble() %>% 
  janitor::clean_names() }

coe1 <- 
  read_enoe(here::here("data/enoe_n_2020_trim3_dbf/enoen_coe1t320.dbf"))

coe2 <- 
  read_enoe(here::here("data/enoe_n_2020_trim3_dbf/enoen_coe2t320.dbf"))

sdem <- 
  read_enoe(here::here("data/enoe_n_2020_trim3_dbf/enoen_sdemt320.dbf"))

hog <- 
  read_enoe(here::here("data/enoe_n_2020_trim3_dbf/enoen_hogt320.dbf"))

Campos de Identificación Única para los cuestionarios

coe_id <- 
  c("cd_a", "ent", "con", "v_sel", "tipo", "mes_cal", "ca", "n_hog", "h_mud", "n_ren")

Población ocupada

ocup <- 
  coe1 %>%
  # Filtro de población ocupada
  filter(
    p1 == 1 
    | p1a1 == 1| (is.na(p1a1) & p1a2 == 2) 
    | as.numeric(p1c) %in% 1:4 | p1d == 1 
    | ((p1d %in% c(2,9)) & p1e == 1)
  )

Posición ocupacional

P3d: ¿ … tiene empleados o le ayudan personas en su negocio o actividad?
    1. Sí
    2. No

P3g: De las personas que ocupa o le ayudan a …, ¿cuántos son
    1. trabajadores que reciben un pago?
    2. socios?
    3. trabajadores sin pago?

P3h: ¿En este trabajo …
    1. recibe un pago?
    2. es un trabajador no familiar sin pago?
    3. es un trabajador familiar sin pago?

ocup %>% 
  mutate(
    pos_ocu2 = case_when(
      p3h == 1 ~ "1 | Trabajadores Subordinados y Remunerados",
      p3d == 1 & p3g1_1 == 1 ~ "2 | Empleadores",
      p3d %in% c(2, 9) 
      | (p3d == 1 & is.na(p3g1_1)) ~ "3 | Trabajadores por cuenta propia",
      p3h %in% 2:3 ~ "4 | Trabajadores sin pago",
      TRUE ~ "5 | No especificado"
    )
  ) %>% 
  # Comparación
  right_join(sdem, by = coe_id) %>% 
  count(pos_ocu, pos_ocu2)
# # A tibble: 5 x 3
#   pos_ocu pos_ocu2                                         n
#     <int> <chr>                                        <int>
# 1       0 <NA>                                        176558
# 2       1 1 | Trabajadores Subordinados y Remunerados  85472
# 3       2 2 | Empleadores                               5881
# 4       3 3 | Trabajadores por cuenta propia           24181
# 5       4 4 | Trabajadores sin pago                     4782

Sector económico

P4a: ¿A qué se dedica esta empresa, negocio o institución?

ocup %>% 
  mutate(
    p4a = as.numeric(p4a),
    rama2 = case_when(
      between(p4a, 2300, 2399) ~ "1 | Construcción",
      between(p4a, 3100, 3399) ~ "2 | Industria Manufacturera",
      between(p4a, 4300, 4399) 
      | between(p4a, 4600, 4699) ~ "3 | Comercio",
      between(p4a, 4800, 9399) ~ "4 | Servicios",
      between(p4a, 1200, 2299) ~ "5 | Otros Servicios",
      between(p4a, 1100, 1199) ~ "6 | Agropecuario",
      TRUE ~ "7 | No especificado"
    )
  ) %>% 
  # Comparación
  right_join(sdem, by = coe_id) %>% 
  count(rama, rama2)
# # A tibble: 8 x 3
#    rama rama2                            n
#   <int> <chr>                        <int>
# 1     0 <NA>                        176558
# 2     1 1 | Construcción              9867
# 3     2 2 | Industria Manufacturera  19881
# 4     3 3 | Comercio                 23594
# 5     4 4 | Servicios                55357
# 6     5 5 | Otros Servicios           1151
# 7     6 6 | Agropecuario              9696
# 8     7 7 | No especificado            770

Jornada laboral

P4: ¿Cuál es el nombre de la empresa, negocio o institución para la que … trabaja o ayuda?
    1. …
    2. El negocio no tiene nombre
    3. Es trabajador subordinado de una unidad doméstica o trabajador(a) de otro trabajador(a)
    4. Es un(a) trabajador(a) en el extranjero

P5: La semana pasada, ¿ … tuvo poco trabajo qué hacer?
    1. Sí
    2. No trabajó la semana pasada
    3. No se encontró en esa situación

P5b: ¿Qué días y cuántas horas le dedicó … a su trabajo la semana pasada?
    P5b_THRS: Total de número de horas en pregunta 5b.

ocup %>% 
  mutate(
    p5b_thrs = as.numeric(p5b_thrs),
    dur = case_when(
      p5 == 2 ~ "1 | Ausente con vínculo laboral",
      between(p5b_thrs,  0, 14) ~ "2 | Menos de 15 horas",
      between(p5b_thrs, 15, 24) ~ "3 | De 15 a 24 horas",
      between(p5b_thrs, 25, 39) ~ "4 | De 25 a 39 horas",
      between(p5b_thrs, 40, 48) ~ "6 | De 40 a 48 horas",
      between(p5b_thrs, 49, 998) ~ "7 | Más de 48 horas",
      p5b_thrs == 999 | p4 == 4 ~ "9 | No especificado"
    )
  ) %>% 
  # Comparación
  right_join(sdem, by = coe_id) %>% 
  count(dur9c, dur)
# # A tibble: 10 x 3
#    dur9c dur                                  n
#    <int> <chr>                            <int>
#  1     0 <NA>                            176558
#  2     1 1 | Ausente con vínculo laboral   7205
#  3     2 2 | Menos de 15 horas             8856
#  4     3 3 | De 15 a 24 horas             11988
#  5     4 4 | De 25 a 39 horas              9534
#  6     5 4 | De 25 a 39 horas              6757
#  7     6 6 | De 40 a 48 horas             45943
#  8     7 7 | Más de 48 horas              14135
#  9     8 7 | Más de 48 horas              15088
# 10     9 9 | No especificado                810

Condiciones críticas

Salario: Salario mínimo mensual correspondiente a su zona salarial.

P5e: ¿Cuál es el motivo principal por el que la semana pasada … no trabajó las horas habituales?
    1. Exceso de trabajo
    2. Obtener más ingresos
    3. Horas extras
    4. Temporada alta (clientes, ventas, siembra o cosecha)
    5. Reducción o suspensión del trabajo (falla de ventas o clientes, temporada baja, paro técnico)
    6. Término del contrato o temporada de trabajo
    7. Causas climatológicas
    8. Vacaciones o días festivos
    9. Enfermedad o accidente
    10. Cuidar o atender a niños, enfermos o ancianos
    11. Otros motivos personales o familiares
    12. Ninguno de los anteriores

P6b2: ¿Cuánto ganó o en cuánto calcula sus ingresos? (Cada 15 días)

P6c: Actualmente el salario mínimo mensual es de $, ¿la cantidad que … Obtiene al mes por su trabajo es
    1. menor?
    2. igual a esta cantidad?
    3. más de 1 salario mínimo hasta 2?
    4. más de 2 salarios mínimos hasta 3?
    5. más de 3 salarios mínimos hasta 5?
    6. más de 5 salarios mínimos hasta 10?
    7. más de 10 salarios mínimos?
    8. No quiso dar información

ocup %>% 
  # Unión con SDEM para conocer el salario mínimo de la región
  left_join(
    sdem %>% select(all_of(coe_id), salario), 
    by = coe_id
  ) %>% 
  # Unión con la 2da parte del cuestionario 
  # para conocer el salario o posición salarial del encuestado
  left_join(
    coe2 %>% select(all_of(coe_id), p6b2, p6c), 
    by = coe_id
  ) %>% 
  mutate(
    across(c(p5b_thrs, p6b2), as.numeric),
    tcco2 = case_when(
      (p5b_thrs < 35) 
      & (p5e %in% c("05","06")) ~ "1 | OH35RM",
      between(p5b_thrs, 35, 998) 
      & ((p6b2 >= 1 & p6b2 <= salario) | (p6c %in% 1:2)) ~ "2 | OH35SM",
      between(p5b_thrs, 49, 998) 
      & ((p6b2 > salario & p6b2 <= 2*salario) | p6c == 3) ~ "3 | OH48SM",
    )
  ) %>% 
  # Comparación
  right_join(sdem, by = coe_id) %>% 
  count(tcco, tcco2)
# # A tibble: 4 x 3
#    tcco tcco2           n
#   <int> <chr>       <int>
# 1     0 <NA>       270156
# 2     1 1 | OH35RM   4673
# 3     2 2 | OH35SM  10859
# 4     3 3 | OH48SM  11186

Población desocupada

desocup <- 
  coe1 %>% 
  filter(
    p1c == 11 
    | (p1b == 2 & (p2_1 == 1 | p2_2 == 2 | p2_3 == 3) & p2b == 1 & !(p2c %in% c(2,9))) 
    | ((p1d %in% c(2,9)) & (p2_1 == 1 | p2_2 == 2 | p2_3 == 3) & p2b == 1 & !(p2c %in% c(2,9)))
  )

# Comparación
desocup %>% 
  mutate(.id = 2) %>% 
  right_join(sdem, by = coe_id) %>% 
  count(clase2, .id)
# # A tibble: 5 x 3
#   clase2   .id      n
#    <int> <dbl>  <int>
# 1      0    NA  57735
# 2      1    NA 120316
# 3      2     2   6926
# 4      3    NA  24716
# 5      4    NA  87181

Duración del desempleo

P2a: ¿En qué fecha comenzó … a buscar trabajo (o comenzó con los preparativos para poner el negocio)?

D_*: Fecha del resultado definitivo

Nota: El número de días por mes se considera de 30.4.

dur <- 
  desocup %>% 
  # Unión con HOG para conocer el día de la encuesta
  left_join(
    hog %>% select(all_of(coe_id[-10]), d_dia:d_anio), 
    by = coe_id[-10]
  ) %>%
  mutate(
    across(c(p2a_dia:p2a_anio, d_dia:d_anio), as.numeric),
    tdias1 = ifelse(p2a_dia < 99 & p2a_dia > 0, p2a_dia, round(p2a_sem*7 - 3.5)),
    tdias1 = tdias1 + (p2a_mes-1)*30.4 + (p2a_anio-1)*365,
    tdias2 = d_dia + (d_mes-1)*30.4 + (2000+d_anio-1)*365,
    dias_trans = case_when(
      (p2a_dia == 99 & p2a_sem == 9) | p2a_mes == 99 | p2a_anio == 9999
      | (p2a_dia == 0 & p2a_sem == 0) | p2a_mes == 0 | p2a_anio == 0 
      | (is.na(p2a_dia) & is.na(p2a_sem)) ~ 999999,
      d_dia == 99 | d_mes == 99 | d_anio == 99 | d_dia == 0 | d_mes == 0 | d_anio == 0 ~ 999999,
      tdias2 < tdias1 ~ 999999,
      tdias2 == tdias1 ~ 1,
      T ~ round(tdias2 - tdias1)
    ),
    dur_des2 = as.numeric(cut(dias_trans, breaks = c(0,30,90,180,365,999998,999999), include.lowest = TRUE))
  ) 

# Comparación
dur %>% 
  left_join(sdem, by = coe_id) %>%
  count(dur_des, dur_des2)
# # A tibble: 10 x 3
#    dur_des dur_des2     n
#      <int>    <dbl> <int>
#  1       1        1  2625
#  2       1        2    92
#  3       2        2  2224
#  4       2        3    31
#  5       3        3  1239
#  6       3        4     6
#  7       4        4   294
#  8       5        2     1
#  9       5        5    32
# 10       6        6   382

De manera general, la reconstrucción realizada concuerda en la mayoría de los casos; hay algunos donde la clasificación propuesta difiere a la precodificada, esto puede ser por el redondeo.

Sin embargo hay un caso donde la diferencia es grande, el individuo está precodificado con 5 (Más de un año) y el proceso lo establece con 2 (Más de 1 mes y menor a 3).

dur %>% 
  left_join(sdem, by = coe_id) %>%
  select(p2a_dia:p2a_anio, d_dia:d_mes, dias_trans, dur_des, dur_des2) %>% 
  filter(dur_des != dur_des2)
# # A tibble: 130 x 9
#    p2a_dia p2a_sem p2a_mes p2a_anio d_dia d_mes dias_trans dur_des dur_des2
#      <dbl>   <dbl>   <dbl>    <dbl> <dbl> <dbl>      <dbl>   <int>    <dbl>
#  1      99       4       6     2020    25     7         31       1        2
#  2      15      NA       6     2020    30     7         45       1        2
#  3      99       2       6     2020    30     7         50       1        2
#  4      15      NA       6     2020    30     7         45       1        2
#  5      20      NA       6     2020    30     7         40       1        2
#  6      15      NA       6     2020    30     7         45       1        2
#  7      15      NA       6     2020    29     7         44       1        2
#  8       1      NA       6     2020    30     7         59       1        2
#  9      99       2       4     2020    10     7         91       2        3
# 10       1      NA       6     2020    22     7         51       5        2
# # ... with 120 more rows

Al observar en los casos discrepantes se observa que existe un error en la precodificación original, pues en la observación antes mencionada los datos muestran que tal persona sólo ha buscado empleo por 51 días, y en otras la diferencia es considerable, pues por 10, 15 ó 20 días están mal clasificadas, aún así el número de casos sólo asciende a 130.