Introducción

La empresa C&A es una agencia de bienes raíces que opera en la ciudad de Cali, Colombia,ha crecido significativamente con progresos significativos al mercado inmobiliario. Está empresa entregó una base de datos de precio, ubicación, características de vivienda y sus precios de venta de acuerdo a su valor de la zona y su área construída.

Con la base de datos, se procedió a realizar un análisis por medio de técnicas de estadística descriptiva que permitieron clasificar, resumir, gráficar patrones de cada variable ya sea cualitatiVa o cuantitativa que tuvieron como resultados proporcionar información sobre tendencias en el precio de las viviendas en Cali, las viviendas más vendidas y la zona con mayor demanda por la inmobiliaria y definir de alguna forma la evolución del mercado inmobiliario; para realizar el modelamiento usando regresión lineal múltiple y predecir el precio de vivienda

Estos análisis no solo identifican tendencias y relaciones entre variables, sino que también realizan predicciones basadas en los requisitos específicos establecidos por la empresa para dos tipos de vivienda. De esta manera, se ofrecen opciones de compra que se ajusten a estos requisitos y satisfagan las necesidades del cliente. Estas acciones no solo contribuyen a mejorar la experiencia del cliente, sino que también aportan al desarrollo económico regional al alinearse con los criterios clave que definen el crecimiento y la prosperidad en la región.

Objetivos

Objetivo general

Desarrollar un modelo que facilite la selección de los escenarios más adecuados para dos viviendas en la ciudad de Cali, utilizando la base de datos proporcionada por la inmobiliaria C&A.

Objetivo especifico

  • Realizar un análisis exploratorio de las variables estadísticas aportadas por la inmobiliaria C&A

  • Estimar un modelo de Regresión lineal múltiple con las variables estadísticas definidas por las propuestas para cada tipo de vivienda.

  • Predecir las ofertas potenciales de acuerdo a la solicitud asignada por la inmobiliaria C&A.

Métodos

El primer paso para ejecutar el análisis exploratorio de la inmobiliaria C&A que opera en la Ciudad de Cali, es necesario examinar el tipo de variables aportados por la base de datos de la empresa, hacer una depuración y limpieza de los datos que incluyen variables como la zonas residenciales, área construída, precios de los inmuebles en millones, número de pisos, baños y habitaciones, así como el tipo de vivienda ya sea apartamento o casa.

Es importante señalar que, la base de datos entregada tiene un total 8330 registros de los cuáles se presentan datos incompletos en algunas variables y datos sin ninguna información, por ello, se ejecutan estrategías de imputación de datos.

Posteriormente, se hará el respectivo análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa o apartamento) en función del área construida, estrato, número de baños, número de habitaciones y zona donde se ubica la vivienda, usando la libreria Ploty .

Al establecer la correlación entre las variables, se procede a ejecutar el modelo de regresión lineal múltiple (RLM) con las variables enunciadas anteriormente interprentando los respectivos coeficientes para concluir si el estadistico es significativo o no, para realizar la validación de los supuestos del modelo y predecir el precio de la vivienda con las características de cada solicitud.

Finalmente, con las predicciones de los modelos se sugieren las ofertas potenciales que responden a cada solicitud de acuerdo al precio en millones que se tiene como restricción inicial.

Resultados

Imputación de datos

En el desarrollo de imputación de datos, se carga la base de datos de la inmobiliaria para conocer cada uno de las variables tanto cualitativas como cuantitativas.

library(devtools) # solo la primera vez
library(paqueteMET)
data("vivienda")
vivienda_CA <- vivienda
faltantes <- colSums(is.na(vivienda_CA)) 
faltantes
##           id         zona         piso      estrato      preciom    areaconst 
##            3            3         2638            3            2            3 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##         1605            3            3            3            3            3 
##      latitud 
##            3

Teniendo las variables que contiene la tabla de atributos, se tienen los datos faltantes de los atributos que se observa el piso y los parqueaderos con más datos faltantes. Al presentarse este suceso, se procede a ejecutar la imputación de datos para estás variables.

library(mice)
library(naniar)
library(mice)
gg_miss_var(vivienda_CA)

grafico <-md.pattern(vivienda_CA, rotate.names = TRUE)

Teniendo como base el gráfico anterior, se puede inferir que los valores que están vacíos en la variables parqueaderos no podrían reemplazarse por un valor de la moda o la mediana, de acuerdo a las técnicas de imputación de datos, sino por valores de cero. Partiendo del hecho de que no todas las viviendas tienen parqueadero y poner un valor diferente de cero tendría menos probabilidad de que esta variable se comportará de está forma.

Así, se tienen los siguientes resultados

#Reemplazar en 0 los parqueaderos de NA
vivienda_CA$parqueaderos[is.na(vivienda_CA$parqueaderos)] <- 0
grafico <-md.pattern(vivienda_CA, rotate.names = TRUE)

Como se ve en gráfico anterior, los valores de parqueadero han sido corregidos y ya se encuentran con valor 0.

Posteriormente, se reemplazan los valores de la moda para los pisos, que es el dato más usual para las viviendas de la inmobiliaria

