#CIENCIA DE DATOS II

CIENCIA DE DATOS PARA CIUDADES

Ejercicio 1

*1. Deberán elegir una ciudad en cualquier parte del mundo que les interese (ya que seguirán trabajando con ella) y que disponga de un portal de datos abiertos que ofrece un shapefile con sus barrios.

Ciudad elegida: CABA

  • Cargo librerias
library(tidyverse)
## ── Attaching packages ───────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.0     ✓ purrr   0.3.4
## ✓ tibble  3.0.1     ✓ dplyr   0.8.5
## ✓ tidyr   1.0.2     ✓ stringr 1.4.0
## ✓ readr   1.3.1     ✓ forcats 0.5.0
## ── Conflicts ──────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(sf)
## Linking to GEOS 3.5.1, GDAL 2.2.2, PROJ 4.9.2

Cargo dataset barrios porteños

barrios <- st_read('http://cdn.buenosaires.gob.ar/datosabiertos/datasets/barrios/barrios.geojson')
## Reading layer `barrios_badata' from data source `http://cdn.buenosaires.gob.ar/datosabiertos/datasets/barrios/barrios.geojson' using driver `GeoJSON'
## Simple feature collection with 48 features and 4 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
## CRS:            4326
names(barrios)
## [1] "barrio"    "comuna"    "perimetro" "area"      "geometry"

2. Del mismo portal de datos, o de otra fuente si la tienen, elegirán un dataset con registros geo-referenciados. Por ejemplo, las escuelas de la ciudad (o las comisarías, o las propiedades en alquiler, o…) con sus coordenadas. Seleccionamos centros de vacunacion para adultos mayores.

Cargo dataset de vacunatorios para adultos

vacunatorios_adultos <-st_read('http://cdn.buenosaires.gob.ar/datosabiertos/datasets/vacunatorios-adultos-mayores/vacunatorios-adultos-mayores.geojson')
## Reading layer `vacunacion' from data source `http://cdn.buenosaires.gob.ar/datosabiertos/datasets/vacunatorios-adultos-mayores/vacunatorios-adultos-mayores.geojson' using driver `GeoJSON'
## Simple feature collection with 80 features and 6 fields
## geometry type:  POINT
## dimension:      XY
## bbox:           xmin: -58.5253 ymin: -34.68989 xmax: -58.37062 ymax: -34.54537
## CRS:            4326
names(vacunatorios_adultos)
## [1] "nombre"    "barrio"    "comuna"    "tipo"      "domicilio" "aph"      
## [7] "geometry"

3. Realizando un join espacial, asignar a cada registro geo-referenciado la comuna que le corresponde. Combinamos datasets con información espacial de vacunatorios para adultos mayores y comunas.

ggplot() + 
  geom_sf(data = barrios) +
  geom_sf(data = vacunatorios_adultos, color = "red", alpha = .4)

vacunatorios_barrios <- st_join(barrios, vacunatorios_adultos)
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
head(vacunatorios_barrios)
## Simple feature collection with 6 features and 10 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -58.47883 ymin: -34.60762 xmax: -58.42337 ymax: -34.57829
## CRS:            4326
##         barrio.x comuna.x perimetro    area                            nombre
## 1      CHACARITA       15  7724.853 3115707                     Carlos Gardel
## 1.1    CHACARITA       15  7724.853 3115707        Baldomero Fernández Moreno
## 2       PATERNAL       15  7087.513 2229829        Santa Inés Virgen y Mártir
## 3   VILLA CRESPO       15  8131.857 3615978                  Centro de dia 15
## 3.1 VILLA CRESPO       15  8131.857 3615978 Esc. de Educación Media N° 03/07°
## 3.2 VILLA CRESPO       15  8131.857 3615978                Casa de la Lectura
##         barrio.y comuna.y             tipo              domicilio
## 1      CHACARITA       15 Espacio cultural           Olleros 3640
## 1.1    CHACARITA       15 Espacio cultural Concepción Arenal 4206
## 2       PATERNAL       15          Iglesia             Ávalos 250
## 3   VILLA CRESPO       15    Centro de día              Jufre 350
## 3.1 VILLA CRESPO       15          Escuela           Padilla 1051
## 3.2 VILLA CRESPO       15 Espacio cultural          Lavalleja 924
##                       aph                       geometry
## 1      HTAL. DR. E. TORNÚ POLYGON ((-58.45282 -34.595...
## 1.1    HTAL. DR. E. TORNÚ POLYGON ((-58.45282 -34.595...
## 2      HTAL. DR. E. TORNÚ POLYGON ((-58.46558 -34.596...
## 3   HTAL. DR. C.G. DURAND POLYGON ((-58.42375 -34.597...
## 3.1 HTAL. DR. C.G. DURAND POLYGON ((-58.42375 -34.597...
## 3.2 HTAL. DR. C.G. DURAND POLYGON ((-58.42375 -34.597...

Creamos un nuevo dataset con las variables que nos interesa analizar, nombrándola vacunatorios_barrios

cantidad_vacunatorios <- vacunatorios_barrios %>% 
    group_by(barrio.x) %>% 
    summarise(cantidad = n())
head(cantidad_vacunatorios)
## Simple feature collection with 6 features and 2 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -58.50354 ymin: -34.66226 xmax: -58.33515 ymax: -34.53168
## CRS:            4326
## # A tibble: 6 x 3
##   barrio.x  cantidad                                                    geometry
##   <fct>        <int>                                               <POLYGON [°]>
## 1 AGRONOMIA        1 ((-58.47712 -34.59511, -58.47788 -34.59709, -58.47835 -34.…
## 2 ALMAGRO          2 ((-58.41287 -34.61412, -58.41282 -34.61544, -58.41275 -34.…
## 3 BALVANERA        2 ((-58.41192 -34.598, -58.41029 -34.59809, -58.40943 -34.59…
## 4 BARRACAS         1 ((-58.37034 -34.63293, -58.37028 -34.63339, -58.37025 -34.…
## 5 BELGRANO         4 ((-58.45057 -34.53561, -58.45066 -34.53564, -58.45075 -34.…
## 6 BOCA             1 ((-58.35429 -34.62977, -58.35427 -34.62981, -58.35421 -34.…

4. Utilizando ggplot() realizar

  • Un gráfico (barras, puntos, o el que prefieran) para mostrar los resultados de cantidad por barrio
  • Un mapa con los límites de los barrios, cuyo color de relleno indique la cantidad encontrada en cada uno*

** Ambos dataset presentan las variables de comunas y barrios Realizamos un join espacial de las variables de vacunatorios adultos y geriatricos

Realizamos grafico donde se ven los vacunatorios por comuna

ggplot() +
geom_sf(data = barrios) +
geom_sf(data = vacunatorios_adultos, aes(color = barrio))

Creamos gráfico de barras mostrando cantidad de vacunatorios para adultosmayores por barrio

ggplot(cantidad_vacunatorios) +
geom_bar(aes(x = barrio.x, weight = cantidad, color = cantidad, fill = barrio.x)) +
coord_flip() + 
labs(title = "Centros de vacunacion de adultos mayores por comuna",
subtitle = "Ciudad Autónoma de Buenos Aires",
caption = "Fuente: portal de datos abiertos de la Ciudad - http://data.buenosaires.gob.ar",
x = "barrio",
y = "cantidad",
fill = "barrio")

Procederemos ahora a realizar un mapa con los límites de los barrios, cuyo color de relleno indique la cantidad de centros vacunatorios para adultos mayores encontrada en cada barrio.

cantidad_vacunatorios <- vacunatorios_barrios %>% 
    group_by(barrio.x) %>% 
    summarise(cantidad = n())
head(cantidad_vacunatorios)
## Simple feature collection with 6 features and 2 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -58.50354 ymin: -34.66226 xmax: -58.33515 ymax: -34.53168
## CRS:            4326
## # A tibble: 6 x 3
##   barrio.x  cantidad                                                    geometry
##   <fct>        <int>                                               <POLYGON [°]>
## 1 AGRONOMIA        1 ((-58.47712 -34.59511, -58.47788 -34.59709, -58.47835 -34.…
## 2 ALMAGRO          2 ((-58.41287 -34.61412, -58.41282 -34.61544, -58.41275 -34.…
## 3 BALVANERA        2 ((-58.41192 -34.598, -58.41029 -34.59809, -58.40943 -34.59…
## 4 BARRACAS         1 ((-58.37034 -34.63293, -58.37028 -34.63339, -58.37025 -34.…
## 5 BELGRANO         4 ((-58.45057 -34.53561, -58.45066 -34.53564, -58.45075 -34.…
## 6 BOCA             1 ((-58.35429 -34.62977, -58.35427 -34.62981, -58.35421 -34.…
ggplot() +
  geom_sf(data = cantidad_vacunatorios, aes(fill=cantidad)) +
    labs(title = "Vacunatorios para adultos",
         subtitle = "Ciudad Autonoma de Buenos Aires",
         fill = "Cantidad",
         caption= "Fuente: https://data.buenosaires.gob.ar/",
         y="latitud",
         x="longitud") +
        scale_fill_gradient(low="pink", high="red")

Ejercicio 2

Cargamos nuevas librerias

library(osmdata)
## Data (c) OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright
library(leaflet)

A continuacion obtener la bounding box Palermo con la función getbb()

bbox_st <- getbb('Palermo, Ciudad Autonoma de Buenos Aires')
bbox_st_poly = getbb('Palermo, Ciudad Autonoma de Buenos Aires', format_out = "sf_polygon")
leaflet(bbox_st_poly) %>% 
  addTiles() %>% 
  addPolygons()

Solicitaremos las vias de circulacion de Palermo

Palermo_calles <- opq(bbox_st) %>% 
    add_osm_feature(key = "highway") %>% 
    osmdata_sf()
Palermo_calles <- st_intersection(Palermo_calles$osm_lines, bbox_st_poly)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
Palermo_calles <- Palermo_calles %>% 
  mutate(lanes = as.numeric(lanes))

Realizamos un mapa de las calles de Palorme de acuerdo vias de circulacion(tipo de carril)

ggplot(Palermo_calles) +
    geom_sf(aes(color = lanes), alpha = 0.5) +
    scale_fill_continuous() + theme_void()+
    labs(title = "Palermo",
         subtitle = "Vías de circulación",
         caption = "fuente: OpenStreetMap",
         color = "cantidad de carriles")

Descargar de OpenStreetMap una (o más) capas de datos de tipo puntos o polígonos. (Ver catálogo de categorías en https://wiki.openstreetmap.org/wiki/Map_Features)

En este caso elegimos hospitales en Palermo

Palermo_hospitales <- opq(bbox_st) %>% 
  add_osm_feature(key = "amenity", value = "hospital") %>% 
  osmdata_sf()
Palermo_hospitales <- st_intersection(Palermo_hospitales$osm_points, bbox_st_poly)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries

Proyectar los datos descargados en un mapa y comentar los resultados: ¿Cómo se distribuyen en la Ciudad?

ggplot() +
geom_sf(data = Palermo_calles, color = "gray60", alpha = .8) +
      geom_sf(data = Palermo_hospitales, color= "red", alpha=.8) +
    theme_void() +
  labs(title = "Hospitales",
       subtitle = "Palermo",
       caption = "fuente: OpenStreetMap")

Hacer un conteo de los ítems de la capa descargada por barrio, mapearlo y compararlo con el conteo de los ítems descargados en el ejercicio anterior: ¿La distribución es similar o hay diferencias? ¿A qué se puede deber?

Ahora cargamos el mapa de toda la ciudad, para poder comparar con el item del ejercicio anterior que abarcaba todo CABA

bbox_st_caba <- getbb('Ciudad Autonoma de Buenos Aires')
bbox_st_poly_caba = getbb('Ciudad Autonoma de Buenos Aires', format_out = "sf_polygon")
Hospitales <- opq(bbox_st_caba) %>% 
  add_osm_feature(key = "amenity", value = "hospital") %>% 
  osmdata_sf() 
hospitales_caba <- st_intersection(Hospitales$osm_points, bbox_st_poly_caba)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
hospitales_caba_barrios <- st_join(hospitales_caba,barrios)
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
hvb <- hospitales_caba_barrios %>% 
    group_by(barrio) %>% 
    summarise(cantidad = n())
hvb <- hvb %>%
  st_set_geometry(NULL)
hospitales_vac_barrios <- barrios %>%
left_join(hvb, by="barrio")
ggplot() +
      geom_sf(data=hospitales_vac_barrios, aes(fill=cantidad)) +
  geom_sf_text(data=hospitales_vac_barrios, aes(label = cantidad ), size=2, colour = "blue")+
       labs(title = "Hospitales en Caba",
         subtitle = "Palermo",
         fill = "Cantidad",
         caption= "Fuente: https://datos.caba.gob.ar / OpenStreetMap",
         y="latitud",
         x="longitud") +
        scale_fill_gradient(low="yellow", high="red")
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data
## Warning: Removed 16 rows containing missing values (geom_text).