---
title: "Préparation DVF"
author: "Boris Mericskay"
date: "02/07/2021"
output: html_document
---
---
# 1- PRÉPARATION DES DONNÉES DVF OPENDATA
---
Cette première partie du script a comme objectif de préparer les données DVF en opendata avant de commencer les analyses (nettoyage, filtrage, agrégation,...).
Seul le package `tidyverse` dédié à la manipulation de données est nécessaire.
```{r cars}
library(tidyverse)
```
Définition de l'environnement de travail
```{r setup}
knitr::opts_knit$set(root.dir = 'D:/DVF/BZH')
```
---
### IMPORT DATASET
```{r cars}
DVF <- read.csv("DATA/Databrutes/importfichier.csv", encoding="UTF-8", stringsAsFactors=FALSE)
```
---
## Filtre et nettoyage des données
### Etape1> Sélection des mutations de type "Ventes" de "Maison" et "Appartement'
```{r cars}
etape1 <- DVF %>% filter(nature_mutation == "Vente")
etape1bis <- etape1 %>% filter(type_local == "Maison" | type_local == "Appartement")
```
### Etape2> Sélection et renommage des variables
```{r cars}
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 cars}
etape2[etape2==""] <- NA
etape3 <- etape2 %>% na.omit()
```
---
## 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 cars}
unique <- etape3 %>% distinct(id, prix, surface)
nbunique <- unique %>% group_by(id) %>% summarise(nb = n())
```
#### Suppression des doublons et des mutations multiventes
```{r cars}
etape4 <- nbunique %>% filter(nb==1)
```
### Etape5> Jointure attributaire pour récupérer les informations de la mutation
```{r cars}
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 cars}
etape5$prix <- as.numeric(etape5$prix)
etape5$surface <- as.numeric(etape5$surface)
etape5$piece <- as.numeric(etape5$piece)
```
---
## Suppression des valeurs aberrantes
#### Fixer un seuil minimal des prix (percentile)
```{r cars}
quantile(etape5$prix, 0.01)
```
#### Fixer un seuil maximal des prix (histogramme)
```{r cars}
hist(etape5$prix, breaks = 200, xlim = c(15000,10000000))
```
#### Créer deux jeux de données (maisons / appartements)
```{r cars}
Maisons <- etape5 %>% filter(type == 'Maison')
Appartement <- etape5 %>% filter (type == 'Appartement')
```
#### Fixer un seuil maximal des surfaces (histogramme)
```{r cars}
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 cars}
etape6 <- etape5 %>% filter(between(prix, 15000, 5000000)) %>%
filter(case_when(type=='Appartement' ~ between(surface, 10, 200)) |
case_when(type=='Maison' ~ between(surface, 10, 350)))
```
---
## Création du prix au m² et filtre des valeurs extrêmes et aberrantes
### Etape7> Création de la variable prix/m²
```{r cars}
etape7 <- etape6 %>% mutate(prixm2 = prix/surface)
```
### Etape8 > Sélection des bornes de prix au m²
#### Fixer un seuil minimal des prix au m² (percentile)
```{r cars}
quantile(etape7$prixm2, 0.01)
```
#### Fixer un seuil maximal des prix au m² (histogramme)
```{r cars}
hist(etape7$prixm2, breaks = 1000, xlim = c(0,10000))
```
#### Filtres des valeurs
```{r cars}
etape8 <- etape7 %>% filter(between(prixm2,330,8000))
```
#### Transformation de la date en année
```{r cars}
etape8$date <- as.character(etape8$date)
etape8 <- etape8 %>% mutate(ANNEE = substr(etape8$date, 1, 4))
```
#### Arrondir les variables numériques
```{r cars}
etape8$prix <- round(etape8$prix)
etape8$prixm2 <- round(etape8$prixm2)
```
---
## 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 cars}
COG <- read.csv("DATA/COGbis.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 cars}
Dep <- read.csv("DATA/departement2020.csv", encoding="UTF-8", sep=";", stringsAsFactors=FALSE)
Dep <- Dep %>% mutate(DEP = dep)
etape10 <- merge(etape9, Dep, "DEP")
```
### Etape11 >Ajout de la typologie des communes de l'INSEE
```{r cars}
TYPOINSEE <- read.csv("DATA/TYPOINSEE.csv", sep=";", stringsAsFactors=FALSE)
TYPOINSEE <- TYPOINSEE %>% mutate(codecommune = Code)
etape11 <- merge(etape10, TYPOINSEE, 'codecommune')
```
### Etape12 > Structuration du jeu de données final
```{r cars}
DVFOK <- etape11 %>% select(id, date, annee = ANNEE, type, prix, surface, prixm2, codecommune, commune = LIBGEO, Dep = nccenr, EPCI= LIBEPCI, Typo_INSEE = typo, latitude, longitude)
```
### Ecrire le jeu de données final en csv
```{r cars}
write.csv(DVFOK, 'Exports/DVFOK.csv')
```
---
## Diagnostic des types de mutations
### Nombre de mutations
```{r cars}
length(unique(etape3$id))
```
### Nombre de mutations multiventes
```{r cars}
Mutationscomplexes <- nbunique %>% filter(nb>1)
length(unique(Mutationscomplexes$id))
```
### Nombre de mutations monoventes/monolignes
```{r cars}
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 cars}
(length(unique(etape3$id)))-(length(unique(nbtransactionstimplemonoligne$id)))
```
### Diagnostic du nombre de biens par mutation
```{r cars}
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 cars}
length(Mutationscomplexes$id)
sum(Mutationscomplexes$nb)
mean(Mutationscomplexes$nb)
```
---
# 2- Indicateur génériques et visualisation de données
---
## Tableau récapitulatif des indicateurs génériques
```{r cars}
recap <- DVFOK %>% group_by(type) %>% summarise(tot = n (), prixmed = median(prix), prixmoy = mean(prix), surfmed = median(surface), surfmoy = mean(surface), prixm2med = median(prixm2), prixm2moy = mean(prixm2))
recap <- recap %>% mutate(part = (tot/sum(tot)*100))
```
## Visualisation de données avec ggplot2
---
### Récapitulatif des ventes par département
```{r cars}
recapdep <- DVFOK %>% group_by(Dep, type) %>% summarise(nb= n())
ggplot(recapdep, aes(x=Dep, y=nb, fill=type)) +
geom_bar(position = 'stack', stat='identity') +
xlab("") + ylab("Nombre de mutations") +
geom_text(aes(label=nb), color="black", size=4, position = position_stack(vjust = 0.5))+
theme_bw()
```
### Recapitulatif des ventes par TypoINSEE
```{r cars}
recapinsee <- DVFOK %>% group_by(Typo_INSEE, type) %>% summarise(nb= n())
ggplot(recapinsee, aes(x=Typo_INSEE, y=nb, fill=type)) +
geom_bar(position = 'stack', stat='identity') +
geom_text(aes(label=nb), color="black", size=4, position = position_stack(vjust = 0.5))+
xlab("") + ylab("Nombre de mutations") +
theme_bw()
```
###Histogramme des prix au m2 par Departement
```{r cars}
RecapPrixDep <- DVFOK %>% group_by(Dep, type) %>% mutate(moydeptype = mean(prixm2))
RecapPrixDep$ moydeptype <- round(RecapPrixDep$moydeptype)
ggplot(RecapPrixDep, aes(x=prixm2, fill= type)) +
geom_histogram(position = "identity", color = "white") +
theme_bw() +
theme(strip.text = element_text(face = "bold")) +
geom_vline(aes(xintercept=moydeptype),color="black", linetype="longdash", size=0.75) +
xlab("Prix au m2") + ylab("Effectifs") +
geom_text(y = 5500, aes(x = moydeptype, label = moydeptype), size = 3, hjust = -.3) +
facet_grid(type~Dep)
```
### Histogramme des prix m2 par TypoINSEE
```{r cars}
RecapPrixTypoINSEE <- DVFOK %>% group_by(Typo_INSEE, type) %>% mutate(moyeinseetype = mean(prixm2))
RecapPrixTypoINSEE$ moyeinseetype <- round(RecapPrixTypoINSEE$moyeinseetype)
ggplot(RecapPrixTypoINSEE, aes(x=prixm2, fill= type)) +
theme_bw() +
theme(strip.text = element_text(face = "bold")) +
geom_histogram(position = "identity", color = "white") +
geom_vline(aes(xintercept=moyeinseetype),color="black", linetype="longdash", size=0.75) +
xlab("Prix au m2") + ylab("Effectifs") +
geom_text(y = 5000, aes(x = moyeinseetype, label = moyeinseetype), size = 3, hjust = -.1) +
facet_grid(type~Typo_INSEE)
```
### Evolution du nombre de mutations par années et par département
```{r cars}
evoldvfdep <- DVFOK %>% group_by(annee, Dep, type) %>% summarise(nb = n())
View(evoldvfdep)
ggplot(data=evoldvfdep, aes(x=annee, y=nb, fill=type)) +
geom_bar(stat="identity") +
xlab("Année") + ylab("Nb de mutations") +
theme_bw() +
theme(strip.text = element_text(face = "bold")) +
facet_wrap(~Dep, nrow = 1)
```
### Evolutiondu nombre de mutations par années et par type de commune
```{r cars}
evoldvfINSEE <- DVFOK %>% group_by(annee, Typo_INSEE, type) %>% summarise(nb = n())
ggplot(data=evoldvfINSEE, aes(x=annee, y=nb, fill=type)) +
geom_bar(stat="identity") +
xlab("Année") + ylab("Nb de mutations") +
theme_bw() +
theme(strip.text = element_text(face = "bold")) +
facet_wrap(~Typo_INSEE, nrow = 1)
```
### Evolution des prix au m2 par département
```{r cars}
DVFOK$annee <- as.numeric(DVFOK$annee)
EvolPrixDep <- DVFOK %>% group_by(annee, Dep, type) %>% summarise(prix_m2 = mean(prixm2))
ggplot(data=EvolPrixDep, aes(x=annee, y=prix_m2, color=type)) +
geom_line(stat="identity", size= 1)+
geom_point(stat="identity", size= 2)+
scale_y_continuous(breaks=c(1500, 1700,1900, 2100, 2300, 2500, 2700)) +
theme_bw() +
theme(strip.text = element_text(face = "bold")) +
xlab("") + ylab("Prix moyen au m²") +
facet_wrap(~Dep, nrow = 1)
```
### Evolution des prix au m2 par type de comumune INSEE
```{r cars}
EvolPrixINSEE <- DVFOK %>% group_by(annee, Typo_INSEE, type) %>% summarise(prix_m2 = mean(prixm2))
ggplot(data=EvolPrixINSEE, aes(x=annee, y=prix_m2, color=type)) +
geom_line(stat="identity", size= 1)+
geom_point(stat="identity", size= 2)+
scale_y_continuous(breaks=c(1500, 1700,1900, 2100, 2300, 2500, 2700)) +
theme_bw() +
theme(strip.text = element_text(face = "bold")) +
xlab("") + ylab("Prix moyen au m²") +
facet_wrap(~Typo_INSEE, nrow = 1)
```
### BoxPlot des Prix par type de bien, type de commune et département
```{r cars}
DVFOK$Typo_INSEE <- factor(DVFOK$Typo_INSEE ,levels = c("Espace rural", "Couronne périurbaine", "Pôle urbain"))
ggplot(data = DVFOK, aes(x = Typo_INSEE, y = prix, color = type)) +
geom_boxplot(notchwidth = 0.5) +
ylim(0,200000)+
facet_grid(type~Dep) +
labs(x= "Type de commune", y= "Prix") +
theme_bw() +
theme(strip.text = element_text(face = "bold") ,axis.text.x = element_text(angle = 45, hjust = 1))
```