Skip to contents

Objetivo

Al final de este tutorial usted será capaz de vincular variables del Censo Demográfico brasileño con los datos de salud ya espacializados y calcular indicadores socioeconómicos y epidemiológicos estandarizados. Aprenderá a:

  • descubrir qué variables del censo están disponibles con sus_census_select();
  • descargar y agregar microdatos (o sectores) del censo a nivel municipal y unirlos a los datos de salud con sus_census_join() (mediante el paquete censobr);
  • calcular indicadores como envejecimiento, dependencia y cobertura de saneamiento — con intervalos de confianza — usando sus_socio_compute_indicators();
  • consultar el catálogo completo de indicadores con sus_socio_list_indicators().

El vínculo socioeconómico es la sexta etapa del pipeline de climasus4r. Exige que los datos ya hayan pasado por la unión espacial (Tutorial 5), pues la clave del vínculo es el código IBGE de 7 dígitos del municipio (code_muni_7).

Contexto científico

Los estudios de clima y salud rara vez pueden tratar a la población como homogénea. La vulnerabilidad social — pobreza, baja escolaridad, saneamiento precario, estructura etaria envejecida — modula la relación entre la exposición ambiental (temperatura, contaminación) y los desenlaces de salud, actuando tanto como factor de confusión como modificador de efecto (Gouveia, Hajat & Armstrong, 2003; Hajat, O’Connor & Kosatsky, 2010). Los adultos mayores en domicilios sin infraestructura adecuada, por ejemplo, sufren más durante las olas de calor.

En Brasil, la fuente oficial de estas variables es el Censo Demográfico del IBGE, accesible programáticamente mediante el paquete censobr (Pereira & Barbosa, 2023). climasus4r encapsula ese acceso en sus_census_join(), descargando el dataset elegido, filtrando solo los municipios presentes en los datos de salud antes de cargarlos en memoria (optimización Arrow/Parquet), agregando los microdatos al nivel municipal y realizando la unión por la clave geográfica.

A partir de estas variables, sus_socio_compute_indicators() calcula un conjunto de indicadores estandarizados (demográficos, socioeconómicos, de mortalidad, morbilidad, salud materno-infantil y recursos de salud), cada uno con su fórmula, multiplicador y método de incertidumbre declarados en un catálogo interno.

Aviso metodológico (sesgo ecológico). Los indicadores municipales describen el agregado, no al individuo: las asociaciones observadas entre la vulnerabilidad promedio de un municipio y sus desenlaces de salud no se transfieren automáticamente a las personas (falacia ecológica). La escala de agregación también importa — el mismo fenómeno puede cambiar de signo según la unidad (problema de la unidad de área modificable, MAUP). Use estos indicadores como covariables de área, no como atributos individuales.

Caso conductor. Investigamos la temperatura y los desenlaces de salud en adultos mayores (60+) en la Región Metropolitana de São Paulo, 2014–2019. En el Tutorial 5 espacializamos las defunciones respiratorias (J00–J99) y cardiovasculares (I00–I99) por municipio. Aquí vinculamos variables del Censo 2010 y calculamos indicadores de vulnerabilidad (envejecimiento, dependencia, cobertura de alcantarillado y agua) que servirán como covariables/modificadores de efecto en el modelado clima–salud de los próximos tutoriales.

Datos utilizados

Ítem Valor Papel en el caso
Entrada dados/caso_espacial.rds (Tutorial 5) Defunciones espacializadas por municipio (RMSP)
Dataset del censo "population" (Censo 2010) Población por municipio (adultos mayores, jóvenes, activos)
Clave de vínculo code_muni_7 (IBGE, 7 dígitos) Une salud × censo
Indicadores envejecimiento, dependencia, alcantarillado, agua Vulnerabilidad municipal
Salida dados/caso_socio.rds Entrada del Tutorial 7 (clima INMET)

Todos los datos son públicos y reales (IBGE/Censo vía censobr).

Pipeline completo

Los bloques de abajo reproducen lo que ejecuta el script scripts/tutorial_06_socioeconomico.R. Comience cargando el paquete y la entrada encadenada:

library(climasus4r)

# Saída do Tutorial 5: óbitos espacializados por município (stage "spatial",
# com a coluna code_muni_7 — chave do vínculo).
caso_espacial <- readRDS("dados/caso_espacial.rds")

Paso 1 — Descubrir variables del censo (sus_census_select())

Antes de descargar el censo, conviene descubrir los códigos de las variables. En uso interactivo, output = "browser" abre una interfaz HTML navegable; en scripts, prefiera output = "codes", que retorna un vector de códigos sin abrir el navegador:

