# 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
# 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
# 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")
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
# 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)
¿En qué está gastando más la gente en el año que me tocó?