Datos

Los datos provistos por esta aplicación constituyen estadísticas operacionales de la Policía de Puerto Rico. Su finalidad es única y exclusivamente como medio informativo y pueden no reflejar los porcentajes actuales. https://data.pr.gov/en/Seguridad-P-blica/Incidencia-Crime-Map/3fy3-2bc5. Una copia parcial está disponible en el folder datos/.

library(readr)
crimen_pr <- read_csv("Data/crimen_pr.csv")
crimen= crimen_pr
head(crimen)
## # A tibble: 6 × 7
##   Fecha  Hora   Delito Delitos_code       POINT_X POINT_Y `Area Policiaca`
##   <chr>  <time>  <dbl> <chr>                <dbl>   <dbl> <chr>           
## 1 8/1/16 15:30       9 Otros                 18.4   -66.0 Carolina        
## 2 8/1/16 13:20       9 Otros                 18.2   -66.7 Utuado          
## 3 8/1/16 21:25       6 Apropiacion Ilegal    18.4   -66.0 San Juan        
## 4 8/1/16 02:35       9 Otros                 NA      NA   Aguadilla       
## 5 8/1/16 08:00       9 Otros                 NA      NA   Carolina        
## 6 8/1/16 18:18       6 Apropiacion Ilegal    18.4   -66.8 Arecibo

El paquete janitor se puede usar para limpiar los nombres de las columnas

library(janitor)

crm <- crimen %>%
  clean_names() %>%
  rename(longitud = point_y, 
         latitud = point_x)

crm
## # A tibble: 8,870 × 7
##    fecha  hora   delito delitos_code       latitud longitud area_policiaca
##    <chr>  <time>  <dbl> <chr>                <dbl>    <dbl> <chr>         
##  1 8/1/16 15:30       9 Otros                 18.4    -66.0 Carolina      
##  2 8/1/16 13:20       9 Otros                 18.2    -66.7 Utuado        
##  3 8/1/16 21:25       6 Apropiacion Ilegal    18.4    -66.0 San Juan      
##  4 8/1/16 02:35       9 Otros                 NA       NA   Aguadilla     
##  5 8/1/16 08:00       9 Otros                 NA       NA   Carolina      
##  6 8/1/16 18:18       6 Apropiacion Ilegal    18.4    -66.8 Arecibo       
##  7 8/1/16 22:30       5 Escalamiento          18.0    -66.6 Ponce         
##  8 8/1/16 13:30       6 Apropiacion Ilegal    18.3    -67.1 Mayaguez      
##  9 8/1/16 22:44       1 Asesinato             18.4    -66.0 San Juan      
## 10 8/1/16 17:19       5 Escalamiento          18.4    -66.0 Carolina      
## # ℹ 8,860 more rows

Use una gráfica para verificar si hay coordenadas fuera del perímetro de la isla

crm %>%
  ggplot() +
  geom_point(aes(longitud, latitud))


Con el comando filter() remueva las coordenadas que son inválidas

crm <- crimen %>%
  clean_names() %>%
  filter(!is.na(point_x), point_x != 0) %>% # remueve coordenadas inválidas
  rename(longitud = point_y, latitud = point_x)

Chequee otra vez que las coordenadas están dentro de los limites

crm %>%
  ggplot() +
  geom_point(aes(longitud, latitud))


La función map_data(), del paquete ggplot2, contiene el mapa mundial. El mapa de Puerto Rico se puede acceder usando el argumento region.

