1 - PRÉSENTATION DES DONNÉES ET CONTEXTUALISATION GÉNÉRALE

1.1 Packages nécessaires

# Librairies utilisées
library(sf)
library(cartography)
library(mapsf)
library(corrplot)
library(cowplot)
library(MTA)
library(readxl)
library(ggplot2)
library(FactoMineR) 
library(factoextra)
library(cluster)
library(reshape)
library(reshape2)
library(flows)
# NB : Pour le package flows, la version la plus récente est disponible ici :
# remotes::install_github("rCarto/flows") # ou # install.packages("mapsf")
# Pour obtenir une version plus ancienne (celle utilisée ici) : https://cran.r-project.org/src/contrib/Archive/flows/
# install.packages("packages/flows_1.1.1.tar.gz", repos=NULL, type="source")
library(sp)
library(knitr)
library(condformat) # https://cran.r-project.org/web/packages/condformat/vignettes/introduction.html
library(units)
library(stringr)
# library(dplyr)
library(questionr)
library(spdep) # Pour les matrices de contiguïté
library(rgeoda) # Pour les matrices de contiguïté
library(rmapshaper) # Pour calcul distance aux limites des départements

# Liste pour installer les packages si besoin :
# sf cartography mapsf readxl foreign dplyr flextable knitr stringr units condformat forcats ggplot2 rstatix questionr corrplot gtsummary broom GGally effects forestmodel ggeffects labelled cowplot spdep rgeoda

1.2 Import des couches géographiques consolidées et des données

Les données utilisées sont une compilation de données principalement socio-économiques, localisées. La source principale est l’INSEE. Pour plus de détails, cf. le Markdown “Communes nouvelles : préparation des données”. NB : Ont été exclues des analyses l’Outre-mer et la Corse, espaces non concernés par les communes nouvelles.

Les géométries sont ici importées.

geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE) 
geom_new <- st_read("data/geom.gpkg", layer = "geom_new", quiet = TRUE) 
geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE) 
geomCN_new <- st_read("data/geom.gpkg", layer = "geomCN_new", quiet = TRUE)  
dep <- st_read("data/geom.gpkg", layer = "dep", quiet = TRUE)

# Métadonnées
# Liste toutes les variables disponiles
variables_dispo <- as.data.frame(read_excel("data-raw/meta.xlsx", sheet = "ind_target"))
# Liste les variables marquées dans le fichier meta_budgets.xlsx comme nous intéressant
target <- subset(variables_dispo, variable_selec == "X")

Les données socio-économiques qui décrivent les communes en géographies 2011 et 2025 sont ici importées. On commence par extraire les communes ayant participé à la création d’une commune nouvelle, appelées ici communes fusionnantes (datafus2011), les communes nouvelles, avec les géométries au 1er janvier 2025 et caractérisées par les données à la géométrie 2011 agrégées (dataCN_new), ainsi que les communes, à la géométrie 2011, qui n’ont pas participé à la création d’une commune nouvelle (dataNfus2011)

load("data/refdata.Rdata")
datafus2011 <- subset(df2011, COM_NOUV == "OUI")
dataCN_new <- subset(df_new, COM_NOUV == "OUI")
dataNfus2011 <- subset(df2011, COM_NOUV == "NON") 

1.3 Jointure données / géométries

Dans un certain nombre de cas, il sera utile d’avoir, dans un même objet, les données et les géométries. Les données sont ici jointes aux couches géographiques d’intérêt.

geom2011 <- merge(geom2011, df2011, by = "CODGEO")
geom_new <- merge(geom_new, df_new, by = "CODGEO_new")
geomCN_new <- merge(geomCN_new, dataCN_new, by = "CODGEO_new")
geomfus2011 <- merge(geomfus2011, datafus2011, by = "CODGEO")

1.4 Définition de sous-ensembles pour les tests

Un certain nombre d’espaces peuvent être étudiés à part : certaines communes nouvelles car elles ont été l’objet d’une enquête qualitative (@bideau2017, @bideau2019), d’autres car elles sont sur des territoires très touchés par les fusions communales. Ces sous-ensembles sont cartographiés dans la section 1.7.

testEdC <- subset (geom2011, CODGEO_new == "61324" | CODGEO_new =="73150" | CODGEO_new == "73006")
testEdCSavoie <- subset (geom2011, CODGEO_new =="73150" | CODGEO_new == "73006")
testNormandie <- subset (geom2011, REG == "23" | REG == "25") # Haute et Basse Normandie
test49 <- subset (geom2011, CODE_DEPT == "49" ) # Département du Maine-et-Loire
testOuest <- subset (geom2011, REG == "23" | REG == "25"| REG == "53"| REG == "52") # Normandies, Bretagne, Pays-de-la-Loire


# couleurs <- c("darkblue", "red4")
couleurs <- c("#2b83ba", "red4")
# couleurs <- c("darkblue", "lightblue", "red4")
# couleurs <- c("#2b83ba",  "#fdae61", "#e31a1c")
# couleurs <- c("#2b83ba",  "#fdae61", "red4")

1.5 Analyse des corrélations

RY : pas sûr qu’il faille intégrer cette analyse à la fin. J’ai surtout créé ce bout de code pour réfléchir aux indicateurs à retenir pour les analyses ultérieures (et éviter les variables redondantes dans les CAH par exemple). Les résultats de ces graphiques montrent par exemple et sans surprise l’importante auto-corrélation des variables démographiques

tmp <- na.omit(datafus2011[,50:length(datafus2011)])

# Juste les communes fusionnées
tmp2 <- cor(tmp, method = "pearson")
res1 <- cor.mtest(tmp, conf.level = .99)


col <- c("#a50026","#d73027","#f46d43","#fdae61","#fee090","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695")

corrplot(tmp2, p.mat = res1$p, sig.level = .2, order = "hclust",
         tl.cex = 0.8, tl.col = "black")


corrplot(tmp2, method="color",cl.lim = c(-1,1), order = "hclust",
         col = col,
         tl.col = rgb(0,0,0),
         number.cex = 0.4,
         addCoef.col = rgb(0,0,0, alpha =0.6),
         addgrid.col = "white",
         title = "Analyse des corrélations",
         tl.cex=0.8,
         cl.cex = 0.6,
         mar=c(0,0,4,0))


# Communes n'ayant pas fusionné
tmp <- na.omit(dataNfus2011[,50:length(dataNfus2011)])

tmp2 <- cor(tmp, method = "pearson")
res1 <- cor.mtest(tmp, method = "pearson")

corrplot(tmp2, p.mat = res1$p, sig.level = .2, order = "hclust",
         tl.cex = 0.8, tl.col = "black")

col <- c("#a50026","#d73027","#f46d43","#fdae61","#fee090","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695")

corrplot(tmp2, method="color",cl.lim = c(-1,1), order = "hclust",
         col = col,
         tl.col = rgb(0,0,0),
         number.cex = 0.4,
         addCoef.col = rgb(0,0,0, alpha =0.6),
         addgrid.col = "white",
         title = "Analyse des corrélations",
         tl.cex=0.8,
         cl.cex = 0.6,
         mar=c(0,0,4,0))

1.6 Cartographie de localisation

par(mar=c(0,0,1.2,0))

# Localisation des communes nouvelles
layoutLayer(title = "Communes fusionnantes (2011-2025(01))", theme = "red.pal",
            author = "G. Bideau, 2025.",
            sources = "Sources : INSEE, IGN, 2026.", extent = dep)
plot(st_geometry(geomfus2011), col = "red", add = TRUE)
plot(st_geometry(dep), col = NA, add = TRUE)

# Nombre de fusions par départements
tmp <- aggregate(list(NUMBER_FUS = datafus2011[,"CODE_DEPT"]),
                 by = list(DEPT = datafus2011$CODE_DEPT),
                 FUN = length)
dep <- merge (dep, tmp, by.x = "CODE_DEPT", by.y = "DEPT", all.x = TRUE)


dep$NUMBER_FUS_rt <- (dep$NUMBER_FUS / sum(dep$NUMBER_FUS, na.rm = TRUE)) * 100 

layoutLayer(title = "Communes fusionnantes (2011-2025(01))", theme = "red.pal",
            author = "G. Bideau, 2025",
            sources = "Sources : INSEE, IGN, 2025", extent = dep)

plot(st_geometry(dep), col = NA, add = TRUE)

propSymbolsChoroLayer(x = dep, var = "NUMBER_FUS", var2 = "NUMBER_FUS_rt",
                      col = carto.pal(pal1 = "blue.pal", n1 = 3,
                                      pal2 = "red.pal", n2 = 3),
                      inches = 0.2, method = "q6",
                      border = "grey50", lwd = 1,
                      legend.var.pos = "topright", 
                      legend.var2.pos = "topleft",
                      legend.var2.values.rnd = 2,
                      legend.var2.title.txt = "Pourcentage des communes du\ndépartement ayant fusionné (%)",
                      legend.var.title.txt = "Nombre de fusions\ncommunales",
                      legend.var.style = "e",
                      add = TRUE)

# En fonction du nombre de communes fusionnantes
layoutLayer(title = "Communes fusionnantes (2011-2025)", #theme = "red.pal",
            author = "G. Bideau, 2025",
            sources = "Sources : INSEE, IGN, 2025", extent = dep)
choroLayer(x = dep , var = "NUMBER_FUS_rt",
           method = "quantile", nclass = 6,
           col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 3, n2 = 3),
           border = NA,
           legend.pos = "topright", legend.values.rnd = 2,
           legend.title.txt = "Pourcentage\nde communes\nfusionnantes",
           add = TRUE)
plot(st_geometry(dep), add = TRUE)
propSymbolsLayer(x = geomCN_new,
                 var = "NbrComFus", symbols ="circle",
                 col =  "red",
                 legend.pos = "topleft",
                 legend.title.txt = "Nombre de communes fusionnantes",
                 legend.style = "e",
                 inches = 0.1,
                 add = TRUE)

# En fonction du nombre de communes fusionnantes sans la trame départementale
layoutLayer(title = "Communes fusionnantes (2011-2025)", #theme = "red.pal",
            author = "G. Bideau, 2025",
            sources = "Sources : INSEE, IGN, 2025", extent = dep)
plot(st_geometry(dep), add = TRUE)
propSymbolsLayer(x = geomCN_new,
                 var = "NbrComFus", symbols ="circle",
                 col =  "red",
                 legend.pos = "topleft",
                 legend.title.txt = "Nombre de communes fusionnantes",
                 legend.style = "e",
                 inches = 0.1,
                 add = TRUE)

# Cartographie des zonages d'études choisis
# Savoie (dont communes enquêtées)
layoutLayer(title = "Communes fusionnantes (2011-2025) : les communes nouvelles (rouge) dont enquêtées (bleu) en Savoie", theme = "red.pal",
            author = "G. Bideau, R. Ysebaert, 2026.",
            sources = "Sources : INSEE, IGN, 2026.", extent = subset(geom_new, CODE_DEPT == "73"))
plot(st_geometry(subset(geom_new, CODE_DEPT == "73")), add = TRUE)
plot(st_geometry(subset(geomCN_new, CODE_DEPT == "73")), col = "red", add = TRUE)
plot(st_geometry(testEdCSavoie), col = "blue", add = TRUE)

# Normandie (dont commune enquêtée)
layoutLayer(title = "Communes fusionnantes (2011-2025) : les communes nouvelles (rouge) dont enquêtée (bleu) en Normandie", theme = "red.pal",
            author = "G. Bideau, R. Ysebaert, 2026.",
            sources = "Sources : INSEE, IGN, 2026.", extent = testNormandie)
plot(st_geometry(testNormandie), add = TRUE)
plot(st_geometry(subset(testNormandie, testNormandie$COM_NOUV == "OUI")), col = "red", add = TRUE)
plot(st_geometry(subset(geomCN_new, CODGEO_new == "61324")), col = "blue", border = NA, add = TRUE)

# Maine-et-Loire
layoutLayer(title = "Communes fusionnantes (2011-2025) : les communes nouvelles (rouge) en Maine-et-Loire", theme = "red.pal",
            author = "G. Bideau, R. Ysebaert, 2026.",
            sources = "Sources : INSEE, IGN, 2026.", extent = test49)
plot(st_geometry(test49), add = TRUE)
plot(st_geometry(subset(test49, COM_NOUV == "OUI")), col = "red", add = TRUE)

1.6bis Cartographie en fonction de la taille démographique

Cf. l’idée donnée ici : https://www.bnsp.insee.fr/ark:/12148/bc6p08tp83z/f1.pdf#page=2

# par(mfrow = c(1,1), mar=c(0,0,1.5,0))

# En fonction de la population de la commune fusionnante

choroLayer(x = geomfus2011 , var = "P09_POP",
           method = "quantile", nclass = 4,
           col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 2, n2 = 2),
           border = NA,
           legend.pos = "topleft", legend.values.rnd = 2,
           legend.title.txt = "Nombre d'habitants (2009,\nregroupement par quartiles)")
plot(st_geometry(dep), add = TRUE, lwd = 0.3)


layoutLayer(title = " ",# "Communes fusionnantes (2011-2024)\nen fonction de leur nombre d'habitants",
            author = "G. Bideau, 2024",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2024")

# On crée un tableau donnant, pour chaque département, la population moyenne des communes fusionnantes
tableau_dep <- as.data.frame(tapply(geomfus2011$P09_POP, INDEX = geomfus2011$CODE_DEPT, mean))
colnames(tableau_dep) <- c("moyenne_Cfus")
tableau_dep$median_Cfus <- tapply(geomfus2011$P09_POP, INDEX = geomfus2011$CODE_DEPT, median)
tableau_dep$CODE_DEPT <- row.names(tableau_dep)
tableau_dep$Nbr_Cfus <- table(geomfus2011$CODE_DEP)
tableau_dep <- merge(tableau_dep, dep[, c("CODE_DEPT", "LIBELLE")], by = "CODE_DEPT", all.x = TRUE, all.y = FALSE)

tableau_dep_tt <- as.data.frame(tapply(geom2011$P09_POP, INDEX = geom2011$CODE_DEPT, mean))
colnames(tableau_dep_tt) <- c("moyenne")
tableau_dep_tt$median <- tapply(geom2011$P09_POP, INDEX = geom2011$CODE_DEPT, median)
tableau_dep_tt$CODE_DEPT <- row.names(tableau_dep_tt)
tableau_dep <- merge(tableau_dep, tableau_dep_tt, by = "CODE_DEPT", all.x = TRUE, all.y = FALSE)

tableau_pr_publi <- subset(tableau_dep, tableau_dep$Nbr_Cfus > 40)
tableau_pr_publi <- tableau_pr_publi[order(-tableau_pr_publi$moyenne_Cfus),]

kable(tableau_pr_publi[, c("LIBELLE", "Nbr_Cfus", "moyenne_Cfus", "moyenne", "median_Cfus", "median")],
      col.names = c("Département", "Nombre de communes fusionnantes", "Population moyenne des communes fusionnantes", "Population communale moyenne", "Population médiane des communes fusionnantes", "Population communale médiane"), digits = 0)
Département Nombre de communes fusionnantes Population moyenne des communes fusionnantes Population communale moyenne Population médiane des communes fusionnantes Population communale médiane
76 Vendée 48 2416 2221 1289.5 1288.0
19 Côtes-d’Armor 46 1789 1575 937.5 861.0
45 Maine-et-Loire 225 1339 2149 978.0 1030.0
46 Manche 206 1128 828 379.5 381.0
1 Ain 46 908 1405 350.0 756.0
68 Savoie 48 894 1348 443.5 549.0
73 Deux-Sèvres 78 836 1201 427.0 579.0
70 Seine-Maritime 50 825 1678 462.5 494.0
24 Eure 127 720 863 377.0 416.0
25 Eure-et-Loir 57 634 1056 421.0 430.0
12 Calvados 225 598 964 317.0 340.0
14 Charente 69 588 870 360.0 387.0
21 Dordogne 78 571 740 270.5 359.0
22 Doubs 52 559 884 349.0 255.5
57 Orne 155 470 579 229.0 244.0
36 Jura 81 416 480 161.0 212.5
80 Yonne 43 392 755 307.0 354.0
43 Lot 42 352 510 210.5 267.0
44 Lozère 50 303 417 179.0 181.0
# En fonction de la population de la commune nouvelle
choroLayer(x = geomCN_new , var = "P09_POP",
           method = "quantile", nclass = 4,
           col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 2, n2 = 2),
           border = NA,
           legend.pos = "topleft", legend.values.rnd = 2,
           legend.title.txt = "Nombre d'habitants (2009,\nregroupement par quartiles)")
plot(st_geometry(dep), add = TRUE, lwd = 0.3)
plot(st_geometry(geomCN_new), add = TRUE, lwd = 0.2)

layoutLayer(title = "",# "Communes nouvelles (2011-2024)\nen fonction de leur nombre d'habitants",
            author = "G. Bideau, 2024",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2024")

# On crée un tableau donnant, pour chaque département, la population moyenne des communes nouvelles
tableau_dep <- as.data.frame(tapply(geomCN_new$P09_POP, INDEX = geomCN_new$CODE_DEPT_new, mean))
colnames(tableau_dep) <- c("moyenne_CN")
tableau_dep$median_CN <- tapply(geomCN_new$P09_POP, INDEX = geomCN_new$CODE_DEPT_new, median)
tableau_dep$CODE_DEPT <- row.names(tableau_dep)
tableau_dep$Nbr_Cfus <- table(geomfus2011$CODE_DEP) # On garde le nombre de communes fusionnantes pour faciliter les comparaisons entre les deux tableaux
tableau_dep <- merge(tableau_dep, dep[, c("CODE_DEPT", "LIBELLE")], by = "CODE_DEPT", all.x = TRUE, all.y = FALSE)

tableau_dep_tt <- as.data.frame(tapply(geom_new$P09_POP, INDEX = geom_new$CODE_DEPT_new, mean))
colnames(tableau_dep_tt) <- c("moyenne")
tableau_dep_tt$median <- tapply(geom_new$P09_POP, INDEX = geom_new$CODE_DEPT_new, median)
tableau_dep_tt$CODE_DEPT <- row.names(tableau_dep_tt)
tableau_dep <- merge(tableau_dep, tableau_dep_tt, by = "CODE_DEPT", all.x = TRUE, all.y = FALSE)

tableau_pr_publi <- subset(tableau_dep, tableau_dep$Nbr_Cfus > 40)
tableau_pr_publi <- tableau_pr_publi[order(-tableau_pr_publi$moyenne_CN),]

kable(tableau_pr_publi[, c("LIBELLE", "Nbr_Cfus", "moyenne_CN", "moyenne", "median_CN", "median")],
      col.names = c("Département", "Nombre de communes nouvelles", "Population moyenne des communes nouvelles", "Population communale moyenne", "Population médiane des communes nouvelles", "Population communale médiane"), digits = 0)
Département Nombre de communes nouvelles Population moyenne des communes nouvelles Population communale moyenne Population médiane des communes nouvelles Population communale médiane
45 Maine-et-Loire 225 7922 4431 5631.5 1569.5
76 Vendée 48 5661 2481 3210.0 1447.0
19 Côtes-d’Armor 46 4841 1708 3110.0 925.0
46 Manche 206 4658 1120 2508.5 444.0
70 Seine-Maritime 50 3752 1771 2613.0 506.5
12 Calvados 225 2977 1294 1662.0 407.5
68 Savoie 48 2684 1506 2697.5 612.0
73 Deux-Sèvres 78 2610 1454 1795.0 713.5
24 Eure 127 2473 996 1385.0 444.0
57 Orne 155 2348 767 2119.0 276.0
1 Ain 46 2320 1506 898.5 806.0
25 Eure-et-Loir 57 2125 1172 1443.0 477.0
21 Dordogne 78 1857 819 1216.5 383.0
14 Charente 69 1690 979 1203.5 428.0
80 Yonne 43 1533 812 1067.0 381.0
22 Doubs 52 1383 933 1337.0 261.0
36 Jura 81 1163 531 826.0 235.0
43 Lot 42 1055 556 971.0 290.0
44 Lozère 50 890 508 579.0 209.0

1.6ter Cartographie en fonction de la taille démographique, rapportée aux autres communes

On regarde la position des communes fusionnantes puis des communes nouvelles vis-à-vis des communes françaises

par(mfrow = c(1,2), mar=c(0,0,1.2,0))

# Création des données concernant les quantiles, mais en s'appuyant sur les données de l'ensemble des communes françaises
geomfus2011$P09_POP_quantiles <- as.factor(cut(geomfus2011$P09_POP,
                                     breaks=c(quantile(geom2011$P09_POP, probs=seq(0, 1, 1/6), na.rm = TRUE))))
geomCN_new$P09_POP_quantiles <- as.factor(cut(geomCN_new$P09_POP,
                                     breaks=c(quantile(geom_new$P09_POP, probs=seq(0, 1, 1/6), na.rm = TRUE))))

# En fonction de la population de la commune fusionnante

typoLayer(x = geomfus2011 , var = "P09_POP_quantiles",
          border = NA,
          legend.values.order = levels(geomfus2011$P09_POP_quantiles),
          col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 3, n2 = 3),
          # col = carto.pal(pal1 = "red.pal", n1 = 5),
          legend.pos = "topleft",
          legend.title.txt = "Situation au sein\ndes quantiles des\ncommunes françaises")
plot(st_geometry(dep), add = TRUE, lwd = 0.3)


layoutLayer(title = "Communes fusionnantes (2011-2025)\nen fonction de leur nombre d'habitant",
            author = "G. Bideau, 2025",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2025")


# En fonction de la population de la commune nouvelle
typoLayer(x = geomCN_new , var = "P09_POP_quantiles",
          col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 3, n2 = 3),
          border = NA,
          legend.values.order = levels(geomCN_new$P09_POP_quantiles),
          legend.pos = "topleft",
          legend.title.txt = "Situation au sein\ndes quantiles des\ncommunes françaises")
plot(st_geometry(dep), add = TRUE, lwd = 0.3)
plot(st_geometry(geomCN_new), add = TRUE, lwd = 0.2)

layoutLayer(title = "Communes nouvelles (2011-2025)\nen fonction de leur nombre d'habitant",
            author = "G. Bideau, 2025",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2025")

On voit bien que les communes nouvelles sont bien davantage dans la strate supérieure. Mais il ne faut pas croire non plus que seules de petites communes fusionnent, ce n’est pas le cas.

1.7 Analyse multiscalaire de la position des communes nouvelles

Pour les xx ratios sélectionnés, nous souhaitons ici évaluer la position des communes nouvelles dans différents contextes spatiaux.

Pour chaque commune française nous calculons grâce au package MTA (@ysebaert2019a) et pour l’ensemble des indicateurs les déviations suivantes. La valeur 100 correspondant à la moyenne du contexte (définis par un rapport entre le numérateur et le dénominateur) :

  • Déviation à la moyenne nationale (devgen).
  • Déviation à la moyenne du département d’appartenance de la commune (devdep).
  • Déviation à la moyenne de la catégorie d’aire urbaine d’appartenance de la commune (devcatau).
  • Déviation à la moyenne des communes situées à moins de 10km des communes

Dans chaque cas, nous différencions les communes fusionnantes des autres (respectivement suffixes fus ou Nfus).

# Transformation en NA des valeurs qui tendent vers l'infini 
geom2011 <- st_set_geometry(geom2011, NULL)
geom2011 <- do.call(data.frame,lapply(geom2011, function(x) replace(x, is.infinite(x),NA)))

# Calculs déviations MTA pour caractériser la position des indicateurs dans différents contextes
ratio <- as.data.frame(read_excel("data-raw/meta.xlsx", sheet = "ratios"))

# Compilation des ratios pour les communes 2011
# Déviation à la moyenne française
for (i in 1:nrow(ratio)){
  geom2011[paste0(ratio[i,"CODE"],"_DEV_GEN")] <-gdev(geom2011, 
                                                      var1 = ratio[i, "Numerator_Code"],
                                                      var2 = ratio[i, "Denominator_Code"],
                                                      type = "rel")
}

# Déviation au département d'appartenance
for (i in 1:nrow(ratio)){
  geom2011[paste0(ratio[i,"CODE"],"_DEV_DEP")] <-tdev(geom2011, 
                                                      var1 = ratio[i, "Numerator_Code"],
                                                      var2 = ratio[i, "Denominator_Code"],
                                                      type = "rel",
                                                      key = "CODE_DEPT")
}

# Déviation à la catégorie d'aire urbaine d'appartenance
for (i in 1:nrow(ratio)){
  geom2011[paste0(ratio[i,"CODE"],"_DEV_CATAU")] <-tdev(geom2011, 
                                                      var1 = ratio[i, "Numerator_Code"],
                                                      var2 = ratio[i, "Denominator_Code"],
                                                      type = "rel",
                                                      key = "CATAEU2010")
}

# Déviation aux unités voisines (moins de 10 km) > Excessivement coûteux en calcul.
# Nécessite davantage d'investigations...

# Calcul matrice de distance > peut être à intégrer à dataprep si on veut 
# se servir de cette matrice de distance à l'avenir car très long à calculer
# st_agr(geom2011) = "constant"
# x.pt <- sf::st_centroid(geom2011, of_largest_polygon = TRUE)
# distmat <- sf::st_distance(x.pt, by_element = FALSE)
# colnames(distmat) <- x.pt[["CODGEO"]]
# rownames(distmat) <- x.pt[["CODGEO"]]
# attr(distmat, "units") <- NULL
# class(distmat) <- setdiff(class(distmat),"units")
# distmat[distmat <= 10000] <- 1
# distmat[distmat > 10000] <- 0
# 
# try(save(distmat, file = "data/distMat.Rdata"))

# for (i in 1:nrow(ratio)){
#   geom2011[paste0(ratio[i,"CODE"],"_DEV_10K")] <-sdev(geom2011, 
#                                                       var1 = ratio[i, "Numerator_Code"],
#                                                       var2 = ratio[i, "Denominator_Code"],
#                                                       type = "rel",
#                                                       dist = 1,
#                                                       mat = distmat)
# }



# Synthèse déviation générale
devgen <- geom2011[,endsWith(colnames(geom2011), "DEV_GEN")]
devgen <- cbind(devgen, geom2011$COM_NOUV)
colnames(devgen)[length(devgen)] <- "COM_NOUV"
# Médiane des communes non fusionnantes
devgenNfus <- devgen[devgen$COM_NOUV == "NON",]
devgenfus <- devgen[devgen$COM_NOUV == "OUI",]
devgenNfus <- as.data.frame(apply(devgenNfus[,1:length(devgenNfus)-1], 2, median, na.rm = TRUE))
devgenfus <- as.data.frame(apply(devgenfus[,1:length(devgenfus)-1], 2, median, na.rm = TRUE))

# Synthèse déviation départements
devdep <- geom2011[,endsWith(colnames(geom2011), "DEV_DEP")]
devdep <- cbind(devdep, geom2011$COM_NOUV)
colnames(devdep)[length(devdep)] <- "COM_NOUV"
# Médiane des communes non fusionnantes
devdepNfus <- devdep[devdep$COM_NOUV == "NON",]
devdepfus <- devdep[devdep$COM_NOUV == "OUI",]
devdepNfus <- as.data.frame(apply(devdepNfus[,1:length(devdepNfus)-1], 2, median, na.rm = TRUE))
devdepfus <- as.data.frame(apply(devdepfus[,1:length(devdepfus)-1], 2, median, na.rm = TRUE))


# Synthèse déviation catégories aires urbaines
devcatau <- geom2011[,endsWith(colnames(geom2011), "DEV_CATAU")]
devcatau <- cbind(devcatau, geom2011$COM_NOUV)
colnames(devcatau)[length(devcatau)] <- "COM_NOUV"
# Médiane des communes non fusionnantes
devcatauNfus <- devcatau[devcatau$COM_NOUV == "NON",]
devcataufus <- devcatau[devcatau$COM_NOUV == "OUI",]
devcatauNfus <- as.data.frame(apply(devcatauNfus[,1:length(devcatauNfus)-1], 2, median, na.rm = TRUE))
devcataufus <- as.data.frame(apply(devcataufus[,1:length(devcataufus)-1], 2, median, na.rm = TRUE))

Ces éléments nous permettent de comparer la déviation à la moyenne des communes fusionnantes et des communes inchangées. On peut, d’ailleurs, calculer la différence entre ces éléments.

Le tableau suivant propose une synthèse des données ainsi construites. Les couleurs sont construites en fonction des minima et maxima des valeurs de chaque partie du tableau (déviations et différences).

           Différence (%) entre communes nouvelles et communes inchangées concernant la déviation à la moyenne française 
                                                                                                                   29.64 
      Différence (%) entre communes nouvelles et communes inchangées concernant la déviation à la moyenne départementale 
                                                                                                                    5.32 

Différence (%) entre communes nouvelles et communes inchangées concernant la déviation aux mêmes catégories d’aires urbaines 6.95 Différence (%) entre communes nouvelles et communes inchangées concernant la déviation à la moyenne française -13.57 Différence (%) entre communes nouvelles et communes inchangées concernant la déviation à la moyenne départementale -10.07 Différence (%) entre communes nouvelles et communes inchangées concernant la déviation aux mêmes catégories d’aires urbaines -9.84

Le premier élément remarquable dans ce tableau est la proximité entre les communes fusionnantes et les communes inchangées concernant la déviation à la moyenne, qu’elle soit française et encore plus départementale ou liée à la catégorie d’aire urbaine. Cependant, certaines variables sortent du lot et pointent une certaine spécificité des communes nouvelles, que ce soit en comparant à la moyenne française, départementale ou de ZAU : la part des agriculteurs (ou de l’agriculture, sur-représentation), la part des ouvriers (ou de l’industrie, sur-représentation) et la part des actifs travaillant dans leur commune (sous-représentation). Sont également sous-représentés des éléments comme la part de la construction, de l’administration, des professions intermédaires et des cadres. Cela dessine le profil de communes fusionnantes globalement proche du profil moyen des communes françaises mais ayant comme spécificités des populations plus agricoles, plus ouvrières et, souvent, travaillant davantage hors de leur commune d’habitation.

1.8 Graphique des fusions en fonction du temps

Plusieurs vagues de fusions peuvent être notées depuis la création du statut de communes nouvelles.

Le graphique ci-dessous représente le nombre de communes participant à une fusion.

Dans le premier graphique, les fusions du 1er janvier de l’année n sont rattachées à l’année n-1 (donc, pour l’année 2019 par exemple, du 2 janvier 2019 au 1er janvier 2020 inclus). Cela s’explique par le faite que de très nombreuses fusions sont décidées en amont pour prendre effet au 1er janvier de l’année suivante. Dans ce cas, elle sont considérées comme existantes pour toute l’année suivante.

Le second graphique, pour être complet, présente les données en fonction de l’année d’effectivité (1er janvier 2019 rattaché à l’année 2019).

Cette distinction est particulièrement importante pour l’année 2019 justement, puisque le nombre important de fusions associé à cette année est lié à des fusions au 1er janvier 2019, donc avant le vote de la loi du 1er août.

datafus2011$FusDate <- as.Date(datafus2011$FusDate, tryFormats = "%Y-%m-%d")

datafus2011$FusDateAnnee <- cut(datafus2011$FusDate,
                              breaks = as.Date(c("2011-1-1", "2012-1-2", "2013-1-2", "2014-1-2", "2015-1-2", "2016-1-2", "2017-1-2","2018-1-2", "2019-1-2", "2020-1-2", "2021-1-2", "2022-1-2", "2023-1-2", "2024-1-2")), 
                        labels = c("2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023")) # NB : On intègre le 1er janvier d'une année n à l'année précédente n-1

table(datafus2011$FusDateAnnee)
## 
## 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 
##    2   29    2   37 1082  653   91  600    6    5   19   18   22
time_serie <- data.frame(table(datafus2011$FusDateAnnee))

par(bg = "darkgrey", fg = "white", lwd = 2)

barplot(time_serie$Freq,  xlab = " ", ylab = "Nombre de communes fusionnantes", main = "Nombre de communes fusionnantes en fonction de l'année de décision\n(1er janvier de l'année n rattaché à l'année n-1)", ylim = c(0, 2000), names.arg = time_serie$Var1)
grid(nx=0, ny = 10, col="gray", lwd=2)

# Indication d'éléments dans le graphique.
arrows(0.1, 1500, 0.1, 100, length = 0.10, angle = 30,
       code = 2, col = "black", lty = par("lty"),
       lwd = par("lwd"))
text( -0.4, 1700 , labels = "Loi du 16 décembre 2010\ncréant le statut de\n« commune nouvelle »", col = "black", cex = 0.9, pos = 4, adj = c(1, 1))

arrows(3.7, 600, 3.7, 100, length = 0.10, angle = 30,
       code = 2, col = "black", lty = par("lty"),
       lwd = par("lwd"))
text( 3.7, 1000 , labels = "Premières incitations\nfiscales (art. 133,\nloi de finances pour 2014)", col = "black", cex = 0.9, pos = 1, adj = c(1, 1))

arrows(5.3, 1300, 5.3, 1150, length = 0.10, angle = 30,
       code = 2, col = "black", lty = par("lty"),
       lwd = par("lwd"))
text(5.3, 1800 , labels = "Dotation globale de\nfonctionnement\nmajorée de 5%\n(loi du 16 mars 2015)", col = "black", cex = 0.9, pos = 1, adj = c(1, 1))

arrows(10.3, 1200, 10.3, 100, length = 0.10, angle = 30,
       code = 2, col = "black", lty = par("lty"),
       lwd = par("lwd"))
text( 10, 1500 , labels = "Loi du 1er août 2019\nmodifiant l'incitation\nfiscale (6€ par habitant)\net créant le statut de\ncommune-communauté", col = "black", cex = 0.9, pos = 4, adj = c(1, 1))

datafus2011$FusDateAnnee_effectivite <- cut(datafus2011$FusDate,
                        breaks = as.Date(c("2011-1-1", "2012-1-1", "2013-1-1", "2014-1-1", "2015-1-1", "2016-1-1", "2017-1-1","2018-1-1", "2019-1-1", "2020-1-1", "2021-1-1", "2022-1-1", "2023-1-1", "2024-1-1", "2025-1-1")),
                        labels = c("2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2025")) # Si on utilise l'année (1er janvier laissé dans l'année concernée)

table(datafus2011$FusDateAnnee_effectivite)
## 
## 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2025 
##    0    2   31    0   46 1165  564   90  604    0    5   19   18   22
time_serie <- data.frame(table(datafus2011$FusDateAnnee_effectivite))

par(bg = "darkgrey",fg = "white", lwd = 2)
par(bg = "white",fg = "gray", lwd = 2)

barplot(time_serie$Freq,  xlab = " ", ylab = "Nombre de communes fusionnantes", main = "Nombre de communes fusionnantes en fonction de l'année d'effectivité", ylim = c(0, 2000), names.arg = time_serie$Var1)
grid(nx=0, ny = 10, col="gray", lwd=2)

# Indication d'éléments dans le graphique.
arrows(0.1, 1500, 0.1, 100, length = 0.10, angle = 30,
       code = 2, col = "black", lty = par("lty"),
       lwd = par("lwd"))
text( -0.4, 1700 , labels = "Loi du 16 décembre 2010\ncréant le statut de\n« commune nouvelle »", col = "black", cex = 0.9, pos = 4, adj = c(1, 1))

arrows(3.5, 600, 3.5, 100, length = 0.10, angle = 30,
       code = 2, col = "black", lty = par("lty"),
       lwd = par("lwd"))
text( 3.5, 1000 , labels = "Premières incitations\nfiscales (art. 133,\nloi de finances\npour 2014)", col = "black", cex = 0.9, pos = 1, adj = c(1, 1))

arrows(5.3, 1300, 5.3, 100, length = 0.10, angle = 30,
       code = 2, col = "black", lty = par("lty"),
       lwd = par("lwd"))
text(5.3, 1800 , labels = "Dotation globale de\nfonctionnement\nmajorée de 5%\n(loi du 16 mars 2015)", col = "black", cex = 0.9, pos = 1, adj = c(1, 1))

arrows(10.3, 1200, 10.3, 700, length = 0.10, angle = 30,
       code = 2, col = "black", lty = par("lty"),
       lwd = par("lwd"))
text( 10, 1700 , labels = "Loi du 1er août 2019\nmodifiant l'incitation\nfiscale (6€ par habitant)\net créant le statut de\ncommune-communauté", col = "black", cex = 0.9, pos = 1, adj = c(1, 1))

arrows(15.6, 700, 15.6, 100, length = 0.10, angle = 30,
       code = 2, col = "black", lty = par("lty"),
       lwd = par("lwd"))
text( 15.6, 1200 , labels = "Dotation d'amorçage\nrevalorisée et dotation\nde garantie sans limite\nde temps (loi de\nfinances pour 2024)", col = "black", cex = 0.9, pos = 1, adj = c(1, 1))

Cette chronologie peut être complétée par des éléments concernant les évolutions législatives :

  • Loi du 16 décembre 2010 créant le statut de commune nouvelle

  • Premières incitations fiscales (art. 133 de la loi de Finances pour 2014)

  • Dotation globale de fonctionnement majorée de 5 % (loi du 16 mars 2015)

  • Loi du 1er août 2019 créant le statut de commune-communauté

  • Loi de Finances pour 2020 créant une incitation fiscale spécifique (6€ par habitant)

Plusieurs vagues de fusions peuvent être notées depuis la création du statut de communes nouvelles.

La première va du 1er janvier 2011 au 1er janvier 2015 et concerne 70 communes fusionnantes.

La seconde va du 2 janvier 2015 au 1er janvier 2016 et concerne 1085 communes.

La troisième va du 2 janvier 2016 au 1er janvier 2017 et concerne 658 communes.

La quatrième va du 2 janvier 2017 au 1er janvier 2017 et concerne 91 communes.

La cinquième va du 2 janvier 2018 au 1er janvier 2020 et concerne 608 communes.

La sixième va du 2 janvier 2020 au 1er janvier 2021 et concerne 5 communes. [NB : À compléter avec les communes créées depuis.]

datafus2011$FusDate <- as.Date(datafus2011$FusDate, tryFormats = "%Y-%m-%d")
dev.off()
## null device 
##           1
time_serie_phas <- data.frame(table(datafus2011$FusPhas))
barplot(time_serie_phas$Freq, names.arg = time_serie_phas$Var1)

On peut également représenter les fusions en fonction de leur date exacte

time_serie <- data.frame(table(datafus2011$FusDate)) # Si on utilise la date exacte
time_serie$Var1 <- as.Date(time_serie$Var1, tryFormats = "%Y-%m-%d")


par(bg = "darkgrey", fg = "white", lwd = 2)
plot(time_serie$Var1, time_serie$Freq, pch = 20, cex = 1.5, col = "black", xlab = "Date exacte (jour)",
ylab = "Nombre de communes fusionnantes", main = "Nombre de communes fusionnantes en fonction de la date exacte d'effectivité", ylim = c(0, 2000))
grid(lwd=2)
lines(time_serie$Var1, time_serie$Freq, col = 2, lwd = 2)

1.9 Cartographie par phases

col <- c("#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027", "#a50026")  # Échelle rouge vers le plus foncé
col <- c("#ffffbf", "#e0f3f8","#abd9e9","#74add1","#4575b4","#313695") # Échelle bleue vers le plus foncé
col <- c("#a50026","#d73027","#f46d43","#fdae61","#fee090", "#ffffbf") # Échelle rouge vers le plus clair
plot(st_geometry(dep), border = "#1A1A19", col = "white", lwd = 1)
typoLayer(x = geomfus2011, var = "FusPhas",  
          col=col,
          border = NA, 
          legend.title.cex = 0.7,
          legend.values.cex = 0.6,
          # 
          legend.pos = "left", 
          legend.values.order = c("Phase 1", "Phase 2", "Phase 3", "Phase 4", "Phase 5", "Phase 6"),
          add = T)

layoutLayer(title = "Communes fusionnantes (2012-2025) par phases",
            author = "G. Bideau",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2025")

1.10 La population des communes fusionnantes

La taille est souvent considérée comme le premier facteur menant à une rationalisation de l’échelon communal par fusion. Les municipalités sont effectivement une maille héritée des paroisses, territoires du quotidien religieux, ayant perdu de leur sens dans le cadre des grandes dynamiques démographiques du XIXe et XXe siècle et n’étant plus nécessairement adaptées aux compétences communales. On pourrait alors s’attendre à une proportion de communes fusionnantes bien plus importante parmi les petites communes. On compare ici la proportion des communes en fonction de leur taille, en mettant en parallèle l’ensemble des communes françaises et les communes fusionnantes.

# Moyenne et médiane de l'ensemble des communes-françaises
mean(df2011$P09_POP)
## [1] 1716.749
median(df2011$P09_POP)
## [1] 426
# Moyenne et médiane des communes fusionnantes
mean(datafus2011$P09_POP)
## [1] 1012.266
median(datafus2011$P09_POP)
## [1] 404
PopCom <- df2011$P09_POP
PopCom <- cut(PopCom, breaks = c(-1,200,500,1000, 5000, 10000, 2230000))
levels(PopCom)<-c("moins de 200 habitants", "200-500 habitants", "500-1000 habitants", "1000-5000 habitants", "5000-10000 habitants", "plus de 10000 habitants")
levels(PopCom)<-c("moins de 200", "200-500", "500-1000", "1000-5000", "5000-10000", "plus de 10000")
table (PopCom)
## PopCom
##  moins de 200       200-500      500-1000     1000-5000    5000-10000 
##          9377         10469          6948          7480          1046 
## plus de 10000 
##           887
# Pourcentage de communes de moins de 200 habitants avant la fusion
table (PopCom)[1] / length (PopCom)
## moins de 200 
##    0.2589759
# Pourcentage de communes de moins de 200 habitants après la fusion
PopCom_new <- df_new$P09_POP
PopCom_new <- cut(PopCom_new, breaks = c(-1,200,500,1000, 5000, 10000, 2230000))
levels(PopCom_new)<-c("moins de 200 habitants", "200-500 habitants", "500-1000 habitants", "1000-5000 habitants", "5000-10000 habitants", "plus de 10000 habitants")
levels(PopCom_new)<-c("moins de 200", "200-500", "500-1000", "1000-5000", "5000-10000", "plus de 10000")
table (PopCom_new)
## PopCom_new
##  moins de 200       200-500      500-1000     1000-5000    5000-10000 
##          8720          9669          6606          7403          1082 
## plus de 10000 
##           898
table (PopCom_new)[1] / length (PopCom_new)
## moins de 200 
##    0.2536432
tabcont<-table(df2011$FUSION, PopCom)

# Test chi²
tab.chi2 <- chisq.test(tabcont)
tab.chi2
## 
##  Pearson's Chi-squared test
## 
## data:  tabcont
## X-squared = 57.647, df = 5, p-value = 3.719e-11
tab <- round(100*prop.table(tabcont,margin=1),2) # Pourcentages, le total se fait par lignes

# Pour avoir un graphique
prbarplot <- as.data.frame(tab)
ggplot(data = prbarplot, aes(x = PopCom, y = Freq, fill = Var1)) +
  geom_bar(stat = "identity", position=position_dodge()) +
  theme(axis.text.x = element_text(angle = 45, hjust=1), legend.position = c(0.8, 0.85)) +
  scale_x_discrete("Nombre d'habitants") + 
  scale_y_continuous("Part du groupe de communes (%)") +
  # scale_fill_manual("Communes\nfusionnantes", values = couleurs) +
  scale_fill_manual(labels = c("Communes inchangées", "Communes fusionnantes"), values = couleurs) +
  labs(fill = NULL)

# Proportion sur l'ensemble des communes françaises
Ensemble <- round(100* table(PopCom) / length(PopCom),2)
tab <- rbind(tab, Ensemble)

# Pour transposer (lignes deviennent colonnes et vice versa)
tab <- t(tab)
Total <- apply(tab, 2, sum)
tab <- rbind (tab, Total)

kable(tab, row.names = T, digits = 2, caption = "Taille des communes (nombre d'habitants) et fusions")
Taille des communes (nombre d’habitants) et fusions
NON OUI Ensemble
moins de 200 25.94 25.36 25.90
200-500 28.66 32.05 28.91
500-1000 19.14 19.76 19.19
1000-5000 20.68 20.40 20.66
5000-10000 3.00 1.53 2.89
plus de 10000 2.57 0.90 2.45
Total 99.99 100.00 100.00
# col.names = c("Moins de 200", "200-500", "500-1 000", "1 000-5 000", "5000-10 000", "Plus de 10 000", "Total"

rm(tab, table, tabcont, Ensemble)

1.11 Quelques statistiques basiques

1.12 Communes nouvelles et périmètres de fusions

NB : Pour l’appartenance au 1er janvier 2025, pas d’information autres que les appartenances administratives (région, arrondissement, etc.). J’espère que cela viendra rapidement (note au 14/03/2025).

# Création d'un tableau pour l'appartenance de toutes les communes ayant créé une commune nouvelle
variables_appart <- c("CODGEO", "LIBGEO", "CODGEO_new", "LIBGEO_new", "CODE_DEPT", "CATAEU2010", "REG", "ARR", "CV", "UU2010", "AU2010", "ZE2010", "EPCI", "ChefLieu", "superficie")

AppartComFus <- datafus2011[, variables_appart]
AppartCom <- df2011[, c(variables_appart)]

# NB : Différence due à L'Oudon

1.12.1 Communes fusionnantes au sein des EPCI

# Nombre de communes ayant fusionné dans chaque EPCI, rapporté au nombre de communes total
# En rapide :
EPCIComNvll <- merge(data.frame(table(AppartComFus$EPCI)),
                     data.frame(table(AppartCom$EPCI)), by = "Var1", all.x = TRUE)
# En développé :
# EPCINbrFus <- data.frame(table(AppartComFus$EPCI))
# EPCINbrCom <- data.frame(table(AppartCom$EPCI))
# EPCIComNvll <- merge(EPCINbrFus, EPCINbrCom, by = "Var1", all.y = TRUE)

# Opérations pour créer la nouvelle donnée :
EPCIComNvll <- rename.variable(EPCIComNvll, "Freq.x", "NombreCommunesFusionnant")
EPCIComNvll <- rename.variable(EPCIComNvll, "Freq.y", "NombreCommunesTotal")
EPCIComNvll <- rename.variable(EPCIComNvll, "Var1", "EPCI")
EPCIComNvll$NombreCommunesFusionnant [is.na(EPCIComNvll$NombreCommunesFusionnant)] <- 0
EPCIComNvll$RatioComFus = EPCIComNvll$NombreCommunesFusionnant / EPCIComNvll$NombreCommunesTotal * 100
# On retire les communes n'appartenant pas à un EPCI
EPCIComNvll <- subset (EPCIComNvll, EPCIComNvll$EPCI != "ZZZZZZZZZ")
plot(sort(EPCIComNvll$RatioComFus, decreasing = TRUE),
     xlab= "Nombre d'EPCI dans lequel au moins une commune a fusionné",
     ylab= "Pourcentage de communes ayant fusionné au sein de l'EPCI",
     main = "Les communes fusionnantes au sein des EPCI")

# mean(EPCIComNvll$RatioComFus)
# median(EPCIComNvll$RatioComFus)
# quantile (EPCIComNvll$RatioComFus)
# sd(EPCIComNvll$RatioComFus)
summary (EPCIComNvll$RatioComFus)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.222  12.500  22.222  31.341  40.000 100.000

1.12.2 L’appartenance des communes à différents périmètres

# Choix des périmètres d'appartenance pris en compte
Appart_etud <- c("REG", "CODE_DEPT", "ARR", "CV", "ZE2010", "AU2010", "EPCI")

# Création d'un tableau pour l'appartenance de la nouvelle commune à partir du Chef-Lieu
AppartComNvlles <- subset (AppartComFus, ChefLieu == "O")

# Création d'un tableau avec les caractéristiques : de l'ancienne commune (les ".x") et du chef-lieu de la commune nouvelle (les ".y").
# À noter qu'on n'a pris que les communes n'étant pas chefs-lieu, pour éviter les double-comptes
AppartComFus2 <- merge(
  subset(AppartComFus, ChefLieu == "N"),
  AppartComNvlles, by = "CODGEO_new", all.x = TRUE)

appart <- "AU2010"

tableau <- data.frame()

for (appart in Appart_etud) {
# Création d'un champ désignant, pour chaque zonage, si la commune fusionnante a la même appartenance que la commune chef-lieu.
  AppartComFus2[, paste0(appart, "_simil")] <- ifelse(AppartComFus2[, paste0(appart, ".x")] == AppartComFus2[, paste0(appart, ".y")], TRUE, FALSE)
  
  # Modifications particulières pour ZAU car l'aire urbaine notée "000" regroupe toutes les communes isolées hors influence des pôles. Une appartenance identique à cette dernière n'a donc pas beaucoup de sens.
  
   if (appart != "AU2010") {AppartComFus2 <- AppartComFus2} else {
     AppartComFus2$AU2010_simil[AppartComFus2$AU2010.x == "000"] <- "Non applicable"
     AppartComFus2$AU2010_simil[AppartComFus2$AU2010.y == "000"] <- "Non applicable"

   }
  
    # Modifications particulières pour EPCI car, de même, l'absence d'EPCI est notée "ZZZZZZZZZ" (neux fois la lettre Z)
   if (appart != "EPCI") {AppartComFus2 <- AppartComFus2} else {
     AppartComFus2$EPCI_simil[AppartComFus2$EPCI.x == "ZZZZZZZZZ"] <- "Non applicable"
     AppartComFus2$EPCI_simil[AppartComFus2$EPCI.y == "ZZZZZZZZZ"] <- "Non applicable"
     }
  
nbSimil <- sum(AppartComFus2[, paste0(appart, "_simil")] == TRUE, na.rm = TRUE)
nbDiff <- sum(AppartComFus2[, paste0(appart, "_simil")] == FALSE, na.rm = TRUE)
nbCom <- nbSimil + nbDiff


num_variable <- which(target$recoding == appart)
nom_variable <- target[num_variable, "DESCRIPTION"]

# On rajoute une mention de la superficie moyenne de l'échelon
superficie_appart <- tapply(df2011$superficie, INDEX = df2011[, appart], sum)
superf_moy <- round(mean(superficie_appart),0)

ligne <- c(nom_variable, nbSimil, 100*nbSimil/nbCom, nbDiff, 100*nbDiff/nbCom, nbCom, 100*nbCom/nbCom, superf_moy)

tableau <- rbind(tableau, ligne)

}


# On passe les variables en numérique
tableau[2:ncol(tableau)] <- apply(tableau[2:ncol(tableau)], 2, as.numeric)

colnames(tableau) <- c("", "Nombre", "%", "Nombre", "%", "Nombre", "%", "(km²)")

# Si on veut ordonner le tableau en fonction de la superficie moyenne décroissante
# tableau <- tableau[order(-tableau$`(km²)`),]

kable(tableau, row.names = F, digits = 2, align = "c", caption = "L'appartenance des communes fusionnantes à différents zonages") %>%
  kableExtra::add_header_above(c("Appartenance identique" = 1, "Oui" = 2, "Non" = 2, "Total" = 2, "Superficie moyenne de l'échelon" = 1))
L’appartenance des communes fusionnantes à différents zonages
Appartenance identique
Oui
Non
Total
Superficie moyenne de l’échelon
Nombre % Nombre % Nombre % (km²)
Région 1826 99.95 1 0.05 1827 100 25716
Département 1823 99.78 4 0.22 1827 100 5745
Arrondissement 1759 96.28 68 3.72 1827 100 1662
Canton de ville 1562 85.50 265 14.50 1827 100 148
Zone d’emploi 2010 1682 92.06 145 7.94 1827 100 1818
Aire urbaine 2010 840 65.99 433 34.01 1273 100 706
EPCI 1615 91.04 159 8.96 1774 100 211
# Réalisation d'un diagramme

temp1 <- tableau[, c(1, 2)]
temp1$Appart <- "Appartenance identique"

temp2 <- tableau[, c(1, 4)]
temp2$Appart <- "Appartenance différente"

tableau_plot <- rbind(temp1, temp2)
colnames(tableau_plot) <- c("Échelon", "Nombre", "Appartenance")


# Réalisation d'un diagramme
ggplot(tableau_plot, aes(x = Échelon,
                              y = Nombre,
                              fill = Appartenance)) + geom_bar(stat="identity") +
  # Changement de l'ordre dans la légende
  scale_x_discrete(limits=c("Région", "Département", "Arrondissement", "Canton de ville", "Zone d'emploi 2010", "Aire urbaine 2010", "EPCI")) +
  labs(title="Nombre de communes fusionnantes\nayant une appartenance identique à celle\nde la commune chef-lieu de la commune nouvelle")

rm(appart, nbSimil, nbDiff, nbCom, tableau, num_variable, nom_variable, superficie_appart, superf_moy, tableau_plot, temp1, temp2)

1.13 Communes nouvelles et superficie

EtudSuperf <- df2011[, c("CODGEO", "FUSION", "superficie")]

seuils <- quantile(EtudSuperf$superficie, probs=seq(0, 1, 0.1)) # Seuils à partir des déciles de l'ensemble des communes fusionnantes

EtudSuperf$deciles <- EtudSuperf$superficie
EtudSuperf$deciles <- cut(EtudSuperf$deciles, breaks = seuils)
# levels(EtudSuperf$deciles)<-c("1er décile", "2e décile", "3e décile", "4e décile", "5e décile", "6e décile", "7e décile", "8e décile", "9e décile", "10e décile")
table (EtudSuperf$deciles)
## 
## (0.0165,4.08]   (4.08,5.65]   (5.65,7.19]   (7.19,8.84]   (8.84,10.8] 
##          3620          3621          3621          3620          3621 
##   (10.8,13.1]   (13.1,16.3]   (16.3,21.1]   (21.1,29.9]    (29.9,758] 
##          3621          3620          3621          3621          3621
tabcont<-table(EtudSuperf$FUSION, EtudSuperf$deciles)
# Test chi²
tab.chi2 <- chisq.test(tabcont)
tab.chi2
## 
##  Pearson's Chi-squared test
## 
## data:  tabcont
## X-squared = 17.647, df = 9, p-value = 0.0395
# Pour avoir un graphique avec les barres juxtaposées en pourcentage des lignes
tab <- round(100*prop.table(tabcont,margin=1),2) # Pourcentages, le total se fait par lignes
prbarplot <- as.data.frame(tab)
ggplot(data = prbarplot, aes(x = Var2, y = Freq, fill = Var1)) +
  geom_bar(stat = "identity", position=position_dodge()) +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  scale_x_discrete("Superficie communale (km²)") + 
  scale_y_continuous("Part du groupe de communes (%)") +
  scale_fill_manual("Communes\nfusionnantes", values = couleurs) 

  # ggtitle("La répartition des communes fusionnantes\nen fonction des superficies\n(par déciles sur l'ensemble des communes françaises)")

# Pour avoir un graphique empilé avec le pourcentage total des communes françaises
tab <- round(100*prop.table(tabcont),2) # Pourcentages, le total se fait par lignes
prbarplot <- as.data.frame(tab)
ggplot(data = prbarplot, aes(x = Var2, y = Freq, fill = Var1)) +
  geom_bar(stat = "identity") +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  scale_x_discrete("Superficie communale (km²)") + 
  scale_y_continuous("Part du groupe de communes (%)") +
  scale_fill_manual("Communes\nnouvelles", values = couleurs) +
  ggtitle("La répartition des communes fusionnantes\nen fonction des superficies\n(par déciles sur l'ensemble des communes françaises)")  +
  geom_hline(yintercept=100 * nrow(datafus2011)/nrow(df2011) /10)

rm(tab, tabcont, seuils, EtudSuperf)

Si on observe la superficie communale, la répartition des communes fusionnantes ou non laisse entrevoir un phénomène potentiellement contre-intuitif : la participation à une commune nouvelle ne paraît pas du tout être guidée par la taille des communes. Alors que les communes avec une très petite superficie (premier décile sur l’ensemble des communes françaises) ont effectivement un peu plus fusionné en moyenne (mais très légèrement), celles avec des superficies au-dessus de la moyenne (pour les classes entre 13,1 et 29,9 km²) ont elles aussi davantage fusionné. Dans tous les cas, les variations sont généralement faibles et la question de la superficie ne paraît pas être un élément explicatif, ce qui est confirmé par un test de Chi² ne permettant pas de rejeter l’hypothèse d’indépendance des deux variables (X-squared = 13.84, df = 9, p-value = 0.1281).

EtudSuperf <- df_new[, c("CODGEO", "FUSION", "superficie")]

seuils <- quantile(EtudSuperf$superficie, probs=seq(0, 1, 0.1)) # Seuils à partir des déciles de l'ensemble des communes fusionnantes

EtudSuperf$deciles <- EtudSuperf$superficie
EtudSuperf$deciles <- cut(EtudSuperf$deciles, breaks = seuils)
# levels(EtudSuperf$deciles)<-c("1er décile", "2e décile", "3e décile", "4e décile", "5e décile", "6e décile", "7e décile", "8e décile", "9e décile", "10e décile")
table (EtudSuperf$deciles)
## 
## (0.0165,4.13]   (4.13,5.73]   (5.73,7.28]   (7.28,8.99]     (8.99,11] 
##          3437          3438          3438          3438          3438 
##     (11,13.4]   (13.4,16.7]   (16.7,21.8]   (21.8,31.7]    (31.7,758] 
##          3437          3438          3438          3438          3438
tabcont<-table(EtudSuperf$FUSION, EtudSuperf$deciles)


# Pour avoir un graphique avec les barres juxtaposées en pourcentage des lignes
tab <- round(100*prop.table(tabcont,margin=1),2) # Pourcentages, le total se fait par lignes
prbarplot <- as.data.frame(tab)
ggplot(data = prbarplot, aes(x = Var2, y = Freq, fill = Var1)) +
  geom_bar(stat = "identity", position=position_dodge()) +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  scale_x_discrete("Superficie communale (km²)") + 
  scale_y_continuous("Pourcentage de communes") +
  scale_fill_manual("Communes\nfusionnantes", values = c("blue", "red")) +
  ggtitle("La répartition des communes fusionnantes\nen fonction des superficies\n(par déciles sur l'ensemble des communes françaises)")

# Pour avoir un graphique empilé avec le pourcentage total des communes françaises
tab <- round(100*prop.table(tabcont),2) # Pourcentages, le total se fait par lignes
prbarplot <- as.data.frame(tab)
ggplot(data = prbarplot, aes(x = Var2, y = Freq, fill = Var1)) +
  geom_bar(stat = "identity") +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  scale_x_discrete("Superficie communale (km²)") + 
  scale_y_continuous("Pourcentage de communes") +
  scale_fill_manual("Communes\nfusionnantes", values = c("blue", "red")) +
  ggtitle("La répartition des communes fusionnantes\nen fonction des superficies\n(par déciles sur l'ensemble des communes françaises)")  +
  geom_hline(yintercept=100 * nrow(dataCN_new)/nrow(df_new) /10) # Ligne représentant la moyenne des communes nouvelles par décile

rm(tab, tabcont, seuils, EtudSuperf)

En revanche, le passage en commune nouvelle a eu un effet majeur puisque les communes nouvelles sont bien plus présentes dans le décile avec la superficie les plus élevée que dans les autres.

2 - LES COMMUNES NOUVELLES AU PRISME DU ZONAGE EN AIRES URBAINES (ZAU)

La présentation caricaturale des communes nouvelles conduirait, du fait de la faible proportion de communes urbaines, à conclure que ce phénomène touche avant tout les espaces ruraux. Cette présentation serait trompeuse et on souhaite s’arrêter ici sur une analyse plus précise de la répartition des communes nouvelles en fonction du zonage urbain.

2.0 Préparation des données

load("data/refdata.Rdata")
datafus2011 <- subset(df2011, COM_NOUV == "OUI") # Désigne les données concernant les communes ayant participé à la création d'une commune nouvelle, appelées ici communes fusionnantes
dataNfus2011 <- subset(df2011, COM_NOUV == "NON") # Les communes, à la géométrie 2011, qui n'ont pas participé à la création d'une commune nouvelle
datafus2011 <- datafus2011[, c("CODGEO", "CODGEO_new", "LIBGEO", "CODGEO", "ChefLieu", "CATAEU2010", "FusPhas")]
dataNfus2011 <- dataNfus2011 [, c("CODGEO", "CODGEO_new", "LIBGEO", "CODGEO", "CATAEU2010")]
c("CATAEU2010", "ZAU_POL", "ZAU_RUR", "ZAU_MAR_SP", "ZAU_MAR", "ZAU_PERI", "ZAU_AU")
## [1] "CATAEU2010" "ZAU_POL"    "ZAU_RUR"    "ZAU_MAR_SP" "ZAU_MAR"   
## [6] "ZAU_PERI"   "ZAU_AU"
couleurs <- c("#2b83ba", "red4")

2.1 Les communes nouvelles en fonction des ZAU

À partir des données INSEE précisant le zonage en aire urbaine de chaque commune (CATAEU2010), nous pouvons observer le profil des communes fusionnantes en le comparant à celui des communes inchangées.

ZAU_non <- data.frame(dataNfus2011$CATAEU2010)
ZAU_oui <- data.frame(datafus2011$CATAEU2010)

ZAU_non$Fusion <- "Communes inchangées"
ZAU_oui$Fusion <- "Communes fusionnantes"

colnames(ZAU_non)[1] <- "CATAEU2010"
colnames(ZAU_oui)[1] <- "CATAEU2010"

ZAU <- rbind(ZAU_non, ZAU_oui)

ZAU_nb <- table(ZAU$Fusion, ZAU$CATAEU2010)

prop <- prop.table(ZAU_nb, 1) * 100

couleurs_ici <- rev(couleurs)
barplot(prop,
        xlab = "Catégories d'aire urbaine (ZAU INSEE)",
        ylab = "Part du total des communes (%)",
        # names.arg = c("Commune appartenant à un grand pôle", "Commune appartenant à la couronne d'un grand pôle", " Commune multipolarisée des grandes aires urbaines", "Commune appartenant à un moyen pôle", " Commune appartenant à la couronne d'un moyen pôle", "Commune appartenant à un petit pôle", "Commune appartenant à la couronne d'un petit pôle", "Autre commune multipolarisée", "Commune isolée hors influence des pôles"),
       # names.arg = c("Grand pôle", "Couronne d'un grand pôle", " Multipolarisée des\ngrandes aires urbaines", "Moyen pôle", "Couronne d'un moyen pôle", "Petit pôle", "Couronne d'un petit pôle", "Autre commune\nmultipolarisée", "Commune isolée hors\ninfluence des pôles"),

        main = " ",# "Graphique 2 :\nRépartition des communes fusionnantes ou non\nen fonction des catégories d'aire urbaine",
        las = 2,
        border = NA,
        col=couleurs_ici, # "#ff87a9","#f7d358"
        beside = TRUE)

legend(x="topright", legend = rownames(prop) , cex=0.8,
       fill=couleurs_ici,bty="n")     

prbarplot <- melt(prop)
prbarplot$Var1 <- factor(prbarplot$Var1, levels = rev(levels(prbarplot$Var1)))

prbarplot$Var2 <- as.character(prbarplot$Var2)
ggplot(data = prbarplot, aes(x = Var2, y = value, fill = Var1)) +
  geom_bar(stat = "identity", position=position_dodge()) +
  theme(axis.text.x = element_text(angle = 45, hjust=1), legend.position = c(0.8, 0.85)) +
  scale_x_discrete("Catégorie de Zonage en Aire Urbaine (ZAU)",
                   labels = c("Grand pôle", "Couronne\nd'un grand pôle", " Commune\nmultipolarisée\n par des grandes\naires urbaines", "Moyen pôle", "Couronne d'un\nmoyen pôle", "Petit pôle", "Couronne\nd'un petit pôle", "Autre commune\nmultipolarisée", "Commune isolée hors\ninfluence des pôles")) + 
  scale_y_continuous("Part du groupe de communes (%)") +
  scale_fill_manual(values = couleurs) + labs(fill = NULL)

# Chi2
tab.chi2 <- chisq.test(ZAU_nb)
tab.chi2 
## 
##  Pearson's Chi-squared test
## 
## data:  ZAU_nb
## X-squared = 181.24, df = 8, p-value < 2.2e-16
tab.chi2$observed
##                        
##                           111   112   120   211   212   221   222   300   400
##   Communes fusionnantes    81   827   310    24    74   100    32   590   633
##   Communes inchangées    3119 11353  3658   415   727   754   526  6385  6600
tab.chi2$expected
##                        
##                               111       112       120       211       212
##   Communes fusionnantes  236.0583   898.497  292.7123  32.38425  59.08835
##   Communes inchangées   2963.9417 11281.503 3675.2877 406.61575 741.91165
##                        
##                               221       222       300       400
##   Communes fusionnantes  62.99807  41.16267  514.5334  533.5656
##   Communes inchangées   791.00193 516.83733 6460.4666 6699.4344
tab.chi2$residuals
##                        
##                                 111         112         120         211
##   Communes fusionnantes -10.0921904  -2.3852264   1.0104527  -1.4733210
##   Communes inchangées     2.8481331   0.6731385  -0.2851615   0.4157883
##                        
##                                 212         221         222         300
##   Communes fusionnantes   1.9398795   4.6618769  -1.4281385   3.3269637
##   Communes inchangées    -0.5474565  -1.3156357   0.4030372  -0.9389077
##                        
##                                 400
##   Communes fusionnantes   4.3046989
##   Communes inchangées    -1.2148359
mosaicplot(ZAU_nb, shade = TRUE,  cex=0.6, main = NULL, xlab = "Communes fusionnantes",
           ylab = "Communes inchangées")

# Proportion sur l'ensemble des communes françaises
Ensemble <- apply(ZAU_nb, 2, sum)
ZAU_nb <- rbind(ZAU_nb, Ensemble)

ZAU_prop <- t(prop.table(ZAU_nb, 1) * 100)
Total <- apply(ZAU_prop, 2, sum)
ZAU_prop <- rbind (ZAU_prop, Total)

kable(ZAU_prop, row.names = T, digits = 2, caption = "Communes fusionnantes en fonction du ZAU")
Communes fusionnantes en fonction du ZAU
Communes fusionnantes Communes inchangées Ensemble
111 3.03 9.30 8.84
112 30.96 33.85 33.64
120 11.61 10.91 10.96
211 0.90 1.24 1.21
212 2.77 2.17 2.21
221 3.74 2.25 2.36
222 1.20 1.57 1.54
300 22.09 19.04 19.26
400 23.70 19.68 19.98
Total 100.00 100.00 100.00

Ces éléments permettent de se rendre compte que les profils des communes fusionnantes et des communes inchangées sont relativement proches. Les écarts les plus importants se situent aux extrêmes : ainsi, les communes fusionnantes sont marquées par une plus faible représentation des communes centres de grands ou moyens pôles dans les communes nouvelles et une sur-représentation des communes multipolarisées ou hors influence des pôles. Le test de Chi² réalisé permet de rejeter l’hypothèse d’indépendance des deux variables.

# Idée : faire la même chose avec variable "FusPhas" > est-ce que ces fusions ont significativement touché
# des communes rurales au début, à la fin... 
# A priori pas très concluant

test <- table(datafus2011$FusPhas, datafus2011$CATAEU2010)
test
prop <- prop.table(test, 1) * 100

barplot(prop, main= NULL,
        xlab = "Catégories d'aire urbaine",
        ylab = "Part du total des communes d'une phase (%)",
        las = 2,
        border = NA,
        col= rainbow(nrow(prop)),
        beside = TRUE)

legend(x="topright", legend = rownames(prop) , cex=0.8, fill= rainbow(nrow(prop)),bty="n")     


# Chi2
tab.chi2 <- chisq.test(test)
tab.chi2 

tab.chi2$observed
tab.chi2$expected
tab.chi2$residuals

mosaicplot(test, shade = TRUE,  cex=0.6, main = NULL, xlab = "Phase de fusion",
           ylab = "Catégorie d'aire urbaine")
# Comparaison en fonction de catégorisations de ZAU
# Analyse peu concluante

listeZAU <- c("CATAEU2010", "ZAU_POL", "ZAU_RUR", "ZAU_MAR_SP", "ZAU_MAR", "ZAU_PERI", "ZAU_AU")


results_chi2 <- data.frame()
for (i in listeZAU) { # Pour chaque identifiant de commune nouvelle, 
  a <- which(colnames(dataNfus2011) == i)
  ZAU_non <- data.frame(dataNfus2011[a])
  ZAU_oui <- data.frame(datafus2011[a])
  ZAU_non$Fusion <- "Pas de fusion"
  ZAU_oui$Fusion <- "Communes fusionnées"
  colnames(ZAU_non)[1] <- "CATAEU2010"
  colnames(ZAU_oui)[1] <- "CATAEU2010"
  ZAU <- rbind(ZAU_oui, ZAU_non)
  ZAU <- table(ZAU$Fusion, ZAU$CATAEU2010)

  tab.chi2 <- chisq.test(ZAU)
  Xsquared <- tab.chi2$statistic
  df <- tab.chi2$parameter
  p.value <- tab.chi2$p.value
  resultpartiel <- c(i, Xsquared, df, p.value)
  results_chi2 <- rbind (results_chi2, resultpartiel, stringsAsFactors = FALSE)
  rm(a, ZAU_non, ZAU_oui, ZAU, tab.chi2, p.value, df, Xsquared, resultpartiel)
  }

colnames(results_chi2) <- c("Catégorisation testée", "X-squared", "df", "p.value")

2.2. Chaque commune nouvelle est-elle composée d’un seul type de ZAU ?

# Définition d'un tableau comportant le nombre de communes fusionnantes par commune nouvelle
count_CN <- plyr::count(datafus2011, "CODGEO_new")

mesCommunes <- count_CN$CODGEO_new
#mesCommunes <- c("61324","73150","73006")

df <- datafus2011

results <- data.frame()
for (i in mesCommunes) { # Pour chaque identifiant de commune nouvelle, 
  toto <- subset (df, CODGEO_new == i ) # Ne garder que les communes fusionnantes y ayant participé
  a <- table(toto$CATAEU2010) # Relever les ZAU des communes fusionnantes
  results <- rbind(results,a) # Combiner les résultats, par lignes
 # rm(a) # Supprimer "a"
}
x <- c("111","112","120","211","212","221","222","300","400") # On renomme les colonnes
colnames(results) <- x
count_CN <- cbind(count_CN, results)

# On identifie la variable la plus fréquente
count_CN$max <- apply(count_CN[, 3:11], 1, function(x) max(x, na.rm = TRUE))
# Quel est le code ZAU revenant le plus fréquemment dans une CN
count_CN$ZAUmaj2 <- colnames(count_CN[, 3:11])[apply(count_CN[, 3:11], 1, which.max)]
# On note si une CN a des communes fusionnantes avec un ZAU identique
count_CN$ZAUident <- ifelse(count_CN$max == count_CN$freq, TRUE, FALSE)
summary(count_CN$ZAUident)
##    Mode   FALSE    TRUE 
## logical     338     506
rm(results)
# On extrait les CN ayant des communes fusionnante avec un ZAU identique
CNIdent <- subset(count_CN, ZAUident==TRUE)
CNIdent <- merge(CNIdent, datafus2011[, c("CODGEO", "CATAEU2010")], by.x = "CODGEO_new", by.y = "CODGEO", all.x = TRUE)

tabcont<-summary(CNIdent$CATAEU2010)
round(100*prop.table(tabcont,margin=),1) # Pourcentages de chaque ZAU chez les communes nouvelles
##  111  112  120  211  212  221  222  300  400 NA's 
##  4.5 42.9  9.1  0.4  2.2  1.4  0.4 12.6 26.1  0.4
tabcont2<- summary(datafus2011$CATAEU2010)
round(100*prop.table(tabcont2,margin=),1) # Pourcentages de chaque ZAU chez les communes françaises
##  111  112  120  211  212  221  222  300  400 
##  3.0 31.0 11.6  0.9  2.8  3.7  1.2 22.1 23.7
# On peut donc en conclure qu'une large majorité des communes nouvelles sont, du point de vue du ZAU, composées de communes au profil homogène.

3 - PROXIMITÉS STATISTIQUES

RY: J’ai retiré la partie de MTA dans cette partie car ces analyses n’évaluent pas directement les proximités statistiques mais plutôt les inégalités dans différents contextes spatiaux et territoriaux. Si ce qui ressort des analyses de la partie 3 actuelle te semblent intéressantes, cela peut être intéressant de développer un peu plus (tester sur des sous-espaces, sur des groupes d’indicateurs, bref, à voir en fonction des objectifs).

3.0 Préparation des données

geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE) # Les communes selon la géographie en vigueur au 1er janvier 2011.
geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE) # Les  communes qui ont participé à la création de communes nouvelles (appelées communes fusionnantes).
geomCN_new <- st_read("data/geom.gpkg", layer = "geomCN_new", quiet = TRUE) # Les  communes nouvelles, avec les géométries au 1er janvier 2025 et caractérisées par les données à la géométrie 2011 agrégées.
dep <- st_read("data/geom.gpkg", layer = "dep", quiet = TRUE) # Départements


# Import et sélection des données
load("data/refdata.Rdata")

df2011 <- df2011 [, c("LIBGEO_new", "CODGEO_new", "LIBGEO", "CODGEO", "ChefLieu", "CATAEU2010", "FusPhas", "COM_NOUV", "FUSION", "P09_RETR1564_RT", "C09_ACT1564_Agr_RT", "C09_ACT1564_ArtCom_RT", "C09_ACT1564_Cadr_RT", "C09_ACT1564_ProfInt_RT", "C09_ACT1564_Empl_RT","C09_ACT1564_Ouvr_RT", "P09_POP0014Y_RT", "P09_POP1529Y_RT", "P09_POP3044Y_RT", "P09_POP4559Y_RT", "P09_POP6074Y_RT", "P09_POP75PY_RT", "P11_POT_FIN", "P09_POP", "REG")]
df_new <- df_new [, c("LIBGEO_new", "CODGEO_new", "CODGEO", "CATAEU2010", "FusPhas", "COM_NOUV", "FUSION", "P09_RETR1564_RT", "C09_ACT1564_Agr_RT", "C09_ACT1564_ArtCom_RT", "C09_ACT1564_Cadr_RT", "C09_ACT1564_ProfInt_RT", "C09_ACT1564_Empl_RT","C09_ACT1564_Ouvr_RT", "P09_POP0014Y_RT", "P09_POP1529Y_RT", "P09_POP3044Y_RT", "P09_POP4559Y_RT", "P09_POP6074Y_RT", "P09_POP75PY_RT", "P11_POT_FIN", "P09_POP", "REG")]

# Pour prendre les mêmes données que sur la CAH
# df_new <- df_new [, c("CODGEO","CODE_DEPT", "CATAEU2010", "LIBGEO_new", "P09_CHOM1564_RT", "P09_ETUD1564_RT", "P09_RETR1564_RT", "C09_ACT1564_Agr_RT", "C09_ACT1564_ArtCom_RT", "C09_ACT1564_Cadr_RT", "C09_ACT1564_ProfInt_RT", "C09_ACT1564_Empl_RT", "C09_ACT1564_Ouvr_RT", "P09_POP0014Y_RT", "P09_POP1529Y_RT", "P09_POP3044Y_RT", "P09_POP4559Y_RT", "P09_POP6074Y_RT", "C09_ACTOCC_OUT_RT", "COM_NOUV", "CODGEO_new")]
# df2011 <- df2011 [, c("CODGEO","CODE_DEPT", "CATAEU2010", "LIBGEO_new", "P09_CHOM1564_RT", "P09_ETUD1564_RT", "P09_RETR1564_RT", "C09_ACT1564_Agr_RT", "C09_ACT1564_ArtCom_RT", "C09_ACT1564_Cadr_RT", "C09_ACT1564_ProfInt_RT", "C09_ACT1564_Empl_RT", "C09_ACT1564_Ouvr_RT", "P09_POP0014Y_RT", "P09_POP1529Y_RT", "P09_POP3044Y_RT", "P09_POP4559Y_RT", "P09_POP6074Y_RT", "C09_ACTOCC_OUT_RT", "COM_NOUV", "CODGEO_new")]


datafus2011 <- subset(df2011, COM_NOUV == "OUI") # Désigne les données concernant les communes ayant participé à la création d'une commune nouvelle, appelées ici communes fusionnantes
dataCN_new <- subset(df_new, COM_NOUV == "OUI") # Les  communes nouvelles, avec les géométries au 1er janvier 2025 et caractérisées par les données à la géométrie 2011 agrégées.

# Appariement des données
geom2011 <- merge(geom2011, df2011, by = "CODGEO")
geomfus2011 <- merge(geomfus2011, datafus2011, by = "CODGEO")
geomCN_new <- merge(geomCN_new, dataCN_new, by = "CODGEO_new")

3.1 Proximité statististique (distance euclidienne) entre communes fusionnantes

On calcule ici la proximité statistique qui existe, ou non, entre communes ayant fusionné au sein d’un même ensemble. À partir des données socioéconomiques, nous pouvons observer la proximité entre des communes (LIBGEO_2011) de même appartenance communale (LIBGEO_new).

tmp <- datafus2011 [, c("CODGEO_new", "P09_RETR1564_RT", "C09_ACT1564_Agr_RT", "C09_ACT1564_ArtCom_RT", "C09_ACT1564_Cadr_RT", "C09_ACT1564_ProfInt_RT", "C09_ACT1564_Empl_RT","C09_ACT1564_Ouvr_RT", "P09_POP0014Y_RT", "P09_POP1529Y_RT", "P09_POP3044Y_RT", "P09_POP4559Y_RT", "P09_POP6074Y_RT", "P09_POP75PY_RT")]
# tmp <- datafus2011 [, c("P09_CHOM1564_RT", "P09_ETUD1564_RT", "P09_RETR1564_RT", "C09_ACT1564_Agr_RT", "C09_ACT1564_ArtCom_RT", "C09_ACT1564_Cadr_RT", "C09_ACT1564_ProfInt_RT", "C09_ACT1564_Empl_RT", "C09_ACT1564_Ouvr_RT", "P09_POP0014Y_RT", "P09_POP1529Y_RT", "P09_POP3044Y_RT", "P09_POP4559Y_RT", "P09_POP6074Y_RT", "C09_ACTOCC_OUT_RT", "COM_NOUV", "CODGEO_new")]
tmp <- na.omit(tmp)

d <- by(tmp, tmp$CODGEO_new, function(x)dist(x, method = "euclidean"))
df <- as.data.frame(sapply(d,mean))

df$CODGEO_new <- row.names(df)
colnames(df)[1] <- "dist_CN"

geomCN_new  <- merge(geomCN_new , df, by.x = "CODGEO_new", all.x = TRUE)

# Export des données sur la distance euclidienne
st_write(obj = df, dsn = "sorties/disteucl.gpkg", layer = "disteucl", delete_layer = TRUE, quiet = TRUE)

# Cartographie
par(mar=c(0,0,1.2,0))

plot(st_geometry(dep), col = NA)

choroLayer(x = geomCN_new , var = "dist_CN",
           method = "quantile", nclass = 6,
           col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 3, n2 = 3),
           border = NA,
           legend.pos = "topleft", legend.values.rnd = 2,
           legend.title.txt = "Distance statistique (euclidienne) moyenne par groupe de communes nouvelles",
           add = TRUE)

layoutLayer(title = "Distance euclidienne intra-groupe", theme = "red.pal",
            author = "G. Bideau, R. Ysebaert, 2026.",
            sources = "Sources : INSEE, IGN, 2026\nIndicateurs : P09_RETR1564_RT, C09_ACT1564_Agr_RT, C09_ACT1564_ArtCom_RT, C09_ACT1564_Cadr_RT, C09_ACT1564_ProfInt_RT, C09_ACT1564_Empl_RT,C09_ACT1564_Ouvr_RT, P09_POP0014Y_RT, P09_POP1529Y_RT, P09_POP3044Y_RT, P09_POP4559Y_RT, P09_POP6074Y_RT, P09_POP75PY_RT")

# Zoom sur la Normandie 
norm <- subset (geomCN_new , REG == "23" | REG == "25") # Si anciennes régions
# norm <- subset (geomCN_new , REG == "28")
bb <- st_bbox(norm)
bbnorm <- st_as_sfc(st_bbox(bb + c(-60000,0,0,0), crs = 3035))
norm <- norm[!is.na(norm$LIBGEO),]
plot(st_geometry(bbnorm), col = NA, border = NA)

plot(st_geometry(dep), add = TRUE)

propSymbolsChoroLayer(x = norm, var = "P09_POP", var2 = "dist_CN",
                      method = "quantile", nclass = 6,
                      col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 3, n2 = 3),
                      border = NA,
                      legend.var.pos = "left",
                      legend.title.cex = 0.7,
                      legend.var.title.txt = "Population totale",
                      legend.var2.pos = "topleft", legend.var2.values.rnd = 2,
                      legend.var2.title.txt = "Distance statistique (euclidienne)\nmoyenne par groupe\nde communes nouvelles",
                      add = TRUE)

layoutLayer(title = "Distance euclidienne intra-groupe",
            author = "G. Bideau, R. Ysebaert, 2026.",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2026.\nIndicateurs : ACT_AGR_RT, ACT_ART_RT,
ACT_INT_RT, ACT_EMP_RT, ACT_OUV_RT, ACT_RET_RT, 
ACT_NON_RT, POT_FIN, POP_0010Y_RT, POP_1117Y_RT, 
POP_2539Y_RT,  POP_4054Y_RT, POP_5564Y_RT,
POP_6579Y_RT, POP_80PY_RT")

# To do : Jouer peut être cette distance avec moins de variables pour mieux contrôler ce qui se passe : par variables démo, éco, emploi et voir si les natures des distances sont les mêmes

Une grande diversité de situations est visible concernant cette distance euclidienne, mais avec des tropismes régionaux intéressants. En particulier, en Bretagne et Pays-de-la-Loire, ce sont des communes nouvelles plutôt marquées par une faible distance euclidienne qui sont majoritaires. C’est le cas aussi, bien que moins nettement, en Savoie ou en Alsace. Certaines régions sont davantage marquées par des communes nouvelles davantage hétérogènes : les Pyrénées, le sud du Massif Central. Enfin, dans les régions très marquées par les fusions, on peut noter le cas de la Normandie, où les situations sont très variables.

GB : développement de l’analyse des distances euclidiennes à la fin de l’ACP/CAH.

4 - APPROCHE MULTISCALAIRE DES INÉGALITÉS DE RESSOURCE DES COMMUNES NOUVELLES

RY: J’ai inséré une nouvelle partie 4 pour l’analyse multiscalaire qu’on peut pousser loin. Pour l’instant cela permet surtout de mettre en évidence que les communes de montagne (Pyrénées, Alpes) se situent dans les catégories les plus favorisées et celles du département 49 et de la Normandie globalement dans une situation délicate. Ce qui plaide pour un zoom régional réalisé en 4.3.

GB : Peut-être réfléchir au choix de l’indicateur : le potentiel financier n’est pas inintéressant mais d’autres, dans lesquels les communes fusionnantes se distinguent davantage, pourraient être également intéressants. Analyses pertinentes et cartes assez parlantes. À voir en fonction de l’orientation souhaitée pour le papier.

4.1 Préparation des données et calcul des déviations

À partir du package MTA, on regarde la proximité statistique des communes nouvelles Cf. https://cran.r-project.org/web/packages/MTA/vignettes/MTA_Scenario.html (@ysebaert2019). On trouvera une vignette présentant le déroulé logique et la description précise des différentes fonctions du package ici.

Cette analyse porte ici sur le potentiel financier des communes.

On importe le ratio d’intérêt (potentiel financier par habitant par exemple), défini par un numérateur (potentiel financier) et un dénominateur (population municipale). On réalise cette extraction pour l’ensemble des communes françaises, afin de caractériser la position des communes nouvelles sur cet indicateur au regard de la moyenne nationale ; ainsi que juste pour les communes nouvelles, afin de pouvoir caractériser les inégalités existant au sein de celles-ci.

# Import des géométries
geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE)
geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE)
geomCN_new <- st_read("data/geom.gpkg", layer = "geomCN_new", quiet = TRUE)
dep <- st_read("data/geom.gpkg", layer = "dep", quiet = TRUE)

# Import des données d'intérêt : on ne garde que les variables utiles et
# celles qui peuvent être d'intérêt pour définir des appartenances
load("data/refdata.Rdata")

df2011 <- df2011 [, c("LIBGEO_new", "CODGEO_new", "LIBGEO", "CODGEO", "CATAEU2010", 
                      "P11_POT_FIN", "P11_Rev_Fisc", "P09_ACT1564", "P09_CHOM1564", "P09_POP", "REG", "CODE_DEPT","ChefLieu", "FUSION")]


# Jointures
geom2011 <- merge(geom2011, df2011, by = "CODGEO", all.x = TRUE)
geomfus2011 <- merge(geomfus2011, df2011, by = "CODGEO", all.x = TRUE)
geomCN_new <- merge(geomCN_new, df_new, by = "CODGEO_new", all.x = TRUE)

Grâce au package MTA, on calcule pour cet indicateur plusieurs déviations, dont la moyenne est exprimée en indice 100 : - Écart général à la moyenne française et à celle des communes nouvelles. - Écart aux communes de même catégorie de ZAU, pour l’ensemble des communes françaises et uniquement les communes nouvelles.

num <- "P11_POT_FIN"
nomnum <- "Potentiel financier"
denom <- "P09_POP"
# 
# num <-  "P11_Rev_Fisc"
# denom <- "P09_POP"
# geom2011 <- na.omit(geom2011)
# df2011 <- na.omit(df2011)
# 
num <-  "P09_CHOM1564"
nomnum <- "Taux de chômage des 15-64 ans\n"
denom <- "P09_ACT1564"
# Calcul des déviations générales
geom2011$gdevfr <- gdev(x = geom2011,  var1 = num, var2 = denom, type = "rel")

# Calcul des déviations à la ZAU de même appartenance
geom2011$mdevfr <- tdev(x = geom2011, var1 = num, var2 = denom, type = "rel",
                        key = "CATAEU2010")


# On ne s'intéresse qu'aux communes fusionnantes
df <- st_set_geometry(geom2011, NULL)
geomfus2011 <- merge(geomfus2011, df[,c("CODGEO", "gdevfr", "mdevfr")],
                     by = "CODGEO", all.x = TRUE)

4.2 Position des communes fusionnantes au regard de la moyenne française et de leur ZAU d’appartenance

On s’intéresse ici à caractériser globalement les communes fusionnantes au regard d’une variable (potentiel financier ou taux de chômage). Grâce au package MTA, nous commençons par réaliser deux représentations cartographiques. La première pour évaluer la position des communes nouvelles au regard de l’ensemble de ces communes.

La seconde pour observer uniquement la situation des communes fusionnantes entre elles. Ceci afin de mettre en évidence quelles sont celles qui disposent du plus de potentiel financier entre elles.

cette analyse permet d’identifier 3 cas d’étude qui semblent intéressants : Normandie et dep 49 (situations défavorables) ; communes nouvelles de Savoie (qui s’en tirent toutes bien) > ne serait-ce pas des communes abritant des stations de ski ?

# Visualisation des déviations générales et territoriales
cols <- carto.pal(pal1 = "blue.pal", n1 = 3, pal2 = "wine.pal", n2 = 3)

# plot a choropleth map of the relative global deviation
par(mfrow = c(1,2), mar = c(0,0,1.2,0))
choroLayer(x = geomfus2011, var = "gdevfr", legend.pos = "topleft",
           legend.title.txt = "Déviation relative\n(100 = moyenne française)",
           legend.title.cex = 0.7,
           breaks = c(min(geomfus2011$gdevfr, na.rm = TRUE),
                      75, 90, 100, 111, 133,
                      max(geomfus2011$gdevfr, na.rm = TRUE)), 
           border = NA, col = cols)

plot(st_geometry(dep), col = NA, add = TRUE)

layoutLayer(#title = "Potentiel financier\nécart à la moyenne française",
            title = paste0(nomnum, "\nécart à la moyenne française"),
            sources = "INSEE, 2009-2011.", author = "G. Bideau, R. Ysebaert, 2026.",
            scale = FALSE, tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black")
dev.print(device = svg, file = paste0("figures/Dev ", num, " ecart_Fr", ".svg"))
## png 
##   2
choroLayer(x = geomfus2011, var = "mdevfr", legend.pos = "topleft",
           legend.title.txt = "Déviation relative\n(100 = moyenne de la catégorie de ZAU d'appartenance)",
           legend.title.cex = 0.7,
           breaks = c(min(geomfus2011$mdevfr, na.rm = TRUE),
                      75, 90, 100, 111, 133,
                      max(geomfus2011$mdevfr, na.rm = TRUE)), 
           border = NA, col = cols)

plot(st_geometry(dep), col = NA, add = TRUE)

layoutLayer(#title = "Potentiel financier\nÉcart à la moyenne de la ZAU d'appartenance",
            title = paste0(nomnum, "\nécart à la moyenne française"),
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black")

dev.print(device = svg, file = paste0("figures/Dev ", num, " ecart_ZAU", ".svg"))
## png 
##   2

La fonction bidev présente la synthèse du positionnement des communes nouvelles sur ces deux déviations. Ce graphique reprend une des fonctionnalités d’HyperAtlas, le logiciel de référence historique qui permet l’analyse des inégalités territoriales. Cette fonction est désormais implémentée dans le package MTA.

Pour synthétiser la positionnement des communes nouvelles sur deux déviations, on commence par les situer dans un repère orthonormé : les communes représentées en rouge sont celles dont la moyenne du potentiel financier par habitant se situe au dessus de la moyenne française et de leur ZAU d’appartenance ; celles représentées en bleu en dessous de la moyenne pour les deux contextes ; et en jaune et vert dans des situations contradictoires en fonction des contextes spatiaux.

On s’intéresse aussi ici à l’éloignement statistique au regard des valeurs moyennes : plus la valeur des communes se situe loin des valeurs moyennes des contextes, plus la tonalité de couleur est saturée. Les communes qui se situent autour des valeurs moyennes (compris entre 75 et 125 sur les deux contextes, 100 représentant la moyenne) sont représentées en blanc.

Un graphique est associé à la représentation cartographique afin de visualiser le nuage de point sur lequel porte la représentation cartographique. Les communes de chaque même ZAU s’alignent alors selon un segment de droite dont la longueur exprime l’importance des disparités des communes qui ont fusionné et la pente la différence entre la moyenne de la ZAU et la moyenne nationale (@grasland2004) L’alignement des points selon différentes courbures de droites dans le repère permet ici d’apprécier l’effet de l’appartenance à une ZAU sur les inégalités induites par le potentiel financier. Basiquement, plus la pente du nuage de point de communes de même ZAU est importante, moins les régions qui la compose sont différenciées (les écarts intra-zone globaux étant faibles).

RY : référence de C.Grasland à rajouter en biblio sur ce point si on retient l’analyse. La lecture de cet article peut donner des billes pour interpréter correctement ces sorties d’ailleurs: Claude Grasland. Les inégalités régionales dans une Europe élargie. Les incertitudes du grand élargissement : L’Europe centrale et balte dans l’intégration européenne, L’Harmattan, pp.181-214, 2004, “ Pays de l’Est ”.

# Supprimer 0 (transformations log impossible)
geomfus2011 <- geomfus2011[geomfus2011$gdevfr != 0,]
geomfus2011 <- geomfus2011[geomfus2011$mdevfr != 0,]

# Calculer map_bidev
xx <- map_bidev(x = geomfus2011, dev1 = "gdevfr", dev2 = "mdevfr",
                breaks = c(75, 150, 300))

# Générer les géométries et le vecteur de couleur
com <- xx$geom
cols <- xx$cols

par(mfrow = c(1,2), mar = c(0,4,0,0))

typoLayer(x = com, var = "bidev", border = NA, col = cols, lwd = 0.2, 
          legend.pos = "n")
plot(dep$geom, col = NA, lwd = 1, add = TRUE)

layoutLayer(title = paste0("Synthèse des deux déviations.\nVariable : ", num),
            author = "Source : INSEE, 2026.", scale = 50, col = "white", coltitle = "black")

plot_bidev(x = com,  dev1 = "gdevfr",  dev2 = "mdevfr", 
           dev1.lab = "Déviation nationale",
           dev2.lab = "Déviation aux ZAU de même appartenance",
           cex.lab = 0.8, breaks = c(75, 150, 300), cex.pt = 0.2, cex.axis = 0.5)

4.3 Zoom

On prend ici 4 cas d’étude : communes de l’ancienne région Rhône-Alpes (qui présente des situations contrastées), avec un zoom sur sa partie Est (la plus touchée par les communes nouvelles), la région Normandie (dont le potentiel financier des communes est visiblement faible au regard contextes spatiaux identifiés en partie précédente), tout comme le département 49 (très dense en communes nouvelles).

4.3.1 Préparation des données et calcul des déviations

Les trois déviations suivantes sont calculées : - Déviation générale : situation du potentiel financier par habitant au regard de la moyenne régionale (ou départementale pour le 49) - Déviation intermédiaire : situation au regard des communes de même région (ou département) appartenant aux mêmes catégories de ZAU. - Déviation locale : situation au regard des communes contigues.

Ces trois déviations sont calculées simultanément grâce à la fonction mst du package MTA. La fonction renvoie une typologie codée de 0 à 7 qui renvoie la position de chaque commune sur les trois déviations, en fonction d’un seuil (threshold) prédéfini et d’une relation de supériorité ou d’infériorité (superior).

On souhaite cibler les situations extrêmes (faibles ressources et importantes ressources). Nous calculons donc cette typologie pour les communes en situation favorable (threshold = 125 , superior = TRUE) et défavorable (threshold = 75, superior = FALSE).

: A noter qu’au lieu du critère de contiguité on pourrait aussi prendre un critère de distance à vol d’oiseau. On pourrait aussi mesurer les écarts territoriaux (tdev) au regard de le moyenne du département ou de la zone d’emploi d’appartenance. A voir ce qui est le plus pertinent au regard des objectifs théoriques du papier consolidé.

GB : Le critère de contiguité est cohérent puisque les communes nouvelles doivent être “continues et sans enclave”. En revanche, j’aurais bien observé la situation systématiquement vis-à-vis de la moyenne départementale (plutôt que de la région).

# Extraction cas d'étude
norm <- subset (geom2011, REG == "23" | REG == "25") # Normandie
normCN <- subset (geomCN_new, REG == "28")

dep49 <- subset (geom2011, CODE_DEPT == "49" ) # Dep 49
dep49CN <- subset (geomCN_new, CODE_DEPT == "49")

ralp <- subset (geom2011, REG == "82") # Rhône-Alpes
ralpCN <- subset (geomCN_new, CODE_DEPT == "69" | CODE_DEPT == "73"
                  | CODE_DEPT == "74" | CODE_DEPT == "38"
                  | CODE_DEPT == "42" | CODE_DEPT == "01"
                  | CODE_DEPT == "26" | CODE_DEPT == "07")

ralppartiel <- subset (geom2011, CODE_DEPT == "69" | CODE_DEPT == "73"
                  | CODE_DEPT == "74" | CODE_DEPT == "38" | CODE_DEPT == "01") # Rhône-Alpes partiel
ralppartielCN <- subset (geomCN_new, CODE_DEPT == "69" | CODE_DEPT == "73"
                  | CODE_DEPT == "74" | CODE_DEPT == "38" | CODE_DEPT == "01")

On crée la fonction colmst pour gérer les couleurs et légendes des cartes de typologie qui suivent. Puis on représente les régions respectivement au-dessus et en-dessous des indices 125 et 75 (100 = moyenne) pour les trois contextes.

# Gestion des couleurs et des labels
colsmst <- function(x){
  
  coldf <- data.frame(colvec = c("#f0f0f0", "#fdc785","#ffffab","#fba9b0",
                                 "#addea6","#ffa100","#fff226","#e30020"),
                      mst = seq(0,7,1),
                      leg_val = c("∅","R -    -   ","   - Z -   ","R - Z -   ","   -    - C", "R -    - C", "   - Z - C", "R - Z - C"), # ligne pour disposer les lettres de manière plus lisible
                      # leg_val = c("0","R","Z","R-Z","C", "R-C", "Z-C", "R-Z-C"), # ligne d'origine
                      stringsAsFactors = FALSE)
  
  xx <- st_set_geometry(x, NULL)
  xx <- coldf[coldf$mst %in% xx[,"mst"],]
  cols <- xx$colvec
  leg_val <- as.vector(xx$leg_val)
  
  return(list("cols" = cols,  "leg_val" = leg_val))
}

4.3.2 Normandie

# Calculer les trois déviations
norm$gdev <- gdev(x = norm, var1 = num, var2 = denom)
norm$tdev <- tdev(x = norm, var1 = num, var2 = denom, key = "CATAEU2010")
norm$sdev <- sdev(x = norm, var1 = num, var2 = denom, order = 1)

# Situation supérieur à 125 (souvent favorable)
mst <- map_mst(x = norm, gdevrel = "gdev", tdevrel = "tdev", sdevrel = "sdev",
               threshold = 125, superior = TRUE)

# Unlist outputs of the function
com <- mst$geom

# Ne garder que les communes fusionnantes
fuz <- st_set_geometry(geomfus2011, NULL)
fuz$fuz <- 1
com <- merge(com, fuz[,c("CODGEO", "fuz")], by.x = "CODGEO",
             by.y = "CODGEO", all.x = TRUE)
com <- com[!is.na(com$fuz),]
com <- com[order(com$mst),]

# Légende et couleurs
xx <- colsmst(x = com)
cols <- xx$cols
leg_val <- xx$leg_val

# Cartographie
par(mar = c(0,0,0,0), mfrow = c(1,1))
bb <- st_bbox(com)
bb <- st_as_sfc(st_bbox(bb + c(-60000,0,0,0), crs = 3035))
com <- com[!is.na(com$LIBGEO),]

# Aire d'étude pour faciliter la lisibilité
study_area <-subset (dep, CODE_DEPT == "27" | CODE_DEPT == "50"
                  | CODE_DEPT == "14" | CODE_DEPT == "61" | CODE_DEPT == "76" | CODE_DEPT == "35" )
plot(st_geometry(study_area), border = NA)

typoLayer(x = com, var = "mst", border = "grey50",
          col = cols, lwd = 0.2, legend.pos = "n", add = TRUE)

depnorm <- subset (dep, CODE_DEPT == "27" | CODE_DEPT == "50"
                  | CODE_DEPT == "14" | CODE_DEPT == "61" | CODE_DEPT == "76")
plot(st_geometry(depnorm), lwd = 1, col = NA, add = TRUE)

legendTypo(col = cols, categ = leg_val,
           title.txt = "Communes fusionnantes\nau-dessus de l'indice 125 :",
           nodata = FALSE, pos = c(3410000, 2930000), title.cex = .7, values.cex = .6)

toponymes <- com[com$mst == 7,] # Sélection des noms des communes correspondant à la classe 7
toponymes <- toponymes[sample(1:nrow(toponymes), 6),]# Sélection, au hasard, de 6 toponymes
labelLayer(toponymes, txt = "LIBGEO", halo = TRUE, overlap = FALSE, cex = 0.6)

layoutLayer(# title = paste0(nomnum, " : Communes nouvelles en situation favorable (Normandie)"),
            title = paste0("\n\n\n\n\n\n", nomnum), postitle = "center",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            source = "Source : INSEE, 2026.", author =  "G. Bideau, R. Ysebaert, 2026.
100: Moyenne des déviations
R: Situation au regard de la moyenne des communes de l'espace d'étude (région)
Z: Situation au regard de la moyenne des ZAU d'appartenance sur l'espace d'étude.
C: Situation au regard des communes contigues")

# dev.print(device = svg, file = paste0("figures/Dev ", "NORM ", num, " sit_fav", ".svg"))

# Intégration des données de déviation pour sauvegarde
st_geometry(com) <- NULL # On supprime les géométries car sinon fusion impossible
norm <- merge (norm, com[, c("CODGEO", "mst")], by = "CODGEO", all.x = TRUE)
colnames(norm)[length(norm)-1] <- "mst_sup" # Classification selon déviation supérieur à 125


# Situation inférieur à 75 (souvent défavorable)
mst <- map_mst(x = norm, gdevrel = "gdev", tdevrel = "tdev", sdevrel = "sdev",
               threshold = 75, superior = FALSE)

# Unlist outputs of the function
com <- mst$geom

# Ne garder que les communes fusionnantes
com <- merge(com, fuz[,c("CODGEO", "fuz")], by.x = "CODGEO",
             by.y = "CODGEO", all.x = TRUE)
com <- com[!is.na(com$fuz),]
com <- com[order(com$mst),]

# Légende et couleurs
xx <- colsmst(x = com)
cols <- xx$cols
leg_val <- xx$leg_val

# Cartographie
par(mar = c(0,0,0,0), mfrow = c(1,1))
bb <- st_bbox(com)
bb <- st_as_sfc(st_bbox(bb + c(-60000,0,0,0), crs = 3035))
com <- com[!is.na(com$LIBGEO),]
plot(st_geometry(study_area), border = NA)

typoLayer(x = com, var = "mst", border = "grey50",
          col = cols, lwd = 0.2, legend.pos = "n", add = TRUE)

plot(st_geometry(depnorm), lwd = 1, col = NA, add = TRUE)

legendTypo(col = cols, categ = leg_val,
           title.txt = "Communes fusionnantes\nen-dessous de l'indice 75 :",
           nodata = FALSE, pos =  c(3410000, 2940000), title.cex = .7, values.cex = .6)

toponymes <- com[com$mst == 7,] # Sélection des noms des communes correspondant à la classe 7
toponymes <- toponymes[sample(1:nrow(toponymes), 6),]# Sélection, au hasard, de 6 toponymes
labelLayer(toponymes, txt = "LIBGEO", halo = TRUE, overlap = FALSE, cex = 0.6)

layoutLayer(# title = paste0(nomnum, " : Communes nouvelles en situation défavorable (Normandie)"),
            title = paste0("\n\n\n\n\n\n", nomnum), postitle = "center",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            source = "Source : INSEE, 2026.", author =  "G. Bideau, R. Ysebaert, 2026.
100: Moyenne des déviations
R: Situation au regard de la moyenne des communes de l'espace d'étude (région)
Z: Situation au regard de la moyenne des ZAU d'appartenance sur l'espace d'étude.
C: Situation au regard des communes contigues")

# dev.print(device = svg, file = paste0("figures/Dev ", "NORM ", num, " sit_defav", ".svg"))

# Intégration des données de déviation pour sauvegarde
st_geometry(com) <- NULL # On supprime les géométries car sinon fusion impossible
norm <- merge (norm, com[, c("CODGEO", "mst")], by = "CODGEO", all.x = TRUE)
colnames(norm)[length(norm)-1] <- "mst_inf" # Classification selon déviation inférieur à 75

4.3.3 Maine-et-Loire

# Calculer les trois déviations
dep49$gdev <- gdev(x = dep49, var1 = num, var2 = denom)
dep49$tdev <- tdev(x = dep49, var1 = num, var2 = denom, key = "CATAEU2010")
dep49$sdev <- sdev(x = dep49, var1 = num, var2 = denom, order = 1)

# Situation supérieur à 125 (souvent favorable)
mst <- map_mst(x = dep49, gdevrel = "gdev", tdevrel = "tdev", sdevrel = "sdev",
               threshold = 125, superior = TRUE)

# Unlist outputs of the function
com <- mst$geom

# Ne garder que les communes fusionnantes
fuz <- st_set_geometry(geomfus2011, NULL)
fuz$fuz <- 1
com <- merge(com, fuz[,c("CODGEO", "fuz")], by.x = "CODGEO",
             by.y = "CODGEO", all.x = TRUE)
com <- com[!is.na(com$fuz),]
com <- com[order(com$mst),]

# Légende et couleurs
xx <- colsmst(x = com)
cols <- xx$cols
leg_val <- xx$leg_val

# Cartographie
par(mar = c(0,0,0,0), mfrow = c(1,1))
bb <- st_bbox(com)
bb <- st_as_sfc(st_bbox(bb + c(-60000,0,0,0), crs = 3035))
com <- com[!is.na(com$LIBGEO),]
typoLayer(x = com, var = "mst", border = "grey50",
          col = cols, lwd = 0.2, legend.pos = "n")

depfig <- subset (dep, CODE_DEPT == "49")
plot(st_geometry(depfig), lwd = 1, col = NA, add = TRUE)

legendTypo(col = cols, categ = leg_val,
           title.txt = "Communes fusionnantes\nau-dessus de l'indice 125 :",
           nodata = FALSE, pos = "topleft", title.cex = .7, values.cex = .6)

toponymes <- com[com$mst == 7,] # Sélection des noms des communes correspondant à la classe 7
toponymes <- toponymes[sample(1:nrow(toponymes), 6),]# Sélection, au hasard, de 6 toponymes
labelLayer(toponymes, txt = "LIBGEO", halo = TRUE, overlap = FALSE, cex = 0.6)

layoutLayer(# title = paste0(nomnum, " : Communes nouvelles en situation favorable (Maine-et-Loire)"),
            title = paste0("\n\n\n\n\n\n", nomnum), postitle = "right",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            source = "Source : INSEE, 2026.", author =  "G. Bideau, R. Ysebaert, 2026.
100: Moyenne des déviations
R: Situation au regard de la moyenne des communes de l'espace d'étude (région)
Z: Situation au regard de la moyenne des ZAU d'appartenance sur l'espace d'étude.
C: Situation au regard des communes contigues")

# dev.print(device = svg, file = paste0("figures/Dev ", "49 ", num, " sit_fav", ".svg"))

# Intégration des données de déviation pour sauvegarde
st_geometry(com) <- NULL # On supprime les géométries car sinon fusion impossible
dep49 <- merge (dep49, com[, c("CODGEO", "mst")], by = "CODGEO", all.x = TRUE)
colnames(dep49)[length(dep49)-1] <- "mst_sup" # Classification selon déviation supérieur à 125


# Situation inférieur à 75 (souvent défavorable)
mst <- map_mst(x = dep49, gdevrel = "gdev", tdevrel = "tdev", sdevrel = "sdev",
               threshold = 75, superior = FALSE)

# Unlist outputs of the function
com <- mst$geom

# Ne garder que les communes fusionnantes
com <- merge(com, fuz[,c("CODGEO", "fuz")], by.x = "CODGEO",
             by.y = "CODGEO", all.x = TRUE)
com <- com[!is.na(com$fuz),]
com <- com[order(com$mst),]

# Légende et couleurs
xx <- colsmst(x = com)
cols <- xx$cols
leg_val <- xx$leg_val

# Cartographie
par(mar = c(0,0,0,0), mfrow = c(1,1))
bb <- st_bbox(com)
bb <- st_as_sfc(st_bbox(bb + c(-60000,0,0,0), crs = 3035))
com <- com[!is.na(com$LIBGEO),]
typoLayer(x = com, var = "mst", border = "grey50",
          col = cols, lwd = 0.2, legend.pos = "n")

plot(st_geometry(depfig), lwd = 1, col = NA, add = TRUE)

legendTypo(col = cols, categ = leg_val,
           title.txt = "Communes fusionnantes\nen-dessous de l'indice 75 :",
           nodata = FALSE, pos = "topleft", title.cex = .7, values.cex = .6)

toponymes <- com[com$mst == 7,] # Sélection des noms des communes correspondant à la classe 7
toponymes <- toponymes[sample(1:nrow(toponymes), 6),]# Sélection, au hasard, de 6 toponymes
labelLayer(toponymes, txt = "LIBGEO", halo = TRUE, overlap = FALSE, cex = 0.6)

layoutLayer(# title = paste0(nomnum, " : Communes nouvelles en situation défavorable (Maine-et-Loire)"),
            title = paste0("\n\n\n\n\n\n", nomnum), postitle = "right",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            source = "Source : INSEE, 2026.", author =  "G. Bideau, R. Ysebaert, 2026.
100: Moyenne des déviations
R: Situation au regard de la moyenne des communes de l'espace d'étude (région)
Z: Situation au regard de la moyenne des ZAU d'appartenance sur l'espace d'étude.
C: Situation au regard des communes contigues")

# dev.print(device = svg, file = paste0("figures/Dev ", "49 ", num, " sit_defav", ".svg"))

# Intégration des données de déviation pour sauvegarde
st_geometry(com) <- NULL # On supprime les géométries car sinon fusion impossible
dep49 <- merge (dep49, com[, c("CODGEO", "mst")], by = "CODGEO", all.x = TRUE)
colnames(dep49)[length(dep49)-1] <- "mst_inf" # Classification selon déviation inférieur à 75

4.3.4 Rhône-Alpes

# Calculer les trois déviations
ralp$gdev <- gdev(x = ralp, var1 = num, var2 = denom)
ralp$tdev <- tdev(x = ralp, var1 = num, var2 = denom, key = "CATAEU2010")
ralp$sdev <- sdev(x = ralp, var1 = num, var2 = denom, order = 1)

# Situation supérieur à 125 (souvent favorable)
mst <- map_mst(x = ralp, gdevrel = "gdev", tdevrel = "tdev", sdevrel = "sdev",
               threshold = 125, superior = TRUE)

# Unlist outputs of the function
com <- mst$geom

# Ne garder que les communes fusionnantes
fuz <- st_set_geometry(geomfus2011, NULL)
fuz$fuz <- 1
com <- merge(com, fuz[,c("CODGEO", "fuz")], by.x = "CODGEO",
             by.y = "CODGEO", all.x = TRUE)
com <- com[!is.na(com$fuz),]
com <- com[order(com$mst),]

# Légende et couleurs
xx <- colsmst(x = com)
cols <- xx$cols
leg_val <- xx$leg_val

# Cartographie
par(mar = c(0,0,0,0), mfrow = c(1,1))
bb <- st_bbox(com)
bb <- st_as_sfc(st_bbox(bb + c(-60000,0,0,0), crs = 3035))
com <- com[!is.na(com$LIBGEO),]
typoLayer(x = com, var = "mst", border = "grey50",
          col = cols, lwd = 0.2, legend.pos = "n")

depfig <- subset (dep, CODE_DEPT == "69" | CODE_DEPT == "73"
                  | CODE_DEPT == "74" | CODE_DEPT == "38"
                  | CODE_DEPT == "42" | CODE_DEPT == "01"
                  | CODE_DEPT == "26" | CODE_DEPT == "07")
plot(st_geometry(depfig), lwd = 1, col = NA, add = TRUE)

legendTypo(col = cols, categ = leg_val,
           title.txt = "Communes fusionnantes\nau-dessus de l'indice 125 :",
           nodata = FALSE, pos = "topleft", title.cex = .7, values.cex = .6)

toponymes <- com[com$mst == 7,] # Sélection des noms des communes correspondant à la classe 7
toponymes <- toponymes[sample(1:nrow(toponymes), 6),]# Sélection, au hasard, de 6 toponymes
labelLayer(toponymes, txt = "LIBGEO", halo = TRUE, overlap = FALSE, cex = 0.6)

layoutLayer(# title = paste0(nomnum, " : Communes nouvelles en situation favorable (Rhône-Alpes)"),
            title = paste0("\n\n\n\n\n\n", nomnum), postitle = "right",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            source = "Source : INSEE, 2026.", author =  "G. Bideau, R. Ysebaert, 2026.
100: Moyenne des déviations
R: Situation au regard de la moyenne des communes de l'espace d'étude (région)
Z: Situation au regard de la moyenne des ZAU d'appartenance sur l'espace d'étude.
C: Situation au regard des communes contigues")

# dev.print(device = svg, file = paste0("figures/Dev ", "RALP ", num, " sit_fav", ".svg"))

# Intégration des données de déviation pour sauvegarde
st_geometry(com) <- NULL # On supprime les géométries car sinon fusion impossible
ralp <- merge (ralp, com[, c("CODGEO", "mst")], by = "CODGEO", all.x = TRUE)
colnames(ralp)[length(ralp)-1] <- "mst_sup" # Classification selon déviation supérieur à 125


# Situation inférieur à 75 (souvent défavorable)
mst <- map_mst(x = ralp, gdevrel = "gdev", tdevrel = "tdev", sdevrel = "sdev",
               threshold = 75, superior = FALSE)

# Unlist outputs of the function
com <- mst$geom

# Ne garder que les communes fusionnantes
com <- merge(com, fuz[,c("CODGEO", "fuz")], by.x = "CODGEO",
             by.y = "CODGEO", all.x = TRUE)
com <- com[!is.na(com$fuz),]
com <- com[order(com$mst),]

# Légende et couleurs
xx <- colsmst(x = com)
cols <- xx$cols
leg_val <- xx$leg_val

# Cartographie
par(mar = c(0,0,0,0), mfrow = c(1,1))
bb <- st_bbox(com)
bb <- st_as_sfc(st_bbox(bb + c(-60000,0,0,0), crs = 3035))
com <- com[!is.na(com$LIBGEO),]
typoLayer(x = com, var = "mst", border = "grey50",
          col = cols, lwd = 0.2, legend.pos = "n")

plot(st_geometry(depfig), lwd = 1, col = NA, add = TRUE)

legendTypo(col = cols, categ = leg_val,
           title.txt = "Communes fusionnantes\nen-dessous de l'indice 75 :",
           nodata = FALSE, pos = "topleft", title.cex = .7, values.cex = .6)

toponymes <- com[com$mst == 7,] # Sélection des noms des communes correspondant à la classe 7
toponymes <- toponymes[sample(1:nrow(toponymes), 6),]# Sélection, au hasard, de 6 toponymes
labelLayer(toponymes, txt = "LIBGEO", halo = TRUE, overlap = FALSE, cex = 0.6)

layoutLayer(# title = paste0(nomnum, " : Communes nouvelles en situation défavorable (Rhône-Alpes)"),
            title = paste0("\n\n\n\n\n\n", nomnum), postitle = "right",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            source = "Source : INSEE, 2026.", author =  "G. Bideau, R. Ysebaert, 2026.
100: Moyenne des déviations
R: Situation au regard de la moyenne des communes de l'espace d'étude (région)
Z: Situation au regard de la moyenne des ZAU d'appartenance sur l'espace d'étude.
C: Situation au regard des communes contigues")

# dev.print(device = svg, file = paste0("figures/Dev ", "RALP ", num, " sit_defav", ".svg"))

# Intégration des données de déviation pour sauvegarde
st_geometry(com) <- NULL # On supprime les géométries car sinon fusion impossible
ralp <- merge (ralp, com[, c("CODGEO", "mst")], by = "CODGEO", all.x = TRUE)
colnames(ralp)[length(ralp)-1] <- "mst_inf" # Classification selon déviation inférieur à 75

4.3.5 Rhône-Alpes partiel (cinq départements les plus à l’Est)

# Calculer les trois déviations
ralppartiel$gdev <- gdev(x = ralppartiel, var1 = num, var2 = denom)
ralppartiel$tdev <- tdev(x = ralppartiel, var1 = num, var2 = denom, key = "CATAEU2010")
ralppartiel$sdev <- sdev(x = ralppartiel, var1 = num, var2 = denom, order = 1)

# Situation supérieur à 125 (souvent favorable)
mst <- map_mst(x = ralppartiel, gdevrel = "gdev", tdevrel = "tdev", sdevrel = "sdev",
               threshold = 125, superior = TRUE)

# Unlist outputs of the function
com <- mst$geom

# Ne garder que les communes fusionnantes
fuz <- st_set_geometry(geomfus2011, NULL)
fuz$fuz <- 1
com <- merge(com, fuz[,c("CODGEO", "fuz")], by.x = "CODGEO",
             by.y = "CODGEO", all.x = TRUE)
com <- com[!is.na(com$fuz),]
com <- com[order(com$mst),]

# Légende et couleurs
xx <- colsmst(x = com)
cols <- xx$cols
leg_val <- xx$leg_val

# Cartographie
par(mar = c(0,0,0,0), mfrow = c(1,1))
bb <- st_bbox(com)
bb <- st_as_sfc(st_bbox(bb + c(-60000,0,0,0), crs = 3035))
com <- com[!is.na(com$LIBGEO),]
typoLayer(x = com, var = "mst", border = "grey50",
          col = cols, lwd = 0.2, legend.pos = "n")

depfig <- subset (dep, CODE_DEPT == "69" | CODE_DEPT == "73"
                  | CODE_DEPT == "74" | CODE_DEPT == "38" | CODE_DEPT == "01")
plot(st_geometry(depfig), lwd = 1, col = NA, add = TRUE)

legendTypo(col = cols, categ = leg_val,
           title.txt = "Communes fusionnantes\nau-dessus de l'indice 125 :",
           nodata = FALSE, pos = "topleft", title.cex = .7, values.cex = .6)

toponymes <- com[com$mst == 7,] # Sélection des noms des communes correspondant à la classe 7
toponymes <- toponymes[sample(1:nrow(toponymes), 4),]# Sélection, au hasard, de 4 toponymes
labelLayer(toponymes, txt = "LIBGEO", halo = TRUE, overlap = FALSE, cex = 0.6)

layoutLayer(# title = paste0(nomnum, " : Communes nouvelles en situation favorable (Rhône-Ain-Isère-Savoies)"),
            title = paste0("\n\n\n\n\n\n", nomnum), postitle = "right",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            source = "Source : INSEE, 2026.", author =  "G. Bideau, R. Ysebaert, 2026.
100: Moyenne des déviations
R: Situation au regard de la moyenne des communes de l'espace d'étude (région)
Z: Situation au regard de la moyenne des ZAU d'appartenance sur l'espace d'étude.
C: Situation au regard des communes contigues")

# dev.print(device = svg, file = paste0("figures/Dev ", "RALP-Partiel ", num, " sit_fav", ".svg"))

# Intégration des données de déviation pour sauvegarde
st_geometry(com) <- NULL # On supprime les géométries car sinon fusion impossible
ralppartiel <- merge (ralppartiel, com[, c("CODGEO", "mst")], by = "CODGEO", all.x = TRUE)
colnames(ralppartiel)[length(ralppartiel)-1] <- "mst_sup" # Classification selon déviation supérieur à 125


# Situation inférieur à 75 (souvent défavorable)
mst <- map_mst(x = ralppartiel, gdevrel = "gdev", tdevrel = "tdev", sdevrel = "sdev",
               threshold = 75, superior = FALSE)

# Unlist outputs of the function
com <- mst$geom

# Ne garder que les communes fusionnantes
com <- merge(com, fuz[,c("CODGEO", "fuz")], by.x = "CODGEO",
             by.y = "CODGEO", all.x = TRUE)
com <- com[!is.na(com$fuz),]
com <- com[order(com$mst),]

# Légende et couleurs
xx <- colsmst(x = com)
cols <- xx$cols
leg_val <- xx$leg_val

# Cartographie
par(mar = c(0,0,0,0), mfrow = c(1,1))
bb <- st_bbox(com)
bb <- st_as_sfc(st_bbox(bb + c(-60000,0,0,0), crs = 3035))
com <- com[!is.na(com$LIBGEO),]
typoLayer(x = com, var = "mst", border = "grey50",
          col = cols, lwd = 0.2, legend.pos = "n")

plot(st_geometry(depfig), lwd = 1, col = NA, add = TRUE)

legendTypo(col = cols, categ = leg_val,
           title.txt = "Communes fusionnantes\nen-dessous de l'indice 75 :",
           nodata = FALSE, pos = "topleft", title.cex = .7, values.cex = .6)

toponymes <- com[com$mst == 7,] # Sélection des noms des communes correspondant à la classe 7
toponymes <- toponymes[sample(1:nrow(toponymes), 6),]# Sélection, au hasard, de 6 toponymes
labelLayer(toponymes, txt = "LIBGEO", halo = TRUE, overlap = FALSE, cex = 0.6)

layoutLayer(# title = paste0(nomnum, " : Communes nouvelles en situation défavorable (Rhône-Ain-Isère-Savoies)"),
            title = paste0("\n\n\n\n\n\n", nomnum), postitle = "right",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            source = "Source : INSEE, 2026.", author =  "G. Bideau, R. Ysebaert, 2026.
100: Moyenne des déviations
R: Situation au regard de la moyenne des communes de l'espace d'étude (région)
Z: Situation au regard de la moyenne des ZAU d'appartenance sur l'espace d'étude.
C: Situation au regard des communes contigues")

# dev.print(device = svg, file = paste0("figures/Dev ", "RALP-Partiel ", num, " sit_defav", ".svg"))

# Intégration des données de déviation pour sauvegarde
st_geometry(com) <- NULL # On supprime les géométries car sinon fusion impossible
ralppartiel <- merge (ralppartiel, com[, c("CODGEO", "mst")], by = "CODGEO", all.x = TRUE)
colnames(ralppartiel)[length(ralppartiel)-1] <- "mst_inf" # Classification selon déviation inférieur à 75

4.3.6 Sauvegarde des données obtenues

st_write(obj = norm [, c("CODGEO", "LIBGEO", "CODGEO_new", "LIBGEO_new", "mst_sup", "mst_inf")], dsn = paste0("sorties/norm_", num, ".gpkg"), layer = "norm", delete_layer = TRUE, quiet = TRUE)
st_write(obj = dep49 [, c("CODGEO", "LIBGEO", "CODGEO_new", "LIBGEO_new", "mst_sup", "mst_inf")], dsn = paste0("sorties/dep49_", num, ".gpkg"), layer = "dep49", delete_layer = TRUE, quiet = TRUE)
st_write(obj = ralp [, c("CODGEO", "LIBGEO", "CODGEO_new", "LIBGEO_new", "mst_sup", "mst_inf")], dsn = paste0("sorties/ralp_", num, ".gpkg"), layer = "ralp", delete_layer = TRUE, quiet = TRUE)



# Pour importer les données concernant le taux de chômage
norm_P09_CHOM1564 <- st_read("sorties/norm_P09_CHOM1564.gpkg", layer = "norm", quiet = TRUE) 
dep49_P09_CHOM1564 <- st_read("sorties/dep49_P09_CHOM1564.gpkg", layer = "dep49", quiet = TRUE) 
ralp_P09_CHOM1564 <- st_read("sorties/ralp_P09_CHOM1564.gpkg", layer = "ralp", quiet = TRUE) 

# Pour importer les données concernant le potentiel financier
norm_P11_POT_FIN <- st_read("sorties/norm_P11_POT_FIN.gpkg", layer = "norm", quiet = TRUE) 
dep49_P11_POT_FIN <- st_read("sorties/dep49_P11_POT_FIN.gpkg", layer = "dep49", quiet = TRUE) 
ralp_P11_POT_FIN <- st_read("sorties/ralp_P11_POT_FIN.gpkg", layer = "ralp", quiet = TRUE) 

4.3.7 Croisement de différentes données

Certaines communes ont des situations très contrastées, c’est-à-dire une situation favorable vis-à-vis de certains contextes et défavorables vis-à-vis d’autres.

dep49_P11_POT_FIN <- as.data.frame(dep49_P11_POT_FIN) # Pour que le sf devienne un simple data frame (sinon, on peut aussi utiliser st_geometry(data) <- NULL qui retire/supprime la géométrie
dep49Croisement <- merge (dep49_P09_CHOM1564, dep49_P11_POT_FIN[, c("CODGEO", "mst_sup", "mst_inf")], by = "CODGEO")

colnames(dep49Croisement) <- c("CODGEO", "LIBGEO", "CODGEO_new", "LIBGEO_new", "mst_sup_CHOM", "mst_inf_Chom", "mst_sup_PotFin", "mst_inf_PotFin","geometry")

summary(dep49Croisement$mst_inf_Chom >0)

OLD - À supprimer certainement

: Tout ce qui était en 3.2 est ici. Je pense que l’on peut supprimer ce bout de code, mais je te laisse la responsabilité de le faire.

# Définition de la variable à étudier
geom2011$variableproxim <- geom2011$P11_POT_FIN
# Définition de l'ensemble de référence choisi
# Choisir "Fusion" si on souhaite comparer à l'ensemble des communes fusionnantes, "REG" aux régions etc
geom2011$CATAEUFusion <- interaction (geom2011$CATAEU2010, geom2011$FUSION)
geom2011$key <- geom2011$CATAEUFusion
geom2011$Reference <- geom2011$P09_POP

# Déviation globale
geom2011$gdevrel <- gdev(x = geom2011, 
                         var1 = "variableproxim",
                         var2 = "Reference",
                         type = "rel")

# general absolute deviation 
geom2011$gdevabs <- gdev(x = geom2011, 
                         var1 = "variableproxim", 
                         var2 = "Reference", 
                         type = "abs")

# general deviation in million Euros
geom2011$gdevabsmil <- geom2011$gdevabs / 1000000

####  Cartography ----
prcarto<-subset(geom2011, FUSION == "OUI")
# margins
#par(mar = c(0, 0, 1.2, 0))

# Plot territories
plot(st_geometry(geom2011), col = "grey70", border = "#EDEDED", lwd = 0.25)
#plot(st_geometry(ept), border = "#1A1A19", lwd = 1, add = TRUE)

# Global deviation (relative and absolute) cartography
propSymbolsChoroLayer(x = prcarto,
                      var = "gdevabsmil", var2 = "gdevrel",
                      add = TRUE,
                      inches = 0.1,
                      col = carto.pal(pal1 = "blue.pal", n1 = 3,
                                      pal2 = "wine.pal", n2 = 3),
                      breaks = c(min(prcarto$gdevrel, na.rm = TRUE),
                                 75, 90, 100, 111, 133,
                                 max(prcarto$gdevrel, na.rm = TRUE)),
                      #border = "#f0f0f0",
                      #lwd = 0.25,
                      legend.var.pos = "left", legend.var2.pos = "topleft",
                      legend.var.title.txt = "Potentiel financier (millions d'euros)",
                      legend.var2.title.txt = "Déviation par rapport au contexte global (100 = Ensemble des communes françaises)",
                      legend.var.style = "e",
                      legend.var.values.rnd = 0,
                      legend.var2.values.rnd = 0)

# layout 
layoutLayer(title = "Global deviation - Potentiel financier",
            sources = "INSEE, 2009-2011.",
            north = TRUE, scale = 5, tabtitle = TRUE, frame = FALSE, theme = "red.pal",
            author = "!!!")

Peut être l’ensemble des communes nouvelles, l’ensemble des communes d’une région etc Point 6 dans la présentation du package MTA https://cran.r-project.org/web/packages/MTA/vignettes/MTA_Scenario.html

# Territorial relative deviation calculation
geom2011$mdevrel <- tdev(x = geom2011, 
                         var1 = "variableproxim", 
                         var2 = "Reference", 
                         type = "rel",
                         key = "key")

# Territorial absolute deviation calculation
geom2011$mdevabs <- tdev(x = geom2011, 
                         var1 = "variableproxim", 
                         var2 = "Reference", 
                         type = "abs",
                         key = "key")

# Territorial deviation in million Euros
geom2011$mdevabsmil <- geom2011$mdevabs / 1000000

####  Cartography ----
# Plot layout
par(mfrow = c(1, 1))

prcarto<-subset(geom2011, FUSION == "OUI")
prcarto<- na.omit(prcarto)
# Plot territories
plot(st_geometry((geom2011)), col = "grey70", border = "#EDEDED",lwd = 0.25)
plot(st_geometry((dep)), border = "#1A1A19", lwd = 1)

# Territorial deviation (relative and absolute) cartography
propSymbolsChoroLayer(x = prcarto,
                      var = "mdevabsmil", var2 = "mdevrel",
                      add = TRUE,
                      inches = 0.3,
                      col = carto.pal(pal1 = "blue.pal", n1 = 3,
                                      pal2 = "wine.pal", n2 = 3),
                      breaks = c(min(prcarto$mdevrel, na.rm = TRUE),
                                 75, 90, 100, 111, 133,
                                 max(prcarto$mdevrel, na.rm = TRUE)),
                      border = "#f0f0f0",
                      lwd = 0.25,
                      legend.var.pos = "left", legend.var2.pos = "topleft",
                      legend.var.title.txt = "Potentiel financier (millions d'euros)",
                      legend.var2.title.txt = "Déviation par rapport à l'ensemble régional (100 = moyenne des communes de la région)",
                      legend.var.style = "e",
                      legend.var.values.rnd = 0,
                      legend.var2.values.rnd = 0)


# layout 
layoutLayer(title = "!!!!",
            sources = "!!!!",
            north = TRUE, scale = 5, tabtitle = TRUE, frame = FALSE, theme = "red.pal",
            author = "!!!!")

####  Réalisation d'un box-plot pour faciliter la visualisation ----
par(cex.lab = 1)
par(cex.axis = 0.75)
par(mar = c(4, 4, 2, 2))

# Drop geometries
df <- st_set_geometry(geom2011, NULL)
# Reorder EPT according to gdev value
df$key <- with(df, reorder(key, gdevrel, mean, na.rm = TRUE))
df$key <- with(df, reorder(key, CATAEUFUSION, na.rm = TRUE))

# Colors management
col <- carto.pal(pal1 = "red.pal", n1 = (nlevels(df$key) / 2), 
                 pal2 = "green.pal", n2 = (nlevels(df$key) / 2),
                 middle = FALSE, transparency = TRUE)
library(ggplot2)
ggplot(df, aes(x=CATAEU2010, y=gdevrel, fill=FUSION)) +
  geom_violin() +
  geom_boxplot()
toto<- subset(df, gdevrel >= 600)

# Boxplot
boxplot(df$gdevrel ~ df$key,
        col = col,
        ylab = "Global deviation",
        xlab = "Territorial deviation",
        varwidth = TRUE,
        range = 1,
        outline = TRUE,
        las = 1) 

# Horizontal Ablines
abline (h = seq(40, 300, 10), col = "#00000060", lwd = 0.5, lty = 3)

# Plot mean values
xi<- tapply(df$gdevrel, df$key, mean, na.rm = TRUE)
points(xi, col = "navy", pch = 19)

head(df)

# Plot mean values (Communes nouvelles)
dfCfus <- subset(df, COM_NOUV == "OUI")
xi<- tapply(dfCfus$gdevrel, dfCfus$key, mean, na.rm = TRUE)
points(xi, col = "#7C0000", pch = 19)


# Legend for the boxplot
# df$EPTName<- as.factor(df$LIBEPT)
# df$EPTName <- with(df, reorder(EPTName, gdevrel, mean, na.rm = TRUE))
# legend("topleft",
#        legend = levels(df$REG),
#        pch = 15,
#        col = col,
#        cex = 0.6,
#        pt.cex = 1,
#        title = "Territorial contexts (ordered by mean value of global deviation)")
# Spatial relative deviation calculation
geom2011$ldevrel <- sdev(x = geom2011, xid = "CODGEO", var1 = "variableproxim", var2 = "P09_POP",
                         order = 1, type = "rel")


# Spatial absolute deviation calculation
geom2011$ldevabs <- sdev(x = geom2011, xid = "CODGEO", var1 = "variableproxim", var2 = "P09_POP",
                         order = 1, type = "abs")

# Spatial deviation in million Euros
geom2011$ldevabsmil <- geom2011$ldevabs / 1000000

# Cartography
# Plot layout
par(mfrow = c(1, 1), mar = c(0, 0, 1.2, 0))

# Plot territories
plot(st_geometry(geom2011), col = "grey70", border = "#EDEDED",lwd = 0.25)
plot(st_geometry(dep), border = "#1A1A19",lwd = 1, add = T)

# Territorial deviation (relative and absolute) cartography
propSymbolsChoroLayer(x = geom2011,
                      var = "ldevabsmil", var2 = "ldevrel",
                      add = TRUE,
                      inches = 0.3,
                      col = carto.pal(pal1 = "blue.pal", n1 = 3,
                                      pal2 = "wine.pal", n2 = 3),
                      breaks = c(min(geom2011$ldevrel, na.rm = TRUE),
                                 75, 90, 100, 111, 133,
                                 max(geom2011$ldevrel, na.rm = TRUE)),
                      border = "#f0f0f0",
                      lwd = 0.25,
                      legend.var.pos = "left", legend.var2.pos = "topleft",
                      legend.var.title.txt = "Redistribution (Million euros)",
                      legend.var2.title.txt = "Deviation to the spatial context 
                      (100 = average of the contiguous territorial units - order 1)",
                      legend.var.style = "e",
                      legend.var.values.rnd = 0,
                      legend.var2.values.rnd = 0)

# layout 
layoutLayer(title = "Spatial deviation - xxxxxxxxxxxxxxx",
            sources = "x.xxxxx",
            north = TRUE, scale = 5, tabtitle = TRUE, frame = FALSE, theme = "red.pal",
            author = "xxxx")

# Drop geometries
df <- st_set_geometry(geom2011, NULL)

# Spatial deviation - Top 10 of the potential contributors as regards to their total amount of income
df$ldevabsPerc<- df$ldevabs / df$variableproxim * 100
df<-df[order(df$ldevabsPerc, decreasing = TRUE), ]
df[1:10, c("ldevabsmil","ldevabsPerc")]

# Spatial deviation - Top 10 of the potential receivers as regards to their total amount of income
df<-df[order(df$ldevabsPerc, decreasing = FALSE), ]
df[1:10, c("ldevabsmil","ldevabsPerc")]

5 - ACP - CAH

NB : L’analyse de la CAH ci-dessous correspond aux données 2011-2020. Les fusions au 1er janvier 2025, même si elles sont peu nombreuses, modifient considérablement le profil des groupes, dont les descriptions ne sont donc pas adaptées

5.0 Préparation des données

geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE) # Les  communes qui ont participé à la création de communes nouvelles (appelées communes fusionnantes).
dep <- st_read("data/geom.gpkg", layer = "dep", quiet = TRUE) # Départements

# Import des données
load("data/refdata.Rdata")
rm(df_new)


df2011 <- df2011[, c("LIBGEO_new", "CODGEO_new", "LIBGEO", "CODGEO", "ChefLieu", "CATAEU2010", "FusPhas", "COM_NOUV", "FUSION",  "P09_CHOM1564_RT", "P09_ETUD1564_RT", "P09_RETR1564_RT", "C09_ACT1564_Agr_RT", "C09_ACT1564_ArtCom_RT", "C09_ACT1564_Cadr_RT", "C09_ACT1564_ProfInt_RT", "C09_ACT1564_Empl_RT", "C09_ACT1564_Ouvr_RT", "P09_POP0014Y_RT", "P09_POP1529Y_RT", "P09_POP3044Y_RT", "P09_POP4559Y_RT", "P09_POP6074Y_RT", "C09_ACTOCC_OUT_RT", "P11_POT_FIN", "P09_POP", "REG", "CODE_DEPT", "P11_POT_FIN_RT", "P09_POP")]
datafus2011 <- subset(df2011, COM_NOUV == "OUI") # Désigne les données concernant les communes ayant participé à la création d'une commune nouvelle, appelées ici communes fusionnantes

#Calcul de la surface si besoin
# datafus2011$surface <- st_area(geomfus2011) # Attention, unités : m²
# datafus2011$surface <- set_units(datafus2011$surface, km^2) # On passe en km²

# Appariement des données
geomfus2011 <- merge(geomfus2011, datafus2011, by = "CODGEO")

# Import données pour les noms de variables
ratio <- as.data.frame(read_excel("data-raw/meta.xlsx", sheet = "ratios"))
row.names(ratio) <- ratio$Numerator_Code

5.1 Sélectionner les variables d’intérêt

selecVar <- c("CODGEO","CODE_DEPT", "CATAEU2010", "LIBGEO_new", "P09_CHOM1564_RT", "P09_ETUD1564_RT", "P09_RETR1564_RT", "C09_ACT1564_Agr_RT", "C09_ACT1564_ArtCom_RT", "C09_ACT1564_Cadr_RT", "C09_ACT1564_ProfInt_RT", "C09_ACT1564_Empl_RT", "C09_ACT1564_Ouvr_RT", "P09_POP0014Y_RT", "P09_POP1529Y_RT", "P09_POP3044Y_RT", "P09_POP4559Y_RT", "P09_POP6074Y_RT", "C09_ACTOCC_OUT_RT")

# test en intégrant la population et la surface
# selecVar <- c("CODGEO","CODE_DEPT", "CATAEU2010", "LIBGEO_new", "P09_CHOM1564_RT", "P09_ETUD1564_RT", "P09_RETR1564_RT", "C09_ACT1564_Agr_RT", "C09_ACT1564_ArtCom_RT", "C09_ACT1564_Cadr_RT", "C09_ACT1564_ProfInt_RT", "C09_ACT1564_Empl_RT", "C09_ACT1564_Ouvr_RT", "P09_POP0014Y_RT", "P09_POP1529Y_RT", "P09_POP3044Y_RT", "P09_POP4559Y_RT", "P09_POP6074Y_RT", "C09_ACTOCC_OUT_RT", "P09_POP", "surface")

datafus2011 <- datafus2011[,selecVar]

PourCAH <- na.omit(datafus2011)
row.names(PourCAH) <- PourCAH$CODGEO
PourCAH$CODGEO <- NULL
PourCAH$CODE_DEPT <- NULL
PourCAH$CATAEU2010 <- NULL
PourCAH$LIBGEO_new  <- NULL

# PourCAH <- scale(PourCAH) # La standardisation peut se faire après

NbrVariables <- ncol(PourCAH)

selecVarCAH <- colnames(PourCAH)


# Si problèmes de doublons
PourCAH$CODGEO[duplicated(PourCAH$CODGEO)==TRUE]
## NULL

5.2 Réalisation de la typologie et valeurs

# On commence par réaliser une ACP (conseil donné dans R et espace, chapitre 7, p. 135)
res.pca <- PCA(PourCAH, graph = FALSE)
#res.pca <- PCA(PourCAH, ncp = 5, graph = FALSE) # 50 % of cumulative variance

# res.hcpc <- HCPC(res.pca, graph = TRUE, method = "ward", metric = "euclidian") #Ici coupure à 8 classes pas trop mal
#res.hcpc <- HCPC(res.pca, graph = FALSE, nb.clust = 7, method = "ward", metric = "euclidian") #Pour faire la coupure de manière déterministe

res.hcpc <- agnes(res.pca$ind$coord, metric = "euclidiean", method = "ward")


# Réalisation du dendrogramme en passant par plot
dendro.hcpc <- as.dendrogram(res.hcpc)
plot(dendro.hcpc, leaflab = "none", ylab = "Dissimilarité")

inertie <- sort(res.hcpc$height, decreasing = TRUE)
plot(inertie[1:20], type = "s", xlab = "Nombre de classes", ylab = "Inertie")

# Affichage de différents graphiques pour aider au découpage
sortedHeight <- sort(res.hcpc$height^2, decreasing = TRUE)
plot(sortedHeight,
     type = "h",
     xlab = "Noeuds",
     ylab = "Niveau d'agrégation")

relHeight <- sortedHeight / sum(sortedHeight) * 100
cumHeight <- cumsum(relHeight)
barplot(relHeight[1:30], names.arg = seq(1, 30, 1),
        col = "black", border = "white", xlab = "Noeuds",
        ylab = "Part de l'inertie totale (%)",
        main = "Diagramme de niveaux")

# Coupure de l'arbre (k = nombre de classes)
nclass <- 5
cluspop <- cutree(res.hcpc, k = nclass)

# cluspop

5.2.1 Valeurs absolues

# Définition de noms de communes
# Noms pour typo sans les navetteurs, avec 7 classes
# NomsGroupesCAH <- c("Communes d'urbains", "Communes familiales",
#                  "Communes au profil moyen, tendance laborieuse", "Communes rurales actives",
#                  "Communes jeunes et industrielles", "Communes agricoles vieillissantes",
#                  "Communes industrielles vieillissantes" )
# Noms pour typo avec les navetteurs, avec 5 classes
# NB : NOMS ADAPTÉS POUR LES DONNÉES 2011-2020 UNIQUEMENT
NomsGroupesCAH <- c("Groupe 1 PPCQ", # Proche Périphérie, Cadres, Quinquagénaires
                    "Groupe 2 PFO", # Périphéries Familiales et Ouvrières
                    "Groupe 3 MOARO", # Moyen, Ouvriers, Agriculteurs, Retraités, Out.
                    "Groupe 4 VAR", # Vieillissantes, Agricoles et Rurales
                    "Groupe 5 REAV" # Rurales, Enclavées, Agricoles et Vieillissantes
)
# Si on ne veut pas définir de noms
# NomsGroupesCAH <- paste ("Groupe",1 :nclass)

# On intègre ces données dans le tableau de départ
PourCAH <- as.data.frame(PourCAH, stringsAsFactors = FALSE)
PourCAH$Groupes <- factor(cluspop,
                          levels = 1:nclass,
                          labels = paste(NomsGroupesCAH))

# On identifie le nombre de chaque groupe
Groupes_nbr <- paste0(NomsGroupesCAH, " (n=", table(PourCAH$Groupes), ")")
names(Groupes_nbr) <- NomsGroupesCAH

PourCAH$CODGEO <- row.names(PourCAH)
# Calcul de la moyenne des variables
clusProfile <- aggregate(PourCAH [, 1:NbrVariables],
                         by = list(PourCAH$Groupes),
                         mean)
colnames(clusProfile)[1] <- "Groupes"
clusLong <- melt(clusProfile, id.vars = "Groupes")

ggplot(clusLong) +
  geom_bar(aes(x = variable, y = value, fill = Groupes),
           stat = "identity") +
  # scale_fill_grey() +
  # scale_fill_manual(values=c("#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf")) + # Pour 8
   scale_fill_manual(values=c("#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628")) + # Pour 7
  facet_wrap(~ Groupes, labeller = labeller(Groupes = Groupes_nbr)) +
  coord_flip() +
  theme_bw()

ggplot(clusLong) +
  geom_bar(aes(x = variable, y = value, fill = Groupes),
           stat = "identity") +
  # scale_fill_grey() +
  # scale_fill_manual(values=c("#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf")) + # Pour 8
   scale_fill_manual(values=c("#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628")) + # Pour 7
  facet_wrap(~ Groupes) +
  coord_flip() +
  theme_bw()

5.2.2 Valeurs moyennes

# Calculs des valeurs moyennes (pour comparaison)
# On identifie les variables en stock
VarCAHBrutes <- stringr::str_replace(selecVarCAH, "Y_RT", "")
VarCAHBrutes <- stringr::str_replace(VarCAHBrutes, "_RT", "")
# Import données totales
load("data/refdata.Rdata")
rm(df_new)
# Sélection données utiles
pourmoyennesCAH <- na.omit(subset(df2011, COM_NOUV == "OUI"))
moyennesCAH <- data.frame()
for (i in VarCAHBrutes){
  a <- ratio[i, "Denominator_Code"]
  b <- ratio[i, "Coeff"]
  c <- sum(df2011[, i], na.rm = TRUE)
  d <- sum(df2011[, a], na.rm = TRUE)
  moyfr <- round(b * c/d, 2)
  e <- sum(pourmoyennesCAH[, i], na.rm = TRUE)
  f <- sum(pourmoyennesCAH[, a], na.rm = TRUE)
  moyCFus <- round(b * e/f, 2)
  g <- ratio[i, "CODE"]
  h <- c(g, moyfr, moyCFus)
  moyennesCAH <- rbind(moyennesCAH, h, stringsAsFactors= FALSE)
  rm( a, b, c, d, e, f, g, h, moyfr, moyCFus)
}

colnames(moyennesCAH) <- c("Variable", "France", "CommunesFusionnantes")
moyennesCAH$Variable <- as.factor(moyennesCAH$Variable)
moyennesCAH$France <- as.numeric(moyennesCAH$France)
moyennesCAH$CommunesFusionnantes <- as.numeric(moyennesCAH$CommunesFusionnantes)
moyennesCAH$DiffComFusComFr <- moyennesCAH$CommunesFusionnantes - moyennesCAH$France

aa<- ggplot(data = moyennesCAH) +
  geom_bar(aes(x = Variable, y = France), stat = "identity") + coord_flip()
bb <- ggplot(data = moyennesCAH) +
  geom_bar(aes(x = Variable, y = CommunesFusionnantes), stat = "identity") + coord_flip()
cc <- ggplot(data = moyennesCAH) +
  geom_bar(aes(x = Variable, y = DiffComFusComFr), stat = "identity") + coord_flip()
cowplot::plot_grid(aa, bb, cc, ncol = 1, nrow = 3)

rm(aa,bb,cc)

5.2.3 Valeurs standardisées

# On intègre ces données dans le tableau de départ

PourCAHz <- scale(PourCAH[,c(1:NbrVariables)])
PourCAHz <- as.data.frame(PourCAHz, stringsAsFactors = FALSE)

PourCAHz$Groupes <- PourCAH$Groupes

PourCAHz$CODGEO <- row.names(PourCAHz)
# Calcul de la moyenne des variables
clusProfileStd <- aggregate(PourCAHz [, 1:NbrVariables],
                         by = list(PourCAH$Groupes),
                         mean)
colnames(clusProfileStd)[1] <- "Groupes"
clusLongStd <- melt(clusProfileStd, id.vars = "Groupes")
clusLongStd <- merge(clusLongStd, ratio[, 1:2], by.x = "variable", by.y = "CODE") # Pour lisibilité du graphique
colnames(clusLongStd)[4] <- "Variable"

ggplot(clusLongStd) +
  geom_bar(aes(x = Variable, y = value, fill = Groupes),
           stat = "identity") +
  #  scale_fill_grey() +
  scale_fill_manual(values=c("#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf")) + # Pour 8
  #  scale_fill_manual(values=c("#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628")) + # Pour 7
  facet_wrap(~ Groupes, labeller = labeller(Groupes = Groupes_nbr)) +
    labs (y = "Valeurs standardisées", x = " ") +
  coord_flip() + theme_bw()

ggplot(clusLongStd) +
  geom_bar(aes(x = Variable, y = value, fill = Groupes),
           stat = "identity") +
  #  scale_fill_grey() +
  scale_fill_manual(values=c("#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf")) + # Pour 8
  #  scale_fill_manual(values=c("#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628")) + # Pour 7
  facet_wrap(~ Groupes) +
    labs (y = "Valeurs standardisées", x = " ") +
  coord_flip() + theme_bw()

5.2.4 Cartographie

# Remettre groupes dans geomfus2011 pour cartographie
typo <- merge(geomfus2011,PourCAH[ , c("CODGEO","Groupes")], by = "CODGEO")
## Carte Typoe nationale des communes fusionnées


# mf_export(x = typo, export = "svg", filename = "figures/TypoEspaceGeo.svg", 
#           width = 5, theme = "nevermind") # Si souhait d'export

par(mfrow = c(1, 1))
par(mar=c(0,0,1.2,0))
plot(st_geometry(dep), border = "#1A1A19",lwd = 1)

typoLayer(x = typo, var = "Groupes",  
          col = c("#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf"),
          border = NA, 
          #legend.title = "Typologie des communes fusionnantes/nà partir de critères socio-économiques",
          legend.title.cex = 0.7,
          legend.values.cex = 0.6,
          legend.pos = "left", add = T)

layoutLayer(title = "Typologie exploratoire des communes fusionnantes (2012-2026)",
            author = "G. Bideau, R. Ysebaert, 2026.",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2026.")

# dev.off() # Si souhait d'export

5.3 Comparaison et analyse des groupes

Dans le but de comparer un profil avec la moyenne française, on extrait les données de chaque groupe défini par la CAH (données issues de clusLong et clusProfile) et on les compile dans un tableau contenant déjà les données des moyennes françaises et des communes fusionnantes (moyennesCAH). En sortie, un tableau est créé pour chaque groupe.

5.3.1 Comparaison tous groupes

# Tableau pour comparaison entre les groupes
clusProfile2 <- as.data.frame(t(clusProfile))
colnames(clusProfile2) <- clusProfile2[1,]
clusProfile2 <- clusProfile2[ c(2:nrow(clusProfile2)),]
compare <- cbind(moyennesCAH, clusProfile2)

for (i in NomsGroupesCAH){
  a <- which(colnames(compare)== i)
  b <- as.numeric(compare[,a])
  compare[,a] <- as.numeric(compare[,a])
  compare[paste0(i,"_DiffAvecFrance")] <- b - compare$France
  compare[paste0(i,"_DiffAvecComFus")] <- b - compare$CommunesFusionnantes
  rm(a, b)
}

kable(compare, row.names = F, digits = 2, caption = "Tableau de comparaison entre les groupes")
Tableau de comparaison entre les groupes
Variable France CommunesFusionnantes DiffComFusComFr Groupe 1 PPCQ Groupe 2 PFO Groupe 3 MOARO Groupe 4 VAR Groupe 5 REAV Groupe 1 PPCQ_DiffAvecFrance Groupe 1 PPCQ_DiffAvecComFus Groupe 2 PFO_DiffAvecFrance Groupe 2 PFO_DiffAvecComFus Groupe 3 MOARO_DiffAvecFrance Groupe 3 MOARO_DiffAvecComFus Groupe 4 VAR_DiffAvecFrance Groupe 4 VAR_DiffAvecComFus Groupe 5 REAV_DiffAvecFrance Groupe 5 REAV_DiffAvecComFus
P09_CHOM1564_RT 11.23 9.87 -1.36 7.43 6.98 8.49 6.37 11.70 -3.80 -2.44 -4.25 -2.89 -2.74 -1.38 -4.86 -3.50 0.47 1.83
P09_ETUD1564_RT 14.44 11.47 -2.97 11.66 9.02 9.57 8.99 9.04 -2.78 0.19 -5.42 -2.45 -4.87 -1.90 -5.45 -2.48 -5.40 -2.43
P09_RETR1564_RT 12.29 13.29 1.00 15.57 11.26 14.36 22.34 23.93 3.28 2.28 -1.03 -2.03 2.07 1.07 10.05 9.05 11.64 10.64
C09_ACT1564_Agr_RT 1.64 3.11 1.47 4.26 4.54 9.38 32.98 6.36 2.62 1.15 2.90 1.43 7.74 6.27 31.34 29.87 4.72 3.25
C09_ACT1564_ArtCom_RT 5.60 5.82 0.22 6.70 6.09 6.81 7.41 9.26 1.10 0.88 0.49 0.27 1.21 0.99 1.81 1.59 3.66 3.44
C09_ACT1564_Cadr_RT 15.09 9.57 -5.52 12.99 8.37 5.24 6.67 6.17 -2.10 3.42 -6.72 -1.20 -9.85 -4.33 -8.42 -2.90 -8.92 -3.40
C09_ACT1564_ProfInt_RT 24.16 22.22 -1.94 26.85 23.12 16.57 12.66 16.95 2.69 4.63 -1.04 0.90 -7.59 -5.65 -11.50 -9.56 -7.21 -5.27
C09_ACT1564_Empl_RT 28.89 28.62 -0.27 25.25 27.18 26.18 15.47 30.17 -3.64 -3.37 -1.71 -1.44 -2.71 -2.44 -13.42 -13.15 1.28 1.55
C09_ACT1564_Ouvr_RT 23.59 29.64 6.05 23.48 29.96 35.79 21.25 32.80 -0.11 -6.16 6.37 0.32 12.20 6.15 -2.34 -8.39 9.21 3.16
P09_POP0014Y_RT 18.33 19.53 1.20 18.90 23.55 19.36 12.69 14.51 0.57 -0.63 5.22 4.02 1.03 -0.17 -5.64 -6.84 -3.82 -5.02
P09_POP1529Y_RT 18.65 16.79 -1.86 14.62 14.95 15.28 12.04 11.95 -4.03 -2.17 -3.70 -1.84 -3.37 -1.51 -6.61 -4.75 -6.70 -4.84
P09_POP3044Y_RT 20.25 20.32 0.07 20.20 24.25 20.26 15.23 16.35 -0.05 -0.12 4.00 3.93 0.01 -0.06 -5.02 -5.09 -3.90 -3.97
P09_POP4559Y_RT 20.24 20.28 0.04 23.22 19.27 20.85 24.92 21.85 2.98 2.94 -0.97 -1.01 0.61 0.57 4.68 4.64 1.61 1.57
P09_POP6074Y_RT 13.71 13.81 0.10 14.85 11.51 14.43 21.27 20.74 1.14 1.04 -2.20 -2.30 0.72 0.62 7.56 7.46 7.03 6.93
C09_ACTOCC_OUT_RT 66.38 69.23 2.85 80.75 81.90 70.28 47.63 65.42 14.37 11.52 15.52 12.67 3.90 1.05 -18.75 -21.60 -0.96 -3.81
comparaisons <- data.frame()
for (i in NomsGroupesCAH){
  a <- subset(typo, typo$Groupes == i)
  Nb <- nrow(a)
  b <- round(mean(a$P11_POT_FIN), 2)
  bb <- round(mean(a$P11_POT_FIN_RT), 2)
  c <- table(a$CATAEU2010)
  h <- c(i, Nb, b, bb, c)
  comparaisons <- rbind(comparaisons, h, stringsAsFactors= FALSE)
  rm( a, b, bb, c, h, Nb)
} 
colnames(comparaisons) <- c("Groupes", "Nombre", "Moy_P11_POT_FIN", "Moy_P11_POT_FIN_RT", "111","112","120","211","212","221","222","300","400")
mean(typo$P11_POT_FIN)

[1] 927700.5

mean(typo$P11_POT_FIN_RT)

[1] 740.293

tmp <- comparaisons[, c("Groupes", "Nombre", "111","112","120","211","212","221","222","300","400")]
kable(tmp, row.names = F, digits = 1, caption = "Code de Zonage en aire urbaine dans chaque groupe",
      col.names = c("Groupes", "Nombre de communes", "Unité urbaine", "Couronne périurbaine", "Communes multipolarisées", "Unité urbaine", "Couronne périurbaine", "Unité urbaine", "Couronne périurbaine", "Autres communes multipolarisées", "Communes hors influence des pôles"), format = "html") %>%
  kableExtra::add_header_above(c(" " = 2, "Grandes aires urbaines" = 3, "Pôles moyens" = 2, "Petits pôles" = 2," " = 2)) 
Code de Zonage en aire urbaine dans chaque groupe
Grandes aires urbaines
Pôles moyens
Petits pôles
Groupes Nombre de communes Unité urbaine Couronne périurbaine Communes multipolarisées Unité urbaine Couronne périurbaine Unité urbaine Couronne périurbaine Autres communes multipolarisées Communes hors influence des pôles
Groupe 1 PPCQ 659 63 307 64 7 26 13 10 99 70
Groupe 2 PFO 602 4 319 96 4 22 5 4 117 31
Groupe 3 MOARO 882 6 171 119 8 21 44 9 267 237
Groupe 4 VAR 127 0 4 3 0 2 0 0 25 93
Groupe 5 REAV 398 8 26 28 5 3 38 9 82 199

5.3.2 Tableaux simplifiés (pour sorties article ?)

x <- length(NomsGroupesCAH)

table <- compare[, 1:(4+x)]
table[, 5:(4+x)] <- round (table[, 5:(4+x)], 2)

min <- min(table[, c(2, 3, 5:ncol(table))])
max <- max(table[, c(2, 3, 5:ncol(table))])

# Pour donner la description complète et propre de la variable
table <- merge(table, ratio[, 1:2], by.x = "Variable", by.y = "CODE")

# condformat(table) %>%
condformat(table[, c(length(table), 2:(length(table)-1))]) %>% # Pour avoir la description complète des variables
          # rule_fill_bar("Valeur pour la France entière (A)", limits = c(0, 100), low = "darkgreen", high = "darkgreen") %>%
          
          rule_fill_gradient2("France", low = "darkblue", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("CommunesFusionnantes", low = "darkblue", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Groupe 1 PPCQ", low = "darkblue", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Groupe 2 PFO", low = "darkblue", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Groupe 3 MOARO", low = "darkblue", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Groupe 4 VAR", low = "darkblue", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Groupe 5 REAV", low = "darkblue", high = "red", limits = c(min, max)) %>%
          
  theme_caption(caption = "Tableau de comparaison entre les groupes") %>%
  theme_htmlWidget(number_of_entries = nrow(compare))

table2 <- table[, c(length(table), 2:4)]
min <- min(table2[4])
max <- max(table2[4])
colnames(table2) <- c ("Variable", 
                            "Valeur pour la France entière (A)",
                            "Valeur pour les communes fusionnantes (B)",
                            "Différence ComFus/France (B-A)")
print(condformat(table2) %>%
  rule_fill_gradient2("Différence ComFus/France (B-A)", low = "blue", high = "red", limits = c(min, max)) %>%
  theme_caption(caption = "Situation des communes fusionnantes vis-à-vis des communes françaises") %>%
  theme_htmlWidget(number_of_entries = nrow(compare)))


test <- melt(compare[, c(1, 2, 5:(4+x)) ], id.vars = "Variable")
colnames(test) <- c("Variable", "Groupes", "Valeur")
ggplot(test) +
  geom_bar(aes(x = Variable, y = Valeur, fill = Groupes),
           stat = "identity") +
  #  scale_fill_grey() +
  scale_fill_manual(values=c("#a65628", "#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00")) + 
  #  scale_fill_manual(values=c("#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628")) + # Pour 7
  facet_wrap(~ Groupes) +
  coord_flip() + theme_bw()


test <- melt(compare[, c(1, 4, 11, 13, 15, 17, 19) ], id.vars = "Variable")
colnames(test) <- c("Variable", "Différence avec la moyenne des communes fusionnantes", "Valeur")
levels(test$`Différence avec la moyenne des communes fusionnantes`) <- c("France",
                         "Groupe 1", "Groupe 2", "Groupe 3", "Groupe 4", "Groupe 5")
ggplot(test) +
  geom_bar(aes(x = Variable, y = Valeur, fill = `Différence avec la moyenne des communes fusionnantes`),
           stat = "identity") +
  #  scale_fill_grey() +
  scale_fill_manual(values=c("#a65628", "#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00")) + 
  facet_wrap(~ `Différence avec la moyenne des communes fusionnantes`) +
  coord_flip() + theme_bw() +
  labs(title = "Différence avec la moyenne des communes fusionnantes")+ theme(legend.position='none')

5.3.3 Tableaux comparaison groupe par groupe

x <- length(NomsGroupesCAH)
min <- min(compare[, (5+x):ncol(compare)])
max <- max(compare[, (5+x):ncol(compare)])
rm(x)

# Boucle donnant les valeurs pour chaque groupe, avec éléments de comparaison d'un profil avec la moyenne française
for (i in NomsGroupesCAH){
  clusLongGr <- subset(clusLong, clusLong$Groupes == i)
  compare <- merge(moyennesCAH, clusLongGr[, c("variable", "value")], by.x = "Variable", by.y = "variable")
  compare$DiffAvecFr <- compare$value - compare$France
  compare$DiffAvecComFus <- compare$value - compare$CommunesFusionnantes
  compare[, 2:length(compare)] <- round(compare[, 2:length(compare)], 1)

  n <- stringr::str_sub(i, 8, 8)
  assign(paste0("compare_Gr", n), compare)
  # print(kable(compare, row.names = F, caption = i))
  colnames(compare) <- c ("Variable", 
                            "Valeur pour la France entière (A)",
                            "Valeur pour les communes fusionnantes (B)",
                            "Différence ComFus/France (B-A)",
                            "Valeur pour le groupe étudié (C)",
                            "Différence Groupe/France (C-A)",
                            "Différence Groupe/ComFus (C-B)")
#  min <- min(compare[, c("Différence ComFus/France (B-A)", "Différence Groupe/France (C-A)", "Différence Groupe/ComFus (C-B)")])
#  max <- max(compare[, c("Différence ComFus/France (B-A)", "Différence Groupe/France (C-A)", "Différence Groupe/ComFus (C-B)")])

  table <- condformat(compare) %>%
          rule_fill_bar("Valeur pour la France entière (A)", limits = c(0, 100), low = "darkgreen", high = "darkgreen") %>%
          rule_fill_bar("Valeur pour les communes fusionnantes (B)", limits = c(0, 100), low = "darkgreen", high = "darkgreen") %>%
          rule_fill_bar("Valeur pour le groupe étudié (C)", limits = c(0, 100), low = "darkgreen", high = "darkgreen") %>%
          rule_fill_gradient2("Différence ComFus/France (B-A)", low = "darkblue", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Différence Groupe/France (C-A)", low = "darkblue", high = "red",  limits = c(min, max)) %>%
          rule_fill_gradient2("Différence Groupe/ComFus (C-B)", low = "darkblue", high = "red",  limits = c(min, max))%>%
          theme_caption(caption = i) %>%
          theme_htmlWidget(number_of_entries = nrow(compare))
  print(knit_print(table))
  rm(compare, n, table)
} 
[1] “
PPCQ
Variable Valeur pour la France entière (A) Valeur pour les communes fusionnantes (B) Différence ComFus/France (B-A) Valeur pour le groupe étudié (C) Différence Groupe/France (C-A) Différence Groupe/ComFus (C-B)
1 C09_ACT1564_Agr_RT 1.6 3.1 1.5 4.3 2.6 1.2
2 C09_ACT1564_ArtCom_RT 5.6 5.8 0.2 6.7 1.1 0.9
3 C09_ACT1564_Cadr_RT 15.1 9.6 -5.5 13.0 -2.1 3.4
4 C09_ACT1564_Empl_RT 28.9 28.6 -0.3 25.3 -3.6 -3.4
5 C09_ACT1564_Ouvr_RT 23.6 29.6 6.1 23.5 -0.1 -6.2
6 C09_ACT1564_ProfInt_RT 24.2 22.2 -1.9 26.8 2.7 4.6
7 C09_ACTOCC_OUT_RT 66.4 69.2 2.9 80.8 14.4 11.5
8 P09_CHOM1564_RT 11.2 9.9 -1.4 7.4 -3.8 -2.4
9 P09_ETUD1564_RT 14.4 11.5 -3.0 11.7 -2.8 0.2
10 P09_POP0014Y_RT 18.3 19.5 1.2 18.9 0.6 -0.6
11 P09_POP1529Y_RT 18.6 16.8 -1.9 14.6 -4.0 -2.2
12 P09_POP3044Y_RT 20.2 20.3 0.1 20.2 -0.1 -0.1
13 P09_POP4559Y_RT 20.2 20.3 0.0 23.2 3.0 2.9
14 P09_POP6074Y_RT 13.7 13.8 0.1 14.8 1.1 1.0
15 P09_RETR1564_RT 12.3 13.3 1.0 15.6 3.3 2.3
” attr(,“class”) [1] “knit_asis” attr(,“…”) named list() attr(,“html”) [1] TRUE attr(,“knit_cacheable”) [1] NA [1] “
PFO
Variable Valeur pour la France entière (A) Valeur pour les communes fusionnantes (B) Différence ComFus/France (B-A) Valeur pour le groupe étudié (C) Différence Groupe/France (C-A) Différence Groupe/ComFus (C-B)
1 C09_ACT1564_Agr_RT 1.6 3.1 1.5 4.5 2.9 1.4
2 C09_ACT1564_ArtCom_RT 5.6 5.8 0.2 6.1 0.5 0.3
3 C09_ACT1564_Cadr_RT 15.1 9.6 -5.5 8.4 -6.7 -1.2
4 C09_ACT1564_Empl_RT 28.9 28.6 -0.3 27.2 -1.7 -1.4
5 C09_ACT1564_Ouvr_RT 23.6 29.6 6.1 30.0 6.4 0.3
6 C09_ACT1564_ProfInt_RT 24.2 22.2 -1.9 23.1 -1.0 0.9
7 C09_ACTOCC_OUT_RT 66.4 69.2 2.9 81.9 15.5 12.7
8 P09_CHOM1564_RT 11.2 9.9 -1.4 7.0 -4.2 -2.9
9 P09_ETUD1564_RT 14.4 11.5 -3.0 9.0 -5.4 -2.5
10 P09_POP0014Y_RT 18.3 19.5 1.2 23.5 5.2 4.0
11 P09_POP1529Y_RT 18.6 16.8 -1.9 15.0 -3.7 -1.8
12 P09_POP3044Y_RT 20.2 20.3 0.1 24.2 4.0 3.9
13 P09_POP4559Y_RT 20.2 20.3 0.0 19.3 -1.0 -1.0
14 P09_POP6074Y_RT 13.7 13.8 0.1 11.5 -2.2 -2.3
15 P09_RETR1564_RT 12.3 13.3 1.0 11.3 -1.0 -2.0
” attr(,“class”) [1] “knit_asis” attr(,“…”) named list() attr(,“html”) [1] TRUE attr(,“knit_cacheable”) [1] NA [1] “
MOARO
Variable Valeur pour la France entière (A) Valeur pour les communes fusionnantes (B) Différence ComFus/France (B-A) Valeur pour le groupe étudié (C) Différence Groupe/France (C-A) Différence Groupe/ComFus (C-B)
1 C09_ACT1564_Agr_RT 1.6 3.1 1.5 9.4 7.7 6.3
2 C09_ACT1564_ArtCom_RT 5.6 5.8 0.2 6.8 1.2 1.0
3 C09_ACT1564_Cadr_RT 15.1 9.6 -5.5 5.2 -9.9 -4.3
4 C09_ACT1564_Empl_RT 28.9 28.6 -0.3 26.2 -2.7 -2.4
5 C09_ACT1564_Ouvr_RT 23.6 29.6 6.1 35.8 12.2 6.1
6 C09_ACT1564_ProfInt_RT 24.2 22.2 -1.9 16.6 -7.6 -5.6
7 C09_ACTOCC_OUT_RT 66.4 69.2 2.9 70.3 3.9 1.1
8 P09_CHOM1564_RT 11.2 9.9 -1.4 8.5 -2.7 -1.4
9 P09_ETUD1564_RT 14.4 11.5 -3.0 9.6 -4.9 -1.9
10 P09_POP0014Y_RT 18.3 19.5 1.2 19.4 1.0 -0.2
11 P09_POP1529Y_RT 18.6 16.8 -1.9 15.3 -3.4 -1.5
12 P09_POP3044Y_RT 20.2 20.3 0.1 20.3 0.0 -0.1
13 P09_POP4559Y_RT 20.2 20.3 0.0 20.8 0.6 0.6
14 P09_POP6074Y_RT 13.7 13.8 0.1 14.4 0.7 0.6
15 P09_RETR1564_RT 12.3 13.3 1.0 14.4 2.1 1.1
” attr(,“class”) [1] “knit_asis” attr(,“…”) named list() attr(,“html”) [1] TRUE attr(,“knit_cacheable”) [1] NA [1] “
VAR
Variable Valeur pour la France entière (A) Valeur pour les communes fusionnantes (B) Différence ComFus/France (B-A) Valeur pour le groupe étudié (C) Différence Groupe/France (C-A) Différence Groupe/ComFus (C-B)
1 C09_ACT1564_Agr_RT 1.6 3.1 1.5 33.0 31.3 29.9
2 C09_ACT1564_ArtCom_RT 5.6 5.8 0.2 7.4 1.8 1.6
3 C09_ACT1564_Cadr_RT 15.1 9.6 -5.5 6.7 -8.4 -2.9
4 C09_ACT1564_Empl_RT 28.9 28.6 -0.3 15.5 -13.4 -13.1
5 C09_ACT1564_Ouvr_RT 23.6 29.6 6.1 21.3 -2.3 -8.4
6 C09_ACT1564_ProfInt_RT 24.2 22.2 -1.9 12.7 -11.5 -9.6
7 C09_ACTOCC_OUT_RT 66.4 69.2 2.9 47.6 -18.7 -21.6
8 P09_CHOM1564_RT 11.2 9.9 -1.4 6.4 -4.9 -3.5
9 P09_ETUD1564_RT 14.4 11.5 -3.0 9.0 -5.4 -2.5
10 P09_POP0014Y_RT 18.3 19.5 1.2 12.7 -5.6 -6.8
11 P09_POP1529Y_RT 18.6 16.8 -1.9 12.0 -6.6 -4.8
12 P09_POP3044Y_RT 20.2 20.3 0.1 15.2 -5.0 -5.1
13 P09_POP4559Y_RT 20.2 20.3 0.0 24.9 4.7 4.6
14 P09_POP6074Y_RT 13.7 13.8 0.1 21.3 7.6 7.5
15 P09_RETR1564_RT 12.3 13.3 1.0 22.3 10.1 9.1
” attr(,“class”) [1] “knit_asis” attr(,“…”) named list() attr(,“html”) [1] TRUE attr(,“knit_cacheable”) [1] NA [1] “
REAV
Variable Valeur pour la France entière (A) Valeur pour les communes fusionnantes (B) Différence ComFus/France (B-A) Valeur pour le groupe étudié (C) Différence Groupe/France (C-A) Différence Groupe/ComFus (C-B)
1 C09_ACT1564_Agr_RT 1.6 3.1 1.5 6.4 4.7 3.2
2 C09_ACT1564_ArtCom_RT 5.6 5.8 0.2 9.3 3.7 3.4
3 C09_ACT1564_Cadr_RT 15.1 9.6 -5.5 6.2 -8.9 -3.4
4 C09_ACT1564_Empl_RT 28.9 28.6 -0.3 30.2 1.3 1.5
5 C09_ACT1564_Ouvr_RT 23.6 29.6 6.1 32.8 9.2 3.2
6 C09_ACT1564_ProfInt_RT 24.2 22.2 -1.9 17.0 -7.2 -5.3
7 C09_ACTOCC_OUT_RT 66.4 69.2 2.9 65.4 -1.0 -3.8
8 P09_CHOM1564_RT 11.2 9.9 -1.4 11.7 0.5 1.8
9 P09_ETUD1564_RT 14.4 11.5 -3.0 9.0 -5.4 -2.4
10 P09_POP0014Y_RT 18.3 19.5 1.2 14.5 -3.8 -5.0
11 P09_POP1529Y_RT 18.6 16.8 -1.9 11.9 -6.7 -4.8
12 P09_POP3044Y_RT 20.2 20.3 0.1 16.4 -3.9 -4.0
13 P09_POP4559Y_RT 20.2 20.3 0.0 21.8 1.6 1.6
14 P09_POP6074Y_RT 13.7 13.8 0.1 20.7 7.0 6.9
15 P09_RETR1564_RT 12.3 13.3 1.0 23.9 11.6 10.6

” attr(,“class”) [1] “knit_asis” attr(,“…”) named list() attr(,“html”) [1] TRUE attr(,“knit_cacheable”) [1] NA

# Autre possibilité, qui m'a moins convaincue : https://cran.r-project.org/web/packages/kableExtra/vignettes/awesome_table_in_html.html#celltext_specification
# library(formattable)
# library(kableExtra)
# library(dplyr)
# compare_Gr2 %>%
#   mutate (
#     DiffComFusComFr = color_tile("white", "orange") (DiffComFusComFr),
#     DiffAvecFr = color_tile("white", "orange") (DiffAvecFr),
#     DiffAvecComFus = color_tile("white", "orange") (DiffAvecComFus),
#     France = color_bar("lightgreen")(France),
#     CommunesFusionnantes = color_bar("lightgreen")(CommunesFusionnantes),
#     value = color_bar("lightgreen")(value)
#     )%>%
#   kable(escape = F, align = "r", digits = 1) %>%
#   kable_styling(c("striped", "condensed"), full_width = F)

5.3.4 Comparaisons des moyennes

Il est important de préciser que, comme toujours, les détails des calculs statistiques ont toute leur importance. Jusqu’ici, les moyennes ont été calculées sur l’ensemble de la population des ensemble étudiés. Par exemple, le chiffre de 66,38 % d’actifs occupés hors de leur commune de résidence, désigne le nombre de personnes quittant leur commune pour aller travailler. Or, les chiffres sont différents si on fait, désormais, apparaître les moyennes des taux communaux d’actifs occupés hors de leur commune de résidence

# NB : On reprend les données déjà élaborées dans le 5.2.2
# Import données totales
moyennesComCAH <- data.frame()
for (i in selecVarCAH){
  a <- round(mean(df2011[, i], na.rm = TRUE), 2)
  b <- round(median(df2011[, i], na.rm = TRUE), 2)
  c <- round(mean(datafus2011[, i], na.rm = TRUE), 2)
  d <- round(median(datafus2011[, i], na.rm = TRUE), 2)
  
  h <- c(i, a, b, c, d)
  moyennesComCAH <- rbind(moyennesComCAH, h, stringsAsFactors= FALSE)
  rm( a, b, c, d, h)
}
# Pour calcul valeur moyenne retraités ("Inf" vient perturber) : 
# a <- subset(df2011$P09_RETR1564_RT, df2011$P09_RETR1564_RT != Inf)
# mean(a, na.rm =TRUE)
# rm(a)

colnames(moyennesComCAH) <- c("Variable", "Comfr_moy", "Comfr_med", "Comfus_moy", "Comfus_med")
moyennesComCAH <- merge(moyennesComCAH, ratio[, 1:2], by.x = "Variable", by.y = "CODE")
row.names(moyennesComCAH) <- moyennesComCAH$DESCRIPTION
moyennesComCAH[1] <- moyennesComCAH$DESCRIPTION
kable(moyennesComCAH[, 1:5], row.names = FALSE, col.names = c("", "Moyenne", "Médiane", "Moyenne", "Médiane"), digits = 2, format = "html")  %>%
  kableExtra::add_header_above(c("Variable" = 1, "Communes françaises" = 2, "Communes fusionnantes" = 2))
Variable
Communes françaises
Communes fusionnantes
Moyenne Médiane Moyenne Médiane
Part des agriculteurs dans les actifs de 15-64 ans (%) 7.16 3.33 7.69 4.22
Part des artisans, comm., chefs entr. dans les actifs de 15-64 ans (%) 7.03 6.08 7.01 6.15
Part des cadres, prof. intel. sup. dans les actifs de 15-64 ans (%) 9.04 7.84 8.06 7.14
Part des employés dans les actifs de 15-64 ans (%) 26.72 27.04 26.24 26.66
Part des ouvriers dans les actifs de 15-64 ans (%) 28 27.28 30.27 29.88
Part des prof. intermédiaires dans les actifs de 15-64 ans (%) 21.62 21.74 20.44 20
Part des actifs occupés travaillant hors de leur commune de résidence (%) 74.46 78.23 73.69 77.02
Taux de chômage des 15-64 ans (%) 8.74 8.13 8.26 7.82
Part des étudiants, stagiaires, non rémunérés dans les actifs de 15-64 ans (%) 10.22 9.94 9.85 9.48
Part des 0-14 ans dans la population totale (%) 18.67 18.88 19.13 19.46
Part des 15-29 ans dans la population totale (%) 14.22 14.21 14.39 14.43
Part des 30-44 ans dans la population totale (%) 20.33 20.43 20.31 20.41
Part des 45-59 ans dans la population totale (%) 22.03 21.72 21.43 21.15
Part des 60-74 ans dans la population totale (%) 15.35 14.69 15.16 14.57
Part des retraités et pré-retraités dans les actifs de 15-64 ans (%) Inf 14.51 15.78 14.53

Ainsi, il est nécessaire d’être prudent sur l’interprétation des taux de navetteurs, car si la moyenne française est bien d’environ 66 %, la moyenne des communes françaises est supérieur à 74 % et la médiane des communes françaises à 78 %. C’est-à-dire que plus de la moitié des communes françaises ont un taux de navetteur supérieur à 78 % alors que cette médiane n’est que de 76 % chez les communes fusionnantes. Cela étant dû, principalement, à la sous-représentation des navetteurs dans les communes très peuplées (au premier rang desquelles Paris, Lyon, Marseille etc). Par conséquent, la question des navetteurs est davantage quelque chose qui distingue les communes fusionnantes entre elles qu’une caractéristique commune. Pour les autres variables étudiées, il y a moins de différences entre les moyennes globales ou les moyennes par communes.

5.3.5 Analyse de la typologie

Le profil moyen des communes fusionnantes met en avant certaines caractéristiques. Les plus frappantes différence supérieur à 2% vis-à-vis de la moyenne française) sont une sur-représentation, dans l’ordre, des ouvriers, des actifs employés hors de la commune, des agriculteurs et des retraités. Inversement, on observe une sous-représentation des cadres, des étudiants, des 15-29 ans, des chômeurs et des professions intellectuelles.

En particulier, tous les groupes ont, systématiquement, par rapport à la moyenne française, deux caractéristiques communes : d’un côté, plus d’agriculteurs, d’artisans-commerçants ; de l’autre côté, moins de chômeurs, d’étudiants, de cadres, d’employés et de 15-29 ans.

Cette vision générale révèle néanmoins des divergences à l’intérieur du groupe des communes nouvelles. Une classification ascendante hiérarchique nous a permis d’identifier cinq groupes.

Le groupe 1 (rouge, 540 communes) contient des communes appartenant fréquemment à la périphérie des grands pôles urbains (277 communes), avec une sur-représentation, même vis-à-vis de l’ensemble des communes fusionnantes, des actifs travaillant hors de leur commune de résidence. En revanche, ce groupe s’inscrit par plusieurs caractéristiques en contrepoint du profil moyen des communes fusionnantes en ayant davantage de cadres, de professions intellectuelles et de 45-59 ans. On peut dénommer ce groupe le profil “PPCQ” (Proche Périphérie, Cadres, Quinquagénaires). On y retrouve, par exemple, des communes comme Annecy-le-Vieux, Pringy et Seynod (commune nouvelle d’Annecy), les trois communes ayant conduit à la commune nouvelle de Kaysersberg Vignoble1, certaines des communes constituant les communes nouvelles de Cherbourg-en-Cotentin, ou encore la totalité de la commune de Valloire-sur-Cisse (près de Blois).

Le groupe 2 (bleu, 689 communes) est caractérisé par des communes fusionnantes qui sont encore avec un fort taux de navetteurs et fréquemment (320 communes) dans la couronne des pôles urbains mais avec la présence plus importante de communes multipolarisées, soit par de grandes aires urbaines soit par d’autres (respectivement 113 et 163 communes). Il s’agit de communes plus familiales que la moyenne (00-14 ans et 30-44 ans), avec également davantage d’ouvriers. On peut dénommer ce groupe le profil “PFO” (Périphéries Familiales et Ouvrières). Des exemples parmi les plus frappants se retrouvent dans le Maine-et-Loire, formant une couronne autour d’Angers. On peut citer la commune nouvelle de Chemillé-en-Anjou (commune chef-lieu exclue, c’est à noter). On en retrouve également en Normandie (sept des vingt communes de Souleuvre-en-Bocages, huit des dix-neuf communes de La Hague) ou vers les Alpes (comme La Plagne Tarentaise, en Savoie).

Le groupe 3 (vert, 874 communes) révèle des caractéristiques proche du profil moyen des communes fusionnantes. Il est caractérisé, en particulier, par la sur-représentation des ouvriers, des agriculteurs, mais aussi des retraités et des actifs travaillant hors de la commune. On peut d’ailleurs remarquer que les catégories d’aires urbaines les plus représentées sont autres communes multipôlarisées et les communes hors influence des pôles. On peut dénommer ce groupe le profil “MOARO” (Moyen, Ouvriers, Agriculteurs, Retraités, Out). Il est particulièrement présent dans l’Ouest (Pays-de-la-Loire, Bretagne, Normandie) avec neuf des vingt-deux communes de Livarot-Pays-d’Auge (Calvados), la totalité de Saint-Sauveur-Villages (sept communes de la Manche) et neuf des dix communes de Tourouvre au Perche (Orne). À noter que c’est, avec le groupe 1, celui où on peut retrouver des communes centres (23), qui sont dans le groupe 3 par l’importance de leur population ouvrière, comme à La Hague ou Cherbourg.

Le groupe 4 (mauve, 213 communes) contient des communes marquées par une forte présence des retraités, des personnes âgés et des agriculteurs. Il s’agit, très majoritairement (136 communes) de communes hors influences des pôles. On peut, éventuellement, remarquer une présence des ouvriers plus importante que par rapport à la moyenne française (+4,8%) mais qui reste inférieure à la moyenne des communes fusionnantes. On peut bien parler ici de communes “VAR” (Vieillissantes, Agricoles et Rurales). Ces communes se retrouvent sans polarité particulière en France, que ce soit dans l’Ouest avec quatre des six communes de Belforêt-en-Perche (Orne) ou davantage au sud avec trois des quatre communes de Porte-du-Quercy (Lot) et des petits binômes comme Castelnau d’Auzan Labarrère (Gers) ou Castels et Bézenac (Dordogne).

Le groupe 5 (orange, 194 communes), enfin, ressemble au groupe 4 par la présence de populations plus âgées et agricoles mais cette dernière caractéristique est bien plus affirmée, ainsi que le pourcentage de communes hors influences des pôles (127 communes). Surtout, ce dernier élément peut être mis en lien avec le fait que le groupe 5 a beaucoup moins d’actifs travaillant hors de la commune de résidence que la moyenne française ou des communes fusionnantes. On peut donc parler de communes “REAV” (Rurales, Enclavées, Agricoles et Vieillissantes). Ces communes sont décentrées par rapport à l’ensemble des communes nouvelles françaises : elles se trouvent davantage dans la partie sud et sud-est de la France, mais à distance des littoraux, comme par exemple Mont Lozère et Goulet (Lozère) ou la majorité de Neuvéglise-sur-Truyère (Cantal) et Argences en Aubrac (Aveyron).

5.4 Chaque CN est-elle composée d’un seul type en fonction de la typologie réalisée ?

À partir de la typologie réalisée, permettant de catégoriser les communes fusionnantes sur la base de données socio-économiques, nous pouvons étudier la composition des communes nouvelles sur ce plan.

# Définition d'un tableau comportant le nombre de communes fusionnantes par commune nouvelle
count_CN_typo <- plyr::count(typo, "CODGEO_new")

mesCommunes <- count_CN_typo$CODGEO_new
# mesCommunes <- c("61324","73150","73006")
#pourinfo <- subset (typo, CODGEO_new == "61324" | CODGEO_new =="73150" | CODGEO_new == "73006")

df <- typo
results <- data.frame(matrix(ncol=nclass, nrow=0))

for (i in mesCommunes) { # Pour chaque identifiant de commune nouvelle, 
  toto <- subset (df, CODGEO_new == i ) # Ne garder que les communes fusionnantes y ayant participé
  a <- table(toto$Groupes) # Relever les groupes des communes fusionnantes
  results <- rbind(results,a) # Combiner les résultats, par lignes
  rm(a, toto) # Supprimer "a"
}
# On renomme les colonnes
colnames(results) <- NomsGroupesCAH
count_CN_typo <- cbind(count_CN_typo, results)

# On identifie la variable la plus fréquente
count_CN_typo$max2 <- apply(count_CN_typo[, 3:(nclass+2)], 1, function(x) max(x, na.rm = TRUE))
# Quel est le groupe de typo revenant le plus fréquemment dans une CN
count_CN_typo$Typomaj <- colnames(count_CN_typo[, 3:(nclass+2)])[apply(count_CN_typo[, 3:(nclass+2)], 1, which.max)]

# On note si une CN a des communes fusionnantes avec un groupe de typo identique
count_CN_typo$TypoIdent <- ifelse(count_CN_typo$max == count_CN_typo$freq, TRUE, FALSE)
summary(count_CN_typo$TypoIdent)
##    Mode   FALSE    TRUE 
## logical     584     260
# On note si une CN a des communes fusionnantes avec un groupe de typo presque identique (max 25% de communes ayant un type différent)
count_CN_typo$TypopresqIdent <- ifelse((count_CN_typo$freq - count_CN_typo$max2)/count_CN_typo$freq <= 0.25, TRUE, FALSE)
summary(count_CN_typo$TypopresqIdent)
##    Mode   FALSE    TRUE 
## logical     535     309
# On extrait les CN ayant des communes fusionnante avec un groupe de typo identique
CNTypoIdent <- subset(count_CN_typo, TypoIdent==TRUE)
CNTypoIdent <- merge(CNTypoIdent, typo[, c("CODGEO", "Groupes")], by.x = "CODGEO_new", by.y = "CODGEO", all.x = TRUE)

  
# Quel pourcentage de chaque groupe dans les communes nouvelles homogènes ?
tabcont<-summary(CNTypoIdent$Groupes)
# Quel pourcentage de chaque groupe est majoritaire ?
count_CN_typo$Typomaj <- as.factor(count_CN_typo$Typomaj)
tabcont2<-summary(count_CN_typo$Typomaj)
# Pour comparaison : pourcentages de chaque groupe dans les communes fusionnantes
tabcont3<-summary(typo$Groupes)
round(100*prop.table(tabcont,margin=),1) # Pourcentages de chaque groupe en fonction de la totalité des communes nouvelles homogènes
##  Groupe 1 PPCQ   Groupe 2 PFO Groupe 3 MOARO   Groupe 4 VAR  Groupe 5 REAV 
##           33.8           20.8           28.8            2.3           13.1 
##           NA's 
##            1.2
round(100*prop.table(tabcont2,margin=),1) # Pourcentages de chaque groupe majoritaire en fonction de la totalité des communes fusionnantes
##  Groupe 1 PPCQ   Groupe 2 PFO Groupe 3 MOARO   Groupe 4 VAR  Groupe 5 REAV 
##           38.9           22.4           27.3            3.9            7.6
round(100*prop.table(tabcont3,margin=),1) # Pourcentages de chaque groupe en fonction de la totalité des communes fusionnantes
##  Groupe 1 PPCQ   Groupe 2 PFO Groupe 3 MOARO   Groupe 4 VAR  Groupe 5 REAV 
##           24.7           22.6           33.1            4.8           14.9
tableau <- rbind(
  summary(CNTypoIdent$Groupes),
  round(100*prop.table(tabcont,margin=),1) * 100 / nrow(typo),
  round(100*prop.table(tabcont,margin=),1),
  summary(count_CN_typo$Typomaj),
  round(100*prop.table(tabcont2,margin=),1),
  summary(typo$Groupes),
  round(100*prop.table(tabcont3,margin=),1)
)
row.names(tableau) <- c(
  "Nombre de communes nouvelles regroupant des communes homogènes du point de vue de la typologie",
  "Pourcentages en fonction de la totalité des communes nouvelles",
  "Pourcentages en fonction de la totalité des communes nouvelles homogènes",
  "Nombre de communes nouvelles ayant un type majoritaire",
  "Pourcentages de chaque groupe majoritaire en fonction de la totalité des communes fusionnantes",
  "Nombre de communes fusionnantes par groupe",
  "Pourcentages de chaque groupe en fonction de la totalité des communes fusionnantes")

kable(tableau, align = "c", digits = c(0, 1, 1, 0, 1, 0, 1))
Groupe 1 PPCQ Groupe 2 PFO Groupe 3 MOARO Groupe 4 VAR Groupe 5 REAV NA’s
Nombre de communes nouvelles regroupant des communes homogènes du point de vue de la typologie 88 54.0 75.0 6 34.0 3
Pourcentages en fonction de la totalité des communes nouvelles 1 0.8 1.1 0 0.5 0
Pourcentages en fonction de la totalité des communes nouvelles homogènes 34 20.8 28.8 2 13.1 1
Nombre de communes nouvelles ayant un type majoritaire 328 189.0 230.0 33 64.0 328
Pourcentages de chaque groupe majoritaire en fonction de la totalité des communes fusionnantes 39 22.4 27.3 4 7.6 39
Nombre de communes fusionnantes par groupe 659 602.0 882.0 127 398.0 659
Pourcentages de chaque groupe en fonction de la totalité des communes fusionnantes 25 22.6 33.1 5 14.9 25

Conclusion : Une large majorité des communes nouvelles sont, du point de vue de notre typologie, composées de communes au profil hétérogène. Lorsque les communes nouvelles sont homogène du point de vue du profil des communes fusionnantes, il s’agit, plus fréquemment, des groupes 1, 2 et 3. Mais si on compare ces pourcentages à la place de ces groupes dans la population totale, on observe surtout qu’un groupe est bien plus présent dans les communes homogènes que dans la population totale : le groupe 1. Inversement, le groupe 5 est bien moins présent dans les communes nouvelles homogènes que dans l’ensemble des communes fusionnantes. On pourrait donc mettre en avant la création de communes nouvelles plus fréquemment homogènes en contexte urbain.

5.5 Typologie et distance euclidienne

# Import des données concernant la typologie
# typo <- st_read("sorties/typo.gpkg", layer = "typo", quiet = TRUE)
# typo <- subset(typo, ChefLieu == "O")
# count_CN_typo <- plyr::count(typo, "CODGEO_new")

disteucl <- st_read("sorties/disteucl.gpkg", layer = "disteucl", quiet = TRUE)


disteucl <- merge (disteucl, count_CN_typo, by = "CODGEO_new", all.y = FALSE)


GroupesDisteucl <- by(disteucl$dist_CN, disteucl$Typomaj, mean, na.rm = TRUE)
GroupesDisteucl <- data.frame(as.table (GroupesDisteucl))
colnames(GroupesDisteucl) <- c("Typomaj", "mean")
GroupesDisteucl$sd <- as.numeric(by(disteucl$dist_CN, disteucl$Typomaj, sd, na.rm = TRUE))
GroupesDisteucl$median <- as.numeric(by(disteucl$dist_CN, disteucl$Typomaj, median, na.rm = TRUE))
# On rajoute les valeurs moyennes pour faciliter les comparaisons
levels(GroupesDisteucl$Typomaj) <- c(levels (GroupesDisteucl$Typomaj), "Ensemble")
GroupesDisteucl[ nrow(GroupesDisteucl)+1, ] <- c("Ensemble",
                                                 mean(disteucl$dist_CN, na.rm = TRUE),
                                                 sd(disteucl$dist_CN, na.rm = TRUE),
                                                 median(disteucl$dist_CN, na.rm = TRUE))
# Esthétique pour faciliter la lecture
GroupesDisteucl[, 2] <- as.numeric(GroupesDisteucl[, 2])
GroupesDisteucl[, 3] <- as.numeric(GroupesDisteucl[, 3])
GroupesDisteucl[, 4] <- as.numeric(GroupesDisteucl[, 4])
GroupesDisteucl[, 2:4] <- round(GroupesDisteucl[, 2:4], 1)

tmp <- GroupesDisteucl
colnames(tmp) <- c("Groupe majoritaire dans la commune nouvelle", "Moyenne", "Écart-type", "Médiane")
kable(tmp, row.names = F, digits = 1, caption = "Typologie et distance euclidienne intra-communes nouvelles")
Typologie et distance euclidienne intra-communes nouvelles
Groupe majoritaire dans la commune nouvelle Moyenne Écart-type Médiane
Groupe 1 PPCQ 26.2 12.0 24.0
Groupe 2 PFO 23.3 10.8 21.2
Groupe 3 MOARO 29.8 15.3 27.0
Groupe 4 VAR 43.3 14.3 42.8
Groupe 5 REAV 39.2 32.5 32.1
Ensemble 28.2 16.1 25.0
condformat(tmp[, c(1,2, 4)]) %>%
          
          rule_fill_gradient2("Moyenne", low = "darkblue", high = "red", limits = c(min (tmp$Moyenne), max (tmp$Moyenne))) %>%
          rule_fill_gradient2("Médiane", low = "darkblue", high = "red", limits = c(min(tmp$Médiane), max(tmp$Médiane))) %>%
         
  theme_caption(caption = "Typologie et distance euclidienne intra-communes nouvelles") %>%
  theme_htmlWidget(number_of_entries = nrow(tmp))
Typologie et distance euclidienne intra-communes nouvelles
Groupe majoritaire dans la commune nouvelle Moyenne Médiane
1 Groupe 1 PPCQ 26.2 24.0
2 Groupe 2 PFO 23.3 21.2
3 Groupe 3 MOARO 29.8 27.0
4 Groupe 4 VAR 43.3 42.8
5 Groupe 5 REAV 39.2 32.1
6 Ensemble 28.2 25.0

L’observation de la distance euclidienne en fonction des catégories de communes précédemment élaborés permet de visualiser les différences entre les groupes. Les communes dont le type majoritaire est le 1 et le 2, par exemple, sont en moyenne plus homogènes que les communes nouvelles où les groupes 3, 5 et surtout 4 dominent.

5.6 Typologie vis-à-vis de quelques autres données

# Création d'une variable surface
# Si on part de rien, jouer les deux lignes ci-dessous
# typo <- st_read("sorties/typo.gpkg", quiet = TRUE)
comparaisons <- data.frame( table (typo$Groupes))

# Création d'une variable de surface
typo$surface <- st_area(typo) # Attention, unités : m²
typo$surface <- set_units(typo$surface, km^2) # On passe en km²
typo$densite <- typo$P09_POP/typo$surface

comparaisons$surface_moy <- round(tapply (typo$surface, typo$Groupes, mean), 2) # On fait la moyenne de la surface
comparaisons$surface_med <- round(tapply (typo$surface, typo$Groupes, median), 2) # On fait la médiane de la surface

comparaisons$pop_moy <- round(tapply (typo$P09_POP, typo$Groupes, mean), 2) # On fait la moyenne de la population
comparaisons$pop_med <- round(tapply (typo$P09_POP, typo$Groupes, median), 2) # On fait la médiane de la population

comparaisons$dens_moy <- round(tapply (typo$densite, typo$Groupes, mean), 2) # On fait la moyenne de la population
comparaisons$dens_med <- round(tapply (typo$densite, typo$Groupes, median), 2) # On fait la médiane de la population


tmp <- comparaisons[, c("Var1", "Freq", "surface_moy", "surface_med", "pop_moy", "pop_med", "dens_moy", "dens_med")]

colnames(tmp) <- c("Groupe", "Fréquence", "Surface moyenne (km²)", "Surface médiane (km²)", "Population moyenne", "Population médiane", "Densité moyenne", "Densité médiane")

table <- condformat(tmp)%>%
          rule_fill_gradient2("Surface moyenne (km²)", low = "blue", high = "red") %>%
          rule_fill_gradient2("Surface médiane (km²)", low = "blue", high = "red") %>%
          rule_fill_gradient2("Population moyenne", low = "blue", high = "red") %>%
          rule_fill_gradient2("Population médiane", low = "blue", high = "red") %>%
          rule_fill_gradient2("Densité moyenne", low = "blue", high = "red") %>%
          rule_fill_gradient2("Densité médiane", low = "blue", high = "red") %>%
  theme_caption(caption = "Groupes de la typologie vis-à-vis de la surface et de la population des communes fusionnantes") %>%
  theme_htmlWidget(number_of_entries = nrow(tmp))
print(table)
Groupes de la typologie vis-à-vis de la surface et de la population des communes fusionnantes
Groupe Fréquence Surface moyenne (km²) Surface médiane (km²) Population moyenne Population médiane Densité moyenne Densité médiane
1 Groupe 1 PPCQ 659 11.93 9.33 1535.29 426.0 177.65 48.80
2 Groupe 2 PFO 602 13.02 10.70 764.04 499.5 71.07 46.85
3 Groupe 3 MOARO 882 16.89 12.63 884.79 409.0 67.27 34.89
4 Groupe 4 VAR 127 17.63 13.11 191.39 125.0 12.88 10.87
5 Groupe 5 REAV 398 17.09 12.20 1073.68 346.5 97.17 26.84
Showing 1 to 5 of 5 entries.
# On liste, pour chaque région, le nombre de communes appartenant à chaque groupe
typoregions <- data.frame(table(typo$REG, typo$Groupes))


# Import d'un fichier donnant le nom des régions en fonction de leur code : https://www.insee.fr/fr/information/2560625#titre-bloc-29
names <- data.frame(read_excel("data-raw/stats_insee/table-appartenance-geo-communes-11.xls", sheet = "Niv_supracom", skip = 5))
names <- subset(names , names$NIVGEO == "REG")
typoregions <- merge (typoregions, names[, c("CODGEO", "LIBGEO")], by.x = "Var1", by.y = "CODGEO", all.x = TRUE, all.y = FALSE)

# Pour avoir les groupes en colonnes, plus pertinent de le faire avant l'ajout des noms
typoregions1 <- dcast(typoregions, LIBGEO ~ Var2, value.var = "Freq")

# Pour avoir les régions en colonnes
typoregions2 <- dcast(typoregions, Var2 ~ LIBGEO, value.var = "Freq")


min <- min(typoregions1[, 2:ncol(typoregions1)])
max <- max(typoregions1[, 2:ncol(typoregions1)])

# Si le format choisi est avec les groupes en colonnes
table <- condformat(typoregions1) %>% # ici les couleurs sont définies par les limites min/max
          rule_fill_gradient2("Groupe 1 PPCQ", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Groupe 2 PFO", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Groupe 3 MOARO", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Groupe 4 VAR", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Groupe 5 REAV", low = "white", high = "red", limits = c(min, max))
print(table)
LIBGEO Groupe 1 PPCQ Groupe 2 PFO Groupe 3 MOARO Groupe 4 VAR Groupe 5 REAV
1 Alsace 23 10 6 1 0
2 Aquitaine 25 16 21 5 35
3 Auvergne 7 1 17 12 4
4 Basse-Normandie 123 110 222 27 104
5 Bourgogne 26 13 21 3 18
6 Bretagne 17 26 54 4 13
7 Centre 29 37 41 9 13
8 Champagne-Ardenne 15 9 31 2 8
9 Franche-Comté 45 41 47 3 15
10 Haute-Normandie 70 58 38 1 10
11 Île-de-France 24 1 2 0 0
12 Languedoc-Roussillon 18 3 24 9 16
13 Limousin 10 0 7 3 15
14 Lorraine 12 5 9 1 7
15 Midi-Pyrénées 20 8 22 33 34
16 Nord-Pas-de-Calais 4 5 6 0 5
17 Pays de la Loire 45 140 152 3 27
18 Picardie 29 23 14 0 3
19 Poitou-Charentes 25 34 82 4 44
20 Provence-Alpes-Côte d'Azur 5 1 11 2 8
21 Rhône-Alpes 87 61 55 5 19
Showing 1 to 10 of 21 entries.
table2 <- condformat(typoregions1) %>% # ici les couleurs sont les min/max automatiques, par colonnes
          rule_fill_gradient2("Groupe 1 PPCQ", low = "blue", high = "red") %>%
          rule_fill_gradient2("Groupe 2 PFO", low = "blue", high = "red") %>%
          rule_fill_gradient2("Groupe 3 MOARO", low = "blue", high = "red") %>%
          rule_fill_gradient2("Groupe 4 VAR", low = "blue", high = "red") %>%
          rule_fill_gradient2("Groupe 5 REAV", low = "blue", high = "red")
print(table2)
LIBGEO Groupe 1 PPCQ Groupe 2 PFO Groupe 3 MOARO Groupe 4 VAR Groupe 5 REAV
1 Alsace 23 10 6 1 0
2 Aquitaine 25 16 21 5 35
3 Auvergne 7 1 17 12 4
4 Basse-Normandie 123 110 222 27 104
5 Bourgogne 26 13 21 3 18
6 Bretagne 17 26 54 4 13
7 Centre 29 37 41 9 13
8 Champagne-Ardenne 15 9 31 2 8
9 Franche-Comté 45 41 47 3 15
10 Haute-Normandie 70 58 38 1 10
11 Île-de-France 24 1 2 0 0
12 Languedoc-Roussillon 18 3 24 9 16
13 Limousin 10 0 7 3 15
14 Lorraine 12 5 9 1 7
15 Midi-Pyrénées 20 8 22 33 34
16 Nord-Pas-de-Calais 4 5 6 0 5
17 Pays de la Loire 45 140 152 3 27
18 Picardie 29 23 14 0 3
19 Poitou-Charentes 25 34 82 4 44
20 Provence-Alpes-Côte d'Azur 5 1 11 2 8
21 Rhône-Alpes 87 61 55 5 19
Showing 1 to 10 of 21 entries.
# Si le format choisi est avec les régions en colonnes
table3 <- condformat(typoregions2) %>% # ici les couleurs sont les min/max automatiques, par colonnes
          rule_fill_gradient2("Alsace", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Aquitaine", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Auvergne", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Basse-Normandie", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Bourgogne", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Bretagne", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Centre", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Champagne-Ardenne", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Franche-Comté", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Haute-Normandie", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Île-de-France", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Languedoc-Roussillon", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Limousin", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Lorraine", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Midi-Pyrénées", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Nord-Pas-de-Calais", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Pays de la Loire", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Picardie", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Poitou-Charentes", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Provence-Alpes-Côte d'Azur", low = "white", high = "red", limits = c(min, max)) %>%
          rule_fill_gradient2("Rhône-Alpes", low = "white", high = "red", limits = c(min, max))
print(table3)
Var2 Alsace Aquitaine Auvergne Basse-Normandie Bourgogne Bretagne Centre Champagne-Ardenne Franche-Comté Haute-Normandie Île-de-France Languedoc-Roussillon Limousin Lorraine Midi-Pyrénées Nord-Pas-de-Calais Pays de la Loire Picardie Poitou-Charentes Provence-Alpes-Côte d'Azur Rhône-Alpes
1 Groupe 1 PPCQ 23 25 7 123 26 17 29 15 45 70 24 18 10 12 20 4 45 29 25 5 87
2 Groupe 2 PFO 10 16 1 110 13 26 37 9 41 58 1 3 0 5 8 5 140 23 34 1 61
3 Groupe 3 MOARO 6 21 17 222 21 54 41 31 47 38 2 24 7 9 22 6 152 14 82 11 55
4 Groupe 4 VAR 1 5 12 27 3 4 9 2 3 1 0 9 3 1 33 0 3 0 4 2 5
5 Groupe 5 REAV 0 35 4 104 18 13 13 8 15 10 0 16 15 7 34 5 27 3 44 8 19
Showing 1 to 5 of 5 entries.
table4 <- condformat(typoregions2) %>% # ici les couleurs sont les min/max automatiques, par colonnes
          rule_fill_gradient2("Alsace", low = "white", high = "red") %>%
          rule_fill_gradient2("Aquitaine", low = "white", high = "red") %>%
          rule_fill_gradient2("Auvergne", low = "white", high = "red") %>%
          rule_fill_gradient2("Basse-Normandie", low = "white", high = "red") %>%
          rule_fill_gradient2("Bourgogne", low = "white", high = "red") %>%
          rule_fill_gradient2("Bretagne", low = "white", high = "red") %>%
          rule_fill_gradient2("Centre", low = "white", high = "red") %>%
          rule_fill_gradient2("Champagne-Ardenne", low = "white", high = "red") %>%
          rule_fill_gradient2("Franche-Comté", low = "white", high = "red") %>%
          rule_fill_gradient2("Haute-Normandie", low = "white", high = "red") %>%
          rule_fill_gradient2("Île-de-France", low = "white", high = "red") %>%
          rule_fill_gradient2("Languedoc-Roussillon", low = "white", high = "red") %>%
          rule_fill_gradient2("Limousin", low = "white", high = "red") %>%
          rule_fill_gradient2("Lorraine", low = "white", high = "red") %>%
          rule_fill_gradient2("Midi-Pyrénées", low = "white", high = "red") %>%
          rule_fill_gradient2("Nord-Pas-de-Calais", low = "white", high = "red") %>%
          rule_fill_gradient2("Pays de la Loire", low = "white", high = "red") %>%
          rule_fill_gradient2("Picardie", low = "white", high = "red") %>%
          rule_fill_gradient2("Poitou-Charentes", low = "white", high = "red") %>%
          rule_fill_gradient2("Provence-Alpes-Côte d'Azur", low = "white", high = "red") %>%
          rule_fill_gradient2("Rhône-Alpes", low = "white", high = "red")
print(table4)
Var2 Alsace Aquitaine Auvergne Basse-Normandie Bourgogne Bretagne Centre Champagne-Ardenne Franche-Comté Haute-Normandie Île-de-France Languedoc-Roussillon Limousin Lorraine Midi-Pyrénées Nord-Pas-de-Calais Pays de la Loire Picardie Poitou-Charentes Provence-Alpes-Côte d'Azur Rhône-Alpes
1 Groupe 1 PPCQ 23 25 7 123 26 17 29 15 45 70 24 18 10 12 20 4 45 29 25 5 87
2 Groupe 2 PFO 10 16 1 110 13 26 37 9 41 58 1 3 0 5 8 5 140 23 34 1 61
3 Groupe 3 MOARO 6 21 17 222 21 54 41 31 47 38 2 24 7 9 22 6 152 14 82 11 55
4 Groupe 4 VAR 1 5 12 27 3 4 9 2 3 1 0 9 3 1 33 0 3 0 4 2 5
5 Groupe 5 REAV 0 35 4 104 18 13 13 8 15 10 0 16 15 7 34 5 27 3 44 8 19
Showing 1 to 5 of 5 entries.
# On liste, pour chaque département, le nombre de communes appartenant à chaque groupe
# méthode #
dep_typo <- unique(typo$CODE_DEPT)
typodep <- data.frame()
for (i in dep_typo) {
  numero <- i
  subset <- subset (typo, CODE_DEPT == i)
  b <- table(subset$Groupes)
 resultdep <- c(numero, b)
 typodep <- rbind (typodep, resultdep, stringsAsFactors = FALSE)
 rm(numero, subset, b, resultdep)
}

# méthode 2 (revient au môme)
typodep <- data.frame(table(typo$CODE_DEPT, typo$Groupes))
typodep <- dcast(typodep, Var1 ~ Var2)


# Cartographie
dep <- merge(dep, typodep, by.x = "CODE_DEPT", by.y = "Var1", all.x = TRUE)
dep[is.na(dep)] <- 0

# Manipulation des noms de groupes car sinon variables non reconnues
NomsGroupesCAH2 <- str_replace_all(NomsGroupesCAH, " ", "_")
colnames(dep)[4:8] <- NomsGroupesCAH2

par(mfrow=c(2,3)) 
i <- NomsGroupesCAH2[5]
for (i in NomsGroupesCAH2) {
plot(st_geometry(dep))
propSymbolsLayer(x = dep,
                 var = i, symbols ="circle",
                 col =  "#B00EF0",
                 legend.pos = "left",
                 legend.title.txt = "Nombre de communes fusionnantes", inches = 0.2, fixmax = 150)
}

6. ANALYSES BIVARIÉES

6.0 Préparation des données

geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE) # Les communes selon la géographie en vigueur au 1er janvier 2011.
geom_new <- st_read("data/geom.gpkg", layer = "geom_new", quiet = TRUE) # L'ensemble des communes au 01/01/2025, selon la géographie en vigueur.
# NB : dans geom_new, les communes nouvelles ont comme caractéristiques l'addition des stock des communes qui les composent.
geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE) # Les  communes qui ont participé à la création de communes nouvelles (appelées communes fusionnantes).
geomCN_new <- st_read("data/geom.gpkg", layer = "geomCN_new", quiet = TRUE) # Les  communes nouvelles, avec les géométries au 1er janvier 2025 et caractérisées par les données à la géométrie 2011 agrégées.
dep <- st_read("data/geom.gpkg", layer = "dep", quiet = TRUE) # Départements

# Import des données
load("data/refdata.Rdata")


datafus2011 <- subset(df2011, COM_NOUV == "OUI") # Désigne les données concernant les communes ayant participé à la création d'une commune nouvelle, appelées ici communes fusionnantes
dataCN_new <- subset(df_new, COM_NOUV == "OUI") # Les  communes nouvelles, avec les géométries au 1er janvier 2025 et caractérisées par les données à la géométrie 2011 agrégées.
dataNfus2011 <- subset(df2011, COM_NOUV == "NON") # Les communes, à la géométrie 2011, qui n'ont pas participé à la création d'une commune nouvelle

# Appariement des données
geom2011 <- merge(geom2011, df2011, by = "CODGEO")
geom_new <- merge(geom_new, df_new, by = "CODGEO_new")
geomCN_new <- merge(geomCN_new, dataCN_new, by = "CODGEO_new")
geomfus2011 <- merge(geomfus2011, datafus2011, by = "CODGEO")

# Définition de sous-ensembles
testEdC <- subset (geom2011, CODGEO_new == "61324" | CODGEO_new =="73150" | CODGEO_new == "73006")
testEdCSavoie <- subset (geom2011, CODGEO_new =="73150" | CODGEO_new == "73006")
testNormandie <- subset (geom2011, REG == "23" | REG == "25")
test49 <- subset (geom2011, CODE_DEPT == "49" )
testOuest <- subset (geom2011, REG == "23" | REG == "25"| REG == "53"| REG == "52") # Normandies, Bretagne, Pays-de-la-Loire

# Import des données de la typologie
typo <- st_read("sorties/typo.gpkg", quiet = TRUE)

6.1 Croisement de la typologie avec d’autres variables

Y <- typo$P11_POT_FIN / typo$P09_POP
Y [1:10]
##  [1]  587.2569  605.2329  975.9486  661.8765  796.7216  575.3696  702.9351
##  [8] 1028.8303 1018.0400  619.4632
# Pour variables qualitatives
summary(Y)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   296.8   490.6   592.0   740.3   765.4 48890.3
Y<-cut(Y,breaks=c(quantile(Y)))
levels(Y)<-c("Q1","Q2", "Q3", "Q4")
Y [1:10]
##  [1] Q2 Q3 Q4 Q3 Q4 Q2 Q3 Q4 Q4 Q3
## Levels: Q1 Q2 Q3 Q4
X<-typo$Groupes
X [1:10]
##  [1] "Groupe 1 PPCQ"  "Groupe 2 PFO"   "Groupe 3 MOARO" "Groupe 1 PPCQ" 
##  [5] "Groupe 3 MOARO" "Groupe 3 MOARO" "Groupe 3 MOARO" "Groupe 2 PFO"  
##  [9] "Groupe 2 PFO"   "Groupe 1 PPCQ"
tabcont<-table(X,Y)
tabcont # En valeur absolue
##                 Y
## X                 Q1  Q2  Q3  Q4
##   Groupe 1 PPCQ  166 173 158 162
##   Groupe 2 PFO   233 173 107  89
##   Groupe 3 MOARO 210 218 229 224
##   Groupe 4 VAR     4  23  47  53
##   Groupe 5 REAV   53  80 126 139
round(100*prop.table(tabcont,margin=1),1) # Pourcentages, le total se fait par lignes
##                 Y
## X                  Q1   Q2   Q3   Q4
##   Groupe 1 PPCQ  25.2 26.3 24.0 24.6
##   Groupe 2 PFO   38.7 28.7 17.8 14.8
##   Groupe 3 MOARO 23.8 24.7 26.0 25.4
##   Groupe 4 VAR    3.1 18.1 37.0 41.7
##   Groupe 5 REAV  13.3 20.1 31.7 34.9
round(100*prop.table(tabcont,margin=),1) # Pourcentages, le total se fait sur l'ensemble de la population
##                 Y
## X                 Q1  Q2  Q3  Q4
##   Groupe 1 PPCQ  6.2 6.5 5.9 6.1
##   Groupe 2 PFO   8.7 6.5 4.0 3.3
##   Groupe 3 MOARO 7.9 8.2 8.6 8.4
##   Groupe 4 VAR   0.1 0.9 1.8 2.0
##   Groupe 5 REAV  2.0 3.0 4.7 5.2
round(100*prop.table(tabcont,margin=2),1) # Pourcentages, le total se fait par colonnes
##                 Y
## X                  Q1   Q2   Q3   Q4
##   Groupe 1 PPCQ  24.9 25.9 23.7 24.3
##   Groupe 2 PFO   35.0 25.9 16.0 13.3
##   Groupe 3 MOARO 31.5 32.7 34.3 33.6
##   Groupe 4 VAR    0.6  3.4  7.0  7.9
##   Groupe 5 REAV   8.0 12.0 18.9 20.8

6.2 Test du Chi-2

Y <- testOuest$FUSION
# Pour variables qualitatives
summary(Y)
# Y<-cut(Y,breaks=c(quantile(Y)))
# levels(Y)<-c("Q1","Q2", "Q3", "Q4")
X <- testOuest$C09_ACTOCC

head(testOuest)

summary(X)
tabcont<-table(X,Y)
tabcont # En valeur absolue
round(100*prop.table(tabcont,margin=1),1) # Pourcentages, le total se fait par lignes
round(100*prop.table(tabcont,margin=),1) # Pourcentages, le total se fait sur l'ensemble de la population
round(100*prop.table(tabcont,margin=2),1) # Pourcentages, le total se fait par colonnes


test<-chisq.test(tabcont)
test$observed
round(test$expected,1)
round(test$residuals,2)
test

6.3 Test de Fisher

6.4 ANOVA

Cf. http://perso.ens-lyon.fr/lise.vaudor/grimoireStat/_book/modeliser-le-lien-entre-deux-variables.html#lanova-lien-entre-une-variable-categorielle-et-une-variable-quantitative (@vaudor2018) mais aussi @feuillet2019 qui conseille, page 49, de préférer l’ANOVA au test de Fischer si la variable quantitative a plus de deux modalités.

7 - ÉTUDE DES NAVETTES

Nous l’avons vu, les communes fusionnantes sont marquées, plus que l’ensemble des communes françaises, par le phénomène de “migrations pendulaires” ou “navettes domicile-travail” intercommunales : la commune de résidence n’est pas la commune de travail. Il est, par conséquent, important de s’attarder sur ce point.

Les communes nouvelles constituent, de fait, des ensembles statistiques nouveaux. Leur périmètre est parfois présenté comme plus cohérent au vu des territoires vécus, par exemple concernant les flux domicile-travail. Il est intéressant de comparer cet argument rarement chiffré aux données de l’INSEE concernant les migrations pendulaires.

7.0 Préparation des données

geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE) # Les communes selon la géographie en vigueur au 1er janvier 2011.
load("data/refdata.Rdata")
rm(df_new)
df2011 <- df2011[, c("LIBGEO_new", "CODGEO_new", "LIBGEO", "CODGEO", "ChefLieu", "CATAEU2010", "FusPhas", "COM_NOUV", "FUSION", "P09_POP", "REG", "CODE_DEPT")]
geom2011 <- merge(geom2011, df2011, by = "CODGEO")

7.1 Données et méthodes utilisées pour l’étude des navettes

L’INSEE fournit de nombreux fichiers concernant les navettes, disponibles ici : https://www.insee.fr/fr/statistiques/2022117. L’ensemble des données ne sont présentes que dans le document BTT_FM_DTR_2009.txt (le fichier BTT_FM_DTR_2009.xls ne comprend que les flux supérieurs à 100 unités ou les données concernant le nombre de navetteurs pour une commune donnée). Dans ce fichier, chaque flux est défini par sa commune de départ, sa commune d’arrivée et son volume (nombre de navetteurs). Il s’agit des données 2009, à la géographie en vigueur au 1er janvier 2011. Les métadonnées sont précisées dans le fichier BTX_FM_DTR_2009.xls.

# Import de l'intégralité des flux
NavettesToutes <- read.csv2("data-raw/Flux_domicile_travail/BTT_FM_DTR_2009.txt", stringsAsFactors=TRUE)

Pour exploiter ces données, nous nous sommes appuyés sur le package flows, dont la démarche est présentée ici (https://cran.r-project.org/web/packages/flows/vignettes/flows.html) (@giraud2016) et là (https://journals.openedition.org/netcom/2134) (@beauguitte2015).

# On choisit les données qu'on veut étudier pour les CN enquêtées
# Si on veut utiliser les données de démonstration du package flows
# data(nav)
# Si on veut toutes les données
nav <- NavettesToutes
# Si on veut toutes les communes nouvelles enquêtées
nav <- subset(NavettesToutes,
              CODGEO == "61155" | DCLT == "61155" | CODGEO == "61324" | DCLT == "61324"
              | CODGEO == "61455" | DCLT == "61455" | CODGEO == "73006" | DCLT == "73006" 
              | CODGEO == "73038" | DCLT == "73038" | CODGEO == "73093" | DCLT == "73093"
              | CODGEO == "73126" | DCLT == "73126" | CODGEO == "73150" | DCLT == "73150"
              | CODGEO == "73169" | DCLT == "73169" | CODGEO == "73305" | DCLT == "73305") 
# Pour ne prendre que les communes enquêtées en Savoie
nav <- subset(NavettesToutes, CODGEO == "73006" | DCLT == "73006" 
              | CODGEO == "73038" | DCLT == "73038" | CODGEO == "73093" | DCLT == "73093"
              | CODGEO == "73126" | DCLT == "73126" | CODGEO == "73150" | DCLT == "73150"
              | CODGEO == "73169" | DCLT == "73169" | CODGEO == "73305" | DCLT == "73305")
# Pour ne prendre que les communes fusionnantes de Passais-Villages
nav <- subset(NavettesToutes,  CODGEO == "61155" | DCLT == "61155" | CODGEO == "61324" | DCLT == "61324"
              | CODGEO == "61455" | DCLT == "61455") 
# Pour ne prendre que Aime (entrées et sorties)
nav <- subset(NavettesToutes, CODGEO == "73006" | DCLT == "73006")

# Préparation des données pour qu'elles soient adaptées au package
nav$CODGEO <- as.character(nav$CODGEO)
nav$DCLT <- as.character(nav$DCLT)
nav$L_DCLT <- as.character(nav$L_DCLT)

myflows <- prepflows(mat = nav, i = "CODGEO", j = "DCLT", fij = "NBFLUX_C09_ACTOCC15P")
myflows[1:4,1:4]
##       04096 05046 10323 29135
## 04096     0     0     0     0
## 05046     0     0     0     0
## 10323     0     0     0     0
## 29135     0     0     0     0
diag(myflows) <- 0

7.2 Premiers aperçus des flux

str(nav)
## 'data.frame':    98 obs. of  5 variables:
##  $ CODGEO              : chr  "04096" "05046" "10323" "29135" ...
##  $ LIBGEO              : Factor w/ 34125 levels "Aast","Abainville",..: 12939 9283 24425 16952 19836 30191 6125 9991 24257 28325 ...
##  $ DCLT                : chr  "73006" "73006" "73006" "73006" ...
##  $ L_DCLT              : chr  "Aime" "Aime" "Aime" "Aime" ...
##  $ NBFLUX_C09_ACTOCC15P: num  4 4.05 3.18 4.09 4.72 ...
# Affichage de graphiques
statmat(mat = myflows, output = "all", verbose = FALSE)

# Affichage de statistiques
statmat(mat = myflows, output = "none", verbose = TRUE)
## matrix dimension: 77 X 77 
## nb. links: 97 
## density: 0.01657553 
## nb. of components (weak) 1 
## nb. of components (weak, size > 1) 1 
## sum of flows: 1602.16 
## min: 0.791505 
## Q1: 3.890673 
## median: 4.033352 
## Q3: 8.156913 
## max: 252.8937 
## mean: 16.51711 
## sd: 37.39685

7.3 Sélection de certains flux

Grâce au package flows, plusieurs fonctions permettent de sélectionner certains flux. Parmi ces fonctions, On peut utiliser : - nfirst: sélectionne les k premiers flux de toutes les origines; - xfirst: sélectionne tous les flux supérieurs à un seuil k; - xsumfirst: sélectionne autant de flux que nécessaire pour chaque origine afin que leur somme soit au moins égale à k.

# Sélection des premiers flux
flowSel1 <- firstflows(mat = myflows, method = "nfirst", ties.method = "first",
                       k = 1)
# Selection des flux > 500
flowSel1 <- firstflowsg(mat = myflows, method = "xfirst", k = 5)

# Sélection à partir de plusieurs conditions
# Sélection des flux qui représentent au moins 20% des départs de la commune
flowSel1 <- firstflows(mat = myflows/rowSums(myflows)*100, method = "xfirst", k = 1)
# Applique le 2e critère de Nystuen et Dacey (1961) :
# On garde le flux fij si la somme des flux reçus par j est supérieure à la somme des flux reçus par i.
# Sinon, on garde le flux fji.
flowSel2 <- domflows(mat = myflows, w = colSums(myflows), k = 1)

# On multiplie pour obtenir uniquement les flux souhaités (flowSel 1 et 2 sont binaires)
flowSel <- myflows * flowSel1 * flowSel2

# Si on souhaite prendre tous les flux
flowSel <- myflows 

# Comparaison de la matrice initiale et de la matrice avec les flux sélectionnés
compmat(mat1 = myflows, mat2 = myflows * flowSel, digits = 1)
##                mat1     mat2  absdiff reldiff
## nblinks        97.0     97.0      0.0     0.0
## sumflows     1602.2 160721.4 159119.2  9931.5
## connectcompx    1.0      1.0      0.0      NA
## min             0.8      0.6       NA      NA
## Q1              3.9     15.1       NA      NA
## median          4.0     16.3       NA      NA
## Q3              8.2     66.5       NA      NA
## max           252.9  63955.2       NA      NA
## mean           16.5   1656.9       NA      NA
## sd             37.4   8019.2       NA      NA

7.4 Calculs des départs/arrivées totaux et de quelques indicateurs

Sur les indicateurs calculés, cf. http://grasland.script.univ-paris-diderot.fr/agreg/module6/index.html

# 1e solution
# On réalise un dataframe à partir de la matrice des flux pour pouvoir ajouter des données
# Flux <- as.data.frame(myflows)
# Calcul de la somme de chaque ligne (pour avoir la somme des départs)
# Flux$DépartsTotaux <- apply(Flux, 1, sum)
#Flux <- rbind(Flux, apply(Flux, 2, sum))

# 2e solution, en créant des dataframes à part
inflows <- data.frame(id = colnames(flowSel), w = colSums(flowSel))
outflows <- data.frame(id = rownames(flowSel), w = apply(flowSel, 1, sum))

# Attention, ne prennent en compte que les flux entrant ou sortant des communes sélectionnées
FluxTotaux <- merge(inflows, outflows, by = "id", all.x = TRUE)
navNames <- unique(NavettesToutes[, c("DCLT", "L_DCLT")])
FluxTotaux <- merge(FluxTotaux, navNames, by.x = "id", by.y = "DCLT", all.x = TRUE)
colnames(FluxTotaux)[2] <- "Arrivées"
colnames(FluxTotaux)[3] <- "Départs"
# FluxTotaux[order(FluxTotaux$Arrivées, decreasing = TRUE),][1:10,] # Affichage des communes qui attirent le plus
# FluxTotaux[order(FluxTotaux$Départs.Sorties, decreasing = TRUE),][1:10,] # Affichage des communes qui ont le plus de sorties

# Attention, n'a de sens que pour les communes qui ont la totalité de leurs flux renseignés
FluxTotaux$Volume <- FluxTotaux$Arrivées + FluxTotaux$Départs
FluxTotaux$Solde <- FluxTotaux$Arrivées - FluxTotaux$Départs
FluxTotaux$Attractivité <- FluxTotaux$Solde / FluxTotaux$Volume

7.5 Introduction aux pôles dominants/intermédiaires/dominés

# Transformation des géométries en un spdf utilisable pour la cartographie
ShpCommunes2011 <- as(geom2011, "Spatial")

# Que Passais-Villages
ShpEdC <- subset(ShpCommunes2011, CODGEO_new == "61324")
ShpEdC <- subset(ShpCommunes2011, CODE_DEPT == "61" | CODE_DEPT == "53")

# Que communes nouvelles étudiées en Savoie
ShpEdC <- subset(ShpCommunes2011, CODGEO_new =="73150" | CODGEO_new == "73006")

# rm(ShpCommunes2011)

sp::plot(ShpEdC, col = "#cceae7")
plotMapDomFlows(mat = flowSel, spdf = ShpEdC, spdfid = "CODGEO", w = inflows, wid = "id",
                wvar = "w", wcex = 0.05, add = TRUE,
                legend.flows.pos = "topright",
                legend.flows.title = "Nb. of commuters")
title("Dominant Flows of Commuters")
mtext(text = "INSEE, 2011", side = 4, line = -1, adj = 0.01, cex = 0.8)

Le package flows propose de catégoriser les entités en pôles dominants/intermédiaires/dominés. Ils sont définis selon les règles suivantes : (1) le flux le plus important de i est émis en direction de j ; (2) la somme des flux reçus par j est supérieure à la somme des flux reçus par i. - i est dominé si son flux le plus important est émis vers j qui reçoit un volume de flux plus important que lui. - j est intermédiaire si son flux le plus important est émis vers k qui reçoit un volume de flux plus important que lui et que, par ailleurs, il domine i. - k est dominant si son flux le plus important est vers un nœud qui reçoit un volume de flux moins important que lui.

# Ce script donne la liste des unités appartenant à chacune des catégories.
# https://gist.github.com/rCarto/f06aabf2852e4a9b8ba51e93c17eb5f6

Dominated <- colnames(flowSel)[colSums(flowSel) == 0]
Dominant <- rownames(flowSel)[rowSums(flowSel) == 0]
Intermediary <- rownames(flowSel)[!rownames(flowSel) %in% c(Dominant, Dominated)]
head(Dominated)
## [1] "04096" "05046" "10323" "29135" "34172" "34301"
head(Intermediary)
## [1] "73003" "73006" "73011" "73015" "73032" "73038"
head(Dominant)
## [1] "ZZZZZ" "16015" "57221" "73034" "73057" "73132"
# Pour cartographie
# labelLayer(spdf = ShpEdC[ShpEdC@data$CODGEO %in% Dominated,], txt = "CODGEO", col= "red")
# labelLayer(spdf = ShpEdC[ShpEdC@data$CODGEO %in% Dominant,], txt = "CODGEO", col= "blue")
# labelLayer(spdf = ShpEdC[ShpEdC@data$CODGEO %in% Intermediary,], txt = "CODGEO", col= "green")

7.6 Catégorisation de toutes les communes fusionnantes (par itérations successives)

Nous souhaitons observer la composition des communes nouvelles du point de vue de cette catégorisation en pôles dominants/intermédiaires/dominés.

7.6.0 Liste des tests effectues

xfirst05_domflows1 : On sélectionne tous les flux supérieurs à 5 personnes xfirst50pct_domflows1 : On sélectionne tous les flux représentant au moins 50% des navetteurs xfirst20pct_domflows1 : On sélectionne tous les flux représentant au moins 20% des navetteurs sumfirst60_domflows1 : On sélectionne tous les flux pour que leur addition représente au moins 60 % des flux.

7.6.1 Boucle pour nombreuses sorties

7.6.1.1 Réalisation des tests

# Script permettant de lancer les analyses des flux pour différents paramètres
# Lancé sur le serveur R d'Humanum fin mars 2021
# Export des résultats globaux dans sorties/Navettes et des synthèses dans sortie/

# Import des données  =======
geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE) # Les  communes qui ont participé à la création de communes nouvelles (appelées communes fusionnantes).
load("data/refdata.Rdata")
df2011 <- df2011[, c("LIBGEO_new", "CODGEO_new", "LIBGEO", "CODGEO", "ChefLieu", "COM_NOUV")]
datafus2011 <- subset(df2011, COM_NOUV == "OUI") # Désigne les données concernant les communes ayant participé à la création d'une commune nouvelle, appelées ici communes fusionnantes
geomfus2011 <- merge(geomfus2011, datafus2011, by = "CODGEO")
# testEdC <- subset (geomfus2011, CODGEO_new == "61324" | CODGEO_new =="73150" | CODGEO_new == "73006")
# testEdCSavoie <- subset (geomfus2011, CODGEO_new =="73150" | CODGEO_new == "73006")
NavettesToutes <- read.csv2("data-raw/Flux_domicile_travail/BTT_FM_DTR_2009.txt", stringsAsFactors=TRUE)


# Définition d'un vecteur avec les identifiants des communes nouvelles
mesCommunes <- unique(datafus2011$CODGEO_new)
# mesCommunes <- c("61324","73150","73006")
# mesCommunes <- c("73150","73006")


df <- NavettesToutes
# Création d'un champ indiquant si la commune origine appartient à une commune nouvelle
df <- merge(df, datafus2011[, c("CODGEO", "CODGEO_new")], by = "CODGEO", all.x = TRUE)
# Création d'un champ indiquant si la commune destination appartient à une commune nouvelle
df <- merge(df, datafus2011[, c("CODGEO", "CODGEO_new")], by.x = "DCLT", by.y = "CODGEO", all.x = TRUE)
# Adaptation des données au package flows
df$CODGEO <- as.character(df$CODGEO)
df$DCLT <- as.character(df$DCLT)
df$L_DCLT <- as.character(df$L_DCLT)
rm(NavettesToutes, geomfus2011) # Supprimer les objets pour alléger R


# xfirst % =====
# Flux supérieurs au pourcentage défini par le seuil s
seuils <- c(5, 10, 20, 50)

for (s in seuils) { # Pour chaque seuil
  
  results <- data.frame()
  for (i in mesCommunes) { # Pour chaque identifiant de commune nouvelle, 
    nav1 <- subset (df, CODGEO_new.x == i | CODGEO_new.y == i ) # Ne garder que navettes partant ou arrivant des communes fusionnantes y ayant participé
    listeCommunes <- c(unique(nav1$DCLT), unique(nav1$CODGEO)) # On prélève les identifiants des communes concernées
    listeCommunes <- unique(listeCommunes) # En supprimant les doubles comptes
    compil_Navettes <- data.frame(matrix(ncol=7, nrow=0))
    
    for (z in listeCommunes) { # Pour chaque commune qui apparaît en source ou destination d'une des communes fusionnantes
      nav2 <- subset (df, DCLT == z) # On intègre tous ses flux...
      compil_Navettes <- rbind(compil_Navettes, nav2) #... dans un tableau...
    }
    
    nav <- unique(compil_Navettes) #... dont on supprime les doubles comptes
    myflows <- prepflows(mat = nav, i = "CODGEO", j = "DCLT", fij = "NBFLUX_C09_ACTOCC15P")
    diag(myflows) <- 0
    flowSel1 <- firstflows(mat = myflows/rowSums(myflows)*100, method = "xfirst", k = s) 
    flowSel2 <- domflows(mat = myflows, w = colSums(myflows), k = 1)
    # On multiplie pour obtenir uniquement les flux souhaités (flowSel 1 et 2 sont binaires)
    flowSel <- myflows * flowSel1 * flowSel2
    
    
    Dominated <- colnames(flowSel)[colSums(flowSel) == 0]
    Dominant <- rownames(flowSel)[rowSums(flowSel) == 0]
    Intermediary <- rownames(flowSel)[!rownames(flowSel) %in% c(Dominant, Dominated)]
    
    resultspartiels <- subset(datafus2011[, c("CODGEO", "CODGEO_new")], CODGEO_new == i) # Pour toutes les communes fusionnantes appartenant à la commune nouvelle étudiée (i), on note si elle est dominante, dominée ou intermédiaire
    resultspartiels$StatutNavettes[resultspartiels$CODGEO %in% Dominated] <- "Dominated"
    resultspartiels$StatutNavettes[resultspartiels$CODGEO %in% Dominant] <- "Dominant"
    resultspartiels$StatutNavettes[resultspartiels$CODGEO %in% Intermediary] <- "Intermediary"
    results <- rbind(results,resultspartiels) # Combiner les résultats, par lignes
    
    rm(resultspartiels, nav, nav1, nav2, compil_Navettes, myflows, flowSel, flowSel1, flowSel2, listeCommunes, Dominant, Dominated, Intermediary)
    
  }
  write.table(results, paste0("sorties/Navettes/export_results_flows_xfirst", s, "pct_domflows1.txt"), sep="\t", row.names=FALSE) 
}

# xfirst =====
# Flux supérieurs au seuil s
seuils <- c(05, 10, 50, 100)

for (s in seuils) { # Pour chaque seuil
  
  results <- data.frame()
  for (i in mesCommunes) { # Pour chaque identifiant de commune nouvelle, 
    nav1 <- subset (df, CODGEO_new.x == i | CODGEO_new.y == i ) # Ne garder que navettes partant ou arrivant des communes fusionnantes y ayant participé
    listeCommunes <- c(unique(nav1$DCLT), unique(nav1$CODGEO)) # On prélève les identifiants des communes concernées
    listeCommunes <- unique(listeCommunes) # En supprimant les doubles comptes
    compil_Navettes <- data.frame(matrix(ncol=7, nrow=0))
    
    for (z in listeCommunes) { # Pour chaque commune qui apparaît en source ou destination d'une des communes fusionnantes
      nav2 <- subset (df, DCLT == z) # On intègre tous ses flux...
      compil_Navettes <- rbind(compil_Navettes, nav2) #... dans un tableau...
    }
    
    nav <- unique(compil_Navettes) #... dont on supprime les doubles comptes
    myflows <- prepflows(mat = nav, i = "CODGEO", j = "DCLT", fij = "NBFLUX_C09_ACTOCC15P")
    diag(myflows) <- 0
    flowSel1 <- firstflowsg(mat = myflows, method = "xfirst", k = s) 
    flowSel2 <- domflows(mat = myflows, w = colSums(myflows), k = 1)
    # On multiplie pour obtenir uniquement les flux souhaités (flowSel 1 et 2 sont binaires)
    flowSel <- myflows * flowSel1 * flowSel2
    
    Dominated <- colnames(flowSel)[colSums(flowSel) == 0]
    Dominant <- rownames(flowSel)[rowSums(flowSel) == 0]
    Intermediary <- rownames(flowSel)[!rownames(flowSel) %in% c(Dominant, Dominated)]
    
    resultspartiels <- subset(datafus2011[, c("CODGEO", "CODGEO_new")], CODGEO_new == i) # Pour toutes les communes fusionnantes appartenant à la commune nouvelle étudiée (i), on note si elle est dominante, dominée ou intermédiaire
    resultspartiels$StatutNavettes[resultspartiels$CODGEO %in% Dominated] <- "Dominated"
    resultspartiels$StatutNavettes[resultspartiels$CODGEO %in% Dominant] <- "Dominant"
    resultspartiels$StatutNavettes[resultspartiels$CODGEO %in% Intermediary] <- "Intermediary"
    results <- rbind(results,resultspartiels) # Combiner les résultats, par lignes
    
    rm(resultspartiels, nav, nav1, nav2, compil_Navettes, myflows, flowSel, flowSel1, flowSel2, listeCommunes, Dominant, Dominated, Intermediary)
    
  }
  write.table(results, paste0("sorties/Navettes/export_results_flows_xfirst", s, "_domflows1.txt"), sep="\t", row.names=FALSE) 
}



# nfirst =====
# Les "s" premieurs flux
seuils <- c(1, 2, 5, 10)

for (s in seuils) { # Pour chaque seuil
  
  results <- data.frame()
  for (i in mesCommunes) { # Pour chaque identifiant de commune nouvelle, 
    nav1 <- subset (df, CODGEO_new.x == i | CODGEO_new.y == i ) # Ne garder que navettes partant ou arrivant des communes fusionnantes y ayant participé
    listeCommunes <- c(unique(nav1$DCLT), unique(nav1$CODGEO)) # On prélève les identifiants des communes concernées
    listeCommunes <- unique(listeCommunes) # En supprimant les doubles comptes
    compil_Navettes <- data.frame(matrix(ncol=7, nrow=0))
    
    for (z in listeCommunes) { # Pour chaque commune qui apparaît en source ou destination d'une des communes fusionnantes
      nav2 <- subset (df, DCLT == z) # On intègre tous ses flux...
      compil_Navettes <- rbind(compil_Navettes, nav2) #... dans un tableau...
    }
    
    nav <- unique(compil_Navettes) #... dont on supprime les doubles comptes
    myflows <- prepflows(mat = nav, i = "CODGEO", j = "DCLT", fij = "NBFLUX_C09_ACTOCC15P")
    diag(myflows) <- 0
    flowSel1 <- firstflows(mat = myflows/rowSums(myflows)*100, method = "nfirst", k = s)
    flowSel2 <- domflows(mat = myflows, w = colSums(myflows), k = 1)
    # On multiplie pour obtenir uniquement les flux souhaités (flowSel 1 et 2 sont binaires)
    flowSel <- myflows * flowSel1 * flowSel2
    
    Dominated <- colnames(flowSel)[colSums(flowSel) == 0]
    Dominant <- rownames(flowSel)[rowSums(flowSel) == 0]
    Intermediary <- rownames(flowSel)[!rownames(flowSel) %in% c(Dominant, Dominated)]
    
    resultspartiels <- subset(datafus2011[, c("CODGEO", "CODGEO_new")], CODGEO_new == i) # Pour toutes les communes fusionnantes appartenant à la commune nouvelle étudiée (i), on note si elle est dominante, dominée ou intermédiaire
    resultspartiels$StatutNavettes[resultspartiels$CODGEO %in% Dominated] <- "Dominated"
    resultspartiels$StatutNavettes[resultspartiels$CODGEO %in% Dominant] <- "Dominant"
    resultspartiels$StatutNavettes[resultspartiels$CODGEO %in% Intermediary] <- "Intermediary"
    results <- rbind(results,resultspartiels) # Combiner les résultats, par lignes
    
    rm(resultspartiels, nav, nav1, nav2, compil_Navettes, myflows, flowSel, flowSel1, flowSel2, listeCommunes, Dominant, Dominated, Intermediary)
    
  }
  write.table(results, paste0("sorties/Navettes/export_results_flows_nfirst", s, "_domflows1.txt"), sep="\t", row.names=FALSE) 
}

7.6.1.1 Analyse des tests

# Analyse des résultats =====
# Import pour lancer rapidement les tests
geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE) # Les  communes qui ont participé à la création de communes nouvelles (appelées communes fusionnantes).
datafus2011 <- st_set_geometry(geomfus2011, NULL)

listetests <- c("xfirst5pct_domflows1", "xfirst10pct_domflows1", "xfirst20pct_domflows1", "xfirst50pct_domflows1", 
                "xfirst5_domflows1", "xfirst10_domflows1","xfirst50_domflows1","xfirst100_domflows1",
                "nfirst1_domflows1", "nfirst2_domflows1", "nfirst5_domflows1", "nfirst10_domflows1")

for (test in listetests) {
  
  ResultsFlux <- read.table(paste0("sorties/Navettes/export_results_flows_", test, ".txt"),
                            sep="\t", colClasses = "character", head = TRUE, stringsAsFactors = TRUE)
  
  mesCommunes <- unique(ResultsFlux$CODGEO_new)
  
  results <- data.frame() # On prépare le tableau avec les résultats
  
  for (i in mesCommunes) { # Pour chaque identifiant de commune nouvelle, 
    Pranalyse <- subset(ResultsFlux, CODGEO_new == i) # On extrait les données concernant les communes fusionnantes d'une CN
    a <- sum(Pranalyse$StatutNavettes %in% "Dominant") # Nombre de pôles dominants dans la commune nouvelle
    b <- sum(Pranalyse$StatutNavettes %in% "Intermediary") # Nombre de pôles intermédiaires dans la commune nouvelle
    c <- sum(Pranalyse$StatutNavettes %in% "Dominated") # Nombre de pôles dominés dans la commune nouvelle
    d <- Pranalyse$StatutNavettes[Pranalyse$CODGEO == Pranalyse$CODGEO_new]
    
    resultspartiels <- c(i, a, b, c, d)
    results <- rbind(results,resultspartiels, stringsAsFactors= FALSE) # Combiner les résultats, par lignes
    
    rm(i, Pranalyse, a, b, c, d, resultspartiels)
    
  }
  colnames(results) <- c("CODGEO_new", "NbrDominant", "NbrIntermediary", "NbrDominated", "StatutChefLieu")
  
  
  write.table(results, paste0("sorties/Synthese_Dominants_", test, ".txt"), sep="\t", row.names=FALSE) 
}

7.6.2 Description de toutes les communes fusionnantes : Test unique

Cf. aussi plus haut la partie du script dédiée au calcul des flux et de leur synthèse grâce à une boucle.

# Import pour lancer rapidement les tests

geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE) # Les  communes qui ont participé à la création de communes nouvelles (appelées communes fusionnantes).
load("data/refdata.Rdata")

df2011 <- df2011[, c("LIBGEO_new", "CODGEO_new", "LIBGEO", "CODGEO", "ChefLieu", "COM_NOUV")]
datafus2011 <- subset(df2011, COM_NOUV == "OUI") # Désigne les données concernant les communes ayant participé à la création d'une commune nouvelle, appelées ici communes fusionnantes
geomfus2011 <- merge(geomfus2011, datafus2011, by = "CODGEO")
# testEdC <- subset (geom2011, CODGEO_new == "61324" | CODGEO_new =="73150" | CODGEO_new == "73006")
# testEdCSavoie <- subset (geom2011, CODGEO_new =="73150" | CODGEO_new == "73006")
# testNormandie <- subset (geom2011, REG == "23" | REG == "25")
NavettesToutes <- read.csv2("data-raw/Flux_domicile_travail/BTT_FM_DTR_2009.txt", stringsAsFactors=TRUE)


# Définition d'un vecteur avec les identifiants des communes nouvelles
mesCommunes <- unique(datafus2011$CODGEO_new)
# mesCommunes <- c("61324","73150","73006")
# mesCommunes <- unique(testEdCSavoie$CODGEO_new)
# mesCommunes <- c("73150","73006")
# mesCommunes <- unique(testNormandie$CODGEO_new)
# mesCommunes <- "73006"

# test <- datafus2011
# test$CODGEO <- as.numeric (test$CODGEO)
# test <- subset(test, CODGEO > "50400")
# mesCommunes <- unique(test$CODGEO_new)

df <- NavettesToutes
# Création d'un champ indiquant si la commune origine appartient à une commune nouvelle
df <- merge(df, datafus2011[, c("CODGEO", "CODGEO_new")], by = "CODGEO", all.x = TRUE)
# Création d'un champ indiquant si la commune destination appartient à une commune nouvelle
df <- merge(df, datafus2011[, c("CODGEO", "CODGEO_new")], by.x = "DCLT", by.y = "CODGEO", all.x = TRUE)
# Adaptation des données au package flows
df$CODGEO <- as.character(df$CODGEO)
df$DCLT <- as.character(df$DCLT)
df$L_DCLT <- as.character(df$L_DCLT)
rm(NavettesToutes, geomfus2011) # Supprimer les objets pour alléger R


results <- data.frame()

for (i in mesCommunes) { # Pour chaque identifiant de commune nouvelle, 
  nav1 <- subset (df, CODGEO_new.x == i | CODGEO_new.y == i ) # Ne garder que navettes partant ou arrivant des communes fusionnantes y ayant participé
  listeCommunes <- c(unique(nav1$DCLT), unique(nav1$CODGEO)) # On prélève les identifiants des communes concernées
  listeCommunes <- unique(listeCommunes) # En supprimant les doubles comptes
  compil_Navettes <- data.frame(matrix(ncol=7, nrow=0))
  
  for (z in listeCommunes) { # Pour chaque commune qui apparaît en source ou destination d'une des communes fusionnantes
    nav2 <- subset (df, DCLT == z) # On intègre tous ses flux...
    compil_Navettes <- rbind(compil_Navettes, nav2) #... dans un tableau...
  }
  
  nav <- unique(compil_Navettes) #... dont on supprime les doubles comptes
  myflows <- prepflows(mat = nav, i = "CODGEO", j = "DCLT", fij = "NBFLUX_C09_ACTOCC15P")
  diag(myflows) <- 0
  # flowSel1 <- firstflowsg(mat = myflows, method = "xfirst", k = 5) # test 0
  # flowSel1 <- firstflows(mat = myflows/rowSums(myflows)*100, method = "xfirst", k = 50) # test à faire 1
  flowSel1 <- firstflows(mat = myflows/rowSums(myflows)*100, method = "xsumfirst", k = 60) # test à faire 2, avec autant de flux que nécessaires pour arriver à 60% des flux d'une commune
  # flowSel1 <- firstflows(mat = myflows/rowSums(myflows)*100, method = "nfirst", k = 2) # test à faire 3, avec, à chaque fois, les cinq premiers flux

  flowSel2 <- domflows(mat = myflows, w = colSums(myflows), k = 1)
    # On multiplie pour obtenir uniquement les flux souhaités (flowSel 1 et 2 sont binaires)
  flowSel <- myflows * flowSel1 * flowSel2
  
  # flowSel <- myflows # Possibilité de sélectionner ?
  Dominated <- colnames(flowSel)[colSums(flowSel) == 0]
  Dominant <- rownames(flowSel)[rowSums(flowSel) == 0]
  Intermediary <- rownames(flowSel)[!rownames(flowSel) %in% c(Dominant, Dominated)]
  
  resultspartiels <- subset(datafus2011[, c("CODGEO", "CODGEO_new")], CODGEO_new == i) # Pour toutes les communes fusionnantes appartenant à la commune nouvelle étudiée (i), on note si elle est dominante, dominée ou intermédiaire
  resultspartiels$StatutNavettes[resultspartiels$CODGEO %in% Dominated] <- "Dominated"
  resultspartiels$StatutNavettes[resultspartiels$CODGEO %in% Dominant] <- "Dominant"
  resultspartiels$StatutNavettes[resultspartiels$CODGEO %in% Intermediary] <- "Intermediary"
  results <- rbind(results,resultspartiels) # Combiner les résultats, par lignes
  
  rm(resultspartiels, nav, nav1, nav2, compil_Navettes, myflows, flowSel, flowSel1, flowSel2, listeCommunes, Dominant, Dominated, Intermediary)
  
}

# write.table(results, "sorties/export_results_flows_xfirst05_domflows1.txt", sep="\t", row.names=FALSE) # test 0
# write.table(results, "sorties/export_results_flows_xfirst50pct_domflows1.txt", sep="\t", row.names=FALSE) # Fait
# write.table(results, "sorties/export_results_flows_xsumfirst60pct_domflows1.txt", sep="\t", row.names=FALSE) # test à faire 2
# write.table(results, "sorties/export_results_flows_nfirst5_domflows1.txt", sep="\t", row.names=FALSE) # fait sur serveur Humanum
# write.table(results, "sorties/export_results_flows_nfirst2_domflows1.txt", sep="\t", row.names=FALSE) # fait sur serveur Humanum

7.6.3 Synthèse par commune nouvelle

Cf. aussi plus haut la partie du script dédiée au calcul des flux et de leur synthèse grâce à une boucle.

# Import pour lancer rapidement les tests
geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE) # Les  communes qui ont participé à la création de communes nouvelles (appelées communes fusionnantes).
datafus2011 <- st_set_geometry(geomfus2011, NULL)

test <- 
  # "xfirst05_domflows1" # Flux supérieurs à 5 navetteurs
  # "xfirst50pct_domflows1" # Flux représentant au moins 50% des navetteurs 
  # "xfirst20pct_domflows1" # Flux représentant au moins 20% des navetteurs
  # "xfirst10pct_domflows1" # Flux représentant au moins 10% des navetteurs
  # "xfirst05pct_domflows1" # Flux représentant au moins 05% des navetteurs
  # "nfirst2_domflows1" # Deux premiers flux
  # "nfirst5_domflows1" # Cinq premiers flux
  # "nfirst10_domflows1" # Dix premiers flux
  # "sumfirst60_domflows1" # Flux pour que leur addition représente au moins 60 % des flux.

ResultsFlux <- read.table(paste0("sorties/export_results_flows_", test, ".txt"), # Test 0
                           sep="\t", colClasses = "character", head = TRUE, stringsAsFactors = TRUE)

# Test 2 >>> Export absent
# ResultsFlux <- read.table("sorties/export_results_flows_xsumfirst60pct_domflows1.txt", sep="\t",
#                        colClasses = "character", head = TRUE, stringsAsFactors = TRUE)
# ResultsFlux <- read.table("sorties/sorties_20200710_Renaud/export_results_flows_xsumfirst60pct_domflows1.txt", sep="\t",
#                        colClasses = "character", head = TRUE, stringsAsFactors = TRUE)

# Seulement pour adapter les résultats sous anciennes dénominations
# summary(ResultsFlux$StatutNavettes)
# ResultsFlux$StatutNavettes <- as.factor(ResultsFlux$StatutNavettes)
# levels(ResultsFlux$StatutNavettes) <- c("Dominated", "Dominant", "Intermediary")
# colnames(ResultsFlux) <- c("CODGEO", "CODGEO_new", "StatutNavettes")



# Définition d'un vecteur comportant les identifiants des communes nouvelles à tester
# mesCommunes <- c("61324","73150","73006")
# mesCommunes <- c("73150","73006")
# mesCommunes <- c("73150")
# mesCommunes <- unique(testNormandie$CODGEO_new)
mesCommunes <- unique(ResultsFlux$CODGEO_new)

results <- data.frame() # On prépare le tableau avec les résultats

for (i in mesCommunes) { # Pour chaque identifiant de commune nouvelle, 
  Pranalyse <- subset(ResultsFlux, CODGEO_new == i) # On extrait les données concernant les communes fusionnantes d'une CN
  a <- sum(Pranalyse$StatutNavettes %in% "Dominant") # Nombre de pôles dominants dans la commune nouvelle
  b <- sum(Pranalyse$StatutNavettes %in% "Intermediary") # Nombre de pôles intermédiaires dans la commune nouvelle
  c <- sum(Pranalyse$StatutNavettes %in% "Dominated") # Nombre de pôles dominés dans la commune nouvelle
  d <- Pranalyse$StatutNavettes[Pranalyse$CODGEO == Pranalyse$CODGEO_new]

  resultspartiels <- c(i, a, b, c, d)
  results <- rbind(results,resultspartiels, stringsAsFactors= FALSE) # Combiner les résultats, par lignes
  
  rm(i, Pranalyse, a, b, c, d, resultspartiels)
  
}
colnames(results) <- c("CODGEO_new", "NbrDominant", "NbrIntermediary", "NbrDominated", "StatutChefLieu")


write.table(results, paste0("sorties/Synthese_Dominants_", test, ".txt"), sep="\t", row.names=FALSE)  

7.6.4 Le statut des communes fusionnantes et des chefs-lieux

test <- 
  # "xfirst05_domflows1" # Flux supérieurs à 5 navetteurs
  # "xfirst50pct_domflows1" # Flux représentant au moins 50% des navetteurs
  # "xfirst20pct_domflows1" # Flux représentant au moins 20% des navetteurs
  # "xfirst10pct_domflows1" # Flux représentant au moins 10% des navetteurs
  "xfirst05pct_domflows1" # Flux représentant au moins 05% des navetteurs
  # "nfirst2_domflows1" # Deux premiers flux
  # "nfirst5_domflows1" # Cinq premiers flux
  # "nfirst10_domflows1" # Dix premiers flux
  # "sumfirst60_domflows1" # Flux pour que leur addition représente au moins 60 % des flux.

ResultsSynth <- read.table(paste0("sorties/Synthese_Dominants_", test, ".txt"),
                           sep="\t", colClasses = "character",
                           head = TRUE, stringsAsFactors = TRUE)

# ResultsSynth <- read.table("sorties/Synthese_Dominants.txt", sep="\t",
#                        colClasses = "character", head = TRUE, stringsAsFactors = TRUE)

ResultsSynth[,2] <- as.numeric(ResultsSynth[,2])
ResultsSynth[,3] <- as.numeric(ResultsSynth[,3])
ResultsSynth[,4] <- as.numeric(ResultsSynth[,4])
ResultsSynth$StatutChefLieu <- as.factor(ResultsSynth$StatutChefLieu)

summary(ResultsSynth)
##   CODGEO_new         NbrDominant     NbrIntermediary  NbrDominated   
##  Length:778         Min.   :0.0000   Min.   :0.000   Min.   : 0.000  
##  Class :character   1st Qu.:0.0000   1st Qu.:1.000   1st Qu.: 0.000  
##  Mode  :character   Median :0.0000   Median :1.000   Median : 1.000  
##                     Mean   :0.3689   Mean   :1.548   Mean   : 1.317  
##                     3rd Qu.:1.0000   3rd Qu.:2.000   3rd Qu.: 2.000  
##                     Max.   :7.0000   Max.   :9.000   Max.   :11.000  
##       StatutChefLieu
##  Dominant    : 27   
##  Dominated   :146   
##  Intermediary:605   
##                     
##                     
## 
kable(apply(ResultsSynth[, 2:4], 2, sum))
x
NbrDominant 287
NbrIntermediary 1204
NbrDominated 1025
sum(apply(ResultsSynth[, 2:4], 2, sum)
)
## [1] 2516
kable(summary(ResultsSynth$StatutChefLieu), col.names = "Statut des communes chef-lieu", caption = paste0 ("Critère de sélection des flux : ", test))
Critère de sélection des flux : xfirst05pct_domflows1
Statut des communes chef-lieu
Dominant 27
Dominated 146
Intermediary 605

Le premier élément que nous livre cette analyse est que les communes nouvelles ne sont pas constituées autour de pôles majeurs mais plutôt de pôles secondaires. Les communes qui fusionnent ne sont pas toutes avec le même statut. À partir de la catégorisation des communes en pôles dominés, dominants ou intermédiaires, on s’aperçoit tout d’abord qu’un nombre très faible (29) de communes fusionnantes sont des pôles dominants. Davantage sont des pôles dominés (198) mais la très grande majorité sont des pôles intermédiaires. Cela va dans le sens de communes qui ne seraient pas des territoires complètement marginalisés et exclues des circulations, mais plutôt des relais rarement majeurs mais pas pour autant négligeables.

7.6.5 Cartographie des pôles ainsi obtenus

test <- 
  "xfirst05_domflows1" # Flux supérieurs à 5 navetteurs
  # "xfirst50pct_domflows1" # Flux représentant au moins 50% des navetteurs 
  # "xfirst20pct_domflows1" # Flux représentant au moins 20% des navetteurs 
  # "sumfirst60_domflows1" # Flux pour que leur addition représente au moins 60 % des flux.

ResultsSynth <- read.table(paste0("sorties/Synthese_Dominants_", test, ".txt"), # Test 0
                           sep="\t", colClasses = "character", head = TRUE, stringsAsFactors = TRUE)
ResultsSynth$StatutChefLieu <- as.factor(ResultsSynth$StatutChefLieu)
levels(ResultsSynth$StatutChefLieu)
geomCN_new <- st_read("data/geom.gpkg", layer = "geomCN_new", quiet = TRUE)  
dep <- st_read("data/geom.gpkg", layer = "dep", quiet = TRUE) # Départements

ResultsSynth <- merge(geomCN_new, ResultsSynth, by = "CODGEO_new")
par(mfrow = c(1, 1))
par(mar=c(0,0,1.2,0))
plot(st_geometry(dep), border = "#1A1A19",lwd = 1)

typoLayer(x = ResultsSynth, var = "StatutChefLieu",  
          col = c("#377eb8","#4daf4a","#e41a1c"),
          border = NA, 
          legend.title.cex = 0.7,
          legend.values.cex = 0.6,
          legend.values.order = c("Dominated", "Intermediary", "Dominant"),
          # 
          legend.pos = "left", add = T)

layoutLayer(title = paste0("Statut du chef-lieu des communes nouvelles\ndu point de vue des navettes quotidiennes", "\n[Critère : ", test, "]"),
            author = "G. Bideau, R. Ysebaert, 2026.",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2026.")

7.6.6 Les statuts des chefs-lieux en fonction des flux sélectionnés

Liste des différents résultats en fonction des seuils retenus concernant le statut des chefs-lieux

listetests <- c(
  "xfirst05_domflows1" # Flux supérieurs à 5 navetteurs
 , "xfirst50pct_domflows1" # Flux représentant au moins 50% des navetteurs
 , "xfirst20pct_domflows1" # Flux représentant au moins 20% des navetteurs
 , "xfirst10pct_domflows1" # Flux représentant au moins 10% des navetteurs
 , "xfirst05pct_domflows1" # Flux représentant au moins 05% des navetteurs
 , "nfirst2_domflows1" # Deux premiers flux
 , "nfirst5_domflows1" # Cinq premiers flux
 , "nfirst10_domflows1" # Dix premiers flux
 # , "sumfirst60_domflows1" # Flux pour que leur addition représente au moins 60 % des flux.
)
tableau <- data.frame()
for (i in listetests) {
ResultsSynth <- read.table(paste0("sorties/Synthese_Dominants_", i, ".txt"),
                           sep="\t", colClasses = "character",
                           head = TRUE, stringsAsFactors = TRUE)

ResultsSynth[,2] <- as.numeric(ResultsSynth[,2])
ResultsSynth[,3] <- as.numeric(ResultsSynth[,3])
ResultsSynth[,4] <- as.numeric(ResultsSynth[,4])
ResultsSynth$StatutChefLieu <- as.factor(ResultsSynth$StatutChefLieu)

a <- summary(ResultsSynth$StatutChefLieu)
resultpartiel <- c(i, a)
tableau <- rbind (tableau, resultpartiel, stringsAsFactors = FALSE)
rm(a, resultpartiel)

}
colnames(tableau) <- c("Critère de sélection des flux", "Nombre de pôles dominants", "Nombre de pôles dominés", "Nombre de pôles intermédiaires")
kable(tableau)
Critère de sélection des flux Nombre de pôles dominants Nombre de pôles dominés Nombre de pôles intermédiaires
xfirst05_domflows1 29 198 551
xfirst50pct_domflows1 689 63 26
xfirst20pct_domflows1 260 247 271
xfirst10pct_domflows1 69 222 487
xfirst05pct_domflows1 27 146 605
nfirst2_domflows1 42 283 453
nfirst5_domflows1 26 163 589
nfirst10_domflows1 22 107 649

7.6.7 Cartographie des flux dominants d’une ou plusieur CN

À FAIRE

Chercher à nommer certaines communes sur la carte

# Import pour lancer rapidement les tests

geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE)
geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE)
# Transformation des géométries en un spdf utilisable pour la cartographie
ShpCommunes2011 <- as(geom2011, "Spatial")

load("data/refdata.Rdata")

df2011 <- df2011[, c("LIBGEO_new", "CODGEO_new", "LIBGEO", "CODGEO", "ChefLieu", "COM_NOUV")]
datafus2011 <- subset(df2011, COM_NOUV == "OUI")
geomfus2011 <- merge(geomfus2011, datafus2011, by = "CODGEO")

NavettesToutes <- read.csv2("data-raw/Flux_domicile_travail/BTT_FM_DTR_2009.txt", stringsAsFactors=TRUE)


# Définition d'un vecteur avec les identifiants des communes nouvelles qu'on veut étudier
# mesCommunes <- unique(datafus2011$CODGEO_new)
# mesCommunes <- c("61324","73150","73006")
# mesCommunes <- unique(testEdCSavoie$CODGEO_new)
# mesCommunes <- c("73150","73006")
# mesCommunes <- unique(testNormandie$CODGEO_new)
mesCommunes <- c("61324")

nomCommunes <- c()
for (i in mesCommunes) {
  nomCommune <- df2011$LIBGEO_new[df2011$CODGEO == i]
  nomCommunes <- c(nomCommunes, nomCommune)
}

df <- NavettesToutes
# Création d'un champ indiquant si la commune origine appartient à une commune nouvelle
df <- merge(df, datafus2011[, c("CODGEO", "CODGEO_new")], by = "CODGEO", all.x = TRUE)
# Création d'un champ indiquant si la commune destination appartient à une commune nouvelle
df <- merge(df, datafus2011[, c("CODGEO", "CODGEO_new")], by.x = "DCLT", by.y = "CODGEO", all.x = TRUE)
# Adaptation des données au package flows
df$CODGEO <- as.character(df$CODGEO)
df$DCLT <- as.character(df$DCLT)
df$L_DCLT <- as.character(df$L_DCLT)
rm(NavettesToutes, geom2011, geomfus2011) # Supprimer les objets pour alléger R


results <- data.frame()
ShpEdC <- subset(ShpCommunes2011, CODGEO == 0000) # Pour créer un Shp vierge

for (i in mesCommunes) { # Pour chaque identifiant de commune nouvelle, 
  nav1 <- subset (df, CODGEO_new.x == i | CODGEO_new.y == i ) # Ne garder que navettes partant ou arrivant des communes fusionnantes y ayant participé
  listeCommunes <- c(unique(nav1$DCLT), unique(nav1$CODGEO)) # On prélève les identifiants des communes concernées
  listeCommunes <- unique(listeCommunes) # En supprimant les doubles comptes
  compil_Navettes <- data.frame(matrix(ncol=7, nrow=0))
  
  for (z in listeCommunes) { # Pour chaque commune qui apparaît en source ou destination d'une des communes fusionnantes
    nav2 <- subset (df, DCLT == z) # On intègre tous ses flux...
    compil_Navettes <- rbind(compil_Navettes, nav2) #... dans un tableau...
    
    # Si on veut un Shp avec toutes les communes
    # ShpEdC1 <- subset(ShpCommunes2011, CODGEO == z)
    # ShpEdC <- rbind(ShpEdC1, ShpEdC)

  }
  
  nav <- unique(compil_Navettes) #... dont on supprime les doubles comptes
  myflows <- prepflows(mat = nav, i = "CODGEO", j = "DCLT", fij = "NBFLUX_C09_ACTOCC15P")
  diag(myflows) <- 0
  flowSel1 <- firstflowsg(mat = myflows, method = "xfirst", k = 2) # test 0
  # flowSel1 <- firstflows(mat = myflows/rowSums(myflows)*100, method = "xfirst", k = 50) # test à faire 1
  # flowSel1 <- firstflows(mat = myflows/rowSums(myflows)*100, method = "xsumfirst", k = 60) # test à faire 2, avec autant de flux que nécessaires pour arriver à 60% des flux d'une commune
  # flowSel1 <- firstflows(mat = myflows/rowSums(myflows)*100, method = "nfirst", k = 2) # test à faire 3, avec, à chaque fois, les cinq premiers flux

  flowSel2 <- domflows(mat = myflows, w = colSums(myflows), k = 1)
    # On multiplie pour obtenir uniquement les flux souhaités (flowSel 1 et 2 sont binaires)
  flowSel <- myflows * flowSel1 * flowSel2

  
  
inflows <- data.frame(id = colnames(flowSel), w = colSums(flowSel))
outflows <- data.frame(id = rownames(flowSel), w = apply(flowSel, 1, sum))

list_com_in <- inflows$id[inflows$w >0]
list_com_out <- outflows$id[outflows$w >0]

listes_comm_flux <- unique(c(list_com_in, list_com_out))
# Création d'un Shp adapté

for (i in listes_comm_flux) {
ShpEdC_temp <- subset(ShpCommunes2011, CODGEO == i)
ShpEdC <- rbind(ShpEdC_temp, ShpEdC)
  }


sp::plot(ShpEdC, col = "#cceae7")
plotMapDomFlows(mat = flowSel, spdf = ShpEdC, spdfid = "CODGEO", w = inflows, wid = "id",
                wvar = "w", wcex = 0.05, add = TRUE,
                legend.flows.pos = "topright",
                legend.flows.title = "Nb. of commuters")
title(paste0("Navettes autour de ", nomCommunes))
mtext(text = "INSEE, 2011", side = 4, line = -1, adj = 0.01, cex = 0.8)

}

7.7 Premiers flux de navetteurs et communes nouvelles

Les communes fusionnent-elles avec celles avec lesquelles elles échangent le plus ?

Observons, pour une commune donnée, le principal flux de navetteur. La question que nous nous posons est de savoir si ce flux principal est, pour les communes fusionnantes, plutôt en direction d’une autre commune fusionnante appartenant à la même commune nouvelle ou non. Il est important de préciser qu’on ne regarde là que le flux le plus important, ce qui peut comporter un certain nombre de biais quand ce flux le plus important ne domine les autres que de peu.

7.7.1 Calcul des premiers flux

df <- NavettesToutes
df$CODGEO <- as.character(df$CODGEO)
df$DCLT <- as.character(df$DCLT)
# On enlève les flux d'une commune vers elle-même (les diagonales de la matrice de flux)
df <- subset(df, df$CODGEO != df$DCLT)

# Pour ne prendre que certaines communes
# df <- subset(df, CODGEO == "73006" | CODGEO == "73038" | CODGEO == "73093" | CODGEO == "73126"
#               | CODGEO == "73150" | CODGEO == "73169" | CODGEO == "73305")
# df <- subset(df, CODGEO == "73006")
# df <- subset(df, CODGEO == "73006" | CODGEO == "91471")

mesCommunes <- unique(df$CODGEO)

# On recherche, pour une commune fusionnante, la destination la plus importante
# Création du tableau de résultats
Results <- data.frame()

for (i in mesCommunes) { # Pour chaque identifiant des communes nouvelles sélectionnées 
  dfextrait <- subset (df, CODGEO == i)# extraire les données d'une commune
  a <- which.max(dfextrait$NBFLUX_C09_ACTOCC15P) # Renvoie le numéro de la ligne ayant le flux maximal
  b <- dfextrait$DCLT[a] # Renvoie l'identifiant de la destination correspondant à cette ligne
  Dest <- c(i,b)
  Results <- rbind(Results, Dest, stringsAsFactors= FALSE) # Combiner les résultats, par lignes
  rm(a)
  rm(dfextrait)
  rm(b)
  }


# Clarification des résultats
colnames(Results) <- c("CODGEO", "DestinationMax")
# Création d'un champ indiquant le référence si la commune origine appartient à une commune nouvelle
Results <- merge(Results, df2011[, c("CODGEO", "LIBGEO","CODGEO_new", "LIBGEO_new", "ChefLieu")], by = "CODGEO", all.x = TRUE)
# Création d'un champ indiquant la référence si la commune destination appartient à une commune nouvelle
Results <- merge(Results, df2011[, c("CODGEO", "LIBGEO", "CODGEO_new", "LIBGEO_new", "ChefLieu")], by.x = "DestinationMax", by.y = "CODGEO", all.x = TRUE)
Results <- Results[, c("CODGEO", "LIBGEO.x", "CODGEO_new.x", "LIBGEO_new.x", "ChefLieu.x", "DestinationMax", "LIBGEO.y", "CODGEO_new.y", "LIBGEO_new.y", "ChefLieu.y")]

write.table(Results, "sorties/export_results_premiersflux.txt", sep="\t", row.names=FALSE)  

7.7.2 Analyse

Results <- read.table("sorties/export_results_premiersflux.txt", sep="\t",
                       colClasses = "character", head = TRUE, stringsAsFactors = TRUE)
load("data/refdata.Rdata")
rm(df_new)
Results <- merge (Results, df2011 [, c("CODGEO", "FUSION")], by = "CODGEO") # On indique si la commune d'origine est une commune fusionnante.
Results <- merge (Results, df2011 [, c("CODGEO", "FUSION")], by.x = "DestinationMax", by.y = "CODGEO") # On indique si la commune d'arrivée est une commune fusionnante.


# On liste les communes en fonction de leur flux principal :
# Si l'origine et le départ sont des CN, est-ce la même ou non
Results$DestMaxEst <- ifelse(Results$CODGEO_new.x == Results$CODGEO_new.y, "Même_CN", "AutreCN")
Results$DestMaxEst[Results$FUSION.x == "NON"] <- "Origine_non_CN" # Si la commune de départ n'est pas une CN
Results$DestMaxEst[Results$FUSION.y == "NON"] <- "Dest_non_CN" # Si la commune d'arrivée n'est pas une CN
Results$DestMaxEst[Results$FUSION.x == "NON" & Results$FUSION.y == "NON"] <- "Pas_de_CN" # Si ni celle de départ ni celle d'arrivée ne sont des CN

# Simplification du tableau
tmp <- Results[, c("CODGEO", "CODGEO_new.x", "FUSION.x", "DestinationMax", "CODGEO_new.y", "FUSION.y", "DestMaxEst")]

# Affichage des résultats
Results$DestMaxEst <- as.factor(Results$DestMaxEst)
summary(Results$DestMaxEst)
##        AutreCN    Dest_non_CN        Même_CN Origine_non_CN      Pas_de_CN 
##            352           1913            376           1481          31106
summary(Results$DestMaxEst) * 100 / nrow(Results) # En pourcentages
##        AutreCN    Dest_non_CN        Même_CN Origine_non_CN      Pas_de_CN 
##      0.9992052      5.4303395      1.0673328      4.2040422     88.2990803
# Pour faire des tests dans des sous-ensembles
ResultsComFus <- subset(Results, FUSION.x == "OUI")
summary(ResultsComFus$DestMaxEst)
##        AutreCN    Dest_non_CN        Même_CN Origine_non_CN      Pas_de_CN 
##            352           1913            376              0              0
summary(ResultsComFus$DestMaxEst) * 100 / nrow(ResultsComFus) # En pourcentages
##        AutreCN    Dest_non_CN        Même_CN Origine_non_CN      Pas_de_CN 
##       13.32828       72.43468       14.23703        0.00000        0.00000
ResultsComFusChefLieu <- subset(Results, FUSION.x == "OUI" & ChefLieu.x == "O")
summary(ResultsComFusChefLieu$DestMaxEst)
##        AutreCN    Dest_non_CN        Même_CN Origine_non_CN      Pas_de_CN 
##            119            799             15              0              0
summary(ResultsComFusChefLieu$DestMaxEst) * 100 / nrow(ResultsComFusChefLieu) # En pourcentages
##        AutreCN    Dest_non_CN        Même_CN Origine_non_CN      Pas_de_CN 
##      12.754555      85.637728       1.607717       0.000000       0.000000
ResultsComFusNonChefLieu <- subset(Results, FUSION.x == "OUI" & ChefLieu.x == "N")
summary(ResultsComFusNonChefLieu$DestMaxEst)
##        AutreCN    Dest_non_CN        Même_CN Origine_non_CN      Pas_de_CN 
##            233           1114            361              0              0
summary(ResultsComFusNonChefLieu$DestMaxEst) * 100 / nrow(ResultsComFusNonChefLieu) # En pourcentages
##        AutreCN    Dest_non_CN        Même_CN Origine_non_CN      Pas_de_CN 
##       13.64169       65.22248       21.13583        0.00000        0.00000

7.7.3 Sortie tableau

# Réalisation d'un tableau synthétique
tableau <- rbind(
  table(Results$DestMaxEst),
  table(Results$DestMaxEst) * 100 / nrow(Results),
  table(ResultsComFus$DestMaxEst),
  table(ResultsComFus$DestMaxEst) * 100 / nrow(ResultsComFus),
  table(ResultsComFusChefLieu$DestMaxEst),
  table(ResultsComFusChefLieu$DestMaxEst) * 100 / nrow(ResultsComFusChefLieu),
  table(ResultsComFusNonChefLieu$DestMaxEst),
  table(ResultsComFusNonChefLieu$DestMaxEst) * 100 / nrow(ResultsComFusNonChefLieu)
                 )
tableau <- as.data.frame (tableau)

# Si une seule identification des lignes
# rownames(tableau) <- c("Première destination des communes françaises ", 
#                        "Première destination des communes françaises (%)", 
#                        "Première destination des communes fusionnantes", 
#                        "Première destination des communes fusionnantes (%)", 
#                        "Première destination des communes fusionnantes devenues chef-lieu", 
#                        "Première destination des communes fusionnantes devenues chef-lieu (%)", 
#                        "Première destination des communes fusionnantes non chef-lieu", 
#                        "Première destination des communes fusionnantes non chef-lieu (%)"
#                        )
colnames(tableau) <- c("Destination : autre commune nouvelle", "Destination : non commune nouvelle", "Destinaton : même commune nouvelle", "Origine non commune nouvelle", "Origine et destination non communes nouvelles")
tableau$Unité <- c("Nombre", "Pourcentage (%)", "Nombre", "Pourcentage (%)", "Nombre", "Pourcentage (%)", "Nombre", "Pourcentage (%)")
# On ré-ordonne le tableau pour plus de cohérence
tableau <- tableau[, c("Unité", "Destinaton : même commune nouvelle", "Destination : autre commune nouvelle", "Destination : non commune nouvelle", "Origine non commune nouvelle", "Origine et destination non communes nouvelles")]

# Pour avoir des identifications en plusieurs étapes
colnames(tableau) <- c("Origine : ", " même commune nouvelle", " autre commune nouvelle", " non commune nouvelle", "Origine non commune nouvelle", "Origine et destination non communes nouvelles")

# Sortie tout tableau
# kable(tableau, row.names = FALSE, digits = 0, format = "html") %>%
#   kableExtra::add_header_above(c(" " = 1, "Destination" = 3, " " = 2))%>%
#   kableExtra::pack_rows(index = c(
#     "Origine : ensemble des communes françaises" = 2,
#     "Origine : communes fusionnantes" = 2,
#     "Origine : communes fusionnantes devenues chef-lieu" = 2,
#     "Origine : des communes fusionnantes non chef-lieu" = 2)) 


# Sortie tableau utile
kable(tableau [, 1:4], row.names = FALSE, digits = 0, format = "html") %>%
  kableExtra::add_header_above(c(" " = 1, "Destination" = 3))%>%
  kableExtra::pack_rows(index = c(
    "ensemble des communes françaises" = 2,
    "communes fusionnantes" = 2,
    "communes fusionnantes devenues chef-lieu" = 2,
    "communes fusionnantes non chef-lieu" = 2)) 
Destination
Origine : même commune nouvelle autre commune nouvelle non commune nouvelle
ensemble des communes françaises
Nombre 376 352 1913
Pourcentage (%) 1 1 5
communes fusionnantes
Nombre 376 352 1913
Pourcentage (%) 14 13 72
communes fusionnantes devenues chef-lieu
Nombre 15 119 799
Pourcentage (%) 2 13 86
communes fusionnantes non chef-lieu
Nombre 361 233 1114
Pourcentage (%) 21 14 65

[Anciens chiffres, mais résultats les plus récents ne vont pas à l’encontre du discours] Le flux le plus important d’une commune fusionnante est, dans 378 cas (15 %), une commune appartenant à la même commune nouvelle, dans 321 cas (13 %), une autre commune nouvelle et dans 1803 cas (72 %), une autre commune, hors commune nouvelle. Ces éléments montrent, dans un premier temps, que les différences entre territoires pratiqués quotidiennement et territoires communaux ne se réduisent pas de manière drastique. La comparaison des statistiques entre les communes devenant chef-lieux (ont à 1,9 % leur premier flux vers la même commune nouvelle) et les autres communes fusionnantes (21 % ont leur premier flux vers la même commune nouvelle) nous renseigne sur la pôlarisation que peuvent exercer les communes chef-lieux qui, visiblement, attirent un nombre conséquent de flux mais sont, elles, plus souvent tournées vers une autre commune pour leur flux principal. Si on excepte donc le cas des communes chefs-lieux, on observe néanmoins que le pourcentage de communes fusionnantes orientant leur premier flux vers la commune nouvelle concernée reste relativement faible (21 %).

7.8 L’indice d’attractivité

7.8.1 Calcul de l’indice

Le calcul de l’indice d’attractivité nécessite d’avoir la totalité des flux entrant et des flux sortant. Nous ne disposions pas de cet indicateur dans le fichier regroupant toutes les navettes.

load("data/refdata.Rdata")
rm (df_new)
df2011 <- df2011[, c("LIBGEO_new", "CODGEO_new", "LIBGEO", "CODGEO", "ChefLieu", "CATAEU2010", "FusPhas", "COM_NOUV", "FUSION", "P09_POP", "REG")]



testEdC <- subset (df2011, CODGEO_new == "61324" | CODGEO_new =="73150" | CODGEO_new == "73006")
testEdCSavoie <- subset (df2011, CODGEO_new =="73150" | CODGEO_new == "73006")
testNormandie <- subset (df2011, REG == "23" | REG == "25")
NavettesToutes <- read.csv2("data-raw/Flux_domicile_travail/BTT_FM_DTR_2009.txt", stringsAsFactors=TRUE)



# Définition d'un vecteur comportant les identifiants des communes à tester
# mesCommunes <- c("61324","73150","73006")
# mesCommunes <- c("73150","73006")
# mesCommunes <- c("73150")
# mesCommunes <- unique(testNormandie$CODGEO)
mesCommunes <- df2011$CODGEO

df <- NavettesToutes
# Adaptation des données au package flows
df$CODGEO <- as.character(df$CODGEO)
df$DCLT <- as.character(df$DCLT)
df$L_DCLT <- as.character(df$L_DCLT)


results <- data.frame(matrix(ncol=2, nrow=0))
for (i in mesCommunes) { # Pour chaque identifiant de commune nouvelle
  dfdep <- subset(df, CODGEO == i) # On identifie les flux sortants (dont la commune i est l'origine)
  Departs <- sum(dfdep$NBFLUX_C09_ACTOCC15P) # La somme donne le nombre de départs
  dfarriv <- subset(df, DCLT == i) # On identifie les flux entrants (dont la commune i est la destination)
  Arrivees <- sum(dfarriv$NBFLUX_C09_ACTOCC15P) # La somme donne le nombre d'arrivées
  Volume <- Departs + Arrivees
  Solde <- Arrivees - Departs
  Attractivite <- Solde / Volume
  a <- c(i, Volume, Solde, Attractivite)
  results <- rbind(results,a, stringsAsFactors= FALSE) # Combiner les résultats, par lignes
  rm(a, dfarriv, dfdep, Arrivees, Departs, Solde, Attractivite) # Supprimer les objets créés
  
}
colnames (results) <- c("CODGEO", "Volume", "Solde", "IndiceAttractivite")

results <- merge (results, df2011, by = "CODGEO", all.x = TRUE)


write.table(results, "sorties/export_indice_attract.txt", sep="\t", row.names=FALSE) # 


IndiceAttract <- read.table("sorties/export_indice_attract.txt", sep="\t",
                       colClasses = "character", head = TRUE, stringsAsFactors = TRUE)

7.8.2 Test pour commmunes fusionnantes

Regardons maintenant, dans la liste des communes avec lesquelles les communes fusionnantes échangent, qui a le plus gros indice d’attractivité (chef-lieu, autre commune fusionnante, une autre à l’extérieur) et lister cela comme info sur la commune nouvelle.

# Import pour lancer rapidement les tests
load("data/refdata.Rdata")
rm(df_new)
df2011 <- df2011[, c("LIBGEO_new", "CODGEO_new", "LIBGEO", "CODGEO", "ChefLieu", "CATAEU2010", "FusPhas", "COM_NOUV", "FUSION", "P09_POP", "REG")]
datafus2011 <- subset(df2011, COM_NOUV == "OUI") # Désigne les données concernant les communes ayant participé à la création d'une commune nouvelle, appelées ici communes fusionnantes


IndiceAttract <- read.table("sorties/export_indice_attract.txt", sep="\t",
                       colClasses = "character", head = TRUE, stringsAsFactors = TRUE)
IndiceAttract <- merge(IndiceAttract, datafus2011[, c("CODGEO", "CODGEO_new")], by = "CODGEO", all.x = TRUE)
IndiceAttract$CODGEO_new <- as.character(IndiceAttract$CODGEO_new)
IndiceAttract$CODGEO_new[is.na(IndiceAttract$CODGEO_new)] <- "NON"


NavettesToutes <- read.csv2("data-raw/Flux_domicile_travail/BTT_FM_DTR_2009.txt", stringsAsFactors=TRUE)
df <- NavettesToutes
# Création d'un champ indiquant si la commune origine appartient à une commune nouvelle
df <- merge(df, datafus2011[, c("CODGEO", "CODGEO_new")], by = "CODGEO", all.x = TRUE)
# Adaptation des données au package flows
df$CODGEO <- as.character(df$CODGEO)
df$DCLT <- as.character(df$DCLT)
df$L_DCLT <- as.character(df$L_DCLT)
rm(NavettesToutes) # Supprimer les objets pour alléger R


# Définition d'un vecteur comportant les identifiants des communes nouvelles à tester
# mesCommunes <- c("61324","73150","73006")
# mesCommunes <- c("73150","73006")
mesCommunes <- c("73150")
# mesCommunes <- unique(testNormandie$CODGEO_new)
datafus2011$CODGEO_new <- as.character(datafus2011$CODGEO_new)
mesCommunes <- unique(datafus2011$CODGEO_new)
mesCommunes <- as.character(mesCommunes)

results <-  data.frame() # On prépare le tableau avec les résultats

for (i in mesCommunes) { # Pour chaque identifiant de commune nouvelle, 
  nav1 <- subset (df, CODGEO_new == i) # Ne garder que navettes partant ou arrivant des communes fusionnantes y ayant participé
  # Ligne facultative :
  nav1 <- subset (nav1, NBFLUX_C09_ACTOCC15P >= (0.05 * max(nav1$NBFLUX_C09_ACTOCC15P))) # On ne conserve que les navettes qui font au moins 10% du flux maximum (enlever les tous petits flux)
  # nav1 <- subset (nav1, NBFLUX_C09_ACTOCC15P >= (0.1 * max(nav1$NBFLUX_C09_ACTOCC15P))) # On ne conserve que les navettes qui font au moins 10% du flux maximum (enlever les tous petits flux)
  # nav1 <- subset (nav1, NBFLUX_C09_ACTOCC15P >= (0.2 * max(nav1$NBFLUX_C09_ACTOCC15P))) # On ne conserve que les navettes qui font au moins 20% du flux maximum (enlever les tous petits flux)
  nav1 <- nav1[order(-nav1$NBFLUX_C09_ACTOCC15P),] # On trie les flux par ordre décroissant
  # nav1 <- nav1[1:5,] # On ne conserve que les cinq premiers flux
  # nav1 <- nav1[1:10,] # On ne conserve que les dix premiers flux
  listeCommunes <- c(unique(nav1$DCLT), unique(nav1$CODGEO)) # On repère les codes des communes concernées
  listeCommunes <- unique(listeCommunes) # On retire les doubles comptes
  Pranalyse <- subset(IndiceAttract, CODGEO %in% listeCommunes) # On extrait les données synthétisées pour les communes concernées (peut induire quelques pertes, par exemple pour les navettes où la destination n'est pas connue, notée ZZZ)
  a <- ifelse(Pranalyse$CODGEO_new[which.max(Pranalyse$Volume)] == i, "DsCN", "HorsCN") # On regarde si le maximum de volume est dans la commune nouvelle considérée
  a <- ifelse(Pranalyse$CODGEO[which.max(Pranalyse$Volume)] == i, "ChefLieu", a) # On regarde si le maximum est celui de la commune chef-lieu
  
  b <- ifelse(Pranalyse$CODGEO_new[which.max(Pranalyse$Solde)] == i, "DsCN", "HorsCN") # On regarde si le maximum de solde est dans la commune nouvelle considérée
  b <- ifelse(Pranalyse$CODGEO[which.max(Pranalyse$Solde)] == i, "ChefLieu", b) # On regarde si le maximum est celui de la commune chef-lieu

  c <- ifelse(Pranalyse$CODGEO_new[which.max(Pranalyse$IndiceAttractivite)] == i, "DsCN", "HorsCN") # On regarde si le maximum d'attractivité est dans la commune nouvelle considérée
  c <- ifelse(Pranalyse$CODGEO[which.max(Pranalyse$IndiceAttractivite)] == i, "ChefLieu", c) # On regarde si le maximum est celui de la commune chef-lieu

  resultspartiels <- c(i, a, b, c)
  results <- rbind(results,resultspartiels, stringsAsFactors= FALSE) # Combiner les résultats, par lignes
  
  rm(nav1, listeCommunes, Pranalyse, a, b, c, resultspartiels)
  
}
colnames(results) <- c("CODGEO_new", "MaxVolume", "MaxSolde", "MaxAttract")

# write.table(results, "sorties/export_tests_sur_Vol-Solde-Attract_bruts.txt", sep="\t", row.names=FALSE) 
write.table(results, "sorties/export_tests_sur_Vol-Solde-Attract_flux_sup_05pct.txt", sep="\t", row.names=FALSE)  # Données où ne sont pris en compte que les flux qui font au moins 10% du flux maximum
# write.table(results, "sorties/export_tests_sur_Vol-Solde-Attract_flux_sup_10pct.txt", sep="\t", row.names=FALSE)  # Données où ne sont pris en compte que les flux qui font au moins 10% du flux maximum
# write.table(results, "sorties/export_tests_sur_Vol-Solde-Attract_flux_sup_20pct.txt", sep="\t", row.names=FALSE)  # Données où ne sont pris en compte que les flux qui font au moins 20% du flux maximum
# write.table(results, "sorties/export_tests_sur_Vol-Solde-Attract_flux_5nfirst.txt", sep="\t", row.names=FALSE)  # Données où ne sont pris en compte que les cinq premiers flux
# write.table(results, "sorties/export_tests_sur_Vol-Solde-Attract_flux_10nfirst.txt", sep="\t", row.names=FALSE)  # Données où ne sont pris en compte que les dix premiers flux

7.8.3 Sortie tableau

Si on regarde l’ensemble des flux entrant ou sortant de communes fusionnantes appartenant à une même commune nouvelle, le tableau suivant donne le nombre de fois où les volumes, soldes et attractivités les plus importants sont le chef-lieu de la commune nouvelle, une autre commune fusionnante, ou hors de la commune nouvelle.

# results <- read.table("sorties/export_tests_sur_Vol-Solde-Attract_bruts.txt", sep="\t", colClasses = c("character", "factor", "factor", "factor"), head = TRUE, stringsAsFactors = TRUE)
results <- read.table("sorties/export_tests_sur_Vol-Solde-Attract_flux_sup_05pct.txt", sep="\t",
colClasses = c("character", "factor", "factor", "factor"), head = TRUE, stringsAsFactors = TRUE)
# results <- read.table("sorties/export_tests_sur_Vol-Solde-Attract_flux_sup_10pct.txt", sep="\t",
#                       colClasses = c("character", "factor", "factor", "factor"), head = TRUE, stringsAsFactors = TRUE)
# results <- read.table("sorties/export_tests_sur_Vol-Solde-Attract_flux_sup_20pct.txt", sep="\t",
#                       colClasses = c("character", "factor", "factor", "factor"), head = TRUE, stringsAsFactors = TRUE)
# results <- read.table("sorties/export_tests_sur_Vol-Solde-Attract_flux_5nfirst.txt", sep="\t",
#                       colClasses = c("character", "factor", "factor", "factor"), head = TRUE, stringsAsFactors = TRUE)
# results <- read.table("sorties/export_tests_sur_Vol-Solde-Attract_flux_10nfirst.txt", sep="\t",
#                       colClasses = c("character", "factor", "factor", "factor"), head = TRUE, stringsAsFactors = TRUE)



a <- summary(results$MaxVolume)
a <-c(sum(results$MaxVolume == "ChefLieu"), sum(results$MaxVolume == "DsCN"), sum(results$MaxVolume == "HorsCN")) # Nécessaire car présence d'un zéro
b <- summary(results$MaxSolde)
c <- summary(results$MaxAttract)
tableau <- rbind(a, b, c)
rm(a, b, c)
row.names(tableau) <- c("La commune avec le plus grand volume est", "La commune avec le plus grand solde est", "La commune avec la plus grande attractivité est")
colnames(tableau) <- c("Le chef-lieu de la commune nouvelle", "Une autre commune de la même commune nouvelle", "Hors de la commune nouvelle")
kable(tableau, caption = "Les pôles migratoires des communes fusionnantes")
Les pôles migratoires des communes fusionnantes
Le chef-lieu de la commune nouvelle Une autre commune de la même commune nouvelle Hors de la commune nouvelle
La commune avec le plus grand volume est 21 0 823
La commune avec le plus grand solde est 21 1 822
La commune avec la plus grande attractivité est 51 11 782

On y observe que, très majoritairement, les communes nouvelles sont constituées par des communes qui ne polarisent pas leur environnement. En revanche, lorsque ces éléments sont dans les communes nouvelles, ils sont très largement le fait des communes devenues chef-lieu, ce qui paraît, de manière assez cohérente, aller dans une logique de centralisation.

# On s'intéresse aux communes qui sont avec un pôle important à l'intérieur de la commune nouvelle
extraitsresults <- subset (results, MaxVolume == "DsCN" | MaxSolde== "DsCN" | MaxAttract == "DsCN"
                           | MaxVolume == "ChefLieu" | MaxSolde== "ChefLieu" | MaxAttract == "ChefLieu")
ComNvlles <- subset (datafus2011, ChefLieu == "O")
colnames(results)[1] <- "CODGEO_new"
extraitsresults <- merge (extraitsresults, ComNvlles[, c("CODGEO_new", "LIBGEO_new", "CATAEU2010")], by = "CODGEO_new")

summary(extraitsresults$CATAEU2010)
tabcont <- table(extraitsresults$MaxVolume, extraitsresults$CATAEU2010)
table(extraitsresults$MaxSolde, extraitsresults$CATAEU2010)
tabcont <- table(extraitsresults$MaxAttract, extraitsresults$CATAEU2010)
prop <- prop.table(tabcont) * 100
barplot(prop, main= NULL,
        xlab = "Catégories d'aire urbaine de la commune chef-lieu de la commune nouvelle",
        ylab = "Part du total des communes (%)",
        las = 2,
        border = NA,
        col= terrain.colors(nrow(prop)),
        beside = TRUE)

legend(x="topright", legend = rownames(prop) , cex=0.8, fill = terrain.colors(nrow(prop)), bty="n", title = "La commune ayant le plus grand indice d'attractivité est :")     
knitr::opts_chunk$set(echo=FALSE, # Afficher ou non le code R dans le document
                      eval  = FALSE, #  Exécuter ou non le code R à la compilation
                      include   = FALSE, #  Inclure ou non le code R et ses résultats dans le document
                      # results “hide”/“asis”/“markup”/“hold”   Type de résultats renvoyés par le bloc de code
                      warning = TRUE, # Afficher ou non les avertissements générés par le bloc
                      message = TRUE, # Afficher ou non les messages générés par le bloc
                      cache=TRUE) # Utiliser le cache pour accélerer les knits.

9 - MATRICE DE CONTIGUÏTÉ ET AUTOCORRÉLATION SPATIALE

Import des données

load("data/refdata.Rdata")

geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE) 
geom_new <- st_read("data/geom.gpkg", layer = "geom_new", quiet = TRUE) 

Il s’agit ici de creuser l’« effet de grappe », ce qu’on appelle parfois l’« effet consultant ».

Matrice de voisinage (package spdep)

À l’aide de @bellefon2018.

library(spdep)

test_geom <- merge(geom2011, df2011[, c("CODGEO", "CODE_DEPT", "COM_NOUV", "P09_POP", "LIBGEO")], by = "CODGEO")
test_geom <- subset (test_geom, CODE_DEPT == "49" )

test_queen <- poly2nb(test_geom, queen = TRUE)
test_rook <- poly2nb(test_geom, queen = FALSE)

# On change de type d'objet pour faciliter les représentations
test_geom <- as(test_geom, "Spatial")

# Représentation graphique des deux manières de calculer les voisinages.
plot(test_geom, border="lightgray")
plot(test_queen, coordinates(test_geom),add=TRUE,col="red")
plot(test_rook, coordinates(test_geom),add=TRUE,col="blue")

# Réalisation d'une liste de poids
test_liste <- nb2listw(test_queen, zero.policy = TRUE)
# NB : zero.policy :default NULL, use global option value; if FALSE stop with error for any empty neighbour sets, if TRUE permit the weights list to be formed with zero-length weights vectors https://r-spatial.github.io/spdep/reference/nb2listw.html

# Pour avoir une représentation graphique des communes nouvelles
test_geom2 <- merge(geom2011, df2011[, c("CODGEO", "CODE_DEPT", "COM_NOUV", "P09_POP", "LIBGEO")], by = "CODGEO")
test_geom2 <- subset (test_geom2, CODE_DEPT == "49" )

plot(subset(test_geom2[, c("CODE_DEPT", "COM_NOUV")], CODE_DEPT == "49"))

# Pour extraire les entités sans liens :
test_liste$neighbours
## Neighbour list object:
## Number of regions: 363 
## Number of nonzero links: 2012 
## Percentage nonzero weights: 1.526915 
## Average number of links: 5.5427
isol <- test_geom2[c(5896, 7662, 10958, 10959, 10960, 11024, 21454, 21470, 21471, 21472, 21473, 33974),]


rm(isol, test_queen, test_rook)

À l’échelle du département du Maine-et-Loire, des différences notables en fonction du voisinage choisi.

Officiellement, le contact par un point autorise à fusionner en commune nouvelle donc choix du voisinage “queen”.

Cf. la réponse du ministère de l’intérieur à une question écrite au Sénat sur la question de la continuité territoriale en 2009 : https://www.senat.fr/questions/base/2009/qSEQ090609011.html.

Calcul de l’indice de Moran (package spdep)

Cf. @bellefon2018a p. 56 sq. pour l’explication et 62 pour le code.

test_geom$COM_NOUV2 <- dplyr::if_else(test_geom$COM_NOUV == "OUI", 1, 0)

moran.plot(test_geom$COM_NOUV2, test_liste, labels=FALSE , xlab="variable",ylab="moyenne des voisins")

moran.plot(test_geom$P09_POP, test_liste, labels=FALSE , xlab="variable",ylab="moyenne des voisins")

Statistiques join count (package spdep)

Cf. @bellefon2018a p. 62 sq. pour l’explication et 64 pour le code.

L’analyse des statistiques des join count observe, pour une variable binaire, s’il y a une autocorrélation spatiale de la présence d’individus partageant ou non une caractéristique. “on considère une variable binaire qui représente deux couleurs, Blanc (B) et Noir (N) de sorte qu’une liaison puisse être qualifiée de Blanc-Blanc, Noir-Noir ou Blanc-Noir. On observe :

une autocorrélation spatiale positive si le nombre de liaisons Blanc-Noir est significativement inférieur à ce que l’on aurait obtenu à partir d’une répartition spatiale aléatoire ;

une autocorrélation spatiale négative si le nombre de liaisons Blanc-Noir est significativement supérieur à ce que l’on aurait obtenu à partir d’une répartition spatiale aléatoire ;

aucune autocorrélation spatiale si le nombre de liaisons Blanc-Noir est approximativement identique à ce que l’on aurait obtenu à partir d’une répartition spatiale aléatoire.” (p. 62-63, souligné dans le texte)

test_geom$COM_NOUV3 <- as.factor(test_geom$COM_NOUV)
class(test_geom$COM_NOUV3)
## [1] "factor"
joincount.test(test_geom$COM_NOUV3, test_liste, zero.policy=TRUE, alternative="greater",
 sampling="nonfree", spChk=NULL, adjust.n=TRUE)
## 
##  Join count test under nonfree sampling
## 
## data:  test_geom$COM_NOUV3 
## weights: test_liste 
## 
## Std. deviate for NON = 12.114, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Same colour statistic           Expectation              Variance 
##             44.663005             26.113260              2.344626 
## 
## 
##  Join count test under nonfree sampling
## 
## data:  test_geom$COM_NOUV3 
## weights: test_liste 
## 
## Std. deviate for OUI = 11.408, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Same colour statistic           Expectation              Variance 
##             89.519769             69.613260              3.045139

Pour les communes nouvelles, on observe une autocorrélation positive très nette et significative. L’autocorrélation est d’ailleurs également significtive pour les communes non fusionnantes, même si la déviation est moins nette.

LISA : Indice de Moran (package spdep)

Mesures locales d’association spatiale : LISA (Local Indicators of Spatial Association).

Cf. @bellefon2018a p. 65 sq. pour l’explication et 69 pour le code.

“Anselin (ANSELIN 1995) développe les notions introduites par Getis et Ord en définissant des indicateurs d’autocorrélation spatiale locale. Ceux-ci doivent permettre de mesurer l’intensité et la significativité de la dépendance locale entre la valeur d’une variable dans une unité spatiale et les valeurs de cette même variable dans les unités spatiales environnantes.” (p. 65)

Fonction ‘localmoran’ du package ‘spdep’. Ii : local moran statistic ; E.Ii : expectation of local moran statistic ; Var.Ii : variance of local moran statistic ; Z.Ii : standard deviate of local moran statistic ; Pr() : p-value of local moran statistic (https://www.rdocumentation.org/packages/spdep/versions/1.1-8/topics/localmoran).

Pour analyser correctement la représentativité des résultats, plusieurs méthodes proposent d’ajuster la p-value :

“On considère que cette méthode [celle de Bonferroni] ne donne de bons résultats que lorsque le nombre de tests réalisés est petit. […] La méthode d’ajustement de Holm conduit à un plus grand nombre de clusters significatifs que la méthode de Bonferroni. Elle lui est donc le plus souvent préférée. Cependant, cette méthode se concentre aussi sur la détection de l’existence d’au moins un cluster dans toute la zone. […] La méthode du False Discovery Rate (FDR) a été introduite par BENJAMINI et al. 1995. Avec cette méthode, le risque de juger - à tort - un cluster comme significatif est plus élevé, mais inversement le risque de juger - à tort - un cluster comme non significatif est plus faible.” (p. 68) “La méthode de Holm diminue en effet le risque de conclure à tort à l’existence d’une autocorrélation spatiale locale. En revanche, cette méthode augmente le risque de passer à côté d’un cluster local.” (p.69)

results_LISA<- as.data.frame(localmoran(test_geom$COM_NOUV2,test_liste,zero.policy=TRUE))

#Calcul des p-values ajustées
results_LISA$pvalue_ajuste_bonferroni<- p.adjust(results_LISA$`Pr(z != E(Ii))`,method="bonferroni")
results_LISA$pvalue_ajuste_holm<- p.adjust(results_LISA$`Pr(z != E(Ii))`,method="holm")
results_LISA$pvalue_ajuste_fdr<- p.adjust(results_LISA$`Pr(z != E(Ii))`,method="fdr")

test_geom3 <- cbind(test_geom2, results_LISA)


# Quelles communes ont une p-value élevée selon les trois méthodes ?
par(mar = c(0,0,0,0), mfrow = c(2,2))

# plot(st_geometry(dep), col = NA)
choroLayer(x = test_geom3 , var = "pvalue_ajuste_holm",
           method = "quantile", nclass = 6,
           # col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 3, n2 = 3),
           col = carto.pal(pal1 = "blue.pal", n1 = 6),
           border = NA,
           legend.pos = "topleft", legend.values.rnd = 2,
           legend.title.txt = "Pvalue ajustée : méthode de Holm")
## Warning in classInt::classIntervals(v, nclass, style = method, ...): n greater
## than number of different finite values\nn reset to number of different finite
## values
## Warning in classInt::classIntervals(v, nclass, style = method, ...): n same as
## number of different finite values\neach different finite value is a separate
## class
choroLayer(x = test_geom3 , var = "pvalue_ajuste_bonferroni",
           method = "quantile", nclass = 6,
           # col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 3, n2 = 3),
           col = carto.pal(pal1 = "blue.pal", n1 = 6),
           border = NA,
           legend.pos = "topleft", legend.values.rnd = 2,
           legend.title.txt = "Pvalue ajustée : méthode de Bonferroni")
## Warning in classInt::classIntervals(v, nclass, style = method, ...): n greater
## than number of different finite values\nn reset to number of different finite
## values
## Warning in classInt::classIntervals(v, nclass, style = method, ...): n same as
## number of different finite values\neach different finite value is a separate
## class
choroLayer(x = test_geom3 , var = "pvalue_ajuste_fdr",
           method = "quantile", nclass = 6,
           # col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 3, n2 = 3),
           col = carto.pal(pal1 = "blue.pal", n1 = 6),
           border = NA,
           legend.pos = "topleft", legend.values.rnd = 2,
           legend.title.txt = "Pvalue ajustée : méthode FDR")


typoLayer(x = test_geom3, var = "COM_NOUV",  
          col=c("red", "blue"), border = NA)

layoutLayer(title = "Titre", theme = "red.pal",
            author = "G. Bideau, 2022.",
            sources = "")

# On choisit la méthode FDR et on ne conserve que les valeurs qui nous paraissent significatives au vu de la p-value ainsi ajustée

test_geom3$Ii_retenu <- ifelse(test_geom3$pvalue_ajuste_fdr <= 0.1, yes = test_geom3$Ii, no = NA)

par(mar = c(0,0,0,0), mfrow = c(1,2))

# On cartographie le résultat de l'indice de Moran

choroLayer(x = test_geom3 , var = "Ii_retenu",
           method = "quantile", nclass = 6,
           # col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 3, n2 = 3),
           col = carto.pal(pal1 = "blue.pal", n1 = 6),
           legend.pos = "topleft", legend.values.rnd = 2,
           legend.title.txt = "Indice de Moran locaux significatifs",
           legend.nodata = "p-value non significatif (>0,1 méthode FDR)")
## Warning in classInt::classIntervals(v, nclass, style = method, ...): n same as
## number of different finite values\neach different finite value is a separate
## class
typoLayer(x = test_geom3, var = "COM_NOUV",  
          col=c("red", "blue"), border = NA, legend.pos = "topleft")

par(mar = c(0,0,0,0), mfrow = c(1,1))

Matrice de voisinage (package rgeoda)

Présentation du package ‘rgeoda’ : https://geodacenter.github.io/rgeoda/articles/rgeoda_tutorial.html

Sur les matrices de contiguïté : https://geodacenter.github.io/workbook/4a_contig_weights/lab4a.html

Sur l’auto-corrélation : http://geodacenter.github.io/workbook/6a_local_auto/lab6a.html

library(rgeoda)


test_geom <- merge(geom2011, df2011[, c("CODGEO", "CODE_DEPT", "COM_NOUV", "P09_POP")], by = "CODGEO")
# test_geom <- subset (test_geom, CODE_DEPT == "49" )
test_geomCN <- merge(geom_new, df_new, by = "CODGEO_new")
test_geomCN <- subset(test_geomCN, COM_NOUV == "OUI")

queen_w <- queen_weights(test_geom, order=1, include_lower_order = FALSE, precision_threshold = 0)
summary(queen_w)
##                      name                value
## 1 number of observations:                36208
## 2          is symmetric:                  TRUE
## 3               sparsity: 0.000164767983149941
## 4        # min neighbors:                    0
## 5        # max neighbors:                   29
## 6       # mean neighbors:     5.96591913389306
## 7     # median neighbors:                    6
## 8           has isolates:                 TRUE
# Pour savoir si certaines entités sont séparées des autres
has_isolates(queen_w)
## [1] TRUE

LISA (package rgeoda)

NB : Sous-section qui peut poser problème lors d’un knit si n’est pas executée en même temps que les précédentes (cela ne fonctionne pas bien si les sous-sections précédentes sont en cache).

test_geom$COM_NOUV2 <- dplyr::if_else(test_geom$COM_NOUV == "OUI", 1, 0)
variable <- "COM_NOUV2"
df_variable <- test_geom[variable]
lisa <- local_moran(queen_w, df_variable)

# To get the values of the local Moran:
lms <- lisa_values(gda_lisa = lisa)

# To get the pseudo-p values of significance of local Moran computation:
pvals <- lisa_pvalues(lisa)

# To get the cluster indicators of local Moran computation:
cats <- lisa_clusters(lisa, cutoff = 0.05)

# Labels
lbls <- lisa_labels(lisa)


test_geom$LISA <- lms
test_geom$pvals <- pvals
test_geom$cats <- cats

# On rend les catégories plus lisibles en remplaçant le numéro par l'intitulé
test_geom$cats <- as.factor(test_geom$cats)
num_levels <- as.numeric(levels(test_geom$cats))
levels(test_geom$cats) <- lbls[num_levels + 1]
print(levels(test_geom$cats))
## [1] "Not significant" "High-High"       "Low-High"        "High-Low"       
## [5] "Isolated"
test_geom$LISA_retenu <- ifelse(test_geom$pvals <= 0.1, yes = test_geom$LISA, no = NA)

par(mar = c(0,0,0,0), mfrow = c(1,2))

couleurs <- c("#f7f7f7", "#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33")
# Cf. https://colorbrewer2.org/#type=qualitative&scheme=Set1&n=6 pour composer les palettes
typoLayer(x = test_geom , var = "cats",
           # col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 3, n2 = 3),
           col = couleurs[1:length(levels(test_geom$cats))],
           border = NA,
           legend.pos = "topleft",
           legend.values.order = levels(test_geom$cats),
           legend.title.txt = "Indice de Moran locaux significatifs\nsur la variable de « commune nouvelle »\n(pvalue < 0,05)")


typoLayer(x = test_geom, var = "COM_NOUV",
          legend.values.order = c("OUI", "NON"),
          col=c("red","blue"),
          border = NA,
          legend.pos = "topleft",
          legend.title.txt = "Communes fusionnantes")

# plot(test_geomCN$geometry, col = NA, border = "black", lwd = 1, add = TRUE)

par(mar = c(0,0,0,0), mfrow = c(1,1))

table(test_geom$cats, test_geom$COM_NOUV)
##                  
##                     NON   OUI
##   Not significant 30579  1111
##   High-High           0  1557
##   Low-High         2946     0
##   High-Low            0     3
##   Isolated           12     0
rm(variable, df_variable, lms, pvals, cats, lbls, num_levels, couleurs)

Boucle pour LISA sur données socio-économiques

L’objectif ici est d’observer si les communes nouvelles sont dans une situation particulière du point de vue de l’auto-corrélation spatiale de certaines variables socio-économiques.

Par exemple, on peut faire l’hypothèse qu’à l’échelle de la Normandie, les communes nouvelles vont être plus fréquemment liées à des clusters de forts taux de navetteurs et plutôt de faibles taux de chômages.

# cache=FALSE car sinon le knit ne se déroule pas la fois suivante

test_geom <- merge(geom2011, df2011, by = "CODGEO")
# test_geom <- subset (test_geom, CODE_DEPT == "49" )
test_geom  <- subset (test_geom, REG == "25")
test_geomCN <- merge(geom_new, df_new, by = "CODGEO_new")
# test_geomCN <- subset(test_geomCN, CODE_DEPT == "49" & COM_NOUV == "OUI")
test_geomCN <- subset (test_geomCN, REG == "25" & COM_NOUV == "OUI")

queen_w <- queen_weights(test_geom, order=1, include_lower_order = FALSE, precision_threshold = 0)
summary(queen_w)
##                      name               value
## 1 number of observations:                1812
## 2          is symmetric:                 TRUE
## 3               sparsity: 0.00316993894029989
## 4        # min neighbors:                   1
## 5        # max neighbors:                  18
## 6       # mean neighbors:     5.7439293598234
## 7     # median neighbors:                   6
## 8           has isolates:               FALSE
# Pour savoir si certaines entités sont séparées des autres
# has_isolates(queen_w)

vartests <- c("P09_RETR1564_RT",  "P09_ETUD1564_RT", "P09_CHOM1564_RT", "C09_ACT1564_Cadr_RT", "C09_ACTOCC_OUT_RT", "P09_POP0014Y_RT", "P09_POP1529Y_RT", "P09_POP3044Y_RT", "P09_POP4559Y_RT", "P09_POP6074Y_RT", "P09_POP75PY_RT")
variable <- "C09_ACTOCC_OUT_RT"
# test_geom <- test_geom[, c("CODGEO", "CODE_DEPT", "COM_NOUV", "P09_POP", "LIBGEO", variable)]

mesCommunes <- subset(test_geom, test_geom$COM_NOUV == "OUI")
mesCommunes <- mesCommunes$CODGEO_new

subset_tableau <- test_geom[, c(vartests)]


for (variable in vartests) {
  

df_variable <- test_geom[variable]


lisa <- local_moran(queen_w, df_variable)

# To get the values of the local Moran:
lms <- lisa_values(gda_lisa = lisa)

# To get the pseudo-p values of significance of local Moran computation:
pvals <- lisa_pvalues(lisa)

# To get the cluster indicators of local Moran computation:
cats <- lisa_clusters(lisa, cutoff = 0.05)

# Labels
lbls <- lisa_labels(lisa)


test_geom$LISA <- lms
test_geom$pvals <- pvals
test_geom$cats <- cats

# On rend les catégories plus lisibles en remplaçant le numéro par l'intitulé
test_geom$cats <- as.factor(test_geom$cats)
num_levels <- as.numeric(levels(test_geom$cats))
levels(test_geom$cats) <- lbls[num_levels + 1]
print(levels(test_geom$cats))

# Si on ne veut que les résultats significatifs (ne change rien pour les cartographies ci-dessous
test_geom$LISA_retenu <- ifelse(test_geom$pvals <= 0.1, yes = test_geom$LISA, no = NA)
# Si on veut tous les résultats (ne change rien pour les cartographies ci-dessous)
# test_geom$LISA_retenu <- test_geom$LISA

# par(mar = c(0,0,0,0), mfrow = c(1,2))

couleurs <- c("#f7f7f7", "#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33")
# Cf. https://colorbrewer2.org/#type=qualitative&scheme=Set1&n=6 pour composer les palettes
typoLayer(x = test_geom , var = "cats",
           # col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 3, n2 = 3),
           col = couleurs[1:length(levels(test_geom$cats))],
           border = "grey60",
           legend.pos = "topleft",
           legend.values.order = levels(test_geom$cats),
           legend.title.txt = paste0("Indice de Moran locaux\nVar = ", variable, "\n(pvalue < 0,1)"))

# Faire une meilleure cartographie. Voir, en fonction, si c'est pertinent de faire un tableau en fonction des communes nouvelles (profil similaire ou non)

# typoLayer(x = test_geomCN, var = "COM_NOUV",
#           legend.values.order = c("OUI", "NON"),
#           col=c("red","blue"),
#           border = "grey10", border_w, add= TRUE)
# plot(test_geomCN$geometry, col = NA, border = "black", lwd = 1, add = TRUE)

plot(st_geometry(test_geomCN), col = NA, border = "black", lwd = 1, add = TRUE)

results <- data.frame()

for (i in mesCommunes) { # Pour chaque identifiant de commune nouvelle, 
  toto <- subset (test_geom, CODGEO_new == i ) # Ne garder que les communes fusionnantes y ayant participé
  a <- table(toto$cats) # Relever les groupes des communes fusionnantes
  results <- rbind(results,a) # Combiner les résultats, par lignes
  rm(a, toto) # Supprimer "a"
}
colnames(results) <- levels(test_geom$cats)
results$CODGEO_new <- mesCommunes
# print(results)
print (summary(results))
}
## [1] "Not significant" "High-High"       "Low-Low"         "Low-High"       
## [5] "High-Low"

##  Not significant    High-High        Low-Low          Low-High     
##  Min.   : 0.000   Min.   :0.000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.: 2.000   1st Qu.:0.000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median : 5.000   Median :0.000   Median :0.0000   Median :0.0000  
##  Mean   : 6.142   Mean   :0.413   Mean   :0.6451   Mean   :0.2594  
##  3rd Qu.: 8.000   3rd Qu.:0.000   3rd Qu.:1.0000   3rd Qu.:0.0000  
##  Max.   :19.000   Max.   :5.000   Max.   :5.0000   Max.   :3.0000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:586        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.1314                     
##  3rd Qu.:0.0000                     
##  Max.   :2.0000                     
## [1] "Not significant" "High-High"       "Low-Low"         "Low-High"       
## [5] "High-Low"

##  Not significant    High-High         Low-Low          Low-High     
##  Min.   : 0.000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.: 3.000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median : 5.000   Median :0.0000   Median :0.0000   Median :0.0000  
##  Mean   : 6.162   Mean   :0.4488   Mean   :0.4488   Mean   :0.2901  
##  3rd Qu.: 8.750   3rd Qu.:0.0000   3rd Qu.:0.0000   3rd Qu.:0.0000  
##  Max.   :19.000   Max.   :5.0000   Max.   :4.0000   Max.   :2.0000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:586        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.2406                     
##  3rd Qu.:0.0000                     
##  Max.   :2.0000                     
## [1] "Not significant" "High-High"       "Low-Low"         "Low-High"       
## [5] "High-Low"

##  Not significant    High-High         Low-Low          Low-High     
##  Min.   : 0.000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.: 3.000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median : 5.000   Median :0.0000   Median :0.0000   Median :0.0000  
##  Mean   : 6.693   Mean   :0.3123   Mean   :0.2304   Mean   :0.2184  
##  3rd Qu.: 8.750   3rd Qu.:0.0000   3rd Qu.:0.0000   3rd Qu.:0.0000  
##  Max.   :21.000   Max.   :4.0000   Max.   :4.0000   Max.   :2.0000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:586        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.1365                     
##  3rd Qu.:0.0000                     
##  Max.   :2.0000                     
## [1] "Not significant" "High-High"       "Low-Low"         "Low-High"       
## [5] "High-Low"

##  Not significant    High-High          Low-Low          Low-High     
##  Min.   : 0.000   Min.   :0.00000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.: 3.000   1st Qu.:0.00000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median : 5.000   Median :0.00000   Median :0.0000   Median :0.0000  
##  Mean   : 6.225   Mean   :0.07338   Mean   :0.8601   Mean   :0.1997  
##  3rd Qu.: 8.000   3rd Qu.:0.00000   3rd Qu.:1.0000   3rd Qu.:0.0000  
##  Max.   :19.000   Max.   :3.00000   Max.   :6.0000   Max.   :2.0000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:586        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.2321                     
##  3rd Qu.:0.0000                     
##  Max.   :2.0000                     
## [1] "Not significant" "High-High"       "Low-Low"         "Low-High"       
## [5] "High-Low"

##  Not significant    High-High         Low-Low         Low-High     
##  Min.   : 0.000   Min.   :0.0000   Min.   :0.000   Min.   :0.0000  
##  1st Qu.: 3.000   1st Qu.:0.0000   1st Qu.:0.000   1st Qu.:0.0000  
##  Median : 5.000   Median :0.0000   Median :0.000   Median :0.0000  
##  Mean   : 6.445   Mean   :0.3072   Mean   :0.459   Mean   :0.0802  
##  3rd Qu.: 8.000   3rd Qu.:0.0000   3rd Qu.:0.000   3rd Qu.:0.0000  
##  Max.   :19.000   Max.   :6.0000   Max.   :6.000   Max.   :2.0000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:586        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.2986                     
##  3rd Qu.:0.0000                     
##  Max.   :3.0000                     
## [1] "Not significant" "High-High"       "Low-Low"         "Low-High"       
## [5] "High-Low"

##  Not significant    High-High         Low-Low          Low-High     
##  Min.   : 0.000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.: 2.000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median : 4.000   Median :0.0000   Median :0.0000   Median :0.0000  
##  Mean   : 6.024   Mean   :0.5375   Mean   :0.6809   Mean   :0.1263  
##  3rd Qu.: 8.000   3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:0.0000  
##  Max.   :22.000   Max.   :7.0000   Max.   :7.0000   Max.   :1.0000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:586        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.2218                     
##  3rd Qu.:0.0000                     
##  Max.   :4.0000                     
## [1] "Not significant" "High-High"       "Low-Low"         "Low-High"       
## [5] "High-Low"

##  Not significant    High-High         Low-Low          Low-High     
##  Min.   : 0.000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.: 3.000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median : 5.000   Median :0.0000   Median :0.0000   Median :0.0000  
##  Mean   : 6.447   Mean   :0.4215   Mean   :0.3515   Mean   :0.2304  
##  3rd Qu.:10.000   3rd Qu.:1.0000   3rd Qu.:0.0000   3rd Qu.:0.0000  
##  Max.   :21.000   Max.   :4.0000   Max.   :5.0000   Max.   :3.0000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:586        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.1399                     
##  3rd Qu.:0.0000                     
##  Max.   :2.0000                     
## [1] "Not significant" "High-High"       "Low-Low"         "Low-High"       
## [5] "High-Low"

##  Not significant    High-High         Low-Low          Low-High     
##  Min.   : 0.000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.: 2.000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median : 5.000   Median :0.0000   Median :0.0000   Median :0.0000  
##  Mean   : 6.032   Mean   :0.5956   Mean   :0.6212   Mean   :0.1706  
##  3rd Qu.: 8.000   3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:0.0000  
##  Max.   :19.000   Max.   :9.0000   Max.   :6.0000   Max.   :1.0000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:586        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.1706                     
##  3rd Qu.:0.0000                     
##  Max.   :2.0000                     
## [1] "Not significant" "High-High"       "Low-Low"         "Low-High"       
## [5] "High-Low"

##  Not significant    High-High         Low-Low          Low-High     
##  Min.   : 0.000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.: 3.000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median : 5.000   Median :0.0000   Median :0.0000   Median :0.0000  
##  Mean   : 6.445   Mean   :0.1212   Mean   :0.5512   Mean   :0.1246  
##  3rd Qu.: 9.000   3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:0.0000  
##  Max.   :20.000   Max.   :2.0000   Max.   :4.0000   Max.   :1.0000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:586        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.3481                     
##  3rd Qu.:1.0000                     
##  Max.   :2.0000                     
## [1] "Not significant" "High-High"       "Low-Low"         "Low-High"       
## [5] "High-Low"

##  Not significant    High-High         Low-Low           Low-High     
##  Min.   : 0.000   Min.   :0.0000   Min.   : 0.0000   Min.   :0.0000  
##  1st Qu.: 2.000   1st Qu.:0.0000   1st Qu.: 0.0000   1st Qu.:0.0000  
##  Median : 4.000   Median :0.0000   Median : 0.0000   Median :0.0000  
##  Mean   : 5.596   Mean   :0.5375   Mean   : 0.9556   Mean   :0.3396  
##  3rd Qu.: 7.000   3rd Qu.:0.0000   3rd Qu.: 1.0000   3rd Qu.:0.0000  
##  Max.   :19.000   Max.   :5.0000   Max.   :11.0000   Max.   :3.0000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:586        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.1621                     
##  3rd Qu.:0.0000                     
##  Max.   :2.0000                     
## [1] "Not significant" "High-High"       "Low-Low"         "Low-High"       
## [5] "High-Low"

##  Not significant    High-High         Low-Low          Low-High    
##  Min.   : 0.000   Min.   :0.0000   Min.   :0.0000   Min.   :0.000  
##  1st Qu.: 2.000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.000  
##  Median : 4.000   Median :0.0000   Median :0.0000   Median :0.000  
##  Mean   : 5.747   Mean   :0.7065   Mean   :0.7867   Mean   :0.157  
##  3rd Qu.: 8.000   3rd Qu.:1.0000   3rd Qu.:0.0000   3rd Qu.:0.000  
##  Max.   :18.000   Max.   :5.0000   Max.   :8.0000   Max.   :2.000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:586        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.1928                     
##  3rd Qu.:0.0000                     
##  Max.   :2.0000
# par(mar = c(0,0,0,0), mfrow = c(1,1))

rm(variable, df_variable, lms, pvals, cats, lbls, num_levels)

Les situations sont donc très contrastées, quelle que soit la variable étudiée. Certaines hypothèses posées à l’aide de la CAH (par exemple forte présence des communes nouvelles autour des clusters de taux élevés de navetteurs et de taux faibles de chômages) se trouvent validées de manière partielles.

Concernant le taux de chômage, on n’observe pas de lien fort entre l’autocorrélation spatiale des taux de chômages et celle des communes nouvelles.

Concernant les taux de navetteurs, les communes nouvelles se sont construites majoritairement hors des clusters identifiés par LISA, ou alors sur des clusters plutôt low-low.

Les communes nouvelles ne paraissent pas construites systématiquement sur des modèles homogènes ou hétérogènes, ni en lien avec les clusters identifiés par LISA.

Quelles communes ont refusé la fusion

Communes pour lesquelles ont peut considérer, d’un point de vue théorique au moins, qu’elles ont refusé une fusion proposée : les communes limitrophes de communes ayant fusionné.

# Import données si besoin
load("data/refdata.Rdata")
geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE) 


test_geom <- merge(geom2011, df2011[, c("CODGEO", "CODE_DEPT", "LIBGEO", "COM_NOUV", "P09_POP")], by = "CODGEO")
# test_geom <- subset (test_geom, CODE_DEPT == "49" )

# Pour voir le détail d'un exemple
numcom <- sample(x = 1:nrow(test_geom), size = 1)

# Si on part du package rgeoda
queen_w <- queen_weights(test_geom, order=1, include_lower_order = FALSE, precision_threshold = 0)
numvoisins <- get_neighbors(queen_w, idx = numcom)
cat("\nLes voisins de la commune", test_geom$LIBGEO[numcom], "(CODGEO", test_geom$CODGEO[numcom], ") sont :", test_geom$LIBGEO[numvoisins])
## 
## Les voisins de la commune Ligné (CODGEO 16185 ) sont : Charmé Fouqueure Juillé Luxé Tusson
# Si on part du package spdep
test_queen <- poly2nb(test_geom, queen = TRUE)
## Warning in poly2nb(test_geom, queen = TRUE): some observations have no neighbours;
## if this seems unexpected, try increasing the snap argument.
numvoisins <- unlist(test_queen[numcom])
cat("\nLes voisins de la commune", test_geom$LIBGEO[numcom], "sont :", test_geom$LIBGEO[numvoisins])
## 
## Les voisins de la commune Ligné sont : Charmé Fouqueure Juillé Luxé Tusson
rm(numcom, numvoisins, queen_w, test_queen, test_geom)
# geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE)
datafus2011 <- subset(df2011, COM_NOUV == "OUI")

test_geom <- merge(geom2011, df2011[, c("CODGEO", "CODE_DEPT", "LIBGEO", "COM_NOUV", "P09_POP")], by = "CODGEO")

# Si on part du package rgeoda
queen_w <- queen_weights(test_geom, order=1, include_lower_order = FALSE, precision_threshold = 0)


# On crée le vecteur qui va abriter les résultats
# Il s'agit du CODGEO des communes voisines d'au moins une commune fusionnante
CODGEO_voisins_Cfus <- vector()

for (i in 1:nrow(datafus2011)) {
  # On identifie la commune
  CODGEO_com <- datafus2011$CODGEO[i]
  numcom <- which(test_geom$CODGEO==CODGEO_com)

  # On liste les voisins, par l'identifiant de leur ligne
  numvoisins <- get_neighbors(queen_w, idx = numcom)
  CODGEO_voisins <- test_geom$CODGEO[numvoisins]
  CODGEO_voisins_Cfus <- c(CODGEO_voisins, CODGEO_voisins_Cfus)

}
rm(i, CODGEO_com, numcom, numvoisins, CODGEO_voisins)

Com_voisines <- data.frame(table(CODGEO_voisins_Cfus))
colnames(Com_voisines) <- c("CODGEO", "Nbr_voisinage_Cfus")

# Pour exporter les résultats
# write.table(Com_voisines, "sorties/Nombre de communes limitrophes fusionnantes.txt", sep="\t", row.names=FALSE) 
write.table(Com_voisines, "sorties/Nombre de communes limitrophes fusionnantes 2011-2024.txt", sep="\t", row.names=FALSE) 

# Com_voisines <- read.table("sorties/Nombre de communes limitrophes fusionnantes.txt", sep="\t", colClasses = c("character", "numeric"), head = TRUE, stringsAsFactors = TRUE)

df2011 <- merge(df2011, Com_voisines, by = "CODGEO", all.x = TRUE)
df2011$Nbr_voisinage_Cfus[is.na(df2011$Nbr_voisinage_Cfus)] <- 0

dataNfus2011 <- subset(df2011, COM_NOUV == "NON") 
table(dataNfus2011$Nbr_voisinage_Cfus)
## 
##     0     1     2     3     4     5     6     7     8 
## 28294  2916  1568   513   177    51    14     2     2
tabcont<-data.frame(table(df2011$COM_NOUV, df2011$Nbr_voisinage_Cfus))
# Pour simplifier représentation graphique
tabcont<- subset(tabcont, Var2 != "0")
# Si on veut mettre en pourcentages
# tab <- round(100*prop.table(tabcont,margin=1),2) # Pourcentages, le total se fait par lignes
# prbarplot <- as.data.frame(tab)
ggplot(data = tabcont, aes(x = Var2, y = Freq, fill = Var1)) +
  geom_bar(stat = "identity", position=position_dodge()) +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  scale_x_discrete("Nombre de voisins étant une commune fusionnante") + 
  scale_y_continuous("Nombre de communes") +
  scale_fill_manual("Communes\nfusionnantes", values = c("blue", "red")) +
  ggtitle("Les communes en fonction de leur\nvoisinage d'une commune fusionnante\nNB : Communes sans voisinage de communes fusionnantes\nretirées du graphique")

# Si on veut mettre en pourcentages
tabcont<-table(df2011$COM_NOUV, df2011$Nbr_voisinage_Cfus)
tab <- round(100*prop.table(tabcont,margin=1),2) # Pourcentages, le total se fait par lignes
prbarplot <- as.data.frame(tab)
# Si on veut enlever les communes sans voisinage avec une commune nouvelle
# prbarplot<- subset(prbarplot, Var2 != "0")
ggplot(data = prbarplot, aes(x = Var2, y = Freq, fill = Var1)) +
  geom_bar(stat = "identity", position=position_dodge()) +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  scale_x_discrete("Nombre de voisins étant une commune fusionnante") + 
  scale_y_continuous("Pourcentage de ce type de commune (fusionnante ou non)") +
  scale_fill_manual("Communes\nfusionnantes", values = c("blue", "red")) +
  ggtitle("Les communes en fonction de leur\nvoisinage d'une commune fusionnante")

Différences moyennes entre communes voisines fusionnantes ou non

Cf. script créé à part (etude_voisines.Rmd)

10 - ÉVOLUTIONS DÉMOGRAPHIQUES SUR LE TEMPS LONG

Cf. script créé à part (demog_teps_long.Rmd).

11 LE CIF

Deux rapports publiés en septembre 2022, l’un de l’IGA et l’autre de V. Aubelle, font référence au Coefficient d’Intégration Fiscale (CIF) mais pour des conclusions tout à fait opposées : pour les uns, un CIF fort pousse à davantage de fusions entre des communes très proches, pour d’autres, cela est plutôt le signe d’une faible marge d’autonomie que les communes pourraient souhaiter conserver en fusionnant peu.

Par exemple, pour V. Aubelle, « il existe une corrélation assez étroite entre l’importance de celui-ci [le Coefficient d’Intégration Fiscale (CIF)] et l’essor des communes nouvelles. (p. 27) », tout en évitant toute relations simpliste : « Disposer d’un coefficient d’intégration fiscale élevé ne peut valoir automaticité de la création d’une commune nouvelle. » (p. 37).

Import des données (avant intégration dans data_prep)

On importe les données, en ayant bien conscience que le CIF est calculé à l’échelle intercommunale et est ici ventilé à une échelle communale sans modification (car il s’agit d’un ratio).

# Section utile uniquement avant que le CIF soit intégré aux données de la base DAC
# library(readxl)
CIF_2012 <- read_excel("data-raw/budgets/CIF pour DGF 2012 et 2015.xls", 
    sheet = "CIF pour DGF 2012")
colnames(CIF_2012)
colnames(CIF_2012) <- c("EPCI_2012", "Nom_EPCI_2012", "CIF_2012")

CIF_2015 <- read_excel("data-raw/budgets/CIF pour DGF 2012 et 2015.xls", 
    sheet = "CIF pour DGF 2015")
colnames(CIF_2015)
colnames(CIF_2015) <- c("EPCI_2015", "Nom_EPCI_2015", "CIF_2015")

load("data/refdata.Rdata")

variables_etud <- c("CODGEO", "LIBGEO", "COM_NOUV", "EPCI", "CODE_DEPT", "CATAEU2010")

df2011_CIF <- merge(df2011[, variables_etud], CIF_2012, by.x = "EPCI", by.y = "EPCI_2012", all.x = TRUE)
df2011_CIF <- merge(df2011_CIF, CIF_2015, by.x = "EPCI", by.y = "EPCI_2015", all.x = TRUE)


df2011_CIF$CIF_2015_moins_CIF2012 <- df2011_CIF$CIF_2012 - df2011_CIF$CIF_2015


# try(save(df2011_CIF, file = "data/data_CIF.Rdata"))
# load("data/data_CIF.Rdata")

Import données CIF par df2011

load("data/refdata.Rdata")

df2011_CIF <- df2011[, c("CODGEO", "LIBGEO", "COM_NOUV", "EPCI", "CODE_DEPT", "CATAEU2010", "CIF_2012", "CIF_2015")]

Passage CIF en quintiles

df_sans_geom <- df2011_CIF

variables_quanti_quali <- c("CIF_2012", "CIF_2015")
variable <- "CIF_2012"
for (variable in variables_quanti_quali) {

Y <- df_sans_geom[, variable] # On se focalise sur une variable en particulier

# Calcul moyenne groupes
moy <- as.data.frame(tapply(df_sans_geom[, variable], df_sans_geom$COM_NOUV, mean, na.rm = TRUE))
moy$COM_NOUV <- row.names(moy)
colnames(moy) <- c("moyenne", "COM_NOUV") 

# Calcul moyenne groupes
med <- as.data.frame(tapply(df_sans_geom[, variable], df_sans_geom$COM_NOUV, median, na.rm = TRUE))
med$COM_NOUV <- row.names(moy)
colnames(med) <- c("median", "COM_NOUV") 

# On veut observer graphiquement la distribution statistique
histo <- ggplot(df_sans_geom)+
  geom_histogram(aes(x=df_sans_geom[, variable], color = COM_NOUV), bins=50)+
  labs(title = paste("Variable étudiée :\n", variable), subtitle = "Pointillés : moyennes.\nLignes pleines : médianes.")+
  # geom_vline(aes(xintercept=median(df_sans_geom[, variable], na.rm = T)),      color="black", linetype="dashed" )+
  geom_vline(data=moy, aes(xintercept=moyenne, color=COM_NOUV),             linetype="dashed") +
  geom_vline(data=med, aes(xintercept=median, color=COM_NOUV)) +
  ylab("Count")+theme_light()
# Pour export tapuscrit
# histo <- ggplot(df_sans_geom)+
#   geom_histogram(aes(x=df_sans_geom[, variable], color = COM_NOUV), bins=50, fill="white")+
#   labs(title = "Coefficient d'Intégration Fiscale (CIF, 2012)", subtitle = "Pointillés : moyennes. Lignes pleines : médianes.",
#        color = "Communes\nfusionnantes")+
#   # geom_vline(aes(xintercept=median(df_sans_geom[, variable], na.rm = T)),      color="black", linetype="dashed" )+
#   geom_vline(data=moy, aes(xintercept=moyenne, color=COM_NOUV),             linetype="dashed") +
#   geom_vline(data=med, aes(xintercept=median, color=COM_NOUV)) +
#   ylab("Nombre de communes")+xlab("CIF (2012)") +
#   scale_color_manual (values=couleurs, labels = c("Non", "Oui"))

print(histo)

# On découpe en fonction du quantile souhaité puis on modifie l'ordre de niveaux de facteur pour que la variable centrale soit la première

coupures <- quantile(Y, probs=seq(0, 1, 0.2), na.rm = TRUE)

if (any(duplicated(coupures)) == FALSE) { # Si c'est possible, on utilise les quintiles
  Y <- cut(Y,breaks=c(quantile(Y, probs=seq(0, 1, 0.2), na.rm = TRUE))) # Pour découpage en quintiles
levels(Y)<-c("Q1","Q2", "Q3", "Q4", "Q5")
# Y <- relevel (Y, "Q3","Q1", "Q2", "Q4", "Q5") # Utile seulement pour faire des régressions avec valeur centrale en référence
}else{# Sinon, on utilise les tertiles
Y <- cut(Y,breaks=c(quantile(Y, probs=seq(0, 1, 1/3), na.rm = TRUE))) # Pour découpage en tertiles
levels(Y)<-c("Tertile_inf","Tertile_med", "Tertile_sup")
Y <- relevel (Y, "Tertile_med", "Tertile_inf", "Tertile_sup")
}


# Y<-cut(Y,breaks=c(quantile(Y))) # Pour découpage en quartiles
# levels(Y)<-c("Q1","Q2", "Q3", "Q4")




summary(Y)


X <- df_sans_geom$COM_NOUV
summary(X)

tabcont<-table(X,Y)
# tabcont # En valeur absolue
# round(100*prop.table(tabcont,margin=1),1) # Pourcentages, le total se fait par lignes
# round(100*prop.table(tabcont,margin=),1) # Pourcentages, le total se fait sur l'ensemble de la population
print(kable(round(100*prop.table(tabcont,margin=2),1))) # Pourcentages, le total se fait par colonnes

# On verse les nouvelles données au data frame
df2011_CIF[, paste0(variable, "_quali")] <- Y

}
## Warning: Removed 1927 rows containing non-finite outside the scale range
## (`stat_bin()`).

## 
## 
## |    |   Q1|   Q2|   Q3|   Q4|   Q5|
## |:---|----:|----:|----:|----:|----:|
## |NON | 95.1| 94.6| 93.5| 91.5| 87.4|
## |OUI |  4.9|  5.4|  6.5|  8.5| 12.6|
## Warning: Removed 10801 rows containing non-finite outside the scale range
## (`stat_bin()`).

## 
## 
## |    |   Q1|   Q2|   Q3|   Q4| Q5|
## |:---|----:|----:|----:|----:|--:|
## |NON | 96.1| 94.7| 93.1| 91.6| 85|
## |OUI |  3.9|  5.3|  6.9|  8.4| 15|
rm(tabcont, X, Y, df_sans_geom, variable, histo)

Sauvegarde données que CIF

colnames(df2011_CIF)
# df2011_CIF <- df2011[, c("CODGEO", "LIBGEO", "COM_NOUV", "EPCI", "CODE_DEPT", "CATAEU2010", "Nom_EPCI_2012" ,"CIF_2012", "Nom_EPCI_2015", "CIF_2015", "CIF_2015_moins_CIF2012")]
try(save(df2011_CIF, file = "data/data_CIF.Rdata"))
load("data/data_CIF.Rdata")

Première analyse

colnames(df2011_CIF)
##  [1] "CODGEO"         "LIBGEO"         "COM_NOUV"       "EPCI"          
##  [5] "CODE_DEPT"      "CATAEU2010"     "CIF_2012"       "CIF_2015"      
##  [9] "CIF_2012_quali" "CIF_2015_quali"
summary(df2011_CIF$CIF_2012)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##  0.0000  0.2934  0.3468  0.3671  0.4247  0.9846    1927
summary(df2011_CIF$CIF_2015)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   0.012   0.306   0.358   0.377   0.432   0.972   10801
summary(df2011_CIF$CIF_2015_moins_CIF2012)
## Length  Class   Mode 
##      0   NULL   NULL
table(df2011_CIF$COM_NOUV)
## 
##   NON   OUI 
## 33537  2671
summary(df2011_CIF$CIF_2015[df2011_CIF$COM_NOUV == "OUI"])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##  0.0628  0.3417  0.4075  0.4336  0.5103  0.9204     670
summary(df2011_CIF$CIF_2015[df2011_CIF$COM_NOUV == "NON"])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   0.012   0.304   0.354   0.372   0.425   0.972   10131
summary(df2011_CIF$CIF_2012[df2011_CIF$COM_NOUV == "OUI"])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
## 0.06075 0.32063 0.38902 0.41443 0.48737 0.95883      74
summary(df2011_CIF$CIF_2012[df2011_CIF$COM_NOUV == "NON"])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##  0.0000  0.2912  0.3443  0.3632  0.4207  0.9846    1853
tapply(df2011_CIF$CIF_2012, INDEX = df2011_CIF$COM_NOUV, median, na.rm = TRUE)
##      NON      OUI 
## 0.344261 0.389019
tapply(df2011_CIF$CIF_2015, INDEX = df2011_CIF$COM_NOUV, median, na.rm = TRUE)
##      NON      OUI 
## 0.354408 0.407451
table(nchar(df_new$CIF_2012))
## 
##     1     2     4     5     6     7     8    10    11    15    16    17    19 
##    29    17     8    37   201  2831 29257     4    18     3    16    93     2 
##    20    24    25    26 
##     3     1     1     5
# Nombre de communes finales qui ont "-" dans leur CIF, et donc qui regroupent des communes avec des CIF différents en 2012
length (grep(pattern = "-", df_new$CIF_2012, ignore.case = FALSE))
## [1] 146
# ANOVA
aovCIF_2012 <- aov(CIF_2012 ~ COM_NOUV, data = df2011_CIF)
summary(aovCIF_2012)
##                Df Sum Sq Mean Sq F value Pr(>F)    
## COM_NOUV        1    6.3   6.294   392.1 <2e-16 ***
## Residuals   34279  550.3   0.016                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 1927 observations effacées parce que manquantes
aovCIF_2015 <- aov(CIF_2015 ~ COM_NOUV, data = df2011_CIF)
summary(aovCIF_2015)
##                Df Sum Sq Mean Sq F value Pr(>F)    
## COM_NOUV        1    7.0   6.989   498.2 <2e-16 ***
## Residuals   25405  356.4   0.014                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 10801 observations effacées parce que manquantes
couleurs <- c("#2b83ba", "red4")
df2011_CIF$COM_NOUV <- as.factor(df2011_CIF$COM_NOUV)
ggplot(df2011_CIF, aes(x=COM_NOUV, y=CIF_2012, color = COM_NOUV))  + geom_boxplot() + scale_color_manual(values=couleurs)
## Warning: Removed 1927 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

# Couleurs ne marchent pas, sans que je sache pourquoi  
ggplot(df2011_CIF, aes(x=COM_NOUV, y=CIF_2015, color = COM_NOUV))  + geom_boxplot() + scale_color_manual(values=couleurs)
## Warning: Removed 10801 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

Bilan : La relation est bien significative à l’échelle nationale.

Par départements

df2011_CIF$COM_NOUV_DEPT <- paste0(df2011_CIF$CODE_DEPT, "_", df2011_CIF$COM_NOUV)

tapply(df2011_CIF$CIF_2012, INDEX = df2011_CIF$COM_NOUV_DEPT, median, na.rm = TRUE)
##    01_NON    01_OUI    02_NON    02_OUI    03_NON    03_OUI    04_NON    04_OUI 
## 0.3274830 0.2236200 0.3335760 0.3356640 0.3232440 0.2537710 0.3064320 0.6087480 
##    05_NON    05_OUI    06_NON    07_NON    07_OUI    08_NON    08_OUI    09_NON 
## 0.3934160 0.4512620 0.3590470 0.3435130 0.3732310 0.4051960 0.4051960 0.4305600 
##    09_OUI    10_NON    10_OUI    11_NON    11_OUI    12_NON    12_OUI    13_NON 
## 0.4451325 0.2686150 0.3241670 0.3266090 0.3176990 0.4566900 0.4101720 0.3300080 
##    14_NON    14_OUI    15_NON    15_OUI    16_NON    16_OUI    17_NON    17_OUI 
## 0.4015580 0.4379780 0.3187340 0.3446280 0.3729620 0.3661490 0.3292630 0.3262065 
##    18_NON    18_OUI    19_NON    19_OUI    21_NON    21_OUI    22_NON    22_OUI 
## 0.2776640 0.4932390 0.2824650 0.3259860 0.3647870 0.3166005 0.3418800 0.3206320 
##    23_NON    23_OUI    24_NON    24_OUI    25_NON    25_OUI    26_NON    26_OUI 
## 0.3180490 0.3123440 0.3472290 0.4002130 0.3475160 0.3977300 0.3287080 0.3312840 
##    27_NON    27_OUI    28_NON    28_OUI    29_NON    29_OUI    30_NON    30_OUI 
## 0.4255660 0.4522910 0.3107720 0.3036055 0.3080970 0.3362240 0.3799470 0.4397670 
##    31_NON    31_OUI    32_NON    32_OUI    33_NON    33_OUI    34_NON    34_OUI 
## 0.3816680 0.4097420 0.3060060 0.3311140 0.3380350 0.3712910 0.3525510 0.3759015 
##    35_NON    35_OUI    36_NON    36_OUI    37_NON    37_OUI    38_NON    38_OUI 
## 0.2973810 0.3635460 0.3227890 0.3246120 0.3050440 0.2458710 0.3240910 0.3294440 
##    39_NON    39_OUI    40_NON    40_OUI    41_NON    41_OUI    42_NON    42_OUI 
## 0.3431750 0.5192400 0.3204340 0.3628760 0.2926370 0.3443070 0.3152940 0.4078650 
##    43_NON    43_OUI    44_NON    44_OUI    45_NON    45_OUI    46_NON    46_OUI 
## 0.3351820 0.3117910 0.3657340 0.3667820 0.3258170 0.5009250 0.4243620 0.6554310 
##    47_NON    48_NON    48_OUI    49_NON    49_OUI    50_NON    50_OUI    51_NON 
## 0.3952220 0.3639700 0.3333100 0.3345910 0.3553610 0.4498320 0.4773720 0.4934310 
##    51_OUI    52_NON    52_OUI    53_NON    53_OUI    54_NON    54_OUI    55_NON 
## 0.4217640 0.3701420 0.5657980 0.3410470 0.5316910 0.4033700 0.4583980 0.5623520 
##    55_OUI    56_NON    56_OUI    57_NON    57_OUI    58_NON    58_OUI    59_NON 
## 0.5107815 0.3103780 0.3457820 0.3540660 0.2923190 0.3188690 0.4631800 0.3907630 
##    59_OUI    60_NON    60_OUI    61_NON    61_OUI    62_NON    62_OUI    63_NON 
## 0.4516660 0.3271950 0.3417440 0.5862760 0.5514440 0.3760670 0.3853450 0.3026560 
##    63_OUI    64_NON    64_OUI    65_NON    65_OUI    66_NON    67_NON    67_OUI 
## 0.3263350 0.3573670 0.4360120 0.4505030 0.2643950 0.3019480 0.3559440 0.3626080 
##    68_NON    68_OUI    69_NON    69_OUI    70_NON    70_OUI    71_NON    71_OUI 
## 0.3406890 0.3574930 0.3818990 0.3818990 0.4399290 0.3420770 0.3170550 0.3788120 
##    72_NON    72_OUI    73_NON    73_OUI    74_NON    74_OUI    75_NON    76_NON 
## 0.3010030 0.3078320 0.3195390 0.2819820 0.3063470 0.3063470        NA 0.3245760 
##    76_OUI    77_NON    77_OUI    78_NON    78_OUI    79_NON    79_OUI    80_NON 
## 0.4603475 0.2451070 0.4034010 0.2998400 0.2418070 0.3689560 0.3391440 0.3945290 
##    80_OUI    81_NON    81_OUI    82_NON    83_NON    84_NON    85_NON    85_OUI 
## 0.5559580 0.3150850 0.4077270 0.3499290 0.2912690 0.2941560 0.3528180 0.3731020 
##    86_NON    86_OUI    87_NON    87_OUI    88_NON    88_OUI    89_NON    89_OUI 
## 0.3025210 0.3438840 0.3087590 0.3309320 0.2944210 0.3234680 0.2747770 0.3279400 
##    90_NON    90_OUI    91_NON    91_OUI    92_NON    93_NON    93_OUI    94_NON 
## 0.3840340 0.3840340 0.2955200 0.4310490 0.2321120 0.0952380 0.4072780 0.2379510 
##    95_NON    95_OUI 
## 0.2435910 0.2542600
tapply(df2011_CIF$CIF_2015, INDEX = df2011_CIF$COM_NOUV_DEPT, median, na.rm = TRUE)
##    01_NON    01_OUI    02_NON    02_OUI    03_NON    03_OUI    04_NON    04_OUI 
## 0.3531400 0.4312230 0.3274240 0.3298340 0.3189210 0.3449450 0.3431620 0.6559215 
##    05_NON    05_OUI    06_NON    07_NON    07_OUI    08_NON    08_OUI    09_NON 
## 0.3281010 0.4437750 0.2670920 0.4092950 0.5480900 0.3951090 0.3951090 0.4423780 
##    09_OUI    10_NON    10_OUI    11_NON    11_OUI    12_NON    12_OUI    13_NON 
## 0.4445365 0.2631850 0.3287680 0.3179850 0.3179850 0.4593540 0.4445410 0.3730380 
##    14_NON    14_OUI    15_NON    15_OUI    16_NON    16_OUI    17_NON    17_OUI 
## 0.4406630 0.4480870 0.3325710 0.3604990 0.3567680 0.3567680 0.3995320 0.3505665 
##    18_NON    18_OUI    19_NON    19_OUI    21_NON    21_OUI    22_NON    22_OUI 
## 0.2990250 0.5202650 0.3224860 0.3384890 0.3636390 0.3261610 0.3446460 0.3438940 
##    23_NON    23_OUI    24_NON    24_OUI    25_NON    25_OUI    26_NON    26_OUI 
## 0.3298850 0.3124930 0.3384250 0.3965630 0.3687070 0.3687070 0.3646480 0.3697130 
##    27_NON    27_OUI    28_NON    28_OUI    29_NON    29_OUI    30_NON    30_OUI 
## 0.4342490 0.4791615 0.3314290 0.3544080 0.3249230 0.3539360 0.3841100 0.4409950 
##    31_NON    31_OUI    32_NON    32_OUI    33_NON    33_OUI    34_NON    34_OUI 
## 0.3934230 0.4253870 0.3014730 0.3382030 0.3470810 0.3725770 0.4062830 0.2975200 
##    35_NON    35_OUI    36_NON    36_OUI    37_NON    37_OUI    38_NON    38_OUI 
## 0.3608080 0.4502030 0.3298040 0.3355885 0.3186960 0.3072070 0.3609360 0.3405860 
##    39_NON    39_OUI    40_NON    40_OUI    41_NON    41_OUI    42_NON    42_OUI 
## 0.3882120 0.5005060 0.3298240 0.3689430 0.3335970 0.5393640 0.3348760 0.4002310 
##    43_NON    43_OUI    44_NON    44_OUI    45_NON    45_OUI    46_NON    46_OUI 
## 0.3388420 0.3097610 0.3852720 0.3882150 0.3369780 0.4870860 0.4439490 0.6350160 
##    47_NON    48_NON    48_OUI    49_NON    49_OUI    50_NON    50_OUI    51_NON 
## 0.3746545 0.3973010 0.3415965 0.3496720 0.3865780 0.4702890 0.5070960 0.4665950 
##    51_OUI    52_NON    52_OUI    53_NON    53_OUI    54_NON    54_OUI    55_NON 
## 0.4665950 0.3701730 0.5678330 0.3496130 0.5205580 0.4050780 0.4587680 0.5808050 
##    55_OUI    56_NON    56_OUI    57_NON    57_OUI    58_NON    58_OUI    59_NON 
## 0.6557730 0.3416640 0.3416640 0.3395220 0.2886270 0.3270950 0.3256330 0.4487250 
##    59_OUI    60_NON    60_OUI    61_NON    61_OUI    62_NON    62_OUI    63_NON 
## 0.4487250 0.3272970 0.3527580 0.5706360 0.5697960 0.3772590 0.3995710 0.3391390 
##    63_OUI    64_NON    64_OUI    65_NON    65_OUI    66_NON    67_NON    67_OUI 
## 0.3505930 0.3887585 0.3655690 0.4696420 0.2172130 0.3166440 0.3555080 0.3652040 
##    68_NON    68_OUI    69_NON    69_OUI    70_NON    70_OUI    71_NON    71_OUI 
## 0.3494320 0.3652075 0.3817230 0.4070540 0.4571990 0.4386655 0.3416410 0.4768730 
##    72_NON    72_OUI    73_NON    73_OUI    74_NON    74_OUI    75_NON    76_NON 
## 0.2950830 0.3204070 0.3759380 0.2961110 0.3465450 0.3465450        NA 0.3282690 
##    76_OUI    77_NON    77_OUI    78_NON    78_OUI    79_NON    79_OUI    80_NON 
## 0.4663370 0.2856030 0.4121980 0.3336830 0.2831175 0.4041690 0.4041690 0.4098330 
##    80_OUI    81_NON    81_OUI    82_NON    83_NON    84_NON    85_NON    85_OUI 
## 0.5612090 0.3057190 0.5434930 0.3554300 0.3295980 0.3226510 0.3503250 0.3607830 
##    86_NON    86_OUI    87_NON    87_OUI    88_NON    88_OUI    89_NON    89_OUI 
## 0.3013580 0.3552670 0.3272650 0.3539970 0.2744290 0.3353260 0.2610020 0.3080770 
##    90_NON    90_OUI    91_NON    91_OUI    92_NON    93_NON    93_OUI    94_NON 
## 0.3738870 0.3738870 0.3138830 0.4051160 0.2517780 0.1825290 0.3881320 0.2635280 
##    95_NON    95_OUI 
## 0.2444230        NA
# ANOVA
aovCIF_2012 <- aov(CIF_2012 ~ COM_NOUV_DEPT, data = df2011_CIF)
summary(aovCIF_2012)
##                  Df Sum Sq Mean Sq F value Pr(>F)    
## COM_NOUV_DEPT   176  145.7   0.828   68.72 <2e-16 ***
## Residuals     34104  410.9   0.012                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 1927 observations effacées parce que manquantes
aovCIF_2015 <- aov(CIF_2015 ~ COM_NOUV_DEPT, data = df2011_CIF)
summary(aovCIF_2015)
##                  Df Sum Sq Mean Sq F value Pr(>F)    
## COM_NOUV_DEPT   175  104.7  0.5983   58.36 <2e-16 ***
## Residuals     25231  258.7  0.0103                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 10801 observations effacées parce que manquantes
# En prenant seulement les seize premiers départements
df2011_CIF_subset <- subset(df2011_CIF, df2011_CIF$CODE_DEPT == "49"| df2011_CIF$CODE_DEPT == "14" | df2011_CIF$CODE_DEPT ==  "50" | df2011_CIF$CODE_DEPT ==  "61" | df2011_CIF$CODE_DEPT ==  "27" | df2011_CIF$CODE_DEPT ==  "24" | df2011_CIF$CODE_DEPT ==  "39" | df2011_CIF$CODE_DEPT ==  "79" | df2011_CIF$CODE_DEPT ==  "16" | df2011_CIF$CODE_DEPT ==  "28" | df2011_CIF$CODE_DEPT ==  "48" | df2011_CIF$CODE_DEPT ==  "73" | df2011_CIF$CODE_DEPT ==  "76" | df2011_CIF$CODE_DEPT ==  "01" | df2011_CIF$CODE_DEPT ==  "85" | df2011_CIF$CODE_DEPT ==  "89")


df2011_CIF_subset$COM_NOUV_DEPT <- as.factor(df2011_CIF_subset$COM_NOUV_DEPT)

nom_groupe <- levels(df2011_CIF_subset$COM_NOUV_DEPT)
nbr_com_groupe <- table(df2011_CIF_subset$COM_NOUV_DEPT)
nom_groupe <- paste0(nom_groupe, " (", nbr_com_groupe, ")")

# table(df2011_CIF_subset$CODE_DEPT)

ggplot(df2011_CIF_subset, aes(x=COM_NOUV_DEPT, y=CIF_2012, color = COM_NOUV))  +
  geom_boxplot() +
  scale_x_discrete(name = "Département des communes fusionnantes ou non (et nombre)", labels = nom_groupe) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(subtitle = "Coefficient d'Intégration Fiscale des communes fusionnantes ou non",
       x = "Département des communes fusionnantes ou non (et nombre)",
       y = "CIF (2012)", 
       color = " ") +
       # color = "Statut de la commune") +
  scale_color_manual (values=couleurs, labels = c("\nCommunes\ninchangées\n", "\nCommunes\nfusionnantes\n"))
## Warning: Removed 277 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

ggplot(df2011_CIF_subset, aes(x=COM_NOUV_DEPT, y=CIF_2015, color = COM_NOUV))  + 
  geom_boxplot() +
  scale_x_discrete(name = "Département des communes fusionnantes ou non (et nombre)", labels = nom_groupe) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(subtitle = "Coefficient d'Intégration Fiscale des communes fusionnantes ou non",
       x = "Département des communes fusionnantes ou non (et nombre)",
       y = "CIF (2015)", 
       color = "Statut de la commune") +
  scale_color_manual (values=couleurs, labels = c("Communes non fusionnantes", "Communes fusionnantes"))
## Warning: Removed 2227 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

Analyse par départements qui va dans le même sens : Les communes qui fusionnent ont un CIF plus élevé, quel que soit le département pris en compte. Quelques rares contre-exemples : Lozère (48), Savoie (73).

Cartographie par départements

CIF_dep <- as.data.frame(tapply(df2011_CIF$CIF_2012, df2011_CIF$CODE_DEPT, mean, na.rm = TRUE))
colnames(CIF_dep) <- "CIF_moy_dep"
CIF_dep$CODE_DEPT <- row.names(CIF_dep)

dep <- st_read("data/geom.gpkg", layer = "dep", quiet = TRUE)
ShpDep <- as(dep, "Spatial")
CIF_dep1 <- merge (dep, CIF_dep, by = "CODE_DEPT")

choroLayer(#spdf = ShpDep, # SpatialPolygonsDataFrame
          #df = CIF_dep, # data frame
          x = CIF_dep1, # data frame
          # spdfid = "CODE_DEPT",
          # dfid = "CODE_DEPT",
           var = "CIF_moy_dep",
           # Si on souhaite faire les groupes manuellement :
           # breaks = c(0,0.27,5,10, 37), # liste des seuils (hypothèses)
           # col = carto.pal(pal1 = "turquoise.pal", n1 = 4),
           # Si on souhaite avoir des groupes par quantiles :
           col = carto.pal(pal1 = "blue.pal", n1 = 4), method = "quantile",
           nclass = 4,
           legend.values.rnd = 2,
           legend.pos = "topleft", 
           legend.title.txt = "CIF 2012 moyen\npar département",
           legend.title.cex = 0.8, legend.values.cex = 0.8)
layoutLayer(#title = "Le poids de la DGF dans les budgets communaux",
  #coltitle = "black", 
  sources = "Source : INSEE, DGCL, 2012, 2024.", scale = NULL,
  author = "Auteur : G. Bideau.", frame ="", col = NA)

datafus2011 <- subset(df2011, COM_NOUV == "OUI")

# Calcul nombre de fusions par départements
tmp <- aggregate(list(NUMBER_FUS = datafus2011[,"CODE_DEPT"]),
                 by = list(DEPT = datafus2011$CODE_DEPT),
                 FUN = length)
dep <- merge (dep, tmp, by.x = "CODE_DEPT", by.y = "DEPT", all.x = TRUE)




propSymbolsLayer(x = dep,
                 var = "NUMBER_FUS", symbols ="circle",
                 col =  "red",
                 legend.pos = "left",
                 legend.title.txt = "\n\n\nNombre de communes\nfusionnantes",
                 legend.style = "e",
                 inches = 0.1,
                 legend.title.cex = 0.8, legend.values.cex = 0.8,
                 add = TRUE)

Par CATAEU

df2011_CIF$COM_NOUV_CATAEU <- paste0(df2011_CIF$CATAEU, "_", df2011_CIF$COM_NOUV)

tapply(df2011_CIF$CIF_2012, INDEX = df2011_CIF$COM_NOUV_CATAEU, median, na.rm = TRUE)
##   111_NON   111_OUI   112_NON   112_OUI   120_NON   120_OUI   211_NON   211_OUI 
## 0.3384560 0.3620360 0.3356640 0.3737370 0.3535520 0.3973730 0.3237825 0.4004340 
##   212_NON   212_OUI   221_NON   221_OUI   222_NON   222_OUI   300_NON   300_OUI 
## 0.3686970 0.3709110 0.3256895 0.3667820 0.3248970 0.3581060 0.3462850 0.3832240 
##   400_NON   400_OUI 
## 0.3627260 0.4227230
tapply(df2011_CIF$CIF_2015, INDEX = df2011_CIF$COM_NOUV_CATAEU, median, na.rm = TRUE)
##   111_NON   111_OUI   112_NON   112_OUI   120_NON   120_OUI   211_NON   211_OUI 
## 0.3475430 0.3707430 0.3505810 0.3956690 0.3727790 0.4166200 0.3378250 0.4731470 
##   212_NON   212_OUI   221_NON   221_OUI   222_NON   222_OUI   300_NON   300_OUI 
## 0.3741900 0.4499505 0.3453765 0.3865780 0.3313610 0.3865780 0.3544080 0.4118080 
##   400_NON   400_OUI 
## 0.3687580 0.4178770
# ANOVA
aovCIF_2012 <- aov(CIF_2012 ~ COM_NOUV_CATAEU, data = df2011_CIF)
summary(aovCIF_2012)
##                    Df Sum Sq Mean Sq F value Pr(>F)    
## COM_NOUV_CATAEU    17   15.1  0.8873   56.14 <2e-16 ***
## Residuals       34263  541.5  0.0158                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 1927 observations effacées parce que manquantes
aovCIF_2015 <- aov(CIF_2015 ~ COM_NOUV_CATAEU, data = df2011_CIF)
summary(aovCIF_2015)
##                    Df Sum Sq Mean Sq F value Pr(>F)    
## COM_NOUV_CATAEU    17   11.7  0.6911    49.9 <2e-16 ***
## Residuals       25389  351.6  0.0139                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 10801 observations effacées parce que manquantes
# En prenant seulement les seize premiers départements
df2011_CIF_subset <- subset(df2011_CIF, df2011_CIF$CODE_DEPT == "49"| df2011_CIF$CODE_DEPT == "14" | df2011_CIF$CODE_DEPT ==  "50" | df2011_CIF$CODE_DEPT ==  "61" | df2011_CIF$CODE_DEPT ==  "27" | df2011_CIF$CODE_DEPT ==  "24" | df2011_CIF$CODE_DEPT ==  "39" | df2011_CIF$CODE_DEPT ==  "79" | df2011_CIF$CODE_DEPT ==  "16" | df2011_CIF$CODE_DEPT ==  "28" | df2011_CIF$CODE_DEPT ==  "48" | df2011_CIF$CODE_DEPT ==  "73" | df2011_CIF$CODE_DEPT ==  "76" | df2011_CIF$CODE_DEPT ==  "01" | df2011_CIF$CODE_DEPT ==  "85" | df2011_CIF$CODE_DEPT ==  "89")

df2011_CIF_subset$COM_NOUV_CATAEU <- as.factor(df2011_CIF_subset$COM_NOUV_CATAEU)

nom_groupe <- levels(df2011_CIF_subset$COM_NOUV_CATAEU)
nbr_com_groupe <- table(df2011_CIF_subset$COM_NOUV_CATAEU)
nom_groupe <- paste0(nom_groupe, " (", nbr_com_groupe, ")")

# table(df2011_CIF_subset$CODE_DEPT)

ggplot(df2011_CIF_subset, aes(x=COM_NOUV_CATAEU, y=CIF_2012, color = COM_NOUV))  + geom_boxplot() + scale_x_discrete(labels = nom_groupe) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_color_manual (values=couleurs, labels = c("Communes non fusionnantes", "Communes fusionnantes"))
## Warning: Removed 277 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

ggplot(df2011_CIF_subset, aes(x=COM_NOUV_CATAEU, y=CIF_2015, color = COM_NOUV))  + geom_boxplot()  + geom_boxplot() + scale_x_discrete(labels = nom_groupe) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + scale_color_manual (values=couleurs, labels = c("Communes non fusionnantes", "Communes fusionnantes"))
## Warning: Removed 2227 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
## Warning: Removed 2227 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

Analyse par catégorie d’aires urbaines qui va dans le même sens : Les communes qui fusionnent ont un CIF plus élevé, quelle que soit la catégorie prise en compte.

Cartographie CIF et CN

geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE) 

pr_carto_CIF <- merge(geom2011, df2011_CIF, by = "CODGEO")
colnames(pr_carto_CIF)
##  [1] "CODGEO"          "LIBGEO"          "COM_NOUV"        "EPCI"           
##  [5] "CODE_DEPT"       "CATAEU2010"      "CIF_2012"        "CIF_2015"       
##  [9] "CIF_2012_quali"  "CIF_2015_quali"  "COM_NOUV_DEPT"   "COM_NOUV_CATAEU"
## [13] "geom"
choroLayer(x = pr_carto_CIF , var = "CIF_2012",
           method = "quantile", nclass = 5,
#           col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 5, n2 = 0),
           col = carto.pal(pal1 = "blue.pal", n1 = 5),
           border = NA,
           legend.pos = "topleft", legend.values.rnd = 2,
           legend.title.txt = "Nombre d'habitants (2009,\nregroupement par quartiles)")
plot(st_geometry(dep), add = TRUE, lwd = 0.3)


layoutLayer(title = " ",# "Communes fusionnantes (2011-2024)\nen fonction de leur nombre d'habitants",
            author = "G. Bideau, 2024",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2024")

11 - GRILLE DE DENSITÉ

NB : Reprise d’éléments du script sur le ZAU

11.0 Préparation des données

load("data/refdata.Rdata")

# Téléchargement des données ici : https://www.insee.fr/fr/statistiques/fichier/6439600/grille_densite_7_niveaux_2015-2020.zip
# Puis extraction des données pour obtenir le fichier "grille_densite_7_niveaux_2015.xlsx"
grille_densite_2015 <- as.data.frame(read_excel("data-raw/stats_insee/grille_densite_7_niveaux_2015.xlsx", sheet = "Grille_Densite", skip = 4))
# NB : P1, P2, etc. désignent la part de la population dans le niveau 1, 2, etc.

grille_densite_2015 <- grille_densite_2015[,-2]
colnames(grille_densite_2015)
##  [1] "CODGEO"  "DENS"    "LIBDENS" "PMUN13"  "P1"      "P2"      "P3"     
##  [8] "P4"      "P5"      "P6"      "P7"
grille_densite_2015$LIBDENS <- as.factor (grille_densite_2015$LIBDENS)
levels(grille_densite_2015$LIBDENS)
## [1] "Bourgs ruraux"                  "Ceintures urbaines"            
## [3] "Centres urbains intermédiaires" "Grands centres urbains"        
## [5] "Petites villes"                 "Rural à habitat dispersé"      
## [7] "Rural à habitat très dispersé"
grille_densite_2015$LIBDENS <- relevel(grille_densite_2015$LIBDENS, "Grands centres urbains", "Centres urbains intermédiaires", "Ceintures urbaines", "Petites villes", "Bourgs ruraux", "Rural à habitat dispersé", "Rural à habitat très dispersé")

grille_densite_2015[1:10,]
##    CODGEO DENS                        LIBDENS PMUN13 P1    P2 P3    P4    P5
## 1   01001    6       Rural à habitat dispersé    767  0  0.00  0  0.00  0.00
## 2   01002    6       Rural à habitat dispersé    236  0  0.00  0  0.00  0.00
## 3   01004    2 Centres urbains intermédiaires  14359  0 70.85  0 24.85  0.00
## 4   01005    5                  Bourgs ruraux   1635  0  0.00  0  0.00 83.08
## 5   01006    6       Rural à habitat dispersé    108  0  0.00  0  0.00  0.00
## 6   01007    6       Rural à habitat dispersé   2503  0  0.00  0  0.00 45.11
## 7   01008    4             Ceintures urbaines    744  0  0.00  0 81.29  0.00
## 8   01009    6       Rural à habitat dispersé    337  0  0.00  0  0.00  0.00
## 9   01010    5                  Bourgs ruraux   1108  0  0.00  0  0.00 49.07
## 10  01011    6       Rural à habitat dispersé    394  0  0.00  0  0.00  0.00
##        P6    P7
## 1   78.60 21.40
## 2   88.08 11.92
## 3    3.54  0.75
## 4    9.42  7.50
## 5  100.00  0.00
## 6   49.01  5.88
## 7   18.71  0.00
## 8   61.14 38.86
## 9   46.76  4.17
## 10  83.49 16.51
df2011 <- merge(df2011, grille_densite_2015, by = "CODGEO", all.x = TRUE)
# Nombre de communes pour lesquelles on ne dispose pas du ZAU
table(is.na(df2011$LIBDENS))
## 
## FALSE  TRUE 
## 36163    45
# État des communes
table(df2011$LIBDENS)
## 
##         Grands centres urbains                  Bourgs ruraux 
##                            776                           5271 
##             Ceintures urbaines Centres urbains intermédiaires 
##                           1966                            528 
##                 Petites villes       Rural à habitat dispersé 
##                            907                          19097 
##  Rural à habitat très dispersé 
##                           7618
# Pour regarder les communes qui seraient dans la grille de densité et pas dans df2011 : principalement la Corse et l'outre-mer.
# test <- merge(df2011, grille_densite_2015, by = "CODGEO", all.x = TRUE, all.y = TRUE)
# test2 <- subset(df2011, is.na(df2011$LIBGEO.x))


datafus2011 <- subset(df2011, COM_NOUV == "OUI") # Désigne les données concernant les communes ayant participé à la création d'une commune nouvelle, appelées ici communes fusionnantes
dataNfus2011 <- subset(df2011, COM_NOUV == "NON") # Les communes, à la géométrie 2011, qui n'ont pas participé à la création d'une commune nouvelle
datafus2011 <- datafus2011[, c("CODGEO", "CODGEO_new", "LIBGEO", "CODGEO", "ChefLieu", "CATAEU2010", "FusPhas", "LIBDENS")]
dataNfus2011 <- dataNfus2011 [, c("CODGEO", "CODGEO_new", "LIBGEO", "CODGEO", "CATAEU2010", "LIBDENS")]

couleurs <- c("#2b83ba", "red4")

11.1 Les communes nouvelles en fonction de la grille de densité

À partir des données INSEE précisant la catégorie suivant la grille de densité établie par l’INSEE (LIBDENS), nous pouvons observer le profil des communes fusionnantes en le comparant à celui des communes inchangées.

grille_densite_non <- data.frame(dataNfus2011$LIBDENS)
grille_densite_oui <- data.frame(datafus2011$LIBDENS)

grille_densite_non$Fusion <- "Communes inchangées"
grille_densite_oui$Fusion <- "Communes fusionnantes"

colnames(grille_densite_non)[1] <- "LIBDENS"
colnames(grille_densite_oui)[1] <- "LIBDENS"

grille_densite <- rbind(grille_densite_non, grille_densite_oui)

grille_densite_nb <- table(grille_densite$Fusion, grille_densite$LIBDENS)

prop <- prop.table(grille_densite_nb, 1) * 100

couleurs_ici <- rev(couleurs)
par(mar=c(13,4,4,4))
barplot(prop,
        xlab = " ",
        ylab = "Part du total des communes (%)",
        main = "Répartition des communes\nen fonction de la grille de densité de l'INSEE",
        las = 2,
        # horiz = T,
        border = NA,
        col=couleurs_ici, # "#ff87a9","#f7d358"
        beside = TRUE)

legend(x="topright", legend = rownames(prop) , cex=0.8,
       fill=couleurs_ici,bty="n")

prbarplot <- melt(prop)
prbarplot$Var1 <- factor(prbarplot$Var1, levels = rev(levels(prbarplot$Var1)))
# prbarplot$Var2 <- as.character(prbarplot$Var2)
prbarplot$Var2 <- factor(prbarplot$Var2, levels = c("Grands centres urbains", "Centres urbains intermédiaires", "Ceintures urbaines", "Petites villes", "Bourgs ruraux", "Rural à habitat dispersé", "Rural à habitat très dispersé"))

ggplot(data = prbarplot, aes(x = Var2, y = value, fill = Var1)) +
  geom_bar(stat = "identity", position=position_dodge()) +
  theme(axis.text.x = element_text(angle = 45, hjust=1), legend.position = c(0.3, 0.85)) +
  scale_x_discrete("Catégorie de la grille de densité de l'INSEE",
                   labels = c("Grands\ncentres urbains", "Centres urbains\nintermédiaires", "Ceintures urbaines", "Petites villes", "Bourgs ruraux", "Rural à l'habitat\ndispersé", "Rural à l'habitat\ntrès dispersé")) + 
  scale_y_continuous("Part du groupe de communes (%)") +
  scale_fill_manual(values = couleurs) + labs(fill = NULL)
## Warning: A numeric `legend.position` argument in `theme()` was deprecated in ggplot2
## 3.5.0.
## ℹ Please use the `legend.position.inside` argument of `theme()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# Chi2
tab.chi2 <- chisq.test(grille_densite_nb)
tab.chi2 
## 
##  Pearson's Chi-squared test
## 
## data:  grille_densite_nb
## X-squared = 139.45, df = 6, p-value < 2.2e-16
tab.chi2$observed
##                        
##                         Grands centres urbains Bourgs ruraux Ceintures urbaines
##   Communes fusionnantes                     19           462                 52
##   Communes inchangées                      757          4809               1914
##                        
##                         Centres urbains intermédiaires Petites villes
##   Communes fusionnantes                             16             63
##   Communes inchangées                              512            844
##                        
##                         Rural à habitat dispersé Rural à habitat très dispersé
##   Communes fusionnantes                     1364                           650
##   Communes inchangées                      17733                          6968
tab.chi2$expected
##                        
##                         Grands centres urbains Bourgs ruraux Ceintures urbaines
##   Communes fusionnantes               56.34975      382.7571           142.7624
##   Communes inchangées                719.65025     4888.2429          1823.2376
##                        
##                         Centres urbains intermédiaires Petites villes
##   Communes fusionnantes                       38.34107        65.8624
##   Communes inchangées                        489.65893       841.1376
##                        
##                         Rural à habitat dispersé Rural à habitat très dispersé
##   Communes fusionnantes                 1386.741                      553.1861
##   Communes inchangées                  17710.259                     7064.8139
tab.chi2$residuals
##                        
##                         Grands centres urbains Bourgs ruraux Ceintures urbaines
##   Communes fusionnantes             -4.9755569     4.0504061         -7.5962455
##   Communes inchangées                1.3922812    -1.1334016          2.1256132
##                        
##                         Centres urbains intermédiaires Petites villes
##   Communes fusionnantes                     -3.6080439     -0.3527050
##   Communes inchangées                        1.0096180      0.0986954
##                        
##                         Rural à habitat dispersé Rural à habitat très dispersé
##   Communes fusionnantes               -0.6106828                     4.1162544
##   Communes inchangées                  0.1708838                    -1.1518276
mosaicplot(grille_densite_nb, shade = TRUE,  cex=0.6, main = NULL, xlab = "Communes fusionnantes",
           ylab = "Communes inchangées")

# Proportion sur l'ensemble des communes françaises
Ensemble <- apply(grille_densite_nb, 2, sum)
grille_densite_nb <- rbind(grille_densite_nb, Ensemble)

grille_densite_prop <- t(prop.table(grille_densite_nb, 1) * 100)
Total <- apply(grille_densite_prop, 2, sum)
grille_densite_prop <- rbind (grille_densite_prop, Total)

kable(grille_densite_prop, row.names = T, digits = 2, caption = "Communes fusionnantes en fonction de la grille de densité")
Communes fusionnantes en fonction de la grille de densité
Communes fusionnantes Communes inchangées Ensemble
Grands centres urbains 0.72 2.26 2.15
Bourgs ruraux 17.59 14.34 14.58
Ceintures urbaines 1.98 5.71 5.44
Centres urbains intermédiaires 0.61 1.53 1.46
Petites villes 2.40 2.52 2.51
Rural à habitat dispersé 51.94 52.88 52.81
Rural à habitat très dispersé 24.75 20.78 21.07
Total 100.00 100.00 100.00

Ces éléments permettent de se rendre compte que les profils des communes fusionnantes et des communes inchangées sont relativement proches. Les écarts les plus importants se situent sur les catégories telles que les grands centres urbains ou les bourgs ruraux.

# Idée : faire la même chose avec variable "FusPhas" > est-ce que ces fusions ont significativement touché
# des communes rurales au début, à la fin... 
# A priori pas très concluant

test <- table(datafus2011$FusPhas, datafus2011$LIBDENS)
test
prop <- prop.table(test, 1) * 100

barplot(prop, main= NULL,
        xlab = "Catégories d'aire urbaine",
        ylab = "Part du total des communes d'une phase (%)",
        las = 2,
        border = NA,
        col= rainbow(nrow(prop)),
        beside = TRUE)

legend(x="topright", legend = rownames(prop) , cex=0.8, fill= rainbow(nrow(prop)),bty="n")     


# Chi2
tab.chi2 <- chisq.test(test)
tab.chi2 

tab.chi2$observed
tab.chi2$expected
tab.chi2$residuals

mosaicplot(test, shade = TRUE,  cex=0.6, main = NULL, xlab = "Phase de fusion",
           ylab = "Catégorie d'aire urbaine")

11.2. Chaque commune nouvelle est-elle composée d’un seul type de communes du point de vue de la grille de densité ?

# Définition d'un tableau comportant le nombre de communes fusionnantes par commune nouvelle
count_CN <- plyr::count(datafus2011, "CODGEO_new")

mesCommunes <- count_CN$CODGEO_new
#mesCommunes <- c("61324","73150","73006")

df <- datafus2011
i <- mesCommunes[356]
results <- data.frame()
for (i in mesCommunes) { # Pour chaque identifiant de commune nouvelle, 
  toto <- subset (df, CODGEO_new == i ) # Ne garder que les communes fusionnantes y ayant participé
  a <- table(toto$LIBDENS) # Relever les grille_densite des communes fusionnantes
  results <- rbind(results,a) # Combiner les résultats, par lignes
 # rm(a) # Supprimer "a"
}
x <- c("Grands centres urbains", "Centres urbains intermédiaires", "Ceintures urbaines", "Petites villes", "Bourgs ruraux", "Rural à habitat dispersé", "Rural à habitat très dispersé") # On renomme les colonnes
colnames(results) <- x
count_CN <- cbind(count_CN, results)

# On identifie la variable la plus fréquente
count_CN$max <- apply(count_CN[, 3:9], 1, function(x) max(x, na.rm = TRUE))
# Quel est le code grille_densite revenant le plus fréquemment dans une CN
count_CN$grille_densitemaj2 <- colnames(count_CN[, 3:9])[apply(count_CN[, 3:9], 1, which.max)]
# On note si une CN a des communes fusionnantes avec une catégorie identique
count_CN$grille_densite_ident <- ifelse(count_CN$max == count_CN$freq, TRUE, FALSE)
summary(count_CN$grille_densite_ident)
##    Mode   FALSE    TRUE 
## logical     496     348
rm(results)
# On extrait les CN ayant des communes fusionnante avec une catégorie identique
CNIdent <- subset(count_CN, grille_densite_ident==TRUE)
CNIdent <- merge(CNIdent, datafus2011[, c("CODGEO", "LIBDENS")], by.x = "CODGEO_new", by.y = "CODGEO", all.x = TRUE)

tabcont<-summary(CNIdent$LIBDENS)
round(100*prop.table(tabcont,margin=),1) # Pourcentages de chaque catégorie chez les communes nouvelles
##         Grands centres urbains                  Bourgs ruraux 
##                            1.4                           13.8 
##             Ceintures urbaines Centres urbains intermédiaires 
##                            2.3                            0.6 
##                 Petites villes       Rural à habitat dispersé 
##                            2.9                           59.8 
##  Rural à habitat très dispersé                           NA's 
##                           18.7                            0.6
tabcont2<- summary(datafus2011$LIBDENS)
round(100*prop.table(tabcont2,margin=),1) # Pourcentages de chaque catégorie chez les communes françaises
##         Grands centres urbains                  Bourgs ruraux 
##                            0.7                           17.3 
##             Ceintures urbaines Centres urbains intermédiaires 
##                            1.9                            0.6 
##                 Petites villes       Rural à habitat dispersé 
##                            2.4                           51.1 
##  Rural à habitat très dispersé                           NA's 
##                           24.3                            1.7
# On peut donc en conclure qu'une minorité des communes nouvelles sont, du point de vue de la grille de densité, composées de communes au profil homogène.

12 - SITUATION PAR RAPPORT AUX LIMITES DÉPARTEMENTALES

Une impression (intuition) en regardant les cartes des communes nouvelle serait que celles-ci sont plus fréquemment en bordures des départements. Est-ce le cas ? Si oui, peut-être contrôler avec d’autres variables ?

NB : Code réalisé en grande partie par Ronan Ysebaert en mai 2025 (légères adaptations par G. Bideau).

Principe : calculer la distance du centroïde de chacune des communes au point des contours départementaux les plus proches. Le calcul prend un peu de temps car c’est une opération assez coûteuse : cela implique de prendre la valeur minimale de l’ensemble des distances de chaque centroïde à l’ensemble des points constituant les contours départementaux.

Dans l’idéal, il pourrait être intéressant de regarder plutôt les communes qui constituent des limites départementales mais je ne vois pas bien comment faire. Cependant, l’analyse ci-dessous montre que les communes fusionnantes n’ont pas l’air plus proches des limites départementales que les communes inchangées. On en reste donc là concernant l’analyse de ce point pour l’instant.

library(sf)
library(rmapshaper)



# On importe les géométries
geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE) 
# On identifie les communes fusionnantes
load("data/refdata.Rdata")
geom2011 <- merge (geom2011, df2011 [, c("CODGEO", "COM_NOUV", "CODE_DEPT")], by = "CODGEO")
# On importe les géométries des départements
dep <- st_read("data/geom.gpkg", layer = "dep", quiet = TRUE)


# Simplifier les contours pour rendre le calcul plus rapide
com <- ms_simplify(geom2011, keep = 0.1)
# NB : Je ne sais pas pourquoi cela fait moins de communes qu'avant la simplification des contours
# plot(geom2011)
# plot(com)


# Centroide des communes
cent <- st_centroid(com)


# Calcul des distances
dist <- data.frame(INSEE_COM = as.character(),
                    dist = as.numeric())

i<-"2"
# Pour toutes les communes calculer la distance à un point composant les limites départementales la plus proche
for (i in 1:nrow(cent)){
  ex <- cent[i,]
  ex_c <- dep[dep$CODE_DEPT == ex$CODE_DEPT,] 
  
  # create sf object of border points
  border_points <- ex_c %>%
    st_cast("POINT")
  
  # compute distances
  distances <- border_points |>
    st_distance(st_centroid(ex))
  
  # Keep nearest
  dist[i, 1] <- ex$CODGEO
  dist[i, 2] <- min(distances)
}

# Joindre à la couche le résultat
com <- merge(com, dist, by.x = "CODGEO", by.y = "INSEE_COM")

# En km
com$dist <- com$dist / 1000

# Export
st_write(com, "data/com_dist_departements.gpkg")
com <- st_read("data/com_dist_departements.gpkg")
## Reading layer `com_dist_departements' from data source 
##   `/data/user/b/gbideau/Projet_CN_Serveur/data/com_dist_departements.gpkg' 
##   using driver `GPKG'
## Simple feature collection with 36064 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 3211988 ymin: 2166845 xmax: 4189396 ymax: 3135290
## Projected CRS: ETRS89-extended / LAEA Europe
# Toutes communes
boxplot(com$dist ~ com$COM_NOUV)

# Que Hexagone (si présence de communes autres)
# met <- com[!com$CODE_DEPT %in% c("971", "972", "973", "974", "976"),]
# boxplot(met$dist ~ met$COM_NOUV)

# Test statistique (à approfondir)
# https://perso.ens-lyon.fr/lise.vaudor/grimoireStat/_book/modeliser-le-lien-entre-deux-variables.html#lanova-lien-entre-une-variable-categorielle-et-une-variable-quantitative
mylm_abs <- lm(dist~COM_NOUV+0, data=com)
summary(mylm_abs)
## 
## Call:
## lm(formula = dist ~ COM_NOUV + 0, data = com)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -9.783 -6.406 -1.594  4.883 32.661 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## COM_NOUVNON  9.82278    0.04061  241.89   <2e-16 ***
## COM_NOUVOUI  9.90856    0.14399   68.81   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.422 on 36062 degrees of freedom
## Multiple R-squared:  0.6369, Adjusted R-squared:  0.6368 
## F-statistic: 3.162e+04 on 2 and 36062 DF,  p-value: < 2.2e-16

99 - ANNEXES

99.1 Le Zonage en Aires Urbaines (ZAU)

Source : INSEE

Catégorie de la commune dans le zonage en aires urbaines 2010 Ce code indique la catégorie de la commune au sein du découpage en aires urbaines.

Modalités :

111 : Commune appartenant à un grand pôle (10 000 emplois ou plus)

112 : Commune appartenant à la couronne d’un grand pôle

120 : Commune multipolarisée des grandes aires urbaines

211 : Commune appartenant à un moyen pôle (5 000 à moins de 10 000 emplois)

212 : Commune appartenant à la couronne d’un moyen pôle

221 : Commune appartenant à un petit pôle (de 1 500 à moins de 5 000 emplois)

222 : Commune appartenant à la couronne d’un petit pôle

300 : Autre commune multipolarisée

400 : Commune isolée hors influence des pôles

L’espace des grandes aires urbaines est composé des communes dont la modalité vaut 111, 112, ou 120.

L’espace des autres aires urbaines et composé des communes dont la modalité vaut 211, 212, 221 ou 222.

Par ailleurs, l’espace péri-urbain est composé des communes dont la modalité vaut 112 ou 120.

99.2 Le Zonage en Aires d’Attraction des Villes (ZAAV)

Source : https://www.insee.fr/fr/metadonnees/definitions

Modalités de CATEAAV2020 (Catégorie de la commune dans le zonage en aire d’attraction des villes 2020) :

11 - Commune-centre

12 - Autre commune du pôle principal

13 - Commune d’un pôle secondaire

20 - Commune de la couronne

30 - Commune hors attraction des villes

99.3 Les codes des régions (avant 2016)

01 Guadeloupe 02 Martinique 03 Guyane 04 La Réunion 06 Mayotte 11 Île-de-France 21 Champagne-Ardenne 22 Picardie 23 Haute-Normandie 24 Centre 25 Basse-Normandie 26 Bourgogne 31 Nord-Pas-de-Calais 41 Lorraine 42 Alsace 43 Franche-Comté 52 Pays de la Loire 53 Bretagne 54 Poitou-Charentes 72 Aquitaine 73 Midi-Pyrénées 74 Limousin 82 Rhône-Alpes 83 Auvergne 91 Languedoc-Roussillon 93 Provence-Alpes-Côte d’Azur 94 Corse

99.4 Les codes des régions (à partir de 2016)

1 Guadeloupe 2 Martinique 3 Guyane 4 La Réunion 6 Mayotte 11 Île-de-France 24 Centre-Val de Loire 27 Bourgogne-Franche-Comté 28 Normandie 32 Hauts-de-France 44 Grand Est 52 Pays de la Loire 53 Bretagne 75 Nouvelle-Aquitaine 76 Occitanie 84 Auvergne-Rhône-Alpes 93 Provence-Alpes-Côte d’Azur 94 Corse

999 - BROUILLON

999.1 Cartographies par départements

999.1.1 Import données

999.1.2 Création nouvelles variables

# Nombre de fusions par département
FusionsDep<-data.frame(table(dataCN_new$CODE_DEPT_new)) # II/2024 : CODE_DEPT_new utilisé plutôt que CODE_DEPT, supprimer ce commentaire quand vérifié que cela ne pose pas de problème
colnames(FusionsDep)<-c("CODE_DEPT", "NbrFusions")
depart <- data.frame(table(df2011$CODE_DEPT))
colnames(depart)<-c("CODE_DEPT", "NbrCom2011")
FusionsDep<-merge(FusionsDep, depart, by = "CODE_DEPT", all.y = TRUE) # Fusion avec une table comprenant tous les départements
FusionsDep$NbrFusions[is.na(FusionsDep$NbrFusions)] <- 0


# Graphique pour le nombre de communes par départements
barplot(sort(FusionsDep$NbrFusions, decreasing = TRUE),
        main = "Répartition des départements selon le nombre\nde communes nouvelles - 2012-2018(01)",
        xlab = "Départements",
        ylab = "Nombre de communes nouvelles",
        ylim = c(0, 50),
        cex.axis = 2, cex.main = 2.5, cex.lab = 2, # taille des étiquettes des axes, titre et label
        las = 2 # orientation des étiquettes des axes perpendiculaire à l'axe
)

# Pour classer un dataframe (inutile ici)
# FusionsDepOrd <- FusionsDep[order(FusionsDep$NbrFusions,decreasing=T), ]
# plot(FusionsDepOrd$Département, FusionsDepOrd$NbrFusions,
#      type = "h",
#      xlab = "Nombre de communes se regroupant",
#      ylab = "Nombre de fusions de ce type", 
#      las = 2,
#      #width = 2,
#      cex.axis = 1)
# ggplot(FusionsDepOrd, aes(x = NbrFusions)) + geom_histogram()
# ggplot(FusionsDepOrd, aes(x = NbrFusions, y = Département)) + geom_point() +
#   theme(axis.text.x = element_text(angle = 90))


boxplot(FusionsDep$NbrFusions,
        main = "Une très inégale répartition des communes nouvelles\nselon les départements - 2012-2026(01)",
        ylab = "Nombre de communes nouvelles par département",
        cex.main=2.1, cex.lab=1.9, cex.axis = 1.7, width = 2)

# Nombre de départements sans communes nouvelles :
table(FusionsDep$NbrFusions)
## 
##  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 21 22 24 25 29 31 37 
## 10  3 10  8  7  5  5  6 10  4  1  3  1  1  2  1  1  4  1  1  1  2  1  1  1  1 
## 38 45 50 
##  1  1  1
# Nombre de communes fusionnées par département ?
NbrComFusDep <- data.frame(table(datafus2011$CODE_DEPT))
colnames(NbrComFusDep)<-c("CODE_DEPT", "NbrComFus")

FusionsDep <- merge(FusionsDep, NbrComFusDep, by = "CODE_DEPT", all = TRUE)


# Calcul nombre de communes dans chaque département en 2011 (Av) et en 2021 (Ap)
temp<-data.frame(table(df_new$CODE_DEPT))
colnames(temp)<-c("CODE_DEPT", "NbrComAp")
FusionsDep<-merge(FusionsDep, temp, by = "CODE_DEPT") # Fusion avec la table complète sur les départements

temp<-data.frame(table(df2011$CODE_DEPT))
colnames(temp)<-c("CODE_DEPT", "NbrComAv")
FusionsDep<-merge(FusionsDep, temp, by = "CODE_DEPT") # Fusion avec la table complète sur les départements



# Création de statistiques, ici nombre de communes par rapport à des seuils choisis

listeSeuils <- c(50, 100, 200, 500, 1000)

results <- FusionsDep[, c("CODE_DEPT", "NbrComAv", "NbrComAp")]

for (i in listeSeuils) {
temp <- subset(df2011, df2011$P09_POP < i)
temp<-data.frame(table(temp$CODE_DEPT))
colnames(temp)<-c("CODE_DEPT", paste0("ComMoins", i, "habAv"))

temp2 <- subset(df_new, df_new$P09_POP < i)
temp2<-data.frame(table(temp2$CODE_DEPT))
colnames(temp2)<-c("CODE_DEPT", paste0("ComMoins", i, "habAp"))

results <- merge(results, temp, by = "CODE_DEPT", all.x = TRUE)
results <- merge(results, temp2, by = "CODE_DEPT", all.x = TRUE)

results[, paste0("PartComMoins", i, "habAv")] = round((results[, paste0("ComMoins", i, "habAv")] /
                                                        results$NbrComAv *100), 1)
results[, paste0("PartComMoins", i, "habAp")] = round((results[, paste0("ComMoins", i, "habAp")] /
                                                        results$NbrComAp *100), 1)

results[, paste0("EvolNbrComMoins", i, "hab")] = results[, paste0("ComMoins", i, "habAp")] -
  results[, paste0("ComMoins", i, "habAv")] # Calcul de l'évolution en valeur absolue

results[, paste0("EvolComMoins", i, "hab")] =
  round((
  (results[, paste0("ComMoins", i, "habAp")] - results[, paste0("ComMoins", i, "habAv")]) /
    results[, paste0("ComMoins", i, "habAv")] *100), 1) # Calcul du pourcentage d'évolutions du nombre de communes sous le seuil i

results[, paste0("EvolPartComMoins", i, "hab")] =
  round((
  (results[, paste0("PartComMoins", i, "habAp")] - results[, paste0("PartComMoins", i, "habAv")]) / results[, paste0("PartComMoins", i, "habAv")]*100), 1) # calcul de l'évolution de la part des communes sous le seuil i

# Pour calculer le nombre de communes sous le seuil i ayant fusionné
temp3 <- subset(df2011, df2011$P09_POP < i & FUSION == "OUI")
temp3 <- data.frame(table(temp3$CODE_DEPT))
colnames(temp3)<-c("CODE_DEPT", paste0("ComFusMoins", i, "hab"))
results <- merge(results, temp3, by = "CODE_DEPT", all.x = TRUE)

rm(temp, temp2, temp3)
}


FusionsDep <- merge(FusionsDep, results[, c(1, 4:length(results))], by = "CODE_DEPT", all.x = TRUE)
FusionsDep[is.na(FusionsDep)] <- 0 


# Pourcentage de communes de supprimées
100*(sum(FusionsDep$NbrComAv) - sum(FusionsDep$NbrComAp))/sum(FusionsDep$NbrComAv)
## [1] 5.062417
# Pourcentage de communes de moins de 1000 habitants supprimées
100*(sum(FusionsDep$ComMoins1000habAv)-sum(FusionsDep$ComMoins1000habAp))/sum(FusionsDep$ComMoins1000habAv)
## [1] 6.711209
# Nombre de communes fusionnées par rapport au nombre total de communes
# On crée le nouveau vecteur
FusionsDep$RatioComFus = round(FusionsDep$NbrComFus / FusionsDep$NbrComAv * 100, 2)

par(mfrow= c(1,2)) # Pour séparer l'écran des graphiques
barplot(sort(FusionsDep$NbrComFus, decreasing = TRUE),
        # xlab = "Départements",
        ylab = "Nombre de communes fusionnantes",
        name = "Nombre de communes fusionnantes par département")

barplot(sort(FusionsDep$RatioComFus, decreasing = TRUE),
        # xlab = "Départements",
        ylab = "Pourcentage de communes ayant fusionné",
        name = "Pourcentage de communes ayant fusionné par département")

par(mfrow= c(1,1))

# On calcul la population par département
FusionsDep$P09_POP <- tapply (df2011$P09_POP, df2011$CODE_DEPT, sum)
# Nombre de communes pour 10 000 habitants
FusionsDep$NbrComPr10000Hab <- round(10000 * FusionsDep$NbrComAv / FusionsDep$P09_POP, 1)

# Si on souhaite exporter
write.table(FusionsDep, "sorties/FusionsDep.csv", sep="\t", dec = ",", row.names=FALSE) 

# Pour données du mémoire :
sum(FusionsDep$ComMoins1000habAv) # Nombre de communes de moins de 1000 habitants avant les fusions
## [1] 26791
sum(FusionsDep$ComMoins1000habAp) # Nombre de communes de moins de 1000 habitants après les fusions
## [1] 24993
sum(FusionsDep$EvolNbrComMoins1000hab) # Nombre de communes de moins de 1000 habitants supprimées
## [1] -1798
sum(FusionsDep$ComMoins50habAv) # Nombre de communes de moins de 50 habitants avant les fusions
## [1] 862
sum(FusionsDep$ComMoins50habAp) # Nombre de communes de moins de 50 habitants après les fusions
## [1] 806
sum(FusionsDep$EvolNbrComMoins50hab) # Nombre de communes de moins de 50 habitants supprimées
## [1] -53
sum(FusionsDep$ComFusMoins50hab) # Nombre de communes fusionnantes de moins de 50 hab
## [1] 57
sum(FusionsDep$ComFusMoins1000hab) # Nombre de communes fusionnantes de moins de 1000 hab
## [1] 2065
#Proportion de communes fusionnantes ayant moins de 50/1000 hab
100 * round(sum(FusionsDep$ComFusMoins50hab)/sum(FusionsDep$NbrComFus), 3)
## [1] 2.1
100 * round(sum(FusionsDep$ComFusMoins1000hab)/sum(FusionsDep$NbrComFus), 3)
## [1] 77.3
# Taux d'évolution du nombre de communes de moins de 1000 hab
100 * round((sum(FusionsDep$ComMoins1000habAp) - sum(FusionsDep$ComMoins1000habAv))
            / sum(FusionsDep$ComMoins1000habAv), 3)
## [1] -6.7
#  Taux d'évolution du nombre de communes de moins de 50 hab
100 * round((sum(FusionsDep$ComMoins50habAp) - sum(FusionsDep$ComMoins50habAv))
            / sum(FusionsDep$ComMoins50habAv), 3)
## [1] -6.5
# Proportion de communes françaises ayant moins de 50 habitants
100 * round(sum(FusionsDep$ComMoins50habAv) / nrow(df2011), 3)
## [1] 2.4
# Proportion de communes fusionnantes ayant moins de 50 habitants
100 * round(FusionsDep$ComFusMoins50hab / FusionsDep$NbrComFus, 3)
##  [1]  0.0  0.0  0.0  0.0  8.7  NaN  0.0  3.8 50.0  0.0 10.0  0.0  NaN  2.2  0.0
## [16]  0.0  0.0 28.6  0.0  6.2  0.0 11.1  0.0  5.8  7.7  2.4  1.8  0.0  0.0  0.0
## [31]  0.0  0.0  0.0  0.0 10.0  0.0  0.0  8.6  0.0  0.0  0.0 50.0  0.0  0.0  0.0
## [46]  NaN  2.0  0.0  1.9  0.0  5.0  0.0  0.0 25.0  0.0  0.0 20.0  0.0  0.0  0.6
## [61]  7.1  0.0  0.0 30.0  NaN  0.0  0.0  0.0  6.2  0.0  2.6  0.0  0.0  NaN  0.0
## [76]  0.0  0.0  0.0  5.3  7.7  NaN  NaN  NaN  0.0  0.0  0.0 12.5  0.0  0.0  0.0
## [91]  NaN  0.0  NaN  0.0
# Proportion de communes françaises ayant moins de 1000 habitants avant
100 * round(sum(FusionsDep$ComMoins1000habAv) / nrow(df2011), 3)
## [1] 74
# Proportion de communes françaises ayant moins de 1000 habitants après
100 * round((sum(FusionsDep$ComMoins1000habAv) + sum(FusionsDep$EvolNbrComMoins1000hab)) /
              (nrow(df2011) + sum(FusionsDep$EvolNbrComMoins1000hab)), 3)
## [1] 72.6
# Proportion de communes françaises ayant moins de 50 habitants après
100 * round((sum(FusionsDep$ComMoins50habAv) + sum(FusionsDep$EvolNbrComMoins50hab)) /
              (nrow(df2011) + sum(FusionsDep$EvolNbrComMoins50hab)), 3)
## [1] 2.2

999.1.3 Cartographies par départements

999.1.4 Carto en fonction de la superficie moyenne des communes

geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE)
# Si besoin de calculer la superficie (désormais intégrée aux données compilées)
# df2011$superficie <- st_area(geom2011) # Attention, unités : m²
# df2011$superficie <- set_units(df2011$superficie, km^2) # On passe en km²

FusionsDep$SurfaceMoy <- tapply (df2011$superficie, df2011$CODE_DEPT, mean)

ShpDep <- as(dep, "Spatial")


# pdf("Communes nouvelles et densité de communes (2012-2023).pdf")
svg("figures/Superficie moyenne des communes (2011).svg")
# Carte départementale sur superficie moyenne des communes et nombre de fusions
plot(ShpDep, col = "grey", border = "white", axes = FALSE) # Fond de carte
# Carte choroplèthe en fonction de la superficie moyenne des communes dans le département
choroLayer(spdf = ShpDep, # SpatialPolygonsDataFrame
           df = FusionsDep, # data frame
           spdfid = "CODE_DEPT",
           dfid = "CODE_DEPT",
           var = "SurfaceMoy",
           # Si on souhaite faire les groupes manuellement :
           # breaks = c(0,0.27,5,10, 37), # liste des seuils (hypothèses)
           # col = carto.pal(pal1 = "turquoise.pal", n1 = 6, pal2 = "blue.pal", n2 = 0),
           # Si on souhaite avoir des groupes par quantiles :
           col = carto.pal(pal1 = "red.pal", n1 = 4), method = "quantile",
           nclass = 4,
           add=TRUE,
           legend.pos = "topleft", 
           legend.title.txt = "Superficie moyenne des communes (km²)")
layoutLayer(title = "Superficie moyenne des communes (2011)", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2024.", scale = NULL,
            author = "G. Bideau, R. Ysebaert", frame ="", col = NA)
dev.off()
## png 
##   2
# pdf("Communes nouvelles et densité de communes (2012-2023).pdf")
svg("figures/Communes nouvelles et superficie moyenne des communes (2012-2024).svg")
# Carte départementale sur superficie moyenne des communes et nombre de fusions
plot(ShpDep, col = "grey", border = "white", axes = FALSE) # Fond de carte
# Carte choroplèthe en fonction de la superficie moyenne des communes dans le département
choroLayer(spdf = ShpDep, # SpatialPolygonsDataFrame
           df = FusionsDep, # data frame
           spdfid = "CODE_DEPT",
           dfid = "CODE_DEPT",
           var = "SurfaceMoy",
           # Si on souhaite faire les groupes manuellement :
           # breaks = c(0,0.27,5,10, 37), # liste des seuils (hypothèses)
           # col = carto.pal(pal1 = "turquoise.pal", n1 = 6, pal2 = "blue.pal", n2 = 0),
           # Si on souhaite avoir des groupes par quantiles :
           col = carto.pal(pal1 = "red.pal", n1 = 4), method = "quantile",
           nclass = 4,
           add=TRUE,
           legend.pos = "topleft", 
           legend.title.txt = "Superficie moyenne des communes (km²)")
# On rajoute les cercles en fonction du nombre de communes ayant fusionné
propSymbolsLayer(spdf = ShpDep, # Ou à la place on peut utiliser "spdf = Communesfus" créé plus haut
                 df = FusionsDep,
                 spdfid = "CODE_DEPT",
                 dfid = "CODE_DEPT",
                 var = "NbrComFus",
                 inches = 0.2,
                 #breakval = 3, # On précise une valeur tournant
                 symbols = "circle",
                 col = "blue",
                 #col2 = "red",
                 legend.pos = "left",
                 legend.title.txt = "\n\n\n\n\nNombre de\ncommunes\nayant participé à\nla création d'une\ncommune nouvelle",
                 legend.style = "e",
                 legend.frame = FALSE,
                 add = TRUE)
layoutLayer(title = " ",
            # title = "Communes nouvelles et superficie moyenne des communes (2012-2024)", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2024.", scale = NULL,
            author = "G. Bideau", frame ="", col = NA)
dev.off()
## png 
##   2

999.1.5 Cartographie des communes de moins de 1000 habitants

ShpDep <- as(dep, "Spatial")
# Pourcentage du nombre de communes fusionnantes ayant moins de 1000 habitants par rapport au nombre de communes ayant moins de 1000 habitants
FusionsDep$CMoins1000_Fus_prct <- 100 * FusionsDep$ComFusMoins1000hab / FusionsDep$ComMoins1000habAv


svg("figures/Communes nouvelles et petites communes 2 (2012-2022).svg")
# Carte départementale sur communes de moins de 1000 habitants et nombre de fusions

# Carte choroplèthe en fonction du pourcentage de communes de moins de 1000 habitants
choroLayer(spdf = ShpDep, # SpatialPolygonsDataFrame
           df = FusionsDep, # data frame
           spdfid = "CODE_DEPT",
           dfid = "CODE_DEPT",
           var = "PartComMoins1000habAv",
           # Si on souhaite faire les groupes manuellement :
           # breaks = c(0,0.27,5,10, 37), # liste des seuils (hypothèses)
           # col = carto.pal(pal1 = "turquoise.pal", n1 = 6, pal2 = "blue.pal", n2 = 0),
           # Si on souhaite avoir des groupes par quantiles :
           col = carto.pal(pal1 = "red.pal", n1 = 4), method = "quantile",
           nclass = 4,
           add=FALSE,
           legend.pos = "topleft", 
           legend.title.txt = "Pourcentage de communes\nde moins de 1000 habitants")

# On rajoute les cercles en fonction du nombre de communes ayant fusionné et, en couleur, la part des communes fusionnantes de moins de 1000 habitants dans les communes de moins de 1000 habitants

propSymbolsChoroLayer(spdf = ShpDep, # Ou à la place on peut utiliser "spdf = Communesfus" créé plus haut
                      df = FusionsDep, spdfid = "CODE_DEPT", dfid = "CODE_DEPT",
                      var = "ComMoins1000habAv", inches = 0.18,
                      fixmax = max(FusionsDep$ComMoins1000habAv), symbols = "circle",
                      legend.var.pos = "left",
                      legend.var.title.txt = "Communes\nde moins de\n1000 habitants",
                      legend.var.style = "c",
                      legend.var.frame = FALSE,
                      
                      var2 = "CMoins1000_Fus_prct",
                      legend.var2.pos = "bottomleft",
                      legend.var2.title.txt = "Pourcentage\nde communes\nayant fusionné\nparmi celles-ci",
                      add = TRUE)

layoutLayer(title = " ", #"Communes nouvelles et petites communes par départements (2012-2022)", 
            coltitle = "black",
            sources = "                                 Source : INSEE, IGN, 2022.", scale = NULL,
            author = "                                  Auteur : G. Bideau.", frame ="", col = NA, postitle = "center")
dev.off()
## png 
##   2

999.2 Test des hypothèses de V. Aubelle

Le tome 2 du Panorama des communes nouvelles de V. Aubelle [référence??] propose un certain nombre d’hypothèse qu’il peut être intéressant de questionner.

L’Ouest : creuset des communes nouvelles

Ainsi, V. Aubelle décrit les caractéristiques des départements de l’Ouest en laissant supposer que ces caractéristiques seraient celles des communes nouvelles. Cela nous paraît prendre le risque de l’erreur écologique.

Les départements de l’Ouest ont-ils les caractéristiques qu’on retrouve chez une large part des communes nouvelles, et en particulier le taux élevé de navetteurs ou le faible taux de chômeurs ?

# Liste des variables à classer par départements (doivent être des stocks)
liste_variables <- c("C09_ACTOCC_OUT", "P09_CHOM1564", "C09_ACT1564_Agr", "C09_ACT1564_Cadr", "C09_ACT1564_Ouvr")
# variable <- liste_variables[1]
for (variable in liste_variables) {
  dep_variable <- as.data.frame(tapply(df2011[,variable], INDEX = df2011$CODE_DEPT, sum, na.rm = TRUE))
  dep_variable$CODE_DEPT <- row.names(dep_variable)
  colnames(dep_variable)[1] <- variable
  FusionsDep <- merge (FusionsDep, dep_variable, by = "CODE_DEPT")
  FusionsDep [, paste0(variable, "_RT")] <- 100 * FusionsDep[,variable] / FusionsDep$P09_POP

  
  
}
variable <- liste_variables[1]

for (variable in liste_variables) {
  
  print(paste0("VARIABLE ÉTUDIÉE : ", variable, "_RT"))
  
# Test de Chi²
Y <- FusionsDep$RatioComFus
# Pour variables qualitatives
# summary(Y)
# Y<-cut(Y,breaks=c(quantile(Y, probs=seq(0, 1, 0.2))))
# levels(Y)<-c("Q1","Q2", "Q3", "Q4", "Q5")
Y<-cut(Y,breaks=c(quantile(Y)))
levels(Y)<-c("Q1","Q2", "Q3", "Q4")

X <- FusionsDep [, paste0(variable, "_RT")]
X <- cut(X,breaks=c(quantile(X)))
levels(X)<-c("Q1","Q2", "Q3", "Q4")
# summary(X)

tabcont<-table(X,Y)
tabcont # En valeur absolue
# round(100*prop.table(tabcont,margin=1),1) # Pourcentages, le total se fait par lignes
# round(100*prop.table(tabcont,margin=),1) # Pourcentages, le total se fait sur l'ensemble de la population
# round(100*prop.table(tabcont,margin=2),1) # Pourcentages, le total se fait par colonnes

test<-chisq.test(tabcont)
# test$observed
# round(test$expected,1)
# round(test$residuals,2)
print(test)
}
## [1] "VARIABLE ÉTUDIÉE : C09_ACTOCC_OUT_RT"
## Warning in chisq.test(tabcont): L’approximation du Chi-2 est peut-être
## incorrecte
## 
##  Pearson's Chi-squared test
## 
## data:  tabcont
## X-squared = 9.7441, df = 9, p-value = 0.3716
## 
## [1] "VARIABLE ÉTUDIÉE : P09_CHOM1564_RT"
## Warning in chisq.test(tabcont): L’approximation du Chi-2 est peut-être
## incorrecte
## 
##  Pearson's Chi-squared test
## 
## data:  tabcont
## X-squared = 14.486, df = 9, p-value = 0.1061
## 
## [1] "VARIABLE ÉTUDIÉE : C09_ACT1564_Agr_RT"
## Warning in chisq.test(tabcont): L’approximation du Chi-2 est peut-être
## incorrecte
## 
##  Pearson's Chi-squared test
## 
## data:  tabcont
## X-squared = 13.701, df = 9, p-value = 0.1333
## 
## [1] "VARIABLE ÉTUDIÉE : C09_ACT1564_Cadr_RT"
## Warning in chisq.test(tabcont): L’approximation du Chi-2 est peut-être
## incorrecte
## 
##  Pearson's Chi-squared test
## 
## data:  tabcont
## X-squared = 5.734, df = 9, p-value = 0.7662
## 
## [1] "VARIABLE ÉTUDIÉE : C09_ACT1564_Ouvr_RT"
## Warning in chisq.test(tabcont): L’approximation du Chi-2 est peut-être
## incorrecte
## 
##  Pearson's Chi-squared test
## 
## data:  tabcont
## X-squared = 20.996, df = 9, p-value = 0.01267
# Cartographie pour exploration graphique

ShpDep <- as(dep, "Spatial")

for (variable in liste_variables) {
  
  print(paste0("VARIABLE ÉTUDIÉE : ", variable, "_RT"))
  
# Carte départementale sur taux de navetteurs
plot(ShpDep, col = "grey", border = "white", axes = FALSE) # Fond de carte
# Carte choroplèthe
choroLayer(spdf = ShpDep, # SpatialPolygonsDataFrame
           df = FusionsDep, # data frame
           spdfid = "CODE_DEPT",
           dfid = "CODE_DEPT",
           var = paste0(variable, "_RT"),
           # Si on souhaite faire les groupes manuellement :
           # breaks = c(0,0.27,5,10, 37), # liste des seuils (hypothèses)
           # col = carto.pal(pal1 = "turquoise.pal", n1 = 6, pal2 = "blue.pal", n2 = 0),
           # Si on souhaite avoir des groupes par quantiles :
           col = carto.pal(pal1 = "red.pal", n1 = 4), method = "quantile",
           nclass = 4,
           add=TRUE,
           legend.pos = "topleft",
           legend.title.txt = paste0(variable, "_RT") )
layoutLayer(title = paste0(variable, "_RT", " par département"), coltitle = "black",
            sources = "Sources : INSEE, IGN, 2011", scale = NULL,
            author = "G. Bideau", frame ="", col = NA)

}
## [1] "VARIABLE ÉTUDIÉE : C09_ACTOCC_OUT_RT"

## [1] "VARIABLE ÉTUDIÉE : P09_CHOM1564_RT"

## [1] "VARIABLE ÉTUDIÉE : C09_ACT1564_Agr_RT"

## [1] "VARIABLE ÉTUDIÉE : C09_ACT1564_Cadr_RT"

## [1] "VARIABLE ÉTUDIÉE : C09_ACT1564_Ouvr_RT"

# Carte départementale sur taux de communes fusionnantes
plot(ShpDep, col = "grey", border = "white", axes = FALSE) # Fond de carte
# Carte choroplèthe
choroLayer(spdf = ShpDep, # SpatialPolygonsDataFrame
           df = FusionsDep, # data frame
           spdfid = "CODE_DEPT",
           dfid = "CODE_DEPT",
           var = "RatioComFus",
           # Si on souhaite faire les groupes manuellement :
           # breaks = c(0,0.27,5,10, 37), # liste des seuils (hypothèses)
           # col = carto.pal(pal1 = "turquoise.pal", n1 = 6, pal2 = "blue.pal", n2 = 0),
           # Si on souhaite avoir des groupes par quantiles :
           col = carto.pal(pal1 = "red.pal", n1 = 4), method = "quantile",
           nclass = 4,
           add=TRUE,
           legend.pos = "topleft", 
           legend.title.txt = "Pourcentage de communes fusionnantes")
layoutLayer(title = "Pourcentage de communes fusionnantes par département", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2011", scale = NULL,
            author = "G. Bideau", frame ="", col = NA)

# Carte départementale sur taux de cadres
plot(ShpDep, col = "grey", border = "white", axes = FALSE) # Fond de carte
# Carte choroplèthe
choroLayer(spdf = ShpDep, # SpatialPolygonsDataFrame
           df = FusionsDep, # data frame
           spdfid = "CODE_DEPT",
           dfid = "CODE_DEPT",
           var = "C09_ACT1564_Cadr_RT",
           # Si on souhaite faire les groupes manuellement :
           # breaks = c(0,0.27,5,10, 37), # liste des seuils (hypothèses)
           # col = carto.pal(pal1 = "turquoise.pal", n1 = 6, pal2 = "blue.pal", n2 = 0),
           # Si on souhaite avoir des groupes par quantiles :
           col = carto.pal(pal1 = "red.pal", n1 = 4), method = "quantile",
           nclass = 4,
           add=TRUE,
           legend.pos = "topleft", 
           legend.title.txt = "Taux de cadres dans la population active")
layoutLayer(title = "Taux de cadres par département", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2011", scale = NULL,
            author = "G. Bideau", frame ="", col = NA)

rm(dep_variable, variable, liste_variables)

Par exemple, si on regarde des éléments comme le taux de navetteurs, qui est souvent particulièrement élevé dans les communes nouvelles, on s’aperçoit que la cartographie et le test de Chi² contredisent le lien entre communes fusionnantes et taux élevé de navetteurs, à l’échelle départementale.

Cela met bien en avant le risque de l’erreur écologique.

999.3 Statistiques basiques avant/après

load("data/refdata.Rdata")
datafus2011 <- subset(df2011, COM_NOUV == "OUI")
dataCN_new <- subset(df_new, COM_NOUV == "OUI")
dataNfus2011 <- subset(df2011, COM_NOUV == "NON") 

tabl_result <- data.frame()

variables_etud <- c("P09_POP", "superficie")

for (variable in variables_etud) {
  Nfus <- mean(dataNfus2011[, variable])
  fus <- mean(datafus2011[, variable])
  CN <- mean(dataCN_new[, variable])
  i <- c(variable, Nfus, fus, CN)
  tabl_result <- rbind(tabl_result, i, stringsAsFactors = FALSE)
}
colnames(tabl_result) <- c("Variable", "Communes non fusionnantes", "Communes fusionnantes", "Communes nouvelles")
print(tabl_result)
##     Variable Communes non fusionnantes Communes fusionnantes Communes nouvelles
## 1    P09_POP          1772.85600966157      1012.26619243729   3203.37308146399
## 2 superficie          14.9200330860307      14.8489998593944   46.9861012663435

Bibliographie