1 Descarga de datos desde la API del MDS

# departamentos <- c(
#   "alto_paraguay", "alto_parana", "amambay", "boqueron", "caaguazu", "caazapa",
#   "canindeyu", "capital", "central", "concepcion", "cordillera", "guaira",
#   "itapua", "misiones", "neembucu", "paraguari", "presidente_hayes", "san_pedro"
# )
# 
# output_dir <- "beneficiarios_am"
# dir.create(output_dir, showWarnings = FALSE)
# 
# safe_request <- function(depto) {
#   res <- POST(
#     url = "https://listadoam.mds.gov.py/api.lam.departamento.php",
#     body = list(departamento = depto),
#     encode = "form",
#     add_headers(
#       `User-Agent` = "Mozilla/5.0",
#       Referer = "https://listadoam.mds.gov.py/"
#     )
#   )
#   content <- content(res, as = "text", encoding = "UTF-8")
#   data <- tryCatch(fromJSON(content), error = function(e) NULL)
#   if (!is.null(data) && length(data) > 0) {
#     write_csv(data, file.path(output_dir, paste0(depto, ".csv")))
#     return(data)
#   }
#   return(NULL)
# }
# 
# datos_lista <- map(departamentos, safe_request)
# datos_completos <- bind_rows(datos_lista)
# write_csv(datos_completos, "G:/Mi unidad/adultomayor/beneficiarios_completo.csv")

2 Limpieza y enriquecimiento de datos

bene <- read_csv("G:/Mi unidad/adultomayor/beneficiarios_completo.csv") %>%
  distinct(cedula, .keep_all = TRUE) %>%
  mutate(
    mes = month(Sys.Date()),
    anho = year(Sys.Date())
  )
## Warning: One or more parsing issues, call `problems()` on your data frame for details,
## e.g.:
##   dat <- vroom(...)
##   problems(dat)
## Rows: 335926 Columns: 9
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (4): apellido, nombre, departamento, distrito
## dbl (3): cedula, monto, v_http
## lgl (2): mes, sucursal
## 
## ℹ 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.
imputados <- read_csv("G:/Mi unidad/adultomayor/imputar_sexo_y_fechanacim.csv")
## Rows: 7700457 Columns: 3
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (3): nro_cedula, sexoimput, fnacimimput
## 
## ℹ 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.
bene <- bene %>%
  mutate(cedula = as.character(cedula))

imputados <- imputados %>%
  rename(fnac = fnacimimput) %>%
  mutate(cedula = as.character(nro_cedula)) %>%
  select(cedula, sexoimput, fnac)

# Unir con datos de fecha de nacimiento
bene <- left_join(bene, imputados, by = "cedula")

# Parsear y calcular edad
bene <- bene %>%
  mutate(
    fnac = dmy(fnac),
    fecha_ref = ymd(paste0(anho, "-", str_pad(mes, 2, pad = "0"), "-01")),
    edad = as.integer(interval(fnac, fecha_ref) / years(1))
  )

3 Clasificación por grupo etario

bene <- bene %>%
  mutate(
    grupo_edad = case_when(
      edad < 60 ~ "Menor de 60",
      edad >= 60 & edad <= 64 ~ "60-64",
      edad >= 65 & edad <= 69 ~ "65-69",
      edad >= 70 & edad <= 74 ~ "70-74",
      edad >= 75 & edad <= 79 ~ "75-79",
      edad >= 80 & edad <= 84 ~ "80-84",
      edad >= 85 & edad <= 89 ~ "85-89",
      edad >= 90 ~ "90+",
      TRUE ~ "Desconocido"
    )
  )

4 Exportación de base enriquecida

write_csv(bene, "G:/Mi unidad/adultomayor/beneficiarios_completo_fnac.csv")
write_parquet(bene, "G:/Mi unidad/adultomayor/beneficiarios_completo_fnac.parquet")

5 Tabla de frecuencia por grupo de edad

bene %>%
  count(grupo_edad) %>%
  arrange(desc(n))