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é

# 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 2021 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 2021 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 (Bideau (2017), Bideau (2019)), 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

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-2021)", theme = "red.pal",
            author = "G. Bideau, 2021.",
            sources = "Sources : INSEE, IGN, 2021.", 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-2021)", theme = "red.pal",
            author = "G. Bideau, 2021.",
            sources = "Sources : INSEE, IGN, 2021.", 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\ncommunes fusionnantes
layoutLayer(title = "Communes fusionnantes (2011-2023)", #theme = "red.pal",
            author = "G. Bideau, 2024",
            sources = "Sources : INSEE, IGN, 2023", 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\ncommunes fusionnantes sans la trame départementale
layoutLayer(title = "Communes fusionnantes (2011-2023)", #theme = "red.pal",
            author = "G. Bideau, 2024",
            sources = "Sources : INSEE, IGN, 2023", 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-2021) : les communes nouvelles (rouge) dont enquêtées (bleu) en Savoie", theme = "red.pal",
            author = "G. Bideau, R. Ysebaert, 2021.",
            sources = "Sources : INSEE, IGN, 2021.", 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-2021) : les communes nouvelles (rouge) dont enquêtée (bleu) en Normandie", theme = "red.pal",
            author = "G. Bideau, R. Ysebaert, 2021.",
            sources = "Sources : INSEE, IGN, 2021.", 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-2021) : les communes nouvelles (rouge) en Maine-et-Loire", theme = "red.pal",
            author = "G. Bideau, R. Ysebaert, 2021.",
            sources = "Sources : INSEE, IGN, 2021.", extent = test49)
plot(st_geometry(test49), add = TRUE)
plot(st_geometry(subset(test49, COM_NOUV == "OUI")), col = "red", add = TRUE)

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 (Ysebaert, Lambert, and Giraud (2019b)) 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).

[1] “
en fonction de l’appartenance à différents ensembles
Variable Déviation à la moyenne française (communes inchangées) Déviation à la moyenne française (communes nouvelles) Déviation à la moyenne départementale (communes inchangées) Déviation à la moyenne départementale (communes nouvelles) Déviation aux mêmes catégories d’aires urbaine (communes inchangées) Déviation aux mêmes catégories d’aires urbaine (communes nouvelles) Différence (%) entre communes nouvelles et communes inchangées concernant la déviation à la moyenne française Différence (%) entre communes nouvelles et communes inchangées concernant la déviation à la moyenne départementale Différence (%) entre communes nouvelles et communes inchangées concernant la déviation aux mêmes catégories d’aires urbaines
1 Taux de chômage des 15-64 ans (%) 72.68 69.27 74.35 75.95 88.37 84.82 -4.69 2.16 -4.02
2 Part des étudiants, stagiaires, non rémunérés dans les actifs de 15-64 ans (%) 69.25 65.67 75.88 74.15 90.97 90.57 -5.17 -2.28 -0.44
3 Part des retraités et pré-retraités dans les actifs de 15-64 ans (%) 118.08 118.15 105.60 102.70 101.42 96.96 0.06 -2.75 -4.40
4 Part des agriculteurs dans les actifs de 15-64 ans (%) 198.66 257.15 150.91 158.10 98.59 106.10 29.44 4.77 7.62
5 Part des artisans, comm., chefs entr. dans les actifs de 15-64 ans (%) 108.57 109.95 105.02 103.22 93.55 89.87 1.28 -1.71 -3.93
6 Part des cadres, prof. intel. sup. dans les actifs de 15-64 ans (%) 52.28 47.34 72.96 69.27 80.51 80.67 -9.44 -5.06 0.21
7 Part des prof. intermédiaires dans les actifs de 15-64 ans (%) 90.42 82.77 94.73 88.91 97.72 93.98 -8.46 -6.15 -3.82
8 Part des employés dans les actifs de 15-64 ans (%) 93.76 92.17 92.48 93.22 96.37 95.39 -1.69 0.79 -1.01
9 Part des ouvriers dans les actifs de 15-64 ans (%) 114.82 127.19 101.39 105.91 97.81 103.64 10.77 4.46 5.96
10 Part de l’agriculture dans l’emploi au lieu de travail (%) 480.46 563.72 335.13 344.69 153.17 156.66 17.33 2.85 2.28
11 Part de l’industrie dans l’emploi au lieu de travail (%) 46.92 48.98 43.20 38.93 37.35 36.68 4.41 -9.90 -1.79
12 Part de la construction dans l’emploi au lieu de travail (%) 116.50 112.38 107.76 98.63 88.00 80.43 -3.54 -8.47 -8.60
13 Part du commerce, transports, services divers dans l’emploi au lieu de travail (%) 61.75 58.17 70.48 68.98 78.96 78.44 -5.80 -2.12 -0.66
14 Part de l’adm publique, enseignement, santé, act sociale dans l’emploi au lieu de travail (%) 73.95 67.43 71.31 66.69 81.58 75.57 -8.81 -6.48 -7.37
15 Part des 0-14 ans dans la population totale (%) 102.79 106.24 104.40 106.74 100.12 103.63 3.36 2.24 3.51
16 Part des 15-29 ans dans la population totale (%) 76.09 77.51 81.30 83.54 92.86 96.90 1.87 2.76 4.35
17 Part des 30-44 ans dans la population totale (%) 100.86 100.96 103.96 105.23 100.40 101.58 0.10 1.23 1.18
18 Part des 45-59 ans dans la population totale (%) 107.53 104.47 105.05 102.05 103.11 99.57 -2.85 -2.85 -3.43
19 Part des 60-74 ans dans la population totale (%) 107.28 106.06 102.24 101.44 100.41 96.90 -1.14 -0.78 -3.49
20 Part des 75 ans et plus dans la population totale (%) 97.22 98.90 90.79 90.20 91.89 89.98 1.72 -0.66 -2.08
21 Part des actifs occupés travaillant dans leur commune de résidence (%) 64.51 69.02 62.47 65.88 80.97 85.23 7.00 5.47 5.27
22 Part des actifs occupés travaillant hors de leur commune de résidence (%) 117.97 115.81 119.59 118.09 106.55 105.34 -1.83 -1.25 -1.14
23 Concentration d’emploi au lieu de travail (nombre d’actifs occupés = 100) 42.11 43.52 42.24 42.75 61.00 64.15 3.34 1.21 5.16
24 Potentiel financier par habitant (euros) 58.46 58.93 67.64 68.98 77.19 79.21 0.80 1.98 2.61
25 Dotation globale de fonctionnement par habitant (euros) 73.33 74.80 79.46 80.41 86.81 88.75 2.01 1.19 2.24
26 Revenu fiscal de référence par habitant (euros) 89.56 86.84 95.84 93.55 95.94 94.49 -3.04 -2.39 -1.51
27 Impôt net par habitant (euros) 56.22 48.40 72.14 67.18 79.58 73.22 -13.91 -6.88 -7.99
28 Pourcentage de foyers fiscaux imposables 95.47 93.20 100.28 97.46 99.76 98.91 -2.38 -2.81 -0.85

” attr(,“class”) [1] “knit_asis” attr(,“…”) named list() attr(,“html”) [1] TRUE attr(,“knit_cacheable”) [1] NA Différence (%) entre communes nouvelles et communes inchangées concernant la déviation à la moyenne française 29.44 Différence (%) entre communes nouvelles et communes inchangées concernant la déviation à la moyenne départementale 5.47 Différence (%) entre communes nouvelles et communes inchangées concernant la déviation aux mêmes catégories d’aires urbaines 7.62 Différence (%) entre communes nouvelles et communes inchangées concernant la déviation à la moyenne française -13.91 Différence (%) entre communes nouvelles et communes inchangées concernant la déviation à la moyenne départementale -9.90 Différence (%) entre communes nouvelles et communes inchangées concernant la déviation aux mêmes catégories d’aires urbaines -8.60

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. Chaque année est représentée, en commençant par l’année 2011 et en intégrant le 1er janvier de l’année n à l’année n-1 (donc, pour l’année 2019 par exemple, du 2 janvier 2019 au 1er janvier 2021 inclus).

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-1", "2024-1-1")), 
                        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

datafus2011$FusDateAnnee <- 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")),
                        labels = c("2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023")) # Si on utilise l'année (1er janvier laissé dans l'année concernée)


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 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.6, 600, 3.6, 100, length = 0.10, angle = 30,
       code = 2, col = "black", lty = par("lty"),
       lwd = par("lwd"))
text( 3, 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(6, 1300, 6, 100, length = 0.10, angle = 30,
       code = 2, col = "black", lty = par("lty"),
       lwd = par("lwd"))
text( 6, 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, 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))

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.

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-2021) par phases",
            author = "G. Bideau",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2021.")

1.10 La taille 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.

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")
table (PopCom)
## PopCom
##  moins de 200 habitants       200-500 habitants      500-1000 habitants 
##                    9377                   10469                    6948 
##     1000-5000 habitants    5000-10000 habitants plus de 10000 habitants 
##                    7480                    1046                     887
tabcont<-table(df2011$FUSION, PopCom)

# Test chi²
tab.chi2 <- chisq.test(tabcont)
tab.chi2
## 
##  Pearson's Chi-squared test
## 
## data:  tabcont
## X-squared = 55.922, df = 5, p-value = 8.431e-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)) +
  scale_x_discrete("Population communale") + 
  scale_y_continuous("Pourcentage de communes") +
  scale_fill_manual("Communes\nfusionnantes", values = c("blue", "red"))

# 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 habitants 25.96 25.10 25.90
200-500 habitants 28.69 31.90 28.91
500-1000 habitants 19.13 20.02 19.19
1000-5000 habitants 20.67 20.57 20.66
5000-10000 habitants 2.99 1.57 2.89
plus de 10000 habitants 2.57 0.83 2.45
Total 100.01 99.99 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

# 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.088  22.222  31.613  41.776 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 <- "CV"

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)
nbDiff <- sum(AppartComFus2[, paste0(appart, "_simil")] == FALSE)
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 1748 99.94 1 0.06 1749 100 25716
Département 1745 99.77 4 0.23 1749 100 5745
Arrondissement 1688 96.51 61 3.49 1749 100 1662
Canton de ville 1496 85.53 253 14.47 1749 100 148
Zone d’emploi 2010 1614 92.28 135 7.72 1749 100 1818
Aire urbaine 2010 800 65.47 422 34.53 1222 100 706
EPCI 1546 90.89 155 9.11 1701 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)


# 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\nnouvelles", 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(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.12]   (4.12,5.72]   (5.72,7.27]   (7.27,8.98]   (8.98,10.9] 
##          3445          3446          3446          3446          3446 
##   (10.9,13.4]   (13.4,16.7]   (16.7,21.8]   (21.8,31.6]    (31.6,758] 
##          3445          3446          3446          3446          3446
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"

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_oui, ZAU_non)

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

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

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=c("red","blue"), # "#ff87a9","#f7d358"
        beside = TRUE)

legend(x="topright", legend = rownames(prop) , cex=0.8,
       fill=c("red","blue"),bty="n")     

# Chi2
tab.chi2 <- chisq.test(ZAU_nb)
tab.chi2 
## 
##  Pearson's Chi-squared test
## 
## data:  ZAU_nb
## X-squared = 171.19, df = 8, p-value < 2.2e-16
tab.chi2$observed
##                        
##                           111   112   120   211   212   221   222   300   400
##   Communes fusionnantes    75   786   297    24    73    92    30   559   600
##   Communes inchangées    3125 11394  3671   415   728   762   528  6416  6633
tab.chi2$expected
##                        
##                               111        112       120       211       212
##   Communes fusionnantes  224.1273   853.0844  277.9178  30.74746  56.10186
##   Communes inchangées   2975.8727 11326.9156 3690.0822 408.25254 744.89814
##                        
##                               221       222       300       400
##   Communes fusionnantes  59.81396  39.08219  488.5274  506.5977
##   Communes inchangées   794.18604 518.91781 6486.4726 6726.4023
tab.chi2$residuals
##                        
##                                111        112        120        211        212
##   Communes fusionnantes -9.9611552 -2.2968125  1.1446430 -1.2168461  2.2560587
##   Communes inchangées    2.7336938  0.6303267 -0.3141306  0.3339457 -0.6191424
##                        
##                                221        222        300        400
##   Communes fusionnantes  4.1616562 -1.4527845  3.1884224  4.1497905
##   Communes inchangées   -1.1421059  0.3986955 -0.8750160 -1.1388495
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 2.96 9.28 8.84
112 30.99 33.84 33.64
120 11.71 10.90 10.96
211 0.95 1.23 1.21
212 2.88 2.16 2.21
221 3.63 2.26 2.36
222 1.18 1.57 1.54
300 22.04 19.05 19.26
400 23.66 19.70 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     316     471
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 
##  4.2 42.9  9.3  0.4  2.3  1.3  0.4 12.1 27.0
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.7  0.9  2.9  3.6  1.2 22.0 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.

t# 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 2021 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 2021 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, 2021.",
            sources = "Sources : INSEE, IGN, 2021\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, 2021.",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2021.\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 (Ysebaert, Lambert, and Giraud (2019a)). 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, 2021.",
            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 (Grasland (2004)) 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, 2021.", 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, 2021.", author =  "G. Bideau, R. Ysebaert, 2021.
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, 2021.", author =  "G. Bideau, R. Ysebaert, 2021.
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, 2021.", author =  "G. Bideau, R. Ysebaert, 2021.
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, 2021.", author =  "G. Bideau, R. Ysebaert, 2021.
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, 2021.", author =  "G. Bideau, R. Ysebaert, 2021.
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, 2021.", author =  "G. Bideau, R. Ysebaert, 2021.
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, 2021.", author =  "G. Bideau, R. Ysebaert, 2021.
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, 2021.", author =  "G. Bideau, R. Ysebaert, 2021.
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 2021, 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)

5.2 Réalisation de la typologie et valeurs

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))

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) +
  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) +
  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-2021)",
            author = "G. Bideau, R. Ysebaert, 2021.",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2021.")

# 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.00 -2.23 6.81 7.26 9.40 5.65 10.39 -4.42 -2.19 -3.97 -1.74 -1.83 0.40 -5.58 -3.35 -0.84 1.39
P09_ETUD1564_RT 14.44 11.24 -3.20 10.31 9.00 11.14 7.72 7.95 -4.13 -0.93 -5.44 -2.24 -3.30 -0.10 -6.72 -3.52 -6.49 -3.29
P09_RETR1564_RT 12.29 13.95 1.66 15.73 11.46 15.82 15.03 28.42 3.44 1.78 -0.83 -2.49 3.53 1.87 2.74 1.08 16.13 14.47
C09_ACT1564_Agr_RT 1.64 3.37 1.73 4.72 5.00 6.75 27.73 11.20 3.08 1.35 3.36 1.63 5.11 3.38 26.09 24.36 9.56 7.83
C09_ACT1564_ArtCom_RT 5.60 6.12 0.52 5.87 6.19 7.14 10.07 8.64 0.27 -0.25 0.59 0.07 1.54 1.02 4.47 3.95 3.04 2.52
C09_ACT1564_Cadr_RT 15.09 10.34 -4.75 13.81 7.61 6.46 5.22 7.67 -1.28 3.47 -7.48 -2.73 -8.63 -3.88 -9.87 -5.12 -7.42 -2.67
C09_ACT1564_ProfInt_RT 24.16 22.38 -1.78 27.68 21.73 18.12 14.78 17.05 3.52 5.30 -2.43 -0.65 -6.04 -4.26 -9.38 -7.60 -7.11 -5.33
C09_ACT1564_Empl_RT 28.89 27.90 -0.99 22.55 26.91 28.76 19.40 24.89 -6.34 -5.35 -1.98 -0.99 -0.13 0.86 -9.49 -8.50 -4.00 -3.01
C09_ACT1564_Ouvr_RT 23.59 29.17 5.58 24.22 32.39 33.10 21.52 30.04 0.63 -4.95 8.80 3.22 9.51 3.93 -2.07 -7.65 6.45 0.87
P09_POP0014Y_RT 18.33 18.97 0.64 19.59 23.16 17.66 18.46 13.26 1.26 0.62 4.83 4.19 -0.67 -1.31 0.13 -0.51 -5.07 -5.71
P09_POP1529Y_RT 18.65 16.13 -2.52 13.65 15.10 15.57 12.69 10.33 -5.00 -2.48 -3.55 -1.03 -3.08 -0.56 -5.96 -3.44 -8.32 -5.80
P09_POP3044Y_RT 20.25 19.99 -0.26 20.77 23.82 18.77 20.55 15.63 0.52 0.78 3.57 3.83 -1.48 -1.22 0.30 0.56 -4.62 -4.36
P09_POP4559Y_RT 20.24 20.58 0.34 23.49 19.28 21.73 20.70 23.25 3.25 2.91 -0.96 -1.30 1.49 1.15 0.46 0.12 3.01 2.67
P09_POP6074Y_RT 13.71 14.41 0.70 14.65 11.74 15.51 16.81 23.12 0.94 0.24 -1.97 -2.67 1.80 1.10 3.10 2.40 9.41 8.71
C09_ACTOCC_OUT_RT 66.38 68.65 2.27 82.88 80.84 69.88 49.76 67.21 16.50 14.23 14.46 12.19 3.50 1.23 -16.62 -18.89 0.83 -1.44
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] 867046

mean(typo$P11_POT_FIN_RT)

[1] 742.1242

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 428 28 212 48 3 17 5 6 68 41
Groupe 2 PFO 721 6 348 116 5 26 7 4 166 43
Groupe 3 MOARO 973 39 196 106 13 27 75 13 235 269
Groupe 4 VAR 167 0 14 11 0 2 0 1 36 103
Groupe 5 REAV 245 2 16 16 3 1 5 6 54 142

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.4 1.7 4.7 3.1 1.3
2 C09_ACT1564_ArtCom_RT 5.6 6.1 0.5 5.9 0.3 -0.3
3 C09_ACT1564_Cadr_RT 15.1 10.3 -4.8 13.8 -1.3 3.5
4 C09_ACT1564_Empl_RT 28.9 27.9 -1.0 22.5 -6.3 -5.4
5 C09_ACT1564_Ouvr_RT 23.6 29.2 5.6 24.2 0.6 -4.9
6 C09_ACT1564_ProfInt_RT 24.2 22.4 -1.8 27.7 3.5 5.3
7 C09_ACTOCC_OUT_RT 66.4 68.7 2.3 82.9 16.5 14.2
8 P09_CHOM1564_RT 11.2 9.0 -2.2 6.8 -4.4 -2.2
9 P09_ETUD1564_RT 14.4 11.2 -3.2 10.3 -4.1 -0.9
10 P09_POP0014Y_RT 18.3 19.0 0.6 19.6 1.3 0.6
11 P09_POP1529Y_RT 18.6 16.1 -2.5 13.6 -5.0 -2.5
12 P09_POP3044Y_RT 20.2 20.0 -0.3 20.8 0.5 0.8
13 P09_POP4559Y_RT 20.2 20.6 0.3 23.5 3.3 2.9
14 P09_POP6074Y_RT 13.7 14.4 0.7 14.7 0.9 0.2
15 P09_RETR1564_RT 12.3 13.9 1.7 15.7 3.4 1.8
” 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.4 1.7 5.0 3.4 1.6
2 C09_ACT1564_ArtCom_RT 5.6 6.1 0.5 6.2 0.6 0.1
3 C09_ACT1564_Cadr_RT 15.1 10.3 -4.8 7.6 -7.5 -2.7
4 C09_ACT1564_Empl_RT 28.9 27.9 -1.0 26.9 -2.0 -1.0
5 C09_ACT1564_Ouvr_RT 23.6 29.2 5.6 32.4 8.8 3.2
6 C09_ACT1564_ProfInt_RT 24.2 22.4 -1.8 21.7 -2.4 -0.6
7 C09_ACTOCC_OUT_RT 66.4 68.7 2.3 80.8 14.5 12.2
8 P09_CHOM1564_RT 11.2 9.0 -2.2 7.3 -4.0 -1.7
9 P09_ETUD1564_RT 14.4 11.2 -3.2 9.0 -5.4 -2.2
10 P09_POP0014Y_RT 18.3 19.0 0.6 23.2 4.8 4.2
11 P09_POP1529Y_RT 18.6 16.1 -2.5 15.1 -3.5 -1.0
12 P09_POP3044Y_RT 20.2 20.0 -0.3 23.8 3.6 3.8
13 P09_POP4559Y_RT 20.2 20.6 0.3 19.3 -1.0 -1.3
14 P09_POP6074Y_RT 13.7 14.4 0.7 11.7 -2.0 -2.7
15 P09_RETR1564_RT 12.3 13.9 1.7 11.5 -0.8 -2.5
” 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.4 1.7 6.7 5.1 3.4
2 C09_ACT1564_ArtCom_RT 5.6 6.1 0.5 7.1 1.5 1.0
3 C09_ACT1564_Cadr_RT 15.1 10.3 -4.8 6.5 -8.6 -3.9
4 C09_ACT1564_Empl_RT 28.9 27.9 -1.0 28.8 -0.1 0.9
5 C09_ACT1564_Ouvr_RT 23.6 29.2 5.6 33.1 9.5 3.9
6 C09_ACT1564_ProfInt_RT 24.2 22.4 -1.8 18.1 -6.0 -4.3
7 C09_ACTOCC_OUT_RT 66.4 68.7 2.3 69.9 3.5 1.2
8 P09_CHOM1564_RT 11.2 9.0 -2.2 9.4 -1.8 0.4
9 P09_ETUD1564_RT 14.4 11.2 -3.2 11.1 -3.3 -0.1
10 P09_POP0014Y_RT 18.3 19.0 0.6 17.7 -0.7 -1.3
11 P09_POP1529Y_RT 18.6 16.1 -2.5 15.6 -3.1 -0.6
12 P09_POP3044Y_RT 20.2 20.0 -0.3 18.8 -1.5 -1.2
13 P09_POP4559Y_RT 20.2 20.6 0.3 21.7 1.5 1.1
14 P09_POP6074Y_RT 13.7 14.4 0.7 15.5 1.8 1.1
15 P09_RETR1564_RT 12.3 13.9 1.7 15.8 3.5 1.9
” 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.4 1.7 27.7 26.1 24.4
2 C09_ACT1564_ArtCom_RT 5.6 6.1 0.5 10.1 4.5 3.9
3 C09_ACT1564_Cadr_RT 15.1 10.3 -4.8 5.2 -9.9 -5.1
4 C09_ACT1564_Empl_RT 28.9 27.9 -1.0 19.4 -9.5 -8.5
5 C09_ACT1564_Ouvr_RT 23.6 29.2 5.6 21.5 -2.1 -7.6
6 C09_ACT1564_ProfInt_RT 24.2 22.4 -1.8 14.8 -9.4 -7.6
7 C09_ACTOCC_OUT_RT 66.4 68.7 2.3 49.8 -16.6 -18.9
8 P09_CHOM1564_RT 11.2 9.0 -2.2 5.7 -5.6 -3.3
9 P09_ETUD1564_RT 14.4 11.2 -3.2 7.7 -6.7 -3.5
10 P09_POP0014Y_RT 18.3 19.0 0.6 18.5 0.1 -0.5
11 P09_POP1529Y_RT 18.6 16.1 -2.5 12.7 -6.0 -3.4
12 P09_POP3044Y_RT 20.2 20.0 -0.3 20.5 0.3 0.6
13 P09_POP4559Y_RT 20.2 20.6 0.3 20.7 0.5 0.1
14 P09_POP6074Y_RT 13.7 14.4 0.7 16.8 3.1 2.4
15 P09_RETR1564_RT 12.3 13.9 1.7 15.0 2.7 1.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.4 1.7 11.2 9.6 7.8
2 C09_ACT1564_ArtCom_RT 5.6 6.1 0.5 8.6 3.0 2.5
3 C09_ACT1564_Cadr_RT 15.1 10.3 -4.8 7.7 -7.4 -2.7
4 C09_ACT1564_Empl_RT 28.9 27.9 -1.0 24.9 -4.0 -3.0
5 C09_ACT1564_Ouvr_RT 23.6 29.2 5.6 30.0 6.4 0.9
6 C09_ACT1564_ProfInt_RT 24.2 22.4 -1.8 17.0 -7.1 -5.3
7 C09_ACTOCC_OUT_RT 66.4 68.7 2.3 67.2 0.8 -1.4
8 P09_CHOM1564_RT 11.2 9.0 -2.2 10.4 -0.8 1.4
9 P09_ETUD1564_RT 14.4 11.2 -3.2 7.9 -6.5 -3.3
10 P09_POP0014Y_RT 18.3 19.0 0.6 13.3 -5.1 -5.7
11 P09_POP1529Y_RT 18.6 16.1 -2.5 10.3 -8.3 -5.8
12 P09_POP3044Y_RT 20.2 20.0 -0.3 15.6 -4.6 -4.4
13 P09_POP4559Y_RT 20.2 20.6 0.3 23.3 3.0 2.7
14 P09_POP6074Y_RT 13.7 14.4 0.7 23.1 9.4 8.7
15 P09_RETR1564_RT 12.3 13.9 1.7 28.4 16.1 14.5

” 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.72 4.22
Part des artisans, comm., chefs entr. dans les actifs de 15-64 ans (%) 7.03 6.08 6.99 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.18 26.63
Part des ouvriers dans les actifs de 15-64 ans (%) 28 27.28 30.33 30
Part des prof. intermédiaires dans les actifs de 15-64 ans (%) 21.62 21.74 20.43 20
Part des actifs occupés travaillant hors de leur commune de résidence (%) 74.46 78.23 73.61 76.88
Taux de chômage des 15-64 ans (%) 8.74 8.13 8.19 7.78
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.17 19.47
Part des 15-29 ans dans la population totale (%) 14.22 14.21 14.42 14.46
Part des 30-44 ans dans la population totale (%) 20.33 20.43 20.35 20.45
Part des 45-59 ans dans la population totale (%) 22.03 21.72 21.41 21.14
Part des 60-74 ans dans la population totale (%) 15.35 14.69 15.12 14.54
Part des retraités et pré-retraités dans les actifs de 15-64 ans (%) Inf 14.51 15.75 14.52

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     566     221
# 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     522     265
# 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 
##           19.0           29.9           38.0            3.6            9.5
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 
##           26.7           32.4           31.6            3.9            5.3
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 
##           16.9           28.5           38.4            6.6            9.7
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 = 1)
Groupe 1 PPCQ Groupe 2 PFO Groupe 3 MOARO Groupe 4 VAR Groupe 5 REAV
Nombre de communes nouvelles regroupant des communes homogènes du point de vue de la typologie 42.0 66.0 84.0 8.0 21.0
Pourcentages en fonction de la totalité des communes nouvelles 0.7 1.2 1.5 0.1 0.4
Pourcentages en fonction de la totalité des communes nouvelles homogènes 19.0 29.9 38.0 3.6 9.5
Nombre de communes nouvelles ayant un type majoritaire 210.0 255.0 249.0 31.0 42.0
Pourcentages de chaque groupe majoritaire en fonction de la totalité des communes fusionnantes 26.7 32.4 31.6 3.9 5.3
Nombre de communes fusionnantes par groupe 428.0 721.0 973.0 167.0 245.0
Pourcentages de chaque groupe en fonction de la totalité des communes fusionnantes 16.9 28.5 38.4 6.6 9.7

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.3 15.0 23.4
Groupe 2 PFO 24.0 11.4 21.5
Groupe 3 MOARO 29.1 11.2 27.5
Groupe 4 VAR 41.6 16.8 39.8
Groupe 5 REAV 40.3 21.4 36.3
Ensemble 27.8 14.1 24.8
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.3 23.4
2 Groupe 2 PFO 24.0 21.5
3 Groupe 3 MOARO 29.1 27.5
4 Groupe 4 VAR 41.6 39.8
5 Groupe 5 REAV 40.3 36.3
6 Ensemble 27.8 24.8

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)
# 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)
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)
# 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)
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)


# 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)[3:7] <- NomsGroupesCAH2

