De datos censales a análisis demográficos con ARcenso

Taller práctico en R

Andrea Gomez Vargas & Emanuel Ciardullo

UMET - NIS

Datos censales

“El censo de población es la operación que consiste en recopilar, elaborar, evaluar, analizar y difundir, de manera simultánea, datos demográficos, económicos y sociales de todas las personas de un país o de una parte bien delimitada de un país, en un momento determinado.”1

Características esenciales que debe cumplir un censo:

  • Universalidad: cubrir a toda la población y/o todas las viviendas.

  • Simultaneidad: referirse a la misma fecha de referencia.

  • Periodicidad: realizarse en intervalos regulares, generalmente cada 10 años.

  • Individualidad: registrar datos de cada persona y cada vivienda de manera separada.

Importancia de los datos censales

  • Es una herramienta clave para entender las caracteristicas y necesidades de la población.

  • Proporcionan datos esenciales para la planificación y el desarrollo de las políticas públicas.

  • Planificación social y económica

  • Investigación académica y estudios sociales

  • Investigaciones de mercado y mucho más…

R

  • R es una herramienta orientada al trabajo estadístico y análisis de datos.

  • Es un software libre y de código abierto, lo que facilita la colaboración y reproducibilidad.

  • Es un ecosistema que favorece la interoperabilidad y el aprendizaje compartido.

Los censos de población del INDEC

Toda la información de los censos en Argentina está en censo.gob.ar

Logos censales de 1970 a 2022

Los censos que vamos a explorar hoy


Proceso de trabajo en ciencia de datos con R

ARcenso

Es una iniciativa ciudadana que nació de nuestra experiencia profesional con datos censales en el INDEC, motivada por la necesidad de contar con datos accesibles y ordenados, e inspirada en el espíritu colaborativo de la comunidad R. Con el apoyo del Programa de Campeones de rOpenSci (2023–2024).

¿Cuál es la propuesta?


Generar un paquete que permita disponer de los datos oficiales de los censos nacionales de población en Argentina provenientes del INDEC desde 1970 hasta 2022, homogeneizados, ordenados y listos para usar.

Objetivo

Disponibilidad: de excel a tablas ordenadas en R

cuadro de excel descargado

tabla ordenada en R

¿Por qué?

Análisis históricos y memoria digital


Actualmente los resultados históricos censales de 1970, 1980, 1991, 2001, 2010 y 2022 están disponibles en distintos formatos a través de libros físicos, PDFs, archivos en formato excel o en REDATAM, sin contar con un sistema o formato unificado que permita trabajar con los datos de estos seis periodos censales como base de datos.

Marco conceptual

Principios FAIR

Localizable (Findable):

Datos censales centralizados que abarcan seis periodos censales nacionales (1970–2022)

Accesible (Accessible):

Conjuntos de datos censales públicos, homogenizados, disponibles en formatos abiertos y acompañados de documentación y metadatos completos.

Interoperable (Interoperable):

Tablas ordenadas (formato tidy) y bien estructuradas que permiten una integración sencilla con otros conjuntos de datos.

Reutilizable (Reusable):

Incluye descripciones detalladas de variables, codificación estandarizada, licencias abiertas y estructuras de datos reproducibles que facilitan su uso a largo plazo y la comparación entre estudios.

Estructura y temas de los datos censales según la ONU


Temas del Censo Núcleo: Variables esenciales (ej.: edad, sexo, población)

Núcleo derivado: Variables calculadas (ej.: tasas de fecundidad)

Adicionales: Temas específicos del país (ej.: religión)

Unidades Conceptuales Población: Personas individuales

Vivienda: Unidades habitacionales físicas

Hogar: Personas que comparten una vivienda

Cobertura Geográfica

Nacional: Total del país

Jurisdicciones: (23 provincias de Argentina y la Ciudad Autónoma de Buenos Aires)

ARcenso 📦

Funciones

  • geo_metadata: Consultar códigos geográficos oficiales

  • census_metadata: Explorar el catálogo de tablas censales disponibles

  • check_repository(): Verificar tablas disponibles según año, ubicación geográfica o temática

  • get_census(): Obtener tablas censales

  • arcenso_app(): Explorar datos mediante un tablero interactivo

Documentación

Manos al código

En esta parte del taller vamos a trabajar con datos censales para construir visualizaciones e indicadores demográficos clásicos tomando como base la vignette Construyendo indicadores demográficos de ARcenso.

¿Cómo empezar?



Instalación de paquetes de trabajo

# Si no tenés remotes
install.packages("remotes")

# Instalar ARcenso desde GitHub
remotes::install_github("SoyAndrea/arcenso")

# Instalar paquetes necesarios desde CRAN
install.packages(c("dplyr", "tidyr", "ggplot2", "gt"))

Activación de paquetes con library

esto realizo cada vez que use R


library(arcenso)  # obtención de datos censales
library(dplyr)    # procesamiento de datos
library(tidyr)    # orden y transformación de datos
library(ggplot2)  # diseño de gráficos
library(gt)       # diseño de tablas

Acceso a datos censales

check_repository() - ¿Qué necesitamos?

Helpers: geo_metadata & census_metadata

check_repository(topic = "estructura", geo_code = "00")
#> # A tibble: 4 × 3
#>   id_cuadro              anio titulo                                            
#>   <chr>                 <dbl> <chr>                                             
#> 1 1970_00_estructura_01  1970 Cuadro 1. Total del país. Población total, por gr…
#> 2 1980_00_estructura_01  1980 Cuadro G3. Centros urbanos según tamaño y poblaci…
#> 3 1980_00_estructura_02  1980 Cuadro G1. Total del país. Población total según …
#> 4 1980_00_estructura_03  1980 Cuadro G2. Total del país. Población según sexo y…

Bonustrack arcenso_app() - tablero de consulta

Preparación de los datos con get_census() & dplyr

Censo 1970

poblacion_1970 <- get_census(id = "1970_00_estructura_01")


pob_1970 <- poblacion_1970 |>
  filter(sexo != "Total") |>
  mutate(
    censo = 1970,
    grupo_de_edad = case_when(
      grupo_de_edad == "0-4" ~ "00-04",
      grupo_de_edad == "5-9" ~ "05-09",
      TRUE ~ grupo_de_edad
    )
  ) |>
  rename(grupo_edad = grupo_de_edad) |>
  select(censo, sexo, grupo_edad, poblacion)

Censo 1980

poblacion_1980 <- get_census(id = "1980_00_estructura_03")


pob_1980 <- poblacion_1980 |>
  filter(
    urbano_rural == "Total",
    sexo != "Total",
    edad != "Total"
  ) |>
  mutate(
    censo = 1980,
    edad_num = ifelse(edad == "85 y más", 85, as.numeric(edad)),
    grupo_edad = case_when(
      edad_num %in% c(0:4)   ~ "00-04",
      edad_num %in% c(5:9)   ~ "05-09",
      edad_num %in% c(10:14) ~ "10-14",
      edad_num %in% c(15:19) ~ "15-19",
      edad_num %in% c(20:24) ~ "20-24",
      edad_num %in% c(25:29) ~ "25-29",
      edad_num %in% c(30:34) ~ "30-34",
      edad_num %in% c(35:39) ~ "35-39",
      edad_num %in% c(40:44) ~ "40-44",
      edad_num %in% c(45:49) ~ "45-49",
      edad_num %in% c(50:54) ~ "50-54",
      edad_num %in% c(55:59) ~ "55-59",
      edad_num %in% c(60:64) ~ "60-64",
      edad_num %in% c(65:69) ~ "65-69",
      edad_num %in% c(70:74) ~ "70-74",
      edad_num %in% c(75:79) ~ "75-79",
      edad_num %in% c(80:84) ~ "80-84",
      TRUE ~ "85 y más"
    )
  ) |>
  select(-edad, -urbano_rural, -edad_num) |>
  select(censo, sexo, grupo_edad, poblacion)

##Construcción de la base integrada

poblacion <- bind_rows(pob_1970, pob_1980) |>
  mutate(
    poblacion = as.numeric(poblacion),
    sexo = factor(sexo, levels = c("Varones", "Mujeres")),
    grupo_edad = factor(
      grupo_edad,
      levels = c(
        "00-04", "05-09", "10-14", "15-19", "20-24",
        "25-29", "30-34", "35-39", "40-44", "45-49",
        "50-54", "55-59", "60-64", "65-69", "70-74",
        "75-79", "80-84", "85 y más"))
  )

Estructura de la población

A partir de esta base integrada, exploramos algunos cambios en la estructura de la población entre 1970 y 1980 mediante visualizaciones e indicadores demográficos.

