Trois sources principales de données sont mobilisées :

L’ensemble de cette production cartographique a été prduite avec le logiciel R : depuis l’import et la préparation des données, la construction des indicateurs, les réalisations cartographiques, jusqu’à la construction du site Web, dans une démarche de reproductibilité.

Données immobilières


Fichiers sources utilisés

Les analyses reposent sur une dizaine de fichiers originaires des bases PERVAL ou bien et communiqués par les partenaires de l’ANR. La combinaison de ces différentes sources de données donnent une occasion unique d’analyser la dynamique des marchés de l’immobilier sur une période longue, combinée à plusieurs métropoles.

Cas d’étude Nom de fichier Contenu Equipe détentrice des données
Paris (IDF) BIEN_9618_Consolidated.txt Transactions géoréférencées 1996-2018 Communiqué par l’UMR Géographie-Cités
Lyon ETUDE_ADNOV_69102_0421.xls Transactions géoréférencées 1998 Communiqué par l’UMR Géographie-Cités, fichier brut PERVAL
Lyon FUA Lyon 2008 2010 2012.xls Transactions géoréférencées 2008, 2010 et 2012 hors Métropole du Grand Lyon Communiqué par le Centre Max Weber
Lyon FUA Lyon 2015 2018.xls Transactions géoréférencées 2015 et 2018 hors Métropole du Grand Lyon Communiqué par le Centre Max Weber
Lyon Grand Lyon 2008 2010 2012.xls Transactions géoréférencées pour 2012, non géoréférencées pour 2008 et 2010, Métropole du Grand Lyon Communiqué par la Métropole du Grand Lyon via le Centre Max Weber
Lyon Grand Lyon 2015 2018.xls Transactions 2015 et 2018, Métropole du Grand Lyon Communiqué par la Métropole du Grand Lyon via le Centre Max Weber
Lyon/Avignon FUAs_Avignon_Lyon_appartements1.csv Transactions 2000, 2002 et 2004, non géoréférencées, appartements Communiqué par l’UMR ESPACE
Lyon/Avignon FUAs_Avignon_Lyon_appartements.csv Transactions 2002, 2004 et 2006, non géoréférencées, appartements Communiqué par l’UMR ESPACE
Lyon/Avignon FUAs_Avignon_Lyon_maisons2000.csv Transactions 2000, 2002 et 2004, non géoréférencées, maisons Communiqué par l’UMR ESPACE
Lyon/Avignon FUAs_Avignon_Lyon_maisons.csv Transactions 2002, 2004 et 2006, non géoréférencées, maisons Communiqué par l’UMR ESPACE
Avignon DONNES PERVAL FUA AVIGNON AP ET MA 1998.xlsx Transactions géoréférencées 1998 Communiqué par l’UMR ESPACE, fichier brut PERVAL
Avignon EXTRAIT_DE_BASE_F75277_2001.xlsx Transactions géoréférencées 2008, 2012 et 2015 Communiqué par l’UMR ESPACE, fichier brut PERVAL
Avignon PERVAL_FUA_Avignon_2010.xlsx Transactions géoréférencées 2010 Communiqué par l’UMR ESPACE, fichier brut PERVAL
Avignon PERVAL_FUA_Avignon_2014.xlsx Transactions géoréférencées 2014 Communiqué par l’UMR ESPACE
Avignon DONNES PERVAL FUA AVIGNON AP ET MA 2018.xlsx Transactions géoréférencées 2018 Communiqué par l’UMR ESPACE


Protocole de consolidation des données

Les données sont préalablement importées, réorganisées et regroupées. Cette étape est fastidieuse puisqu’aucune des tables sources ne sont organisées de façon similaire. Une fois les données regroupées, les données (à l’échelle de la transaction) subissent un cycle de vérification - consolidation qui vise à écarter les valeurs aberrantes. Ces valeurs aberrantes peuvent à la fois être le fait d’une qualité renseignement dans la base de données (prix ou surfaces aberrants) ; de biens “exceptionnels” ou rares, peu significatifs des marchés locaux (par leur surface, leur typologie, par ex. chateaux).

