1 - PRÉSENTATION DES DONNÉES ET CONTEXTUALISATION GÉNÉRALE
1.1 Packages nécessaires
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)
library(sp)
library(knitr)
library(condformat)
library(units)
library(stringr)
library(questionr)
library(spdep)
library(rgeoda)
library(rmapshaper)
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)
variables_dispo <- as.data.frame(read_excel("data-raw/meta.xlsx", sheet = "ind_target"))
target <- subset(variables_dispo, variable_selec == "X")
Les données socio-économiques qui décrivent les communes en
géographies 2011 et 2025 sont ici importées. On commence par extraire
les communes ayant participé à la création d’une commune nouvelle,
appelées ici communes fusionnantes (datafus2011), les
communes nouvelles, avec les géométries au 1er janvier 2025 et
caractérisées par les données à la géométrie 2011 agrégées
(dataCN_new), ainsi que les communes, à la géométrie 2011,
qui n’ont pas participé à la création d’une commune nouvelle
(dataNfus2011)
load("data/refdata.Rdata")
datafus2011 <- subset(df2011, COM_NOUV == "OUI")
dataCN_new <- subset(df_new, COM_NOUV == "OUI")
dataNfus2011 <- subset(df2011, COM_NOUV == "NON")
1.3 Jointure données / géométries
Dans un certain nombre de cas, il sera utile d’avoir, dans un même
objet, les données et les géométries. Les données sont ici jointes aux
couches géographiques d’intérêt.
geom2011 <- merge(geom2011, df2011, by = "CODGEO")
geom_new <- merge(geom_new, df_new, by = "CODGEO_new")
geomCN_new <- merge(geomCN_new, dataCN_new, by = "CODGEO_new")
geomfus2011 <- merge(geomfus2011, datafus2011, by = "CODGEO")
1.4 Définition de sous-ensembles pour les tests
Un certain nombre d’espaces peuvent être étudiés à part : certaines
communes nouvelles car elles ont été l’objet d’une enquête qualitative
(@bideau2017, @bideau2019), d’autres car elles sont sur des
territoires très touchés par les fusions communales. Ces sous-ensembles
sont cartographiés dans la section 1.7.
testEdC <- subset (geom2011, CODGEO_new == "61324" | CODGEO_new =="73150" | CODGEO_new == "73006")
testEdCSavoie <- subset (geom2011, CODGEO_new =="73150" | CODGEO_new == "73006")
testNormandie <- subset (geom2011, REG == "23" | REG == "25")
test49 <- subset (geom2011, CODE_DEPT == "49" )
testOuest <- subset (geom2011, REG == "23" | REG == "25"| REG == "53"| REG == "52")
couleurs <- c("#2b83ba", "red4")
1.5 Analyse des corrélations
RY : pas sûr qu’il faille intégrer cette analyse à la fin. J’ai surtout
créé ce bout de code pour réfléchir aux indicateurs à retenir pour les
analyses ultérieures (et éviter les variables redondantes dans les CAH
par exemple). Les résultats de ces graphiques montrent par exemple et
sans surprise l’importante auto-corrélation des variables démographiques
tmp <- na.omit(datafus2011[,50:length(datafus2011)])
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))
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))
layoutLayer(title = "Communes fusionnantes (2011-2025(01))", theme = "red.pal",
author = "G. Bideau, 2025.",
sources = "Sources : INSEE, IGN, 2026.", extent = dep)
plot(st_geometry(geomfus2011), col = "red", add = TRUE)
plot(st_geometry(dep), col = NA, add = TRUE)

tmp <- aggregate(list(NUMBER_FUS = datafus2011[,"CODE_DEPT"]),
by = list(DEPT = datafus2011$CODE_DEPT),
FUN = length)
dep <- merge (dep, tmp, by.x = "CODE_DEPT", by.y = "DEPT", all.x = TRUE)
dep$NUMBER_FUS_rt <- (dep$NUMBER_FUS / sum(dep$NUMBER_FUS, na.rm = TRUE)) * 100
layoutLayer(title = "Communes fusionnantes (2011-2025(01))", theme = "red.pal",
author = "G. Bideau, 2025",
sources = "Sources : INSEE, IGN, 2025", extent = dep)
plot(st_geometry(dep), col = NA, add = TRUE)
propSymbolsChoroLayer(x = dep, var = "NUMBER_FUS", var2 = "NUMBER_FUS_rt",
col = carto.pal(pal1 = "blue.pal", n1 = 3,
pal2 = "red.pal", n2 = 3),
inches = 0.2, method = "q6",
border = "grey50", lwd = 1,
legend.var.pos = "topright",
legend.var2.pos = "topleft",
legend.var2.values.rnd = 2,
legend.var2.title.txt = "Pourcentage des communes du\ndépartement ayant fusionné (%)",
legend.var.title.txt = "Nombre de fusions\ncommunales",
legend.var.style = "e",
add = TRUE)

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

layoutLayer(title = "Communes fusionnantes (2011-2025)",
author = "G. Bideau, 2025",
sources = "Sources : INSEE, IGN, 2025", extent = dep)
plot(st_geometry(dep), add = TRUE)
propSymbolsLayer(x = geomCN_new,
var = "NbrComFus", symbols ="circle",
col = "red",
legend.pos = "topleft",
legend.title.txt = "Nombre de communes fusionnantes",
legend.style = "e",
inches = 0.1,
add = TRUE)

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

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

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

1.6bis Cartographie en fonction de la taille démographique
Cf. l’idée donnée ici : https://www.bnsp.insee.fr/ark:/12148/bc6p08tp83z/f1.pdf#page=2
choroLayer(x = geomfus2011 , var = "P09_POP",
method = "quantile", nclass = 4,
col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 2, n2 = 2),
border = NA,
legend.pos = "topleft", legend.values.rnd = 2,
legend.title.txt = "Nombre d'habitants (2009,\nregroupement par quartiles)")
plot(st_geometry(dep), add = TRUE, lwd = 0.3)
layoutLayer(title = " ",
author = "G. Bideau, 2024",
tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
sources = "Sources : INSEE, IGN, 2024")

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

tableau_dep <- as.data.frame(tapply(geomCN_new$P09_POP, INDEX = geomCN_new$CODE_DEPT_new, mean))
colnames(tableau_dep) <- c("moyenne_CN")
tableau_dep$median_CN <- tapply(geomCN_new$P09_POP, INDEX = geomCN_new$CODE_DEPT_new, median)
tableau_dep$CODE_DEPT <- row.names(tableau_dep)
tableau_dep$Nbr_Cfus <- table(geomfus2011$CODE_DEP)
tableau_dep <- merge(tableau_dep, dep[, c("CODE_DEPT", "LIBELLE")], by = "CODE_DEPT", all.x = TRUE, all.y = FALSE)
tableau_dep_tt <- as.data.frame(tapply(geom_new$P09_POP, INDEX = geom_new$CODE_DEPT_new, mean))
colnames(tableau_dep_tt) <- c("moyenne")
tableau_dep_tt$median <- tapply(geom_new$P09_POP, INDEX = geom_new$CODE_DEPT_new, median)
tableau_dep_tt$CODE_DEPT <- row.names(tableau_dep_tt)
tableau_dep <- merge(tableau_dep, tableau_dep_tt, by = "CODE_DEPT", all.x = TRUE, all.y = FALSE)
tableau_pr_publi <- subset(tableau_dep, tableau_dep$Nbr_Cfus > 40)
tableau_pr_publi <- tableau_pr_publi[order(-tableau_pr_publi$moyenne_CN),]
kable(tableau_pr_publi[, c("LIBELLE", "Nbr_Cfus", "moyenne_CN", "moyenne", "median_CN", "median")],
col.names = c("Département", "Nombre de communes nouvelles", "Population moyenne des communes nouvelles", "Population communale moyenne", "Population médiane des communes nouvelles", "Population communale médiane"), digits = 0)
| 45 |
Maine-et-Loire |
225 |
7922 |
4431 |
5631.5 |
1569.5 |
| 76 |
Vendée |
48 |
5661 |
2481 |
3210.0 |
1447.0 |
| 19 |
Côtes-d’Armor |
46 |
4841 |
1708 |
3110.0 |
925.0 |
| 46 |
Manche |
206 |
4658 |
1120 |
2508.5 |
444.0 |
| 70 |
Seine-Maritime |
50 |
3752 |
1771 |
2613.0 |
506.5 |
| 12 |
Calvados |
225 |
2977 |
1294 |
1662.0 |
407.5 |
| 68 |
Savoie |
48 |
2684 |
1506 |
2697.5 |
612.0 |
| 73 |
Deux-Sèvres |
78 |
2610 |
1454 |
1795.0 |
713.5 |
| 24 |
Eure |
127 |
2473 |
996 |
1385.0 |
444.0 |
| 57 |
Orne |
155 |
2348 |
767 |
2119.0 |
276.0 |
| 1 |
Ain |
46 |
2320 |
1506 |
898.5 |
806.0 |
| 25 |
Eure-et-Loir |
57 |
2125 |
1172 |
1443.0 |
477.0 |
| 21 |
Dordogne |
78 |
1857 |
819 |
1216.5 |
383.0 |
| 14 |
Charente |
69 |
1690 |
979 |
1203.5 |
428.0 |
| 80 |
Yonne |
43 |
1533 |
812 |
1067.0 |
381.0 |
| 22 |
Doubs |
52 |
1383 |
933 |
1337.0 |
261.0 |
| 36 |
Jura |
81 |
1163 |
531 |
826.0 |
235.0 |
| 43 |
Lot |
42 |
1055 |
556 |
971.0 |
290.0 |
| 44 |
Lozère |
50 |
890 |
508 |
579.0 |
209.0 |
1.6ter Cartographie en fonction de la taille démographique,
rapportée aux autres communes
On regarde la position des communes fusionnantes puis des communes
nouvelles vis-à-vis des communes françaises
par(mfrow = c(1,2), mar=c(0,0,1.2,0))
geomfus2011$P09_POP_quantiles <- as.factor(cut(geomfus2011$P09_POP,
breaks=c(quantile(geom2011$P09_POP, probs=seq(0, 1, 1/6), na.rm = TRUE))))
geomCN_new$P09_POP_quantiles <- as.factor(cut(geomCN_new$P09_POP,
breaks=c(quantile(geom_new$P09_POP, probs=seq(0, 1, 1/6), na.rm = TRUE))))
typoLayer(x = geomfus2011 , var = "P09_POP_quantiles",
border = NA,
legend.values.order = levels(geomfus2011$P09_POP_quantiles),
col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 3, n2 = 3),
legend.pos = "topleft",
legend.title.txt = "Situation au sein\ndes quantiles des\ncommunes françaises")
plot(st_geometry(dep), add = TRUE, lwd = 0.3)
layoutLayer(title = "Communes fusionnantes (2011-2025)\nen fonction de leur nombre d'habitant",
author = "G. Bideau, 2025",
tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
sources = "Sources : INSEE, IGN, 2025")
typoLayer(x = geomCN_new , var = "P09_POP_quantiles",
col = carto.pal(pal1 = "blue.pal", pal2 = "red.pal", n1 = 3, n2 = 3),
border = NA,
legend.values.order = levels(geomCN_new$P09_POP_quantiles),
legend.pos = "topleft",
legend.title.txt = "Situation au sein\ndes quantiles des\ncommunes françaises")
plot(st_geometry(dep), add = TRUE, lwd = 0.3)
plot(st_geometry(geomCN_new), add = TRUE, lwd = 0.2)
layoutLayer(title = "Communes nouvelles (2011-2025)\nen fonction de leur nombre d'habitant",
author = "G. Bideau, 2025",
tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
sources = "Sources : INSEE, IGN, 2025")

On voit bien que les communes nouvelles sont bien davantage dans la
strate supérieure. Mais il ne faut pas croire non plus que seules de
petites communes fusionnent, ce n’est pas le cas.
1.7 Analyse multiscalaire de la position des communes nouvelles
Pour les xx ratios sélectionnés, nous souhaitons ici évaluer la
position des communes nouvelles dans différents contextes spatiaux.
Pour chaque commune française nous calculons grâce au package
MTA (@ysebaert2019a) et pour
l’ensemble des indicateurs les déviations suivantes. La valeur 100
correspondant à la moyenne du contexte (définis par un rapport entre le
numérateur et le dénominateur) :
- Déviation à la moyenne nationale (
devgen).
- Déviation à la moyenne du département d’appartenance de la commune
(
devdep).
- Déviation à la moyenne de la catégorie d’aire urbaine d’appartenance
de la commune (
devcatau).
- Déviation à la moyenne des communes situées à moins de 10km des
communes
Dans chaque cas, nous différencions les communes fusionnantes des
autres (respectivement suffixes fus ou
Nfus).
geom2011 <- st_set_geometry(geom2011, NULL)
geom2011 <- do.call(data.frame,lapply(geom2011, function(x) replace(x, is.infinite(x),NA)))
ratio <- as.data.frame(read_excel("data-raw/meta.xlsx", sheet = "ratios"))
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")
}
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")
}
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")
}
devgen <- geom2011[,endsWith(colnames(geom2011), "DEV_GEN")]
devgen <- cbind(devgen, geom2011$COM_NOUV)
colnames(devgen)[length(devgen)] <- "COM_NOUV"
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))
devdep <- geom2011[,endsWith(colnames(geom2011), "DEV_DEP")]
devdep <- cbind(devdep, geom2011$COM_NOUV)
colnames(devdep)[length(devdep)] <- "COM_NOUV"
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))
devcatau <- geom2011[,endsWith(colnames(geom2011), "DEV_CATAU")]
devcatau <- cbind(devcatau, geom2011$COM_NOUV)
colnames(devcatau)[length(devcatau)] <- "COM_NOUV"
devcatauNfus <- devcatau[devcatau$COM_NOUV == "NON",]
devcataufus <- devcatau[devcatau$COM_NOUV == "OUI",]
devcatauNfus <- as.data.frame(apply(devcatauNfus[,1:length(devcatauNfus)-1], 2, median, na.rm = TRUE))
devcataufus <- as.data.frame(apply(devcataufus[,1:length(devcataufus)-1], 2, median, na.rm = TRUE))
Ces éléments nous permettent de comparer la déviation à la moyenne
des communes fusionnantes et des communes inchangées. On peut,
d’ailleurs, calculer la différence entre ces éléments.
Le tableau suivant propose une synthèse des données ainsi
construites. Les couleurs sont construites en fonction des minima et
maxima des valeurs de chaque partie du tableau (déviations et
différences).
Différence (%) entre communes nouvelles et communes inchangées concernant la déviation à la moyenne française
29.64
Différence (%) entre communes nouvelles et communes inchangées concernant la déviation à la moyenne départementale
5.32
Différence (%) entre communes nouvelles et communes inchangées
concernant la déviation aux mêmes catégories d’aires urbaines 6.95
Différence (%) entre communes nouvelles et communes inchangées
concernant la déviation à la moyenne française -13.57 Différence (%)
entre communes nouvelles et communes inchangées concernant la déviation
à la moyenne départementale -10.07 Différence (%) entre communes
nouvelles et communes inchangées concernant la déviation aux mêmes
catégories d’aires urbaines -9.84
Le premier élément remarquable dans ce tableau est la proximité entre
les communes fusionnantes et les communes inchangées concernant la
déviation à la moyenne, qu’elle soit française et encore plus
départementale ou liée à la catégorie d’aire urbaine. Cependant,
certaines variables sortent du lot et pointent une certaine spécificité
des communes nouvelles, que ce soit en comparant à la moyenne française,
départementale ou de ZAU : la part des agriculteurs (ou de
l’agriculture, sur-représentation), la part des ouvriers (ou de
l’industrie, sur-représentation) et la part des actifs travaillant dans
leur commune (sous-représentation). Sont également sous-représentés des
éléments comme la part de la construction, de l’administration, des
professions intermédaires et des cadres. Cela dessine le profil de
communes fusionnantes globalement proche du profil moyen des communes
françaises mais ayant comme spécificités des populations plus agricoles,
plus ouvrières et, souvent, travaillant davantage hors de leur commune
d’habitation.
1.8 Graphique des fusions en fonction du temps
Plusieurs vagues de fusions peuvent être notées depuis la création du
statut de communes nouvelles.
Le graphique ci-dessous représente le nombre de communes participant
à une fusion.
Dans le premier graphique, les fusions du 1er janvier de l’année n
sont rattachées à l’année n-1 (donc, pour l’année 2019 par exemple, du 2
janvier 2019 au 1er janvier 2020 inclus). Cela s’explique par le faite
que de très nombreuses fusions sont décidées en amont pour prendre effet
au 1er janvier de l’année suivante. Dans ce cas, elle sont considérées
comme existantes pour toute l’année suivante.
Le second graphique, pour être complet, présente les données en
fonction de l’année d’effectivité (1er janvier 2019 rattaché à l’année
2019).
Cette distinction est particulièrement importante pour l’année 2019
justement, puisque le nombre important de fusions associé à cette année
est lié à des fusions au 1er janvier 2019, donc avant le vote de la loi
du 1er août.
datafus2011$FusDate <- as.Date(datafus2011$FusDate, tryFormats = "%Y-%m-%d")
datafus2011$FusDateAnnee <- cut(datafus2011$FusDate,
breaks = as.Date(c("2011-1-1", "2012-1-2", "2013-1-2", "2014-1-2", "2015-1-2", "2016-1-2", "2017-1-2","2018-1-2", "2019-1-2", "2020-1-2", "2021-1-2", "2022-1-2", "2023-1-2", "2024-1-2")),
labels = c("2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023"))
table(datafus2011$FusDateAnnee)
##
## 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023
## 2 29 2 37 1082 653 91 600 6 5 19 18 22
time_serie <- data.frame(table(datafus2011$FusDateAnnee))
par(bg = "darkgrey", fg = "white", lwd = 2)
barplot(time_serie$Freq, xlab = " ", ylab = "Nombre de communes fusionnantes", main = "Nombre de communes fusionnantes en fonction de l'année de décision\n(1er janvier de l'année n rattaché à l'année n-1)", ylim = c(0, 2000), names.arg = time_serie$Var1)
grid(nx=0, ny = 10, col="gray", lwd=2)
arrows(0.1, 1500, 0.1, 100, length = 0.10, angle = 30,
code = 2, col = "black", lty = par("lty"),
lwd = par("lwd"))
text( -0.4, 1700 , labels = "Loi du 16 décembre 2010\ncréant le statut de\n« commune nouvelle »", col = "black", cex = 0.9, pos = 4, adj = c(1, 1))
arrows(3.7, 600, 3.7, 100, length = 0.10, angle = 30,
code = 2, col = "black", lty = par("lty"),
lwd = par("lwd"))
text( 3.7, 1000 , labels = "Premières incitations\nfiscales (art. 133,\nloi de finances pour 2014)", col = "black", cex = 0.9, pos = 1, adj = c(1, 1))
arrows(5.3, 1300, 5.3, 1150, length = 0.10, angle = 30,
code = 2, col = "black", lty = par("lty"),
lwd = par("lwd"))
text(5.3, 1800 , labels = "Dotation globale de\nfonctionnement\nmajorée de 5%\n(loi du 16 mars 2015)", col = "black", cex = 0.9, pos = 1, adj = c(1, 1))
arrows(10.3, 1200, 10.3, 100, length = 0.10, angle = 30,
code = 2, col = "black", lty = par("lty"),
lwd = par("lwd"))
text( 10, 1500 , labels = "Loi du 1er août 2019\nmodifiant l'incitation\nfiscale (6€ par habitant)\net créant le statut de\ncommune-communauté", col = "black", cex = 0.9, pos = 4, adj = c(1, 1))

datafus2011$FusDateAnnee_effectivite <- cut(datafus2011$FusDate,
breaks = as.Date(c("2011-1-1", "2012-1-1", "2013-1-1", "2014-1-1", "2015-1-1", "2016-1-1", "2017-1-1","2018-1-1", "2019-1-1", "2020-1-1", "2021-1-1", "2022-1-1", "2023-1-1", "2024-1-1", "2025-1-1")),
labels = c("2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2025"))
table(datafus2011$FusDateAnnee_effectivite)
##
## 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2025
## 0 2 31 0 46 1165 564 90 604 0 5 19 18 22
time_serie <- data.frame(table(datafus2011$FusDateAnnee_effectivite))
par(bg = "darkgrey",fg = "white", lwd = 2)
par(bg = "white",fg = "gray", lwd = 2)
barplot(time_serie$Freq, xlab = " ", ylab = "Nombre de communes fusionnantes", main = "Nombre de communes fusionnantes en fonction de l'année d'effectivité", ylim = c(0, 2000), names.arg = time_serie$Var1)
grid(nx=0, ny = 10, col="gray", lwd=2)
arrows(0.1, 1500, 0.1, 100, length = 0.10, angle = 30,
code = 2, col = "black", lty = par("lty"),
lwd = par("lwd"))
text( -0.4, 1700 , labels = "Loi du 16 décembre 2010\ncréant le statut de\n« commune nouvelle »", col = "black", cex = 0.9, pos = 4, adj = c(1, 1))
arrows(3.5, 600, 3.5, 100, length = 0.10, angle = 30,
code = 2, col = "black", lty = par("lty"),
lwd = par("lwd"))
text( 3.5, 1000 , labels = "Premières incitations\nfiscales (art. 133,\nloi de finances\npour 2014)", col = "black", cex = 0.9, pos = 1, adj = c(1, 1))
arrows(5.3, 1300, 5.3, 100, length = 0.10, angle = 30,
code = 2, col = "black", lty = par("lty"),
lwd = par("lwd"))
text(5.3, 1800 , labels = "Dotation globale de\nfonctionnement\nmajorée de 5%\n(loi du 16 mars 2015)", col = "black", cex = 0.9, pos = 1, adj = c(1, 1))
arrows(10.3, 1200, 10.3, 700, length = 0.10, angle = 30,
code = 2, col = "black", lty = par("lty"),
lwd = par("lwd"))
text( 10, 1700 , labels = "Loi du 1er août 2019\nmodifiant l'incitation\nfiscale (6€ par habitant)\net créant le statut de\ncommune-communauté", col = "black", cex = 0.9, pos = 1, adj = c(1, 1))
arrows(15.6, 700, 15.6, 100, length = 0.10, angle = 30,
code = 2, col = "black", lty = par("lty"),
lwd = par("lwd"))
text( 15.6, 1200 , labels = "Dotation d'amorçage\nrevalorisée et dotation\nde garantie sans limite\nde temps (loi de\nfinances pour 2024)", col = "black", cex = 0.9, pos = 1, adj = c(1, 1))

Cette chronologie peut être complétée par des éléments concernant les
évolutions législatives :
Loi du 16 décembre 2010 créant le statut de commune
nouvelle
Premières incitations fiscales (art. 133 de la loi de Finances
pour 2014)
Dotation globale de fonctionnement majorée de 5 % (loi du 16 mars
2015)
Loi du 1er août 2019 créant le statut de
commune-communauté
Loi de Finances pour 2020 créant une incitation fiscale
spécifique (6€ par habitant)
Plusieurs vagues de fusions peuvent être notées depuis la création du
statut de communes nouvelles.
La première va du 1er janvier 2011 au 1er janvier 2015 et concerne 70
communes fusionnantes.
La seconde va du 2 janvier 2015 au 1er janvier 2016 et concerne 1085
communes.
La troisième va du 2 janvier 2016 au 1er janvier 2017 et concerne 658
communes.
La quatrième va du 2 janvier 2017 au 1er janvier 2017 et concerne 91
communes.
La cinquième va du 2 janvier 2018 au 1er janvier 2020 et concerne 608
communes.
La sixième va du 2 janvier 2020 au 1er janvier 2021 et concerne 5
communes. [NB : À compléter avec les communes créées depuis.]
datafus2011$FusDate <- as.Date(datafus2011$FusDate, tryFormats = "%Y-%m-%d")
dev.off()
## null device
## 1
time_serie_phas <- data.frame(table(datafus2011$FusPhas))
barplot(time_serie_phas$Freq, names.arg = time_serie_phas$Var1)
On peut également représenter les fusions en fonction de leur date
exacte
time_serie <- data.frame(table(datafus2011$FusDate))
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")
col <- c("#ffffbf", "#e0f3f8","#abd9e9","#74add1","#4575b4","#313695")
col <- c("#a50026","#d73027","#f46d43","#fdae61","#fee090", "#ffffbf")
plot(st_geometry(dep), border = "#1A1A19", col = "white", lwd = 1)
typoLayer(x = geomfus2011, var = "FusPhas",
col=col,
border = NA,
legend.title.cex = 0.7,
legend.values.cex = 0.6,
legend.pos = "left",
legend.values.order = c("Phase 1", "Phase 2", "Phase 3", "Phase 4", "Phase 5", "Phase 6"),
add = T)
layoutLayer(title = "Communes fusionnantes (2012-2025) par phases",
author = "G. Bideau",
tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
sources = "Sources : INSEE, IGN, 2025")

1.10 La population des communes fusionnantes
La taille est souvent considérée comme le premier facteur menant à
une rationalisation de l’échelon communal par fusion. Les municipalités
sont effectivement une maille héritée des paroisses, territoires du
quotidien religieux, ayant perdu de leur sens dans le cadre des grandes
dynamiques démographiques du XIXe et XXe siècle et n’étant plus
nécessairement adaptées aux compétences communales. On pourrait alors
s’attendre à une proportion de communes fusionnantes bien plus
importante parmi les petites communes. On compare ici la proportion des
communes en fonction de leur taille, en mettant en parallèle l’ensemble
des communes françaises et les communes fusionnantes.
mean(df2011$P09_POP)
## [1] 1716.749
median(df2011$P09_POP)
## [1] 426
mean(datafus2011$P09_POP)
## [1] 1012.266
median(datafus2011$P09_POP)
## [1] 404
PopCom <- df2011$P09_POP
PopCom <- cut(PopCom, breaks = c(-1,200,500,1000, 5000, 10000, 2230000))
levels(PopCom)<-c("moins de 200 habitants", "200-500 habitants", "500-1000 habitants", "1000-5000 habitants", "5000-10000 habitants", "plus de 10000 habitants")
levels(PopCom)<-c("moins de 200", "200-500", "500-1000", "1000-5000", "5000-10000", "plus de 10000")
table (PopCom)
## PopCom
## moins de 200 200-500 500-1000 1000-5000 5000-10000
## 9377 10469 6948 7480 1046
## plus de 10000
## 887
table (PopCom)[1] / length (PopCom)
## moins de 200
## 0.2589759
PopCom_new <- df_new$P09_POP
PopCom_new <- cut(PopCom_new, breaks = c(-1,200,500,1000, 5000, 10000, 2230000))
levels(PopCom_new)<-c("moins de 200 habitants", "200-500 habitants", "500-1000 habitants", "1000-5000 habitants", "5000-10000 habitants", "plus de 10000 habitants")
levels(PopCom_new)<-c("moins de 200", "200-500", "500-1000", "1000-5000", "5000-10000", "plus de 10000")
table (PopCom_new)
## PopCom_new
## moins de 200 200-500 500-1000 1000-5000 5000-10000
## 8720 9669 6606 7403 1082
## plus de 10000
## 898
table (PopCom_new)[1] / length (PopCom_new)
## moins de 200
## 0.2536432
tabcont<-table(df2011$FUSION, PopCom)
tab.chi2 <- chisq.test(tabcont)
tab.chi2
##
## Pearson's Chi-squared test
##
## data: tabcont
## X-squared = 57.647, df = 5, p-value = 3.719e-11
tab <- round(100*prop.table(tabcont,margin=1),2)
prbarplot <- as.data.frame(tab)
ggplot(data = prbarplot, aes(x = PopCom, y = Freq, fill = Var1)) +
geom_bar(stat = "identity", position=position_dodge()) +
theme(axis.text.x = element_text(angle = 45, hjust=1), legend.position = c(0.8, 0.85)) +
scale_x_discrete("Nombre d'habitants") +
scale_y_continuous("Part du groupe de communes (%)") +
scale_fill_manual(labels = c("Communes inchangées", "Communes fusionnantes"), values = couleurs) +
labs(fill = NULL)

Ensemble <- round(100* table(PopCom) / length(PopCom),2)
tab <- rbind(tab, Ensemble)
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
| moins de 200 |
25.94 |
25.36 |
25.90 |
| 200-500 |
28.66 |
32.05 |
28.91 |
| 500-1000 |
19.14 |
19.76 |
19.19 |
| 1000-5000 |
20.68 |
20.40 |
20.66 |
| 5000-10000 |
3.00 |
1.53 |
2.89 |
| plus de 10000 |
2.57 |
0.90 |
2.45 |
| Total |
99.99 |
100.00 |
100.00 |
rm(tab, table, tabcont, Ensemble)
1.11 Quelques statistiques basiques
1.12 Communes nouvelles et périmètres de fusions
NB : Pour l’appartenance au 1er janvier 2025, pas d’information
autres que les appartenances administratives (région, arrondissement,
etc.). J’espère que cela viendra rapidement (note au 14/03/2025).
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)]
1.12.1 Communes fusionnantes au sein des EPCI
EPCIComNvll <- merge(data.frame(table(AppartComFus$EPCI)),
data.frame(table(AppartCom$EPCI)), by = "Var1", all.x = TRUE)
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
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")

summary (EPCIComNvll$RatioComFus)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.222 12.500 22.222 31.341 40.000 100.000
1.12.2 L’appartenance des communes à différents périmètres
Appart_etud <- c("REG", "CODE_DEPT", "ARR", "CV", "ZE2010", "AU2010", "EPCI")
AppartComNvlles <- subset (AppartComFus, ChefLieu == "O")
AppartComFus2 <- merge(
subset(AppartComFus, ChefLieu == "N"),
AppartComNvlles, by = "CODGEO_new", all.x = TRUE)
appart <- "AU2010"
tableau <- data.frame()
for (appart in Appart_etud) {
AppartComFus2[, paste0(appart, "_simil")] <- ifelse(AppartComFus2[, paste0(appart, ".x")] == AppartComFus2[, paste0(appart, ".y")], TRUE, FALSE)
if (appart != "AU2010") {AppartComFus2 <- AppartComFus2} else {
AppartComFus2$AU2010_simil[AppartComFus2$AU2010.x == "000"] <- "Non applicable"
AppartComFus2$AU2010_simil[AppartComFus2$AU2010.y == "000"] <- "Non applicable"
}
if (appart != "EPCI") {AppartComFus2 <- AppartComFus2} else {
AppartComFus2$EPCI_simil[AppartComFus2$EPCI.x == "ZZZZZZZZZ"] <- "Non applicable"
AppartComFus2$EPCI_simil[AppartComFus2$EPCI.y == "ZZZZZZZZZ"] <- "Non applicable"
}
nbSimil <- sum(AppartComFus2[, paste0(appart, "_simil")] == TRUE, na.rm = TRUE)
nbDiff <- sum(AppartComFus2[, paste0(appart, "_simil")] == FALSE, na.rm = TRUE)
nbCom <- nbSimil + nbDiff
num_variable <- which(target$recoding == appart)
nom_variable <- target[num_variable, "DESCRIPTION"]
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)
}
tableau[2:ncol(tableau)] <- apply(tableau[2:ncol(tableau)], 2, as.numeric)
colnames(tableau) <- c("", "Nombre", "%", "Nombre", "%", "Nombre", "%", "(km²)")
kable(tableau, row.names = F, digits = 2, align = "c", caption = "L'appartenance des communes fusionnantes à différents zonages") %>%
kableExtra::add_header_above(c("Appartenance identique" = 1, "Oui" = 2, "Non" = 2, "Total" = 2, "Superficie moyenne de l'échelon" = 1))
L’appartenance des communes fusionnantes à différents zonages
|
Appartenance identique
|
Oui
|
Non
|
Total
|
Superficie moyenne de l’échelon
|
|
|
Nombre
|
%
|
Nombre
|
%
|
Nombre
|
%
|
(km²)
|
|
Région
|
1826
|
99.95
|
1
|
0.05
|
1827
|
100
|
25716
|
|
Département
|
1823
|
99.78
|
4
|
0.22
|
1827
|
100
|
5745
|
|
Arrondissement
|
1759
|
96.28
|
68
|
3.72
|
1827
|
100
|
1662
|
|
Canton de ville
|
1562
|
85.50
|
265
|
14.50
|
1827
|
100
|
148
|
|
Zone d’emploi 2010
|
1682
|
92.06
|
145
|
7.94
|
1827
|
100
|
1818
|
|
Aire urbaine 2010
|
840
|
65.99
|
433
|
34.01
|
1273
|
100
|
706
|
|
EPCI
|
1615
|
91.04
|
159
|
8.96
|
1774
|
100
|
211
|
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")
ggplot(tableau_plot, aes(x = Échelon,
y = Nombre,
fill = Appartenance)) + geom_bar(stat="identity") +
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))
EtudSuperf$deciles <- EtudSuperf$superficie
EtudSuperf$deciles <- cut(EtudSuperf$deciles, breaks = seuils)
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)
tab.chi2 <- chisq.test(tabcont)
tab.chi2
##
## Pearson's Chi-squared test
##
## data: tabcont
## X-squared = 17.647, df = 9, p-value = 0.0395
tab <- round(100*prop.table(tabcont,margin=1),2)
prbarplot <- as.data.frame(tab)
ggplot(data = prbarplot, aes(x = Var2, y = Freq, fill = Var1)) +
geom_bar(stat = "identity", position=position_dodge()) +
theme(axis.text.x = element_text(angle = 45, hjust=1)) +
scale_x_discrete("Superficie communale (km²)") +
scale_y_continuous("Part du groupe de communes (%)") +
scale_fill_manual("Communes\nfusionnantes", values = couleurs)

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

rm(tab, tabcont, seuils, EtudSuperf)
Si on observe la superficie communale, la répartition des communes
fusionnantes ou non laisse entrevoir un phénomène potentiellement
contre-intuitif : la participation à une commune nouvelle ne paraît pas
du tout être guidée par la taille des communes. Alors que les communes
avec une très petite superficie (premier décile sur l’ensemble des
communes françaises) ont effectivement un peu plus fusionné en moyenne
(mais très légèrement), celles avec des superficies au-dessus de la
moyenne (pour les classes entre 13,1 et 29,9 km²) ont elles aussi
davantage fusionné. Dans tous les cas, les variations sont généralement
faibles et la question de la superficie ne paraît pas être un élément
explicatif, ce qui est confirmé par un test de Chi² ne permettant pas de
rejeter l’hypothèse d’indépendance des deux variables (X-squared =
13.84, df = 9, p-value = 0.1281).
EtudSuperf <- df_new[, c("CODGEO", "FUSION", "superficie")]
seuils <- quantile(EtudSuperf$superficie, probs=seq(0, 1, 0.1))
EtudSuperf$deciles <- EtudSuperf$superficie
EtudSuperf$deciles <- cut(EtudSuperf$deciles, breaks = seuils)
table (EtudSuperf$deciles)
##
## (0.0165,4.13] (4.13,5.73] (5.73,7.28] (7.28,8.99] (8.99,11]
## 3437 3438 3438 3438 3438
## (11,13.4] (13.4,16.7] (16.7,21.8] (21.8,31.7] (31.7,758]
## 3437 3438 3438 3438 3438
tabcont<-table(EtudSuperf$FUSION, EtudSuperf$deciles)
tab <- round(100*prop.table(tabcont,margin=1),2)
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)")

tab <- round(100*prop.table(tabcont),2)
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)

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.
5 - ACP - CAH
NB : L’analyse de la CAH ci-dessous correspond aux données 2011-2020.
Les fusions au 1er janvier 2025, même si elles sont peu nombreuses,
modifient considérablement le profil des groupes, dont les descriptions
ne sont donc pas adaptées
5.0 Préparation des données
geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE)
dep <- st_read("data/geom.gpkg", layer = "dep", quiet = TRUE)
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")
geomfus2011 <- merge(geomfus2011, datafus2011, by = "CODGEO")
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")
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
NbrVariables <- ncol(PourCAH)
selecVarCAH <- colnames(PourCAH)
PourCAH$CODGEO[duplicated(PourCAH$CODGEO)==TRUE]
## NULL
5.2 Réalisation de la typologie et valeurs
res.pca <- PCA(PourCAH, graph = FALSE)
res.hcpc <- agnes(res.pca$ind$coord, metric = "euclidiean", method = "ward")
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")

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

nclass <- 5
cluspop <- cutree(res.hcpc, k = nclass)
5.2.1 Valeurs absolues
NomsGroupesCAH <- c("Groupe 1 PPCQ",
"Groupe 2 PFO",
"Groupe 3 MOARO",
"Groupe 4 VAR",
"Groupe 5 REAV"
)
PourCAH <- as.data.frame(PourCAH, stringsAsFactors = FALSE)
PourCAH$Groupes <- factor(cluspop,
levels = 1:nclass,
labels = paste(NomsGroupesCAH))
Groupes_nbr <- paste0(NomsGroupesCAH, " (n=", table(PourCAH$Groupes), ")")
names(Groupes_nbr) <- NomsGroupesCAH
PourCAH$CODGEO <- row.names(PourCAH)
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_manual(values=c("#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628")) +
facet_wrap(~ Groupes, labeller = labeller(Groupes = Groupes_nbr)) +
coord_flip() +
theme_bw()

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

5.2.2 Valeurs moyennes
VarCAHBrutes <- stringr::str_replace(selecVarCAH, "Y_RT", "")
VarCAHBrutes <- stringr::str_replace(VarCAHBrutes, "_RT", "")
load("data/refdata.Rdata")
rm(df_new)
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
PourCAHz <- scale(PourCAH[,c(1:NbrVariables)])
PourCAHz <- as.data.frame(PourCAHz, stringsAsFactors = FALSE)
PourCAHz$Groupes <- PourCAH$Groupes
PourCAHz$CODGEO <- row.names(PourCAHz)
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")
colnames(clusLongStd)[4] <- "Variable"
ggplot(clusLongStd) +
geom_bar(aes(x = Variable, y = value, fill = Groupes),
stat = "identity") +
scale_fill_manual(values=c("#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf")) +
facet_wrap(~ Groupes, labeller = labeller(Groupes = Groupes_nbr)) +
labs (y = "Valeurs standardisées", x = " ") +
coord_flip() + theme_bw()

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