par(mfrow=c(2,3)) 
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/2021, 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 2021 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 2021 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  575.3696  702.9351 1028.8303
##  [8] 1018.0400  619.4632 1247.5384
# Pour variables qualitatives
summary(Y)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   296.8   491.1   592.4   742.1   763.8 48890.3
Y<-cut(Y,breaks=c(quantile(Y)))
levels(Y)<-c("Q1","Q2", "Q3", "Q4")
Y [1:10]
##  [1] Q2 Q3 Q4 Q3 Q2 Q3 Q4 Q4 Q3 Q4
## 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 2 PFO"   "Groupe 2 PFO"  
##  [9] "Groupe 1 PPCQ"  "Groupe 3 MOARO"
tabcont<-table(X,Y)
tabcont # En valeur absolue
##                 Y
## X                 Q1  Q2  Q3  Q4
##   Groupe 1 PPCQ  120 126  99  83
##   Groupe 2 PFO   280 209 134  98
##   Groupe 3 MOARO 183 217 256 316
##   Groupe 4 VAR    20  34  50  63
##   Groupe 5 REAV   30  47  94  74
round(100*prop.table(tabcont,margin=1),1) # Pourcentages, le total se fait par lignes
##                 Y
## X                  Q1   Q2   Q3   Q4
##   Groupe 1 PPCQ  28.0 29.4 23.1 19.4
##   Groupe 2 PFO   38.8 29.0 18.6 13.6
##   Groupe 3 MOARO 18.8 22.3 26.3 32.5
##   Groupe 4 VAR   12.0 20.4 29.9 37.7
##   Groupe 5 REAV  12.2 19.2 38.4 30.2
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   4.7  5.0  3.9  3.3
##   Groupe 2 PFO   11.1  8.3  5.3  3.9
##   Groupe 3 MOARO  7.2  8.6 10.1 12.5
##   Groupe 4 VAR    0.8  1.3  2.0  2.5
##   Groupe 5 REAV   1.2  1.9  3.7  2.9
round(100*prop.table(tabcont,margin=2),1) # Pourcentages, le total se fait par colonnes
##                 Y
## X                  Q1   Q2   Q3   Q4
##   Groupe 1 PPCQ  19.0 19.9 15.6 13.1
##   Groupe 2 PFO   44.2 33.0 21.2 15.5
##   Groupe 3 MOARO 28.9 34.3 40.4 49.8
##   Groupe 4 VAR    3.2  5.4  7.9  9.9
##   Groupe 5 REAV   4.7  7.4 14.8 11.7

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 (Vaudor (2018)) mais aussi Feuillet, Cossart, and Commenges (2019) 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) (Giraud, Beauguitte, and Guérois (2016)) et là (https://journals.openedition.org/netcom/2134) (Beauguitte, Giraud, and Guérois (2015)).

# 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 "\xc8ve","\xc8vres",..: 13318 9658 24869 17403 20417 25249 6749 10398 24700 25461 ...
##  $ 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 champs 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 champs 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 champs 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 champs 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, 2021.",
            tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2021.")

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 champs 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 champs 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 champs 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 champs 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 
##            332           1801            378           1342          31375
summary(Results$DestMaxEst) * 100 / nrow(Results) # En pourcentages
##        AutreCN    Dest_non_CN        Même_CN Origine_non_CN      Pas_de_CN 
##      0.9424322      5.1124106      1.0730101      3.8094697     89.0626774
# 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 
##            332           1801            378              0              0
summary(ResultsComFus$DestMaxEst) * 100 / nrow(ResultsComFus) # En pourcentages
##        AutreCN    Dest_non_CN        Même_CN Origine_non_CN      Pas_de_CN 
##       13.22182       71.72441       15.05376        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 
##            101            680             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.688442      85.427136       1.884422       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 
##            231           1121            363              0              0
summary(ResultsComFusNonChefLieu$DestMaxEst) * 100 / nrow(ResultsComFusNonChefLieu) # En pourcentages
##        AutreCN    Dest_non_CN        Même_CN Origine_non_CN      Pas_de_CN 
##       13.46939       65.36443       21.16618        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 378 332 1801
Pourcentage (%) 1 1 5
communes fusionnantes
Nombre 378 332 1801
Pourcentage (%) 15 13 72
communes fusionnantes devenues chef-lieu
Nombre 15 101 680
Pourcentage (%) 2 13 85
communes fusionnantes non chef-lieu
Nombre 363 231 1121
Pourcentage (%) 21 13 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 champs 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 20 0 767
La commune avec le plus grand solde est 20 1 766
La commune avec la plus grande attractivité est 49 12 726

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 Bellefon, Loonis, and Le Gleut (2018).

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. Bellefon and Salima (2018) p. 56 sq. pour l’explication et 62 pour le code.

test_geom$COM_NOUV2 <- 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. Bellefon and Salima (2018) 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 = 11.948, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Same colour statistic           Expectation              Variance 
##             44.859434             26.494475              2.362683 
## 
## 
##  Join count test under nonfree sampling
## 
## data:  test_geom$COM_NOUV3 
## weights: test_liste 
## 
## Std. deviate for OUI = 11.37, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Same colour statistic           Expectation              Variance 
##             88.848341             68.994475              3.048987

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. Bellefon and Salima (2018) 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 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
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)

test_geom$COM_NOUV2 <- 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,1)")


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 31037  1039
##   High-High           0  1496
##   Low-High         2623     0
##   High-Low            0     1
##   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

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)

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.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.219   Mean   :0.4174   Mean   :0.6365   Mean   :0.2643  
##  3rd Qu.: 8.500   3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:0.0000  
##  Max.   :19.000   Max.   :5.0000   Max.   :5.0000   Max.   :3.0000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:575        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.1339                     
##  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.224   Mean   :0.4574   Mean   :0.4574   Mean   :0.2957  
##  3rd Qu.: 9.000   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:575        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.2365                     
##  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.765   Mean   :0.3183   Mean   :0.2348   Mean   :0.2226  
##  3rd Qu.: 9.000   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:575        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.1304                     
##  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.00   Min.   :0.00000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.: 3.00   1st Qu.:0.00000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median : 5.00   Median :0.00000   Median :0.0000   Median :0.0000  
##  Mean   : 6.28   Mean   :0.07478   Mean   :0.8765   Mean   :0.2035  
##  3rd Qu.: 8.00   3rd Qu.:0.00000   3rd Qu.:1.0000   3rd Qu.:0.0000  
##  Max.   :19.00   Max.   :3.00000   Max.   :6.0000   Max.   :2.0000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:575        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.2365                     
##  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.00000  
##  1st Qu.: 3.000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.00000  
##  Median : 5.000   Median :0.0000   Median :0.0000   Median :0.00000  
##  Mean   : 6.515   Mean   :0.3096   Mean   :0.4643   Mean   :0.08174  
##  3rd Qu.: 8.000   3rd Qu.:0.0000   3rd Qu.:0.0000   3rd Qu.:0.00000  
##  Max.   :19.000   Max.   :6.0000   Max.   :6.0000   Max.   :2.00000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:575        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.3009                     
##  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.094   Mean   :0.5409   Mean   :0.6817   Mean   :0.1287  
##  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:575        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.2261                     
##  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.522   Mean   :0.4296   Mean   :0.3548   Mean   :0.2226  
##  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:575        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.1426                     
##  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.111   Mean   :0.6035   Mean   :0.6122   Mean   :0.1704  
##  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:575        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.1739                     
##  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.: 3.000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.000  
##  Median : 5.000   Median :0.0000   Median :0.0000   Median :0.000  
##  Mean   : 6.504   Mean   :0.1235   Mean   :0.5617   Mean   :0.127  
##  3rd Qu.: 9.000   3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:0.000  
##  Max.   :20.000   Max.   :2.0000   Max.   :4.0000   Max.   :1.000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:575        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.3548                     
##  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.000   Min.   :0.0000  
##  1st Qu.: 2.000   1st Qu.:0.0000   1st Qu.: 0.000   1st Qu.:0.0000  
##  Median : 4.000   Median :0.0000   Median : 0.000   Median :0.0000  
##  Mean   : 5.649   Mean   :0.5443   Mean   : 0.967   Mean   :0.3461  
##  3rd Qu.: 7.000   3rd Qu.:0.0000   3rd Qu.: 1.000   3rd Qu.:0.0000  
##  Max.   :19.000   Max.   :5.0000   Max.   :11.000   Max.   :3.0000  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:575        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.1652                     
##  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.00  
##  1st Qu.: 2.000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.00  
##  Median : 4.000   Median :0.0000   Median :0.0000   Median :0.00  
##  Mean   : 5.812   Mean   :0.7078   Mean   :0.7948   Mean   :0.16  
##  3rd Qu.: 8.000   3rd Qu.:1.0000   3rd Qu.:0.0000   3rd Qu.:0.00  
##  Max.   :18.000   Max.   :5.0000   Max.   :8.0000   Max.   :2.00  
##     High-Low       CODGEO_new       
##  Min.   :0.0000   Length:575        
##  1st Qu.:0.0000   Class :character  
##  Median :0.0000   Mode  :character  
##  Mean   :0.1965                     
##  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 Darnets (CODGEO 19070 ) sont : Combressol Égletons Lamazière-Basse Maussac Moustier-Ventadour Palisse Soudeilles
# Si on part du package spdep
test_queen <- poly2nb(test_geom, queen = TRUE)
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 Darnets sont : Combressol Égletons Lamazière-Basse Maussac Moustier-Ventadour Palisse Soudeilles
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) 

# 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 
## 28761  2720  1474   490   159    48    15     3     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")

knitr::opts_chunk$set(echo=TRUE, # Afficher ou non le code R dans le document
                      eval  = TRUE, #   Exécuter ou non le code R à la compilation
                      include   = TRUE, #   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.

[À reprendre] Différences moyennes entre communes voisines fusionnantes ou non

Regarder la différence entre une commune et ses voisines. Catégoriser en fonction des communes fusionnantes, des autres etc.: réflexion à l’aide d’une boucle pour voir des écarts entre les communes voisines. Sur une variable donnée (taux de chômage, taux d’endettement etc) et pour chaque commune ayant fusionné : • quelle est la moyenne des différences entre cette commune et chacune de ces communes limitrophes avec lesquelles elle n’a pas fusionné ; • quelle est la moyenne des différences entre cette commune et chacune des communes limitrophes avec lesquelles elle a fusionné.

load("data/refdata.Rdata")
geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE) 
# geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE)
datafus2011 <- subset(df2011, COM_NOUV == "OUI")

test_geom <- merge(geom2011, df2011, by = "CODGEO")

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

test_data <- test_geom
st_geometry(test_data) <- NULL

# 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()
variables_a_etudier <- c("P09_CHOM1564_RT", "C09_ACTOCC_OUT_RT", "C09_ACT1564_Agr_RT")

variable <- "P09_CHOM1564_RT"

for (variable in variables_a_etudier) {
  
  i <- 10
for (i in 1:nrow(datafus2011)) { # Pour chaque commune ayant fusionné
  # On identifie la commune
  CODGEO_com <- datafus2011$CODGEO[i]
  numcom <- which(test_data$CODGEO==CODGEO_com)

  # On liste les voisins, par l'identifiant de leur ligne
  numvoisins <- get_neighbors(queen_w, idx = numcom)
  # CODGEO_voisins <- test_data$CODGEO[numvoisins]
  nbr_voisins <- length(numvoisins)
  # num_voisin <- numvoisins[2]
  for (num_voisin in numvoisins ) { # Pour chaque voisin
    diff_voisin <- test_data[num_voisin, variable] - test_data[numcom, variable] / test_data[numcom, variable] # Calcul de la différence avec le voisin
    diff_tous_voisins <- vector()
    diff_voisins_fus <- vector()
    diff_voisins_Nfus <- vector()
    diff_tous_voisins <- c(diff_tous_voisins, diff_voisin) # On stocke la donnée
     if (test_data[num_voisin, "CODGEO_"] == test_data[numcom, "CODGEO_"]) { # Si même CODGEO_new
    diff_voisins_fus <- c(diff_voisins_fus, diff_voisin)
    
     } else { # Si PAS même CODGEO_new
    diff_voisins_Nfus <- c(diff_voisins_Nfus, diff_voisin)
     } # Fin boucle if/else
    

    
  } # Fin boucle calcul des moyennes
  # On stocke les informations
  nbr_voisins_fus <- length(diff_voisins_fus)
  nbr_voisins_Nfus  <- length(diff_voisins_Nfus)
  
  com_etud <- c(CODGEO_com, nbr_voisins, nbr_voisins_fus, nbr_voisins_Nfus, mean(diff_tous_voisins), mean(diff_voisins_fus), mean(diff_voisins_Nfus))
  
  results <- rbind(results, com_etud)
  
  CODGEO_voisins_Cfus <- c(CODGEO_voisins, CODGEO_voisins_Cfus)

} # Fin boucle pour une commune
rm (com_etud, nbr_voisins, nbr_voisins_fus, nbr_voisins_Nfus, CODGEO_com, diff_tous_voisins, diff_voisins_fus, diff_voisins_Nfus, num_voisin, numvoisins, numcom)


colnames(results) <- c("CODGEO", "Nombre de voisins", "Nombre de voisins avec lesquelles la commune a fusionné", "Nombre de voisins avec lesquelles la commune n'a pas fusionné", "Différence moyenne avec l'ensemble des communes", "Différence moyenne avec les communes avec lesquelles la commune a fusionné", "Différence moyenne avec les communes avec lesquelles la commune n'a pas fusionné")

assign(paste0("Compar_moy_", variable), results)

} # Fin boucle pour une variable

10 - ÉVOLUTIONS DÉMOGRAPHIQUES SUR LE TEMPS LONG

Vision générale

Il s’agit d’observer si les communes nouvelles se sont créées dans des contextes démographiques spécifiques ou non. S’agit-il de contextes :

  • Très différents des autres communes n’ayant pas fusionné ? On fait l’hypothèse que non.

  • En déprise importante, et la fusion serait une adaptation à cette décroissance ? On suppose que non.

Pour une analyse en première intention, on utilise un fichier aisément disponible, celui de l’historique des populations depuis 1876, les données étant agrégées à la géométrie administrative au 1er janvier 2021 (ce qui simplifie grandement tous les appariements).

Source : https://www.insee.fr/fr/statistiques/3698339.

# download.file("https://www.insee.fr/fr/statistiques/fichier/3698339/base-pop-historiques-1876-2019.xlsx", "data-raw/stats_insee/historique_pop_1876-2019.xlsx")
# hist_pop <- read_xlsx( "data-raw/stats_insee/historique_pop_1876-2019.xlsx", skip = 5)
# download.file("https://www.insee.fr/fr/statistiques/fichier/3698339/base-pop-historiques-1876-2020.xlsx", "data-raw/stats_insee/historique_pop_1876-2020.xlsx")
hist_pop <- read_xlsx( "data-raw/stats_insee/historique_pop_1876-2020.xlsx", skip = 5)

ensembl_etud <- "France entière"

# Appariement avec les données des communes nouvelles
load("data/refdata.Rdata")


hist_pop <- merge(hist_pop, df_new, by.x = "CODGEO", by.y = "CODGEO_new")

hist_pop_CN <- subset (hist_pop, hist_pop$COM_NOUV == "OUI")
nbr_CN <- nrow(hist_pop_CN)
# Si on veut supprimer les communes plus grandes que la plus grande commune nouvelle
max_pop_CN <- max(hist_pop_CN$PMUN20)
hist_pop <- subset (hist_pop, hist_pop$PMUN20 <= max_pop_CN)
hist_pop_Nfus <- subset (hist_pop, hist_pop$COM_NOUV == "NON")
nbr_Nfus <- nrow(hist_pop_Nfus)
  
# On fait la somme de la population de l'ensemble des communes françaises
somme <- as.data.frame(lapply(hist_pop[5:38], sum, na.rm = TRUE))
# On fait la somme de la population des communes nouvelles
somme_CN <- as.data.frame(lapply(hist_pop_CN[5:38], sum, na.rm = TRUE))
# On fait la somme de la population des communes n'ayant pas fusionné
somme_Nfus <- as.data.frame(lapply(hist_pop_Nfus[5:38], sum, na.rm = TRUE))
# On combine les données
sommes <- rbind (somme, somme_CN, somme_Nfus)
# Création d'un tableau pour calculer les bases 100 en fonction du recensement le plus récent.
sommes_base_100 <- sommes
# Création d'un tableau pour calculer les bases 100 en fonction du rrecensement le plus ancien.
sommes_base_100_deb <- sommes

colnames(sommes) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
sommes$ID <- c("France", "CN", "Nfus")


# On change le format du tableau pour faciliter la mise en graphique
pr_graph <- melt(sommes, id.vars = "ID")
colnames(pr_graph) <- c("ID", "Annee", "Pop")
pr_graph$Annee <- as.character(pr_graph$Annee)
pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
  scale_y_continuous(trans = 'log10') + labs(title="Évolution de la population des communes", subtitle="NB : Les communes plus peuplées que la plus peuplée\ndes communes nouvelles ont été retirées.", x="Année", y = "Population")

# Graphique qui est peu aisé à lire

# Calcul de la base 100 à partir du recensement millésimé 2020
sommes_base_100 <- 100 * sommes_base_100 / sommes_base_100$PMUN20
colnames(sommes_base_100) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
sommes_base_100$ID <- c("France", "CN", "Nfus")
pr_graph <- melt(sommes_base_100, id.vars = "ID")
colnames(pr_graph) <- c("ID", "Annee", "Pop")
pr_graph$Annee <- as.character(pr_graph$Annee)
pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
  scale_y_continuous(trans = 'log10') + labs(title="Évolution de la population des communes", subtitle="NB : Les communes plus peuplées que la plus peuplée\ndes communes nouvelles ont été retirées.", x="Année", y = "Population (base 100 = 2020)")

# Calcul de la base 100 à partir du recensement le plus ancien (1876)
sommes_base_100_deb <- 100 * sommes_base_100_deb / sommes_base_100_deb$PTOT1876
colnames(sommes_base_100_deb) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
sommes_base_100_deb$ID <- c("France", "CN", "Nfus")
pr_graph <- melt(sommes_base_100_deb, id.vars = "ID")
colnames(pr_graph) <- c("ID", "Annee", "Pop")
pr_graph$Annee <- as.character(pr_graph$Annee)
pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
  scale_y_continuous(trans = 'log10') + labs(title="Évolution de la population des communes", subtitle="NB : Les communes plus peuplées que la plus peuplée\ndes communes nouvelles ont été retirées.", x="Année", y = "Population (base 100 = 1876)")

  # Calcul données moyennes
  moy <- as.data.frame(lapply(hist_pop[5:38], mean, na.rm = TRUE))
  moy_CN <- as.data.frame(lapply(hist_pop_CN[5:38], mean, na.rm = TRUE))
  moy_Nfus <- as.data.frame(lapply(hist_pop_Nfus[5:38], mean, na.rm = TRUE))
  moyennes <- rbind (moy, moy_CN, moy_Nfus)

  colnames(moyennes) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  moyennes$ID <- c("France", "CN", "Nfus")

  pr_graph <- melt(moyennes, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    scale_y_continuous(trans = 'log10') +
    labs(title = paste0("Évolution de la population moyenne des communes [", ensembl_etud, "]"),
         x="Année", y = "Population moyenne") +
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), ensembl_etud, paste0("Nfus (", nbr_Nfus,")")))
  print(graph)

# Représenter les moyennes ne rend pas les choses plus simples car les communes nouvelles ont une moyenne bien plus importante que les autres communes françaises

Les premiers résultats de cette analyse exploratoire sont surprenants au sens où c’est la première fois que les communes nouvelles se distinguent si clairement des communes n’ayant pas fusionné.

L’analyse du graphique montre que les communes nouvelles qui se sont créées ont connu, dans l’ensemble, une forte perte démographique durant la période 1880-1920 mais elles sont aujourd’hui, comme l’ensemble des communes françaises, dans une croissance démographique.

On observe un décrochage qui se produit au cours du XXe siècle en ce qui concerne les communes nouvelles. Elles perdent beaucoup de population entre 1880 et 1920, alors que les autres communes pas tant que cela. À partir des années 1920 les communes n’ayant pas fusionné connaissent une croissance qui s’accélèrent dans les années 1960 tandis que les communes nouvelles, qui voient leur population augmenter plus tardivement, connaissent une croissance plus faible.

À noter qu’ici, on a retiré les communes ayant une taille en 2020 supérieure à la plus grande des communes nouvelles. Donc la très faible croissance démographique de l’ensemble de la France entre 1880 et 1960 s’explique sans doute principalement par le phénomène de l’exode rural vers les communes aujourd’hui très peuplées, phénomène du coup masqué par la suppression de ces communes aujourd’hui très peuplées.

Sans retirer les communes les plus peuplées

Réalisation des mêmes graphiques mais sans retirer les communes plus peuplées que la plus grande des communes nouvelles.

hist_pop <- read_xlsx( "data-raw/stats_insee/historique_pop_1876-2020.xlsx", skip = 5)

# Appariement avec les données des communes nouvelles
load("data/refdata.Rdata")


hist_pop <- merge(hist_pop, df_new, by.x = "CODGEO", by.y = "CODGEO_new", all.x = TRUE)

hist_pop_CN <- subset (hist_pop, hist_pop$COM_NOUV == "OUI")
hist_pop_Nfus <- subset (hist_pop, hist_pop$COM_NOUV == "NON")

somme <- as.data.frame(lapply(hist_pop[5:38], sum, na.rm = TRUE))
somme_CN <- as.data.frame(lapply(hist_pop_CN[5:38], sum, na.rm = TRUE))
somme_Nfus <- as.data.frame(lapply(hist_pop_Nfus[5:38], sum, na.rm = TRUE))
sommes <- rbind (somme, somme_CN, somme_Nfus)
sommes_base_100 <- sommes
sommes_base_100_deb <- sommes

colnames(sommes) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
sommes$ID <- c("France", "CN", "Nfus")

pr_graph <- melt(sommes, id.vars = "ID")
colnames(pr_graph) <- c("ID", "Annee", "Pop")
pr_graph$Annee <- as.character(pr_graph$Annee)
pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
  scale_y_continuous(trans = 'log10') + labs(title="Évolution de la population des communes", x="Année", y = "Population")

sommes_base_100 <- 100 * sommes_base_100 / sommes_base_100$PMUN20
colnames(sommes_base_100) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
sommes_base_100$ID <- c("France", "CN", "Nfus")
pr_graph <- melt(sommes_base_100, id.vars = "ID")
colnames(pr_graph) <- c("ID", "Annee", "Pop")
pr_graph$Annee <- as.character(pr_graph$Annee)
pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
  labs(title="Évolution de la population des communes en base 100 (2020)", x="Année", y = "Population (base 100 = 2020)")

sommes_base_100_deb <- 100 * sommes_base_100_deb / sommes_base_100_deb$PTOT1876
colnames(sommes_base_100_deb) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
sommes_base_100_deb$ID <- c("France", "CN", "Nfus")
pr_graph <- melt(sommes_base_100_deb, id.vars = "ID")
colnames(pr_graph) <- c("ID", "Annee", "Pop")
pr_graph$Annee <- as.character(pr_graph$Annee)
pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
  labs(title="Évolution de la population des communes en base 100 (1876)", x="Année", y = "Population (base 100 = 1876)")

Différenciation par ZAU

On poursuit l’analyse en utilisant les mêmes données mais en différenciant en fonction du zonage en aire urbaine. En effet, on fait l’hypothèse que pour certaines catégories les évolutions démographiques sont similaires entre les communes nouvelles et les communes n’ayant pas fusionné mais que dans certais cas (on peut penser au petits pôles), les évolutions ont été différentes.

hist_pop <- read_xlsx( "data-raw/stats_insee/historique_pop_1876-2020.xlsx", skip = 5)

# Appariement avec les données des communes nouvelles
load("data/refdata.Rdata")

hist_pop <- merge(hist_pop, df_new, by.x = "CODGEO", by.y = "CODGEO_new")

# On rajoute un champs désignant la catégorie du zonage en aire urbaine de la commune en 2011 (donc, pour les communes fusionnantes, la catégorie de la commune devenue chef-lie)
hist_pop <- merge(hist_pop, df2011[, c("CODGEO", "CATAEU2010")], by = "CODGEO", all.x = TRUE, all.y = FALSE)

colnames(hist_pop)[ncol(hist_pop)] <- "CATAEU2011"

class(hist_pop$CATAEU2011)
## [1] "factor"
# zonage <- levels(hist_pop$CATAEU2011)[1]

# Pour lisibilité données
descr_CATAEU <- 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")
labels_CATAEU <- as.data.frame(cbind(levels(hist_pop$CATAEU2011), descr_CATAEU))


for (zonage in levels(hist_pop$CATAEU2011)) {
  nom_zonage <- labels_CATAEU$descr_CATAEU[which(labels_CATAEU$V1 == zonage)]
  hist_pop_zonage <- subset (hist_pop, hist_pop$CATAEU2011 == zonage)
  hist_pop_CN <- subset (hist_pop_zonage, hist_pop_zonage$COM_NOUV == "OUI")
  nbr_CN <- nrow(hist_pop_CN)
  hist_pop_Nfus <- subset (hist_pop_zonage, hist_pop_zonage$COM_NOUV == "NON")
  
  somme <- as.data.frame(lapply(hist_pop_zonage[5:38], sum, na.rm = TRUE))
  somme_CN <- as.data.frame(lapply(hist_pop_CN[5:38], sum, na.rm = TRUE))
  somme_Nfus <- as.data.frame(lapply(hist_pop_Nfus[5:38], sum, na.rm = TRUE))
  sommes <- rbind (somme, somme_CN, somme_Nfus)
  sommes_base_100 <- sommes

  colnames(sommes) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  sommes$ID <- c("France", "CN", "Nfus")

  pr_graph <- melt(sommes, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    scale_y_continuous(trans = 'log10') +
    labs(title = paste0("Évolution de la population des communes\nCATAEU = ", nom_zonage, " (", zonage, ")"),
         x="Année", y = "Population") + 
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), "France entière", "Nfus"))
  print(graph)


  sommes_base_100 <- 100 * sommes_base_100 / sommes_base_100$PMUN20
  colnames(sommes_base_100) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  sommes_base_100$ID <- c("France", "CN", "Nfus")
  pr_graph <- melt(sommes_base_100, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    labs(title = paste0("Évolution de la population des communes en base 100\nCATAEU = ", nom_zonage, " (", zonage, ")"),
         x="Année", y = "Population (base 100 = 2020)") +
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), "France entière", "Nfus"))
  print(graph)
  
  assign(paste0("graph_evol_CATAEU", zonage), graph)

}

analyse <- c("Pas de différence sensible.",
          "Les territoires des communes nouvelles ont connu une perte de population un peu plus importante car elles étaient davantage peuplées dans les années 1880.",
          "Pas de différence sensible.",
          "Les territoires des communes nouvelles étaient, proportionnellement à leur taille d'aujourd'hui, moins peuplées auparavant, donc plutôt dans une dynamique de croissance plus forte.",
          "Pas de différence sensible.",
          "Différence nette : les communes nouvelles ont une taille aujourd'hui proche de celle qu'elles avaient au début du XXe siècle alors que les communes qui n'ont pas fusionné étaient vraiment plus petites.",
          "Les communes nouvelles ont connu une décroissance plus faible que les communes qui n'ont pas fusionné.", 
          "Pas de différence sensible.",
          "Les communes nouvelles ont connu une décroissance plus faible que les communes qui n'ont pas fusionné.")

labels_CATAEU$analyse <- analyse

kable(labels_CATAEU)
V1 descr_CATAEU analyse
111 Commune appartenant à un grand pôle Pas de différence sensible.
112 Commune appartenant à la couronne d’un grand pôle Les territoires des communes nouvelles ont connu une perte de population un peu plus importante car elles étaient davantage peuplées dans les années 1880.
120 Commune multipolarisée des grandes aires urbaines Pas de différence sensible.
211 Commune appartenant à un moyen pôle Les territoires des communes nouvelles étaient, proportionnellement à leur taille d’aujourd’hui, moins peuplées auparavant, donc plutôt dans une dynamique de croissance plus forte.
212 Commune appartenant à la couronne d’un moyen pôle Pas de différence sensible.
221 Commune appartenant à un petit pôle Différence nette : les communes nouvelles ont une taille aujourd’hui proche de celle qu’elles avaient au début du XXe siècle alors que les communes qui n’ont pas fusionné étaient vraiment plus petites.
222 Commune appartenant à la couronne d’un petit pôle Les communes nouvelles ont connu une décroissance plus faible que les communes qui n’ont pas fusionné.
300 Autre commune multipolarisée Pas de différence sensible.
400 Commune isolée hors influence des pôles Les communes nouvelles ont connu une décroissance plus faible que les communes qui n’ont pas fusionné.
plot_grid(graph_evol_CATAEU111,
          graph_evol_CATAEU112,
          graph_evol_CATAEU120,
          graph_evol_CATAEU211,
          graph_evol_CATAEU212,
          graph_evol_CATAEU221,
          graph_evol_CATAEU222,
          graph_evol_CATAEU300,
          graph_evol_CATAEU400)