Les étapes de consolidation suivantes sont ainsi appliquées :

  1. Vérification géographique
  1. Annonces géoréférencées : ne sont conservées que les transactions géolocalisées dans l’espace d’étude.
  2. Annonces non géoréférencées : ne sont conservée que les transactions dont le code communal d’appartenance correspond aux codes communaux inclus dans la FUA (En géographie courante au 1er janvier 2019. Modifications territoriales non prises en compte. Implique des données manquantes pour les communes sujettes à des fusions/scissions administratives 1.

2 De telles corrections pourraient être effecutées dans de futures versions de la base, mais n’affectent qu’un petit nombre de transactions.

  1. Transactions doublonnées (num_acte) : Vérification que l’identifiant d’une transaction n’est pas doublonné. Absence d’identifiant pour BIEN, on concatène X, Y, prix et surface pour créer un identifiant unique reposant sur ces attributs fondamentaux.

  2. Rééquilibrage – échantillonnage : création d’un coefficient multiplicateur (N) pour gérer l’échantillonnage, suivant le plan d’échantillonnage communiqué.

  3. Prix nominaux nets vendeurs (prix_ttc) : suppression des transactions où le prix est manquant ou inférieur ou égal à 0.

  4. Surfaces habitables (surf_hab_est ou surf_hab selon les jeux de données) : suppression des transactions où la surface est manquante ou égale à 0.

  5. Biens spécifiques à omettre (typ_mai ou typ_app selon les types de bien) : L’étude vise à qualifier les marchés d’accession à la propriété des appartements et des maisons. Afin d’éviter les biens atypiques, nous supprimons les ateliers d’artistes, chambres de service, greniers, logements de fonction (appartements); tours et moulins, hôtels particuliers, fermes, maisons rurales, grandes propriétés / châteaux (maisons).

  6. Biens d’habitation uniquement (cod_usage) : ne conserver que les transactions qui répondent à un type «habitation».

  7. Ventes de gré à gré uniquement (mut) : ne conserver que les ventes de gré à gré.

  8. Valeurs exceptionnelles (prix_ttc et surf_hab) : Exclusion des 1 % des valeurs les plus fortes / plus faibles pour les prix_ttc et surf_hab (extraction des valeurs par type de bien et par année).

  9. Déduction des biens neufs / anciens (base_tva et REQ_ANC) : Si la base TVA est supérieure à 0, alors c’est un bien neuf, sinon un ancien. Si REQ_ANC = 1, bien ancien ; si REQ_ANC = 2, bien neuf (moins de 5 ans).

A chaque étape, les observations qui ne répondent pas au critère de consolidation sont exclues de l’échantillon. Cela signifie que l’opération 9 (analyse des valeurs exceptionnelles) ne prend en compte en entrée que les valeurs qui subsistent suite à la succession des étapes 1 à 8.

Cette procédure a été réalisée en langage R, disponible ci-dessous. Les données géoréférencées sont stockées sous forme de geopackage, les données non géoréférencées dans des fichiers .csv. Ces fichiers consolidés sont utilisés en entrée de chaque analyse.

Cliquer ici pour voir le code
###############################################################################
# Mise en place des fonction de consolidation des données                     #
###############################################################################

# Biens spécifiques à ne pas considérer (appartements): 
# Ateliers d'artiste, chambre de service, greniers, logements de fonction
rmApp <- c("AT", "CH", "Chambre(s) de service", "GR", "Grenier à amenager", "LG") 

# Biens spécifiques à ne pas considérer (maisons): Tours et moulins, 
# hôtels particuliers, châteaux, grandes propriétés et maisons rurales
rmMai <- c("DI", "Divers (Tour, Moulin ... etc)", "FE", "Ferme", "RU", "Maison rurale" ,
           "GP", "Grande propriete / château", "HP", "Hotel particulier")

# Types = habitation uniquement
typ <- c("HA", "Habitation")

# Nature de mutation : ventes de gré à gré
mut <- c("Vente de gré à gré", "VG", "1")

# Sélection des variables (code PERVAL) utiles aux analyses
selVar <- c("x", "y", "num_acte", "num_cominsee", "dat_mut",  "nat_mut", "cod_usage",
            "prix_ttc", "srf_hab_est", "mnt_credit", "base_tva", 
            "v_prof", "a_prof", "v_matri", "a_matri", "v_anaiss", "a_anaiss",
            "a_com", "v_com")
selVarA <- c(selVar, "typ_app") # rajout type appartement
selVarM <- c(selVar, "typ_mai") # rajout type maisons

# Sélection des variables (code PERVAL) quand pas de géoréférencement
selVarcom <- c("num_acte", "num_cominsee", "annee",  "nat_mut", "cod_usage", 
               "prix_ttc", "srf_hab", "base_tva", "mnt_credit", "v_prof", "a_prof",
               "v_matri", "a_matri", "a_anaiss", "v_anaiss", "a_com", 'v_com')
selVarcomA <- c(selVarcom, "typ_app")
selVarcomM <- c(selVarcom, "typ_mai")

# Fonction de nettoyage pour données d'entrée avec géoréférencement
dataCons <- function(x, col.name, years, study_area, output, sample){
   
   output <- data.frame(matrix(ncol = ncol(x), nrow = 0))
   colnames(output) <- colnames(x)
   
   # Boucle sur l'ensemble des années
   for(i in 1 : years){
      
      # Echantillon initial
      tmp <- x[x$annee == i,]
      
      # Géoréférencement aberrant (hors espace d'étude)
      tmp <- tmp[!is.na(tmp$x),]
      tmp <- tmp[!is.na(tmp$y),]
      tmp$x.1 <- tmp$x
      tmp$y.1 <- tmp$y
      tmp <- st_as_sf(x = tmp, coords = c("x.1", "y.1"), crs = 27572)
      tmp <- st_transform(tmp, 2154)
      tmp <- st_intersection(tmp, study_area)
      tmp <- st_set_geometry(tmp, NULL)
      
      # Supprimer mutation dupliquées par erreur
      tmp <- tmp[!duplicated(tmp$num_acte),]
      
      # Création variable N échantillonnage
      sample <- samp
      sample <- sample[sample$annee == years[i],]
      tmp <- merge(tmp, sample[,c("INSEE_COM", "N")], by = "INSEE_COM")
      tmp$N <- as.numeric(tmp$N)

      # Transactions sans prix nominaux nets vendeurs ou inférieur à 1
      tmp <- tmp[!is.na(tmp$prix),]
      tmp <- tmp[tmp$prix > 1,]
      
      # Transactions sans surfaces habitables ou inférieures à 1
      tmp <- tmp[!is.na(tmp$srf_hab),]
      tmp <- tmp[tmp$srf_hab > 1,]
      
      # Bien spécifiques à omettre
      if(col.name == "Mai"){
         tmp <- subset(tmp, !(typ_mai %in% rmMai))
      }
      
      if(col.name == "App"){
         tmp <- subset(tmp, !(typ_app %in% rmApp))
      }
      
      # Habitation uniquement
      tmp <- tmp[tmp$cod_usage %in% typ,]
      
      # Ventes de gré à gré uniquement
      tmp <- tmp[tmp$nat_mut %in% mut,]
      
      # Percentiles (Tukey exclut visiblement trop de valeurs, notamment sur les max)
      thr1 <- quantile(tmp$srf_hab, 0.01, na.rm = TRUE)
      thr2 <- quantile(tmp$srf_hab, 0.99, na.rm = TRUE)
      thr3 <- quantile(tmp$prix, 0.01, na.rm = TRUE)
      thr4 <- quantile(tmp$prix, 0.99, na.rm = TRUE)
      
      tmp <- tmp[tmp$srf_hab >= thr1,]
      tmp <- tmp[tmp$srf_hab <= thr2,]
      tmp <- tmp[tmp$prix >= thr3,]
      tmp <- tmp[tmp$prix <= thr4,]
      
      tmp <- tmp[!is.na(tmp$annee),]
      
      # Déduction prix neuf / ancien
      if("base_tva" %in% colnames(tmp)){
         tmp$neuf <- ifelse(tmp$base_tva > 0, "N", "A")
      }
      
      if("neuf" %in% colnames(tmp)){
         tmp$neuf <- factor(tmp$neuf, levels = c(1, 2), labels = c("A", "N"))
         tmp$neuf <- as.character(tmp$neuf)
         }
         
      # Géoréférencement final + transfo Lambert93
      tmp <- st_as_sf(x = tmp, coords = c("x", "y"), crs = 27572)
      tmp <- st_transform(tmp, 2154)
      
   output <- rbind(output, tmp)     
   }
   
   return("output" = output))
}

