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)!
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:
31/05/2021
05/31/2021
2021/05/31
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.
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)
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
Utilizar algún dataset open data de la Ciudad con la que están trabajando que tenga tanto coordenadas como fechas.
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?
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?