pr <- map_data("world", region = "Puerto Rico")
pr
##         long      lat group order      region      subregion
## 1  -67.87247 18.05986     1     1 Puerto Rico   Isla de Mona
## 2  -67.88184 18.05894     1     2 Puerto Rico   Isla de Mona
## 3  -67.89117 18.05991     1     3 Puerto Rico   Isla de Mona
## 4  -67.89546 18.06279     1     4 Puerto Rico   Isla de Mona
## 5  -67.90190 18.07187     1     5 Puerto Rico   Isla de Mona
## 6  -67.93037 18.08691     1     6 Puerto Rico   Isla de Mona
## 7  -67.93706 18.10064     1     7 Puerto Rico   Isla de Mona
## 8  -67.93062 18.11514     1     8 Puerto Rico   Isla de Mona
## 9  -67.91895 18.12090     1     9 Puerto Rico   Isla de Mona
## 10 -67.86108 18.12256     1    10 Puerto Rico   Isla de Mona
## 11 -67.85518 18.12114     1    11 Puerto Rico   Isla de Mona
## 12 -67.84365 18.11104     1    12 Puerto Rico   Isla de Mona
## 13 -67.84336 18.10395     1    13 Puerto Rico   Isla de Mona
## 14 -67.84907 18.09702     1    14 Puerto Rico   Isla de Mona
## 15 -67.85918 18.07959     1    15 Puerto Rico   Isla de Mona
## 16 -67.86343 18.07520     1    16 Puerto Rico   Isla de Mona
## 17 -67.86680 18.07066     1    17 Puerto Rico   Isla de Mona
## 18 -67.86811 18.06279     1    18 Puerto Rico   Isla de Mona
## 19 -67.87247 18.05986     1    19 Puerto Rico   Isla de Mona
## 21 -65.42558 18.10562     2    21 Puerto Rico Vieques Island
## 22 -65.50401 18.09951     2    22 Puerto Rico Vieques Island
## 23 -65.55508 18.10767     2    23 Puerto Rico Vieques Island
## 24 -65.57221 18.13730     2    24 Puerto Rico Vieques Island
## 25 -65.47715 18.16504     2    25 Puerto Rico Vieques Island
## 26 -65.36621 18.16108     2    26 Puerto Rico Vieques Island
## 27 -65.30269 18.14438     2    27 Puerto Rico Vieques Island
## 28 -65.29488 18.13335     2    28 Puerto Rico Vieques Island
## 29 -65.42558 18.10562     2    29 Puerto Rico Vieques Island
## 31 -66.12939 18.44492     3    31 Puerto Rico           <NA>
## 32 -66.09849 18.42520     3    32 Puerto Rico           <NA>
## 33 -66.06841 18.42803     3    33 Puerto Rico           <NA>
## 34 -66.09267 18.46899     3    34 Puerto Rico           <NA>
## 35 -66.07040 18.46899     3    35 Puerto Rico           <NA>
## 36 -65.87876 18.44385     3    36 Puerto Rico           <NA>
## 37 -65.75557 18.40161     3    37 Puerto Rico           <NA>
## 38 -65.62881 18.38140     3    38 Puerto Rico           <NA>
## 39 -65.62085 18.24233     3    39 Puerto Rico           <NA>
## 40 -65.71841 18.18667     3    40 Puerto Rico           <NA>
## 41 -65.78223 18.12861     3    41 Puerto Rico           <NA>
## 42 -65.83413 18.05733     3    42 Puerto Rico           <NA>
## 43 -65.97080 17.97437     3    43 Puerto Rico           <NA>
## 44 -66.13550 17.94946     3    44 Puerto Rico           <NA>
## 45 -66.24502 17.94727     3    45 Puerto Rico           <NA>
## 46 -66.28589 17.94995     3    46 Puerto Rico           <NA>
## 47 -66.32578 17.96416     3    47 Puerto Rico           <NA>
## 48 -66.40855 17.95059     3    48 Puerto Rico           <NA>
## 49 -66.51079 17.98701     3    49 Puerto Rico           <NA>
## 50 -66.59843 17.97788     3    50 Puerto Rico           <NA>
## 51 -66.77242 17.98657     3    51 Puerto Rico           <NA>
## 52 -66.83759 17.95508     3    52 Puerto Rico           <NA>
## 53 -66.90000 17.94790     3    53 Puerto Rico           <NA>
## 54 -66.96123 17.95376     3    54 Puerto Rico           <NA>
## 55 -67.01333 17.96787     3    55 Puerto Rico           <NA>
## 56 -67.14239 17.96670     3    56 Puerto Rico           <NA>
## 57 -67.19688 17.99419     3    57 Puerto Rico           <NA>
## 58 -67.17432 18.15254     3    58 Puerto Rico           <NA>
## 59 -67.17245 18.22422     3    59 Puerto Rico           <NA>
## 60 -67.20415 18.28340     3    60 Puerto Rico           <NA>
## 61 -67.23896 18.32065     3    61 Puerto Rico           <NA>
## 62 -67.26407 18.36460     3    62 Puerto Rico           <NA>
## 63 -67.21338 18.39360     3    63 Puerto Rico           <NA>
## 64 -67.17178 18.43579     3    64 Puerto Rico           <NA>
## 65 -67.15864 18.49922     3    65 Puerto Rico           <NA>
## 66 -67.11304 18.51480     3    66 Puerto Rico           <NA>
## 67 -67.05962 18.52217     3    67 Puerto Rico           <NA>
## 68 -66.81289 18.49253     3    68 Puerto Rico           <NA>
## 69 -66.18858 18.47578     3    69 Puerto Rico           <NA>
## 70 -66.15308 18.47065     3    70 Puerto Rico           <NA>
## 71 -66.12939 18.44492     3    71 Puerto Rico           <NA>

Use geom_map() para agregar la figura del territorio

ggplot() +
  geom_map(aes(long, lat, map_id = region), fill = "gray",  map = pr, data = pr) 


Agrega la capa con los datos de crimen

ggplot() +
  geom_map(aes(long, lat, map_id = region), fill = "gray",  map = pr, data = pr) +
  geom_point(aes(longitud, latitud), data = crm)


theme_void() remueve la información alrededor del mapa

ggplot() +
  geom_map(aes(long, lat, map_id = region), fill = "gray",  map = pr, data = pr) +
  geom_point(aes(longitud, latitud), color = "blue", size = 0.1, data = crm) +
  theme_void() 


Los colores de los puntos se pueden

ggplot() +
  geom_map(aes(long, lat, map_id = region), fill = "gray",  map = pr, data = pr) +
  geom_point(aes(longitud, latitud, color = area_policiaca), size = 0.5, data = crm) +
  theme_void() +
  theme(legend.position = "bottom")


facet_wrap() permite crear una “mini” gráfica por cada segmento de los datos. En este caso, area_policiaca

ggplot() +
  geom_map(aes(long, lat, map_id = region), fill = "gray",  map = pr, data = pr) +
  geom_point(aes(longitud, latitud, color = area_policiaca), size = 0.2, data = crm) +
  theme_void() +
  facet_wrap(~delitos_code)


Ajustes se pueden hacer a los colores para obtener una mejor vista de la información.

ggplot() +
  geom_map(aes(long, lat, map_id = region), fill = "black",  map = pr, data = pr) +
  geom_point(aes(longitud, latitud), alpha = 0.2, size = 0.1, color = "#ffff00", data = crm) +
  theme_void() +
  theme(panel.background = element_rect(fill = "#333333")) +
  facet_wrap(~delitos_code)


leaflet