# Fonction de nettoyage pour objets non géoréférencés (codes communaux)
comCons <- function(x, cs, col.name, years, study_area, sample){
   
   output <- data.frame(matrix(ncol = ncol(x), nrow = 0))
   colnames(output) <- colnames(x)
   
   # Boucle sur l'ensemble des années
   for(i in 1 : length(years)){
      
      # Echantillon initial
      tmp <- x[x$annee == years[i],]
      
      # Séparer Lyon et Avignon
      if(cs == "Lyon"){
         tmp <- tmp[tmp$dep %in% c("01", "38", "42", "69"),]
         }
      
      if(cs == "Avignon"){
         tmp <- tmp[tmp$dep %in% c("13", "30", "84"),]
         }
      
      tmp <- tmp[!is.na(tmp$INSEE_COM),]
   
      # Code communal dans l'espace d'étude (changement communal non géré)
      tmp <- tmp[tmp$INSEE_COM %in% study_area, ]
      
      # Supprimer mutation dupliquées par erreur
      tmp <- tmp[!duplicated(tmp$num_acte),]
      
      # Création variable N échantillonnage
      sample <- samp
      sample <- sample[sample$annee == years[i],]
      tmp <- merge(tmp, sample[,c("INSEE_COM", "N")], by = "INSEE_COM")
      tmp$N <- as.numeric(tmp$N)
      
      # Transactions sans prix nominaux nets vendeurs ou égal à 0
      tmp <- tmp[!is.na(tmp$prix),]
      tmp <- tmp[tmp$prix > 1,]
      
      # Transactions sans surfaces habitables ou égales à 0
      tmp <- tmp[!is.na(tmp$srf_hab),]
      tmp <- tmp[tmp$srf_hab > 1,]
      
      # Bien spécifiques à omettre
      if(col.name == "Mai"){
         tmp <- subset(tmp, !(typ_mai %in% rmMai))
      }
      
      if(col.name == "App"){
         tmp <- subset(tmp, !(typ_app %in% rmApp))
      }
   
      # Habitation uniquement
      tmp <- tmp[tmp$cod_usage %in% typ,]
      
      # Ventes de gré à gré uniquement
      tmp <- tmp[tmp$nat_mut %in% mut,]
      
      # Valeurs exceptionelles (1 pour 1000 des plus et moins élevées)
      thr1 <- quantile(tmp$srf_hab, 0.01, na.rm = TRUE)
      thr2 <- quantile(tmp$srf_hab, 0.99, na.rm = TRUE)
      thr3 <- quantile(tmp$prix, 0.01, na.rm = TRUE)
      thr4 <- quantile(tmp$prix, 0.99, na.rm = TRUE)
      
      tmp <- tmp[tmp$srf_hab >= thr1,]
      tmp <- tmp[tmp$srf_hab <= thr2,]
      tmp <- tmp[tmp$prix >= thr3,]
      tmp <- tmp[tmp$prix <= thr4,]
      
      # Déduction prix neuf / ancien
      tmp$neuf <- ifelse(tmp$base_tva > 0, "N", "A")
      
      output <- rbind(output, tmp)
      }
   return("output" = output)
}

# Fonction transformation variables
transf <- function(x){
   transform(x, num_acte = as.character(num_acte), x = as.numeric(x), 
             y = as.numeric(y), base_tva = as.numeric(base_tva), prix = as.numeric(prix),
             mnt_credit = as.numeric(mnt_credit),  srf_hab = as.numeric(srf_hab), 
             a_anaiss = as.numeric(a_anaiss), v_anaiss = as.numeric(v_anaiss))
   }

transfcom <- function(x){
   transform(x, num_acte = as.character(num_acte), base_tva = as.numeric(base_tva), 
             prix = as.numeric(prix), mnt_credit = as.numeric(mnt_credit),  
             srf_hab = as.numeric(srf_hab), a_anaiss = as.numeric(a_anaiss), 
             v_anaiss = as.numeric(v_anaiss))
}


###################
# AVIGNON - CONSOLIDATION
##################

# Import espace d'étude
avignon <- getLayers(x = "Avignon") # Données géographiques préparées en amont sous forme de liste
study_area <- avignon$all # Espace d'étude
com <- avignon$com # Communes

# 1 - Tables avec géoréférencement (X-Y), rééquilibrage montant crédit
Ap1 <- as.data.frame(read_xlsx("data/avignon/DONNES PERVAL FUA AVIGNON AP ET MA 1998.xlsx",
                               sheet = "Appartements")) # 1998