library(DescTools)
moda_piso<-Mode(vivienda_CA$piso, na.rm = TRUE)
vivienda_CA$piso[is.na(vivienda_CA$piso)] <- moda_piso
grafico <-md.pattern(vivienda_CA, rotate.names = TRUE)

Además, existen tres registros que no contienen información en todas las variables, se procede a eliminarlos.

vivienda_base <- na.omit(vivienda_CA)
grafico <-md.pattern(vivienda_base, rotate.names = TRUE)
##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'

library(dplyr)
glimpse(vivienda_base)
## 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> "02", "02", "02", "02", "01", "01", "01", "01", "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, 0, 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…
summary(vivienda_base)
##        id           zona               piso              estrato     
##  Min.   :   1   Length:8319        Length:8319        Min.   :3.000  
##  1st Qu.:2080   Class :character   Class :character   1st Qu.:4.000  
##  Median :4160   Mode  :character   Mode  :character   Median :5.000  
##  Mean   :4160                                         Mean   :4.634  
##  3rd Qu.:6240                                         3rd Qu.:5.000  
##  Max.   :8319                                         Max.   :6.000  
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 0.000   Min.   : 0.000  
##  1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 330.0   Median : 123.0   Median : 1.000   Median : 3.000  
##  Mean   : 433.9   Mean   : 174.9   Mean   : 1.482   Mean   : 3.111  
##  3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:8319        Length:8319        Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.54  
##  Median : 3.000   Mode  :character   Mode  :character   Median :-76.53  
##  Mean   : 3.605                                         Mean   :-76.53  
##  3rd Qu.: 4.000                                         3rd Qu.:-76.52  
##  Max.   :10.000                                         Max.   :-76.46  
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498
head(vivienda_base,5)

Al tener el preprocesamiento de la base de datos, se procede a realizar a desarrollar el caso de estudio haciendo uso de la regresión lineal múltiple.

Definición de la base de datos

La inmobiliaría solicita asesoría para la compra de dos viviendas por parte de una compañía internacional que desea ubicar a dos de sus empleados con sus familias en la ciudad. Las solicitudes incluyen las siguientes condiciones:

Características Vivienda 1 Vivienda 2
Tipo Casa Apartamento
Área construida 200 300
Parqueaderos 1 3
Baños 2 3
Habitaciones 4 5
Estrato 4 o 5 5 o 6
Zona Norte Sur
Crédito preaprobado 350millones 850 millones

Propuesta de Vivienda - Casa

Para el primer momento del análisis, se desarrolla el modelamiento de acuerdo a cada uno de los criterios relacionados en la solicitud, para una Casa en la Zona norte.

En este sentido, se hace un análisis exploratorio de la ubicación geográfica de las casas en todas la zonas de la ciudad de Cali, con la finalidad de comprobar si la asignación por zonas fue la adecuada en la base de datos entregada.

attach(vivienda_base)

vivienda_base$base <- ifelse(vivienda_base$zona =="Zona Norte" & vivienda_base$tipo =="Casa", "Base 1", 
                         ifelse(vivienda_base$zona =="Zona Centro" & vivienda_base$tipo =="Casa", "Base 2",
                          ifelse(vivienda_base$zona =="Zona Oeste" & vivienda_base$tipo =="Casa", "Base 3",
                           ifelse(vivienda_base$zona =="Zona Oriente" & vivienda_base$tipo =="Casa", "Base 4",
                            ifelse(vivienda_base$zona == "Zona Sur" & vivienda_base$tipo == "Casa", "Base 5", "NA")))))
head(vivienda_base,5)

Base 1 - Zona Norte

library(dplyr)
Base1 <- filter(vivienda_base, zona == "Zona Norte" & tipo == "Casa")
head(Base1, 3)
library(leaflet)
vivienda_Norte <- subset(vivienda_base, tipo == "Casa" & zona == "Zona Norte")

vivienda_Norte$base <- as.character(vivienda_Norte$base)

MapaNorte <- leaflet(vivienda_Norte) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "purple", radius = 2)


MapaNorte

En esta salida gráfica, se puede visualizar que hubo un error de asignación de zonas en la base de datos, porque no solo hay casas distribuidas en la zona, también se encuentran casas ubicadas en otras zonas que no corresponden a la Zona Norte.

Base 2 - Zona Centro

library(dplyr)
Base2 <- filter(vivienda_base, zona == "Zona Centro" & tipo == "Casa")
head(Base2, 3)
library(leaflet)
vivienda_centro <- subset(vivienda_base, tipo == "Casa" & zona == "Zona Centro")

vivienda_centro$base <- as.character(vivienda_centro$base)

MapaCentro <- leaflet(vivienda_centro) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "orange", radius = 2)


MapaCentro

Para el caso de la Zona Centro, también de encuentran casas que están distribuidas en otras zonas de ciudad. Aunque son mucho menores las ubicaciones fuera de la Zona es importante señalar que esto puede generar un error en cuánto a las características propuestas de vivienda.

Base3 - Zona Oeste

library(dplyr)
Base3 <- filter(vivienda_base, zona == "Zona Oeste" & tipo == "Casa")
head(Base3, 3)
library(leaflet)
vivienda_oeste <- subset(vivienda_base, tipo == "Casa" & zona == "Zona Oeste")