# Códigos das variáveis de população do Censo 2010 (uso programático):
vars_pop <- sus_census_select(
  dataset = "population",  # "all", "population", "households", "families", ...
  year    = 2010,           # 2010 (padrão) ou 2000
  output  = "codes",        # "browser" (padrão), "console" ou "codes"
  lang    = "pt",
  verbose = FALSE
)
head(vars_pop)

Paso 2 — Vincular el censo (sus_census_join())

sus_census_join() descarga el dataset elegido vía censobr, filtra solo los municipios presentes en code_muni_7, agrega los microdatos al nivel municipal (aggregation_fun) y realiza el left_join. Requiere que los datos estén en la etapa >= "spatial":

caso_enriquecido <- sus_census_join(
  df              = caso_espacial,
  dataset         = "population",     # "population"/"households"/"families"/
                                       # "mortality"/"emigration"/"tracts"
  year            = 2010,             # 2010 (padrão) ou 2000
  census_vars     = head(vars_pop, 6),# NULL = todas (não recomendado)
  aggregation_fun = "sum",            # "sum","mean","median","min","max","sd",
                                       # "q25","q75","q95","q99"
  use_cache       = TRUE,             # cache local do censobr
  cache_dir       = "~/.climasus4r_cache/census",
  lang            = "pt",
  verbose         = TRUE
)

Cada variable numérica agregada recibe el sufijo del modo de agregación (ej.: V0001 agregada por suma se convierte en V0001_sum). Si la entrada es un objeto sf, la geometría se conserva en la salida.

Para usar datos de sectores censales en lugar de microdatos, cambie a dataset = "tracts" y elija la tabla en tracts_dataset (ej.: "Basico", "DomicilioRenda", "Pessoa03"):

caso_setores <- sus_census_join(
  df             = caso_espacial,
  dataset        = "tracts",
  tracts_dataset = "Basico",   # "Basico","Domicilio01/02","DomicilioRenda",
                                # "Pessoa01"..."Pessoa13","ResponsavelRenda", ...
  year           = 2010,
  lang           = "pt"
)

Paso 3 — Consultar el catálogo de indicadores (sus_socio_list_indicators())

Antes de calcular, inspeccione lo disponible. Sin red, retorna un tibble con id, name, category, required_cols, formula, multiplier, unit, uncertainty_method y source:

catalogo <- sus_socio_list_indicators(lang = "pt")

# Filtrar por categoria, se desejar:
sus_socio_list_indicators(lang = "pt", category = "mortality")

Paso 4 — Calcular indicadores (sus_socio_compute_indicators())

Los indicadores se definen en espacio de fórmula (nombres como pop_elderly, total_hh). Como las columnas provenientes del censo tienen otros nombres (ej.: V0001_sum), use col_mapping para conectar nombres de fórmula → columnas reales:

caso_socio <- sus_socio_compute_indicators(
  df               = caso_enriquecido,
  indicators       = c("aging_index", "dependency_ratio",
                       "sewage_connection_rate", "water_connection_rate"),
  col_mapping = list(
    pop_elderly = "pop_65_plus_sum",  # aponte para as colunas agregadas reais
    pop_young   = "pop_0_14_sum",
    pop_working = "pop_15_64_sum",
    pop_total   = "V0001_sum",
    total_hh    = "V003_sum",
    hh_sewage   = "V0207_sum",
    hh_water    = "V0208_sum"
  ),
  confidence_level = 0.95,   # IC de Poisson (taxas) / Wilson (proporções)
  add_ci           = TRUE,   # adiciona colunas ind_<id>_low / ind_<id>_high
  lang             = "pt",
  verbose          = TRUE
)

Cada indicador calculado se convierte en una columna ind_<id> (ej.: ind_aging_index), y — cuando el método de incertidumbre no es "none" y add_ci = TRUE — también ind_<id>_low y ind_<id>_high. Si indicators = NULL, la función detecta automáticamente todos los indicadores cuyas columnas requeridas están presentes (después del col_mapping); los indicadores sin las columnas necesarias son omitidos con aviso, nunca interrumpen la ejecución.

Al final, caso_socio se guarda (con save_tbl() en el script) y alimenta el Tutorial 7 (Clima basado en estaciones — INMET).

Características de las funciones

sus_census_select()

Explorador de las variables del censo. Ayuda a descubrir códigos para usar en sus_census_join(census_vars = ...).

Argumento ¿Esencial? Descripción
dataset recomendado "all" (predeterminado), "population", "households", "families", "mortality", "emigration", "tracts"
year opcional 2010 (predeterminado) o 2000
output recomendado "browser" (HTML interactivo, predeterminado), "console" o "codes" (vector)
lang opcional "pt" (predeterminado), "en", "es"
verbose opcional Mensajes informativos

Retorno: con "codes", un vector de caracteres con los códigos; con "browser"/"console", retorna de forma invisible un data.frame (y abre/imprime la interfaz).

sus_census_join()

Vincula variables del censo (microdatos o sectores) con los datos de salud. Wrapper de censobr::read_population(), read_households(), read_tracts(), etc.

Argumento ¿Esencial? Descripción
df sí climasus_df/sf en etapa >= "spatial", con code_muni_7
dataset sí "population" (predeterminado), "households", "families", "mortality", "emigration", "tracts"
tracts_dataset solo tracts Tabla de sectores: "Basico" (predeterminado), "DomicilioRenda", "Pessoa01..13", …
year opcional 2010 (predeterminado) o 2000
census_vars recomendado Vector de códigos (use sus_census_select()); NULL = todas
aggregation_fun opcional "sum" (predeterminado), "mean", "median", "min", "max", "sd", "q25", "q75", "q95", "q99"
join_muni_col opcional Columna del código IBGE; NULL detecta patrones SUS
use_cache / cache_dir recomendado Caché de censobr (~/.climasus4r_cache/census)
translate_columns / standardize_values opcional Traduce nombres y etiquetas (predeterminado TRUE)
lang / verbose opcional Idioma y mensajes

Retorno: el mismo df (o sf) con columnas adicionales del censo (sufijadas por el modo de agregación, ej.: _sum); los metadatos avanzan a stage = "census".

sus_socio_compute_indicators()

Calcula indicadores estandarizados sobre las columnas presentes, con intervalos de confianza opcionales.

Argumento ¿Esencial? Descripción
df sí climasus_df en etapa >= "spatial" (salida de sus_census_join())
indicators opcional Vector de IDs; NULL = todos los calculables (autodetección)
col_mapping recomendado Lista nombrada: nombre de fórmula → columna real (ej.: list(total_hh = "V003_sum"))
confidence_level opcional Nivel de confianza (predeterminado 0.95)
add_ci opcional TRUE (predeterminado) añade ind_<id>_low/_high
lang / verbose opcional Idioma y mensajes

Retorno: el climasus_df con columnas ind_<id> (y _low/_high cuando corresponda); sus_meta actualizado a type = "indicators".

sus_socio_list_indicators()

Lista el catálogo completo de indicadores. No depende de la red.

Argumento Descripción
lang Idioma de los nombres: "pt" (predeterminado), "en", "es"
category Filtra por categoría (ej.: "demographic", "mortality"); NULL = todas

Retorno: un tibble con id, name, category, required_cols, formula, multiplier, unit, uncertainty_method, source.

Fórmulas

Los indicadores se calculan como una razón (tasa/proporción) multiplicada por un factor de escala. De forma general:

indicador=(numeradordenominador)×m \text{indicador} = \left(\frac{\text{numerador}}{\text{denominador}}\right) \times m

donde mm es el multiplier declarado en el catálogo. Ejemplos usados en el caso conductor:

Índice de Envejecimiento=popidosapopjovem×100 \text{Índice de Envejecimiento} = \frac{\text{pop}_{\text{idosa}}}{\text{pop}_{\text{jovem}}} \times 100

Razón de Dependencia=popjovem+popidosapopativa×100 \text{Razón de Dependencia} = \frac{\text{pop}_{\text{jovem}} + \text{pop}_{\text{idosa}}}{\text{pop}_{\text{ativa}}} \times 100

Cobertura de Alcantarillado=domicílios com esgotototal de domicílios×100 \text{Cobertura de Alcantarillado} = \frac{\text{domicílios com esgoto}}{\text{total de domicílios}} \times 100

Intervalos de confianza. Para tasas basadas en conteo de eventos (mortalidad, incidencia, hospitalizaciones), se usa el intervalo exacto de Poisson (Garwood), basado en la distribución Gama:

ICinf=1nχα/2;2k2/2,ICsup=1nχ1−α/2;2(k+1)2/2 \text{IC}_{\text{inf}} = \frac{1}{n}\,\chi^2_{\alpha/2;\,2k}\big/2, \qquad \text{IC}_{\text{sup}} = \frac{1}{n}\,\chi^2_{1-\alpha/2;\,2(k+1)}\big/2

Para proporciones (coberturas, %), se usa el intervalo de puntuación de Wilson:

p̂±z1+z2/n[z2n+p̂(1−p̂)n+z24n2] \hat{p} \pm \frac{z}{1 + z^2/n}\left[\frac{z}{2n} + \sqrt{\frac{\hat{p}(1-\hat{p})}{n} + \frac{z^2}{4n^2}}\right]

con z=z1−α/2z = z_{1-\alpha/2}, kk el número de eventos y nn el denominador. Las razones con numeradores complejos o índices directos (ej.: Gini) no reciben IC (uncertainty_method = "none").

Resultados ilustrados

Tabla 1. Muestra del catálogo de indicadores (sus_socio_list_indicators).
id name category unit uncertainty_method source
dependency_ratio Razao de Dependencia demographic % none census
aging_index Indice de Envelhecimento demographic % none census
urbanization_rate Taxa de Urbanizacao demographic % binomial census
illiteracy_rate Taxa de Analfabetismo socioeconomic % binomial census
water_connection_rate Cobertura de Agua Encanada socioeconomic % binomial census
sewage_connection_rate Cobertura de Esgoto socioeconomic % binomial census
gini_index Indice de Gini socioeconomic index (0-1) none census
infant_mortality_rate Taxa de Mortalidade Infantil mortality per 1,000 live births poisson sim_sinasc
maternal_mortality_ratio Razao de Mortalidade Materna mortality per 100,000 live births poisson sim_sinasc
premature_dcn_mortality Mortalidade Prematura por DCNT mortality per 100,000 (30-69 years) poisson sim
homicide_rate Taxa de Homicidios mortality per 100,000 poisson sim
traffic_mortality_rate Taxa de Mortalidade por Transito mortality per 100,000 poisson sim
arbovirus_incidence_rate Taxa de Incidencia de Arboviroses morbidity per 100,000 poisson sinan
tb_incidence_rate Taxa de Incidencia de Tuberculose morbidity per 100,000 poisson sinan
icsap_hospitalization_rate Taxa de Internacoes por ICSAP morbidity per 10,000 poisson sih
respiratory_hospitalization_rate Taxa de Internacoes Respiratorias morbidity per 10,000 poisson sih
low_birth_weight_proportion Proporcao de Baixo Peso ao Nascer maternal_child % binomial sinasc
general_fertility_rate Taxa de Fecundidade Geral maternal_child per 1,000 women (15-49 years) poisson sinasc
cesarean_proportion Proporcao de Partos Cesareos maternal_child % binomial sinasc
prenatal_early_coverage Cobertura de Pre-natal Precoce maternal_child % binomial sinasc
beds_per_capita Leitos por Mil Habitantes health_resources per 1,000 none cnes
doctors_per_capita Medicos por Mil Habitantes health_resources per 1,000 none cnes

Figura 1. Número de indicadores disponibles por categoría en el catálogo de sus_socio_compute_indicators(). Las categorías cubren demografía, vulnerabilidad socioeconómica, mortalidad, morbilidad, salud materno-infantil y recursos de salud.

Tabla 2. Indicadores calculados por municipio (muestra).
name_muni ind_aging_index ind_dependency_ratio ind_sewage_connection_rate ind_water_connection_rate
Campinas 63.2 55.9 84.8 88.7
Campinas 72.6 44.2 88.5 88.4
Campinas 55.1 39.1 90.1 97.1
Campinas 47.3 52.1 89.8 96.8
Campinas 74.5 43.3 95.8 97.2
Campinas 44.1 42.9 92.8 97.6
Campinas 69.0 42.9 81.0 88.2
Campinas 66.0 60.7 93.1 88.4
Campinas NA NA NA NA
Campinas NA NA NA NA

Figura 2. Ranking municipal según el Índice de Envejecimiento (adultos mayores por 100 jóvenes, Censo 2010) en la RMSP. Los municipios más envejecidos tienden a concentrar mayor riesgo frente a extremos de temperatura.

Figura 3. Cobertura de alcantarillado por municipio con intervalo de confianza del 95% (puntuación de Wilson), tal como se produce con add_ci = TRUE. La barra de error comunica la incertidumbre de la estimación de proporción.

Figura 4. Relación entre envejecimiento y cobertura de alcantarillado en los municipios de la RMSP. Cruzar la vulnerabilidad demográfica y de infraestructura ayuda a plantear hipótesis de confusión y modificación de efecto en la relación temperatura–salud de los próximos tutoriales.

Referencias

  • Pereira, R. H. M., & Barbosa, R. J. (2023). censobr: Download Data from Brazil’s Population Census. R package version 0.4.0. https://CRAN.R-project.org/package=censobr. DOI: 10.32614/CRAN.package.censobr.
  • Gouveia, N., Hajat, S., & Armstrong, B. (2003). Socioeconomic differentials in the temperature–mortality relationship in São Paulo, Brazil. International Journal of Epidemiology, 32(3), 390–397.
  • Hajat, S., O’Connor, M., & Kosatsky, T. (2010). Health effects of hot weather: from awareness of risk factors to effective health protection. The Lancet, 375(9717), 856–863.
  • IBGE — Instituto Brasileiro de Geografia e Estatística. Censo Demográfico 2010. Rio de Janeiro: IBGE.