Cargar librerías

# para leer spss
library(haven)

# para manipular datos
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.5
## ✔ ggplot2   3.5.1     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(tidyr)
library(labelled)
library(purrr)
library(tibble)

# para visualización
library(ggplot2)
library(stargazer)
## 
## Please cite as: 
## 
##  Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
##  R package version 5.2.3. https://CRAN.R-project.org/package=stargazer
# para archivos de excel
library(writexl)
## Warning: package 'writexl' was built under R version 4.4.1

Cargar archivos y cargar etiquetas

# Obtener una lista de archivos .sav en la carpeta
archivos_sav <- list.files(pattern = "\\.sav$", full.names = TRUE)

# Leer todos los archivos y guardarlos en una lista
lista_datos <- lapply(archivos_sav, read_sav)

# Opcional: Asignar nombres a cada dataset en la lista según el nombre del archivo
names(lista_datos) <- tools::file_path_sans_ext(basename(archivos_sav))

# Ver el primer dataset cargado
head(lista_datos[[1]])
## # A tibble: 6 × 99
##   EDICION  LOTE  TIPO FOLIO   VIV R01A       R01B  R01C  R01D R02A    R02B  R02C
##     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl+lbl> <dbl> <dbl> <dbl> <dbl+> <dbl> <dbl>
## 1    2013     1     0     2     0 2 [No]       NA    NA    NA 2 [NO]    NA    NA
## 2    2013     1     0     1     0 2 [No]       NA    NA    NA 2 [NO]    NA    NA
## 3    2013     1     0     2     1 2 [No]       NA    NA    NA 2 [NO]    NA    NA
## 4    2013     1     0     3     0 1 [Si]        1     1     0 2 [NO]    NA    NA
## 5    2013     1     0     4     0 2 [No]       NA    NA    NA 2 [NO]    NA    NA
## 6    2013     1     0     5     0 2 [No]       NA    NA    NA 2 [NO]    NA    NA
## # ℹ 87 more variables: R02D <dbl>, R0301A <dbl+lbl>, R0301B <dbl+lbl>,
## #   R0301C <dbl+lbl>, R0301OTR <dbl>, R0401H <dbl>, R0401M <dbl>,
## #   R0501 <dbl+lbl>, R0302A <dbl+lbl>, R0302B <dbl+lbl>, R0302C <dbl+lbl>,
## #   R0302OTR <dbl>, R0402H <dbl>, R0402M <dbl>, R0502 <dbl+lbl>,
## #   R0303A <dbl+lbl>, R0303B <dbl+lbl>, R0303C <dbl+lbl>, R0303OTR <dbl>,
## #   R0403H <dbl>, R0403M <dbl>, R0503 <dbl+lbl>, R0304A <dbl+lbl>,
## #   R0304B <dbl+lbl>, R0304C <dbl+lbl>, R0304OTR <dbl>, R0404H <dbl>, …
# Extraer cada elemento de la lista en un objeto individual en el entorno global
list2env(lista_datos, envir = .GlobalEnv)
## <environment: R_GlobalEnv>
# Obtener los nombres de todos los dataframes en el Global Environment
nombres_objetos <- ls()
nombres_df <- nombres_objetos[sapply(nombres_objetos, function(x) is.data.frame(get(x)))]

# Función para extraer etiquetas de un solo dataframe
extraer_etiquetas <- function(nombre_df) {
  df <- get(nombre_df)  # Obtener el data.frame por su nombre
  
  tibble(
    Dataset = nombre_df,  # Nombre del dataset
    Variable = names(df),  # Nombre de la variable
    Etiqueta = map_chr(df, ~ ifelse(is.null(var_label(.x)), NA, var_label(.x)))  # Extrae etiquetas
  )
}

# Aplicar la función a todos los dataframes y combinarlos en una sola tabla
df_etiquetas_total <- bind_rows(lapply(nombres_df, extraer_etiquetas))

# Ver las primeras filas del resultado
print(df_etiquetas_total)
## # A tibble: 940 × 3
##    Dataset Variable Etiqueta                           
##    <chr>   <chr>    <chr>                              
##  1 SEC0    EDICION  <NA>                               
##  2 SEC0    LOTE     <NA>                               
##  3 SEC0    TIPO     <NA>                               
##  4 SEC0    FOLIO    <NA>                               
##  5 SEC0    VIV      <NA>                               
##  6 SEC0    R01A     Algun miembro esta en el extranjero
##  7 SEC0    R01B     Total en extranjero                
##  8 SEC0    R01C     Hombres en el extranjero           
##  9 SEC0    R01D     Mujeres en el extranjero           
## 10 SEC0    R02A     Tiene pupilos                      
## # ℹ 930 more rows

Resumen Gasto

# Función para extraer etiquetas y número de valores no faltantes
generar_resumen <- function(nombre_df) {
  df <- get(nombre_df)  # Obtener el dataframe por su nombre
  
  tibble(
    Dataset = nombre_df,  # Nombre del dataset
    Variable = names(df),  # Nombre de la variable
    Etiqueta = map_chr(df, ~ ifelse(is.null(var_label(.x)), NA, var_label(.x))),  # Extrae etiquetas
    No_Faltantes = colSums(!is.na(df))  # Cuenta valores no faltantes
  )
}

# Aplicar la función a todos los dataframes y combinarlos en una sola tabla
df_resumen_total <- bind_rows(lapply(nombres_df, generar_resumen))

# Ver las primeras filas del resumen
print(df_resumen_total)
## # A tibble: 940 × 4
##    Dataset Variable Etiqueta                            No_Faltantes
##    <chr>   <chr>    <chr>                                      <dbl>
##  1 SEC0    EDICION  <NA>                                       21086
##  2 SEC0    LOTE     <NA>                                       21086
##  3 SEC0    TIPO     <NA>                                       21086
##  4 SEC0    FOLIO    <NA>                                       21086
##  5 SEC0    VIV      <NA>                                       21086
##  6 SEC0    R01A     Algun miembro esta en el extranjero        21086
##  7 SEC0    R01B     Total en extranjero                         3554
##  8 SEC0    R01C     Hombres en el extranjero                    3554
##  9 SEC0    R01D     Mujeres en el extranjero                    3554
## 10 SEC0    R02A     Tiene pupilos                              21086
## # ℹ 930 more rows
# Filtrar variables cuya etiqueta contenga la palabra "gasto"
info_sec00 <- df_resumen_total %>%
  filter(Dataset == "SEC00")

# Verificar el resultado
print(info_sec00)
## # A tibble: 37 × 4
##    Dataset Variable Etiqueta                         No_Faltantes
##    <chr>   <chr>    <chr>                                   <dbl>
##  1 SEC00   EDICION  Año de la entrevista                    21086
##  2 SEC00   LOTE     <NA>                                    21086
##  3 SEC00   TIPO     <NA>                                    21086
##  4 SEC00   FOLIO    <NA>                                    21086
##  5 SEC00   VIV      <NA>                                    21086
##  6 SEC00   REGION   <NA>                                    21086
##  7 SEC00   AREA     <NA>                                    21086
##  8 SEC00   Depto    Departamento                            21086
##  9 SEC00   Munic    Municipio                               21086
## 10 SEC00   idmunic  Codigo de descripcion geografica        21086
## # ℹ 27 more rows
# Cargar librería necesaria
# library(knitr)

# Mostrar la tabla con kable (estilizado en HTML)
# kable(gasto_df, caption = "Resumen de Variables Relacionadas con Gasto")

Limpieza de datos

SEC00_depurado <- SEC00 %>% 
  select("INGFA", "MIEMH", "FAC00", "GHALI", "GHASE", "GHU12", "GMED", "GMVI", "GMEM", "GMSA") %>% 
  drop_na()
# Definir la variable de factor de expansión
factor_expansion <- "FAC00"

# Obtener las variables de gasto (todas menos el factor de expansión)
variables_gasto <- c("INGFA","GHALI", "GHASE", "GHU12", "GMED", "GMVI", "GMEM", "GMSA")
# Multiplicar cada monto de gasto por el factor de expansión
SEC00_expansion <- SEC00_depurado %>%
  mutate(across(all_of(variables_gasto), ~ .x * !!sym(factor_expansion), .names = "exp_{.col}"))

# Ver primeras filas con los nuevos valores expandidos
head(SEC00_expansion %>% select(starts_with("exp_")))
## # A tibble: 6 × 8
##   exp_INGFA exp_GHALI exp_GHASE exp_GHU12 exp_GMED exp_GMVI exp_GMEM exp_GMSA
##       <dbl>     <dbl>     <dbl>     <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1    20795.     7666.     1950.      40.5    8060.    2354.    1053         0
## 2    32049.    13454.     2999.       0      1152.    1206     4297.     1005
## 3    10563.     5383.     1963.       0      2921.    1769.       0         0
## 4    40646.    14325.     3925.       0     10720     3417     7259.        0
## 5    98158.    16837.     3720.     425.     5241.    2641.   15708.     9315
## 6    39805.     9421.     2302.       0      4876.     648     8213.        0

Indicadores

# Definir las variables clave
ingreso_var <- "INGFA"       # Ingreso familiar
miembros_var <- "MIEMH"      # Número de miembros del hogar
variables_gasto <- c("GHALI", "GHASE", "GHU12", "GMED", "GMVI", "GMEM", "GMSA")  # Variables de gasto
# Crear tabla de indicadores con cálculos
SEC00_indicadores <- SEC00_expansion %>%
  mutate(
    ingreso_per_capita = !!sym(ingreso_var) / !!sym(miembros_var),  # Ingreso per cápita
    gasto_total_hogar = rowSums(select(., all_of(variables_gasto)), na.rm = TRUE),  # Suma de gastos
    gasto_per_capita = gasto_total_hogar / !!sym(miembros_var)  # Gasto total per cápita
  ) %>%
  select(ingreso_per_capita, gasto_total_hogar, gasto_per_capita)  # Mantener columnas clave

# Ver primeras filas del resultado
head(SEC00_indicadores)
## # A tibble: 6 × 3
##   ingreso_per_capita gasto_total_hogar gasto_per_capita
##                <dbl>             <dbl>            <dbl>
## 1               64.2             261.              65.2
## 2               47.8             180.              36.0
## 3               26.3              89.8             29.9
## 4               75.8             296.              74.0
## 5              173.              665.              95.0
## 6               98.3             314.              62.9

Análisis de la Estructura de Gasto

# Agregar cálculo del porcentaje de cada rubro dentro del gasto total del hogar
estructura_gasto <- SEC00_expansion %>%
  mutate(
    gasto_total_hogar = rowSums(select(., GHALI, GHASE, GHU12, GMED, GMVI, GMEM, GMSA), na.rm = TRUE),  # Suma de gastos
    across(c(GHALI, GHASE, GHU12, GMED, GMVI, GMEM, GMSA),  # Aplicar a todas las variables de gasto
           ~ (.x / gasto_total_hogar) * 100,  # Calcular porcentaje de aporte
           .names = "pct_{.col}")  # Prefijo "pct_" para indicar porcentaje
  ) %>%
  select(starts_with("pct_"), gasto_total_hogar)  # Mantener solo los porcentajes y el total

# Ver primeras filas con los porcentajes de aporte
head(estructura_gasto)
## # A tibble: 6 × 8
##   pct_GHALI pct_GHASE pct_GHU12 pct_GMED pct_GMVI pct_GMEM pct_GMSA
##       <dbl>     <dbl>     <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1      36.3      9.23     0.192    38.2     11.1      4.99     0   
## 2      55.8     12.4      0         4.78     5.00    17.8      4.17
## 3      44.7     16.3      0        24.3     14.7      0        0   
## 4      36.1      9.90     0        27.0      8.62    18.3      0   
## 5      31.2      6.90     0.789     9.73     4.90    29.1     17.3 
## 6      37.0      9.04     0        19.2      2.55    32.3      0   
## # ℹ 1 more variable: gasto_total_hogar <dbl>
# Transformar datos a formato largo
#estructura_gasto_long <- SEC00_expansion %>%
#  select(all_of(gasto_vars), all_of(factor_expansion)) %>%  # Seleccionar solo gastos y factor expansión
#  pivot_longer(cols = all_of(gasto_vars),  
#               names_to = "Rubro_Gasto",  
#               values_to = "Valor_Gasto") %>%
#  rename(Factor_Expansion = FAC00)  # Renombrar la columna de expansión

# Unir con df_etiquetas_total para añadir las descripciones
#estructura_gasto_final <- estructura_gasto_long %>%
#  left_join(df_etiquetas_total, by = c("Rubro_Gasto" = "Variable")) %>%
#  select(Rubro_Gasto, Etiqueta, Valor_Gasto, Factor_Expansion)  # Mantener solo columnas clave

# Ver primeras filas de la tabla final
#head(estructura_gasto_final)

Exportar y Revisión de Resultados

¿En qué está gastando más la gente en el año que me tocó?