Ce markdown vise à retracer les étapes de l’élaboration et du traitement puis la cartographie des bases sur les zonages A/B/C et 1/2/3 pour la France entière. Celles-ci permettent d’appréhender l’évolution du classement des communes. Elles sont complétées dans l’analyse par l’étude des conditions d’éligibilité aux dispositifs qui leur sont adossés : les aides fiscales à l’investissement locatif (type Pinel), les PTZ, les APL accession.
A noter : la situation renseignée pour une année donnée correspond à celle en vigueur au 31 décembre. Par exemple, la cartographie du zonage A/B/C à Lyon en 2009 est celle au 31 décembre 2009, donc intégrant l’ensemble des changements survenus au cours de l’année 2009. Pour cette raison, la dernière année renseignée est 2019.
Les dispositifs de défiscalisation des revenus locatifs sont inaugurés au début des années 1980. Les dispositifs Quilès (1985-1986), Quilès-Méhaignerie (1987-1997), Quilès-Méhaignerie intermédiaire (1993-1997) et Périssol (1997-1999) n’étaient adossés à aucun zonage. Les dispositifs Besson (1999-2002),Robien (2003-2006) et Robien recentré (2006-2008), qui conditionnent les réductions d’impôt à des loyers abordables, en modulent les plafonds selon les zones du territoire français.
Depuis le Robien, ces dispositifs s’appuient sur le zonage dit “A/B/C”, créé en 2003, découpant la France en trois (A, B, C), puis quatre (A, B1, B2, C) et enfin cinq zones (A bis, A, B1, B2, C) selon le nombre d’habitant des agglomérations et le niveau de tension de leur marché immobilier résidentiel. Les catégories B1 et B2 apparaissent en 2006, la catégorie A bis en 2010.
A partir de 2009, certaines communes deviennent inéligibles :
Le dispositif Scellier (2009-2012) exclut d’abord les communes de la zone C avant de leur donner la possibilité, à partir de 2010, d’obtenir leur éligibilité par agrément préfectoral.
Le dispositif Duflot (2013-2014) exclut les communes des zones C et B2 en offrant la possibilité des agréments au second groupe.
Avec le dispositif Pinel (2015-2021), les zones C et B2 sont d’abord éligibles sous condition d’agrément préfectoral et deviennent inéligibles le 1 er janvier 2018 (article 39 du PLF 2018).
Le zonage A/B/C sert également de référence au prêt à taux zéro. Instauré en 1995, le PTZ (devenu PTZ+ en 2011) est associé à des plafonds susceptibles de varier selon la zone de localisation du logement. Créé en 2005, supprimé en 2011 et réinstauré sous des conditions plus restrictives en 2012, le PTZ dans l’ancien est définitivement supprimé des zones A et B1 depuis janvier 2018. Le PTZ neuf reste accessible sans condition de localisation (en dépit du projet initial de le limiter aux zones A bis, A et B1).
Le zonage 1/2/3 est plus ancien que le A/B/C. Il est initié par l’arrêté du 17 mars 1978 instaurant deux zones géographiques dans lesquelles sont classées une partie des communes du territoire. Ce premier découpage sert de fondement au classement 1/2/3 à proprement parler, instauré par l’arrêté du 29 mars 1999. Il s’agit d’un zonage relativement stable : ses dernières modifications remontent au début des années 2000.
Il a servi de support aux aides fiscales à l’investissement locatif du dispositif Besson (1999-2002). Il est également utilisé par la CAF pour le calcul des APL (et, depuis 2018, l’éligibilité aux APL accession).
Les tables figurant en output ont été réalisés en alternant traitement sous R et manipulation alla mano de tables sous Excel. A des fins de reproductibilité, l’ensemble des tables intermédiaires ont été enregistrées dans le dossier “Intermediate”. Pour chacune des étapes Excel, je précise dans ce markdown les traitements effectués.
Une base détail (“ABC_detail.xlsx”) construite comme suit : 1/En ligne : chaque commune qui a existé entre 2003 et 2019, renseignée par son code INSEE et son libellé pour chaque année sur cet intervalle de temps. Conséquence de ce choix de traitement : pour une année donnée, la liste des communes renseignées comprend des doublons (les communes qui ont connu des fusions ou des divisions sur la période) ; 2/ En colonne : pour chaque année le code INSEE et le libellé de la commune, leur zone A/B/C, leur éligibilité (“Oui” / “Non”) aux dispositifs d’aide fiscale à l’investissement locatif.
Une base présentant certains résultats agrégés (“ABC_agrege.xlsx”) composée de deux feuilles 1/ Une feuille récapitulant, pour chaque année, le nombre de communes classées dans chaque zone. 2/ Une feuille récapitulant, pour chaque année, le nombre de communes éligibles à l’aide à l’investissement locatif.
Une seconde partie, plus modeste, est consacrée à la construction d’un base historique du classement 1/2/3. Celui-ci, plus ancien que le A/B/C, constitue notamment le zonage de référence de la CAF. Crée en 1978, il est très stable depuis le milieu des années 2000 (la dernière modification, modeste par rapport au zonage précédent, remontant à 2005). Cette partie aboutit à la production d’une base détail sur la France entière rangée dans “Output/France” sous le nom “123_detail.xlsx”.
Il présente dans un troisième temps la cartographie des dispositifs sur les trois territoires d’étude.
Une quatrième partie donne à voir des premiers éléments d’analyse statistique.
Les sources utilisées sont toutes en libre accès et diffusées par les services publics. Elles sont de quatre types :
Des textes de loi disponibles en ligne sur legifrance.gouv.fr
Du zonage A/B/C pour l’année 2019 disponible sur le site du ministère de la Cohésion territoriale.
Des données disponibles sur les agréments préfectoraux - sur le site data.gouv.fr
Une base des communes par année compilée par l’INSEE et disponible sur son site.
Le zonage A/B/C, créé en 2003, a depuis été réformée à 5 reprises. Chaque changement est l’occasion de changer certaines communes de catégorie. Ces modifications successives sont établies par arrêtés, disponibles en ligne sur le site Legifrance. Je récapitule ci-dessous les textes utilisés ainsi que les modifications spécifiques qu’ils introduisent lorsque c’est le cas. Ils sont disponibles en version PDF dans le fichier “raw-data/LEGIFRANCE/ZONAGE_ABC” au format “Annee_mois_jour” :
| Date | Classes | Format | Lien |
|---|---|---|---|
| 19/12/2003 | A, B, C | Texte | Arrêté du 19 décembre 2003 |
| 10/08/2006 | A, B1, B2, C | Texte | Arrêté du 10 août 2006 |
| 29/04/2009 | A, B1, B2, C | Texte | Arrêté du 10 août 2006 modifié par l’arrêté du 29 avril 2009 |
| 22/12/2010 | A, A bis, B1; B2, C | Texte | Arrêté du 22 décembre 2010 |
| 01/08/2014 | A, A bis, B1; B2, C | Table | Arrêté du 1er août 2014 |
| 04/07/2019 | A, A bis, B1; B2, C | Table | Arrêté du 1er août 2014 modifié par l’arrêté du 4 juillet 2019 |
Ces arrêtés se limitent à lister les communes classées dans les catégories A et B. Les communes non mentionnées appartiennent à la zone C.
Le ministère de la Cohésion territoriale met en accès gratuit le classement des communes selon le zonage A/B/C (consulté le 19 mars 2020). Au moment de l’élaboration de ce travail, la table disponible correspond aux communes de l’année 2019.
De 2010 à 2017, l’éligibilité aux dispositifs Scellier, Duflot et Pinel ne dépend pas uniquement du classement des communes. Il est également possible, pour les communes qui n’appartiendraient pas aux zones éligibles, d’obtenir un agrément afin d’accéder à l’éligibilité.
L’arrêté du 23 septembre 2010 relatif à l’instruction des demandes de l’agrément prévu au X de l’article 199 septvicies du code général des impôts instaure la possibilité pour une commune de zone C d’accéder au dispositif Scellier sous condition d’agrément ministériel.
Ces agréments, lorsqu’ils ont lieu, sont publiés dans le Journal officiel. S’il n’existe pas de répertoire des agréments accordés, il est en revanche possible d’en recomposer une liste par recherche sur le site legifrance.gouv.fr en effectuant une recherche sur l’expression exacte “au X de l article 199 septvicies” sur (option “rechercher ces mots parmi les mots du texte”). On trouve ainsi 27 arrêtés d’agrément. Je dois cette idée à Béatrice Boutchenik, adjointe à la cheffe du bureau des études économiques du DGALN.
La liste des 27 agréments a été entrée à la main dans un tableur que j’ai fait figurer dans “raw-data/LEGIFRANCE/Agrements_Scellier”.
Pour la période 2013-2017, le site data.gouv propose une base au format .xls téléchargeable ici (consultation le 18 mars 2020).
Il s’agit d’une base au format 1 ligne = 1 commune. Pour chacune, identifiée à son code INSEE, est notamment indiqué la date de l’entrée en vigueur de l’arrêté d’agrément.
L’INSEE propose un historique des tables de passage des communes, dans une rubrique “Découpage communal” disponible ici (consultation le 18 février 2020, visiblement supprimée depuis, mais néanmoins disponible ici
Cette table a été utilisée afin d’établir la continuité des différents découpages et des différents classements.
Le traitement des données a suivi plusieurs étapes comme suit :
Etape 1 : élaboration de tables exploitables à partir des documents législatifs disponibles en ligne. Le produit de cette première étape sont les tables rangées dans le fichier “Intermediate/ABC/1_step”
Etape 2 : nettoyage de ces tables et de la constitution de tables harmonisées, nettoyées des erreurs et des problèmes de codage, indiquant le code INSEE de la commune, donc directement exploitables. Ces tables sont rangées dans le fichier “Intermediate/ABC/2_step”
Etape 3 : constitution d’une base unifiée répertoriant l’ensemble des communes de chaque année et les associant à leur zone A/B/C. Cette table est disponible à : “Output/France/ABC_detail.xlsx”.
Etape 4 : constitution de bases exposant des résultats agrégés directement exploitables, disponibles à : “Output/France/ABC_agrege.xlsx”.
Les arrêtés ont été traités comme suit :
Les arrêtés en format texte (2003, 2006 et 2009) ont été scrapés et convertis, pour chacun, en une table au format .csv. Ces tables ne sont pas directement exploitables et doivent avant tout traitement R être retraitées à la main selon les étapes décrites infra.
L’arrêté de 2010 n’étant qu’un texte de petite taille listant les 69 communes classées en A bis, son traitement a été fait alla mano.
L’arrêté de 2014 figurant la liste des communes sous forme de tables, celle-ci a simplement été copiée et collée dans un document au format Excel dans une mise en page exploitable.
L’arrêté de 2019 ne tenant pas compte d’un certain nombre de fusions de commune, il s’est avéré plus pertinent d’utiliser le classement A/B/C des communes de France par le ministère de la Cohésion territoriale.
La méthode du scraping permet d’aller chercher les données directement en ligne. Néanmoins, une version PDF des textes utilisés est disponible sur dans le fichier raw-data, même si le script de scraping n’y fait pas référence.
Le script proposé ci-dessous répète un même schéma de traitement pour chaque texte de loi scrapé. Pour des raisons de bon fonctionnement, il peut être bon de redémarrer R entre chaque boucle. Note également : le scraping s’exécute assez mal sous Mac.
J’indique ci-dessous les scripts utilisés pour scraper les données. Je détaille davantage le script utilisé pour aspirer le texte de 2003, les autres ont été réalisés sur le même modèle, avec quelques variations selon la façon dont se structurait la page.
Le résultat de cette étape préliminaire à tout nettoyage, et spécifique aux tables de 2003, 2006 et 2009, est enregistré dans le dossier “Intermediate/ABC/0_Scraping”.
# Chargement des packages
library(stringr)
library(RSelenium)
#############
# Base 2003 #
#############
# Connexion
## Connexion à un navigateur web
rD <- rsDriver(port = 4444L, browser = "firefox")
remDr <- rD[["client"]]
## Connection à l'url ciblée
url <- "https://www.legifrance.gouv.fr/affichTexte.do;jsessionid=1F7C67CA4C1B397C62B03EE74E06438D.tplgfr26s_1?cidTexte=JORFTEXT000000600609&idArticle=&categorieLien=id#JORFARTI000002239435"
remDr$navigate(url)
webElem <- remDr$findElement(using = 'xpath' , "//div[@class='article'][6]")
NAME <- webElem$getElementText()
# Nettoyage data
## Mise en tableau
result <- as.data.frame(str_split(NAME, "\n"))
## Supression lignes vides
result2 <- as.data.frame(result[result[1]!="",])
## Ventilation des commune par ligne à partir du symbol ", "
result3 <- as.data.frame(unlist(str_split(result2[,1], ", ")))
# Export de la table
write.csv2(result3,file = "Intermediate/ABC/0-scrapping/ABC_2003.csv")
# Cloture session
remDr$close()
rD[["server"]]$stop()
#############
# Base 2006 #
#############
# Connexion
rD <- rsDriver(port = 4444L, browser = "firefox")
remDr <- rD[["client"]]
url <- "https://www.legifrance.gouv.fr/affichTexteArticle.do;jsessionid=1F7C67CA4C1B397C62B03EE74E06438D.tplgfr26s_1?idArticle=LEGIARTI000020571467&cidTexte=JORFTEXT000000427351&categorieLien=id&dateTexte=20090503"
remDr$navigate(url)
webElem <- remDr$findElement(using = 'xpath' , "//div[@class='corpsArt']")
NAME <- webElem$getElementText()
# Nettoyage data
result <- as.data.frame(str_split(NAME, "\n"))
result2 <- as.data.frame(unlist(str_split(result[,1], ", ")))
# Export
write.csv2(result2,file = "Intermediate/ABC/0-scrapping/ABC_2006.csv")
# Cloture session
remDr$close()
rD[["server"]]$stop()
#############
# Base 2009 #
#############
# Connexion
rD <- rsDriver(port = 4444L, browser = "firefox")
remDr <- rD[["client"]]
url <- "https://www.legifrance.gouv.fr/affichTexteArticle.do;jsessionid=1F7C67CA4C1B397C62B03EE74E06438D.tplgfr26s_1?idArticle=LEGIARTI000020573740&cidTexte=JORFTEXT000000427351&categorieLien=id&dateTexte=20140806"
remDr$navigate(url)
webElem <- remDr$findElement(using = 'xpath' , "//div[@class='corpsArt']")
NAME <- webElem$getElementText()
# Nettoyage
result <- as.data.frame(str_split(NAME, "\n"))
result2 <- as.data.frame(result[result[1]!="",])
result3 <- as.data.frame(unlist(str_split(result2[,1], ", ")))
# Export
write.csv2(result3,file = "Intermediate/ABC/0-scrapping/ABC_2010.csv")
# Cloture session
remDr$close()
rD[["server"]]$stop()
Les tables ainsi créées comportent une seule colonne qui rassemble l’ensemble des informations pertinentes : zone, département et nom de la commune, sous la forme suivante :
| ;unlist(str_split(result2[, 1], “,”)) |
|---|
| 1;Annexe |
| 2;A N N E X E |
| 3;Zone A |
| 4;01 - Ain |
| 5;Cessy |
| 6;Challex |
| 7;Chevry |
| 8;Collonges |
Ces tables sont traitées à la main de façon à produire une table .xlsx au format 3 colonnes figurant respectivement : le nom de la commune (NOM_[année]), son département (DEP) et sa zone (ZONE_[année]).
Ce premier nettoyage a permis de régler une première série de problèmes qui rendaient ces tables inexploitables.
Les textes des arrêtés séparent les noms des communes d’une virgule, règle qui a guidé l’élaboration du script de scrapping. Néanmoins, ces virgules sont parfois omises : deux noms de communes cohabitent alors dans la même cellule du tableur. Ce problème a été réglé par une recherche du symbole " ". Dans l’essentiel des cas, un espace sépare un nom de commune de son déterminant (exemple : Le Bouscat). Dans les autres cas, qui correspondent à des oublis de virgule, les deux noms de communes ont été séparés.
La dernière commune de chaque zone est suivie d’un point (“.”) susceptible de gêner la bonne reconnaissance du nom de la commune. Ce problème est résolu très simplement en supprimant le caractère “.” de la table Excel.
Le nom d’un département est parfois suivi de la mention : “L’ensemble des communes du département” ou “L’ensemble des communes du département, hors communes en zone A”. Dans le premier cas, j’ai collé dans la base Excel la liste des communes répertoriées cette année là par l’INSEE. Dans le second j’ai ensuite déduit de cette liste les communes mentionnées en zone A.
Les tables finales, enregistrées dans le dossier “Intermediate/ABC/1s_step”, se présentent sous l’aspect suivant :
| NOM_2003 | DEP | ZONE_2003 |
|---|---|---|
| Cessy | 01 | A |
| Challex | 01 | A |
| Chevry | 01 | A |
| Collonges | 01 | A |
Les trois autres arrêtés sont directement transcrits sous forme de table .xlsx à la main.
Pour l’arrêté de 2010, la table Excel a été constituée en changeant à la main la zone des communes nommées dans le texte de loi. L’arrêté de 2010 se limite à crééer la catégorie A bis à partir de la catégorie A sans toucher aux catégories B1, B2 et C.
Pour l’arrêté de 2014, le texte de loi présente la liste des communes selon une table susceptible d’être directement copiée / collée dans Excel.
Dans les deux cas, les tables ainsi produites ont été stockées dans le dosser “Intermediate/ABC/1_step”
La précision relativement mauvaise de la liste des communes présentées dans cet arrêté (les fusions des années précédentes étant très imparfaitement prises en compte) a motivé l’utilisation de la table proposée par le ministère de la Cohésion territoriale (raw-data/MCT/ZONAGE_ABC)
L’objectif de cette deuxième étape est de construire, pour chaque année, une base associant à chaque commune de France sa zone. Elle a pour but de rendre les tables annuelles pleinement exploitables en réglant les problèmes de mention des communes :
Les communes sont renseignées par leur nom et leur département d’appartenance et non par leur code INSEE.
Certains noms de communes sont mal transcrits (mal orthographiés, tronqués, oubli d’accents, etc.). Par exemple, l’arrêté de 2003 mentionne la commune de Chanteloup-en-Chelles (77), qui n’a jamais existé. L’étude des communes aux noms proches m’a mené à supposer qu’il s’agissait de la communes de Chanteloup-en-Brie (77).
Certains noms de communes sont anachroniques (figurent des noms de communes qui ont déjà fusionnées à la date de l’arrêté).
Pour cela, j’ai réalisé un appariemment entre chaque table issue d’un arrêté et la liste des communes établie par l’INSEE l’année de publication de l’arrêté. L’appariemment a été réalisé sur la base d’une variable composée du nom de la commune accolé au numéro de son département (NOM_DEP). Les erreurs de transcription et les anachronismes ont eu pour effet de gêner l’appariemment. J’ai réglé ce problème en réalisant un second appariemment sur les résidus du premier au moyen de la distance de Levenshtein : celle-ci permet d’associer à chaque commune de la table issue de l’arrêté celle de la table INSEE pour laquelle la variable NOM_DEP présentait le plus grand degré de similitude. Le résultat de ce second appariemment a été contrôlé et, en cas de besoin, corrigé manuellement, avant d’être réinséré dans la table finale. Le cas des communes des DROM a également posé problème (créer la variable NOM_DEP sur la base issue de l’INSEE supposait de prendre les deux premiers numéros, ce qui créait des doublons pour les communes des DROM). Dans la mesure où toutes ces communes ont toujours été classées en B puis en B1, j’ai choisi de simplifier le traitement en créant une table à part que j’ai réinséré dans la table finale en fin de script.
La table des communes mal appariées (Miss_[annee]) est enregistrée pour chaque année dans le dossier “Intermediate/ABC/2b_missmatch”. La base créée sous R est signalée par le suffixe _brut ; celle corrigée à la main avant d’être réimportée dans R par le suffixe _corrige.
Le script ci-dessous détaille le procédé utilisé pour traiter la table correspondant à l’arrêté de 2003. Les scripts correspondant aux autres tables sont indiqués dans le fichier .Rmd mais masqués dans le .html à des fins de concision.
# Chargement des packages
library(readxl) # Pour importer en xlsx
library(openxlsx) # Pour exporter en xlsx
library(stringdist) # Pour les distances de Levenshtein
##############
## ABC 2003 ##
##############
# Ouverture des bases
## La base produite à l'étape 1
ABC_2003 <- read_excel("Intermediate/ABC/1_step/ABC_2003.xlsx")
## La base INSEE des communes en 2003
INSEE_passage <- read_excel("raw-data/INSEE/INSEE_DATA/Passage_communes_2003_2019.xls") # On s'appuie sur la base INSEE retraçant l'historique des communes de 2003 à 2019.
INSEE_passage <- subset(INSEE_passage, NIVGEO == "COM") # On enlève les arrondissements
INSEE_passage <- INSEE_passage[,2:35] # On enlève le champ NIVGEO qui ne sert plus à rien
INSEE_2003 <- INSEE_passage[, c("CODGEO_2019", "CODGEO_2003", "LIBGEO_2003")]
INSEE_2003 <- subset(INSEE_2003, !is.na(INSEE_2003$CODGEO_2003)) # On enlève les doublons
# Appariemment des deux bases
## Création du champ DEPARTEMENT sur lequel faire la jointure
INSEE_2003$DEPARTEMENT <- substr(INSEE_2003$CODGEO_2003, 0,2)
ABC_2003$DEPARTEMENT <- substr(ABC_2003$DEP, 0,2)
## Traitement des DROM
DROM_2003 <- subset(INSEE_2003, DEPARTEMENT == "97") # On crée la base DROM issue de la base INSEE
DROM_2003$ZONE_2003 <- "B" # On les met en zone B
DROM_2003 <- DROM_2003[3:114,c(2,5)] # On écarte les communes de St Barthélémy et St Martin
colnames(DROM_2003) <- c("CODGEO_2003", "ZONE_ABC_2003")
## Preparation des tables en vue de faire la jointure
ABC_2003 <- subset(ABC_2003, DEPARTEMENT != "97") # On enlève les DROM des bases ABC et INSEE
INSEE_2003$NOM_DEP <- paste0(INSEE_2003$LIBGEO_2003, INSEE_2003$DEPARTEMENT) # On crée notre champ NOM_DEP qui va nous servir à faire la jointure
ABC_2003$NOM_DEP <- paste0(ABC_2003$NOM_2003, ABC_2003$DEPARTEMENT)
table(duplicated(ABC_2003$NOM_DEP)) # On vérifie l'absence de doublons
# Appariemment
ABC_2003 <- merge(ABC_2003, INSEE_2003, by = "NOM_DEP", all.x = TRUE)
# Gestion du miss matching
## Création d'une base des communes non appariée
Miss_2003 <- subset(ABC_2003, is.na(ABC_2003$CODGEO_2003)) # On crée une base à part
ABC_2003 <- subset(ABC_2003, !is.na(ABC_2003$CODGEO_2003)) # On enlève les communes mal appariées de la table principale
Miss_2003 <- Miss_2003[,c(1:4)]
colnames(Miss_2003) <- c("NOM_DEP", "NOM", "DEP", "ZONE")
## On associe à chaque commune non appariée une commune de la base INSEE selon la distance de Levenshtein
mat_dist <- stringdistmatrix(Miss_2003$NOM_DEP, INSEE_2003$NOM_DEP)
Miss_2003$nom_co <- unlist(apply(
X = mat_dist,
MARGIN = 1,
FUN = function(x) INSEE_2003[which.min(x), "NOM_DEP"]
))
Miss_2003$cod_co <- unlist(apply(
X = mat_dist,
MARGIN = 1,
FUN = function(x) INSEE_2003[which.min(x), "CODGEO_2003"]
))
## On exporte cette table pour la corriger à la main
write.xlsx(Miss_2003, "Intermediate/ABC/2b_missmatch/ABC_2003_brut.xlsx")
remove(mat_dist)
## On corrige la table à la main, hors R donc.
## On importe la table corrigée à la main
Miss_2003 <- read_excel("Intermediate/ABC/2b_missmatch/ABC_2003_corrige.xlsx")
Miss_2003 <- Miss_2003[,c(6,4)]
colnames(Miss_2003) <- c("CODGEO_2003", "ZONE_ABC_2003")
# Assemblage de la table finalisée
## On allège la table principale ABC
ABC_2003 <- ABC_2003[,c("CODGEO_2003", "ZONE_2003")]
colnames(ABC_2003) <- c("CODGEO_2003", "ZONE_ABC_2003")
## On y insère les tables sur les DROM et celle sur les erreurs d'appariement
ABC_2003 <- rbind(ABC_2003, DROM_2003)
ABC_2003 <- rbind(ABC_2003, Miss_2003)
remove(DROM_2003)
remove(Miss_2003)
## On ajoute les communes de la zone C par matching avec la table INSEE (toute commune qui n'est pas dans la table nettoyée est zone C)
ABC_2003 <- merge(ABC_2003, INSEE_2003, by = "CODGEO_2003", all.y = T)
ABC_2003$ZONE_ABC_2003[ABC_2003$CODGEO_2003 == "06114"] <- "A" # On corrige une erreur aussi isolée qu'incompréhensible
ABC_2003 <- ABC_2003[,1:4]
## On classe en zone C toutes les communes qui renvoient NA pour la zone
ABC_2003$ZONE_ABC_2003[is.na(ABC_2003$ZONE_ABC_2003)] <- "C"
## On enlève les doublons
ABC_2003 <- subset(ABC_2003, !duplicated(ABC_2003))
write.xlsx(ABC_2003, "Intermediate/ABC/2_step/ABC_2003.xlsx")
remove(INSEE_2003)
Le traitement de la base proposée par le ministère de la Cohésion territoriale différant légèrement des précédents, je l’indique également. Cette table nécessite moins de traitement que les précédentes du fait qu’elle indique directement le code INSEE des communes. Je me suis donc limité à vérifier que les communes de la table sont bien les mêmes que celles répertoriées par l’INSEE à la même date.
##############
## ABC 2019 ##
##############
# Ouverture des bases
## La base téléchargée sur data.gouv
ABC_2019 <- read_xls("raw-data/MCT/ZONAGE_ABC/Zonage_ABC_2019.xls")
colnames(ABC_2019) <- c("CODGEO_2019", "LIBGEO_2019", "ZONE_ABC_2019")
## La base INSEE des communes en 2019
INSEE_2019 <- INSEE_passage[, c("CODGEO_2019", "LIBGEO_2019")]
## On fait la jointure avec la table INSEE
ABC_2019 <- merge(ABC_2019, INSEE_2019, by = "CODGEO_2019", all.y = T)
table(is.na(ABC_2019$ZONE_ABC_2019)) # Seul missmatch : deux lignes de NA
ABC_2019 <- subset(ABC_2019, !is.na(ABC_2019$ZONE_ABC_2019))
## On enlève le champ "NOM"
ABC_2019 <- ABC_2019[,c(1, 3, 4)]
colnames(ABC_2019) <- c("CODGEO_2019", "ZONE_ABC_2019", "LIBGEO_2019")
ABC_2019$ZONE_ABC_2019[ABC_2019$ZONE_ABC_2019 == "Abis"] <- "A bis" # Correction d'une erreur mineure de codification
ABC_2019 <- subset(ABC_2019, !duplicated(ABC_2019$CODGEO_2019))
write.xlsx(ABC_2019, "Intermediate/ABC/2_step/ABC_2019.xlsx")
remove(INSEE_2019)
Cette étape comprend deux temps :
La jointure entre les tables produites à l’étape 2 et la table de passage des communes produite par l’INSEE.
Le classement des communes dans les zones A/B/C pour les années “manquantes”, c’est-à-dire les années où il n’y a pas eu d’arrêté.
Cette table unifiée est le produit de la jointure des tables de l’étape 2 et de la table de passage de l’INSEE 2003-2019 :
# Ouverture de la table de passage des communes de l'INSEE
INSEE_passage <- read_excel("raw-data/INSEE/INSEE_DATA/Passage_communes_2003_2019.xls")
INSEE_passage <- subset(INSEE_passage, NIVGEO == "COM") # On enlève les arrondissements
INSEE_passage <- INSEE_passage[,2:35] # On enlève la première colonne
# Jointure des tables ABC successives
## Importation des tables ABC dont on ne conserve que le code et le nom pour l'année de référence
ABC_2003 <- read_excel("Intermediate/ABC/2_step/ABC_2003.xlsx")
ABC_2003 <- ABC_2003[,1:2]
ABC_2003 <- subset(ABC_2003, !is.na(ABC_2003$CODGEO_2003))
ABC_2006 <- read_excel("Intermediate/ABC/2_step/ABC_2006.xlsx")
ABC_2006 <- ABC_2006[,1:2]
ABC_2006 <- subset(ABC_2006, !is.na(ABC_2006$CODGEO_2006))
ABC_2009 <- read_excel("Intermediate/ABC/2_step/ABC_2009.xlsx")
ABC_2009 <- ABC_2009[,1:2]
ABC_2009 <- subset(ABC_2009, !is.na(ABC_2009$CODGEO_2009))
ABC_2010 <- read_excel("Intermediate/ABC/2_step/ABC_2010.xlsx")
ABC_2010 <- ABC_2010[,1:2]
ABC_2010 <- subset(ABC_2010, !is.na(ABC_2010$CODGEO_2010))
ABC_2014 <- read_excel("Intermediate/ABC/2_step/ABC_2014.xlsx")
ABC_2014 <- ABC_2014[,1:2]
ABC_2014 <- subset(ABC_2014, !is.na(ABC_2014$CODGEO_2014))
ABC_2019 <- read_excel("Intermediate/ABC/2_step/ABC_2019.xlsx")
ABC_2019 <- ABC_2019[,1:2]
ABC_2019 <- subset(ABC_2019, !is.na(ABC_2019$CODGEO_2019))
## On joint les tables successivement dans une nouvelle table ABC
ABC <- merge(INSEE_passage, ABC_2003, by = "CODGEO_2003", all.x = T)
ABC <- merge(ABC, ABC_2006, by = "CODGEO_2006", all.x = T)
ABC <- merge(ABC, ABC_2009, by = "CODGEO_2009", all.x = T)
ABC <- merge(ABC, ABC_2010, by = "CODGEO_2010", all.x = T)
ABC <- merge(ABC, ABC_2014, by = "CODGEO_2014", all.x = T)
ABC <- merge(ABC, ABC_2019, by = "CODGEO_2019", all.x = T) # Des doublons apparaissent uniquement à cette dernière étape, d'une façon un peu inexplicable. On les enlève :
ABC <- subset(ABC, !duplicated(ABC))
## Réorganisation de la table
ABC <- ABC[, c("CODGEO_2019", "LIBGEO_2019", "CODGEO_2018", "LIBGEO_2018","CODGEO_2017", "LIBGEO_2017","CODGEO_2016", "LIBGEO_2016", "CODGEO_2015", "LIBGEO_2015", "CODGEO_2014", "LIBGEO_2014", "CODGEO_2013", "LIBGEO_2013","CODGEO_2012", "LIBGEO_2012","CODGEO_2011", "LIBGEO_2011","CODGEO_2010", "LIBGEO_2010","CODGEO_2009", "LIBGEO_2009","CODGEO_2008", "LIBGEO_2008","CODGEO_2007", "LIBGEO_2007","CODGEO_2006", "LIBGEO_2006","CODGEO_2005", "LIBGEO_2005","CODGEO_2004", "LIBGEO_2004","CODGEO_2003", "LIBGEO_2003", "ZONE_ABC_2003","ZONE_ABC_2006","ZONE_ABC_2009","ZONE_ABC_2010","ZONE_ABC_2014","ZONE_ABC_2019")]
Le but est ici de tenir compte des fusions et divisions communales afin que le classement A/B/C corresponde bien au découpage communal de chaque année.
Lorsque deux communes fusionnent, la nouvelle commune garde le code INSEE d’une des communes fusionnées. J’attribue alors à la nouvelle commune la zone de la commune dont le code INSEE a été conservé.
Lorsque deux communes se divisent, je place chaque commune filles dans la zone dans laquelle les place le classement qui suit immédiatement. Par exemeple, si en 2004 la commune codée A se divise en une commune codée A et une commune codée B : la nouvelle commune A est classée dans la même zone l’ancienne commune A et la commune B est classée dans la zone dans laquelle la classe l’arrêté de 2006.
Je procède donc de la façon suivante. Pour construire le classement des communes d’une année n :
Je charge le classement de l’année n-1.
J’effectue une jointure entre ce classement et la liste des communes établie par l’INSEE pour l’année n.
Je règle les missmatchs au cas par cas.
Les erreurs d’appariement ne concernent que les cas de divisions de communes, c’est-à-dire d’apparition de codes INSEE qui n’existaient pas l’année précédente. Dans ces cas là, je classe manuellement la nouvelle commune dans la zone dans laquelle elle est classée lors su classement postérieur. Il s’agit généralement de communes de zone C mais pas uniquement.
Les cas de fusions, donc de disparition de codes INSEE, ne posent pas de problème : la commune fusionnée est directement classée dans la zone de son chef-lieu dont elle conserve le code INSEE.
A des fins de concision, je ne rends visible dans le fichier .html que le script correspondant à l’élaboration de la table de 2004, les autres sont indiquées dans le fichier .Rmd.
##########
## 2004 ##
##########
# On ouvre la table ABC de 2003
ABC_2003 <- read_excel("Intermediate/ABC/2_step/ABC_2003.xlsx")
ABC_2003 <- ABC_2003[,1:2]
# On produit la liste des communes françaises de 2004 à partir de la table ABC complète
INSEE_2004 <- ABC[, c("CODGEO_2004", "LIBGEO_2004")]
INSEE_2004 <- subset(INSEE_2004, !duplicated(INSEE_2004$CODGEO_2004))
INSEE_2004 <- subset(INSEE_2004, !is.na(INSEE_2004$CODGEO_2004))
# On fusionne les deux
ABC_2004 <- merge(ABC_2003, INSEE_2004, by.x = "CODGEO_2003", by.y = "CODGEO_2004", all.y = T)
# On analyse les erreurs d'appariemment :
table(is.na(ABC_2004$CODGEO_2003))
table(is.na(ABC_2004$ZONE_ABC_2003)) # 4 NA. Donc, 4 codes communes qui existaient en 2004 n'existaient pas en 2003.
table(is.na(ABC_2004$LIBGEO_2004)) # 0 NA. Donc, 0 codes communes qui existaient en 2003 n'existaient plus en 2004.
# Les codes INSEE des nouvelles communes sont : 55068 ; 55082 ; 47163 ; 89288.
# On regarde dans la matrice passage les lignes pour lesquelles le CODGEO_2004 est 55068 ; 55082 ; 47163 ; 89288
NV_COM_2004 <- subset(ABC, ABC$CODGEO_2004 == "55068" | ABC$CODGEO_2004 == "55082" | ABC$CODGEO_2004 == "47163" | ABC$CODGEO_2004 == "89288") # On observe que les quatre communes sont classées en zone C en 2006.
remove(NV_COM_2004)
# On produit la table ABC 2004
colnames(ABC_2004) <- c("CODGEO_2004", "ZONE_ABC_2004", "LIBGEO_2004")
ABC_2004$ZONE_ABC_2004[is.na(ABC_2004$ZONE_ABC_2004)] <- "C"
# On la sauvegarde
write.xlsx(ABC_2004, "Intermediate/ABC/2_step/ABC_2004.xlsx")
# On l'incorpore à la base ABC générale
ABC_2004 <- ABC_2004[,1:2]
ABC <- merge(ABC, ABC_2004, by = "CODGEO_2004", all.x = T)
Une fois créées une table pour chaque année, on assemble la table finale, qu’on enregistre en Output :
ABC <- ABC[, c("CODGEO_2019", "LIBGEO_2019", "CODGEO_2018", "LIBGEO_2018","CODGEO_2017", "LIBGEO_2017","CODGEO_2016", "LIBGEO_2016", "CODGEO_2015", "LIBGEO_2015", "CODGEO_2014", "LIBGEO_2014", "CODGEO_2013", "LIBGEO_2013","CODGEO_2012", "LIBGEO_2012","CODGEO_2011", "LIBGEO_2011","CODGEO_2010", "LIBGEO_2010","CODGEO_2009", "LIBGEO_2009","CODGEO_2008", "LIBGEO_2008","CODGEO_2007", "LIBGEO_2007","CODGEO_2006", "LIBGEO_2006","CODGEO_2005", "LIBGEO_2005","CODGEO_2004", "LIBGEO_2004","CODGEO_2003", "LIBGEO_2003", "ZONE_ABC_2003", "ZONE_ABC_2004", "ZONE_ABC_2005","ZONE_ABC_2006", "ZONE_ABC_2007", "ZONE_ABC_2008","ZONE_ABC_2009","ZONE_ABC_2010", "ZONE_ABC_2011", "ZONE_ABC_2012", "ZONE_ABC_2013","ZONE_ABC_2014", "ZONE_ABC_2015", "ZONE_ABC_2016", "ZONE_ABC_2017", "ZONE_ABC_2018","ZONE_ABC_2019")]
write.xlsx(ABC, "Output/France/ABC_detail.xlsx")
Je construis deux tables synthétiques de mes résultats :
Une table récpitulant le nombre de communes classées dans chaque zone par année.
Une table récapitulant le nombre de communes éligibles (en tenant compte des agréments) par année.
Pour construire cette table, il n’est pas possible de simplement faire des sommes sur la table ABC unifiée en raison des nombreux doublons qui y figurent. J’ai donc élaboré cette table synthétique à partir des tables annuelles stockées en “Intermediate/ABC/2_step”.
# Calcul pour 2003
ABC_03 <- read_excel("Intermediate/ABC/2_step/ABC_2003.xlsx")
a03 <- sum(ABC_03$ZONE_ABC_2003 == "A")
ab03 <- NA
b03 <- sum(ABC_03$ZONE_ABC_2003 == "B")
b103 <- NA
b203 <- NA
c03 <- sum(ABC_03$ZONE_ABC_2003 == "C")
t03 <- nrow(ABC_03)
# Calcul pour 2004
ABC_04 <- read_excel("Intermediate/ABC/2_step/ABC_2004.xlsx")
a04 <- sum(ABC_04$ZONE_ABC_2004 == "A")
ab04 <- NA
b04 <- sum(ABC_04$ZONE_ABC_2004 == "B")
b104 <- NA
b204 <- NA
c04 <- sum(ABC_04$ZONE_ABC_2004 == "C")
t04 <- nrow(ABC_04)
# Calcul pour 2005
ABC_05 <- read_excel("Intermediate/ABC/2_step/ABC_2005.xlsx")
a05 <- sum(ABC_05$ZONE_ABC_2005 == "A")
ab05 <- NA
b05 <- sum(ABC_05$ZONE_ABC_2005 == "B")
b105 <- NA
b205 <- NA
c05 <- sum(ABC_05$ZONE_ABC_2005 == "C")
t05 <- nrow(ABC_05)
# Calcul pour 2006
ABC_06 <- read_excel("Intermediate/ABC/2_step/ABC_2006.xlsx")
a06 <- sum(ABC_06$ZONE_ABC_2006 == "A")
ab06 <- NA
b106 <- sum(ABC_06$ZONE_ABC_2006 == "B1")
b206 <- sum(ABC_06$ZONE_ABC_2006 == "B2")
b06 <- b106 + b206
c06 <- sum(ABC_06$ZONE_ABC_2006 == "C")
t06 <- nrow(ABC_06)
# Calcul pour 2007
ABC_07 <- read_excel("Intermediate/ABC/2_step/ABC_2007.xlsx")
a07 <- sum(ABC_07$ZONE_ABC_2007 == "A")
ab07 <- NA
b107 <- sum(ABC_07$ZONE_ABC_2007 == "B1")
b207 <- sum(ABC_07$ZONE_ABC_2007 == "B2")
b07 <- b107 + b207
c07 <- sum(ABC_07$ZONE_ABC_2007 == "C")
t07 <- nrow(ABC_07)
# Calcul pour 2008
ABC_08 <- read_excel("Intermediate/ABC/2_step/ABC_2008.xlsx")
a08 <- sum(ABC_08$ZONE_ABC_2008 == "A")
ab08 <- NA
b108 <- sum(ABC_08$ZONE_ABC_2008 == "B1")
b208 <- sum(ABC_08$ZONE_ABC_2008 == "B2")
b08 <- b108 + b208
c08 <- sum(ABC_08$ZONE_ABC_2008 == "C")
t08 <- nrow(ABC_08)
# Calcul pour 2009
ABC_09 <- read_excel("Intermediate/ABC/2_step/ABC_2009.xlsx")
a09 <- sum(ABC_09$ZONE_ABC_2009 == "A")
ab09 <- NA
b109 <- sum(ABC_09$ZONE_ABC_2009 == "B1")
b209 <- sum(ABC_09$ZONE_ABC_2009 == "B2")
b09 <- b109 + b209
c09 <- sum(ABC_09$ZONE_ABC_2009 == "C")
t09 <- nrow(ABC_09)
# Calcul pour 2010
ABC_10 <- read_excel("Intermediate/ABC/2_step/ABC_2010.xlsx")
ab10 <- sum(ABC_10$ZONE_ABC_2010 == "A bis")
a10 <- sum(ABC_10$ZONE_ABC_2010 == "A") + ab10
b110 <- sum(ABC_10$ZONE_ABC_2010 == "B1")
b210 <- sum(ABC_10$ZONE_ABC_2010 == "B2")
b10 <- b110 + b210
c10 <- sum(ABC_10$ZONE_ABC_2010 == "C")
t10 <- nrow(ABC_10)
# Calcul pour 2011
ABC_11 <- read_excel("Intermediate/ABC/2_step/ABC_2011.xlsx")
ab11 <- sum(ABC_11$ZONE_ABC_2011 == "A bis")
a11 <- sum(ABC_11$ZONE_ABC_2011 == "A") + ab11
b111 <- sum(ABC_11$ZONE_ABC_2011 == "B1")
b211 <- sum(ABC_11$ZONE_ABC_2011 == "B2")
b11 <- b111 + b211
c11 <- sum(ABC_11$ZONE_ABC_2011 == "C")
t11 <- nrow(ABC_11)
# Calcul pour 2012
ABC_12 <- read_excel("Intermediate/ABC/2_step/ABC_2012.xlsx")
ab12 <- sum(ABC_12$ZONE_ABC_2012 == "A bis")
a12 <- sum(ABC_12$ZONE_ABC_2012 == "A") + ab12
b112 <- sum(ABC_12$ZONE_ABC_2012 == "B1")
b212 <- sum(ABC_12$ZONE_ABC_2012 == "B2")
b12 <- b112 + b212
c12 <- sum(ABC_12$ZONE_ABC_2012 == "C")
t12 <- nrow(ABC_12)
# Calcul pour 2013
ABC_13 <- read_excel("Intermediate/ABC/2_step/ABC_2013.xlsx")
ab13 <- sum(ABC_13$ZONE_ABC_2013 == "A bis")
a13 <- sum(ABC_13$ZONE_ABC_2013 == "A") + ab13
b113 <- sum(ABC_13$ZONE_ABC_2013 == "B1")
b213 <- sum(ABC_13$ZONE_ABC_2013 == "B2")
b13 <- b113 + b213
c13 <- sum(ABC_13$ZONE_ABC_2013 == "C")
t13 <- nrow(ABC_13)
# Calcul pour 2014
ABC_14 <- read_excel("Intermediate/ABC/2_step/ABC_2014.xlsx")
ab14 <- sum(ABC_14$ZONE_ABC_2014 == "A bis")
a14 <- sum(ABC_14$ZONE_ABC_2014 == "A") + ab14
b114 <- sum(ABC_14$ZONE_ABC_2014 == "B1")
b214 <- sum(ABC_14$ZONE_ABC_2014 == "B2")
b14 <- b114 + b214
c14 <- sum(ABC_14$ZONE_ABC_2014 == "C")
t14 <- nrow(ABC_14)
# Calcul pour 2015
ABC_15 <- read_excel("Intermediate/ABC/2_step/ABC_2015.xlsx")
ab15 <- sum(ABC_15$ZONE_ABC_2015 == "A bis")
a15 <- sum(ABC_15$ZONE_ABC_2015 == "A") + ab15
b115 <- sum(ABC_15$ZONE_ABC_2015 == "B1")
b215 <- sum(ABC_15$ZONE_ABC_2015 == "B2")
b15 <- b115 + b215
c15 <- sum(ABC_15$ZONE_ABC_2015 == "C")
t15 <- nrow(ABC_15)
# Calcul pour 2016
ABC_16 <- read_excel("Intermediate/ABC/2_step/ABC_2016.xlsx")
ab16 <- sum(ABC_16$ZONE_ABC_2016 == "A bis")
a16 <- sum(ABC_16$ZONE_ABC_2016 == "A") + ab16
b116 <- sum(ABC_16$ZONE_ABC_2016 == "B1")
b216 <- sum(ABC_16$ZONE_ABC_2016 == "B2")
b16 <- b116 + b216
c16 <- sum(ABC_16$ZONE_ABC_2016 == "C")
t16 <- nrow(ABC_16)
# Calcul pour 2017
ABC_17 <- read_excel("Intermediate/ABC/2_step/ABC_2017.xlsx")
ab17 <- sum(ABC_17$ZONE_ABC_2017 == "A bis")
a17 <- sum(ABC_17$ZONE_ABC_2017 == "A") + ab17
b117 <- sum(ABC_17$ZONE_ABC_2017 == "B1")
b217 <- sum(ABC_17$ZONE_ABC_2017 == "B2")
b17 <- b117 + b217
c17 <- sum(ABC_17$ZONE_ABC_2017 == "C")
t17 <- nrow(ABC_17)
# Calcul pour 2018
ABC_18 <- read_excel("Intermediate/ABC/2_step/ABC_2018.xlsx")
ab18 <- sum(ABC_18$ZONE_ABC_2018 == "A bis")
a18 <- sum(ABC_18$ZONE_ABC_2018 == "A") + ab18
b118 <- sum(ABC_18$ZONE_ABC_2018 == "B1")
b218 <- sum(ABC_18$ZONE_ABC_2018 == "B2")
b18 <- b118 + b218
c18 <- sum(ABC_18$ZONE_ABC_2018 == "C")
t18 <- nrow(ABC_18)
# Calcul pour 2019
ABC_19 <- read_excel("Intermediate/ABC/2_step/ABC_2019.xlsx")
ab19 <- sum(ABC_19$ZONE_ABC_2019 == "A bis")
a19 <- sum(ABC_19$ZONE_ABC_2019 == "A") + ab19
b119 <- sum(ABC_19$ZONE_ABC_2019 == "B1")
b219 <- sum(ABC_19$ZONE_ABC_2019 == "B2")
b19 <- b119 + b219
c19 <- sum(ABC_19$ZONE_ABC_2019 == "C")
t19 <- nrow(ABC_19)
Tab1 <- data.frame(Année = c(2003:2019),
A = c(a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19),
Abis = c(ab03, ab04, ab05, ab06, ab07, ab08, ab09, ab10, ab11, ab12, ab13, ab14, ab15, ab16, ab17, ab18, ab19),
B = c(b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19),
B1 = c(b103, b104, b105, b106, b107, b108, b109, b110, b111, b112, b113, b114, b115, b116, b117, b118, b119),
B2 = c(b203, b204, b205, b206, b207, b208, b209, b210, b211, b212, b213, b214, b215, b216, b217, b218, b219),
C = c(c03, c04, c05, c06, c07, c08, c09, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19),
Total = c(t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19))
knitr::kable(Tab1)
| Année | A | Abis | B | B1 | B2 | C | Total |
|---|---|---|---|---|---|---|---|
| 2003 | 592 | NA | 4174 | NA | NA | 31912 | 36678 |
| 2004 | 592 | NA | 4174 | NA | NA | 31916 | 36682 |
| 2005 | 592 | NA | 4174 | NA | NA | 31918 | 36684 |
| 2006 | 593 | NA | 4177 | 1942 | 2235 | 31946 | 36716 |
| 2007 | 593 | NA | 4177 | 1942 | 2235 | 31913 | 36683 |
| 2008 | 593 | NA | 4178 | 1942 | 2236 | 31910 | 36681 |
| 2009 | 591 | NA | 4940 | 1748 | 3192 | 31177 | 36708 |
| 2010 | 591 | 69 | 4940 | 1748 | 3192 | 31177 | 36708 |
| 2011 | 591 | 69 | 4938 | 1748 | 3190 | 31151 | 36680 |
| 2012 | 591 | 69 | 4953 | 1764 | 3189 | 31156 | 36700 |
| 2013 | 591 | 69 | 4953 | 1764 | 3189 | 31137 | 36681 |
| 2014 | 727 | 77 | 5447 | 1547 | 3900 | 30510 | 36684 |
| 2015 | 727 | 77 | 5442 | 1546 | 3896 | 30489 | 36658 |
| 2016 | 727 | 77 | 5404 | 1545 | 3859 | 29754 | 35885 |
| 2017 | 727 | 77 | 5385 | 1535 | 3850 | 29304 | 35416 |
| 2018 | 727 | 77 | 5378 | 1534 | 3844 | 29252 | 35357 |
| 2019 | 724 | 76 | 5363 | 1535 | 3828 | 28883 | 34970 |
Cette table a été élaborée en combinant le classement par zone des communes et les agréments préfectoraux. Les conditions d’éligibilité aux dispositifs d’aides fiscales ont varié au fil des arrêtés selon les modalités présentées en 1.1 de ce document.
Point important : cette table pâtit d’une absence de données sur les agréments sur la période 2010-2012. Pour ces trois années, les effectifs d’éligibilité sont donc sous-évalués.
library(dplyr)
# Ouverture
ABC <- read_excel("Output/France/ABC_detail.xlsx")
ABC <- ABC[,c(1,3,5,7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35:51)]
# Définition de l'éligibilité selon la zone année par année
## Pour la période 2003-2008
ABC$ELIG_2003 <- "Oui"
ABC$ELIG_2004 <- "Oui"
ABC$ELIG_2005 <- "Oui"
ABC$ELIG_2006 <- "Oui"
ABC$ELIG_2007 <- "Oui"
ABC$ELIG_2008 <- "Oui"
## Pour la période 2009-2012
ABC$ELIG_2009 <- "Oui"
ABC$ELIG_2009[ABC$ZONE_ABC_2009 == "C"] <- "Non"
ABC$ELIG_2010 <- "Oui"
ABC$ELIG_2010[ABC$ZONE_ABC_2010 == "C"] <- "Non"
ABC$ELIG_2011 <- "Oui"
ABC$ELIG_2011[ABC$ZONE_ABC_2011 == "C"] <- "Non"
ABC$ELIG_2012 <- "Oui"
ABC$ELIG_2012[ABC$ZONE_ABC_2012 == "C"] <- "Non"
## Pour la période 2013-2017
ABC$ELIG_2013 <- "Oui"
ABC$ELIG_2013[ABC$ZONE_ABC_2013 == "C" | ABC$ZONE_ABC_2013 == "B2"] <- "Non"
ABC$ELIG_2014 <- "Oui"
ABC$ELIG_2014[ABC$ZONE_ABC_2014 == "C" | ABC$ZONE_ABC_2014 == "B2"] <- "Non"
ABC$ELIG_2015 <- "Oui"
ABC$ELIG_2015[ABC$ZONE_ABC_2015 == "C" | ABC$ZONE_ABC_2015 == "B2"] <- "Non"
ABC$ELIG_2016 <- "Oui"
ABC$ELIG_2016[ABC$ZONE_ABC_2016 == "C" | ABC$ZONE_ABC_2016 == "B2"] <- "Non"
ABC$ELIG_2017 <- "Oui"
ABC$ELIG_2017[ABC$ZONE_ABC_2017 == "C" | ABC$ZONE_ABC_2017 == "B2"] <- "Non"
ABC$ELIG_2018 <- "Oui"
ABC$ELIG_2018[ABC$ZONE_ABC_2018 == "C" | ABC$ZONE_ABC_2018 == "B2"] <- "Non"
ABC$ELIG_2019 <- "Oui"
ABC$ELIG_2019[ABC$ZONE_ABC_2019 == "C" | ABC$ZONE_ABC_2019 == "B2"] <- "Non"
# Ajout des agréments
## Sur la période 2010-2012
# Agrements_Scellier <- read_excel("raw-data/LEGIFRANCE/Agrements_Scellier.xlsx")
# Agrements_Scellier <- Agrements_Scellier[,c(1,5)]
# colnames(Agrements_Scellier)[2] <- "DATE_AGREM_SC"
#
# ABC <- merge(ABC, Agrements_Scellier[Agrements_Scellier$DATE_AGREM_SC == "2011",], by.x = "CODGEO_2011", by.y = "CODGEO", all.x = T)
# ABC <- merge(ABC, Agrements_Scellier[Agrements_Scellier$DATE_AGREM_SC == "2012",], by.x = "CODGEO_2012", by.y = "CODGEO", all.x = T)
# ABC$DATE_AGREM_SC.x <- ifelse(is.na(ABC$DATE_AGREM_SC.x), ABC$DATE_AGREM_SC.y, ABC$DATE_AGREM_SC.x)
# ABC <- ABC[,c(1:52)]
# colnames(ABC)[52] <- "DATE_AGREM_SC"
## Sur la période 2013-2017
## Ouverture de la table sur les agréments Duflot et Pinel
Agrements <- read_excel("raw-data/MCT/ZONAGE_ABC/Agrements.xls")
Agrements <- Agrements[,c(4,6,7)]
colnames(Agrements) <- c("CODGEO", "DATE_AGREM", "TYPE_MODIF")
## Préparation en vue de son intégration à la base ABC
Agrements$DATE_AGREM <- substr(Agrements$DATE_AGREM, 1, 4)
## Gestion des NA
# En étudiant la table originale, il apparaît que les cas où la date de publication de l'agrément n'est pas renseignée, celle de la signature l'est en commentaire. Pour l'ensemble des cas, la signature est intervenue en 2015 ; on inscrit donc "2015".
Agrements$DATE_AGREM[is.na(Agrements$DATE_AGREM)] <- "2015"
## Création d'une table recensant les agréments pour chaque année
Agrements_12 <- subset(Agrements, Agrements$DATE_AGREM == "2012")
colnames(Agrements_12) <- c("CODGEO_2012", "DATE_AGREM")
Agrements_13 <- subset(Agrements, Agrements$DATE_AGREM == "2013")
colnames(Agrements_13) <- c("CODGEO_2013", "DATE_AGREM")
Agrements_14 <- subset(Agrements, Agrements$DATE_AGREM == "2014")
colnames(Agrements_14) <- c("CODGEO_2014", "DATE_AGREM")
Agrements_15 <- subset(Agrements, Agrements$DATE_AGREM == "2015")
colnames(Agrements_15) <- c("CODGEO_2015", "DATE_AGREM")
Agrements_16 <- subset(Agrements, Agrements$DATE_AGREM == "2016")
colnames(Agrements_16) <- c("CODGEO_2016", "DATE_AGREM")
Agrements_17 <- subset(Agrements, Agrements$DATE_AGREM == "2017")
colnames(Agrements_17) <- c("CODGEO_2017", "DATE_AGREM")
## Jointure des tables sur les agréments à la table ABC unifiée
# Note : à chaque jointure, on "perd" quelques communes. Certaines ont en effet reçus plusieurs fois un agrément (doublons dans la base originale Agrements), ce qui tient au fait qu'elles ont fusionné (il n'y a donc pas de perte d'agrément, simplement réaffirmation).
# La méthode suivie ci-dessous permet de ne retenir que le premier agrément : on considère une commune éligible à partir de cette première date.
# 2012
ABC <- merge(ABC, Agrements_12, by = "CODGEO_2012", all.x = T)
# 2013
ABC <- merge(ABC, Agrements_13, by = "CODGEO_2013", all.x = T)
ABC$DATE_AGREM.x <- ifelse(is.na(ABC$DATE_AGREM.x), ABC$DATE_AGREM.y, ABC$DATE_AGREM.x)
ABC <- ABC[,c(1:53)]
# 2014
ABC <- merge(ABC, Agrements_14, by = "CODGEO_2014", all.x = T)
ABC$DATE_AGREM.x <- ifelse(is.na(ABC$DATE_AGREM.x), ABC$DATE_AGREM, ABC$DATE_AGREM.x)
ABC <- ABC[,c(1:53)]
# 2015
ABC <- merge(ABC, Agrements_15, by = "CODGEO_2015", all.x = T)
ABC$DATE_AGREM.x <- ifelse(is.na(ABC$DATE_AGREM.x), ABC$DATE_AGREM, ABC$DATE_AGREM.x)
ABC <- ABC[,c(1:53)]
# 2016
ABC <- merge(ABC, Agrements_16, by = "CODGEO_2016", all.x = T) # La fusion crée étrangement 10 doublons, qu'on enlève
ABC <- subset(ABC, !duplicated(ABC))
ABC$DATE_AGREM.x <- ifelse(is.na(ABC$DATE_AGREM.x), ABC$DATE_AGREM, ABC$DATE_AGREM.x)
ABC <- ABC[,c(1:53)]
# 2017
ABC <- merge(ABC, Agrements_17, by = "CODGEO_2017", all.x = T)
ABC$DATE_AGREM.x <- ifelse(is.na(ABC$DATE_AGREM.x), ABC$DATE_AGREM, ABC$DATE_AGREM.x)
ABC <- ABC[,c(1:53)]
# On renomme la dernière colonne
colnames(ABC)[53] <- "DATE_AGREM_DP"
# Production de la table synthétique
# Calcul pour 2003
ABC_03 = ABC %>%
select(CODGEO_2003) %>%
filter(!duplicated(CODGEO_2003) & !is.na(CODGEO_2003))
a03 <- nrow(ABC_03)
b03 <- NA
c03 <- NA
# Calcul pour 2004
ABC_04 = ABC %>%
select(CODGEO_2004) %>%
filter(!duplicated(CODGEO_2004) & !is.na(CODGEO_2004))
a04 <- nrow(ABC_04)
b04 <- NA
c04 <- NA
# Calcul pour 2005
ABC_05 = ABC %>%
select(CODGEO_2005) %>%
filter(!duplicated(CODGEO_2005) & !is.na(CODGEO_2005))
a05 <- nrow(ABC_05)
b05 <- NA
c05 <- NA
# Calcul pour 2006
ABC_06 = ABC %>%
select(CODGEO_2006) %>%
filter(!duplicated(CODGEO_2006) & !is.na(CODGEO_2006))
a06 <- nrow(ABC_06)
b06 <- NA
c06 <- NA
# Calcul pour 2007
ABC_07 = ABC %>%
select(CODGEO_2007) %>%
filter(!duplicated(CODGEO_2007) & !is.na(CODGEO_2007))
a07 <- nrow(ABC_07)
b07 <- NA
c07 <- NA
# Calcul pour 2008
ABC_08 = ABC %>%
select(CODGEO_2008) %>%
filter(!duplicated(CODGEO_2008) & !is.na(CODGEO_2008))
a08 <- nrow(ABC_08)
b08 <- NA
c08 <- NA
# Calcul pour 2009
ABC_09 = ABC %>%
select(CODGEO_2009, ELIG_2009) %>%
filter(!duplicated(CODGEO_2009) & !is.na(CODGEO_2009))
a09 <- sum(ABC_09$ELIG_2009 == "Oui")
b09 <- a09
c09 <- NA
# Calcul pour 2010
ABC_10 = ABC %>%
select(CODGEO_2010, ELIG_2010) %>%
filter(!duplicated(CODGEO_2010) & !is.na(CODGEO_2010))
a10 <- sum(ABC_10$ELIG_2010 == "Oui")
b10 <- a10
c10 <- 0
# Calcul pour 2011
ABC_11 = ABC %>%
select(CODGEO_2011, ELIG_2011, DATE_AGREM_SC) %>%
filter(!duplicated(CODGEO_2011) & !is.na(CODGEO_2011))
a11 <- sum(ABC_11$ELIG_2011 == "Oui")
b11 <- a11
c11 <- sum(ABC_11$DATE_AGREM_SC == "2011", na.rm = T)
# Calcul pour 2012
ABC_12 = ABC %>%
select(CODGEO_2012, ELIG_2012, DATE_AGREM_SC) %>%
filter(!duplicated(CODGEO_2012) & !is.na(CODGEO_2012))
a12 <- sum(ABC_12$ELIG_2012 == "Oui")
b12 <- a12
c12 <- c11 + sum(ABC_12$DATE_AGREM_SC == "2012", na.rm = T)
# Calcul pour 2013
ABC_13 = ABC %>%
select(CODGEO_2013, ELIG_2013, DATE_AGREM_DP) %>%
filter(!duplicated(CODGEO_2013) & !is.na(CODGEO_2013))
b13 <- sum(ABC_13$ELIG_2013 == "Oui")
c13 <- sum(ABC_13$DATE_AGREM_DP == "2013", na.rm = T)
a13 = b13 + c13
# Calcul pour 2014 (on passe à dplyr, vraiment plus simple)
ABC_14 = ABC %>%
select(CODGEO_2014, ELIG_2014, DATE_AGREM_DP, ZONE_ABC_2014) %>%
filter(!duplicated(CODGEO_2014) & !is.na(CODGEO_2014))
b14 <- sum(ABC_14$ELIG_2014 == "Oui")
c14 <- sum(ABC_14$DATE_AGREM_DP == "2014", na.rm = T) + sum(ABC_14$DATE_AGREM_DP == "2013" & ABC_14$ZONE_ABC_2014 == "B2", na.rm = T)
a14 = b14 + c14
# Calcul pour 2015
ABC_15 = ABC %>%
select(CODGEO_2015, ELIG_2015, DATE_AGREM_DP, ZONE_ABC_2015) %>%
filter(!duplicated(CODGEO_2015) & !is.na(CODGEO_2015))
b15 <- sum(ABC_15$ELIG_2015 == "Oui")
c15 <- sum(ABC_15$DATE_AGREM_DP == "2015", na.rm = T) + sum(ABC_14$DATE_AGREM_DP == "2014", na.rm = T) + sum(ABC_15$DATE_AGREM_DP == "2013" & ABC_15$ZONE_ABC_2015 == "B2", na.rm = T)
a15 = b15 + c15
# Calcul pour 2016
ABC_16 = ABC %>%
select(CODGEO_2016, ELIG_2016, DATE_AGREM_DP, ZONE_ABC_2016) %>%
filter(!duplicated(CODGEO_2016) & !is.na(CODGEO_2016))
b16 <- sum(ABC_16$ELIG_2016 == "Oui")
c16 <- sum(ABC_16$DATE_AGREM_DP == "2016", na.rm = T) + sum(ABC_16$DATE_AGREM_DP == "2015", na.rm = T)+ sum(ABC_16$DATE_AGREM_DP == "2014", na.rm = T)+ sum(ABC_16$DATE_AGREM_DP == "2013" & ABC_16$ZONE_ABC_2016 == "B2", na.rm = T)
a16 = b16 + c16
# Calcul pour 2017
ABC_17 = ABC %>%
select(CODGEO_2017, ELIG_2017, DATE_AGREM_DP, ZONE_ABC_2017) %>%
filter(!duplicated(CODGEO_2017) & !is.na(CODGEO_2017))
b17 <- sum(ABC_17$ELIG_2017 == "Oui")
c17 <- sum(ABC_17$DATE_AGREM_DP == "2017", na.rm = T)+ sum(ABC_17$DATE_AGREM_DP == "2016", na.rm = T) + sum(ABC_17$DATE_AGREM_DP == "2015", na.rm = T)+ sum(ABC_17$DATE_AGREM_DP == "2014", na.rm = T) + sum(ABC_17$DATE_AGREM_DP == "2013" & ABC_17$ZONE_ABC_2017 == "B2", na.rm = T)
a17 = b17 + c17
# Calcul pour 2018
ABC_18 = ABC %>%
select(CODGEO_2018, ELIG_2018) %>%
filter(!duplicated(CODGEO_2018) & !is.na(CODGEO_2018))
a18 <- sum(ABC_18$ELIG_2018 == "Oui")
b18 <- a18
c18 <- NA
# Calcul pour 2019
ABC_19 = ABC %>%
select(CODGEO_2019, ELIG_2019) %>%
filter(!duplicated(CODGEO_2019) & !is.na(CODGEO_2019))
a19 <- sum(ABC_19$ELIG_2019 == "Oui")
b19 <- a19
c19 <- NA
ABC_19 <- read_excel("Intermediate/ABC/2_step/ABC_2019.xlsx")
ABC_19$ELIG_2019 <- "Oui"
ABC_19$ELIG_2019[ABC_19$ZONE_ABC_2019 == "C" | ABC_19$ZONE_ABC_2019 == "B2"] <- "Non"
a19 <- sum(ABC_19$ELIG_2019 == "Oui")
b19 <- a19
c19 <- NA
Tab2 <- data.frame(Annee = c(2003:2019),
Elig = c(a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19),
Zone = c(b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19),
Agrem = c(c03, c04, c05, c06, c07, c08, c09, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19),
Total = c(t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19))
knitr::kable(Tab2)
On enregistre les deux tables synthétiques dans le dossier “Output/France” :
Tab1 <- t(Tab1)
Tab1 <- as.data.frame(Tab1)
colnames(Tab1) <- Tab1[1,]
Tab1 <- Tab1[-1,]
rownames(Tab1) <- c("A", "dont A bis", "B", "dont B1", "dont B2", "C", "Total")
Tab2 <- t(Tab2)
Tab2 <- as.data.frame(Tab2)
colnames(Tab2) <- c(2003:2019)
Tab2 <- Tab2[-1,]
rownames(Tab2) <- c("Eligibilite", "dont zone", "dont agrément", "Total")
list_of_datasets <- list("Zones" = Tab1, "Eligibilite" = Tab2)
write.xlsx(list_of_datasets, file = "Output/France/ABC_agrege.xlsx", row.names = T)
La reconstitution du zonage 1/2/3 ne présente pas exactement les mêmes difficultés que le zonage A/B/C. Les textes de loi sont d’une part moins bien organisés que ceux du zonage A/B/C, et d’autre part se réfèrent presque tous au classement originel de 1978, qui se réfère à une géographie des communes indisponible. En effet, l’essentiel des textes se limitent à une liste des reclassements par rapport au classement antérieur. En outre, le classement originel n’est disponible en fac-similé : la version numérique proposée en ligne par Legifrance en constituant la version modifiée.
En revanche, le ministère de la Cohésion des territoires met à disposition un classement des communes selon le zonage 1/2/3 qui correspond au découpage communal de 2014. L’essentiel du travail a donc consisté en un rétro-classement des communes à partir de cette référence. Pour les années 2005 à 2019, il s’est agi simplement d’adapter le classement aux fusions et divisions communales. Les zonages de 2003 et 2004 ont été reconstitués à la main à partir des modifications instaurées par les textes de loi.
La limite chronologique de la matrice de passage des communes proposée par l’INSEE a imposé 2003 comme date de début du classement des communes.
Les sources utilisées sont les mêmes que pour le zonage A/B/C, seuls changeant les textes de loi mobilisés. Je les rappelle ici :
Des textes de loi disponibles en ligne sur beta.legifrance.gouv.fr
Du zonage 1/2/3 pour l’année 2014 (l’identification de l’année de référence a nécessité une recherche exposée ci-après) disponible sur le site du ministère de la Cohésion territoriale.
Une base des communes par année compilée par l’INSEE et disponible sur son site, telle que décrite en 2.1.4 de ce document.
La définition du zonage 1/2/3 a été modifié à deux reprises seulement depuis 2003 : en 2004 puis en 2005, par arrêté. Les textes sont disponibles en ligne sur le site Legifrance. Comme pour A/B/C, une version est disponible en version PDF dans le fichier “raw-data/LEGIFRANCE/ZONAGE_123” au format “Annee_mois_jour”.
| Date | Lien |
|---|---|
| 29/11/2004 | Arrêté du 29 novembre 2004 modifiant l’arrêté du 17 mars 1978 |
| 28/11/2005 | Arrêté du 28 novembre 2005 modifiant l’arrêté du 17 mars 1978 |
Le ministère de la Cohésion territoriale met en accès gratuit le classement des communes selon le zonage 1/2/3 (consulté le 1er avril 2020). Au moment de l’élaboration de ce travail, la table disponible correspond aux communes de l’année 2014.
L’année de référence n’étant pas indiquée dans le document lui-même, son identification a fait l’objet d’un travail en soi. La méthode a été celle du tâtonnement : pour une année donnée, la liste des communes mentionnées dans le classement 1/2/3 a été comparée par appariemment sur le code commune INSEE à celle des communes recensées cette année là par l’INSEE. L’année 2014 est celle pour laquelle les deux listes correspondent parfaitement.
Le script ci-dessous illustre le tâtonnement pour les années 2005 et 2014 :
# Chargement des packages
require(readxl) # Pour importer en xls
require(openxlsx) # Pour exporter en format .xlsx
# Ouverture de la base 123 à identifier
DB_123 <- read_excel("raw-data/MCT/ZONAGE_123/Zonage_123.xls")
colnames(DB_123) <- c("CODGEO", "LIBGEO", "ZONE_123")
# Ouverture de la base INSEE servant de référence
INSEE_passage <- read_excel("raw-data/INSEE/INSEE_DATA/Passage_communes_2003_2019.xls")
INSEE_passage <- subset(INSEE_passage, NIVGEO == "COM") # On enlève les arrondissements
INSEE_passage <- INSEE_passage[,2:35] # On enlève la variable qui distinguait les arrondissements
# Comparaison de la base 123 avec les communes INSEE de 2005
## Construction de la base communes de 2005
INSEE_2005 <- INSEE_passage[,c("CODGEO_2005", "LIBGEO_2005")]
INSEE_2005 <- subset(INSEE_2005, !duplicated(INSEE_2005)) # On enlève les doublons
## Appariemment
INSEE_2005$INSEE <- "INSEE" # Création d'un champ qui permette d'identifier les communes issues de la base INSEE ; pour la base 123 on utilise la variable "ZONE_123".
Test <- merge(DB_123, INSEE_2005, by.x = "CODGEO", by.y = "CODGEO_2005", all = T)
## Analyse du résultat
### Identification des communes de la base INSEE qui ne sont pas dans la base 123
table(is.na(Test$ZONE_123)) # 33 communes existent dans la base à tester qui n'existent pas en 2005.
table(is.na(Test$INSEE)) # 29 communes existent en 2005 et n'existent pas dans la base à tester.
# On note que parmi les communes de la DB_123 qui n'existent pas en 2005 se trouvent les communes de Mayotte (départementalisé en 2011) et celle de Verquigneul (dont la fusion a été annulée en 2008)
# Comparaison de la base 123 avec les communes INSEE de 2014
## Construction de la base communes de 2014
INSEE_2014 <- INSEE_passage[,c("CODGEO_2014", "LIBGEO_2014")]
INSEE_2014 <- subset(INSEE_2014, !duplicated(INSEE_2014)) # On enlève les doublons
## Appariemment
INSEE_2014$INSEE <- "INSEE" # Création d'un champ qui permette d'identifier les communes issues de la base INSEE ; pour la base 123 on utilise la variable "ZONE_123".
Test <- merge(DB_123, INSEE_2014, by.x = "CODGEO", by.y = "CODGEO_2014", all = T)
## Analyse du résultat
### Identification des communes de la base INSEE qui ne sont pas dans la base 123
table(is.na(Test$ZONE_123)) # 1 seul NA, qui correspond à une ligne de NA...
table(is.na(Test$INSEE)) # 0 NA
# On considère donc que la DB_123 correspond au millésime 2014.
colnames(DB_123) <- c("CODGEO_2014", "LIBGEO_2014", "ZONE_123_2014")
DB_123$ZONE_123_2014 <- substr(DB_123$ZONE_123_2014, 2,2)
write.xlsx(DB_123, "Intermediate/123/2_step/123_2014.xlsx")
La construction de la base détaillée s’est faite en deux étapes :
Etape 1.Constitution d’une base unifiée répertoriant l’ensemble des communes de chaque année et les associant à leur zone 1/2/3. Cette table est disponible à : “Output/France/123_detail.xlsx”.
Etape 2. constitution de bases exposant des résultats agrégés directement exploitables, disponibles à : “Output/France/123_agrege.xlsx”.
Cette étape s’est elle-même divisée en deux sous étapes :
Etape 1a. Reconstitution du classement 1/2/3 pour les années 2005 à 2019 à partir de la base de 2014. L’enjeu étant l’adaptation du classement aux fusions et divisions communales, ce travail a été mené selon une méthode analogue à celle utilisée en 2.2.3.2.
Etape 1b. Reconstitution des classements des années 2004 puis 2003 à partir de celle disponible pour l’année 2005 et des textes de loi.
Ont d’abord été classées les communes des années 2015 à 2019 selon un procédé proche de celui utilisé en 2.2.3.2 :
Lorsque deux communes fusionnent, la nouvelle commune garde le code INSEE d’une des communes fusionnées. On attribue alors à la nouvelle commune la zone de la commune dont le code INSEE a été conservé.
Lorsque deux communes se divisent, je me réfère aux zones proposées par le simulateur disponible en ligne sur le site service-public.fr. Dans les cas de divisions, une des communes filles garde le code, donc le classement, de la commune mère.
J’indique dans le document .html le script correspond à l’année 2015. Les scripts correspondant aux années 2016 à 2019 sont visibles dans le document .Rmd.
##########
## 2015 ##
##########
# Ouverture de la base 123 de 2014
DB_123_2014 <- read_excel("Intermediate/123/2_step/123_2014.xlsx")
DB_123_2014 <- DB_123_2014[,c(1,3)]
# Ouverture de la base INSEE
INSEE_passage <- read_excel("raw-data/INSEE/INSEE_DATA/Passage_communes_2003_2019.xls")
INSEE_passage <- subset(INSEE_passage, NIVGEO == "COM") # On enlève les arrondissements
INSEE_passage <- INSEE_passage[,2:35] # On enlève la variable qui distinguait les arrondissements
# On produit la liste des communes françaises de 2004 à partir de la table ABC complète
INSEE_2015 <- INSEE_passage[, c("CODGEO_2015", "LIBGEO_2015")]
INSEE_2015 <- subset(INSEE_2015, !duplicated(INSEE_2015$CODGEO_2015))
INSEE_2015 <- subset(INSEE_2015, !is.na(INSEE_2015$CODGEO_2015))
# On fusionne les deux
DB_123_2015 <- merge(DB_123_2014, INSEE_2015, by.x = "CODGEO_2014", by.y = "CODGEO_2015", all.y = T)
# On analyse les erreurs d'appariemment :
table(is.na(DB_123_2015$CODGEO_2014))
table(is.na(DB_123_2015$ZONE_123_2014)) # 1 NA, qui correspond à la commune de Culey (55138).
table(is.na(DB_123_2015$LIBGEO_2015)) # 0 NA.
# D'après le simulateur du site service-public.fr, la commune de Culey est située en zone 3.
# On produit la table 123 2015
colnames(DB_123_2015) <- c("CODGEO_2015", "ZONE_123_2015", "LIBGEO_2015")
DB_123_2015$ZONE_123_2015[is.na(DB_123_2015$ZONE_123_2015)] <- "3"
# On la sauvegarde
write.xlsx(DB_123_2015, "Intermediate/123/2_step/123_2015.xlsx")
Ont d’ensuite été classées les communes des années 2005 à 2013 selon un procédé inverse.
Lorsque deux communes ont fusionné, c’est-à-dire qu’une commune qui existait en n n’existe pas en n-1, on vérifie son classement directement sur la version modifiée du classement 1/2/3 présentée sur le site Legifrance par recherche d’expression. Lorsque la commune n’est pas indiquée dans l’annexe de l’article, c’est-à-dire qu’elle est placée en zone 3, on vérifie le nom de la commune fille et son classement sur la table INSEE. Dans ces situations, la commune fille était toujours également classée en zone 3.
Le cas des divisions communales est éliminé par construction. Dans l’assemblage final, les communes qui n’existent pas en n-i et existent en n seront simplement indentifiée “NA”.
J’indique dans le document .html le script correspond à l’année 2013. Les scripts correspondant aux années 2005 à 2012 sont visibles dans le document .Rmd.
##########
## 2013 ##
##########
DB_123_2014 <- DB_123_2014[,c("CODGEO_2014", "ZONE_123_2014")]
# On produit la liste des communes françaises de 2004 à partir de la table ABC complète
INSEE_2013 <- INSEE_passage[, c("CODGEO_2013", "LIBGEO_2013")]
INSEE_2013 <- subset(INSEE_2013, !duplicated(INSEE_2013$CODGEO_2013))
INSEE_2013 <- subset(INSEE_2013, !is.na(INSEE_2013$CODGEO_2013))
# On fusionne les deux
DB_123_2013 <- merge(DB_123_2014, INSEE_2013, by.x = "CODGEO_2014", by.y = "CODGEO_2013", all.y = T)
# On analyse les erreurs d'appariemment :
table(is.na(DB_123_2013$CODGEO_2014))
table(is.na(DB_123_2013$ZONE_123_2014)) # 1 NA : 1 fusion communale entre 2013 et 2014 : Pautaines-Augeville (52379), qui n'apparaît pas dans le texte de loi Legifrance, ce qui la place par défaut dans la zone 3
table(is.na(DB_123_2013$LIBGEO_2013)) # 0 NA par construction
# On produit la table 123 2013
colnames(DB_123_2013) <- c("CODGEO_2013", "ZONE_123_2013", "LIBGEO_2013")
DB_123_2013$ZONE_123_2013[is.na(DB_123_2013$ZONE_123_2013)] <- "3"
# On la sauvegarde
write.xlsx(DB_123_2013, "Intermediate/123/2_step/123_2013.xlsx")
Pour les années 2004 et 2003, on procède par rétro-classification à partir de la liste des communes reclassées détaillée dans les arrêtés de 2005 et 2004.
L’arrêté de 2005 reclasse des communes de zone 2 en zone 1. La table de 2004 a donc été élaborée en passant les communes listées par l’arrêté de la zone 1 à la zone 2 à partir de la table de 2005. Ces communes se situent toutes dans les départements de la Seine-et-Marne (77), des Yvelines (78), de l’Essonne (91), du Val d’Oise (95).
L’arrêté de 2004 reclasse des communes de zone 3 en zone 2. De même, la table de 2003 a été élaborée en passant les communes listées de la zone 2 à la zone 3 à partir de la table de 2004. Ces communes se situent seulement dans les départements de l’Ain (01) et de Haute-Savoie (74).
Ces reclassements ont été effectués à la main à partir de la table fournie sur le site du ministère de la Cohésion des territoires. Ces tables ainsi produites ont été adaptées au découpage communal des deux années de référence selon les scripts suivants :
##########
## 2004 ##
##########
# Ouverture de la base corrigée à la main des communes de 2004
DB_123_2004 <- read_excel("Intermediate/123/1_step/123_2004.xls")
DB_123_2004 <- DB_123_2004[,c(1, 3)]
colnames(DB_123_2004) <- c("CODGEO_2004", "ZONE_123_2004")
DB_123_2004$ZONE_123_2004 <- substr(DB_123_2004$ZONE_123_2004, 2,2)
# On produit la liste des communes françaises de 2004 à partir de la table ABC complète
INSEE_2004 <- INSEE_passage[, c("CODGEO_2004", "LIBGEO_2004")]
INSEE_2004 <- subset(INSEE_2004, !duplicated(INSEE_2004$CODGEO_2004))
INSEE_2004 <- subset(INSEE_2004, !is.na(INSEE_2004$CODGEO_2004))
DB_123_2004 <- merge(DB_123_2004, INSEE_2004, by = "CODGEO_2004", all.y = T)
table(is.na(DB_123_2004$ZONE_123_2004)) # 32 NA qui correspondent aux communes fusionnées entre 2004 et 2014
# 2013 [1] : 52379 (zone 3)
# 2012 [19] : 05002 (zone 3) ; 05020 (zone 3) ; 05042 (zone 3) ; 05067 (zone 3) ; 05138 (zone 3) ; 49199 (zone 3) ; 49213 (zone 3) ; 49245 (zone 3) ; 49303 (zone 3) ; 49372 (zone 3) ; 49380 (zone 3) ; 69025 (zone 3) ; 69041 (zone 3) ; 69128 (zone 3) ; 69129 (zone 3) ; 69144 (zone 3) ; 79353 (zone 3) ; 79356 (zone 3) ; 88282 (zone 3)
# 2011 [2] : 76095 (zone 2) ; 28042 (zone 3)
# 2010 [2] : 59248 (zone 2) et 59540 (zone 2)
# 2009 [0]
# 2008 [1] : 21551 (zone 3)
# 2007 [4] : 50216 (zone 3) 81107 (zone 3) ; 97123 (zone 3) ; 97127 (zone 3)
# 2006 [4] : 39524 (zone 3) ; 79037 (zone 3) ; 79305 (zone 3) ; 80370 (zone 3)
# 2005 [0]
# On a donc 33 fusions, dont il faut déduire le cas de Bihorel (76095), qui a disparu entre 2012 et 2013 seulement. Le compte est donc bon, on corrige les zones manuellement :
DB_123_2004$ZONE_123_2004[DB_123_2004$CODGEO_2004 == "59248" | DB_123_2004$CODGEO_2004 == "59540"] <- "2"
DB_123_2004$ZONE_123_2004[is.na(DB_123_2004$ZONE_123_2004)] <- "3"
# On la sauvegarde
write.xlsx(DB_123_2004, "Intermediate/123/2_step/123_2004.xlsx")
DB_123_2004 <- DB_123_2004[,c(1:2)]
##########
## 2003 ##
##########
# Ouverture de la base corrigée à la main des communes de 2003
DB_123_2003 <- read_excel("Intermediate/123/1_step/123_2003.xls")
DB_123_2003 <- DB_123_2003[,c(1, 3)]
colnames(DB_123_2003) <- c("CODGEO_2003", "ZONE_123_2003")
DB_123_2003$ZONE_123_2003 <- substr(DB_123_2003$ZONE_123_2003, 2,2)
# On produit la liste des communes françaises de 2003 à partir de la table ABC complète
INSEE_2003 <- INSEE_passage[, c("CODGEO_2003", "LIBGEO_2003")]
INSEE_2003 <- subset(INSEE_2003, !duplicated(INSEE_2003$CODGEO_2003))
INSEE_2003 <- subset(INSEE_2003, !is.na(INSEE_2003$CODGEO_2003))
DB_123_2003 <- merge(DB_123_2003, INSEE_2003, by = "CODGEO_2003", all.y = T)
table(is.na(DB_123_2003$ZONE_123_2003)) # 32 NA qui correspondent aux communes fusionnées entre 2003 et 2014
# 2013 [1] : 52379 (zone 3)
# 2012 [19] : 05002 (zone 3) ; 05020 (zone 3) ; 05042 (zone 3) ; 05067 (zone 3) ; 05138 (zone 3) ; 49199 (zone 3) ; 49213 (zone 3) ; 49245 (zone 3) ; 49303 (zone 3) ; 49372 (zone 3) ; 49380 (zone 3) ; 69025 (zone 3) ; 69041 (zone 3) ; 69128 (zone 3) ; 69129 (zone 3) ; 69144 (zone 3) ; 79353 (zone 3) ; 79356 (zone 3) ; 88282 (zone 3)
# 2011 [2] : 76095 (zone 2) ; 28042 (zone 3)
# 2010 [2] : 59248 (zone 2) et 59540 (zone 2)
# 2009 [0]
# 2008 [1] : 21551 (zone 3)
# 2007 [4] : 50216 (zone 3) 81107 (zone 3) ; 97123 (zone 3) ; 97127 (zone 3)
# 2006 [4] : 39524 (zone 3) ; 79037 (zone 3) ; 79305 (zone 3) ; 80370 (zone 3)
# 2005 [0]
# On a donc 33 fusions, dont il faut déduire le cas de Bihorel (76095), qui a disparu entre 2012 et 2013 seulement. Le compte est donc bon, on corrige les zones manuellement :
DB_123_2003$ZONE_123_2003[DB_123_2003$CODGEO_2003 == "59248" | DB_123_2003$CODGEO_2003 == "59540"] <- "2"
DB_123_2003$ZONE_123_2003[is.na(DB_123_2003$ZONE_123_2003)] <- "3"
# On la sauvegarde
write.xlsx(DB_123_2003, "Intermediate/123/2_step/123_2003.xlsx")
DB_123_2003 <- DB_123_2003[,c(1:2)]
Une fois créées les tables annuelles, on produit une base unifiée à partir de la base INSEE passage
# Jointure des tables annuelles
DB_123 <- merge(INSEE_passage, DB_123_2003, by = "CODGEO_2003", all.x = T)
DB_123 <- merge(DB_123, DB_123_2004, by = "CODGEO_2004", all.x = T)
DB_123 <- merge(DB_123, DB_123_2005, by = "CODGEO_2005", all.x = T)
DB_123 <- merge(DB_123, DB_123_2006, by = "CODGEO_2006", all.x = T)
DB_123 <- merge(DB_123, DB_123_2007, by = "CODGEO_2007", all.x = T)
DB_123 <- merge(DB_123, DB_123_2008, by = "CODGEO_2008", all.x = T)
DB_123 <- merge(DB_123, DB_123_2009, by = "CODGEO_2009", all.x = T)
DB_123 <- merge(DB_123, DB_123_2010, by = "CODGEO_2010", all.x = T)
DB_123 <- merge(DB_123, DB_123_2011, by = "CODGEO_2011", all.x = T)
DB_123 <- merge(DB_123, DB_123_2012, by = "CODGEO_2012", all.x = T)
DB_123 <- merge(DB_123, DB_123_2013, by = "CODGEO_2013", all.x = T)
DB_123 <- merge(DB_123, DB_123_2014, by = "CODGEO_2014", all.x = T)
DB_123 <- merge(DB_123, DB_123_2015, by = "CODGEO_2015", all.x = T)
DB_123 <- merge(DB_123, DB_123_2016, by = "CODGEO_2016", all.x = T)
DB_123 <- merge(DB_123, DB_123_2017, by = "CODGEO_2017", all.x = T)
DB_123 <- merge(DB_123, DB_123_2018, by = "CODGEO_2018", all.x = T)
DB_123 <- merge(DB_123, DB_123_2019, by = "CODGEO_2019", all.x = T)
# Des doublons apparaissent uniquement à cette dernière étape, d'une façon un peu inexplicable. On les enlève :
DB_123 <- subset(DB_123, !duplicated(DB_123))
# Réorganisation de la table unifiée
DB_123 <- DB_123[, c("CODGEO_2019", "LIBGEO_2019", "CODGEO_2018", "LIBGEO_2018","CODGEO_2017", "LIBGEO_2017","CODGEO_2016", "LIBGEO_2016", "CODGEO_2015", "LIBGEO_2015", "CODGEO_2014", "LIBGEO_2014", "CODGEO_2013", "LIBGEO_2013","CODGEO_2012", "LIBGEO_2012","CODGEO_2011", "LIBGEO_2011","CODGEO_2010", "LIBGEO_2010","CODGEO_2009", "LIBGEO_2009","CODGEO_2008", "LIBGEO_2008","CODGEO_2007", "LIBGEO_2007","CODGEO_2006", "LIBGEO_2006","CODGEO_2005", "LIBGEO_2005","CODGEO_2004", "LIBGEO_2004","CODGEO_2003", "LIBGEO_2003", "ZONE_123_2003","ZONE_123_2004", "ZONE_123_2005","ZONE_123_2006", "ZONE_123_2007", "ZONE_123_2008","ZONE_123_2009","ZONE_123_2010", "ZONE_123_2011", "ZONE_123_2012", "ZONE_123_2013","ZONE_123_2014", "ZONE_123_2015", "ZONE_123_2016", "ZONE_123_2017", "ZONE_123_2018","ZONE_123_2019")]
# Exportation de la table unifiée
write.xlsx(DB_123, "Output/France/123_detail.xlsx")
L’agrégation des données se limite à une table de l’évolution des effectifs. Celle-ci est d’un intérêt assez faible après 2005, aucun reclassement n’ayant été opéré depuis cette date.
Concernant les dispositifs d’aide à l’accession, le seul dont l’éligibilité soit conditionnée à la localisation du bien selon le classement 1/2/3 sont les APL accession, qui ne sont plus disponibles qu’en zone 3 depuis 2018. Le calcul étant immédiat à partir du tableau des effectifs par zone, il n’a pas fait l’objet d’un tableau propre. La table synthétique ainsi élaborée est stockée en "Output/France
# Calcul pour 2003
DB_123_03 <- read_excel("Intermediate/123/2_step/123_2003.xlsx")
a03 <- sum(DB_123_03$ZONE_123_2003 == "1")
b03 <- sum(DB_123_03$ZONE_123_2003 == "2")
c03 <- sum(DB_123_03$ZONE_123_2003 == "3")
t03 <- nrow(DB_123_03)
# Calcul pour 2004
DB_123_04 <- read_excel("Intermediate/123/2_step/123_2004.xlsx")
a04 <- sum(DB_123_04$ZONE_123_2004 == "1")
b04 <- sum(DB_123_04$ZONE_123_2004 == "2")
c04 <- sum(DB_123_04$ZONE_123_2004 == "3")
t04 <- nrow(DB_123_04)
# Calcul pour 2005
DB_123_05 <- read_excel("Intermediate/123/2_step/123_2005.xlsx")
a05 <- sum(DB_123_05$ZONE_123_2005 == "1")
b05 <- sum(DB_123_05$ZONE_123_2005 == "2")
c05 <- sum(DB_123_05$ZONE_123_2005 == "3")
t05 <- nrow(DB_123_05)
# Calcul pour 2006
DB_123_06 <- read_excel("Intermediate/123/2_step/123_2006.xlsx")
a06 <- sum(DB_123_06$ZONE_123_2006 == "1")
b06 <- sum(DB_123_06$ZONE_123_2006 == "2")
c06 <- sum(DB_123_06$ZONE_123_2006 == "3")
t06 <- nrow(DB_123_06)
# Calcul pour 2007
DB_123_07 <- read_excel("Intermediate/123/2_step/123_2007.xlsx")
a07 <- sum(DB_123_07$ZONE_123_2007 == "1")
b07 <- sum(DB_123_07$ZONE_123_2007 == "2")
c07 <- sum(DB_123_07$ZONE_123_2007 == "3")
t07 <- nrow(DB_123_07)
# Calcul pour 2008
DB_123_08 <- read_excel("Intermediate/123/2_step/123_2008.xlsx")
a08 <- sum(DB_123_08$ZONE_123_2008 == "1")
b08 <- sum(DB_123_08$ZONE_123_2008 == "2")
c08 <- sum(DB_123_08$ZONE_123_2008 == "3")
t08 <- nrow(DB_123_08)
# Calcul pour 2009
DB_123_09 <- read_excel("Intermediate/123/2_step/123_2009.xlsx")
a09 <- sum(DB_123_09$ZONE_123_2009 == "1")
b09 <- sum(DB_123_09$ZONE_123_2009 == "2")
c09 <- sum(DB_123_09$ZONE_123_2009 == "3")
t09 <- nrow(DB_123_09)
# Calcul pour 2010
DB_123_10 <- read_excel("Intermediate/123/2_step/123_2010.xlsx")
a10 <- sum(DB_123_10$ZONE_123_2010 == "1")
b10 <- sum(DB_123_10$ZONE_123_2010 == "2")
c10 <- sum(DB_123_10$ZONE_123_2010 == "3")
t10 <- nrow(DB_123_10)
# Calcul pour 2011
DB_123_11 <- read_excel("Intermediate/123/2_step/123_2011.xlsx")
a11 <- sum(DB_123_11$ZONE_123_2011 == "1")
b11 <- sum(DB_123_11$ZONE_123_2011 == "2")
c11 <- sum(DB_123_11$ZONE_123_2011 == "3")
t11 <- nrow(DB_123_11)
# Calcul pour 2012
DB_123_12 <- read_excel("Intermediate/123/2_step/123_2012.xlsx")
a12 <- sum(DB_123_12$ZONE_123_2012 == "1")
b12 <- sum(DB_123_12$ZONE_123_2012 == "2")
c12 <- sum(DB_123_12$ZONE_123_2012 == "3")
t12 <- nrow(DB_123_12)
# Calcul pour 2013
DB_123_13 <- read_excel("Intermediate/123/2_step/123_2013.xlsx")
a13 <- sum(DB_123_13$ZONE_123_2013 == "1")
b13 <- sum(DB_123_13$ZONE_123_2013 == "2")
c13 <- sum(DB_123_13$ZONE_123_2013 == "3")
t13 <- nrow(DB_123_13)
# Calcul pour 2014
DB_123_14 <- read_excel("Intermediate/123/2_step/123_2014.xlsx")
a14 <- sum(DB_123_14$ZONE_123_2014 == "1")
b14 <- sum(DB_123_14$ZONE_123_2014 == "2")
c14 <- sum(DB_123_14$ZONE_123_2014 == "3")
t14 <- nrow(DB_123_14)
# Calcul pour 2015
DB_123_15 <- read_excel("Intermediate/123/2_step/123_2015.xlsx")
a15 <- sum(DB_123_15$ZONE_123_2015 == "1")
b15 <- sum(DB_123_15$ZONE_123_2015 == "2")
c15 <- sum(DB_123_15$ZONE_123_2015 == "3")
t15 <- nrow(DB_123_15)
# Calcul pour 2016
DB_123_16 <- read_excel("Intermediate/123/2_step/123_2016.xlsx")
a16 <- sum(DB_123_16$ZONE_123_2016 == "1")
b16 <- sum(DB_123_16$ZONE_123_2016 == "2")
c16 <- sum(DB_123_16$ZONE_123_2016 == "3")
t16 <- nrow(DB_123_16)
# Calcul pour 2017
DB_123_17 <- read_excel("Intermediate/123/2_step/123_2017.xlsx")
a17 <- sum(DB_123_17$ZONE_123_2017 == "1")
b17 <- sum(DB_123_17$ZONE_123_2017 == "2")
c17 <- sum(DB_123_17$ZONE_123_2017 == "3")
t17 <- nrow(DB_123_17)
# Calcul pour 2018
DB_123_18 <- read_excel("Intermediate/123/2_step/123_2018.xlsx")
a18 <- sum(DB_123_18$ZONE_123_2018 == "1")
b18 <- sum(DB_123_18$ZONE_123_2018 == "2")
c18 <- sum(DB_123_18$ZONE_123_2018 == "3")
t18 <- nrow(DB_123_18)
# Calcul pour 2019
DB_123_19 <- read_excel("Intermediate/123/2_step/123_2019.xlsx")
a19 <- sum(DB_123_19$ZONE_123_2019 == "1")
b19 <- sum(DB_123_19$ZONE_123_2019 == "2")
c19 <- sum(DB_123_19$ZONE_123_2019 == "3")
t19 <- nrow(DB_123_19)
Tab3 <- data.frame(Année = c(2003:2019),
Zone_1 = c(a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19),
Zone_2 = c(b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19),
Zone_3 = c(c03, c04, c05, c06, c07, c08, c09, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19),
Total = c(t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19))
colnames(Tab3) <- c("Année", "Zone 1", "Zone 2", "Zone 3", "Total")
knitr::kable(Tab3)
| Année | Zone 1 | Zone 2 | Zone 3 | Total |
|---|---|---|---|---|
| 2003 | 436 | 3053 | 33189 | 36678 |
| 2004 | 436 | 3129 | 33117 | 36682 |
| 2005 | 764 | 2801 | 33119 | 36684 |
| 2006 | 764 | 2801 | 33120 | 36685 |
| 2007 | 764 | 2801 | 33118 | 36683 |
| 2008 | 764 | 2802 | 33115 | 36681 |
| 2009 | 764 | 2802 | 33116 | 36682 |
| 2010 | 764 | 2802 | 33116 | 36682 |
| 2011 | 764 | 2800 | 33116 | 36680 |
| 2012 | 764 | 2816 | 33120 | 36700 |
| 2013 | 764 | 2816 | 33101 | 36681 |
| 2014 | 764 | 2817 | 33100 | 36681 |
| 2015 | 764 | 2816 | 33078 | 36658 |
| 2016 | 764 | 2811 | 32310 | 35885 |
| 2017 | 763 | 2804 | 31849 | 35416 |
| 2018 | 762 | 2803 | 31792 | 35357 |
| 2019 | 759 | 2797 | 31414 | 34970 |
Tab3 <- t(Tab3)
Tab3 <- as.data.frame(Tab3)
colnames(Tab3) <- c(2003:2019)
Tab3 <- Tab3[-1,]
rownames(Tab3) <- c("Année", "Zone 1", "Zone 2", "Zone 3")
Cette partie vise à produire une cartographie historique la plus complète possible des dispositifs d’aide à l’acquisition immobilière sur les FUA de Paris, Lyon et Avignon. Ces dispositifs se distinguent les uns des autres de plusieurs façons : leur maillage de référence (communal pour l’essentiel), leur caractère local ou national, leur dimension exclusive ou non (certaines zones sont-elles inéligibles ?).
A noter : le dispositif Malraux, bien que représentant une aide fiscale très conséquente, n’a pas été étudié ici, pour des raisons de manque de temps et de rareté des données (les conditions d’éligibilité sont très nombreuses et les divers zonages associés souvent difficiles à appréhender).
Cette catégorie regroupe pour l’essentiel : les aides fiscales à l’investissement locatif (qui correspondent à l’actuel dispositif Pinel), les prêts à taux zéro (PTZ), la TVA réduite, l’APL accession et l’aide fiscale à la rénovation pour les propriétaires bailleurs (mise en place avec le dispositif Denormandie de 2019). Parmi ces dispositifs, en 2020, seule l’éligibilité au PTZ dans le neuf n’est pas dépendante de la localisation du logement.
A l’exception de la TVA réduite, les conditions géographiqes d’accès à ces dispositifs sont définies à l’échelle de la commune.
L’évolution des conditions d’éligibilité aux aides fiscales à l’investissement locatif, au PTZ et à l’APL accession sont détaillées en 1.1 et 1.2.
Le dispositif Denormandie, instauré en 2019, repose sur un modèle proche du dispositif Pinel. Il offre une réduction d’impôt sur le revenu aux bailleurs propriétaires réalisant des travaux de rénovation (pouvant aller jusqu’à 25% du montant de l’opération). Il est accessible dans les 222 communes cibles du plan Action coeur de ville (dont font par exemple partie Avignon et Vienne).
La TVA réduite pour la construction de logement en accession est instaurée en 2006. De 2006 à 2014, elle concerne les secteurs du programme national de rénovation urbaine (PNRU). A partir de 2015, elle s’applique également aux quartiers prioritaires des politiques de la ville (QPV). Du fait de son caractère infracommunal et de la relative complexité de ses critères d’éligibilité, elle dispose d’une section autonome.
La cartographie de l’éligibilité aux aides fiscales à l’investissement locatif, au PTZ et à l’APL accession s’appuie sur les tables réalisées en parties 2 et 3 de ce document.
La liste des 222 communes éligibles au dispositif Denormandie est indiquée sur le site du ministère de la Cohésion des territoires. Pour chacune est renseignée le code INSEE.
La cartographie des QPV est librement accessible sur le site data.gouv.fr. En revanche, le périmètre des secteurs du PNRU est plus difficile à obtenir. Pour l’Ile-de-France, les périmètre des PNRU sont recensés sur le site data.iledefrance.fr. En revanche, pour le reste des territoires de l’étude, de tels sources n’existent pas. La seule liste exhaustive semble être celle proposée par le site sig.ville.gouv.fr, alimenté par l’ANCT, qui présente comme inconvénient majeur de proposer comme seul support cartographique un dessin du périmètre du PNRU au format .pdf. La cartographie des secteurs ANRU a donc été menée par digitalisation avec le logiciel QGIS à partir des périmètres proposés par l’ANCT. - L’ensemble des fichiers PDF qui ont été utilisés sont disponibles dans le dossier “raw-data_MCT_PNRU”
Le tableau ci-dessous vaut pour l’année 2019 :
| Dispositif | Zonage de référence | Secteurs éligibles | Sources |
|---|---|---|---|
| Aide fiscale à l’investissement locatif (Pinel) | A/B/C | A bis, A, B1 | WIsDHoM : Table ABC_detail |
| PTZ dans le neuf | A/B/C | Tous | WIsDHoM : Table ABC_detail |
| PTZ dans l’ancien | A/B/C | B2, C | WIsDHoM : Table ABC_detail |
| APL accession | 1/2/3 | 3 | WIsDHoM : Table 123_detail |
| Aide fiscale à la rénovation pour les propriétaires bailleurs (Denormandie) | Action coeur de ville | Communes de l’Action coeur de ville | ANCT |
| TVA réduite | PNRU / QPV | QPV + tampon de 300m | Région IDF (PNRU de l’IDF), ANCT (PNRU hors IDF et QPV) |
A ces zonages nationaux, s’ajoutent certains dispositifs locaux mis en place par une commune ou une métropole. Ces aides ou contraintes locales sont difficiles à lister de façon exhaustive faute de recensements. Certaines aides sont présentées sur les sites des ADIL des territoires concernées, mais ce n’est pas systématique.
Les aides des Fonds de solidarité logement (FSL) de la CAF ne sont pas étudiées dans la suite. Il s’agit d’un dispositif national géré à l’échelon départemental adressé autant aux locataires qu’aux propriétaires.
Après une présentation du cas particulier des OFS, on présente les différents dispositifs locaux FUA par FUA
Un organisme de foncier solidaire (OFS) est organisme à but non lucratif agréé par le préfet dont la fonction est de gérer du foncier. Un OFS propose des baux réels solidaires (BRS), instaurés par la loi ALUR de 2014 et inspirés par le modèle du Pass Foncier (2007-2011) et du Community Land Trust. Il permet à des ménages de devenir propriétaires d’un logement à un prix inférieur à ce qui se pratique sur le marché, en contrepartie de quoi l’OFS reste propriétaire du foncier (le ménage loue le foncier à l’OFS en s’acquittant d’une redevance foncière). Les propriétaires peuvent louer ou revendre le logement sous certaines conditions. Dans le second cas, il retrouve sa mise initiale à laquelle s’ajoute une plus-value (limitée par une clause anti-spéculative). Les ménages sont sélectionnés par l’OFS.
Des OFS existent ou sont en cours d’élaboration sur les trois territoires étudiés :
A Paris, plusieurs OFS cohabitent.
A Lyon, la Métropole a annoncé au deuxième semestre 2019 la création d’un OFS. Il s’ajouterait à l’Organisme Régional Solidaire (ORSOL), dont une présentation est disponible ici (consulté le 8 avril 2020)
A Avignon, la Ville d’Avignon travaille également sur la création d’un OFS, dont une présentation réalisée par le CEREMA est disponible ici (consulté le 8 avril 2020)
Dans la FUA de Paris, les dispositifs locaux sont relativement nombreux. La liste établie ci-dessous n’est sans doute pas exhaustive ; les informations indiquées sont à compléter. Concernant les dispositifs mis en place à l’échelle départementale d’abord :
Seine et Marne (77) [499 communes]. Le prêt de la Caisse départementale d’aide au logement (CADAL) de Seine et Marne est un prêt de 10 000 euros par foyer à 1% accordé pour l’acquisition d’une résidence principale ; les modalités exactes sont présentées ici (consulté le 8 avril 2020).
Yonne (89) [9 communes] accorde un prêt CODAL pour l’acquisition d’une résidence principale.
Hauts de Seine (92) [36 communes]. Le conseil général a proposé, de 2009 à 2016, le Prêt logement Hauts de Seine (PLHDS), un prêt à taux zéro destiné aux primo-accédants acquérant une résidence principale (soit logement neuf soit logement social) dont le montant dépendait du type de logement acquis et de la taille du ménage (15 000 euros pour l’acquisition d’un logement social par une personne seule ; 55 200 euros pour l’acquisition d’un logement neuf par un ménage de 5 personnes). Les modalités plus précises sont encore disponibles ici (consulté le 8 avril 2020).
A l’échelle intercommunale, les aides recensées sont rares et ne couvrent que des territoires très restreints. Cependant, les récents regroupements intercommunaux pourraient donner lieu à l’émergence de nouvelles aides locales dans les prochaines années :
Grand Paris Sud : ex CA Seine-Essonne : PTZ du Grand Paris Sud Seine-Essonne-Sénart, mis en place en 2012, est destiné aux primo-accédant devenant propriétaires de leur résidence principale (neuve ou ancienne) sur le territoire de l’ex CA Seine Essonne (5 communes regroupant un peu plus de 66 000 habitants), sous conditions de ressources. Il s’agit d’un prêt de 15 000 euros remboursable sur 12 ans. Plus d’informations disponibles ici (consulté le 8 avril 2020).
La CA de Seine-Eure [1 commune : Courcelles-sur-Seine], propose une prime à l’acquisition.
A l’échelle communale :
Paris : les aides propres à Paris sont essentiellement des prêts aidés et des aides à l’amélioration ou l’entretien du logement (les secondes n’étant pas détaillées ici)
Nanterre : l’accession encadrée consiste à mettre en vente chaque année des logements neufs (entre 20 et 80 d’après le site de la Ville de Nanterre) à des prix inférieurs à ceux du marché.
Bagneux : met également en place une accession enadrée à la propriété.
Depuis le milieu des années 2010, des chartes promoteurs sont mises en place par des communes d’Ile-de-France. Le seul recensement disponible de ces chartes pour les communes d’IDF de plus de 10 000 habitants a été établi par le cabinet INOVEFA en 2018 ; le compte-rendu de cette étude est disponible ici ainsi que dans le dossier “raw-data/INOVEFA”. Des chartes, incitatives ou contraignantes seraient alors en vigueur dans une cinquantaine de communes d’Ile-de-France. La table .xlsx listant les communes concernées, directement tirée du compte-rendu cité ci-dessus, est également indiquée dans le dossier “raw-data”. Ces chartes sont très hétéroclites et demandent d’être étudiées au cas par cas pour en cerner les effets.
Les principaux dispositifs recensés dans la FUA de Paris sont donc :
| Nom | Type | Territoire | Source |
|---|---|---|---|
| Prêt CADAL | Prêt à l’acquisition d’une résidence principale | Conseil départemental de Seine et Marne | CADAL 77 |
| Prêt PLHDS | Prêt aux primo-accédants devenant propriétaires de leur résidence principale | Conseil général des Hauts de Seine | ADIL 92 |
| Prêt logement Paris et prêt parcours résidentiel | Prêt à l’acquisition d’une résidence principale | Ville de Paris | Ville de Paris |
| Chartes promoteurs | Contraintes ou incitations aux promoteurs | Communes | INOVEFA |
Dans la FUA de Lyon, l’essentiel des dispositifs locaux en application en 2020 sont organisés par la Métropole de Lyon (ex Grand Lyon) :
Le dispositif Louer solidaire offre aux propriétaires bailleurs, en contrepartie de loyers plafonnés (selon la zone géographique), de faire gérer leurs biens par des associations agréées par la Métropole de Lyon et de disposer de déductions fiscales sur les revenus locatifs pouvant aller jusqu’à 85%. La date d’instauration de ce dispositif n’est pas claire.
Le Plan 3A, pour “Accession A prix Abordable”, offre une prime de 2000 à 6000 euros à l’acquéreur d’un logement portant le label 3A. Celui-ci est attribué aux opérations effectuées en dessous d’un seuil de prix défini en fonction de la commune et, pour Lyon et Villeurbanne, du quartier selon les modalités précisées ici (consulté le 3 avril 2020). Le montant de la prime est fonction de la taille du ménage et de la commune où se situe le bien ; la carte de ces secteurs, produite par le Grand Lyon, est disponible ici (consulté le 3 avril 2020). Le Plan 3A a été instauré en 2013 et ponctuellement interrompu en 2018.
Les Secteurs mixité sociale, instaurés en 2008, définissent des quotas de logements aidés pour les programmes neufs.
La régulation du marché des meublés de tourisme, visiblement menée par la Ville de Lyon depuis 2017, se limite à la commune de Lyon. Les contraintes sont plus strictes pour les biens situés dans l’hypercentre de Lyon (consulté le 3 avril 2020).
En dehors de la Métropole de Lyon, en plus d’aides à la rénovation des logements (assez nombreuses) :
Ain (01) : le conseil départemental de l’Ain propose un prêt CODAL (consulté le 3 avril 2020) de 15 000 euros à 1% aux primo-accédants devenant propriétaires de leur résidence principale (construction ou acquisition, avec ou sans travaux). Les personnes ayant réalisé un investissement locatif sont inéligibles. L’éligibilité au CODAL est également conditionnée : 1/ Dans le neuf : à l’obtention d’un PTZ et d’un PAS ; 2/ Dans l’ancien d’un PAS seulement.
Isère (38) : les ADIL ne recensent aucune aide appliquée aux communes de la FUA de Lyon.
Loire (42) : les aides recensées par l’ADIL concernent seulement les travaux (adaptation du logement à la perte d’autonomie, aide contre la précarité énergétique, etc.) et sont organisées par les CC.
Rhône (69) : pas d’aide locale hors Métropole de Lyon.
| Nom | Type | Territoire | Adossé à un zonage | Eligibilité conditionnée à la localisation | Source |
|---|---|---|---|---|---|
| Louer solidaire | Gestion locative et aides fiscales aux propriétaires bailleurs | Métropole de Lyon | Oui | Non | Louer solidaire |
| Plan 3A | Prime aux acquéreurs | Métropole de Lyon | Oui | Non | Métropole de Lyon |
| Secteurs mixité sociale | Quotas de logements aidés dans les programmes neufs | Métropole de Lyon | Oui | Oui | Data.gouv.fr |
| Régulation des meublés de tourisme | Contraintes à la location et taxe de séjour | Ville de Lyon | Oui | Non | Ville de Lyon |
| Prêt CODAL | Prêt aux primo-accédants devenant propriétaires de leur résidence principale | Conseil départemental de l’Ain | Non | Non | CODAL de l’Ain |
| Communes | Secteur concerné |
|---|---|
| Barbentane | Secteur OPAH |
| Cabanne | Secteur OPAH |
| Chateaurenard | Secteur OPAH |
| Eyragues | Secteur OPAH |
| Maillane | Secteur OPAH |
| Noves | Totalité |
| Rognonas | Secteur OPAH |
| Verquieres | Secteur OPAH |
Gard (30) : les seuls aides recensées par d’ADIL sont spécifiques à Nîmes Métropole.
Vaucluse (84) : l’ADIL ne recense aucun dispositif d’aide local.
Depuis 2006, certains secteurs bénéficient d’une TVA réduite à 5,5% pour la construction de logements en accession. Les périmètres de ces secteurs ont été modifiés en 2014, 2015 et 2017. L’ensemble des conditions géographiques d’éligibilité (assez complexes) sont détaillées sur le site de l’ANRU et synthétisés dans une note rapide de l’IAU d’Ile-de-France (consultés le 4 mai 2020).
Le secteurs TVA réduite englobent :
De janvier 2006 à décembre 2013 : les secteurs du programme national de rénovation urbaine (PNRU) prolongés d’une bande de 500m.
De janvier 2014 à décembre 2014 : les secteurs du PNRU prolongés d’une bande de 300m.
De janvier 2015 à décembre 2016 : s’y ajoutent les quartiers prioritaires des politiques de la ville (QPV) prolongés de 300m également.
Depuis janvier 2017 : dans le cas où le QPV est porteur d’un NPNRU, l’éligibilité s’étire sur 500m autour du secteur.
L’éligibilité ne dure qu’un certain temps :
Dans le cas des secteurs du PNRU, elle se termine deux ans après le 31 décembre de la fin du financement du PNRU (ce délai supplémentaire de deux ans a été ajouté par la loi de finance pour 2016).
Dans le cas des QPV seuls, elle se termine au 31 décembre de l’année de fin du contrat de ville, c’est-à-dire 2020 dans l’essentiel des cas (les dates particulières de fin de chaque contrat n’étant mentionnée nulle part, la date du 31 décembre 2020 a été appliquée à l’ensemble des quartiers).
Dans le cas des QPV adossés à un NPNRU, elle se termine le 31 décembre 2024.
Une base géoréférencée des QPV est disponible sur data.gouv.fr (stockée dans “raw-data”) Les NPNRU sont indiqués sur le site sig.ville.gouv.fr (consultés le 5 mai 2020) : à partir de la carte interactive disponible, les QPV adossés à un NPNRU ont été identifiés et indiqués “à la main”. La base géoréférencée des QPV enrichie des indications relative à l’existence d’un NPNRU est stockée dans “Intermediate/TVA/QPV_NPNRU”.
Ces bases ont ensuite été retraitées et stockées, pour chaque FUA, dans “Dispositifs/Output” selon le script suivant :
require(sf)
require(stringr)
# Ouverture des shapefiles
QPV <- st_read("raw-data/MCT/QPV/QP_METROPOLE_LB93.shp") # La base géoréférencée
fuaPa <- st_read("raw-data/geom/geom_Paris_FUA.gpkg", layer = "studyFu")
fuaLy <- st_read("raw-data/geom/geom_Lyon_FUA.gpkg", layer = "studyFu")
fuaAv <- st_read("raw-data/geom/geom_Avignon_FUA.gpkg", layer = "studyFu")
# Intersection entre QPV et les shapefiles respectifs
QPV_Pa <- st_intersection(st_buffer(QPV,0), fuaPa)
QPV_Ly <- st_intersection(st_buffer(QPV,0), fuaLy)
QPV_Av <- st_intersection(st_buffer(QPV,0), fuaAv)
# On enregistre
st_write(obj = QPV_Pa, dsn = "Output/Paris/Paris_TVA.gpkg", layer = "QPV_Fu",
delete_layer = TRUE, quiet = TRUE)
st_write(obj = QPV_Ly, dsn = "Output/Lyon/Lyon_TVA.gpkg", layer = "QPV_Fu",
delete_layer = TRUE, quiet = TRUE)
st_write(obj = QPV_Av, dsn = "Output/Avignon/Avignon_TVA.gpkg", layer = "QPV_Fu",
delete_layer = TRUE, quiet = TRUE)
Les secteurs PNRU sont plus difficiles à obtenir. Leur liste a été établie en compilant trois sources :
L’Institut Paris Région, qui met à disposition une base géoréférencée des PNRU d’Ile-de-France disponible ici.
La liste des PNRU mise à disposition par l’ANCT - disponible ici - à partir de laquelle les secteurs PNRU ont été digitalisés avec l’aide d’Adji Diatou Diallo (stagiaire à Avignon Université). La DDT du Rhône met également un disposition, sur data.gouv.fr, une base géoréférencée des secteurs PNRU de son département. Néanmoins, les secteurs en question ne recoupant qu’imparfaitement ceux indiqués sur le site de l’ANCT, on a privilégié la seconde, pour l’essentiel en raison du caractère brouillon de la base disponible (les conventions n’étant par exemple pas référencées par leur numéro ANRU).
Ont ensuite été rajoutées manuellement les date de fin des opérations à partir de la liste fournie (en format PDF) sur le site de l’ANRU (consulté le 4 mai 2020). Le champ “date_fin” indique l’année de la fin du programme du PNRU (et non la fin de l’éligibilité à la TVA réduite). Les tables ainsi modifiées ont été stockées dans le dossier “Dispositifs/Intermediate/TVA/PNRU”.
On produit ensuite un fichier unifié de l’ensemble des périmètres ANRU de la période pour la France entière, stocké dans “Dispositifs/Output/France”, au moyen du script suivant :
# Ouverture et recodage des bases
# Ouverture du fichier hors IDF
France <- st_read("Intermediate/TVA/PNRU_hors-IDF/PNRU.shp")
France <- France[,c(5,6,4,3,1,7,8,2,9,10)]
France$dep <- as.factor(France$dep)
France$pru <- as.character(France$pru)
France$insee1 <- as.character(France$insee1)
France$insee2 <- as.character(France$insee2)
France$date_sign < as.numeric(as.character(France$date_sign))
France$date_fin < as.numeric(as.character(France$date_fin))
# Ouverture du fichier IDF
IDF <- st_read("Intermediate/TVA/PNRU_IDF/perimetres-des-projets-de-renovation-urbaine-pru-dile-de-france.shp")
IDF$insee1 <- as.character(IDF$insee1)
IDF$insee2 <- as.character(IDF$insee2)
IDF$pru <- as.character(IDF$pru)
IDF$date_sign <- substr(IDF$date_sign, 0,4)
IDF$date_fin < as.numeric(as.character(IDF$date_fin))
IDF$date_sign <- as.numeric(as.character(IDF$date_sign))
IDF$pru <- substr(IDF$pru, 1, nchar(IDF$pru)-1) # Correction d'un bug (dédoublement du dernier signe)
IDF$insee1 <- substr(IDF$insee1, 1, nchar(IDF$insee1)-1) # Correction d'un bug (dédoublement du dernier signe)
IDF$insee2 <- substr(IDF$insee2, 1, nchar(IDF$insee2)-1) # Correction d'un bug (dédoublement du dernier signe)
IDF$pru[nchar(IDF$pru) == 1] <- paste0("00", IDF$pru[nchar(IDF$pru) == 1])
IDF$pru[nchar(IDF$pru) == 2] <- paste0("0", IDF$pru[nchar(IDF$pru) == 2])
IDF$insee2[IDF$insee2 == 0] <- NA
IDF <- st_transform(IDF, "+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m") # Passage en Lambert 93
# Fusion des deux tables
PNRU <- rbind(IDF, France)
# Exports
# Export de la table pour Avignon
Avignon <- subset(PNRU, PNRU$dep == "84") # Cette base n'est constituée que d'une seule entité, mais on peut difficilement faire autrement
st_write(obj = Avignon, dsn = "Output/Avignon/Avignon_TVA.gpkg", layer = "PNRU_Fu",
delete_layer = TRUE, quiet = TRUE)
remove(Avignon)
PNRU <- subset(PNRU, !PNRU$dep == "84")
# Export de la table pour Lyon
Lyon <- subset(PNRU, PNRU$dep == "38" | PNRU$dep == "41" | PNRU$dep == "69")
st_write(obj = Lyon, dsn = "Output/Lyon/Lyon_TVA.gpkg", layer = "PNRU_Fu",
delete_layer = TRUE, quiet = TRUE)
remove(Lyon)
PNRU <- subset(PNRU, PNRU$dep != "38" & PNRU$dep != "41" & PNRU$dep != "69")
# Export de la table pour Paris
st_write(obj = PNRU, dsn = "Output/Paris/Paris_TVA.gpkg", layer = "PNRU_Fu",
delete_layer = TRUE, quiet = TRUE)
La cartographie des différents dispositifs s’appuie sur les géométries figurant en Output du dossier geom. Celles-ci correspondant pour l’instant (4 avril 2020) au découpage de 2019, elles ont uniquement donné lieu à des cartographies statiques de l’état de la situation en 2019 pour les FUA de Paris et Lyon. Les 45 communes de la FUA d’Avignon n’ayant pas été affectées par des fusions ni divisions sur la période 2003-2019, l’évolution des zonages et éligibilités des communes aux dispositifs a d’ores-et-déjà pu être cartographiée.
# Packages utilisés
require(readxl)
require(openxlsx)
## Le chargement a nécessité le package : openxlsx
require(cartography)
## Le chargement a nécessité le package : cartography
## This project is in maintenance mode.
## Core functionalities of `cartography` can be found in `mapsf`.
## https://riatelab.github.io/mapsf/
require(sf)
## Le chargement a nécessité le package : sf
## Linking to GEOS 3.9.0, GDAL 3.2.1, PROJ 7.2.1
require(dplyr)
## Le chargement a nécessité le package : dplyr
##
## Attachement du package : 'dplyr'
## Les objets suivants sont masqués depuis 'package:stats':
##
## filter, lag
## Les objets suivants sont masqués depuis 'package:base':
##
## intersect, setdiff, setequal, union
require(readr)
require(rgdal)
## Le chargement a nécessité le package : rgdal
## Le chargement a nécessité le package : sp
## rgdal: version: 1.5-23, (SVN revision 1121)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 3.2.1, released 2020/12/29
## Path to GDAL shared files: C:/Users/Ronan/Documents/R/win-library/4.1/rgdal/gdal
## GDAL binary built with GEOS: TRUE
## Loaded PROJ runtime: Rel. 7.2.1, January 1st, 2021, [PJ_VERSION: 721]
## Path to PROJ shared files: C:/Users/Ronan/Documents/R/win-library/4.1/rgdal/proj
## PROJ CDN enabled: FALSE
## Linking to sp version:1.4-5
## To mute warnings of possible GDAL/OSR exportToProj4() degradation,
## use options("rgdal_show_exportToProj4_warnings"="none") before loading rgdal.
## Overwritten PROJ_LIB was C:/Users/Ronan/Documents/R/win-library/4.1/rgdal/proj
On crée une base synthétique des données à l’échelon communal sur Paris. Cette base renseigne, pour chaque année, le code INSEE de la commune, son classement dans les zonages A/B/C et 1/2/3. S’y ajoute son appartenance ou non au programme de l’Action coeur de ville ou sa participation à une opération de revitalisation de territoire, la date de signature de l’agrément ministériel et / ou préfectoral le cas échéant.
Cette table (fuaLy_DC pour “dispositifs communaux”) est enregistrée à “Output/Paris/Dispositifs_Paris.xlsx”.
# 1. Chargement des tables
## Ouverture des fonds de cartes des communes de la FUA de fuaPa
fuaPa_COM <- st_read("raw-data/geom/geom_Paris_FUA.gpkg", layer = "comFu")
fuaPa_COM <- subset(fuaPa_COM, fuaPa_COM$study == "FUA")
fuaPa_COM <- fuaPa_COM[,c(1,2, 13)]
## Ouverture de la base ABC (France)
ABC <- read_excel("Output/France/ABC_detail.xlsx")
## Ouverture de la base 123 (France)
DB_123 <- read_excel("Output/France/123_detail.xlsx")
## Ouverture de la base Action coeur de ville
ACV <- read_delim("raw-data/MCT/ACV/Action_coeur_ville.csv", ";", escape_double = FALSE, trim_ws = TRUE)
ACV$ACV <- "Oui"
ACV <- ACV[,c(1,4)]
## Ouverture de la base sur les opérations de revitalisation des territoires (ORT)
ORT <- read_excel("raw-data/MCT/ORT/ORT.xlsx")
ORT$ORT <- "Oui"
ORT <- ORT[,c(4,5)]
## Ouverture de la base sur les agréments ministériels (Scellier)
# Agrements_Scellier <- read_excel("raw-data/LEGIFRANCE/Agrements_Scellier.xlsx")
# Agrements_Scellier <- Agrements_Scellier[,c(1,5)]
# colnames(Agrements_Scellier)[2] <- "DATE_AGREM_M"
## Ouverture de la base sur les agréments préfectoraux (Duflot / Pinel)
Agrements <- read_excel("raw-data/MCT/ZONAGE_ABC/Agrements.xls")
Agrements <- Agrements[,c(4,6)]
colnames(Agrements) <- c("CODGEO", "DATE_AGREM_P")
Agrements$DATE_AGREM_P <- substr(Agrements$DATE_AGREM_P, 1, 4)
Agrements$DATE_AGREM_P[is.na(Agrements$DATE_AGREM_P)] <- "2015"
# 2. Fusion des tables
fuaPa_DC <- merge(fuaPa_COM, ABC, by.x = "INSEE_COM", by.y = "CODGEO_2019", all.x = T)
Interm <- merge(fuaPa_COM, DB_123, by.x = "INSEE_COM", by.y = "CODGEO_2019", all.x = T)
Interm <- Interm[,c(1,36:52)]
fuaPa_DC <- (cbind(fuaPa_DC, Interm))
remove(Interm)
fuaPa_DC <- fuaPa_DC[,c(1,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36:52,54:71)]
names(fuaPa_DC)[1] <- "CODGEO_2019"
names(fuaPa_DC)[2] <- "LIBGEO_2019"
fuaPa_DC <- merge(fuaPa_DC, ACV, by.x = "CODGEO_2019", by.y = "INSEE_COM", all.x = T)
fuaPa_DC$ACV[is.na(fuaPa_DC$ACV)] <- "Non"
fuaPa_DC <- merge(fuaPa_DC, ORT, by.x = "CODGEO_2019", by.y = "Code commune", all.x = T)
fuaPa_DC$ORT[is.na(fuaPa_DC$ORT)] <- "Non"
fuaPa_DC <- merge(fuaPa_DC, Agrements, by.x = "CODGEO_2019", by.y = "CODGEO", all.x = T)
fuaPa_DC <- merge(fuaPa_DC, Agrements_Scellier, by.x = "CODGEO_2019", by.y = "CODGEO", all.x = T)
# 2b Entrée manuelle des informations sur les arrondissements
fuaPa_DC$ZONE_ABC_2003[is.na(fuaPa_DC$ZONE_ABC_2003)] <- "A"
fuaPa_DC$ZONE_ABC_2004[is.na(fuaPa_DC$ZONE_ABC_2004)] <- "A"
fuaPa_DC$ZONE_ABC_2005[is.na(fuaPa_DC$ZONE_ABC_2005)] <- "A"
fuaPa_DC$ZONE_ABC_2006[is.na(fuaPa_DC$ZONE_ABC_2006)] <- "A"
fuaPa_DC$ZONE_ABC_2007[is.na(fuaPa_DC$ZONE_ABC_2007)] <- "A"
fuaPa_DC$ZONE_ABC_2008[is.na(fuaPa_DC$ZONE_ABC_2008)] <- "A"
fuaPa_DC$ZONE_ABC_2009[is.na(fuaPa_DC$ZONE_ABC_2009)] <- "A"
fuaPa_DC$ZONE_ABC_2010[is.na(fuaPa_DC$ZONE_ABC_2010)] <- "A bis"
fuaPa_DC$ZONE_ABC_2011[is.na(fuaPa_DC$ZONE_ABC_2011)] <- "A bis"
fuaPa_DC$ZONE_ABC_2012[is.na(fuaPa_DC$ZONE_ABC_2012)] <- "A bis"
fuaPa_DC$ZONE_ABC_2013[is.na(fuaPa_DC$ZONE_ABC_2013)] <- "A bis"
fuaPa_DC$ZONE_ABC_2014[is.na(fuaPa_DC$ZONE_ABC_2014)] <- "A bis"
fuaPa_DC$ZONE_ABC_2015[is.na(fuaPa_DC$ZONE_ABC_2015)] <- "A bis"
fuaPa_DC$ZONE_ABC_2016[is.na(fuaPa_DC$ZONE_ABC_2016)] <- "A bis"
fuaPa_DC$ZONE_ABC_2017[is.na(fuaPa_DC$ZONE_ABC_2017)] <- "A bis"
fuaPa_DC$ZONE_ABC_2018[is.na(fuaPa_DC$ZONE_ABC_2018)] <- "A bis"
fuaPa_DC$ZONE_ABC_2019[is.na(fuaPa_DC$ZONE_ABC_2019)] <- "A bis"
fuaPa_DC$ZONE_123_2003[is.na(fuaPa_DC$ZONE_123_2003)] <- "1"
fuaPa_DC$ZONE_123_2004[is.na(fuaPa_DC$ZONE_123_2004)] <- "1"
fuaPa_DC$ZONE_123_2005[is.na(fuaPa_DC$ZONE_123_2005)] <- "1"
fuaPa_DC$ZONE_123_2006[is.na(fuaPa_DC$ZONE_123_2006)] <- "1"
fuaPa_DC$ZONE_123_2007[is.na(fuaPa_DC$ZONE_123_2007)] <- "1"
fuaPa_DC$ZONE_123_2008[is.na(fuaPa_DC$ZONE_123_2008)] <- "1"
fuaPa_DC$ZONE_123_2009[is.na(fuaPa_DC$ZONE_123_2009)] <- "1"
fuaPa_DC$ZONE_123_2010[is.na(fuaPa_DC$ZONE_123_2010)] <- "1"
fuaPa_DC$ZONE_123_2011[is.na(fuaPa_DC$ZONE_123_2011)] <- "1"
fuaPa_DC$ZONE_123_2012[is.na(fuaPa_DC$ZONE_123_2012)] <- "1"
fuaPa_DC$ZONE_123_2013[is.na(fuaPa_DC$ZONE_123_2013)] <- "1"
fuaPa_DC$ZONE_123_2014[is.na(fuaPa_DC$ZONE_123_2014)] <- "1"
fuaPa_DC$ZONE_123_2015[is.na(fuaPa_DC$ZONE_123_2015)] <- "1"
fuaPa_DC$ZONE_123_2016[is.na(fuaPa_DC$ZONE_123_2016)] <- "1"
fuaPa_DC$ZONE_123_2017[is.na(fuaPa_DC$ZONE_123_2017)] <- "1"
fuaPa_DC$ZONE_123_2018[is.na(fuaPa_DC$ZONE_123_2018)] <- "1"
fuaPa_DC$ZONE_123_2019[is.na(fuaPa_DC$ZONE_123_2019)] <- "1"
fuaPa_DC$CODGEO_2019 <- as.character(fuaPa_DC$CODGEO_2019)
fuaPa_DC$CODGEO_2003[is.na(fuaPa_DC$CODGEO_2003)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2003)]
fuaPa_DC$CODGEO_2004[is.na(fuaPa_DC$CODGEO_2004)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2004)]
fuaPa_DC$CODGEO_2005[is.na(fuaPa_DC$CODGEO_2005)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2005)]
fuaPa_DC$CODGEO_2006[is.na(fuaPa_DC$CODGEO_2006)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2006)]
fuaPa_DC$CODGEO_2007[is.na(fuaPa_DC$CODGEO_2007)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2007)]
fuaPa_DC$CODGEO_2008[is.na(fuaPa_DC$CODGEO_2008)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2008)]
fuaPa_DC$CODGEO_2009[is.na(fuaPa_DC$CODGEO_2009)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2009)]
fuaPa_DC$CODGEO_2010[is.na(fuaPa_DC$CODGEO_2010)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2010)]
fuaPa_DC$CODGEO_2011[is.na(fuaPa_DC$CODGEO_2011)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2011)]
fuaPa_DC$CODGEO_2012[is.na(fuaPa_DC$CODGEO_2012)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2012)]
fuaPa_DC$CODGEO_2013[is.na(fuaPa_DC$CODGEO_2013)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2013)]
fuaPa_DC$CODGEO_2014[is.na(fuaPa_DC$CODGEO_2014)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2014)]
fuaPa_DC$CODGEO_2015[is.na(fuaPa_DC$CODGEO_2015)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2015)]
fuaPa_DC$CODGEO_2016[is.na(fuaPa_DC$CODGEO_2016)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2016)]
fuaPa_DC$CODGEO_2017[is.na(fuaPa_DC$CODGEO_2017)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2017)]
fuaPa_DC$CODGEO_2018[is.na(fuaPa_DC$CODGEO_2018)] <- fuaPa_DC$CODGEO_2019[is.na(fuaPa_DC$CODGEO_2018)]
# 3. Chargement des données supplémentaires : population au dernier recensement (2016) et revenu médian
# Note: il serait également possible de reconstituer ces données par ré-agrégation des carreaux INSEE, mais cette méthode supposerait des inférences qui en limiteraient la précision
## Population 2016 (fournie par l'INSEE selon la géographie au 1er janvier 2019 ; ce qui n'est pas tout à fait le cas : plusieurs communes qui n'ont fusionné qu'en 2019 n'y apparaissent pas. On fait donc la fusion avec le découpage au 31 décembre 2019)
### Pour les communes
Pop <- read_xls("raw-data/INSEE/INSEE_DATA/BTX_TD_POP1A_2016.xls", col_names = F, sheet = "COM")
Pop <- Pop[c(11:34964),c(1,3:22)]
colnames(Pop) <- Pop[c(1),]
Pop <- Pop[c(2:34954),]
Pop2 <- data.frame(sapply(Pop[,c(2:21)], function(x) as.numeric(x)))
Pop <- cbind(Pop, Pop2)
remove(Pop2)
Pop <- Pop[,c(1,22:41)]
Pop$POPULATION <- rowSums(Pop[2:21], na.rm = T)
Pop <- Pop[,c(1,22)]
### Ajout des arrondissements
Pop_Arr <- read_xls("raw-data/INSEE/INSEE_DATA/BTX_TD_POP1A_2016.xls", col_names = F, sheet = "ARM")
Pop_Arr <- Pop_Arr[c(11:56),c(1,3:22)]
colnames(Pop_Arr) <- Pop_Arr[c(1),]
Pop_Arr <- Pop_Arr[c(2:46),]
Pop2_Arr <- data.frame(sapply(Pop_Arr[,c(2:21)], function(x) as.numeric(x)))
Pop_Arr <- cbind(Pop_Arr, Pop2_Arr)
remove(Pop2_Arr)
Pop_Arr <- Pop_Arr[,c(1,22:41)]
Pop_Arr$POPULATION <- rowSums(Pop_Arr[2:21], na.rm = T)
Pop_Arr <- Pop_Arr[,c(1,22)]
### Fusion des tables
Pop <- rbind(Pop, Pop_Arr)
fuaPa_DC <- merge(fuaPa_DC, Pop, by.x = "CODGEO_2019", by.y = "CODGEO", all.x = T)
remove(Pop_Arr)
remove(Pop)
## Revenus médians 2017 (sur la géographie au 1er janvier 2018)
# Note : il s'agit plus exactement du revenu médian par unité de consommation
### Ouverture et traitement de la table
Rev <- read_xlsx("raw-data/INSEE/INSEE_DATA/FILO2017_DEC_COM.xlsx", col_names = F, sheet = "ENSEMBLE")
Rev <- Rev[c(6:31751),c(1,8)]
colnames(Rev) <- Rev[c(1),]
Rev <- Rev[c(2:31746),]
names(Rev)[2] <- "REV_MEDIAN"
Rev$REV_MEDIAN <- as.numeric(Rev$REV_MEDIAN)
### Jointure
fuaPa_DC <- merge(fuaPa_DC, Rev, by.x = "CODGEO_2018", by.y = "CODGEO", all.x = T) # Les NA restant correspondent aux communes de trop petite taille
remove(Rev)
# 4. Enregistrement de la table brute
fuaPa_DC <- as.data.frame(fuaPa_DC)
fuaPa_DC <- fuaPa_DC[,c(1:58)]
# Du fait d'un dysfonctionnement du package xlsx, on passe par des voies un peu détournées pour enregistrer deux feuilles un même document
Final <- createWorkbook()
addWorksheet(Final, "Brut")
addWorksheet(Final, "Def")
writeData(Final, sheet = "Brut", x = fuaPa_DC)
# 5. Construction de la table définitive (1 seule ligne par commune de 2019 + prise en compte des fusions)
## Base de départ
fuaPa_Def <- as.data.frame(fuaPa_COM)
fuaPa_Def <- fuaPa_Def[,c(1,2)]
## Import de la matrice de passage
modif <- as.data.frame(read_xlsx("../geom/input/table_passage_geo2003_geo2020.xlsx",
col_types = "text", sheet = "Table de passage",
skip = 5))
## Réalisation et jointure des bases par années successives pour ABC
### 2003
DB_03 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2003",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_03, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_03)
### 2004
DB_04 <- comix(x = fuaPa_DC, xid = "CODGEO_2004", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2004",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_04, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_04)
### 2005
DB_05 <- comix(x = fuaPa_DC, xid = "CODGEO_2005", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2005",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_05, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_05)
### 2006
DB_06 <- comix(x = fuaPa_DC, xid = "CODGEO_2006", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2006",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_06, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_06)
### 2007
DB_07 <- comix(x = fuaPa_DC, xid = "CODGEO_2007", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2007",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_07, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_07)
### 2008
DB_08 <- comix(x = fuaPa_DC, xid = "CODGEO_2008", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2008",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_08, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_08)
### 2009
DB_09 <- comix(x = fuaPa_DC, xid = "CODGEO_2009", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2009",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_09, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_09)
### 2010
DB_10 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2010",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_10, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_10)
### 2011
DB_11 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2011",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_11, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_11)
### 2012
DB_12 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2012",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_12, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_12)
### 2013
DB_13 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2013",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_13, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_13)
### 2014
DB_14 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2014",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_14, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_14)
### 2015
DB_15 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2015",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_15, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_15)
### 2016
DB_16 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2016",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_16, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_16)
### 2017
DB_17 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2017",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_17, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_17)
### 2018
DB_18 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_ABC_2018",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_18, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_18)
### 2019
fuaPa_Def <- merge(fuaPa_Def, subset(fuaPa_DC[,c("CODGEO_2019", "ZONE_ABC_2019")], !duplicated(fuaPa_DC$CODGEO_2019)), by.x = "INSEE_COM", by.y = "CODGEO_2019", all.x = T, all.y = F)
### Recodage
fuaPa_Def$ZONE_ABC_2003[fuaPa_Def$ZONE_ABC_2003 == "C-B"] <- "B-C"
fuaPa_Def$ZONE_ABC_2004[fuaPa_Def$ZONE_ABC_2004 == "C-B"] <- "B-C"
fuaPa_Def$ZONE_ABC_2005[fuaPa_Def$ZONE_ABC_2005 == "C-B"] <- "B-C"
fuaPa_Def$ZONE_ABC_2006[fuaPa_Def$ZONE_ABC_2006 == "C-B2"] <- "B2-C"
fuaPa_Def$ZONE_ABC_2007[fuaPa_Def$ZONE_ABC_2007 == "C-B2"] <- "B2-C"
fuaPa_Def$ZONE_ABC_2008[fuaPa_Def$ZONE_ABC_2008 == "C-B2"] <- "B2-C"
fuaPa_Def$ZONE_ABC_2009[fuaPa_Def$ZONE_ABC_2009 == "C-B2"] <- "B2-C"
fuaPa_Def$ZONE_ABC_2010[fuaPa_Def$ZONE_ABC_2010 == "C-B2"] <- "B2-C"
fuaPa_Def$ZONE_ABC_2011[fuaPa_Def$ZONE_ABC_2011 == "C-B2"] <- "B2-C"
fuaPa_Def$ZONE_ABC_2012[fuaPa_Def$ZONE_ABC_2012 == "C-B2"] <- "B2-C"
fuaPa_Def$ZONE_ABC_2013[fuaPa_Def$ZONE_ABC_2013 == "C-B2"] <- "B2-C"
fuaPa_Def$ZONE_ABC_2014[fuaPa_Def$ZONE_ABC_2014 == "C-B2"] <- "B2-C"
fuaPa_Def$ZONE_ABC_2014[fuaPa_Def$ZONE_ABC_2014 == "B2-A"] <- "A-B2"
fuaPa_Def$ZONE_ABC_2015[fuaPa_Def$ZONE_ABC_2015 == "C-B2"] <- "B2-C"
fuaPa_Def$ZONE_ABC_2015[fuaPa_Def$ZONE_ABC_2015 == "B2-A"] <- "A-B2"
## Réalisation et jointure des bases par années successives pour 123
### 2003
DB_03 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2003",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_03, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_03)
### 2004
DB_04 <- comix(x = fuaPa_DC, xid = "CODGEO_2004", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2004",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_04, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_04)
### 2005
DB_05 <- comix(x = fuaPa_DC, xid = "CODGEO_2005", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2005",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_05, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_05)
### 2006
DB_06 <- comix(x = fuaPa_DC, xid = "CODGEO_2006", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2006",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_06, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_06)
### 2007
DB_07 <- comix(x = fuaPa_DC, xid = "CODGEO_2007", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2007",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_07, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_07)
### 2008
DB_08 <- comix(x = fuaPa_DC, xid = "CODGEO_2008", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2008",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_08, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_08)
### 2009
DB_09 <- comix(x = fuaPa_DC, xid = "CODGEO_2009", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2009",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_09, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_09)
### 2010
DB_10 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2010",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_10, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_10)
### 2011
DB_11 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2011",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_11, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_11)
### 2012
DB_12 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2012",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_12, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_12)
### 2013
DB_13 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2013",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_13, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_13)
### 2014
DB_14 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2014",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_14, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_14)
### 2015
DB_15 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2015",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_15, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_15)
### 2016
DB_16 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2016",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_16, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_16)
### 2017
DB_17 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2017",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_17, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_17)
### 2018
DB_18 <- comix(x = fuaPa_DC, xid = "CODGEO_2003", app = modif,
app.init = "CODGEO_INI", app.target = "CODGEO_2020",
var = "ZONE_123_2018",
var.type = "text")
fuaPa_Def <- merge(fuaPa_Def, DB_18, by.x = "INSEE_COM", by.y = "CODGEO_2020")
remove(DB_18)
### 2019
fuaPa_Def <- merge(fuaPa_Def, subset(fuaPa_DC[,c("CODGEO_2019", "ZONE_123_2019")], !duplicated(fuaPa_DC$CODGEO_2019)), by.x = "INSEE_COM", by.y = "CODGEO_2019", all.x = T, all.y = F)
### Recodage
fuaPa_Def$ZONE_123_2005[fuaPa_Def$ZONE_123_2005 == "2-1"] <- "1-2"
fuaPa_Def$ZONE_123_2006[fuaPa_Def$ZONE_123_2006 == "2-1"] <- "1-2"
fuaPa_Def$ZONE_123_2007[fuaPa_Def$ZONE_123_2007 == "2-1"] <- "1-2"
fuaPa_Def$ZONE_123_2008[fuaPa_Def$ZONE_123_2008 == "2-1"] <- "1-2"
fuaPa_Def$ZONE_123_2009[fuaPa_Def$ZONE_123_2009 == "2-1"] <- "1-2"
fuaPa_Def$ZONE_123_2010[fuaPa_Def$ZONE_123_2010 == "2-1"] <- "1-2"
fuaPa_Def$ZONE_123_2011[fuaPa_Def$ZONE_123_2011 == "2-1"] <- "1-2"
fuaPa_Def$ZONE_123_2012[fuaPa_Def$ZONE_123_2012 == "2-1"] <- "1-2"
fuaPa_Def$ZONE_123_2013[fuaPa_Def$ZONE_123_2013 == "2-1"] <- "1-2"
fuaPa_Def$ZONE_123_2014[fuaPa_Def$ZONE_123_2014 == "2-1"] <- "1-2"
## Jointure pour l'ACV et les agréments
fuaPa_Def <- merge(fuaPa_Def, subset(fuaPa_DC[,c("CODGEO_2019", "ACV", "ORT", "DATE_AGREM_M", "DATE_AGREM_P", "POPULATION")], !duplicated(fuaPa_DC$CODGEO_2019)), by.x = "INSEE_COM", by.y = "CODGEO_2019", all.x = T, all.y = F)
## Export de la table
writeData(Final, sheet = "Def", x = fuaPa_Def)
# Export the file
saveWorkbook(Final, "Output/Paris/Dispositifs_Paris.xlsx")
Rappel : on utilise ici la fonction ‘comix’ élaborée par Ronan Ysebaert,que l’on indique ici :
comix <- function(x, xid, app, app.init, app.target, var, var.type, w = NULL, na.rm = FALSE) {
# Supprimer les géométries s'il y en a
if (methods::is(x, "sf")){
x <- st_set_geometry(x, NULL)
}
# Import table d'appartenance des fusions territoriales
app <- app
# Jointure table d'entrée - table des fusions territoriales
x <- merge(x, app[,c(app.init, app.target)], by.x = xid, by.y = app.init, all.x = TRUE)
# Unités non concernées par modifications
tmp <- aggregate(x[,app.target], by = list(app.target = x[,app.target]), FUN = length)
tmp <- tmp[tmp$x <= 1,]
selecUnit <- tmp$app.target
intact <- x[x[,app.target] %in% selecUnit, ]
intact <- intact[, c(app.target, var)]
# Unités concernées par une modification
modif <- x[!x[,app.target]%in% selecUnit, ]
modif <- modif[, c(app.target, var, w)]
# Gestion des types de variables déclarées
tmp <- data.frame(var, var.type, row.names = var)
txt <- row.names(tmp[tmp$var.type == "text",])
stock <- row.names(tmp[tmp$var.type == "stock",])
ratio <- row.names(tmp[tmp$var.type == "ratio",])
# Si variables de type caractère > concaténation des modalités
if(length(txt > 0)){
modif.t <- modif[,c(app.target, txt)]
modif.t <- aggregate(modif.t[, -1],
by = list(app.target = modif.t[,app.target]),
FUN = function(x) {paste0(unique(x), collapse = "-")})
names(modif.t) <- c(app.target, txt)
}
# Si variables de type stock > somme des valeurs
if(length(stock > 0)){
modif.s <- modif[,c(app.target, stock)]
modif.s <- aggregate(modif.s[, -1],
by = list(app.target = modif.s[,app.target]),
FUN = sum, na.rm = na.rm)
names(modif.s) <- c(app.target, stock)
}
# Si variables de type ratio > moyenne simple ou pondérée
## Si pas de variable de pondération
if(length(ratio > 0)){
if(is.null(w)){
modif.r <- modif[,c(app.target, ratio)]
modif.r <- aggregate(modif.r[, -1],
by = list(CODGEO_2020 = modif.r$CODGEO_2020),
FUN = mean, na.rm = na.rm)
}
## Si pondération...
# Commentaire : Avec dplyr(!), pas très sexy mais fonctionne. A essayé 36 méthodes
# non concluantes (cf sous la fonction)
else{
modif.r <- modif[,c(app.target, ratio, w)]
names(modif.r)[which(names(modif.r) == w)] <- "weight"
names(modif.r)[which(names(modif.r) == app.target)] <- "app.target"
names(modif.r)[which(names(modif.r) %in% ratio)] <- paste0("ratio",names(modif.r[ratio]))
modif.r <- modif.r %>%
group_by_at(vars(app.target)) %>%
summarise_at(vars(starts_with('ratio')), list(~weighted.mean(., weight, na.rm = na.rm)))
modif.r <- as.data.frame(modif.r)
}
names(modif.r) <- c(app.target, ratio)
}
# Union des 3 types de variables - 8 cas de figure
# Commentaire : pas trouvé la solution du type if(exists("x")), cbind(x)
if(exists("modif.t") == FALSE & exists("modif.s") == FALSE & exists("modif.r") == FALSE ){
stop("Define at least one var combined to one var.type", call. = FALSE)
}
if(exists("modif.t") == TRUE & exists("modif.s") == TRUE & exists("modif.r") == TRUE ){
modif <- cbind(modif.t, modif.s, modif.r)
}
if(exists("modif.t") == FALSE & exists("modif.s") == TRUE & exists("modif.r") == TRUE ){
modif <- cbind(modif.s, modif.r)
}
if(exists("modif.t") == TRUE & exists("modif.s") == FALSE & exists("modif.r") == TRUE){
modif <- cbind(modif.t, modif.r)
}
if(exists("modif.t") == TRUE & exists("modif.s") == TRUE & exists("modif.r") == FALSE){
modif <- cbind(modif.t, modif.s)
}
if(exists("modif.t") == TRUE & exists("modif.s") == FALSE & exists("modif.r") == FALSE){
modif <- modif.t
}
if(exists("modif.t") == FALSE & exists("modif.s") == TRUE & exists("modif.r") == FALSE){
modif <- modif.s
}
if(exists("modif.t") == FALSE & exists("modif.s") == FALSE & exists("modif.r") == TRUE){
modif <- modif.r
}
# Liaison avec les unités territoriales inchangées
x <- rbind(intact, modif[,names(intact)])
return(x)
}
A titre de démonstration, on réalise ici cinq cartes enregistrées au format .png dans le dossier “fig/Paris” :
Le zonage A/B/C sur la FUA de Paris (“ABC.png”)
Le zonage 1/2/3 sur la FUA (“123.png”)
L’éligibilité aux dispositifs nationaux communaux (Pinel, PTZ, APL, Denormandie) (“DNC.png”)
L’éligibilité aux dispositifs locaux communaux (CADAL, PLP et PPR de Paris, chartes promoteurs) (“DLC.pgn”)
L’éligibilité aux dispositifs infracommunaux (TVA réduite, quotas de logements aidés) (“DI.png”)
Le script suivant est adapté à la situation propre à 2019. Il peut néanmoins servir de base à une réécriture pour d’autres années.
# 1. Préparation
# Ouverture des bases
## Ouverture des fonds de cartes des communes de la FUA de Paris
fuaPa_COM <- st_read("raw-data/geom/geom_Paris_FUA.gpkg", layer = "comFu")
fuaPa_COM <- subset(fuaPa_COM, fuaPa_COM$study == "FUA")
fuaPa_COM <- fuaPa_COM[,c(1,2, 13)]
## Ouverture des couches départements et métropoles
fuaPa_DEP <- st_read("raw-data/geom/geom_Paris_FUA.gpkg", layer = "depFu")
fuaPa_MET <- st_read("raw-data/geom/geom_Paris_FUA.gpkg", layer = "metroFu")
fuaPa_STUDY <- st_read("raw-data/geom/output/geom_Paris_FUA.gpkg", layer = "studyFu")
# Ouverture de la table sur les dispositifs nationaux à l'échelon communal
fuaPa_DC <- read_excel("Output/Paris/Dispositifs_Paris.xlsx", sheet = "Def")
fuaPa_DC <- fuaPa_DC[,c("INSEE_COM", "ZONE_ABC_2019", "ZONE_123_2019", "ACV", "ORT")]
## Ouverture de la table des communes ayant signé une charte promoteur
CP <- read_excel("raw-data/INOVEFA/Chartes_promoteurs.xlsx")
CP$Charte_prom <- "Oui"
CP <- CP[,c(1,4)]
## Ouverture de la couche sur les QPV
QPV_Pa <- st_read("Output/Paris/Paris_TVA.gpkg", layer = "QPV_Fu", quiet = T)
PNRU_Pa <- st_read("Output/Paris/Paris_TVA.gpkg", layer = "PNRU_Fu", quiet = T)
# Jointure des tables sur les dispositifs communaux nationaux
fuaPa_COM <- merge(fuaPa_COM, fuaPa_DC, by = "INSEE_COM", all.x = T)
fuaPa_COM <- subset(fuaPa_COM, !duplicated(fuaPa_COM$INSEE_COM))
## Création de la variable éligibilité aux différents dispositifs nationaux
fuaPa_COM$ELIG_Pinel <- "Oui"
fuaPa_COM$ELIG_Pinel[fuaPa_COM$ZONE_ABC_2019 == "C" | fuaPa_COM$ZONE_ABC_2019 == "B2"] <- "Non"
fuaPa_COM$ELIG_PTZ_Ancien <- "Non"
fuaPa_COM$ELIG_PTZ_Ancien[fuaPa_COM$ZONE_ABC_2019 == "C" | fuaPa_COM$ZONE_ABC_2019 == "B2"] <- "Oui"
fuaPa_COM$ELIG_APL <- "Non"
fuaPa_COM$ELIG_APL[fuaPa_COM$ZONE_123_2019 == "3"] <- "Oui"
## Construction de la variable "ELIG_N", qui synthétise l'éligibilité aux dispositifs nationaux
fuaPa_COM$ELIG_N[fuaPa_COM$ELIG_Pinel == "Oui" & fuaPa_COM$ELIG_APL == "Oui"] <- "Pinel + APLA"
fuaPa_COM$ELIG_N[fuaPa_COM$ELIG_Pinel == "Oui" & fuaPa_COM$ELIG_APL == "Non"] <- "Pinel seul"
fuaPa_COM$ELIG_N[fuaPa_COM$ELIG_Pinel == "Non" & fuaPa_COM$ELIG_APL == "Oui"] <- "PTZ ancien + APLA"
fuaPa_COM$ELIG_N[fuaPa_COM$ELIG_Pinel == "Non" & fuaPa_COM$ELIG_APL == "Non"] <- "PTZ ancien seul"
## Fusion des arrondissements parisiens
Paris <- subset(fuaPa_COM, substr(fuaPa_COM$NOM_COM, 0,5) == "Paris")
Paris <- aggregate(Paris, by = list(Paris$ZONE_ABC_2019), FUN = head, 1)
Paris$NOM_COM <- "Paris"
Paris$INSEE_COM <- "75056"
Paris <- Paris[,c(2:11)]
fuaPa_COM <- subset(fuaPa_COM, substr(fuaPa_COM$NOM_COM, 0,5) != "Paris")
fuaPa_COM <- rbind(fuaPa_COM, Paris)
## Fusion de la table sur les chartes promoteurs et variable portant sur la signature ces chartes
fuaPa_COM <- merge(fuaPa_COM, CP, by.x = "INSEE_COM", by.y = "CODGEO", all.x = T)
fuaPa_COM$Charte_prom[is.na(fuaPa_COM$Charte_prom)] <- "Non"
# Construction de la variable "ELIG_L"
fuaPa_COM$DEP <- substr(fuaPa_COM$INSEE_COM,0,2)
fuaPa_COM$ELIG_L[fuaPa_COM$NOM_COM == "Paris"] <- "Prêt logement Paris\n+ Prêt parcours résidentiel\n+ Charte promoteurs"
fuaPa_COM$ELIG_L[fuaPa_COM$DEP == "77"] <- "Prêt CADAL"
fuaPa_COM$ELIG_L[fuaPa_COM$DEP == "77" & fuaPa_COM$Charte_prom == "Oui"] <- "Prêt CADAL\n+Charte promoteur"
fuaPa_COM$ELIG_L[fuaPa_COM$DEP != "77" & fuaPa_COM$Charte_prom == "Oui" & fuaPa_COM$NOM_COM != "Paris"] <- "Charte promoteur"
# 2. Cartographie
sizes <- getFigDim(x = fuaPa_DEP, width = 4000, mar = c(0,0,1.2,0), res = 400)
# Carte 1 : zonage A/B/C
png(file = "fig/Paris/2019/ABC.png",width = sizes[1]*1.4, height = sizes[2], res = 400)
plot(st_geometry(fuaPa_DEP), col = "white", border = NA)
plot(st_geometry(fuaPa_STUDY), col = "lightgrey", border = NA, add = TRUE)
typoLayer(x = fuaPa_COM, var = "ZONE_ABC_2019",
col = c("#993404", "#d95f0e", "#fe9929", "#fed98e", "#ffffd4"),
border = NA,
legend.pos = "topright",
legend.values.order = c("A bis", "A", "B1", "B2", "C"),
legend.title.txt = NA, add = TRUE)
plot(st_geometry(fuaPa_COM), col = NA, lwd = 0.4, border = "grey", add = TRUE)
plot(st_geometry(fuaPa_DEP), col = NA, lwd = 1, border = "gray63", add = TRUE)
plot(st_geometry(fuaPa_MET), col = NA, lwd = 1, border = "black", add = TRUE)
layoutLayer(title = "Zonage A/B/C 2019 - Paris",
sources = "INSEE, Legifrance",
author = "ANR WhISDoM - 2020",
scale = 50,
frame = FALSE,
theme = "red.pal")
dev.off()
# Carte 2 : zonage 1/2/3
png(file = "fig/Paris/2019/123.png",width = sizes[1]*1.4, height = sizes[2], res = 400)
plot(st_geometry(fuaPa_DEP), col = "white", border = NA)
plot(st_geometry(fuaPa_STUDY), col = "lightgrey", border = NA, add = TRUE)
typoLayer(x = fuaPa_COM, var = "ZONE_123_2019",
col = c("#4eb3d3", "#a8ddb5", "#e0f3db"),
border = NA,
legend.pos = "topright",
legend.values.order = c("1", "2", "3"),
legend.title.txt = NA, add = TRUE)
plot(st_geometry(fuaPa_COM), col = NA, lwd = 0.4, border = "grey", add = TRUE)
plot(st_geometry(fuaPa_DEP), col = NA, lwd = 1, border = "gray63", add = TRUE)
plot(st_geometry(fuaPa_MET), col = NA, lwd = 1, border = "black", add = TRUE)
layoutLayer(title = "Zonage 1/2/3 2019 - Paris",
sources = "INSEE, Legifrance",
author = "ANR WhISDoM - 2020",
scale = 20,
frame = FALSE,
theme = "red.pal")
dev.off()
# Carte 3 : éligibilités croisées aux dispositifs Pinel, PTZ et APL
png(file = "fig/Paris/2019/DNC.png",width = sizes[1]*1.4, height = sizes[2], res = 400)
plot(st_geometry(fuaPa_DEP), col = "white", border = NA)
plot(st_geometry(fuaPa_STUDY), col = "lightgrey", border = NA, add = TRUE)
typoLayer(x = fuaPa_COM, var = "ELIG_N",
border = NA,
col = carto.pal("pastel.pal", 8) [c(4,6,5,7)],
legend.pos = "topright",
legend.values.order = c("PTZ ancien seul","PTZ ancien + APLA","Pinel seul","Pinel + APLA"), legend.values.cex = 0.6,
legend.title.txt = NA, add = TRUE)
hatchedLayer(fuaPa_COM[fuaPa_COM$ACV == "Oui" | fuaPa_COM$ORT == "Oui",],
pattern= "left2right",
density = 10,
col = "black",
add = T)
legendHatched(
"right",
title.txt = NA,
categ = "Denormandie (ACV et ORT)",
patterns = "left2right")
plot(st_geometry(fuaPa_COM), col = NA, lwd = 0.4, border = "grey", add = TRUE)
plot(st_geometry(fuaPa_DEP), col = NA, lwd = 1, border = "gray37", add = TRUE)
plot(st_geometry(fuaPa_MET), col = NA, lwd = 1, border = "black", add = TRUE)
layoutLayer(title = "Eligibilité des communes aux dispositifs nationaux d'aide à l'acquisition immobilière 2019 - Paris",
sources = "INSEE, Legifrance",
author = "ANR WhISDoM - 2020",
scale = 20,
frame = FALSE,
theme = "red.pal")
dev.off()
# Carte 4 : éligibilité aux dispositifs locaux communaux
png(file = "fig/Paris/2019/DLC.png",width = sizes[1]*1.4, height = sizes[2], res = 400)
plot(st_geometry(fuaPa_DEP), col = "white", border = NA)
plot(st_geometry(fuaPa_STUDY), col = "lightgrey", border = NA, add = TRUE)
typoLayer(x = fuaPa_COM, var = "ELIG_L",
border = NA,
col = carto.pal("pastel.pal", 8)[c(2,3,4,6)],
legend.pos = "topright",
legend.values.order = c("Prêt logement Paris\n+ Prêt parcours résidentiel\n+ Charte promoteurs", "Charte promoteur", "Prêt CADAL", "Prêt CADAL\n+Charte promoteur"), legend.nodata = "Pas de dispositif\nlocal identifié",
legend.values.cex = 0.6,
legend.title.txt = NA, add = TRUE)
plot(st_geometry(fuaPa_COM), col = NA, lwd = 0.4, border = "grey82", add = TRUE)
plot(st_geometry(fuaPa_DEP), col = NA, lwd = 1, border = "gray63", add = TRUE)
plot(st_geometry(fuaPa_MET), col = NA, lwd = 1, border = "black", add = TRUE)
layoutLayer(title = "Eligibilité des communes aux dispositifs locaux d'aide à l'acquisition immobilière 2019 - Paris",
sources = "INSEE, Legifrance",
author = "ANR WhISDoM - 2020",
scale = 20,
frame = FALSE,
theme = "red.pal")
dev.off()
# Carte 5 : dispositifs infra-communaux
png(file = "fig/Paris/2019/DI.png",width = sizes[1]*1.4, height = sizes[2], res = 400)
plot(st_geometry(fuaPa_DEP), col = "white", border = NA)
plot(st_geometry(fuaPa_STUDY), col = "gray92", border = NA, add = TRUE)
plot(st_geometry(fuaPa_COM), col = NA, lwd = 0.4, border = "grey82", add = TRUE)
plot(st_geometry(st_buffer(PNRU_Pa[2019 %in% PNRU_Pa$date_sign:PNRU_Pa$date_fin+2], 300)), col = "#74c476", border = NA, add = TRUE)
plot(st_geometry(st_buffer(QPV_Pa, 300)), col = "#74a9cf", border = NA, add = TRUE)
plot(st_geometry(st_buffer(QPV_Pa[QPV_Pa$NPNRU == "OUI",], 500)), col = "#74a9cf", border = NA, add = TRUE)
plot(st_geometry(fuaPa_DEP), col = NA, lwd = 1, border = "grey", add = TRUE)
plot(st_geometry(fuaPa_MET), col = NA, lwd = 1, border = "black", add = TRUE)
legendTypo(pos = "topright",
title.txt = NA,
categ = c("Secteurs du PNRU", "Quartiers prioritaires\ndes politiques de la ville"),
col = c("#74c476", "#74a9cf"),
nodata = F, frame = FALSE, symbol = "box")
layoutLayer(title = "Secteurs de TVA réduite 2019 - Paris",
sources = "INSEE, Legifrance",
author = "ANR WhISDoM - 2020",
scale = 20,
frame = FALSE,
theme = "red.pal")
dev.off()