1. This first code just gathers the mass shooting information from the link and shortens it to ‘shootings’.
shootings <- read_csv("https://docs.google.com/spreadsheets/d/1b9o6uDO18sLxBqPwl_Gh9bnhW-ev_dABH83M5Vb5L8o/export?format=csv", na = "-")

This next code chunk creates a map of the shootings. In order to center the map on the continental U.S., I converted the coordinates from 39°48′38″N 98°33′22″W to 39.9 and -98.6. It also adds circle markers and changes their size based on total victims.

shootings %>% 
  leaflet() %>% 
  setView(lng = -98.6, lat = 39.9, zoom = 3.4) %>%
  addTiles() %>%
  addCircleMarkers(radius = ~log(total_victims))
Assuming "longitude" and "latitude" are longitude and latitude, respectively
  1. This code finds the median total victims of the shootings.
shootings %>% 
  drop_na(total_victims) %>% 
  summarize(median_total_victims = median(total_victims))

This code finds the median fatalities for the shootings.

shootings %>% 
  drop_na(fatalities) %>% 
  summarize(median_fatalities = median(fatalities))

This code creates a histogram of the number of shootings per year.

shootings %>% 
  drop_na(year) %>%
  plot_ly(x = ~year) %>% 
  layout(title = "Number of Shootings per Year", xaxis = list(title = "Year"), yaxis = list(title = "Number of Shootings")) %>%
  add_histogram(nbinsx = 40)

This code creates a heatmap of the gender and race of the shooters.

shootings %>% 
  drop_na(race) %>% 
  mutate(race = as_factor(race)) %>% 
  mutate(race = fct_collapse(race, White = c("White", "white"), Black = c("Black", "black"), Other = c("unclear", "Other"))) %>% 
  mutate(gender = fct_collapse(gender, Female = c("Female", "F", "Male & Female"), Male = "Male", "M", "Male & Female")) %>%
  plot_ly(x = ~gender, y = ~race) %>%
  add_histogram2dcontour()

This code creates a heatmap of the gender and age of the shooters.

shootings %>% 
  drop_na(gender) %>% 
  mutate(gender = as_factor(gender)) %>% 
  mutate(gender = fct_collapse(gender, Female = c("Female", "F", "Male & Female"), Male = "Male", "M", "Male & Female")) %>%
  plot_ly(x = ~gender, y = ~age_of_shooter) %>%
  add_histogram2dcontour()

This code creates a scatter plot of the number of injuries by fatalities in each mass shooting.

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

injured_per_incident_model <- lm(injured_per_incident ~ fatalities, data = injured_data)

injuries_data %>% 
  plot_ly(x = ~fatalities, y = ~injured_per_incident,  hoverinfo = "text", text = ~paste("Injured per shooting: ", injured_per_incident, "<br>", "Fatalities: ", fatalities)) %>% 
  add_markers(showlegend = F) %>%
  layout(title = "Number of Injuries per Fatalities", xaxis = list(title = "Injuries"), yaxis = list(title = "Fatalitites")) %>%
  add_lines(y = ~fitted(injured_per_incident_model))

NA
  1. This code finds the number of shootings per year and displays the data in a table.
num_per_year <- shootings %>% 
  filter(fatalities > 3) %>% 
  count(year)

num_per_year

This code creates a linear regression model for the data.

shootings_per_year_model <- lm(n ~ year, data = num_per_year) 
tidy(shootings_per_year_model)
glance(shootings_per_year_model)

This code takes the shootings per year data and displays it in a scatterplot.

num_per_year %>% 
  plot_ly(x = ~year, 
          y = ~n, hoverinfo = "text", text = ~paste("Number per Year: ", num_per_year, "<br>", "Year: ", year)) %>% 
  add_markers(showlegend = F) %>%
  layout(title = "Number of Shootings per Year",
   xaxis = list(title = "Year"),
   yaxis = list(title = "Number of Shootings")) %>%
  add_lines(y = ~fitted(shootings_per_year_model))
LS0tDQp0aXRsZTogIlNob290aW5nIE1hcHMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoxLiBUaGlzIGZpcnN0IGNvZGUganVzdCBnYXRoZXJzIHRoZSBtYXNzIHNob290aW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIGxpbmsgYW5kIHNob3J0ZW5zIGl0IHRvICdzaG9vdGluZ3MnLiANCg0KYGBge3J9DQpzaG9vdGluZ3MgPC0gcmVhZF9jc3YoImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFiOW82dURPMThzTHhCcVB3bF9HaDlibmhXLWV2X2RBQkg4M001VmI1TDhvL2V4cG9ydD9mb3JtYXQ9Y3N2IiwgbmEgPSAiLSIpDQpgYGANCg0KVGhpcyBuZXh0IGNvZGUgY2h1bmsgY3JlYXRlcyBhIG1hcCBvZiB0aGUgc2hvb3RpbmdzLiBJbiBvcmRlciB0byBjZW50ZXIgdGhlIG1hcCBvbiB0aGUgY29udGluZW50YWwgVS5TLiwgSSBjb252ZXJ0ZWQgdGhlIGNvb3JkaW5hdGVzIGZyb20gMznCsDQ44oCyMzjigLNOIDk4wrAzM+KAsjIy4oCzVyB0byAzOS45IGFuZCAtOTguNi4gSXQgYWxzbyBhZGRzIGNpcmNsZSBtYXJrZXJzIGFuZCBjaGFuZ2VzIHRoZWlyIHNpemUgYmFzZWQgb24gdG90YWwgdmljdGltcy4gDQoNCmBgYHtyfQ0Kc2hvb3RpbmdzICU+JSANCiAgbGVhZmxldCgpICU+JSANCiAgc2V0VmlldyhsbmcgPSAtOTguNiwgbGF0ID0gMzkuOSwgem9vbSA9IDMuNCkgJT4lDQogIGFkZFRpbGVzKCkgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMocmFkaXVzID0gfmxvZyh0b3RhbF92aWN0aW1zKSkNCmBgYA0KDQoyLiBUaGlzIGNvZGUgZmluZHMgdGhlIG1lZGlhbiB0b3RhbCB2aWN0aW1zIG9mIHRoZSBzaG9vdGluZ3MuIA0KDQpgYGB7cn0NCnNob290aW5ncyAlPiUgDQogIGRyb3BfbmEodG90YWxfdmljdGltcykgJT4lIA0KICBzdW1tYXJpemUobWVkaWFuX3RvdGFsX3ZpY3RpbXMgPSBtZWRpYW4odG90YWxfdmljdGltcykpDQpgYGANCg0KVGhpcyBjb2RlIGZpbmRzIHRoZSBtZWRpYW4gZmF0YWxpdGllcyBmb3IgdGhlIHNob290aW5ncy4gDQoNCmBgYHtyfQ0Kc2hvb3RpbmdzICU+JSANCiAgZHJvcF9uYShmYXRhbGl0aWVzKSAlPiUgDQogIHN1bW1hcml6ZShtZWRpYW5fZmF0YWxpdGllcyA9IG1lZGlhbihmYXRhbGl0aWVzKSkNCmBgYA0KDQpUaGlzIGNvZGUgY3JlYXRlcyBhIGhpc3RvZ3JhbSBvZiB0aGUgbnVtYmVyIG9mIHNob290aW5ncyBwZXIgeWVhci4gDQoNCmBgYHtyfQ0Kc2hvb3RpbmdzICU+JSANCiAgZHJvcF9uYSh5ZWFyKSAlPiUNCiAgcGxvdF9seSh4ID0gfnllYXIpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gIk51bWJlciBvZiBTaG9vdGluZ3MgcGVyIFllYXIiLCB4YXhpcyA9IGxpc3QodGl0bGUgPSAiWWVhciIpLCB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTnVtYmVyIG9mIFNob290aW5ncyIpKSAlPiUNCiAgYWRkX2hpc3RvZ3JhbShuYmluc3ggPSA0MCkNCmBgYA0KDQpUaGlzIGNvZGUgY3JlYXRlcyBhIGhlYXRtYXAgb2YgdGhlIGdlbmRlciBhbmQgcmFjZSBvZiB0aGUgc2hvb3RlcnMuIA0KDQpgYGB7cn0NCnNob290aW5ncyAlPiUgDQogIGRyb3BfbmEocmFjZSkgJT4lIA0KICBtdXRhdGUocmFjZSA9IGFzX2ZhY3RvcihyYWNlKSkgJT4lIA0KICBtdXRhdGUocmFjZSA9IGZjdF9jb2xsYXBzZShyYWNlLCBXaGl0ZSA9IGMoIldoaXRlIiwgIndoaXRlIiksIEJsYWNrID0gYygiQmxhY2siLCAiYmxhY2siKSwgT3RoZXIgPSBjKCJ1bmNsZWFyIiwgIk90aGVyIikpKSAlPiUgDQogIG11dGF0ZShnZW5kZXIgPSBmY3RfY29sbGFwc2UoZ2VuZGVyLCBGZW1hbGUgPSBjKCJGZW1hbGUiLCAiRiIsICJNYWxlICYgRmVtYWxlIiksIE1hbGUgPSAiTWFsZSIsICJNIiwgIk1hbGUgJiBGZW1hbGUiKSkgJT4lDQogIHBsb3RfbHkoeCA9IH5nZW5kZXIsIHkgPSB+cmFjZSkgJT4lDQogIGFkZF9oaXN0b2dyYW0yZGNvbnRvdXIoKQ0KYGBgDQoNClRoaXMgY29kZSBjcmVhdGVzIGEgaGVhdG1hcCBvZiB0aGUgZ2VuZGVyIGFuZCBhZ2Ugb2YgdGhlIHNob290ZXJzLiANCg0KYGBge3J9DQpzaG9vdGluZ3MgJT4lIA0KICBkcm9wX25hKGdlbmRlcikgJT4lIA0KICBtdXRhdGUoZ2VuZGVyID0gYXNfZmFjdG9yKGdlbmRlcikpICU+JSANCiAgbXV0YXRlKGdlbmRlciA9IGZjdF9jb2xsYXBzZShnZW5kZXIsIEZlbWFsZSA9IGMoIkZlbWFsZSIsICJGIiwgIk1hbGUgJiBGZW1hbGUiKSwgTWFsZSA9ICJNYWxlIiwgIk0iLCAiTWFsZSAmIEZlbWFsZSIpKSAlPiUNCiAgcGxvdF9seSh4ID0gfmdlbmRlciwgeSA9IH5hZ2Vfb2Zfc2hvb3RlcikgJT4lDQogIGFkZF9oaXN0b2dyYW0yZGNvbnRvdXIoKQ0KYGBgDQoNClRoaXMgY29kZSBjcmVhdGVzIGEgc2NhdHRlciBwbG90IG9mIHRoZSBudW1iZXIgb2YgaW5qdXJpZXMgYnkgZmF0YWxpdGllcyBpbiBlYWNoIG1hc3Mgc2hvb3RpbmcuIA0KDQpgYGB7cn0NCmluanVyZWRfZGF0YSA8LSBzaG9vdGluZ3MgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgZmlsdGVyKGZhdGFsaXRpZXMgPiAzKSAlPiUgDQogIGdyb3VwX2J5KGZhdGFsaXRpZXMpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIHN1bW1hcml6ZShjb3VudCA9IG4oKSwgaW5qdXJlZCA9IHN1bShpbmp1cmVkKSkgJT4lICAgICAgICAgICAgIA0KICBtdXRhdGUoaW5qdXJlZF9wZXJfaW5jaWRlbnQgPSBpbmp1cmVkL2NvdW50KSAgICAgICAgICAgICAgICAgICANCg0KaW5qdXJlZF9wZXJfaW5jaWRlbnRfbW9kZWwgPC0gbG0oaW5qdXJlZF9wZXJfaW5jaWRlbnQgfiBmYXRhbGl0aWVzLCBkYXRhID0gaW5qdXJlZF9kYXRhKQ0KDQppbmp1cmllZF9kYXRhICU+JSANCiAgcGxvdF9seSh4ID0gfmZhdGFsaXRpZXMsIHkgPSB+aW5qdXJlZF9wZXJfaW5jaWRlbnQsICBob3ZlcmluZm8gPSAidGV4dCIsIHRleHQgPSB+cGFzdGUoIkluanVyZWQgcGVyIHNob290aW5nOiAiLCBpbmp1cmVkX3Blcl9pbmNpZGVudCwgIjxicj4iLCAiRmF0YWxpdGllczogIiwgZmF0YWxpdGllcykpICU+JSANCiAgYWRkX21hcmtlcnMoc2hvd2xlZ2VuZCA9IEYpICU+JQ0KICBsYXlvdXQodGl0bGUgPSAiTnVtYmVyIG9mIEluanVyaWVzIHBlciBGYXRhbGl0aWVzIiwgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkluanVyaWVzIiksIHlheGlzID0gbGlzdCh0aXRsZSA9ICJGYXRhbGl0aXRlcyIpKSAlPiUNCiAgYWRkX2xpbmVzKHkgPSB+Zml0dGVkKGluanVyZWRfcGVyX2luY2lkZW50X21vZGVsKSkNCmBgYA0KDQoNCjMuIFRoaXMgY29kZSBmaW5kcyB0aGUgbnVtYmVyIG9mIHNob290aW5ncyBwZXIgeWVhciBhbmQgZGlzcGxheXMgdGhlIGRhdGEgaW4gYSB0YWJsZS4gDQoNCmBgYHtyfQ0KbnVtX3Blcl95ZWFyIDwtIHNob290aW5ncyAlPiUgDQogIGZpbHRlcihmYXRhbGl0aWVzID4gMykgJT4lIA0KICBjb3VudCh5ZWFyKQ0KDQpudW1fcGVyX3llYXINCmBgYA0KDQpUaGlzIGNvZGUgY3JlYXRlcyBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIGZvciB0aGUgZGF0YS4gDQoNCmBgYHtyfQ0Kc2hvb3RpbmdzX3Blcl95ZWFyX21vZGVsIDwtIGxtKG4gfiB5ZWFyLCBkYXRhID0gbnVtX3Blcl95ZWFyKSANCnRpZHkoc2hvb3RpbmdzX3Blcl95ZWFyX21vZGVsKQ0KZ2xhbmNlKHNob290aW5nc19wZXJfeWVhcl9tb2RlbCkNCmBgYA0KDQpUaGlzIGNvZGUgdGFrZXMgdGhlIHNob290aW5ncyBwZXIgeWVhciBkYXRhIGFuZCBkaXNwbGF5cyBpdCBpbiBhIHNjYXR0ZXJwbG90LiANCg0KYGBge3J9DQpudW1fcGVyX3llYXIgJT4lIA0KICBwbG90X2x5KHggPSB+eWVhciwgDQogICAgICAgICAgeSA9IH5uLCBob3ZlcmluZm8gPSAidGV4dCIsIHRleHQgPSB+cGFzdGUoIk51bWJlciBwZXIgWWVhcjogIiwgbnVtX3Blcl95ZWFyLCAiPGJyPiIsICJZZWFyOiAiLCB5ZWFyKSkgJT4lIA0KICBhZGRfbWFya2VycyhzaG93bGVnZW5kID0gRikgJT4lDQogIGxheW91dCh0aXRsZSA9ICJOdW1iZXIgb2YgU2hvb3RpbmdzIHBlciBZZWFyIiwNCiAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJZZWFyIiksDQogICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTnVtYmVyIG9mIFNob290aW5ncyIpKSAlPiUNCiAgYWRkX2xpbmVzKHkgPSB+Zml0dGVkKHNob290aW5nc19wZXJfeWVhcl9tb2RlbCkpDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K