Resumen:

Entre las técnicas de análisis de información espacial encontramos los patrones puntuales (espaciales) que son utilizados para determinar lugares de ocurrencia de un evento o fenómeno por medio de una variable aleatoria que se mueve en el espacio de manera no controlada (aleatoria, no se puede fijar), encontrando entre los casos más representativos para la zona rural desastres naturales como incendios forestales, deslizamientos, avalanchas, etc. y para la zona urbana accidentes de tránsito, hurtos, homicidios, casos de Covid, etc. con lo que se puede desarrollar una interpolación del riesgo que permita tomar decisiones encaminadas a la mitigación o prevención de dicho fenómeno. El objetivo de esta práctica es determinar el tipo de patrón de los datos contenidos en una matriz de oferta inmobiliaria para el Distrito de Santiago de Cali, poder determinar las zonas con mayor localización de viviendas y dependiendo de los resultados tomar decisiones encaminadas a suplir la oferta en otras comunas tomándolo con un tipo de enfoque que se le puede dar a esta temática.

Palabras clave: oferta inmobiliaria, patrones puntuales, clúster, aleatorio, inhibición, Función K, densidad, Kernel, ráster, ShapeFile, Coordenadas Geográficas.

Abstract:

Among the spatial information analysis techniques we find the point patterns (spatial) that are used to determine places of occurrence of an event or phenomenon by means of a random variable that moves in space in an uncontrolled way (random, it cannot be fix), finding among the most representative cases for rural areas natural disasters such as forest fires, landslides, avalanches, etc. and for the urban area, traffic accidents, thefts, homicides, Covid cases, etc. With which a risk interpolation can be developed that allows making decisions aimed at mitigating or preventing this phenomenon. The objective of this practice is to determine the type of pattern of the data contained in a real estate supply matrix for the District of Santiago de Cali, to be able to determine the areas with the greatest location of homes and, depending on the results, make decisions aimed at supplying the supply in other communes taking it with a type of approach that can be given to this issue.

Keywords: real estate offer, point patterns, cluster, random, inhibition, K-function, density, Kernel, raster, ShapeFile, Geographic Coordinates.

  1. Introducción:

El área de estudio para esta practica se localiza en la zona urbana del Distrito de Santiago de Cali-Colombia en las coordenadas centrales aproximadas 3°25’69“N, 76°30’04”W, teniendo como insumos un archivo en formato ShapeFile en el sistema de referencia geográfico (WGS84) de las 22 comunas y una matriz de Excel con más de 8300 registros de oferta inmobiliaria, los cuales serán ingresados al software R y convertidos a patrón puntual, aplicando el test de chi cuadrado y función K para determinar el tipo de patrón (clúster), donde posteriormente se aplicará la función de densidad (density) con el fin de representar por medio de una imagen ráster la distribución espacial de los datos, teniendo como resultado que la oferta inmobiliaria en Cali está concentrada principalmente en las comunas 2, 3 y 17, con menos actividad sobre las comunas 13, 14, 15 y 21, donde se plantea construir viviendas de interés social tenido en cuenta los estratos menos favorecidos (1, 2 y 3).

  1. Materiales, Métodos y Procedimiento:

2.1. Materiales:

Para esta práctica utilizaremos un archivo en formato ShapeFile que contiene las 22 comunas de Santiago de Cali (Comunas_WGS84.shp), proyectado al sistema de referencia geográfico (WGS84), así como, una Tabla de Excel (Datos_Vivienda.xlsx) con registros de oferta inmobiliaria en la ciudad de Cali, en el mismo sistema de referencia.

2.2 Métodos:

Utilizamos la técnica de tratamiento espacial de patrones puntuales con el fin de identificar cuáles son las zonas de la ciudad con mayor oferta inmobiliaria y dependiendo del tipo de patrón poder tomar decisiones según las conveniencias del comprador en cuanto a variables específicas de la vivienda y de su entorno, cabe resaltar que el resultado de esta práctica solo mostrará espacialmente cuales son los sectores de la ciudad con más densidad de oferta, no las características específicas de las viviendas, ni la clasificación por zonas teniendo en cuenta variables como número de pisos, estrato, precio, área construida, parqueaderos, entre otras.

Como primera medida definimos con qué tipo de patrón cuenta los datos, para esto utilizamos el test X² (Chi cuadrado) y la función K (kest) para determinar qué tipo de metodología vamos a emplear.

Este test divide el espacio de trabajo en una retícula regular (proporciones homogéneas) y pone la cantidad de veces que ocurre el evento para cada una de las celdas, a esta matriz se le conoce como Matriz observada, esta matriz se contrasta con la matriz “esperada” que contiene valores aleatorios, comparando los valores de la matriz observada vs la matriz esperada y se define si la matriz observada es de tipo Aleatorio o no.

para esto se determina el valor de Lambda (valor esperado por celda = Suma de datos / cantidad de celdas) según los registros de la matriz observada, con este valor de Lambda se construye la distribución Poissonpp con el fin de darle valores a la matriz esperada, con esto:

X² = ∑((Obs - Esp)²/Esp)

Cuando el resultado del factor (p-value) es igual o cercano a cero quiere decir que corresponde a un tipo de patrón diferente al aleatorio o se rechaza la hipótesis de aleatoriedad o hipótesis nula, pero si por el contrario el p-value es cercano a 1, quiere decir que el patrón de los datos es aleatorio.

En esta función se define un radio alrededor de cada punto, evento o registro, que va a ir incrementando teniendo en cuenta el espacio de trabajo, la gráfica resultante va a definir el tipo de patrón de los datos. El patrón tipo clúster va a crecer muy rápido debido a que cerca de un punto siempre vamos a encontrar más puntos agregados (radios pequeños), por el contrario, en el tipo de patrón regular al principio no se van a agregar otros puntos hasta que a un radio mayor empiece a encontrar valores y los empiece a agregar.

Arranca con radios pequeños hasta radios grandes (se autogestiona para hacer el cálculo, contiene un algoritmo interno para hacer el incremento de los radios según los datos ingresados) y a diferencia del X² se puede definir según la gráfica que tipo de patrón se maneja en los datos permitiendo diferenciar entre patrón aleatorio, tipo clúster o regular.

La línea azul (Kpois) es el patrón “Aleatorio” La línea negra (Kiso) es el patrón “Observado”

Así:

Después de tener identificado el tipo de patrón, si es clúster buscamos encontrar una manera de hacer un mapa con una interpolación que muestre los niveles de aglomeración o agregación del fenómeno estudiado, esto se logra con un análisis de intensidad (función de probabilidad en 3D), la cual arroja gráficas de isolíneas que representan dicha intensidad.

La forma de estimar las densidades se logra a partir de un Kernel (forma suavizada de representación), que conserva la característica de una densidad de probabilidad (área bajo la curva igual a 1).

Kernel:

Se toma cada punto o evento y por medio de una distribución gaussiana centrada alrededor de cada X0, se promedia todo lo que esta alrededor de cada punto con su peso asociado según la lejanía, con esto se calcula el valor de cada X0 (valor que va a estar asociado al Kernel), es decir, se estima cada X0 a partir del valor de los vecinos (media ponderada), controlando el nivel de detalle por medio de la desviación estándar o valor del Kernel representado en R con el parámetro sigma (entre más grande menos suavizada será la representación y viceversa), se debe tener cuidado con el valor de este parámetro para que la representación sea adecuada. sí a la función density no se le agrega el valor de sigma, esta trabajará con el método de Peter Diggle por lo cual se recomienda en caso de que la representación no sea buena parametrizarla con diferentes valores de sigma hasta que se tenga un resultado adecuado.

2.3. Procedimiento:

##Primero definimos el espacio de trabajo en el directorio personal donde se encuentran las carpetas con el shapefiles de Comunas (Comunas_WGS84.shp) y la tabla de Excel con los registros georreferenciados de la oferta inmobiliaria en Cali (Datos_Vivienda.xlsx), verificando que quede bien direccionado.

setwd("C:/Users/Andres/Desktop/ESPECIALIZACION UNIVALLE/1. TRATAMIENTO DE DATOS ESPACIALES - LUNES 7-10 AM/CLASE 16 - 23-06-2021 Repaso y Taller Final")

getwd()
## [1] "C:/Users/Andres/Desktop/ESPECIALIZACION UNIVALLE/1. TRATAMIENTO DE DATOS ESPACIALES - LUNES 7-10 AM/CLASE 16 - 23-06-2021 Repaso y Taller Final"
##Cargamos las librerías que son necesarias para el procesamiento y visualización de la información.