vivienda_oeste$base <- as.character(vivienda_oeste$base)

MapaOeste <- leaflet(vivienda_oeste) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "green", radius = 2)


MapaOeste

Seguidamente, se observa un error consecutivo en la asignación de zonas en la base de datos que genera diserción en la cantidad de casas elegidas para la propuesta.

Base 4 - Zona Oriente

library(dplyr)
Base4 <- filter(vivienda_base, zona == "Zona Oriente" & tipo == "Casa")
head(Base4, 3)
library(leaflet)
vivienda_oriente <- subset(vivienda_base, tipo == "Casa" & zona == "Zona Oriente")

vivienda_oriente$base <- as.character(vivienda_oriente$base)

MapaOriente <- leaflet(vivienda_oriente) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "cyan", radius = 2)


MapaOriente

Para esta zona, se encuentran pocos puntos de ubicaciones erroneos lo que permite un grado de confiabilidad mucho mayor en la asignación de esta zona en relación con las anteriores.

Base 5 - Zona Sur

library(dplyr)
Base5 <- filter(vivienda_base, zona == "Zona Sur" & tipo == "Casa")
head(Base5, 3)
library(leaflet)
vivienda_sur <- subset(vivienda_base, tipo == "Casa" & zona == "Zona Sur")

vivienda_sur$base <- as.character(vivienda_sur$base)

MapaSur <- leaflet(vivienda_sur) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "magenta", radius = 2)


MapaSur

Por último, en la distribución de casas para la zona Sur se observa el mismo comportamiento, en donde la asignación de zonas que se dió por medio de la generación de la base de datos suministrada por la inmobiliaria presenta discrepancias en dichas asignaciones.

library(leaflet)

vivienda_casas <- subset(vivienda_base, tipo == "Casa")

vivienda_casas$base <- as.character(vivienda_casas$base)

colores <- colorFactor(palette = c("#D1255E","#26B986","#B1EC13","#0DC9BE","#A243E7"), domain = vivienda_casas$base)

mapa <- leaflet(vivienda_casas) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = ~colores(base), radius = 4)

mapa

En este mapa de distribución de zonas, se puede observar con claridad que hay una intersección de localización de casas en zonas que se encuentran en puntos equivocados, esto se debe a lo mencionado anteriormente en la distribución geográfica de las casas en la ciudad de Cali

Análisis Exploratorio - Casa

En este punto se realiza un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda, en dónde se usan gráficos interactivos con el paquete plotly.

Inicialmente, se lleva a cabo el análisis entre la variable precio casa en función del área construída por medio de un gráfico de dispersión.

library(plotly)

plot_ly(vivienda_casas, x = ~areaconst, y = ~preciom, type = "scatter", mode = "markers", marker = list(color = "purple")) %>%
  layout(title = "Precio en función del área construída de viviendas",
         xaxis = list(title = "Área (metros cuadrados)"),
         yaxis = list(title = "Precio (millones)"),
         showlegend = FALSE)

En el gráfico de dispersión del precio en función del área construída, se puede concluir que entre mayor sea el área construída el precio del inmueble aumenta su precio, es decir que se presentaría una relación directa de estás variables, aunque en algunos casos podría verse afectada por la variable estrato socioeconómico.

En este caso, se lleva a cabo el análisis entre la variable precio casa en función del estrato socieconómico por medio de un gráfico de barras.

library(plotly)

plot_ly(vivienda_casas, x = ~estrato, y = ~preciom, type = "bar", mode = "markers", marker = list(color = "#76D7C4")) %>%
  layout(title = "Precio en función del estrato socioeconómico",
         xaxis = list(title = "Estrato Socieconómico"),
         yaxis = list(title = "Precio (millones)"),
         showlegend = FALSE)

Para estas variables si se observa claramente que hay una relación directa entre el estrato socioeconómico y el precio de las casas, porque cuando el estrato de la casa es menor teniendo como referencia el 6, el precio tiene a disminuir y cuando el precio es más alto, a su vez el estrato es mayor llegando a 6.

Seguidamente, se realiza el análisis entre la variable precio casa en función del número de baños por medio de un gráfico de barras.

library(plotly)

plot_ly(vivienda_casas, x = ~banios, y = ~preciom, type = "bar", mode = "markers", marker = list(color = "#29BBDC")) %>%
  layout(title = "Precio en función del número de baños por vivienda",
         xaxis = list(title = "Número de baños"),
         yaxis = list(title = "Precio (millones)"),
         showlegend = FALSE)

Con este gráfico, se puede concluir que cuando una casa tiene entre 4 o 5 baños, está tiene un precio mucho mayor comparado con las que tienen menos baños.

Finalmente, se realiza el análisis entre la variable precio casa en función del número de habitaciones por vivienda por medio de un gráfico de barras.

library(plotly)

plot_ly(vivienda_casas, x = ~habitaciones, y = ~preciom, type = "bar", mode = "markers", marker = list(color = "#F16292")) %>%
  layout(title = "Precio en función del número de habitaciones por vivienda",
         xaxis = list(title = "Número de habitaciones"),
         yaxis = list(title = "Precio (millones)"),
         showlegend = FALSE)