head(poblacion)
#> # A tibble: 6 × 4
#>   censo sexo    grupo_edad poblacion
#>   <dbl> <fct>   <fct>          <dbl>
#> 1  1970 Varones 00-04        1196950
#> 2  1970 Mujeres 00-04        1158350
#> 3  1970 Varones 05-09        1163050
#> 4  1970 Mujeres 05-09        1133950
#> 5  1970 Varones 10-14        1114300
#> 6  1970 Mujeres 10-14        1086850

Pirámide poblacional

Calculamos la distribución relativa de la población dentro de cada censo para comparar la estructura poblacional entre 1970 y 1980 independientemente del tamaño total de la población.

piramide <- poblacion |>
  group_by(censo, sexo) |>
  mutate(
    poblacion_rel = if_else(
      sexo == "Varones",
      -poblacion / sum(poblacion),
       poblacion / sum(poblacion))) |>
  ungroup()

Gráfico comparativo entre censos con ggplot2

# Pirámide comparativa
piramide_plot <- piramide |>
  ggplot(aes(x = poblacion_rel, y = grupo_edad, fill = sexo)) +
  geom_col() +
  facet_wrap(~ censo, ncol = 2) +
  scale_fill_manual(values = c("#00f59b", "#7014f2")) +
  scale_x_continuous(
    labels = function(x) paste0(abs(round(x * 100, 1)), "%"),
    limits = c(-0.15, 0.15),
    breaks = seq(-0.15, 0.15, by = 0.05)) +
  labs(
    title    = "Estructura de la población por sexo y grupo quinquenal de edad",
    subtitle = "Total del país. Años 1970 y 1980",
    x        = "Porcentaje",
    y        = "Grupo quinquenal de edad",
    caption  = "Fuente: INDEC, Censo Nacional de Población 1970 y 1980. Procesado con ARcenso.",
    fill     = "Sexo") +
  theme_bw() +
  theme(
    legend.position = "bottom",
    strip.text = element_text(face = "bold", size = 12) )

piramide_plot

Construcción de indicadores demográficos

Índice de envejecimiento

Compara la cantidad de personas mayores (65 años y más) con la población más joven (0 a 14 años). Permite ver de forma simple si la población tiene más peso en las edades jóvenes o en las edades más avanzadas.

envejecimiento <- poblacion |>
  group_by(censo) |>
  summarise(
    poblacion_0a14   
    = sum(poblacion[grupo_edad %in% c("00-04", "05-09", "10-14")]),
    poblacion_65ymas = 
      sum(poblacion[grupo_edad %in% c("65-69", "70-74", "75-79", "80-84", "85 y más")]),
    indice = 
      round(poblacion_65ymas / poblacion_0a14 * 100, 0))

Tabla comparativa con gt

tabla_envejecimiento  <- gt(envejecimiento) |>
  tab_header(
    title    = "Comparación del índice de envejecimiento",
    subtitle = "Argentina. Años 1970 y 1980") |>
  tab_spanner(
    label   = "Población",
    columns = c(poblacion_0a14, poblacion_65ymas) ) |>
  fmt_number(
    columns  = c(poblacion_0a14, poblacion_65ymas),
    decimals = 0,
    sep_mark = ".",
    dec_mark = "," ) |>
  cols_label(
    poblacion_0a14   = "0 a 14 años",
    poblacion_65ymas = "65 años y más",
    indice           = "Índice") |>
  tab_source_note(
    source_note = 
      md("**Fuente:** elaboración propia en base a datos de INDEC (Censos Nacionales de Población 1970 y 1980)."))



tabla_envejecimiento 
Comparación del índice de envejecimiento
Argentina. Años 1970 y 1980
censo
Población
Índice
0 a 14 años 65 años y más
1970 6.853.450 1.631.400 24
1980 8.480.768 2.290.564 27
Fuente: elaboración propia en base a datos de INDEC (Censos Nacionales de Población 1970 y 1980).

Índice de feminidad

Este indicador muestra cuántas mujeres hay por cada 100 varones en un grupo especifico de población. En este caso, lo analizamos en edades mayores a 60 años.

feminidad <- poblacion |>
  filter(
    grupo_edad %in% c("60-64", "65-69", "70-74", "75-79", "80-84", "85 y más")
  ) |>
  group_by(censo, grupo_edad, sexo) |>
  summarise(poblacion = sum(poblacion), .groups = "drop") |>
  pivot_wider(names_from = sexo, values_from = poblacion) |>
  mutate(
    indice_feminidad = round(Mujeres / Varones * 100, 0)
  ) |>
  select(-Varones, -Mujeres)

Grafico comparativo con ggplot2

 feminidad_plot <- feminidad |>
  pivot_wider(
    names_from   = censo,
    values_from  = indice_feminidad,
    names_prefix = "censo_"
  ) |>
  ggplot(aes(y = grupo_edad)) +
  geom_segment(
    aes(x = censo_1970, xend = censo_1980, yend = grupo_edad),
    color = "grey85",
    linewidth = 1) +
  geom_point(aes(x = censo_1970), color = "#ff0f7b", size = 3) +
  geom_point(aes(x = censo_1980), color = "#f89b29", size = 3) +
  geom_text(aes(x = censo_1970, label = censo_1970), hjust = 1.4, size = 3) +
  geom_text(aes(x = censo_1980, label = censo_1980), hjust = -0.4, size = 3) +
  labs(
    x        = "Mujeres por cada 100 varones",
    y        = "Grupo de edad",
    title    = "Cambio en el índice de feminidad de la población de 60 años y más",
    subtitle = "Argentina. Años 1970 y 1980",
    caption  = "Fuente: INDEC, Censo Nacional de Población 1970 y 1980. Procesado con ARcenso."
  ) +
  theme_minimal()

feminidad_plot

Índice de Whipple

Es un indicador clásico utilizado para medir la llamada atracción de dígitos.

edad_simple_1980 <- get_census(id = "1980_00_estructura_03") |>
  filter(
    urbano_rural == "Total",
    sexo == "Total",
    edad != "Total",
    edad != "85 y más") |>
  mutate(
    edad = as.numeric(edad),
    poblacion = as.numeric(poblacion))

whipple <- edad_simple_1980 |>
  filter(edad >= 23, edad <= 62) |>
  summarise(
    pob_multiplos_5 = sum(poblacion[edad %in% seq(25, 60, by = 5)]),
    pob_total       = sum(poblacion),
    indice_whipple  = round(pob_multiplos_5 / (pob_total / 5) * 100, 1) )

Tabla

tabla_whipple <- gt(whipple) |>
  tab_header(
    title    = "Índice de Whipple",
    subtitle = "Argentina. Censo 1980 (población de 23 a 62 años)") |>
  fmt_number(
    columns  = c(pob_multiplos_5, pob_total),
    decimals = 0,
    sep_mark = ".",
    dec_mark = ",") |>
  cols_label(
    pob_multiplos_5 = "Población en edades múltiplo de 5",
    pob_total       = "Población total (23 a 62 años)",
    indice_whipple  = "Índice") |>
  tab_source_note(
    source_note = 
      md("**Fuente:** elaboración propia en base a datos de INDEC (Censo Nacional de Población 1980). Escala de referencia: <105 muy preciso, 105–124 aceptable, ≥125 deficiente.")) 



tabla_whipple
Índice de Whipple
Argentina. Censo 1980 (población de 23 a 62 años)
Población en edades múltiplo de 5 Población total (23 a 62 años) Índice
2.801.322 13.134.697 106.6
Fuente: elaboración propia en base a datos de INDEC (Censo Nacional de Población 1980). Escala de referencia: <105 muy preciso, 105–124 aceptable, ≥125 deficiente.

Visualización de la información

El proceso que trabajamos


¿Cómo citar?

Si utilizas ARcenso en investigaciones, publicaciones o proyectos, te invitamos a citar el paquete

citation("arcenso")
#> To cite arcenso in publications use:
#> 
#>   Gomez Vargas A, Ciardullo E (2026). _ARcenso: Data from Argentina's
#>   Population Census_. R package version 0.2.1,
#>   <https://soyandrea.github.io/arcenso/>.
#> 
#> A BibTeX entry for LaTeX users is
#> 
#>   @Manual{,
#>     title = {ARcenso: Data from Argentina's Population Census},
#>     author = {Andrea {Gomez Vargas} and Emanuel Ciardullo},
#>     year = {2026},
#>     note = {R package version 0.2.1},
#>     url = {https://soyandrea.github.io/arcenso/},
#>   }

¿Cómo chequear los resultados?

Verificar la información en la fuente oficial nunca está de más

1970

1980

2022

Preguntas

Gracias 😁