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.
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.
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.
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.
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.
## 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.
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.
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## 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…
## 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
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.
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 |
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)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)
MapaNorteEn 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.
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)
MapaCentroPara 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.
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)
MapaOesteSeguidamente, 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.
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)
MapaOrientePara 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.
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)
MapaSurPor ú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)
mapaEn 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
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.
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
Se procede a realizar la validación de supuestos del modelo e interpretar los resultados.
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
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -1319.88 -113.30 -25.16 0.00 69.75 1179.44
##
## 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-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]
##
## 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.
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
## [1] 290
library(leaflet)
mapaCasas <- leaflet(Casa) %>%
addTiles() %>%
addCircleMarkers(lng = ~longitud, lat = ~latitud, color = ~colores(base), radius = 4)
mapaCasasSe 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.
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)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)
MapaNorteEn 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.
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)
MapaCentroPara 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.
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)
MapaOesteSeguidamente, 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.
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)
MapaOrienteEn 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.
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)
MapaSurPor ú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_AptoEn 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
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.
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
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
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -1884.66 -53.65 -3.61 0.00 45.30 1028.85
##
## 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]
##
## 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.
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
## [1] 850
library(leaflet)
mapaApto2 <- leaflet(Apto) %>%
addTiles() %>%
addCircleMarkers(lng = ~longitud, lat = ~latitud, color = ~colores(base), radius = 4)
mapaApto2Se 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.
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.