library(here)
library(tidyverse)
library(countrycode)
library(huxtable)
Charger les principaux packages
Récupérer les données
Pour récupérer des données sur les pays européens, le package eurostat est votre ami. Parcourez le catalogue avec la fonction eurostat::get_eurostat_toc()
= here("data", "crim_just_job.rds") crim_just_job_path
::get_eurostat("crim_just_job", type = "label", cache_dir = here("data")) |>
eurostatwrite_rds(crim_just_job_path)
= read_rds(crim_just_job_path) crim_just_job
Une rapide inspection :
glimpse(crim_just_job)
Rows: 9,376
Columns: 6
$ isco08 <chr> "Professional judges", "Professional judges", "Professional jud…
$ sex <chr> "Females", "Females", "Females", "Females", "Females", "Females…
$ unit <chr> "Number", "Number", "Number", "Number", "Number", "Number", "Nu…
$ geo <chr> "Albania", "Austria", "Bosnia and Herzegovina", "Bulgaria", "Cy…
$ time <date> 2021-01-01, 2021-01-01, 2021-01-01, 2021-01-01, 2021-01-01, 20…
$ values <dbl> 170, 216, 761, 1450, 71, 2080, 1750, 650, 1204, 1887, 71, 28, 4…
Les recoder
Dès que vous devez manipuler des noms et codes de pays, pensez au package countrycode.
= crim_just_job |>
police_europe pivot_wider(names_from = c(sex, isco08, unit),
values_from = "values",
names_repair = janitor::make_clean_names) |>
complete(geo, time) |>
mutate(geo = if_else(geo %in% c("Scotland", "England and Wales", "Northern Ireland (UK)"),
"United Kingdom", geo)) |>
summarise(across(ends_with("number"), ~ sum(.x, na.rm = F)), .by = c(geo, time)) |>
mutate(geo = str_replace(geo, "Türkiye", "Turkey"),
geo = if_else(str_detect(geo, "Germany"), "Germany", geo),
geo = if_else(str_detect(geo, "Kosovo"), "Republic of Kosovo", geo),
year = year(time),
wb = countrycode(geo, origin = "country.name", destination = "wb")) |>
select(wb, year, total_police_officers_number)
On manque de données pour certaines années, pour certains pays :
::freq.na(police_europe) questionr
missing %
total_police_officers_number 42 8
wb 0 0
year 0 0
Maintenant les données ressemblent à ceci :
glimpse(police_europe)
Rows: 546
Columns: 3
$ wb <chr> "ALB", "ALB", "ALB", "ALB", "ALB", "ALB",…
$ year <dbl> 2008, 2009, 2010, 2011, 2012, 2013, 2014,…
$ total_police_officers_number <dbl> 9588, 9229, 9670, 9723, 9728, 9477, 9625,…
Calculer le nombre de policiers par habitant
Ce calcul a déjà été effectué par les auteurs de la base téléchargée. Toutefois, un examen attentif des données montre quelques choix un peu curieux, et nous incite à le refaire nous-même, par précaution.
Le package wbstats donne accès aux données de la Banque mondiale, parmi lesquelles le nombre d’habitant, le PIB par tête, etc.
= here("data", "wb.rds") wb_path
L’argument mrv
donne le nombre de most recent values à requérir. L’argument gapfill = TRUE
remplace les valeurs manquantes éventuelles par la valeur précédente la plus récente.
::wb_data(country = "countries_only",
wbstatsindicator = c("gdp_per_capita" = "NY.GDP.PCAP.CD",
"population" = "SP.POP.TOTL"),
mrv = 15,
gapfill = TRUE) |>
write_rds(wb_path)
= read_rds(wb_path) |>
wb mutate(country = str_replace(country, "Turkiye", "Turkey"),
wb = countrycode(country, origin = "country.name", destination = "wb")) %>%
rename(year = date) %>%
select(-iso2c, -iso3c, -country)
= police_europe |>
police_europe_pcm filter(!is.na(total_police_officers_number),
<= 2020) |>
year filter(year == max(year, na.rm = TRUE), .by = wb) |>
left_join(wb, by = join_by(wb, year)) |>
mutate(policiers_pcm = total_police_officers_number / population * 100000) |>
mutate(pays = countrycode(wb, origin = "wb", destination = "country.name.fr"),
pays = if_else(wb == "MNE", "Monténégro", pays),
pays = if_else(wb == "MKD", "Macédoine du Nord", pays),
policiers_pcm = round(policiers_pcm)) |>
arrange(desc(policiers_pcm))
Palmarès
Tableau
La colonne “Année” indique la dernière année pour laquelle des données sont disponibles.
|>
police_europe_pcm select(pays, year, policiers_pcm) |>
rename(Pays = pays,
"Année" = year,
"Policiers pour 100 000 habitants" = policiers_pcm) |>
as_huxtable() |>
set_number_format(NA) |>
::theme_blue() huxtable
Pays | Année | Policiers pour 100 000 habitants |
---|---|---|
Monténégro | 2020 | 732 |
Serbie | 2015 | 598 |
Turquie | 2020 | 558 |
Croatie | 2020 | 526 |
Grèce | 2020 | 526 |
Macédoine du Nord | 2017 | 514 |
Bosnie-Herzégovine | 2020 | 487 |
Kosovo | 2020 | 456 |
Portugal | 2020 | 443 |
Malte | 2020 | 435 |
Bulgarie | 2020 | 421 |
Italie | 2020 | 400 |
Slovaquie | 2020 | 388 |
Hongrie | 2020 | 385 |
Albanie | 2020 | 382 |
Tchéquie | 2020 | 375 |
Chypre | 2020 | 371 |
Espagne | 2020 | 370 |
Autriche | 2020 | 358 |
Irlande | 2020 | 356 |
Slovénie | 2020 | 344 |
Belgique | 2020 | 337 |
Liechtenstein | 2020 | 324 |
Luxembourg | 2020 | 323 |
France | 2019 | 322 |
Estonie | 2020 | 306 |
Allemagne | 2020 | 301 |
Pays-Bas | 2020 | 290 |
Lituanie | 2020 | 281 |
Pologne | 2020 | 258 |
Roumanie | 2020 | 258 |
Lettonie | 2020 | 234 |
Royaume-Uni | 2016 | 224 |
Suisse | 2020 | 216 |
Suède | 2020 | 202 |
Danemark | 2020 | 194 |
Islande | 2020 | 175 |
Norvège | 2014 | 167 |
Finlande | 2020 | 136 |
Graphique
|>
police_europe_pcm mutate(pays = fct_reorder(pays, policiers_pcm)) |>
ggplot(aes(x = policiers_pcm, y = pays)) +
geom_bar(stat = "identity") +
labs(x = "Policiers pour 100 000 habitants",
y = "",
title = "Les Européens mieux protégés (?) au Sud et à l'Est") +
theme_minimal()
Citation
@online{boulakia2023,
author = {Boulakia, Théo and Mariot, Nicolas},
title = {Où y a-t-il le plus de policiers en Europe\,?},
date = {2023-06-25},
url = {https://l-attestation.github.io/exercices/policiers-europe/},
langid = {fr}
}