5.2.4 Cartographie
typo <- merge(geomfus2011,PourCAH[ , c("CODGEO","Groupes")], by = "CODGEO")
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.cex = 0.7,
legend.values.cex = 0.6,
legend.pos = "left", add = T)
layoutLayer(title = "Typologie exploratoire des communes fusionnantes (2012-2026)",
author = "G. Bideau, R. Ysebaert, 2026.",
tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
sources = "Sources : INSEE, IGN, 2026.")

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
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
| P09_CHOM1564_RT |
11.23 |
9.87 |
-1.36 |
7.43 |
6.98 |
8.49 |
6.37 |
11.70 |
-3.80 |
-2.44 |
-4.25 |
-2.89 |
-2.74 |
-1.38 |
-4.86 |
-3.50 |
0.47 |
1.83 |
| P09_ETUD1564_RT |
14.44 |
11.47 |
-2.97 |
11.66 |
9.02 |
9.57 |
8.99 |
9.04 |
-2.78 |
0.19 |
-5.42 |
-2.45 |
-4.87 |
-1.90 |
-5.45 |
-2.48 |
-5.40 |
-2.43 |
| P09_RETR1564_RT |
12.29 |
13.29 |
1.00 |
15.57 |
11.26 |
14.36 |
22.34 |
23.93 |
3.28 |
2.28 |
-1.03 |
-2.03 |
2.07 |
1.07 |
10.05 |
9.05 |
11.64 |
10.64 |
| C09_ACT1564_Agr_RT |
1.64 |
3.11 |
1.47 |
4.26 |
4.54 |
9.38 |
32.98 |
6.36 |
2.62 |
1.15 |
2.90 |
1.43 |
7.74 |
6.27 |
31.34 |
29.87 |
4.72 |
3.25 |
| C09_ACT1564_ArtCom_RT |
5.60 |
5.82 |
0.22 |
6.70 |
6.09 |
6.81 |
7.41 |
9.26 |
1.10 |
0.88 |
0.49 |
0.27 |
1.21 |
0.99 |
1.81 |
1.59 |
3.66 |
3.44 |
| C09_ACT1564_Cadr_RT |
15.09 |
9.57 |
-5.52 |
12.99 |
8.37 |
5.24 |
6.67 |
6.17 |
-2.10 |
3.42 |
-6.72 |
-1.20 |
-9.85 |
-4.33 |
-8.42 |
-2.90 |
-8.92 |
-3.40 |
| C09_ACT1564_ProfInt_RT |
24.16 |
22.22 |
-1.94 |
26.85 |
23.12 |
16.57 |
12.66 |
16.95 |
2.69 |
4.63 |
-1.04 |
0.90 |
-7.59 |
-5.65 |
-11.50 |
-9.56 |
-7.21 |
-5.27 |
| C09_ACT1564_Empl_RT |
28.89 |
28.62 |
-0.27 |
25.25 |
27.18 |
26.18 |
15.47 |
30.17 |
-3.64 |
-3.37 |
-1.71 |
-1.44 |
-2.71 |
-2.44 |
-13.42 |
-13.15 |
1.28 |
1.55 |
| C09_ACT1564_Ouvr_RT |
23.59 |
29.64 |
6.05 |
23.48 |
29.96 |
35.79 |
21.25 |
32.80 |
-0.11 |
-6.16 |
6.37 |
0.32 |
12.20 |
6.15 |
-2.34 |
-8.39 |
9.21 |
3.16 |
| P09_POP0014Y_RT |
18.33 |
19.53 |
1.20 |
18.90 |
23.55 |
19.36 |
12.69 |
14.51 |
0.57 |
-0.63 |
5.22 |
4.02 |
1.03 |
-0.17 |
-5.64 |
-6.84 |
-3.82 |
-5.02 |
| P09_POP1529Y_RT |
18.65 |
16.79 |
-1.86 |
14.62 |
14.95 |
15.28 |
12.04 |
11.95 |
-4.03 |
-2.17 |
-3.70 |
-1.84 |
-3.37 |
-1.51 |
-6.61 |
-4.75 |
-6.70 |
-4.84 |
| P09_POP3044Y_RT |
20.25 |
20.32 |
0.07 |
20.20 |
24.25 |
20.26 |
15.23 |
16.35 |
-0.05 |
-0.12 |
4.00 |
3.93 |
0.01 |
-0.06 |
-5.02 |
-5.09 |
-3.90 |
-3.97 |
| P09_POP4559Y_RT |
20.24 |
20.28 |
0.04 |
23.22 |
19.27 |
20.85 |
24.92 |
21.85 |
2.98 |
2.94 |
-0.97 |
-1.01 |
0.61 |
0.57 |
4.68 |
4.64 |
1.61 |
1.57 |
| P09_POP6074Y_RT |
13.71 |
13.81 |
0.10 |
14.85 |
11.51 |
14.43 |
21.27 |
20.74 |
1.14 |
1.04 |
-2.20 |
-2.30 |
0.72 |
0.62 |
7.56 |
7.46 |
7.03 |
6.93 |
| C09_ACTOCC_OUT_RT |
66.38 |
69.23 |
2.85 |
80.75 |
81.90 |
70.28 |
47.63 |
65.42 |
14.37 |
11.52 |
15.52 |
12.67 |
3.90 |
1.05 |
-18.75 |
-21.60 |
-0.96 |
-3.81 |
comparaisons <- data.frame()
for (i in NomsGroupesCAH){
a <- subset(typo, typo$Groupes == i)
Nb <- nrow(a)
b <- round(mean(a$P11_POT_FIN), 2)
bb <- round(mean(a$P11_POT_FIN_RT), 2)
c <- table(a$CATAEU2010)
h <- c(i, Nb, b, bb, c)
comparaisons <- rbind(comparaisons, h, stringsAsFactors= FALSE)
rm( a, b, bb, c, h, Nb)
}
colnames(comparaisons) <- c("Groupes", "Nombre", "Moy_P11_POT_FIN", "Moy_P11_POT_FIN_RT", "111","112","120","211","212","221","222","300","400")
mean(typo$P11_POT_FIN)
[1] 927700.5
mean(typo$P11_POT_FIN_RT)
[1] 740.293
tmp <- comparaisons[, c("Groupes", "Nombre", "111","112","120","211","212","221","222","300","400")]
kable(tmp, row.names = F, digits = 1, caption = "Code de Zonage en aire urbaine dans chaque groupe",
col.names = c("Groupes", "Nombre de communes", "Unité urbaine", "Couronne périurbaine", "Communes multipolarisées", "Unité urbaine", "Couronne périurbaine", "Unité urbaine", "Couronne périurbaine", "Autres communes multipolarisées", "Communes hors influence des pôles"), format = "html") %>%
kableExtra::add_header_above(c(" " = 2, "Grandes aires urbaines" = 3, "Pôles moyens" = 2, "Petits pôles" = 2," " = 2))
Code de Zonage en aire urbaine dans chaque groupe
|
|
Grandes aires urbaines
|
Pôles moyens
|
Petits pôles
|
|
|
Groupes
|
Nombre de communes
|
Unité urbaine
|
Couronne périurbaine
|
Communes multipolarisées
|
Unité urbaine
|
Couronne périurbaine
|
Unité urbaine
|
Couronne périurbaine
|
Autres communes multipolarisées
|
Communes hors influence des pôles
|
|
Groupe 1 PPCQ
|
659
|
63
|
307
|
64
|
7
|
26
|
13
|
10
|
99
|
70
|
|
Groupe 2 PFO
|
602
|
4
|
319
|
96
|
4
|
22
|
5
|
4
|
117
|
31
|
|
Groupe 3 MOARO
|
882
|
6
|
171
|
119
|
8
|
21
|
44
|
9
|
267
|
237
|
|
Groupe 4 VAR
|
127
|
0
|
4
|
3
|
0
|
2
|
0
|
0
|
25
|
93
|
|
Groupe 5 REAV
|
398
|
8
|
26
|
28
|
5
|
3
|
38
|
9
|
82
|
199
|
5.3.2 Tableaux simplifiés (pour sorties article ?)
x <- length(NomsGroupesCAH)
table <- compare[, 1:(4+x)]
table[, 5:(4+x)] <- round (table[, 5:(4+x)], 2)
min <- min(table[, c(2, 3, 5:ncol(table))])
max <- max(table[, c(2, 3, 5:ncol(table))])
table <- merge(table, ratio[, 1:2], by.x = "Variable", by.y = "CODE")
condformat(table[, c(length(table), 2:(length(table)-1))]) %>%
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_manual(values=c("#a65628", "#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00")) +
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_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)
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)
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)")
table <- condformat(compare) %>%
rule_fill_bar("Valeur pour la France entière (A)", limits = c(0, 100), low = "darkgreen", high = "darkgreen") %>%
rule_fill_bar("Valeur pour les communes fusionnantes (B)", limits = c(0, 100), low = "darkgreen", high = "darkgreen") %>%
rule_fill_bar("Valeur pour le groupe étudié (C)", limits = c(0, 100), low = "darkgreen", high = "darkgreen") %>%
rule_fill_gradient2("Différence ComFus/France (B-A)", low = "darkblue", high = "red", limits = c(min, max)) %>%
rule_fill_gradient2("Différence Groupe/France (C-A)", low = "darkblue", high = "red", limits = c(min, max)) %>%
rule_fill_gradient2("Différence Groupe/ComFus (C-B)", low = "darkblue", high = "red", limits = c(min, max))%>%
theme_caption(caption = i) %>%
theme_htmlWidget(number_of_entries = nrow(compare))
print(knit_print(table))
rm(compare, n, table)
}
[1] “
|
PPCQ
|
|
|
Variable
|
Valeur pour la France entière (A)
|
Valeur pour les communes fusionnantes (B)
|
Différence ComFus/France (B-A)
|
Valeur pour le groupe étudié (C)
|
Différence Groupe/France (C-A)
|
Différence Groupe/ComFus (C-B)
|
|
1
|
C09_ACT1564_Agr_RT
|
1.6
|
3.1
|
1.5
|
4.3
|
2.6
|
1.2
|
|
2
|
C09_ACT1564_ArtCom_RT
|
5.6
|
5.8
|
0.2
|
6.7
|
1.1
|
0.9
|
|
3
|
C09_ACT1564_Cadr_RT
|
15.1
|
9.6
|
-5.5
|
13.0
|
-2.1
|
3.4
|
|
4
|
C09_ACT1564_Empl_RT
|
28.9
|
28.6
|
-0.3
|
25.3
|
-3.6
|
-3.4
|
|
5
|
C09_ACT1564_Ouvr_RT
|
23.6
|
29.6
|
6.1
|
23.5
|
-0.1
|
-6.2
|
|
6
|
C09_ACT1564_ProfInt_RT
|
24.2
|
22.2
|
-1.9
|
26.8
|
2.7
|
4.6
|
|
7
|
C09_ACTOCC_OUT_RT
|
66.4
|
69.2
|
2.9
|
80.8
|
14.4
|
11.5
|
|
8
|
P09_CHOM1564_RT
|
11.2
|
9.9
|
-1.4
|
7.4
|
-3.8
|
-2.4
|
|
9
|
P09_ETUD1564_RT
|
14.4
|
11.5
|
-3.0
|
11.7
|
-2.8
|
0.2
|
|
10
|
P09_POP0014Y_RT
|
18.3
|
19.5
|
1.2
|
18.9
|
0.6
|
-0.6
|
|
11
|
P09_POP1529Y_RT
|
18.6
|
16.8
|
-1.9
|
14.6
|
-4.0
|
-2.2
|
|
12
|
P09_POP3044Y_RT
|
20.2
|
20.3
|
0.1
|
20.2
|
-0.1
|
-0.1
|
|
13
|
P09_POP4559Y_RT
|
20.2
|
20.3
|
0.0
|
23.2
|
3.0
|
2.9
|
|
14
|
P09_POP6074Y_RT
|
13.7
|
13.8
|
0.1
|
14.8
|
1.1
|
1.0
|
|
15
|
P09_RETR1564_RT
|
12.3
|
13.3
|
1.0
|
15.6
|
3.3
|
2.3
|
” attr(,“class”) [1] “knit_asis” attr(,“…”) named list() attr(,“html”)
[1] TRUE attr(,“knit_cacheable”) [1] NA [1] “
|
PFO
|
|
|
Variable
|
Valeur pour la France entière (A)
|
Valeur pour les communes fusionnantes (B)
|
Différence ComFus/France (B-A)
|
Valeur pour le groupe étudié (C)
|
Différence Groupe/France (C-A)
|
Différence Groupe/ComFus (C-B)
|
|
1
|
C09_ACT1564_Agr_RT
|
1.6
|
3.1
|
1.5
|
4.5
|
2.9
|
1.4
|
|
2
|
C09_ACT1564_ArtCom_RT
|
5.6
|
5.8
|
0.2
|
6.1
|
0.5
|
0.3
|
|
3
|
C09_ACT1564_Cadr_RT
|
15.1
|
9.6
|
-5.5
|
8.4
|
-6.7
|
-1.2
|
|
4
|
C09_ACT1564_Empl_RT
|
28.9
|
28.6
|
-0.3
|
27.2
|
-1.7
|
-1.4
|
|
5
|
C09_ACT1564_Ouvr_RT
|
23.6
|
29.6
|
6.1
|
30.0
|
6.4
|
0.3
|
|
6
|
C09_ACT1564_ProfInt_RT
|
24.2
|
22.2
|
-1.9
|
23.1
|
-1.0
|
0.9
|
|
7
|
C09_ACTOCC_OUT_RT
|
66.4
|
69.2
|
2.9
|
81.9
|
15.5
|
12.7
|
|
8
|
P09_CHOM1564_RT
|
11.2
|
9.9
|
-1.4
|
7.0
|
-4.2
|
-2.9
|
|
9
|
P09_ETUD1564_RT
|
14.4
|
11.5
|
-3.0
|
9.0
|
-5.4
|
-2.5
|
|
10
|
P09_POP0014Y_RT
|
18.3
|
19.5
|
1.2
|
23.5
|
5.2
|
4.0
|
|
11
|
P09_POP1529Y_RT
|
18.6
|
16.8
|
-1.9
|
15.0
|
-3.7
|
-1.8
|
|
12
|
P09_POP3044Y_RT
|
20.2
|
20.3
|
0.1
|
24.2
|
4.0
|
3.9
|
|
13
|
P09_POP4559Y_RT
|
20.2
|
20.3
|
0.0
|
19.3
|
-1.0
|
-1.0
|
|
14
|
P09_POP6074Y_RT
|
13.7
|
13.8
|
0.1
|
11.5
|
-2.2
|
-2.3
|
|
15
|
P09_RETR1564_RT
|
12.3
|
13.3
|
1.0
|
11.3
|
-1.0
|
-2.0
|
” attr(,“class”) [1] “knit_asis” attr(,“…”) named list() attr(,“html”)
[1] TRUE attr(,“knit_cacheable”) [1] NA [1] “
|
MOARO
|
|
|
Variable
|
Valeur pour la France entière (A)
|
Valeur pour les communes fusionnantes (B)
|
Différence ComFus/France (B-A)
|
Valeur pour le groupe étudié (C)
|
Différence Groupe/France (C-A)
|
Différence Groupe/ComFus (C-B)
|
|
1
|
C09_ACT1564_Agr_RT
|
1.6
|
3.1
|
1.5
|
9.4
|
7.7
|
6.3
|
|
2
|
C09_ACT1564_ArtCom_RT
|
5.6
|
5.8
|
0.2
|
6.8
|
1.2
|
1.0
|
|
3
|
C09_ACT1564_Cadr_RT
|
15.1
|
9.6
|
-5.5
|
5.2
|
-9.9
|
-4.3
|
|
4
|
C09_ACT1564_Empl_RT
|
28.9
|
28.6
|
-0.3
|
26.2
|
-2.7
|
-2.4
|
|
5
|
C09_ACT1564_Ouvr_RT
|
23.6
|
29.6
|
6.1
|
35.8
|
12.2
|
6.1
|
|
6
|
C09_ACT1564_ProfInt_RT
|
24.2
|
22.2
|
-1.9
|
16.6
|
-7.6
|
-5.6
|
|
7
|
C09_ACTOCC_OUT_RT
|
66.4
|
69.2
|
2.9
|
70.3
|
3.9
|
1.1
|
|
8
|
P09_CHOM1564_RT
|
11.2
|
9.9
|
-1.4
|
8.5
|
-2.7
|
-1.4
|
|
9
|
P09_ETUD1564_RT
|
14.4
|
11.5
|
-3.0
|
9.6
|
-4.9
|
-1.9
|
|
10
|
P09_POP0014Y_RT
|
18.3
|
19.5
|
1.2
|
19.4
|
1.0
|
-0.2
|
|
11
|
P09_POP1529Y_RT
|
18.6
|
16.8
|
-1.9
|
15.3
|
-3.4
|
-1.5
|
|
12
|
P09_POP3044Y_RT
|
20.2
|
20.3
|
0.1
|
20.3
|
0.0
|
-0.1
|
|
13
|
P09_POP4559Y_RT
|
20.2
|
20.3
|
0.0
|
20.8
|
0.6
|
0.6
|
|
14
|
P09_POP6074Y_RT
|
13.7
|
13.8
|
0.1
|
14.4
|
0.7
|
0.6
|
|
15
|
P09_RETR1564_RT
|
12.3
|
13.3
|
1.0
|
14.4
|
2.1
|
1.1
|
” attr(,“class”) [1] “knit_asis” attr(,“…”) named list() attr(,“html”)
[1] TRUE attr(,“knit_cacheable”) [1] NA [1] “
|
VAR
|
|
|
Variable
|
Valeur pour la France entière (A)
|
Valeur pour les communes fusionnantes (B)
|
Différence ComFus/France (B-A)
|
Valeur pour le groupe étudié (C)
|
Différence Groupe/France (C-A)
|
Différence Groupe/ComFus (C-B)
|
|
1
|
C09_ACT1564_Agr_RT
|
1.6
|
3.1
|
1.5
|
33.0
|
31.3
|
29.9
|
|
2
|
C09_ACT1564_ArtCom_RT
|
5.6
|
5.8
|
0.2
|
7.4
|
1.8
|
1.6
|
|
3
|
C09_ACT1564_Cadr_RT
|
15.1
|
9.6
|
-5.5
|
6.7
|
-8.4
|
-2.9
|
|
4
|
C09_ACT1564_Empl_RT
|
28.9
|
28.6
|
-0.3
|
15.5
|
-13.4
|
-13.1
|
|
5
|
C09_ACT1564_Ouvr_RT
|
23.6
|
29.6
|
6.1
|
21.3
|
-2.3
|
-8.4
|
|
6
|
C09_ACT1564_ProfInt_RT
|
24.2
|
22.2
|
-1.9
|
12.7
|
-11.5
|
-9.6
|
|
7
|
C09_ACTOCC_OUT_RT
|
66.4
|
69.2
|
2.9
|
47.6
|
-18.7
|
-21.6
|
|
8
|
P09_CHOM1564_RT
|
11.2
|
9.9
|
-1.4
|
6.4
|
-4.9
|
-3.5
|
|
9
|
P09_ETUD1564_RT
|
14.4
|
11.5
|
-3.0
|
9.0
|
-5.4
|
-2.5
|
|
10
|
P09_POP0014Y_RT
|
18.3
|
19.5
|
1.2
|
12.7
|
-5.6
|
-6.8
|
|
11
|
P09_POP1529Y_RT
|
18.6
|
16.8
|
-1.9
|
12.0
|
-6.6
|
-4.8
|
|
12
|
P09_POP3044Y_RT
|
20.2
|
20.3
|
0.1
|
15.2
|
-5.0
|
-5.1
|
|
13
|
P09_POP4559Y_RT
|
20.2
|
20.3
|
0.0
|
24.9
|
4.7
|
4.6
|
|
14
|
P09_POP6074Y_RT
|
13.7
|
13.8
|
0.1
|
21.3
|
7.6
|
7.5
|
|
15
|
P09_RETR1564_RT
|
12.3
|
13.3
|
1.0
|
22.3
|
10.1
|
9.1
|
” attr(,“class”) [1] “knit_asis” attr(,“…”) named list() attr(,“html”)
[1] TRUE attr(,“knit_cacheable”) [1] NA [1] “
|
REAV
|
|
|
Variable
|
Valeur pour la France entière (A)
|
Valeur pour les communes fusionnantes (B)
|
Différence ComFus/France (B-A)
|
Valeur pour le groupe étudié (C)
|
Différence Groupe/France (C-A)
|
Différence Groupe/ComFus (C-B)
|
|
1
|
C09_ACT1564_Agr_RT
|
1.6
|
3.1
|
1.5
|
6.4
|
4.7
|
3.2
|
|
2
|
C09_ACT1564_ArtCom_RT
|
5.6
|
5.8
|
0.2
|
9.3
|
3.7
|
3.4
|
|
3
|
C09_ACT1564_Cadr_RT
|
15.1
|
9.6
|
-5.5
|
6.2
|
-8.9
|
-3.4
|
|
4
|
C09_ACT1564_Empl_RT
|
28.9
|
28.6
|
-0.3
|
30.2
|
1.3
|
1.5
|
|
5
|
C09_ACT1564_Ouvr_RT
|
23.6
|
29.6
|
6.1
|
32.8
|
9.2
|
3.2
|
|
6
|
C09_ACT1564_ProfInt_RT
|
24.2
|
22.2
|
-1.9
|
17.0
|
-7.2
|
-5.3
|
|
7
|
C09_ACTOCC_OUT_RT
|
66.4
|
69.2
|
2.9
|
65.4
|
-1.0
|
-3.8
|
|
8
|
P09_CHOM1564_RT
|
11.2
|
9.9
|
-1.4
|
11.7
|
0.5
|
1.8
|
|
9
|
P09_ETUD1564_RT
|
14.4
|
11.5
|
-3.0
|
9.0
|
-5.4
|
-2.4
|
|
10
|
P09_POP0014Y_RT
|
18.3
|
19.5
|
1.2
|
14.5
|
-3.8
|
-5.0
|
|
11
|
P09_POP1529Y_RT
|
18.6
|
16.8
|
-1.9
|
11.9
|
-6.7
|
-4.8
|
|
12
|
P09_POP3044Y_RT
|
20.2
|
20.3
|
0.1
|
16.4
|
-3.9
|
-4.0
|
|
13
|
P09_POP4559Y_RT
|
20.2
|
20.3
|
0.0
|
21.8
|
1.6
|
1.6
|
|
14
|
P09_POP6074Y_RT
|
13.7
|
13.8
|
0.1
|
20.7
|
7.0
|
6.9
|
|
15
|
P09_RETR1564_RT
|
12.3
|
13.3
|
1.0
|
23.9
|
11.6
|
10.6
|
” attr(,“class”) [1] “knit_asis” attr(,“…”) named list()
attr(,“html”) [1] TRUE attr(,“knit_cacheable”) [1] NA
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
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)
}
colnames(moyennesComCAH) <- c("Variable", "Comfr_moy", "Comfr_med", "Comfus_moy", "Comfus_med")
moyennesComCAH <- merge(moyennesComCAH, ratio[, 1:2], by.x = "Variable", by.y = "CODE")
row.names(moyennesComCAH) <- moyennesComCAH$DESCRIPTION
moyennesComCAH[1] <- moyennesComCAH$DESCRIPTION
kable(moyennesComCAH[, 1:5], row.names = FALSE, col.names = c("", "Moyenne", "Médiane", "Moyenne", "Médiane"), digits = 2, format = "html") %>%
kableExtra::add_header_above(c("Variable" = 1, "Communes françaises" = 2, "Communes fusionnantes" = 2))
|
Variable
|
Communes françaises
|
Communes fusionnantes
|
|
|
Moyenne
|
Médiane
|
Moyenne
|
Médiane
|
|
Part des agriculteurs dans les actifs de 15-64 ans (%)
|
7.16
|
3.33
|
7.69
|
4.22
|
|
Part des artisans, comm., chefs entr. dans les actifs de 15-64 ans (%)
|
7.03
|
6.08
|
7.01
|
6.15
|
|
Part des cadres, prof. intel. sup. dans les actifs de 15-64 ans (%)
|
9.04
|
7.84
|
8.06
|
7.14
|
|
Part des employés dans les actifs de 15-64 ans (%)
|
26.72
|
27.04
|
26.24
|
26.66
|
|
Part des ouvriers dans les actifs de 15-64 ans (%)
|
28
|
27.28
|
30.27
|
29.88
|
|
Part des prof. intermédiaires dans les actifs de 15-64 ans (%)
|
21.62
|
21.74
|
20.44
|
20
|
|
Part des actifs occupés travaillant hors de leur commune de résidence
(%)
|
74.46
|
78.23
|
73.69
|
77.02
|
|
Taux de chômage des 15-64 ans (%)
|
8.74
|
8.13
|
8.26
|
7.82
|
|
Part des étudiants, stagiaires, non rémunérés dans les actifs de 15-64
ans (%)
|
10.22
|
9.94
|
9.85
|
9.48
|
|
Part des 0-14 ans dans la population totale (%)
|
18.67
|
18.88
|
19.13
|
19.46
|
|
Part des 15-29 ans dans la population totale (%)
|
14.22
|
14.21
|
14.39
|
14.43
|
|
Part des 30-44 ans dans la population totale (%)
|
20.33
|
20.43
|
20.31
|
20.41
|
|
Part des 45-59 ans dans la population totale (%)
|
22.03
|
21.72
|
21.43
|
21.15
|
|
Part des 60-74 ans dans la population totale (%)
|
15.35
|
14.69
|
15.16
|
14.57
|
|
Part des retraités et pré-retraités dans les actifs de 15-64 ans (%)
|
Inf
|
14.51
|
15.78
|
14.53
|
Ainsi, il est nécessaire d’être prudent sur l’interprétation des taux
de navetteurs, car si la moyenne française est bien d’environ 66 %, la
moyenne des communes françaises est supérieur à 74 % et la médiane des
communes françaises à 78 %. C’est-à-dire que plus de la moitié des
communes françaises ont un taux de navetteur supérieur à 78 % alors que
cette médiane n’est que de 76 % chez les communes fusionnantes. Cela
étant dû, principalement, à la sous-représentation des navetteurs dans
les communes très peuplées (au premier rang desquelles Paris, Lyon,
Marseille etc). Par conséquent, la question des navetteurs est davantage
quelque chose qui distingue les communes fusionnantes entre elles qu’une
caractéristique commune. Pour les autres variables étudiées, il y a
moins de différences entre les moyennes globales ou les moyennes par
communes.
5.3.5 Analyse de la typologie
Le profil moyen des communes fusionnantes met en avant certaines
caractéristiques. Les plus frappantes différence supérieur à 2%
vis-à-vis de la moyenne française) sont une sur-représentation, dans
l’ordre, des ouvriers, des actifs employés hors de la commune, des
agriculteurs et des retraités. Inversement, on observe une
sous-représentation des cadres, des étudiants, des 15-29 ans, des
chômeurs et des professions intellectuelles.
En particulier, tous les groupes ont, systématiquement, par rapport à
la moyenne française, deux caractéristiques communes : d’un côté, plus
d’agriculteurs, d’artisans-commerçants ; de l’autre côté, moins de
chômeurs, d’étudiants, de cadres, d’employés et de 15-29 ans.
Cette vision générale révèle néanmoins des divergences à l’intérieur
du groupe des communes nouvelles. Une classification ascendante
hiérarchique nous a permis d’identifier cinq groupes.
Le groupe 1 (rouge, 540 communes) contient des communes appartenant
fréquemment à la périphérie des grands pôles urbains (277 communes),
avec une sur-représentation, même vis-à-vis de l’ensemble des communes
fusionnantes, des actifs travaillant hors de leur commune de résidence.
En revanche, ce groupe s’inscrit par plusieurs caractéristiques en
contrepoint du profil moyen des communes fusionnantes en ayant davantage
de cadres, de professions intellectuelles et de 45-59 ans. On peut
dénommer ce groupe le profil “PPCQ” (Proche Périphérie, Cadres,
Quinquagénaires). On y retrouve, par exemple, des communes comme
Annecy-le-Vieux, Pringy et Seynod (commune nouvelle d’Annecy), les trois
communes ayant conduit à la commune nouvelle de Kaysersberg Vignoble1,
certaines des communes constituant les communes nouvelles de
Cherbourg-en-Cotentin, ou encore la totalité de la commune de
Valloire-sur-Cisse (près de Blois).
Le groupe 2 (bleu, 689 communes) est caractérisé par des communes
fusionnantes qui sont encore avec un fort taux de navetteurs et
fréquemment (320 communes) dans la couronne des pôles urbains mais avec
la présence plus importante de communes multipolarisées, soit par de
grandes aires urbaines soit par d’autres (respectivement 113 et 163
communes). Il s’agit de communes plus familiales que la moyenne (00-14
ans et 30-44 ans), avec également davantage d’ouvriers. On peut dénommer
ce groupe le profil “PFO” (Périphéries Familiales et Ouvrières). Des
exemples parmi les plus frappants se retrouvent dans le Maine-et-Loire,
formant une couronne autour d’Angers. On peut citer la commune nouvelle
de Chemillé-en-Anjou (commune chef-lieu exclue, c’est à noter). On en
retrouve également en Normandie (sept des vingt communes de
Souleuvre-en-Bocages, huit des dix-neuf communes de La Hague) ou vers
les Alpes (comme La Plagne Tarentaise, en Savoie).
Le groupe 3 (vert, 874 communes) révèle des caractéristiques proche
du profil moyen des communes fusionnantes. Il est caractérisé, en
particulier, par la sur-représentation des ouvriers, des agriculteurs,
mais aussi des retraités et des actifs travaillant hors de la commune.
On peut d’ailleurs remarquer que les catégories d’aires urbaines les
plus représentées sont autres communes multipôlarisées et les communes
hors influence des pôles. On peut dénommer ce groupe le profil “MOARO”
(Moyen, Ouvriers, Agriculteurs, Retraités, Out). Il est particulièrement
présent dans l’Ouest (Pays-de-la-Loire, Bretagne, Normandie) avec neuf
des vingt-deux communes de Livarot-Pays-d’Auge (Calvados), la totalité
de Saint-Sauveur-Villages (sept communes de la Manche) et neuf des dix
communes de Tourouvre au Perche (Orne). À noter que c’est, avec le
groupe 1, celui où on peut retrouver des communes centres (23), qui sont
dans le groupe 3 par l’importance de leur population ouvrière, comme à
La Hague ou Cherbourg.
Le groupe 4 (mauve, 213 communes) contient des communes marquées par
une forte présence des retraités, des personnes âgés et des
agriculteurs. Il s’agit, très majoritairement (136 communes) de communes
hors influences des pôles. On peut, éventuellement, remarquer une
présence des ouvriers plus importante que par rapport à la moyenne
française (+4,8%) mais qui reste inférieure à la moyenne des communes
fusionnantes. On peut bien parler ici de communes “VAR” (Vieillissantes,
Agricoles et Rurales). Ces communes se retrouvent sans polarité
particulière en France, que ce soit dans l’Ouest avec quatre des six
communes de Belforêt-en-Perche (Orne) ou davantage au sud avec trois des
quatre communes de Porte-du-Quercy (Lot) et des petits binômes comme
Castelnau d’Auzan Labarrère (Gers) ou Castels et Bézenac (Dordogne).
Le groupe 5 (orange, 194 communes), enfin, ressemble au groupe 4 par
la présence de populations plus âgées et agricoles mais cette dernière
caractéristique est bien plus affirmée, ainsi que le pourcentage de
communes hors influences des pôles (127 communes). Surtout, ce dernier
élément peut être mis en lien avec le fait que le groupe 5 a beaucoup
moins d’actifs travaillant hors de la commune de résidence que la
moyenne française ou des communes fusionnantes. On peut donc parler de
communes “REAV” (Rurales, Enclavées, Agricoles et Vieillissantes). Ces
communes sont décentrées par rapport à l’ensemble des communes nouvelles
françaises : elles se trouvent davantage dans la partie sud et sud-est
de la France, mais à distance des littoraux, comme par exemple Mont
Lozère et Goulet (Lozère) ou la majorité de Neuvéglise-sur-Truyère
(Cantal) et Argences en Aubrac (Aveyron).
5.4 Chaque CN est-elle composée d’un seul type en fonction de la
typologie réalisée ?
À partir de la typologie réalisée, permettant de catégoriser les
communes fusionnantes sur la base de données socio-économiques, nous
pouvons étudier la composition des communes nouvelles sur ce plan.
count_CN_typo <- plyr::count(typo, "CODGEO_new")
mesCommunes <- count_CN_typo$CODGEO_new
df <- typo
results <- data.frame(matrix(ncol=nclass, nrow=0))
for (i in mesCommunes) {
toto <- subset (df, CODGEO_new == i )
a <- table(toto$Groupes)
results <- rbind(results,a)
rm(a, toto)
}
colnames(results) <- NomsGroupesCAH
count_CN_typo <- cbind(count_CN_typo, results)
count_CN_typo$max2 <- apply(count_CN_typo[, 3:(nclass+2)], 1, function(x) max(x, na.rm = TRUE))
count_CN_typo$Typomaj <- colnames(count_CN_typo[, 3:(nclass+2)])[apply(count_CN_typo[, 3:(nclass+2)], 1, which.max)]
count_CN_typo$TypoIdent <- ifelse(count_CN_typo$max == count_CN_typo$freq, TRUE, FALSE)
summary(count_CN_typo$TypoIdent)
## Mode FALSE TRUE
## logical 584 260
count_CN_typo$TypopresqIdent <- ifelse((count_CN_typo$freq - count_CN_typo$max2)/count_CN_typo$freq <= 0.25, TRUE, FALSE)
summary(count_CN_typo$TypopresqIdent)
## Mode FALSE TRUE
## logical 535 309
CNTypoIdent <- subset(count_CN_typo, TypoIdent==TRUE)
CNTypoIdent <- merge(CNTypoIdent, typo[, c("CODGEO", "Groupes")], by.x = "CODGEO_new", by.y = "CODGEO", all.x = TRUE)
tabcont<-summary(CNTypoIdent$Groupes)
count_CN_typo$Typomaj <- as.factor(count_CN_typo$Typomaj)
tabcont2<-summary(count_CN_typo$Typomaj)
tabcont3<-summary(typo$Groupes)
round(100*prop.table(tabcont,margin=),1)
## Groupe 1 PPCQ Groupe 2 PFO Groupe 3 MOARO Groupe 4 VAR Groupe 5 REAV
## 33.8 20.8 28.8 2.3 13.1
## NA's
## 1.2
round(100*prop.table(tabcont2,margin=),1)
## Groupe 1 PPCQ Groupe 2 PFO Groupe 3 MOARO Groupe 4 VAR Groupe 5 REAV
## 38.9 22.4 27.3 3.9 7.6
round(100*prop.table(tabcont3,margin=),1)
## Groupe 1 PPCQ Groupe 2 PFO Groupe 3 MOARO Groupe 4 VAR Groupe 5 REAV
## 24.7 22.6 33.1 4.8 14.9
tableau <- rbind(
summary(CNTypoIdent$Groupes),
round(100*prop.table(tabcont,margin=),1) * 100 / nrow(typo),
round(100*prop.table(tabcont,margin=),1),
summary(count_CN_typo$Typomaj),
round(100*prop.table(tabcont2,margin=),1),
summary(typo$Groupes),
round(100*prop.table(tabcont3,margin=),1)
)
row.names(tableau) <- c(
"Nombre de communes nouvelles regroupant des communes homogènes du point de vue de la typologie",
"Pourcentages en fonction de la totalité des communes nouvelles",
"Pourcentages en fonction de la totalité des communes nouvelles homogènes",
"Nombre de communes nouvelles ayant un type majoritaire",
"Pourcentages de chaque groupe majoritaire en fonction de la totalité des communes fusionnantes",
"Nombre de communes fusionnantes par groupe",
"Pourcentages de chaque groupe en fonction de la totalité des communes fusionnantes")
kable(tableau, align = "c", digits = c(0, 1, 1, 0, 1, 0, 1))
| Nombre de communes nouvelles regroupant des communes
homogènes du point de vue de la typologie |
88 |
54.0 |
75.0 |
6 |
34.0 |
3 |
| Pourcentages en fonction de la totalité des communes
nouvelles |
1 |
0.8 |
1.1 |
0 |
0.5 |
0 |
| Pourcentages en fonction de la totalité des communes
nouvelles homogènes |
34 |
20.8 |
28.8 |
2 |
13.1 |
1 |
| Nombre de communes nouvelles ayant un type
majoritaire |
328 |
189.0 |
230.0 |
33 |
64.0 |
328 |
| Pourcentages de chaque groupe majoritaire en fonction
de la totalité des communes fusionnantes |
39 |
22.4 |
27.3 |
4 |
7.6 |
39 |
| Nombre de communes fusionnantes par groupe |
659 |
602.0 |
882.0 |
127 |
398.0 |
659 |
| Pourcentages de chaque groupe en fonction de la
totalité des communes fusionnantes |
25 |
22.6 |
33.1 |
5 |
14.9 |
25 |
Conclusion : Une large majorité des communes nouvelles sont, du point
de vue de notre typologie, composées de communes au profil hétérogène.
Lorsque les communes nouvelles sont homogène du point de vue du profil
des communes fusionnantes, il s’agit, plus fréquemment, des groupes 1, 2
et 3. Mais si on compare ces pourcentages à la place de ces groupes dans
la population totale, on observe surtout qu’un groupe est bien plus
présent dans les communes homogènes que dans la population totale : le
groupe 1. Inversement, le groupe 5 est bien moins présent dans les
communes nouvelles homogènes que dans l’ensemble des communes
fusionnantes. On pourrait donc mettre en avant la création de communes
nouvelles plus fréquemment homogènes en contexte urbain.
5.5 Typologie et distance euclidienne
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))
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))
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 1 PPCQ |
26.2 |
12.0 |
24.0 |
| Groupe 2 PFO |
23.3 |
10.8 |
21.2 |
| Groupe 3 MOARO |
29.8 |
15.3 |
27.0 |
| Groupe 4 VAR |
43.3 |
14.3 |
42.8 |
| Groupe 5 REAV |
39.2 |
32.5 |
32.1 |
| Ensemble |
28.2 |
16.1 |
25.0 |
condformat(tmp[, c(1,2, 4)]) %>%
rule_fill_gradient2("Moyenne", low = "darkblue", high = "red", limits = c(min (tmp$Moyenne), max (tmp$Moyenne))) %>%
rule_fill_gradient2("Médiane", low = "darkblue", high = "red", limits = c(min(tmp$Médiane), max(tmp$Médiane))) %>%
theme_caption(caption = "Typologie et distance euclidienne intra-communes nouvelles") %>%
theme_htmlWidget(number_of_entries = nrow(tmp))
|
Typologie et distance euclidienne intra-communes nouvelles
|
|
|
Groupe majoritaire dans la commune nouvelle
|
Moyenne
|
Médiane
|
|
1
|
Groupe 1 PPCQ
|
26.2
|
24.0
|
|
2
|
Groupe 2 PFO
|
23.3
|
21.2
|
|
3
|
Groupe 3 MOARO
|
29.8
|
27.0
|
|
4
|
Groupe 4 VAR
|
43.3
|
42.8
|
|
5
|
Groupe 5 REAV
|
39.2
|
32.1
|
|
6
|
Ensemble
|
28.2
|
25.0
|
L’observation de la distance euclidienne en fonction des catégories
de communes précédemment élaborés permet de visualiser les différences
entre les groupes. Les communes dont le type majoritaire est le 1 et le
2, par exemple, sont en moyenne plus homogènes que les communes
nouvelles où les groupes 3, 5 et surtout 4 dominent.
5.6 Typologie vis-à-vis de quelques autres données
comparaisons <- data.frame( table (typo$Groupes))
typo$surface <- st_area(typo)
typo$surface <- set_units(typo$surface, km^2)
typo$densite <- typo$P09_POP/typo$surface
comparaisons$surface_moy <- round(tapply (typo$surface, typo$Groupes, mean), 2)
comparaisons$surface_med <- round(tapply (typo$surface, typo$Groupes, median), 2)
comparaisons$pop_moy <- round(tapply (typo$P09_POP, typo$Groupes, mean), 2)
comparaisons$pop_med <- round(tapply (typo$P09_POP, typo$Groupes, median), 2)
comparaisons$dens_moy <- round(tapply (typo$densite, typo$Groupes, mean), 2)
comparaisons$dens_med <- round(tapply (typo$densite, typo$Groupes, median), 2)
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)
typoregions <- data.frame(table(typo$REG, typo$Groupes))
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)
typoregions1 <- dcast(typoregions, LIBGEO ~ Var2, value.var = "Freq")
typoregions2 <- dcast(typoregions, Var2 ~ LIBGEO, value.var = "Freq")
min <- min(typoregions1[, 2:ncol(typoregions1)])
max <- max(typoregions1[, 2:ncol(typoregions1)])
table <- condformat(typoregions1) %>%
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) %>%
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)
table3 <- condformat(typoregions2) %>%
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) %>%
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)
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)
}
typodep <- data.frame(table(typo$CODE_DEPT, typo$Groupes))
typodep <- dcast(typodep, Var1 ~ Var2)
dep <- merge(dep, typodep, by.x = "CODE_DEPT", by.y = "Var1", all.x = TRUE)
dep[is.na(dep)] <- 0
NomsGroupesCAH2 <- str_replace_all(NomsGroupesCAH, " ", "_")
colnames(dep)[4:8] <- NomsGroupesCAH2
par(mfrow=c(2,3))
i <- NomsGroupesCAH2[5]
for (i in NomsGroupesCAH2) {
plot(st_geometry(dep))
propSymbolsLayer(x = dep,
var = i, symbols ="circle",
col = "#B00EF0",
legend.pos = "left",
legend.title.txt = "Nombre de communes fusionnantes", inches = 0.2, fixmax = 150)
}

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)
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.
NavettesToutes <- read.csv2("data-raw/Flux_domicile_travail/BTT_FM_DTR_2009.txt", stringsAsFactors=TRUE)
Pour exploiter ces données, nous nous sommes appuyés sur le package
flows, dont la démarche est présentée ici (https://cran.r-project.org/web/packages/flows/vignettes/flows.html)
(@giraud2016) et là (https://journals.openedition.org/netcom/2134) (@beauguitte2015).
nav <- NavettesToutes
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")
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")
nav <- subset(NavettesToutes, CODGEO == "61155" | DCLT == "61155" | CODGEO == "61324" | DCLT == "61324"
| CODGEO == "61455" | DCLT == "61455")
nav <- subset(NavettesToutes, CODGEO == "73006" | DCLT == "73006")
nav$CODGEO <- as.character(nav$CODGEO)
nav$DCLT <- as.character(nav$DCLT)
nav$L_DCLT <- as.character(nav$L_DCLT)
myflows <- prepflows(mat = nav, i = "CODGEO", j = "DCLT", fij = "NBFLUX_C09_ACTOCC15P")
myflows[1:4,1:4]
## 04096 05046 10323 29135
## 04096 0 0 0 0
## 05046 0 0 0 0
## 10323 0 0 0 0
## 29135 0 0 0 0
diag(myflows) <- 0
7.2 Premiers aperçus des flux
str(nav)
## 'data.frame': 98 obs. of 5 variables:
## $ CODGEO : chr "04096" "05046" "10323" "29135" ...
## $ LIBGEO : Factor w/ 34125 levels "Aast","Abainville",..: 12939 9283 24425 16952 19836 30191 6125 9991 24257 28325 ...
## $ DCLT : chr "73006" "73006" "73006" "73006" ...
## $ L_DCLT : chr "Aime" "Aime" "Aime" "Aime" ...
## $ NBFLUX_C09_ACTOCC15P: num 4 4.05 3.18 4.09 4.72 ...
statmat(mat = myflows, output = "all", verbose = FALSE)

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.
flowSel1 <- firstflows(mat = myflows, method = "nfirst", ties.method = "first",
k = 1)
flowSel1 <- firstflowsg(mat = myflows, method = "xfirst", k = 5)
flowSel1 <- firstflows(mat = myflows/rowSums(myflows)*100, method = "xfirst", k = 1)
flowSel2 <- domflows(mat = myflows, w = colSums(myflows), k = 1)
flowSel <- myflows * flowSel1 * flowSel2
flowSel <- myflows
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
inflows <- data.frame(id = colnames(flowSel), w = colSums(flowSel))
outflows <- data.frame(id = rownames(flowSel), w = apply(flowSel, 1, sum))
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$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
ShpCommunes2011 <- as(geom2011, "Spatial")
ShpEdC <- subset(ShpCommunes2011, CODGEO_new == "61324")
ShpEdC <- subset(ShpCommunes2011, CODE_DEPT == "61" | CODE_DEPT == "53")
ShpEdC <- subset(ShpCommunes2011, CODGEO_new =="73150" | CODGEO_new == "73006")
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.
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"
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
geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE)
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)
mesCommunes <- unique(datafus2011$CODGEO_new)
df <- NavettesToutes
df <- merge(df, datafus2011[, c("CODGEO", "CODGEO_new")], by = "CODGEO", all.x = TRUE)
df <- merge(df, datafus2011[, c("CODGEO", "CODGEO_new")], by.x = "DCLT", by.y = "CODGEO", all.x = TRUE)
df$CODGEO <- as.character(df$CODGEO)
df$DCLT <- as.character(df$DCLT)
df$L_DCLT <- as.character(df$L_DCLT)
rm(NavettesToutes, geomfus2011)
seuils <- c(5, 10, 20, 50)
for (s in seuils) {
results <- data.frame()
for (i in mesCommunes) {
nav1 <- subset (df, CODGEO_new.x == i | CODGEO_new.y == i )
listeCommunes <- c(unique(nav1$DCLT), unique(nav1$CODGEO))
listeCommunes <- unique(listeCommunes)
compil_Navettes <- data.frame(matrix(ncol=7, nrow=0))
for (z in listeCommunes) {
nav2 <- subset (df, DCLT == z)
compil_Navettes <- rbind(compil_Navettes, nav2)
}
nav <- unique(compil_Navettes)
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)
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)
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)
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)
}
seuils <- c(05, 10, 50, 100)
for (s in seuils) {
results <- data.frame()
for (i in mesCommunes) {
nav1 <- subset (df, CODGEO_new.x == i | CODGEO_new.y == i )
listeCommunes <- c(unique(nav1$DCLT), unique(nav1$CODGEO))
listeCommunes <- unique(listeCommunes)
compil_Navettes <- data.frame(matrix(ncol=7, nrow=0))
for (z in listeCommunes) {
nav2 <- subset (df, DCLT == z)
compil_Navettes <- rbind(compil_Navettes, nav2)
}
nav <- unique(compil_Navettes)
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)
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)
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)
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)
}
seuils <- c(1, 2, 5, 10)
for (s in seuils) {
results <- data.frame()
for (i in mesCommunes) {
nav1 <- subset (df, CODGEO_new.x == i | CODGEO_new.y == i )
listeCommunes <- c(unique(nav1$DCLT), unique(nav1$CODGEO))
listeCommunes <- unique(listeCommunes)
compil_Navettes <- data.frame(matrix(ncol=7, nrow=0))
for (z in listeCommunes) {
nav2 <- subset (df, DCLT == z)
compil_Navettes <- rbind(compil_Navettes, nav2)
}
nav <- unique(compil_Navettes)
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)
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)
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)
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
geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE)
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()
for (i in mesCommunes) {
Pranalyse <- subset(ResultsFlux, CODGEO_new == i)
a <- sum(Pranalyse$StatutNavettes %in% "Dominant")
b <- sum(Pranalyse$StatutNavettes %in% "Intermediary")
c <- sum(Pranalyse$StatutNavettes %in% "Dominated")
d <- Pranalyse$StatutNavettes[Pranalyse$CODGEO == Pranalyse$CODGEO_new]
resultspartiels <- c(i, a, b, c, d)
results <- rbind(results,resultspartiels, stringsAsFactors= FALSE)
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.
geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE)
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)
mesCommunes <- unique(datafus2011$CODGEO_new)
df <- NavettesToutes
df <- merge(df, datafus2011[, c("CODGEO", "CODGEO_new")], by = "CODGEO", all.x = TRUE)
df <- merge(df, datafus2011[, c("CODGEO", "CODGEO_new")], by.x = "DCLT", by.y = "CODGEO", all.x = TRUE)
df$CODGEO <- as.character(df$CODGEO)
df$DCLT <- as.character(df$DCLT)
df$L_DCLT <- as.character(df$L_DCLT)
rm(NavettesToutes, geomfus2011)
results <- data.frame()
for (i in mesCommunes) {
nav1 <- subset (df, CODGEO_new.x == i | CODGEO_new.y == i )
listeCommunes <- c(unique(nav1$DCLT), unique(nav1$CODGEO))
listeCommunes <- unique(listeCommunes)
compil_Navettes <- data.frame(matrix(ncol=7, nrow=0))
for (z in listeCommunes) {
nav2 <- subset (df, DCLT == z)
compil_Navettes <- rbind(compil_Navettes, nav2)
}
nav <- unique(compil_Navettes)
myflows <- prepflows(mat = nav, i = "CODGEO", j = "DCLT", fij = "NBFLUX_C09_ACTOCC15P")
diag(myflows) <- 0
flowSel1 <- firstflows(mat = myflows/rowSums(myflows)*100, method = "xsumfirst", k = 60)
flowSel2 <- domflows(mat = myflows, w = colSums(myflows), k = 1)
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)
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)
rm(resultspartiels, nav, nav1, nav2, compil_Navettes, myflows, flowSel, flowSel1, flowSel2, listeCommunes, Dominant, Dominated, Intermediary)
}
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.
geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE)
datafus2011 <- st_set_geometry(geomfus2011, NULL)
test <-
ResultsFlux <- read.table(paste0("sorties/export_results_flows_", test, ".txt"),
sep="\t", colClasses = "character", head = TRUE, stringsAsFactors = TRUE)
mesCommunes <- unique(ResultsFlux$CODGEO_new)
results <- data.frame()
for (i in mesCommunes) {
Pranalyse <- subset(ResultsFlux, CODGEO_new == i)
a <- sum(Pranalyse$StatutNavettes %in% "Dominant")
b <- sum(Pranalyse$StatutNavettes %in% "Intermediary")
c <- sum(Pranalyse$StatutNavettes %in% "Dominated")
d <- Pranalyse$StatutNavettes[Pranalyse$CODGEO == Pranalyse$CODGEO_new]
resultspartiels <- c(i, a, b, c, d)
results <- rbind(results,resultspartiels, stringsAsFactors= FALSE)
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 <-
"xfirst05pct_domflows1"
ResultsSynth <- read.table(paste0("sorties/Synthese_Dominants_", test, ".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))
| 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
| 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"
ResultsSynth <- read.table(paste0("sorties/Synthese_Dominants_", test, ".txt"),
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)
ResultsSynth <- merge(geomCN_new, ResultsSynth, by = "CODGEO_new")
par(mfrow = c(1, 1))
par(mar=c(0,0,1.2,0))
plot(st_geometry(dep), border = "#1A1A19",lwd = 1)
typoLayer(x = ResultsSynth, var = "StatutChefLieu",
col = c("#377eb8","#4daf4a","#e41a1c"),
border = NA,
legend.title.cex = 0.7,
legend.values.cex = 0.6,
legend.values.order = c("Dominated", "Intermediary", "Dominant"),
legend.pos = "left", add = T)
layoutLayer(title = paste0("Statut du chef-lieu des communes nouvelles\ndu point de vue des navettes quotidiennes", "\n[Critère : ", test, "]"),
author = "G. Bideau, R. Ysebaert, 2026.",
tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
sources = "Sources : INSEE, IGN, 2026.")
7.6.6 Les statuts des chefs-lieux en fonction des flux
sélectionnés
Liste des différents résultats en fonction des seuils retenus
concernant le statut des chefs-lieux
listetests <- c(
"xfirst05_domflows1"
, "xfirst50pct_domflows1"
, "xfirst20pct_domflows1"
, "xfirst10pct_domflows1"
, "xfirst05pct_domflows1"
, "nfirst2_domflows1"
, "nfirst5_domflows1"
, "nfirst10_domflows1"
)
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)
| 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
geomfus2011 <- st_read("data/geom.gpkg", layer = "geomfus2011", quiet = TRUE)
geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE)
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)
mesCommunes <- c("61324")
nomCommunes <- c()
for (i in mesCommunes) {
nomCommune <- df2011$LIBGEO_new[df2011$CODGEO == i]
nomCommunes <- c(nomCommunes, nomCommune)
}
df <- NavettesToutes
df <- merge(df, datafus2011[, c("CODGEO", "CODGEO_new")], by = "CODGEO", all.x = TRUE)
df <- merge(df, datafus2011[, c("CODGEO", "CODGEO_new")], by.x = "DCLT", by.y = "CODGEO", all.x = TRUE)
df$CODGEO <- as.character(df$CODGEO)
df$DCLT <- as.character(df$DCLT)
df$L_DCLT <- as.character(df$L_DCLT)
rm(NavettesToutes, geom2011, geomfus2011)
results <- data.frame()
ShpEdC <- subset(ShpCommunes2011, CODGEO == 0000)
for (i in mesCommunes) {
nav1 <- subset (df, CODGEO_new.x == i | CODGEO_new.y == i )
listeCommunes <- c(unique(nav1$DCLT), unique(nav1$CODGEO))
listeCommunes <- unique(listeCommunes)
compil_Navettes <- data.frame(matrix(ncol=7, nrow=0))
for (z in listeCommunes) {
nav2 <- subset (df, DCLT == z)
compil_Navettes <- rbind(compil_Navettes, nav2)
}
nav <- unique(compil_Navettes)
myflows <- prepflows(mat = nav, i = "CODGEO", j = "DCLT", fij = "NBFLUX_C09_ACTOCC15P")
diag(myflows) <- 0
flowSel1 <- firstflowsg(mat = myflows, method = "xfirst", k = 2)
flowSel2 <- domflows(mat = myflows, w = colSums(myflows), k = 1)
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))
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)
df <- subset(df, df$CODGEO != df$DCLT)
mesCommunes <- unique(df$CODGEO)
Results <- data.frame()
for (i in mesCommunes) {
dfextrait <- subset (df, CODGEO == i)
a <- which.max(dfextrait$NBFLUX_C09_ACTOCC15P)
b <- dfextrait$DCLT[a]
Dest <- c(i,b)
Results <- rbind(Results, Dest, stringsAsFactors= FALSE)
rm(a)
rm(dfextrait)
rm(b)
}
colnames(Results) <- c("CODGEO", "DestinationMax")
Results <- merge(Results, df2011[, c("CODGEO", "LIBGEO","CODGEO_new", "LIBGEO_new", "ChefLieu")], by = "CODGEO", all.x = TRUE)
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")
Results <- merge (Results, df2011 [, c("CODGEO", "FUSION")], by.x = "DestinationMax", by.y = "CODGEO")
Results$DestMaxEst <- ifelse(Results$CODGEO_new.x == Results$CODGEO_new.y, "Même_CN", "AutreCN")
Results$DestMaxEst[Results$FUSION.x == "NON"] <- "Origine_non_CN"
Results$DestMaxEst[Results$FUSION.y == "NON"] <- "Dest_non_CN"
Results$DestMaxEst[Results$FUSION.x == "NON" & Results$FUSION.y == "NON"] <- "Pas_de_CN"
tmp <- Results[, c("CODGEO", "CODGEO_new.x", "FUSION.x", "DestinationMax", "CODGEO_new.y", "FUSION.y", "DestMaxEst")]
Results$DestMaxEst <- as.factor(Results$DestMaxEst)
summary(Results$DestMaxEst)
## AutreCN Dest_non_CN Même_CN Origine_non_CN Pas_de_CN
## 352 1913 376 1481 31106
summary(Results$DestMaxEst) * 100 / nrow(Results)
## AutreCN Dest_non_CN Même_CN Origine_non_CN Pas_de_CN
## 0.9992052 5.4303395 1.0673328 4.2040422 88.2990803
ResultsComFus <- subset(Results, FUSION.x == "OUI")
summary(ResultsComFus$DestMaxEst)
## AutreCN Dest_non_CN Même_CN Origine_non_CN Pas_de_CN
## 352 1913 376 0 0
summary(ResultsComFus$DestMaxEst) * 100 / nrow(ResultsComFus)
## AutreCN Dest_non_CN Même_CN Origine_non_CN Pas_de_CN
## 13.32828 72.43468 14.23703 0.00000 0.00000
ResultsComFusChefLieu <- subset(Results, FUSION.x == "OUI" & ChefLieu.x == "O")
summary(ResultsComFusChefLieu$DestMaxEst)
## AutreCN Dest_non_CN Même_CN Origine_non_CN Pas_de_CN
## 119 799 15 0 0
summary(ResultsComFusChefLieu$DestMaxEst) * 100 / nrow(ResultsComFusChefLieu)
## AutreCN Dest_non_CN Même_CN Origine_non_CN Pas_de_CN
## 12.754555 85.637728 1.607717 0.000000 0.000000
ResultsComFusNonChefLieu <- subset(Results, FUSION.x == "OUI" & ChefLieu.x == "N")
summary(ResultsComFusNonChefLieu$DestMaxEst)
## AutreCN Dest_non_CN Même_CN Origine_non_CN Pas_de_CN
## 233 1114 361 0 0
summary(ResultsComFusNonChefLieu$DestMaxEst) * 100 / nrow(ResultsComFusNonChefLieu)
## AutreCN Dest_non_CN Même_CN Origine_non_CN Pas_de_CN
## 13.64169 65.22248 21.13583 0.00000 0.00000
7.7.3 Sortie tableau
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)
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 (%)")
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")]
colnames(tableau) <- c("Origine : ", " même commune nouvelle", " autre commune nouvelle", " non commune nouvelle", "Origine non commune nouvelle", "Origine et destination non communes nouvelles")
kable(tableau [, 1:4], row.names = FALSE, digits = 0, format = "html") %>%
kableExtra::add_header_above(c(" " = 1, "Destination" = 3))%>%
kableExtra::pack_rows(index = c(
"ensemble des communes françaises" = 2,
"communes fusionnantes" = 2,
"communes fusionnantes devenues chef-lieu" = 2,
"communes fusionnantes non chef-lieu" = 2))
|
|
Destination
|
|
Origine :
|
même commune nouvelle
|
autre commune nouvelle
|
non commune nouvelle
|
|
ensemble des communes françaises
|
|
Nombre
|
376
|
352
|
1913
|
|
Pourcentage (%)
|
1
|
1
|
5
|
|
communes fusionnantes
|
|
Nombre
|
376
|
352
|
1913
|
|
Pourcentage (%)
|
14
|
13
|
72
|
|
communes fusionnantes devenues chef-lieu
|
|
Nombre
|
15
|
119
|
799
|
|
Pourcentage (%)
|
2
|
13
|
86
|
|
communes fusionnantes non chef-lieu
|
|
Nombre
|
361
|
233
|
1114
|
|
Pourcentage (%)
|
21
|
14
|
65
|
[Anciens chiffres, mais résultats les plus récents ne vont pas à
l’encontre du discours] Le flux le plus important d’une commune
fusionnante est, dans 378 cas (15 %), une commune appartenant à la même
commune nouvelle, dans 321 cas (13 %), une autre commune nouvelle et
dans 1803 cas (72 %), une autre commune, hors commune nouvelle. Ces
éléments montrent, dans un premier temps, que les différences entre
territoires pratiqués quotidiennement et territoires communaux ne se
réduisent pas de manière drastique. La comparaison des statistiques
entre les communes devenant chef-lieux (ont à 1,9 % leur premier flux
vers la même commune nouvelle) et les autres communes fusionnantes (21 %
ont leur premier flux vers la même commune nouvelle) nous renseigne sur
la pôlarisation que peuvent exercer les communes chef-lieux qui,
visiblement, attirent un nombre conséquent de flux mais sont, elles,
plus souvent tournées vers une autre commune pour leur flux principal.
Si on excepte donc le cas des communes chefs-lieux, on observe néanmoins
que le pourcentage de communes fusionnantes orientant leur premier flux
vers la commune nouvelle concernée reste relativement faible (21 %).
7.8 L’indice d’attractivité
7.8.1 Calcul de l’indice
Le calcul de l’indice d’attractivité nécessite d’avoir la totalité
des flux entrant et des flux sortant. Nous ne disposions pas de cet
indicateur dans le fichier regroupant toutes les navettes.
load("data/refdata.Rdata")
rm (df_new)
df2011 <- df2011[, c("LIBGEO_new", "CODGEO_new", "LIBGEO", "CODGEO", "ChefLieu", "CATAEU2010", "FusPhas", "COM_NOUV", "FUSION", "P09_POP", "REG")]
testEdC <- subset (df2011, CODGEO_new == "61324" | CODGEO_new =="73150" | CODGEO_new == "73006")
testEdCSavoie <- subset (df2011, CODGEO_new =="73150" | CODGEO_new == "73006")
testNormandie <- subset (df2011, REG == "23" | REG == "25")
NavettesToutes <- read.csv2("data-raw/Flux_domicile_travail/BTT_FM_DTR_2009.txt", stringsAsFactors=TRUE)
mesCommunes <- df2011$CODGEO
df <- NavettesToutes
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) {
dfdep <- subset(df, CODGEO == i)
Departs <- sum(dfdep$NBFLUX_C09_ACTOCC15P)
dfarriv <- subset(df, DCLT == i)
Arrivees <- sum(dfarriv$NBFLUX_C09_ACTOCC15P)
Volume <- Departs + Arrivees
Solde <- Arrivees - Departs
Attractivite <- Solde / Volume
a <- c(i, Volume, Solde, Attractivite)
results <- rbind(results,a, stringsAsFactors= FALSE)
rm(a, dfarriv, dfdep, Arrivees, Departs, Solde, Attractivite)
}
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.
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")
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
df <- merge(df, datafus2011[, c("CODGEO", "CODGEO_new")], by = "CODGEO", all.x = TRUE)
df$CODGEO <- as.character(df$CODGEO)
df$DCLT <- as.character(df$DCLT)
df$L_DCLT <- as.character(df$L_DCLT)
rm(NavettesToutes)
mesCommunes <- c("73150")
datafus2011$CODGEO_new <- as.character(datafus2011$CODGEO_new)
mesCommunes <- unique(datafus2011$CODGEO_new)
mesCommunes <- as.character(mesCommunes)
results <- data.frame()
for (i in mesCommunes) {
nav1 <- subset (df, CODGEO_new == i)
nav1 <- subset (nav1, NBFLUX_C09_ACTOCC15P >= (0.05 * max(nav1$NBFLUX_C09_ACTOCC15P)))
nav1 <- nav1[order(-nav1$NBFLUX_C09_ACTOCC15P),]
listeCommunes <- c(unique(nav1$DCLT), unique(nav1$CODGEO))
listeCommunes <- unique(listeCommunes)
Pranalyse <- subset(IndiceAttract, CODGEO %in% listeCommunes)
a <- ifelse(Pranalyse$CODGEO_new[which.max(Pranalyse$Volume)] == i, "DsCN", "HorsCN")
a <- ifelse(Pranalyse$CODGEO[which.max(Pranalyse$Volume)] == i, "ChefLieu", a)
b <- ifelse(Pranalyse$CODGEO_new[which.max(Pranalyse$Solde)] == i, "DsCN", "HorsCN")
b <- ifelse(Pranalyse$CODGEO[which.max(Pranalyse$Solde)] == i, "ChefLieu", b)
c <- ifelse(Pranalyse$CODGEO_new[which.max(Pranalyse$IndiceAttractivite)] == i, "DsCN", "HorsCN")
c <- ifelse(Pranalyse$CODGEO[which.max(Pranalyse$IndiceAttractivite)] == i, "ChefLieu", c)
resultspartiels <- c(i, a, b, c)
results <- rbind(results,resultspartiels, stringsAsFactors= FALSE)
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_flux_sup_05pct.txt", sep="\t", row.names=FALSE)
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_flux_sup_05pct.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"))
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
| La commune avec le plus grand volume est |
21 |
0 |
823 |
| La commune avec le plus grand solde est |
21 |
1 |
822 |
| La commune avec la plus grande attractivité est |
51 |
11 |
782 |
On y observe que, très majoritairement, les communes nouvelles sont
constituées par des communes qui ne polarisent pas leur environnement.
En revanche, lorsque ces éléments sont dans les communes nouvelles, ils
sont très largement le fait des communes devenues chef-lieu, ce qui
paraît, de manière assez cohérente, aller dans une logique de
centralisation.
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,
eval = FALSE,
include = FALSE,
warning = TRUE,
message = TRUE,
cache=TRUE)
9 - MATRICE DE CONTIGUÏTÉ ET AUTOCORRÉLATION SPATIALE
Import des données
load("data/refdata.Rdata")
geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE)
geom_new <- st_read("data/geom.gpkg", layer = "geom_new", quiet = TRUE)
Il s’agit ici de creuser l’« effet de grappe », ce qu’on appelle
parfois l’« effet consultant ».
Matrice de voisinage (package spdep)
À l’aide de @bellefon2018.
library(spdep)
test_geom <- merge(geom2011, df2011[, c("CODGEO", "CODE_DEPT", "COM_NOUV", "P09_POP", "LIBGEO")], by = "CODGEO")
test_geom <- subset (test_geom, CODE_DEPT == "49" )
test_queen <- poly2nb(test_geom, queen = TRUE)
test_rook <- poly2nb(test_geom, queen = FALSE)
test_geom <- as(test_geom, "Spatial")
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")