Leaflet (https://leafletjs.com/) es una librería de JavaScript que se utiliza para hacer mapas interactivos. Es la más usada hoy en día. El paquete de R llamado leaflet permite la integración con esta librería.

En lugar de usar +, leaflet utiliza el pipe (%>%) para crear las visualizaciones. Se necesita addTiles() para agregar el mapa, y después algún tipo de puntos geográficos.

Añadir “marcadores”

library(leaflet)
library(lubridate)
crm$fecha2=mdy(crm$fecha) # convierte la columna de fecha de "character" as "mdy" con el paquete lubridate

crm %>%
  filter(month(fecha2) == 8) %>%
  leaflet() %>%
  addTiles() %>%
  addMarkers(~longitud, ~latitud)

Añadir información en los marcadores “pop-ups”

Ya que son interactivos, se pueden agregar nombres que salen cuando se hace un click al punto

crm %>%
  filter(month(fecha2) == 8) %>%
  leaflet() %>%
  addTiles() %>%
  addMarkers(~longitud, ~latitud, popup = ~delitos_code)

Añadir información especificos en los “pop-ups”

crm %>%
  filter(month(fecha2) == 8) %>%
  leaflet() %>%
  addTiles() %>%
  addMarkers(~longitud, ~latitud, popup = ~paste0("Delito: ",delitos_code))

Incluir “clusters” de información: suma de la cantidad de eventos

markerClusterOptions() agrupa los puntos automaticamente para que la interactividad sea más fácil

crm %>%
  leaflet() %>%
  addTiles() %>%
  addMarkers(~longitud, ~latitud,  popup = ~paste0("Delito: ",delitos_code), 
             clusterOptions = markerClusterOptions())

Mapa de clusters de los vehiculos hurtados

crm %>%
  filter(delitos_code == "Vehiculo Hurtado") %>%
  leaflet() %>%
  addTiles() %>%
  addMarkers(~longitud, ~latitud,  popup = ~paste0("Delito: ",delitos_code), 
             clusterOptions = markerClusterOptions())

Añadiendo “awesomeIcons” and los marcadores

<https://fontawesome.com/icons>

crm %>%
  filter(delitos_code == "Vehiculo Hurtado") %>%
  leaflet() %>%
  addTiles() %>%
  addAwesomeMarkers(~longitud, ~latitud,  popup = ~paste0("Delito: ",delitos_code), 
                    clusterOptions = markerClusterOptions(), 
                    icon = awesomeIcons(icon = "fa-thin fa-truck", library = "fa"))


Distribución de pingüinos y ballenas

Los datos provienen del siguiente enlace <https://www.bco-dmo.org/dataset/3421>

Información del website

“Visual surveys for cetaceans and penguins were conducted during daylight hours on all days when weather conditions allowed on the Antarctic Peninsula, in the austral autumns and winters of 2000-2002.

Objectives:

    1. to characterize foraging behavior and movements of individual baleen whales in relation to prey characteristics and physical environment,
    1. to relate distribution, abundance and biomass of baleen whales species to same for krill in a large area in a single season, and
    1. to monitor interannual variability in whale distribution and abundance in relation to physical environment and prey characteristics.”
taxon cruise_id year sight_num date_gmt month_gmt day_gmt time_gmt yrday_gmt lat lon observer species bearing distance_nm count reticle method_sighting on_ice_YN cue group_max group_min ice_cover
cetacean LMG0103 2001 1 3/23/01 03 23 13:48:02 81.57502 -63.2027 -61.6812 MM nd 0 1.5 nd 0 1 nd 1 nd nd 0
cetacean LMG0103 2001 2 3/23/01 03 23 13:48:02 81.57502 -63.2027 -61.6812 MM unidentified_large_whale 0 1.5 2 0 1 nd 1 2 2 0
cetacean LMG0103 2001 3 3/23/01 03 23 13:48:02 81.57502 -63.2027 -61.6812 MM unidentified_large_whale 0 1.5 2 0 1 nd 1 2 2 0
cetacean LMG0103 2001 4 3/23/01 03 23 14:35:16 81.60783 -63.3243 -61.5970 DT nd 80 2.3 nd 0 1 nd 1 nd nd 0
cetacean LMG0103 2001 5 3/23/01 03 23 14:35:16 81.60783 -63.3243 -61.5970 DT nd 80 2.3 0 0 1 nd 1 0 0 0
cetacean LMG0103 2001 6 3/23/01 03 23 14:44:38 81.61433 -63.3488 -61.5827 SM nd 150 2.0 nd 0 1 nd 1 nd nd 0

CONTESTA la siguientes preguntas

  • Cuantos avistamiento de ballenas esta el data file
  • Cuantos avistamiento de pingüinos esta en el data file
  • Convierte la “date_gmt” en fecha antes de seguir los próximos pasos

    1. Haz un mapa básico de todos los avistamiento

    1. Buscar una manera de colorear los puntos de color diferentes por el tipo de avistamiento (ballenas y pinguinos).

    1. Ahora rehacer su gráfico usando “Awesome markers”
  • Añadele clusters
  • Añade un popup, identificando si es ballena o pingüino
  • Añade awesomeIcons con un icon a su gusto.

    1. HAGA dos mapas uno para cada año de muestreo
unique(WP$year)
## [1] 2001 2002

BONO: CAMBIAR los colores de los marcadores (los markers) un tipo diferente para ballena y otro para pingüinos.

Por ejemplo aqui: https://github.com/lennardv2/Leaflet.awesome-markers