This first code downloads all the necessary packages to run the correct commands.

library(leaflet)
library(tidyverse)
library(lubridate)
library(broom)
library(plotly)
library(DT)

This chunk then reads in the data on shootings which will be analyzed in this notebook.

shootings <- read_csv("https://docs.google.com/spreadsheets/d/1b9o6uDO18sLxBqPwl_Gh9bnhW-ev_dABH83M5Vb5L8o/export?format=csv", na = "-")
New names:
* location -> location...2
* location -> location...8
Rows: 126 Columns: 24-- Column specification ------------------------------------------------------------------------------------------------------------------
Delimiter: ","
chr (17): case, location...2, date, summary, location...8, prior_signs_mental_health_issues, mental_health_details, weapons_obtained_l...
dbl  (7): fatalities, injured, total_victims, age_of_shooter, latitude, longitude, year
i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.

This chunk then creates a map out of the shootings data. However, without the extra data included in the last two lines, the map would be more zoomed out to include hawaii (setView to lebanon lat and lng to center the map correctly), the dots would be very large and not sorted by total victim count, and the map would be more zoomed in by default.

shootings %>% 
  leaflet() %>% 
  addTiles() %>%
  setView(lat = 39.8, lng = -98.6, zoom = 4) %>%
  addCircleMarkers(stroke = F, fillOpacity = .6, radius = ~total_victims/10)
Assuming "longitude" and "latitude" are longitude and latitude, respectively

Next, this chunk is going to analyze and answer the median number of total victims and the second chunk will give the median number of fatalities.

shootings %>% 
  drop_na(total_victims) %>% 
  summarize(median_victims = median(total_victims))

This concludes that the median victim count was 10.

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

This concludes that the medican fatality count was 6.

Next, this chunk will create a histogram of the number of shootings per year.

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

The next two chunks will give one heat map of gender and race of the shooter, and another of gender and age of shooter. Without using the fct_collapse lines, the data would have multiple items that fit the same category. By using fct_collapse, all words that fit into the same gender, race, etc, are combined into one category for accurate data representation.

shootings %>% 
  drop_na(race) %>% 
  mutate(race = as_factor(race)) %>% 
  mutate(race = fct_collapse(race, 
                             White = c("White", "white"), 
                             Black = c("Black", "black"),
                             Latino = c("Latino"),
                             Asian = c("Asian"),
                             Other = c("unclear", "Other")
                             )) %>% 
  plot_ly(x = ~gender, y = ~race) %>% 
  add_histogram2dcontour()
