Library packages
Read data file
fatal_encounters <- read.csv("Fatal_encounters.csv")
head(fatal_encounters)
## 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
Check data
fe <-
fatal_encounters %>%
filter(!is.na(Unique.ID))
fe %>%
map_dbl(., function(x) sum(is.na(x)))
## Unique.ID
## 0
## Name
## 0
## Age
## 0
## Gender
## 0
## Race
## 0
## Race.with.imputations
## 862
## Imputation.probability
## 881
## URL.of.image..PLS.NO.HOTLINKS.
## 0
## Date.of.injury.resulting.in.death..month.day.year.
## 0
## Location.of.injury..address.
## 0
## Location.of.death..city.
## 0
## State
## 0
## Location.of.death..zip.code.
## 181
## Location.of.death..county.
## 0
## Full.Address
## 0
## Latitude
## 0
## Longitude
## 0
## Agency.or.agencies.involved
## 0
## Highest.level.of.force
## 0
## UID.Temporary
## 25968
## Name.Temporary
## 0
## Armed.Unarmed
## 0
## Alleged.weapon
## 0
## Aggressive.physical.movement
## 0
## Fleeing.Not.fleeing
## 0
## Description.Temp
## 0
## URL.Temp
## 0
## Brief.description
## 0
## Dispositions.Exclusions.INTERNAL.USE..NOT.FOR.ANALYSIS
## 0
## Intended.use.of.force..Developing.
## 0
## Supporting.document.link
## 0
## X
## 31497
## X.1
## 31496
## Unique.ID.formula
## 31496
## Unique.identifier..redundant.
## 0
Data to sf
fe_sf <- st_as_sf(fe,coords = c("Longitude", "Latitude"), crs = 4326)
Age Distribution of Individuals Involved in Police Fatal
Encounters
The majority of individuals are concentrated between the ages of 20
and 40, with a peak around the late 20s. This suggests that young adults
are the most common age group involved in these incidents. The frequency
of encounters drops significantly for those under 20 and above 50,
indicating that such incidents are less common among the youngest and
oldest populations.
fe_sf$Age <- as.numeric(fe_sf$Age)
## Warning: NAs introduced by coercion
ggplot(fe_sf, aes(x = Age)) +
geom_histogram(binwidth = 5, fill = "steelblue", color = "white", alpha = 0.7) +
theme_minimal() +
labs(title = "Age Distribution of Individuals",
x = "Age",
y = "Count")
## Warning: Removed 1222 rows containing non-finite outside the scale range
## (`stat_bin()`).

ggplot(fe_sf, aes(y = Age)) +
geom_boxplot(fill = "steelblue", alpha = 0.7) +
theme_minimal() +
labs(title = "Box Plot of Age Distribution",
x = "Age",
y = "Density")
## Warning: Removed 1222 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

Age by gender
fe_sf$Gender <- as.factor(fe_sf$Gender)
selected_data <- fe_sf %>%
filter(!is.na(Age) & !is.na(Gender))
ggplot(selected_data, aes(x = Gender, y = Age, fill = Gender)) +
geom_boxplot(alpha = 0.7) +
theme_minimal() +
labs(title = "Age Distribution by Gender",
x = "Gender",
y = "Age") +
theme(legend.position = "none")

The median age (middle line within each box) is similar across
Female and Male groups, hovering around the mid-30s. This suggests that
most fatal encounters involve individuals in this age range, regardless
of gender
Age Distribution by Race
fe_sf$Race <- as.factor(fe_sf$Race)
selected_data <- fe_sf %>%
filter(!is.na(Age) & !is.na(Race)) %>%
mutate(
Race_Simplified = case_when(
grepl("White", Race, ignore.case = TRUE) ~ "White",
Race == "Race unspecified" ~ "Unspecified",
TRUE ~ "Non-White"
),
Race_Simplified = factor(Race_Simplified, levels = c("White", "Non-White", "Unspecified"))
)
# Box plot of age distribution by simplified race classification
ggplot(selected_data, aes(x = Race_Simplified, y = Age, fill = Race_Simplified)) +
geom_boxplot(alpha = 0.7) +
theme_minimal() +
labs(
title = "Age Distribution by Race (White/non-white)",
x = "Race ",
y = "Age"
) +
theme(
axis.text.x = element_text(angle = 0),
legend.position = "none"
)

The box plot comparing age distributions among “White,” “Non-White,”
and “Unspecified” groups reveals that “White” individuals tend to have a
slightly older median age compared to “Non-White” individuals. The
“Non-White” group shows a wider range of ages, including more younger
individuals.
Density of Age by Race
# Overlayed histogram with density curves
ggplot(selected_data, aes(x = Age, fill = Race_Simplified)) +
geom_density(aes(color = Race_Simplified), size = 1, alpha = 0.5) +
theme_minimal() +
labs(
title = "Age Distribution by Race with Density Curves",
x = "Age",
y = "Density",
fill = "Race ",
color = "Race "
)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

The density plot of age distribution provides a smoothed view of the
age differences across racial groups. It shows that the “Non-White”
group has a sharper peak, indicating a higher concentration of younger
individuals in police encounters, while the “White” group’s peak is more
spread out, suggesting a broader range of ages. The “Unspecified”
category overlaps both but tends to include a wider range of ages,
likely due to data gaps in precise age reporting.
Trends in Incidents Over Time by Race
fe_sf$Date <- as.Date(fe_sf$Date.of.injury.resulting.in.death..month.day.year., format = "%m/%d/%Y")
race_counts <- fe_sf %>%
count(Race)
print(race_counts)
## Simple feature collection with 11 features and 2 fields
## Geometry type: GEOMETRY
## Dimension: XY
## Bounding box: xmin: -165.5919 ymin: 19.03468 xmax: -67.26603 ymax: 71.30125
## Geodetic CRS: WGS 84
## First 10 features:
## Race n
## 1 African-American/Black 7008
## 2 African-American/Black African-American/Black Not imputed 4
## 3 Asian/Pacific Islander 485
## 4 Christopher Anthony Alexander 1
## 5 European-American/European-American/White 37
## 6 european-American/White 1
## 7 European-American/White 10613
## 8 Hispanic/Latino 4192
## 9 Middle Eastern 53
## 10 Native American/Alaskan 323
## geometry
## 1 MULTIPOINT ((-68.77318 44.8...
## 2 MULTIPOINT ((-95.31342 29.9...
## 3 MULTIPOINT ((-74.99155 44.6...
## 4 POINT (-112.051 41.13831)
## 5 MULTIPOINT ((-92.96736 45.2...
## 6 POINT (-122.8247 45.50692)
## 7 MULTIPOINT ((-68.04057 46.1...
## 8 MULTIPOINT ((-70.33733 43.6...
## 9 MULTIPOINT ((-121.3551 44.1...
## 10 MULTIPOINT ((-67.86713 46.5...
# Create a simplified race classification and exclude unspecified races
fe_sf <- fe_sf %>%
mutate(
Race_Simplified = case_when(
grepl("White", Race, ignore.case = TRUE) ~ "White",
grepl("Unspecified", Race, ignore.case = TRUE) ~ "Unspecified",
TRUE ~ "Non-White"
)
)
# Set the levels of Race_Simplified to ensure "Unspecified" comes last
fe_sf <- fe_sf %>%
mutate(
Race_Simplified = factor(
Race_Simplified,
levels = c("White", "Non-White", "Unspecified") # Specify the desired order
)
)
# Display the counts
print(race_counts)
## Simple feature collection with 11 features and 2 fields
## Geometry type: GEOMETRY
## Dimension: XY
## Bounding box: xmin: -165.5919 ymin: 19.03468 xmax: -67.26603 ymax: 71.30125
## Geodetic CRS: WGS 84
## First 10 features:
## Race n
## 1 African-American/Black 7008
## 2 African-American/Black African-American/Black Not imputed 4
## 3 Asian/Pacific Islander 485
## 4 Christopher Anthony Alexander 1
## 5 European-American/European-American/White 37
## 6 european-American/White 1
## 7 European-American/White 10613
## 8 Hispanic/Latino 4192
## 9 Middle Eastern 53
## 10 Native American/Alaskan 323
## geometry
## 1 MULTIPOINT ((-68.77318 44.8...
## 2 MULTIPOINT ((-95.31342 29.9...
## 3 MULTIPOINT ((-74.99155 44.6...
## 4 POINT (-112.051 41.13831)
## 5 MULTIPOINT ((-92.96736 45.2...
## 6 POINT (-122.8247 45.50692)
## 7 MULTIPOINT ((-68.04057 46.1...
## 8 MULTIPOINT ((-70.33733 43.6...
## 9 MULTIPOINT ((-121.3551 44.1...
## 10 MULTIPOINT ((-67.86713 46.5...
# Adjusting the x-axis labels for better readability
ggplot(fe_sf, aes(x = Date, fill = Race_Simplified)) +
geom_histogram(binwidth = 365, alpha = 0.7) +
facet_wrap(~ Race_Simplified) +
theme_minimal() +
labs(
title = "Number of Incidents Over Time by Race (Yearly Bins)",
x = "Year",
y = "Number of Incidents",
fill = "Race"
) +
scale_x_date(date_breaks = "5 years", date_labels = "%Y") +
theme(
axis.text.x = element_text(angle = 45, hjust = 1)
)

The histogram of yearly incidents categorized by “White,”
“Non-White,” and “Unspecified” groups. The trends over time for the
“White” and “Non-White” groups show some similarities, with both
experiencing a rise in incidents up to around 2010, followed by
fluctuations in recent years. The “Unspecified” category shows irregular
trends, possibly reflecting gaps or inconsistencies in data collection
over time.
Monthly Distribution of Fatal Encounters
# Extract the month from the Date column
fe_sf$Month <- format(fe_sf$Date, "%B")
fe_sf$Month <- factor(fe_sf$Month, levels = month.name)
# Bar plot of incidents by month
ggplot(fe_sf, aes(x = Month, fill = Race_Simplified)) +
geom_bar(position = "dodge", alpha = 0.7) +
theme_minimal() +
labs(
title = "Number of Fatal Encounters by Month",
x = "Month",
y = "Number of Incidents",
fill = "Race"
) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1)
)

The bar plot of incidents by month, categorized by race, shows
relatively consistent monthly counts throughout the year.
ggplot(fe_sf, aes(x = Month)) +
geom_bar(position = "dodge", alpha = 0.7, fill = "steelblue") +
theme_minimal() +
labs(
title = "Number of Fatal Encounters by Month",
x = "Month",
y = "Number of Incidents",
fill = "Race"
) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1)
)

Despite some monthly variations, the number of incidents does not
drastically change across months. This suggests that, while there might
be slight seasonal trends, the overall frequency of fatal encounters
remains fairly consistent throughout the year.
State count Map
atl_sf <- fe_sf %>%
filter(Location.of.death..city. == "Atlanta")
tmap_mode("view")
## tmap mode set to interactive viewing
tm_shape(atl_sf) +
tm_dots(col = "Race_Simplified", size = 0.03, palette = c("White" = "blue", "Non-White" = "green", "Unspecified" = "gray")) +
tm_layout(
title = "Fatal Encounters by Race",
legend.outside = TRUE
)
The points are densely clustered in certain urban areas of Atlanta,
suggesting that fatal encounters tend to occur more frequently in
populated or central parts of the city, and distribute to roads and
highway.