Se deja aquí sentado el código usado de forma abierta para que pueda ser reproducido por cualquier usuario. Esto hace que la metodologia sea más transparente.
Se detalla la metodología y datos utilizados:
Los datos fueron descargados de fuentes de datos púlicos:
-> el último informe de RENABAP para barrios populares -> Ciudad de Buenos Aires para mapas de barrios -> Open Street maps (google maps pero open source) para transporte
Para un futuro se puede buscar un repositorio púbilco estatal para un segundo análisis.
library(tidyverse)
library(sf)#for spatial data
library(btb)#for kernel density
library(maptools)
library(raster)
library(spatstat)
library(ggmap)
library(leaflet)
library(osrm)
library(osmdata)
library("RColorBrewer")
Los barrios populres fueron descargados de la última versión disponible del RENABAP
#barrios populares
barrios_pop <- st_read("https://datosabiertos.desarrollosocial.gob.ar/dataset/0d022767-9390-486a-bff4-ba53b85d730e/resource/97cc7d10-ad4c-46cb-9ee4-becb402adf9f/download/2022-07-13_info_publica.geojson")
## Reading layer `2022-07-13_info_publica' from data source
## `https://datosabiertos.desarrollosocial.gob.ar/dataset/0d022767-9390-486a-bff4-ba53b85d730e/resource/97cc7d10-ad4c-46cb-9ee4-becb402adf9f/download/2022-07-13_info_publica.geojson'
## using driver `GeoJSON'
## Simple feature collection with 5687 features and 17 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -72.21879 ymin: -54.82011 xmax: -53.64201 ymax: -22.04006
## Geodetic CRS: WGS 84
#filtramos solo los de la cidad
barrios_pop <- barrios_pop %>% filter(provincia=="Ciudad Autónoma de Buenos Aires")
#calculamos familias por metro cuadrado
barrios_pop <- barrios_pop %>% mutate(familias_m2=cantidad_familias_aproximada/superficie_m2)
#mapa de los barrios de la ciudad
barrios <- read_sf("https://cdn.buenosaires.gob.ar/datosabiertos/datasets/barrios/barrios.geojson")
Extraemos el perímertro de la ciudad y los datos de transporte dentro de la misma
#extraemos el perímertro de la ciudad
bbox_ba <- getbb("Capital Federal, Buenos Aires, Argentina")
mapa_ba <- get_stamenmap(bbox_ba, zoom = 12)
polygon_ba <- getbb("Capital Federal, Buenos Aires, Argentina", format_out = "sf_polygon")
polygon_ba <- polygon_ba$multipolygon
#paradas
paradas_ba <- opq(bbox_ba) %>%
add_osm_feature(key = "public_transport", value = "stop_position")
#extraemos los puntos
paradas_ba <- osmdata_sf(paradas_ba)
paradas_ba <- paradas_ba$osm_points
#Filtrado de parques dentro de la ciudad
paradas_ba_b <- st_intersection(paradas_ba,polygon_ba$geometry)
ggmap(mapa_ba)+
geom_sf(data=polygon_ba, fill=NA, size=0.5, color="black", inherit.aes = FALSE)
Cuando miramos algunos de los datos, se ve que los barrios con más población son la ex 20, 1/11/14 y la ex 31 con más de 10.000 familias cada uno según RENABAP.
Tabla con datos y análisis general:
Tabla de datos
as.data.frame(barrios_pop)
Aquí hacemos un mapa coloreando por cantidad de familias aproximadas.
ggplot()+geom_sf(data = barrios)+
geom_sf(data=barrios_pop, mapping=aes(fill=cantidad_familias_aproximada),alpha=0.7,color="black")+
labs(title="Barrios Populares a Julio 2022",subtitle="Color = cantidad de faimlias aproximadas",caption = "Fuente: RENABAP")
Con los datos de todas las paradas descargados de Open Street maps (en el futuro podemos usar datos oficiales de la cuidad), mapeo las paradas. Automáticamente se ve que hay una especia de “vacío” al rededor de los barrios populares.
ggplot()+geom_sf(data = barrios)+
geom_sf(data = paradas_ba_b,alpha=0.5,size=0.05)+
geom_sf(data=barrios_pop,mapping=aes(fill=cantidad_familias_aproximada),alpha=0.7,color=NA)+
labs(title="Barrios Populares y paradas de transporte",
subtitle="Color = cantidad de faimlias aproximadas, en puntos paradas de trasporte",
caption="Fuente: RENABAP")
Esta es una primer aproximación super rudimentaria. Se calcula la densidad de paradas por área con un kernel o “ventana” que “barre” la superficie.
Para más detalles https://r-spatial.github.io/stars/index.html y https://www.rdocumentation.org/packages/spatstat/versions/1.64-1/topics/density.ppp
#Use mucho esto https://stackoverflow.com/questions/68643517/smoothed-density-maps-for-points-in-using-sf-within-a-given-boundary-in-r
#reescalo las paradas a distancia por Km
paradas_ba_b_coord<- paradas_ba_b %>%
mutate(long = unlist(map(paradas_ba_b$geometry,1)),
lat = unlist(map(paradas_ba_b$geometry,2)))
sf_points = data.frame(
lat = paradas_ba_b_coord$lat,
lon = paradas_ba_b_coord$long
) %>%
st_as_sf(coords = c("lon", "lat"), crs = 4326) %>%
st_transform(32650)
ppp_points <- as.ppp(st_geometry(sf_points))
density_spatstat <- density(ppp_points)#, dimyx = 256)
density_stars <- stars::st_as_stars(density_spatstat)
density_sf <- st_as_sf(density_stars) %>%st_set_crs(32650)
ggplot() +
geom_sf(data = density_sf, aes(fill = v), col = NA) +
scale_fill_viridis_c(name="Densidad de paradas por unidad de área") +
geom_sf(data = st_boundary(barrios)) +
geom_sf(data=barrios_pop,fill="grey",alpha=0.5,color="darkgrey")+
geom_sf(data = sf_points, size = 0.05, col = "black")+
labs(title = "Densidad de paradas por unidad de área",subtitle = "en gris barrios populares")+
ggspatial::annotation_north_arrow(location = "br", which_north = "true")+
coord_sf(crs = 4326)
Ahora vamos a buscar cuantas paradas, fijado un radio, están a menos de cierta distancia:
D = st_distance(barrios_pop,paradas_ba_b )
#%>% st_transform(crs=st_crs(barrios_pop)))
f = function(radio) apply(D,1,function(x) sum(x<=radio))
#agregamos la distancia a paradas
barrios_pop_conParadas= barrios_pop %>% mutate(radio0m = f(0), radio100m = f(100),radio200m=f(200),radio500m=f(500),radio1000m=f(1000))
Para chusmear cuantos hay en cada clase:
#modificamos para plotear
toplot <- as.data.frame(barrios_pop_conParadas[,c(19:23)]) %>% gather( distancia,cantidad_paradas,-geometry)
toplot$distancia <- gsub("radio","distancia_de_",toplot$distancia)
#plot
ggplot( toplot, aes(cantidad_paradas))+geom_histogram()+facet_wrap(~ distancia)+ylab("Cantidad de barrios")+xlab("Cantidad de paradas a una distancia menor o igual a.. ")+labs(title = "Cantidad de paradas a una distancia menor o igual a.. ")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Vamos que el barrio con más paradas a menos de 200 metros es Mugica (ex 31). En este barrio sin embargo, vemos que no hay paradas “detro” cuando en una avenida paralela a la que no hay acceso directo hay paradas “a lo lo largo”.
ggplot()+geom_sf(data = barrios)+
geom_sf(data = paradas_ba_b,alpha=0.5,size=0.05)+
geom_sf(data=barrios_pop_conParadas,mapping=aes(fill=radio200m),alpha=0.7,color=NA)+
scale_fill_gradient(name='Paradas a menos de 200 metros',high='red',low='yellow')+
labs(title="Barrios Populares coloreados por cantidad de paradas \n a menos de 200 metros",
subtitle="",
caption="Fuente: RENABAP")
Vamos a hacer zoom en los barrios que “contienen” al barrio Mugica para tener mejor detalle.
ba_barriosdeinteres <- barrios %>% filter(BARRIO %in% c("RETIRO","RECOLETA"))
paradas_deinteres <- st_intersection(paradas_ba , ba_barriosdeinteres )
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
ggplot()+geom_sf(data = ba_barriosdeinteres )+
geom_sf(data =paradas_deinteres,alpha=0.5,size=0.05)+
geom_sf(data=barrios_pop_conParadas %>% filter(localidad %in% "Retiro"),alpha=0.7,color="red",fill="darkgrey")+
labs(title="Barrios de Retiro y Recoleta",
caption="Fuente: RENABAP")
Cuando rehacemos el cálculo sólo para el barrio de Retiro y Recoleta, vemos nuevamente que la densidad de paradas de transporte no es homogénea en todo el barrio y que en realidad la cantidad de paradas del barrio analizado como aglomerado está “inflada” por la cercanía a la terminal de Retiro. Notese que la escala es mucho menor al análisis de toda la ciudad.
paradas_ba_b_coord<- paradas_deinteres %>%
mutate(long = unlist(map(paradas_deinteres$geometry,1)),
lat = unlist(map(paradas_deinteres$geometry,2)))
sf_points = data.frame(
lat = paradas_ba_b_coord$lat,
lon = paradas_ba_b_coord$long
) %>%
st_as_sf(coords = c("lon", "lat"), crs = 4326) %>%
st_transform(32650)
ppp_points <- as.ppp(st_geometry(sf_points))
density_spatstat <- density(ppp_points)#, dimyx = 256)
density_stars <- stars::st_as_stars(density_spatstat)
density_sf <- st_as_sf(density_stars) %>%st_set_crs(32650)
ggplot() +
geom_sf(data = density_sf, aes(fill = v), col = NA) +
scale_fill_viridis_c(name="Densidad de paradas por unidad de área",option = "plasma") +
geom_sf(data = st_boundary(ba_barriosdeinteres)) +
geom_sf(data=barrios_pop %>% filter(localidad %in% "Retiro"),fill="grey",alpha=0.5,color="darkgrey")+
geom_sf(data = sf_points, size = 0.2, col = "black")+
labs(title = "Densidad de paradas por unidad de área",subtitle = "en gris barrios populares")+
ggspatial::annotation_north_arrow(location = "br", which_north = "true")+
coord_sf(crs = 4326)
Podemos concluir que hay un “vacío” de paradas en las inmediaciones de los barrios populares. Esto puede deberse a razones físicas (por ejemplo las vías del tren) o a razones de planeamiento urbano.
El barrio con más paradas cercanas es el barrio Padre Mugica (ex 31). Sin embargo vemos que no hay paradas el interior del barrio al menos con la base de datos utilizada. Así mismo, vemos que la cercanía a paradas y el acceso a las mismas no es homogéneo para todo el barrio.
A futuro se puede: