library(tidyverse)
library(ggplot2)
library(plotly)
library(kableExtra)
library(here)
library(leaflet)
# Homicides by police ----
## Since 940
load(file = here::here("data-outputs", "WA940.rda"))
last.data.update = max(last.fe.date, last.wapo.date)
homicides940 <- finalmerge_940 %>%
filter(homicide==1) %>%
arrange(date)
## Since 2015
load(file = here("data-outputs", "WA2015.rda"))
homicides2015 <- finalmerge_2015 %>%
filter(homicide == 1) %>%
arrange(date)
# County popsizes ----
load(file = here("data-outputs", "pop_wacounty_2015-19.rda"))
totpop.2019 <- sum(wapop_2019$TOT)
top10_countypop19 <- wapop_2019 %>% arrange(desc(TOT))
top10_countypop19 <- top10_countypop19[1:10,]
top10_counties <- top10_countypop19$county
# # City popsizes ----
# load("~/Home/NextSteps/DataSets/WA/Data/citypops.census.rda")
#
# ## City popsizes by race
# load("~/Home/NextSteps/DataSets/WA/Data/citypops.byrace.census.rda")
#
# # For the PD analysis, Spokane Valley (#9 in citypop) is a problem b/c
# # they contract with the Spokane SO for service.
# # So we pick the top 11, which includes Yakima, and filter appropriately
# # during analysis
#
# top10_citypop20 <- citypops.2020 %>%
# rename(pop10 = matches("Total Pop.* Total: 2010"),
# pop20 = matches("Total Pop.* Total: 2020"),
# pct.change = matches("Total Pop.* Percent")) %>%
# # mutate(pop15 = pop10 * (1 + pct.change/100 * 5/10),
# # pop16 = pop10 * (1 + pct.change/100 * 6/10),
# # pop17 = pop10 * (1 + pct.change/100 * 7/10),
# # pop18 = pop10 * (1 + pct.change/100 * 8/10),
# # pop19 = pop10 * (1 + pct.change/100 * 9/10)) %>%
# select(city = "City Name", pop10, pop20, pct.change) %>%
# arrange(desc(pop20))
#
# top10_citypop20 <- top10_citypop20[1:11,]
# top10_cities <- top10_citypop20$city
#
# ## Black population ----
#
# citypop20_black <- citypops.byrace.2020 %>%
# rename(pop10.black = matches("Pop 18.* Not Hispanic, Black Alone, 2010"),
# pop20.black = matches("Pop 18.* Not Hispanic, Black Alone, 2020"),
# pct.change.black = matches("Pop 18.* Not Hispanic, Black Alone, Percent")) %>%
# # mutate(pop15 = pop10 * (1 + pct.change/100 * 5/10),
# # pop16 = pop10 * (1 + pct.change/100 * 6/10),
# # pop17 = pop10 * (1 + pct.change/100 * 7/10),
# # pop18 = pop10 * (1 + pct.change/100 * 8/10),
# # pop19 = pop10 * (1 + pct.change/100 * 9/10)) %>%
# select(city = "City Name", pop10.black, pop20.black, pct.change.black)
#
# ## Merge black popn to top 10 cities total pop
#
# top10_citypop20 <- top10_citypop20 %>%
# left_join(citypop20_black)
# Homicides for top 10s ----
## Counties ----
### homicides for top 10 counties
pct.top10.940 <- nrow(homicides940 %>%
filter(county %in% top10_counties)) / nrow(homicides940)
pct.top10.2015 <- nrow(homicides2015 %>%
filter(county %in% top10_counties)) / nrow(homicides2015)
#Kevin Peterson, Carlos Hunter, Jenoah Donald are Black; Clayton Joseph and Kfin Karuo are pacific Islander.
hom940_county <- homicides940 %>%
filter(county %in% top10_counties) %>%
mutate(race = case_when(
name == "Carlos Markein Hunter" ~ "BAA",
name == "Kfin Karuo" ~ "API",
TRUE ~ as.character(raceImp)
)) %>%
group_by(county) %>%
summarize(hom940 = n(),
hom940.black = sum(ifelse(race == "BAA", 1, 0)),
hom940.bipoc = sum(ifelse(race != "WEA", 1, 0)),
pd940 = sum(ifelse(grepl("Police", agency.type), 1, 0)),
so940 = sum(ifelse(grepl("Sheriff", agency.type), 1, 0))
) %>%
mutate(pct940.black = round(hom940.black/hom940,3),
pct940.bipoc = round(hom940.bipoc/hom940, 3),
pct940.pd = round(pd940/hom940,3),
pct940.so = round(so940/hom940, 3)
)
hom2015_county <- homicides2015 %>%
filter(county %in% top10_counties) %>%
mutate(race = case_when(
name == "Carlos Markein Hunter" ~ "BAA",
name == "Kfin Karuo" ~ "API",
TRUE ~ as.character(raceImp)
)) %>%
group_by(county) %>%
summarize(hom2015 = n(),
hom2015.black = sum(ifelse(race == "BAA", 1, 0)),
hom2015.bipoc = sum(ifelse(race != "WEA", 1, 0)),
pd2015 = sum(ifelse(grepl("Police", agency.type), 1, 0)),
so2015 = sum(ifelse(grepl("Sheriff", agency.type), 1, 0))
) %>%
mutate(pct2015.black = round(hom2015.black/hom2015,3),
pct2015.bipoc = round(hom2015.bipoc/hom2015, 3),
pct2015.pd = round(pd2015/hom2015,3),
pct2015.so = round(so2015/hom2015, 3)
)
# Merge the homicides with the county popdata ----
df_top10_county <- top10_countypop19 %>%
left_join(hom2015_county) %>%
left_join(hom940_county)
## some counties don't have any cases
df_top10_county[is.na(df_top10_county)] = 0
yrs940 <- as.numeric(Sys.Date() - as.Date("2018-12-06"))/365
yrs2015 <- as.numeric(Sys.Date() - as.Date("2015-01-01"))/365
df_top10_county <- df_top10_county %>%
mutate(risk940 = round(100000*hom940/TOT/yrs940, 2),
risk2015 = round(100000*hom2015/TOT/yrs2015, 2),
risk940.black = round(100000*hom940.black/B/yrs940, 2),
risk2015.black = round(100000*hom2015.black/B/yrs2015, 2),
risk940.bipoc = round(100000*hom940.bipoc/BIPOC/yrs940, 2),
risk2015.bipoc = round(100000*hom2015.bipoc/BIPOC/yrs2015, 2)
)
counties <- df_top10_county %>%
select(county, pop.tot=TOT, pop.black=B, pop.bipoc=BIPOC,
hom940, hom940.black, hom940.bipoc,
pct940.black, pct940.bipoc,
risk940, risk940.black, risk940.bipoc,
pct940.pd, pct940.so,
hom2015, hom2015.black, hom2015.bipoc,
pct2015.black, pct2015.bipoc,
risk2015, risk2015.black, risk2015.bipoc,
pct2015.pd, pct2015.so)
# ## Cities ----
#
# # Pull 2015 homicides for top 10 city PDs
# hom2015_cityPD <- homicides2015 %>%
# filter(agency.type == "Local Police Department") %>%
# mutate(citypd = sub(" Police Department", "", agency)) %>%
# filter(citypd %in% top10_cities) %>%
# group_by(citypd) %>%
# summarize(hom2015 = n(),
# hom2015.black = sum(ifelse(raceImp=="BAA", 1, 0)))
#
# # Pull 940 homicides for top 10 city PDs
# hom940_cityPD <- homicides940 %>%
# filter(agency.type == "Local Police Department") %>%
# mutate(citypd = sub(" Police Department", "", agency)) %>%
# filter(citypd %in% top10_cities) %>%
# group_by(citypd) %>%
# summarize(hom940 = n(),
# hom940.black = sum(ifelse(raceImp=="BAA", 1, 0)))
#
# df_top10_cityPD <- top10_citypop20 %>%
# filter(city != "Spokane Valley") %>%
# left_join(hom2015_cityPD, by = c("city" = "citypd")) %>%
# left_join(hom940_cityPD, by = c("city" = "citypd")) %>%
# replace_na(list(hom2015=0, hom940=0)) %>%
# mutate(risk940 = round(100000*hom940/pop20, 2),
# risk2015 = round(100000*hom2015/pop20, 2),
# risk940.black = round(100000*hom940.black/pop20.black, 2),
# risk2015.black = round(100000*hom2015.black/pop20.black, 2))
This report examines the number and rate of persons killed by police in the 10 largest counties (by population size) in WA State. These 10 counties account for 78% of all persons killed by police since I-940 was passed, and 81% of the cases since 2015.
The focus is on Clark County, so this county is highlighted in all of the plots.
The findings for Clark County since I-940 are:
Compared to the period since 2015, the population adjusted risks in the more recent years since I-940 have risen, and the racial disparities have widened.
There are two types of data used for this report:
2019 Population Estimates: US Census estimates by county, broken down by age, race and sex.
Age – We use the population counts for the 15-69 year old population, as this is the age range at risk of being killed by police. Only 2 of the persons killed by police since I-940 were older, and none were younger. The top 10 counties are selected on the basis of their population in this age range. Black race – We calculate estimates of the Black population in each county using the Census race category “Non-Hispanic Black Alone or in Combination”. This excludes persons who identify as Hispanic ethnicity and Black race, but includes non-Hispanics who identify with multiple races, as long as Black is one of those. BIPOC race – These estimates are calculated as the total population minus the census category “non-Hispanic White Alone”.
Persons killed by police since I-940: Merged data from the Fatal Encounters Project and the Washington Post Police Shootings Database
Homicides by police – We filter out all cases from the Fatal Encounters data where the circumstances are coded as “Suicide”. For the I-940 analysis, we select cases after December 6, 2018, the date the I-940 bill was passed into law. For the 2015 analysis, we select cases after Dec 31, 2014. Race – These two datasets use a combined race/ethnicity coding scheme, where Hispanic is treated as a racial category, and no multiple race options are allowed. We use the race imputations from the Fatal Encounters dataset where possible when race is unknown (12 cases in the 940 data, all of which are imputed to be white; 26 cases in the 2015 data, 20 imputed to be white). Black cases are simply those identified as Black/African American, and BIPOC is all cases other than White/European American.
In addition to the raw number of persons killed, we use three additional metrics:
The percent of persons killed who are Black, or BIPOC
The annual population-adjusted risk of being killed per 100,000 residents, overall, and by race.
The percent of the homicides that are committed by local police, and the percent committed by county Sheriff’s deputies.
The graphs show the rankings of each county using each of these metrics.
p <- ggplot(data = counties,
aes(x=pop.tot, y=reorder(county, pop.tot),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
"Population", scales::comma(pop.tot)))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)),
legend.position = "none") +
scale_x_continuous(labels = scales::comma) +
labs(title = "10 largest counties in WA (by population size)",
x="Population",
y="County")
ggplotly(p, tooltip = "text")
p <- ggplot(data = counties %>% mutate(pct.black = pop.black/pop.tot),
aes(x=pct.black, y=reorder(county, pct.black),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
scales::percent(pct.black), "Black"))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)),
legend.position = "none") +
scale_x_continuous(labels = scales::percent) +
labs(title = "Population percent Black: 10 largest counties in WA",
x="Population Percent Black",
y="County")
ggplotly(p, tooltip = "text")
p <- ggplot(data = counties %>% mutate(pct.bipoc = pop.bipoc/pop.tot),
aes(x=pct.bipoc, y=reorder(county, pct.bipoc),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
scales::percent(pct.bipoc), "BIPOC"))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)),
legend.position = "none") +
scale_x_continuous(labels = scales::percent) +
labs(title = "Population percent BIPOC: 10 largest counties in WA",
x="Population Percent BIPOC",
y="County")
ggplotly(p, tooltip = "text")
p <- ggplot(data = counties,
aes(x=hom940, y=reorder(county, hom940),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
hom940, "persons killed"))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: Number of Homicides since 940",
x="Number of persons killed",
y="County")
ggplotly(p, tooltip = "text")
p.pct.black.940 <- ggplot(data = counties,
aes(x=pct940.black, y=reorder(county, pct940.black),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
scales::percent(pct940.black), "of persons killed are black"))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: Percent of persons killed who are Black since 940",
x="Percent of persons killed who are Black",
y="County")
ggplotly(p.pct.black.940, tooltip = "text")
p <- ggplot(data = counties,
aes(x=pct940.bipoc, y=reorder(county, pct940.bipoc),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
scales::percent(pct940.bipoc), "of persons killed are BIPOC"))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: Percent of persons killed who are BIPOC since 940",
x="Percent of persons killed who are BIPOC",
y="County")
ggplotly(p, tooltip = "text")
p <- ggplot(data = counties,
aes(x=risk940, y=reorder(county, risk940),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
"risk per 100K persons:", risk940))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: Risk of being killed by police, per 100K residents, since 940",
x="Risk per 100K residents",
y="County")
ggplotly(p, tooltip = "text")
p <- ggplot(data = counties,
aes(x=risk940.black, y=reorder(county, risk940.black),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
"black risk per 100K residents:", risk940.black))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: black risk of being killed by police, per 100K residents, since 940",
x="black risk per 100K residents",
y="County")
ggplotly(p, tooltip = "text")
p <- ggplot(data = counties,
aes(x=risk940.bipoc, y=reorder(county, risk940.bipoc),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
"BIPOC risk per 100K residents:", risk940.bipoc))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: BIPOC risk of being killed by police, per 100K residents, since 940",
x="BIPOC risk per 100K residents",
y="County")
ggplotly(p, tooltip = "text")
p <- ggplot(data = counties,
aes(x=pct940.pd, y=reorder(county, pct940.pd),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
scales::percent(pct940.pd), "killed by police"))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: Percent killed by police officers, since 940",
x="Percent killed by police officers",
y="County")
ggplotly(p, tooltip = "text")
p <- ggplot(data = counties,
aes(x=pct940.so, y=reorder(county, pct940.so),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
scales::percent(pct940.so), "killed by Sheriff"))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: Percent killed by Sheriff deputies, since 940",
x="Percent killed by Sheriff's deputies",
y="County")
ggplotly(p, tooltip = "text")
p <- ggplot(data = counties,
aes(x=hom2015, y=reorder(county, hom2015),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
hom2015, "persons killed"))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: Number of Homicides since 2015",
x="Number of persons killed",
y="County")
ggplotly(p, tooltip = "text")
p.pct.black.2015 <- ggplot(data = counties,
aes(x=pct2015.black, y=reorder(county, pct2015.black),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
scales::percent(pct2015.black), "of persons killed are black"))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: Percent of persons killed who are Black since 2015",
x="Percent of persons killed who are Black",
y="County")
ggplotly(p.pct.black.2015, tooltip = "text")
p <- ggplot(data = counties,
aes(x=pct2015.bipoc, y=reorder(county, pct2015.bipoc),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
scales::percent(pct2015.bipoc), "of persons killed are BIPOC"))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: Percent of persons killed who are BIPOC since 2015",
x="Percent of persons killed who are BIPOC",
y="County")
ggplotly(p, tooltip = "text")
p <- ggplot(data = counties,
aes(x=risk2015, y=reorder(county, risk2015),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
"risk per 100K persons:", risk2015))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: Risk of being killed by police, per 100K residents, since 2015",
x="Risk per 100K residents",
y="County")
ggplotly(p, tooltip = "text")
p <- ggplot(data = counties,
aes(x=risk2015.black, y=reorder(county, risk2015.black),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
"black risk per 100K residents:", risk2015.black))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: black risk of being killed by police, per 100K residents, since 2015",
x="black risk per 100K residents",
y="County")
ggplotly(p, tooltip = "text")
p <- ggplot(data = counties,
aes(x=risk2015.bipoc, y=reorder(county, risk2015.bipoc),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
"BIPOC risk per 100K residents:", risk2015.bipoc))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: BIPOC risk of being killed by police, per 100K residents, since 2015",
x="BIPOC risk per 100K residents",
y="County")
ggplotly(p, tooltip = "text")
p <- ggplot(data = counties,
aes(x=pct2015.pd, y=reorder(county, pct2015.pd),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
scales::percent(pct2015.pd), "killed by police"))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: Percent killed by police officers, since 2015",
x="Percent killed by police officers",
y="County")
ggplotly(p, tooltip = "text")
p <- ggplot(data = counties,
aes(x=pct2015.so, y=reorder(county, pct2015.so),
col=factor(ifelse(county=="Clark", 1, 0)),
text=paste(county, "<br>",
scales::percent(pct2015.so), "killed by Sheriff"))) +
geom_bar(stat="identity", fill="lightsteelblue") +
scale_color_manual(values = c("lightsteelblue3", "gold")) +
theme(axis.text.y=element_text(size=rel(0.8)), legend.position = "none") +
labs(title = "County rankings: Percent killed by Sheriff deputies, since 2015",
x="Percent killed by Sheriff's deputies",
y="County")
ggplotly(p, tooltip = "text")