Niniejsza analiza stanowi projekt z przedmiotu PjR na kierunku AB
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.
Wyczytujemy dane z pakietu fivethirtyeight o nazwie
police_deaths
data("police_deaths")
police <- police_deaths
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)
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 |
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
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.
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.
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 |
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.
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.
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.
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.
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.
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.