Ap1 <- Ap1[-1, ]
Ap1$mnt_credit <- as.numeric(Ap1$mnt_credit) / 6.5595
Mai1 <- as.data.frame(read_xlsx("data/avignon/DONNES PERVAL FUA AVIGNON AP ET MA 1998.xlsx",
                                sheet = "Maisons")) # 1998
Mai1 <- Mai1[-1, ]  
Mai1$mnt_credit <- as.numeric(Mai1$mnt_credit) / 6.5595
Ap2 <- as.data.frame(read_xlsx("data/avignon/EXTRAIT_DE_BASE_F75277_2001.xlsx",
                               sheet = "Appartements")) # 2008, 2012 et 2015
Ap2 <- Ap2[-1, ]  
Ap2$mnt_credit <- as.numeric(Ap2$mnt_credit) / 6.5595
Mai2 <- as.data.frame(read_xlsx("data/avignon/EXTRAIT_DE_BASE_F75277_2001.xlsx",
                                sheet = "Maisons")) # 2008, 2012 et 2015
Mai2 <- Mai2[-1, ]  
Mai2$mnt_credit <- as.numeric(Mai2$mnt_credit) / 6.5595
Ap3 <- as.data.frame(read_xlsx("data/avignon/PERVAL_FUA_Avignon_2010.xlsx",
                               sheet = "Appartements")) # 2010
Ap3 <- Ap3[-1, ]  
Ap3$mnt_credit <- as.numeric(Ap3$mnt_credit) / 6.5595
Mai3 <- as.data.frame(read_xlsx("data/avignon/PERVAL_FUA_Avignon_2010.xlsx",
                                sheet = "Maisons")) # 2010
Mai3 <- Mai3[-1, ]  
Mai3$mnt_credit <- as.numeric(Mai3$mnt_credit) / 6.5595
Ap4 <- as.data.frame(read_xlsx("data/avignon/PERVAL_FUA_Avignon_2014.xlsx",
                               sheet = "Appart FUA Avignon (84+13) 2014")) # 2014
Ap4$mnt_credit <- as.numeric(Ap4$mnt_credit) / 6.5595
Ap5 <- as.data.frame(read_xlsx("data/avignon/PERVAL_FUA_Avignon_2014.xlsx",
                               sheet = "Apparts FUA Avignon (30) 2014")) # 2014
Ap5$mnt_credit <- as.numeric(Ap5$mnt_credit) / 6.5595
Mai4 <- as.data.frame(read_xlsx("data/avignon/PERVAL_FUA_Avignon_2014.xlsx",
                                sheet = "Maisons FUA Avignon (84+13)2014")) # 2014
Mai4$mnt_credit <- as.numeric(Mai4$mnt_credit) / 6.5595
Mai5 <- as.data.frame(read_xlsx("data/avignon/PERVAL_FUA_Avignon_2014.xlsx",
                                sheet = "Maisons FUA Avignon (30) 2014")) # 2014
Mai5$mnt_credit <- as.numeric(Mai5$mnt_credit) / 6.5595
Ap6 <- as.data.frame(read_xlsx("data/avignon/DONNEES PERVAL FUA AVIGNON AP ET MA 2018.xlsx",
                               sheet = "Appartements")) # 2018
Ap6 <- Ap6[-1, ]  
Mai6 <- as.data.frame(read_xlsx("data/avignon/DONNEES PERVAL FUA AVIGNON AP ET MA 2018.xlsx",
                                sheet = "Maisons")) # 2018
Mai6 <- Mai6[-1, ]  

# Sélection des variables
App <- rbind(Ap1[,selVarA], Ap2[,selVarA], Ap3[,selVarA], 
             Ap4[,selVarA], Ap5[,selVarA], Ap6[,selVarA])
Mai <- rbind(Mai1[,selVarM], Mai2[,selVarM], Mai3[,selVarM], 
             Mai4[,selVarM], Mai5[,selVarM], Mai6[,selVarM])

# Renommage - type variables
App$dat_mut <- as.numeric(App$dat_mut)
App$dat_mut <- as.Date(App$dat_mut, origin = "1899-12-30")
App$annee <- format(App$dat_mut, "%Y")
App <-  App[,-which(names(App) %in% "dat_mut")]
colnames(App)[c(4,7,8)] <- c("INSEE_COM", "prix", "srf_hab")
App <- transf(App)
Mai$dat_mut <- as.numeric(Mai$dat_mut)
Mai$dat_mut <- as.Date(Mai$dat_mut, origin = "1899-12-30")
Mai$annee <- format(Mai$dat_mut, "%Y")
Mai <- Mai[,-which(names(Mai) %in% "dat_mut")]
colnames(Mai)[c(4,7,8)] <- c("INSEE_COM", "prix", "srf_hab")
Mai <- transf(Mai)

# 2 - Tables avec référencement communal au plus précis
comAp1 <- read.csv("data/avignon/FUAs_Avignon_Lyon_appartements1.csv", sep = ";",  dec = ",") 
comAp1 <- comAp1[comAp1$annee != "2000",] # On ne conserve pas 2000 (doublon)
comAp1$mnt_credit <- as.numeric(comAp1$mnt_credit / 6.5595)
comAp2 <- read.csv("data/avignon/FUAs_Avignon_Lyon_appartements_ry.csv", sep=",", dec = ",")
# correction manuelle / mauvais formatage / a priori doublon de appartements1, on ne garde que 2006
comAp2 <- comAp2[comAp2$annee == "2006",] # On ne conserve pas 2002 et 2004 (doublon)
comAp2$mnt_credit <- as.numeric(comAp2$mnt_credit / 6.5595)
comAp3 <- read.csv("data/avignon/FUAs_Avignon_Lyon_appart2000.csv", sep = ";", dec = ",")
comAp3$mnt_credit <- as.numeric(comAp3$mnt_credit / 6.5595)
comMai1 <- read.csv("data/avignon/FUAs_Avignon_Lyon_maisons2000.csv", sep = ";", dec = ",")
comMai1$mnt_credit <- as.numeric(comMai1$mnt_credit / 6.5595)
comMai2 <- read.csv("data/avignon/FUAs_Avignon_Lyon_maisons.csv", sep = ";", dec = ",")
comMai2 <- comMai2[comMai2$annee == "2006",]
comMai2$mnt_credit <- as.numeric(comMai2$mnt_credit / 6.5595)

comApp <- rbind(comAp1[,selVarcomA], comAp2[,selVarcomA], comAp3[,selVarcomA])
comMai <- rbind(comMai1[,selVarcomM], comMai2[,selVarcomM])

# Gestion des codes communaux inappropriés (manque 0)
comApp$num_cominsee <- as.character(comApp$num_cominsee)
comMai$num_cominsee <- as.character(comMai$num_cominsee)
comApp$num_cominsee <- ifelse(nchar(comApp$num_cominsee) == 4, 
                              paste0("0", comApp$num_cominsee),
                              comApp$num_cominsee)
comMai$num_cominsee <- ifelse(nchar(comMai$num_cominsee) == 4, 
                              paste0("0", comMai$num_cominsee),
                              comMai$num_cominsee)

# Renommage - type variables
colnames(comApp)[c(2,6,7)] <- c("INSEE_COM", "prix", "srf_hab")
colnames(comMai)[c(2,6,7)] <- c("INSEE_COM", "prix", "srf_hab")
comApp <- transfcom(comApp)
comMai <- transfcom(comMai)

# 3 - Gestion échantillonnage
samp <- rbind(App[,c("INSEE_COM", "annee")],  Mai[,c("INSEE_COM", "annee")],
              comMai[,c("INSEE_COM", "annee")], comApp[,c("INSEE_COM", "annee")])

samp <- aggregate(samp$INSEE_COM, list(samp$INSEE_COM, samp$annee), FUN = length)
samp$N <- cut(samp$x,
              breaks = c(1, 20, 60, 150, 300, max(samp$x)),
              include.lowest = TRUE, 
              labels = c(1, 2, 3.03, 4, 10))
samp$N <- 1 # Pas d'échantillonnage, tout à 1
colnames(samp) <- c("INSEE_COM", "annee", "x", "N")

# 4 - Consolidation
#  Consolidation - Maisons (géoréférencées)
MaiC <- dataCons(x = Mai, col.name = "Mai", study_area = study_area, 
                 years = levels(as.factor(Mai$annee)),
                 sample = samp)
MaiC <- MaiC$output

# Consolidation - Appartements (géoréférencés)
AppC <- dataCons(x = App, col.name = "App", study_area = study_area,
                 output = AppC, years = levels(as.factor(App$annee)))
AppC <- AppC$output

# Consolidation - A la commune
comMai$dep <- substr(comMai$INSEE_COM, 1, 2)
comApp$dep <- substr(comApp$INSEE_COM, 1, 2)

comMaiC <- comCons(x = comMai, col.name = "Mai", cs = "Avignon", sample = samp,
                   study_area = com$INSEE_COM, years =  levels(as.factor(comMai$annee)))
comMaiC <- comMaiC$output

comAppC <- comCons(x = comApp, col.name = "App", cs = "Avignon",
                   study_area = com$INSEE_COM, years = levels(as.factor(comApp$annee)))
comAppC <- comAppC$output

# Export données consolidées
st_write(MaiC, "data/conso/avignon_points.gpkg", layer = "maisons", 
         delete_layer = TRUE)
st_write(AppC, "data/conso/avignon_points.gpkg", layer = "apparts", 
         delete_layer = TRUE)
write.csv(comAppC, "data/conso/avignon_com_appart.csv")
write.csv(comMaiC, "data/conso/avignon_com_maison.csv")


################################################
#   LYON 
################################################

lyon <- getLayers(x = "Lyon")
com <- lyon$com
study_area <- lyon$all
all <- study_area
metro <- lyon$metro
metro <- st_transform(metro, 2154)

metrocom <- c("69003", "69033", "69034", "69040", "69044", "69046", "69271", 
              "69063", "69273", "69068", "69069", "69071", "69072", "69275", 
              "69081", "69276", "69085", "69250", "69087", "69088", "69089",
              "69278", "69091", "69096", "69100", "69279", "69116", "69117",
              "69381", "69382", "69383", "69384", "69385", "69386", "69387",
              "69388", "69389", "69127", "69282", "69283", "69780", "69284",
              "69142", "69143", "69149", "69152", "69153", "69163", "69286",
              "69168", "69191", "69194", "69202", "69199", "69204", "69205",
              "69207", "69290", "69233", "69292", "69293", "69296", "69244",
              "69250", "69256", "69259", "69260", "69266", "69029")

# 1 - Import des données géoréférencées
Ap1 <- as.data.frame(read_xlsx("data/lyon/ETUDE_ADNOV_69102_0421.xlsx",
                               sheet = "APPARTEMENTS")) # 1998
Ap1$annee <- 1998
Ap1$mnt_credit <- as.numeric(Ap1$mnt_credit) / 6.5595
Ap2 <- as.data.frame(read_xlsx("data/lyon/Grand Lyon 2008 2010 2012.xlsx",
                               sheet = "Appts 2012")) #  2012 Métro
