ANALIZANDO DATOS ESPACIALES Y TEMPORALES

En la clase de hoy seguiremos trabajando con datos espaciales, pero esta vez se sumará un tipo de dato nuevo que hasta el momento no habíamos visto: las fechas y horas!

Para comenzar, activemos nuestras ya conocidas librerías tidyverse, sf y ggmap, e instalemos y activemos una nueva que nos permitirá manipular datos temporales: lubridate

#install.packages("tidyverse")
library(tidyverse)
#install.packages("sf")
library(sf)
#install.packages("ggmap")
library(ggmap)
#install.packages("lubridate")
library(lubridate)

Listo, ahora descarguemos de https://data.world/angie-scetta/delitos-caba-2020 el dataset con el que trabajaremos hoy, que contiene los homicidios, hurtos (sin violencia), lesiones y robos (con violencia) que ocurrieron en el ámbito de la Ciudad Autónoma de Buenos Aires durante el 2020. Cabe destacar que el dataset original fue descargado de https://data.buenosaires.gob.ar/dataset/delitos. Abramoslo con read.csv():

delitos_2020 <- read.csv("delitos_2020.csv", stringsAsFactors = TRUE)

Veamos la cantidad de filas y columnas:

dim(delitos_2020)
## [1] 65689     9

Nuestro dataset cuenta con 65689 registros de delitos y 9 columnas/variables. Revisemos que info tenemos dentro:

summary(delitos_2020)
##             id_mapa             fecha             hora      
##  LC-2020-0639897:    2   13/01/2020:  388   5:00:00 : 3785  
##  LC-2020-0640217:    2   07/02/2020:  380   11:00:00: 3699  
##  LC-2020-0640268:    2   09/03/2020:  378   14:00:00: 3667  
##  LC-2020-0641398:    2   23/01/2020:  378   12:00:00: 3665  
##  LC-2020-0641587:    2   06/03/2020:  376   3:00:00 : 3547  
##  LC-2020-0642262:    2   12/02/2020:  366   10:00:00: 3461  
##  (Other)        :65677   (Other)   :63423   (Other) :43865  
##                     tipo             barrio          comuna      
##  Homicidio            :  187   Palermo  : 5414   Min.   : 1.000  
##  Hurto (sin violencia):25318   Balvanera: 4459   1st Qu.: 3.000  
##  Lesiones             : 6084   Flores   : 3389   Median : 7.000  
##  Robo (con violencia) :34100   Caballito: 3007   Mean   : 7.419  
##                                Recoleta : 2994   3rd Qu.:12.000  
##                                Almagro  : 2723   Max.   :15.000  
##                                (Other)  :43703                   
##     latitud          longitud         victimas       
##  Min.   :-34.70   Min.   :-58.53   Min.   :0.000000  
##  1st Qu.:-34.63   1st Qu.:-58.47   1st Qu.:0.000000  
##  Median :-34.61   Median :-58.43   Median :0.000000  
##  Mean   :-34.61   Mean   :-58.44   Mean   :0.002968  
##  3rd Qu.:-34.59   3rd Qu.:-58.40   3rd Qu.:0.000000  
##  Max.   :-34.53   Max.   :-58.34   Max.   :2.000000  
## 

Las 9 columnas que tiene el dataset corresponden a ID del delito, fecha en la que ocurrió, hora, tipo de delito, barrio, comuna, ubicación exacta (latitud y longitud) y cantidad de víctimas. Como verán, ¡Tenemos columnas con datos espaciales (coordenadas) y otras con datos temporales (fecha y hora)!

ANÁLISIS TEMPORAL

Comencemos a trabajar con los datos temporales: Lo primero que vamos a hacer es revisar que formato tienen las variables fecha y hora.

str(delitos_2020)
## 'data.frame':    65689 obs. of  9 variables:
##  $ id_mapa : Factor w/ 65507 levels "HC-2020-0007157",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ fecha   : Factor w/ 366 levels "01/01/2020","01/02/2020",..: 37 49 121 157 157 229 313 349 86 134 ...
##  $ hora    : Factor w/ 24 levels "1:00:00","10:00:00",..: 18 6 14 14 7 20 1 15 13 19 ...
##  $ tipo    : Factor w/ 4 levels "Homicidio","Hurto (sin violencia)",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ barrio  : Factor w/ 48 levels "Agronomía","Almagro",..: 36 13 3 31 17 47 17 28 12 2 ...
##  $ comuna  : int  15 7 3 3 1 8 1 2 1 5 ...
##  $ latitud : num  -34.6 -34.6 -34.6 -34.6 -34.6 ...
##  $ longitud: num  -58.4 -58.5 -58.4 -58.4 -58.4 ...
##  $ victimas: int  1 1 1 1 1 1 1 1 1 1 ...

La fecha y la hora (nuestras variables estrella del día) son de formato factor, lo cual nos indica que son categorías, pero… esto no está del todo bien ya que deberían tener formato de fecha y hora para poder manipularlas correctamente y hacer operaciones temporales con ellas. Pero quedense tranquilos que justamente lubridate sirve para eso y mucho más! Por ejemplo nos puede decir qué fecha es hoy:

today()
## [1] "2021-06-02"

O qué fecha y hora exacta:

now()
## [1] "2021-06-02 21:32:37 -03"

O qué día de la semana:

wday(today())
## [1] 4

Si queremos agregar etiqueta a los días alcanza con ajusar el parámetro label:

wday(today(), label=TRUE, abbr=FALSE)
## [1] miércoles
## 7 Levels: domingo < lunes < martes < miércoles < jueves < ... < sábado

Pero esto no es todo, antes de comenzar a trabajar sobre nuestro dataset es necesario que tengamos en cuenta que la fecha y hora podrían estar expresadas de diferentes formas. Es decir que, el campo podría contener por ejemplo alguna de las siguientes opciones:

  1. 31/05/2021

  2. 05/31/2021

  3. 2021/05/31

  4. 2021/05/31 00:00:00

Y para cada caso, la función de lubridate se usaría diferente. Por ejemplo para el caso 1 sería dmy(), para el caso 2 sería mdy(), para el caso 3 sería ymd() y para el caso 4 sería ymd_hms(). ¿Se les ocurre que significan estas siglas? Simple! La letra y refiere a year, m a month, d a day, h a hour, m a minute, s a second. Y según en que orden esté la información, elegiremos la función.

Entonces, ¿Cómo hacemos si queremos modificar el formato de la columna fecha de nuestro dataset? Como siempre, para modificar variables tenemos que usar mutate() y en este caso se agregaría dmy() de la siguiente forma:

delitos_2020 <- delitos_2020 %>%
  mutate(fecha=dmy(fecha))

Y ahora volvamos a revisar la estructura del dataset:

str(delitos_2020)
## 'data.frame':    65689 obs. of  9 variables:
##  $ id_mapa : Factor w/ 65507 levels "HC-2020-0007157",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ fecha   : Date, format: "2020-01-04" "2020-01-05" ...
##  $ hora    : Factor w/ 24 levels "1:00:00","10:00:00",..: 18 6 14 14 7 20 1 15 13 19 ...
##  $ tipo    : Factor w/ 4 levels "Homicidio","Hurto (sin violencia)",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ barrio  : Factor w/ 48 levels "Agronomía","Almagro",..: 36 13 3 31 17 47 17 28 12 2 ...
##  $ comuna  : int  15 7 3 3 1 8 1 2 1 5 ...
##  $ latitud : num  -34.6 -34.6 -34.6 -34.6 -34.6 ...
##  $ longitud: num  -58.4 -58.5 -58.4 -58.4 -58.4 ...
##  $ victimas: int  1 1 1 1 1 1 1 1 1 1 ...

Efectivamente, ahora el campo fecha dejó de ser factor y pasó a ser “Date”. Y ya estamos en condiciones de operar con fechas! Por ejemplo podríamos ver hace cuantos días fue cada delito teniendo en cuenta la fecha de hoy:

delitos_2020 <- delitos_2020 %>%
  mutate(tiempo=today()-fecha)
head(delitos_2020)
##           id_mapa      fecha     hora      tipo        barrio comuna   latitud
## 1 HC-2020-0007157 2020-01-04  3:00:00 Homicidio  Villa Crespo     15 -34.59213
## 2 HC-2020-0009055 2020-01-05 14:00:00 Homicidio        Flores      7 -34.64646
## 3 HC-2020-0022499 2020-01-11 21:00:00 Homicidio     Balvanera      3 -34.60927
## 4 HC-2020-0028163 2020-01-14 21:00:00 Homicidio San Cristóbal      3 -34.62477
## 5 HC-2020-0029931 2020-01-14 15:00:00 Homicidio     Monserrat      1 -34.60930
## 6 HC-2020-0041208 2020-01-20  5:00:00 Homicidio Villa Soldati      8 -34.65225
##    longitud victimas   tiempo
## 1 -58.43911        1 515 days
## 2 -58.45020        1 514 days
## 3 -58.39338        1 508 days
## 4 -58.41037        1 505 days
## 5 -58.39053        1 505 days
## 6 -58.45032        1 499 days

Hagamos un historgrama para entender la distribución de la variable numérica que creamos:

ggplot(delitos_2020)+
  geom_histogram(aes(x=tiempo))
## Don't know how to automatically pick scale for object of type difftime. Defaulting to continuous.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

El histograma muestra que la mayor cantidad de registros ocurrió hace más de 425 días, es decir, a principios de 2020! Revisemos esto en detalle a partir de un gráfico de líneas:

ggplot(delitos_2020 %>%
         group_by(fecha) %>%
         summarise(cantidad=n())) + 
    geom_line(aes(x = fecha, y = cantidad))

Tal como pensábamos! Se ve una caída en la cantidad de delitos a partir del aislamiento obligatorio por la pandemia (20/03/20 aproximadamente). Agrupemos los datos de forma mensual agregando una columna con la función month():

delitos_2020 <- delitos_2020 %>%
  mutate(mes=month(fecha, label = TRUE))
head(delitos_2020)
##           id_mapa      fecha     hora      tipo        barrio comuna   latitud
## 1 HC-2020-0007157 2020-01-04  3:00:00 Homicidio  Villa Crespo     15 -34.59213
## 2 HC-2020-0009055 2020-01-05 14:00:00 Homicidio        Flores      7 -34.64646
## 3 HC-2020-0022499 2020-01-11 21:00:00 Homicidio     Balvanera      3 -34.60927
## 4 HC-2020-0028163 2020-01-14 21:00:00 Homicidio San Cristóbal      3 -34.62477
## 5 HC-2020-0029931 2020-01-14 15:00:00 Homicidio     Monserrat      1 -34.60930
## 6 HC-2020-0041208 2020-01-20  5:00:00 Homicidio Villa Soldati      8 -34.65225
##    longitud victimas   tiempo mes
## 1 -58.43911        1 515 days ene
## 2 -58.45020        1 514 days ene
## 3 -58.39338        1 508 days ene
## 4 -58.41037        1 505 days ene
## 5 -58.39053        1 505 days ene
## 6 -58.45032        1 499 days ene

Y veamos gráficamente el resultado:

ggplot(delitos_2020) + 
    geom_bar(aes(x = mes))

Agreguemos una variable más (tipo de delito) y generemos un gráfico de barras apilado:

ggplot(delitos_2020) + 
    geom_bar(aes(x = mes, fill=tipo)) +
    labs(title = "Cantidad de Delitos por Mes en CABA",
         subtitle = "Año 2020",
         x = "Mes",
         y = "Cantidad",
         fill = "Tipo de Delito",
         caption = "Fuente: BA Data")

Y también probemos el gráfico sin apilar:

ggplot(delitos_2020) + 
    geom_bar(aes(x = mes, fill=tipo), position = "dodge") +
    labs(title = "Cantidad de Delitos por Mes en CABA",
         subtitle = "Año 2020",
         x = "Mes",
         y = "Cantidad",
         fill = "Tipo de Delito",
         caption = "Fuente: BA Data")

O volvamos al gráfico de líneas:

ggplot(delitos_2020 %>%
         group_by(mes, tipo) %>%
         summarise(cantidad = n())) + 
    geom_line(aes(x = mes, y = cantidad, color=tipo, group=tipo)) +
    labs(title = "Cantidad de Delitos por Mes en CABA",
         subtitle = "Año 2020",
         x = "Mes",
         y = "Cantidad",
         color = "Tipo de Delito",
         caption = "Fuente: BA Data")
## `summarise()` has grouped output by 'mes'. You can override using the `.groups` argument.

También podríamos sumarle una capa de puntos y una capa de etiquetas para mejorar la interpretación de resultados:

ggplot(delitos_2020 %>%
         group_by(mes, tipo) %>%
         summarise(cantidad = n())) + 
    geom_line(aes(x = mes, y = cantidad, color=tipo, group=tipo)) +
    geom_point(aes(x=mes, y=cantidad, color=tipo))+
    geom_text(aes(x=mes, y=cantidad+200, label=cantidad), size=2)+
    labs(title = "Cantidad de Delitos por Mes en CABA",
         subtitle = "Año 2020",
         x = "Mes",
         y = "Cantidad",
         color = "Tipo de Delito",
         caption = "Fuente: BA Data")
## `summarise()` has grouped output by 'mes'. You can override using the `.groups` argument.

La categoría homicidio se ve muy por debajo del resto, pero a partir de las etiquetas podemos ver que fue teniendo cierta variación. Hagamos “zoom” en este tipo de delito:

ggplot(delitos_2020 %>%
         filter(tipo == "Homicidio") %>% 
         group_by(mes, tipo) %>%
         summarise(cantidad = n())) + 
    geom_line(aes(x = mes, y = cantidad, group = tipo, color = tipo), size=1) +
    geom_point(aes(x=mes, y=cantidad, color = tipo), size=2)+
    labs(title = "Cantidad de Delitos por Mes en CABA",
         subtitle = "Año 2020",
         x = "Mes",
         y = "Cantidad",
         color = "Tipo de Delito",
         caption = "Fuente: BA Data")
## `summarise()` has grouped output by 'mes'. You can override using the `.groups` argument.

Si bien los registros de homicidios son mucho menos que en el resto de tipologías, se ve un incremento notable en diciembre 2020. ¿A qué puede deberse? ¿Habrá alguna explicación?

Para poder analizar aún con mayor detalle, también está la función wday() que nos ayuda a saber a que día de la semana corresponde cada fecha registrada. Agreguemos esta información en una columna del dataset:

delitos_2020 <- delitos_2020 %>%
  mutate(dia_semana=wday(fecha, label = TRUE))
head(delitos_2020)
##           id_mapa      fecha     hora      tipo        barrio comuna   latitud
## 1 HC-2020-0007157 2020-01-04  3:00:00 Homicidio  Villa Crespo     15 -34.59213
## 2 HC-2020-0009055 2020-01-05 14:00:00 Homicidio        Flores      7 -34.64646
## 3 HC-2020-0022499 2020-01-11 21:00:00 Homicidio     Balvanera      3 -34.60927
## 4 HC-2020-0028163 2020-01-14 21:00:00 Homicidio San Cristóbal      3 -34.62477
## 5 HC-2020-0029931 2020-01-14 15:00:00 Homicidio     Monserrat      1 -34.60930
## 6 HC-2020-0041208 2020-01-20  5:00:00 Homicidio Villa Soldati      8 -34.65225
##    longitud victimas   tiempo mes dia_semana
## 1 -58.43911        1 515 days ene     sáb\\.
## 2 -58.45020        1 514 days ene     dom\\.
## 3 -58.39338        1 508 days ene     sáb\\.
## 4 -58.41037        1 505 days ene     mar\\.
## 5 -58.39053        1 505 days ene     mar\\.
## 6 -58.45032        1 499 days ene     lun\\.

Veamos esto en un gráfico:

ggplot(delitos_2020) + 
    geom_bar(aes(x = dia_semana))

ggplot(delitos_2020) + 
    geom_bar(aes(x = dia_semana, fill=tipo))

ggplot(delitos_2020) + 
    geom_bar(aes(x = dia_semana, fill=tipo), position = "dodge")

Y con gráfico de líneas y puntos:

ggplot(delitos_2020 %>%
         group_by(tipo, dia_semana) %>%
         summarise(cantidad=n())) +
    geom_line(aes(x = dia_semana, y=cantidad, group = tipo, color = tipo), size=1) +
    geom_point(aes(x = dia_semana, y=cantidad, color = tipo), size=2)+
    geom_text(aes(x = dia_semana, y=cantidad+200, label=cantidad), size=2)+
    labs(title = "Cantidad de Delitos según día de la semana en CABA",
         subtitle = "Año 2020",
         x = "Día de la Semana",
         y = "Cantidad",
         color = "Tipo de Delito",
         caption = "Fuente: BA Data")
## `summarise()` has grouped output by 'tipo'. You can override using the `.groups` argument.

Ahora veamos si encontramos algún patrón por hora, es decir si hay algún horario en el que hay mayor cantidad de delitos. Para esto utilicemos hour():

delitos_2020 <- delitos_2020 %>%
  mutate(hora2=hour(hms(hora)))
head(delitos_2020)
##           id_mapa      fecha     hora      tipo        barrio comuna   latitud
## 1 HC-2020-0007157 2020-01-04  3:00:00 Homicidio  Villa Crespo     15 -34.59213
## 2 HC-2020-0009055 2020-01-05 14:00:00 Homicidio        Flores      7 -34.64646
## 3 HC-2020-0022499 2020-01-11 21:00:00 Homicidio     Balvanera      3 -34.60927
## 4 HC-2020-0028163 2020-01-14 21:00:00 Homicidio San Cristóbal      3 -34.62477
## 5 HC-2020-0029931 2020-01-14 15:00:00 Homicidio     Monserrat      1 -34.60930
## 6 HC-2020-0041208 2020-01-20  5:00:00 Homicidio Villa Soldati      8 -34.65225
##    longitud victimas   tiempo mes dia_semana hora2
## 1 -58.43911        1 515 days ene     sáb\\.     3
## 2 -58.45020        1 514 days ene     dom\\.    14
## 3 -58.39338        1 508 days ene     sáb\\.    21
## 4 -58.41037        1 505 days ene     mar\\.    21
## 5 -58.39053        1 505 days ene     mar\\.    15
## 6 -58.45032        1 499 days ene     lun\\.     5
ggplot(delitos_2020 %>%
         group_by(hora2) %>%
         summarise(cantidad=n()))+
  geom_bar(aes(x = hora2, weight=cantidad))

Asignemos el relleno de las barras de acuerdo al tipo de delito y agreguemos todas las horas al eje x para mejorar la interpretación:

ggplot(delitos_2020 %>%
         group_by(hora2, tipo) %>%
         summarise(cantidad=n()))+
  geom_bar(aes(x = hora2, weight=cantidad, fill=tipo))+
  scale_x_continuous(breaks = seq(1,24))+
    labs(title = "Cantidad de Delitos por hora en CABA",
         subtitle = "Año 2020",
         x = "Hora",
         y = "Cantidad",
         color = "Tipo de Delito",
         caption = "Fuente: BA Data")
## `summarise()` has grouped output by 'hora2'. You can override using the `.groups` argument.

Está muy claro que a las 13, 18 y 19 fueron los horarios donde se registraron bajas en la cantidad de delitos. Para poder sacar conclusiones sobre este gráfico nos faltaría conocer mejor si el horario de la base de datos es del momento en que se hace la denuncia o del momento en que ocurrió el delito.

Sumemos nuevamente un gráfico de líneas:

ggplot(delitos_2020 %>%
         group_by(tipo, hora2) %>%
         summarise(cantidad=n()))+
  geom_line(aes(x = hora2, y=cantidad, group = tipo, color = tipo), size=1)+ 
  geom_point(aes(x = hora2, y=cantidad, color = tipo), size=2)+ 
  scale_x_continuous(breaks = seq(1,24))+
    labs(title = "Cantidad de Delitos por hora en CABA",
         subtitle = "Año 2020",
         x = "Hora",
         y = "Cantidad",
         color = "Tipo de Delito",
         caption = "Fuente: BA Data")
## `summarise()` has grouped output by 'tipo'. You can override using the `.groups` argument.

Y volvamos a hacer zoom en Homicidios que aparece muy por debajo del resto:

ggplot(delitos_2020 %>%
         mutate(hora=hour(hms(hora))) %>%
         group_by(tipo, hora) %>%
         summarise(cantidad=n()) %>%
         filter(tipo=="Homicidio")) +
    geom_line(aes(x = hora, y=cantidad), size=1, color="red")+
    geom_point(aes(x = hora, y=cantidad), size=2, color="red")+
  scale_x_continuous(breaks = seq(1,24))+
    labs(title = "Cantidad de Homicidios por hora en CABA",
         subtitle = "Año 2020",
         x = "Hora",
         y = "Cantidad",
         caption = "Fuente: BA Data")
## `summarise()` has grouped output by 'tipo'. You can override using the `.groups` argument.

Podemos ver como los homicidios, a diferencia del total de delitos, tienen caídas a las 3, 16 y 00hs.

ANÁLISIS ESPACIAL

Hasta acá vimos todo lo relacionado a análisis temporal, pero como dijimos al principio de la clase hoy también estaremos realizando análisis espacial! Más específicamente detectando patrones espaciales.

Para esto, lo primero que haremos es descargar un “mapa base” con ggmap tal como vimos la última clase, pero nótese que esta vez no tengo un dato geoespacial para hacer la bbox, por lo tanto usaremos las coordenadas de las columnas longitud y latitud de la siguiente forma:

bbox <- make_bbox(delitos_2020$longitud, delitos_2020$latitud)
mapa_base <- get_stamenmap(bbox = bbox,
                           maptype = "toner-lite",
                           zoom = 12)
## Source : http://tile.stamen.com/toner-lite/12/1381/2466.png
## Source : http://tile.stamen.com/toner-lite/12/1382/2466.png
## Source : http://tile.stamen.com/toner-lite/12/1383/2466.png
## Source : http://tile.stamen.com/toner-lite/12/1384/2466.png
## Source : http://tile.stamen.com/toner-lite/12/1381/2467.png
## 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/1381/2468.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/1381/2469.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

Veamos que nos trajimos:

ggmap(mapa_base)

Y sumemos nuestros datos de delitos:

ggmap(mapa_base) +
    geom_point(data = delitos_2020, aes(x = longitud, y = latitud))

¿Les parece sencillo encontrar algún patrón espacial en el mapa anterior? Claro que no! Se ve toda una mancha negra homogénea. Probemos diferenciando los registros por tipo de delito:

ggmap(mapa_base) +
    geom_point(data = delitos_2020, aes(x = longitud, y = latitud, color=tipo), alpha=0.8)

Mejora un poco la visualización pero sigue “empastado” y solo se llegan a ver los delitos de tipo Hurto y de tipo Robo ya que son los que predominan. Facetemos por tipo de delito:

ggmap(mapa_base) +
    geom_point(data = delitos_2020, aes(x = longitud, y = latitud, color=tipo), alpha=0.6)+
     facet_wrap(~tipo)

Sigue siendo poco claro ¿No? Pero por suerte tenemos una solución con ggplot y son los Mapas de Densidad que podemos realizar a partir de geom_bin2d():

ggmap(mapa_base) +
    geom_bin2d(data = delitos_2020, 
               aes(x = longitud, y = latitud))

¿Qué es lo que mapeamos? La función genera una grilla, realiza el conteo de puntos dentro de cada celda y la colorea de acuerdo a eso. Entonces, como resultado obtenemos un mapa de densidad. Probemos agregando más bins y cambiando la escala de color:

ggmap(mapa_base) +
    geom_bin2d(data = delitos_2020, 
               aes(x = longitud, y = latitud), bins=50)+
  scale_fill_viridis_c(option = "magma", direction=-1)

Ahora si se puede ver un patrón un poco más claro, se ve como en el centro de la Ciudad están las celdas con mayor cantidad de delitos. Veamos esto facetado por tipo de delito:

ggmap(mapa_base) +
    geom_bin2d(data = delitos_2020, 
               aes(x = longitud, y = latitud), bins=50)+
  scale_fill_viridis_c(direction=-1)+
  facet_wrap(~tipo)

ANÁLISIS TEMPORAL Y ESPACIAL

Hasta acá vimos por un lado el análisis temporal y por el otro lado el análisis espacial. Ahora veamos ambos análisis juntos! Busquemos un patrón espacial según el día de la semana:

ggmap(mapa_base) +
    geom_bin2d(data = delitos_2020, 
               aes(x = longitud, y = latitud))+
  scale_fill_viridis_c(direction=-1)+
  facet_wrap(~dia_semana)

O según el mes:

ggmap(mapa_base) +
    geom_bin2d(data = delitos_2020, 
               aes(x = longitud, y = latitud))+
  scale_fill_viridis_c(direction=-1)+
  facet_wrap(~mes)

BONUS TRACK

Otra función interesante para mapas de densidad es stat_density_2d() que nos muestra la densidad de puntos:

ggmap(mapa_base) +
  stat_density_2d(data = delitos_2020, 
                  aes(x = longitud, y = latitud, 
                      fill = stat(level)), alpha = 0.8, geom = "polygon") +
  labs(title="Delitos registrados en la Ciudad de Buenos Aires",
       subtitle="Año 2020",
       caption= "Fuente de datos: https://data.buenosaires.gob.ar/",
       fill="Nivel")+
  theme_void()+
  scale_fill_distiller(palette = "Spectral")

ggmap(mapa_base) +
  stat_density_2d(data = delitos_2020, 
                  aes(x = longitud, y = latitud, 
                      fill = stat(level)), alpha = 0.8, geom = "polygon") +
  labs(title="Delitos registrados en la Ciudad de Buenos Aires",
       subtitle="Año 2020",
       caption= "Fuente de datos: https://data.buenosaires.gob.ar/",
       fill="Nivel")+
  theme_void()+
  scale_fill_distiller(palette = "Spectral")+
  facet_wrap(~tipo)

ggmap(mapa_base) +
  stat_density_2d(data = delitos_2020, 
                  aes(x = longitud, y = latitud, 
                      fill = stat(level)), alpha = 0.8, geom = "polygon") +
  labs(title="Delitos registrados en la Ciudad de Buenos Aires",
       subtitle="Año 2020",
       caption= "Fuente de datos: https://data.buenosaires.gob.ar/",
       fill="Nivel")+
  theme_void()+
  scale_fill_distiller(palette = "Spectral")+
  facet_wrap(~mes)

Como habrán visto, la información es al misma que la de geom_bin2d() pero con otra forma de visualizarla.

Ahora les toca a uds!

Ejercicio de Práctica

  1. Utilizar algún dataset open data de la Ciudad con la que están trabajando que tenga tanto coordenadas como fechas.

  2. Análisis Temporal: Realizar al menos 1 gráfico que les permita analizar la temporalidad de los datos. ¿Detectan algún patrón temporal? ¿A qué puede deberse?

  3. Análisis Espacial: Analizar la distribución espacial de los datos a partir de al menos 1 mapa de densidad que muestre donde se concentran la mayor cantidad de observaciones. Comparar la densidad de los datos en el tiempo (facetar). ¿Los patrones espaciales de los datos elegidos se mantienen o varían en el tiempo?