En este trabajo analizaremos datos relativos al acceso informal al hábitat urbano en la Ciudad de Buenos Aires. Para ello utilizaremos tres datasets espaciales del portal de datos abiertos del GCBA.
Comenzamos como siempre, activando los paquetes que utilizaremos para explorar, transformar y visualizar estos datos. En este caso, estaremos utilizando “tidyverse”, “sf” y “ggmap”:
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.3 ✓ purrr 0.3.4
## ✓ tibble 3.1.0 ✓ dplyr 1.0.5
## ✓ tidyr 1.1.3 ✓ stringr 1.4.0
## ✓ readr 1.4.0 ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(sf)
## Linking to GEOS 3.8.1, GDAL 3.1.4, PROJ 6.3.1
library(ggmap)
## Google's Terms of Service: https://cloud.google.com/maps-platform/terms/.
## Please cite ggmap if you use it! See citation("ggmap") for details.
A continuación, procederemos a importar y explorar la estructura de los tres sets de datos espaciales con los que vamos a trabajar.
comunas_caba <- st_read("data/comunas_caba.geojson")
## Reading layer `comunas' from data source `/Users/nahuel/Desktop/villas y asentamientos/data/comunas_caba.geojson' using driver `GeoJSON'
## Simple feature collection with 15 features and 6 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
## Geodetic CRS: WGS 84
str(comunas_caba)
## Classes 'sf' and 'data.frame': 15 obs. of 7 variables:
## $ BARRIOS : chr "RECOLETA" "ALMAGRO - BOEDO" "CABALLITO" "FLORES - PARQUE CHACABUCO" ...
## $ PERIMETRO: num 21453 12323 10991 17972 21412 ...
## $ AREA : num 6317265 6660603 6851029 12422901 16505306 ...
## $ COMUNAS : num 2 5 6 7 9 10 11 12 14 3 ...
## $ ID : int 1 2 3 4 5 6 7 8 9 10 ...
## $ OBJETO : chr "LIMITE COMUNAL" "LIMITE COMUNAL" "LIMITE COMUNAL" "LIMITE COMUNAL" ...
## $ geometry :sfc_MULTIPOLYGON of length 15; first list element: List of 1
## ..$ :List of 1
## .. ..$ : num [1:1196, 1:2] -58.4 -58.4 -58.4 -58.4 -58.4 ...
## ..- attr(*, "class")= chr [1:3] "XY" "MULTIPOLYGON" "sfg"
## - attr(*, "sf_column")= chr "geometry"
## - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA
## ..- attr(*, "names")= chr [1:6] "BARRIOS" "PERIMETRO" "AREA" "COMUNAS" ...
barrios_populares_caba <- st_read("data/barrios_populares_caba/barrios_vulnerables.shp")
## Reading layer `barrios_vulnerables' from data source `/Users/nahuel/Desktop/villas y asentamientos/data/barrios_populares_caba/barrios_vulnerables.shp' using driver `ESRI Shapefile'
## Simple feature collection with 966 features and 10 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 94122.57 ymin: 93082.5 xmax: 110351.9 ymax: 109078
## Projected CRS: Argentina_GKBsAs
str(barrios_populares_caba)
## Classes 'sf' and 'data.frame': 966 obs. of 11 variables:
## $ Id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ NOMBRE : chr "Asentamiento San Pablo" "Conjunto Habitacional Luzuriaga 837" "Asentamiento Matanza y Ferré" "Asentamiento Don Pedro de Mendoza y Villarino" ...
## $ NOM_MAP : chr "Asent. San Pablo" "CH Luzuriaga 837" "Asent. Matanza y Ferré" "Asent. Don Pedro de Mendoza y Villarino" ...
## $ TIPO_ASENT: chr "Asentamientos precarios" "Conjunto Habitacional" "Asentamientos precarios" "Asentamientos precarios" ...
## $ MANZANA : chr NA NA NA NA ...
## $ OBSERV : chr "Santander Nº 5.953/6.007, entre la Av. Argentina y la calle Lisandro de la Torre" "Luzuriaga 837" "Matanza y Ferré" "Don Pedro de Mendoza y Villarino" ...
## $ ALIAS : chr NA NA NA NA ...
## $ NOM_y_MZA : chr "Asentamiento San Pablo" "Conjunto Habitacional Luzuriaga 837" "Asentamiento Matanza y Ferré" "Asentamiento Don Pedro de Mendoza y Villarino" ...
## $ Superficie: num 18977 4868 2225 2134 2351 ...
## $ Brio_inter: chr NA NA NA NA ...
## $ geometry :sfc_MULTIPOLYGON of length 966; first list element: List of 1
## ..$ :List of 1
## .. ..$ : num [1:10, 1:2] 97862 97852 97856 97743 97705 ...
## ..- attr(*, "class")= chr [1:3] "XY" "MULTIPOLYGON" "sfg"
## - attr(*, "sf_column")= chr "geometry"
## - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA
## ..- attr(*, "names")= chr [1:10] "Id" "NOMBRE" "NOM_MAP" "TIPO_ASENT" ...
datos_censales_xradio <- st_read("data/caba_radios_censales.geojson")
## Reading layer `CABA_rc' from data source `/Users/nahuel/Desktop/villas y asentamientos/data/caba_radios_censales.geojson' using driver `GeoJSON'
## Simple feature collection with 3554 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -58.53092 ymin: -34.70574 xmax: -58.33455 ymax: -34.528
## Geodetic CRS: WGS 84
str(datos_censales_xradio)
## Classes 'sf' and 'data.frame': 3554 obs. of 9 variables:
## $ RADIO_ID : chr "1_1_1" "1_12_1" "1_12_10" "1_12_11" ...
## $ BARRIO : chr "RETIRO" "SAN NICOLAS" "SAN NICOLAS" "SAN NICOLAS" ...
## $ COMUNA : chr "1" "1" "1" "1" ...
## $ POBLACION : num 336 341 296 528 229 723 393 600 472 786 ...
## $ VIVIENDAS : num 82 365 629 375 445 744 341 505 504 546 ...
## $ HOGARES : num 65 116 101 136 129 314 209 275 202 347 ...
## $ HOGARES_NBI: num 19 25 1 7 16 104 110 32 49 89 ...
## $ AREA_KM2 : num 1.799 0.0186 0.0444 0.3663 0.0184 ...
## $ geometry :sfc_MULTIPOLYGON of length 3554; first list element: List of 1
## ..$ :List of 1
## .. ..$ : num [1:409, 1:2] -58.4 -58.4 -58.4 -58.4 -58.4 ...
## ..- attr(*, "class")= chr [1:3] "XY" "MULTIPOLYGON" "sfg"
## - attr(*, "sf_column")= chr "geometry"
## - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA
## ..- attr(*, "names")= chr [1:8] "RADIO_ID" "BARRIO" "COMUNA" "POBLACION" ...
Como puede advertirse, se trata de tres dataframes de datos espaciales: el primero de ellos contiene datos generales de los polígonos de las comunas de la Ciudad de Buenos Aires; el segundo, de sus villas y asentamientos; y el tercero, datos sociodemográficos correspondienteas al último censo para cada uno de los radios censales de la ciudad. Asimismo, puede apreciarse que dos de nuestros dataframes tienen un sistama de coordenadas de referencia (CRS) geodésicos y uno de ellos proyectado, de modo tal que, como veremos más adelante, neceesitaremos compatibilizarlos.
Antes de poder generar visualizaciones de los datos que estamos analizando debermos realizar algunas transformaciones. Como en este trabajo estaremos uniendo datos a través de sus ubicaciones espaciales, precisamos compatibilizar, como hemos adelantado, el sistema de coordenadas de referencia (CRS) de los dataframes con los que trabajaremos entre sí. Asimismo los simplificaremos, para quedarnos sólo con las variables y las observaciones que nos interesan a los efectos de lo que queremos analizar.
comunas_caba <- comunas_caba %>%
st_transform(crs=st_crs(barrios_populares_caba)) %>%
rename(COMUNA=COMUNAS) %>%
mutate(COMUNA=as.factor(COMUNA)) %>%
select(COMUNA, geometry)
datos_censales_xradio <- st_transform(datos_censales_xradio, crs=st_crs(barrios_populares_caba))
barrios_populares_caba <- barrios_populares_caba %>%
group_by(NOMBRE) %>%
summarise()
datos_censales_barrios_populares <- barrios_populares_caba %>%
group_by(NOMBRE) %>%
summarise() %>%
st_join(datos_censales_xradio)
ESTA OPERACIÓN NOS HA DEVUELTO VARIAS OBSERVACIONES DUPLICADAS QUE CORRESPONDEN A UN MISMO RADIO CENSAL. AL COINCIDIR ÉSTOS CON LA GEOMETRÍA DE UN POLÍGONO REGISTRADO BAJO BARRIOS DE DIFERENTES NOMBRE, LA FUNCIÓN UTILIZADA HA ARROJADO TANTAS OBSERVACIONES COMO BARRIOS DE DIREFENTE DENOMINACIÓN HA ENCONTRADO PARA UN MISMO RADIO CENSAL, MULTIPLICANDO LAS OBSERVACIONES CORRESPONDIENTES A LOS DATOS CENSALES DE ESOS RADIOS. HEMOS CONTINUADO CON EL EJERCICIO A FIN DE COMPLETAR LAS VISUALIZACIONES Y REQUERIDAS, DADO QUE LOS DUPLICADOS SE ENCUENTRAN HOMOGENEAMENTE DISTRIBUIDOS Y PERMITEN REALIZAR ALGUNAS COMPARACIONES DE LAS RELACIONES RELATIVAS ENTRE LOS DATOS, MÁS ALLÁ DE SUS VALORES ABSOLUTOS, PERO DEBE TENERSE EN CUENTA QUE PARA UN CORRECTO ANÁLISIS ES NECESARIO ELIMINAR ESTOS DUPLICADOS.
datos_barrios_populares_por_comuna <- datos_censales_barrios_populares %>%
st_set_geometry(NULL) %>%
group_by(COMUNA) %>%
summarise(POBLACION=sum(POBLACION),
HOGARES=sum(HOGARES),
VIVIENDAS=sum(VIVIENDAS)) %>%
mutate(COMUNA=as.factor(COMUNA))
datos_barrios_populares_por_comuna
## # A tibble: 15 x 4
## COMUNA POBLACION HOGARES VIVIENDAS
## <fct> <dbl> <dbl> <dbl>
## 1 1 38437 12638 11537
## 2 10 10590 3866 4536
## 3 11 7679 2847 3245
## 4 12 9538 3310 3461
## 5 13 7294 2886 3721
## 6 14 25 6 21
## 7 15 17890 5801 5980
## 8 2 1141 287 262
## 9 3 3522 1517 1833
## 10 4 110202 35540 35028
## 11 5 2476 1018 1313
## 12 6 629 288 373
## 13 7 77546 23066 18765
## 14 8 237030 70849 60959
## 15 9 32935 10312 10468
datos_barrios_populares_por_comuna2 <- datos_barrios_populares_por_comuna %>%
pivot_longer(cols = 2:4, names_to ="INDICADOR", values_to = "CANTIDAD")
datos_barrios_populares_por_comuna_geo <- comunas_caba %>%
left_join(datos_barrios_populares_por_comuna, by="COMUNA")
En nuestra primera visualización crearemos un gráfico de barras que contraste las cantidades de viviendas, hogares y población de villas y asentamientos existente en cada comuna de la Ciudad de Buenos Aires:
ggplot(data=datos_barrios_populares_por_comuna2, aes(fill=INDICADOR, y=CANTIDAD, x=COMUNA)) +
geom_bar(stat="identity", position="dodge") +
scale_x_discrete(limit = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"))+
scale_fill_viridis_d()+
theme_minimal() +
theme(plot.title = element_text(face="bold", size=15)) +
theme(axis.title.x = element_text(face="bold", vjust=-0.5, colour="darkgray", size=12)) +
theme(axis.title.y = element_text(face="bold", vjust=-0.5, colour="darkgray", size=12)) +
labs(title = "Acceso informal al hábitat urbano en CABA",
subtitle = "Viviendas, hogares y población de villas y asentamientos por comuna",
x = "Comuna",
caption = "fuente: Buenos Aires Data",
fill = NULL)
En el gráfico puede verse que la mayor proporción de población, hogares y viviendas de villas y asentamientos se concentra en las comunas 1, 4, 7, 8 y 9 y que la Comuna 8 registra más del doble de población, hogares y viviendas que cualquier otra comuna de la ciudad. Ello da cuenta de que el acceso informal al hábitat urbano tiene una clara localización, que nos habla de una importante segregación socioespacial. Si bien en el presente análisis no nos estamos enfocando en una comparación de los datos sociodemográficos de villas y asentamientos con los del resto de la ciudad, en el gráfico puede apreciarse que en varias comunas la cantidad de hogares se encuentra por encima de la cantidad de viviendas, es decir, se registra hacinamiento de hogares por vivienda; contrastado con la existencia de vivienda ociosa presente en la ciudad cuando se la considera de conjunto. Para cuantificar esta impresión a simple vista, a continuación calculamos el tamaño promedio del hogar y el promedio de hogares por vivienda en villas y asentamientos y para el conjunto de la ciudad.
prom_hogares_por_vivienda <- mean(datos_barrios_populares_por_comuna$HOGARES/datos_barrios_populares_por_comuna$VIVIENDAS)
prom_hogares_por_vivienda
## [1] 0.9116299
prom_hogares_por_vivienda_caba <- mean(sum(datos_censales_xradio$HOGARES)/sum(datos_censales_xradio$VIVIENDAS))
prom_hogares_por_vivienda_caba
## [1] 0.8062979
tamaño_promedio_del_hogar <- mean(datos_barrios_populares_por_comuna$POBLACION/datos_barrios_populares_por_comuna$HOGARES)
tamaño_promedio_del_hogar
## [1] 3.00354
tamaño_promedio_del_hogar_caba <- mean(sum(datos_censales_xradio$POBLACION)/sum(datos_censales_xradio$HOGARES))
tamaño_promedio_del_hogar_caba
## [1] 2.512882
En efecto, ambos indicadores resultan mayores para las villas y asentamientos que para la ciudad tomada en su conjunto. Si bien para un análisis más completo del grado de hacinamiento en la ciudad deberíamos considerar el promedio de personas por dormitorio o por superficie, estos indicadores ya nos dan una idea de que el hacinamiento se concentra en mayor proporción, en promedio, en las villas y asentamientos.
Para nuestra segunda visualización, realizamos un mapa de coropletas, que nos permite ubicar los datos analizados en el espacio de una manera más inmediata:
comunas_caba <- st_transform(comunas_caba, crs=4326)
datos_barrios_populares_por_comuna_geo <- st_transform(datos_barrios_populares_por_comuna_geo, crs=4326)
bbox_comunas <- as.numeric(st_bbox(comunas_caba))
mapa_caba <- get_stamenmap(bbox = bbox_comunas, maptype = "toner-lite", zoom=12)
## Source : http://tile.stamen.com/toner-lite/12/1382/2467.png
## Source : http://tile.stamen.com/toner-lite/12/1383/2467.png
## Source : http://tile.stamen.com/toner-lite/12/1384/2467.png
## Source : http://tile.stamen.com/toner-lite/12/1382/2468.png
## Source : http://tile.stamen.com/toner-lite/12/1383/2468.png
## Source : http://tile.stamen.com/toner-lite/12/1384/2468.png
## Source : http://tile.stamen.com/toner-lite/12/1382/2469.png
## Source : http://tile.stamen.com/toner-lite/12/1383/2469.png
## Source : http://tile.stamen.com/toner-lite/12/1384/2469.png
ggmap(mapa_caba)+
geom_sf(data=datos_barrios_populares_por_comuna_geo, aes(fill=POBLACION), inherit.aes = FALSE, alpha=0.9)+
scale_fill_viridis_c() +
theme_void() +
theme(plot.title = element_text(face="bold", size=15)) +
labs(title = "Segregacion espacial en CABA",
subtitle = "Habitantes de villas y asentamientos por comuna",
caption = "fuente: Buenos Aires Data",
fill = "población en VyA")
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.
El mapa coroplético permite identificar patrones espaciales con facilidad. Es así que nos muestra mucho más inmediantamente que el gráfico de barras que la concentración de la población que vive en villas y asentamientos se localiza en la zona sur y este de la ciudad, poniendo de manifiesto la existencia de un patrón evidente de segregación socioespacial.