Le but de cet exercice va être d'exploiter les données DVF sur les transactions immobilières dans l'ancien et la carte des quartiers de Nantes pour obtenir des indicateurs des transactions de logements par quartier.
On va utiliser pour DVF l'API mise en place par Christian Quest : http://api.cquest.org/dvf.
## Activation des packages library(httr) library(jsonlite) library(sf) library(tidyverse) get_dvf <- GET("http://api.cquest.org/dvf?code_commune=44109") dvf_content <- content(get_dvf, "text", encoding = "UTF-8") dvf_json <- fromJSON(dvf_content)$resultats %>% # On ne garde que les données avec une géolocalisation valide, un prix et une surface renseignés. filter(!is.na(lon), !is.na(lat), !is.na(valeur_fonciere), !is.na(surface_relle_bati)) dvf <- st_as_sf(dvf_json, coords = c("lon", "lat"), crs = 4326)
## Activation des packages library(tidyverse) library(httr) library(jsonlite) library(sf) get_dvf <- GET("http://api.cquest.org/dvf?code_commune=44109") dvf_content <- content(get_dvf, "text", encoding = "UTF-8") dvf_json <- fromJSON(dvf_content)$resultats %>% # On ne garde que les données avec une géolocalisation valide, un prix et une surface renseignés. filter(!is.na(lon), !is.na(lat), !is.na(valeur_fonciere), !is.na(surface_relle_bati)) dvf <- st_as_sf(dvf_json, coords = c("lon", "lat"), crs = 4326)
library(tidyverse) library(httr) library(jsonlite) library(sf) load(system.file("extdata", "dvf.RData", package = "savoirfR"))
quartier_nantes <- st_read("https://data.nantesmetropole.fr/explore/dataset/244400404_quartiers-communes-nantes-metropole/download/?format=geojson&disjunctive.libcom=true&refine.libcom=Nantes&timezone=Europe/Berlin&lang=fr") quartier_nantes <- st_set_crs(quartier_nantes, 4326)
quartier_nantes <- st_read("https://data.nantesmetropole.fr/explore/dataset/244400404_quartiers-communes-nantes-metropole/download/?format=geojson&disjunctive.libcom=true&refine.libcom=Nantes&timezone=Europe/Berlin&lang=fr") quartier_nantes <- st_set_crs(quartier_nantes, 4326)
load(system.file("extdata", "quartier_nantes.RData", package = "savoirfR"))
On veut produire les infos suivantes par quartier et année pour les ventes de logements (maisons et d'appartements) :
# Jointure spatiale pour récupérer les ventes par quartiers ---- dvf_avec_quartier <- st_join(dvf, quartier_nantes %>% select(nom)) %>% rename(quartier = nom)
# Calcul indicateurs---- library(lubridate) dvf_filtre <- dvf_avec_quartier %>% st_drop_geometry() %>% filter( nature_mutation == "Vente", type_local %in% c("Appartement", "Maison") ) %>% mutate( date_mutation = ymd(date_mutation), annee_mutation = year(date_mutation), nb_ventes = 1 ) # Calculs volumes, surfaces, prix totaux par quartier, par type de bien et par année stat1 <- dvf_filtre %>% group_by(quartier, type_local, annee_mutation) %>% summarise(across(c(nb_ventes, valeur_fonciere, surface_relle_bati), sum, na.rm = TRUE), .groups = "drop") # Calculs volumes, surfaces, prix totaux par quartier et par année, ensemble maisons + appartements stat2 <- dvf_filtre %>% group_by(quartier, annee_mutation) %>% summarise(across(c(nb_ventes, valeur_fonciere, surface_relle_bati), sum, na.rm = TRUE), .groups = "drop") %>% mutate(type_local = "Ensemble") stat <- bind_rows(stat1, stat2)
Résultat attendu :
# Calcul volume des ventes indicateurs1 <- stat %>% filter(type_local == "Ensemble") %>% select(quartier, annee_mutation, nb_ventes) # Calcul pourcentage de maison dans les ventes indicateurs2 <- stat %>% select(quartier, annee_mutation, type_local, nb_ventes) %>% pivot_wider(names_from = type_local, values_from = nb_ventes, values_fill = 0) %>% mutate(pourcentage_maison = 100 * Maison / Ensemble) %>% select(quartier, annee_mutation, pourcentage_maison) # Calcul des prix au m2 indicateurs3 <- stat %>% select(quartier, annee_mutation, type_local, valeur_fonciere, surface_relle_bati) %>% mutate(prix_m2 = valeur_fonciere / surface_relle_bati) %>% select(quartier, annee_mutation, type_local, prix_m2) %>% pivot_wider(names_from = type_local, values_from = prix_m2) %>% rename_with(.cols = c(Appartement, Maison, Ensemble), .fn = ~paste0("prix_m2_", tolower(.x))) # Assemblage des tables d'indicateurs indicateurs <- reduce(list(indicateurs1, indicateurs2, indicateurs3), left_join) # Réintroduction géométries indicateurs <- quartier_nantes %>% select(quartier = nom) %>% left_join(indicateurs) indicateurs %>% glimpse()
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.