Assignment: Shootings.

For your notebook, do some further analyses on the shootings data.

  1. Create a map of the shootings. There are columns called latitude and longitude in the data that can generate dots on a map of where the shootings took place.

A. Because there was a shooting in Hawaii, the map is spread out a lot by default. Center on the continental US by looking up the center of the continental US, translating it to computer, finding a good zoom level, and using setView(lng = x, lat = y, zoom = z).

B. Change the size of the dots so that the more victims, the larger the dot on the map. You can do this by setting radius = ~fatalities or radius = ~total_victims inside of addCircleMarkers(). If the dots are too big, you can do something like radius = ~total_victims/10, or radius = ~log(total_victims). I like that last one because larger numbers are reduced more than smaller ones.

  1. Report some additional statistics, including:
    A. Median number of total_victims and median number of fatalities.
    B. A histogram of the number of shootings per year. You will want to set nbinsx = 40 inside add_histogram(), because that is the approx. number of years covered by the data.
    C. Heatmaps with add_histogram2dcontour() of the gender and race of the shooter, and the gender and age of the shooter. You’ll notice some problems with the data that you’ll need to fix with fct_collapse().
    D. A scatterplot with plotly of the number injured by the number of fatalities in the shooting.

  2. Conduct a regression analysis testing the hypothesis that the number of shootings has increased over the years.

To create the regression model, y = the number of shootings and x = year, you need to set up the data like this:

num_per_year <- shootings %>% 
  filter(fatalities > 3) %>% 
  count(year) %>% 
  filter(year < 2019)

num_per_year
shootings %>%
  leaflet() %>%
  addTiles() %>%
  addCircleMarkers
Assuming "longitude" and "latitude" are longitude and latitude, respectively

39.828175, -98.5795

shootings %>%
  leaflet() %>%
  addTiles() %>%
  addCircleMarkers %>%
setView(lat = 39.828175, lng = -98.5795, zoom = 3) %>%
  addMarkers(lat = 39.828175, lng = -98.5795)
Assuming "longitude" and "latitude" are longitude and latitude, respectively
shootings %>% 
  leaflet() %>% 
  addTiles() %>%
addCircleMarkers(radius = ~fatalities)
Assuming "longitude" and "latitude" are longitude and latitude, respectively
shootings %>% 
  leaflet() %>% 
  addTiles() %>%
addCircleMarkers(radius = ~log(total_victims))
Assuming "longitude" and "latitude" are longitude and latitude, respectively
shootings %>% 
  summarize(median_total_victims = median(total_victims))
shootings %>% 
  summarize(median_fatalities = median(fatalities))

A histogram of the number of shootings per year. You will want to set nbinsx = 40 inside add_histogram(), because that is the approx. number of years covered by the data.

shootings %>% 
  plot_ly(x = ~shootings) %>% 
  add_histogram(nbinsx = 40)

Heatmaps with add_histogram2dcontour() of the gender and race of the shooter, and the gender and age of the shooter. You’ll notice some problems with the data that you’ll need to fix with fct_collapse()

shootings %>% 
  plot_ly(x = ~age_of_shooter, y = ~gender) %>% 
  add_histogram2dcontour()

NA
shootings %>% 
  plot_ly(x = ~age_of_shooter, y = ~race) %>% 
  add_histogram2dcontour()

D. A scatterplot with plotly of the number injured by the number of fatalities in the shooting.


fatalities_data <- shootings %>%                                       # start with the shootings data
  group_by(injured) %>%                                                   # we're going to count by year
  summarize(count = n(), fatalities = sum(fatalities)) %>%             # get the total number of fatalities per year
  mutate(fatalities_per_incident = fatalities/count)                   # divide by the number of shooting incidents

fatalities_data
fatalities_data <- shootings %>% 
  filter(fatalities > 3) %>%
  group_by(injured) %>% 
  summarize(count = n(), fatalities = sum(fatalities)) %>%
   mutate(fatalities_per_incident = fatalities/count)

fatalities_data
fatalities_per_incident_model <- lm(fatalities_per_incident ~ injured, data = fatalities_data)
fatalities_per_incident_model

Call:
lm(formula = fatalities_per_incident ~ injured, data = fatalities_data)

Coefficients:
(Intercept)      injured  
    9.64036      0.09381  
fatalities_data %>% 
  plot_ly(x = ~injured, 
          y = ~fatalities_per_incident) %>% 
  add_markers() %>%