Ap2$annee <- 2012
Ap2$mnt_credit <- as.numeric(Ap2$mnt_credit) / 6.5595
Ap3 <- as.data.frame(read_xlsx("data/lyon/Grand Lyon 2015 2018.xlsx",
                               sheet = "Appartements 2015")) #  2015 Métro
Ap3$annee <- 2015
Ap3$mnt_credit <- as.numeric(Ap3$mnt_credit) / 6.5595
Ap4 <- as.data.frame(read_xlsx("data/lyon/Grand Lyon 2015 2018.xlsx",
                               sheet = "Appartements 2018")) #  2018 Métro
Ap4$annee <- 2018
Ap5 <- as.data.frame(read_xlsx("data/lyon/FUA Lyon 2008 2010 2012.xlsx",
                               sheet = "Appartements")) #  2008 - 2010 - 2012 hors Métro
Ap5 <- Ap5[-1, ]  
Ap5$mnt_credit <- as.numeric(Ap5$mnt_credit) / 6.5595
Ap6 <- as.data.frame(read_xlsx("data/lyon/FUA Lyon 2015 2018.xlsx",
                               sheet = "Appartements")) #  2015 - 2018 hors Métro
Ap6 <- Ap6[-1, ]  
Mai1 <- as.data.frame(read_xlsx("data/lyon/ETUDE_ADNOV_69102_0421.xlsx",
                                sheet = "MAISONS")) # 1998
Mai1$annee <- 1998
Mai1$mnt_credit <- as.numeric(Mai1$mnt_credit) / 6.5595
Mai2 <- as.data.frame(read_xlsx("data/lyon/Grand Lyon 2008 2010 2012.xlsx",
                               sheet = "Maisons 2012")) #  2012 Métro
Mai2$annee <- 2012
Mai2$mnt_credit <- as.numeric(Mai2$mnt_credit) / 6.5595
Mai3 <- as.data.frame(read_xlsx("data/lyon/Grand Lyon 2015 2018.xlsx",
                                sheet = "maisons2015")) #  2015 Métro
Mai3$annee <- 2015
Mai3$mnt_credit <- as.numeric(Mai3$mnt_credit) / 6.5595
Mai4 <- as.data.frame(read_xlsx("data/lyon/Grand Lyon 2015 2018.xlsx",
                                sheet = "Maisons 2018")) #  2018 Métro
Mai4$annee <- 2018
Mai5 <- as.data.frame(read_xlsx("data/lyon/FUA Lyon 2008 2010 2012.xlsx",
                               sheet = "Maisons")) #  2008 - 2010 - 2012 hors Métro
Mai5 <- Mai5[-1, ]
Mai5$mnt_credit <- as.numeric(Mai5$mnt_credit) / 6.5595
Mai6 <- as.data.frame(read_xlsx("data/lyon/FUA Lyon 2015 2018.xlsx",
                               sheet = "Maisons")) #  2015 - 2018 hors Métro
Mai6 <- Mai6[-1, ]

# Mise en forme des données (séparer 2008 et 2010 du reste)
Ap5 <- rbind(Ap5, Ap6)
Ap5$dat_mut <- as.numeric(Ap5$dat_mut)
Ap5$dat_mut <- as.Date(Ap5$dat_mut, origin = "1899-12-30")
Ap5$annee <- format(Ap5$dat_mut, "%Y")
Ap7 <- Ap5[Ap5$annee %in% c("2008", "2010"),] # Extraction des données pour affectation à la commune
Ap5 <- Ap5[Ap5$annee %in% c("2012", "2015", "2018"),] # et géoréférencées
Mai5 <- rbind(Mai5, Mai6)
Mai5$dat_mut <- as.numeric(Mai5$dat_mut)
Mai5$dat_mut <- as.Date(Mai5$dat_mut, origin = "1899-12-30")
Mai5$annee <- format(Mai5$dat_mut, "%Y")
Mai7 <- Mai5[Mai5$annee %in% c("2008", "2010"),] # Extraction des données pour affectation à la commune
Mai5 <- Mai5[Mai5$annee %in% c("2012", "2015", "2018"),] # et géoréférencées

# Exclure transactions référencées dans métro pour 2012, 2015 et 2018 (erreurs saisie)
Ap5$x <- as.numeric(Ap5$x)
Ap5$y <- as.numeric(Ap5$y)
Ap5 <- Ap5[!is.na(Ap5$x),]
Ap5$x.1 <- Ap5$x
Ap5$y.1 <- Ap5$y
Ap5 <- st_as_sf(x = Ap5, coords = c("x.1", "y.1"), crs = 27572)
Ap5 <- st_transform(Ap5, 2154)
Ap5 <- st_difference(Ap5, metro)
Ap5 <- st_set_geometry(Ap5, NULL)

Mai5$x <- as.numeric(Mai5$x)
Mai5$y <- as.numeric(Mai5$y)
Mai5 <- Mai5[!is.na(Mai5$x),]
Mai5$x.1 <- Mai5$x
Mai5$y.1 <- Mai5$y
Mai5 <- st_as_sf(x = Mai5, coords = c("x.1", "y.1"), crs = 27572)
Mai5 <- st_transform(Mai5, 2154)
Mai5 <- st_difference(Mai5, metro)
Mai5 <- st_set_geometry(Mai5, NULL)

# Combiner correctement 2008 et 2010 (avec code com metro)
Mai7 <- subset(Mai7, !(num_cominsee) %in% metrocom)
Ap7 <- subset(Ap7, !(num_cominsee) %in% metrocom)

# Sélection des variables
selVarAp <- c(selVarA, "annee")
selVarMa <- c(selVarM, "annee")
App <- rbind(Ap1[,selVarAp], Ap2[,selVarAp], Ap3[,selVarAp], Ap4[,selVarAp], Ap5[,selVarAp])
Mai <- rbind(Mai1[,selVarMa], Mai2[,selVarMa], Mai3[,selVarMa], Mai4[,selVarMa], Mai5[,selVarMa])

