--- title: "DVF_FRANCE" author: "Boris Mericskay" date: "12/11/2021" output: html_document --- --- PRÉPARATION DES DONNÉES DVF OPENDATA --- Ce script a comme objectif de préparer les données DVF géolocalisées disponibles en opendata (nettoyage, filtrage, agrégation,...). ## 1.Préparation du projet ### Télécharger les données de 2020 https://www.data.gouv.fr/fr/datasets/demandes-de-valeurs-foncieres-geolocalisees/ ### Définition de l'environnement de travail On définit ici le dossier qui centralise les données et où les différents jeux de données seront exportés ```{r setup, include=FALSE} knitr::opts_knit$set(root.dir = 'C:/DVF_France') knitr::opts_chunk$set(warning = FALSE, message = FALSE) ``` ### Chargement des packages R nécessaires Seul le package `tidyverse` dédié à la manipulation de données est nécessaire ici. ```{r} library(tidyverse) ``` ### Import du jeu de données brut ```{r} DVF <- read.csv("DATA/DVF2020.csv", encoding="UTF-8", stringsAsFactors=FALSE) ``` --- ## 2.Filtre et nettoyage des données DVF ### Etape1> Sélection des mutations de type "Ventes" de "Maison" et "Appartement' ```{r} etape1 <- DVF %>% filter(nature_mutation == "Vente") etape1bis <- etape1 %>% filter(type_local == "Maison" | type_local == "Appartement") ``` ### Etape2> Sélection et renommage des variables ```{r} etape2 <- etape1bis %>% select(id = id_mutation, disposition = numero_disposition, parcelle= id_parcelle, date = date_mutation, nature = nature_mutation, codecommune = code_commune, departement = code_departement, type = type_local, surface = surface_reelle_bati, piece = nombre_pieces_principales, prix = valeur_fonciere, latitude, longitude) ``` ### Etape3> Remplacement des cellules vides par des NA et suppression des NA ```{r} etape2[etape2==""] <- NA etape3 <- etape2 %>% na.omit() # pour supprimer les valeurs manquantes ``` --- ## 3.Diagnostic des types de mutations ### Nombre de mutations uniques ```{r} length(unique(etape3$id)) ``` ### Nombre de mutations multiventes ```{r} Mutationscomplexes <- nbunique %>% filter(nb>1) length(unique(Mutationscomplexes$id)) ``` ### Nombre de mutations monoventes/monolignes ```{r} uniquesimple <- etape3 %>% group_by(id) %>% summarise(prix = max(prix), surface = max(surface), nb = n()) nbtransactionstimplemonoligne <-uniquesimple %>% filter(nb==1) length(unique(nbtransactionstimplemonoligne$id)) ``` ### Nombre de mutations monoventes/multilignes ```{r} (length(unique(etape3$id)))-(length(unique(nbtransactionstimplemonoligne$id))) ``` ### Diagnostic du nombre de biens par mutation ```{r} diaggroup <- nbunique %>% mutate(as.character(nb)) %>% group_by(nb) %>% summarise(tot = n()) ``` ### Nombre de biens et nombre moyen de biens pour les mutations multiventes ```{r} length(Mutationscomplexes$id) sum(Mutationscomplexes$nb) mean(Mutationscomplexes$nb) ``` --- ## 4.Suppression des doublons et des mutations multiventes ### Etape4> Sélections des mutations simples #### Regrouper les transactions selon l'ID, la surface et la vente ```{r} unique <- etape3 %>% distinct(id, prix, surface) nbunique <- unique %>% group_by(id) %>% summarise(nb = n()) ``` #### Suppression des doublons et des mutations multiventes ```{r} etape4 <- nbunique %>% filter(nb==1) ``` ### Etape5> Jointure attributaire pour récupérer les informations de la mutation ```{r} merge <- merge(etape4,etape3, by="id") etape5 <- merge %>% distinct(id, .keep_all = TRUE) %>% select(id, date, type, nature, codecommune, prix, surface, piece, latitude, longitude) ``` #### Modification des formats des colonnes ```{r} etape5$prix <- as.integer(etape5$prix) etape5$surface <- as.numeric(etape5$surface) etape5$piece <- as.numeric(etape5$piece) ``` --- ## 5.Suppression des valeurs aberrantes #### Fixer un seuil minimal des prix (percentile) ```{r} quantile(etape5$prix, 0.01) ``` #### Fixer un seuil maximal des prix (histogramme) ```{r} ggplot(etape5, aes(x=prix)) + geom_histogram(bins = 100) + xlim(10000,5000000) ``` #### Créer deux jeux de données (maisons / appartements) ```{r} Maisons <- etape5 %>% filter(type == 'Maison') Appartement <- etape5 %>% filter (type == 'Appartement') ``` #### Fixer un seuil maximal des surfaces (histogramme) ```{r} hist(Maisons$surface, nclass = 500, xlim = c(0,600)) hist(Appartement$surface, nclass = 500, xlim = c(0,300)) ``` ### Etape 6> Sélection des bornes de prix et de surface ```{r} etape6 <- etape5 %>% filter(between(prix, 15000, 5000000)) %>% filter(case_when(type=='Appartement' ~ between(surface, 10, 250)) | case_when(type=='Maison' ~ between(surface, 10, 500))) ``` --- ## Création du prix au m² et filtre des valeurs extrêmes et aberrantes ### Etape7> Création de la variable prix/m² ```{r} etape7 <- etape6 %>% mutate(prixm2 = prix/surface) etape7$prixm2 <- round(etape7$prixm2) ``` ### Etape8 > Sélection des bornes de prix au m² #### Fixer un seuil minimal des prix au m² (percentile) ```{r} quantile(etape7$prixm2, 0.01) ``` #### Fixer un seuil maximal des prix au m² (histogramme) ```{r} hist(etape7$prixm2, breaks = 1000, xlim = c(0,20000)) ``` #### Filtres des valeurs ```{r} etape8 <- etape7 %>% filter(between(prixm2,330,15000)) ``` #### Transformation de la date en année ```{r} etape8$date <- as.character(etape8$date) etape8 <- etape8 %>% mutate(ANNEE = substr(etape8$date, 1, 4)) ``` --- ## 6.Enrichissement des mutations avec de nouvelles variables ### Etape9 >Ajout de variables relatives à la commune et à l'EPCI (Liste des communes du Code Officiel Géographique) ```{r} COG <- read.csv("DATA/COG.csv", sep=";", stringsAsFactors=FALSE) COG <- COG %>% mutate(codecommune = CODGEO) etape9 <- merge(etape8, COG, "codecommune") ``` ### Etape10 >Ajout de variables relatives au département (Liste des départements du Code Officiel Géographique) ```{r} Dep <- read.csv("DATA/departement2020.csv", encoding="UTF-8", sep=";", stringsAsFactors=FALSE) Dep <- Dep %>% mutate(DEP = dep) etape10 <- merge(etape9, Dep, "DEP") ``` ### Etape11 > Structuration du jeu de données final ```{r} DVFOK <- etape10 %>% select(id, date, annee = ANNEE, type, prix, surface, prixm2, codecommune, commune = LIBGEO, Dep = nccenr, EPCI= LIBEPCI, latitude, longitude) ``` ### Ecrire le jeu de données final en csv ```{r , echo=TRUE} write.csv(DVFOK, 'Exports/DVFOK.csv', row.names = FALSE, fileEncoding = "UTF-8", quote = FALSE) ``` --- ## 7. Agrégations par commune ```{r} CommunesDVF <- DVFOK %>% group_by(codecommune) %>% summarise(Nbtransactions = n(), NBMaisons = length(type[type=="Maison"]),NBApparts = length(type[type=="Appartement"]), PrixMoyen = mean(prix), PrixM2moyen = mean(prixm2), NBMaisons = length(type[type=="Maison"]), SurfaceMoyenne = mean(surface)) ``` ### Ecrire le csv pour la jointure dans QGIS ```{r} write.csv(CommunesDVF, file = "Exports/CommunesDVF.csv") ``` --- ## 8. Filtres pour les ventes de Bretagne ```{r} DVFBZH <- DVFOK %>% filter(grepl("^22", codecommune)| grepl("^29", codecommune) | grepl("^35", codecommune) | grepl("^56", codecommune)) ``` ### Ecrire le csv pour la jointure dans QGIS ```{r} write.csv(DVFBZH, "Exports/DVFBZH.csv") ```