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