Intodruction

Crime data for the city of Chicago which are available from 2001 onwards on the city’s open data portal at: https://data.cityofchicago.org/. we are going use past one year of data from the current date to create a map showing the location where a crime had occurred.

library(leaflet)
## Warning: package 'leaflet' was built under R version 4.0.2
library(tidyverse)
## -- Attaching packages ------------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.1     v purrr   0.3.4
## v tibble  3.0.1     v dplyr   1.0.0
## v tidyr   1.1.0     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.5.0
## -- Conflicts ---------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
# Specify download url
url.data <-
  "https://data.cityofchicago.org/api/views/x2n5-8w5q/rows.csv?accessType=DOWNLOAD"

# Read in data
crime_raw <- read_csv(url.data, na = '')
## Parsed with column specification:
## cols(
##   `CASE#` = col_character(),
##   `DATE  OF OCCURRENCE` = col_character(),
##   BLOCK = col_character(),
##   IUCR = col_character(),
##   `PRIMARY DESCRIPTION` = col_character(),
##   `SECONDARY DESCRIPTION` = col_character(),
##   `LOCATION DESCRIPTION` = col_character(),
##   ARREST = col_character(),
##   DOMESTIC = col_character(),
##   BEAT = col_double(),
##   WARD = col_double(),
##   `FBI CD` = col_character(),
##   `X COORDINATE` = col_double(),
##   `Y COORDINATE` = col_double(),
##   LATITUDE = col_double(),
##   LONGITUDE = col_double(),
##   LOCATION = col_character()
## )
# Reorganize data by selection specific columns

crime_raw <-
  select(
    crime_raw,
    "BLOCK",
    "PRIMARY DESCRIPTION",
    "SECONDARY DESCRIPTION",
    "LOCATION DESCRIPTION",
    "LATITUDE",
    "LONGITUDE"
  )
crime_raw <- na.omit(crime_raw)

# Print table
crime_raw
## # A tibble: 231,759 x 6
##    BLOCK   `PRIMARY DESCRI~ `SECONDARY DESC~ `LOCATION DESCR~ LATITUDE LONGITUDE
##    <chr>   <chr>            <chr>            <chr>               <dbl>     <dbl>
##  1 029XX ~ CRIMINAL DAMAGE  TO VEHICLE       STREET               41.8     -87.7
##  2 064XX ~ CRIMINAL TRESPA~ TO LAND          APARTMENT            41.8     -87.6
##  3 048XX ~ CRIMINAL DAMAGE  CRIMINAL DEFACE~ RESIDENCE            42.0     -87.7
##  4 006XX ~ CRIMINAL DAMAGE  TO VEHICLE       STREET               41.8     -87.6
##  5 089XX ~ BATTERY          DOMESTIC BATTER~ STREET               41.7     -87.6
##  6 102XX ~ THEFT            $500 AND UNDER   APARTMENT            41.7     -87.6
##  7 106XX ~ ROBBERY          STRONG ARM - NO~ RESIDENCE            41.7     -87.6
##  8 024XX ~ MOTOR VEHICLE T~ AUTOMOBILE       STREET               41.8     -87.6
##  9 096XX ~ BATTERY          DOMESTIC BATTER~ RESIDENCE            41.7     -87.6
## 10 019XX ~ THEFT            FROM BUILDING    RESIDENCE - POR~     41.9     -87.7
## # ... with 231,749 more rows

Mapping

Plots of clusters of markers with addMarkers(clusterOptions = markerClusterOptions()) are used. You can zoom in to each cluster, the clusters will separate until you can see the individual markers. The Crime Type is added as a popup for each marker. Click on any blue marker to determine what crime was committed.

crime_raw %>%
  leaflet() %>%
  addTiles() %>%
  
  #adds icon to view the world map
  addEasyButton(easyButton(
    icon = "fa-globe",
    title = "Zoom to Level 1",
    onClick = JS("function(btn, map){ map.setZoom(1); }")
  )) %>%
  
  #add location markers
  addMarkers(
    ~ LONGITUDE,
    ~ LATITUDE,
    popup = crime_raw$`PRIMARY DESCRIPTION` ,
    clusterOptions = markerClusterOptions()
  ) %>%
  
  #adds a minimap to navigate through the map
  addProviderTiles(providers$Esri.WorldStreetMap) %>%
  addMiniMap(tiles = providers$Esri.WorldStreetMap,
             toggleDisplay = TRUE)