add_lines(y = ~fitted(fatalities_per_incident_model))

NA

Conduct a regression analysis testing the hypothesis that the number of shootings has increased over the years.

To create the regression model, y = the number of shootings and x = year, you need to set up the data like this:

num_per_year <- shootings %>% 
  filter(fatalities > 3) %>% 
  count(year) %>% 
  filter(year < 2019)

num_per_year
fatalities_data <- shootings %>%                                       # start with the shootings data
  group_by(year) %>%                                                   # we're going to count by year
  summarize(count = n(), fatalities = sum(fatalities)) %>%             # get the total number of fatalities per year
  mutate(fatalities_per_incident = fatalities/count)                   # divide by the number of shooting incidents

fatalities_data
fatalities_data %>% 
  plot_ly(x = ~year, 
          y = ~num_per_year, hoverinfo = "text", text = ~paste("Fatalities per year: ", fatalities_per_incident, "<br>", "Year: ", year)) %>% 
  add_markers(showlegend = F) %>%
add_lines(y = ~fitted(num_per_year)) %>%
  layout(title = "Number of fatalities per  year",
   xaxis = list(title = "Year"),
   yaxis = list(title = "Number of fatalities per year"))
Unknown or uninitialised column: 'fitted'.Unknown or uninitialised column: 'na.action'.Error: All columns in a tibble must be 1d or 2d objects:
* Column `y` is NULL
LS0tCnRpdGxlOiAiUmllc2VuIFNob290aW5ncyBBc3NpZ25tZW50IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpBc3NpZ25tZW50OiBTaG9vdGluZ3MuCgpGb3IgeW91ciBub3RlYm9vaywgZG8gc29tZSBmdXJ0aGVyIGFuYWx5c2VzIG9uIHRoZSBzaG9vdGluZ3MgZGF0YS4KCjEuIENyZWF0ZSBhIG1hcCBvZiB0aGUgc2hvb3RpbmdzLgpUaGVyZSBhcmUgY29sdW1ucyBjYWxsZWQgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBpbiB0aGUgZGF0YSB0aGF0IGNhbiBnZW5lcmF0ZSBkb3RzIG9uIGEgbWFwIG9mIHdoZXJlIHRoZSBzaG9vdGluZ3MgdG9vayBwbGFjZS4KCkEuIEJlY2F1c2UgdGhlcmUgd2FzIGEgc2hvb3RpbmcgaW4gSGF3YWlpLCB0aGUgbWFwIGlzIHNwcmVhZCBvdXQgYSBsb3QgYnkgZGVmYXVsdC4gQ2VudGVyIG9uIHRoZSBjb250aW5lbnRhbCBVUyBieSBsb29raW5nIHVwIHRoZSBjZW50ZXIgb2YgdGhlIGNvbnRpbmVudGFsIFVTLCB0cmFuc2xhdGluZyBpdCB0byBjb21wdXRlciwgZmluZGluZyBhIGdvb2Qgem9vbSBsZXZlbCwgYW5kIHVzaW5nIHNldFZpZXcobG5nID0geCwgbGF0ID0geSwgem9vbSA9IHopLiAKCkIuIENoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgZG90cyBzbyB0aGF0IHRoZSBtb3JlIHZpY3RpbXMsIHRoZSBsYXJnZXIgdGhlIGRvdCBvbiB0aGUgbWFwLiBZb3UgY2FuIGRvIHRoaXMgYnkgc2V0dGluZyByYWRpdXMgPSB+ZmF0YWxpdGllcyBvciByYWRpdXMgPSB+dG90YWxfdmljdGltcyBpbnNpZGUgb2YgYWRkQ2lyY2xlTWFya2VycygpLiBJZiB0aGUgZG90cyBhcmUgdG9vIGJpZywgeW91IGNhbiBkbyBzb21ldGhpbmcgbGlrZSByYWRpdXMgPSB+dG90YWxfdmljdGltcy8xMCwgb3IgcmFkaXVzID0gfmxvZyh0b3RhbF92aWN0aW1zKS4gSSBsaWtlIHRoYXQgbGFzdCBvbmUgYmVjYXVzZSBsYXJnZXIgbnVtYmVycyBhcmUgcmVkdWNlZCBtb3JlIHRoYW4gc21hbGxlciBvbmVzLgoKCjIuIFJlcG9ydCBzb21lIGFkZGl0aW9uYWwgc3RhdGlzdGljcywgaW5jbHVkaW5nOiAgCkEuIE1lZGlhbiBudW1iZXIgb2YgdG90YWxfdmljdGltcyBhbmQgbWVkaWFuIG51bWJlciBvZiBmYXRhbGl0aWVzLiAgCkIuIEEgaGlzdG9ncmFtIG9mIHRoZSBudW1iZXIgb2Ygc2hvb3RpbmdzIHBlciB5ZWFyLiBZb3Ugd2lsbCB3YW50IHRvIHNldCBuYmluc3ggPSA0MCBpbnNpZGUgYWRkX2hpc3RvZ3JhbSgpLCBiZWNhdXNlIHRoYXQgaXMgdGhlIGFwcHJveC4gbnVtYmVyIG9mIHllYXJzIGNvdmVyZWQgYnkgdGhlIGRhdGEuICAKQy4gSGVhdG1hcHMgd2l0aCBhZGRfaGlzdG9ncmFtMmRjb250b3VyKCkgb2YgdGhlIGdlbmRlciBhbmQgcmFjZSBvZiB0aGUgc2hvb3RlciwgYW5kIHRoZSBnZW5kZXIgYW5kIGFnZSBvZiB0aGUgc2hvb3Rlci4gWW91J2xsIG5vdGljZSBzb21lIHByb2JsZW1zIHdpdGggdGhlIGRhdGEgdGhhdCB5b3UnbGwgbmVlZCB0byBmaXggd2l0aCBmY3RfY29sbGFwc2UoKS4gIApELiBBIHNjYXR0ZXJwbG90IHdpdGggcGxvdGx5IG9mIHRoZSBudW1iZXIgaW5qdXJlZCBieSB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgaW4gdGhlIHNob290aW5nLiAKCgozLiBDb25kdWN0IGEgcmVncmVzc2lvbiBhbmFseXNpcyB0ZXN0aW5nIHRoZSBoeXBvdGhlc2lzIHRoYXQgdGhlIG51bWJlciBvZiBzaG9vdGluZ3MgaGFzIGluY3JlYXNlZCBvdmVyIHRoZSB5ZWFycy4KClRvIGNyZWF0ZSB0aGUgcmVncmVzc2lvbiBtb2RlbCwgeSA9IHRoZSBudW1iZXIgb2Ygc2hvb3RpbmdzIGFuZCB4ID0geWVhciwgeW91IG5lZWQgdG8gc2V0IHVwIHRoZSBkYXRhIGxpa2UgdGhpczoKCmBgYHtyfQpudW1fcGVyX3llYXIgPC0gc2hvb3RpbmdzICU+JSAKICBmaWx0ZXIoZmF0YWxpdGllcyA+IDMpICU+JSAKICBjb3VudCh5ZWFyKSAlPiUgCiAgZmlsdGVyKHllYXIgPCAyMDE5KQoKbnVtX3Blcl95ZWFyCmBgYAoKCmBgYHtyfQpzaG9vdGluZ3MgJT4lCiAgbGVhZmxldCgpICU+JQogIGFkZFRpbGVzKCkgJT4lCiAgYWRkQ2lyY2xlTWFya2VycwpgYGAKCgozOS44MjgxNzUsIC05OC41Nzk1CgpgYGB7cn0Kc2hvb3RpbmdzICU+JQogIGxlYWZsZXQoKSAlPiUKICBhZGRUaWxlcygpICU+JQogIGFkZENpcmNsZU1hcmtlcnMgJT4lCnNldFZpZXcobGF0ID0gMzkuODI4MTc1LCBsbmcgPSAtOTguNTc5NSwgem9vbSA9IDMpICU+JQogIGFkZE1hcmtlcnMobGF0ID0gMzkuODI4MTc1LCBsbmcgPSAtOTguNTc5NSkKYGBgCgoKYGBge3J9CnNob290aW5ncyAlPiUgCiAgbGVhZmxldCgpICU+JSAKICBhZGRUaWxlcygpICU+JQphZGRDaXJjbGVNYXJrZXJzKHJhZGl1cyA9IH5mYXRhbGl0aWVzKQpgYGAKCgoKYGBge3J9CnNob290aW5ncyAlPiUgCiAgbGVhZmxldCgpICU+JSAKICBhZGRUaWxlcygpICU+JQphZGRDaXJjbGVNYXJrZXJzKHJhZGl1cyA9IH5sb2codG90YWxfdmljdGltcykpCmBgYAoKCmBgYHtyfQpzaG9vdGluZ3MgJT4lIAogIHN1bW1hcml6ZShtZWRpYW5fdG90YWxfdmljdGltcyA9IG1lZGlhbih0b3RhbF92aWN0aW1zKSkKYGBgCgpgYGB7cn0Kc2hvb3RpbmdzICU+JSAKICBzdW1tYXJpemUobWVkaWFuX2ZhdGFsaXRpZXMgPSBtZWRpYW4oZmF0YWxpdGllcykpCmBgYAoKQSBoaXN0b2dyYW0gb2YgdGhlIG51bWJlciBvZiBzaG9vdGluZ3MgcGVyIHllYXIuIFlvdSB3aWxsIHdhbnQgdG8gc2V0IG5iaW5zeCA9IDQwIGluc2lkZSBhZGRfaGlzdG9ncmFtKCksIGJlY2F1c2UgdGhhdCBpcyB0aGUgYXBwcm94LiBudW1iZXIgb2YgeWVhcnMgY292ZXJlZCBieSB0aGUgZGF0YS4KCgoKYGBge3J9CnNob290aW5ncyAlPiUgCiAgcGxvdF9seSh4ID0gfnNob290aW5ncykgJT4lIAogIGFkZF9oaXN0b2dyYW0obmJpbnN4ID0gNDApCmBgYAoKSGVhdG1hcHMgd2l0aCBhZGRfaGlzdG9ncmFtMmRjb250b3VyKCkgb2YgdGhlIGdlbmRlciBhbmQgcmFjZSBvZiB0aGUgc2hvb3RlciwgYW5kIHRoZSBnZW5kZXIgYW5kIGFnZSBvZiB0aGUgc2hvb3Rlci4gWW91J2xsIG5vdGljZSBzb21lIHByb2JsZW1zIHdpdGggdGhlIGRhdGEgdGhhdCB5b3UnbGwgbmVlZCB0byBmaXggd2l0aCBmY3RfY29sbGFwc2UoKQoKCmBgYHtyfQpzaG9vdGluZ3MgJT4lIAogIHBsb3RfbHkoeCA9IH5hZ2Vfb2Zfc2hvb3RlciwgeSA9IH5nZW5kZXIpICU+JSAKICBhZGRfaGlzdG9ncmFtMmRjb250b3VyKCkKCmBgYAoKCmBgYHtyfQpzaG9vdGluZ3MgJT4lIAogIHBsb3RfbHkoeCA9IH5hZ2Vfb2Zfc2hvb3RlciwgeSA9IH5yYWNlKSAlPiUgCiAgYWRkX2hpc3RvZ3JhbTJkY29udG91cigpCmBgYAoKCgpELiBBIHNjYXR0ZXJwbG90IHdpdGggcGxvdGx5IG9mIHRoZSBudW1iZXIgaW5qdXJlZCBieSB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgaW4gdGhlIHNob290aW5nLiAKCgpgYGB7cn0KCmZhdGFsaXRpZXNfZGF0YSA8LSBzaG9vdGluZ3MgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdGFydCB3aXRoIHRoZSBzaG9vdGluZ3MgZGF0YQogIGdyb3VwX2J5KGluanVyZWQpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2UncmUgZ29pbmcgdG8gY291bnQgYnkgeWVhcgogIHN1bW1hcml6ZShjb3VudCA9IG4oKSwgZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lICAgICAgICAgICAgICMgZ2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgZmF0YWxpdGllcyBwZXIgeWVhcgogIG11dGF0ZShmYXRhbGl0aWVzX3Blcl9pbmNpZGVudCA9IGZhdGFsaXRpZXMvY291bnQpICAgICAgICAgICAgICAgICAgICMgZGl2aWRlIGJ5IHRoZSBudW1iZXIgb2Ygc2hvb3RpbmcgaW5jaWRlbnRzCgpmYXRhbGl0aWVzX2RhdGEKYGBgCgoKYGBge3J9CmZhdGFsaXRpZXNfZGF0YSA8LSBzaG9vdGluZ3MgJT4lIAogIGZpbHRlcihmYXRhbGl0aWVzID4gMykgJT4lCiAgZ3JvdXBfYnkoaW5qdXJlZCkgJT4lIAogIHN1bW1hcml6ZShjb3VudCA9IG4oKSwgZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lCiAgIG11dGF0ZShmYXRhbGl0aWVzX3Blcl9pbmNpZGVudCA9IGZhdGFsaXRpZXMvY291bnQpCgpmYXRhbGl0aWVzX2RhdGEKYGBgCgoKYGBge3J9CmZhdGFsaXRpZXNfcGVyX2luY2lkZW50X21vZGVsIDwtIGxtKGZhdGFsaXRpZXNfcGVyX2luY2lkZW50IH4gaW5qdXJlZCwgZGF0YSA9IGZhdGFsaXRpZXNfZGF0YSkKCmBgYAoKYGBge3J9CmZhdGFsaXRpZXNfcGVyX2luY2lkZW50X21vZGVsCmBgYApgYGB7cn0KZmF0YWxpdGllc19kYXRhICU+JSAKICBwbG90X2x5KHggPSB+aW5qdXJlZCwgCiAgICAgICAgICB5ID0gfmZhdGFsaXRpZXNfcGVyX2luY2lkZW50KSAlPiUgCiAgYWRkX21hcmtlcnMoKSAlPiUKYWRkX2xpbmVzKHkgPSB+Zml0dGVkKGZhdGFsaXRpZXNfcGVyX2luY2lkZW50X21vZGVsKSkKCmBgYAoKCgoKCgoKCgoKCgpDb25kdWN0IGEgcmVncmVzc2lvbiBhbmFseXNpcyB0ZXN0aW5nIHRoZSBoeXBvdGhlc2lzIHRoYXQgdGhlIG51bWJlciBvZiBzaG9vdGluZ3MgaGFzIGluY3JlYXNlZCBvdmVyIHRoZSB5ZWFycy4KClRvIGNyZWF0ZSB0aGUgcmVncmVzc2lvbiBtb2RlbCwgeSA9IHRoZSBudW1iZXIgb2Ygc2hvb3RpbmdzIGFuZCB4ID0geWVhciwgeW91IG5lZWQgdG8gc2V0IHVwIHRoZSBkYXRhIGxpa2UgdGhpczoKCmBgYHtyfQpudW1fcGVyX3llYXIgPC0gc2hvb3RpbmdzICU+JSAKICBmaWx0ZXIoZmF0YWxpdGllcyA+IDMpICU+JSAKICBjb3VudCh5ZWFyKSAlPiUgCiAgZmlsdGVyKHllYXIgPCAyMDE5KQoKbnVtX3Blcl95ZWFyCmBgYAoKYGBge3J9CmZhdGFsaXRpZXNfZGF0YSA8LSBzaG9vdGluZ3MgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdGFydCB3aXRoIHRoZSBzaG9vdGluZ3MgZGF0YQogIGdyb3VwX2J5KHllYXIpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2UncmUgZ29pbmcgdG8gY291bnQgYnkgeWVhcgogIHN1bW1hcml6ZShjb3VudCA9IG4oKSwgZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lICAgICAgICAgICAgICMgZ2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgZmF0YWxpdGllcyBwZXIgeWVhcgogIG11dGF0ZShmYXRhbGl0aWVzX3Blcl9pbmNpZGVudCA9IGZhdGFsaXRpZXMvY291bnQpICAgICAgICAgICAgICAgICAgICMgZGl2aWRlIGJ5IHRoZSBudW1iZXIgb2Ygc2hvb3RpbmcgaW5jaWRlbnRzCgpmYXRhbGl0aWVzX2RhdGEKYGBgCgpgYGB7cn0KZmF0YWxpdGllc19kYXRhICU+JSAKICBwbG90X2x5KHggPSB+eWVhciwgCiAgICAgICAgICB5ID0gfm51bV9wZXJfeWVhciwgaG92ZXJpbmZvID0gInRleHQiLCB0ZXh0ID0gfnBhc3RlKCJGYXRhbGl0aWVzIHBlciB5ZWFyOiAiLCBmYXRhbGl0aWVzX3Blcl9pbmNpZGVudCwgIjxicj4iLCAiWWVhcjogIiwgeWVhcikpICU+JSAKICBhZGRfbWFya2VycyhzaG93bGVnZW5kID0gRikgJT4lCmFkZF9saW5lcyh5ID0gfmZpdHRlZChudW1fcGVyX3llYXIpKSAlPiUKICBsYXlvdXQodGl0bGUgPSAiTnVtYmVyIG9mIGZhdGFsaXRpZXMgcGVyIHllYXIiLAogICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiWWVhciIpLAogICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTnVtYmVyIG9mIGZhdGFsaXRpZXMgcGVyIHllYXIiKSkKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgo=