libs <- c("rio", "dplyr", "sf","leaflet", "leaflet.extras", "gt")
installed_libs <- libs %in% rownames(installed.packages())
if (any(installed_libs == F)) {install.packages(libs[!installed_libs])}
invisible(lapply(libs, library, character.only = T))
rm(libs, installed_libs)
Precios de Compra y Alquiler de vivienda en los barrios de Valencia
Input
En el catálogo de datos del Portal de Datos Abiertos del Ayuntamiento de Valencia se ofrecen datos geoespaciales agrupados por diferentes categorías como economía, medio ambiente, salud, transportes, deportes y muchas otras mas. Dentro del tema urbanismo e infraestructuras y economía nos encontramos diferentes conjuntos de datos como la localización de las viviendas de protección pública (VPP), las manzanas de edificios del término municipal de Valencia o la ubicación de las bocas de metro y EMT.
En concreto, nos centramos en el precio de compra y alquiler por metro cuadrado en el municipio de Valencia en el portal Idealista.
Otra información relevante para ambos conjuntos de datos:
Publicador: Ayuntamiento de València
Atribuciones: Cátedra de Gobernanza de la ciudad de València, Idealista, Servici de Participació Ciutadana i Govern Obert
Fecha modificación: 28 de marzo de 2023 8:45
Por un lado, el conjunto de datos de los precios de compra está disponible para su descarga en formato CSV, JSON, Excel, GeoJSON y Shapefile. En este caso, nos quedaremos con el fichero Shapefile pues necesitamos los polígonos correspondientes a los límites de los barrios de Valencia.
Por otro lado, el conjunto de datos de los precios de alquiler se encuentra disponible en los siguientes formatos: CSV, JSON, Excel. Se ha seleccionado el archivo CSV para proceder a su descarga.
Descripción
Para poder comprender los pasos seguidos en el tratamiento y la manipulación previa de los datos es esencial saber el contexto en el cual han sido utilizados estos datos.
Los conjuntos de datos han sido seleccionados para hacer un análisis de autocorrelación espacial con datos regionales. Así pues, la elección de este conjunto de datos responde a la necesidad de comprender si los precios de las propiedades en barrios cercanos son más similares entre sí que los de barrios más distantes. Además, se desea observar si el mercado del alquiler y el mercado de la compra se distribuyen de la misma manera o siguen patrones diferentes.
Para poder utilizar los datos nos ponemos como propósito obtener unos datos limpios sin valores nulos para poder extraer conclusiones y que contengan los límites de los barrios de Valencia.
Cargamos las librerías necesarias:
Leemos el conjunto de datos de los precios de compra:
precio_compra_inicial <- st_read("data/precio-de-compra-en-idealista/precio-de-compra-en-idealista.shp", quiet = T)
Se trata de un objeto sf con 88 observaciones y 13 variables que contiene los datos correspondientes al precio de compra de la vivienda por barrios y distritos del municipio de Valencia. También, cuenta con variables como los precios máximos y el año en el que se produjeron y los códigos de los barrios y distritos. Además, al ser un fichero SHP, cuanta con la geolocalización correspondiente a los límites de los barrios del municipio de Valencia.
Es turno de leer el conjunto de datos perteneciente a los precios de alquiler:
precio_alquiler_inicial <- import("data/precio-alquiler-vivienda.csv")
Se trata de un data.frame con 70 observaciones y 6 variables que contienen información sobre el precio del alquiler de la vivienda por barrios y distritos del municipio de Valencia. Además, cuenta con variables como los precios máximos y el año donde se produjeron, los códigos de los barrios y distritos. Sin embargo, no cuenta con los datos de los límites de los barrios del municipio de Valencia.
Retomando el obejtivo previo de obtener unos datos unificados y limpios sin valores nulos para poder extraer conclusiones y que contengan los límites de los barrios de Valencia, nos damos cuenta que existen valores nulos en nuestros datos, que no se encuentran todos los datos en el mismo objeto y que no contenemos en el conjunto de datos de los precios del alquiler los límites geográficos de los barrios de Valencia.
Tratamiento
En primer lugar, localizamos nuestras variables de interés en ambos conjuntos de datos y modificamos el nombre para diferenciarlas cuando se encuentren en el conjunto de datos unificado.
precio_compra_inicial <- precio_compra_inicial%>%rename(Precio_Compra_2022 = "precio_2022")
precio_alquiler_inicial <- precio_alquiler_inicial%>%rename(Precio_Alquiler_2022 = "Precio_2022 (Euros/m2)")
A continuación, nos disponemos a buscar una columna en común para poder fusionar los datos. En este caso, la columna que se considera de clave primaria y que por tanto es única para cada observación y no se repite para realizar el join con éxito es la variable que se refiere a la combinación del código del distrito y el código del barrio. Una vez localizada, necesitamos que se llamen igual, por tanto procedemos a cambiar el nombre de la variable en el conjunto de datos del precio del alquiler y la llamamos igual que como se encuentra en los precios de compra.
precio_alquiler_inicial <- precio_alquiler_inicial%>%rename(coddistbar = "CodBar-CodDistrit")
Además, recortamos el conjunto de datos precio_alquiler_inicial, ya que contiene información que también se encuentra en el conjunto de datos de precio_compra_incial
y evitamos datos redundantes.
precio_alquiler_inicial_reducido <- precio_alquiler_inicial[, c(3,4,5,6)]
Es momento de proceder a realizar la unión de los conjuntos de datos. En este sentido, se decide hacer un left join con precio_compra_inicial y precio_alquiler_inicial, en este orden, ya que el left join mantiene los datos del primer conjunto de datos. En este caso, nos interesa hacerlo así ya que el objeto que tiene la variable referente a las coordenadas geográficas regionales, es decir, los límites de los barrios del municipio de Valencia, es el de precio_compra_inicial.
precio_compra_alquiler <- merge(precio_compra_inicial, precio_alquiler_inicial_reducido, by = "coddistbar",all.x = T)
Ahora ya tenemos nuestro conjunto de datos unificado, pero nos queda solucionar el problema de los valores nulos existentes. Mostramos en una tabla las observaciones correspondientes a los valores nulos de nuestra base de datos.
precio_compra_alquiler_na <- precio_compra_alquiler %>%
filter(is.na(Precio_Compra_2022) & is.na(Precio_Alquiler_2022))
tabla_gt <- precio_compra_alquiler_na %>%
gt() %>%
tab_header(
title = "Tabla de Valores NA",
subtitle = "Datos de Precio de Compra y Alquiler 2022 sin la columna de Geometría"
) %>%
cols_label(
Precio_Compra_2022 = "Precio de Compra 2022",
Precio_Alquiler_2022 = "Precio de Alquiler 2022"
) %>%
cols_hide(columns = vars(geometry)) %>%
tab_options(
table.font.size = px(12),
heading.background.color = "#D3D3D3"
)
tabla_gt
Tabla de Valores NA | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Datos de Precio de Compra y Alquiler 2022 sin la columna de Geometría | ||||||||||||
coddistbar | barrio | codbarrio | coddistrit | distrito | Precio de Compra 2022 | precio_2010 | max_histori | ano_max_his | fecha_creac | Precio de Alquiler 2022 | Max_historico (Euros/m2) | Año_Max_Hist |
171 | BENIFARAIG | 1 | 17 | POBLATS DEL NORD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
172 | POBLE NOU | 2 | 17 | POBLATS DEL NORD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
173 | CARPESA | 3 | 17 | POBLATS DEL NORD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
174 | LES CASES DE BARCENA | 4 | 17 | POBLATS DEL NORD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
175 | RAFALELL-VISTABELLA | 5 | 17 | POBLATS DEL NORD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
175 | MAHUELLA-TAULADELLA | 5 | 17 | POBLATS DEL NORD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
176 | MASSARROJOS | 6 | 17 | POBLATS DEL NORD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
177 | BORBOTO | 7 | 17 | POBLATS DEL NORD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
181 | BENIMAMET | 1 | 18 | POBLATS LOEST | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
182 | BENIFERRI | 2 | 18 | POBLATS LOEST | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
191 | EL FORN D'ALCEDO | 1 | 19 | POBLATS DEL SUD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
192 | CASTELLAR-L'OLIVERAL | 2 | 19 | POBLATS DEL SUD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
193 | PINEDO | 3 | 19 | POBLATS DEL SUD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
194 | EL SALER | 4 | 19 | POBLATS DEL SUD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
195 | EL PALMAR | 5 | 19 | POBLATS DEL SUD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
196 | EL PERELLONET | 6 | 19 | POBLATS DEL SUD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
197 | LA TORRE | 7 | 19 | POBLATS DEL SUD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
198 | FAITANAR | 8 | 19 | POBLATS DEL SUD | NA | NA | NA | NA | 2023-03-29 | NA | NA | NA |
Se toma la decisión de eliminar todos los barrios con valores NA’s. Se han eliminado un total de 18 barrios, correspondientes a los poblados del sur y los poblados del norte. Esta decisión que apriori puede parecer una técnica para facilitar considerablemente el análisis, está totalmente fundamentada basándonos en la necesidad de preservar la calidad del análisis de autocorrelación espacial.
En este caso concreto, aplicar técnicas de sustitución de los NA’s por los precios medios o medianos, por el valor del vecino más cercano o un valor aleatorio, no sólo adulteraría el análisis sino que va en oposición al objetivo propuesto, ya que condicionaríamos el análisis de los vecinos más cercanos. En este sentido, la decisión estadísticamente más coherente es eliminarlos para posteriormente al análisis de la autocorrelación y mediante procesos de computación más exhaustivos como el kriging, poder asignarles un valor estimado mejor fundamentado.
Output
Hemos obtenido un nuevo objeto sf, con 70 observaciones y 14 variables:
Ahora sí, podemos realizar las representaciones de los datos obtenidos unificados y georreferenciados. En primer lugar, nos aseguramos de que las variables de interés son numéricas, para poder realizar la representación.
precio_compra_alquiler$Precio_Compra_2022 <- as.numeric(precio_compra_alquiler$Precio_Compra_2022)
precio_compra_alquiler$Precio_Alquiler_2022 <- as.numeric(precio_compra_alquiler$Precio_Alquiler_2022)
En segundo lugar, procedemos a las representaciones de ambas variables de interés.
Precios de Compra en 2022:
leaflet(data = precio_compra_alquiler) %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addPolygons(fillColor = ~colorNumeric(palette = "viridis", domain = precio_compra_alquiler$Precio_Compra_2022)(precio_compra_alquiler$Precio_Compra_2022),
color = "white",
weight = 1,
smoothFactor = 0.5,
opacity = 1,
fillOpacity = 0.8,
highlightOptions = highlightOptions(weight = 3,
color = "#666",
fillOpacity = 0.7,
bringToFront = TRUE),
label = ~as.character(barrio),
labelOptions = labelOptions(style = list("font-weight" = "normal"),
direction = "auto")) %>%
addLegend(pal = colorNumeric(palette = "viridis", domain = precio_compra_alquiler$Precio_Compra_2022),
values = precio_compra_alquiler$Precio_Compra_2022,
title = "Precio por m²",
opacity = 0.7)
Precios de Alquiler en 2022:
leaflet(data = precio_compra_alquiler) %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addPolygons(fillColor = ~colorNumeric(palette = "viridis", domain = precio_compra_alquiler$Precio_Alquiler_2022)(precio_compra_alquiler$Precio_Alquiler_2022),
color = "white",
weight = 1,
smoothFactor = 0.5,
opacity = 1,
fillOpacity = 0.8,
highlightOptions = highlightOptions(weight = 3,
color = "#666",
fillOpacity = 0.7,
bringToFront = TRUE),
label = ~as.character(barrio),
labelOptions = labelOptions(style = list("font-weight" = "normal"),
direction = "auto")) %>%
addLegend(pal = colorNumeric(palette = "viridis", domain = precio_compra_alquiler$Precio_Alquiler_2022),
values = precio_compra_alquiler$Precio_Alquiler_2022,
title = "Precio por m²",
opacity = 0.7)
sf::st_write(precio_compra_alquiler, "precio_compra_alquiler.gpkg")
Los datos resultantes tras el tratamiento y la limpieza de los datos se pueden descargar libremente, en formato GPKG, de aquí.
Proyecto de Innovación Educativa Emergente (PIEE-2737007)