# Renommage - type variables
App <-  App[,-which(names(App) %in% "dat_mut")]
colnames(App)[c(4,7,8)] <- c("INSEE_COM", "prix", "srf_hab")
App <- transf(App)
Mai <- Mai[,-which(names(Mai) %in% "dat_mut")]
colnames(Mai)[c(4,7,8)] <- c("INSEE_COM", "prix", "srf_hab")
Mai <- transf(Mai)


# 2 - Tables avec référencement communal au plus précis
comAp1 <- as.data.frame(read_xlsx("data/lyon/Grand Lyon 2008 2010 2012.xlsx",
                               sheet = "Appts 2008")) #  
comAp1$annee <- 2008
comAp1$mnt_credit <- as.numeric(comAp1$mnt_credit / 6.5595)
comAp2 <- as.data.frame(read_xlsx("data/lyon/Grand Lyon 2008 2010 2012.xlsx",
                               sheet = "Appts 2010"))
comAp2$annee <- 2010
comMai1 <- as.data.frame(read_xlsx("data/lyon/Grand Lyon 2008 2010 2012.xlsx",
                                sheet = "maisons 2008"))
comMai1$annee <- 2008
comMai1$mnt_credit <- as.numeric(comMai1$mnt_credit / 6.5595)
comMai2 <- as.data.frame(read_xlsx("data/lyon/Grand Lyon 2008 2010 2012.xlsx",
                                sheet = "maisons 2010"))
comMai2$annee <- 2010
comAp3 <- read.csv("data/avignon/FUAs_Avignon_Lyon_appartements1.csv", sep = ";",  dec = ",") 
comAp3 <- comAp3[comAp3$annee != "2000",] # On ne conserve pas 2000 (doublon)
comAp3$mnt_credit <- as.numeric(comAp3$mnt_credit / 6.5595)
comAp4 <- read.csv("data/avignon/FUAs_Avignon_Lyon_appartements_ry.csv", sep=",", dec = ",") # correction manuelle / mauvais formatage / a priori doublon de appartements1, on ne garde que 2006
comAp4 <- comAp4[comAp4$annee == "2006",] # On ne conserve pas 2002 et 2004 (doublon)
comAp4$mnt_credit <- as.numeric(comAp4$mnt_credit / 6.5595)
comAp5 <- read.csv("data/avignon/FUAs_Avignon_Lyon_appart2000.csv", sep = ";", dec = ",")
comAp5$mnt_credit <- as.numeric(comAp5$mnt_credit / 6.5595)
comMai3 <- read.csv("data/avignon/FUAs_Avignon_Lyon_maisons2000.csv", sep = ";", dec = ",")
comMai3$mnt_credit <- as.numeric(comMai3$mnt_credit / 6.5595)
comMai4 <- read.csv("data/avignon/FUAs_Avignon_Lyon_maisons.csv", sep = ";", dec = ",")
comMai4$mnt_credit <- as.numeric(comMai4$mnt_credit / 6.5595)
comMai5 <- comMai2[comMai2$annee == "2006",]

# Sélection - Renommage - type variables
colnames(Ap7)[131] <- "srf_hab"
colnames(Mai7)[126] <- "srf_hab"
comApp <- rbind(comAp1[,selVarcomA], comAp2[,selVarcomA], comAp3[,selVarcomA],
                comAp4[,selVarcomA], comAp5[,selVarcomA], Ap7[,selVarcomA])
comMai <- rbind(comMai1[,selVarcomM], comMai2[,selVarcomM], comMai3[,selVarcomM],
                comMai4[,selVarcomM], comMai5[,selVarcomM], Mai7[,selVarcomM])

comApp$num_cominsee <- ifelse(nchar(comApp$num_cominsee) == 4, 
                              paste0("0", comApp$num_cominsee),
                              comApp$num_cominsee)
comMai$num_cominsee <- ifelse(nchar(comMai$num_cominsee) == 4, 
                              paste0("0", comMai$num_cominsee),
                              comMai$num_cominsee)
comApp$dep <- substr(comApp$num_cominsee, 1, 2)
comMai$dep <- substr(comMai$num_cominsee, 1, 2)
colnames(comApp)[c(2, 6)] <- c("INSEE_COM", "prix")
colnames(comMai)[c(2, 6)] <- c("INSEE_COM", "prix")
comApp <- transfcom(comApp)
comMai <- transfcom(comMai)

# 3 - Gestion échantillonnage
samp <- rbind(App[,c("INSEE_COM", "annee")],  Mai[,c("INSEE_COM", "annee")],
              comMai[,c("INSEE_COM", "annee")], comApp[,c("INSEE_COM", "annee")])

samp <- aggregate(samp$INSEE_COM, list(samp$INSEE_COM, samp$annee), FUN = length)
samp$N <- cut(samp$x,
              breaks = c(1, 20, 60, 150, 300, max(samp$x)),
              include.lowest = TRUE, 
              labels = c(1, 2, 3.03, 4, 10))
colnames(samp) <- c("INSEE_COM", "annee", "x", "N")
samp$N <- ifelse(samp$annee == "1998" , samp$N, 1)

# 4 - Consolidation
#  Consolidation (géoréférencées)
MaiC <- dataCons(x = Mai, col.name = "Mai", study_area = study_area, 
                 years = levels(as.factor(Mai$annee)), sample = samp)
MaiC <- MaiC$output

AppC <- dataCons(x = App, col.name = "App", study_area = study_area,
                 years = levels(as.factor(App$annee)), sample = samp)
AppC <- AppC$output

# Consolidation - A la commune
comMaiC <- comCons(x = comMai, col.name = "Mai", cs = "Lyon",
                   study_area = com$INSEE_COM, years =  levels(as.factor(comMai$annee)),
                   sample = samp)
comMaiC <- comMaiC$output
comAppC <- format(comAppC, scientific = F)

comAppC <- comCons(x = comApp, col.name = "App", cs = "Lyon",
                   study_area = com$INSEE_COM, years = levels(as.factor(comApp$annee)),
                   sample = samp)
comAppC <- comAppC$output
comAppC <- format(comAppC, scientific = F)

# Export données consolidées
st_write(MaiC, "data/conso/lyon_points.gpkg", layer = "maisons", 
         delete_layer = TRUE)
st_write(AppC, "data/conso/lyon_points.gpkg", layer = "apparts", 
         delete_layer = TRUE)
write.csv(comAppC, "data/conso/lyon_com_appart.csv")
write.csv(comMaiC, "data/conso/lyon_com_maison.csv")


################################################
#   PARIS
################################################

paris <- getLayers(x = "Paris")
com <- paris$com
study_area <- paris$all
all <- study_area

# Import données (un fichier, youpi !)
All <- read.csv("data/paris/BIEN_9618_Consolidated.csv", sep = ";", dec = ",")

selVar <- c("X", "Y", "insee", "REQ_MUT",  "USAGE", "REQ_PRIX", "REQ_ANC",
            "REQ_PM2", "SURFHABDEC", "MTCRED", "CSP_AC", "CSP_VE", "SITMAT_AC",
            "SITMAT_VE", "ANNAIS_AC", "ANNAIS_VE", "TYPAP", "TYPMAI", "annee")

# REQTYPBIEN > sep maisons apparts
All <- All[,selVar]

# Agréger modalités nature transaction
All$REQ_MUT <- substr(All$REQ_MUT, 1, 1)

# Restimation prix et surface si prix au m² dispo
All$REQ_PRIX <- ifelse(is.na(All$REQ_PRIX), 
                      All$REQ_PM2 * All$SURFHABDEC,
                      All$REQ_PRIX)

All$SURFHABDEC <- ifelse(is.na(All$SURFHABDEC), 
                     All$REQ_PRIX / All$REQ_PM2,
                     All$SURFHABDEC)

All <- All[,!names(All) %in% "REQ_PM2"]

colnames(All) <- c("x", "y", "INSEE_COM", "nat_mut", "cod_usage", "prix", "neuf",
                   "srf_hab", "mnt_credit", "a_prof", "v_prof", "a_matri",
                   "v_matri", "a_anaiss", "v_anaiss", "typ_app", "typ_mai", "annee")

# Tentative d'élimination des doublons
All$num_acte <- paste(All$x, All$y, All$prix, All$srf_hab)

# Séparer maisons et appartements
Mai <- All[All$typ_mai != "",]
Mai <- Mai[Mai$typ_mai != " ",]
App <- All[All$typ_app != "",]
App <- App[App$typ_app != " ",]

# Retirer valeurs manquantes
Mai <- Mai[!is.na(Mai$x),]
App <- App[!is.na(App$x),]

# Sample
samp <- rbind(App[,c("INSEE_COM", "annee")],  Mai[,c("INSEE_COM", "annee")])
samp <- aggregate(samp$INSEE_COM, list(samp$INSEE_COM, samp$annee), FUN = length)
com10k <- as.data.frame(read_xls("data/paris/communes moins 10000.xls", 
                                  sheet = "communes de moins de 10000 hab"))
com10k$sample <- 1
colnames(com10k)[1] <- "INSEE_COM"
colnames(samp)[1] <- "INSEE_COM"
samp <- merge(samp, com10k, by = "INSEE_COM", all.x = TRUE)
samp$sample <- ifelse(is.na(samp$sample), 2, samp$sample)
samp <- samp[,c(1:3, 6)]
colnames(samp) <- c("INSEE_COM", "annee", "x", "N")


# Consolidation
MaiC <- dataCons(x = Mai, col.name = "Mai", study_area = study_area, 
                 years = levels(as.factor(Mai$annee)), sample = samp)
MaiC <- MaiC$output

AppC <- dataCons(x = App, col.name = "App", study_area = study_area,
                 output = AppC, years = levels(as.factor(App$annee)))
AppC <- AppC$output

# Export données consolidées
st_write(MaiC, "data/conso/paris_points.gpkg", layer = "maisons", 
         delete_layer = TRUE)
st_write(AppC, "data/conso/paris_points.gpkg", layer = "apparts", 
         delete_layer = TRUE)

##########################
## THAT'S ALL FOLKS !
#########################


Agrégation, consolidation des bases et effets sur l’échantillonnage des données

Les données ont été fournies sous la forme d’échantillons variés, parfois exhaustifs (100% des transactions de la base), parfois partiels. En fonction des échantillons fournis, cette section renseigne les effets des étapes de consolidation des données sur le nombre d’observations (transactions) par année et type de bien. Jusqu’à l’étape 2 il s’agit du nombre de lignes (transactions). A partir de l’étape 2, il s’agit de la somme de N (ré-échantillonnage).

Paris (Ile-de-France)

Pour l’Ile-de-France, les transactions localisées dans les communes de plus de 10000 habitants subissent un échantillonnage de 50 % (N = 2).


Pour les analyses portant sur des mailles territoriales (communes, IRIS), seules les unités caractérisées par plus de 5 transactions et les carreaux de grille avec au moins transactions seront conservées (et quelque-soit leur poids N au regard du ré-échantillonnage).

Ces figures sont utiles pour rappeler les années à disposition, et connaître le plus petit niveau de référencement géographique disponible (code communal ou localisation X/Y).