test_liste <- nb2listw(test_queen, zero.policy = TRUE)
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"))

test_liste$neighbours
## Neighbour list object:
## Number of regions: 363
## Number of nonzero links: 2012
## Percentage nonzero weights: 1.526915
## Average number of links: 5.5427
isol <- test_geom2[c(5896, 7662, 10958, 10959, 10960, 11024, 21454, 21470, 21471, 21472, 21473, 33974),]
rm(isol, test_queen, test_rook)
À l’échelle du département du Maine-et-Loire, des différences
notables en fonction du voisinage choisi.
Officiellement, le contact par un point autorise à fusionner en
commune nouvelle donc choix du voisinage “queen”.
Cf. la réponse du ministère de l’intérieur à une question écrite au
Sénat sur la question de la continuité territoriale en 2009 : https://www.senat.fr/questions/base/2009/qSEQ090609011.html.
Calcul de l’indice de Moran (package spdep)
Cf. @bellefon2018a p. 56 sq. pour
l’explication et 62 pour le code.
test_geom$COM_NOUV2 <- dplyr::if_else(test_geom$COM_NOUV == "OUI", 1, 0)
moran.plot(test_geom$COM_NOUV2, test_liste, labels=FALSE , xlab="variable",ylab="moyenne des voisins")

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

