1 IMPORT ET PRÉPARATION DES DONNÉES

1.1 Import des données de data_prep

Plusieurs données sont importées.

Et tout d’abord plusieurs géométries : - geom2011 : Les communes selon la géographie en vigueur au 1er janvier 2011. - geom_new : L’ensemble des communes françaises, avec les géométries au 1er janvier de l’année la plus récente choisie et caractérisées par les données à la géométrie 2011 agrégées ainsi - geomfus2011 : Les communes qui ont participé à la création de communes nouvelles (appelées communes fusionnantes ou parfois communes historiques). - geomCN_new : Les communes nouvelles, avec les géométries au 1er janvier de l’année la plus récente choisie et caractérisées par les données à la géométrie 2011 agrégées ainsi. - dep : Les départements.

Les données sont ensuite importées depuis le fichier refdata_budgets.Rdata, comportant les données de la base DAC ainsi que les données budgétaires. Elles ont été mises en formes à l’aide du script “CN_budgets_data_prep_2011-2022”

NB : Sauf mention contraire, les variables en valeur absolues faisant référence à un montant financier sont exprimées en milliers d’euros

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

# Import des données
load("data/refdata_budgets_2011-2022.Rdata") # Pour charger les données des budgets adjointes à la base DAC
# On supprime une bonne partie des NA liées aux données des communes nouvelles en mentionnant NC (Non concerné)
df2011$ComDLG[is.na(df2011$ComDLG)] <- "NC"
df2011$FusDate[is.na(df2011$FusDate)] <- "NC"
df2011$FusPhas[is.na(df2011$FusPhas)] <- "NC"

df_new$ComDLG[is.na(df_new$ComDLG)] <- "NC"
df_new$FusDate[is.na(df_new$FusDate)] <- "NC"
df_new$FusPhas[is.na(df_new$FusPhas)] <- "NC"

2 On ajoute les données spécifiant si les communes sont fusionnantes, voisines de fusionnantes ou non fusionnantes.

Com_voisines <- read.table("sorties/Nombre de communes limitrophes fusionnantes.txt", sep="\t", colClasses = c("character", "numeric"), head = TRUE, stringsAsFactors = TRUE)
df2011 <- merge(df2011, Com_voisines, by = "CODGEO", all.x = TRUE)
df2011$Nbr_voisinage_Cfus[is.na(df2011$Nbr_voisinage_Cfus)] <- 0

# Si on veut intégrer l'idée de proximité des communes nouvelles
df2011$COM_NOUV_voisinage <- ifelse(df2011$COM_NOUV == "NON" & df2011$Nbr_voisinage_Cfus >= 1, "NON_mais_voisine", df2011$COM_NOUV)
table(df2011$COM_NOUV_voisinage)
## 
##              NON NON_mais_voisine              OUI 
##            28761             4911             2536

2.1 Import des méta-données

2.2 Création de fonctions

Création de deux fonctions permettant de supprimer des valeurs trop extrêmes.

# Création d'une fonction pour détecter les valeurs extrêmes (conseil relecteur RERU)
# Par valeur extrême, nous désignons les observations dont la valeur est supérieure à trois fois la plage interquartile au-dessus du troisième quartile ou inférieure de plus de trois fois la plage interquartile en-dessous du premier quartile.
# Alors, la fonction renvoi "vrai"
# Source : https://stacklima.com/comment-supprimer-les-valeurs-aberrantes-de-plusieurs-colonnes-dans-r-dataframe/
# NB : On a juste mis 3 fois la plage interquartile à la place de 1,5 fois
# create detect outlier function
detect_outlier <- function(x, y) {
    # calculate first quantile
  Quantile1 <- quantile(x, probs=.25, na.rm = TRUE)
    # calculate third quantile
  Quantile3 <- quantile(x, probs=.75, na.rm = TRUE)
    # calculate inter quartile range
  IQR = Quantile3-Quantile1
  
  # return true or false
  x > Quantile3 + (IQR*y) | x < Quantile1 - (IQR*y)
}
# NB : Pour visualiser la fonction toute seule
# detect_outlier(nom_data_frame[[nom_colonne]])
# detect_outlier(df_comparaison[['evol_prct']])
# Utilisation possible
# df_comparaison$evolprct[detect_outlier(df_comparaison$evolprct) == TRUE] <- NA


# On crée une fonction qui enlève les individus dont une valeur est extrême
# NB : PAS TESTÉE DEPUIS QUE LE NOMBRE D'ÉCART-TYPES (y) A ÉTÉ RAJOUTÉ
# Ne sera pas utilisée car pas utile dans la boucle
remove_outlier <- function(dataframe,
                            columns=names(dataframe), y) {
  # for loop to traverse in columns vector
  for (col in columns) {
    # remove observation if it satisfies outlier function
    dataframe <- dataframe[!detect_outlier(dataframe[[col]], y), ]
  test_df_comparaison$evolprct <- dataframe[!detect_outlier(dataframe[[col]], y), ]
    }
  # return dataframe
  print("Remove outliers")
  print(dataframe)
}

2.3 Création de sous-ensembles

datafus2011 <- subset(df2011, COM_NOUV == "OUI")# Désigne les données concernant les communes ayant participé à la création d'une commune nouvelle, appelées ici communes fusionnantes
dataCN_new <- subset(df_new, COM_NOUV == "OUI")
dataNfus2011 <- subset(df2011, COM_NOUV == "NON") # Les communes, à la géométrie 2011, qui n'ont pas participé à la création d'une commune nouvelle
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")
test49 <- subset (df2011, CODE_DEPT == "49" )
testOuest <- subset (df2011, REG == "23" | REG == "25"| REG == "53"| REG == "52") # Normandies, Bretagne, Pays-de-la-Loire

2.4 Sélection des variables retenues

# On liste les variables qu'on veut comparer

# vartests <- c("prod", "charge", "res1", "recinv", "depinv", "res2", "dette", "annu")
# nomsvartests <- c("Total des produits de fonctionnement (A)",
#                   "Total des charges de fonctionnement (B)",
#                   "Résultat comptable (A-B = R)",
#                   "Total des ressources d'investissement (C)",
#                   "Total des emplois d'investissement (D)",
#                   "Résultat d'ensemble (R-E)",
#                   "Encours total de la dette au 31 décembre N",
#                   "Annuité de la dette")

# Premières variables étudiées (cf. les résultats dans le Markdown archivé CN_budgets_analyse_Serveur_date)
# vartests <- c("dgf", "charge", "perso", "subv", "equip", "remb", "dette", "annu", "bth", "bfb", "pth", "pfb")
# # Si on veut définir nous-mêmes les noms
# nomsvartests <- c("Dotation globale de fonctionnement", "Total des charges de fonctionnement", "Fonctionnement : charges de personnel", "Fonctionnement : subventions versées", "Investissement : dépenses d'équipement", "Remboursement d'emprunts et dettes", "Encours total de la dette au 31 décembre N", "Annuité de la dette", "Base de taxe d'habitation (y compris THLV),", "Base de taxe foncière sur les propriétés bâties", "Produit de la taxe d'habitation (y compris THLV)", "Produit de la taxe foncière sur les propriétés bâties")


