library(leaflet)
library(tidyverse)
library(lubridate)
library(broom)
library(plotly)
library(DT)
- 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.
shootings%>%
leaflet()%>%
addTiles()%>%
addCircleMarkers()
Assuming "longitude" and "latitude" are longitude and latitude, respectively
Here is a map of the shootings.
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).
shootings%>%
leaflet()%>%
addTiles()%>%
addCircleMarkers()%>%
setView(lng = -98.56, lat = 39.81, zoom = 4)
Assuming "longitude" and "latitude" are longitude and latitude, respectively
Here is a more zoomed in version of the shootings in the US using the coordinates of the center of the country.
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.
shootings%>%
leaflet()%>%
addTiles()%>%
addCircleMarkers(radius = ~total_victims/10)%>%
setView(lng = -98.56, lat = 39.81, zoom = 4)
Assuming "longitude" and "latitude" are longitude and latitude, respectively
Here is a map with smaller dots.
- Report some additional statistics, including:
A. Median number of total_victims and median number of fatalities.
shootings %>%
drop_na(total_victims) %>%
summarize(median_total_victims = median(total_victims))
Median number of total victims.
shootings %>%
drop_na(fatalities) %>%
summarize(fatalities = median(fatalities))
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.
shootings %>%
plot_ly(x = ~shootings, y = ~year) %>%
add_histogram(nbinsx = 40)
NA
This is a histogram of shootings per year.
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().
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("F", "Female"),
Male = c("M", "Male"),
))%>%
plot_ly(x= ~gender, y= ~race)%>%
add_histogram2dcontour()
Here is a heat map showing the gender and the race of the shooter.
shootings %>%
drop_na(gender) %>%
mutate(race = as_factor(gender)) %>%
mutate(gender = fct_collapse(gender,
Female= c("F", "Female"),
Male = c("M", "Male"),
))%>%
plot_ly(x= ~age_of_shooter, y= ~gender)%>%
add_histogram2dcontour()
This shows the age and the gender of the shooter.
D. A scatterplot with plotly of the number injured by the number of fatalities in the shooting.
shootings %>%
plot_ly(x = ~injured,
y = ~fatalities) %>%
add_markers()
NA
- Conduct a regression analysis testing the hypothesis that the number of shootings has increased over the years, including the graph.
num_per_year <- shootings %>%
filter(fatalities > 3) %>%
count(year)
num_per_year
shootings_per_year_model <- lm(n ~ year, data = num_per_year)
tidy(shootings_per_year_model)
glance(shootings_per_year_model)
num_per_year %>%
plot_ly(x = ~year,
y = ~n,
hoverinfo = "text",
text = ~paste("Fatalities per shooting: ",
round(n,1), "<br>", "Year: ", year)) %>%
add_markers(showlegend = F) %>%
add_lines(y = ~fitted(shootings_per_year_model))%>%
layout(title = "Number of shootings by year",
xaxis = list(title = "Year"),
yaxis = list(title = "Number of shootings"))
This is a regression analysis testing the hypothesis that the number of shootings has increased over the years.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkobGVhZmxldCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShEVCkKCmBgYAoKCjEuIENyZWF0ZSBhIG1hcCBvZiB0aGUgc2hvb3RpbmdzLgpUaGVyZSBhcmUgY29sdW1ucyBjYWxsZWQgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBpbiB0aGUgZGF0YSB0aGF0IGNhbiBnZW5lcmF0ZSBkb3RzIG9uIGEgbWFwIG9mIHdoZXJlIHRoZSBzaG9vdGluZ3MgdG9vayBwbGFjZS4KCmBgYHtyfQpzaG9vdGluZ3MlPiUKbGVhZmxldCgpJT4lCiAgYWRkVGlsZXMoKSU+JQogIGFkZENpcmNsZU1hcmtlcnMoKQpgYGAKCkhlcmUgaXMgYSBtYXAgb2YgdGhlIHNob290aW5ncy4gCgoKQS4gQmVjYXVzZSB0aGVyZSB3YXMgYSBzaG9vdGluZyBpbiBIYXdhaWksIHRoZSBtYXAgaXMgc3ByZWFkIG91dCBhIGxvdCBieSBkZWZhdWx0LiBDZW50ZXIgb24gdGhlIGNvbnRpbmVudGFsIFVTIGJ5IGxvb2tpbmcgdXAgdGhlIGNlbnRlciBvZiB0aGUgY29udGluZW50YWwgVVMsIHRyYW5zbGF0aW5nIGl0IHRvIGNvbXB1dGVyLCBmaW5kaW5nIGEgZ29vZCB6b29tIGxldmVsLCBhbmQgdXNpbmcgc2V0VmlldyhsbmcgPSB4LCBsYXQgPSB5LCB6b29tID0geikuICAKCmBgYHtyfQpzaG9vdGluZ3MlPiUKbGVhZmxldCgpJT4lCiAgYWRkVGlsZXMoKSU+JQogIGFkZENpcmNsZU1hcmtlcnMoKSU+JQogIHNldFZpZXcobG5nID0gLTk4LjU2LCBsYXQgPSAzOS44MSwgem9vbSA9IDQpCmBgYApIZXJlIGlzIGEgbW9yZSB6b29tZWQgaW4gdmVyc2lvbiBvZiB0aGUgc2hvb3RpbmdzIGluIHRoZSBVUyB1c2luZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNlbnRlciBvZiB0aGUgY291bnRyeS4KCgpCLiBDaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGRvdHMgc28gdGhhdCB0aGUgbW9yZSB2aWN0aW1zLCB0aGUgbGFyZ2VyIHRoZSBkb3Qgb24gdGhlIG1hcC4gWW91IGNhbiBkbyB0aGlzIGJ5IHNldHRpbmcgcmFkaXVzID0gfmZhdGFsaXRpZXMgb3IgcmFkaXVzID0gfnRvdGFsX3ZpY3RpbXMgaW5zaWRlIG9mIGFkZENpcmNsZU1hcmtlcnMoKS4gSWYgdGhlIGRvdHMgYXJlIHRvbyBiaWcsIHlvdSBjYW4gZG8gc29tZXRoaW5nIGxpa2UgcmFkaXVzID0gfnRvdGFsX3ZpY3RpbXMvMTAsIG9yIHJhZGl1cyA9IH5sb2codG90YWxfdmljdGltcykuIEkgbGlrZSB0aGF0IGxhc3Qgb25lIGJlY2F1c2UgbGFyZ2VyIG51bWJlcnMgYXJlIHJlZHVjZWQgbW9yZSB0aGFuIHNtYWxsZXIgb25lcy4KCmBgYHtyfQpzaG9vdGluZ3MlPiUKbGVhZmxldCgpJT4lCiAgYWRkVGlsZXMoKSU+JQogIGFkZENpcmNsZU1hcmtlcnMocmFkaXVzID0gfnRvdGFsX3ZpY3RpbXMvMTApJT4lCiAgc2V0VmlldyhsbmcgPSAtOTguNTYsIGxhdCA9IDM5LjgxLCB6b29tID0gNCkKYGBgCgpIZXJlIGlzIGEgbWFwIHdpdGggc21hbGxlciBkb3RzLiAKCgoKCjIuIFJlcG9ydCBzb21lIGFkZGl0aW9uYWwgc3RhdGlzdGljcywgaW5jbHVkaW5nOiAKCkEuIE1lZGlhbiBudW1iZXIgb2YgdG90YWxfdmljdGltcyBhbmQgbWVkaWFuIG51bWJlciBvZiBmYXRhbGl0aWVzLiAgCmBgYHtyfQpzaG9vdGluZ3MgJT4lIAogIGRyb3BfbmEodG90YWxfdmljdGltcykgJT4lIAogIHN1bW1hcml6ZShtZWRpYW5fdG90YWxfdmljdGltcyA9IG1lZGlhbih0b3RhbF92aWN0aW1zKSkKYGBgCk1lZGlhbiBudW1iZXIgb2YgdG90YWwgdmljdGltcy4gCgpgYGB7cn0Kc2hvb3RpbmdzICU+JSAKICBkcm9wX25hKGZhdGFsaXRpZXMpICU+JSAKICBzdW1tYXJpemUoZmF0YWxpdGllcyA9IG1lZGlhbihmYXRhbGl0aWVzKSkKYGBgCk1lZGlhbiBudW1iZXIgb2YgZmF0YWxpdGllcy4gCgoKQi4gQSBoaXN0b2dyYW0gb2YgdGhlIG51bWJlciBvZiBzaG9vdGluZ3MgcGVyIHllYXIuIFlvdSB3aWxsIHdhbnQgdG8gc2V0IG5iaW5zeCA9IDQwIGluc2lkZSBhZGRfaGlzdG9ncmFtKCksIGJlY2F1c2UgdGhhdCBpcyB0aGUgYXBwcm94LiBudW1iZXIgb2YgeWVhcnMgY292ZXJlZCBieSB0aGUgZGF0YS4gIAoKYGBge3J9CnNob290aW5ncyAlPiUgCiAgcGxvdF9seSh4ID0gfnNob290aW5ncywgeSA9IH55ZWFyKSAlPiUgCiAgYWRkX2hpc3RvZ3JhbShuYmluc3ggPSA0MCkKCmBgYApUaGlzIGlzIGEgaGlzdG9ncmFtIG9mIHNob290aW5ncyBwZXIgeWVhci4gCgpDLiBIZWF0bWFwcyB3aXRoIGFkZF9oaXN0b2dyYW0yZGNvbnRvdXIoKSBvZiB0aGUgZ2VuZGVyIGFuZCByYWNlIG9mIHRoZSBzaG9vdGVyLCBhbmQgdGhlIGdlbmRlciBhbmQgYWdlIG9mIHRoZSBzaG9vdGVyLiBZb3UnbGwgbm90aWNlIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgZGF0YSB0aGF0IHlvdSdsbCBuZWVkIHRvIGZpeCB3aXRoIGZjdF9jb2xsYXBzZSgpLiAgCgpgYGB7cn0Kc2hvb3RpbmdzICU+JSAKICBkcm9wX25hKHJhY2UpICU+JSAKICBtdXRhdGUocmFjZSA9IGFzX2ZhY3RvcihyYWNlKSkgJT4lIAogIG11dGF0ZShyYWNlID0gZmN0X2NvbGxhcHNlKHJhY2UsIFdoaXRlID0gYygiV2hpdGUiLCAid2hpdGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbGFjayA9IGMoIkJsYWNrIiwgImJsYWNrIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXI9IGMoInVuY2xlYXIiLCAiT3RoZXIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgbXV0YXRlKGdlbmRlciA9IGZjdF9jb2xsYXBzZShnZW5kZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVtYWxlPSBjKCJGIiwgIkZlbWFsZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbGUgPSBjKCJNIiwgIk1hbGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSU+JQogcGxvdF9seSh4PSB+Z2VuZGVyLCB5PSB+cmFjZSklPiUKICBhZGRfaGlzdG9ncmFtMmRjb250b3VyKCkKYGBgCgpIZXJlIGlzIGEgaGVhdCBtYXAgc2hvd2luZyB0aGUgZ2VuZGVyIGFuZCB0aGUgcmFjZSBvZiB0aGUgc2hvb3Rlci4gCgoKYGBge3J9CnNob290aW5ncyAlPiUgCiAgZHJvcF9uYShnZW5kZXIpICU+JSAKICBtdXRhdGUocmFjZSA9IGFzX2ZhY3RvcihnZW5kZXIpKSAlPiUgCiAgIG11dGF0ZShnZW5kZXIgPSBmY3RfY29sbGFwc2UoZ2VuZGVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbWFsZT0gYygiRiIsICJGZW1hbGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWxlID0gYygiTSIsICJNYWxlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSklPiUKIHBsb3RfbHkoeD0gfmFnZV9vZl9zaG9vdGVyLCB5PSB+Z2VuZGVyKSU+JQogIGFkZF9oaXN0b2dyYW0yZGNvbnRvdXIoKQpgYGAKClRoaXMgc2hvd3MgdGhlIGFnZSBhbmQgdGhlIGdlbmRlciBvZiB0aGUgc2hvb3Rlci4gCgpELiBBIHNjYXR0ZXJwbG90IHdpdGggcGxvdGx5IG9mIHRoZSBudW1iZXIgaW5qdXJlZCBieSB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgaW4gdGhlIHNob290aW5nLiAKCgpgYGB7cn0Kc2hvb3RpbmdzICU+JSAKICBwbG90X2x5KHggPSB+aW5qdXJlZCwgCiAgICAgICAgICB5ID0gfmZhdGFsaXRpZXMpICU+JSAKICBhZGRfbWFya2VycygpIAoKYGBgCgoKCgoKMy4gQ29uZHVjdCBhIHJlZ3Jlc3Npb24gYW5hbHlzaXMgdGVzdGluZyB0aGUgaHlwb3RoZXNpcyB0aGF0IHRoZSBudW1iZXIgb2Ygc2hvb3RpbmdzIGhhcyBpbmNyZWFzZWQgb3ZlciB0aGUgeWVhcnMsIGluY2x1ZGluZyB0aGUgZ3JhcGguCgpgYGB7cn0KbnVtX3Blcl95ZWFyIDwtIHNob290aW5ncyAlPiUgCiAgZmlsdGVyKGZhdGFsaXRpZXMgPiAzKSAlPiUgCiAgY291bnQoeWVhcikKCm51bV9wZXJfeWVhcgpgYGAKCmBgYHtyfQpzaG9vdGluZ3NfcGVyX3llYXJfbW9kZWwgPC0gbG0obiB+IHllYXIsIGRhdGEgPSBudW1fcGVyX3llYXIpCnRpZHkoc2hvb3RpbmdzX3Blcl95ZWFyX21vZGVsKQpnbGFuY2Uoc2hvb3RpbmdzX3Blcl95ZWFyX21vZGVsKQpgYGAKCgpgYGB7cn0KbnVtX3Blcl95ZWFyICU+JSAKICBwbG90X2x5KHggPSB+eWVhciwgCiAgICAgICAgICB5ID0gfm4sCiAgICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsIAogICAgICAgICAgdGV4dCA9IH5wYXN0ZSgiRmF0YWxpdGllcyBwZXIgc2hvb3Rpbmc6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG4sMSksICI8YnI+IiwgIlllYXI6ICIsIHllYXIpKSAlPiUgCiAgYWRkX21hcmtlcnMoc2hvd2xlZ2VuZCA9IEYpICU+JQphZGRfbGluZXMoeSA9IH5maXR0ZWQoc2hvb3RpbmdzX3Blcl95ZWFyX21vZGVsKSklPiUKICBsYXlvdXQodGl0bGUgPSAiTnVtYmVyIG9mIHNob290aW5ncyBieSB5ZWFyIiwKICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlllYXIiKSwKICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk51bWJlciBvZiBzaG9vdGluZ3MiKSkKYGBgClRoaXMgaXMgYSByZWdyZXNzaW9uIGFuYWx5c2lzIHRlc3RpbmcgdGhlIGh5cG90aGVzaXMgdGhhdCB0aGUgbnVtYmVyIG9mIHNob290aW5ncyBoYXMgaW5jcmVhc2VkIG92ZXIgdGhlIHllYXJzLgoKCgoKCg==