El presente trabajo corresponde a la materia Geoestadística, dictada por Priscilla Misotti en el marco del curso de posgrado en Big Data e Inteligencia Territorial de la Facultad Latinoamericana de Ciencias Sociales. El mismo tiene como objetivo principal realizar un análisis exploratorio de las características de las propiedades en venta que se utilizan como viviendas en la Ciudad Autónoma de Buenos Aires (CABA) a partir de la aplicación de herramientas de geoestadística.
En este marco, se abordan un conjunto de variables relativas a las propiedades en venta en CABA desde una perspectiva de autocorrelación espacial, utilizando las medidas de Índice de Morán Global e Índice de Morán Local. En particular, el trabajo se centra en el análisis de la variable valor por metro cuadrado de las propiedades, con el propósito de identificar la existencia de conglomerados o clusters espaciales en función de dicha variable.
El presente trabajo analiza las características de las propiedades en venta de la Ciudad Autónoma de Buenos Aires, por lo cual es preciso esclarecer las divisiones territoriales a las que se hará referencia a lo largo del trabajo.
La Ciudad Autónoma de Buenos Aires es la capital de la República Argentina y posee 15 comunas, las cuales se encuentran constituidas por barrios. A continuación se presenta un mapa de la Ciudad Autónoma de Buenos Aires, con el objetivo de servir de referencia para la lectura del trabajo:
knitr::include_graphics("D:/Documents/Big Data e Inteligencia Territorial/imagen_comunas.png")
En primera instancia, se llama a las librerías que se van a utilizar y se abre la base de datos, la cual fue obtenida de Properati a través del siguiente link: https://www.properati.com.ar/data/ . Dicha base contiene las propiedades en venta en el territorio argentino registradas desde agosto de 2019 hasta agosto de 2020.
library(readxl)
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2 v purrr 0.3.4
## v tibble 3.0.4 v dplyr 1.0.2
## v tidyr 1.1.2 v stringr 1.4.0
## v readr 1.4.0 v forcats 0.5.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library (sf)
## Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1
library(RColorBrewer)
library (tmap)
library (sp)
library (spdep)
## Loading required package: spData
## To access larger datasets in this package, install the spDataLarge
## package with: `install.packages('spDataLarge',
## repos='https://nowosad.github.io/drat/', type='source')`
library (spData)
propiedades <- read_csv("D:/Documents/Big Data e Inteligencia Territorial/ar_properties.gz")
##
## -- Column specification --------------------------------------------------------
## cols(
## .default = col_character(),
## start_date = col_date(format = ""),
## end_date = col_date(format = ""),
## created_on = col_date(format = ""),
## lat = col_double(),
## lon = col_double(),
## l5 = col_logical(),
## l6 = col_logical(),
## rooms = col_double(),
## bedrooms = col_double(),
## bathrooms = col_double(),
## surface_total = col_double(),
## surface_covered = col_double(),
## price = col_double()
## )
## i Use `spec()` for the full column specifications.
## Warning: 4008 parsing failures.
## row col expected actual file
## 1214 l5 1/0/T/F/TRUE/FALSE Barrio El Yacht 'D:/Documents/Big Data e Inteligencia Territorial/ar_properties.gz'
## 1380 l5 1/0/T/F/TRUE/FALSE QBay Yacht 'D:/Documents/Big Data e Inteligencia Territorial/ar_properties.gz'
## 2257 l5 1/0/T/F/TRUE/FALSE Barrio Los Alisos 'D:/Documents/Big Data e Inteligencia Territorial/ar_properties.gz'
## 2355 l5 1/0/T/F/TRUE/FALSE BarrioPortezuelo 'D:/Documents/Big Data e Inteligencia Territorial/ar_properties.gz'
## 2557 l5 1/0/T/F/TRUE/FALSE Barrio Los Lagos 'D:/Documents/Big Data e Inteligencia Territorial/ar_properties.gz'
## .... ... .................. ................. ...................................................................
## See problems(...) for more details.
Así, se realiza una primera lectura de los datos.
str (propiedades)
## tibble [1,000,000 x 25] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ id : chr [1:1000000] "CF/ws32OHICTWLyJXjQLlg==" "UvHRQcq+g1cNpTJAuQizTQ==" "8zW7a/wIqEMqFZFEh76gdw==" "SKaFcdKyUMWPbCFPAUHcLQ==" ...
## $ ad_type : chr [1:1000000] "Propiedad" "Propiedad" "Propiedad" "Propiedad" ...
## $ start_date : Date[1:1000000], format: "2019-10-04" "2019-10-04" ...
## $ end_date : Date[1:1000000], format: "9999-12-31" "2019-10-11" ...
## $ created_on : Date[1:1000000], format: "2019-10-04" "2019-10-04" ...
## $ lat : num [1:1000000] -39 -35 -34.9 -39.1 -34.7 ...
## $ lon : num [1:1000000] -61.3 -58.6 -58.1 -67.6 -58.4 ...
## $ l1 : chr [1:1000000] "Argentina" "Argentina" "Argentina" "Argentina" ...
## $ l2 : chr [1:1000000] "Buenos Aires Costa Atlántica" "Bs.As. G.B.A. Zona Sur" "Bs.As. G.B.A. Zona Sur" "Río Negro" ...
## $ l3 : chr [1:1000000] "Monte Hermoso" "Ezeiza" "La Plata" "General Roca" ...
## $ l4 : chr [1:1000000] NA NA NA NA ...
## $ l5 : logi [1:1000000] NA NA NA NA NA NA ...
## $ l6 : logi [1:1000000] NA NA NA NA NA NA ...
## $ rooms : num [1:1000000] NA NA NA NA NA NA NA NA NA 3 ...
## $ bedrooms : num [1:1000000] NA NA NA NA NA NA NA NA NA NA ...
## $ bathrooms : num [1:1000000] NA NA NA NA NA NA NA NA NA NA ...
## $ surface_total : num [1:1000000] NA NA NA NA NA NA NA NA 8000 NA ...
## $ surface_covered: num [1:1000000] NA NA NA NA NA NA 12 15 8000 NA ...
## $ price : num [1:1000000] NA NA NA NA NA NA NA NA NA 0 ...
## $ currency : chr [1:1000000] NA NA NA NA ...
## $ price_period : chr [1:1000000] "Mensual" "Mensual" "Mensual" "Mensual" ...
## $ title : chr [1:1000000] "HERMOSA CASA EN MONTE DEL ESTE" "Lote en venta - Estancia Villa Maria" "Terreno - La Plata" "importante terreno en Barrio Privado \"La Pedrera\" 1000m2" ...
## $ description : chr [1:1000000] "CODIGO: 1818-A9 ubicado en: Los Fresnos entre El Colibrí y Huemul - Publicado por: RUSCONI PROPIEDADES. El pre"| __truncated__ "Amplio Lote muy bien ubicado, rodeado de bellas construcciones en este maravilloso barrio en Ezeiza, ideal par"| __truncated__ "/// OPORTUNIDAD \\\\\\<br><br>Lote de 12 mts de frente X 39 mts de fondo.<br><br>Ubicado en City Bell.<br><br>S"| __truncated__ "CODIGO: 6413-A-32 ubicado en: Viterbori 2000 - Publicado por: INDEXA INMOBILIARIA. El precio es de USD 1 null."| __truncated__ ...
## $ property_type : chr [1:1000000] "Casa" "Lote" "Lote" "Lote" ...
## $ operation_type : chr [1:1000000] "Alquiler temporal" "Venta" "Venta" "Venta" ...
## - attr(*, "problems")= tibble [4,008 x 5] (S3: tbl_df/tbl/data.frame)
## ..$ row : int [1:4008] 1214 1380 2257 2355 2557 2558 2564 2568 2638 2639 ...
## ..$ col : chr [1:4008] "l5" "l5" "l5" "l5" ...
## ..$ expected: chr [1:4008] "1/0/T/F/TRUE/FALSE" "1/0/T/F/TRUE/FALSE" "1/0/T/F/TRUE/FALSE" "1/0/T/F/TRUE/FALSE" ...
## ..$ actual : chr [1:4008] "Barrio El Yacht" "QBay Yacht" "Barrio Los Alisos" "BarrioPortezuelo" ...
## ..$ file : chr [1:4008] "'D:/Documents/Big Data e Inteligencia Territorial/ar_properties.gz'" "'D:/Documents/Big Data e Inteligencia Territorial/ar_properties.gz'" "'D:/Documents/Big Data e Inteligencia Territorial/ar_properties.gz'" "'D:/Documents/Big Data e Inteligencia Territorial/ar_properties.gz'" ...
## - attr(*, "spec")=
## .. cols(
## .. id = col_character(),
## .. ad_type = col_character(),
## .. start_date = col_date(format = ""),
## .. end_date = col_date(format = ""),
## .. created_on = col_date(format = ""),
## .. lat = col_double(),
## .. lon = col_double(),
## .. l1 = col_character(),
## .. l2 = col_character(),
## .. l3 = col_character(),
## .. l4 = col_character(),
## .. l5 = col_logical(),
## .. l6 = col_logical(),
## .. rooms = col_double(),
## .. bedrooms = col_double(),
## .. bathrooms = col_double(),
## .. surface_total = col_double(),
## .. surface_covered = col_double(),
## .. price = col_double(),
## .. currency = col_character(),
## .. price_period = col_character(),
## .. title = col_character(),
## .. description = col_character(),
## .. property_type = col_character(),
## .. operation_type = col_character()
## .. )
Para trabajar con el dataset de Properati es preciso transformar algunos datos previamente. En este sentido, se tranforma en factor a las variables currency, l2 y property_type, que expresan la moneda en que se hace la transacción por la propiedad, la jurisdicción en la que se encuentra la propiedad y el tipo de propiedad, respectivamente. Asimismo, se crea un vector en el que se seleccionan las propiedades en venta que se utilizan como vivienda, es decir aquellas que corresponden a las categorías de: casa, casa de campo, PH y departamento.
propiedades$currency <- as.factor (propiedades$currency)
propiedades$l2 <- as.factor (propiedades$l2)
propiedades$property_type <- as.factor (propiedades$property_type)
viviendas_caba <- c("Casa", "Casa de Campo", "PH", "Departamento")
Luego se filtran los datos a utilizar. En primera instancia se seleccionan las variables a analizar y luego se filtran aquellas cualidades de interés como el hecho de que sea una vivienda, localizada en la Ciudad Autónoma de Buenos Aires y que se encuentre en venta en dólares. Además, se crea una nueva variable a partir del cálculo del valor por metro cuadrado para cada una de las propiedades. Este valor se obtiene a partir de calcular el precio de la propiedad sobre la superficie total de la misma.
propiedades_caba <- propiedades %>%
select (id,
lat,
lon,
l2,
l3,
rooms,
bedrooms,
bathrooms,
surface_total,
price,
currency,
property_type,
operation_type) %>%
mutate (valor_mt = price/surface_total) %>%
filter (l2 == "Capital Federal" &
property_type %in% viviendas_caba &
currency == "USD" &
operation_type == "Venta" &
surface_total >= 1 &
lat < "-35.42203" &
lat > "-33.80567" &
lon < "-59.37685" &
lon > "-57.70947" &
!is.na (rooms) &
!is.na (bedrooms) &
!is.na (bathrooms) &
!is.na (surface_total) &
!is.na (lon) &
!is.na (lat) &
!is.na (price) &
!is.na (surface_total) &
!is.na (valor_mt))
Además, se realiza una recategorización de la ubicación de las propiedades, ya que la base extraida de Properati indica el barrio al que pertenece cada una, pero no indica la comuna en la que se encuentran. En este sentido, para hacerla compatible con el mapa de la Ciudad Autonoma de Buenos Aires que se utilizará más adelante, se procede a asignarle a cada propiedad la comuna a la que pertenece.
propiedades_caba$l3 <- as.factor (propiedades_caba$l3)
comuna1 <- c("Constitución", "Monserrat", "Puerto Madero", "Retiro", "San Nicolás", "San Telmo")
comuna2 <- c("Recoleta")
comuna3 <- c("Balvanera", "San Cristobal")
comuna4 <- c("Barracas", "Boca", "Nueva Pompeya", "Parque Patricios")
comuna5 <- c("Almagro", "Boedo")
comuna6 <- c("Caballito")
comuna7 <- c("Flores", "Parque Chacabuco")
comuna8 <- c("Villa Lugano", "Villa Riachuelo", "Villa Soldati")
comuna9 <- c("Liniers", "Mataderos", "Parque Avellaneda")
comuna10 <- c("Floresta", "Monte Castro", "Velez Sarsfield", "Villa Luro", "Villa Real")
comuna11 <- c("Villa del Parque", "Villa Devoto", "Villa General Mitre", "Villa Santa Rita")
comuna12 <- c("Coghlan", "Saavedra", "Villa Pueyrredón", "Villa Urquiza")
comuna13 <- c("Belgrano", "Colegiales", "Nuñez")
comuna14 <- c("Palermo")
comuna15 <- c("Agronomía", "Chacarita", "Parque Chas", "Parternal", "Villa Crespo", "Villa Ortuzar")
propiedades_caba_comunas <- propiedades_caba %>%
mutate (l3 =case_when
(l3 %in% comuna1~ 1,
l3 %in% comuna2~ 2,
l3 %in% comuna3~ 3,
l3 %in% comuna4~ 4,
l3 %in% comuna5~ 5,
l3 %in% comuna6~ 6,
l3 %in% comuna7~ 7,
l3 %in% comuna8~ 8,
l3 %in% comuna9~ 9,
l3 %in% comuna10 ~ 10,
l3 %in% comuna11 ~ 11,
l3 %in% comuna12 ~ 12,
l3 %in% comuna13 ~ 13,
l3 %in% comuna14 ~ 14,
l3 %in% comuna15 ~ 15))
propiedades_caba_comunas
## # A tibble: 61,301 x 14
## id lat lon l2 l3 rooms bedrooms bathrooms surface_total price
## <chr> <dbl> <dbl> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 wRGx~ -34.6 -58.4 Capi~ 5 2 1 1 50 109000
## 2 34iC~ -34.6 -58.4 Capi~ 14 2 1 1 45 125000
## 3 8/XW~ -34.6 -58.5 Capi~ 7 2 1 1 41 87500
## 4 CGfs~ -34.5 -58.5 Capi~ 13 2 1 1 39 129000
## 5 GKtY~ -34.6 -58.4 Capi~ 5 2 1 1 37 89000
## 6 kgeZ~ -34.6 -58.4 Capi~ 5 2 1 1 41 97000
## 7 yK1C~ -34.6 -58.4 Capi~ 5 2 1 1 48 101000
## 8 eGGv~ -34.6 -58.4 Capi~ 14 2 1 1 48 140000
## 9 LExr~ -34.6 -58.4 Capi~ 13 2 1 1 33 93000
## 10 pWJJ~ -34.6 -58.5 Capi~ 13 2 1 1 41 149000
## # ... with 61,291 more rows, and 4 more variables: currency <fct>,
## # property_type <fct>, operation_type <chr>, valor_mt <dbl>
A partir de las variables seleccionadas, se obtiene el promedio de las mismas para cada comuna de la Ciudad Autónoma de Buenos Aires.
resumen_comuna <- propiedades_caba_comunas %>%
rename("comunas" = "l3") %>%
group_by(comunas) %>%
summarise (rooms = mean(rooms),
bedrooms = mean(bedrooms),
bathrooms = mean(bathrooms),
valor_mt= mean(valor_mt))%>%
filter (!is.na (comunas)) %>%
ungroup ()
## `summarise()` ungrouping output (override with `.groups` argument)
resumen_comuna
## # A tibble: 15 x 5
## comunas rooms bedrooms bathrooms valor_mt
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 2.90 1.95 1.75 3354.
## 2 2 3.42 2.28 1.75 3161.
## 3 3 2.94 1.97 1.26 1948.
## 4 4 3.30 2.31 1.37 1797.
## 5 5 2.95 1.98 1.41 2374.
## 6 6 2.93 1.97 1.50 2458.
## 7 7 3.07 2.07 1.42 1897.
## 8 8 3.53 2.42 1.32 1267.
## 9 9 3.08 2.09 1.42 1707.
## 10 10 3.03 2.02 1.37 1850.
## 11 11 3.03 2.04 1.47 2167.
## 12 12 2.67 1.73 1.37 2539.
## 13 13 3.07 2.07 1.75 3142.
## 14 14 2.94 1.93 1.59 3468.
## 15 15 2.80 1.85 1.32 2341.
Además, se descarga el mapa de la Ciudad Autónoma de Buenos Aires, con lo límites geográficos de cada una de las comunas, y se combina con los datos filtrados de Properati para visualizarlos en este formato.
comunas_caba <- st_read('https://bitsandbricks.github.io/data/CABA_comunas.geojson')
## Reading layer `CABA_comunas' from data source `https://bitsandbricks.github.io/data/CABA_comunas.geojson' using driver `GeoJSON'
## Simple feature collection with 15 features and 4 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: -58.53152 ymin: -34.70529 xmax: -58.33514 ymax: -34.52754
## geographic CRS: WGS 84
resumen_comuna$comunas <- as.factor (resumen_comuna$comunas)
comunas_caba$comunas <- as.factor (comunas_caba$comunas)
caba_resumen <- comunas_caba %>%
left_join(resumen_comuna, by ="comunas")
De esta manera, se avanza con un primer análisis de las variables a través de su representación mediante gráficos de barras y mapas.
En el caso de la variable habitaciones, se oscila en un promedio de entre 2,6 y 3,5 habitaciones para las propiedades en venta de las comunas de la CABA. Asimismo, los promedios más altos de habitaciones en las propiedades en venta se presentan en las comunas 8(Villa Lugano, Villa Riachuelo y Villa Soldati), 2(Recoleta) y 4(Barracas, Boca, Nueva Pompeya y Parque Patricios), mientras que los promedios más bajos corresponden a las comunas 12(Coghlan, Saavedra, Villa Pueyrredón y Villa Urquiza), 15(Agronomía, Chacarita, Parque Chas, Parternal, Villa Crespo, Villa Ortuzar) y 1 (Constitución, Monserrat, Puerto Madero, Retiro, San Nicolás y San Telmo).
ggplot(caba_resumen)+
geom_bar(aes(x= reorder (comunas, rooms), weight=rooms))+
theme_minimal() +
labs (title = "Promedio de habitaciones de las viviendas en venta en CABA en USD por comuna",
x = "Comuna",
y = "Promedio de habitaciones",
caption = "Fuente: Properati")+
coord_flip()
qtm(caba_resumen, fill = "rooms")
Por su parte al analizar la variable dormitorio, es posible observar que aquellas comunas con los promedios más altos son la comuna 8, la comuna 4 y la comuna 2 -las comunas que también poseían los promedios de habitaciones más altos-, mientras que las 12, 15 y 14 (Palermo) poseen los promedios más bajos. Desde una perspectiva general, el promedio de dormitorios en las propiedades en venta de la Ciudad Autónoma de Buenos Aires varía entre 1,7 y 2,4.
ggplot(caba_resumen)+
geom_bar(aes(x= reorder (comunas, bedrooms),
weight=bedrooms))+
labs (title = "Promedio de dormitorios de las viviendas en venta en CABA en USD por comuna",
x = "Comuna",
y = "Promedio de dormitorios",
caption = "Fuente: Properati")+
coord_flip()
qtm(caba_resumen, fill = "bedrooms")
Al analizar el promedio de baños en las propiedades en venta en la Ciudad Autónoma de Buenos Aires, se observa que el mismo oscila entre 1,25 y 1,75 en las diferentes comunas. La mayor presencia de baños en las propiedades en venta se encuentra en las comunas 2, 13 (Belgrano, Colegiales y Nuñez) y 1, mientras que la menor presencia de baños se ubica en las comunas 3 (Balvanera, San Cristobal), 15 y 8.
ggplot(caba_resumen)+
geom_bar(aes(x= reorder (comunas, bathrooms),
weight=bathrooms))+
labs (title = "Promedio de baños de las viviendas en venta en CABA en USD por comuna",
x = "Comuna",
y = "Promedio de baños",
caption = "Fuente: Properati")+
coord_flip()
qtm(caba_resumen, fill = "bathrooms")
Finalmente, respecto de la variable valor por metro cuadrado -de las propiedades en venta de la Ciudad Autónoma de Buenos Aires- se observa que los valores más altos se hayan en las comunas 14, 1, 2 y 13, mientras que el valor del metro cuadrado es más bajo en las comunas 8,9 y 4. De esta manera, el valor por metro cuadrado oscila entre 1200 y 3400 USD -aproximadamente- dependiendo de la comuna en la que se ubique la propiedad en venta.
En el mapa se visualiza claramente que las comunas con el valor por metro cuadrado más elevado se ubican al norte de la Ciudad Autónoma de Buenos Aires.
ggplot(resumen_comuna)+
geom_bar(aes(x= reorder (comunas, valor_mt),
weight=valor_mt))+
labs (title = "Promedio del valor por metro cuadrado de las viviendas en venta en CABA en USD por comuna",
x = "Comuna",
y = "Promedio del valor por metro cuadrado",
caption = "Fuente: Properati")+
coord_flip()
qtm(caba_resumen, fill = "valor_mt")
Para profundizar el análisis de las variables seleccionadas, se procede a trabajar los datos desde una perpectiva de autocorrelación espacial. En este sentido, a continuación se avanza con el análisis de los datos aplicando medidas de autocorrelación espacial: Índice de Morán Global y el Índice de Morán Local.
En primera instancia, es necesario generar una estructura de vecinos, la cual, en este caso, se genera por criterio de contigüidad. Se utiliza la contigüidad denominada reina o queen ya que la misma aplica el criterio de vecindad a cualquier polígono contiguo que comparta, al menos, un vértice.
vecinos <- poly2nb(caba_resumen, row.names = "comunas", queen=TRUE)
vecinos
## Neighbour list object:
## Number of regions: 15
## Number of nonzero links: 64
## Percentage nonzero weights: 28.44444
## Average number of links: 4.266667
De esta forma, podemos ver la estructura de vecinos:
str(vecinos)
## List of 15
## $ : int [1:3] 2 3 4
## $ : int [1:4] 1 3 5 14
## $ : int [1:4] 1 2 4 5
## $ : int [1:5] 1 3 5 7 8
## $ : int [1:7] 2 3 4 6 7 14 15
## $ : int [1:4] 5 7 11 15
## $ : int [1:7] 4 5 6 8 9 10 11
## $ : int [1:3] 4 7 9
## $ : int [1:3] 7 8 10
## $ : int [1:3] 7 9 11
## $ : int [1:5] 6 7 10 12 15
## $ : int [1:3] 11 13 15
## $ : int [1:3] 12 14 15
## $ : int [1:4] 2 5 13 15
## $ : int [1:6] 5 6 11 12 13 14
## - attr(*, "class")= chr "nb"
## - attr(*, "region.id")= chr [1:15] "1" "2" "3" "4" ...
## - attr(*, "call")= language poly2nb(pl = caba_resumen, row.names = "comunas", queen = TRUE)
## - attr(*, "type")= chr "queen"
## - attr(*, "sym")= logi TRUE
Y de esta forma la podemos visualizar en un mapa:
plot(st_geometry(caba_resumen), border="grey", main="Estructura de vecinos de CABA")
plot(vecinos, coordinates(as(caba_resumen, "Spatial")), add=TRUE, col="violet")
A continuación se construye la matriz de pesos vecinos:
matriz_pesosvecinos <- nb2mat(vecinos, style='B')
matriz_pesosvecinos
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
## 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0
## 2 1 0 1 0 1 0 0 0 0 0 0 0 0 1
## 3 1 1 0 1 1 0 0 0 0 0 0 0 0 0
## 4 1 0 1 0 1 0 1 1 0 0 0 0 0 0
## 5 0 1 1 1 0 1 1 0 0 0 0 0 0 1
## 6 0 0 0 0 1 0 1 0 0 0 1 0 0 0
## 7 0 0 0 1 1 1 0 1 1 1 1 0 0 0
## 8 0 0 0 1 0 0 1 0 1 0 0 0 0 0
## 9 0 0 0 0 0 0 1 1 0 1 0 0 0 0
## 10 0 0 0 0 0 0 1 0 1 0 1 0 0 0
## 11 0 0 0 0 0 1 1 0 0 1 0 1 0 0
## 12 0 0 0 0 0 0 0 0 0 0 1 0 1 0
## 13 0 0 0 0 0 0 0 0 0 0 0 1 0 1
## 14 0 1 0 0 1 0 0 0 0 0 0 0 1 0
## 15 0 0 0 0 1 1 0 0 0 0 1 1 1 1
## [,15]
## 1 0
## 2 0
## 3 0
## 4 0
## 5 1
## 6 1
## 7 0
## 8 0
## 9 0
## 10 0
## 11 1
## 12 1
## 13 1
## 14 1
## 15 0
## attr(,"call")
## nb2mat(neighbours = vecinos, style = "B")
Luego, la matriz de pesos se pasa a formato lista:
lista_vecinos <- nb2listw(vecinos, style='B')
lista_vecinos
## Characteristics of weights list object:
## Neighbour list object:
## Number of regions: 15
## Number of nonzero links: 64
## Percentage nonzero weights: 28.44444
## Average number of links: 4.266667
##
## Weights style: B
## Weights constants summary:
## n nn S0 S1 S2
## B 15 225 64 128 1208
head(lista_vecinos)
## $style
## [1] "B"
##
## $neighbours
## Neighbour list object:
## Number of regions: 15
## Number of nonzero links: 64
## Percentage nonzero weights: 28.44444
## Average number of links: 4.266667
##
## $weights
## $weights[[1]]
## [1] 1 1 1
##
## $weights[[2]]
## [1] 1 1 1 1
##
## $weights[[3]]
## [1] 1 1 1 1
##
## $weights[[4]]
## [1] 1 1 1 1 1
##
## $weights[[5]]
## [1] 1 1 1 1 1 1 1
##
## $weights[[6]]
## [1] 1 1 1 1
##
## $weights[[7]]
## [1] 1 1 1 1 1 1 1
##
## $weights[[8]]
## [1] 1 1 1
##
## $weights[[9]]
## [1] 1 1 1
##
## $weights[[10]]
## [1] 1 1 1
##
## $weights[[11]]
## [1] 1 1 1 1 1
##
## $weights[[12]]
## [1] 1 1 1
##
## $weights[[13]]
## [1] 1 1 1
##
## $weights[[14]]
## [1] 1 1 1 1
##
## $weights[[15]]
## [1] 1 1 1 1 1 1
##
## attr(,"mode")
## [1] "binary"
## attr(,"B")
## [1] TRUE
A continuación, se aplica el Índice de Moran Global como medida de autocorrelación espacial global para analizar las variables seleccionadas sobre las propiedades en venta de la Ciudad Autónoma de Buenos Aires.
En primera instancia, se aplica a la variable habitaciones. En este caso podemos observar que el p valor es mayor a 0,05, lo que nos permite descartar el modelo, y el índice de Morán, aunque da cuenta de una muy leve autocorrelación espacial, el número es cercano a cero.
moran.test(caba_resumen$rooms, lista_vecinos)
##
## Moran I test under randomisation
##
## data: caba_resumen$rooms
## weights: lista_vecinos
##
## Moran I statistic standard deviate = 1.0637, p-value = 0.1437
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.07559549 -0.07142857 0.01910421
En segundo lugar, respecto a la variable dormitorios ocurre lo mismo que en el caso anterior, el p-valor no permite rechazar la hipótesis nula y el I de Morán es levemente superior al anterior, pero aún da cuenta de una muy leve autocorrelación espacial positiva.
moran.test(caba_resumen$bedrooms, lista_vecinos)
##
## Moran I test under randomisation
##
## data: caba_resumen$bedrooms
## weights: lista_vecinos
##
## Moran I statistic standard deviate = 1.2902, p-value = 0.0985
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.10837966 -0.07142857 0.01942333
Asimismo, la escena detectada en las dos variables anteriores se repite en el caso de la variable baños. Nuevamente el p-valor no permite rechazar la hipótesis nula y el I de Morán, aunque esta vez es de signo negativo y da cuenta de una leve autorrelación negativa, también es próximo a cero.
moran.test(caba_resumen$bathrooms, lista_vecinos)
##
## Moran I test under randomisation
##
## data: caba_resumen$bathrooms
## weights: lista_vecinos
##
## Moran I statistic standard deviate = 0.42819, p-value = 0.3343
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## -0.01008625 -0.07142857 0.02052331
Por último, al aplicar el índice de Moran a la variable valor por metro cuadrado se observa un p valor de 0.001565. Esto permite, por un lado, rechazar la hipótesis nula y aceptar el modelo. Por otro lado, el I de Morán es de 0.35607766, lo cual da cuenta una autocorrelación espacial positiva, es decir, de un patron agrupado o cluster. En este sentido, es posible afirmar que existe una autocorrelación espacial significativa para la variable de valor por metro cuadrado por comuna de las propiedades en venta en la Ciudad Autónoma de Buenos Aires.
moran.test(caba_resumen$valor_mt, lista_vecinos)
##
## Moran I test under randomisation
##
## data: caba_resumen$valor_mt
## weights: lista_vecinos
##
## Moran I statistic standard deviate = 2.9547, p-value = 0.001565
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.35607766 -0.07142857 0.02093377
A partir de lo anterior, se procede a graficar el correlograma de Morán, en el cual se observa que para los vecinos de primer y segundo orden el índice es de signo positivo, pero cuando nos detenemos en los vecinos de tercer orden, el índice es de signo negativo. De esta manera es posible observar la Primera Ley de la Geografía de Tobler, la cual establece que cuanto más cerca estén los valores en el espacio, más parecidos van a ser, mientras que cuando dichos valores estén más distantes, su diferenciación será mayor.
Por su parte, el diagrama permite identificar que la comuna 14 se trata de un caso de gran influencia. Tal como se ha indicado anteriormente, se trata de la comuna que posee el promedio de valor por metro cuadrado más alto de la Ciudad Autónoma de Buenos Aires.
correlograma <-sp.correlogram(neighbours=vecinos,var=caba_resumen$valor_mt,order=3,method="I",zero.policy=TRUE)
plot(correlograma, main="Correlograma de Morán valor por metro cuadrado de las propiedades en venta en CABA por comuna")
diagrama <- moran.plot(caba_resumen$valor_mt, lista_vecinos, zero.policy=TRUE, labels=as.character(caba_resumen$comunas))
diagrama
## x wx is_inf labels dfb.1_ dfb.x dffit
## 1 3353.829 6905.981 FALSE 1 0.4266970768 -0.535561774 -0.63766649
## 2 3160.850 11143.957 FALSE 2 -0.0402954679 0.053311409 0.06836909
## 3 1948.101 10685.960 FALSE 3 0.0684652612 -0.050134160 0.09180599
## 4 1797.030 10840.919 FALSE 4 0.1117681492 -0.088766285 0.13366752
## 5 2374.251 17070.336 FALSE 5 0.1466117030 0.008821866 0.59457962
## 6 2458.193 8779.602 FALSE 6 -0.0107183658 -0.013073817 -0.09039610
## 7 1897.425 13620.997 FALSE 7 0.3006270028 -0.227362546 0.38521850
## 8 1267.314 5401.773 FALSE 8 -0.6649571521 0.595129757 -0.68871257
## 9 1707.318 5014.663 FALSE 9 -0.4515455134 0.370410192 -0.51661533
## 10 1849.925 5771.709 FALSE 10 -0.3037210967 0.235568684 -0.37553635
## 11 2166.966 11085.581 FALSE 11 0.0510268618 -0.028214161 0.09543926
## 12 2539.078 7650.407 FALSE 12 0.0004125051 -0.048304304 -0.18359632
## 13 3142.481 8347.815 FALSE 13 0.1641511917 -0.218605279 -0.28296388
## 14 3467.777 11018.543 TRUE 14 -0.0211096841 0.025928542 0.02996753
## 15 2340.960 16148.747 FALSE 15 0.1472549663 -0.018473218 0.49634117
## cov.r cook.d hat
## 1 1.2182345 0.1973837636 0.22629117
## 2 1.4087624 0.0025271265 0.17007845
## 3 1.2796195 0.0045350062 0.09499548
## 4 1.3037038 0.0095727047 0.11926182
## 5 0.6303918 0.1355845759 0.06668135
## 6 1.2362126 0.0043853344 0.06809094
## 7 1.0639413 0.0725115876 0.10230538
## 8 1.2912583 0.2313284248 0.26319459
## 9 1.0468945 0.1268270463 0.13719698
## 10 1.0993450 0.0697518866 0.10991808
## 11 1.2420593 0.0048867853 0.07305085
## 12 1.1768967 0.0176168758 0.07162466
## 13 1.3159975 0.0419574266 0.16536109
## 14 1.5965005 0.0004863443 0.26519001
## 15 0.7592453 0.1036856201 0.06675914
A continuación se muestra el Ii de Morán local en el caso de cada comuna de la Ciudad Autónoamde de Buenos Aires en relación con la variable valor por metro cuadrado de las propiedades en venta. Además, se detectan los valores más altos del Ii de Morán local en las comunas 14, 8, 9, 7, 2 y 13
moran_local <- localmoran(caba_resumen$valor_mt, lista_vecinos)
moran_local
## Ii E.Ii Var.Ii Z.Ii Pr(z > 0)
## 1 -0.45588981 -0.2142857 2.371890 -0.15687617 0.5623287808
## 2 3.28302639 -0.2857143 2.901915 2.09494511 0.0180879362
## 3 -1.25123481 -0.2857143 2.901915 -0.56678607 0.7145702323
## 4 1.36585899 -0.3571429 3.301637 0.94824615 0.1715020796
## 5 0.01200151 -0.5000000 3.710173 0.26581175 0.3951920953
## 6 -0.15537497 -0.2857143 2.901915 0.07651262 0.4695056365
## 7 3.35426226 -0.5000000 3.710173 2.00098671 0.0226969111
## 8 4.54637385 -0.2142857 2.371890 3.09114818 0.0009969205
## 9 3.34651605 -0.2142857 2.371890 2.31206742 0.0103869840
## 10 1.66664473 -0.2142857 2.371890 1.22130865 0.1109845896
## 11 0.35741650 -0.3571429 3.301637 0.39325446 0.3470657748
## 12 0.23726285 -0.2142857 2.371890 0.29319541 0.3846863965
## 13 2.38612743 -0.2142857 2.371890 1.68847662 0.0456598869
## 14 4.21019424 -0.2857143 2.901915 2.63921715 0.0041548867
## 15 -0.11421521 -0.4285714 3.571056 0.16635035 0.4339406233
## attr(,"call")
## localmoran(x = caba_resumen$valor_mt, listw = lista_vecinos)
## attr(,"class")
## [1] "localmoran" "matrix" "array"
Luego, se agrega la salida del Moran local a los datos por comuna para poder ubicarlos en el mapa y a continuación se normalizan las variables, se calculan los valores lag y se avanza con la estandarización de los valores.
moran_map_cabamt2 <- cbind(caba_resumen, moran_local)
head(moran_map_cabamt2)
## Simple feature collection with 6 features and 13 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: -58.4627 ymin: -34.6625 xmax: -58.33514 ymax: -34.56935
## geographic CRS: WGS 84
## barrios
## 1 CONSTITUCION - MONSERRAT - PUERTO MADERO - RETIRO - SAN NICOLAS - SAN TELMO
## 2 RECOLETA
## 3 BALVANERA - SAN CRISTOBAL
## 4 BARRACAS - BOCA - NUEVA POMPEYA - PARQUE PATRICIOS
## 5 ALMAGRO - BOEDO
## 6 CABALLITO
## perimetro area comunas rooms bedrooms bathrooms valor_mt Ii
## 1 35572.65 17802807 1 2.904527 1.951166 1.745405 3353.829 -0.45588981
## 2 21246.61 6140873 2 3.419573 2.280346 1.751014 3160.850 3.28302639
## 3 10486.26 6385991 3 2.941450 1.968401 1.259758 1948.101 -1.25123481
## 4 36277.44 21701236 4 3.301989 2.311031 1.367089 1797.030 1.36585899
## 5 12323.47 6660526 5 2.953672 1.979793 1.412026 2374.251 0.01200151
## 6 10990.96 6851029 6 2.927851 1.968466 1.498739 2458.193 -0.15537497
## E.Ii Var.Ii Z.Ii Pr.z...0. geometry
## 1 -0.2142857 2.371890 -0.15687617 0.56232878 MULTIPOLYGON (((-58.36854 -...
## 2 -0.2857143 2.901915 2.09494511 0.01808794 MULTIPOLYGON (((-58.39521 -...
## 3 -0.2857143 2.901915 -0.56678607 0.71457023 MULTIPOLYGON (((-58.41192 -...
## 4 -0.3571429 3.301637 0.94824615 0.17150208 MULTIPOLYGON (((-58.3552 -3...
## 5 -0.5000000 3.710173 0.26581175 0.39519210 MULTIPOLYGON (((-58.41287 -...
## 6 -0.2857143 2.901915 0.07651262 0.46950564 MULTIPOLYGON (((-58.43061 -...
moran_map_cabamt2$p <- moran_map_cabamt2$Pr.z...0.
z_mt2 <- moran_map_cabamt2$valor_mt - mean(moran_map_cabamt2$valor_mt)
lag_mt2 <- lag.listw(lista_vecinos, moran_map_cabamt2$valor_mt)
z_lag_mt2 <-lag_mt2 - mean(lag_mt2)
Finalmente, se grafican los valores estandarizados, lo cual permite visualizar la distribución espacial de los índices de Morán local. En este caso, a través del mapa se observa que las comunas 14 y 2 pertenecen al agrupamiento High-High, la comuna 13 al Low-High, las comunas 9 y 8 al agrupamiento Low-Low, y la comuna 7 al High-Low, dando cuenta la existencia de diferentes clusters espaciales en relación con el valor del metro cuadrado de las propiedades en venta.
quad <- vector(mode="numeric",length=nrow(moran_map_cabamt2))
quad[z_mt2 > 0 & z_lag_mt2 > 0] <- 1
quad[z_mt2 > 0 & z_lag_mt2 < 0] <- 2
quad[z_mt2 < 0 & z_lag_mt2 > 0] <- 3
quad[z_mt2 < 0 & z_lag_mt2 < 0] <- 4
quad[moran_map_cabamt2$p > 0.05] <- 5
moran_map_cabamt2$quad <- quad
LISA <- c("blue", "skyblue2","lightpink","red", "white")
tm_shape(moran_map_cabamt2) +
tm_fill(col="quad", palette = LISA, style = "fixed", breaks = c(1,2,3,4,5,6),
labels = c("High-High", "Low-High", "High-Low","Low-Low", "No significativo"),title="Agrupamientos LISA del valor por metro cuadrado de las propiedades en venta en CABA en USD") +
tm_legend(outside=TRUE)+
tm_borders(col = "Grey")
A través del presente trabajo se propuso realizar un análisis exploratorio de las características de las propiedades en venta que se utilizan como viviendas en la Ciudad Autónoma de Buenos Aires (CABA) a partir de la aplicación de herramientas de geoestadística.
Para ello, en primera instancia, fueron seleccionadas un conjunto de variables que permitieron desarrollar una primera caracterización de las propiedades en venta de la Ciudad Autónoma de Buenos Aires en función de la comuna en la que se localizan. A continuación, se procedió a la aplicación de medidas de autocorrelación espacial: el Índice de Morán Global y el Índice de Morán Local.
A partir del análisis de los datos luego de la aplicación de estas medidas de autocorrelación espacial, es posible afirmar la existencia de autocorrelación espacial positiva respecto de la variable valor por metro cuadrado de las propiedades en venta en función de la comuna en la que se localizan. En este marco, se ha podido identificar la presencia de clusters o conglomerados espaciales que permiten identificar una clara concentración de los valores por metro cuadrado en función de las comunas. Así, las comunas 14, 2 y 13 poseen los promedios más altos de valor por metro cuadradode las propiedades en venta, permitiendo visualizar claramente cómo estos valores superiores corresponden al norte de la Ciudad Autónoma de Buenos Aires, mientras que los valores más bajos corresponden al sur de dicha jurisdicción.
En este sentido, desde este abordaje que involucra a la autocorrelación espacial se presenta un panorama que permite realizar una primera lectura del estado de situación del mercado de las propiedades en la Ciudad Autónoma de Buenos Aires. Esta primera lectura evidencia la existencia de valores de las propiedades claramente diferenciados en función de las comunas, y al mismo tiempo demanda la incorporación de variables económicas, culturales, demográficas y urbanas que permitan ampliar y complejizar este análisis.