# Variables axées sur la péréquation (objectif communiquation ASRDLF 2022)
# vartests_brutes <- c("dgf", "fctva", "DSU_tot", "DSR_bourg_centre_global", "DSR_cible_global", "DNP_tot", "DSR_pereq_global", "charge", "perso", "subv", "depinv", "equip", "dette", "annu")

# Variables budgétaires et un peu de péréquation (exploration décembre 2022)
vartests_brutes <- c("dgf", "charge", "perso", "subv", "depinv", "equip", "remb", "dette", "annu", "bth", "bfb", "pth", "pfb", "DSR_cible_global", "DSR_pereq_global")

# Variables uniquement budgétaires (exploration janvier 2023)
vartests_brutes <- c("dgf", "achat", "charge", "perso", "subv", "depinv", "equip", "remb", "dette", "annu", "bth", "bfb", "pth", "pfb", "DNP_tot", "DSR_pereq_global")


# On liste ces mêmes variables mais rapportées au nombre d'habitant. Attention, ne fonctionne que pour les variables budgétaires (pas pour les critères de répartition)
vartests_hab <- paste0("f", vartests_brutes)
vartests_hab <- paste0("f", c("dgf", "achat", "charge", "perso", "subv", "depinv", "equip", "remb", "dette", "annu", "bth", "bfb", "pth", "pfb"))


# On choisit finalement de sélectionner les variables mais mises en pourcentage des dépenses totales (cf. les variables créées plus haut)
vartests <- paste0(vartests_brutes, "_prct")

2.5 Contrôle des variables

Brouillon de quelques tests pour vérifier les données.

On liste ici le nombre de variables manquantes par colonne

# Démarche détaillée pour df2011

# Liste les lignes et colonnes où il y a une valeur NA
# which(is.na(df2011), arr.ind = TRUE)
valeursNA <- which(is.na(df2011), arr.ind = TRUE)

# Nombre de valeurs NA par colonnes
colonnesNA <- as.data.frame(table(valeursNA[,2]))
# On modifie le format du numéro de colonnes
colonnesNA$Var1 <- as.numeric(as.character(colonnesNA$Var1))
# On remplace le numéro de colonne par l'identifiant de la variable
colonnesNA$Var1 <- colnames(df2011[,colonnesNA$Var1])
# Pour lisibilité du tableau
colnames(colonnesNA) <- c("Nom de la variable", "Nombre de valeurs manquantes")

kable(colonnesNA, caption = "Nombre de valeurs NA par colonnes dans df2011")
Nombre de valeurs NA par colonnes dans df2011
Nom de la variable Nombre de valeurs manquantes
C09_ACT1564_Agr 3
C09_ACT1564_ArtCom 3
C09_ACT1564_Cadr 3
C09_ACT1564_ProfInt 3
C09_ACT1564_Empl 3
C09_ACT1564_Ouvr 3
C09_ACTOCC_IN 55
C09_ACTOCC_OUT 55
C09_ACTOCC 55
P11_FoyFisc 104
P11_Rev_Fisc 104
P11_IMP_NET 129
P11_FoyFisc_Imp 961
P09_CHOM1564_RT 8
P09_ETUD1564_RT 8
P09_RETR1564_RT 7
C09_ACT1564_Agr_RT 11
C09_ACT1564_ArtCom_RT 11
C09_ACT1564_Cadr_RT 11
C09_ACT1564_ProfInt_RT 11
C09_ACT1564_Empl_RT 11
C09_ACT1564_Ouvr_RT 11
C09_EMPLT_AGRI_RT 37
C09_EMPLT_INDUS_RT 37
C09_EMPLT_CONST_RT 37
C09_EMPLT_CTS_RT 34
C09_EMPLT_APESAS_RT 37
P09_POP0014Y_RT 6
P09_POP1529Y_RT 6
P09_POP3044Y_RT 6
P09_POP4559Y_RT 6
P09_POP6074Y_RT 6
P09_POP75PY_RT 6
C09_ACTOCC_IN_RT 55
C09_ACTOCC_OUT_RT 55
C09_EMP_CONC_RT 55
P11_Rev_Fisc_RT 104
P11_IMP_NET_RT 129
P11_FoyFisc_Imp_RT 961
fimpo2 1
fperso 2
fsubv 1
frecinv 2
ffctva 4
fdepinv 2
fequip 3
fremb 6
fdette 6
fannu 6
fbth 6
fbfb 5
fpth 6
fpfb 5
prod_prct 1
impo1_prct 1
impo2_prct 1
dgf_prct 1
charge_prct 1
perso_prct 1
achat_prct 1
subv_prct 1
res1_prct 1
recinv_prct 1
fctva_prct 1
depinv_prct 1
equip_prct 1
remb_prct 1
res2_prct 1
dette_prct 1
annu_prct 1
fdr_prct 1
DSU_tot_prct 1
DNP_princip_prct 1
DNP_sortie_prct 1
DNP_major_prct 1
DNP_tot_prct 1
DSR_cible_global_prct 1
# Même démarche pour df_new
valeursNA <- which(is.na(df_new), arr.ind = TRUE)
colonnesNA <- as.data.frame(table(valeursNA[,2]))
colonnesNA$Var1 <- as.numeric(as.character(colonnesNA$Var1))
colonnesNA$Var1 <- colnames(df_new[,colonnesNA$Var1])
colnames(colonnesNA) <- c("Nom de la variable", "Nombre de valeurs manquantes")
kable(colonnesNA, caption = "Nombre de valeurs NA par colonnes dans df_new")
Nombre de valeurs NA par colonnes dans df_new
Nom de la variable Nombre de valeurs manquantes
C09_ACT1564_Agr 3
C09_ACT1564_ArtCom 3
C09_ACT1564_Cadr 3
C09_ACT1564_ProfInt 3
C09_ACT1564_Empl 3
C09_ACT1564_Ouvr 3
C09_ACTOCC_IN 55
C09_ACTOCC_OUT 55
C09_ACTOCC 55
P11_FoyFisc 104
P11_Rev_Fisc 104
P11_IMP_NET 129
P11_FoyFisc_Imp 955
FusDate_ChefLieu 33672
FusPhas_ChefLieu 33672
NbrComFus 33672
P09_CHOM1564_RT 8
P09_ETUD1564_RT 8
P09_RETR1564_RT 7
C09_ACT1564_Agr_RT 11
C09_ACT1564_ArtCom_RT 11
C09_ACT1564_Cadr_RT 11
C09_ACT1564_ProfInt_RT 11
C09_ACT1564_Empl_RT 11
C09_ACT1564_Ouvr_RT 11
C09_EMPLT_AGRI_RT 36
C09_EMPLT_INDUS_RT 36
C09_EMPLT_CONST_RT 36
C09_EMPLT_CTS_RT 33
C09_EMPLT_APESAS_RT 36
P09_POP0014Y_RT 6
P09_POP1529Y_RT 6
P09_POP3044Y_RT 6
P09_POP4559Y_RT 6
P09_POP6074Y_RT 6
P09_POP75PY_RT 6
C09_ACTOCC_IN_RT 55
C09_ACTOCC_OUT_RT 55
C09_EMP_CONC_RT 55
P11_Rev_Fisc_RT 104
P11_IMP_NET_RT 129
P11_FoyFisc_Imp_RT 955
ChefLieu 33672
fimpo2 1
fperso 2
fsubv 1
frecinv 2
ffctva 4
fdepinv 2
fequip 3
fremb 6
fdette 6
fannu 6
fbth 6
fbfb 5
fpth 6
fpfb 5
pop_legale_budgets_2022 1
nomsst1_2022 1
nomsst2_2022 1
prod_2022 1
impo1_2022 1
impo2_2022 1
dgf_2022 1
charge_2022 1
perso_2022 1
achat_2022 1
subv_2022 1
res1_2022 1
recinv_2022 1
fctva_2022 1
depinv_2022 1
equip_2022 1
remb_2022 1
res2_2022 1
dette_2022 1
annu_2022 1
fdr_2022 1
bth_2022 1
bfb_2022 1
bfnb_2022 1
pth_2022 1
pfb_2022 1
pfnb_2022 1
tth_2022 1
fprod_2022 1
fimpo1_2022 1
fimpo2_2022 1
fdgf_2022 1
fcharge_2022 1
fperso_2022 2
fachat_2022 1
fsubv_2022 3
fres1_2022 1
frecinv_2022 5
ffctva_2022 7
fdepinv_2022 5
fequip_2022 5
fremb_2022 7
fres2_2022 1
fdette_2022 7
fannu_2022 7
ffdr_2022 1
fbth_2022 7
fbfb_2022 5
fbfnb_2022 1
fpth_2022 7
fpfb_2022 5
strateCN_2022 1
densite_2022 1
depenses_tot_2022 1
prod_prct 1
prod_prct_2022 1
impo1_prct 1
impo1_prct_2022 1
impo2_prct 1
impo2_prct_2022 1
dgf_prct 1
dgf_prct_2022 1
charge_prct 1
charge_prct_2022 1
perso_prct 1
perso_prct_2022 1
achat_prct 1
achat_prct_2022 1
subv_prct 1
subv_prct_2022 1
res1_prct 1
res1_prct_2022 1
recinv_prct 1
recinv_prct_2022 1
fctva_prct 1
fctva_prct_2022 1
depinv_prct 1
depinv_prct_2022 1
equip_prct 1
equip_prct_2022 1
remb_prct 1
remb_prct_2022 1
res2_prct 1
res2_prct_2022 1
dette_prct 1
dette_prct_2022 1
annu_prct 1
annu_prct_2022 1
fdr_prct 1
fdr_prct_2022 1
bth_prct_2022 1
bfb_prct_2022 1
bfnb_prct_2022 1
pth_prct_2022 1
pfb_prct_2022 1
pfnb_prct_2022 1
tth_prct_2022 1
DSU_tot_prct 1
DNP_princip_prct 1
DNP_sortie_prct 1
DNP_major_prct 1
DNP_tot_prct 1
DSR_cible_global_prct 1
Consolid_CN17_18_19_PerimN_prct_2022 1
NonBaisseCN_prct_2022 1
DSU_tot_prct_2022 1
DNP_princip_prct_2022 1
DNP_major_prct_2022 1
DNP_tot_prct_2022 1
DSR_cible_refCN_prct_2022 1
DSR_cible_global_prct_2022 1
rm(valeursNA, colonnesNA)

Conclusion : Le nombre de valeurs manquantes est limité et statistiquement négligeable.

2.6 Analyse des corrélations

# Si on veut sélectionner les variables numériques concernant les budgets
# variables_budgets <- target$recoding[which(target$SOURCE == "toutes tables budgets" & target$type_variable == "stock")]

# Pour sélectionner certaines variables spécifiquement
variables_budgets <- c("fctva_prct", "dgf_prct", "DSU_tot_prct", "DNP_tot_prct", "DSR_pereq_global_prct")
variables_budgets <- c("fctva", "dgf", "DSU_tot", "DNP_tot", "DSR_pereq_global")
variables_budgets <- vartests

# On sélectionne les variables de pourcentages concernant les budgets
# variables_budgets <- colnames(datafus2011[which(str_detect(colnames(datafus2011), "_prct") == TRUE)])
# Ou, pour sélectionner directement les colonnes dans le dataframe
# tmp <- datafus2011[which(str_detect(colnames(datafus2011), "_prct") == TRUE)]


# Juste pour les communes fusionnées
tmp <- na.omit(datafus2011 [, variables_budgets])

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

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

# NB : autre fonction "corrplot" dans package arm, donc si difficultés, utiliser le code suivant :
# detach("package:arm", unload = TRUE)
corrplot(tmp2, p.mat = res1$p, sig.level = .2, order = "hclust",
         tl.cex = 0.8, tl.col = "black")

corrplot(tmp2, method="color", order = "hclust", # cl.lim = c(-1,1), # cl.lim pose problème donc supprimé
         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))

# corrplot (tmp2, p.mat = p_mat)

# Communes n'ayant pas fusionné
tmpnfus <- na.omit(dataNfus2011[, variables_budgets])

tmp2nfus <- cor(tmpnfus, method = "pearson")
res1 <- cor.mtest(tmpnfus, method = "pearson")

corrplot(tmp2nfus, 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(tmp2nfus, method="color", order = "hclust", # cl.lim = c(-1,1), # cl.lim pose problème donc supprimé 
         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))

# Autre manière de voir les corrélations, mais pas adaptée ici, cf. https://rzine.fr/docs/20200526_glecampion_initiation_aux_correlations/index.html
# library(correlation)
# library(see)
# library(ggraph)

# cor <- correlation (tmp)
# plot(cor)

# À noter par exemple que les DSU et DSR ne sont pas dissociées que cela. Puisque 118 communes perçoivent les deux en 2011
# test <- subset (df2011, df2011$DSU_tot > 0 & df2011$DSR_pereq_global > 0)
# test <- test[, c("LIBGEO", "DSU_tot", "DSR_pereq_global")]

rm(tmp, tmp2, res1, col, variables_budgets, tmp2nfus, tmpnfus)

On observe, sans surprise, que les variables budgétaires sont fréquemment corrélées entre elles.

2.7 Étude des différentes variables disponibles pour décrire la population totale

