Analizar la distribución y variabilidad espacial del Valor Unitario de Alquiler Urbano en 2024 en la ciudad de Córdoba, de la provincia de Córdoba, Argentina; a partir de datos a nivel de parcela obtenidos del geoportal de IDECOR (Infraestructura de Datos Espaciales de la Provincia de Córdoba), utilizando herramientas de análisis espacial y geoestadística.
Se realizó un análisis geoestadistico del valor unitario de alquiler urbano correspondiente a enero de 2025 para la ciudad de Córdoba, utilizando información a nivel de parcela, datos obtenidos del geoportal de IDECOR: VALOR UNITARIO DE LA TIERRA URBANA 05/2024 ($/M2).
Para evaluar la existencia de autocorrelación espacial global se calculó en índice de Moran, utilanzo una matriz de pesos espaciales basada en vecinos cercanos. Del mismo modo se construyó el diagrama de dispersión de Moran para analizar la relación entre los valores observados y su entorno espacial.
A nivel local se aplicó el análisis LISA con el objetivo de identificar clusters espaciales significativos de valores altos y bajos de alquiler urbano.
# Paquetes
library(sf)
## Warning: package 'sf' was built under R version 4.5.1
## Linking to GEOS 3.13.1, GDAL 3.11.0, PROJ 9.6.0; sf_use_s2() is TRUE
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.5.1
## Warning: package 'ggplot2' was built under R version 4.5.1
## Warning: package 'purrr' was built under R version 4.5.1
## Warning: package 'dplyr' was built under R version 4.5.1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 4.0.0 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.1.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(units)
## udunits database from C:/Users/PC/AppData/Local/R/win-library/4.5/units/share/udunits/udunits2.xml
library(spdep)
## Warning: package 'spdep' was built under R version 4.5.2
## Cargando paquete requerido: spData
## Warning: package 'spData' was built under R version 4.5.2
## To access larger datasets in this package, install the spDataLarge
## package with: `install.packages('spDataLarge',
## repos='https://nowosad.github.io/drat/', type='source')`
library(gstat)
## Warning: package 'gstat' was built under R version 4.5.2
library(ggplot2)
Se cargan los datos obtenidos del geoportal de IDECOR: VALOR UNITARIO DE LA TIERRA URBANA 05/2024 (\(/M2) - El recurso contiene la valuación unitaria de la tierra urbana (\)/m2 y usd/m2) para el año 2024. El valor está expresado a nivel de parcelas urbanas.
# Parcelas con valor de alquiler
alquiler <- st_read("valor_tierra_urbana_2024/valor_tierra_urbana_2024.shp")
## Reading layer `valor_tierra_urbana_2024' from data source
## `C:\Users\PC\Desktop\PERFECCIONAMIENTO\BIG DATA\Geoestadistica\tp\tp\valor_tierra_urbana_2024\valor_tierra_urbana_2024.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 369046 features and 7 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 4372677 ymin: 6511454 xmax: 4399917 ymax: 6536835
## Projected CRS: POSGAR 98 / Argentina 4
# Filtrado solo Córdoba Capital
alquiler <- alquiler %>%
filter(pedania == "CAPITAL")
CRS:
st_crs(alquiler)
## Coordinate Reference System:
## User input: POSGAR 98 / Argentina 4
## wkt:
## BOUNDCRS[
## SOURCECRS[
## PROJCRS["POSGAR 98 / Argentina 4",
## BASEGEOGCRS["POSGAR 98",
## DATUM["Posiciones Geodesicas Argentinas 1998",
## ELLIPSOID["GRS 1980",6378137,298.257222101,
## LENGTHUNIT["metre",1]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433]]],
## CONVERSION["unnamed",
## METHOD["Transverse Mercator",
## ID["EPSG",9807]],
## PARAMETER["Longitude of natural origin",-63,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8802]],
## PARAMETER["Latitude of natural origin",-90,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8801]],
## PARAMETER["Scale factor at natural origin",1,
## SCALEUNIT["unity",1],
## ID["EPSG",8805]],
## PARAMETER["False easting",4500000,
## LENGTHUNIT["m",1],
## ID["EPSG",8806]],
## PARAMETER["False northing",0,
## LENGTHUNIT["m",1],
## ID["EPSG",8807]]],
## CS[Cartesian,2],
## AXIS["easting",east,
## ORDER[1],
## LENGTHUNIT["m",1]],
## AXIS["northing",north,
## ORDER[2],
## LENGTHUNIT["m",1]],
## ID["EPSG",22174]]],
## TARGETCRS[
## GEOGCRS["WGS 84",
## DATUM["World Geodetic System 1984",
## ELLIPSOID["WGS 84",6378137,298.257223563,
## LENGTHUNIT["metre",1]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433]],
## CS[ellipsoidal,2],
## AXIS["latitude",north,
## ORDER[1],
## ANGLEUNIT["degree",0.0174532925199433]],
## AXIS["longitude",east,
## ORDER[2],
## ANGLEUNIT["degree",0.0174532925199433]],
## ID["EPSG",4326]]],
## ABRIDGEDTRANSFORMATION["Transformation from POSGAR 98 to WGS84",
## METHOD["Position Vector transformation (geog2D domain)",
## ID["EPSG",9606]],
## PARAMETER["X-axis translation",0,
## ID["EPSG",8605]],
## PARAMETER["Y-axis translation",0,
## ID["EPSG",8606]],
## PARAMETER["Z-axis translation",0,
## ID["EPSG",8607]],
## PARAMETER["X-axis rotation",0,
## ID["EPSG",8608]],
## PARAMETER["Y-axis rotation",0,
## ID["EPSG",8609]],
## PARAMETER["Z-axis rotation",0,
## ID["EPSG",8610]],
## PARAMETER["Scale difference",1,
## ID["EPSG",8611]]]]
summary(alquiler$vut_pesos)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 6200 52080 124000 228706 235600 6820000 2307
ggplot(alquiler, aes(x = vut_pesos)) +
geom_histogram(bins = 30, fill = "steelblue", color = "white") +
labs(
title = "Distribución del valor de alquiler urbano",
x = "Valor de alquiler ($/m²)",
y = "Frecuencia"
) +
theme_minimal()
## Warning: Removed 2307 rows containing non-finite outside the scale range
## (`stat_bin()`).
ggplot(alquiler) +
geom_sf(aes(fill = vut_pesos), color = NA) +
scale_fill_viridis_c(option = "plasma") +
labs(
title = "Valor unitario de alquiler urbano (enero 2024)",
fill = "$/m²"
) +
theme_void()
El mapa evidencia una distribución espacial heterogénea, con una fuerte concentración de valores elevados en sectores centrales de la ciudad, mientras que los valores mas bajos predoniman en las areas perifericas. Los valores altos se agrupan espacialmente, lo que puede interpretarse como la existencia de autocorrelación espacial positiva. Este patrón no aleatorio refuerza la necesidad de aplicar tecnicas de análisis espacial para evaluar la dependencia espacial del fenómeno.
Las parcelas grises representan a aquellas de caracter rural, las cuales no son contempladas para el análisis.
Primero generamos los Centroides
coords <- st_centroid(alquiler)
## Warning: st_centroid assumes attributes are constant over geometries
Vecinos (k vecinos más cercanos):
nb <- knearneigh(st_coordinates(coords), k = 6)
## Warning in knearneigh(st_coordinates(coords), k = 6): knearneigh: identical
## points found
## Warning in knearneigh(st_coordinates(coords), k = 6): knearneigh: kd_tree not
## available for identical points
nb <- knn2nb(nb)
lw <- nb2listw(nb, style = "W")
Se verifica si hay NA en la variable
sum(is.na(alquiler$vut_pesos))
## [1] 2307
Se filtran los NA
alquiler_moran <- alquiler |>
filter(!is.na(vut_pesos))
Se crean de nuevo vecinos y pesos
coords <- st_coordinates(alquiler_moran)
nb <- poly2nb(alquiler_moran, queen = TRUE)
## Warning in poly2nb(alquiler_moran, queen = TRUE): some observations have no neighbours;
## if this seems unexpected, try increasing the snap argument.
lw <- nb2listw(nb, style = "W", zero.policy = TRUE)
moran.test(alquiler_moran$vut_pesos, lw, zero.policy = TRUE)
##
## Moran I test under randomisation
##
## data: alquiler_moran$vut_pesos
## weights: lw
## n reduced by no-neighbour observations
##
## Moran I statistic standard deviate = 794.21, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 9.703107e-01 -2.738338e-06 1.492630e-06
Resultados: - Moran I= 0,97 - p-value < 2.2e - 16 - El valor de Moran I es positivo y muuy cercano a 1. Esto indica una autocorrelación espacial positiva muy fuerte. Esto quiere decir que las parcelas con valores altos de alquiler tinden a estra rodeadas por parcelas con valores altos. De la misma forma las parcelas con valores bajos de alquiler estan rodeadas por parcelas del mismo valor. - La distribucion espacial de los valores de alquiler no es aleatoria.
Conclusion: La fuerte autocorrelación espacial observada sugiere que el valor del alquiler urbano está altamente condicionado por factores espaciales y territoriales, como la localización, el entorno urbano y las características del área.
moran.plot(alquiler_moran$vut_pesos,
listw = lw,
zero.policy = TRUE)
El Moran Scatterplot confirma visualmente los resultados del test global, mostrando una pendiente positiva pronunciada.
alquiler_sp <- alquiler_moran %>%
mutate(vut_pesos = as.numeric(vut_pesos))
vg_emp <- variogram(vut_pesos ~ 1, alquiler_sp)
plot(vg_emp, main = "Variograma empírico del valor de alquiler")
El variograma empírico del valor unitario de alquiler muestra una clara estructura espacial. Se observa una baja semivarianza a distancias cortas, lo que indica una alta similitud entre parcelas cercanas, seguida de un rápido incremento de la semivarianza a medida que aumenta la distancia. Este comoportamiento se interpreta como una fuerte dependencia espacial local y una marcada heterogeneidad espacial a escala mayor.
vg_model <- vgm(
psill = var(alquiler_moran$vut_pesos),
model = "Sph",
range = 1000,
nugget = 0
)
vg_fit <- fit.variogram(vg_emp, vg_model)
## Warning in fit.variogram(vg_emp, vg_model): singular model in variogram fit
## [1] "a possible solution MIGHT be to scale semivariances and/or distances"
plot(vg_emp, vg_fit, main = "Variograma ajustado")
Se ajustó un modelo teórico de variograma de tipo esferico al variograma empírico del valor unitario de alquiler. Si bien el ajuste visual es limitado debido a la elevada varianza y la presencia de valores extremos en la variable analizada, el modelo permite identificar una clara estructura de dependencia espacial, caracterizada por una alta similitud entre parcelas cercanas y una rápida pérdida de correlación espacial a mayor distancias.
grid <- st_make_grid(
alquiler_moran,
cellsize = 200,
what = "centers"
)
grid <- st_sf(geometry = grid)
Se intentó aplicar kriging ordinario utilizando el variograma ajustado, pero debido al gran volumen de datos y a la elevada heterogeneidad de la variable analizada, el procedimiento no pudo completarse por limitaciones de memoria.
En ese sentido se propuso reducir la grilla para poder correr el proceso.
grid_coarse <- st_make_grid(
alquiler_sp,
cellsize = 500 #celdas más grandes
) |> st_sf()
kriging <- krige(
vut_pesos ~ 1,
alquiler_sp,
grid_coarse,
model = vg_fit,
nmax = 30
)
## [using ordinary kriging]
## Warning in predict.gstat(g, newdata = newdata, block = block, nsim = nsim, :
## Covariance matrix singular at location [4.38498e+06,6.51638e+06,0]: skipping...
## Warning in predict.gstat(g, newdata = newdata, block = block, nsim = nsim, :
## Covariance matrix singular at location [4.38598e+06,6.51788e+06,0]: skipping...
## Warning in predict.gstat(g, newdata = newdata, block = block, nsim = nsim, :
## Covariance matrix singular at location [4.37948e+06,6.52038e+06,0]: skipping...
## Warning in predict.gstat(g, newdata = newdata, block = block, nsim = nsim, :
## Covariance matrix singular at location [4.37898e+06,6.52088e+06,0]: skipping...
## Warning in predict.gstat(g, newdata = newdata, block = block, nsim = nsim, :
## Covariance matrix singular at location [4.38148e+06,6.52338e+06,0]: skipping...
## Warning in predict.gstat(g, newdata = newdata, block = block, nsim = nsim, :
## Covariance matrix singular at location [4.38048e+06,6.52438e+06,0]: skipping...
## Warning in predict.gstat(g, newdata = newdata, block = block, nsim = nsim, :
## Covariance matrix singular at location [4.38998e+06,6.52488e+06,0]: skipping...
## Warning in predict.gstat(g, newdata = newdata, block = block, nsim = nsim, :
## Covariance matrix singular at location [4.38098e+06,6.52938e+06,0]: skipping...
## Warning in predict.gstat(g, newdata = newdata, block = block, nsim = nsim, :
## Covariance matrix singular at location [4.38098e+06,6.53388e+06,0]: skipping...
## Warning in predict.gstat(g, newdata = newdata, block = block, nsim = nsim, :
## Covariance matrix singular at location [4.38098e+06,6.53438e+06,0]: skipping...
ggplot(kriging) +
geom_sf(aes(fill = var1.pred), color = NA) +
scale_fill_viridis_c(option = "inferno") +
labs(
title = "Interpolación geoestadística del valor de alquiler",
fill = "$/m²"
) +
theme_void()
El mapa interpolado del valor unitario de alquiler revela una estructura espacial clara, con valores más altos concentrados en el área central de la ciudad. A medida que aumenta la distancia al centro urbano, los valores interpolados disminuyen progresivamente, lo que evidencia un gradiente espacial cnetro-periferia.
ggplot(kriging) +
geom_sf(aes(fill = var1.var), color = NA) +
scale_fill_viridis_c(option = "magma") +
labs(
title = "Varianza del Kriging",
fill = "Varianza"
) +
theme_void()
La interpolación es más confiable en las áreas centrales y consolidadas, mientras que en sectores periféricos los resultados deben interpretarse con mayor atención debido a la mayor incertidumbre asociada.
Dado que el índice de Moran global indicó una fuerte autocorrelación espacial positiva, se incorporó un análisis LISA, con el objetivo de identificar patrones locales de agrupamiento espacial y detectar áreas con valores signifacativamente altos o bajos de alquiler urbano.
library(spdep)
library(sf)
library(tmap)
## Warning: package 'tmap' was built under R version 4.5.2
alquiler_moran <- alquiler_moran %>%
mutate(
vut_std = scale(vut_pesos)[,1]
)
lisa <- localmoran(
x = alquiler_moran$vut_std,
listw = lw,
zero.policy = TRUE
)
colnames(lisa)
## [1] "Ii" "E.Ii" "Var.Ii" "Z.Ii"
## [5] "Pr(z != E(Ii))"
alquiler_moran$lisa_I <- lisa[, "Ii"]
alquiler_moran$lisa_p <- lisa[, "Pr(z != E(Ii))"]
alquiler_moran <- alquiler_moran %>%
mutate(
lag_vut = lag.listw(lw, vut_std, zero.policy = TRUE),
lisa_cluster = case_when(
vut_std > 0 & lag_vut > 0 & lisa_p <= 0.05 ~ "Alto - Alto",
vut_std < 0 & lag_vut < 0 & lisa_p <= 0.05 ~ "Bajo - Bajo",
vut_std > 0 & lag_vut < 0 & lisa_p <= 0.05 ~ "Alto - Bajo",
vut_std < 0 & lag_vut > 0 & lisa_p <= 0.05 ~ "Bajo - Alto",
TRUE ~ "No significativo"
)
)
tm_shape(alquiler_moran[!is.na(alquiler_moran$lisa_cluster), ]) +
tm_fill(
"lisa_cluster",
palette = c("red", "orange", "blue", "lightblue"),
title = "Clusters LISA"
) +
tm_borders(lwd = 0) +
tm_layout(
title = "LISA – Valor unitario de alquiler urbano",
legend.outside = TRUE,
frame = FALSE
)
##
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_tm_fill()`: migrate the argument(s) related to the scale of the
## visual variable `fill` namely 'palette' (rename to 'values') to fill.scale =
## tm_scale(<HERE>).
## [v3->v4] `tm_fill()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(title = )`
El análisis de autocorrelación espacial local (LISA) revela la presencia de clusters estadísticamente significativos del valor unitario de alquiler urbano. Se identifican áreas Alto-Alto concentradas principalmente en zonas centrales y consolidadasde la ciudad, donde parcelas con valores elevados de alquiler se encuentran rodeadas por unidades con valores similares. Por el contrario, los clousters Bajo-Bajo se localizan mayormente en sectores periféricos, evidenciando áreas con valores sistemáticamente bajo. La presencia de patrones Alto-Bajo y Bajo-Alto es limitada, lo que sugiere una estructura espacial relativamente homogénea dentro de cada zona.
Alto-Alto = centralidad, servicios, accesibilidad Bajo-Bajo = periferia, menor presión inmobilaria
Los resultados obtenidos confirman que el valor unitario de alquiler urbano en la ciudad de Córdoba presenta una marcada estructura espacial. La fuerte autocorrelación espacial observada indica que los precios de alquiler no se distribuyen d emanera aleatoria, sino que responden a dinámicas territoriales definidas.
Los clusters Alto-Alto identificados mediante LISA se concentran principalmente en el área central, lo cual es consistente con la presencia de mayores niveles de accesibilidad, servicios urbanos, entre otros. Todo los contrario a los clusters Bajo-Bajo localizados en zonas perifericas.
Para complementar el ánalisis seria interesante incorporar variables socioeconómicas o de accesibilidad urbana que permitan explicar con mayor profundidad los patrones espaciales observados.