# Pour afficher plusieurs vignettes (par(mfrow = c(3,3)) ne fonctionne pas)
# for (zonage in levels(hist_pop$CATAEU2011)) {
#   print(get(paste0("graph_evol_CATAEU", zonage)))
#   }

# par(mfrow = c(1,1))

Différenciation par ZAAV

On différencie ici en fonction des bases d’aires urbaines, soit les zonages à la géographie du 1er janvier 2021.

Pour la France entière

ensembl_etud <- "France entière"

hist_pop <- read_xlsx( "data-raw/stats_insee/historique_pop_1876-2020.xlsx", skip = 5)

# Appariement avec les données des communes nouvelles
load("data/refdata.Rdata")

hist_pop <- merge(hist_pop, df_new[, c("CODGEO_new", "COM_NOUV")], by.x = "CODGEO", by.y = "CODGEO_new")

# Import de la table d'appartenance pour l'année 2021
appart <- data.frame(read_excel("data-raw/stats_insee/table-appartenance-geo-communes-21_v2022-09-27.xlsx",  sheet = "COM", skip = 5))

hist_pop <- merge(hist_pop, appart[, c("CODGEO", "CATEAAV2020")], by = "CODGEO")
class(hist_pop$CATEAAV2020)
## [1] "character"
hist_pop$CATEAAV2020 <- as.factor(hist_pop$CATEAAV2020)
levels(hist_pop$CATEAAV2020)
## [1] "11" "12" "13" "20" "30"
descr_CATEAAV <- c("Commune-centre", "Autre commune du pôle principal", "Commune d'un pôle secondaire", "Commune de la couronne", "Commune hors attraction des villes")
labels_CATEAAV <- as.data.frame(cbind(levels(hist_pop$CATEAAV2020), descr_CATEAAV))

zonage <- levels(hist_pop$CATEAAV2020)[1]

for (zonage in levels(hist_pop$CATEAAV2020)) {
  # Sélection données
  nom_zonage <- labels_CATEAAV$descr_CATEAAV[which(labels_CATEAAV$V1 == zonage)]
  hist_pop_zonage <- subset (hist_pop, hist_pop$CATEAAV2020 == zonage)
  hist_pop_CN <- subset (hist_pop_zonage, hist_pop_zonage$COM_NOUV == "OUI")
  nbr_CN <- nrow(hist_pop_CN)
  hist_pop_Nfus <- subset (hist_pop_zonage, hist_pop_zonage$COM_NOUV == "NON")
  nbr_Nfus <- nrow(hist_pop_Nfus)
  
  # Calcul des sommes
  somme <- as.data.frame(lapply(hist_pop_zonage[5:38], sum, na.rm = TRUE))
  somme_CN <- as.data.frame(lapply(hist_pop_CN[5:38], sum, na.rm = TRUE))
  somme_Nfus <- as.data.frame(lapply(hist_pop_Nfus[5:38], sum, na.rm = TRUE))
  sommes <- rbind (somme, somme_CN, somme_Nfus)
  sommes_base_100 <- sommes
  sommes_base_100_deb <- sommes

  # Préparation données sommes pour graphiques
  colnames(sommes) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  sommes$ID <- c("France", "CN", "Nfus")

  # Graphiques sommes
  pr_graph <- melt(sommes, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    labs(title = paste0("Évolution de la population des communes\nCATEAAV = ", nom_zonage, " (", zonage, ") [", ensembl_etud, "]"),
         x="Année", y = "Population") +
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), ensembl_etud, paste0("Nfus (", nbr_Nfus,")"))) +
    scale_y_continuous(trans = 'log10')
  print(graph)

  # Préparation données sommes base 100 (2020) pour graphiques
  sommes_base_100 <- 100 * sommes_base_100 / sommes_base_100$PMUN20
  colnames(sommes_base_100) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  sommes_base_100$ID <- c("France", "CN", "Nfus")
  pr_graph <- melt(sommes_base_100, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  # Graphiques sommes base 100 (2020)
  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    labs(#title = paste0("Évolution de la population des communes en base 100 (2020)\nCATEAAV = ", nom_zonage, " (", zonage, ") [France entière]"),
         subtitle = paste0("CATEAAV = ", nom_zonage, " (", zonage, ") [", ensembl_etud, "]"),
         x="Année", y = "population des communes (base 100 = 2020)") +
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), ensembl_etud, paste0("Nfus (", nbr_Nfus,")")))
  print(graph)
  
  assign(paste0("graph_evol_base100_2020_CATEAAV", zonage), graph)
 
    # Préparation données sommes base 100 (1876) pour graphiques
  sommes_base_100_deb <- 100 * sommes_base_100_deb / sommes_base_100_deb$PTOT1876
  colnames(sommes_base_100_deb) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  sommes_base_100_deb$ID <- c("France", "CN", "Nfus")
  pr_graph <- melt(sommes_base_100_deb, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  # Graphiques sommes base 100 (1876)
  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    labs(#title = paste0("Évolution de la population des communes en base 100 (1876)\nCATEAAV = ", nom_zonage, " (", zonage, ") [France entière]"),
         subtitle = paste0("CATEAAV = ", nom_zonage, " (", zonage, ") [", ensembl_etud, "]"),
         x="Année", y = "population des communes (base 100 = 1876)") +
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), ensembl_etud, paste0("Nfus (", nbr_Nfus,")")))
  print(graph)
  
  assign(paste0("graph_evol_base100_1876_CATEAAV", zonage), graph)

   
  # Calcul données moyennes
  moy <- as.data.frame(lapply(hist_pop_zonage[5:38], mean, na.rm = TRUE))
  moy_CN <- as.data.frame(lapply(hist_pop_CN[5:38], mean, na.rm = TRUE))
  moy_Nfus <- as.data.frame(lapply(hist_pop_Nfus[5:38], mean, na.rm = TRUE))
  moyennes <- rbind (moy, moy_CN, moy_Nfus)

  colnames(moyennes) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  moyennes$ID <- c("France", "CN", "Nfus")

  pr_graph <- melt(moyennes, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    scale_y_continuous(trans = 'log10') +
    labs(title = paste0("Évolution de la population moyenne des communes\nCATEAAV = ", nom_zonage, " (", zonage, ") [", ensembl_etud, "]"),
         x="Année", y = "Population moyenne") +
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), ensembl_etud, paste0("Nfus (", nbr_Nfus,")")))
  print(graph)
  
  
}

## Warning: Transformation introduced infinite values in continuous y-axis

## Warning: Removed 34 rows containing missing values (`geom_line()`).

## Warning: Removed 34 rows containing missing values (`geom_line()`).

## Warning: Removed 34 rows containing missing values (`geom_line()`).

analyse_base100_2020 <- c("Les communes nouvelles catégorisées en 2020 comme des communes centres étaient, par rapport aux autres communes centres de poids similaire en 2020, bien plus peuplées à la fin du XIXe siècle. Alors que les autres communes centres ont plutôt connu une croissance démographique depuis la fin du XIXe siècle, il faut attendre les années 1920 pour que les communes nouvelles en connaissent une. À poids démographique égal, ces espaces ont donc perdu du poids démographique relatif.",
             "Les communes nouvelles ont connu une croissance moins importante que les autres communes françaises de ce type. Mais faible nombre de communes nouvelles.",
             "Pas de communes nouvelles.",
             "Les communes nouvelles avaient une taille plus proche de celles qu'elles ont aujourd'hui. En revanche, leur trajectoire démographique a été plus mouvementée. On observe d'abord une forte diminution durant les années 1880-1920, puis une baisse bien plus limitée jusque dans les années 1960-1970 (alors que les autres communes amorcent une croissance). À partir de 1960 les communes n'ayant pas fusionné connaissent une croissance bien plus rapide et plus forte que les communes nouvelles, qui voient leur population augmenter plus tardivement et plus lentement.", 
             "Dynamiques proches, même si les communes nouvelles ont davantage perdues que les autres jusqu'aux années 1940-1960 et ont moins perdu ou davantage gagné après.")

labels_CATEAAV$analyse_base100_2020 <- analyse_base100_2020

kable(labels_CATEAAV)
V1 descr_CATEAAV analyse_base100_2020
11 Commune-centre Les communes nouvelles catégorisées en 2020 comme des communes centres étaient, par rapport aux autres communes centres de poids similaire en 2020, bien plus peuplées à la fin du XIXe siècle. Alors que les autres communes centres ont plutôt connu une croissance démographique depuis la fin du XIXe siècle, il faut attendre les années 1920 pour que les communes nouvelles en connaissent une. À poids démographique égal, ces espaces ont donc perdu du poids démographique relatif.
12 Autre commune du pôle principal Les communes nouvelles ont connu une croissance moins importante que les autres communes françaises de ce type. Mais faible nombre de communes nouvelles.
13 Commune d’un pôle secondaire Pas de communes nouvelles.
20 Commune de la couronne Les communes nouvelles avaient une taille plus proche de celles qu’elles ont aujourd’hui. En revanche, leur trajectoire démographique a été plus mouvementée. On observe d’abord une forte diminution durant les années 1880-1920, puis une baisse bien plus limitée jusque dans les années 1960-1970 (alors que les autres communes amorcent une croissance). À partir de 1960 les communes n’ayant pas fusionné connaissent une croissance bien plus rapide et plus forte que les communes nouvelles, qui voient leur population augmenter plus tardivement et plus lentement.
30 Commune hors attraction des villes Dynamiques proches, même si les communes nouvelles ont davantage perdues que les autres jusqu’aux années 1940-1960 et ont moins perdu ou davantage gagné après.
# Pour afficher plusieurs vignettes (par(mfrow = c(3,3)) ne fonctionne pas)
# NB : On retire CATEAAV13 car pas de communes nouvelles
plot_grid(graph_evol_base100_1876_CATEAAV11,
          graph_evol_base100_1876_CATEAAV12,
          graph_evol_base100_1876_CATEAAV20,
          graph_evol_base100_1876_CATEAAV30)

plot_grid(graph_evol_base100_2020_CATEAAV11,
          graph_evol_base100_2020_CATEAAV12,
          graph_evol_base100_2020_CATEAAV20,
          graph_evol_base100_2020_CATEAAV30)

# for (zonage in levels(hist_pop$CATAEU2011)) {
#   print(get(paste0("graph_evol_CATAEU", zonage)))
#   }

# par(mfrow = c(1,1))

L’analyse des données par zonage est rendue compliquée par le fait qu’à type de zonage identique, les communes nouvelles ont une population bien plus importante que les communes n’ayant pas fusionné.

Pour la différence de zonage : On garde AAV en première intention, quitte à dire qu’on a regardé le ZAU.

Ce premier travail est prometteur sur l’étude qui pourrait être fait des communes nouvelles en prenant en compte les données démographiques sur le temps long.

Les études démographiques utilisant les méthodes d’analyse spatiale proposent parfois d’approfondir cela en regardant les soldes démographiques et migratoires (Oliveau and Doignon (2016), Doignon (2016)). Pour l’instant, ces données ne sont disponibles qu’à partir de 1968, or ce n’est pas la période où les communes nouvelles et les autres communes se différencient le plus, cela n’est donc a priori pas le plus utile.

Que Normandie

En ne sélectionnant que la Normandie.

ensembl_etud <- "Normandie"

hist_pop <- read_xlsx( "data-raw/stats_insee/historique_pop_1876-2020.xlsx", skip = 5)

# Appariement avec les données des communes nouvelles
load("data/refdata.Rdata")

hist_pop <- merge(hist_pop, df_new[, c("CODGEO_new", "COM_NOUV")], by.x = "CODGEO", by.y = "CODGEO_new")

# Import de la table d'appartenance pour l'année 2021
appart <- data.frame(read_excel("data-raw/stats_insee/table-appartenance-geo-communes-21_v2022-09-27.xlsx",  sheet = "COM", skip = 5))

hist_pop <- merge(hist_pop, appart[, c("CODGEO", "CATEAAV2020")], by = "CODGEO")

# On ne sélectionne que la Normandie
hist_pop <- subset(hist_pop, REG == "28")

class(hist_pop$CATEAAV2020)
## [1] "character"
hist_pop$CATEAAV2020 <- as.factor(hist_pop$CATEAAV2020)
levels(hist_pop$CATEAAV2020)
## [1] "11" "12" "20" "30"
descr_CATEAAV <- c("Commune-centre", "Autre commune du pôle principal", "Commune d'un pôle secondaire", "Commune de la couronne", "Commune hors attraction des villes")
labels_CATEAAV <- as.data.frame(cbind(levels(hist_pop$CATEAAV2020), descr_CATEAAV))
## Warning in cbind(levels(hist_pop$CATEAAV2020), descr_CATEAAV): number of rows of
## result is not a multiple of vector length (arg 1)
zonage <- levels(hist_pop$CATEAAV2020)[1]

