Primeros pasos

En Contornos trabajamos con diferentes tipos de herramientas, entre ellas lenguajes de programación como R, Python, CSS, HTML, etc. Sin embargo, nuestro lenguaje predilecto suele ser R, debido a que nos proporciona una versatilidad muy grande en cuanto a la exploración, desarrollo y análisis de datos.

En esta oportunidad la idea es mostrar un poco cómo desde la consultora trabajamos con distintos tipos de datos y cómo se puede utilizar la información del último censo (2022) para hacer diferentes análisis. Para aquellas personas que tienen una idea general de R, esto va a ser muy sencillo de seguir y replicar, y para aquellos que no, pueden saltear las líneas de código y quedarse con el análisis que presentamos del censo.

# Cargamos las librerias que vamos a utilizar

library(tidyverse)
library(tidytext)
library(readr)
library(sf)
library(leaflet)
library(ggplot2)
library(leafsync)

Las librerías en R son un conjunto de funciones que nos permite trabajar de una mejor manera y mucho más rápido. Ahora bien, ustedes me dirán y ¿Qué es una función? , a lo cual respondo que es un conjunto de comandos, una serie de tareas que yo le indico que haga de forma automática. En este el primer paso al trabajar con R (siempre y cuando las librerías estén instaladas, sino el primer paso es instalar las librerías)

Sin mas vueltas, vamos a cargar los datos de censo 2022 en la Provincias de Buenos Aires para ver qué nos muestra:

setwd("~/pob")
# cargamos los datos
censo_2022 <- read_delim("Censo_2022.csv",
                         delim = ";", escape_double = FALSE, 
                         col_types = cols(poblacion_2022 = col_number()),
                         locale = 
                           locale(date_names = "es", encoding = "ISO-8859-1"),
                         trim_ws = TRUE)
#miramos qué datos contiene la tabla
head(censo_2022)

La primera línea de código, indica que cargamos los datos de censo bajo la variable “censo_2022” y con la segunda línea le estoy pidiendo que me muestre las primeras filas de esa tabla que acabo de cargar. Si por ej quisiera ver cuales son los municipios con mayo o menor cantidad de población del censo, podría hacer lo que se muestra a continuación

#Indicamos que nos muestre las filas con mayor cantidad de población 
#El desc() indica que sea de mayor a menos
censo_2022 %>% arrange(desc(poblacion_2022))
#Indicamos que nos muestre las filas con menor cantidad de población 
#En este caso, la función predeterminada de arrange es de menor a mayor así que no es necesario agregarle nada más
censo_2022 %>% arrange(poblacion_2022)

Una vez que cargamos la tabla y vimos cómo están conformados los datos podemos generar un gráfico para observar de manera directa la distribución poblacional en la provincia de Buenos Aires.

# Hacemos un gráfico con los distritos con mayor cantidad poblacional 

mayor_pob <- censo_2022 %>% arrange(desc(poblacion_2022)) %>% head(10) %>%
  ggplot(mapping = aes(x = reorder(distrito, poblacion_2022), 
                       y = poblacion_2022, fill = distrito, ordered=TRUE)) +
  geom_bar(stat = "identity", colour = "black", show.legend = F) + coord_flip() + theme_classic() + 
  xlab(NULL) + ylab("Población") + 
  labs(title = "Distritos con mayor población") + 
  geom_label(
    aes(label = prettyNum(poblacion_2022, big.mark = ".", decimal.mark = ",", scientific = FALSE)),
    size = 2.5, fontface = "bold",
    fill = "white", label.size = 0, position = position_stack(vjust=0.5))
print(mayor_pob)

menor_pob <- censo_2022 %>% arrange(poblacion_2022) %>% head(10) %>%
  ggplot(mapping = aes(x = reorder(distrito, -poblacion_2022), 
                       y = poblacion_2022, fill = distrito, ordered=TRUE)) +
  geom_bar(stat = "identity", colour = "black", show.legend = F) + coord_flip() + theme_classic() + 
  xlab(NULL) + ylab("Población") + 
  labs(title = "Distritos con menor población") + 
  geom_label(
    aes(label = prettyNum(poblacion_2022, big.mark = ".", decimal.mark = ",", scientific = FALSE)),
    size = 2.5, fontface = "bold",
    fill = "white", label.size = 0, position = position_stack(vjust=0.5))

