Como parte de la labor de asesoria de la inmobiliaria C&A un cliente internacional que requiere ubicar a dos de sus empleados, solicita orientación para la compra de dos viviendas con atributos específicos que se demarcan a continuación:
Con el fin de dar recomendaciones certeras respecto al rango de precio estimado de las viviendas especificadas, en el siguiente documento se aplican técnicas de regresión lineal múltiple haciendo uso de un set de datos que contiene información de avaluos de viviendas de los últimos tres meses en donde se demarcan elementos como caracteristicas internas del inmueble y otros aspectos como su zona, tipo y ubicación geográfica.
Para el desarrollo de este ejercicio de estimación de precio se siguen los pasos definidos en la especificación de la actividad que se encuentra en el material disponible de la Unidad 2 del curso de métodos estadísticos para la toma de decisiones de la maestria en Ciencia de Datos, de forma resumida los pasos que se seguiran para dar respuesta al requerimiento son los siguientes:
Se filtará el set de datos de viviendas de conformidad a los atributos de zona y tipo de vivienda, con el fin de tener dos sets de datos separados, y a los cuales se les llevará a cabo validación de la calidad de su información espacial con el fin de verificar que no existan puntos que se encuentren fuera de la zona especificada.
Para cada set de datos filtrado se llevará a cabo un proceso de análisis exploratorio basado en las correlaciones de la variable respuesta (precio del apartamento/vivienda) respecto a las variables área construida, estrato, numero de cuartos, numero de parqueaderos, numero de baños.
Para cada caso se estimarán modelos de regresión lineal múltiple con las variables revisadas en el análisis exploratorio, se interpretarán los coeficientes obtenidos y su significancia, añadiendo a su vez la revisión del coeficiente de determinación (R^2) el ajuste del modelo y sus implicaciones.
A Partir del modelo anterior se llevará a cabo la validación de supuestos del modelo y la interpretación de los resultados.
A partir del modelo identificado se predecirá el precio de la vivienda según las caracteristicas de la solicitud objeto de análisis (apartamento o vivienda).
A partir de las predicciones del modelo se sugerirán ofertas potenciales que correspondan a la solicitud objeto de análisis, teniendo en cuenta las restricciones presupuestales del cliente presentando 5 ofertas potenciales geolocalizadas.
La diferenciación o seccionamiento del requerimiento por tipo de vivienda y zona que se proponen en los pasos resulta conveniente para acotar la naturaleza multifactorial de la valuación de vivienda, esto teniendo en cuenta que el valor de la vivienda no solo se asocia a sus caracteristicas intrinsecas (área,número de habitaciones, número de baños, etc…) sino tambien extrinsecas en la medida que los ammenities (bienes públicos, carreteras, seguridad, etc…) tienen una influencia relevante en el precio final y tales factores no siempre se comportan de manera uniforme sino que se segmentan espacialmente lo cual da lugar a situaciones de autocorrerlación espacial que en un marco más amplio exigen herramientas metodológicas adicionales; no obstante dado que para este caso se acotan los modelos a proponer a una zona y tipo de vivienda específico las posibilidades de autocorrelación espacial o distorsiones por efectos de esta naturaleza se atenuan un poco y dan lugar a mayor confiabilidad en las posibles estimaciones.
Finalmente, para dar mayor secuencialidad al documento, cada uno de los casos de compra de vivienda tendrán una sección separada con la finalidad de tener claridad en los pasos desarrollados y facilitar la referenciación en el reporte ejecutivo final.
# Carga de paquetes
#devtools::install_github("dgonxalex80/paqueteMOD", force =TRUE)
library(paqueteMOD)
library(tidyverse)
library(moments)
library(leaflet)
library(mice)
library(VIM)
library(plotly)
library(ggplot2)
library(ggpubr)
library(lmtest)
library(MASS)
library(boot)
library(sf)
library(GGally)
library(sf)
library(car)
# Carga de datos
data("vivienda")
Una vez preparado el ambiente se procede a dar una revisión inicial al set de datos:
glimpse(vivienda)
## Rows: 8,322
## Columns: 13
## $ id <dbl> 1147, 1169, 1350, 5992, 1212, 1724, 2326, 4386, 1209, 159…
## $ zona <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur…
## $ piso <chr> NA, NA, NA, "02", "01", "01", "01", "01", "02", "02", "02…
## $ estrato <dbl> 3, 3, 3, 4, 5, 5, 4, 5, 5, 5, 6, 4, 5, 6, 4, 5, 5, 4, 5, …
## $ preciom <dbl> 250, 320, 350, 400, 260, 240, 220, 310, 320, 780, 750, 62…
## $ areaconst <dbl> 70, 120, 220, 280, 90, 87, 52, 137, 150, 380, 445, 355, 2…
## $ parqueaderos <dbl> 1, 1, 2, 3, 1, 1, 2, 2, 2, 2, NA, 3, 2, 2, 1, 4, 2, 2, 2,…
## $ banios <dbl> 3, 2, 2, 5, 2, 3, 2, 3, 4, 3, 7, 5, 6, 2, 4, 4, 4, 3, 2, …
## $ habitaciones <dbl> 6, 3, 4, 3, 3, 3, 3, 4, 6, 3, 6, 5, 6, 2, 5, 5, 4, 3, 3, …
## $ tipo <chr> "Casa", "Casa", "Casa", "Casa", "Apartamento", "Apartamen…
## $ barrio <chr> "20 de julio", "20 de julio", "20 de julio", "3 de julio"…
## $ longitud <dbl> -76.51168, -76.51237, -76.51537, -76.54000, -76.51350, -7…
## $ latitud <dbl> 3.43382, 3.43369, 3.43566, 3.43500, 3.45891, 3.36971, 3.4…
A primera vista se puede apreciar un set de datos con 13 columnas y 8322 registros de lo cuales tambien es posible apreciar que hay datos faltantes, para tener algo más de claridad respecto al problema se procede a hacer un análisis breve de datos faltantes ejecutando la creación de una función para conocer las proporciones de estos por columna:
#Montaje de función
missing_data_prop<- function(x){ sum(is.na(x))/length(x)*100}
#Aplicación de la función sobre el set de datos
apply(vivienda,2,missing_data_prop)
## id zona piso estrato preciom areaconst
## 0.03604903 0.03604903 31.69911079 0.03604903 0.02403268 0.03604903
## parqueaderos banios habitaciones tipo barrio longitud
## 19.28622927 0.03604903 0.03604903 0.03604903 0.03604903 0.03604903
## latitud
## 0.03604903
Al revisar las proporciones de datos faltantes se puede apreciar que las variables con mayor porcentaje de valores faltantes son “parqueaderos” y “piso” en donde la primera variable tiene un 19,28% de valores faltantes respecto a su total de registros, y la segunda tiene una proporción de 31,699%. Por otro lado se puede apreciar una proporcíon persistente de 0.03% de valor faltante asociado a 3 registros sin id, estos 3 registros pueden ser removidos ya que no quedaron debidamente registrados con su id único, a su vez los registros sin precio tampoco son de interés ya que en este caso tal variable resulta critica para el análisis a realizar, para realizar la remoción de los registros se hará uso de la función complete.cases
vivienda<- vivienda[complete.cases(vivienda[,c("id","preciom")]),]
glimpse(vivienda)
## Rows: 8,319
## Columns: 13
## $ id <dbl> 1147, 1169, 1350, 5992, 1212, 1724, 2326, 4386, 1209, 159…
## $ zona <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur…
## $ piso <chr> NA, NA, NA, "02", "01", "01", "01", "01", "02", "02", "02…
## $ estrato <dbl> 3, 3, 3, 4, 5, 5, 4, 5, 5, 5, 6, 4, 5, 6, 4, 5, 5, 4, 5, …
## $ preciom <dbl> 250, 320, 350, 400, 260, 240, 220, 310, 320, 780, 750, 62…
## $ areaconst <dbl> 70, 120, 220, 280, 90, 87, 52, 137, 150, 380, 445, 355, 2…
## $ parqueaderos <dbl> 1, 1, 2, 3, 1, 1, 2, 2, 2, 2, NA, 3, 2, 2, 1, 4, 2, 2, 2,…
## $ banios <dbl> 3, 2, 2, 5, 2, 3, 2, 3, 4, 3, 7, 5, 6, 2, 4, 4, 4, 3, 2, …
## $ habitaciones <dbl> 6, 3, 4, 3, 3, 3, 3, 4, 6, 3, 6, 5, 6, 2, 5, 5, 4, 3, 3, …
## $ tipo <chr> "Casa", "Casa", "Casa", "Casa", "Apartamento", "Apartamen…
## $ barrio <chr> "20 de julio", "20 de julio", "20 de julio", "3 de julio"…
## $ longitud <dbl> -76.51168, -76.51237, -76.51537, -76.54000, -76.51350, -7…
## $ latitud <dbl> 3.43382, 3.43369, 3.43566, 3.43500, 3.45891, 3.36971, 3.4…
apply(vivienda,2,missing_data_prop)
## id zona piso estrato preciom areaconst
## 0.00000 0.00000 31.67448 0.00000 0.00000 0.00000
## parqueaderos banios habitaciones tipo barrio longitud
## 19.25712 0.00000 0.00000 0.00000 0.00000 0.00000
## latitud
## 0.00000
Con la operación realizada se puede observar que ahora el set de datos cuenta con 8319 registros, y ahora las proporciones persistentes de 0,03% se han convertido en 0%, bajo este escenario los datos existentes tienen la mayoria de campos completos a excepción del piso y el parqueadero.
Dado que el análisis exige realizar un análisis especificado por tipo de vivienda y área, en las siguientes lineas de código por medio de dplyr se crean dos bases de datos, la primera “base1” que contiene casas en zona norte y “base2” que contiene apartamentos en la zona sur de la ciudad. Adicionalmente en el proceso se realizan algunas correciones en tipo de dato convirtiendo las variables categoricas como estrato,barrio en tipo factor.
base1<- vivienda %>%
dplyr::filter(tipo=="Casa",zona=="Zona Norte") %>%
mutate(estrato=as.factor(estrato),barrio=as.factor(barrio))
base2<- vivienda %>%
dplyr::filter(tipo=="Apartamento",zona=="Zona Sur") %>%
mutate(estrato=as.factor(estrato),barrio=as.factor(barrio))
Los datasets definitivos son los siguientes:
glimpse(base1)
## Rows: 722
## Columns: 13
## $ id <dbl> 1209, 1592, 4057, 4460, 6081, 7824, 7987, 3495, 141, 243,…
## $ zona <chr> "Zona Norte", "Zona Norte", "Zona Norte", "Zona Norte", "…
## $ piso <chr> "02", "02", "02", "02", "02", "02", "02", "03", NA, NA, N…
## $ estrato <fct> 5, 5, 6, 4, 5, 4, 5, 5, 3, 3, 3, 3, 5, 3, 4, 4, 5, 5, 4, …
## $ preciom <dbl> 320, 780, 750, 625, 750, 600, 420, 490, 230, 190, 180, 50…
## $ areaconst <dbl> 150, 380, 445, 355, 237, 160, 200, 118, 160, 435, 120, 21…
## $ parqueaderos <dbl> 2, 2, NA, 3, 2, 1, 4, 2, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ banios <dbl> 4, 3, 7, 5, 6, 4, 4, 4, 2, 0, 3, 6, 5, 5, 3, 3, 4, 5, 5, …
## $ habitaciones <dbl> 6, 3, 6, 5, 6, 5, 5, 4, 3, 0, 3, 6, 4, 8, 4, 3, 4, 6, 4, …
## $ tipo <chr> "Casa", "Casa", "Casa", "Casa", "Casa", "Casa", "Casa", "…
## $ barrio <fct> acopi, acopi, acopi, acopi, acopi, acopi, acopi, acopi, a…
## $ longitud <dbl> -76.51341, -76.51674, -76.52950, -76.53179, -76.54044, -7…
## $ latitud <dbl> 3.47968, 3.48721, 3.38527, 3.40590, 3.36862, 3.42125, 3.4…
Para el caso de análisis 1 se cuenta con una muestra de 722 predios tipo apartamento en la zona deseada para la compra del inmueble.
glimpse(base2)
## Rows: 2,787
## Columns: 13
## $ id <dbl> 5098, 698, 8199, 1241, 5370, 6975, 5615, 6262, 7396, 6949…
## $ zona <chr> "Zona Sur", "Zona Sur", "Zona Sur", "Zona Sur", "Zona Sur…
## $ piso <chr> "05", "02", NA, NA, NA, "06", "08", NA, NA, NA, "10", "05…
## $ estrato <fct> 4, 3, 6, 3, 3, 4, 3, 3, 3, 4, 3, 5, 6, 3, 3, 5, 5, 5, 6, …
## $ preciom <dbl> 290, 78, 875, 135, 135, 220, 210, 105, 115, 220, 230, 344…
## $ areaconst <dbl> 96, 40, 194, 117, 78, 75, 72, 68, 58, 84, 63, 107, 182, 7…
## $ parqueaderos <dbl> 1, 1, 2, NA, NA, 1, 2, NA, 1, NA, 1, 2, 2, 1, 1, 2, 1, 2,…
## $ banios <dbl> 2, 1, 5, 2, 1, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 4, 2, 4, 3, …
## $ habitaciones <dbl> 3, 2, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3, 3, 3, 3, 3, 2, 3, 3, …
## $ tipo <chr> "Apartamento", "Apartamento", "Apartamento", "Apartamento…
## $ barrio <fct> acopi, aguablanca, aguacatal, alameda, alameda, alf√©rez …
## $ longitud <dbl> -76.53464, -76.50100, -76.55700, -76.51400, -76.53600, -7…
## $ latitud <dbl> 3.44987, 3.40000, 3.45900, 3.44100, 3.43600, 3.39109, 3.4…
Para el caso de análisis 2 se cuenta con una muestra de 2787 predios tipo apartamento en la zona deseada para la compra del inmueble.
Como parte inicial de este análisis se validará la calidad de los datos de casa respecto a su ubicación geográfica, para llevar a cabo este proceso se hará uso del paquete leaflet para verificar la ubicación de los puntos:
mapa_casas_norte<-leaflet(base1) %>%
addTiles() %>%
addCircleMarkers(lng=~longitud,lat=~latitud,radius=3)
mapa_casas_norte
Al revisar la distribución espacial de los puntos de las viviendas se puede apreciar que hay varios puntos que estan totalmente fuera del norte de la ciudad de Cali y estan ubicados al sur, esto puede deberse a dos razones, la primera puede estar relacionada a un error en la digitación de la coordenada del predio, y la otra razón puede estar asociada a un error en el etiquetado de los datos en la variable “zona”, dependiendo del caso, las implicaciones pueden ser distintas:
Si es un error de digitación en la coordenada: En este caso a nivel de modelación no habria mayor inconveniente ya que simplemente corresponde a un dato con una ubicación distorsionada por un error humano y por lo tanto se asumiria que efectivamente el predio esta en el norte de la ciudad, en donde las condiciones externas de los inmuebles son relativamente similares; el único inconveniente que presentaría esto es la presentación de mapas al cliente final, ya que habrán ofertas potenciales ubicadas de forma erronea.
Si es un error de etiquetado de los datos en la variable zona: Este caso resulta mucho más crítico ya que como se menciono la determinación del precio de la vivienda esta asociado a factores tanto internos como externos, por lo tanto si se toma información de predios en zonas totalmente disimiles o diferentes los precios pueden variar significativamente a causa de efectos espaciales que pueden afectar la precisión del modelo de regresión a estimar; seguidamente si se aterriza al contexto de Cali, la zona sur tiene una concentración mayor de estratos altos en donde los precios son mucho más elevados.
Para validar con mayor precisión los atributos de los puntos que no estan ubicados en el norte procedamos a generar un mapa que marque de un color cada estrato de la siguiente manera:
colores_estrato<- colorFactor(palette = "Set2", domain=base1$estrato)
mapa_dis_estrato<-leaflet(base1) %>%
addTiles() %>%
addCircleMarkers(lng=~longitud,lat=~latitud,color=~colores_estrato(estrato),radius=3,popup = ~estrato,label=~estrato)
mapa_dis_estrato
Como puede apreciarse los datos más ubicados al sur efectivamente son estrato 6, y aquellos ubicados hacia el centro y al occidente son en su mayoria estrato 4 o 5.
Dados estos hallazgos se hace conveniente limpiar el set de datos con el fin de tener información certera y que no genere distorsión en las estimaciones que se realizarán en puntos posteriores, para esto, se visualizaran los puntos sobre un shape y a partir de esto se hará posteriormente un join entre puntos y poligonos con el fin de marcar o remover aquellos puntos ubicados en poligonos que no esten efectivamente al norte.
shape_cali<- st_read("cali.shp")
## Reading layer `cali' from data source
## `C:\Users\DAVID\Documents\Trabajos con R\Projects\R-Projects\ReporteRegresiónMultiple\Actividad3_RegresionMultiple\cali.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 22 features and 20 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -76.59257 ymin: 3.279973 xmax: -76.46047 ymax: 3.505599
## Geodetic CRS: WGS 84
mapa_shape<- leaflet(shape_cali) %>%
addTiles() %>%
addPolygons(
color="#444444",
smoothFactor = 0.5,
opacity = 1.0,
fillOpacity = 0.2,
layerId=~shape_cali$NOMBRE,
label=~shape_cali$NOMBRE
) %>%
addCircleMarkers(lng=base1$longitud,lat=~base1$latitud,color=~colores_estrato(base1$estrato),radius=1,popup = ~base1$estrato,label=~base1$estrato)
mapa_shape
Al revisar el cruce entre los puntos y el shape se puede apreciar que los puntos de interés que demarcan el norte de la ciudad corresponden a las comunas 7,8,9.3,2,6 y 1, con este criterio definido se procede a realizar un join espacial entre puntos y poligonos con el fin de etiquetar cada punto por comuna, este proceso se realiza a través del paquete sf.
### Preparación para spatial join entre coordenadas y poligonos del shape
points_base1<- base1 %>%
dplyr::select("id","longitud","latitud")
point_b1_convert<- st_as_sf(points_base1,coords=c("longitud","latitud"))
crs<-st_crs("+init=epsg:4326")
## Warning in CPL_crs_from_input(x): GDAL Message 1: +init=epsg:XXXX syntax is
## deprecated. It might return a CRS with a non-EPSG compliant axis order.
st_crs(point_b1_convert)<-crs
extended_df<- st_join(point_b1_convert,st_make_valid(shape_cali),left=FALSE) %>%
dplyr::select("id","NOMBRE") %>%
st_drop_geometry()
#Reconversión a dataframe
extended_df<- as.data.frame(extended_df) %>%
dplyr::select("id","NOMBRE")
# Join del atributo nombre de comuna del shape
base1<- base1 %>%
inner_join(extended_df,by="id")
Con el join espacial realizado ahora es posible filtrar el set de datos por comuna con la finalidad de tener unicamente los puntos que corresponden a la zona norte de Cali de acuerdo a las comunas 7,8,9.3,2,6 y 1; en la siguiente porcion de código se realiza el filtrado correspondiente
comunas<- c("COMUNA 1","COMUNA 2","COMUNA 3","COMUNA 6","COMUNA 8","COMUNA 9","COMUNA 7","COMUNA 4","COMUNA 5")
base1_acotada<- base1 %>%
dplyr::filter(NOMBRE %in% comunas)
Para validar la efectividad del join espacial se realiza nuevamente el mapa para validar que todas las observaciones esten en el espacio esperado:
mapa_shape2<-leaflet(base1_acotada) %>%
addTiles() %>%
addCircleMarkers(lng=~longitud,lat=~latitud,radius=3,color=~colores_estrato(base1_acotada$estrato),popup = ~base1_acotada$estrato,label=~base1_acotada$estrato)
mapa_shape2
El proceso de join espacial ha surtido efecto y ahora tenemos 609 observaciones acotadas en el norte de la ciudad y que pueden asegurar evitar sesgos en la estimación por motivos espaciales. Con el problema de zona resuelto.
Antes de proceder a realizar un análisis exploratorio conviene revisar el caso particular de “NA” para parqueaderos validando sus valores unicos existentes, ya que si los “NA” estan siendo usados para demarcar ausdencia de parqueaderos convendria llevar a cabo una imputación para reemplazar estos valores por 0, a continuación se revisa este punto haciendo uso de la función unique()
unique(base1_acotada$parqueaderos)
## [1] 2 NA 1 4 3 6 5 7 8 10 9
Al revisar los valores disponibles se puede apreciar que no hay ningún valor para expresar ausencia de parqueadero, por lo tanto conviene imputar los “NA” cambiandolos por 0
base1_acotada<- base1_acotada %>%
mutate_at(c("parqueaderos"),~replace_na(.,0))
unique(base1_acotada$parqueaderos)
## [1] 2 0 1 4 3 6 5 7 8 10 9
apply(base1_acotada,2,missing_data_prop)
## id zona piso estrato preciom areaconst
## 0.00000 0.00000 46.46962 0.00000 0.00000 0.00000
## parqueaderos banios habitaciones tipo barrio longitud
## 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
## latitud NOMBRE
## 0.00000 0.00000
Ahora al revisar las proporciones de valores faltantes se tiene que la única columna con esta condición es piso, no obstante esta variable no resulta relevante para el análisis a llevar a cabo, por lo tanto es posible prescindir de ella como columna en la base de datos principal.
base1_acotada<- base1_acotada %>%
dplyr::select(.,-"piso")
glimpse(base1_acotada)
## Rows: 609
## Columns: 13
## $ id <dbl> 1209, 1592, 141, 504, 565, 604, 1003, 1840, 2013, 2014, 2…
## $ zona <chr> "Zona Norte", "Zona Norte", "Zona Norte", "Zona Norte", "…
## $ estrato <fct> 5, 5, 3, 3, 3, 5, 3, 5, 3, 3, 5, 5, 5, 4, 3, 6, 6, 3, 5, …
## $ preciom <dbl> 320, 780, 230, 180, 500, 520, 380, 395, 270, 270, 460, 39…
## $ areaconst <dbl> 150, 380, 160, 120, 210, 455, 300, 165, 330, 330, 319, 35…
## $ parqueaderos <dbl> 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ banios <dbl> 4, 3, 2, 3, 6, 5, 5, 4, 3, 3, 5, 3, 3, 6, 0, 5, 3, 3, 2, …
## $ habitaciones <dbl> 6, 3, 3, 3, 6, 4, 8, 4, 0, 0, 4, 6, 3, 7, 0, 5, 3, 5, 3, …
## $ tipo <chr> "Casa", "Casa", "Casa", "Casa", "Casa", "Casa", "Casa", "…
## $ barrio <fct> acopi, acopi, acopi, acopi, acopi, acopi, acopi, acopi, a…
## $ longitud <dbl> -76.51341, -76.51674, -76.48641, -76.49768, -76.49899, -7…
## $ latitud <dbl> 3.47968, 3.48721, 3.44956, 3.47060, 3.44843, 3.46284, 3.4…
## $ NOMBRE <chr> "COMUNA 2", "COMUNA 2", "COMUNA 7", "COMUNA 5", "COMUNA 8…
Con las operaciones realizadas se finaliza el proceso de análisis y validación de la calidad de la información espacial y de otras particularidades del set de datos, a partir de esto se recomienda a la inmobiliaria C&A tener en cuenta lo siguiente:
Hacer validaciones rigurosas del etiquetado de zona y su ubicación geográfica con el fin de evitar sesgos en procesos de análisis, pero tambien imprecisiones en procesos de oferta a los clientes, tener etiquetado un inmueble con una zona totalmente desfasada puede conducir a hacer ofertas o sugerencias especficas lo cual llevará al cliente final a dudar de la idoneidad de la inmobiliaria.
Se recomienda evitar dejar campos vacios o “NA” para denotar “ausencia”, en caso de variables que expresan conteo es preferible usar un 0.
Inicialmente se generan estadísticos básicos para las variables disponibles:
summary(base1_acotada)
## id zona estrato preciom areaconst
## Min. : 88 Length:609 3:212 Min. : 89.0 Min. : 30.0
## 1st Qu.: 654 Class :character 4:129 1st Qu.: 245.0 1st Qu.: 140.0
## Median :1660 Mode :character 5:233 Median : 380.0 Median : 240.0
## Mean :2219 6: 35 Mean : 429.6 Mean : 261.1
## 3rd Qu.:3588 3rd Qu.: 540.0 3rd Qu.: 336.0
## Max. :8319 Max. :1940.0 Max. :1440.0
##
## parqueaderos banios habitaciones tipo
## Min. : 0.000 Min. : 0.000 Min. : 0.000 Length:609
## 1st Qu.: 0.000 1st Qu.: 2.000 1st Qu.: 3.000 Class :character
## Median : 1.000 Median : 3.000 Median : 4.000 Mode :character
## Mean : 1.417 Mean : 3.512 Mean : 4.581
## 3rd Qu.: 2.000 3rd Qu.: 4.000 3rd Qu.: 5.000
## Max. :10.000 Max. :10.000 Max. :10.000
##
## barrio longitud latitud NOMBRE
## la flora : 91 Min. :-76.59 Min. :3.434 Length:609
## villa del prado : 37 1st Qu.:-76.53 1st Qu.:3.464 Class :character
## el bosque : 35 Median :-76.52 Median :3.473 Mode :character
## san vicente : 29 Mean :-76.51 Mean :3.472
## vipasa : 29 3rd Qu.:-76.50 3rd Qu.:3.483
## prados del norte: 26 Max. :-76.48 Max. :3.496
## (Other) :362
Este acercamiento inicial a las variables permite identificar algunos aspectos relevantes de la zona:
Si se contrastan estos hallazgos generales con la necesidad del cliente, sería posible decir que el requerimiento se acerca bastante a una vivienda promedio del sector, lo cual incrementa de manera importante las ofertas potenciales.
Ahora se enfatizará en la estructura de la distribución del precio y algunas relaciones con variables categoricas con el fin de conocer la incidencia de algunos atributos en el precio.
Primero se revisa la distribución del precio de las viviendas:
options(repr.plot.width=15, repr.plot.height=25)
limite_presupuesto=350
histo_precio<- ggplot(base1_acotada,aes(x=preciom))+geom_histogram()+
geom_vline(aes(xintercept = limite_presupuesto,col="limite presupuestal"),linetype="dashed",size=1)+theme_light()+
labs(y="Conteo",x="Precio millones")+theme(legend.position = "bottom")
boxpl_precio <- ggplot(base1_acotada,aes(x=preciom))+geom_boxplot(varwidth = TRUE,outlier.colour='red')+
geom_vline(aes(xintercept = limite_presupuesto,col="limite presupuestal"),linetype="dashed",size=1)+theme_light()+
labs(x="Precio millones")+
theme(legend.position = "bottom")
arreglo1<- ggarrange(histo_precio,boxpl_precio,ncol=2,nrow=1)
annotate_figure(arreglo1, top = text_grob("Distribución precio (millones) viviendas tipo casa - zona norte",
color = "black", face = "bold", size = 14))
generar_tabla_estad(base1_acotada,base1_acotada$preciom,"precio")
## [,1]
## promedio 429.5977
## mediana 380
## varianza 68169.15
## desv_est 261.0922
## CV 0.6077598
## simetria 1.901594
## Kurtosis 8.703844
## Shapiro_value_W 0.8523958
## Shapiro_pvalue 2.049439e-23
## Q1 245
## Q3 540
## variable_analizada "precio"
La revisión gráfica y de las propiedades de la variable precio permiten confirmar su sesgo a la derecha, y además dan lugar a confirmar un perfil de distribución leptocurtica que dadas sus propiedades se aleja de una distribución normal presentando además varios outliers que corresponden a viviendas con costos mayores o iguales a 1000 millones de pesos. Por otro lado la linea naranja trazada permite identificar que hay una proporción importante de viviendas que cumplen el requerimiento de precio del usuario para este primer caso.
Ahora veamos el comportamiento del precio promedio de la vivienda respecto a atributos como el estrato, la comuna y el barrio:
Al revisar las gráficas anteriores es posible identificar algunos aspectos importantes:
El estrato 3 tiene las viviendas con precios mas asequibles teniendo una mediana de 212 millones, seguido por el estrato 4 que cuenta con un precio mediano de 380 millones; de acuerdo a las limitaciones prespuestales del cliente la distribución del precio respecto al estrato muestra con claridad que una vivienda estrato 6 seria inalcanzable ya que el precio minimo de este estrato es de 430 millones; al revisar las preferencias exactas del usuario por estratos 4 y 5 se puede evidenciar con este análisis que hay una buena cantidad de viviendas que pueden cumplir con el requerimiento en lo que respecta a precio.
La comuna con precio promedio más elevado es la comuna 1, a su vez las comunas con precios mas atráctivos son la 5,6,7 y 8, no obstante de acuerdo a las restricciones del cliente habria posibilidad presupuestal de adquirir un inmueble en casi todas las comunas con excepción de la 1.
Barrios como menga, centenario, base aérea y las delicias son presupuestalmente inviables para el usuario, no obstante la proporción de barrios con precios accesibles es mucho mayor.
Una vez conocidos más en profundidad los pormenores del precio se procede a realizar un análisis exploratorio de carácter correlacional entre el precio y las variables área construida,estrato, número de baños,numero de habitaciones y número de parqueaderos:
Variable respuesta VS variables predictoras
options(repr.plot.width=30, repr.plot.height=30)
ggpairs(base1_acotada,columns=3:8,
aes(color=estrato,
alpha=0.4))
La gráfica de correlación realizada con las variable de interés permite identificar la correlación entre las variables cuantitativas, pero dado que GGally tambien involucra la variable tipo categórica estrato permite ver las diferencias de distribución que supone cada uno de ellos, en este sentido se puede analizar desde una vertiente correlacional entre la variable respuesta y las predictoras y tambien se puede realizar un breve análisis respecto a las implicaciones del estrato.
En lo que respecta a las correlaciones entre la variable precio y las demás variables cuantitativas se pueden identificar las siguientes correlaciones:
Precio vs # habitaciones -> 0.401 indica una correlación lineal positiva debil, lo cual indica en que en cierto grado un mayor número de habitaciones podría inlfuir en un precio final mayor.
Precio vs # baños -> 0.549 indica una correlación lineal positiva debil, lo cual indica en que en cierto grado un mayor número de baños podría inlfuir en un precio final mayor.
Precio vs # parqueaderos -> 0.406 indica una correlación lineal positiva debil, lo cual indica en que en cierto grado un mayor número de parqueaderos podría inlfuir en un precio final mayor.
Precio vs Área construida -> 0.740 indica una correlación lineal positiva fuerte, lo cual indica en que en cierto grado una casa más grande podría inlfuir en un precio final mayor.
Finalmente en lo que respecta a la interacción entre el estrato y las variables es posible identificar que en promedio las casas estrato 3 tienen una menor área construida, menos parqueaderos y menos baños que casas de mayor estrato, en contraste a este caso las casas estrato 6 superan en promedio a los demás estratos respecto a estos atributos, no obstante la variable más influyente en la determinación del precio en este estrato resulta ser el área. Finalmente los estratos deseados por el cliente conservan atributos intermedios favorables a las preferencias y que además tambien tienen potencial de ajustarse al presupuesto disponible.
Correlación entre variables predictoras
ggpairs(base1_acotada,columns=5:8,
aes(color=estrato,
alpha=0.4))
Al revisar la correlación entre las variables predictoras se puede observar que la mayoria de ellas conservan correlaciones lineales positivas debiles entre si, teniendo ligeras excepciones entre habitaciones y baños que muestran una correlación de 0.623 y que eventualmente podrian generar un problema de multicolinealidad que deberá validarse posteriormente en la fase de modelación.
El análisis de correlación realizado permite identificar que las variables seleccionadas efectivamente cuentan con cierto grado de asociación lineal, y a su vez la variable categórica estrato muestra ser influyente, por lo tanto se torna adecuado estimar un modelo de regresión lineal múltiple.
Partiendo del análisis exploratorio realizado y siguiendo los pasos delimitados al inicio se plantea estimar el siguiente modelo:
como puede apreciarse en la formulación del modelo, se cuenta con variables dummy que demarcan el estrato,en algunos casos para tratar este tipo de datos se hace one-hot-encoding o se generan variables adicionales, no obstante, en este caso se aprovecha el tipo de dato “factor” de R que esta especialmente diseñado para variables categóricas y al ser introducido en una función lm() esta automáticamente estima el modelo con la dummy asociada a cada nivel del factor tomando una categoria base.
En las siguientes lineas de código se estima el modelo y se generan alguna métricas relacionadas a bondad de ajuste:
modelo_base1<- lm(preciom~areaconst+parqueaderos+banios+habitaciones+estrato,data=base1_acotada)
summary(modelo_base1)
##
## Call:
## lm(formula = preciom ~ areaconst + parqueaderos + banios + habitaciones +
## estrato, data = base1_acotada)
##
## Residuals:
## Min 1Q Median 3Q Max
## -956.58 -70.58 -13.75 37.55 1080.14
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 20.14354 18.86942 1.068 0.286164
## areaconst 0.79313 0.04804 16.512 < 2e-16 ***
## parqueaderos 9.26338 4.73764 1.955 0.051014 .
## banios 23.14354 6.05644 3.821 0.000147 ***
## habitaciones 6.24901 4.71057 1.327 0.185147
## estrato4 75.71684 18.87510 4.011 6.80e-05 ***
## estrato5 124.91846 18.25899 6.841 1.94e-11 ***
## estrato6 269.92663 31.54784 8.556 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 155.1 on 601 degrees of freedom
## Multiple R-squared: 0.6512, Adjusted R-squared: 0.6472
## F-statistic: 160.3 on 7 and 601 DF, p-value: < 2.2e-16
Al revisar lo resultados del modelo se puede identificar lo siguiente:
En lo que respecta a significancia individual de los estimadores se puede apreciar a través de la prueba t que:
Los estimadores del intercepto, el número de parqueaderos y las habitaciones no son significativos individualmente teniendo en cuenta que el valor p de la prueba t es mayor a 0.05 lo cual lleva a no rechazar la hipotesis nula que significa que el valor de estos betas es 0.
Los estimadores de área construida, baños, y las dummies estrato4,estrato5 y estrato6 son significativas individualmente teniendo en cuenta que el valor de la prueba t es menor a 0,05 lo cual lleva a no tener evidencia suficiente para aceptar la hipotesis nula, por lo tanto el valor de los betas es diferente de 0.
Al validar el valor de la prueba F de significancia global se puede apreciar que el valor p es menor a 0.05 por lo tanto esto lleva a a no tener evidencia suficiente para aceptar la hipotesis nula, por lo tanto el modelo en su conjunto es estadisticamente significativo.
Al interpretar los coeficientes se tiene lo siguiente:
Por simple inspección los signos de los coeficientes son adecuados y son consistentes respecto al hecho de que una casa con mayores adecuaciones o comodidades tendrá un valor mayor.
Al puntualizar en los valores de cada coeficiente se tiene lo siguiente:
areaconst 0.79313 -> El coeficiente nos indica que por cada metro cuadrado adicional el valor de la vivienda tendrá un aumento promedio de 0.79 millones de pesos (es decir 790.000 pesos). [Esto mientras lo demás permanece constante]
parqueaderos 9.26338 -> El coeficiente nos indica que por cada parqueadero adicional el valor de la vivienda tendrá un aumento promedio de 9.26 millones de pesos. [Esto mientras lo demás permanece constante]
banios 23.14354 -> El coeficiente indica que por cada baño adicional el valor de la vivienda tendrá un aumento promedio de 23,14 millones de pesos. [Esto mientras lo demás permanece constante]
habitaciones 6.24901 -> El coeficiente indica que por cada habitación adicional el valor de la vivienda tendrá un aumento promedio de 6,24 millones de pesos. [Esto mientras lo demás permanece constante]
estrato4 -> El coeficiente indica que en promedio una casa estrato 4 costará 75 millones más que una estrato 3.
estrato5 -> El coeficiente indica que en promedio una casa estrato 5 costará 124,91 millones más que una estrato 3.
estrato6 -> El coeficiente indica que en promedio una casa estrato 6 costará 269,92 millones más que una estrato 3.
En lo que respecta a bondad del ajuste se puede apreciar que la regresión presenta un coeficiente de determinación de 0.6512 que indica que el modelo esta en capacidad de explicar un 65,12% la variación de la variable precio.
La bondad de ajuste de este modelo no es mala, pero tampoco resulta ser la mejor, algunas de las razones de este problema de ajuste pueden deberse en principio a que la variable dependiente no tiene una distribución normal y además tiene múltiples valores atipicos anteriormente identificados en el análisis exploratorio, seguramente realizando algunas transformaciones sobre la variable respuesta el ajuste puede tener una mejora considerable ya que se suavizará el efecto de los átipicos y se trabajará bajo una distribución mucho más suavizada que no solo cumplirá mejor con los supuestos de la RLM sino tambien presentará un mejor grado de ajuste.
Para dar mayor fuerza a lo antes mencionado a continuación se revisan las gráficas de residuales del modelo con el fin de identificar posibles problemas del modelo:
par(mfrow = c(2, 2))
plot(modelo_base1)
Al observar las gráficas de los residuales se puede apreciar lo siguiente:
Los gráficos residuals vs fitted y scale-location permiten apreciar que la varianza se ve distorsionada por los valores átipicos generando una perturbación en la linea roja que demarca la trayectoria que idealmente deberia ser lineal horizontal, pero que se desvia en los valores superiores, lo cual puede verse influido por la distribución de la variable respuesta y por la distribución de otras variables como el área construida. El patrón identificado lleva a pensar en un posible problema de heterocedasticidad.
Al revisar el gráfico de normalidad se puede apreciar que los residuales no se ajustan de manera satisfatoria a la linea y que presentan importantes desviaciones influidas por los valores atipicos.
El gráfico de residuals vs leverage confirma la existencia de valores influyentes sobre el modelo que se confirman ante la ubicación de un punto por encima de la distancia de cook, lo cual indica que la remoción de atipicos podría tener un impacto sobre el resultado final del modelo.
La convergencia de estos aspectos revisados gráficamente dan lugar para perfilar posibles problemas de heterocedasticidad, normalidad e inclusive posibles problemas de autocorrelación. Con el fin de confirmar la posibilidad de existencia de los problemas mencionados más adelante se aplicarán pruebas de diagnóstico, no obstante previamente se validará si el presente modelo tiene problemas de multicolinealidad por medio del cálculo del VIF (Variance Inflation Factor) a través del paquete car
vif(modelo_base1)
## GVIF Df GVIF^(1/(2*Df))
## areaconst 1.645327 1 1.282703
## parqueaderos 1.356976 1 1.164893
## banios 2.117087 1 1.455021
## habitaciones 1.852786 1 1.361171
## estrato 1.670129 3 1.089244
Al revisar los valores del VIF se puede observar que todos los valores son menores a 5 lo cual permite confirmar que el modelo planteado no tiene problemas de multicolinealidad.
Ahora que esta confirmada la ausencia de multicolinealidad se procede a validar los demás problemas haciendo uso de una función creada a la medida que consolida en una tabla los siguientes valores:
tabla_test_base1<- generar_tabla_test(modelo_base1)
tabla_test_base1
## BP
## r_2 6.512469e-01
## r2_ajust 6.471849e-01
## breuschpagan_p_Value 6.791701e-23
## breuschgodfrey_p_value 3.314197e-05
## durbin_estat 1.662035e+00
## durbin_pval 1.040259e-05
## shapiro_w_pval 3.873274e-27
## Akaike_inf_crit 7.881767e+03
## Bayesian_inf_crit 7.921474e+03
## box_cox_lambda -2.020202e-02
Al analizar los valores obtenidos para cada test se puede decir lo siguiente respecto al modelo:
Los aspectos mencionados dan lugar a concluir que el modelo planteado incumple los supuestos en los errores y ante estos inconvenientes seria recomendable:
Probar transformaciones sobre la variables respuesta y las variables predictoras; dado el resultado de box-cox seria pertinentes probar variantes log-lineal y log-log.
Sería relevante analizar que tan impactante seria remover los valores atipicos de la muestra teniendo en cuenta que el análisis detallado permite demarcar presencia de observaciones influyentes. Una vez se remuevan los atipicos seria convenientes volver a estimar el modelo.
Dados los hallazgos a nivel de diferenciación de estrato y comuna, seria conveniente explorar autocorrelación espacial de los datos y llevar a cabo un ejercicio de regresión espacial, junto a cálculo de indicadores como I de Moran y G local para generar mapas temáticos que reflejen la variabilidad de los precios en la zona analizada.
Siguiendo el curso metodológico propuesto a partir del modelo analizado en la sección anterior se llevará a cabo la predicción introduciendo en el modelo los requerimientos del cliente para la casa en la zona norte con el fin de conocer el precio promedio que podria estar pagando por esta vivienda, para llevar a cabo esto se crea un dataframe con los atributos con el fin de introducirlos como input en el modelo.
requerimientos_cliente<-data.frame(
estrato=c(4,5),
areaconst=c(200,200),
parqueaderos=c(1,1),
banios=c(2,2),
habitaciones=c(4,4)
)
requerimientos_cliente <- requerimientos_cliente %>%
mutate(estrato=as.factor(estrato))
requerimientos_cliente
predict(modelo_base1,requerimientos_cliente)
## 1 2
## 335.0336 384.2353
La predicción del modelo muestra que un precio promedio para la vivienda que quiere el cliente en estrato 4 es de 335,03 millones y en estrato 5 es de 384,2353, estos precios son una referencia para conocer ofertas optimas para el cliente, en este caso, una oferta atractiva seria aquella que este por debajo de los promedios definidos en especial en el caso de la vivienda estrato 5.
Para definir ofertas potenciales para el cliente se filtrará el set de datos para obtener un listado de viviendas acotado:
Viviendas potenciales estrato 4
base1_viviendas_e4<- base1_acotada %>%
dplyr::filter(estrato==4,areaconst>=200,parqueaderos>=1,banios>=2,habitaciones==4,preciom<=350) %>%
mutate(promedio_reg=335.0336,diferencia_promedio=promedio_reg-preciom,diferencia_cupo=350-preciom) %>%
arrange("areaconst")
base1_viviendas_e4
De este conjunto de viviendas se escogeran tres casos, el que más se ciña a los criterios especificos del usuario y dos que tengan mayor area a menor precio, bajo estos criterios para la primera condición resulta atractiva la vivienda de id 1144, y para la segunda condición las viviendas de id 3352 y 1822.
base1_viviendas_e4_candidatas<- base1_viviendas_e4 %>%
dplyr::filter(id %in% c(1144,3352,1822))
viviendas potenciales estrato 5
base1_viviendas_e5<- base1_acotada %>%
dplyr::filter(estrato==5,areaconst>=200,parqueaderos>=1,banios>=2,habitaciones==4,preciom<=350) %>%
mutate(promedio_reg=384.2353,diferencia_promedio=promedio_reg-preciom,diferencia_cupo=350-preciom) %>%
arrange("areaconst")
base1_viviendas_e5
De este conjunto se escogerá la vivienda estrato 5 que mas ciña a los criterios del cliente y la que presente mayor área a mejor precio, bajo estos criterios la primera opcionada seria la vivienda con id 4210, y la segunda vivienda la 1943.
base1_viviendas_e5_candidatas<- base1_viviendas_e5 %>%
dplyr::filter(id %in% c(4210,1943))
base_candidatas_caso1<- rbind(base1_viviendas_e4_candidatas,base1_viviendas_e5_candidatas)
Las viviendas más opcionadas para el primer requerimiento del cliente 1 se muestran en el siguiente mapa:
mapa_candidatas1<-leaflet(base_candidatas_caso1) %>%
addTiles() %>%
addCircleMarkers(lng=~longitud,lat=~latitud,radius=7,opacity=1,color=~colores_estrato(base_candidatas_caso1$estrato),popup = base_candidatas_caso1$preciom,label=~base_candidatas_caso1$preciom)
mapa_candidatas1
Al igual que en el caso anterior se validará la calidad de los datos de los apartamentos de la zona sur respecto a su ubicación geográfica, para llevar a cabo este proceso se hará uso del paquete leaflet para verificar la ubicación de los puntos:
mapa_aptos_sur<-leaflet(base2) %>%
addTiles() %>%
addCircleMarkers(lng=~longitud,lat=~latitud,radius=3)
mapa_aptos_sur
Al revisar la distribución espacial de los apartamentos de la zona sur se puede apreciar que al igual que en el caso anterior hay una cantidad considerable de puntos que están totalmente fuera de la zona sur de la ciudad y que se concentran en otras zonas como el centro y el norte de la ciudad; como bien se demarco en el caso anterior la ubicación inadecuada de los puntos puede deberse a aspectos de etiquetado o en su defecto puede estar relacionado a errores de digitación de coordenadas, como tambien se logró demarcar ambos escenarios de error son impactantes para posibles analisis a realizar, si no se corrigen estas imprecisiones las particularidades espaciales pueden generar sesgos importantes al momento de modelar, e inclusive puede conducir a conclusiones erroneas en el proceso de análisis exploratorio.
Para validar con mayor precisión los atributos de los puntos que no estan ubicados en el sur se procede nuevamente a generar un mapa que marque de un color cada estrato de la siguiente manera:
colores_estrato2<- colorFactor(palette = "Set2", domain=base2$estrato)
mapa_dis_estrato2<-leaflet(base2) %>%
addTiles() %>%
addCircleMarkers(lng=~longitud,lat=~latitud,color=~colores_estrato2(estrato),radius=3,popup = ~estrato,label=~estrato)
mapa_dis_estrato2
Como puede apreciarse los datos más ubicados hacia el centro son estrato 4 y 3, a su vez una leve nube de puntos al oriente muestra viviendas estrato 4,5 y 6 mostrando mayor intensidad en el color del último. Finalmente los puntos del norte concentran estrato 4, y al nor-occidente se aprecia una cantidad relevante de puntos rosados correspondientes a estrato 6.
Dados estos hallazgos se hace conveniente limpiar el set de datos con el fin de tener información certera y que no genere distorsión en las estimaciones que se realizarán en puntos posteriores, para esto, se visualizaran los puntos sobre un shape y a partir de esto se hará posteriormente un join entre puntos y poligonos con el fin de marcar o remover aquellos puntos ubicados en poligonos que no esten efectivamente al sur de la ciudad.
mapa_shape2<- leaflet(shape_cali) %>%
addTiles() %>%
addPolygons(
color="#444444",
smoothFactor = 0.5,
opacity = 1.0,
fillOpacity = 0.2,
layerId=~shape_cali$NOMBRE,
label=~shape_cali$NOMBRE
) %>%
addCircleMarkers(lng=base2$longitud,lat=~base2$latitud,color=~colores_estrato2(base2$estrato),radius=1,popup = ~base2$estrato,label=~base2$estrato)
mapa_shape2
Al revisar el cruce entre los puntos y el shape se puede apreciar que los puntos de interés que demarcan el norte de la ciudad corresponden a las comunas 17,18,19 y 22 con este criterio definido se procede a realizar un join espacial entre puntos y poligonos con el fin de etiquetar cada punto por comuna, este proceso se realiza a través del paquete sf.
### Preparación para spatial join entre coordenadas y poligonos del shape
points_base2<- base2 %>%
dplyr::select("id","longitud","latitud")
point_b2_convert<- st_as_sf(points_base2,coords=c("longitud","latitud"))
crs2<-st_crs("+init=epsg:4326")
st_crs(point_b2_convert)<-crs2
extended_df2<- st_join(point_b2_convert,st_make_valid(shape_cali),left=FALSE) %>%
dplyr::select("id","NOMBRE") %>%
st_drop_geometry()
#Reconversión a dataframe
extended_df2<- as.data.frame(extended_df2) %>%
dplyr::select("id","NOMBRE")
# Join del atributo nombre de comuna del shape
base2<- base2 %>%
inner_join(extended_df2,by="id")
Con el join espacial realizado ahora es posible filtrar el set de datos por comuna con la finalidad de tener unicamente los puntos que corresponden a la zona norte de Cali de acuerdo a las comunas 7,8,9.3,2,6 y 1; en la siguiente porcion de código se realiza el filtrado correspondiente
comunas2<- c("COMUNA 17","COMUNA 18","COMUNA 22")
base2_acotada<- base2 %>%
dplyr::filter(NOMBRE %in% comunas2)
Para validar la efectividad del join espacial se realiza nuevamente el mapa para validar que todas las observaciones esten en el espacio esperado:
mapa_shape2_2<-leaflet(base2_acotada) %>%
addTiles() %>%
addCircleMarkers(lng=~longitud,lat=~latitud,radius=3,color=~colores_estrato2(base2_acotada$estrato),popup = ~base2_acotada$estrato,label=~base2_acotada$estrato)
mapa_shape2_2
El proceso de join espacial ha surtido efecto y ahora se tienen 1965 observaciones acotadas en el sur de la ciudad y que pueden asegurar evitar sesgos en la estimación por motivos espaciales. Con el problema de zona resuelto.
El atributo identificado para el caso 1 respecto a los parqueaderos muestra persistencia en este caso, por lo tanto se procede de igual manera convirtiendo los NA en 0, y de igua forma dado que la variable piso tiene una gran cantidad de valores faltantes y no es usada para el análisis tambien es removida.
base2_acotada<- base2_acotada %>%
mutate_at(c("parqueaderos"),~replace_na(.,0))
base2_acotada<- base2_acotada %>%
dplyr::select(.,-"piso")
glimpse(base2_acotada)
## Rows: 1,965
## Columns: 13
## $ id <dbl> 6975, 7396, 6949, 7946, 2405, 5368, 2406, 3738, 6708, 496…
## $ zona <chr> "Zona Sur", "Zona Sur", "Zona Sur", "Zona Sur", "Zona Sur…
## $ estrato <fct> 4, 3, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 5, 5, 5, …
## $ preciom <dbl> 220, 115, 220, 230, 155, 226, 215, 230, 225, 205, 230, 23…
## $ areaconst <dbl> 75, 58, 84, 63, 62, 64, 72, 66, 72, 72, 108, 108, 108, 63…
## $ parqueaderos <dbl> 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 2, 2, 2, 0, 0, 1, 2, 1, 1, …
## $ banios <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 2, 1, 2, 2, 3, 3, 3, …
## $ habitaciones <dbl> 3, 2, 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 3, …
## $ tipo <chr> "Apartamento", "Apartamento", "Apartamento", "Apartamento…
## $ barrio <fct> alf√©rez real, alf√©rez real, alferez real, alto jordán, …
## $ longitud <dbl> -76.54627, -76.54924, -76.54600, -76.55300, -76.52000, -7…
## $ latitud <dbl> 3.39109, 3.39121, 3.39000, 3.37200, 3.36700, 3.36400, 3.3…
## $ NOMBRE <chr> "COMUNA 18", "COMUNA 18", "COMUNA 18", "COMUNA 18", "COMU…
Con las operaciones realizadas se finaliza el proceso de análisis y validación de la calidad de la información espacial y de otras particularidades del caso número dos, los hallazgos realizados en esta ocasión convergen con las problemáticas ya identificadas con el caso 1, por ende las recomendaciones derivadas de los problemas identificados resultan ser los mismos para la inmobiliaria.
Inicialmente se generan estadísticos básicos para las variables disponibles:
summary(base2_acotada)
## id zona estrato preciom areaconst
## Min. :1250 Length:1965 3:101 Min. : 78.0 Min. : 40.00
## 1st Qu.:2228 Class :character 4:705 1st Qu.: 184.0 1st Qu.: 65.00
## Median :3731 Mode :character 5:759 Median : 255.0 Median : 85.00
## Mean :3942 6:400 Mean : 312.4 Mean : 98.09
## 3rd Qu.:5507 3rd Qu.: 350.0 3rd Qu.:110.00
## Max. :8228 Max. :1750.0 Max. :932.00
##
## parqueaderos banios habitaciones tipo
## Min. : 0.000 Min. :0.000 Min. :0.000 Length:1965
## 1st Qu.: 1.000 1st Qu.:2.000 1st Qu.:3.000 Class :character
## Median : 1.000 Median :2.000 Median :3.000 Mode :character
## Mean : 1.248 Mean :2.539 Mean :2.945
## 3rd Qu.: 2.000 3rd Qu.:3.000 3rd Qu.:3.000
## Max. :10.000 Max. :7.000 Max. :6.000
##
## barrio longitud latitud NOMBRE
## valle del lili:707 Min. :-76.56 Min. :3.334 Length:1965
## ciudad jardín :199 1st Qu.:-76.54 1st Qu.:3.367 Class :character
## pance :175 Median :-76.53 Median :3.373 Mode :character
## el ingenio :114 Mean :-76.53 Mean :3.375
## el caney :111 3rd Qu.:-76.52 3rd Qu.:3.384
## la hacienda : 96 Max. :-76.51 Max. :3.409
## (Other) :563
Este acercamiento inicial a las variables permite identificar algunos aspectos relevantes de la zona:
Si se contrastan estos hallazgos generales con la necesidad del cliente, sería posible decir que este requerimiento del cliente difiere ampliamente del primero, ya que en este caso solicta una vivienda tipo apartamento que sobrepasa las caracteristicas promedio del sector.
Ahora se enfatizará en la estructura de la distribución del precio y algunas relaciones con variables categoricas con el fin de conocer la incidencia de algunos atributos en el precio.
Primero se revisa la distribución del precio de las viviendas:
options(repr.plot.width=15, repr.plot.height=25)
limite_presupuesto=850
histo_precio2<- ggplot(base2_acotada,aes(x=preciom))+geom_histogram()+
geom_vline(aes(xintercept = limite_presupuesto,col="limite presupuestal"),linetype="dashed",size=1)+theme_light()+
labs(y="Conteo",x="Precio millones")+theme(legend.position = "bottom")
boxpl_precio2 <- ggplot(base2_acotada,aes(x=preciom))+geom_boxplot(varwidth = TRUE,outlier.colour='red')+
geom_vline(aes(xintercept = limite_presupuesto,col="limite presupuestal"),linetype="dashed",size=1)+theme_light()+
labs(x="Precio millones")+
theme(legend.position = "bottom")
arreglo2<- ggarrange(histo_precio2,boxpl_precio2,ncol=2,nrow=1)
annotate_figure(arreglo2, top = text_grob("Distribución precio (millones) viviendas tipo apartamento - zona sur",
color = "black", face = "bold", size = 14))
generar_tabla_estad(base2_acotada,base2_acotada$preciom,"precio")
## [,1]
## promedio 312.3695
## mediana 255
## varianza 41241.37
## desv_est 203.0797
## CV 0.6501267
## simetria 2.585516
## Kurtosis 12.93629
## Shapiro_value_W 0.7583781
## Shapiro_pvalue 5.945037e-47
## Q1 184
## Q3 350
## variable_analizada "precio"
La revisión gráfica y de las propiedades de la variable precio permiten confirmar su sesgo a la derecha, y además dan lugar a confirmar un perfil de distribución leptocurtica que dadas sus propiedades se aleja de una distribución normal presentando además varios outliers que corresponden a viviendas con costos mayores o iguales a 600 millones de pesos. Por otro lado la linea naranja trazada permite identificar que el limite presupuestal del cliente se encuentra en la zona de outliers, lo cual resulta consistente teniendo en cuenta que el tipo de apartamento que requiere el cliente esta muy por encima de los apartamentos usuales de la zona en cuanto a condiciones de área y espacios internos.
Ahora veamos el comportamiento del precio promedio de la vivienda respecto a atributos como el estrato y la comuna, y además es conveniente revisar el área respecto al barrio y a la comuna con el fin de tener una idea inicial respecto a zonas que estarián potencialmente más acordes a las necesidades del cliente:
fig_area_comuna2<- base2_acotada %>%
plot_ly(
x=~NOMBRE,
y=~areaconst,
split=~NOMBRE,
type='violin',
box= list(visible=T
),
meanline=list(
visible=T
)
)
fig_area_comuna2<- fig_area_comuna2 %>%
layout(
title="Área (metros cuadrados) vs Comuna",
xaxis=list(
title="Comuna"
),
yaxis=list(
title="Área (metros cuadrados)",
zeroline = F
)
)
fig_area_comuna2
Al revisar las gráficas anteriores es posible identificar algunos aspectos importantes:
Las viviendas tipo apartamento en la zona sur muestran los precios más bajos en el estrato 3 evidenciando un precio promedio de 137 millones que llegan en la zona de atipicos hasta 430 millones; la revisión detallada de las distribuciones del gráfico de violin permiten evidenciar que los estratos 3 y 4 están muy por debajo de los limites máximos de precio del cliente; por otro lado los apartamentos del estrato 5 y 6 se ciñen de una mejor manera mostrando a su vez zonas de atipicos mucho mayores en donde hay casos suficientes de los cuales el cliente final podria llegar a escoger ya que en el caso del estrato 5 los valores mayores al tercer cuartil van desde 330 hasta 1250 millones y en el estrato 6 van desde 700 a 1750 millones de pesos.
La comuna con precio promedio más elevado es la comuna 22 que presenta un precio promedio de 570 millones alcanzando un precio de 690 millones en su tercer cuartil, seguidamente es la comuna que presenta la zona de atipicos más amplia en términos precio, sin embargo la área promedio de los apartamentos de esta zona es de 143 metros cuadrados presentando un máximo de área de 439 metros cuadrados; la comuna con mayor cantidad de apartamentos con áreas atipicas es la comuna 17 la cual presenta el segundo promedio más alto en términos de precio (cabe decir que mucho menor al de la comuna 22) alcanzando un máximo de 1250 millones en precio; en concordancia a los aspectos abordados es muy probable que los predios ideales para el usuarios esten en la comuna 17 o 22.
En lo que respecta a barrios se puede apreciar que en términos de área algunos de los que satisfacen apartamentos con áreas construidas iguales o mayores a 300 metros cuadrados son el ingenio, el limonar,parcelaciones pance, melendez y ciudad jardin.
Una vez conocidos más en profundidad los pormenores del precio y el área construida se procede a realizar un análisis exploratorio de carácter correlacional entre el precio y las variables área construida,estrato, número de baños,numero de habitaciones y número de parqueaderos:
Variable respuesta VS variables predictoras
options(repr.plot.width=30, repr.plot.height=30)
ggpairs(base2_acotada,columns=3:8,
aes(color=estrato,
alpha=0.4))
La gráfica de correlación realizada con las variable de interés permite identificar la correlación entre las variables cuantitativas, pero dado que GGally tambien involucra la variable tipo categórica estrato permite ver las diferencias de distribución que supone cada uno de ellos, en este sentido se puede analizar desde una vertiente correlacional entre la variable respuesta y las predictoras y tambien se puede realizar un breve análisis respecto a las implicaciones del estrato.
En lo que respecta a las correlaciones entre la variable precio y las demás variables cuantitativas se pueden identificar las siguientes correlaciones:
Precio vs # habitaciones -> 0.345 indica una correlación lineal positiva debil, lo cual indica en que en cierto grado un mayor número de habitaciones podría inlfuir en un precio final mayor.
Precio vs # baños -> 0.743 indica una correlación lineal positiva debil, lo cual indica en que en cierto grado un mayor número de baños podría inlfuir en un precio final mayor.
Precio vs # parqueaderos -> 0.707 indica una correlación lineal positiva debil, lo cual indica en que en cierto grado un mayor número de parqueaderos podría inlfuir en un precio final mayor.
Precio vs Área construida -> 0.77 (muy cercano a 0.8) indica una correlación lineal positiva fuerte, lo cual indica en que en cierto grado un apartamento más grande podría inlfuir en un precio final mayor.
Finalmente en lo que respecta a la interacción entre el estrato y las variables es posible identificar que en promedio los apartamentos estrato 6 superan en todos los atributos a los apartamentos de otros estratos, mostrando igualmente mayores casos de atipicidad en el área total del apartamento, el único atributos en el que conserva cierta uniformidad respecto a su percentil 50 es en el caso de las habitaciones, no obstante se puede apreciar que es un estrato en donde pueden existir apartamentos hasta de 6 habitaciones; seguidamente el estrato 5 presenta en promedio áreas menores, no osbtante en su conjunto de atributos logra satisfacer en términos de caracteristicas los elementos preferidos por el cliente.
Correlación entre variables predictoras
ggpairs(base2_acotada,columns=5:8,
aes(color=estrato,
alpha=0.4))
Al revisar la correlación entre las variables predictoras se puede observar que la mayoria de ellas conservan correlaciones lineales positivas debiles entre si, teniendo ligeras excepciones entre baños y área construida que muestran una correlación de 0.662 y que eventualmente podrian generar un problema de multicolinealidad que deberá validarse posteriormente en la fase de modelación.
El análisis de correlación realizado permite identificar que las variables seleccionadas efectivamente cuentan con cierto grado de asociación lineal, y a su vez la variable categórica estrato muestra ser influyente, por lo tanto se torna adecuado estimar un modelo de regresión lineal múltiple.
Partiendo del análisis exploratorio realizado y siguiendo los pasos delimitados al inicio se plantea estimar el siguiente modelo:
como puede apreciarse en la formulación del modelo, se cuenta con variables dummy que demarcan el estrato,en algunos casos para tratar este tipo de datos se hace one-hot-encoding o se generan variables adicionales, no obstante, en este caso al igual que en el anterior se aprovecha el tipo de dato “factor” de R que esta especialmente diseñado para variables categóricas y al ser introducido en una función lm() esta automáticamente estima el modelo con la dummy asociada a cada nivel del factor tomando una categoria base.
En las siguientes lineas de código se estima el modelo y se generan alguna métricas relacionadas a bondad de ajuste:
modelo_base2<- lm(preciom~areaconst+parqueaderos+banios+habitaciones+estrato,data=base2_acotada)
summary(modelo_base2)
##
## Call:
## lm(formula = preciom ~ areaconst + parqueaderos + banios + habitaciones +
## estrato, data = base2_acotada)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1141.32 -37.26 1.01 33.50 893.79
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -30.56476 13.64348 -2.240 0.02519 *
## areaconst 1.36898 0.05642 24.263 < 2e-16 ***
## parqueaderos 53.70557 3.60895 14.881 < 2e-16 ***
## banios 48.72048 3.64447 13.368 < 2e-16 ***
## habitaciones -11.64128 4.09764 -2.841 0.00454 **
## estrato4 17.40808 10.03708 1.734 0.08301 .
## estrato5 30.04444 10.28886 2.920 0.00354 **
## estrato6 168.69020 12.26931 13.749 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 92.77 on 1957 degrees of freedom
## Multiple R-squared: 0.7921, Adjusted R-squared: 0.7913
## F-statistic: 1065 on 7 and 1957 DF, p-value: < 2.2e-16
Al revisar lo resultados del modelo se puede identificar lo siguiente:
En lo que respecta a significancia individual de los estimadores se puede apreciar a través de la prueba t que:
Al validar el valor de la prueba F de significancia global se puede apreciar que el valor p es menor a 0.05 por lo tanto esto lleva a a no tener evidencia suficiente para aceptar la hipotesis nula, por lo tanto el modelo en su conjunto es estadisticamente significativo.
Comparativamente respecto al modelo del caso 1, este modelo presenta mejores propiedades en lo que respecta a significancia estadística individual.
Al interpretar los coeficientes se tiene lo siguiente:
La mayoria de los signos presentados por el modelo son consistentes, no obstante genera curiosidad el signo negativo de habitaciones el cual demarca una relación negativa entre habitaciones y precio final, dando a entender que un número mayor de habitaciones configura una reducción en el precio final lo cual no resulta muy consistente ya que un mayor número de habitaciones se asocia a un número mayor de metros cuadrados construidos y por ende se esperaria que esto tuviera una influencia positiva en el precio; es probable que los valores atipicos esten influyendo en el valor final de este estimador ya que en el caso de apartamentos muy costosos el crecimiento de habitaciones adquiere un aspecto un tanto marginal mientras incrementan otros elementos como los baños y los parqueaderos lo cual puede estar llevando a que se distorsione el efecto real del número de habitaciones.
Al puntualizar en los valores de cada coeficiente se tiene lo siguiente:
areaconst 1.36898 -> El coeficiente nos indica que por cada metro cuadrado adicional el valor del apartamento tendrá un aumento promedio de 1,36 millones de pesos. [Esto mientras lo demás permanece constante]
parqueaderos 53.70557 -> El coeficiente nos indica que por cada parqueadero adicional el valor del apartamento tendrá un aumento promedio de 53,70557 millones de pesos. [Esto mientras lo demás permanece constante]
banios 48.72048 -> El coeficiente indica que por cada baño adicional el valor del apartamento tendrá un aumento promedio de 48,72048 millones de pesos. [Esto mientras lo demás permanece constante]
habitaciones -11.64128 -> El coeficiente indica que por cada habitación adicional el valor del apartamento tendrá un disminución promedio de 11,64128 millones de pesos. [Esto mientras lo demás permanece constante]
estrato4 - 17.40808 > El coeficiente indica que en promedio un apartamento estrato 4 costará 17,408 millones más que una estrato 3.
estrato5 - 30.04444> El coeficiente indica que en promedio un apartamento estrato 5 costará 124,91 millones más que una estrato 3.
estrato6 - 168.69020> El coeficiente indica que en promedio una casa estrato 6 costará 168,69 millones más que una estrato 3.
En lo que respecta a bondad del ajuste se puede apreciar que la regresión presenta un coeficiente de determinación de 0.7921 que indica que el modelo esta en capacidad de explicar un 79,21% la variación de la variable precio.
La bondad de ajuste de este modelo es mucho mejor al presentado por el modelo para casas en la zona norte, no obstante,se esperaria que este modelo presente ciertos inconvenientes asociados a que la variable dependiente no tiene una distribución normal y además tiene una cantidad mucho mayor de valores atípicos lo cual da pie a que exista una cantidad mayor de valores influyentes que logran distorsionar la calidad del resultado final a nivel predictivo, ante esta situación seguramente realizando algunas transformaciones sobre la variable respuesta el ajuste puede tener una mejora ya que se suavizará el efecto de los átipicos y se trabajará bajo una distribución mucho más suavizada que no solo cumplirá mejor con los supuestos de la RLM sino tambien presentará un mejor grado de ajuste, sin embargo ante la presencia tan amplia de atípicos seria conveniente explorar modelos como la regresión cuantilitica que resulta sumamente funcional para casos en donde la varianza no es constante.
Para dar mayor fuerza a lo antes mencionado a continuación se revisan las gráficas de residuales del modelo con el fin de identificar posibles problemas del modelo:
par(mfrow = c(2, 2))
plot(modelo_base2)
Al observar las gráficas de los residuales se puede apreciar lo siguiente:
Los gráficos residuals vs fitted y scale-location permiten apreciar que la varianza se ve fuertmente influida por los valores atípicos, si se observa con detalla la gráfica residuals vs fitted se puede apreciar que hasta el punto 700 del eje x la varianza es relativamente constante no obstante a partir de tal punto se rompe bruscamente el patrón mostrando una fuerte dispersión que perturba la trayectoria de la linea roja, algo similar ocurre en la gráfica scale-location en donde al acotar el rango de los residuales a valores positivos se puede apreciar como aumenta la dispersión hacia arriba y genera inconvenientes evidentes que dan señales de problemas de heterocedasticidad.
Al revisar el gráfico de normalidad se puede apreciar que una buena parte de los residuales se ajusta de manera satisfactoria, no obstante la gráfica permite ver con claridad la influencia de los valores atípicos que provocan que los residuales se alejen de una distribución normal
El gráfico de residuals vs leverage confirma la existencia de valores influyentes sobre el modelo que se confirman ante la ubicación de un punto por encima de la distancia de cook, lo cual indica que la remoción de atipicos podría tener un impacto sobre el resultado final del modelo.
La convergencia de estos aspectos revisados gráficamente dan lugar para perfilar posibles problemas de heterocedasticidad, normalidad e inclusive posibles problemas de autocorrelación. Con el fin de confirmar la posibilidad de existencia de los problemas mencionados más adelante se aplicarán pruebas de diagnóstico, no obstante previamente se validará si el presente modelo tiene problemas de multicolinealidad por medio del cálculo del VIF (Variance Inflation Factor) a través del paquete car
vif(modelo_base2)
## GVIF Df GVIF^(1/(2*Df))
## areaconst 2.083897 1 1.443571
## parqueaderos 1.902065 1 1.379154
## banios 2.639548 1 1.624669
## habitaciones 1.410498 1 1.187644
## estrato 1.977765 3 1.120373
Al revisar los valores del VIF se puede observar que todos los valores son menores a 5 lo cual permite confirmar que el modelo planteado no tiene problemas de multicolinealidad.
Ahora que esta confirmada la ausencia de multicolinealidad se procede a validar los demás problemas haciendo uso de una función creada a la medida que consolida en una tabla los siguientes valores:
tabla_test_base2
## BP
## r_2 7.920678e-01
## r2_ajust 7.913241e-01
## breuschpagan_p_Value 4.513753e-157
## breuschgodfrey_p_value 4.188835e-10
## durbin_estat 1.718781e+00
## durbin_pval 1.649306e-10
## shapiro_w_pval 1.851527e-47
## Akaike_inf_crit 2.338975e+04
## Bayesian_inf_crit 2.344000e+04
## box_cox_lambda -1.010101e-01
Al analizar los valores obtenidos para cada test se puede decir lo siguiente respecto al modelo:
Los aspectos mencionados dan lugar a concluir que el modelo planteado incumple los supuestos en los errores y ante estos inconvenientes seria recomendable:
Probar transformaciones sobre la variables respuesta y las variables predictoras; dado el resultado de box-cox seria pertinentes probar variantes log-lineal y log-log.
Además de probar variantes log-lineal y log-log seria pertinente explorar la aplicación de una regresión cuantílica teniendo en cuenta la gran dispersión que generan los atipicos en el modelo, la baja sensibilidad a la varianza no constante de este tipo de modelo puede ayudar a generar predicciones mucho más precisas inclusive con los casos poco usuales que se presentan.
Dados los hallazgos a nivel de diferenciación de estrato y comuna, seria conveniente explorar autocorrelación espacial de los datos y llevar a cabo un ejercicio de regresión espacial, junto a cálculo de indicadores como I de Moran y G local para generar mapas temáticos que reflejen la variabilidad de los precios en la zona analizada.
Siguiendo el curso metodológico propuesto a partir del modelo analizado en la sección anterior se llevará a cabo la predicción introduciendo en el modelo los requerimientos del cliente para la casa en la zona norte con el fin de conocer el precio promedio que podria estar pagando por esta vivienda, para llevar a cabo esto se crea un dataframe con los atributos con el fin de introducirlos como input en el modelo.
requerimientos_cliente2<-data.frame(
estrato=c(5,6),
areaconst=c(300,300),
parqueaderos=c(3,3),
banios=c(3,3),
habitaciones=c(5,5)
)
requerimientos_cliente2 <- requerimientos_cliente2 %>%
mutate(estrato=as.factor(estrato))
requerimientos_cliente2
predict(modelo_base2,requerimientos_cliente2)
## 1 2
## 659.2466 797.8924
La predicción del modelo muestra que un precio promedio para la vivienda que quiere el cliente en estrato 5 es de 659,2466 millones y en estrato 6 es de 797,8924 millones, estos precios son una referencia para conocer ofertas optimas para el cliente, en este caso, una oferta atractiva seria aquella que este por debajo de los promedios definidos.
Para definir ofertas potenciales para el cliente se filtrará el set de datos para obtener un listado de viviendas acotado:
Viviendas potenciales estrato 5
base2_viviendas_e5<- base2_acotada %>%
dplyr::filter(estrato==5,areaconst>=300,parqueaderos>=1,banios>=3,habitaciones==5,preciom<=850) %>%
mutate(promedio_reg=659.2466,diferencia_promedio=promedio_reg-preciom,diferencia_cupo=850-preciom) %>%
arrange("areaconst")
base2_viviendas_e5
Al acotar la base de datos a los criterios del cliente flexibilizando aspectos como la cantidad de parqueaderos se puede apreciar que solo hay una vivienda candidata que duplica el área solicitada por el cliente, tiene un parqueadero menos que el solicitado pero cumple de manera satisfactoria el criterio de habitaciones, y cumple el criterio de baños aunque teniendo una exceso de una unidad más que las solicitadas, esta oferta en estrato 5 es muy cercana al promedio hallado en la regresión y además optimiza el uso del cupo ya que permite un ahorro de 200 millones de pesos a cambio de un área dos veces mayor.
base2_viviendas_e5_candidatas<- base1_viviendas_e4 %>%
dplyr::filter(id %in% c(4952))
viviendas potenciales estrato 6
base2_viviendas_e6<- base2_acotada %>%
dplyr::filter(estrato==6,areaconst>=300,parqueaderos>=1,banios>=3,habitaciones<=5,preciom<=850) %>%
mutate(promedio_reg=384.2353,diferencia_promedio=promedio_reg-preciom,diferencia_cupo=350-preciom) %>%
arrange("areaconst")
base2_viviendas_e6
En este caso se ha encontrado una vivienda que cumple la exigencia de área construida del cliente pero incumple el criterio de habitaciones presentando 2 menos que las esperadas, no obstante cumple satisfactoriamente el criterio de baños y de parqueaderos, pero particularmente en este caso por un apartamento de área de 352 metros cuadrados y que no cumple todos los criterios se tiene un precio de 850 millones de pesos lo cual copa todo el crédito disponible pero dejando necesidades insatisfechas.
base2_viviendas_e6_candidatas<- base2_viviendas_e6 %>%
dplyr::filter(id %in% c(5574))
base_candidatas_caso2<- rbind(base2_viviendas_e5,base2_viviendas_e6_candidatas)
Las viviendas más opcionadas para el segundo requerimiento del cliente se muestran en el siguiente mapa:
mapa_candidatas2<-leaflet(base_candidatas_caso2) %>%
addTiles() %>%
addCircleMarkers(lng=~longitud,lat=~latitud,radius=7,opacity=1,color=~colores_estrato(base_candidatas_caso2$estrato),popup = base_candidatas_caso2$preciom,label=~base_candidatas_caso2$preciom)
mapa_candidatas2
El proceso de análisis realizado a lo largo de este documento de anexos permite vislumbrar algunos problemas de los datos entregados por la inmobiliaria C&A ante los cuales se han ejecutado algunos procesos de transformación con el fin de llevar a cabo un proceso de exploración mucho más efectiva y coherente con la resolución del problema de negocio planteado para el cual se plantea un modelo de regresión lineal base por medio del cual se estiman los valores promedio de una vivienda tipo casa al norte de la ciudad y de un apartamento ubicado al sur de la misma, este proceso permite concluir lo siguiente:
La inmobiliaria C&A debe realizar un proceso de validación y limpieza mucho más detallado y profundo en lo que respecta a la calidad de la información geográfica, ya que por medio de este proceso se han logrado evidenciar serios problemas de etiquetado de la “Zona” de los predios lo cual puede llevar a sesgar análisis y tambien a dar sugerencias u ofertas erroneas al cliente final.
En lo que respecta a otros aspectos de calidad de datos, es importante normalizar variables tipo texto como el barrio con el fin de evitar separación categórica por motivos de errores de digitación, y a su vez tambien es relevente evitar el uso de valores vacios para denotar ausencia de un atributo, en este caso es más conveniente usar un 0 o una etiqueta específica, el valor vacio (NA) debe usarse unicamente en escenarios en donde el datos no fue recolectado.
Como pudo evidenciarse en el proceso de modelación y validación de supuestos los modelos planteados tienen una buena bondad de ajuste con coeficientes de determinación mayores al 60%, no obstante en términos de supuestos el modelo no cumple con los parámetros ideales dado que los datos tienen gran cantidad de atípicos lo cual configura heterocedasticidad, no-normalidad e inclusive inconvenientes de autocorrelación y observaciones influyentes, a pesar de estos problemas al utilizar los modelos para predecir los valores promedio para las viviendas solicitadas por el usuario resultan ser razonables y permiten demarcar un punto de referencia para recomendar viviendas que podrian ser atractivas.
Con el fin de avanzar en modelaciones mucho más exactas se sugiere explorar formar log-lineales e inclusive con el fin de evitar las distorsiones derivadas de los valores atipicos se recomienda usar regresiones cuantilicas y complementar estos ejercicios explorando cálculo de indicadores espaciales como la I de Moran y la G local con el fin de soportar el montaje de mapas temáticos y de regresiones espaciales que podrián ser de alto valor para la toma de decisiones respecto a ofertas potenciales para clientes como la que se ha solicitado en este caso.
El análisis ha llevado a concluir que para el caso del cliente 1 el precio promedio de una casa en estrato 4 es de 335,03 millones y en estrato 5 es de 384,2353 millones, a partir de los valores promedio y de los requerimientos del cliente se demarcan 5 ofertas potenciales que se ciñen a la restricción del cupo del crédito y que se consolidan en la siguiente tabla: