El objetivo principal del siguiente trabajo es aplicar las herramientas vistas en Instrumentos de Analisis Urbano I, asignatura de la maestria en Economia Urbana, de la Universidad Torcuato Di Tella. A continuacion, vamos a demostrar como trabajamos con la lectura, manipulacion, transformacion, visualizacion y analisis de datos de tipo espacial.
En primer lugar, vamos a responder a la pregunta sobre donde es necesario habilitar un nuevo centro de testeo de COVID en la Ciudad de Buenos Aires (CABA). Para esto, consideraremos los centros de testeo existentes (Operativos DetectAR y Unidades Febriles de Urgencia en Hospitales) y estudiaremos su rango de cobertura en relacion con variables como la accesibilidad, densidad poblacional y los hogares con necesidades basicas insatisfechas (NBI). Con este fin, vamos a generar un indice que nos permitira observar en que manzanas de CABA es necesaria la implementacion de un nuevo dispositivo de testeo.
En segundo lugar, profundizaremos sobre las particularidades de los barrios populares en relacion al acceso al testeo. Para eso, graficaremos los poligonos de los barrios populares y lo relacionaremos con el indice de acceso al testeo creado en el primer punto. Luego, calcularemos isocronas para evaluar si en determinado tiempo y distancia, los habitantes de estos barrios acceden a los centros de testeo existentes. Finalmente, creamos un nuevo indice de acceso al testeo, con foco en la accesibilidad
En tercer lugar, pondremos el foco en propiedades. Por un lado, considerando los indices construidos, se analizara la oferta de lotes en venta disponibles para construir un nuevo centro de testeo y abordaje de enfermedades de transmision viral (ETS). Por otro lado, se trabajara con la oferta de propiedades en alquiler y la proporcion de casos por barrio, para evaluar donde aislar a casos confirmados de COVID-19.
En esta seccion vamos a generar los pasos necesarios para construir un Indice de Demanda de Testeo de COVID-19, considerando las siguientes variables:
1- Cobertura de Testeo
2- Accesibilidad
3- Hogares con NBI
4- Densidad poblacional
Para comenzar, cargamos las librerias y los datesetS a utilizar:
1. Centros de Testeo
Hospitales: aqui se encuentran las Unidades Febriles de Urgencia, las cuales testean a personas con sintomas de COVID.
hospitales <- read_sf("https://cdn.buenosaires.gob.ar/datosabiertos/datasets/salud/hospitales/hospitales.geojson")
summary(hospitales)
## ID NOMBRE NOM_MAP OBJETO
## Min. : 1.00 Length:36 Length:36 Length:36
## 1st Qu.: 9.75 Class :character Class :character Class :character
## Median :18.50 Mode :character Mode :character Mode :character
## Mean :18.50
## 3rd Qu.:27.25
## Max. :36.00
## CALLE ALTURA DOM_NORMA DOM_GEO
## Length:36 Length:36 Length:36 Length:36
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## TELEFONO GUARDIA FAX WEB
## Length:36 Length:36 Length:36 Length:36
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## COD_POSTAL TIPO TIPO_ESPEC MOD_AT_1
## Length:36 Length:36 Length:36 Length:36
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## MOD_AT_2 DEPEND_ADM DIRECTOR geometry
## Length:36 Length:36 Length:36 POINT :36
## Class :character Class :character Class :character epsg:4326 : 0
## Mode :character Mode :character Mode :character +proj=long...: 0
##
##
##
La funcion summary() nos arroja una cantidad de 36 hospitales en CABA.
Operativos Detectar: constituyen otro tipo de dispositivo de testeo.
operativo_detectar <- read.csv("C:/Users/Sixto/Documents/R/detectar_capacidad.csv")
summary(operativo_detectar)
## dispositivo calle_actual num_actual direccion_normalizada
## Length:27 Length:27 Min. : 2 Length:27
## Class :character Class :character 1st Qu.: 690 Class :character
## Mode :character Mode :character Median :1440 Mode :character
## Mean :2257
## 3rd Qu.:3500
## Max. :7597
## NA's :2
## longitud latitud tipo_barrio capacidad
## Min. :-58.49 Min. :-34.68 Length:27 Min. : 50.0
## 1st Qu.:-58.46 1st Qu.:-34.65 Class :character 1st Qu.:157.5
## Median :-58.43 Median :-34.62 Mode :character Median :189.0
## Mean :-58.43 Mean :-34.62 Mean :262.9
## 3rd Qu.:-58.39 3rd Qu.:-34.60 3rd Qu.:346.5
## Max. :-58.36 Max. :-34.55 Max. :756.0
##
La funcion summary() nos arroja una cantidad de 27 operativos DetectAR en CABA.
Convertimos el dataset operativo_detectar a un objeto sf:
operativo_detectar <- st_as_sf(operativo_detectar,coords = c("longitud", "latitud"), crs = 4326)
st_crs(hospitales)
## Coordinate Reference System:
## User input: WGS 84
## wkt:
## GEOGCRS["WGS 84",
## DATUM["World Geodetic System 1984",
## ELLIPSOID["WGS 84",6378137,298.257223563,
## LENGTHUNIT["metre",1]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433]],
## CS[ellipsoidal,2],
## AXIS["geodetic latitude (Lat)",north,
## ORDER[1],
## ANGLEUNIT["degree",0.0174532925199433]],
## AXIS["geodetic longitude (Lon)",east,
## ORDER[2],
## ANGLEUNIT["degree",0.0174532925199433]],
## ID["EPSG",4326]]
st_crs(operativo_detectar)
## Coordinate Reference System:
## User input: EPSG:4326
## wkt:
## GEOGCRS["WGS 84",
## DATUM["World Geodetic System 1984",
## ELLIPSOID["WGS 84",6378137,298.257223563,
## LENGTHUNIT["metre",1]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433]],
## CS[ellipsoidal,2],
## AXIS["geodetic latitude (Lat)",north,
## ORDER[1],
## ANGLEUNIT["degree",0.0174532925199433]],
## AXIS["geodetic longitude (Lon)",east,
## ORDER[2],
## ANGLEUNIT["degree",0.0174532925199433]],
## USAGE[
## SCOPE["Horizontal component of 3D system."],
## AREA["World."],
## BBOX[-90,-180,90,180]],
## ID["EPSG",4326]]
La funcion st_crs() nos indican que ambos dataset tienen el mismos Sistema de Coordenadas de Referencia: EPSG 4326.
A continuacion, utilizamos leaflet para graficar los centros de testeo.
a- HOSPITALES
leaflet(hospitales) %>%
addTiles() %>%
addMarkers(label = ~ NOMBRE,
popup = ~ TIPO)
b- OPERATIVOS DETECTAR
leaflet(operativo_detectar) %>%
addTiles() %>%
addMarkers(label = ~ dispositivo,
popup = ~ tipo_barrio)
Continuamos cargando datasets, con las variables a analizar:
2. Accesibilidad
Cargamos el dataset con las calles de CABA:
calles <- read_sf("https://cdn.buenosaires.gob.ar/datosabiertos/datasets/ministerio-de-educacion/calles/callejero.geojson")
Como solo nos interesa considerar la distancia entre los centros de testeo y las avenidas, aplicamos un filtro al universo total de calles:
avenidas <- calles %>% filter(tipo_c == "AVENIDA")
Graficamos para tener una visualizacion rapida de las avenidas por barrio e identificar visualmente la dimension de su cobertura:
plot(avenidas[,c("BARRIO")])
3.Densidad Poblacional y 4.Hogares con NBI
Para obtener informacion sobre la poblacion y los hogares con NBI, cargamos los radios censales, con los resultados correspondientes al ultimo Censo de 2010.
radiosCensales <- read_sf("https://cdn.buenosaires.gob.ar/datosabiertos/datasets/informacion-censal-por-radio/caba_radios_censales.geojson")
glimpse(radiosCensales)
## Rows: 3,554
## Columns: 9
## $ RADIO_ID <chr> "1_1_1", "1_12_1", "1_12_10", "1_12_11", "1_12_2", "1_12_3~
## $ BARRIO <chr> "RETIRO", "SAN NICOLAS", "SAN NICOLAS", "SAN NICOLAS", "SA~
## $ COMUNA <chr> "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"~
## $ POBLACION <dbl> 336, 341, 296, 528, 229, 723, 393, 600, 472, 786, 329, 135~
## $ VIVIENDAS <dbl> 82, 365, 629, 375, 445, 744, 341, 505, 504, 546, 275, 895,~
## $ HOGARES <dbl> 65, 116, 101, 136, 129, 314, 209, 275, 202, 347, 129, 342,~
## $ HOGARES_NBI <dbl> 19, 25, 1, 7, 16, 104, 110, 32, 49, 89, 15, 57, 1, 1, 2, 2~
## $ AREA_KM2 <dbl> 1.79899705, 0.01856469, 0.04438025, 0.36634000, 0.01836301~
## $ geometry <MULTIPOLYGON [°]> MULTIPOLYGON (((-58.37189 -..., MULTIPOLYGON ~
Como observamos con la funcion glimpse(), el dataset original contiene la variable HOGARES_NBI. Nos queda crear la variable densidad poblacional. Calculamos la densidad poblacional con la funcion mutate():
radiosCensales <- radiosCensales %>% mutate(densidadPob=POBLACION/AREA_KM2)
Creamos asi la nueva columna densidadPob:
glimpse(radiosCensales)
## Rows: 3,554
## Columns: 10
## $ RADIO_ID <chr> "1_1_1", "1_12_1", "1_12_10", "1_12_11", "1_12_2", "1_12_3~
## $ BARRIO <chr> "RETIRO", "SAN NICOLAS", "SAN NICOLAS", "SAN NICOLAS", "SA~
## $ COMUNA <chr> "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"~
## $ POBLACION <dbl> 336, 341, 296, 528, 229, 723, 393, 600, 472, 786, 329, 135~
## $ VIVIENDAS <dbl> 82, 365, 629, 375, 445, 744, 341, 505, 504, 546, 275, 895,~
## $ HOGARES <dbl> 65, 116, 101, 136, 129, 314, 209, 275, 202, 347, 129, 342,~
## $ HOGARES_NBI <dbl> 19, 25, 1, 7, 16, 104, 110, 32, 49, 89, 15, 57, 1, 1, 2, 2~
## $ AREA_KM2 <dbl> 1.79899705, 0.01856469, 0.04438025, 0.36634000, 0.01836301~
## $ geometry <MULTIPOLYGON [°]> MULTIPOLYGON (((-58.37189 -..., MULTIPOLYGON ~
## $ densidadPob <dbl> 186.7707, 18368.2032, 6669.6332, 1441.2840, 12470.7238, 19~
Tambien, agrupamos los radios censales por barrio para obtener su poligono a la hora de graficar:
barrios <- radiosCensales %>% group_by(BARRIO) %>% summarise(n())
MANZANAS
Por ultimo, cargamos el dataset con las manzanas de CABA:
manzanas <- read_sf("C:/Users/Sixto/Documents/R/manzanas.geojson.txt")
Como el dataset es muy pesado para correr en los equipos con los que contamos, aplicamos un filtro por “manzanas tipicas”:
manzanas <- manzanas %>% filter (MZ_TIPO == "TIPICA")
SISTEMA DE COORDENADAS DE REFERENCIA
Para poder trabajar con un Sistema de Coordenadas de Referencia (CRS) que se encuentra proyectado en dos dimensiones, aplicamos la proyeccion oficial del GCBA. Creamos una variable que se llama “caba_CRS” con la informacion sobre el CRS proyectado para CABA:
caba_CRS <- "+proj=tmerc +lat_0=-34.6297166 +lon_0=-58.4627 +k=1 +x_0=100000 +y_0=100000 +ellps=intl +units=m +no_defs"
Por consiguiente, utilizamos st_transform() para transformar los datasets al nuevo CRS:
hospitales <- st_transform(hospitales, crs = caba_CRS)
operativo_detectar <- st_transform(operativo_detectar, crs = caba_CRS)
avenidas <- st_transform(avenidas, crs = caba_CRS)
radiosCensales <- st_transform(radiosCensales, crs = caba_CRS)
manzanas <- st_transform(manzanas, crs = caba_CRS)
Comprobamos que todos los datasets se tranformaron al nuevo CRS (EPSG 9001):
st_crs(hospitales)
## Coordinate Reference System:
## User input: +proj=tmerc +lat_0=-34.6297166 +lon_0=-58.4627 +k=1 +x_0=100000 +y_0=100000 +ellps=intl +units=m +no_defs
## wkt:
## PROJCRS["unknown",
## BASEGEOGCRS["unknown",
## DATUM["Unknown based on International 1909 (Hayford) ellipsoid",
## ELLIPSOID["International 1909 (Hayford)",6378388,297,
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8901]]],
## CONVERSION["unknown",
## METHOD["Transverse Mercator",
## ID["EPSG",9807]],
## PARAMETER["Latitude of natural origin",-34.6297166,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8801]],
## PARAMETER["Longitude of natural origin",-58.4627,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8802]],
## PARAMETER["Scale factor at natural origin",1,
## SCALEUNIT["unity",1],
## ID["EPSG",8805]],
## PARAMETER["False easting",100000,
## LENGTHUNIT["metre",1],
## ID["EPSG",8806]],
## PARAMETER["False northing",100000,
## LENGTHUNIT["metre",1],
## ID["EPSG",8807]]],
## CS[Cartesian,2],
## AXIS["(E)",east,
## ORDER[1],
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]],
## AXIS["(N)",north,
## ORDER[2],
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]]]
st_crs(operativo_detectar)
## Coordinate Reference System:
## User input: +proj=tmerc +lat_0=-34.6297166 +lon_0=-58.4627 +k=1 +x_0=100000 +y_0=100000 +ellps=intl +units=m +no_defs
## wkt:
## PROJCRS["unknown",
## BASEGEOGCRS["unknown",
## DATUM["Unknown based on International 1909 (Hayford) ellipsoid",
## ELLIPSOID["International 1909 (Hayford)",6378388,297,
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8901]]],
## CONVERSION["unknown",
## METHOD["Transverse Mercator",
## ID["EPSG",9807]],
## PARAMETER["Latitude of natural origin",-34.6297166,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8801]],
## PARAMETER["Longitude of natural origin",-58.4627,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8802]],
## PARAMETER["Scale factor at natural origin",1,
## SCALEUNIT["unity",1],
## ID["EPSG",8805]],
## PARAMETER["False easting",100000,
## LENGTHUNIT["metre",1],
## ID["EPSG",8806]],
## PARAMETER["False northing",100000,
## LENGTHUNIT["metre",1],
## ID["EPSG",8807]]],
## CS[Cartesian,2],
## AXIS["(E)",east,
## ORDER[1],
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]],
## AXIS["(N)",north,
## ORDER[2],
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]]]
st_crs(avenidas)
## Coordinate Reference System:
## User input: +proj=tmerc +lat_0=-34.6297166 +lon_0=-58.4627 +k=1 +x_0=100000 +y_0=100000 +ellps=intl +units=m +no_defs
## wkt:
## PROJCRS["unknown",
## BASEGEOGCRS["unknown",
## DATUM["Unknown based on International 1909 (Hayford) ellipsoid",
## ELLIPSOID["International 1909 (Hayford)",6378388,297,
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8901]]],
## CONVERSION["unknown",
## METHOD["Transverse Mercator",
## ID["EPSG",9807]],
## PARAMETER["Latitude of natural origin",-34.6297166,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8801]],
## PARAMETER["Longitude of natural origin",-58.4627,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8802]],
## PARAMETER["Scale factor at natural origin",1,
## SCALEUNIT["unity",1],
## ID["EPSG",8805]],
## PARAMETER["False easting",100000,
## LENGTHUNIT["metre",1],
## ID["EPSG",8806]],
## PARAMETER["False northing",100000,
## LENGTHUNIT["metre",1],
## ID["EPSG",8807]]],
## CS[Cartesian,2],
## AXIS["(E)",east,
## ORDER[1],
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]],
## AXIS["(N)",north,
## ORDER[2],
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]]]
st_crs(radiosCensales)
## Coordinate Reference System:
## User input: +proj=tmerc +lat_0=-34.6297166 +lon_0=-58.4627 +k=1 +x_0=100000 +y_0=100000 +ellps=intl +units=m +no_defs
## wkt:
## PROJCRS["unknown",
## BASEGEOGCRS["unknown",
## DATUM["Unknown based on International 1909 (Hayford) ellipsoid",
## ELLIPSOID["International 1909 (Hayford)",6378388,297,
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8901]]],
## CONVERSION["unknown",
## METHOD["Transverse Mercator",
## ID["EPSG",9807]],
## PARAMETER["Latitude of natural origin",-34.6297166,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8801]],
## PARAMETER["Longitude of natural origin",-58.4627,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8802]],
## PARAMETER["Scale factor at natural origin",1,
## SCALEUNIT["unity",1],
## ID["EPSG",8805]],
## PARAMETER["False easting",100000,
## LENGTHUNIT["metre",1],
## ID["EPSG",8806]],
## PARAMETER["False northing",100000,
## LENGTHUNIT["metre",1],
## ID["EPSG",8807]]],
## CS[Cartesian,2],
## AXIS["(E)",east,
## ORDER[1],
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]],
## AXIS["(N)",north,
## ORDER[2],
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]]]
st_crs(manzanas)
## Coordinate Reference System:
## User input: +proj=tmerc +lat_0=-34.6297166 +lon_0=-58.4627 +k=1 +x_0=100000 +y_0=100000 +ellps=intl +units=m +no_defs
## wkt:
## PROJCRS["unknown",
## BASEGEOGCRS["unknown",
## DATUM["Unknown based on International 1909 (Hayford) ellipsoid",
## ELLIPSOID["International 1909 (Hayford)",6378388,297,
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8901]]],
## CONVERSION["unknown",
## METHOD["Transverse Mercator",
## ID["EPSG",9807]],
## PARAMETER["Latitude of natural origin",-34.6297166,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8801]],
## PARAMETER["Longitude of natural origin",-58.4627,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8802]],
## PARAMETER["Scale factor at natural origin",1,
## SCALEUNIT["unity",1],
## ID["EPSG",8805]],
## PARAMETER["False easting",100000,
## LENGTHUNIT["metre",1],
## ID["EPSG",8806]],
## PARAMETER["False northing",100000,
## LENGTHUNIT["metre",1],
## ID["EPSG",8807]]],
## CS[Cartesian,2],
## AXIS["(E)",east,
## ORDER[1],
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]],
## AXIS["(N)",north,
## ORDER[2],
## LENGTHUNIT["metre",1,
## ID["EPSG",9001]]]]
COBERTURA DE CENTROS DE TESTEO
Con el nuevo CRS podemos medir la cobertura en metros. Como consideramos que la distancia caminable hasta un centro de testeo puede ser de hasta 1000 metros, trazamos los radios de cobertura de los hospitales y los operativos DetectAR con la funcion St_buffer():
coberturaHospitales <- st_buffer(hospitales, dist = 1000)
coberturaDetectar <- st_buffer(operativo_detectar, dist = 1000)
Graficamos la cobertura de los centros de testeo:
ggplot()+
geom_sf(data=barrios) +
geom_sf(data = coberturaHospitales, aes(fill=TIPO)) +
scale_fill_viridis_d() +
theme_void ()+
labs(title = "Centros de Testeo CABA", subtitle = "Radios de cobertura de Hospitales", fill = "Tipo de Hospital")
ggplot()+
geom_sf(data=barrios) +
geom_sf(data = coberturaDetectar, aes(fill=tipo_barrio)) +
scale_fill_viridis_d() +
theme_void ()+
labs(title = "Centros de Testeo CABA", subtitle = "Radios de cobertura de Operativos DetectAR", fill = "Tipo de Barrio")
ggplot()+
geom_sf(data=barrios) +
geom_sf(data = coberturaHospitales, color="darkgreen", fill="lightgreen") +
geom_sf(data = coberturaDetectar, color="blue", fill="lightblue") +
theme_void ()+
labs(title = "Centros de Testeo CABA", subtitle = "Radios de cobertura de Hospitales y Operativos DetectAR")
Es simple observar en los graficos que los radios de coberturas se superponen. Por este motivo, unificamos las coberturas de hospitales y operativos DetectAR en dos grandes poligonos con la funcion summarise(). Luego, unimos ambos poligonos con la funcion st_union():
coberturaHospitales <- coberturaHospitales %>% summarise(cobertura=TRUE)
coberturaDetectar <- coberturaDetectar %>% summarise(cobertura=TRUE)
coberturaTesteo <- st_union(coberturaHospitales, coberturaDetectar)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
Visualizamos:
ggplot()+
geom_sf(data=barrios) +
geom_sf(data = coberturaTesteo, color="darkgreen", fill="lightgreen") +
theme_void ()+
labs(title = "Centros de Testeo CABA", subtitle = "Cobertura Total")
Al graficar, observamos el poligono de la cobertura total, la cual incluye a la cobertura de hospitales y a la cobertura de operativos DetectAR.
DISTANCIA MINIMA A AVENIDAS
Hasta ahora tenemos calculados los radios de distancia caminable de los centros de testeo existentes. Es importante considerar el acceso a traves de otros medios de transporte publico. Suponiendo que el acceso a este tipo de transporte se da a traves de avenidas, vamos a calcular la distancia desde los centros de manzana hasta las avenidas mas cercanas.
Obtenemos los centros de manzana con la funcion st_centroid:
manzanasCentroides <- st_centroid(manzanas)
## Warning in st_centroid.sf(manzanas): st_centroid assumes attributes are constant
## over geometries of x
Graficamos los centros de manzana en conjunto con los hospitales y los operativos detectAR:
ggplot() +
geom_sf(data = barrios) +
geom_sf(data = manzanas) +
geom_sf(data = manzanasCentroides, color="blue", size = 0.001)+
geom_sf(data = hospitales)+
geom_sf(data = operativo_detectar)+
theme_void ()+
labs(title = "Centros de Testeo CABA", subtitle = "Hospitales, Operativos DetectAR y Centros de Manzanas")
Ahora calculamos la distancia, en metros, entre los centros de manzana y las avenidas con la funcion st_distance():
distanciaAvenidas_mzas <- st_distance(manzanasCentroides,avenidas)
dim (distanciaAvenidas_mzas)
## [1] 7322 6758
La funcion dim() nos indica que cruzamos 7332 centroides de manzanas con 6758 avenidas.
A modo de calcular la distancia minima a una avenida desde cada centroide de manzana, aplicamos la funcion apply() y redondeamos con round():
avenidaMasCercana <- apply(distanciaAvenidas_mzas,1,function(x) min(x))
avenidaMasCercana <- round(avenidaMasCercana,0)
Asignamos la distancia minima a cada manzana con la funcion mutate():
manzanas <- manzanas %>% mutate(distanciaAvenidas_mzas=avenidaMasCercana)
UNIoN ESPACIAL
Para poder identificar que centros de manzana estan incluidos por la cobertura de testeo aplicamos, primero, la funcion st_join(). La misma nos permite unir dos datasets espaciales:
cobertura_manzanasCentroides <- st_join(manzanasCentroides,coberturaTesteo)
Luego, mutamos la informacion de la columna cobertura para quedarnos solo con las manzanas no cubiertas (NA):
cobertura_manzanasCentroides <- cobertura_manzanasCentroides %>% mutate(cobertura=ifelse(is.na(cobertura),FALSE,cobertura))
Ahora, sumamos la informacion de los radios censales con una nueva union espacial:
cobertura_manzanasCentroides <- st_join(cobertura_manzanasCentroides,radiosCensales)
Convertimos nuestro dataset de cobertura en un data frame con la funcion as.data.frame(). Ademas, seleccionamos del total de columnas, las variables que queremos considerar para el analisis: densidad poblacional, hogares con NBI, cobertura.
cobertura_manzanasCentroides <- cobertura_manzanasCentroides %>%
as.data.frame() %>%
select(SM,densidadPob,HOGARES_NBI,cobertura)
Sumamos esta nueva informacion al dataset de manzanas mediante la funcion left_join():
manzanas <- left_join(manzanas,cobertura_manzanasCentroides,by="SM")
INDICE DE DEMANDA DE TESTEO
Creamos quiebres para dividir por quantiles y, teniendo en cuenta las variables construidas (Accesibilidad - medida por distancia a avenidas-, Densidad Poblacional, Hogares con NBI), armamos el “Indice de Demanda de Testeo”:
quiebres <- c(0,0.2,0.4,0.6,0.8,1)
manzanas <- manzanas %>%
mutate(cat_densidad=cut(densidadPob,breaks = quantile(densidadPob,quiebres,na.rm = TRUE ),include.lowest = TRUE),
cat_NBI=cut(HOGARES_NBI,breaks = quantile(HOGARES_NBI,quiebres,na.rm = TRUE ),include.lowest = TRUE),
cat_distanciaAv=cut(-avenidaMasCercana,breaks = quantile(-avenidaMasCercana,quiebres,na.rm = TRUE), include.lowest = TRUE))
Visualizamos las categorias creadas para cada variable:
ggplot() +
geom_sf(data = barrios) +
geom_sf(data=manzanas %>% filter(!is.na(cat_NBI)), aes(fill=cat_NBI), color=NA) +
scale_fill_viridis_d() +
theme_void() +
labs(title = "INDICE DE DEMANDA DE TESTEO CABA", subtitle = "Hogares con NBI por manzana", fill = "NBI")
ggplot() +
geom_sf(data = barrios) +
geom_sf(data=manzanas %>% filter(!is.na(cat_densidad)), aes(fill=cat_densidad), color=NA) +
scale_fill_viridis_d() +
theme_void() +
labs(title = "INDICE DE DEMANDA DE TESTEO CABA", subtitle = "Densidad Poblacional por manzana", fill = "Densidad Poblacional")
ggplot() +
geom_sf(data = barrios) +
geom_sf(data=manzanas %>% filter(!is.na(cat_distanciaAv)), aes(fill=cat_distanciaAv), color=NA) +
scale_fill_viridis_d() +
theme_void() +
labs(title = "INDICE DE DEMANDA DE TESTEO CABA", subtitle = "Accesibilidad por manzana", fill = "Accesibilidad")
Convertimos las categorias creadas a numeros con as.numeric():
manzanas <- manzanas %>%
mutate(cat_densidad=as.numeric(cat_densidad),
cat_NBI=as.numeric(cat_NBI),
cat_distanciaAv=as.numeric(cat_distanciaAv),
cat_cobertura=as.numeric(!cobertura))
Ponderamos cada una de las variables para terminar de construir el indice. Como lo que mas nos interesa es la cobertura de testeo, vamos a darle el mayor valor en la ponderacion (50%). La densidad poblacional (30%) es importante dado que esta directamente relacionada con la necesidad de testeo (a mas densidad, se espera mayor demanda de testeo). A la accesibilidad, medida por la distancia a avenidas, le damos una importancia relativamente menor (15%) ya que el acceso a pie es el mas seguro a la hora de evitar la exposicion al contagio. El menor valor se lo lleva la variable Hogares con NBI (5%) porque la politica de testeo busca ser universal.
manzanas <- manzanas %>%
mutate(IDS=cat_densidad*0.3+cat_NBI*0.05+cat_distanciaAv*0.15+cat_cobertura*0.5,
IDS=ifelse(IDS>quantile(IDS,probs = 0.9,na.rm = TRUE),TRUE,FALSE))
Finalmente, graficamos nuestro primer Indice de Demanda de Testeo:
ggplot() +
geom_sf(data=barrios) +
geom_sf(data=manzanas %>% filter(!is.na(IDS)),aes(fill=IDS), color=NA) +
scale_fill_manual(values = c(NA,"#f03b20")) +
guides(fill=FALSE) +
theme_void() +
labs(title="INDICE DE DEMANDA DE TESTEO CABA",
subtitle="Visualizacion de la Demanda")
En color rojo podemos observar las zonas que tienen una demanda de testeo no cubierta en base a las ponderaciones de las variables consideradas en el armado de nuestro indice: accesibilidad, hogares con NBI, densidad poblacional y cobertura de testeo.
Buscando hacer foco en las zonas con mayor vulnerabilidad social y economica de la Ciudad, nos parece oportuno sumar datos espaciales de barrios vulnerables a nuestro indice.
Con este fin, cargamos el dataset de Barrios Populares de Argentina, lo convertimos al CRS de CABA y realizamos un interseccion para quedarnos solo con los Barrios Populares de CABA:
barrios_vulnerables <-read_sf("C:/Users/Sixto/Documents/Jugando_con_datos/renabap.geojson")
barrios_vulnerables <- st_transform(barrios_vulnerables, crs = caba_CRS)
barrios <- radiosCensales %>% group_by(BARRIO) %>% summarise(n())
barrios_vulnerables_caba <- st_intersection(barrios, barrios_vulnerables)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
Graficamos los Barrios Populares de CABA en conjunto con nuestro primer Indice de Demanda de Testeo:
ggplot() +
geom_sf(data=barrios) +
geom_sf(data=manzanas %>% filter(!is.na(IDS)) ,aes(fill=IDS), color=NA) +
geom_sf(data=barrios_vulnerables_caba, color="darkgreen") +
scale_fill_manual(values = c(NA,"#f03b20")) +
guides(fill=FALSE) +
theme_void() +
labs(title="INDICE DE DEMANDA DE TESTEO CABA",
subtitle="Cruce con Barrios Vulnerables", caption="En rojo las manzanas críticas, en verde asentamientos informales")
A simple vista, el Indice de Demanda de Testeo no coincide de manera evidente con los poligonos de Barrios Vulnerables de CABA. Por consiguiente, profundizaremos el analisis para entender si el indice es suficiente para concluir que los barrios vulnerables tienen un buen acceso al testeo.
TIEMPO Y DISTANCIA
A continuacion, generamos el camino para evaluar si, en la estimacion de determinada distancia caminable, los habitantes de barrios populares acceden a centros de testeo. Vamos a suponer que esta poblacion, por diversas razones (incapacidad economica, voluntad de evitar el contagio o de evitar contagiar a otros), no tiene incentivos ni capacidad para acceder al transporte publico. En consecuencia, su unica manera de acceder a los centros de testeo es caminando.
Descargamos una nueva libreria y seteamos la “key:”
library("hereR")
Desde el centroide del poligono de cada Barrio Popular, trazamos una isocrona estimando un tiempo de 15 minutos caminando:
centroides_bp <- st_centroid(barrios_vulnerables_caba)
## Warning in st_centroid.sf(barrios_vulnerables_caba): st_centroid assumes
## attributes are constant over geometries of x
isocronaPuntos <- map(1:nrow(centroides_bp), function(x) { isoline(centroides_bp[x,], transport_mode = "pedestrian",range = 60*15, range_type = 'time') })
Convertimos las isocronas creadas en un data frame:
isocronaPuntos <- do.call("rbind",isocronaPuntos)
Graficamos:
leaflet(isocronaPuntos) %>%
addTiles() %>%
addPolygons()
Unimos los poligonos de las isocronas:
isocronaPuntos1 <- st_union(isocronaPuntos)
Volvemos a graficar para observar la cobertura total de los poligonos de las isocronas:
leaflet(isocronaPuntos1) %>%
addTiles() %>%
addPolygons()
Los centros de testeo existentes, ¿se cruzan con la distancia caminable estimada desde el centro de los Barrios Populares?
ggplot()+
geom_sf(data=barrios)+
geom_sf(data=isocronaPuntos, color="blue")+
geom_sf(data= hospitales, color="red")+
geom_sf(data= operativo_detectar, color="red")+
theme_void() +
labs(title="Centros de Testeo y Barrios Populares en CABA",
subtitle="Estimacion de distancias caminables desde el centro de cada barrio")
A simple vista, mientras algunos poligonos de isocronas incluyen centros de testeo, muchos otros no cumplen esta condicion. Dada esta observacion, si se considera el supuesto incial (habitantes de barrios populares optando exclusivamente por trasladarse a pie), una decison de politica publica deberia evaluar la posible incorparacion de operativos de testeo en aquellos poligonos que no incluyen uno.
¿Como sabemos que poligonos especificos quedan excluidos del acceso al testeo?
Convertimos las isocronas al CRS de CABA:
isocronaPuntos <- st_transform(isocronaPuntos, crs = caba_CRS)
Realizamos una union espacial con los operativos DetectAR:
demanda_testeoBP_det <- st_join(isocronaPuntos, operativo_detectar)
Nos quedamos con las isocronas que no aplican en la union especificada:
demanda_testeoBP_det <- demanda_testeoBP_det %>%
mutate(dispositivo=ifelse(is.na(dispositivo),FALSE,dispositivo))%>%
filter(dispositivo == FALSE)
Sumamos los hospitales:
demanda_testeoBP_hos <- st_join(isocronaPuntos, hospitales)
demanda_testeoBP_hos <- demanda_testeoBP_hos %>%
mutate(NOMBRE=ifelse(is.na(NOMBRE),FALSE,NOMBRE))%>%
filter(NOMBRE == FALSE)
demanda_testeoBP <- st_join(demanda_testeoBP_det, demanda_testeoBP_hos)
Graficamos:
ggplot()+
geom_sf(data = barrios)+
geom_sf(data = demanda_testeoBP, color="blue")+
geom_sf(data= hospitales, color="red")+
geom_sf(data= operativo_detectar, color="red")+
theme_void() +
labs(title="Centros de Testeo y Barrios Populares en CABA",
subtitle="Demanda de Testeo no cubierta")
Partiendo del calculo de isocronas, la visualizacion anterior nos arroja la demanda de testeo no cubierta, considerando una determinada distancia caminable, para los habitantes de los Barrios Populares. Esta observacion nos lleva a concluir que necesitamos construir un nuevo Indice de Demanda de Testeo para representar la realidad particular de estos sectores vulnerables.
NUEVO INDICE DE DEMANDA DE TESTEO
Dado el escenario actual, ¿cuales son los operativos de testeo mas cercanos a los Barrios Populares?
Comenzamos calculando la distancia entre las manzanas y los Barrios Populares:
manzanas_dist_bp <- manzanas %>% mutate(dist_bp = apply(st_distance(manzanas, barrios_vulnerables_caba), 1 , function (x) min(x)))
manzanas_dist_bp <- manzanas_dist_bp %>% filter(dist_bp > 0)
ggplot() + geom_sf(data=barrios) +
geom_sf(data=manzanas_dist_bp, aes (color = as.numeric (dist_bp))) +
geom_sf(data= barrios_vulnerables_caba, fill = "red") +
scale_color_viridis_c()+
theme_void() +
labs(title="Manzanas y Barrios Populares en CABA",
subtitle="Distancia entre Manzanas y Barrios Populares", color="Distancia")
En violeta podemos observar las manzanas mas cercanas a los poligonos de los barios vulnerables.
A continuacion, calculamos las distancias entre los Barrios Populares y los operativos DetectAR:
testeo_dist_bp <- operativo_detectar %>%
mutate(dist_bp = apply(st_distance(operativo_detectar, barrios_vulnerables_caba), 1 , function (x) min(x)))
testeo_dist_bp <- testeo_dist_bp %>%
filter(dist_bp > 0)
Graficamos:
ggplot() +
geom_sf(data=barrios) +
geom_sf_label(data=testeo_dist_bp, aes(label = dispositivo), size=2)+
geom_sf(data=testeo_dist_bp, aes (color = as.numeric (dist_bp), size=as.numeric (dist_bp))) +
geom_sf(data= barrios_vulnerables_caba, fill = "red") +
scale_color_viridis_c() +
theme_void() +
labs(title="Operativos DetectAR y Barrios Populares en CABA",
subtitle="Distancia entre Operativos DetectAR y Barrios Populares", color="Distancia", size= "Tamaño/Cercania")
Se observa que los operativos DetectAR mas cercanos a Barrios Populares son Lugano, Barrio 20, Nagera, Carrillo, 1.11.14, 21.24, Barracas, Nueva Pompeya, La Boca, Rodrigo Bueno, Recoleta, Chacarita, Paternal y Mataderos.
Realizamos el mismo procedimiento para calcular la distancia entre los hospitales y los Barrios Populares:
testeo_dist_bp1 <- hospitales %>%
mutate(dist_bp = apply(st_distance(hospitales, barrios_vulnerables_caba), 1 , function (x) min(x)))
testeo_dist_bp1 <- testeo_dist_bp1 %>%
filter(dist_bp > 0)
Graficamos:
ggplot() + geom_sf(data=barrios) +
geom_sf_label(data=testeo_dist_bp1, aes(label = NOM_MAP), size=2)+
geom_sf(data=testeo_dist_bp1, aes (color = as.numeric (dist_bp), size=as.numeric (dist_bp))) +
geom_sf(data= barrios_vulnerables_caba, fill = "red") +
scale_color_viridis_c()+
theme_void() +
labs(title="Hospitales y Barrios Populares en CABA",
subtitle="Distancia entre Hospitales y Barrios Populares", color="Distancia", size= "Tamaño/Cercania")
Se observa que los hospitales mas cercanos a Barrios Populares son Grierson, Piñero, Tornu, Fernandez, Rivadavia, Muñiz, entre otros.
Unificamos ambos resultados y graficamos la distancia entre todos los centros de testeo y los Barrios Populares:
ggplot() + geom_sf(data=barrios) +
geom_sf(data=testeo_dist_bp, aes (color = as.numeric (dist_bp), size=as.numeric (dist_bp))) +
geom_sf(data=testeo_dist_bp1, aes (color = as.numeric (dist_bp), size=as.numeric (dist_bp))) +
geom_sf(data= barrios_vulnerables_caba, fill = "red") +
scale_color_viridis_c() +
theme_void() +
labs(title="Centros de Testeo y Barrios Populares en CABA",
subtitle="Distancia entre Centros de Testeo y Barrios Populares", color="Distancia", size= "Tamaño/Cercania")
Con esta informacion, ya podemos comenzar a calcular un nuevo Indice de Demanda de Testeo.
1.Cobertura de testeo en barrios populares
Para poder identificar que centroides de Barrios Populares estan incluidos por la cobertura de testeo aplicamos, primero, la funcion st_join():
cobertura_testeoBP <- st_join(centroides_bp,coberturaTesteo)
Luego, mutamos la informacion de la columna cobertura para quedarnos solo con las zonas no cubiertas (NA):
cobertura_testeoBP <- cobertura_testeoBP %>% mutate(cobertura=ifelse(is.na(cobertura),FALSE,cobertura))
Ahora, sumamos la informacion de los radios censales con una nueva union espacial:
cobertura_testeoBP <- st_join(cobertura_testeoBP,radiosCensales)
Convertimos nuestro dataset de cobertura en un data frame y volvemos a seleccionar las columnas que nos interesan:
cobertura_testeoBP <- cobertura_testeoBP %>%
as.data.frame() %>%
select(densidadPob,HOGARES_NBI,cobertura)
Sumamos esta nueva informacion al dataset de manzanas mediante la funcion left_join():
manzanas1 <- left_join(manzanas,cobertura_testeoBP,by="cobertura")
2.Accesibilidad a un barrio popular
Siguiendo con el supuesto de que los habitantes de barrios populares solo se acercan a centros de testeo a pie, vamos a modificarlo para incluir una nueva variable: la accesibilidad a un barrio popular
Comenzamos calculando la distancia entre los centroides de manzanas y los centroides de Barrios Populares:
dist_mza_bp <- st_distance(manzanasCentroides, centroides_bp)
dim (dist_mza_bp)
## [1] 7322 74
La funcion dim() nos indica que cruzamos 7322 centroides de manzanas con 74 centroides de barrios populares
Calculamos la distancia minima a un centroide de barrio popular desde cada centroide de manzana:
BPMasCercano <- apply(dist_mza_bp,1,function(x) min(x))
BPMasCercano <- round(BPMasCercano,0)
Asignamos la distancia minima a cada manzana con la funcion mutate():
manzanas2 <- manzanas %>% mutate(dist_mza_bp=BPMasCercano)
Sumamos la cobertura de testeo y la informacion obtenida de los radios censales, ambas trabajadas en la primera seccion de este trabajo:
manzanas2 <- left_join(manzanas2,cobertura_manzanasCentroides,by="SM")
manzanas1 <- st_join(manzanas1,manzanas2,by="SM")
Creamos quiebres para dividir por quantiles y, teniendo en cuenta las nuevas variables construidas, armamos el nuevo “Indice de Demanda de Testeo”:
quiebres <- c(0,0.2,0.4,0.6,0.8,1)
manzanas1 <- manzanas1 %>%
mutate(cat_densidad=cut(densidadPob.x.x,breaks = quantile(densidadPob.x.x,quiebres,na.rm = TRUE ),include.lowest = TRUE),
cat_NBI=cut(HOGARES_NBI.x.x,breaks = quantile(HOGARES_NBI.x.x,quiebres,na.rm = TRUE ),include.lowest = TRUE),
cat_distanciaBP=cut(-dist_mza_bp,breaks = quantile(-dist_mza_bp,quiebres,na.rm = TRUE), include.lowest = TRUE))
Graficamos las distancias a Barrios Populares¨:
ggplot() +
geom_sf(data = barrios) +
geom_sf(data=manzanas1 %>% filter(!is.na(cat_distanciaBP)), aes(fill=cat_distanciaBP), color=NA) +
scale_fill_viridis_d() +
theme_void() +
labs(title = "INDICE DE DEMANDA DE TESTEO CABA", subtitle = "Distancia a Barrios Populares", fill = "Distancia")
manzanas1 <- manzanas1 %>%
mutate(cat_densidad=as.numeric(cat_densidad),
cat_NBI=as.numeric(cat_NBI),
cat_distanciaBP=as.numeric(cat_distanciaBP),
cat_cobertura=as.numeric(!cobertura))
manzanas1 <- manzanas1 %>%
mutate(IDS1=cat_densidad*0.1+cat_NBI*0.1+cat_distanciaBP*0.3+cat_cobertura*0.5,
IDS1=ifelse(IDS1>quantile(IDS1,probs = 0.9,na.rm = TRUE),TRUE,FALSE))
Graficamos el nuevo “Indice de Demanda de Testeo”
ggplot() +
geom_sf(data=barrios) +
geom_sf(data=manzanas1 %>% filter(!is.na(IDS1)),aes(fill=IDS1), color=NA) +
scale_fill_manual(values = c(NA,"#f03b20")) +
guides(fill=FALSE) +
theme_void() +
labs(title="INDICE DE DEMANDA DE TESTEO CABA",
subtitle="Visualizacion de la Demanda")
Como podemos observar, esta visualizacion tiene algunas semejanzas con los poligonos de las isocronas que demostraban la demanda de testeo de los Barrios Populares. Esto nos lleva a concluir que este nuevo indice puede estar representando mejor la necesidad de testeo de los habitantes de estos sectores.
En esta seccion analizaremos:
1) La oferta de lotes en venta disponibles para construir un centro de testeo y abordaje de enfermedades de transmision viral (ETS) en base a la demanda evidenciada por los indices construidos.
2) La oferta de propiedades en alquiler para aislar a casos confirmados de COVID-19 en base a la proporcion de casos por barrio
1) OFERTA DE LOTES
En el hipotetico caso de que el CGBA decida construir un centro de testeo y abordaje de enfermedades de transmision viral (ETS), tendriamos que analizar cuales son las mejores opciones de lotes disponibles.
Cargamos el dataset de propiedades en venta:
Properati <- read.csv("C:/Users/Sixto/Documents/R/ar.csv")
Quitamos los valores NA y nos quedamos con los propiedades de tipo “lote”, que se encuentran en venta, con una superficie mayor a 5000m2, ubicadas en CABA.
Ademas, le asignamos una geometria al dataset:
properati_lotes <- Properati %>%
filter(!is.na(price),!is.na(lat), !is.na(lon), operation_type == "Venta",property_type == "Lote", surface_total > 5000 , l2 == "Capital Federal") %>%
st_as_sf(coords = c("lon", "lat"), crs = 4326)
Calculamos el precio/m2:
properati_lotes <- properati_lotes %>%
mutate(pm2 = price/surface_total) %>%
filter(pm2 >100)
Nos quedamos con los valores numericos:
properati_lotes$pm = as.numeric(properati_lotes$pm)
Visualizamos los lotes seleccionados:
ggplot() +
geom_sf(data = barrios) +
geom_sf_label(data=properati_lotes, aes(label = l3), size=2)+
geom_sf(data = properati_lotes, color="darkgreen")+
theme_void() +
labs(title="Propiedades en CABA",
subtitle="Lotes disponibles")
¿Que lotes disponibles se cruzan con nuestro primer Indice de Demanda de Testeo?
ggplot()+
geom_sf(data=barrios) +
geom_sf(data = manzanas, aes(fill = IDS)) +
geom_sf(data = properati_lotes, aes(size = surface_total , color = pm2))+
theme_void() +
labs(title="Propiedades en CABA",
subtitle="Lotes e Indice de Demanda de Testeo", fill="Indice Demanda Testeo", color="Precio/m2", size= "Superficie Total")
¿Que lotes disponibles se cruzan con nuestro segundo Indice de Demanda de Testeo?
ggplot()+
geom_sf(data=barrios) +
geom_sf(data = manzanas1 ,aes(fill = IDS1)) +
geom_sf(data = properati_lotes, aes(size = surface_total , color = pm2))+
theme_void() +
labs(title="Propiedades en CABA",
subtitle="Lotes e Indice de Demanda de Testeo", fill="Indice Demanda Testeo", color="Precio/m2", size= "Superficie Total")
¿Que lotes disponibles se cruzan con las isocronas que marcan la demanda particular de Barrios Populares?
ggplot()+
geom_sf(data=barrios) +
geom_sf(data = manzanas) +
geom_sf(data = demanda_testeoBP, color="blue")+
geom_sf(data = properati_lotes, aes(size = surface_total , color = pm2))+
theme_void() +
labs(title="Propiedades en CABA",
subtitle="Lotes e Indice de Demanda de Testeo", fill="Indice Demanda Testeo", color="Precio/m2", size= "Superficie Total")
Las visualizaciones anteriores nos permiten observar diversas opciones de lotes por las cuales optar segun las preferencias y la mirada de politica publica que priorice el GCBA. En el caso de querer priorizar un abordaje integral, los lotes optimos seran los que corresponden al cruce con el primer Indice de Demanda de Testeo. En el caso de querer priorizar el foco en los sectores populares, las dos ultimas visualizaciones serviran de guia.
NUEVOS LOTES Y COBERTURA DE TESTEO POR MANZANA
¿Que manzanas necesitadas de cobertura de testeo abarcarian estos lotes?
Considerando nuestro primer Indice de Demanda de Testeo y el mismo radio de cobertura utilizado desde un principio (distancia caminable de hasta 1000mts), calculamos las manzanas que estaria abordando un centro de testeo construido en los lotes seleccionados:
manzanas_criticas <- manzanas %>% filter(IDS== TRUE)
manzanas_criticas <- st_transform(manzanas_criticas, crs = caba_CRS )
properati_lotes <- st_transform(properati_lotes, crs = caba_CRS)
manzanas_criticas_lotes <- manzanas_criticas %>%
mutate(dist_lote = apply(st_distance(manzanas_criticas , properati_lotes), 1 , function (x) min(x)))
manzanas_criticas_lotes <- manzanas_criticas_lotes %>%
filter(dist_lote < 1000 )
Graficamos:
ggplot() +
geom_sf(data = barrios) +
geom_sf(data = manzanas_criticas, color = "red") +
geom_sf(data = manzanas_criticas_lotes, color = "blue") +
geom_sf(data = properati_lotes) +
theme_void() +
labs(title="Propiedades en CABA",
subtitle="Lotes e Indice de Demanda de Testeo")
Realizamos el mismo procedimiento, aplicando nuestro segundo Indice de Demanda de Testeo:
manzanas_criticas1 <- manzanas1 %>% filter(IDS1== TRUE)
manzanas_criticas1 <- st_transform(manzanas_criticas1, crs = caba_CRS )
manzanas_criticas_lotes1 <- manzanas_criticas1 %>%
mutate(dist_lote = apply(st_distance(manzanas_criticas1, properati_lotes), 1 , function (x) min(x)))
manzanas_criticas_lotes1 <- manzanas_criticas_lotes1 %>%
filter(dist_lote < 1000 )
Graficamos:
ggplot() +
geom_sf(data = barrios) +
geom_sf(data = manzanas_criticas1, color = "red") +
geom_sf(data = manzanas_criticas_lotes1, color = "blue") +
geom_sf(data = properati_lotes) +
theme_void() +
labs(title="Propiedades en CABA",
subtitle="Lotes e Indice de Demanda de Testeo")
Como se puede observar, la demanda de testeo que se encuentra cubierta de manera mas optima por la oferta de lotes corresponde con nuestro primer Indice de Demanda de Testeo.
Por ultimo, realizamos el mismo procedimiento considerando las isocronas de demanda de testeo en Barrios Populares:
manzanas3 <- st_join(manzanas, demanda_testeoBP)
manzanas_criticas3 <- manzanas3 %>% filter(!is.na(dispositivo))
manzanas_criticas3 <- st_transform(manzanas_criticas3, crs = caba_CRS )
Graficamos:
ggplot() +
geom_sf(data = barrios) +
geom_sf(data = manzanas_criticas3, color="red") +
geom_sf(data = properati_lotes) +
theme_void() +
labs(title="Propiedades en CABA",
subtitle="Lotes e Isocrononas de Demanda en Barrios Populares")
A simple vista, solo 1 lote disponible se encuentra ubicado en la demanda de testeo de barrios populares segun el analisis con isocronas.
2) OFERTA DE PROPIEDADES EN ALQUILER
Propiedades en alquiler para aislar a casos confirmados de COVID-19
¿Cuales son las mejores propiedades para alquilar dada la demanda de aislamiento?
Retomamos el dataset de propiedades par focalizarnos en los precios de inmuebles en alquiler. Filtramos por alquiler, superficie cubierta mayor a 15m2, tipo de propiedad (PH, departamento o casa). Sacamos las propiedades que no tienen precio y coordenadas:
properati_alquileres <- Properati %>%
filter(!is.na(lat), !is.na(lon), operation_type == "Alquiler",property_type == c("Casa", "Departamento", "PH"), currency =="ARS", l2 == "Capital Federal" , surface_covered > 15, !is.na(price) ) %>%
st_as_sf(coords = c("lon", "lat"), crs = 4326)
## Warning in property_type == c("Casa", "Departamento", "PH"): longitud de objeto
## mayor no es múltiplo de la longitud de uno menor
Luego realizamos una interseccion con los barrios de CABA:
properati_alquileres <- st_transform(properati_alquileres, crs = caba_CRS )
properati_alquileres <- st_intersection(properati_alquileres, barrios)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
Calculamos el precio/m2:
properati_alquileres <- properati_alquileres %>% mutate(pm2 = price/surface_covered)
Calculamos el precio/m2 promedio de alquiler:
PromedioAlquiler <- mean(properati_alquileres$pm2, na.rm = TRUE)
print(PromedioAlquiler)
## [1] 685.5217
Calculamos el desvio estandar:
desvioEstandarAlquiler <- sd(properati_alquileres$pm2)
print(desvioEstandarAlquiler)
## [1] 298.2597
Filtramos por aquellos valores que estan 3 desvios estandar por encima del precio promedio:
properati_alquileres <- properati_alquileres %>%
filter( pm2 < PromedioAlquiler + desvioEstandarAlquiler *3 )
Agrupamos y vemos que barrios ofrecen mayor cantidad de alquileres:
alquiler_porBarrio <- properati_alquileres %>%
group_by(BARRIO) %>%
summarise(cantidad = n())
alquiler_porBarrio <- st_join( barrios, alquiler_porBarrio)
Calculamos el precio promedio por barrio:
alquiler_precio_promedioBarrio <- properati_alquileres %>%
group_by(BARRIO) %>%
summarise(precio_promedio = mean(pm2))
alquiler_precio_promedioBarrio <- st_join( barrios, alquiler_precio_promedioBarrio)
Omitimos los valores que no tienen precio:
alquiler_precio_promedioBarrio <- na.omit (alquiler_precio_promedioBarrio)
Graficamos:
ggplot() +
geom_sf(data = barrios)+
geom_sf(data = alquiler_porBarrio, aes (fill= cantidad))+
scale_fill_viridis_c()+
theme_void() +
labs(title="Alquileres en CABA",
subtitle="Cantidad de propiedades por barrio", fill="Cantidad")
Se observa que los barrios que ofrecen mayor cantidad de alquileres son Palermo y Recoleta.
ggplot() +
geom_sf(data = barrios)+
geom_sf(data = alquiler_precio_promedioBarrio, aes (fill = precio_promedio)) +
scale_fill_viridis_c()+
theme_void() +
labs(title="Alquileres en CABA",
subtitle="Precio promedio por barrio", fill="Precio promedio")
Se observa que los barrios que tienen mayor precio promedio son Puerto Madero y Palermo.
DEMANDA DE AISLAMIENTO
Suponiendo que los barrios que tienen mayor demanda de aislamiento son aquellos que tienen mayor proporcion de casos de COVID, realizamos el siguiente analisis:
Sumamos el dataset de Casos de COVID:
casos <- read.csv("C:/Users/Sixto/Documents/Jugando_con_datos/casos.csv")
Seleccionamos las columnas que nos importa analizar:
casos <- casos[c(5:10)]
Filtramos por los casos confirmados:
casos <- casos %>%
filter(!is.na(comuna), clasificacion =="confirmado")
Agrupamos por barrio:
casos[casos== "NUÑEZ"] <- "NUNIEZ"
casos_por_barrio <- casos %>%
group_by(barrio) %>%
summarise(cantidad = n())
Renombramos:
casos_por_barrio <- casos_por_barrio %>%
rename("BARRIO" = "barrio" )
radiosCensales$BARRIO[radiosCensales$BARRIO== "NUÑEZ"] <- "NUNIEZ"
barrios <- radiosCensales %>% group_by(BARRIO) %>% summarise(n())
Pasamos a graficar:
casos_por_barrio <- left_join(casos_por_barrio, barrios)
## Joining, by = "BARRIO"
casos_por_barrio <- st_as_sf(casos_por_barrio)
ggplot() +
geom_sf(data = casos_por_barrio, aes(fill=cantidad))+
scale_fill_viridis_c()+
theme_void()+
labs(title="Casos de COVID en CABA",
subtitle="Casos por Barrio", fill= "Cantidad de Casos")
En este mapa se observa que Palermo es el barrio con mayor numero de casos. Sin embargo, no sabemos si es debido a que Palermo tiene una gran cantidad de poblacion.
Calculamos la densidad poblacional por barrio:
densidad_por_barrio <- radiosCensales %>%
group_by(BARRIO) %>%
summarise(mean(densidadPob))
Graficamos la densidad poblacional por barrio:
ggplot() +
geom_sf(data = densidad_por_barrio, aes(fill=`mean(densidadPob)`)) +
scale_fill_viridis_c()+
theme_void()+
labs(title="Densidad Poblacional en CABA",
subtitle="Densidad Poblacional por Barrio", fill= "Densidad Poblacional")
Observamos que los barrios con mayor densidad poblacional son Recoleta y Retiro.
Calculamos la poblacion por barrio y graficamos:
poblacion_por_barrio <- radiosCensales %>%
group_by(BARRIO) %>%
summarise(sum(POBLACION))
ggplot() +
geom_sf(data = poblacion_por_barrio, aes(fill=`sum(POBLACION)`)) +
scale_fill_viridis_c()+
theme_void()+
labs(title="Poblacion en CABA",
subtitle="Poblacion por Barrio", fill= "Poblacion")
Observamos que el barrio con mayor poblacion es Palermo.
Generamos las modificaciones necesarias para convertir nuestro dataset de poblacion a un data frame:
poblacion_por_barrio <- poblacion_por_barrio %>%
rename("pob" = "sum(POBLACION)" )
poblacion_por_barrio <- as.matrix(poblacion_por_barrio)
poblacion_por_barrio[poblacion_por_barrio == "NUÑEZ"] <- "NUNIEZ"
poblacion_por_barrio <- as.data.frame(poblacion_por_barrio)
Convertimos la variable barrio como categorica y la variable poblacion como numerica:
poblacion_por_barrio <- poblacion_por_barrio %>%
mutate( BARRIO = as.character(BARRIO), pob = as.numeric(pob))
Unimos los casos por barrio con la poblacion y calculamos la proporcion de casos por barrio:
prop_barrio_casos <- left_join(casos_por_barrio, poblacion_por_barrio, by="BARRIO")
prop_barrio_casos <- prop_barrio_casos %>% mutate( casos_100mil = (prop_barrio_casos$cantidad/pob ))
prop_barrio_casos <- st_as_sf(prop_barrio_casos)
Graficamos:
ggplot() +
geom_sf(data=prop_barrio_casos, aes(fill = casos_100mil)) +
scale_fill_viridis_c() +
theme_void()+
labs(title="Casos COVID en CABA",
subtitle="Proporcion de casos por Barrio", fill= "Proporcion de Casos")
Hay correlación entre la cantidad de casos por barrio y la densidad poblacional?
densidad_por_barrio <- st_join(densidad_por_barrio, prop_barrio_casos)
ggplot(prop_barrio_casos) +
geom_bar(aes(x= reorder(BARRIO, casos_100mil), weight = casos_100mil), fill="#f68060", alpha=.6, width=.4 ) + coord_flip() +
labs(title="Casos COVID en CABA",
subtitle="Proporcion de casos por Barrio", x= "Barrios", y= "Proporcion")+ theme_bw()
Observamos que el barrio con mayor proporcion de casos es Puerto Madero, seguido de San Nicolas.
Suponiendo que las zonas con mayor proporcion de casos son aquellas que tienen mayor necesidad de aislamiento en habitaciones independientes, realizamos el cruce con la oferta de alquileres:
alquiler_porBarrio <- st_join(alquiler_porBarrio, alquiler_precio_promedioBarrio, by = "BARRIO")
demanda_alquileres <- st_join(prop_barrio_casos, alquiler_porBarrio)
Filtramos la demanda de alquileres por aquellos barrios que tienen una proporcion de casos mayor al 15%:
demanda_alquileres1 <- demanda_alquileres %>%
filter(casos_100mil>0.15)
Graficamos:
library(ggrepel)
ggplot()+
geom_sf(data = barrios)+
geom_sf(data = demanda_alquileres1, aes(fill=precio_promedio))+
geom_sf_label(data=demanda_alquileres1, aes(label = BARRIO), size=1.5)+
scale_fill_viridis_c()+
theme_void() +
labs(title="Alquileres en CABA",
subtitle="Precio promedio en barrios con mayor proporcion de casos COVID", fill="Precio promedio")
La visualizacion anterior pone en evidencia la oferta de propiedades en alquiler (Precio promedio y Cantidad) en cada uno de los barrios que tiene mayor proporcion de casos de COVID.
Realizamos nuevos filtros:
demanda_alquileres_aislamiento <- Properati %>%
filter(!is.na(lat), !is.na(lon), operation_type == "Alquiler",property_type == c("Casa", "Departamento", "PH"), currency =="ARS", l2 == "Capital Federal" , surface_covered > 15, surface_covered < 100 ,!is.na(price) ) %>%
st_as_sf(coords = c("lon", "lat"), crs = 4326) %>% st_transform(crs = caba_CRS)
## Warning in property_type == c("Casa", "Departamento", "PH"): longitud de objeto
## mayor no es múltiplo de la longitud de uno menor
demanda_alquileres_aislamiento <- st_intersection(demanda_alquileres_aislamiento, demanda_alquileres1)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
Filtramos valores duplicados:
demanda_alquileres_aislamiento <- demanda_alquileres_aislamiento[!duplicated(demanda_alquileres_aislamiento$id), ]
Graficamos en escala logaritmica los precios de los inmuebles a alquiler en los barrios con mayor proporcion de casos:
ggplot()+
geom_sf(data = barrios)+
geom_sf(data = demanda_alquileres_aislamiento, aes(color= log10(price)))+
scale_color_viridis_c()+
theme_void() +
labs(title="Alquileres en CABA",
subtitle="Precio de alquileres en barrios con alta proporcion de casos de COVID", color="Precio Alquiler")
Calculamos el precio promedio de los alquileres en barrios con alta proporcion de casos:
demanda_alquileres_aislamiento <- demanda_alquileres_aislamiento %>% mutate(pm2 = price/surface_covered)
demanda_alquileres_aislamiento_precio_promedio <- demanda_alquileres_aislamiento %>%
summarise(precio_promedio = mean(pm2))
print(demanda_alquileres_aislamiento_precio_promedio)
## Simple feature collection with 1 feature and 1 field
## Geometry type: MULTIPOINT
## Dimension: XY
## Bounding box: xmin: 97639.69 ymin: 93531.7 xmax: 109778.1 ymax: 105485.1
## CRS: +proj=tmerc +lat_0=-34.6297166 +lon_0=-58.4627 +k=1 +x_0=100000 +y_0=100000 +ellps=intl +units=m +no_defs
## precio_promedio geometry
## 1 659.6273 MULTIPOINT ((97639.69 94656...
Calculamos la cantidad de cuartos disponibles:
demanda_alquileres_aislamiento_cantidad_cuartos <- sum(demanda_alquileres_aislamiento$bedrooms, na.rm = TRUE)
print(demanda_alquileres_aislamiento_cantidad_cuartos)
## [1] 1097
Calculamos el precio total de alquilar los cuartos y el precio por cuarto:
demanda_alquileres_aislamiento_precio_total <- sum(demanda_alquileres_aislamiento$price, na.rm = TRUE)
print(demanda_alquileres_aislamiento_precio_total)
## [1] 37963190
demanda_alquileres_aislamiento_precio_por_cuarto <- demanda_alquileres_aislamiento_precio_total/demanda_alquileres_aislamiento_cantidad_cuartos
print(demanda_alquileres_aislamiento_precio_por_cuarto)
## [1] 34606.37
Mediante la inversion de $37.963.190 se podrian aislar a 2194 personas por mes. Contemplando que el aislamiento dura alrededor de 2 semanas, cada cuarto se podria usar 2 veces por mes. Asi, en los barrios con mayor proporcion de casos se podria reducir la circulacion del virus, ofreciendo la posibilidad de aislamiento a aquellas personas que no cuenten con esa posibilidad de aislarse, con el correspondiente protocolo, en su propio hogar.
Para concluir, podemos afirmar que este trabajo analiza con, detalle y detenimiento, una gran variedad de datasets. Mediante su lectura, manipulacion, transformacion, visualizacion, especialmente de datos de tipo espacial, se ofrecen diversos puntos de partida para tomar decisiones de politica publica destinadas a modificar la oferta de testeo de la Ciudad de Buenos Aires y a abordar aquellas zonas con mayor proporcion de casos de COVID-19.
Somos conscientes de que asumimos diversos supuestos que pueden discutirse desde varias perspectivas. El objetivo principal de este trabajo fue demostrar la capacidad de implementar diversas herramientas vistas en Instrumentos de Analisis Urbano I.