print(menor_pob)

De esta manera podemos observar asi que en los gráficos que muestra la mayor concentración poblacional se localiza en lo que se denomina “Gran Buenos Aires” con excepción de La Plata (capital de la provincia) y General Pueyrredón. A su vez la menor concentración se localiza en su totalidad en el interior de la provincia. Ya hace varios censos que el INDEC hace la distinción entre Gran Buenos Aires y los demas distritos de la provinicia, analicemos un poco esa división. El Gran Buenos Aires se compone de 24 distritos ubicados en el primer y segundo cordón del conurbano, a continuación vamos a agregarle una columna a nuestra tabla para distinguir a los municipios del GBA:

#Creamos un vector con los 24 distritos del GBA

GBA <- c("Almirante Brown",     "Avellaneda",   "Berazategui",  "Esteban Echeverría",
  "Ezeiza", "Florencio Varela", "General San Martín",   "Hurlingham",   "Ituzaingó",
  "José C. Paz",    "La Matanza",   "Lanús",    "Lomas de Zamora",  "Malvinas Argentinas",
  "Merlo",  "Moreno",   "Morón",    "Quilmes",  "San Fernando", "San Isidro",   "San Miguel",
  "Tigre",  "Tres de Febrero",  "Vicente López")

#Agregamos una columna llamada "clasificación", la cual revisará la columna distritos y si encuentra coincidencia con el vector creado arriba (llamado GBA) lo clasificará como Gran Buenos Aires, sino le pondrá el nombre de Resto PBA 
 
censo_2022 <- censo_2022 %>%
  mutate(clasificacion = if_else(distrito %in% GBA, "Gran Buenos Aires", "Resto PBA"))

#Por último contamos cuántos distritos hay de cada clasificación para asegurarnos un resultado exitoso
censo_2022 %>% count(clasificacion)

Tenerlos divididos de esta manera nos va a ser útil a la hora de ver cuánta población concentra cada clasificacion.

#Sumamos la población según la clasificación que tengan y agregamos una columna de porcentaje para poder verlo mejor
censo_2022 %>% group_by(clasificacion) %>% summarise(poblacion_2022 = sum(poblacion_2022)) %>% 
  mutate(porcentaje = (poblacion_2022*100)/sum(poblacion_2022))

Una de las mejores formas de ver cómo se distribuye la población en un lugar, es a través de mapas de calor que nos muestran la distribución poblacional en un determinado territorio, para eso para usar la librería sp para trabajar con polígonos y leaflet para crear el mapa

#  Cargamos los polígonos para trazar el mapa 
partidos_sf <- read_sf("~/pob/Limite_partidos/Shapefile/Partidos.shp") %>% st_transform(crs = "+proj=longlat +datum=WGS84") %>% 
  rename(distrito = nam) %>% select(distrito, geometry)
partidos_sf <- partidos_sf %>% mutate(distrito = str_replace_all(string = distrito, pattern = "Gral.", replacement = "General"))
# Hacemos el entrecruce con el nombre de los distritos
mapa_censo <- censo_2022 %>% inner_join(partidos_sf, by = "distrito") %>% 
  st_as_sf %>%
  st_transform(crs = "+proj=longlat +datum=WGS84")

paleta_color <- colorBin(palette = "OrRd", domain = mapa_censo$poblacion_2022, n = 9)

leaflet() %>% addTiles() %>%
  addPolygons(data = mapa_censo, weight = 1, color = "black", 
              label = paste0(as.character(mapa_censo$distrito), " | Población: ", as.character(format(mapa_censo$poblacion_2022, big.mark = "."))),
              fillColor = paleta_color(mapa_censo$poblacion_2022), fillOpacity = 0.8) %>%
  addLegend(position = "bottomright", pal = paleta_color, values = mapa_censo$poblacion_2022, title = "Población")

Como podemos ver, debido a la concentración poblacional del Gran Buenos Aires, el mapa que se genera termina siendo de un color pálido en gran parte del territorio; esto se debe a que la diferencia entre la población de distritos del GBA con los del interior de la provincia es muy grande, es por eso que los distritos del conurbano se encuentran con un color más fuerte mientras los demás practicamente estan en blanco. Para ver un poco mejor la distribución, vamos a utilizar:

# .Dividimos el mapa en dos, por un lado GBA y por otro el resto de la provincia
mapa_censo_gba <- mapa_censo %>% filter(clasificacion == "Gran Buenos Aires")
mapa_censo_resto <- mapa_censo %>% filter(clasificacion == "Resto PBA")

paleta_color_gba <- colorBin(palette = "OrRd", domain = mapa_censo_gba$poblacion_2022, n = 9)
paleta_color_resto <- colorBin(palette = "OrRd", domain = mapa_censo_resto$poblacion_2022, n = 9)

Gran_BA <- leaflet() %>% addTiles() %>%
  addPolygons(data = mapa_censo_gba, weight = 1, color = "black",
              label = paste0(as.character(mapa_censo_gba$distrito), " | Población: ", as.character(format(mapa_censo_gba$poblacion_2022, big.mark = "."))),
              fillColor = paleta_color_gba(mapa_censo_gba$poblacion_2022), fillOpacity = 0.8) %>%
  addLegend(position = "bottomright", pal = paleta_color_gba, values = mapa_censo_gba$poblacion_2022, title = "Población", opacity = 0.7)

Resto_PBA <- leaflet() %>% addTiles() %>%
  addPolygons(data = mapa_censo_resto, weight = 1, color = "black",
              label = paste0(as.character(mapa_censo_resto$distrito), " | Población: ", as.character(format(mapa_censo_resto$poblacion_2022, big.mark = "."))),
              fillColor = paleta_color_resto(mapa_censo_resto$poblacion_2022), fillOpacity = 0.8) %>%
  addLegend(position = "bottomright", pal = paleta_color_resto, values = mapa_censo_resto$poblacion_2022, title = "Población")

leafsync::sync(Gran_BA, Resto_PBA)

Expectativa vs realidad

A partir del censo 2010 se generaron proyecciones de cada departamento, partido y comuna para el período 2010-2025. La idea de esta sección es identificar hasta qué punto podemos ver una coincidencia entre el censo y la proyección del 2022.

# Cargamos la data con la proyección 2022
setwd("~/pob")
proyeccion_2022 <- read_delim("estimaciones_2022.csv",
                         delim = ";", escape_double = FALSE, 
                         col_types = cols(poblacion_2022 = col_number()),
                         locale = 
                           locale(date_names = "es", encoding = "ISO-8859-1"),
                         trim_ws = TRUE)

Ahora como hicimos en el caso del diseño del mapa vamos a hacer un join, este comando sirve para entrecruzar tablas con una columna en común (en este caso los nombres de los distritos)

# Creamos una nueva tabla a partir del join

pro_censo_2022 <- censo_2022 %>% inner_join(proyeccion_2022, by = "distrito")

# veamos como queda conformada la tabla
head(pro_censo_2022)

Lo que podemos hacer a partir de esto es restar la proyección con el censo para ver cuáles son los distritos que menos se adecuaron a lo plasmado por el INDEC con el censo de 2010

pro_censo_2022 <- pro_censo_2022 %>% mutate(diferencia = (poblacion_2022-proyeccion_2022))

# veamos como queda con solo el distrito y la diferencia
pro_censo_2022 %>% select(distrito, diferencia)

Teniendo en cuenta cómo hicimos el cálculo, que el número sea positivo significa que el censo superó a la proyección, es decir se incrementó la población de una manera que la proyección no supo prever. Caso contrario, cuando el número es negativo implica que la cantidad de población que nos arroja el censo es menor a la proyectada. Miremos cómo son los tops al igual que hicimos anteriormente con gráficos.

mayor_proy <- pro_censo_2022 %>% arrange(desc(diferencia)) %>% head(10) %>%
  ggplot(mapping = aes(x = reorder(distrito, diferencia), 
                       y = diferencia, fill = distrito)) +
  geom_bar(stat = "identity", colour = "black", show.legend = F) + coord_flip() + theme_classic() + 
  xlab(NULL) + ylab("Proyección-Censo") + 
  labs(title = "Distritos con mayor crecimiento poblacional que proyección") + 
  geom_label(
    aes(label = prettyNum(diferencia, big.mark = ".", decimal.mark = ",", scientific = FALSE)),
    size = 2.5, fontface = "bold",
    fill = "white", label.size = 0, position = position_stack(vjust=0.5))
print(mayor_proy)

menor_proy <- pro_censo_2022 %>% arrange(diferencia) %>% head(10) %>%
  ggplot(mapping = aes(x = reorder(distrito, -diferencia), 
                       y = diferencia, fill = distrito)) +
  geom_bar(stat = "identity", colour = "black", show.legend = F) + coord_flip() + theme_classic() + 
  xlab(NULL) + ylab("Población-Censo") + 
  labs(title = "Distritos con mayor proyección que crecimiento poblacional") + 
  geom_label(
    aes(label = prettyNum(diferencia, big.mark = ".", decimal.mark = ",", scientific = FALSE)),
    size = 2.5, fontface = "bold",
    fill = "white", label.size = 0, position = position_stack(vjust=0.5))

print(menor_proy)

En los gráficos se deja ver algo sorprendente, según la proyección del censo 2010 La Matanza tendría que haber crecido casi un 30% más de lo que arrojaron los datos del censo 2022. Pero, ¿Por qué se da esta diferencia? Se utilizan diferentes fórmulas para calcular el crecimiento poblacional, uno de los componentes más importantes es la tasa anual acumulativa, es decir cuánto se incrementó la población en el período anterior (en este caso 2001-2010). Teniendo en cuenta esto, la respuesta a la pregunta de arriba radica en ver la diferencia que hay entre los últimos tres censos y ver cómo fue la evolución poblacional. Eso explicaría (al menos en parte) por qué se proyectó algo que no fue posible cumplir

Los censos del pasados

Para ver cuánto fue aumentando la población entre censo y censo, lo que vamos hacer es cargar los datos de los censos 2001 y los censo 2010. Así, vamos a poder ver la evolución de los distintos municipios de la provincia

setwd("~/pob")

# Cargamos los datos de los tres ultimos censos

censo_2022 <- read_delim("Censo_2022.csv",
                         delim = ";", escape_double = FALSE, 
                         col_types = cols(poblacion_2022 = col_number()),
                         locale = 
                           locale(date_names = "es", encoding = "ISO-8859-1"),
                         trim_ws = TRUE)

censo_2010 <- read_delim("Censo_2010.csv",
                         delim = ";", escape_double = FALSE, 
                         col_types = cols(poblacion_2022 = col_number()),
                         locale = 
                           locale(date_names = "es", encoding = "ISO-8859-1"),
                         trim_ws = TRUE)

censo_2001 <- read_delim("Censo_2001.csv",
                         delim = ";", escape_double = FALSE, 
                         col_types = cols(poblacion_2022 = col_number()),
                         locale = 
                           locale(date_names = "es", encoding = "ISO-8859-1"),
                         trim_ws = TRUE)

Ahora vamos a unir todos (joins) en una misma tabla para que podamos ver la diferencia entre ellos

# Nos queda como resultado 134 municipios (recordemos que Lezama se separa de Chascomun en 2009 asi que no hay datos disponibles para el 2001 y para el 2010 no se llego a incluirlo)
censos <- censo_2022 %>% inner_join(censo_2010, by = "distrito")
censos <- censos %>% inner_join(censo_2001, by = "distrito")
head(censos)

Ya que tenemos la tabla armada, vamos a ver la diferencia entre el 2022-2010 y el 2010-2001, para ver que resultados nos arroja

censos <- censos %>% mutate(dif_2022_2010 = poblacion_2022-poblacion_2010, 
                            dif_2010_2001 = poblacion_2010-poblacion_2001)
head(censos)

Una de las primeras preguntas que se me vienen a la cabeza es si en alguno de los períodos analizados (2022-2010 y 2010-2001) hubo un mayor incremento total de la población de la provincia. Para eso, podemos sumar esas diferencias para ver si alguno sacó mucha más diferencia

censos %>% summarise("2022_2010" = sum(dif_2022_2010), "2010_2001" = sum(dif_2010_2001))

Como vemos el periodo 2010-2001 tiene un pequeño incremento más, pero nada demasiado significativo. Vamos a ver caso por caso qué distritos fueron variando la población de forma más significativa en cada periodo.