for (zonage in levels(hist_pop$CATEAAV2020)) {
  # Sélection données
  nom_zonage <- labels_CATEAAV$descr_CATEAAV[which(labels_CATEAAV$V1 == zonage)]
  hist_pop_zonage <- subset (hist_pop, hist_pop$CATEAAV2020 == zonage)
  hist_pop_CN <- subset (hist_pop_zonage, hist_pop_zonage$COM_NOUV == "OUI")
  nbr_CN <- nrow(hist_pop_CN)
  hist_pop_Nfus <- subset (hist_pop_zonage, hist_pop_zonage$COM_NOUV == "NON")
  nbr_Nfus <- nrow(hist_pop_Nfus)
  
  # Calcul des sommes
  somme <- as.data.frame(lapply(hist_pop_zonage[5:38], sum, na.rm = TRUE))
  somme_CN <- as.data.frame(lapply(hist_pop_CN[5:38], sum, na.rm = TRUE))
  somme_Nfus <- as.data.frame(lapply(hist_pop_Nfus[5:38], sum, na.rm = TRUE))
  sommes <- rbind (somme, somme_CN, somme_Nfus)
  sommes_base_100 <- sommes
  sommes_base_100_deb <- sommes

  # Préparation données sommes pour graphiques
  colnames(sommes) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  sommes$ID <- c("France", "CN", "Nfus")

  # Graphiques sommes
  pr_graph <- melt(sommes, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    labs(title = paste0("Évolution de la population des communes\nCATEAAV = ", nom_zonage, " (", zonage, ") [", ensembl_etud, "]"),
         x="Année", y = "Population") +
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), ensembl_etud, paste0("Nfus (", nbr_Nfus,")"))) +
    scale_y_continuous(trans = 'log10')
  print(graph)

  # Préparation données sommes base 100 (2020) pour graphiques
  sommes_base_100 <- 100 * sommes_base_100 / sommes_base_100$PMUN20
  colnames(sommes_base_100) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  sommes_base_100$ID <- c("France", "CN", "Nfus")
  pr_graph <- melt(sommes_base_100, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  # Graphiques sommes base 100 (2020)
  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    labs(#title = paste0("Évolution de la population des communes en base 100 (2020)\nCATEAAV = ", nom_zonage, " (", zonage, ") [France entière]"),
         subtitle = paste0("CATEAAV = ", nom_zonage, " (", zonage, ") [", ensembl_etud, "]"),
         x="Année", y = "population des communes (base 100 = 2020)") +
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), ensembl_etud, paste0("Nfus (", nbr_Nfus,")")))
  print(graph)
  
  assign(paste0("graph_evol_base100_2020_CATEAAV", zonage), graph)
 
    # Préparation données sommes base 100 (1876) pour graphiques
  sommes_base_100_deb <- 100 * sommes_base_100_deb / sommes_base_100_deb$PTOT1876
  colnames(sommes_base_100_deb) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  sommes_base_100_deb$ID <- c("France", "CN", "Nfus")
  pr_graph <- melt(sommes_base_100_deb, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  # Graphiques sommes base 100 (1876)
  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    labs(#title = paste0("Évolution de la population des communes en base 100 (1876)\nCATEAAV = ", nom_zonage, " (", zonage, ") [France entière]"),
         subtitle = paste0("CATEAAV = ", nom_zonage, " (", zonage, ") [", ensembl_etud, "]"),
         x="Année", y = "population des communes (base 100 = 1876)") +
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), ensembl_etud, paste0("Nfus (", nbr_Nfus,")")))
  print(graph)
  
  assign(paste0("graph_evol_base100_1876_CATEAAV", zonage), graph)

   
  # Calcul données moyennes
  moy <- as.data.frame(lapply(hist_pop_zonage[5:38], mean, na.rm = TRUE))
  moy_CN <- as.data.frame(lapply(hist_pop_CN[5:38], mean, na.rm = TRUE))
  moy_Nfus <- as.data.frame(lapply(hist_pop_Nfus[5:38], mean, na.rm = TRUE))
  moyennes <- rbind (moy, moy_CN, moy_Nfus)

  colnames(moyennes) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  moyennes$ID <- c("France", "CN", "Nfus")

  pr_graph <- melt(moyennes, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    scale_y_continuous(trans = 'log10') +
    labs(title = paste0("Évolution de la population des communes moyenne\nCATEAAV = ", nom_zonage, " (", zonage, ") [", ensembl_etud, "]"),
         x="Année", y = "Population moyenne") +
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), ensembl_etud, paste0("Nfus (", nbr_Nfus,")")))
  print(graph)
  
  
}

analyse_base100_2020 <- c("Les communes nouvelles normandes se distinguent des autres communes normandes de manière similaire au décrochage observé pour la France entière.",
             "Trop peu de communes nouvelles.",
             "Pas de communes nouvelles.",
             "Les communes nouvelles normandes se distinguent des autres communes normandes de manière similaire au décrochage observé pour la France entière.", 
             "Les communes nouvelles normandes se distinguent des autres communes normandes de manière similaire au décrochage observé pour la France entière.")

labels_CATEAAV$analyse_base100_2020 <- analyse_base100_2020

kable(labels_CATEAAV)
V1 descr_CATEAAV analyse_base100_2020
11 Commune-centre Les communes nouvelles normandes se distinguent des autres communes normandes de manière similaire au décrochage observé pour la France entière.
12 Autre commune du pôle principal Trop peu de communes nouvelles.
20 Commune d’un pôle secondaire Pas de communes nouvelles.
30 Commune de la couronne Les communes nouvelles normandes se distinguent des autres communes normandes de manière similaire au décrochage observé pour la France entière.
11 Commune hors attraction des villes Les communes nouvelles normandes se distinguent des autres communes normandes de manière similaire au décrochage observé pour la France entière.
# Pour afficher plusieurs vignettes (par(mfrow = c(3,3)) ne fonctionne pas)
# NB : On retire CATEAAV13 car pas de communes nouvelles
plot_grid(graph_evol_base100_1876_CATEAAV11,
          graph_evol_base100_1876_CATEAAV12,
          graph_evol_base100_1876_CATEAAV20,
          graph_evol_base100_1876_CATEAAV30)

plot_grid(graph_evol_base100_2020_CATEAAV11,
          graph_evol_base100_2020_CATEAAV12,
          graph_evol_base100_2020_CATEAAV20,
          graph_evol_base100_2020_CATEAAV30)

# for (zonage in levels(hist_pop$CATAEU2011)) {
#   print(get(paste0("graph_evol_CATAEU", zonage)))
#   }

# par(mfrow = c(1,1))

Que Maine-et-Loire

En ne sélectionnant que le Maine-et-Loire.

ensembl_etud <- "Maine-et-Loire"

hist_pop <- read_xlsx( "data-raw/stats_insee/historique_pop_1876-2020.xlsx", skip = 5)

# Appariement avec les données des communes nouvelles
load("data/refdata.Rdata")

hist_pop <- merge(hist_pop, df_new[, c("CODGEO_new", "COM_NOUV")], by.x = "CODGEO", by.y = "CODGEO_new")

# Import de la table d'appartenance pour l'année 2021
appart <- data.frame(read_excel("data-raw/stats_insee/table-appartenance-geo-communes-21_v2022-09-27.xlsx",  sheet = "COM", skip = 5))

hist_pop <- merge(hist_pop, appart[, c("CODGEO", "CATEAAV2020")], by = "CODGEO")

# On ne sélectionne que la Normandie
hist_pop <- subset(hist_pop, DEP == "49")

class(hist_pop$CATEAAV2020)
## [1] "character"
hist_pop$CATEAAV2020 <- as.factor(hist_pop$CATEAAV2020)
levels(hist_pop$CATEAAV2020)
## [1] "11" "12" "20" "30"
descr_CATEAAV <- c("Commune-centre", "Autre commune du pôle principal", "Commune d'un pôle secondaire", "Commune de la couronne", "Commune hors attraction des villes")
labels_CATEAAV <- as.data.frame(cbind(levels(hist_pop$CATEAAV2020), descr_CATEAAV))
## Warning in cbind(levels(hist_pop$CATEAAV2020), descr_CATEAAV): number of rows of
## result is not a multiple of vector length (arg 1)
zonage <- levels(hist_pop$CATEAAV2020)[1]

for (zonage in levels(hist_pop$CATEAAV2020)) {
  # Sélection données
  nom_zonage <- labels_CATEAAV$descr_CATEAAV[which(labels_CATEAAV$V1 == zonage)]
  hist_pop_zonage <- subset (hist_pop, hist_pop$CATEAAV2020 == zonage)
  hist_pop_CN <- subset (hist_pop_zonage, hist_pop_zonage$COM_NOUV == "OUI")
  nbr_CN <- nrow(hist_pop_CN)
  hist_pop_Nfus <- subset (hist_pop_zonage, hist_pop_zonage$COM_NOUV == "NON")
  nbr_Nfus <- nrow(hist_pop_Nfus)
  
  # Calcul des sommes
  somme <- as.data.frame(lapply(hist_pop_zonage[5:38], sum, na.rm = TRUE))
  somme_CN <- as.data.frame(lapply(hist_pop_CN[5:38], sum, na.rm = TRUE))
  somme_Nfus <- as.data.frame(lapply(hist_pop_Nfus[5:38], sum, na.rm = TRUE))
  sommes <- rbind (somme, somme_CN, somme_Nfus)
  sommes_base_100 <- sommes
  sommes_base_100_deb <- sommes

  # Préparation données sommes pour graphiques
  colnames(sommes) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  sommes$ID <- c("France", "CN", "Nfus")

  # Graphiques sommes
  pr_graph <- melt(sommes, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    labs(title = paste0("Évolution de la population des communes\nCATEAAV = ", nom_zonage, " (", zonage, ") [", ensembl_etud, "]"),
         x="Année", y = "Population") +
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), ensembl_etud, paste0("Nfus (", nbr_Nfus,")"))) +
    scale_y_continuous(trans = 'log10')
  print(graph)

  # Préparation données sommes base 100 (2020) pour graphiques
  sommes_base_100 <- 100 * sommes_base_100 / sommes_base_100$PMUN20
  colnames(sommes_base_100) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  sommes_base_100$ID <- c("France", "CN", "Nfus")
  pr_graph <- melt(sommes_base_100, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  # Graphiques sommes base 100 (2020)
  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    labs(#title = paste0("Évolution de la population des communes en base 100 (2020)\nCATEAAV = ", nom_zonage, " (", zonage, ") [France entière]"),
         subtitle = paste0("CATEAAV = ", nom_zonage, " (", zonage, ") [", ensembl_etud, "]"),
         x="Année", y = "population des communes (base 100 = 2020)") +
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), ensembl_etud, paste0("Nfus (", nbr_Nfus,")")))
  print(graph)
  
  assign(paste0("graph_evol_base100_2020_CATEAAV", zonage), graph)
 
    # Préparation données sommes base 100 (1876) pour graphiques
  sommes_base_100_deb <- 100 * sommes_base_100_deb / sommes_base_100_deb$PTOT1876
  colnames(sommes_base_100_deb) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  sommes_base_100_deb$ID <- c("France", "CN", "Nfus")
  pr_graph <- melt(sommes_base_100_deb, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  # Graphiques sommes base 100 (1876)
  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    labs(#title = paste0("Évolution de la population des communes en base 100 (1876)\nCATEAAV = ", nom_zonage, " (", zonage, ") [France entière]"),
         subtitle = paste0("CATEAAV = ", nom_zonage, " (", zonage, ") [", ensembl_etud, "]"),
         x="Année", y = "population des communes (base 100 = 1876)") +
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), ensembl_etud, paste0("Nfus (", nbr_Nfus,")")))
  print(graph)
  
  assign(paste0("graph_evol_base100_1876_CATEAAV", zonage), graph)

   
  # Calcul données moyennes
  moy <- as.data.frame(lapply(hist_pop_zonage[5:38], mean, na.rm = TRUE))
  moy_CN <- as.data.frame(lapply(hist_pop_CN[5:38], mean, na.rm = TRUE))
  moy_Nfus <- as.data.frame(lapply(hist_pop_Nfus[5:38], mean, na.rm = TRUE))
  moyennes <- rbind (moy, moy_CN, moy_Nfus)

  colnames(moyennes) <- c("2020", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008", "2007", "2006", "1999", "1990", "1982", "1975", "1968", "1962", "1954", "1936", "1931", "1926", "1921", "1911", "1906", "1901", "1896", "1891", "1886", "1881", "1876")
  moyennes$ID <- c("France", "CN", "Nfus")

  pr_graph <- melt(moyennes, id.vars = "ID")
  colnames(pr_graph) <- c("ID", "Annee", "Pop")
  pr_graph$Annee <- as.character(pr_graph$Annee)
  pr_graph$Annee <- as.numeric(pr_graph$Annee) # Si on ne fait pas en deux étapes le nombre n'est que le niveau du facteur

  graph <-  ggplot(data = pr_graph, aes(x = Annee, y = Pop)) + geom_line(aes(group = ID, linetype = ID)) +
    scale_y_continuous(trans = 'log10') +
    labs(title = paste0("Évolution de la population des communes moyenne\nCATEAAV = ", nom_zonage, " (", zonage, ") [", ensembl_etud, "]"),
         x="Année", y = "Population moyenne") +
    scale_linetype(name = "Type", labels = c(paste0("CN (", nbr_CN,")"), ensembl_etud, paste0("Nfus (", nbr_Nfus,")")))
  print(graph)
  
  
}

analyse_base100_2020 <- c("Les communes nouvelles du Maine-et-Loire se distinguent des autres communes normandes de manière similaire au décrochage observé pour la France entière.",
             "Trop peu de communes nouvelles.",
             "Pas de communes nouvelles.",
             "Les communes nouvelles du Maine-et-Loire se distinguent des autres communes normandes de manière similaire au décrochage observé pour la France entière.", 
             "Très peu de communes nouvelles, et celles-ci se distinguent des autres communes normandes de manière similaire au décrochage observé pour la France entière.")

labels_CATEAAV$analyse_base100_2020 <- analyse_base100_2020

kable(labels_CATEAAV)
V1 descr_CATEAAV analyse_base100_2020
11 Commune-centre Les communes nouvelles du Maine-et-Loire se distinguent des autres communes normandes de manière similaire au décrochage observé pour la France entière.
12 Autre commune du pôle principal Trop peu de communes nouvelles.
20 Commune d’un pôle secondaire Pas de communes nouvelles.
30 Commune de la couronne Les communes nouvelles du Maine-et-Loire se distinguent des autres communes normandes de manière similaire au décrochage observé pour la France entière.
11 Commune hors attraction des villes Très peu de communes nouvelles, et celles-ci se distinguent des autres communes normandes de manière similaire au décrochage observé pour la France entière.
# Pour afficher plusieurs vignettes (par(mfrow = c(3,3)) ne fonctionne pas)
# NB : On retire CATEAAV13 car pas de communes nouvelles
plot_grid(graph_evol_base100_1876_CATEAAV11,
          graph_evol_base100_1876_CATEAAV12,
          graph_evol_base100_1876_CATEAAV20,
          graph_evol_base100_1876_CATEAAV30)

dev.off()
## null device 
##           1
plot_grid(graph_evol_base100_2020_CATEAAV11,
          graph_evol_base100_2020_CATEAAV12,
          graph_evol_base100_2020_CATEAAV20,
          graph_evol_base100_2020_CATEAAV30)
# for (zonage in levels(hist_pop$CATAEU2011)) {
#   print(get(paste0("graph_evol_CATAEU", zonage)))
#   }

# par(mfrow = c(1,1))

Évolution nombre de communes

Il y a peu de bases de données présentant l’évolution du nombre de communes depuis leur création lors de la Révolution française. En général, la question du changement de périmètre (perte ou acquisition de territoires, les territoires d’outre-rhin, Nice et la Savoie, Alsace-Moselle etc) n’est pas évoquée.

