library(here)
library(tidyverse)
library(huxtable)
library(fedmatch)
library(sf)
Charger les principaux packages
Récupérer les données
Les effectifs des polices municipales par communes pour les années 2012 à 2021 ont été publiées par le Ministère de l’Intérieur sur le site data.gouv.fr.
Le code suivant télécharge le fichier de données dans un sous-dossier data (à ne faire qu’une fois, évidemment).
= here("data", "polices_municipales.ods") polices_municipales_path
download.file(url = "https://www.data.gouv.fr/fr/datasets/r/ad814337-074c-459b-add1-d78df9e6d85f",
destfile = polices_municipales_path)
Les lire
= readODS::read_ods(polices_municipales_path, skip = 8, col_names = FALSE, .name_repair = janitor::make_clean_names) |>
pm select(x, x_2, x_4:x_10) |>
rename(code_departement = x,
nom_departement = x_2,
nom_commune = x_4,
population = x_5,
municipaux = x_6,
asvp = x_7,
gardes_champetres = x_8,
maitres_chiens = x_9,
chiens_patrouille = x_10) |>
mutate(total = municipaux + gardes_champetres + asvp) |>
filter(!is.na(code_departement))
Pour être exploitées au niveau communal, ces données requièrent des recodages laborieux. Il n’y a pas de code postal pour les communes. Et aucune cohérence dans la manière d’écrire leurs noms (majuscules, minuscules, tirets et espaces, abréviations, etc.).
Recodage communes
Nettoyer le nom des communes.
= pm |>
pm_com filter(!str_detect(code_departement, "TOTAL")) |>
mutate(code_departement = if_else(code_departement %in% as.character(1:9),
str_c("0", code_departement),
code_departement),nom_commune_clean = stringi::stri_trans_general(nom_commune, "Latin-ASCII"),
nom_commune_clean = clean_strings(nom_commune_clean),
population = as.numeric(population)) |>
select(code_departement, nom_commune_clean, total)
glimpse(pm_com)
Rows: 4,524
Columns: 3
$ code_departement <chr> "01", "01", "01", "01", "01", "01", "01", "01", "01"…
$ nom_commune_clean <chr> "amberieu en bugey", "amberieux en dombes", "ambrona…
$ total <dbl> 8, 1, 1, 1, 3, 1, 1, 1, 7, 1, 3, 5, 1, 30, 1, 3, 1, …
Récupérer la couche cartographique
Télécharger la couche cartographique des communes en 2020 dans un sous-dossier data
du projet (à ne faire qu’une fois).
::charger_carte(destfile = here::here("data"),
CARTEletteCOG = 2020,
nivsupra = "COM")
Lire la couche cartographique et nettoyer le nom des communes de la même manière que dans la base des polices municipales. La population indiquée est celle comptabilisée par le recensement de 2017.
= st_read(here("data", "COM_2020_CARTElette.shp"), quiet = T) |>
com_sf ::clean_names() |>
janitorselect(insee_dep, insee_com, nom_com, population) |>
rename(code_departement = insee_dep,
code_commune = insee_com,
nom_commune = nom_com,
population_2017 = population) |>
mutate(nom_commune_clean = stringi::stri_trans_general(nom_commune, "Latin-ASCII"),
nom_commune_clean = clean_strings(nom_commune_clean)) |>
relocate(nom_commune_clean, .after = nom_commune)
glimpse(com_sf)
Rows: 34,968
Columns: 6
$ code_departement <chr> "32", "47", "38", "32", "62", "08", "32", "10", "42"…
$ code_commune <chr> "32216", "47033", "38225", "32009", "62890", "08018"…
$ nom_commune <chr> "Lourties-Monbrun", "Boudy-de-Beauregard", "Autrans-…
$ nom_commune_clean <chr> "lourties monbrun", "boudy de beauregard", "autrans …
$ population_2017 <dbl> 158, 414, 3000, 86, 188, 68, 92, 352, 916, 324, 12, …
$ geometry <MULTIPOLYGON [°]> MULTIPOLYGON (((0.5518489 4..., MULTIPO…
Jointure
Il y a des homonymes parmi les communes. Pour réduire les jointures multiples, on peut commencer par joindre par le nom “nettoyé” de la commune et le code du département. Mais attention, celui-ci n’est pas écrit de la même façon dans les deux bases de données.
= com_sf |>
pm_com_sf inner_join(pm_com, by = join_by(code_departement, nom_commune_clean))
Ce nettoyage nous permet de géolocaliser 4074 communes sur 4524.
Cartographier
On ne représente sur cette carte que les communes dont le ratio policiers municipaux et assimilés / habitants est supérieur à la moyenne des communes dotées d’une police municipale.
|>
pm_com_sf mutate(policier_par_habitant = total / population_2017) |>
filter(policier_par_habitant > mean(policier_par_habitant, na.rm = T)) |>
st_centroid() |>
ggplot() +
geom_sf(size = 1, alpha = 0.5, colour = "#E12634") +
theme_void()
Comptage par département
On reprend directement les calculs des auteurs de la base.
= pm |>
pm_dep filter(str_detect(code_departement, "TOTAL"),
!str_detect(code_departement, "NATIONAL")) |>
mutate(total = municipaux + gardes_champetres + asvp,
departement = str_remove(code_departement, "^TOTAL ")) |>
select(departement, total) |>
arrange(desc(total))
|>
pm_dep as_huxtable() |>
set_number_format(NA) |>
theme_orange()
departement | total |
BOUCHES-DU-RHÔNE | 1798 |
ALPES-MARITIMES | 1672 |
Var | 1266.5 |
HÉRAULT | 1183 |
NORD | 1085 |
HAUTS-DE-SEINE | 1070 |
PARIS | 1065 |
RHÔNE | 1035 |
SEINE-ET-MARNE | 965 |
SEINE-SAINT-DENIS | 889 |
GARD | 841 |
YVELINES | 829 |
VAL D’OISE | 794 |
HAUTE-GARONNE | 740 |
GIRONDE | 696 |
ESSONNE | 679 |
VAL-DE-MARNE | 663 |
VAUCLUSE | 609 |
PYRÉNÉES-ORIENTALES | 509 |
ISÈRE | 505 |
POLYNÉSIE FRANCAISE | 501 |
SEINE-MARITIME | 465 |
GUADELOUPE | 461 |
LOIRE | 424 |
LA RÉUNION | 412 |
LOIRE-ATLANTIQUE | 409 |
PAS-DE-CALAIS | 399 |
HAUTE-SAVOIE | 396 |
LOIRET | 385 |
MOSELLE | 375 |
OISE | 373 |
BAS-RHIN | 362 |
HAUT-RHIN | 325 |
MARTINIQUE | 321 |
AUDE | 288 |
CALVADOS | 287 |
SOMME | 285 |
CHARENTE-MARITIME | 279 |
DRÔME | 267 |
ILLE-ET-VILAINE | 263 |
NOUVELLE-CALÉDONIE | 254 |
PYRÉNÊES-ATLANTIQUES | 250 |
INDRE-ET-LOIRE | 248 |
MAYOTTE | 225 |
AIN | 223 |
MARNE | 214 |
PUY-DE-DÔME | 208 |
SAVOIE | 205 |
GUYANE | 201 |
MEURTHE-ET-MOSELLE | 194 |
MORBIHAN | 194 |
LANDES | 189 |
VENDÉE | 175 |
MAINE-ET-LOIRE | 159 |
DOUBS | 154 |
EURE | 143 |
TARN | 143 |
FINISTÈRE | 140 |
CÔTE D’OR | 131 |
EURE-ET-LOIR | 128 |
SAÔNE-ET-LOIRE | 124 |
AUBE | 119 |
AISNE | 118 |
CHER | 118 |
VOSGES | 116 |
HAUTE-VIENNE | 114 |
SARTHE | 111 |
ARDENNES | 103 |
CÔTE D’ARMOR | 103 |
MANCHE | 102 |
TARN-ET-GARONNE | 102 |
HAUTES-ALPES | 100 |
ARDÈCHE | 100 |
HAUTES-PYRÉNÉES | 99 |
Yonne | 99 |
LOT-ET-GARONNE | 93 |
ALPES DE HAUTE-PROVENCE | 92 |
DORDOGNE | 92 |
ALLIER | 91 |
CHARENTE | 89 |
LOIR-ET-CHER | 83 |
CORSE-DU-SUD | 75 |
VIENNE | 75 |
DEUX-SÈVRES | 74 |
TERRITOIRE DE BELFORT | 70 |
AVEYRON | 66 |
CORRÈZE | 56 |
JURA | 50 |
NIÈVRE | 49 |
INDRE | 44 |
HAUTE-LOIRE | 43 |
ARIÈGE | 42 |
HAUTE-CORSE | 42 |
ORNE | 42 |
GERS | 41 |
LOT | 37 |
HAUTE-SAÔNE | 25 |
MAYENNE | 22 |
MEUSE | 22 |
HAUTE-MARNE | 21 |
CANTAL | 17 |
LOZÈRE | 15 |
CREUSE | 3 |
SPM | 0 |
On peut s’interroger sur l’existence d’un demi-policier dans le Var…
Citation
@online{boulakia2023,
author = {Boulakia, Théo and Mariot, Nicolas},
title = {La France des polices municipales},
date = {2023-06-25},
url = {https://l-attestation.github.io/exercices/polices-municipales/},
langid = {fr}
}