Este caso presenta una relación similar al número de habitaciones y el número de años, debido a que si se tienen entre 4 y 5 habitaciones o baños los precios tienen a ser mayores para los tipos de vivienda casa.

Ahora, por medio del siguiente gráfico presenta la correlación existente entre las variables precio, área construída, estrato, número de habitaciones y baños

library(GGally)
cor_1 <-vivienda_casas[,c("preciom","areaconst","estrato","banios","habitaciones")]
ggpairs(cor_1, title="GGally ") 

Las variables precio y área construída tienen un coeficiente de correlación de 0.653 sugiere una relación significativa pero no perfecta entre las dos variables, esto quiere decir que en términos generales cuando el valor del precio aumenta casi siempre tiene que ver con que el área construida es mayor. Adicionalmente, el estrato socioeconómico presenta un coeficiente de 0.666 que también se relaciona directamenta con el aumento o disminución del valor del inmueble, aunado a esto, se encuentra el número de baños que tiene un coeficiente de correlación del 0.558 que establece una relación adicional con el valor del inmueble.

En conclusión, el precio de una casa en la ciudad de Cali depende directamente del estrato socieconómico, área construída y número de baños.

Estimación del Modelo de Regresión Lineal Múltiple (RLM) - Casa

En este apartado, se estima un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños ) ) y se interpretan los coeficientes si son estadísticamente significativos.

modelo_RLM = lm(preciom ~ areaconst + estrato + parqueaderos + banios + habitaciones, data =  vivienda_casas )
summary(modelo_RLM)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios + 
##     habitaciones, data = vivienda_casas)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1319.88  -113.30   -25.16    69.75  1179.44 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -345.92562   20.29873 -17.042  < 2e-16 ***
## areaconst       0.81001    0.02538  31.913  < 2e-16 ***
## estrato       112.80957    4.44614  25.372  < 2e-16 ***
## parqueaderos   40.30572    2.78541  14.470  < 2e-16 ***
## banios         38.52338    3.32115  11.599  < 2e-16 ***
## habitaciones  -13.63190    2.57845  -5.287 1.33e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 203.9 on 3213 degrees of freedom
## Multiple R-squared:  0.6765, Adjusted R-squared:  0.676 
## F-statistic:  1344 on 5 and 3213 DF,  p-value: < 2.2e-16

La ecuación de regresión lineal múltiple corresponde a:

Precio= -345.92562 + 0.81001(areaconst) + 112.80957(estrato) + 40.30572(parqueaderos) + 38.52338(banios) - 13.63190(habitaciones)

El R2 es igual a 0.6765, lo que nos representa que hay un 67.65% de que las variables dependientes puedan explicarse por las variables independientes incluidas en el modelo, esto indica un buen ajuste del modelo a los datos.

Hipótesis para ßo:Ho:βo=0,Ha:β0≠0

Donde el P Valor=2.2e−16

Ya que P Valor<0.05, se rechaza H0:ß0=0 Hipótesis para ß1:H0:β1=0,Ha:β1≠0

Validación del modelo RLM

Se procede a realizar la validación de supuestos del modelo e interpretar los resultados.

par(mfrow = c(2, 2))
plot(modelo_RLM)

En el caso del diagrama Residuals vs Fitted y el scate location, la línea roja es un ajuste local de los residuos que suaviza los puntos del diagrama de dispersión para facilitar la detección de patrones en los residuos. La situación ideal es que esta línea roja sea una que se asemeje a una recta horizonal centrada en cero, en este caso las líneas no se comportan de manera ideal, es porque los datos no se comportan con normalidad y no presentan una tendencia establecida en cuánto a su precio.

En el caso del diagrama QQ-Residuals, los datos que se alinean estrechamente con la línea de puntos indican una distribución normal. En este caso, todos los puntos no se alinean a la línea recta, por lo que se podría considerar ajustar el modelo añadiendo, eliminando otras variables en el modelo de regresión o probar transformaciones para el modelo.

Por último, se encuentra el diagrama de Residuals vs Leverage, es un tipo de diagrama de diagnóstico que permite identificar observaciones influyentes en el modelo de regresión, las observaciones que tienen un alto porcentaje de Leverage o apalancamiento tienen una alta influencia en los coeficientes del modelo de regresión lineal, sí los puntos están fuera de las distancia de Cook se representan como puntos influyentes y el modelo podría ser de no regresión; para este caso no existen puntos influyentes y que la línea roja no sigue la línea punteada con valor a cero esto determina heterocedasticidad y no linealidad.

Ahora, se validan los supuestos del modelo de regresión lineal

Supuesto 1. El valor esperado de los errores es cero E[u]=0

summary(modelo_RLM$residuals)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -1319.88  -113.30   -25.16     0.00    69.75  1179.44
t.test(modelo_RLM$residuals, mu=0)
## 
##  One Sample t-test
## 
## data:  modelo_RLM$residuals
## t = -9.2188e-15, df = 3218, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -7.040633  7.040633
## sample estimates:
##    mean of x 
## -3.31035e-14

P valor= 1>α=0.05, se tiene evidencia suficiente para no rechazar que Ho:ßo=0, por lo tanto el supuesto se cumple.

Supuesto 2. Los errores tienen varianza constante V[ui]=σ2

library(lmtest)
lmtest::gqtest(modelo_RLM) ##La prueba de Goldfeld-Quandt se utiliza para determinar si la heterocedasticidad está presente en un modelo de regresión.##
## 
##  Goldfeld-Quandt test
## 
## data:  modelo_RLM
## GQ = 1.2134, df1 = 1604, df2 = 1603, p-value = 5.459e-05
## alternative hypothesis: variance increases from segment 1 to 2

Como P=5.459e-05<α=0.05, se rechaza la hipotesis nula, quiere decir que, los errores no tienen varianza constante, el supuesto no se cumple.

Supuesto 3 : u es una variable con distribución normal. u∼Normal

shapiro.test(modelo_RLM$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_RLM$residuals
## W = 0.88308, p-value < 2.2e-16

Como P- value =2.2e−16<α=0.05, se rechaza la hipótesis nula, quiere decir que, los errores no se distibuyen de forma normal, el supuesto no se cumple.

Supuesto 4 : Los errores son independientes unos de otros E[ui,uj]

lmtest::dwtest(modelo_RLM)
## 
##  Durbin-Watson test
## 
## data:  modelo_RLM
## DW = 1.5127, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0

Como P-value=2.2e−16<α=0.05, se rechaza la hipótesis nula, quiere decir que, los errores no son independientes, el supuesto no se cumple.

Predicción del modelo- Casa

Con el modelo identificado se predice el precio de la vivienda con las características de la primera solicitud.

predicciones= predict(modelo_RLM,list(vivienda_casas$areaconst == 200, vivienda_casas$estrato >= 4, vivienda_casas$estrato <= 5, vivienda_casas$parqueaderos == 1, vivienda_casas$habitaciones == 4, vivienda_casas$zona == "Zona Norte", vivienda_casas$preciom <= 350   ), interval = "confidence" )
head(predicciones,3)
##        fit      lwr      upr
## 1 123.2880 108.1940 138.3820
## 2 166.1606 151.6441 180.6771
## 3 273.8350 258.2095 289.4605

Al momento de predecir el modelo de vivienda en relación al tipo , en este caso ‘Casa’ las caracteristicas de la solicitud no se encuentra ninguna casa con estás, por ello, se decide cambiar la oferta por los valores que esten por debajo de los establecidos para tener más ofertas inmobiliarias que se asemejen a los requisitos.

Casa <- filter(vivienda_casas, areaconst <= 200, parqueaderos == 1, banios <= 2, habitaciones <= 4, zona == "Zona Norte", estrato <= 5, preciom <= 350)
min(Casa$preciom)
## [1] 89
max(Casa$preciom)
## [1] 290
Casa
library(leaflet)



mapaCasas <- leaflet(Casa) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = ~colores(base), radius = 4)

mapaCasas

Se seleccionaron las viviendas tipo Casa que cumplieron con los siguientes criterios:

El área construida debe ser menor a 200 metros cuadrados. Debe contar con al menos un espacio de parqueadero. Debe tener uno o dos baños. Debe tener cuatro o menos habitaciones. La ubicación debe ser en la zona norte. El estrato debe ser mayor o igual a 5. El precio no debe exceder los 350 millones de pesos.

De acuerdo con el modelo realizado fueron un total de 30 posibles casas que pueden ser seleccionadas para la propuesta de compra, en donde el usuario ya determinará cuál de estás se ajusta mejor a sus requerimientos.

Propuesta de vivienda - Apartamento

Para el segundo momento del análisis, se desarrolla el modelamiento de acuerdo a cada uno de los criterios relacionados en la solicitud, para un apartamento en la Zona Sur.

En este sentido, se hace un análisis exploratorio de la ubicación geográfica de los apartamentos en todas la zonas de la ciudad de Cali, con la finalidad de comprobar si la asignación por zonas fue la adecuada en la base de datos entregada.

attach(vivienda_base)

vivienda_base$base <- ifelse(vivienda_base$zona =="Zona Norte" & vivienda_base$tipo =="Apartamento", "Base 1", 
                         ifelse(vivienda_base$zona =="Zona Centro" & vivienda_base$tipo =="Apartamento", "Base 2",
                          ifelse(vivienda_base$zona =="Zona Oeste" & vivienda_base$tipo =="Apartamento", "Base 3",
                           ifelse(vivienda_base$zona =="Zona Oriente" & vivienda_base$tipo =="Apartamento", "Base 4",
                            ifelse(vivienda_base$zona == "Zona Sur" & vivienda_base$tipo == "Apartamento", "Base 5", "NA")))))
head(vivienda_base,5)

Base 1. Apartamento en el Norte

library(dplyr)
Base1A <- filter(vivienda_base, zona == "Zona Norte" & tipo == "Apartamento")
head(Base1A, 3)
library(leaflet)
Apto_Norte <- subset(vivienda_base, tipo == "Apartamento" & zona == "Zona Norte")

Apto_Norte$base <- as.character(Apto_Norte$base)

MapaNorte <- leaflet(Apto_Norte) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#1BB8DB", radius = 2)


MapaNorte

En esta salida gráfica, se puede visualizar que hubo un error de asignación de zonas en la base de datos, porque no solo hay aparatamentos distribuidos en la zona, también se encuentran algunos ubicados en otras zonas que no corresponden a la Zona Norte.

Base 2. Apartamento en el Centro

library(dplyr)
Base2A <- filter(vivienda_base, zona == "Zona Centro" & tipo == "Apartamento")
head(Base2A, 3)
library(leaflet)
Apto_Centro <- subset(vivienda_base, tipo == "Apartamento" & zona == "Zona Centro")

Apto_Centro$base <- as.character(Apto_Centro$base)

MapaCentro <- leaflet(Apto_Centro) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#ED5220", radius = 2)


MapaCentro

Para el caso de la Zona Centro, también de encuentran aparatamentos que están distribuidas en otras zonas de ciudad. Aunque son mucho menores las ubicaciones fuera de la Zona es importante señalar que esto puede generar un error en cuánto a las características propuestas de vivienda.

Base 3. Apartamento en el Oeste

library(dplyr)
Base3A <- filter(vivienda_base, zona == "Zona Oeste" & tipo == "Apartamento")
head(Base3A, 3)
library(leaflet)
Apto_Oeste <- subset(vivienda_base, tipo == "Apartamento" & zona == "Zona Oeste")

Apto_Oeste$base <- as.character(Apto_Oeste$base)

MapaOeste <- leaflet(Apto_Oeste) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#D2B4DE", radius = 2)


MapaOeste

Seguidamente, se observa un error consecutivo en la asignación de zonas en la base de datos que genera diserción en la cantidad de aparatmentos elegidos para la propuesta.

Base 4. Apartamento en el Oriente

library(dplyr)
Base4A <- filter(vivienda_base, zona == "Zona Oriente" & tipo == "Apartamento")
head(Base4A, 3)
library(leaflet)
Apto_Oriente <- subset(vivienda_base, tipo == "Apartamento" & zona == "Zona Oriente")

Apto_Oriente$base <- as.character(Apto_Oriente$base)

MapaOriente <- leaflet(Apto_Oriente) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#148F77", radius = 2)


MapaOriente

En esta zona, los apartamentos se situan a lo largo de la ciudad de Cali, esto indica que la distribución de las ofertas en la zona oriente no es confiable.

Base 5. Apartamento en el Sur

library(dplyr)
Base5A <- filter(vivienda_base, zona == "Zona Sur" & tipo == "Apartamento")
head(Base5A, 3)
library(leaflet)
Apto_Sur <- subset(vivienda_base, tipo == "Apartamento" & zona == "Zona Sur")

Apto_Sur$base <- as.character(Apto_Sur$base)

MapaSur <- leaflet(Apto_Sur) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#2980B9", radius = 2)


MapaSur

Por último, en la distribución de aparatamentos para la zona Sur se observa el mismo comportamiento, en donde la asignación de zonas que se dió por medio de la generación de la base de datos suministrada por la inmobiliaria presenta discrepancias en dichas asignaciones.

library(leaflet)

vivienda_Apto <- subset(vivienda_base, tipo == "Apartamento")

vivienda_Apto$base <- as.character(vivienda_Apto$base)

colores <- colorFactor(palette = c("#D1255E","#26B986","#B1EC13","#0DC9BE","#A243E7"), domain = vivienda_Apto$base)

mapa_Apto <- leaflet(vivienda_Apto) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = ~colores(base), radius = 4)

mapa_Apto

En este mapa de distribución de zonas, se puede observar con claridad que hay una intersección de localización de apartamentos en zonas que se encuentran en puntos equivocados, esto se debe a lo mencionado anteriormente en la distribución geográfica de las casas en la ciudad de Cali

Análisis Exploratorio Apartamentos

En este punto se realiza un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la apartamento) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda, en dónde se usan gráficos interactivos con el paquete plotly.

Inicialmente, se lleva a cabo el análisis entre la variable precio en función del área construída por medio de un gráfico de dispersión.

library(plotly)

plot_ly(vivienda_Apto, x = ~areaconst, y = ~preciom, type = "scatter", mode = "markers", marker = list(color = "purple")) %>%
  layout(title = "Precio en función del área construída de los apartamentos",
         xaxis = list(title = "Área (metros cuadrados)"),
         yaxis = list(title = "Precio (millones)"),
         showlegend = FALSE)

En el gráfico de dispersión del precio en función del área construída, se puede concluir que entre mayor sea el área construída el precio del inmueble aumenta su precio, es decir que se presentaría una relación directa de estás variables, aunque en algunos casos podría verse afectada por la variable estrato socioeconómico.

En este caso, se lleva a cabo el análisis entre la variable precio casa en función del estrato socieconómico por medio de un gráfico de barras.

library(plotly)

plot_ly(vivienda_Apto, x = ~estrato, y = ~preciom, type = "bar", mode = "markers", marker = list(color = "#76D7C4")) %>%
  layout(title = "Precio en función del estrato socioeconómico",
         xaxis = list(title = "Estrato Socieconómico"),
         yaxis = list(title = "Precio (millones)"),
         showlegend = FALSE)

Para estas variables si se observa claramente que hay una relación directa entre el estrato socioeconómico y el precio de los apartamentos, porque cuando el estrato del apartamento es menor teniendo como referencia el 6, el precio tiene a disminuir y cuando el precio es más alto, a su vez el estrato es mayor llegando a 6.

Seguidamente, se realiza el análisis entre la variable precio apartamento en función del número de baños por medio de un gráfico de barras.

library(plotly)

plot_ly(vivienda_Apto, x = ~banios, y = ~preciom, type = "bar", mode = "markers", marker = list(color = "#29BBDC")) %>%
  layout(title = "Precio en función del número de baños por Apartamento",
         xaxis = list(title = "Número de baños"),
         yaxis = list(title = "Precio (millones)"),
         showlegend = FALSE)

Con este gráfico, se puede concluir que cuando una apartamento tiene entre 2 o 3 baños, este tiene un precio mucho mayor comparado con las que tienen menos baños.

Finalmente, se realiza el análisis entre la variable precio en función del número de habitaciones por vivienda por medio de un gráfico de barras.

library(plotly)

plot_ly(vivienda_Apto, x = ~habitaciones, y = ~preciom, type = "bar", mode = "markers", marker = list(color = "#F16292")) %>%
  layout(title = "Precio en función del número de habitaciones por apartamento",
         xaxis = list(title = "Número de habitaciones"),
         yaxis = list(title = "Precio (millones)"),
         showlegend = FALSE)

Este caso presenta una relación similar al número de habitaciones y el número de baños, debido a que si se tienen entre 2 y 3 habitaciones o baños los precios tienen a ser mayores para los tipos de vivienda apartamento.

Ahora, por medio del siguiente gráfico presenta la correlación existente entre las variables precio, área construída, estrato, número de habitaciones y baño

library(GGally)
cor_1 <-vivienda_Apto[,c("preciom","areaconst","estrato","banios","habitaciones")]
ggpairs(cor_1, title="GGally ") 

Las variables precio y área construída tienen un coeficiente de correlación de 0.829 sugiere una relación positiva fuerte pero no perfecta entre las dos variables, esto quiere decir que cuando el valor del precio aumenta casi siempre es porque aumentó el área construida del apartamento.

Adicionalmente, el estrato socioeconómico presenta un coeficiente de 0.667 que también se relaciona directamenta con el aumento o disminución del valor del inmueble, aunado a esto, se encuentra el número de baños que tiene un coeficiente de correlación del 0.740 que establece una relación adicional con el valor del inmueble.

En conclusión, el precio de un apartamento en la ciudad de Cali depende directamente del área construída, estrato socieconómico y el número de baños.

Estimación del Modelo de Regresión Lineal Múltiple (RLM) para apartamento

En este apartado, se estima un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños ) ) y se interpretan los coeficientes si son estadísticamente significativos.

modelo_RLMA = lm(preciom ~ areaconst + estrato + parqueaderos + banios + habitaciones, data =  vivienda_Apto )
summary(modelo_RLMA)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios + 
##     habitaciones, data = vivienda_Apto)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1884.66   -53.65    -3.61    45.30  1028.85 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -211.02021   13.32957  -15.83   <2e-16 ***
## areaconst       2.19809    0.04186   52.52   <2e-16 ***
## estrato        51.05448    2.67830   19.06   <2e-16 ***
## parqueaderos   55.39086    2.96114   18.71   <2e-16 ***
## banios         51.90627    3.02972   17.13   <2e-16 ***
## habitaciones  -40.10636    3.29257  -12.18   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 134.1 on 5094 degrees of freedom
## Multiple R-squared:  0.7852, Adjusted R-squared:  0.785 
## F-statistic:  3723 on 5 and 5094 DF,  p-value: < 2.2e-16

La ecuación de regresión lineal múltiple corresponde a:

Precio= -211.02021 + 2.19809(areaconst) + 51.05448(estrato) + 55.39086(parqueaderos) + 51.90627(banios) - -40.10636(habitaciones)

El R2 es igual a 0.7852, lo que nos representa que hay un 78.52% de que las variables mencionadas tienen relacion con el precio del inmueble.

Hipótesis para ßo:Ho:βo=0,Ha:β0≠0

Donde el P Valor=2.2e−16

Ya que P Valor<0.05, se rechaza H0:ß0=0 Hipótesis para ß1:H0:β1=0,Ha:β1≠0

  1. Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer).
par(mfrow = c(2, 2))
plot(modelo_RLMA)

En el caso del diagrama Residuals vs Fitted y el scate location, la línea roja es un ajuste local de los residuos que suaviza los puntos del diagrama de dispersión para facilitar la detección de patrones en los residuos. La situación ideal es que esta línea roja sea una que se asemeje a una recta horizonal centrada en cero, en este caso las líneas no se comportan de manera ideal, es porque los datos no se comportan con normalidad y no presentan una tendencia establecida en cuánto a su precio.

En el caso del diagrama QQ-Residuals, los datos que se alinean estrechamente con la línea de puntos indican una distribución normal. En este caso, todos los puntos no se alinean a la línea recta, por lo que se podría considerar ajustar el modelo añadiendo, eliminando otras variables en el modelo de regresión o probar transformaciones para el modelo.

Por último, se encuentra el diagrama de Residuals vs Leverage, es un tipo de diagrama de diagnóstico que permite identificar observaciones influyentes en el modelo de regresión, las observaciones que tienen un alto porcentaje de Leverage o apalancamiento tienen una alta influencia en los coeficientes del modelo de regresión lineal, sí los puntos están fuera de las distancia de Cook se representan como puntos influyentes y el modelo podría ser de no regresión; para este caso no existen puntos influyentes y que la línea roja no sigue la línea punteada con valor a cero esto determina heterocedasticidad y no linealidad.

Ahora, se validan los supuestos del modelo de regresión lineal para apartamentos

Supuesto 1. El valor esperado de los errores es cero E[u]=0

summary(modelo_RLMA$residuals)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -1884.66   -53.65    -3.61     0.00    45.30  1028.85
t.test(modelo_RLMA$residuals, mu=0)
## 
##  One Sample t-test
## 
## data:  modelo_RLMA$residuals
## t = 7.0455e-15, df = 5099, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -3.679988  3.679988
## sample estimates:
##    mean of x 
## 1.322527e-14

P valor= 1>α=0.05, se tiene evidencia suficiente para no rechazar que Ho:ßo=0, por lo tanto el supuesto se cumple.

Supuesto 2. Los errores tienen varianza constante V[ui]=σ2

library(lmtest)
lmtest::gqtest(modelo_RLMA) ##La prueba de Goldfeld-Quandt se utiliza para determinar si la heterocedasticidad está presente en un modelo de regresión.##
## 
##  Goldfeld-Quandt test
## 
## data:  modelo_RLMA
## GQ = 1.5909, df1 = 2544, df2 = 2544, p-value < 2.2e-16
## alternative hypothesis: variance increases from segment 1 to 2

como P=2.2e-16<α=0.05, se rechaza la hipotesis nula, quiere decir que, los errores no tienen varianza constante, el supuesto no se cumple.

Supuesto 3 : Los errores son independientes unos de otros E[ui,uj]

lmtest::dwtest(modelo_RLM)
## 
##  Durbin-Watson test
## 
## data:  modelo_RLM
## DW = 1.5127, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0

Como P-value=2.2e−16<α=0.05, se rechaza la hipótesis nula, quiere decir que, los errores no son independientes, el supuesto no se cumple.

Predicción del modelo

Con el modelo identificado debe predecir el precio de la vivienda con las características de la segunda solicitud.

predicciones= predict(modelo_RLMA,list(vivienda_Apto$areaconst == 300, vivienda_Apto$estrato >= 5, vivienda_Apto$estrato <= 6, vivienda_Apto$parqueaderos == 3, vivienda_Apto$habitaciones == 5, vivienda_Apto$zona == "Zona Sur", vivienda_Apto$preciom <= 850, vivienda_Apto$banios == 3), interval = "confidence" )
head(predicciones,3)
##         fit       lwr       upr
## 1  66.48094  46.17376  86.78813
## 2 244.79817 235.77728 253.81906
## 3 479.89152 463.75350 496.02953

Al momento de predecir el modelo de vivienda en relación al tipo , para apartamento las caracteristicas de la solicitud no se encuentra ninguna apartamento con estás, por ello, se decide cambiar la oferta por los valores que esten por debajo de los establecidos para tener más ofertas inmobiliarias que se asemejen a los requisitos.

Apto <- filter(vivienda_casas, areaconst <= 300, parqueaderos == 3, banios == 3, habitaciones <= 5, zona == "Zona Sur", estrato <= 6, preciom <= 850)
min(Apto$preciom)
## [1] 320
max(Apto$preciom)
## [1] 850
Apto
library(leaflet)



mapaApto2 <- leaflet(Apto) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = ~colores(base), radius = 4)

mapaApto2

Se seleccionaron las viviendas tipo Apartamento que cumplieron con los siguientes criterios:

El área construida debe ser menor a 300 metros cuadrados. Debe contar con al menos tres espacios de parqueadero. Debe tener tres baños. Debe tener cinco o menos habitaciones. La ubicación debe ser en la zona sur. El estrato debe ser mayor o igual a 6. El precio no debe exceder los 850 millones de pesos.

De acuerdo con el modelo realizado fueron un total de 16 posibles apartamentos que pueden ser seleccionados para la propuesta de compra, en donde el usuario ya determinará cuál de estás se ajusta mejor a sus requerimientos.

Conclusión

En el proceso para determinar las mejores ofertas inmobiliarias de acuerdo con las características mencionadas en el procedimiento en cuánto a casas o apartamentos, se concluye el modelo de regresión lineal múltiple se ajusta mejor a los requerimientos establecidos para apartamentos con un R2 igual a 0.7852, lo que representa que hay un 78.52% de que las variables mencionadas tienen relación con el precio del inmueble, caso contrario ocurre con las casas que tienen un R2 de 67.65%.

Sin embargo, las variables como área construída, estrato socieconómico, número de baños y habitaciones tienen relaciones similares en cuánto al precio del inmueble, en donde se puede concluir que las variables que más inciden en el aumento o en la disminución del valor del inmueble son área construída y estrato socieconómico.