Precio vivienda Valencia

VIVIENDA
VALENCIA
PRECIO
ECONOMÍA
Autor/a
Afiliación

Universitat de València

Fecha de publicación

10 de mayo de 2024

Input

El Ayuntamiento de Valencia pone a su disposición un portal de datos abiertos que persigue que determinada información esté disponible de forma libre a todo el mundo, sin restricciones de copyright, patentes u otros mecanismos de control.

Dentro del bloque de Economía existe la posibilidad de obtener datos sobre el precio de compra de vivienda en Valencia descrito en la web como: “Precio medio de la vivienda a la venta en €/m2 por barrio de la ciudad de Valencia, según el portal de compraventa Fotocasa”.

Estos datos están disponibles para su descarga en formato CSV, GeoJSON y SHP.

En este caso, hemos utilizado el fichero SHP.

Descripcion

Cargamos las librerías necesarias:

Leemos los datos:

datos<-st_read("data/precio-de-compra-en-fotocasa/precio-de-compra-en-fotocasa.shp")
Reading layer `precio-de-compra-en-fotocasa' from data source 
  `C:\Users\Virgilio\OneDrive - Universitat de València\01 PROFESOR\06 Innovación Educativa\2023 2024\03 Web\datasets\data\precio-de-compra-en-fotocasa\precio-de-compra-en-fotocasa.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 88 features and 10 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -0.432535 ymin: 39.27893 xmax: -0.2753685 ymax: 39.56659
Geodetic CRS:  WGS 84

Se trata de un objeto sf con 88 observaciones y 11 variables:

class(datos)
[1] "sf"         "data.frame"
dim(datos)
[1] 88 11

Si echamos un vistazo a los datos identificamos algunos inconvenientes. En primer lugar, tenemos hasta 18 observaciones con NA’s en nuestra variable de interés. En segundo lugar, los precios registrados corresponden al año 2022, lo que resulta algo desfasado para un posible análisis actual del mercado inmobiliario. Por último, los nombres de algunos barrios aparecen incompletos y con errores.

Tratamiento

Para dar una solución a este problema vamos a obtener datos actualizados del precio medio de la vivienda por barrios en la ciudad de Valencia a través del portal Fotocasa.

El paquete rvest nos permite extraer información de una página web usando R.

El siguiente código obtiene, a partir de los distritos de Valencia, los nombres de los barrios y el precio de compra en €/m2 de cada uno de ellos, añadiendo dicha información a un nuevo data frame.

distritos <- c("ciutat-vella", "l-eixample", "extramurs", "campanar", 
                       "la-saidia", "el-pla-del-real", "l-olivereta", "patraix", 
                       "jesus", "quatre-carreres", "poblats-maritims", "camins-al-grau", 
                       "algiros", "benimaclet", "rascanya", "benicalap", 
                       "pobles-del-nord", "pobles-de-l-oest", "pobles-del-sud")

new_data = data.frame()

coddistrit=0

for (distrito in distritos) {
  
 link=paste0("https://www.fotocasa.es/indice-precio-vivienda/valencia-capital/",distrito) 
 
 page=read_html(link)
 
 coddistrit=coddistrit+1
 
 nombre= page%>%html_nodes(".table-price_left td:nth-child(1)")%>%html_text()
 
 precio_m2=page%>%html_nodes(".table-price_left td:nth-child(2)")%>%html_text()
 
 new_data = rbind(new_data, data.frame(coddistrit,nombre,precio_m2,stringsAsFactors = FALSE))
}

Con esto, hemos generado nuestro nuevo conjunto de datos. Podemos juntarlo con el original, en el que disponemos de la geometría de los barrios de Valencia.

Al hacer esto, nos encontramos con un problema y es que, el nexo de unión de ambas tablas, el nombre de los barrios, no sigue la misma nomenclatura.

El paquete fuzzyjoin permite solucionar este problema mediante la unión a partir del cálculo de distancias entre cadenas de texto, aunque es conveniente realizar previamente algunos ajustes.

En primer lugar, uno de los barrios que hemos recopilado en Fotocasa son realmente dos, por tanto, arreglamos esto. Por otra parte, hay dos zonas obtenidas que no son considerados barrios de Valencia, así que quitamos estas observaciones.

Eliminamos algunas expresiones y transformamos el texto del nombre de los barrios a minúscula en ambas bases de datos para que sean lo más parecidas entre sí y poder facilitar la unión.

new_data$nombre[79]<-"Mauella-Tauladella"

new_data[nrow(new_data) + 1, ] <- list(17, "Rafalell-Vistabella", "2.826 €/m²")

new_data$nombre[62]<-"La Vega Baixa - Plaza Xúquer"

new_data <- subset(new_data, !(nombre %in% c("Nou Benicalap", "Nou Campanar")))

datos$barrios <- gsub("^(EL|LA|LES)", "", datos$barrio )

datos$barrios <- tolower(gsub("[^a-zA-Z0-9]", "", datos$barrios ))

new_data$barrios <- gsub("^(Barrio de|El|La|Les)", "", new_data$nombre)

new_data$barrios <- tolower(gsub("[^a-zA-Z0-9]", "", new_data$barrios))

Aplicamos la función del paquete mencionado y unimos ambas tablas.

precio_vivienda_vlc <- stringdist_inner_join(new_data, datos, by = "barrios", method = "jw", max_dist =0.26)%>%
filter(coddistrit.x == coddistrit.y)

Quitamos unas observaciones que se han duplicado tras la unión y nos quedamos con las variables que nos interesan.

precio_vivienda_vlc<-precio_vivienda_vlc[-c(67,73),c(2,3,16)]

Damos un formato adecuado a la variable de interés.

precio_vivienda_vlc$precio_m2 <- as.numeric(gsub("[^0-9]", "", precio_vivienda_vlc$precio_m2))

Transformamos nuestros datos en un objeto espacial.

precio_vivienda_vlc<-st_as_sf(precio_vivienda_vlc)

Output

Hemos obtenido un nuevo objeto sf, con 88 observaciones y 3 variables.

class(precio_vivienda_vlc)
[1] "sf"         "data.frame"
dim(precio_vivienda_vlc)
[1] 88  3

En la siguiente figura podemos observar un mapa interactivo con los precios de la vivienda en Valencia por barrios.

colours_red<-colorNumeric(palette = "Reds",domain = NULL)


leaflet(data = precio_vivienda_vlc) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(
    fillColor = ~colours_red(precio_m2),
    fillOpacity = 0.5,
    color = "black",
    stroke = TRUE,
    weight = 0.5,
    label = ~paste("Barrio: ", nombre,",  ", "Precio por m2:", precio_m2, "€/m2"),
    labelOptions = labelOptions(
      style = list("font-weight" = "normal", padding = "3px 8px"),
      textsize = "15px",
      direction = "auto"
    )
  ) %>%
  addLegend(pal = colours_red,values = ~precio_m2 , title = "Precio por m2")

El fichero generado con el procedimiento descrito anteriormente se puede descargar, en formato GeoPackage (gpkg), de aquí.



Proyecto de Innovación Educativa Emergente (PIEE-2737007)