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).
polices_municipales_path = here("data", "polices_municipales.ods")download.file(url = "https://www.data.gouv.fr/fr/datasets/r/ad814337-074c-459b-add1-d78df9e6d85f",
destfile = polices_municipales_path)Les lire
pm = readODS::read_ods(polices_municipales_path, skip = 8, col_names = FALSE, .name_repair = janitor::make_clean_names) |>
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_com = pm |>
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).
CARTElette::charger_carte(destfile = here::here("data"),
COG = 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.
com_sf = st_read(here("data", "COM_2020_CARTElette.shp"), quiet = T) |>
janitor::clean_names() |>
select(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.
pm_com_sf = 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_dep = pm |>
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}
}