# 1793-1999
# Source : http://cassini.ehess.fr/fr/html/8_glossaire.php?d=BDCarto à la définition du nom "commune"
annees <- c(1793, 1800, 1806, 1876, 1936, 1968, 1975, 1999)
nbr_com <- c(40431, 40345, 40210, 37745, 38014, 37708, 36296, 36565)
# 1876  y compris l’Alsace-Lorraine
graph <- data.frame(annees, nbr_com)

# ajout données 2023 pour voir (sources INSEE, France métropolitaine + oute-mer)
graph[nrow(graph)+1, ] <- c(1982, 36433)
graph[nrow(graph)+1, ] <- c(2012,   36571)
graph[nrow(graph)+1, ] <- c(2023, 34945)


# plot(annees, nbr_com)

ggplot(data=graph, aes(x=annees, y=nbr_com)) +
  geom_line() +
  labs(title="Évolution du nombre de communes en France", subtitle="1793-2023", x="", y = "", caption="Source : cassini.ehess.fr")

ggplot(data=graph, aes(x=annees, y=nbr_com)) +
  geom_line() +
  ylim(0, 41000) +
  labs(title="Évolution du nombre de communes en France", subtitle="1793-2023", x="", y = "", caption="Source : cassini.ehess.fr")

Utilisation de la base Cassini

Le site Cassini a été créé par l’EHESS, permet de retrouver des évolutions très nombreuses concernant les communes françaises.

Lien donné par Nicolas Verdier (juillet 2023) : https://didomena.ehess.fr/concern/data_sets/6395wb092?locale=fr (base en cours d’attribution d’un DOI, possiblement réalisation d’un data paper).

Exploration graphique

Proposition d’une exploitation pour avoir quelques graphiques un peu propres.

# download.file("https://didomena.ehess.fr/downloads/kd17cw827?locale=fr", "data-raw/temps_long/lieux_cassini_devenus_communes.csv")
# Téléchargement effectué le 6 mars 2023

cassini <- read.csv("data-raw/temps_long/lieux_cassini_devenus_communes.csv",
                            sep=",", colClasses = "character", head = TRUE, stringsAsFactors = TRUE, fill = TRUE)

# Tentative de liaison entre la base cassini et la base DAC
load("Archives/data_prep 2011-2021(01)/data/refdata.Rdata")

cassini <- merge(cassini, df_new[, c("CODGEO_new", "NbrComFus")], by.x = "commune_mars_2021", by.y = "CODGEO_new")
# Attention, dans la base Cassini, les communes_mars_2021 sont présentes plusieurs fois

# La variable "departement_1999" permet de localiser l'ensemble des communes. Ce qui permet d'isoler certaines parties du territoire
# table(is.na(cassini$commune_mars_2021))

# Pour la commune de Vornay (Cher), la base indique "s" comme département. On remplace par "18".
cassini$nom_1999[which(cassini$departement_1999 == "s")]
## [1] "Vornay"
cassini$departement_1999[which(cassini$departement_1999 == "s")] <- 18
# On corrige simplement les départements avec un seul chiffre (1, 2, 3 etc) pour homogénéiser (transformés en 01, 02, 03 etc)
cassini$departement_1999 <- stringr::str_pad(cassini$departement_1999, 2, pad = "0")
table(cassini$departement_1999)
## 
##   01   02   03   04   05   06   07   08   09   10   11   12   13   14   15   16 
##  510  911  441  269  201  166  386  559  477  504  506  678  126  929  290  459 
##   17   18   19   21   22   23   24   25   26   27   28   29   30   31   32   33 
##  544  330  339  759  401  408  721  703  419  872  473  310  398  671  697  613 
##   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49 
##  389  375  297  325  618  765  393  332  368  304  231  372  472  448  206  428 
##   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65 
##  695  723  559  294  679  605  268  994  403  705  769  634 1022  502  683  517 
##   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81 
##  279  593  400  318  678  643  421  344  337   15 1001  593  278  373 1017  397 
##   82   83   84   85   86   87   88   89   90   91   92   93   94   95 
##  272  163  168  336  356  253  569  498  108  210   36   40   49  199
# Possible de retirer certains départements
# cassini_reduite <- subset(cassini, departement_1999 != "2A" & departement_1999 != "2B" & departement_1999 != "73" & departement_1999 != "74")
# table(cassini_reduite$departement_1999)

# On peut aussi utiliser la colonne "intendances_types"
table(cassini$intendances_types)
## 
##                                               
##                                             2 
##                                    intendance 
##                                         41322 
##                         intendance,intendance 
##                                           962 
##              intendance,intendance,intendance 
##                                            21 
##             intendance,souveraineté étrangère 
##                                            16 
##                        souveraineté étrangère 
##                                          1025 
##             souveraineté étrangère,intendance 
##                                            26 
## souveraineté partagée ou contestée,intendance 
##                                            15
# On décide d'enlever les territoires qui, au départ, étaient au moins en partie sous souveraineté étrangère
cassini_reduite <- subset(cassini, intendances_types != "intendance,souveraineté étrangère" & intendances_types != "souveraineté étrangère" & intendances_types != "souveraineté étrangère,intendance" & intendances_types != "souveraineté partagée ou contestée,intendance")
# On enlève également les territoires perdus en 1870 (Alsace, Moselle)
cassini_reduite <- subset(cassini_reduite, departement_1999 != "57" & departement_1999 != "67" & departement_1999 != "68")
# table(cassini_reduite$departement_1999)

# Test pour ne sélectionner que l'Alsace-Moselle
# cassini_reduite <- subset(cassini, departement_1999 == "57" | departement_1999 == "67" | departement_1999 == "68")



# On cherche les noms des colonnes qui contiennent le motif "_info"
labels_data_pop <- colnames(cassini[grep(pattern = "_info", colnames(cassini), ignore.case = FALSE)])

# En l'absence de méta-données détaillées, on choisit de ne s'intéresser qu'aux communes dont la population est renseignée ou simplement lacunaire (devrait être renseignée). On postule que les autres indications désignent des communes n'existant pas à l'époque.
table (cassini_reduite$pop_an3_info)
## 
##  abs.  adm.  lac.   pop    si 
##   215    31   136 36917  3102
label <- labels_data_pop [2] # Si besoin pour tests

evol_nbr_com <- data.frame() # Création d'un objet pour récupérer les résultats totaux
evol_nbr_com_reduit <- data.frame() # Création d'un objet pour récupérer les résultats de la base réduite

# Boucle pour exploiter les données date par date
for (label in labels_data_pop) {
  annee <- substr(label, start =5, stop = nchar(label)-5) # On repère le n° de l'année en segmentant le label
  sous_tableau <- subset(cassini, cassini[, label] == "pop" | cassini[, label] == "lac.") # On crée un sous-tableau comptant uniquement les communes dont la population nous intéresse, à l'année donnée
  # sous_tableau <- subset(cassini, cassini[, label] == "pop") # Juste avec les populations connues
  nbr_com <- nrow(sous_tableau) # On compte le nombre de communes
  
  sous_tableau_reduit <- subset(cassini_reduite, cassini_reduite[, label] == "pop" | cassini_reduite[, label] == "lac.") # On crée un sous-tableau comptant uniquement les communes dont la population nous intéresse, à l'année donnée
  # sous_tableau_reduit <- subset(cassini_reduite, cassini_reduite[, label] == "pop") # Juste avec les populations connues
  nbr_com_reduit <- nrow(sous_tableau_reduit) # On compte le nombre de communes
  
  i <- c(annee, nbr_com) # On compile les résultats totaux
  i_reduit <- c(annee, nbr_com_reduit) # On compile les résultats totaux
  evol_nbr_com <- rbind(evol_nbr_com, i, stringsAsFactors = FALSE)
  evol_nbr_com_reduit <- rbind(evol_nbr_com_reduit, i_reduit, stringsAsFactors = FALSE)
}

# On traite à la main les deux années 2011 et 2021
# Pour 2011, on fait la liste des CODGEO unique de 2021 et on multiplie par leur nombre de communes fusionnantes (donne le nombre de communes en 2011) 
# Pas très propre mais pas l'énergie de faire mieux là...
CODGEO_2021 <- as.data.frame(unique(cassini$commune_mars_2021))
colnames(CODGEO_2021) <- "CODGEO_new"
CODGEO_2021_reduit <- as.data.frame(unique(cassini_reduite$commune_mars_2021))
colnames(CODGEO_2021_reduit) <- "CODGEO_new"
# On joint pour avoir le nombre de communes fusionnantes
CODGEO_2021 <- merge(df_new[c("CODGEO_new", "NbrComFus")], CODGEO_2021, by = "CODGEO_new", all.y = TRUE)
CODGEO_2021_reduit <- merge(df_new[c("CODGEO_new", "NbrComFus")], CODGEO_2021_reduit, by = "CODGEO_new", all.y = TRUE)
# Pour les communes non fusionnantes, on indique qu'il y en a une
CODGEO_2021$NbrComFus[is.na(CODGEO_2021$NbrComFus)] <- 1
CODGEO_2021_reduit$NbrComFus[is.na(CODGEO_2021_reduit$NbrComFus)] <- 1

i_2011 <- c(2011, sum(CODGEO_2021$NbrComFus))
i_2011_reduit <- c(2011, sum(CODGEO_2021_reduit$NbrComFus))
evol_nbr_com <- rbind(evol_nbr_com, i_2011)
evol_nbr_com_reduit <- rbind(evol_nbr_com_reduit, i_2011_reduit)


# Pour 2021, on liste simplement le nombre de CODGEO uniques de 2021 pour chacun des groupe
i_2021 <- c(2021, length(unique(cassini$commune_mars_2021)))
i_2021_reduit <- c(2021, length(unique(cassini_reduite$commune_mars_2021)))

evol_nbr_com <- rbind(evol_nbr_com, i_2021)
evol_nbr_com_reduit <- rbind(evol_nbr_com_reduit, i_2021_reduit)

colnames (evol_nbr_com) <- c("annees", "nbr_com")
colnames (evol_nbr_com_reduit) <- c("annees", "nbr_com")
evol_nbr_com$base <- "tout"
evol_nbr_com_reduit$base <- "tjr_fr"

evol_nbr_com <- rbind(evol_nbr_com, evol_nbr_com_reduit)

# evol_nbr_com[c(1,2), 1] <- c(1795, 1800) # On modifie l'intitulé pour faciliter la représentation graphique
evol_nbr_com$annees[evol_nbr_com$annees == "an3"] <- 1795
evol_nbr_com$annees[evol_nbr_com$annees == "an8"] <- 1800

evol_nbr_com[,1] <- as.numeric(evol_nbr_com[,1]) # On passe en numérique pour faciliter la représentation
evol_nbr_com[,2] <- as.numeric(evol_nbr_com[,2]) # Si on veut faire une seule colonne



ggplot(data=evol_nbr_com, aes(x=annees, y=nbr_com, group=base)) +
  geom_line(aes(group = base, linetype = base)) +
  scale_linetype(name = "Périmètre", labels = c("Territoires toujours français", "Toute base Cassini")) +
  scale_x_continuous (breaks = seq(1780, 2030, 20)) +
  labs(title="Évolution du nombre de communes", subtitle="1793-2021", x="", y = "", caption="Sources : cassini.ehess.fr, INSEE")

ggplot(data=evol_nbr_com, aes(x=annees, y=nbr_com, group=base)) +
  geom_line(aes(group = base, linetype = base)) +
  scale_linetype(name = "Périmètre", labels = c("Territoires toujours français", "Toute base Cassini")) +
  ylim(0, 41000) +
  labs(title="Évolution du nombre de communes", subtitle="1793-2021", x="", y = "", caption="Sources : cassini.ehess.fr, INSEE")

rm(label, annee, sous_tableau, nbr_com, i, nbr_com_reduit, sous_tableau_reduit, i_reduit, i_2021, i_2021_reduit, CODGEO_2021, CODGEO_2021_reduit, i_2011, i_2011_reduit)

Le cas de l’Aveyron

# On enlève également les territoires perdus en 1870 (Alsace, Moselle)
cassini_reduite <- subset(cassini, departement_1999 == "12")

evol_nbr_com_reduit <- data.frame() # Création d'un objet pour récupérer les résultats de la base réduite

# Boucle pour exploiter les données date par date
for (label in labels_data_pop) {
  annee <- substr(label, start =5, stop = nchar(label)-5) # On repère le n° de l'année en segmentant le label
  sous_tableau_reduit <- subset(cassini_reduite, cassini_reduite[, label] == "pop" | cassini_reduite[, label] == "lac.") # On crée un sous-tableau comptant uniquement les communes dont la population nous intéresse, à l'année donnée
  # sous_tableau_reduit <- subset(cassini_reduite, cassini_reduite[, label] == "pop") # Juste avec les populations connues
  nbr_com_reduit <- nrow(sous_tableau_reduit) # On compte le nombre de communes
  
  i_reduit <- c(annee, nbr_com_reduit) # On compile les résultats totaux
  evol_nbr_com_reduit <- rbind(evol_nbr_com_reduit, i_reduit, stringsAsFactors = FALSE)
}

# On traite à la main les deux années 2011 et 2021
# Pour 2011, on fait la liste des CODGEO unique de 2021 et on multiplie par leur nombre de communes fusionnantes (donne le nombre de communes en 2011) 
# Pas très propre mais pas l'énergie de faire mieux là...
CODGEO_2021_reduit <- as.data.frame(unique(cassini_reduite$commune_mars_2021))
colnames(CODGEO_2021_reduit) <- "CODGEO_new"
# On joint pour avoir le nombre de communes fusionnantes
CODGEO_2021_reduit <- merge(df_new[c("CODGEO_new", "NbrComFus")], CODGEO_2021_reduit, by = "CODGEO_new", all.y = TRUE)
# Pour les communes non fusionnantes, on indique qu'il y en a une
CODGEO_2021_reduit$NbrComFus[is.na(CODGEO_2021_reduit$NbrComFus)] <- 1

i_2011_reduit <- c(2011, sum(CODGEO_2021_reduit$NbrComFus))
evol_nbr_com_reduit <- rbind(evol_nbr_com_reduit, i_2011_reduit)


# Pour 2021, on liste simplement le nombre de CODGEO uniques de 2021 pour chacun des groupe
i_2021_reduit <- c(2021, length(unique(cassini_reduite$commune_mars_2021)))

evol_nbr_com_reduit <- rbind(evol_nbr_com_reduit, i_2021_reduit)

