La France des polices municipales

Cartographier les initiatives sécuritaires locales
La Police des sorties
Auteur·rice·s

Théo Boulakia

Nicolas Mariot

Date de publication

25 juin 2023

Modifié

3 octobre 2024

Charger les principaux packages

library(here)
library(tidyverse)
library(huxtable)
library(fedmatch)
library(sf)

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))
Mise en garde

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

Avertissement

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

BibTeX
@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}
}
Veuillez citer ce travail comme suit :
Boulakia, Théo, and Nicolas Mariot. 2023. “La France des polices municipales.” June 25, 2023. https://l-attestation.github.io/exercices/polices-municipales/.