Fatal Encounters
df <- read.csv("fatal_encounters.csv")
df %>% head
## Unique.ID Name Age Gender Race
## 1 31495 Ashley McClendon 28 Female African-American/Black
## 2 31496 Name withheld by police Female Race unspecified
## 3 31497 Name withheld by police Male Race unspecified
## 4 31491 Johnny C. Martin Jr. 36 Male Race unspecified
## 5 31492 Dennis McHugh 44 Male European-American/White
## 6 31493 Ny'Darius McKinney 21 Male Race unspecified
## Race.with.imputations Imputation.probability
## 1 African-American/Black Not imputed
## 2 <NA> <NA>
## 3 <NA> <NA>
## 4 <NA> <NA>
## 5 <NA> <NA>
## 6 <NA> <NA>
## URL.of.image..PLS.NO.HOTLINKS.
## 1 https://fatalencounters.org/wp-content/uploads/2022/01/Ashley-McClendon.jpg
## 2
## 3
## 4
## 5
## 6
## Date.of.injury.resulting.in.death..month.day.year.
## 1 12/31/2021
## 2 12/31/2021
## 3 12/31/2021
## 4 12/30/2021
## 5 12/30/2021
## 6 12/30/2021
## Location.of.injury..address. Location.of.death..city. State
## 1 South Pearl Street and Tory Road Pageland SC
## 2 1500 21st Street Meridian MS
## 3 1500 21st Street Meridian MS
## 4 Martinez Lane Nicholls GA
## 5 435 E 4th Street Beaumont CA
## 6 State Rd S-29-296 & Bethel Rd Lancaster SC
## Location.of.death..zip.code. Location.of.death..county.
## 1 29728 Chesterfield
## 2 39301 Lauderdale
## 3 39301 Lauderdale
## 4 31554 Coffee
## 5 92223 Riverside
## 6 29720 Lancaster
## Full.Address Latitude
## 1 South Pearl Street and Tory Road Pageland SC 29728 Chesterfield 34.7452955
## 2 1500 21st Street Meridian MS 39301 Lauderdale 32.3793294
## 3 1500 21st Street Meridian MS 39301 Lauderdale 32.3793294
## 4 Martinez Lane Nicholls GA 31554 Coffee 31.5307934
## 5 400 E 4th Street Beaumont CA 92223 Riverside 33.9261462
## 6 State Rd S-29-296 & Bethel Rd Lancaster SC 29720 Lancaster 34.6608217
## Longitude
## 1 -80.39306
## 2 -88.69397
## 3 -88.69397
## 4 -82.63782
## 5 -116.97715
## 6 -80.83714
## Agency.or.agencies.involved
## 1 Pageland Police Department
## 2 Meridian Police Department
## 3 Meridian Police Department
## 4 Coffee County Sheriff's Office
## 5 Riverside County Sheriff's Department, Beaumont Police Department, Banning Police Department
## 6 South Carolina Law Enforcement Division
## Highest.level.of.force UID.Temporary Name.Temporary Armed.Unarmed
## 1 Vehicle NA
## 2 Gunshot NA
## 3 Gunshot NA
## 4 Gunshot NA
## 5 Gunshot NA
## 6 Vehicle NA
## Alleged.weapon Aggressive.physical.movement Fleeing.Not.fleeing
## 1
## 2
## 3
## 4
## 5
## 6
## Description.Temp URL.Temp
## 1
## 2
## 3
## 4
## 5
## 6
## Brief.description
## 1 Ashley McClendon's boyfriend, 33-year-old Marcus Allen Davis, allegedly was driving a 1996 Ford Coupe back to Pageland when an officer reportedly saw the car run a stop sign before midnight on Dec. 31. A traffic stop was attempted, but Davis refused to stop. As the car fled down South Pearl Street near Tory Road it left the road and struck a tree, killing passenger McClendon.
## 2 Police responded to a man causing a disturbance who was covered in blood. The man had a gun in each hand at a home. Once officers arrived, they were met with gunfire. Officers responded back with gunfire. A man and woman were killed.
## 3 Police responded to a man causing a disturbance who was covered in blood. The man had a gun in each hand at a home. Once officers arrived, they were met with gunfire. Officers responded back with gunfire. A man and woman were killed.
## 4 Johnny C. Martin, Jr. arrived at a gas station at 7:10 p.m. While at the gas station, Martin allegedly carjacked a woman, shooting at her while stealing her car. The Ware County Sheriff's Office and the Georgia State Patrol found the stolen car driven by Martin and pursued. Martin eventually went off the road into a field. When officers approached the car, they found Martin with a fatal gunshot to the head and a gun in his hand.
## 5 Deputies responded to a domestic violence call. When deputies arrived, the man was gone. The man reportedly had a felony warrant for a violation of an assault with a deadly weapon, domestic violence, kidnapping, vandalism, and a domestic violence restraining order violation. Deputies learned the suspect was in the city of Beaumont. A helicopter found the suspect's car. When officers located the man, he tried to flee by ramming his car into other cars. An officer and deputy shot and killed him.
## 6 About 5:35 p.m., Joseph Jemar Hinson was allegedly driving a car when police tried to pull him over, and he fled. Police pursued him until he ran off the left side of the roadway, struck a fence and wrecked, killing back seat passenger Ny'Darius McKinney. Hinson was charged with failure to stop for a blue light resulting in death.
## Dispositions.Exclusions.INTERNAL.USE..NOT.FOR.ANALYSIS
## 1 Criminal
## 2 Pending investigation
## 3 Pending investigation
## 4 Suicide
## 5 Pending investigation
## 6 Criminal
## Intended.use.of.force..Developing.
## 1 Pursuit
## 2 Deadly force
## 3 Deadly force
## 4 Suicide
## 5 Deadly force
## 6 Pursuit
## Supporting.document.link
## 1 https://www.wsoctv.com/news/1-person-dead-after-attempting-escape-police-troopers-say/QXA244QPUZGJ5GAGRADGDWBAEU/
## 2 https://www.wtok.com/2022/01/01/officer-involved-shooting/
## 3 https://www.wtok.com/2022/01/01/officer-involved-shooting/
## 4 https://gbi.georgia.gov/press-releases/2021-12-31/gbi-perry-and-douglas-offices-investigating-related-shootings
## 5 https://kesq.com/news/2021/12/31/officer-involved-shooting-unfolds-in-beaumont/
## 6 https://www.thelancasternews.com/content/21-year-old-man-killed-when-car-fleeing-police-crashes
## X X.1 Unique.ID.formula Unique.identifier..redundant.
## 1 NA NA NA 31495
## 2 NA NA NA 31496
## 3 NA NA NA 31497
## 4 NA NA NA 31491
## 5 NA NA NA 31492
## 6 NA NA NA 31493
We found out that latitude is nor a numeric column so we need to convert it.
df$Latitude <- as.numeric(df$Latitude)
## Warning: NAs introduced by coercion
We can now turn the dataframe into an sf object with its latitude and longitude (remove the NAs first).
df <- df %>% filter(!is.na(Latitude) & !is.na(Longitude)) %>%
filter(Latitude >= -90 & Latitude <= 90,
Longitude >= -180 & Longitude <= 180)
incidents <- df %>% st_as_sf(coords = c("Longitude", "Latitude"), crs = 4326)
We can get the state boundaries as well as population data from census bureau.
states <- get_acs(geography = "state",
variables = c(hhincome = 'B19013_001', population = 'B01003_001'),
survey = "acs5",
geometry = TRUE,
output = "wide",
progress = FALSE) %>%
rename(hhincome = hhincomeE, population = populationE) %>%
st_transform(4326)
## Getting data from the 2018-2022 5-year ACS
## Downloading feature geometry from the Census website. To cache shapefiles for use in future sessions, set `options(tigris_use_cache = TRUE)`.
The “States” column in the original dataset is in abbreviation, but the census tract data is not. I found another source with the abbreviations of each state.
abbr <- read.csv("https://raw.githubusercontent.com/jasonong/List-of-US-States/refs/heads/master/states.csv")
states_1 <- states %>% rename(State = NAME) %>% left_join(abbr, by = "State")
We can now count the number of incidents in each state. I also calculated a column with incidents per 100 thousand population.
state_incidents_count <- df %>%
group_by(State) %>%
summarise(count = n())
states_new <- states_1 %>%
left_join(state_incidents_count, by = c("Abbreviation"="State"))
states_new$incident_per_100k <- states_new$count / states_new$population * 100000
Plotting the map.
tmap_mode("view")
## tmap mode set to interactive viewing
tm_shape(states_new) + tm_polygons(id = "State", col = "incident_per_100k", popup.vars = c("Incidents Per 100k Population"="incident_per_100k"))
We can see that the state with most police killings rate (highest number of incidents per 100k population) in New Mexico. Other states in the South or Southwest are also quite high, the exceptions being Texas and Florida. The New England regions have the lowest rates.
We are now exploring a specific variable in this dataset in order to tell a compelling story. In this case I’ll choose the Race variable. We could first use barplot to see each category’s distribution.
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:httr':
##
## config
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
p <- ggplot(df, aes(x=Race)) +
geom_bar(fill = "steelblue") +
ylab("Number of Incidents") +
xlab("Race") +
ggtitle("Police Killings By Race") +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
plotly::ggplotly(p)
There is an apparant wrong data in this chart, so we should remove it and plot again. We also need to clean the data and merge similar values.
df1 <- df %>%
filter(Race != "Christopher Anthony Alexander") %>%
mutate(Race = case_when(
Race == "european-American/White" ~ "European-American/White",
Race == "European-American/European-American/White" ~ "European-American/White",
Race == "African-American/Black African-American/Black Not imputed" ~ "African-American/Black",
TRUE ~ Race # Keeps all other values unchanged
))
p <- ggplot(df1, aes(x=Race)) +
geom_bar(fill = "steelblue") +
ylab("Number of Incidents") +
xlab("Race") +
ggtitle("Police Killings By Race") +
theme(axis.text.x = element_text(angle = 45, vjust = 0.5, hjust = 1))
ggplotly(p)
The prevailing race in the dataset is White, the next being African American.
We can try to plot incidents by race on a map (remove the unspecified race incidents for better visualization).
df2 <- df1 %>% filter(Race != "Race unspecified")
tmap_mode("view")
## tmap mode set to interactive viewing
incidents1 <- df2 %>% st_as_sf(coords = c("Longitude", "Latitude"), crs = 4326)
tm_shape(incidents1) + tm_dots(col = "Race",
palette=c("royalblue", "yellow", "pink", "red", "orange", "purple"))