Introduction

This Markdown sets out to determine the number of homicides of people experiencing homelessness in Maricopa County, Arizona in 2023. The data analysis was completed for an Appeal story that is set to publish soon.

The original data includes deaths of people who were either unhoused (i.e. “transient”), or whose housing status was unknown, that were investigated by the Maricopa County Office of the Medical Examiner. It was provided to me by Jessie Caraveo, PIO for the Maricopa County Office of the Medical Examiner, by email on April 5, 2024. It came in four spreadsheets: transient deaths with event description through 11/17/2023; transient deaths without event description through 11/17/2023; declined ME cases from 9/1/2023 to 2/29/2024; and complete cases from 9/1/2023 to 2/29/2024.

Since this story is focused on homicides and the declined cases file does not state whether or not those cases were homicides, I left those cases out of this analysis.

Findings

There were 26 unhoused homicide victims in Maricopa County in 2023, and another 54 homicide victims whose housing status is unknown. There were a total of 283 homicide victims in the county that year, according to the Arizona Department of Public Safety’s crime statistics. That means at least 9% of Maricopa County’s homicide victims in 2023 were unhoused — and possibly even more.

Reading in & cleaning the data

# First I need to take the three Excel files, which all contain at least some homicide data, and combine them into one complete dataset.

# Reading in the data that includes cases from September 2023 to February 2024.

transient_deaths_2_24_og <-
  read_excel(
    "transient_deaths_3_24.xlsx",
    sheet = "Transient Line-list Report",
    col_types = c(
      "text",
      "text",
      "text",
      "text",
      "text",
      "text",
      "text",
      "date",
      "text",
      "text",
      "text",
      "text",
      "text",
      "text"
    )
  )
## Warning in read_fun(path = enc2native(normalizePath(path)), sheet_i = sheet, :
## Expecting date in H7 / R7C8: got 'Death Date'
## New names:
## * `` -> ...2
## * `` -> ...3
## * `` -> ...4
## * `` -> ...5
## * `` -> ...6
## * ...
# Removing columns 1-5, which contain a description of the data (preserved in the og data).

transient_deaths_2_24_edit =
  transient_deaths_2_24_og[-c(1, 2, 3, 4, 5), ] %>%
  row_to_names(row_number = 1)

# Cleaning column names.

transient_deaths_2_24_edit <-
  clean_names(transient_deaths_2_24_edit)

# Renaming the death_date column.

names(transient_deaths_2_24_edit)[names(transient_deaths_2_24_edit) == 'na'] <-
  'death_date'
# Reading in the data that includes event description through 11/17/2023.

transient_deaths_11_23_event_og <-
  read_excel("transient_deaths_11_23_event_desc.xlsx", sheet= "Export", col_types = c("text","text","text","text","text","text","text","text","date","text","text","text","text","text","text" ))
## Warning in read_fun(path = enc2native(normalizePath(path)), sheet_i = sheet, :
## Expecting date in I3 / R3C9: got 'DeathDate'
## New names:
## * `` -> ...2
## * `` -> ...3
## * `` -> ...4
## * `` -> ...5
## * `` -> ...6
## * ...
# Removing column 1, which is blank.

transient_deaths_11_23_event_edit =
  transient_deaths_11_23_event_og[-c(1),] %>% 
  row_to_names(row_number=1)

# Cleaning column names.

transient_deaths_11_23_event_edit <- clean_names(transient_deaths_11_23_event_edit)

# Renaming the death_date column. 

names(transient_deaths_11_23_event_edit)[names(transient_deaths_11_23_event_edit) == 'na'] <- 'death_date'
# Reading in the data that does not include event description through 11/17/2023.

transient_deaths_11_23_no_event_og <-
  read_excel(
    "transient_deaths_11_23_no_event_desc.xlsx",
    sheet = "Export",
    col_types = c(
      "text",
      "text",
      "text",
      "text",
      "text",
      "text",
      "text",
      "text",
      "date",
      "text",
      "text",
      "text",
      "text"
    )
  )
## Warning in read_fun(path = enc2native(normalizePath(path)), sheet_i = sheet, :
## Expecting date in I3 / R3C9: got 'DeathDate'
## New names:
## * `` -> ...2
## * `` -> ...3
## * `` -> ...4
## * `` -> ...5
## * `` -> ...6
## * ...
# Removing column 1, which is blank.

transient_deaths_11_23_no_event_edit =
  transient_deaths_11_23_no_event_og[-c(1), ] %>%
  row_to_names(row_number = 1)

#Cleaning column names.

transient_deaths_11_23_no_event_edit <-
  clean_names(transient_deaths_11_23_no_event_edit)

# Renaming the death_date column.

names(transient_deaths_11_23_no_event_edit)[names(transient_deaths_11_23_no_event_edit) == 'na'] <-
  'death_date'
# Adding an "event_description" column and 'sub_manner' column to the no event dataframe so both dataframes have all of the same exact columns.

transient_deaths_11_23_no_event_edit <-
  transient_deaths_11_23_no_event_edit %>% add_column(event_description =
                                                        "NA", sub_manner = "NA")
# Combining the two datasets that go through 11/23.

deaths_11_23_total <-
  rbind(transient_deaths_11_23_event_edit,
        transient_deaths_11_23_no_event_edit)
# Tweaking the column names in the 2/24 dataset so that they perfectly match the 11/23 total dataset.

colnames(transient_deaths_2_24_edit) <-
  c(
    'case_number',
    'decedent_name',
    'age',
    'sex',
    'ethnicity',
    'race',
    'transient',
    'death_date',
    'death_place_type',
    'death_zip_code',
    'cause_and_contributory_cause_of_death',
    'manner',
    'sub_manner',
    'event_description'
  )

# Adding a few columns to the 2/24 dataset so it matches with the 11/23 total dataset.

transient_deaths_2_24_edit <-
  transient_deaths_2_24_edit %>% add_column(case_status = "NA", death_place_city =
                                              "NA")

# Filtering out all of the 2024 dates, since we're only analyzing 2023 data.

transient_deaths_2_24_edit <-
  filter(transient_deaths_2_24_edit, death_date <= "2023-12-31")

# Adding a column to the 11/23 total dataset so it matches with the 2/24 dataset.

deaths_11_23_total <-
  deaths_11_23_total %>% add_column(cause_and_contributory_cause_of_death =
                                      "NA")

# Joining the 11/23 total dataset and the 2/24 dataset.

deaths_2023_total <-
  rbind(deaths_11_23_total, transient_deaths_2_24_edit)
# Checking for duplicates in the data.

deaths_2023_total %>% distinct(case_number) %>%
  count()
## # A tibble: 1 × 1
##       n
##   <int>
## 1  1351
# Looks like we got rid of all the duplicates. There are 1351 rows with distinct case numbers, and 1351 rows total in the dataset, meaning there are no duplicates.

deaths_2023_total <-
  distinct(deaths_2023_total, case_number, .keep_all = TRUE)

Analyzing the data

#Deaths of people who were confirmed homeless.

deaths_2023_total %>% filter(transient == "Yes")
## # A tibble: 830 × 16
##    case_number decedent_name  age   sex    case_status ethnicity race  transient
##    <chr>       <chr>          <chr> <chr>  <chr>       <chr>     <chr> <chr>    
##  1 2023-00046  Bollinger-Gon… 59.0  Male   Closed      Hispanic… White Yes      
##  2 2023-00069  Arena, Daniel… 38.0  Male   Closed      Hispanic… White Yes      
##  3 2023-00076  Cirner, Lawre… 50.0  Male   Closed      Not Hisp… White Yes      
##  4 2023-00108  Wycliffe, Fea… 38.0  Female Closed      Not Hisp… Amer… Yes      
##  5 2023-00109  Salva, Margel  68.0  Male   Closed      Not Hisp… ASIAN Yes      
##  6 2023-00113  Martinez, Efr… 66.0  Male   Closed      Hispanic… White Yes      
##  7 2023-00122  Castaneda, Mi… 49.0  Male   Closed      Hispanic… White Yes      
##  8 2023-00149  Yazzie, Charl… 54.0  Male   Closed      Not Hisp… Amer… Yes      
##  9 2023-00154  LaRue, Don     60.0  Male   Closed      Not Hisp… Blac… Yes      
## 10 2023-00181  Huffman, Jimmy 61.0  Male   Closed      Hispanic… White Yes      
## # … with 820 more rows, and 8 more variables: death_date <dttm>,
## #   sub_manner <chr>, manner <chr>, death_zip_code <chr>,
## #   death_place_city <chr>, death_place_type <chr>, event_description <chr>,
## #   cause_and_contributory_cause_of_death <chr>

830 people who were confirmed homeless died in Maricopa County in 2023, more than 2022, which was 794.

deaths_2023_total %>% filter(manner == "Homicide")
## # A tibble: 80 × 16
##    case_number decedent_name  age   sex   case_status ethnicity  race  transient
##    <chr>       <chr>          <chr> <chr> <chr>       <chr>      <chr> <chr>    
##  1 2023-00079  Medina-Nunez,… 46.0  Male  Closed      Not Hispa… White Unknown  
##  2 2023-00760  Vega, Angel D… 21.0  Male  Closed      Hispanic … White Unknown  
##  3 2023-01059  Byous, Aaron … 41.0  Male  Closed      Not Hispa… White Unknown  
##  4 2023-01336  Johnson, Marq… 24.0  Male  Closed      Not Hispa… Blac… Yes      
##  5 2023-01377  Gordon, Damon… 17.0  Male  Closed      Not Hispa… Blac… Unknown  
##  6 2023-02127  Sansotta, Mat… 36.0  Male  Closed      Not Hispa… White Unknown  
##  7 2023-02146  Jacques, Alej… 26.0  Male  Closed      Hispanic … White Yes      
##  8 2023-02890  Morrissey, Al… 26.0  Male  Closed      Hispanic … White Yes      
##  9 2023-03034  Rugwiro, Geof… 47.0  Male  Closed      <NA>       Blac… Unknown  
## 10 2023-03321  Ring Jr., Ric… 38.0  Male  Closed      Not Hispa… White Unknown  
## # … with 70 more rows, and 8 more variables: death_date <dttm>,
## #   sub_manner <chr>, manner <chr>, death_zip_code <chr>,
## #   death_place_city <chr>, death_place_type <chr>, event_description <chr>,
## #   cause_and_contributory_cause_of_death <chr>

There were 80 homicides.

deaths_2023_total %>% filter(manner == "Homicide") %>%
  filter (transient == "Yes")
## # A tibble: 26 × 16
##    case_number decedent_name  age   sex   case_status ethnicity  race  transient
##    <chr>       <chr>          <chr> <chr> <chr>       <chr>      <chr> <chr>    
##  1 2023-01336  Johnson, Marq… 24.0  Male  Closed      Not Hispa… Blac… Yes      
##  2 2023-02146  Jacques, Alej… 26.0  Male  Closed      Hispanic … White Yes      
##  3 2023-02890  Morrissey, Al… 26.0  Male  Closed      Hispanic … White Yes      
##  4 2023-04063  Curtis, Isaia… 26.0  Male  Closed      Not Hispa… Blac… Yes      
##  5 2023-04634  Morgan, Errol… 30.0  Male  Closed      Not Hispa… Blac… Yes      
##  6 2023-05256  Stephens, Bil… 59.0  Male  Closed      Not Hispa… White Yes      
##  7 2023-05462  Arnstad, Nich… 41.0  Male  Closed      Not Hispa… White Yes      
##  8 2023-05468  Young, Stephe… 41.0  Male  Closed      Not Hispa… White Yes      
##  9 2023-09515  Blevins, Lavo… 35.0  Male  Closed      Not Hispa… Blac… Yes      
## 10 2023-01211  Brown, Sylves… 31.0  Male  Closed      Not Hispa… Blac… Yes      
## # … with 16 more rows, and 8 more variables: death_date <dttm>,
## #   sub_manner <chr>, manner <chr>, death_zip_code <chr>,
## #   death_place_city <chr>, death_place_type <chr>, event_description <chr>,
## #   cause_and_contributory_cause_of_death <chr>

26 of the 80 homicides were of people who were confirmed to be homeless. There were a total of 283 homicides in the county that year, according to the Arizona Department of Public Safety’s crime statistics.

This is our final case count, since in the other 54 cases, the housing status of the deceased person is unknown. That being said, 26 is almost certainly an undercount, a fact that we should include prominently in the story. Some cases also still have the manner of death as “pending,” further supporting the likelihood that 26 is an undercount.

# Export homicide info to Excel file

homicide_data <-
  deaths_2023_total %>% filter(manner == "Homicide") %>%
  filter (transient == "Yes") %>%
  select (
    decedent_name,
    death_place_city,
    death_zip_code,
    death_date,
    event_description,
    case_number,
    case_status
  )

write_xlsx(x = homicide_data,
           path = "2023_homicide_data.xlsx",
           col_names = TRUE)