3  Análisis descriptivo

3.1 Paquetes

if (!require("pacman")) install.packages("pacman") # instala pacman si se requiere
Cargando paquete requerido: pacman
pacman::p_load(tidyverse, 
               readxl,writexl,googlesheets4, # importar hojas de cálculo
               haven, foreign, # importación de dta y sab
               sjlabelled, # etiquetas
               janitor, skimr, # limpieza y tabulados
               dataMaid,  DataExplorer, SmartEDA) # paquetes EDA

3.2 Datos

concentradohogar <- haven::read_dta("datos/concentradohogar.dta")

3.3 Etiquetas y cómo usarlas

Podemos ver que los objetos “data.frame”(spoiler, ya hablaremos de ellos)

class(concentradohogar$sexo_jefe)
[1] "character"

3.3.1 Ejemplo de etiquetado

Para que se vea mejor nuestro tabulado, sería bueno que nuestras variables tuvieran etiqueta. Para ello utilizaremos el paquete “sjlabelled”

etiqueta_sex<-c("Hombre", "Mujer")

concentradohogar<-concentradohogar %>% 
  mutate(sexo_jefe=as_numeric(sexo_jefe)) %>% # para quitar el "string"
  sjlabelled::set_labels(sexo_jefe, labels=etiqueta_sex) 

Etiquetemos también la variable “clase_hog”. Podemos checar cómo está estructurada esta base acá https://www.inegi.org.mx/rnm/index.php/catalog/685/data-dictionary

concentradohogar<-concentradohogar %>% 
  mutate(clase_hog=as_numeric(clase_hog)) %>% # para quitar el "string"
  sjlabelled::set_labels(clase_hog, labels=c("unipersonal",
                                             "nuclear", 
                                             "ampliado",
                                             "compuesto",
                                             "corresidente")) 
table(concentradohogar$sexo_jefe)

    1     2 
61905 28197 
table(sjlabelled::as_label(concentradohogar$sexo_jefe))

Hombre  Mujer 
 61905  28197 

3.4 Variables nominales

La variable nominal “sexo_jefe”, se captura con “1” para hombres y con un “2” para mujeres en la base de datos. Podemos establecer una operación de igual y además sumar los casos que cumplan con esta condición:

concentradohogar %>% 
  dplyr::count(sexo_jefe==2) # cuentan los casos que cumplen con la condición "sexo_jefe==2"
# A tibble: 2 × 2
  `sexo_jefe == 2`     n
  <lgl>            <int>
1 FALSE            61905
2 TRUE             28197

Esto es a lo que nos referimos con contar frecuencias. Podemos contar casos que cumplan con una operación de igualdad.

concentradohogar %>%
  with(
    table(sexo_jefe)
    )
sexo_jefe
    1     2 
61905 28197 

3.4.1 Recordemos nuestro etiquetado

etiqueta_sex<-c("Hombre", "Mujer")

concentradohogar<-concentradohogar %>% 
  mutate(sexo_jefe=as_numeric(sexo_jefe)) %>% # para quitar el "string"
  sjlabelled::set_labels(sexo_jefe, labels=etiqueta_sex) 
concentradohogar<-concentradohogar %>% 
  mutate(clase_hog=as_numeric(clase_hog)) %>% # para quitar el "string"
  sjlabelled::set_labels(clase_hog, labels=c("unipersonal",
                                             "nuclear", 
                                             "ampliado",
                                             "compuesto",
                                             "corresidente")) 

Con “tabyl()”” de “janitor””

concentradohogar %>%
  dplyr::mutate(sexo_jefe=as_label(sexo_jefe))  %>%
  janitor::tabyl(sexo_jefe)
 sexo_jefe     n   percent
    Hombre 61905 0.6870547
     Mujer 28197 0.3129453

Para ver que esto es una distribución de frecuencias sería muy útil ver la proporción total, ello se realiza agregando un elemento más en nuestro código con una “tubería”:

concentradohogar %>% 
  dplyr::mutate(sexo_jefe=as_label(sexo_jefe))  %>%
  janitor::tabyl(sexo_jefe) %>% 
  janitor::adorn_totals()
 sexo_jefe     n   percent
    Hombre 61905 0.6870547
     Mujer 28197 0.3129453
     Total 90102 1.0000000

Hoy revisamos algunos tipos de variables

class(concentradohogar$sexo_jefe) # variable sin etiqueta
[1] "numeric"
class(as_label(concentradohogar$sexo_jefe)) # variable con etiqueta
[1] "factor"
class(as_label(concentradohogar$educa_jefe)) # variable ordinal
[1] "character"
class(concentradohogar$ing_cor) # variable de intervalo/razón
[1] "numeric"

En general, tendremos variables de factor que podrían ser consideradas como cualitativas y numéricas. Aunque en realidad, R tiene muchas formas de almacenamiento. Como mostramos con el comando “glimpse()” en la práctica anterior, podemos revisar una variable en específico:

dplyr::glimpse(concentradohogar$sexo_jefe)
 num [1:90102] 2 1 1 1 1 1 2 2 2 1 ...
 - attr(*, "labels")= Named num [1:2] 1 2
  ..- attr(*, "names")= chr [1:2] "Hombre" "Mujer"
 - attr(*, "label")= chr "Sexo del jefe del hogar"
concentradohogar %>% mutate(sexo_jefe=as_label(sexo_jefe)) %>% # cambia los valores de la variable a sus etiquetas
                tabyl(sexo_jefe) %>% # para hacer la tabla
                adorn_totals() %>% # añade totales
                adorn_pct_formatting()  # nos da porcentaje en lugar de proporción
 sexo_jefe     n percent
    Hombre 61905   68.7%
     Mujer 28197   31.3%
     Total 90102  100.0%

La tubería o “pipe” %>% nos permite ir agregando elementos de manera sencilla nuestros comandos. En este caso decimos que dentro del objeto haga el cambio, luego la tabla, que le ponga porcentajes y finalmente que nos dé los totales. El total del 100% no aparece, por un elemento propio del programa.

3.5 Variables ordinales

Son variables que dan cuenta de cualidades o condiciones a través de categorías que guardan un orden entre sí.

Vamos a darle una “ojeada” a esta variable

glimpse(concentradohogar$educa_jefe)
 chr [1:90102] "03" "08" "10" "11" "08" "08" "10" "06" "10" "04" "06" "08" ...
 - attr(*, "label")= chr "Educación formal del jefe del hogar"
 - attr(*, "format.stata")= chr "%2s"

Etiquetemos también nuestra variable ordinal

concentradohogar <-concentradohogar %>% 
  mutate(educa_jefe=as.numeric(educa_jefe)) %>% 
  set_labels(educa_jefe,
             labels=c("Sin instrucción", 
                      "Preescolar",
                      "Primaria incompleta",
                      "Primaria completa",
                      "Secundaria incompleta",
                      "Secundaria completa",
                      "Preparatoria incompleta",
                      "Preparatoria completa",
                      "Profesional incompleta",
                      "Profesional completa",
                      "Posgrado"))

Hoy hacemos la tabla, con las etiquetas y vemos que se ve más bonita:

concentradohogar %>%
  mutate(educa_jefe=as_label(educa_jefe)) %>% 
  tabyl(educa_jefe)
              educa_jefe     n     percent
         Sin instrucción  5495 0.060986438
              Preescolar    32 0.000355153
     Primaria incompleta 13328 0.147921245
       Primaria completa 14928 0.165678897
   Secundaria incompleta  2728 0.030276797
     Secundaria completa 24581 0.272813034
 Preparatoria incompleta  3032 0.033650751
   Preparatoria completa 11782 0.130762913
  Profesional incompleta  2645 0.029355619
    Profesional completa  9788 0.108632439
                Posgrado  1763 0.019566713

Para que no nos salgan las categorías sin datos podemos poner una opción dentro del comando “tabyl()”

concentradohogar %>% 
  mutate(educa_jefe=as_label(educa_jefe)) %>% 
  tabyl(educa_jefe, show_missing_levels=F ) %>% # esta opción elimina los valores con 0
  adorn_totals()  
              educa_jefe     n     percent
         Sin instrucción  5495 0.060986438
              Preescolar    32 0.000355153
     Primaria incompleta 13328 0.147921245
       Primaria completa 14928 0.165678897
   Secundaria incompleta  2728 0.030276797
     Secundaria completa 24581 0.272813034
 Preparatoria incompleta  3032 0.033650751
   Preparatoria completa 11782 0.130762913
  Profesional incompleta  2645 0.029355619
    Profesional completa  9788 0.108632439
                Posgrado  1763 0.019566713
                   Total 90102 1.000000000

3.6 Bivariado cualitativo

3.6.1 Cálculo de frecuencias

Las tablas de doble entrada tiene su nombre porque en las columnas entran los valores de una variable categórica, y en las filas de una segunda. Basicamente es como hacer un conteo de todas las combinaciones posibles entre los valores de una variable con la otra.

Por ejemplo, si quisiéramos combinar las dos variables que ya estudiamos lo podemos hacer, con una tabla de doble entrada:

concentradohogar %>% 
  mutate(clase_hog=as_label(clase_hog)) %>% 
  mutate(sexo_jefe=as_label(sexo_jefe)) %>% # para que las lea como factor
                tabyl(clase_hog, sexo_jefe, show_missing_levels=F ) %>% # incluimos aquí 
                adorn_totals()  
    clase_hog Hombre Mujer
  unipersonal   6519  5367
      nuclear  41919 13621
     ampliado  12898  8888
    compuesto    372   211
 corresidente    197   110
        Total  61905 28197

Observamos que en cada celda confluyen los casos que comparten las mismas características:

concentradohogar %>%   
    count(clase_hog==1 & sexo_jefe==1) # nos da la segunda celda de la izquierda
# A tibble: 2 × 2
  `clase_hog == 1 & sexo_jefe == 1`     n
  <lgl>                             <int>
1 FALSE                             83583
2 TRUE                               6519

3.6.2 Totales y porcentajes

De esta manera se colocan todos los datos. Si observa al poner la función “adorn_totals()” lo agregó como una nueva fila de totales, pero también podemos pedirle que agregue una columna de totales.

concentradohogar %>% 
  mutate(clase_hog=as_label(clase_hog)) %>% 
  mutate(sexo_jefe=as_label(sexo_jefe)) %>% # para que las lea como factor
  tabyl(clase_hog, sexo_jefe, show_missing_levels=F ) %>% # incluimos aquí dos variables
  adorn_totals("col")  
    clase_hog Hombre Mujer Total
  unipersonal   6519  5367 11886
      nuclear  41919 13621 55540
     ampliado  12898  8888 21786
    compuesto    372   211   583
 corresidente    197   110   307

O bien agregar los dos, introduciendo en el argumento “c(”col”, “row”)” un vector de caracteres de las dos opciones requeridas:

concentradohogar %>% 
  mutate(clase_hog=as_label(clase_hog)) %>% 
  mutate(sexo_jefe=as_label(sexo_jefe)) %>% # para que las lea como factor
  tabyl(clase_hog, sexo_jefe, show_missing_levels=F ) %>% # incluimos aquí dos variable
  adorn_totals(c("col", "row")) 
    clase_hog Hombre Mujer Total
  unipersonal   6519  5367 11886
      nuclear  41919 13621 55540
     ampliado  12898  8888 21786
    compuesto    372   211   583
 corresidente    197   110   307
        Total  61905 28197 90102

Del mismo modo, podemos calcular los porcentajes. Pero los podemos calcular de tres formas. Uno es que lo calculemos para los totales calculados para las filas, para las columnas o para el gran total poblacional.

Para columnas tenemos el siguiente código y los siguientes resultados:

concentradohogar %>% 
  mutate(clase_hog=as_label(clase_hog)) %>% 
  mutate(sexo_jefe=as_label(sexo_jefe)) %>% # para que las lea como factor
  tabyl(clase_hog, sexo_jefe, show_missing_levels=F ) %>% # incluimos aquí dos variable
  adorn_totals(c("col", "row")) %>% 
  adorn_percentages("col") %>% # Divide los valores entre el total de la columna
  adorn_pct_formatting() # lo vuelve porcentaje
    clase_hog Hombre  Mujer  Total
  unipersonal  10.5%  19.0%  13.2%
      nuclear  67.7%  48.3%  61.6%
     ampliado  20.8%  31.5%  24.2%
    compuesto   0.6%   0.7%   0.6%
 corresidente   0.3%   0.4%   0.3%
        Total 100.0% 100.0% 100.0%

Cuando se hagan cuadros de distribuciones (que todas sus partes suman 100), los porcentajes pueden ser una gran ayuda para la interpretación, sobre todos cuando se comparar poblaciones de categorías de diferente tamaño. Por lo general, queremos que los cuadros nos den información de donde están los totales y su 100%, de esta manera el lector se puede guiar de porcentaje con respecto a qué está leyendo. En este caso, vemos que el 100% es común en la última fila.

Veamos la diferencia de cómo podemos leer la misma celda, pero hoy, hemos calculado los porcentajes a nivel de fila:

concentradohogar %>% 
  mutate(clase_hog=as_label(clase_hog)) %>% 
  mutate(sexo_jefe=as_label(sexo_jefe)) %>% # para que las lea como factor
  tabyl(clase_hog, sexo_jefe, show_missing_levels=F ) %>% # incluimos aquí dos variable
  adorn_totals(c("col", "row")) %>% 
  adorn_percentages("row") %>% # Divide los valores entre el total de la fila
  adorn_pct_formatting() # lo vuelve porcentaje
    clase_hog Hombre Mujer  Total
  unipersonal  54.8% 45.2% 100.0%
      nuclear  75.5% 24.5% 100.0%
     ampliado  59.2% 40.8% 100.0%
    compuesto  63.8% 36.2% 100.0%
 corresidente  64.2% 35.8% 100.0%
        Total  68.7% 31.3% 100.0%

Finalmente, podemos calcular los porcentajes con referencia a la población total en análisis. Es decir la celda en la esquina inferior derecha de nuestra tabla original.

concentradohogar %>% 
  mutate(clase_hog=as_label(clase_hog)) %>% 
  mutate(sexo_jefe=as_label(sexo_jefe)) %>% # para que las lea como factor
  tabyl(clase_hog, sexo_jefe, show_missing_levels=F ) %>% # incluimos aquí dos variable
  adorn_totals(c("col", "row")) %>% 
  adorn_percentages("all") %>% # Divide los valores entre el total de la población
  adorn_pct_formatting() # lo vuelve porcentaje
    clase_hog Hombre Mujer  Total
  unipersonal   7.2%  6.0%  13.2%
      nuclear  46.5% 15.1%  61.6%
     ampliado  14.3%  9.9%  24.2%
    compuesto   0.4%  0.2%   0.6%
 corresidente   0.2%  0.1%   0.3%
        Total  68.7% 31.3% 100.0%