T2: ENDISEG 2021

Previo

Descarga el proyecto desde acá

En esta liga puedes descarga el proyecto de trabajo. De esta manera no tendremos problemas con las rutas relativas.

https://tinyurl.com/demos-talleres

Video de la sesión

Paquetes

if (!require("pacman")) install.packages("pacman") # instala pacman si se requiere
Loading required package: pacman
pacman::p_load(tidyverse,
               haven, 
               readr,
               foreign,
               janitor,
               magrittr,
               pollster,
               srvyr,
               sjlabelled) #carga los paquetes necesarios 

En esta práctica trabajaremos con los datos abiertos.

¿Qué son datos abiertos?

https://publications.iadb.org/publications/spanish/viewer/Los-datos-abiertos-en-América-Latina-y-el-Caribe.pdf

Introducción a la fuente

De acuerdo a la información en los datos abiertos, hay cinco conjuntos de datos, uno a nivel vivienda y tres a nivel individuo:

  • Vivienda: tviv

  • Individual: tsdem

  • Individual - persona elegida: tapart_a

  • Individual - persona elegida: tapart_b

  • Individual - persona elegida: tmodulo

Además esta base no tiene una sólo variable del id. Tiene un identificador compuesto. Podemos hacer un objeto tipo vector

idviv<-c("folio", "viv_sel")
idper<-c("folio", "viv_sel", "hogar", "n_ren")

Importación de los datos

Aprovechamos y agregaremos un paso para limpiar los nombres con janitor::clean_names() utiliza el formato snakecase, quitará espacios y les pondra guión bajo, las mayúsculas se vuelven minúsculas y quita caracteres especiales.

tvivienda <- readr::read_csv("data_t2/conjunto_de_datos_endiseg_2021_csv/conjunto_de_datos_tvivienda_endiseg_2021/conjunto_de_datos/conjunto_de_datos_tvivienda_endiseg_2021.csv") %>% janitor::clean_names()
Rows: 43737 Columns: 21
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (7): FOLIO, VIV_SEL, P1_2, P2_1, P2_3, EST_DIS, UPM_DIS
dbl (14): P1_1, P1_3, P1_4, P1_5, P1_6, P1_7_1, P1_7_2, P1_7_3, P1_7_4, P1_7...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
tsdem <- readr::read_csv("data_t2/conjunto_de_datos_endiseg_2021_csv/conjunto_de_datos_tsdem_endiseg_2021/conjunto_de_datos/conjunto_de_datos_tsdem_endiseg_2021.csv") %>% janitor::clean_names()
Rows: 152497 Columns: 13
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (8): FOLIO, VIV_SEL, N_REN, EDAD, P3_6_1, P3_6_2, EST_DIS, UPM_DIS
dbl (5): HOGAR, PAREN, SEXO, P3_6_3, FACTOR

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
tmodulo <- readr::read_csv("data_t2/conjunto_de_datos_endiseg_2021_csv/conjunto_de_datos_tmodulo_endiseg_2021/conjunto_de_datos/conjunto_de_datos_tmodulo_endiseg_2021.csv") %>%
  janitor::clean_names() %>% 
  dplyr::mutate(seleccionade=1)
Warning: One or more parsing issues, call `problems()` on your data frame for details,
e.g.:
  dat <- vroom(...)
  problems(dat)
Rows: 44189 Columns: 228
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (35): FOLIO, VIV_SEL, N_REN, P4_3A, NIV, P4_19, P5_1, P7_2, P7_3, P7_5,...
dbl (192): HOGAR, P4_1, P4_2, P4_3, P4_4, P4_5, P4_6, P4_7, P4_8, P4_9C, PD4...
lgl   (1): P11_2_3_3

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
tapart_a <- readr::read_csv("data_t2/conjunto_de_datos_endiseg_2021_csv/conjunto_de_datos_tapart_a_endiseg_2021/conjunto_de_datos/conjunto_de_datos_tapart_a_endiseg_2021.csv") %>% janitor::clean_names()
Rows: 2225 Columns: 50
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (5): FOLIO, VIV_SEL, N_REN, EST_DIS, UPM_DIS
dbl (45): HOGAR, P6_1_01, P6_1_02, P6_1_03, P6_1_04, P6_1_05, P6_1_06, P6_1_...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
tapart_b <- readr::read_csv("data_t2/conjunto_de_datos_endiseg_2021_csv/conjunto_de_datos_tapart_b_endiseg_2021/conjunto_de_datos/conjunto_de_datos_tapart_b_endiseg_2021.csv") %>% janitor::clean_names()
Rows: 41964 Columns: 50
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (5): FOLIO, VIV_SEL, N_REN, EST_DIS, UPM_DIS
dbl (45): HOGAR, P6_7_01, P6_7_02, P6_7_03, P6_7_04, P6_7_05, P6_7_06, P6_7_...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Fusionado uno a uno con diferentes conjuntos.

Me gusta empezar con el modulo que tiene más casos y este sería mi “left” o conjunto “x”

endiseg2021<-tsdem %>% 
  dplyr::left_join(tmodulo, by=idper) %>% 
  dplyr::select(-ends_with(".y")) %>% # quita todas las variables que terminan en .x
  dplyr::rename_with(~ stringr::str_remove(.x,  pattern = ".x"),  ends_with(".x")) 

Si checas me quedo con las variables repetidas que están en la izquierda, porque es mi conjunto más completo.

Hacemos lo mismo con tapart_a:

endiseg2021<-endiseg2021 %>% 
  dplyr::left_join(tapart_a, by=idper) %>% 
  dplyr::select(-ends_with(".y")) %>% # quita todas las variables que terminan en .x
  dplyr::rename_with(~ stringr::str_remove(.x,  pattern = ".x"),  ends_with(".x")) 

Hacemos lo mismo con el tapart_b

endiseg2021<-endiseg2021 %>% 
  dplyr::left_join(tapart_b, by=idper) %>% 
  dplyr::select(-ends_with(".y")) %>% # quita todas las variables que terminan en .x
  dplyr::rename_with(~ stringr::str_remove(.x,  pattern = ".x"),  ends_with(".x")) 

Y hoy agregamos la vivienda. Como para tener la lógica del cuestionario en nuestro dataframe, lo pondre como left:

endiseg2021<-tvivienda %>% 
  dplyr::left_join(endiseg2021, by=idviv) %>% #ojo cambiamos acá
  dplyr::select(-ends_with(".y")) %>% # quita todas las variables que terminan en .x
  dplyr::rename_with(~ stringr::str_remove(.x,  pattern = ".x"),  ends_with(".x")) 

Vamos a botar los objetos anteriores, porque vamos a importar diccionarios y más para etiquetar nuestras variables.

rm(tvivienda, tsdem, tmodulo, tapart_a, tapart_b)
gc() # limpiamos la memoria
           used  (Mb) gc trigger  (Mb) limit (Mb)  max used  (Mb)
Ncells  2288951 122.3    4417760 236.0         NA   4417760 236.0
Vcells 55298551 421.9  127603740 973.6      16384 127476534 972.6

Etiquetado de variables

Diccionario de variables

El formato abierto tiene la ventaja que siempre vendrá con diccionarios. Esto nos puede ayudar muchísimo.

Vamos a importar el diccionario del modulo que tiene las preguntas que más nos interesan

dicc_tmodulo<- readr::read_csv("data_t2/conjunto_de_datos_endiseg_2021_csv/conjunto_de_datos_tmodulo_endiseg_2021/diccionario_de_datos/diccionario_datos_tmodulo_endiseg_2021.csv") %>% clean_names()
New names:
Rows: 228 Columns: 9
── Column specification
──────────────────────────────────────────────────────── Delimiter: "," chr
(5): nombre_campo, tipo, nemónico, catálogo, rango_claves dbl (1): longitud lgl
(3): ...7, ...8, ...9
ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
Specify the column types or set `show_col_types = FALSE` to quiet this message.
• `` -> `...7`
• `` -> `...8`
• `` -> `...9`

Vamos a utilizar algunos elementos de cadena, para hacer la información más corta

dicc_tmodulo<-dicc_tmodulo %>% 
  mutate(nombre_campo=stringr::str_remove_all(nombre_campo, "Pregunta "))

Pensemos que queremos saber cuál es el título de variable p7

dicc_tmodulo %>% 
  filter(nemonico=="p7_1") %>% 
  select(nombre_campo)
# A tibble: 1 × 1
  nombre_campo                            
  <chr>                                   
1 P7.1 ¿Cuál es su sexo asignado al nacer?

Vamos a guardar esto

dicc_tmodulo %>% 
  filter(nemonico=="p7_1") %>% 
  select(nombre_campo) -> label_p7_1

Con este proceso se puede automatizar un poco:

endiseg2021 %<>% 
  mutate(p7_1=sjlabelled::set_label(p7_1, label=label_p7_1$nombre_campo))

Revisamos que tengamos el atributo

glimpse(endiseg2021$p7_1)
 num [1:152497] 1 NA 2 NA NA 2 NA NA NA 2 ...
 - attr(*, "label")= chr "P7.1 ¿Cuál es su sexo asignado al nacer?"

Catalogos de valores

Estos nos servirán para etiquetas los valores de las variables. Hay un catálogo por variable. Sigamos con la variable p7_1

labels_p7_1 <- read_csv("data_t2/conjunto_de_datos_endiseg_2021_csv/conjunto_de_datos_tmodulo_endiseg_2021/catalogos/p7_1.csv") %>% clean_names()
Rows: 2 Columns: 2
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (1): descrip
dbl (1): cve

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Vamos a etiquetar hoy los valores

endiseg2021 %<>% 
  mutate(p7_1=sjlabelled::set_labels(p7_1, labels = labels_p7_1$descrip))

Revisamos que tengamos el atributo

glimpse(endiseg2021$p7_1)
 num [1:152497] 1 NA 2 NA NA 2 NA NA NA 2 ...
 - attr(*, "label")= chr "P7.1 ¿Cuál es su sexo asignado al nacer?"
 - attr(*, "labels")= Named num [1:2] 1 2
  ..- attr(*, "names")= chr [1:2] "Hombre" "Mujer"

Tabulados

Tabulados con {janitor}

Sin factores de expansión este es un gran comando.

endiseg2021 %>% 
  filter(seleccionade==1) %>% 
  mutate(p7_1=as_label(p7_1)) %>% 
  janitor::tabyl(p7_1) %>% 
  janitor::adorn_totals() %>% 
  janitor::adorn_pct_formatting(digits=2)
   p7_1     n percent
 Hombre 20102  45.49%
  Mujer 24087  54.51%
  Total 44189 100.00%

Vamos a utilizar una segunda variable

dicc_tmodulo %>% 
  filter(nemonico=="p8_1") %>% 
  select(nombre_campo) -> label_p8_1

endiseg2021 %<>% 
  mutate(p8_1=sjlabelled::set_label(p8_1, label=label_p8_1$nombre_campo))
labels_p8_1 <- read_csv("data_t2/conjunto_de_datos_endiseg_2021_csv/conjunto_de_datos_tmodulo_endiseg_2021/catalogos/p8_1.csv", locale = locale(encoding = "latin1")) %>% clean_names()
Rows: 6 Columns: 2
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (1): descrip
dbl (1): cve

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
endiseg2021 %<>% 
  mutate(p8_1=sjlabelled::set_labels(p8_1, labels = labels_p8_1$descrip))
endiseg2021 %>% 
  filter(seleccionade==1) %>% 
  mutate(p7_1=as_label(p7_1)) %>% 
  mutate(p8_1=as_label(p8_1)) %>% 
  janitor::tabyl(p8_1, p7_1) %>% 
  janitor::adorn_totals(where=c("row", "col")) %>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_pct_formatting(digits=2)
                                                 p8_1  Hombre   Mujer   Total
   Una mujer a la que le gustan solamente las mujeres   0.35%   0.71%   0.55%
     Un hombre al que le gustan solamente los hombres   2.77%   0.54%   1.56%
 Una persona que le gustan tanto hombres como mujeres   1.09%   3.78%   2.56%
        Una mujer que le gustan solamente los hombres   0.23%  94.67%  51.71%
        Un hombre que le gustan solamente las mujeres  95.23%   0.11%  43.38%
                                 Con otra orientación   0.31%   0.20%   0.25%
                                                Total 100.00% 100.00% 100.00%

Tabulados con {pollster}

Podemos incluir el factor de expansión

endiseg2021 %>% 
  filter(seleccionade==1) %>% 
  mutate(p7_1=as_label(p7_1)) %>% 
  pollster::topline(p7_1, weight = factor) 
# A tibble: 2 × 5
  Response Frequency Percent `Valid Percent` `Cumulative Percent`
  <fct>        <dbl>   <dbl>           <dbl>                <dbl>
1 Hombre    16576979    45.1            45.1                 45.1
2 Mujer     20181192    54.9            54.9                100  
endiseg2021 %>% 
  filter(seleccionade==1) %>% 
  mutate(p7_1=as_label(p7_1)) %>% 
  pollster::moe_topline(p7_1, weight = factor) # margin of error
# A tibble: 2 × 6
  Response Frequency Percent `Valid Percent`   MOE `Cumulative Percent`
  <fct>        <dbl>   <dbl>           <dbl> <dbl>                <dbl>
1 Hombre    16576979    45.1            45.1 0.631                 45.1
2 Mujer     20181192    54.9            54.9 0.631                100  

Doble entrada

endiseg2021 %>% 
  filter(seleccionade==1) %>% 
  mutate(p7_1=as_label(p7_1)) %>% 
  mutate(p8_1=as_label(p8_1)) %>% 
  pollster::crosstab(p8_1, p7_1, weight = factor, pct_type = "col") 
# A tibble: 7 × 3
  p8_1                                                       Hombre        Mujer
  <chr>                                                       <dbl>        <dbl>
1 Una mujer a la que le gustan solamente las mujeres          0.276        0.688
2 Un hombre al que le gustan solamente los hombres            2.46         0.495
3 Una persona que le gustan tanto hombres como mujeres        0.923        3.45 
4 Una mujer que le gustan solamente los hombres               0.214       95.1  
5 Un hombre que le gustan solamente las mujeres              95.8          0.100
6 Con otra orientación                                        0.285        0.163
7 n                                                    16576979     20181192    
endiseg2021 %>% 
  filter(seleccionade==1) %>% 
  mutate(p7_1=as_label(p7_1)) %>% 
  mutate(p8_1=as_label(p8_1)) %>% 
  pollster::moe_crosstab(p8_1, p7_1, weight = factor) 
# A tibble: 12 × 5
   p8_1                                              p7_1     pct     moe      n
   <fct>                                             <fct>  <dbl>   <dbl>  <dbl>
 1 Una mujer a la que le gustan solamente las mujer… Homb… 24.8    7.41   1.85e5
 2 Una mujer a la que le gustan solamente las mujer… Mujer 75.2    7.41   1.85e5
 3 Un hombre al que le gustan solamente los hombres  Homb… 80.3    4.04   5.08e5
 4 Un hombre al que le gustan solamente los hombres  Mujer 19.7    4.04   5.08e5
 5 Una persona que le gustan tanto hombres como muj… Homb… 18.0    3.05   8.50e5
 6 Una persona que le gustan tanto hombres como muj… Mujer 82.0    3.05   8.50e5
 7 Una mujer que le gustan solamente los hombres     Homb…  0.184  0.0756 1.92e7
 8 Una mujer que le gustan solamente los hombres     Mujer 99.8    0.0756 1.92e7
 9 Un hombre que le gustan solamente las mujeres     Homb… 99.9    0.0686 1.59e7
10 Un hombre que le gustan solamente las mujeres     Mujer  0.127  0.0686 1.59e7
11 Con otra orientación                              Homb… 59.0   12.6    8.01e4
12 Con otra orientación                              Mujer 41.0   12.6    8.01e4

Diseño muestral

endiseg_svyr <- endiseg2021 %>%
  select(upm_dis, est_dis, factor, seleccionade, p7_1, p8_1, p4_1) %>% 
  srvyr::as_survey_design(
    upm = upm_dis, 
    strata = est_dis,
    weights = factor,
    nest = TRUE)

Para una media ponderada

endiseg_svyr %>%
  filter(seleccionade==1) %>% 
  summarise(
    media_ponderada = survey_mean(p4_1, na.rm=T))
# A tibble: 1 × 2
  media_ponderada media_ponderada_se
            <dbl>              <dbl>
1            43.2              0.113

Si queremos los intervalos de confianza:

endiseg_svyr %>%
  filter(seleccionade==1) %>% 
  summarise(
    media_ponderada = survey_mean(p4_1, na.rm=T, vartype="ci"))
# A tibble: 1 × 3
  media_ponderada media_ponderada_low media_ponderada_upp
            <dbl>               <dbl>               <dbl>
1            43.2                43.0                43.5

Esto se puede tardar

endiseg_svyr %>%
  filter(seleccionade==1) %>% 
  mutate(p8_1=as_label(p8_1)) %>% 
  group_by(p8_1) %>% 
  summarise(
    media_ponderada = survey_mean(p4_1, na.rm=T, vartype="ci"))
# A tibble: 6 × 4
  p8_1                   media_ponderada media_ponderada_low media_ponderada_upp
  <fct>                            <dbl>               <dbl>               <dbl>
1 Una mujer a la que le…            36.7                34.0                39.3
2 Un hombre al que le g…            32.2                30.9                33.5
3 Una persona que le gu…            25.5                24.8                26.3
4 Una mujer que le gust…            44.5                44.2                44.8
5 Un hombre que le gust…            43.2                42.9                43.5
6 Con otra orientación              28.0                25.0                31.0
endiseg_svyr %>%
  filter(seleccionade==1) %>% 
  mutate(p8_1=as_label(p8_1)) %>% 
  group_by(p8_1) %>% #variables cuali
  summarise(proportion = survey_mean())
# A tibble: 6 × 3
  p8_1                                                 proportion proportion_se
  <fct>                                                     <dbl>         <dbl>
1 Una mujer a la que le gustan solamente las mujeres      0.00502      0.000425
2 Un hombre al que le gustan solamente los hombres        0.0138       0.000679
3 Una persona que le gustan tanto hombres como mujeres    0.0231       0.000924
4 Una mujer que le gustan solamente los hombres           0.523        0.00323 
5 Un hombre que le gustan solamente las mujeres           0.433        0.00321 
6 Con otra orientación                                    0.00218      0.000275