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()


MTES-MCT/parcours_r_exercices documentation built on Dec. 3, 2024, 1:29 p.m.