library(raster)
## Loading required package: sp
library(readxl)
library(sp)
library(spatstat)
## Warning: package 'spatstat' was built under R version 4.0.5
## Loading required package: spatstat.data
## Warning: package 'spatstat.data' was built under R version 4.0.5
## Loading required package: spatstat.geom
## Warning: package 'spatstat.geom' was built under R version 4.0.5
## spatstat.geom 2.1-0
## 
## Attaching package: 'spatstat.geom'
## The following objects are masked from 'package:raster':
## 
##     area, rotate, shift
## Loading required package: spatstat.core
## Warning: package 'spatstat.core' was built under R version 4.0.5
## Loading required package: nlme
## 
## Attaching package: 'nlme'
## The following object is masked from 'package:raster':
## 
##     getData
## Loading required package: rpart
## spatstat.core 2.1-2
## Loading required package: spatstat.linnet
## Warning: package 'spatstat.linnet' was built under R version 4.0.5
## spatstat.linnet 2.1-1
## 
## spatstat 2.1-0       (nickname: 'Comedic violence') 
## For an introduction to spatstat, type 'beginner'
library(rasterVis)
## Warning: package 'rasterVis' was built under R version 4.0.5
## Loading required package: terra
## Warning: package 'terra' was built under R version 4.0.5
## terra version 1.1.4
## 
## Attaching package: 'terra'
## The following object is masked from 'package:nlme':
## 
##     collapse
## The following objects are masked from 'package:spatstat.geom':
## 
##     convexhull, coords, perimeter, rescale
## Loading required package: lattice
## 
## Attaching package: 'lattice'
## The following object is masked from 'package:spatstat.core':
## 
##     panel.histogram
## Loading required package: latticeExtra
## Warning: package 'latticeExtra' was built under R version 4.0.5
##Cargamos el ShapeFile de Comunas y la tabla de Excel con los registros de la oferta inmobiliaria.

comunas=shapefile("Comunas/Comunas_WGS84.shp")
Datos_Vivienda = read_excel("Datos_Vivienda.xlsx")
View(Datos_Vivienda)

##Al cargar la tabla de excel con los registros de oferta inmobiliaria "Datos_Vivienda" se puede ver que las columnas que contienen las coordenadas Longitud (LONG) y Latitud (LAT) son las columnas 11 y 12.

par(mfrow=c(1,1))
plot(comunas)
points(Datos_Vivienda[,11:12], col="blue")

##Sacamos un data frame solo con las coordenadas de las viviendas, debido a que nuestro interés es saber dónde ocurre el evento, no sus características.

coords=data.frame(Datos_Vivienda[,11:12])

## Con la función "spatialpoints" convertimos a ShapeFile de puntos las coordenadas obtenidas en el paso anterior en el sistema de referencia de las comunas (WGS84).

viviendas_shp=SpatialPoints(coords,proj4string = crs(comunas))

## Con la función "extract" sacamos solo las viviendas que están dentro de la zona urbana de Cali determinada por sus comunas (de la 1 a la 22).

internos=extract(comunas,viviendas_shp)
## Loading required namespace: rgeos
## Warning in proj4string(x): CRS object has comment, which is lost in output
## Warning in proj4string(y): CRS object has comment, which is lost in output
viviendas_urb=viviendas_shp[which(internos$poly.ID> 1 | internos$poly.ID< 22),]
plot(comunas)
plot(viviendas_urb,add=T,col="red")

Aquí ya tenemos graficados todos los registros de oferta inmobiliaria para Cali dentro de la zona urbana del Distrito.

##Entonces Creamos el patrón para los registros de oferta inmobiliaria en Cali:

##Primero creamos un Dataframe con las coordenadas de las viviendas al interior de la zona urbana de Cali.

coords_urb=coordinates(viviendas_urb)

##Luego le sacamos la extensión (coord. X - Y "min" y X - Y "max") para poderla poner
##dentro de la función ppp (Point Patern Analysis).

extent(comunas)
## class      : Extent 
## xmin       : -76.59076 
## xmax       : -76.46125 
## ymin       : 3.331819 
## ymax       : 3.505871
##Por ultimo creamos el patrón, haciendo uso de la función ppp a la cual se le ponen las coordenadas X (Long) y Y (Lat) obtenidas en el extent anterior.

patron_viviendas=ppp(x=coords_urb[,1],y=coords_urb[,2],window=owin(c(-76.59076 ,-76.46125),c(3.331819,3.505871)))
## Warning: data contain duplicated points
plot(patron_viviendas)

La gráfica anterior muestra el patrón puntual al cual se le aplicaran los test para determinar le tipo de patrón de los datos.

##Usamos el test X² o función quadrat.test para verificar hipótesis nula, o aleatoriedad, si es 1 o cercano a uno es porque es aleatorio, si es muy cercano de cero es porque la muestra puede ser agregada (tipo clúster) o regular.
quadrat.test(patron_viviendas)
## 
##  Chi-squared test of CSR using quadrat counts
## 
## data:  patron_viviendas
## X2 = 14297, df = 24, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 
## Quadrats: 5 by 5 grid of tiles

Debido al valor de p (muy cercano a cero) se rechaza la hipótesis nula de que sea un patrón aleatorio, por lo que el tipo de patrón puede ser agregado o regular.

##Ahora usamos la función K para determinar el tipo de patrón de los datos de forma más específica.

plot(Kest(patron_viviendas), main = "Funcion K")
## number of data points exceeds 3000 - computing border correction estimate only

Según el comportamiento de la gráfica podemos afirmar que el patrón de los datos es de tipo agregado o clúster. La línea negra (Patrón Observado) está por encima de la línea roja (Patrón Aleatorio).

##Ahora estimamos la función de intensidad "density" con un valor de Sigma = 0.01 que representa los nichos de una forma adecuada, a estos valores le agregamos los contornos:

plot(density(patron_viviendas,0.01),main="Intensidad estimada")
contour(density(patron_viviendas,0.01),add=TRUE)

##A continuación creamos la imagen ráster a partir de los datos XYZ:

intensidad=density(patron_viviendas,0.01)
intensidad=data.frame(intensidad)
intensidad_map=rasterFromXYZ(xyz =intensidad[,1:3])


##ploteamos el raster de intensidad creado anteriormente y le agregamos el shp
## de comunas mas los puntos de oferta inmobiliaria dentro de la zona urbana de Cali "coords_urb"
plot(intensidad_map, comunas=colorRampPalette(c("white", "yellow","orange","red"))(100))
## Warning in plot.window(...): "comunas" is not a graphical parameter
## Warning in plot.xy(xy, type, ...): "comunas" is not a graphical parameter
## Warning in axis(side = side, at = at, labels = labels, ...): "comunas" is not a
## graphical parameter

## Warning in axis(side = side, at = at, labels = labels, ...): "comunas" is not a
## graphical parameter
## Warning in box(...): "comunas" is not a graphical parameter
## Warning in title(...): "comunas" is not a graphical parameter
plot(comunas,add=T)
points(coords_urb,col="red")

intensidad_urb=mask(intensidad_map,comunas)
plot(intensidad_urb, comunas=colorRampPalette(c("white", "yellow","orange","red"))(100))
## Warning in plot.window(...): "comunas" is not a graphical parameter
## Warning in plot.xy(xy, type, ...): "comunas" is not a graphical parameter
## Warning in axis(side = side, at = at, labels = labels, ...): "comunas" is not a
## graphical parameter

## Warning in axis(side = side, at = at, labels = labels, ...): "comunas" is not a
## graphical parameter
## Warning in box(...): "comunas" is not a graphical parameter
## Warning in title(...): "comunas" is not a graphical parameter
plot(comunas,add=T)
points(coords_urb,col="black",pch=16,cex=0.3)

##lo graficamos en otro tipo de representacion
levelplot(intensidad_urb)

levelplot(intensidad_urb,par.settings=BuRdTheme)

3. Resultados:

Como resultado se cuenta con una imagen ráster representada con 3 formas diferentes de visualización, la primera es una gráfica de intensidad en la escala de colores blanco, naranja, amarillo, verde, en donde la convención “blanco” representa las zonas con menos influencia de la variable analizada (intensidad de oferta de vivienda), hasta las zonas en color verde que representan las zonas con mayor cantidad de viviendas. La segunda gráfica o representación del ráster es el corte de este con las comunas de Cali agregando los puntos donde se localizan las viviendas, con lo que se puede apreciar la densidad de puntos dentro de cada comuna, con esto se puede deducir que la representación con la escala de colores del ráster es concordante con los datos. La tercera representación muestra la densidad de oferta con la escala de colores azul - rojo, donde azul representa las zonas con menor influencia de la variable, blanco que corresponde a la intensidad media y rojo donde encontramos una oferta inmobiliaria mayor.

Según las imágenes ráster obtenidas se puede identificar que la oferta inmobiliaria en Cali está concentrada principalmente en las comunas 2, 3 y 17, con menos actividad sobre las comunas 13, 14, 15 y 21.

  1. Conclusiones y recomendaciones: