- 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
- 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
- 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