Trois types de population légale existent :

  • Population municipale : population, sans double compte, des personnes résidant habituellement dans une commune.

  • Population comptée à part : « certaines personnes dont la résidence habituelle est dans une autre commune mais qui gardent un lien de résidence avec la commune. Elle comprend, par exemple, les élèves ou étudiants majeurs qui logent pour leurs études dans une autre commune mais dont la résidence familiale est située sur le territoire de la commune ou les personnes résidant dans une maison de retraite située dans une autre commune mais qui ont conservé une résidence familiale sur le territoire de la commune. » (https://www.insee.fr/fr/information/2553979).

  • Population totale : population municipale et population comptée à part.

La population utilisée pour le calcul de la DGF est basée sur la population totale mais en y ajoutant les logements occasionnels :

  • résidences secondaires pour lesquelles il est estimé qu’elles sont « en moyenne occupées par 2 personnes pendant 6 mois de l’année » (https://www.cnis.fr/wp-content/uploads/2018/01/DC_2010_populations_legales_calcul_DGF.pdf) ;

  • les emplacements pour places de caravanes dans les aires d’accueil des gens du voyage. Donc « Il ne s’agit pas d’une population effectivement recensée mais d’un nombre (exprimé en « habitants ») qui sert de base au calcul de la dotation. La « population DGF 2009 » était supérieure d’environ 5 millions à la population municipale (respectivement 68 968 367 « habitants » et 63 600 690 habitants).

Qu’en est-il dans notre base de données ?

colnames(df2011)
##   [1] "CODGEO"                 "LIBGEO"                 "CODE_DEPT"             
##   [4] "CATAEU2010"             "REG"                    "ARR"                   
##   [7] "CV"                     "UU2010"                 "AU2010"                
##  [10] "ZE2010"                 "EPCI"                   "P09_ACT1564"           
##  [13] "P09_CHOM1564"           "P09_ETUD1564"           "P09_RETR1564"          
##  [16] "C09_ACT1564_Agr"        "C09_ACT1564_ArtCom"     "C09_ACT1564_Cadr"      
##  [19] "C09_ACT1564_ProfInt"    "C09_ACT1564_Empl"       "C09_ACT1564_Ouvr"      
##  [22] "P09_EMPLT"              "C09_EMPLT_AGRI"         "C09_EMPLT_INDUS"       
##  [25] "C09_EMPLT_CONST"        "C09_EMPLT_CTS"          "C09_EMPLT_APESAS"      
##  [28] "P09_ACTOCC"             "P09_POP"                "P09_POP0014"           
##  [31] "P09_POP1529"            "P09_POP3044"            "P09_POP4559"           
##  [34] "P09_POP6074"            "P09_POP75P"             "C09_ACTOCC_IN"         
##  [37] "C09_ACTOCC_OUT"         "C09_ACTOCC"             "P11_POT_FIN"           
##  [40] "P11_DGF"                "P11_FoyFisc"            "P11_Rev_Fisc"          
##  [43] "P11_IMP_NET"            "P11_FoyFisc_Imp"        "superficie"            
##  [46] "ZAU_POL"                "ZAU_RUR"                "ZAU_MAR_SP"            
##  [49] "ZAU_MAR"                "ZAU_PERI"               "ZAU_AU"                
##  [52] "FUSION"                 "ChefLieu"               "ComDLG"                
##  [55] "FusDate"                "FusPhas"                "COM_NOUV"              
##  [58] "CODGEO_new"             "LIBGEO_new"             "P09_CHOM1564_RT"       
##  [61] "P09_ETUD1564_RT"        "P09_RETR1564_RT"        "C09_ACT1564_Agr_RT"    
##  [64] "C09_ACT1564_ArtCom_RT"  "C09_ACT1564_Cadr_RT"    "C09_ACT1564_ProfInt_RT"
##  [67] "C09_ACT1564_Empl_RT"    "C09_ACT1564_Ouvr_RT"    "C09_EMPLT_AGRI_RT"     
##  [70] "C09_EMPLT_INDUS_RT"     "C09_EMPLT_CONST_RT"     "C09_EMPLT_CTS_RT"      
##  [73] "C09_EMPLT_APESAS_RT"    "P09_POP0014Y_RT"        "P09_POP1529Y_RT"       
##  [76] "P09_POP3044Y_RT"        "P09_POP4559Y_RT"        "P09_POP6074Y_RT"       
##  [79] "P09_POP75PY_RT"         "C09_ACTOCC_IN_RT"       "C09_ACTOCC_OUT_RT"     
##  [82] "C09_EMP_CONC_RT"        "P11_POT_FIN_RT"         "P11_DGF_RT"            
##  [85] "P11_Rev_Fisc_RT"        "P11_IMP_NET_RT"         "P11_FoyFisc_Imp_RT"    
##  [88] "pop_legale_budgets"     "nomsst1"                "nomsst2"               
##  [91] "prod"                   "impo1"                  "impo2"                 
##  [94] "dgf"                    "charge"                 "perso"                 
##  [97] "achat"                  "subv"                   "res1"                  
## [100] "recinv"                
##  [ reached getOption("max.print") -- omitted 95 entries ]
summary(df2011$Pop_INSEE)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0     197     432    1747    1060 2233818
summary(df2011$Pop_DGF)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0     221     470    1832    1123 2314749
summary(df2011$pop_legale_budgets)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0     197     432    1746    1060 2233818
df2011$diff_pop <- df2011$Pop_DGF - df2011$Pop_INSEE
quantile(df2011$diff_pop, probs = seq(0, 1, 0.05))
##    0%    5%   10%   15%   20%   25%   30%   35%   40%   45%   50%   55%   60% 
##     0     1     3     4     6     7     9    11    13    16    19    23    27 
##   65%   70%   75%   80%   85%   90%   95%  100% 
##    32    39    48    60    78   107   186 80931
tapply(df2011$diff_pop, INDEX = df2011$COM_NOUV, quantile)
## $NON
##    0%   25%   50%   75%  100% 
##     0     7    19    48 80931 
## 
## $OUI
##    0%   25%   50%   75%  100% 
##     0    10    22    46 11488
# Pour avoir un graphique

p <- ggplot(data = df2011, aes(x = Pop_INSEE, y = diff_pop, colour = COM_NOUV, shape = COM_NOUV)) +
  # On trace la ligne
  geom_point() +
  # Changer le titre de l'axe des abscisses
  xlab("Population INSEE") +
  # Changer le titre de l'axe des ordonnees
  ylab("Différence Pop_DGF - Pop_INSEE") +
  # Ajouter un titre
  ggtitle("Différence des calculs de population selon le statut des communes\nPopDGF-PopINSEE") +
  # Changer le titre de la legende et les couleurs
  scale_colour_manual(name = "CN", values = c("#00BA38", "#619CFF")) +
  # On doit egalement changer le nom pour les formes
  scale_shape_discrete(name = "CN") +
  scale_x_continuous(trans = 'log10') + # Échelle logarithmique
  scale_y_continuous(trans = 'log10') + # Échelle logarithmique
  geom_smooth()
print (p  + facet_wrap(~ COM_NOUV)) # Présentation en vignettes
## Warning in scale_x_continuous(trans = "log10"): log-10 transformation
## introduced infinite values.
## Warning in scale_y_continuous(trans = "log10"): log-10 transformation
## introduced infinite values.
## Warning in scale_x_continuous(trans = "log10"): log-10 transformation
## introduced infinite values.
## Warning in scale_y_continuous(trans = "log10"): log-10 transformation
## introduced infinite values.
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## Warning: Removed 887 rows containing non-finite outside the scale range
## (`stat_smooth()`).

# En pourcentage de la population INSEE
df2011$diff_pop_prct <- 100 * (df2011$Pop_DGF - df2011$Pop_INSEE)/df2011$Pop_INSEE
quantile(df2011$diff_pop_prct, probs = seq(0, 1, 0.05), na.rm = TRUE)
##           0%           5%          10%          15%          20%          25% 
##    0.0000000    0.1858140    0.4385965    0.7133346    1.0094578    1.3629449 
##          30%          35%          40%          45%          50%          55% 
##    1.7647059    2.2375120    2.7896883    3.4151690    4.1666667    5.0359712 
##          60%          65%          70%          75%          80%          85% 
##    6.1137212    7.3868689    8.9788249   11.1111111   14.1304348   18.5915418 
##          90%          95%         100% 
##   25.7668712   42.6458534 1185.2941176
tapply(df2011$diff_pop_prct, INDEX = df2011$COM_NOUV, quantile, na.rm = TRUE)
## $NON
##          0%         25%         50%         75%        100% 
##    0.000000    1.319960    4.098361   11.011619 1158.823529 
## 
## $OUI
##          0%         25%         50%         75%        100% 
##    0.000000    1.918566    5.055254   12.500000 1185.294118
# Pour avoir un graphique

p <- ggplot(data = df2011, aes(x = Pop_INSEE, y = diff_pop_prct, colour = COM_NOUV, shape = COM_NOUV)) +
  # On trace la ligne
  geom_point() +
  # Changer le titre de l'axe des abscisses
  xlab("Population INSEE") +
  # Changer le titre de l'axe des ordonnees
  ylab("Différence Pop_DGF - Pop_INSEE") +
  # Ajouter un titre
  ggtitle("Différence des calculs de population selon le statut des communes\n(PopDGF-PopINSEE)/PopINSEE") +
  # Changer le titre de la legende et les couleurs
  scale_colour_manual(name = "CN", values = c("#00BA38", "#619CFF")) +
  # On doit egalement changer le nom pour les formes
  scale_shape_discrete(name = "CN") +
  scale_x_continuous(trans = 'log10') + # Échelle logarithmique
  scale_y_continuous(trans = 'log10') + # Échelle logarithmique
  geom_smooth()
print (p  + facet_wrap(~ COM_NOUV)) # Présentation en vignettes
## Warning in scale_x_continuous(trans = "log10"): log-10 transformation introduced infinite values.
## log-10 transformation introduced infinite values.
## Warning in scale_x_continuous(trans = "log10"): log-10 transformation
## introduced infinite values.
## Warning in scale_y_continuous(trans = "log10"): log-10 transformation
## introduced infinite values.
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## Warning: Removed 887 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 6 rows containing missing values or values outside the scale range
## (`geom_point()`).

rm(p)

On n’observe pas de différence sensible entre les communes nouvelles et les autres du point de vue de cette différence. En revanche il y a une différence parfois très importante entre la population DGF et la population INSEE.

2.8 La comptabilité fonctionelle des communes est-elle utilisable ?

Pour les communes de plus de 3500 habitants, une comptabilité fonctionnelle existe, mais elle ne représente qu’un nombre trop restreint des communes fusionnantes pour que son analyse puisse être représentative.

# Évaluation du nombre de communes fusionnantes ayant une population inférieure à 3500 habitants
summary(datafus2011$P09_POP)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     7.0   200.0   408.5   967.0   933.2 52403.0
table(datafus2011$P09_POP < 3500)
## 
## FALSE  TRUE 
##   108  2428
100*sum(datafus2011$P09_POP < 3500)/nrow(datafus2011)
## [1] 95.74132
summary(dataCN_new$P09_POP)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      77     882    1633    3116    3402  116578
table(dataCN_new$P09_POP < 3500)
## 
## FALSE  TRUE 
##   192   595
100*sum(dataCN_new$P09_POP < 3500)/nrow(dataCN_new)
## [1] 75.60356

3 COMPARAISON COMMUNES FUSIONNANTES OU NON

3.1 Tableau comparaison budgets CFus O/N

L’objectif est, ici, d’observer pour un certain nombre de variables (qu’on sélectionne au début), les différences qui peuvent exister d’une part entre les communes fusionnantes et les non fusionnantes pour différentes variables dans les budgets 2011.

Certaines strates sont parfois retirées de l’analyse statistiques, car elles ne permettaient pas une comparaison statistiquement significative du fait de faibles effectif. Les strates concernées comportent les communes nouvelles dont la population est comprise entre 20 000 et 50 000 habitants (seulement sept communes : Beaupréau-en-Mauges, Chemillé-en-Anjou, Sèvremoine, Le Chesnay-Rocquencourt, Saint-Germain-en-Laye, Montaigu-Vendée et Les Sables-d’Olonne) et celles appartenant aux strates supérieures à 50 000 habitants (trois communes nouvelles seulement : Évry-Courcouronnes, Cherbourg-en-Cotentin et Annecy).

valeursstrateCN <- levels(df2011$strateCN)
# Création du df pour les résultats
comparaisons_budgets <- data.frame()
# Si besoin de test hors boucle
# i <- "dgf_prct"

for (i in vartests) {
# Pour pouvoir utiliser le nom désigné plus haut pour la variable
# num_variable <- which(vartests == i) # Pour obtenir la position de i dans vartests
# nom_variable <- nomsvartests[num_variable] # Pour obtenir le nom correspondant
# Pour obtenir la description officielle de la variable
num_variable <- which(target$recoding == substr(i, start = 1, stop = nchar(i)-5))[1] # On rajoute un [1] car pour les critères de contribution le nom peut se trouver à plusieurs endroits, ce qui perturbe beaucoup de choses
nom_variable <- target[num_variable, "DESCRIPTION"]

# Pour chaque variable on observe les moyenne et médiane des strates croisées avec la fusion, puis pour l'ensemble des communes françaises.
moy_i  <- round(tapply(df2011[,i], df2011$strateCN, mean, na.rm = TRUE),3)
moyFr <- round(mean(df2011[,i], na.rm = TRUE),3)

med_i  <- round(tapply(df2011[,i], df2011$strateCN, median, na.rm = TRUE), 3)
medFr <- round(median(df2011[,i], na.rm = TRUE), 3)

resultats <- c(i, nom_variable, moy_i, moyFr, med_i, medFr)

comparaisons_budgets <- rbind (comparaisons_budgets, resultats, stringsAsFactors = FALSE)
  

}
rm (i, moy_i, moyFr, med_i, medFr, num_variable, nom_variable, resultats)

colnames(comparaisons_budgets) <- c("Variable", "Description", paste0("Moyenne ", valeursstrateCN), "Moyenne française", paste0("Médiane ", valeursstrateCN), "Médiane française")

kable(comparaisons_budgets)
Variable Description Moyenne communes de moins de 250 hab_NON Moyenne communes de moins de 250 hab_OUI Moyenne communes de 250 à 500 hab_NON Moyenne communes de 250 à 500 hab_OUI Moyenne communes de 500 à 2 000 hab_NON Moyenne communes de 500 à 2 000 hab_OUI Moyenne communes de 2 000 à 3 500 hab_NON Moyenne communes de 2 000 à 3 500 hab_OUI Moyenne communes de 3 500 à 5 000 hab_NON Moyenne communes de 3 500 à 5 000 hab_OUI Moyenne communes de 5 000 à 10 000 hab_NON Moyenne communes de 5 000 à 10 000 hab_OUI Moyenne communes de 10 000 à 20 000 hab_NON Moyenne communes de 10 000 à 20 000 hab_OUI Moyenne communes de 20 000 à 50 000 hab_NON Moyenne communes de 20 000 à 50 000 hab_OUI Moyenne communes de 50 000 à 100 000 hab_NON Moyenne communes de 50 000 à 100 000 hab_OUI Moyenne communes de plus de 100 000 hab_NON Moyenne française Médiane communes de moins de 250 hab_NON Médiane communes de moins de 250 hab_OUI Médiane communes de 250 à 500 hab_NON Médiane communes de 250 à 500 hab_OUI Médiane communes de 500 à 2 000 hab_NON Médiane communes de 500 à 2 000 hab_OUI Médiane communes de 2 000 à 3 500 hab_NON Médiane communes de 2 000 à 3 500 hab_OUI Médiane communes de 3 500 à 5 000 hab_NON Médiane communes de 3 500 à 5 000 hab_OUI Médiane communes de 5 000 à 10 000 hab_NON Médiane communes de 5 000 à 10 000 hab_OUI Médiane communes de 10 000 à 20 000 hab_NON Médiane communes de 10 000 à 20 000 hab_OUI Médiane communes de 20 000 à 50 000 hab_NON Médiane communes de 20 000 à 50 000 hab_OUI Médiane communes de 50 000 à 100 000 hab_NON Médiane communes de 50 000 à 100 000 hab_OUI Médiane communes de plus de 100 000 hab_NON Médiane française
dgf_prct Produits de fonctionnement : Dotation globale de fonctionnement 25.234 27.821 23.691 26.068 21.636 23.448 19.123 20.2 17.117 18.697 16.053 16.49 15.976 17.385 16.605 16.432 15.625 14.897 15.714 22.838 23.599 26.027 22.561 24.849 20.791 22.797 18.46 20.017 16.391 17.426 15.096 16.993 15.212 14.334 15.648 14.833 15.221 14.897 15.005 21.359
achat_prct Charges de fonctionnement : Achats et charges externes 20.866 20.021 19.849 19.672 19.501 18.504 19.365 18.48 18.603 17.311 18.086 16.781 16.986 15.381 16.687 18.432 14.965 19.217 14.07 19.821 19.705 18.668 19.104 18.791 19.13 18.368 18.957 18.244 18.395 17.032 17.642 16.29 16.581 15.223 16.137 18.908 14.171 19.217 13.311 18.998
charge_prct Total des charges de fonctionnement (B) 63.635 65.95 64.06 65.435 63.648 63.738 64.36 62.828 67.773 63.759 69.491 66.688 71.962 66.957 73.228 73.257 70.502 71.401 70.482 64.325 65.606 68.18 66.08 68.275 65.393 65.192 65.322 62.826 69.31 65.317 70.434 67.775 72.595 65.877 73.598 73.609 69.97 71.401 70.148 66.337
perso_prct Charges de fonctionnement : Charges de personnel 16.077 17.047 21.164 20.232 25.188 24.082 29.085 26.646 31.419 27.753 34.078 30.35 37.439 34.708 39.322 37.656 37.335 40.53 35.753 22.285 14.663 15.696 20.457 19.595 25.05 24.11 29.039 26.708 31.249 28.226 34.082 30.884 37.134 35.497 38.907 37.738 38.043 40.53 36.26 21.85
subv_prct Charges de fonctionnement : Subventions versées 2.303 2.74 2.388 3.043 2.717 3.327 3.597 4.532 4.088 5.04 4.952 5.578 5.763 5.167 6.358 5.81 7.241 4.394 9.232 2.792 1.179 1.427 1.357 1.561 1.748 2.02 2.748 3.611 3.439 4.174 4.25 4.73 5.308 4.761 5.867 3.924 6.313 4.394 8.436 1.678
depinv_prct Total des emplois d’investissements (D) 36.365 34.05 35.94 34.565 36.352 36.262 35.64 37.172 32.227 36.241 30.509 33.312 28.038 33.043 26.772 26.743 29.498 28.599 29.518 35.675 34.394 31.82 33.92 31.725 34.607 34.808 34.678 37.174 30.69 34.683 29.566 32.225 27.405 34.123 26.402 26.391 30.03 28.599 29.852 33.663
equip_prct Emplois d’investissement : Dépenses d’équipement 29.71 27.103 28.741 27.3 28.591 27.367 27.781 28.008 24.079 25.906 22.671 23.369 19.647 21.459 17.8 18.419 19.328 20.068 17.183 28.303 26.725 23.505 25.613 24.303 26.233 25.578 26.453 28.154 22.459 24.381 21.7 22.041 19.049 19.22 17.685 17.317 18.053 20.068 17.126 25.433
remb_prct Emplois d’investissement : Remboursement d’emprunts et dettes assimilées 5.105 5.245 5.792 5.743 6.159 6.506 5.994 6.764 5.708 7.155 5.555 6.471 5.195 5.264 5.444 6.863 5.713 3.463 5.638 5.695 3.503 3.723 4.389 4.616 5.031 5.366 5.34 5.808 5.128 5.685 5.164 6.26 4.905 5.126 5.037 5.042 5.601 3.463 5.711 4.572
dette_prct Encours total de la dette au 31 décembre N 41.214 42.263 49.023 52.497 59.372 61.949 64.497 66.208 62.456 64.019 62.004 70.017 56.601 60.275 58.382 49.71 65.821 43.681 56.624 51.806 27.38 32.944 39.675 43.822 52.445 55.587 60.707 59.65 59.595 61.564 60.563 66.091 54.406 54.04 59.035 46.78 62.987 43.681 51.538 44.305
annu_prct Annuité de la dette 6.645 6.807 7.65 7.717 8.429 8.861 8.453 9.167 8.033 9.398 7.859 9.063 7.206 7.299 7.462 8.326 7.783 4.923 7.348 7.65 4.721 5.089 6.051 6.31 7.268 7.661 7.908 8.216 7.586 8.276 7.548 8.706 6.971 7.183 7.178 6.485 7.77 4.923 7.683 6.424
bth_prct Base de Taxe d’habitation (y compris THLV) 98.577 116.867 113.056 118.39 111.734 101.967 105.316 88.515 97.779 76.463 Inf 74.297 80.982 77.074 76.992 115.598 69.68 73.999 71.199 Inf 88.772 101.449 104.027 109.844 102.958 94.856 97.16 84.948 88.079 68.081 83.227 76.305 76.286 71.368 70.124 112.255 63.092 73.999 66.372 96.726
bfb_prct Base de Taxe foncière sur les propriétés bâties 69.081 93.31 79.169 87.954 84.688 79.353 87.661 81.1 82.932 73.178 Inf 74.345 74.656 70.161 73.734 97.196 71.071 74.709 72.9 Inf 60.84 69.812 72.05 75.394 75.786 72.735 79.913 75.335 78.412 69.16 75.213 69.93 71.925 65.138 69.775 91.303 61.401 74.709 67.748 70.989
pth_prct Produit de Taxe d’habitation (y compris THLV) 11.408 11.365 13.59 12.629 14.282 13.16 14.567 12.374 14.377 11.758 Inf 11.364 13.35 12.289 14.525 18.025 12.875 12.752 13.981 Inf 9.863 10.211 12.415 11.926 13.221 12.602 13.944 12.012 13.561 10.995 12.771 11.176 12.434 12.425 13.752 15.391 12.403 12.752 13.586 12.099
pfb_prct Produit de Taxe foncière sur les propriétés bâties 7.01 11.07 9.584 11.628 12.161 12.459 14.847 14.379 15.145 13.706 Inf 14.112 16.3 15.121 16.739 11.583 14.939 14.005 16.257 Inf 5.888 6.821 8.616 9.531 11.154 11.275 13.929 13.205 14.49 12.579 15.658 14.571 15.985 14.363 16.171 11.574 14.864 14.005 15.101 9.441
DNP_tot_prct Dotation nationale de péréquation - DNP totale 1.454 1.611 1.797 2.236 1.812 2.079 1.515 1.285 1.19 0.999 1.053 0.768 0.733 0.953 0.629 0.209 0.561 0 0.442 1.625 0.371 0.188 1.126 1.469 1.3 1.475 1.016 0.791 0.721 0.187 0.609 0 0.31 0.584 0.347 0 0.331 0 0.341 0.9
DSR_pereq_global_prct Dotation de solidarité rurale - Péréquation - Montant global réparti (après garantie CN) 2.975 3.444 2.66 3.025 1.946 2.089 1.232 1.254 0.953 0.972 Inf 0.785 0 0 0 0 0 0 0 Inf 2.721 3.14 2.483 2.825 1.844 2.019 1.186 1.185 0.941 0.821 0.763 0.724 0 0 0 0 0 0 0 2.07

On observe une faible différence, pour les budgets 2011, entre les communes ayant fusionné et les autres.

3.2 Graphique et boxplots comparaison budgets CFus O/N

# SÉLECTION DES DONNÉES
# On enlève les communes dont la population légale est supérieure à la commune nouvelle la plus peuplée
df_temp <- subset(df2011, df2011$P09_POP <= max(dataCN_new$P09_POP))
# df_temp <- df2011

# Si on veut uniquement les communes qui touchent une commune fusionnante
# df_temp <- subset(df2011, df2011$P09_POP <= max(dataCN_new$P09_POP) & df2011$Nbr_voisinage_Cfus >= 1 )

# SÉLECTION DES VARIABLES DE CATÉGORISATION

# Si on reste sur COM_NOUV OUI/NON
labels_COM_NOUV <- c("Communes non fusionnantes", "Communes fusionnantes")
# couleurs <- c("darkblue", "red4")
couleurs <- c("#2b83ba", "red4")


# Si on a gardé toutes les non-voisines et qu'on veut différencier les graphiques
df_temp$COM_NOUV <- df_temp$COM_NOUV_voisinage
labels_COM_NOUV <- c("Communes non fusionnantes", "Communes non fusionnantes\nmais voisines de communes\nfusionnantes", "Communes fusionnantes")
# "Communes non fusionnantes" seulement signifie communes non fusionnantes ne touchant pas de commune fusionnante
# couleurs <- c("darkblue", "lightblue", "red4")
couleurs <- c("#2b83ba",  "#fdae61", "red4")



# Création du df pour les résultats
variables_testees <- data.frame()


# Si besoin de test hors boucle
i <- vartests[1] # DGF
i <- vartests[4] # Charges de personnel
i <- vartests[7] # Dépenses d'équipement
i <- vartests[9] # Dette


for (i in vartests) {
  
# Pour obtenir la description officielle de la variable
# num_variable <- which(target$recoding == i)
# nom_variable <- target[num_variable, "DESCRIPTION"]
# # Si on veut utiliser les noms modifiés
# num_variable <- which(vartests == i) # Pour obtenir la position de i dans vartests
# nom_variable <- nomsvartests[num_variable] # Pour obtenir le nom correspondant
# Pour obtenir le nom de la variable concernée dans le cas des variables en pourcentage
num_variable <- which(target$recoding == substr(i, start = 1, stop = nchar(i)-5))[1]
nom_variable <- paste0(target[num_variable, "DESCRIPTION"], "\nen pourcentage du total des dépenses")
nom_variable_court <- paste0(target[num_variable, "DESCRIPTION"], "en pourcentage du total des dépenses")


# On sélectionne ici, pour les communes à la géométrie la plus récente, les valeurs constituées par l'agrégation des variables à la date de 2011.
df_graph <- df_temp[, c(i, "COM_NOUV", "pop_legale_budgets", "densite")]

  
# Réalisation d'un graphique avec les deux types de communes en une seule fois
graph <- ggplot(df_graph, aes(x = densite)) +
  geom_point(aes(y = df_graph[, i],  color = COM_NOUV, shape = COM_NOUV)) +
  geom_smooth(formula = y ~ x,
              aes(y = df_graph[, i],
                  color = COM_NOUV), method = loess, se = TRUE) + # method = lm pour une ligne de régression, "loess" pour une régression locale(beaucoup plus longue), donnent des résultats très différents ; se = intervale de confiance (TRUE/FALSE)
  scale_color_manual(values=couleurs,name = "Communes", labels = labels_COM_NOUV) +
  scale_shape_manual(values = c(15, 16, 17), name = "Communes", labels = labels_COM_NOUV) +
  xlab("Densité (hab/km², 2011)") +
  ylab(nom_variable) +
  theme(legend.position = "right") +
  ggtitle(paste0("Variable étudiée :\n", nom_variable))

# print (graph)

# Pour repérer les valeurs extrêmes, en se basant sur les quartiles et l'intervalle inter-quartile
upper.limit <- quantile(df_graph[, i], na.rm = TRUE)[4] + 2*IQR(df_graph[, i], na.rm = TRUE)
# lower.limit <- quantile(df_graph[, i], na.rm = TRUE)[2] - 2*IQR(df_graph[, i], na.rm = TRUE)

print(graph + scale_x_continuous(trans = 'log10') # Échelle des abscisses en log de 10
      + coord_cartesian(ylim=c(0, upper.limit)) # Suppression des valeurs extrêmes
      + facet_wrap(~ COM_NOUV)) # Présentation en vignettes


# Réalisation du boxplot


# On enlève les valeurs infinies
df_temp[, i][which(df_temp[, i] == Inf)] <- NA
df_temp[, i][which(df_temp[, i] == -Inf)] <- NA


boxplot <- ggplot(df_temp, aes(x = COM_NOUV, y =  df_temp[, i], color = COM_NOUV)) +
  geom_boxplot(varwidth = TRUE) +
  scale_color_manual(values=couleurs , labels = labels_COM_NOUV) +
  scale_x_discrete(labels = labels_COM_NOUV) +
  # ggtitle(paste0("Comparaison :\n", nom_variable))+
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  # ggtitle(paste0("Pourcentage du total des dépenses en 2011 :\n", nom_variable)) +
  ylab(paste0(nom_variable, " en 2011")) +
  # xlab("La commmune est une commune fusionnante") +
  xlab(" ") +
  guides(color = "none")
print (boxplot)

tapply(df_temp[,i], INDEX = df_temp$COM_NOUV_voisinage, mean, na.rm = TRUE)
tapply(df_temp[,i], INDEX = df_temp$COM_NOUV_voisinage, median, na.rm = TRUE)

# Possibilité de vérifier la fiabilité des données avec le test de Kruskal-Wallis
## https://www.datanovia.com/en/fr/lessons/test-de-kruskal-wallis-dans-r/
res.kruskal <- df_temp %>% kruskal_test(df_temp[, i] ~ COM_NOUV)
print(as.data.frame(res.kruskal))



boxplot <- ggplot(df_temp, aes(x = CATAEU2010, y =  df_temp[, i], color = COM_NOUV)) +
  geom_boxplot(varwidth = FALSE) +
  scale_color_manual(values=couleurs , labels = labels_COM_NOUV) +
  ylab(paste0("Pourcentage du total des dépenses en 2011")) +
  xlab("Code ZAU") +
  ggtitle(paste0("Pourcentage du total des dépenses en 2011 :\n", nom_variable))
print (boxplot)
res.kruskal2 <- df_temp %>% kruskal_test(df_temp[, i] ~ CATAEU2010)
print(as.data.frame(res.kruskal2))


# On modifie éventuellement le graphique pour le rendre plus lisible si valeurs extrêmes
upper.limit <- quantile(df_temp[, i], na.rm = TRUE)[4] + 4*IQR(df_temp[, i], na.rm = TRUE)
lower.limit <- quantile(df_temp[, i], na.rm = TRUE)[2] - 4*IQR(df_temp[, i], na.rm = TRUE)
# print (boxplot + coord_cartesian(ylim=c(lower.limit, upper.limit)))

# Réalisation d'un graphique par strates
# On enlève les strates les plus élevées pour simplifier le graphique
df_temp2 <- subset(df_temp, df_temp$nomsst1 != "communes de plus de 100 000 hab" &
                     df_temp$nomsst1 != "communes de 50 000 à 100 000 hab" &
                     df_temp$nomsst1 != "communes de 20 000 à 50 000 hab")

# On modifie éventuellement le graphique pour le rendre plus lisible si valeurs extrêmes
upper.limit <- quantile(df_temp2[, i], na.rm = TRUE)[4] + 4*IQR(df_temp2[, i], na.rm = TRUE)
lower.limit <- quantile(df_temp2[, i], na.rm = TRUE)[2] - 4*IQR(df_temp2[, i], na.rm = TRUE)

boxplot <- ggplot(df_temp2, aes(x = nomsst1, y =  df_temp2[, i], fill = COM_NOUV, color = COM_NOUV)) +
  geom_boxplot(width = 1.5, varwidth = TRUE) +
  scale_color_manual(values=couleurs , labels = labels_COM_NOUV) +
  scale_fill_manual(values = c("white", "white", "white"), labels = labels_COM_NOUV) +
  labs(fill = " ", color = " ") +
  ylab(paste0("Pourcentage du total des dépenses en 2011")) +
  xlab("Strate démographique") +
  ggtitle(paste0("Pourcentage du total des dépenses en 2011 :\n", nom_variable))+
  # coord_cartesian(ylim=c(lower.limit, upper.limit)) + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 10), legend.position = "right")
print (boxplot)


res.kruskal3 <- df_temp2 %>% kruskal_test(df_temp2[, i] ~ COM_NOUV)
print(as.data.frame(res.kruskal3))




# On peut avoir les valeurs des moyennes en utilisant la fonction tapply
moys <- round(tapply(df_temp[, i], df_temp$FUSION, mean, na.rm = TRUE), 2)
print(paste("\n\nMOYENNES POUR LA VARIABLE", nom_variable, "\n"))
print(moys)

meds <- round(tapply(df_temp[, i], df_temp$FUSION, median, na.rm = TRUE), 2)
print(paste("MÉDIANES POUR LA VARIABLE", nom_variable, "\n"))
print(meds)

sd <- round(tapply(df_temp[, i], df_temp$FUSION, sd, na.rm = TRUE), 2)
print(paste("ÉCART-TYPE POUR LA VARIABLE", nom_variable, "\n"))
print(sd)

resultats <- c(i, nom_variable_court, moys, meds, sd, res.kruskal$p)

variables_testees <- rbind (variables_testees, resultats, stringsAsFactors = FALSE)

}

.y. n statistic df p method 1 df_temp[, i] 36178 153.3737 2 4.96e-34 Kruskal-Wallis .y. n statistic df p method 1 df_temp[, i] 36178 2120.829 8 0 Kruskal-Wallis .y. n statistic df p method 1 df_temp2[, i] 35781 145.0536 2 3.18e-32 Kruskal-Wallis [1] “POUR LA VARIABLE Produits de fonctionnement : Dotation globale de fonctionnementpourcentage du total des dépenses ” NON OUI 22.68 25.02 [1] “MÉDIANES POUR LA VARIABLE Produits de fonctionnement : Dotation globale de fonctionnementpourcentage du total des dépenses ” NON OUI 21.21 23.43 [1] “ÉCART-TYPE POUR LA VARIABLE Produits de fonctionnement : Dotation globale de fonctionnementpourcentage du total des dépenses ” NON OUI 11.03 11.93 .y. n statistic df p method 1 df_temp[, i] 36178 61.09472 2 5.41e-14 Kruskal-Wallis .y. n statistic df p method 1 df_temp[, i] 36178 144.8086 8 2.37e-27 Kruskal-Wallis .y. n statistic df p method 1 df_temp2[, i] 35781 64.9716 2 7.79e-15 Kruskal-Wallis [1] “POUR LA VARIABLE Charges de fonctionnement : Achats et charges externespourcentage du total des dépenses ” NON OUI 19.87 19.20 [1] “MÉDIANES POUR LA VARIABLE Charges de fonctionnement : Achats et charges externespourcentage du total des dépenses ” NON OUI 19.05 18.38 [1] “ÉCART-TYPE POUR LA VARIABLE Charges de fonctionnement : Achats et charges externespourcentage du total des dépenses ” NON OUI 7.72 7.75 .y. n statistic df p method 1 df_temp[, i] 36178 14.92225 2 0.000575 Kruskal-Wallis .y. n statistic df p method 1 df_temp[, i] 36178 169.3624 8 1.75e-32 Kruskal-Wallis .y. n statistic df p method 1 df_temp2[, i] 35781 13.52242 2 0.00116 Kruskal-Wallis [1] “POUR LA VARIABLE Total des charges de fonctionnement (B)pourcentage du total des dépenses ” NON OUI 64.28 64.89 [1] “MÉDIANES POUR LA VARIABLE Total des charges de fonctionnement (B)pourcentage du total des dépenses ” NON OUI 66.32 66.46 [1] “ÉCART-TYPE POUR LA VARIABLE Total des charges de fonctionnement (B)pourcentage du total des dépenses ” NON OUI 17.32 16.81 .y. n statistic df p method 1 df_temp[, i] 36178 23.14402 2 9.43e-06 Kruskal-Wallis .y. n statistic df p method 1 df_temp[, i] 36178 3547.247 8 0 Kruskal-Wallis .y. n statistic df p method 1 df_temp2[, i] 35781 15.57717 2 0.000414 Kruskal-Wallis [1] “POUR LA VARIABLE Charges de fonctionnement : Charges de personnelpourcentage du total des dépenses ” NON OUI 22.35 21.33 [1] “MÉDIANES POUR LA VARIABLE Charges de fonctionnement : Charges de personnelpourcentage du total des dépenses ” NON OUI 21.89 20.96 [1] “ÉCART-TYPE POUR LA VARIABLE Charges de fonctionnement : Charges de personnelpourcentage du total des dépenses ” NON OUI 10.72 9.85