mayor_aumento_2022 <- censos %>%
  arrange(desc(dif_2022_2010)) %>% head(10) %>%
  ggplot(mapping = aes(x = reorder(distrito, dif_2022_2010), 
                       y = dif_2022_2010, fill = distrito)) +
  geom_bar(stat = "identity", colour = "black", show.legend = F) + coord_flip() + theme_classic() + 
  xlab(NULL) + ylab("Dif de población 2022-2010") + 
  labs(title = "Aumento entre 2022-2010") + 
  geom_label(
    aes(label = prettyNum(dif_2022_2010, big.mark = ".", decimal.mark = ",", scientific = FALSE)),
    size = 2.5, fontface = "bold",
    fill = "white", label.size = 0, position = position_stack(vjust=0.5))
print(mayor_aumento_2022)

mayor_aumento_2010 <- censos %>%
  arrange(desc(dif_2010_2001)) %>% head(10) %>%
  ggplot(mapping = aes(x = reorder(distrito, dif_2010_2001), 
                       y = dif_2010_2001, fill = distrito)) +
  geom_bar(stat = "identity", colour = "black", show.legend = F) + coord_flip() + theme_classic() + 
  xlab(NULL) + ylab("Aumento entre 2010-2001") + 
  labs(title = "Dif de población periodo 2010-2001") + 
  geom_label(
    aes(label = prettyNum(dif_2010_2001, big.mark = ".", decimal.mark = ",", scientific = FALSE)),
    size = 2.5, fontface = "bold",
    fill = "white", label.size = 0, position = position_stack(vjust=0.5))

print(mayor_aumento_2010)

Veamos qué distritos decrecieron entre un censo y el otro

menor_aumento_2022 <- censos %>%
  arrange(dif_2022_2010) %>% head(10) %>%
  ggplot(mapping = aes(x = reorder(distrito, -dif_2022_2010), 
                       y = dif_2022_2010, fill = distrito)) +
  geom_bar(stat = "identity", colour = "black", show.legend = F) + coord_flip() + theme_classic() + 
  xlab(NULL) + ylab("Dif de población 2022-2010") + 
  labs(title = "Decrecimiento o menor crecimiento de población periodo 2022-2010") + 
  geom_label(
    aes(label = prettyNum(dif_2022_2010, big.mark = ".", decimal.mark = ",", scientific = FALSE)),
    size = 2.5, fontface = "bold",
    fill = "white", label.size = 0, position = position_stack(vjust=0.5))
print(menor_aumento_2022)

menor_aumento_2010 <- censos %>%
  arrange(dif_2010_2001) %>% head(10) %>%
  ggplot(mapping = aes(x = reorder(distrito, -dif_2010_2001), 
                       y = dif_2010_2001, fill = distrito)) +
  geom_bar(stat = "identity", colour = "black", show.legend = F) + coord_flip() + theme_classic() + 
  xlab(NULL) + ylab("Dif entre 2010-2001") + 
  labs(title = "Decrecimiento o menor crecimiento de población periodo 2010-2001") + 
  geom_label(
    aes(label = prettyNum(dif_2010_2001, big.mark = ".", decimal.mark = ",", scientific = FALSE)),
    size = 2.5, fontface = "bold",
    fill = "white", label.size = 0, position = position_stack(vjust=0.5))

print(menor_aumento_2010)

En la sección anterior nos preguntamos por qué había tanta diferencia entre la proyección de La Matanza para 2022 y los resultados del censo 2022. Tiene que ver con lo que mencionamos en ese momento (la tasa anual acumulativa), entre 2010 y 2001 La Matanza llegó a crecer casi un 40% por lo que la proyección indicaría que podía llegar a mantener ese ritmo de crecimiento (algo que no sucedió). Se podrán realizar diferentes teorías en cuanto al por qué de la diferencia entre un periodo u otro (errores metodológicos, conveniencias políticas, migración, etc) por lo que los invitamos a que utilicen estos datos y estas herramientas para intentar responder esas preguntas. Cualquier duda, consulta, comentario nos pueden enviar un mail a esperamos que este documento les sirva y despierte su curiosidad sobre los datos y R.