# Cartographier l'évolution des prix de l'immobilier résidentiel avec R L'objectif de cette séance est de mobiliser différents **packages de R** pour cartographier à partir des **données DVF** l'évolution dans le temps des prix au m² des ventes d'appartements et de maisons de l'aire urbaine de Nantes (2014-2019). Cette séance revient à la fois sur la **préparation de données** (filtre, agrégation, calcul d'indicateurs, restructuration) et la réalisation de **cartes thématiques** dans l'environnement R. ![](https://i.imgur.com/zgy8ECb.png) ## Données & Packages ### Données --- * Transactions DVF issues de la base ["Demandes de valeurs foncières géolocalisées"](https://www.data.gouv.fr/fr/datasets/5cc1b94a634f4165e96436c1/) produite par Etalab > Attention les données DVF utilisées ici sont préparées en amont (séance précédente) * Contours des IRIS/communes (IGN) > Attention il n'existe pas de fichier de contours IRIS/communes pour l'aire urbaine de Nantes, il faut en amont préparer ce jeu de données géographique en mobilisant des données IGN et de l'INSEE ### Packages --- **Tidyverse** pour la manipulation et la restructuration des données https://www.tidyverse.org/ ``` library(tidyverse) ``` **SF** pour la manipulation de données spatiales (importation de shapefile, reprojection, jointures spatiales) https://r-spatial.github.io/sf/ ``` library(sf) ``` **Cartography** pour la cartographie thématique https://rcarto.github.io/carto_avec_r/chapitre2.html ``` library(cartography) ``` ## Cartographier les prix de l'immobilier et autre indicateurs pour toute la période (2014-2019) ### Importer les transactions 1. Importer le shapefile dans R ``` Transactions <- st_read(dsn = "C:/Users/Xo/Desktop/DVF_NANTES/Transactions_44.shp", stringsAsFactors = FALSE) ``` 2. Visualiser les transactions selon le code de la commune ``` plot(Transactions["codecommun"]) ``` ![](https://i.imgur.com/Xp90z8N.png) ### Importer les contours des IRIS/communes 1. Importer le shapefile dans R ``` IRIS <- st_read(dsn = "C:/Users/Xo/Desktop/DVF_NANTES/IRISOK.shp", stringsAsFactors = FALSE) ``` 2. Visualiser les transactions selon le nom de l'IRIS ``` plot(IRIS["nom_iris"]) ``` ![](https://i.imgur.com/12YTUY9.png) ### Reprojeter les contours des IRIS/communes 1. Verifier les SCR des deux couches ``` st_crs(Transactions) ``` ``` st_crs(IRIS) ``` > La couche *Transactions* en 2154 et *IRIS* en 4326 > Il faut donc reprojeter la couche IRIS en 2154 ``` IRIS<- st_transform(IRIS, 2154) ``` Verifier à nouveau son SCR ### Enrichir la couche des transactions par un identifiant géographique Il s'agit ici d'ajouter à la couche Transactions le code IRIS dans lequel elles se situent par **jointure spatiale** ``` TransactionsIRIS <- st_join(Transactions, IRIS["code_iris"]) ``` Vérifier que la jointure a bien fonctionner en affichant les transactions en fonction du code IRIS ``` plot(TransactionsIRIS["code_iris"]) ``` ![](https://i.imgur.com/eLB4v7k.png) ### Réaliser l'agrégation globale des informations sur les ventes Calculer : * Le nombre total de transactions * Le prix moyen des biens vendus * La surface moyenne * Le prix moyen au m² ``` Transactionsglobale <- TransactionsIRIS %>% group_by(code_iris) %>% summarise(Nb_Transactions = n(), Prix_moyen= (mean(PrixOK)), Surface_Moyenne = (mean(SurfaceOK)), PrixM2_moyen = (mean(PrixM2OK))) ``` ![](https://i.imgur.com/qayLg9R.png) Petites vérifications ![](https://i.imgur.com/AVQ5Gnv.png) ### Rapatrier ces nouveaux indicateurs au sein de la couche des contours des IRIS/communes ``` IRISGlobal <- st_join(IRIS,Transactionsglobale) ``` Visualiser le résultat (ici les prix au m²) ``` plot(IRISGlobal["PrixM2_moyen"]) ``` ![](https://i.imgur.com/9NSFT7A.png) ### Cartographier les indicateurs avec le package *cartography* ![](https://i.imgur.com/t1FDbRt.png) http://riatelab.github.io/cartography/vignettes/cheatsheet/cartography_cheatsheet.pdf ### Cartographie du prix moyen au m² pour toute la période Nous allons ici cartographier le prix moyen au m2 de la couche IRISGlobal sous forme de carte choroplèthe ``` choroLayer( x = IRISGlobal, var = "PrixM2_moyen", breaks = c(1000, 1500, 2000, 2500, 3000, 3500), col = c("#F1B1B4", "#E3898E", "#D35E63", "#BD2D33", "#7E1512"), legend.title.txt = "Prix moyen/m² (euros)") title(main = "Prix moyen au m² par IRIS/communes (2014-2019)") ``` ![](https://i.imgur.com/ZrtNhPk.png) **Changer les couleurs** en utilisant le site [ColorBrewer](https://colorbrewer2.org) ``` choroLayer( x = IRISGlobal, var = "PrixM2_moyen", breaks = c(1000, 1500, 2000, 2500, 3000, 3500), col = c("#1a9641", "#a6d96a", "#ffffbf", "#fdae61", "#d7191c"), legend.title.txt = "Prix moyen/m² (euros)") title(main = "Prix moyen au m² par IRIS/communes (2014-2019)") ``` ![](https://i.imgur.com/Kj3KiqT.png) **Ajouter les élements constitutifs de la carte** ``` choroLayer( x = IRISGlobal, var = "PrixM2_moyen", breaks = c(1000, 1500, 2000, 2500, 3000, 3500), col = c("#1a9641", "#a6d96a", "#ffffbf", "#fdae61", "#d7191c"), legend.title.txt = "Prix moyen/m² (euros)") north(pos = "topright") barscale(size = 10) layoutLayer( title= "Prix moyen au m² par IRIS/communes (2014-2019)", frame = FALSE, sources = "DGFiP") ``` **Rencentrer l'image par rapport à la carte** ``` par(mar=c(0,0,1.2,0)) ``` ![](https://i.imgur.com/C7vh6iV.png) ### Cartographie de trois variables ``` par(mar=c(0,0,1.2,0)) par(mfrow=c(1,3)) choroLayer( x = IRISGlobal, var = "PrixM2_moyen", breaks = c(1000, 1500, 2000, 2500, 3000, 3500), col = c("#1a9641", "#a6d96a", "#ffffbf", "#fdae61", "#d7191c"), legend.title.txt = "Prix moyen/m² (euros)") title(main = "Prix moyen au m²") choroLayer( x = IRISGlobal, var = "Prix_moyen", breaks = c(50000, 100000, 150000, 200000, 250000, 400000), col = c("#1a9641", "#a6d96a", "#ffffbf", "#fdae61", "#d7191c"), legend.title.txt = "Prix moyen (euros)") title(main = "Prix moyen des biens") choroLayer( x = IRISGlobal, var = "Surface_Moyenne", breaks = c(40, 60, 80, 100, 120, 140), col = c("#1a9641", "#a6d96a", "#ffffbf", "#fdae61", "#d7191c"), legend.title.txt = "Surface moyenne (m²)") title(main = "Surface moyenne des biens") ``` ![](https://i.imgur.com/8Hi21Ol.png) --- ## Cartographie du prix moyen au m² pour chaque année ### Réaliser les agrégations selon l'année Calculer : * Le nombre total de transactions * Le prix moyen des biens vendus * La surface moyenne * Le prix moyen au m² **mais cette fois par année !** ``` Transactionsannees <- TransactionsIRIS %>% group_by(code_iris, annee) %>% summarise(Nb_Transactions = n(), Prix_moyen= (mean(PrixOK)), Surface_Moyenne = (mean(SurfaceOK)), PrixM2_moyen = (mean(PrixM2OK))) ``` ![](https://i.imgur.com/GRx9zO8.png) Petites vérifications ![](https://i.imgur.com/zTO1wF8.png) ### Changement de structuration de la table Afin de pouvoir cartographier automatiquement la variable de prix moyen au m² par année, il faut modifier la structuration de la table en passant d'une modélisation de **lignes en colonnes** aussi nommé ***Long > Wide*** ![](https://i.imgur.com/6RK79KK.png) On va utiliser ici la fonction `spread` ``` TransactionsAnnesColonnes <- Transactionsannees %>% spread(key= annee, value = PrixM2_moyen) ``` ![](https://i.imgur.com/z5KZAJt.png) > Problème : la ventilation s'opére sur toutes les variables... on va donc en amont du changement de structuration faire une sélection de la variable qui nous intéresse à savoir le prix moyen au m² > ``` Prixm2annes <- Transactionsannees %>% select(code_iris, annee, PrixM2_moyen) ``` On refait un changement de structure (passage ligne>colonnes) ``` PrixM2anneescolonne <- Prixm2annes %>% spread(key= annee, value = PrixM2_moyen) ``` Cela ne fonctionne toujours pas car nous manipulons un objet de type *SF* et non un *dataframe*, du coup ka colonne *geometry* est toujours présente et gêne la transformation de la table. Il suffit de transformer la table en `dataframe` ``` Prixm2annes <- as.data.frame(Transactionsannees)%>% select(code_iris, annee, PrixM2_moyen) ``` On refait finalement un changement de structure (passage ligne>colonnes) ``` PrixM2anneescolonne <- Prixm2annes %>% spread(key= annee, value = PrixM2_moyen) ``` ![](https://i.imgur.com/NQi2bts.png) ### Rapatrier ces nouveaux indicateurs au sein de la couche des contours des IRIS/communes ``` IRISPrixm2Annee <- merge (IRIS,PrixM2anneescolonne, by= "code_iris") ``` Visualiser le résultat pour une année (ici les prix au m²) ``` plot(IRISPrixm2Annee["2014"]) ``` **-> Produire une planche avec une carte du prix moyen au m² pour chacune des 6 années** ![](https://i.imgur.com/FvDYsjM.png) ``` par(mar=c(0,0,0.9,0)) par(mfrow=c(2,3)) choroLayer( x = IRISPrixm2Annee, var = "2014", breaks = c(1154, 1800, 2300, 2500, 2800, 3787), col = c("#1a9641", "#a6d96a", "#ffffbf", "#fdae61", "#d7191c"), legend.title.txt = "Prix moyen/m² (euros)") barscale(size = 5) title(main = "2014") choroLayer( x = IRISPrixm2Annee, var = "2015", breaks = c(1171, 1800, 2300, 2500, 2800, 3969), col = c("#1a9641", "#a6d96a", "#ffffbf", "#fdae61", "#d7191c"), legend.title.txt = "Prix moyen/m² (euros)") barscale(size = 5) title(main = "2015") choroLayer( x = IRISPrixm2Annee, var = "2016", breaks = c(665, 1800, 2300, 2500, 2800, 4914), col = c("#1a9641", "#a6d96a", "#ffffbf", "#fdae61", "#d7191c"), legend.title.txt = "Prix moyen/m² (euros)") barscale(size = 5) title(main = "2016") choroLayer( x = IRISPrixm2Annee, var = "2017", breaks = c(1069, 1800, 2300, 2500, 2800, 4301), col = c("#1a9641", "#a6d96a", "#ffffbf", "#fdae61", "#d7191c"), legend.title.txt = "Prix moyen/m² (euros)") barscale(size = 5) title(main = "2017") choroLayer( x = IRISPrixm2Annee, var = "2018", breaks = c(1231, 1800, 2300, 2500, 2800, 4073), col = c("#1a9641", "#a6d96a", "#ffffbf", "#fdae61", "#d7191c"), legend.title.txt = "Prix moyen/m² (euros)") barscale(size = 5) title(main = "2018") choroLayer( x = IRISPrixm2Annee, var = "2019", breaks = c(1367, 1800, 2300, 2500, 2800, 6364), col = c("#1a9641", "#a6d96a", "#ffffbf", "#fdae61", "#d7191c"), legend.title.txt = "Prix moyen/m² (euros)") barscale(size = 5) title(main = "2019") ```