Statistiques join count (package spdep)
Cf. @bellefon2018a p. 62 sq. pour
l’explication et 64 pour le code.
L’analyse des statistiques des join count observe, pour une
variable binaire, s’il y a une autocorrélation spatiale de la présence
d’individus partageant ou non une caractéristique. “on considère une
variable binaire qui représente deux couleurs, Blanc (B) et Noir (N) de
sorte qu’une liaison puisse être qualifiée de Blanc-Blanc, Noir-Noir ou
Blanc-Noir. On observe :
— une autocorrélation spatiale positive si le nombre de
liaisons Blanc-Noir est significativement inférieur à
ce que l’on aurait obtenu à partir d’une répartition spatiale aléatoire
;
— une autocorrélation spatiale négative si le nombre de
liaisons Blanc-Noir est significativement supérieur à
ce que l’on aurait obtenu à partir d’une répartition spatiale aléatoire
;
— aucune autocorrélation spatiale si le nombre de liaisons
Blanc-Noir est approximativement identique à ce que
l’on aurait obtenu à partir d’une répartition spatiale aléatoire.”
(p. 62-63, souligné dans le texte)
test_geom$COM_NOUV3 <- as.factor(test_geom$COM_NOUV)
class(test_geom$COM_NOUV3)
## [1] "factor"
joincount.test(test_geom$COM_NOUV3, test_liste, zero.policy=TRUE, alternative="greater",
sampling="nonfree", spChk=NULL, adjust.n=TRUE)
##
## Join count test under nonfree sampling
##
## data: test_geom$COM_NOUV3
## weights: test_liste
##
## Std. deviate for NON = 12.114, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Same colour statistic Expectation Variance
## 44.663005 26.113260 2.344626
##
##
## Join count test under nonfree sampling
##
## data: test_geom$COM_NOUV3
## weights: test_liste
##
## Std. deviate for OUI = 11.408, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Same colour statistic Expectation Variance
## 89.519769 69.613260 3.045139
Pour les communes nouvelles, on observe une autocorrélation positive
très nette et significative. L’autocorrélation est d’ailleurs également
significtive pour les communes non fusionnantes, même si la déviation
est moins nette.
LISA : Indice de Moran (package spdep)
Mesures locales d’association spatiale : LISA (Local Indicators
of Spatial Association).
Cf. @bellefon2018a p. 65 sq. pour
l’explication et 69 pour le code.
“Anselin (ANSELIN 1995) développe les notions introduites par Getis
et Ord en définissant des indicateurs d’autocorrélation spatiale locale.
Ceux-ci doivent permettre de mesurer l’intensité et la significativité
de la dépendance locale entre la valeur d’une variable dans une unité
spatiale et les valeurs de cette même variable dans les unités spatiales
environnantes.” (p. 65)
Fonction ‘localmoran’ du package ‘spdep’. Ii : local moran statistic
; E.Ii : expectation of local moran statistic ; Var.Ii : variance of
local moran statistic ; Z.Ii : standard deviate of local moran statistic
; Pr() : p-value of local moran statistic (https://www.rdocumentation.org/packages/spdep/versions/1.1-8/topics/localmoran).
Pour analyser correctement la représentativité des résultats,
plusieurs méthodes proposent d’ajuster la p-value :
“On considère que cette méthode [celle de Bonferroni] ne donne de
bons résultats que lorsque le nombre de tests réalisés est petit. […] La
méthode d’ajustement de Holm conduit à un plus grand nombre de clusters
significatifs que la méthode de Bonferroni. Elle lui est donc le plus
souvent préférée. Cependant, cette méthode se concentre aussi sur la
détection de l’existence d’au moins un cluster dans toute la
zone. […] La méthode du False Discovery Rate (FDR) a été
introduite par BENJAMINI et al. 1995. Avec cette méthode, le risque de
juger - à tort - un cluster comme significatif est plus élevé, mais
inversement le risque de juger - à tort - un cluster comme non
significatif est plus faible.” (p. 68) “La méthode de Holm diminue en
effet le risque de conclure à tort à l’existence d’une autocorrélation
spatiale locale. En revanche, cette méthode augmente le risque de passer
à côté d’un cluster local.” (p.69)
results_LISA<- as.data.frame(localmoran(test_geom$COM_NOUV2,test_liste,zero.policy=TRUE))
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)
par(mar = c(0,0,0,0), mfrow = c(2,2))
choroLayer(x = test_geom3 , var = "pvalue_ajuste_holm",
method = "quantile", nclass = 6,
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", 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", 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 = "")

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