colnames (evol_nbr_com_reduit) <- c("annees", "nbr_com")

evol_nbr_com <- evol_nbr_com_reduit

# evol_nbr_com[c(1,2), 1] <- c(1795, 1800) # On modifie l'intitulé pour faciliter la représentation graphique
evol_nbr_com$annees[evol_nbr_com$annees == "an3"] <- 1795
evol_nbr_com$annees[evol_nbr_com$annees == "an8"] <- 1800

evol_nbr_com[,1] <- as.numeric(evol_nbr_com[,1]) # On passe en numérique pour faciliter la représentation
evol_nbr_com[,2] <- as.numeric(evol_nbr_com[,2]) # Si on veut faire une seule colonne



ggplot(data=evol_nbr_com, aes(x=annees, y=nbr_com)) +
  geom_line() +
  scale_x_continuous (breaks = seq(1780, 2030, 20)) +
  labs(title="Évolution du nombre de communes en Aveyron", subtitle="1793-2021", x="", y = "", caption="Sources : cassini.ehess.fr, INSEE")

ggplot(data=evol_nbr_com, aes(x=annees, y=nbr_com)) +
  geom_line() +
  ylim(0, 600) +
  scale_x_continuous (breaks = seq(1780, 2030, 20)) +
  labs(title="Évolution du nombre de communes en Aveyron", subtitle="1793-2021", x="", y = "", caption="Sources : cassini.ehess.fr, INSEE")

rm(label, annee, nbr_com_reduit, sous_tableau_reduit, i_reduit, i_2021_reduit, CODGEO_2021_reduit, i_2011_reduit)

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)

Première analyse

load("data/refdata.Rdata")
df2011_CIF <- df2011[, c("CODGEO", "LIBGEO", "COM_NOUV", "EPCI", "CODE_DEPT", "CATAEU2010", "CIF_2012", "CIF_2015")]
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
tapply(df2011_CIF$CIF_2012, INDEX = df2011_CIF$COM_NOUV, median, na.rm = TRUE)
##      NON      OUI 
## 0.344261 0.386940
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   202  2840 29318     3    17     3    16    93     1 
##    20    24    25    26 
##     3     1     1     4
# 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] 142
# 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.0   6.031   375.5 <2e-16 ***
## Residuals   34279  550.6   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.1   7.123   507.9 <2e-16 ***
## Residuals   25405  356.3   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 values (`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 values (`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.4305600 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.3490000 0.3729620 0.3729620 0.3292630 0.3197290 
##    18_NON    18_OUI    19_NON    19_OUI    21_NON    21_OUI    22_NON    22_OUI 
## 0.2776640 0.5534740 0.2824650 0.3336360 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.3276180 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.3162300 0.2971020 0.3080970 0.3362240 0.3799470 0.4147165 
##    31_NON    31_OUI    32_NON    32_OUI    33_NON    33_OUI    34_NON    34_OUI 
## 0.3816680 0.4097420 0.3060060 0.3043990 0.3380350 0.3712910 0.3525510 0.2764960 
##    35_NON    35_OUI    36_NON    36_OUI    37_NON    37_OUI    38_NON    38_OUI 
## 0.2970670 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.3336170 0.3553610 0.4498320 0.4773720 0.4935970 
##    51_OUI    52_NON    52_OUI    53_NON    53_OUI    54_NON    54_OUI    55_NON 
## 0.3891710 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.4606575 0.3271950 0.3417440 0.6300710 0.5514055 0.3791920 0.3966040 0.3026560 
##    63_OUI    64_NON    64_OUI    65_NON    65_OUI    66_NON    67_NON    67_OUI 
## 0.3296990 0.3573670 0.3648700 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.3345350 0.3170550 0.3788120 
##    72_NON    72_OUI    73_NON    73_OUI    74_NON    74_OUI    75_NON    76_NON 
## 0.3010030 0.3565020 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.5233220 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.4548050 0.3150850 0.4077270 0.3499290 0.2912690 0.2941560 0.3528180 0.3641000 
##    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.2872910 0.3234680 0.2747770 0.3279400 
##    90_NON    90_OUI    91_NON    91_OUI    92_NON    93_NON    94_NON    95_NON 
## 0.3840340 0.3840340 0.2955200 0.4310490 0.2321120 0.1268410 0.2379510 0.2435910 
##    95_OUI 
## 0.2698560
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.3508800 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.4287210 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.3267110 0.3604990 0.3567680 0.3616690 0.3995320 0.3505665 
##    18_NON    18_OUI    19_NON    19_OUI    21_NON    21_OUI    22_NON    22_OUI 
## 0.2990250 0.5465370 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.3598630 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.3050880 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.4086690 
##    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.3549310 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.3803960 0.3416410 0.4768730 
##    72_NON    72_OUI    73_NON    73_OUI    74_NON    74_OUI    75_NON    76_NON 
## 0.2950830 0.3314810 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.5248640 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.5419760 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    94_NON    95_NON 
## 0.3738870 0.3738870 0.3138830 0.4051160 0.2517780 0.1825290 0.2635280 0.2444230 
##    95_OUI 
##        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   175  145.9  0.8337   69.23 <2e-16 ***
## Residuals     34105  410.7  0.0120                   
## ---
## 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   174  105.0  0.6034   58.92 <2e-16 ***
## Residuals     25232  258.4  0.0102                   
## ---
## 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 = "Statut de la commune") +
  scale_color_manual (values=couleurs, labels = c("Communes non fusionnantes", "Communes fusionnantes"))
## Warning: Removed 277 rows containing non-finite values (`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 values (`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")

choroLayer(spdf = ShpDep, # SpatialPolygonsDataFrame
           df = CIF_dep, # 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 par département",
           legend.title.cex = 1, legend.values.cex = 0.8)
layoutLayer(#title = "Le poids de la DGF dans les budgets communaux",
  #coltitle = "black", 
  sources = "Source : INSEE, DGCL, 2011", scale = NULL,
  author = "Auteur : G. Bideau.", frame ="", col = NA)

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.3739550 0.3538260 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.3264045 0.3648290 0.3235740 0.3667800 0.3472290 0.3831700 
##   400_NON   400_OUI 
## 0.3628760 0.4253250
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.3505930 0.3956690 0.3727790 0.4114410 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.3453110 0.3873965 0.3312065 0.3865780 0.3544080 0.4144250 
##   400_NON   400_OUI 
## 0.3687580 0.4253870
# 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   14.8  0.8721   55.16 <2e-16 ***
## Residuals       34263  541.8  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.9  0.6981   50.42 <2e-16 ***
## Residuals       25389  351.5  0.0138                   
## ---
## 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))  + geom_boxplot() + scale_x_discrete(labels = nom_groupe) + theme(axis.text.x = element_text(angle = 45, hjust = 1))
## Warning: Removed 277 rows containing non-finite values (`stat_boxplot()`).

ggplot(df2011_CIF_subset, aes(x=COM_NOUV_CATAEU, y=CIF_2015))  + geom_boxplot()  + geom_boxplot() + scale_x_discrete(labels = nom_groupe) + theme(axis.text.x = element_text(angle = 45, hjust = 1))
## Warning: Removed 2227 rows containing non-finite values (`stat_boxplot()`).
## Warning: Removed 2227 rows containing non-finite values (`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.

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-2021(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 13 14 16 17 20 24 28 30 37 38 43 49 
## 11  5 11  6  7  8  4  7  6  4  2  2  4  1  3  4  1  2  1  1  1  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] 4.841471
# Pourcentage de communes de moins de 1000 habitants supprimées
100*(sum(FusionsDep$ComMoins1000habAv)-sum(FusionsDep$ComMoins1000habAp))/sum(FusionsDep$ComMoins1000habAv)
## [1] 6.408869
# 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] 25074
sum(FusionsDep$EvolNbrComMoins1000hab) # Nombre de communes de moins de 1000 habitants supprimées
## [1] -1717
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] 812
sum(FusionsDep$EvolNbrComMoins50hab) # Nombre de communes de moins de 50 habitants supprimées
## [1] -47
sum(FusionsDep$ComFusMoins50hab) # Nombre de communes fusionnantes de moins de 50 hab
## [1] 50
sum(FusionsDep$ComFusMoins1000hab) # Nombre de communes fusionnantes de moins de 1000 hab
## [1] 1957
#Proportion de communes fusionnantes ayant moins de 50/1000 hab
100 * round(sum(FusionsDep$ComFusMoins50hab)/sum(FusionsDep$NbrComFus), 3)
## [1] 2
100 * round(sum(FusionsDep$ComFusMoins1000hab)/sum(FusionsDep$NbrComFus), 3)
## [1] 77.2
# 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.4
#  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] -5.8
# 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  0.0 37.5  0.0 10.0  0.0  NaN  2.3  0.0
## [16]  0.0  0.0 20.0  0.0  6.2  0.0 12.5  0.0  5.0  0.0  2.4  1.9  0.0  0.0  0.0
## [31]  0.0  0.0  0.0  0.0 10.0  0.0  0.0  9.0  0.0  0.0  0.0 50.0  0.0  0.0  0.0
## [46]  NaN  2.0  0.0  2.0  0.0  5.0  0.0  0.0 25.0  0.0  0.0 20.0  0.0  0.0  0.7
## [61] 10.0  0.0  0.0 30.0  NaN  0.0  0.0  0.0  9.1  0.0  2.9  0.0  0.0  NaN  0.0
## [76]  0.0  0.0  0.0  5.9  7.7  NaN  NaN  NaN  0.0  0.0  0.0 14.3  0.0  0.0  0.0
## [91]  NaN  NaN  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.7
# 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.3

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, 2023.", 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-2023).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é à la\ncréation d'une\ncommune nouvelle",
                 legend.style = "e",
                 legend.frame = FALSE,
                 add = TRUE)
layoutLayer(title = "Communes nouvelles et superficie moyenne des communes (2012-2023)", coltitle = "black",
            sources = "Sources : INSEE, IGN, 2023.", 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): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  tabcont
## X-squared = 10.25, df = 9, p-value = 0.3307
## 
## [1] "VARIABLE ÉTUDIÉE : P09_CHOM1564_RT"
## Warning in chisq.test(tabcont): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  tabcont
## X-squared = 20.751, df = 9, p-value = 0.0138
## 
## [1] "VARIABLE ÉTUDIÉE : C09_ACT1564_Agr_RT"
## Warning in chisq.test(tabcont): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  tabcont
## X-squared = 16.577, df = 9, p-value = 0.05577
## 
## [1] "VARIABLE ÉTUDIÉE : C09_ACT1564_Cadr_RT"
## Warning in chisq.test(tabcont): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  tabcont
## X-squared = 7.9731, df = 9, p-value = 0.5369
## 
## [1] "VARIABLE ÉTUDIÉE : C09_ACT1564_Ouvr_RT"
## Warning in chisq.test(tabcont): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  tabcont
## X-squared = 17.165, df = 9, p-value = 0.04619
# 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          1773.83360064242      964.541503523884   3098.66540880503
## 2 superficie          14.9119122440059      14.9527539431781   48.0368975734302

Bibliographie

Beauguitte, Laurent, Timothée Giraud, and Marianne Guérois. 2015. Un outil pour la sélection et la visualisation de flux : le package flows.” Netcom. Réseaux, communication et territoires, no. 29-3/4 (December): 399–408. https://doi.org/10.4000/netcom.2134.
Bellefon, Marie-Pierre de, Vincent Loonis, and Ronan Le Gleut. 2018. “Codifier La Structure de Voisinage.” In Manuel d’analyse Spatiale. Théorie Et Mise En Œuvre Pratique Avec R. Insee Méthodes n, 33–50. https://www.insee.fr/fr/statistiques/fichier/3635442/imet131-f-chapitre-2.pdf.
Bellefon, Marie-Pierre de, and Bouayad-Agha Salima. 2018. “Indices d’autocorrélation Spatiale.” In Manuel d’analyse Spatiale. Théorie Et Mise En Œuvre Pratique Avec R. Insee Méthodes n, 53–72. https://www.insee.fr/fr/statistiques/fichier/3635442/imet131-f-chapitre-2.pdf.
Bideau, Gabriel. 2017. “Les Communes Nouvelles (2010-2017) : Quelle Révolution Du Territoire ?” M\'emoire de {{Master}} 2, Sous La Direction de {{Renaud Le Goix}}, Université Paris 7 Diderot. https://nakala.fr/10.34847/nkl.2f7bbnn2.
———. 2019. Les communes nouvelles françaises (2010-2019) : Une réforme territoriale silencieuse.” Annales de Géographie 728 (4/2019): 57–85. https://www.cairn.info/revue-annales-de-geographie-2019-4-page-57.htm.
Doignon, Yoann. 2016. “Le Vieillissement Démographique En Méditerranée : Convergences Territoriales Et Spatiales.” PhD thesis, Aix-Marseille Université. https://hal.archives-ouvertes.fr/tel-01471133.
Feuillet, Thierry, Etienne Cossart, and Hadrien Commenges. 2019. Manuel de géographie quantitative: concepts, outils, méthodes. Malakoff, France: Armand Colin.
Giraud, Timothée, Laurent Beauguitte, and Marianne Guérois. 2016. “Introduction to the Flows Package.” https://cran.r-project.org/web/packages/flows/vignettes/flows.html. https://cran.r-project.org/web/packages/flows/vignettes/flows.html.
Grasland, Claude. 2004. Les inégalités régionales dans une Europe élargie.” In Les incertitudes du grand élargissement : L’Europe centrale et balte pendant l’intégration européenne, 181–214. L’Harmattan. https://halshs.archives-ouvertes.fr/halshs-00175530.
Oliveau, Sébastien, and Yoann Doignon. 2016. La diagonale se vide ? Analyse spatiale exploratoire des décroissances démographiques en France métropolitaine depuis 50 ans.” Cybergeo: European Journal of Geography, January. https://doi.org/10.4000/cybergeo.27439.
Vaudor, Lise. 2018. Contes Et Stats R. http://perso.ens-lyon.fr/lise.vaudor/grimoireStat/_book/.
Ysebaert, Ronan, Nicolas Lambert, and Timothée Giraud. 2019a. MTA Conceptual Background. A Long-Term Policy Need: Measuring Territorial Inequalities in Europe (1954-2014).” https://cran.r-project.org/web/packages/MTA/vignettes/MTA.html.
———. 2019b. MTA Scénario.” https://cran.r-project.org/web/packages/MTA/vignettes/MTA_Scenario.html.