Niniejsza analiza stanowi projekt z przedmiotu PjR na kierunku AB

Wprowadzenie

Zbiór danych police_deaths z pakietu fivethirtyeight zawiera informacje o śmierci funkcjonariuszy policji w USA. Analiza dotyczy lat, przyczyn śmierci oraz lokalizacji. Celem projektu jest zidentyfikowanie trendów oraz potencjalnych czynników wpływających na wzrost lub spadek liczby takich przypadków. Dane na ten temat zostały zebrane przez dziennikarzy: Carl Bialik, Ritchie King and Andrew Flowers i udostępnione w tym artykule.

Wczytanie danych

Wyczytujemy dane z pakietu fivethirtyeight o nazwie police_deaths

data("police_deaths")
police <- police_deaths

Czyszczenie i przygotowanie danych

Dane składają się z 22800 rekordów i 7 zmiennych. Każdy rekord dotyczy pojedynczego przypadku śmierci.

Filtrujemy nasze dane żeby nie zawierały one wartości NA, były poprawne i nie uwzgłędniały zabitych psów policyjnych.

police_clean <- police %>%
  filter(!is.na(cause_of_death), !is.na(year), !is.na(state), canine == 'FALSE')
police_clean$state <- as.factor(police_clean$state)
police_clean$cause_of_death <- as.factor(police_clean$cause_of_death)

police_clean_pies <- police %>%
  filter(!is.na(cause_of_death), !is.na(year), !is.na(state))
police_clean$state <- as.factor(police_clean$state)
police_clean$cause_of_death <- as.factor(police_clean$cause_of_death)

Wykorzystane zmienne

W dalszej analizie wykorzystano następujące zmienne:

Zmienna Opis
person Imię i nazwisko funkcjonariusza (lub psa policyjnego), który zginął na służbie
cause_of_death Główna przyczyna śmierci funkcjonariusza (np. postrzał, wypadek itp.)
date Dokładna data śmierci
year Rok, w którym nastąpiła śmierć
canine Informacja, czy zmarły to pies policyjny (TRUE) czy człowiek (FALSE)
dept_name Nazwa jednostki policji, w której pracowała zmarła osoba
state Stan USA, w którym policjant/policjantka poniósł/poniosła śmierć

Statystyki podsumowujące wybrane zmienne przedstawiają się następująco:

knitr::kable(police_clean %>% select(date, state, cause_of_death, year) %>% summary)
date state cause_of_death year
Min. :1791-01-03 TX : 1869 Gunfire :11985 Min. :1791
1st Qu.:1923-10-08 CA : 1604 Automobile accident: 2335 1st Qu.:1923
Median :1951-08-24 NY : 1571 Motorcycle accident: 1134 Median :1951
Mean :1951-08-24 US : 1216 Heart attack : 977 Mean :1951
3rd Qu.:1983-01-15 IL : 1070 Vehicular assault : 882 3rd Qu.:1983
Max. :2016-07-03 PA : 890 Struck by vehicle : 833 Max. :2016
NA (Other):14317 (Other) : 4391 NA

Analiza

Przeprowadzona analiza obejmowała następujące zagadnienia:

analizę czasową - analiza różnych zmiennych na przesztrzeni lat

analizę przestrzenną - analiza z podziałem na poszczególne stany i departamenty w USA

analizę sprawców - przyczyny, liczbę przypadków, czy śmierć poniósł policjant, czy pies policyjny

Analiza czasowa

Liczba zgonów rocznie

police_clean  %>% 
  group_by(year) %>%
  summarise(n = n(), .groups = "drop") %>%
  ggplot(aes(x = year, y = n)) +
  geom_line(color = "steelblue", linewidth = 1.2) +
  geom_point(color = "darkblue") +
  labs(title = "Liczba śmierci policjantów rocznie",
       x = "Rok", y = "Liczba zgonów")+
    theme_bw()

Liczba zgonów funkcjonariuszy zmienia się w czasie. W niektórych latach widać wyraźne wzrosty, które mogą być powiązane z wydarzeniami społecznymi (np. zamieszki) lub zmianami w polityce bezpieczeństwa.

Rok vs przyczyna śmierci funkcjonariusza policji

translations <- tibble::tibble(
  cause_of_death = c("Assault", "Automobile accident", "Gunfire", "Gunfire (Accidental)", 
                     "Heart attack", "Motorcycle accident", "Stabbed", "Struck by vehicle", 
                     "Vehicle pursuit", "Vehicular assault"),
  cause_pl = c("Atak fizyczny", "Wypadek samochodowy", "Postrzelenie", "Postrzelenie (przypadkowe)",
               "Zawał serca", "Wypadek motocyklowy", "Dźgnięcie", "Potrącenie pojazdem",
               "Pościg pojazdem", "Napaść pojazdem"))

police_clean %>%
  filter(cause_of_death %in% translations$cause_of_death) %>%
  left_join(translations, by = "cause_of_death") %>%
  count(year, cause_pl) %>%
  ggplot(aes(x = year, y = n, fill = cause_pl)) +
  geom_area() +
  labs(title = "Zgony wg 10 najczęstszych przyczyn w czasie",
       x = "Rok", y = "Liczba zgonów", fill = "Przyczyna ") +
  theme_minimal()

Wykres pokazuje, że postrzelenia były przez wiele lat najczęstszą przyczyną śmierci funkcjonariuszy. Z czasem zaczęły się pojawiać inne przyczyny, takie jak wypadki czy zawały. W ostatnich latach liczba zgonów stopniowo spada, co może świadczyć o poprawie bezpieczeństwa służby.

Liczba smierci funkcjonariuszy policji w każdym wieku

police_clean %>% 
    mutate(wiek= ifelse(year >=2001,'XXI_wiek', 
                                     ifelse(year >= 1901, 'XX_wiek', 
                                            ifelse(year >= 1801, 'XIX_wiek', 'XVIII_wiek'))),
                        wiek = factor(wiek, levels = c('XXI_wiek', 'XX_wiek', 'XIX_wiek', 'XVIII_wiek'))) %>% 
    group_by(year, wiek)%>%
    summarise(liczba_smierci=n()) %>% 
    ggplot(aes(x = year, y = liczba_smierci ))+
    geom_col(col = 'black', fill = 'red')+
    facet_wrap(~wiek, scales = 'free')+
    theme_bw()

Wykres przedstawia liczbę zgonów funkcjonariuszy w podziale na wieki. Najwięcej zgonów odnotowano w XX wieku, jednak po uwzględnieniu długości okresów (100 lat vs 15 lat), średnia roczna liczba zgonów w XX i XXI wieku jest zbliżona (odpowiednio 180 i 167), co oznacza, że różnice są niewielkie

knitr::kable( police_clean %>% 
     mutate(wiek= ifelse(year >=2001,'XXI_wiek', 
                         ifelse(year >= 1901, 'XX_wiek', 
                                ifelse(year >= 1801, 'XIX_wiek', 'XVIII_wiek'))),
            wiek = factor(wiek, levels = c('XXI_wiek', 'XX_wiek', 'XIX_wiek', 'XVIII_wiek'))) %>%
     group_by(wiek) %>%
     summarise(
         liczebność = n(),
         liczba_lat_w_wieku = case_when(
             cur_group()$wiek == 'XXI_wiek' ~ 15,
             cur_group()$wiek == 'XIX_wiek' ~ 100,
             cur_group()$wiek == 'XVIII_wiek' ~ 9,
             TRUE ~ 100),
         średnie_smierci_rocznie = round(liczebność/liczba_lat_w_wieku, 0)))
wiek liczebność liczba_lat_w_wieku średnie_smierci_rocznie
XXI_wiek 2499 15 167
XX_wiek 18027 100 180
XIX_wiek 2006 100 20
XVIII_wiek 5 9 1

Analiza przestrzenna

Zgony funkcjonariuszy według stanów (top 10)

state_names <- tibble::tibble(
  state = state.abb,
  full_name = state.name
) %>%
  bind_rows(tibble(state = "US", full_name = "United States"))


top10 <- police_clean %>%
  group_by(state) %>%
  summarise(n = n(), .groups = "drop") %>%
  arrange(desc(n)) %>%
  slice_max(n, n = 10) %>%
  left_join(state_names, by = "state")


t <- top10 %>%
  rowwise() %>%
  mutate(x = list(1:n)) %>%
  unnest(x) %>%
  mutate(value = x) %>%
  select(-state) %>% 
  rename(state = full_name, y = n)

ggplot(top10, aes(x = n, y = reorder(full_name, n), fill = n)) +
  geom_col() +
  geom_text(aes(label = n), hjust = -0.1, size = 3.5, color = "black") +
  scale_fill_gradient(low = "forestgreen", high = "red") +
  labs(
    title = "Top 10 stanów z największą liczbą zgonów",
    x = "Liczba zgonów",
    y = "Stan"
  ) +
  theme_minimal() +
  theme(legend.position = "none") +
  xlim(0, max(top10$n) * 1.1)

Największa liczba zgonów przypada na stany z dużymi populacjami jak Texas, California i New York. Jest to częściowo efektem liczby funkcjonariuszy i skali przestępczości.

Mapa USA – liczba zgonów według stanu

state_data <- police_clean %>% 
  group_by(state) %>%
  summarise(deaths = n(), .groups = "drop")

plot_usmap(data = state_data, values = "deaths", color = "white") +
  scale_fill_continuous(name = "Zgony", label = scales::comma) +
  labs(title = "Liczba zgonów funkcjonariuszy według stanu (USA)") +
  theme(legend.position = "right")

Mapa pokazuje silne zróżnicowanie geograficzne. Najwięcej zgonów występuje w południowych i zachodnich stanach. Regiony wiejskie mają mniejszą liczbę przypadków.

Zgony według departamentu (top 10)

police_clean %>%
  filter(!is.na(dept_name)) %>%
  group_by(dept_name) %>%
  summarize(n = n(), .groups = "drop") %>%
  arrange(desc(n)) %>%
  slice_max(n, n = 10) %>%
  ggplot(aes(x = reorder(dept_name, n), y = n)) +
  geom_col(fill = "purple") +
  geom_text(aes(label = n), hjust = -0.3, size = 3.5) + 
  coord_flip(clip = "off") +  
  labs(
    title = "Top 10 departamentów\nz największą liczbą zgonów",
    x = "Departament",
    y = "Liczba zgonów"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    plot.margin = margin(10, 30, 10, 10))

Największe jednostki organizacyjne, takie jak New York Police Department, znajdują się na szczycie listy. Może to odzwierciedlać zarówno skalę działania, jak i ryzyko operacyjne.

Analiza sprawców

Przyczyny śmierci funkcjonariuszy z podziałem na incydentalne i zamierzone

tlumaczenia <- tibble::tibble(
  cause_of_death = c(
    "Gunfire", "Gunfire (Accidental)", "Assault", "Stabbed", "Terrorist attack",
    "Automobile accident", "Motorcycle accident", "Heart attack", "Vehicle pursuit",
    "Struck by vehicle", "Vehicular assault", "Drowned", "Electrocuted",
    "Training accident", "Explosion", "Fire", "Bomb", "Exposure", "Exposure to toxins",
    "Fall", "Animal related", "Accidental", "Struck by streetcar", "Struck by train",
    "Weather/Natural disaster", "Boating accident", "Aircraft accident",
    "Structure collapse", "9/11 related illness", "Duty related illness",
    "Unidentified", "Train accident", "Bicycle accident", "Poisoned",
    "Heat exhaustion"
  ),
  przyczyna_pl = c(
    "Postrzelenie", "Postrzelenie (przypadkowe)", "Atak fizyczny", "Dźgnięcie", "Atak terrorystyczny",
    "Wypadek samochodowy", "Wypadek motocyklowy", "Zawał serca", "Pościg pojazdem",
    "Potrącenie przez pojazd", "Atak z użyciem pojazdu", "Utonięcie", "Porażenie prądem",
    "Wypadek treningowy", "Eksplozja", "Pożar", "Bomba", "Narażenie na czynniki szkodliwe", "Kontakt z toksynami",
    "Upadek", "Zwierzę", "Wypadek", "Potrącenie przez tramwaj", "Potrącenie przez pociąg",
    "Katastrofa naturalna", "Wypadek łodzi", "Katastrofa lotnicza",
    "Zawalenie konstrukcji", "Choroba związana z zamachem z 11 września(WTC)", "Choroba służbowa",
    "Nieokreślone", "Wypadek kolejowy", "Wypadek rowerowy", "Otrucie",
    "Przegrzanie organizmu"
  )
)


tabela <- police_clean %>%
  mutate(
    kategoria = case_when(
      cause_of_death %in% c("Gunfire", 'Vehicular assault', 'Bomb', 'Explosion', "Assault", "Stabbed", "Terrorist attack", 'Poisoned') ~ "Zamierzone (atak/sprawca)",
      TRUE ~ "Incydentalne (choroba/wypadek)"
    )
  ) %>%
  count(cause_of_death, kategoria, sort = TRUE) %>%
  left_join(tlumaczenia, by = "cause_of_death") %>%
  rename("Przyczyna (EN)" = cause_of_death,
         "Przyczyna (PL)" = przyczyna_pl,
         "Kategoria" = kategoria,
         "Liczba przypadków" = n) %>%
  select(`Przyczyna (EN)`, `Przyczyna (PL)`, Kategoria, `Liczba przypadków`)


tabela %>%
  kbl(caption = "", align = "lclc") %>%
  kable_styling(full_width = FALSE, position = "center", font_size = 14)
Przyczyna (EN) Przyczyna (PL) Kategoria Liczba przypadków
Gunfire Postrzelenie Zamierzone (atak/sprawca) 11985
Automobile accident Wypadek samochodowy Incydentalne (choroba/wypadek) 2335
Motorcycle accident Wypadek motocyklowy Incydentalne (choroba/wypadek) 1134
Heart attack Zawał serca Incydentalne (choroba/wypadek) 977
Vehicular assault Atak z użyciem pojazdu Zamierzone (atak/sprawca) 882
Struck by vehicle Potrącenie przez pojazd Incydentalne (choroba/wypadek) 833
Vehicle pursuit Pościg pojazdem Incydentalne (choroba/wypadek) 627
Assault Atak fizyczny Zamierzone (atak/sprawca) 608
Gunfire (Accidental) Postrzelenie (przypadkowe) Incydentalne (choroba/wypadek) 593
Stabbed Dźgnięcie Zamierzone (atak/sprawca) 447
Aircraft accident Katastrofa lotnicza Incydentalne (choroba/wypadek) 381
Drowned Utonięcie Incydentalne (choroba/wypadek) 256
Struck by train Potrącenie przez pociąg Incydentalne (choroba/wypadek) 253
Fall Upadek Incydentalne (choroba/wypadek) 183
Duty related illness Choroba służbowa Incydentalne (choroba/wypadek) 164
9/11 related illness Choroba związana z zamachem z 11 września(WTC) Incydentalne (choroba/wypadek) 110
Terrorist attack Atak terrorystyczny Zamierzone (atak/sprawca) 84
Electrocuted Porażenie prądem Incydentalne (choroba/wypadek) 83
Accidental Wypadek Incydentalne (choroba/wypadek) 78
Animal related Zwierzę Incydentalne (choroba/wypadek) 77
Struck by streetcar Potrącenie przez tramwaj Incydentalne (choroba/wypadek) 68
Fire Pożar Incydentalne (choroba/wypadek) 61
Explosion Eksplozja Zamierzone (atak/sprawca) 58
Bomb Bomba Zamierzone (atak/sprawca) 57
Exposure to toxins Kontakt z toksynami Incydentalne (choroba/wypadek) 42
Weather/Natural disaster Katastrofa naturalna Incydentalne (choroba/wypadek) 33
Training accident Wypadek treningowy Incydentalne (choroba/wypadek) 25
Structure collapse Zawalenie konstrukcji Incydentalne (choroba/wypadek) 23
Train accident Wypadek kolejowy Incydentalne (choroba/wypadek) 18
Exposure Narażenie na czynniki szkodliwe Incydentalne (choroba/wypadek) 14
Heat exhaustion Przegrzanie organizmu Incydentalne (choroba/wypadek) 14
Bicycle accident Wypadek rowerowy Incydentalne (choroba/wypadek) 13
Boating accident Wypadek łodzi Incydentalne (choroba/wypadek) 13
Unidentified Nieokreślone Incydentalne (choroba/wypadek) 6
Poisoned Otrucie Zamierzone (atak/sprawca) 2

Najczęstszą przyczyną śmierci są postrzelenia, a dalej wypadki komunikacyjne i zawały serca. Widać dominację przyczyn związanych z przemocą fizyczną lub stresem.

police_clean %>%
  mutate(kategoria = ifelse(cause_of_death %in% c("Gunfire", "Assault", "Stabbed", "Terrorist attack"),
                             "Zamierzone", "Incydentalne")) %>%
  group_by(year, kategoria) %>%
  summarise(n = n(), .groups = "drop") %>%
  ggplot(aes(x = year, y = n, fill = kategoria)) +
  geom_area(alpha = 0.7) +
  scale_fill_manual(values = c("Zamierzone" = "firebrick", "Incydentalne" = "steelblue")) +
  labs(title = "Zgony funkcjonariuszy wg typu przyczyny (obszarowy)",
       x = "Rok", y = "Liczba zgonów", fill = "Typ przyczyny") +
  theme_minimal()

Na przestrzeni lat obserwujemy przewagę zgonów z przyczyn incydentalnych (np. wypadki, choroby), jednak zamierzone przyczyny (atak, postrzelenie) również stanowią znaczną część i w niektórych okresach, jak lata 30. i 70. XX wieku, ich liczba znacząco rosła. W ostatnich dekadach ogólna liczba zgonów maleje, co może świadczyć o poprawie warunków bezpieczeństwa.

Czy zabitym był pies policyjny?

police_clean_pies %>% mutate(canine = factor(canine, levels = c('FALSE', 'TRUE'), 
                                        labels = c('Policjant', 'Pies'))) %>%
    ggplot(aes(x = canine, fill = canine))+
    geom_bar(col = 'black')+
    labs(title = "Porównanie ilości przypadków smierci policjanta lub psa policyjnego",
       x = "Czy zmarłym był pies policyjny", y = "ilość przypadków",
       fill = "")+
    theme_bw()+
    geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.5, fontface = "bold")

Z danej analizy możemy zauważyć, że podczas większości przypadków zmarłym był człowiek-funkcjonariusz policji i tylko podczas 263 przypadkach to był pies policyjny.

Wnioski

  • Najczęstszą przyczyną śmierci funkcjonariuszy były postrzelenia.
  • Stany o dużej populacji mają najwięcej zgonów.
  • Mapa i wykresy pokazują wyraźne różnice regionalne.
  • Departamenty miejskie są najbardziej narażone.
  • Czasowe rozkłady przyczyn śmierci wskazują na zmieniający się charakter zagrożeń.
  • Największa gęstość smierci rocznie miała miejsce w XX i XXI wieku.

Co dalej?

W niniejszym projekcie skupiliśmy się na podstawowym podziale danych według wieku (wieków historycznych), liczby zgonów oraz ich średnich rocznych. Dalsze analizy mogłyby pogłębić wnioski i odpowiedzieć na bardziej szczegółowe pytania. W szczególności warto byłoby:

  • Uwzględnić dodatkowe zmienne: np. płeć, itp.

  • Zbadać sezonowość: czy zjawisko zgonów wykazuje cykliczność w ciągu roku?

  • Porównać z danymi z innych krajów lub zawodów: np. strażaków lub pracowników ochrony, aby przeanalizować wyniki w szerszym kontekście.

Dzięki tym analizom możliwe byłoby stworzenie pełniejszego obrazu dynamiki zjawiska oraz wskazanie potencjalnych obszarów wymagających interwencji lub zmian w polityce bezpieczeństwa.