par(mar = c(0,0,0,0), mfrow = c(1,1))
Matrice de voisinage (package rgeoda)
Présentation du package ‘rgeoda’ : https://geodacenter.github.io/rgeoda/articles/rgeoda_tutorial.html
Sur les matrices de contiguïté : https://geodacenter.github.io/workbook/4a_contig_weights/lab4a.html
Sur l’auto-corrélation : http://geodacenter.github.io/workbook/6a_local_auto/lab6a.html
library(rgeoda)
test_geom <- merge(geom2011, df2011[, c("CODGEO", "CODE_DEPT", "COM_NOUV", "P09_POP")], by = "CODGEO")
test_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
has_isolates(queen_w)
## [1] TRUE
LISA (package rgeoda)
NB : Sous-section qui peut poser problème lors d’un knit si n’est pas
executée en même temps que les précédentes (cela ne fonctionne pas bien
si les sous-sections précédentes sont en cache).
test_geom$COM_NOUV2 <- dplyr::if_else(test_geom$COM_NOUV == "OUI", 1, 0)
variable <- "COM_NOUV2"
df_variable <- test_geom[variable]
lisa <- local_moran(queen_w, df_variable)
lms <- lisa_values(gda_lisa = lisa)
pvals <- lisa_pvalues(lisa)
cats <- lisa_clusters(lisa, cutoff = 0.05)
lbls <- lisa_labels(lisa)
test_geom$LISA <- lms
test_geom$pvals <- pvals
test_geom$cats <- cats
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")
typoLayer(x = test_geom , var = "cats",
col = couleurs[1:length(levels(test_geom$cats))],
border = NA,
legend.pos = "topleft",
legend.values.order = levels(test_geom$cats),
legend.title.txt = "Indice de Moran locaux significatifs\nsur la variable de « commune nouvelle »\n(pvalue < 0,05)")
typoLayer(x = test_geom, var = "COM_NOUV",
legend.values.order = c("OUI", "NON"),
col=c("red","blue"),
border = NA,
legend.pos = "topleft",
legend.title.txt = "Communes fusionnantes")

par(mar = c(0,0,0,0), mfrow = c(1,1))
table(test_geom$cats, test_geom$COM_NOUV)
##
## NON OUI
## Not significant 30579 1111
## High-High 0 1557
## Low-High 2946 0
## High-Low 0 3
## Isolated 12 0
rm(variable, df_variable, lms, pvals, cats, lbls, num_levels, couleurs)
Boucle pour LISA sur données socio-économiques
L’objectif ici est d’observer si les communes nouvelles sont dans une
situation particulière du point de vue de l’auto-corrélation spatiale de
certaines variables socio-économiques.
Par exemple, on peut faire l’hypothèse qu’à l’échelle de la
Normandie, les communes nouvelles vont être plus fréquemment liées à des
clusters de forts taux de navetteurs et plutôt de faibles taux de
chômages.
test_geom <- merge(geom2011, df2011, by = "CODGEO")
test_geom <- subset (test_geom, REG == "25")
test_geomCN <- merge(geom_new, df_new, by = "CODGEO_new")
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
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"
mesCommunes <- subset(test_geom, test_geom$COM_NOUV == "OUI")
mesCommunes <- mesCommunes$CODGEO_new
subset_tableau <- test_geom[, c(vartests)]
for (variable in vartests) {
df_variable <- test_geom[variable]
lisa <- local_moran(queen_w, df_variable)
lms <- lisa_values(gda_lisa = lisa)
pvals <- lisa_pvalues(lisa)
cats <- lisa_clusters(lisa, cutoff = 0.05)
lbls <- lisa_labels(lisa)
test_geom$LISA <- lms
test_geom$pvals <- pvals
test_geom$cats <- cats
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))
test_geom$LISA_retenu <- ifelse(test_geom$pvals <= 0.1, yes = test_geom$LISA, no = NA)
couleurs <- c("#f7f7f7", "#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33")
typoLayer(x = test_geom , var = "cats",
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)"))
plot(st_geometry(test_geomCN), col = NA, border = "black", lwd = 1, add = TRUE)
results <- data.frame()
for (i in mesCommunes) {
toto <- subset (test_geom, CODGEO_new == i )
a <- table(toto$cats)
results <- rbind(results,a)
rm(a, toto)
}
colnames(results) <- levels(test_geom$cats)
results$CODGEO_new <- mesCommunes
print (summary(results))
}
## [1] "Not significant" "High-High" "Low-Low" "Low-High"
## [5] "High-Low"

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

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

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

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

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

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

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

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

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

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

## Not significant High-High Low-Low Low-High
## Min. : 0.000 Min. :0.0000 Min. :0.0000 Min. :0.000
## 1st Qu.: 2.000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.000
## Median : 4.000 Median :0.0000 Median :0.0000 Median :0.000
## Mean : 5.747 Mean :0.7065 Mean :0.7867 Mean :0.157
## 3rd Qu.: 8.000 3rd Qu.:1.0000 3rd Qu.:0.0000 3rd Qu.:0.000
## Max. :18.000 Max. :5.0000 Max. :8.0000 Max. :2.000
## High-Low CODGEO_new
## Min. :0.0000 Length:586
## 1st Qu.:0.0000 Class :character
## Median :0.0000 Mode :character
## Mean :0.1928
## 3rd Qu.:0.0000
## Max. :2.0000
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é.
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")
numcom <- sample(x = 1:nrow(test_geom), size = 1)
queen_w <- queen_weights(test_geom, order=1, include_lower_order = FALSE, precision_threshold = 0)
numvoisins <- get_neighbors(queen_w, idx = numcom)
cat("\nLes voisins de la commune", test_geom$LIBGEO[numcom], "(CODGEO", test_geom$CODGEO[numcom], ") sont :", test_geom$LIBGEO[numvoisins])
##
## Les voisins de la commune Ligné (CODGEO 16185 ) sont : Charmé Fouqueure Juillé Luxé Tusson
test_queen <- poly2nb(test_geom, queen = TRUE)
## Warning in poly2nb(test_geom, queen = TRUE): some observations have no neighbours;
## if this seems unexpected, try increasing the snap argument.
numvoisins <- unlist(test_queen[numcom])
cat("\nLes voisins de la commune", test_geom$LIBGEO[numcom], "sont :", test_geom$LIBGEO[numvoisins])
##
## Les voisins de la commune Ligné sont : Charmé Fouqueure Juillé Luxé Tusson
rm(numcom, numvoisins, queen_w, test_queen, test_geom)
datafus2011 <- subset(df2011, COM_NOUV == "OUI")
test_geom <- merge(geom2011, df2011[, c("CODGEO", "CODE_DEPT", "LIBGEO", "COM_NOUV", "P09_POP")], by = "CODGEO")
queen_w <- queen_weights(test_geom, order=1, include_lower_order = FALSE, precision_threshold = 0)
CODGEO_voisins_Cfus <- vector()
for (i in 1:nrow(datafus2011)) {
CODGEO_com <- datafus2011$CODGEO[i]
numcom <- which(test_geom$CODGEO==CODGEO_com)
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")
write.table(Com_voisines, "sorties/Nombre de communes limitrophes fusionnantes 2011-2024.txt", sep="\t", row.names=FALSE)
df2011 <- merge(df2011, Com_voisines, by = "CODGEO", all.x = TRUE)
df2011$Nbr_voisinage_Cfus[is.na(df2011$Nbr_voisinage_Cfus)] <- 0
dataNfus2011 <- subset(df2011, COM_NOUV == "NON")
table(dataNfus2011$Nbr_voisinage_Cfus)
##
## 0 1 2 3 4 5 6 7 8
## 28294 2916 1568 513 177 51 14 2 2
tabcont<-data.frame(table(df2011$COM_NOUV, df2011$Nbr_voisinage_Cfus))
tabcont<- subset(tabcont, Var2 != "0")
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")

tabcont<-table(df2011$COM_NOUV, df2011$Nbr_voisinage_Cfus)
tab <- round(100*prop.table(tabcont,margin=1),2)
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("Nombre de voisins étant une commune fusionnante") +
scale_y_continuous("Pourcentage de ce type de commune (fusionnante ou non)") +
scale_fill_manual("Communes\nfusionnantes", values = c("blue", "red")) +
ggtitle("Les communes en fonction de leur\nvoisinage d'une commune fusionnante")

Différences moyennes entre communes voisines fusionnantes ou
non
Cf. script créé à part (etude_voisines.Rmd)
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).
CIF_2012 <- read_excel("data-raw/budgets/CIF pour DGF 2012 et 2015.xls",
sheet = "CIF pour DGF 2012")
colnames(CIF_2012)
colnames(CIF_2012) <- c("EPCI_2012", "Nom_EPCI_2012", "CIF_2012")
CIF_2015 <- read_excel("data-raw/budgets/CIF pour DGF 2012 et 2015.xls",
sheet = "CIF pour DGF 2015")
colnames(CIF_2015)
colnames(CIF_2015) <- c("EPCI_2015", "Nom_EPCI_2015", "CIF_2015")
load("data/refdata.Rdata")
variables_etud <- c("CODGEO", "LIBGEO", "COM_NOUV", "EPCI", "CODE_DEPT", "CATAEU2010")
df2011_CIF <- merge(df2011[, variables_etud], CIF_2012, by.x = "EPCI", by.y = "EPCI_2012", all.x = TRUE)
df2011_CIF <- merge(df2011_CIF, CIF_2015, by.x = "EPCI", by.y = "EPCI_2015", all.x = TRUE)
df2011_CIF$CIF_2015_moins_CIF2012 <- df2011_CIF$CIF_2012 - df2011_CIF$CIF_2015
Import données CIF par df2011
load("data/refdata.Rdata")
df2011_CIF <- df2011[, c("CODGEO", "LIBGEO", "COM_NOUV", "EPCI", "CODE_DEPT", "CATAEU2010", "CIF_2012", "CIF_2015")]
Passage CIF en quintiles
df_sans_geom <- df2011_CIF
variables_quanti_quali <- c("CIF_2012", "CIF_2015")
variable <- "CIF_2012"
for (variable in variables_quanti_quali) {
Y <- df_sans_geom[, variable]
moy <- as.data.frame(tapply(df_sans_geom[, variable], df_sans_geom$COM_NOUV, mean, na.rm = TRUE))
moy$COM_NOUV <- row.names(moy)
colnames(moy) <- c("moyenne", "COM_NOUV")
med <- as.data.frame(tapply(df_sans_geom[, variable], df_sans_geom$COM_NOUV, median, na.rm = TRUE))
med$COM_NOUV <- row.names(moy)
colnames(med) <- c("median", "COM_NOUV")
histo <- ggplot(df_sans_geom)+
geom_histogram(aes(x=df_sans_geom[, variable], color = COM_NOUV), bins=50)+
labs(title = paste("Variable étudiée :\n", variable), subtitle = "Pointillés : moyennes.\nLignes pleines : médianes.")+
geom_vline(data=moy, aes(xintercept=moyenne, color=COM_NOUV), linetype="dashed") +
geom_vline(data=med, aes(xintercept=median, color=COM_NOUV)) +
ylab("Count")+theme_light()
print(histo)
coupures <- quantile(Y, probs=seq(0, 1, 0.2), na.rm = TRUE)
if (any(duplicated(coupures)) == FALSE) {
Y <- cut(Y,breaks=c(quantile(Y, probs=seq(0, 1, 0.2), na.rm = TRUE)))
levels(Y)<-c("Q1","Q2", "Q3", "Q4", "Q5")
}else{
Y <- cut(Y,breaks=c(quantile(Y, probs=seq(0, 1, 1/3), na.rm = TRUE)))
levels(Y)<-c("Tertile_inf","Tertile_med", "Tertile_sup")
Y <- relevel (Y, "Tertile_med", "Tertile_inf", "Tertile_sup")
}
summary(Y)
X <- df_sans_geom$COM_NOUV
summary(X)
tabcont<-table(X,Y)
print(kable(round(100*prop.table(tabcont,margin=2),1)))
df2011_CIF[, paste0(variable, "_quali")] <- Y
}
## Warning: Removed 1927 rows containing non-finite outside the scale range
## (`stat_bin()`).

##
##
## | | Q1| Q2| Q3| Q4| Q5|
## |:---|----:|----:|----:|----:|----:|
## |NON | 95.1| 94.6| 93.5| 91.5| 87.4|
## |OUI | 4.9| 5.4| 6.5| 8.5| 12.6|
## Warning: Removed 10801 rows containing non-finite outside the scale range
## (`stat_bin()`).

##
##
## | | Q1| Q2| Q3| Q4| Q5|
## |:---|----:|----:|----:|----:|--:|
## |NON | 96.1| 94.7| 93.1| 91.6| 85|
## |OUI | 3.9| 5.3| 6.9| 8.4| 15|
rm(tabcont, X, Y, df_sans_geom, variable, histo)
Sauvegarde données que CIF
colnames(df2011_CIF)
try(save(df2011_CIF, file = "data/data_CIF.Rdata"))
load("data/data_CIF.Rdata")
Première analyse
colnames(df2011_CIF)
## [1] "CODGEO" "LIBGEO" "COM_NOUV" "EPCI"
## [5] "CODE_DEPT" "CATAEU2010" "CIF_2012" "CIF_2015"
## [9] "CIF_2012_quali" "CIF_2015_quali"
summary(df2011_CIF$CIF_2012)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.0000 0.2934 0.3468 0.3671 0.4247 0.9846 1927
summary(df2011_CIF$CIF_2015)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.012 0.306 0.358 0.377 0.432 0.972 10801
summary(df2011_CIF$CIF_2015_moins_CIF2012)
## Length Class Mode
## 0 NULL NULL
table(df2011_CIF$COM_NOUV)
##
## NON OUI
## 33537 2671
summary(df2011_CIF$CIF_2015[df2011_CIF$COM_NOUV == "OUI"])
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.0628 0.3417 0.4075 0.4336 0.5103 0.9204 670
summary(df2011_CIF$CIF_2015[df2011_CIF$COM_NOUV == "NON"])
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.012 0.304 0.354 0.372 0.425 0.972 10131
summary(df2011_CIF$CIF_2012[df2011_CIF$COM_NOUV == "OUI"])
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.06075 0.32063 0.38902 0.41443 0.48737 0.95883 74
summary(df2011_CIF$CIF_2012[df2011_CIF$COM_NOUV == "NON"])
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.0000 0.2912 0.3443 0.3632 0.4207 0.9846 1853
tapply(df2011_CIF$CIF_2012, INDEX = df2011_CIF$COM_NOUV, median, na.rm = TRUE)
## NON OUI
## 0.344261 0.389019
tapply(df2011_CIF$CIF_2015, INDEX = df2011_CIF$COM_NOUV, median, na.rm = TRUE)
## NON OUI
## 0.354408 0.407451
table(nchar(df_new$CIF_2012))
##
## 1 2 4 5 6 7 8 10 11 15 16 17 19
## 29 17 8 37 201 2831 29257 4 18 3 16 93 2
## 20 24 25 26
## 3 1 1 5
length (grep(pattern = "-", df_new$CIF_2012, ignore.case = FALSE))
## [1] 146
aovCIF_2012 <- aov(CIF_2012 ~ COM_NOUV, data = df2011_CIF)
summary(aovCIF_2012)
## Df Sum Sq Mean Sq F value Pr(>F)
## COM_NOUV 1 6.3 6.294 392.1 <2e-16 ***
## Residuals 34279 550.3 0.016
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 1927 observations effacées parce que manquantes
aovCIF_2015 <- aov(CIF_2015 ~ COM_NOUV, data = df2011_CIF)
summary(aovCIF_2015)
## Df Sum Sq Mean Sq F value Pr(>F)
## COM_NOUV 1 7.0 6.989 498.2 <2e-16 ***
## Residuals 25405 356.4 0.014
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 10801 observations effacées parce que manquantes
couleurs <- c("#2b83ba", "red4")
df2011_CIF$COM_NOUV <- as.factor(df2011_CIF$COM_NOUV)
ggplot(df2011_CIF, aes(x=COM_NOUV, y=CIF_2012, color = COM_NOUV)) + geom_boxplot() + scale_color_manual(values=couleurs)
## Warning: Removed 1927 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

ggplot(df2011_CIF, aes(x=COM_NOUV, y=CIF_2015, color = COM_NOUV)) + geom_boxplot() + scale_color_manual(values=couleurs)
## Warning: Removed 10801 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

Bilan : La relation est bien significative à l’échelle nationale.
Par départements
df2011_CIF$COM_NOUV_DEPT <- paste0(df2011_CIF$CODE_DEPT, "_", df2011_CIF$COM_NOUV)
tapply(df2011_CIF$CIF_2012, INDEX = df2011_CIF$COM_NOUV_DEPT, median, na.rm = TRUE)
## 01_NON 01_OUI 02_NON 02_OUI 03_NON 03_OUI 04_NON 04_OUI
## 0.3274830 0.2236200 0.3335760 0.3356640 0.3232440 0.2537710 0.3064320 0.6087480
## 05_NON 05_OUI 06_NON 07_NON 07_OUI 08_NON 08_OUI 09_NON
## 0.3934160 0.4512620 0.3590470 0.3435130 0.3732310 0.4051960 0.4051960 0.4305600
## 09_OUI 10_NON 10_OUI 11_NON 11_OUI 12_NON 12_OUI 13_NON
## 0.4451325 0.2686150 0.3241670 0.3266090 0.3176990 0.4566900 0.4101720 0.3300080
## 14_NON 14_OUI 15_NON 15_OUI 16_NON 16_OUI 17_NON 17_OUI
## 0.4015580 0.4379780 0.3187340 0.3446280 0.3729620 0.3661490 0.3292630 0.3262065
## 18_NON 18_OUI 19_NON 19_OUI 21_NON 21_OUI 22_NON 22_OUI
## 0.2776640 0.4932390 0.2824650 0.3259860 0.3647870 0.3166005 0.3418800 0.3206320
## 23_NON 23_OUI 24_NON 24_OUI 25_NON 25_OUI 26_NON 26_OUI
## 0.3180490 0.3123440 0.3472290 0.4002130 0.3475160 0.3977300 0.3287080 0.3312840
## 27_NON 27_OUI 28_NON 28_OUI 29_NON 29_OUI 30_NON 30_OUI
## 0.4255660 0.4522910 0.3107720 0.3036055 0.3080970 0.3362240 0.3799470 0.4397670
## 31_NON 31_OUI 32_NON 32_OUI 33_NON 33_OUI 34_NON 34_OUI
## 0.3816680 0.4097420 0.3060060 0.3311140 0.3380350 0.3712910 0.3525510 0.3759015
## 35_NON 35_OUI 36_NON 36_OUI 37_NON 37_OUI 38_NON 38_OUI
## 0.2973810 0.3635460 0.3227890 0.3246120 0.3050440 0.2458710 0.3240910 0.3294440
## 39_NON 39_OUI 40_NON 40_OUI 41_NON 41_OUI 42_NON 42_OUI
## 0.3431750 0.5192400 0.3204340 0.3628760 0.2926370 0.3443070 0.3152940 0.4078650
## 43_NON 43_OUI 44_NON 44_OUI 45_NON 45_OUI 46_NON 46_OUI
## 0.3351820 0.3117910 0.3657340 0.3667820 0.3258170 0.5009250 0.4243620 0.6554310
## 47_NON 48_NON 48_OUI 49_NON 49_OUI 50_NON 50_OUI 51_NON
## 0.3952220 0.3639700 0.3333100 0.3345910 0.3553610 0.4498320 0.4773720 0.4934310
## 51_OUI 52_NON 52_OUI 53_NON 53_OUI 54_NON 54_OUI 55_NON
## 0.4217640 0.3701420 0.5657980 0.3410470 0.5316910 0.4033700 0.4583980 0.5623520
## 55_OUI 56_NON 56_OUI 57_NON 57_OUI 58_NON 58_OUI 59_NON
## 0.5107815 0.3103780 0.3457820 0.3540660 0.2923190 0.3188690 0.4631800 0.3907630
## 59_OUI 60_NON 60_OUI 61_NON 61_OUI 62_NON 62_OUI 63_NON
## 0.4516660 0.3271950 0.3417440 0.5862760 0.5514440 0.3760670 0.3853450 0.3026560
## 63_OUI 64_NON 64_OUI 65_NON 65_OUI 66_NON 67_NON 67_OUI
## 0.3263350 0.3573670 0.4360120 0.4505030 0.2643950 0.3019480 0.3559440 0.3626080
## 68_NON 68_OUI 69_NON 69_OUI 70_NON 70_OUI 71_NON 71_OUI
## 0.3406890 0.3574930 0.3818990 0.3818990 0.4399290 0.3420770 0.3170550 0.3788120
## 72_NON 72_OUI 73_NON 73_OUI 74_NON 74_OUI 75_NON 76_NON
## 0.3010030 0.3078320 0.3195390 0.2819820 0.3063470 0.3063470 NA 0.3245760
## 76_OUI 77_NON 77_OUI 78_NON 78_OUI 79_NON 79_OUI 80_NON
## 0.4603475 0.2451070 0.4034010 0.2998400 0.2418070 0.3689560 0.3391440 0.3945290
## 80_OUI 81_NON 81_OUI 82_NON 83_NON 84_NON 85_NON 85_OUI
## 0.5559580 0.3150850 0.4077270 0.3499290 0.2912690 0.2941560 0.3528180 0.3731020
## 86_NON 86_OUI 87_NON 87_OUI 88_NON 88_OUI 89_NON 89_OUI
## 0.3025210 0.3438840 0.3087590 0.3309320 0.2944210 0.3234680 0.2747770 0.3279400
## 90_NON 90_OUI 91_NON 91_OUI 92_NON 93_NON 93_OUI 94_NON
## 0.3840340 0.3840340 0.2955200 0.4310490 0.2321120 0.0952380 0.4072780 0.2379510
## 95_NON 95_OUI
## 0.2435910 0.2542600
tapply(df2011_CIF$CIF_2015, INDEX = df2011_CIF$COM_NOUV_DEPT, median, na.rm = TRUE)
## 01_NON 01_OUI 02_NON 02_OUI 03_NON 03_OUI 04_NON 04_OUI
## 0.3531400 0.4312230 0.3274240 0.3298340 0.3189210 0.3449450 0.3431620 0.6559215
## 05_NON 05_OUI 06_NON 07_NON 07_OUI 08_NON 08_OUI 09_NON
## 0.3281010 0.4437750 0.2670920 0.4092950 0.5480900 0.3951090 0.3951090 0.4423780
## 09_OUI 10_NON 10_OUI 11_NON 11_OUI 12_NON 12_OUI 13_NON
## 0.4445365 0.2631850 0.3287680 0.3179850 0.3179850 0.4593540 0.4445410 0.3730380
## 14_NON 14_OUI 15_NON 15_OUI 16_NON 16_OUI 17_NON 17_OUI
## 0.4406630 0.4480870 0.3325710 0.3604990 0.3567680 0.3567680 0.3995320 0.3505665
## 18_NON 18_OUI 19_NON 19_OUI 21_NON 21_OUI 22_NON 22_OUI
## 0.2990250 0.5202650 0.3224860 0.3384890 0.3636390 0.3261610 0.3446460 0.3438940
## 23_NON 23_OUI 24_NON 24_OUI 25_NON 25_OUI 26_NON 26_OUI
## 0.3298850 0.3124930 0.3384250 0.3965630 0.3687070 0.3687070 0.3646480 0.3697130
## 27_NON 27_OUI 28_NON 28_OUI 29_NON 29_OUI 30_NON 30_OUI
## 0.4342490 0.4791615 0.3314290 0.3544080 0.3249230 0.3539360 0.3841100 0.4409950
## 31_NON 31_OUI 32_NON 32_OUI 33_NON 33_OUI 34_NON 34_OUI
## 0.3934230 0.4253870 0.3014730 0.3382030 0.3470810 0.3725770 0.4062830 0.2975200
## 35_NON 35_OUI 36_NON 36_OUI 37_NON 37_OUI 38_NON 38_OUI
## 0.3608080 0.4502030 0.3298040 0.3355885 0.3186960 0.3072070 0.3609360 0.3405860
## 39_NON 39_OUI 40_NON 40_OUI 41_NON 41_OUI 42_NON 42_OUI
## 0.3882120 0.5005060 0.3298240 0.3689430 0.3335970 0.5393640 0.3348760 0.4002310
## 43_NON 43_OUI 44_NON 44_OUI 45_NON 45_OUI 46_NON 46_OUI
## 0.3388420 0.3097610 0.3852720 0.3882150 0.3369780 0.4870860 0.4439490 0.6350160
## 47_NON 48_NON 48_OUI 49_NON 49_OUI 50_NON 50_OUI 51_NON
## 0.3746545 0.3973010 0.3415965 0.3496720 0.3865780 0.4702890 0.5070960 0.4665950
## 51_OUI 52_NON 52_OUI 53_NON 53_OUI 54_NON 54_OUI 55_NON
## 0.4665950 0.3701730 0.5678330 0.3496130 0.5205580 0.4050780 0.4587680 0.5808050
## 55_OUI 56_NON 56_OUI 57_NON 57_OUI 58_NON 58_OUI 59_NON
## 0.6557730 0.3416640 0.3416640 0.3395220 0.2886270 0.3270950 0.3256330 0.4487250
## 59_OUI 60_NON 60_OUI 61_NON 61_OUI 62_NON 62_OUI 63_NON
## 0.4487250 0.3272970 0.3527580 0.5706360 0.5697960 0.3772590 0.3995710 0.3391390
## 63_OUI 64_NON 64_OUI 65_NON 65_OUI 66_NON 67_NON 67_OUI
## 0.3505930 0.3887585 0.3655690 0.4696420 0.2172130 0.3166440 0.3555080 0.3652040
## 68_NON 68_OUI 69_NON 69_OUI 70_NON 70_OUI 71_NON 71_OUI
## 0.3494320 0.3652075 0.3817230 0.4070540 0.4571990 0.4386655 0.3416410 0.4768730
## 72_NON 72_OUI 73_NON 73_OUI 74_NON 74_OUI 75_NON 76_NON
## 0.2950830 0.3204070 0.3759380 0.2961110 0.3465450 0.3465450 NA 0.3282690
## 76_OUI 77_NON 77_OUI 78_NON 78_OUI 79_NON 79_OUI 80_NON
## 0.4663370 0.2856030 0.4121980 0.3336830 0.2831175 0.4041690 0.4041690 0.4098330
## 80_OUI 81_NON 81_OUI 82_NON 83_NON 84_NON 85_NON 85_OUI
## 0.5612090 0.3057190 0.5434930 0.3554300 0.3295980 0.3226510 0.3503250 0.3607830
## 86_NON 86_OUI 87_NON 87_OUI 88_NON 88_OUI 89_NON 89_OUI
## 0.3013580 0.3552670 0.3272650 0.3539970 0.2744290 0.3353260 0.2610020 0.3080770
## 90_NON 90_OUI 91_NON 91_OUI 92_NON 93_NON 93_OUI 94_NON
## 0.3738870 0.3738870 0.3138830 0.4051160 0.2517780 0.1825290 0.3881320 0.2635280
## 95_NON 95_OUI
## 0.2444230 NA
aovCIF_2012 <- aov(CIF_2012 ~ COM_NOUV_DEPT, data = df2011_CIF)
summary(aovCIF_2012)
## Df Sum Sq Mean Sq F value Pr(>F)
## COM_NOUV_DEPT 176 145.7 0.828 68.72 <2e-16 ***
## Residuals 34104 410.9 0.012
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 1927 observations effacées parce que manquantes
aovCIF_2015 <- aov(CIF_2015 ~ COM_NOUV_DEPT, data = df2011_CIF)
summary(aovCIF_2015)
## Df Sum Sq Mean Sq F value Pr(>F)
## COM_NOUV_DEPT 175 104.7 0.5983 58.36 <2e-16 ***
## Residuals 25231 258.7 0.0103
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 10801 observations effacées parce que manquantes
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, ")")
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 = " ") +
scale_color_manual (values=couleurs, labels = c("\nCommunes\ninchangées\n", "\nCommunes\nfusionnantes\n"))
## Warning: Removed 277 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

ggplot(df2011_CIF_subset, aes(x=COM_NOUV_DEPT, y=CIF_2015, color = COM_NOUV)) +
geom_boxplot() +
scale_x_discrete(name = "Département des communes fusionnantes ou non (et nombre)", labels = nom_groupe) +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(subtitle = "Coefficient d'Intégration Fiscale des communes fusionnantes ou non",
x = "Département des communes fusionnantes ou non (et nombre)",
y = "CIF (2015)",
color = "Statut de la commune") +
scale_color_manual (values=couleurs, labels = c("Communes non fusionnantes", "Communes fusionnantes"))
## Warning: Removed 2227 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

Analyse par départements qui va dans le même sens : Les communes qui
fusionnent ont un CIF plus élevé, quel que soit le département pris en
compte. Quelques rares contre-exemples : Lozère (48), Savoie (73).
Cartographie par départements
CIF_dep <- as.data.frame(tapply(df2011_CIF$CIF_2012, df2011_CIF$CODE_DEPT, mean, na.rm = TRUE))
colnames(CIF_dep) <- "CIF_moy_dep"
CIF_dep$CODE_DEPT <- row.names(CIF_dep)
dep <- st_read("data/geom.gpkg", layer = "dep", quiet = TRUE)
ShpDep <- as(dep, "Spatial")
CIF_dep1 <- merge (dep, CIF_dep, by = "CODE_DEPT")
choroLayer(
x = CIF_dep1,
var = "CIF_moy_dep",
col = carto.pal(pal1 = "blue.pal", n1 = 4), method = "quantile",
nclass = 4,
legend.values.rnd = 2,
legend.pos = "topleft",
legend.title.txt = "CIF 2012 moyen\npar département",
legend.title.cex = 0.8, legend.values.cex = 0.8)
layoutLayer(
sources = "Source : INSEE, DGCL, 2012, 2024.", scale = NULL,
author = "Auteur : G. Bideau.", frame ="", col = NA)
datafus2011 <- subset(df2011, COM_NOUV == "OUI")
tmp <- aggregate(list(NUMBER_FUS = datafus2011[,"CODE_DEPT"]),
by = list(DEPT = datafus2011$CODE_DEPT),
FUN = length)
dep <- merge (dep, tmp, by.x = "CODE_DEPT", by.y = "DEPT", all.x = TRUE)
propSymbolsLayer(x = dep,
var = "NUMBER_FUS", symbols ="circle",
col = "red",
legend.pos = "left",
legend.title.txt = "\n\n\nNombre de communes\nfusionnantes",
legend.style = "e",
inches = 0.1,
legend.title.cex = 0.8, legend.values.cex = 0.8,
add = TRUE)

Par CATAEU
df2011_CIF$COM_NOUV_CATAEU <- paste0(df2011_CIF$CATAEU, "_", df2011_CIF$COM_NOUV)
tapply(df2011_CIF$CIF_2012, INDEX = df2011_CIF$COM_NOUV_CATAEU, median, na.rm = TRUE)
## 111_NON 111_OUI 112_NON 112_OUI 120_NON 120_OUI 211_NON 211_OUI
## 0.3384560 0.3620360 0.3356640 0.3737370 0.3535520 0.3973730 0.3237825 0.4004340
## 212_NON 212_OUI 221_NON 221_OUI 222_NON 222_OUI 300_NON 300_OUI
## 0.3686970 0.3709110 0.3256895 0.3667820 0.3248970 0.3581060 0.3462850 0.3832240
## 400_NON 400_OUI
## 0.3627260 0.4227230
tapply(df2011_CIF$CIF_2015, INDEX = df2011_CIF$COM_NOUV_CATAEU, median, na.rm = TRUE)
## 111_NON 111_OUI 112_NON 112_OUI 120_NON 120_OUI 211_NON 211_OUI
## 0.3475430 0.3707430 0.3505810 0.3956690 0.3727790 0.4166200 0.3378250 0.4731470
## 212_NON 212_OUI 221_NON 221_OUI 222_NON 222_OUI 300_NON 300_OUI
## 0.3741900 0.4499505 0.3453765 0.3865780 0.3313610 0.3865780 0.3544080 0.4118080
## 400_NON 400_OUI
## 0.3687580 0.4178770
aovCIF_2012 <- aov(CIF_2012 ~ COM_NOUV_CATAEU, data = df2011_CIF)
summary(aovCIF_2012)
## Df Sum Sq Mean Sq F value Pr(>F)
## COM_NOUV_CATAEU 17 15.1 0.8873 56.14 <2e-16 ***
## Residuals 34263 541.5 0.0158
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 1927 observations effacées parce que manquantes
aovCIF_2015 <- aov(CIF_2015 ~ COM_NOUV_CATAEU, data = df2011_CIF)
summary(aovCIF_2015)
## Df Sum Sq Mean Sq F value Pr(>F)
## COM_NOUV_CATAEU 17 11.7 0.6911 49.9 <2e-16 ***
## Residuals 25389 351.6 0.0139
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 10801 observations effacées parce que manquantes
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, ")")
ggplot(df2011_CIF_subset, aes(x=COM_NOUV_CATAEU, y=CIF_2012, color = COM_NOUV)) + geom_boxplot() + scale_x_discrete(labels = nom_groupe) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_color_manual (values=couleurs, labels = c("Communes non fusionnantes", "Communes fusionnantes"))
## Warning: Removed 277 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

ggplot(df2011_CIF_subset, aes(x=COM_NOUV_CATAEU, y=CIF_2015, color = COM_NOUV)) + geom_boxplot() + geom_boxplot() + scale_x_discrete(labels = nom_groupe) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + scale_color_manual (values=couleurs, labels = c("Communes non fusionnantes", "Communes fusionnantes"))
## Warning: Removed 2227 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
## Warning: Removed 2227 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

Analyse par catégorie d’aires urbaines qui va dans le même sens : Les
communes qui fusionnent ont un CIF plus élevé, quelle que soit la
catégorie prise en compte.
Cartographie CIF et CN
geom2011 <- st_read("data/geom.gpkg", layer = "geom2011", quiet = TRUE)
pr_carto_CIF <- merge(geom2011, df2011_CIF, by = "CODGEO")
colnames(pr_carto_CIF)
## [1] "CODGEO" "LIBGEO" "COM_NOUV" "EPCI"
## [5] "CODE_DEPT" "CATAEU2010" "CIF_2012" "CIF_2015"
## [9] "CIF_2012_quali" "CIF_2015_quali" "COM_NOUV_DEPT" "COM_NOUV_CATAEU"
## [13] "geom"
choroLayer(x = pr_carto_CIF , var = "CIF_2012",
method = "quantile", nclass = 5,
col = carto.pal(pal1 = "blue.pal", n1 = 5),
border = NA,
legend.pos = "topleft", legend.values.rnd = 2,
legend.title.txt = "Nombre d'habitants (2009,\nregroupement par quartiles)")
plot(st_geometry(dep), add = TRUE, lwd = 0.3)
layoutLayer(title = " ",
author = "G. Bideau, 2024",
tabtitle = TRUE, frame = FALSE, col = "white", coltitle = "black",
sources = "Sources : INSEE, IGN, 2024")