shootings %>% 
  drop_na(gender) %>% 
  mutate(gender = as_factor(gender)) %>% 
  mutate(gender = fct_collapse(gender, 
                             Female = c("F", "Female"), 
                             Male = c("M", "Male")
                             )) %>% 
  plot_ly(x = ~gender, y = ~age_of_shooter) %>% 
  add_histogram2dcontour()
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGZpcnN0IGNvZGUgZG93bmxvYWRzIGFsbCB0aGUgbmVjZXNzYXJ5IHBhY2thZ2VzIHRvIHJ1biB0aGUgY29ycmVjdCBjb21tYW5kcy4NCmBgYHtyfQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoRFQpDQpgYGANCg0KVGhpcyBjaHVuayB0aGVuIHJlYWRzIGluIHRoZSBkYXRhIG9uIHNob290aW5ncyB3aGljaCB3aWxsIGJlIGFuYWx5emVkIGluIHRoaXMgbm90ZWJvb2suDQpgYGB7cn0NCnNob290aW5ncyA8LSByZWFkX2NzdigiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMWI5bzZ1RE8xOHNMeEJxUHdsX0doOWJuaFctZXZfZEFCSDgzTTVWYjVMOG8vZXhwb3J0P2Zvcm1hdD1jc3YiLCBuYSA9ICItIikNCmBgYA0KDQoNClRoaXMgY2h1bmsgdGhlbiBjcmVhdGVzIGEgbWFwIG91dCBvZiB0aGUgc2hvb3RpbmdzIGRhdGEuIEhvd2V2ZXIsIHdpdGhvdXQgdGhlIGV4dHJhIGRhdGEgaW5jbHVkZWQgaW4gdGhlIGxhc3QgdHdvIGxpbmVzLCB0aGUgbWFwIHdvdWxkIGJlIG1vcmUgem9vbWVkIG91dCB0byBpbmNsdWRlIGhhd2FpaSAoc2V0VmlldyB0byBsZWJhbm9uIGxhdCBhbmQgbG5nIHRvIGNlbnRlciB0aGUgbWFwIGNvcnJlY3RseSksIHRoZSBkb3RzIHdvdWxkIGJlIHZlcnkgbGFyZ2UgYW5kIG5vdCBzb3J0ZWQgYnkgdG90YWwgdmljdGltIGNvdW50LCBhbmQgdGhlIG1hcCB3b3VsZCBiZSBtb3JlIHpvb21lZCBpbiBieSBkZWZhdWx0Lg0KYGBge3J9DQpzaG9vdGluZ3MgJT4lIA0KICBsZWFmbGV0KCkgJT4lIA0KICBhZGRUaWxlcygpICU+JQ0KICBzZXRWaWV3KGxhdCA9IDM5LjgsIGxuZyA9IC05OC42LCB6b29tID0gNCkgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoc3Ryb2tlID0gRiwgZmlsbE9wYWNpdHkgPSAuNiwgcmFkaXVzID0gfnRvdGFsX3ZpY3RpbXMvMTApDQpgYGANCg0KDQpOZXh0LCB0aGlzIGNodW5rIGlzIGdvaW5nIHRvIGFuYWx5emUgYW5kIGFuc3dlciB0aGUgbWVkaWFuIG51bWJlciBvZiB0b3RhbCB2aWN0aW1zIGFuZCB0aGUgc2Vjb25kIGNodW5rIHdpbGwgZ2l2ZSB0aGUgbWVkaWFuIG51bWJlciBvZiBmYXRhbGl0aWVzLg0KDQpgYGB7cn0NCnNob290aW5ncyAlPiUgDQogIGRyb3BfbmEodG90YWxfdmljdGltcykgJT4lIA0KICBzdW1tYXJpemUobWVkaWFuX3ZpY3RpbXMgPSBtZWRpYW4odG90YWxfdmljdGltcykpDQpgYGANCg0KVGhpcyBjb25jbHVkZXMgdGhhdCB0aGUgbWVkaWFuIHZpY3RpbSBjb3VudCB3YXMgMTAuDQoNCmBgYHtyfQ0Kc2hvb3RpbmdzICU+JSANCiAgZHJvcF9uYShmYXRhbGl0aWVzKSAlPiUgDQogIHN1bW1hcml6ZShtZWRpYW5fZmF0YWxpdGllcyA9IG1lZGlhbihmYXRhbGl0aWVzKSkNCmBgYA0KDQpUaGlzIGNvbmNsdWRlcyB0aGF0IHRoZSBtZWRpY2FuIGZhdGFsaXR5IGNvdW50IHdhcyA2Lg0KDQpOZXh0LCB0aGlzIGNodW5rIHdpbGwgY3JlYXRlIGEgaGlzdG9ncmFtIG9mIHRoZSBudW1iZXIgb2Ygc2hvb3RpbmdzIHBlciB5ZWFyLg0KDQpgYGB7cn0NCnNob290aW5ncyAlPiUgDQogIHBsb3RfbHkoeCA9IH55ZWFyKSAlPiUgDQogIGFkZF9oaXN0b2dyYW0obmJpbnN4ID0gNDApDQpgYGANCg0KVGhlIG5leHQgdHdvIGNodW5rcyB3aWxsIGdpdmUgb25lIGhlYXQgbWFwIG9mIGdlbmRlciBhbmQgcmFjZSBvZiB0aGUgc2hvb3RlciwgYW5kIGFub3RoZXIgb2YgZ2VuZGVyIGFuZCBhZ2Ugb2Ygc2hvb3Rlci4gV2l0aG91dCB1c2luZyB0aGUgZmN0X2NvbGxhcHNlIGxpbmVzLCB0aGUgZGF0YSB3b3VsZCBoYXZlIG11bHRpcGxlIGl0ZW1zIHRoYXQgZml0IHRoZSBzYW1lIGNhdGVnb3J5LiBCeSB1c2luZyBmY3RfY29sbGFwc2UsIGFsbCB3b3JkcyB0aGF0IGZpdCBpbnRvIHRoZSBzYW1lIGdlbmRlciwgcmFjZSwgZXRjLCBhcmUgY29tYmluZWQgaW50byBvbmUgY2F0ZWdvcnkgZm9yIGFjY3VyYXRlIGRhdGEgcmVwcmVzZW50YXRpb24uDQpgYGB7cn0NCnNob290aW5ncyAlPiUgDQogIGRyb3BfbmEocmFjZSkgJT4lIA0KICBtdXRhdGUocmFjZSA9IGFzX2ZhY3RvcihyYWNlKSkgJT4lIA0KICBtdXRhdGUocmFjZSA9IGZjdF9jb2xsYXBzZShyYWNlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hpdGUgPSBjKCJXaGl0ZSIsICJ3aGl0ZSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxhY2sgPSBjKCJCbGFjayIsICJibGFjayIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXRpbm8gPSBjKCJMYXRpbm8iKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNpYW4gPSBjKCJBc2lhbiIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlciA9IGMoInVuY2xlYXIiLCAiT3RoZXIiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSAlPiUgDQogIHBsb3RfbHkoeCA9IH5nZW5kZXIsIHkgPSB+cmFjZSkgJT4lIA0KICBhZGRfaGlzdG9ncmFtMmRjb250b3VyKCkNCmBgYA0KDQpgYGB7cn0NCnNob290aW5ncyAlPiUgDQogIGRyb3BfbmEoZ2VuZGVyKSAlPiUgDQogIG11dGF0ZShnZW5kZXIgPSBhc19mYWN0b3IoZ2VuZGVyKSkgJT4lIA0KICBtdXRhdGUoZ2VuZGVyID0gZmN0X2NvbGxhcHNlKGdlbmRlciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbWFsZSA9IGMoIkYiLCAiRmVtYWxlIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWxlID0gYygiTSIsICJNYWxlIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIA0KICBwbG90X2x5KHggPSB+Z2VuZGVyLCB5ID0gfmFnZV9vZl9zaG9vdGVyKSAlPiUgDQogIGFkZF9oaXN0b2dyYW0yZGNvbnRvdXIoKQ0KYGBgDQoNCg0K