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))

Introduction

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.

Summary

The findings for Clark County since I-940 are:

  • It was the 5th largest county in WA in 2019
    • 3% of the residents were Black
    • 22% of the residents were BIPOC
  • It ranked:
    • 4th highest in the number of persons killed by police (8 cases)
    • 2nd highest in the percent of persons killed who are BIPOC (62%)
    • Number 1 in the percent of persons killed who are Black (38%)
  • The annual population adjusted risk of being killed by police during this period is
    • 0.8 per 100K overall for residents of this county
    • 2.3 per 100K for BIPOC residents
    • 9.4 per 100K for Black residents
  • The majority of these homicides are committed by local police officers (62%), and most of the rest are committed by Sheriff’s deputies (25%).

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.


Data

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.


Metrics

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.


Population and demographics

Population 2019

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")

Black Population

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")

BIPOC Population

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")

People killed since 940

Number

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")

Pct Black

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")

Pct BIPOC

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")

Risk per 100K

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")

Risk per 100K Black

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")

Risk per 100K BIPOC

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")

Police Depts

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")

Sheriff

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")

People killed since 2015

Number

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")

Pct Black

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")

Pct BIPOC

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")

Risk per 100K

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")

Risk per 100K Black

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")

Risk per 100K BIPOC

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")

Police Depts

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")

Sheriff

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")