# Libraries
#install.packages("caret")
library(dplyr)
library(ggplot2)
library(leaflet)
library(GGally)
library(paqueteMODELOS)
library(caret)
library(knitr) # Para una mejor visualización de tablas
library(kableExtra)
library(plotly)
library(ggpubr)
#install.packages("devtools") # solo la primera vez
#devtools::install_github("centromagis/paqueteMODELOS", force = TRUE)Introducción
María, una agente de bienes raíces con más de 10 años de experiencia, fundó su propia compañía, C&A (Casas y Apartamentos), en Cali después de trabajar en diferentes agencias del sector. Actualmente, dirige un equipo de ocho agentes que han enfrentado una disminución significativa en las ventas de bienes raíces en la ciudad. Sin embargo, se espera que el sector se reactive con la estabilización de la economía.
Recientemente, María recibió una solicitud de asesoría por parte de una compañía internacional que busca comprar dos viviendas para alojar a sus empleados en Cali. Este informe tiene como objetivo analizar la viabilidad de compra de estas viviendas, evaluando opciones dentro del mercado y utilizando técnicas estadísticas para predecir su precio.
Se construirán modelos de regresión lineal, teniendo en cuenta varias variables de las que se disponen, para estimar los precios de las propiedades solicitadas. Finalmente, se presentarán conclusiones y recomendaciones para facilitar la toma de decisiones por parte de la empresa interesada en la compra.
Desarrollo del análisis
Se realizó una exploración inicial para identificar los valores faltantes y manejarlos correctamente.
# Carga de datos
data("vivienda")
# Rellenar valores nulos y corregir datos
vivienda <- vivienda %>%
mutate(
parqueaderos = ifelse(is.na(parqueaderos), 0, parqueaderos),
banios = ifelse(banios == 0, ave(banios, zona, estrato, tipo, FUN = function(x) median(x[x > 0], na.rm = TRUE)), banios),
habitaciones = floor(ifelse(habitaciones == 0, ave(habitaciones, zona, estrato, tipo, FUN = function(x) median(x[x > 0], na.rm = TRUE)), habitaciones))
)Ahora, para abordar los análisis relacionados con cada una de las viviendas, se filtrará el conjunto de datos para tomar solo casas de la zona norte y apartamentos de la zona sur, para el caso 1 y 2, respectivamente.
Caso 1
Análisis exploratorio
A continuación, se mostrarán algunos de los registros de los datos filtrados para el caso 1, y se adicionará una tabla que imprime algunos detalles sobre la distribución de la información, como el valor mínimo, máximo, el promedio, la mediana, entre otros.
# Filtrar casas en zona norte
base1 <- vivienda %>% filter(tipo == "Casa", zona == "Zona Norte")
# Mostrar los primeros 3 registros
kable(head(base1, 3), format = "html") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1209 | Zona Norte | 02 | 5 | 320 | 150 | 2 | 4 | 6 | Casa | acopi | -76.51341 | 3.47968 |
| 1592 | Zona Norte | 02 | 5 | 780 | 380 | 2 | 3 | 3 | Casa | acopi | -76.51674 | 3.48721 |
| 4057 | Zona Norte | 02 | 6 | 750 | 445 | 0 | 7 | 6 | Casa | acopi | -76.52950 | 3.38527 |
# Resumen de la base
kable(summary(base1), format = "html") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Min. : 58.0 | Length:722 | Length:722 | Min. :3.000 | Min. : 89.0 | Min. : 30.0 | Min. : 0.000 | Min. : 1.000 | Min. : 1.000 | Length:722 | Length:722 | Min. :-76.59 | Min. :3.333 | |
| 1st Qu.: 766.2 | Class :character | Class :character | 1st Qu.:3.000 | 1st Qu.: 261.2 | 1st Qu.: 140.0 | 1st Qu.: 0.000 | 1st Qu.: 2.000 | 1st Qu.: 3.000 | Class :character | Class :character | 1st Qu.:-76.53 | 1st Qu.:3.452 | |
| Median :2257.0 | Mode :character | Mode :character | Median :4.000 | Median : 390.0 | Median : 240.0 | Median : 1.000 | Median : 3.000 | Median : 4.000 | Mode :character | Mode :character | Median :-76.52 | Median :3.468 | |
| Mean :2574.6 | NA | NA | Mean :4.202 | Mean : 445.9 | Mean : 264.9 | Mean : 1.314 | Mean : 3.604 | Mean : 4.618 | NA | NA | Mean :-76.52 | Mean :3.460 | |
| 3rd Qu.:4225.0 | NA | NA | 3rd Qu.:5.000 | 3rd Qu.: 550.0 | 3rd Qu.: 336.8 | 3rd Qu.: 2.000 | 3rd Qu.: 4.000 | 3rd Qu.: 5.000 | NA | NA | 3rd Qu.:-76.50 | 3rd Qu.:3.482 | |
| Max. :8319.0 | NA | NA | Max. :6.000 | Max. :1940.0 | Max. :1440.0 | Max. :10.000 | Max. :10.000 | Max. :10.000 | NA | NA | Max. :-76.47 | Max. :3.496 |
Acá se ubicarán los registros de las viviendas para el caso 1 sobre un mapa, para mirar como se agrupan los datos. Como podemos ver, la mayoria de casas, efectivamente, se ubican alrededor del norte de la ciudad, pero hay una gran cantidad de puntos dispersos en el resto del mapa. Esto se puede deber a que la información asociada a su ubicación podría ser incorrecta. Para este informe, debido a que no poseemos un registro que nos permita determinar, efectivamente, que coordenadas corresponden a que barrios y a que zonas, se asumirá que, para estos registros, dichas coordenadas pueden estar mal asignadas, pero que la vivienda y la zona son correctas.
# Mapa de ubicaciones
leaflet(base1) %>%
addTiles() %>%
addCircleMarkers(~longitud, ~latitud, radius = 3, color = "blue", fill = TRUE, fillOpacity = 0.7, stroke = FALSE, popup = ~as.character(preciom))A continuación, se evaluarán las correlaciones entre la variable respuesta (precio) y algunas del resto de las variables. El boxplot nos permite visualizar la distribución de los precios por estrato, donde se evidencia que hay distintas viviendas que tienen un precio mas alto que el esperado, para cada uno de ellos. Luego, para el análisis de las correlaciones, se puede ver que el precio por metro cuadrado y el area construida tienen un alta correlacion, seguida por la cantidad de baños, y en menor grado los parqueaderos y las habitaciones. La mayoría de variables parecen estar sesgadas a la derecha, mostrando que la mayoria de los valores estan centrados en las cantidades mas pequeñas.
# Boxplot estrato y precio
ggplot(base1, aes(x = factor(estrato), y = preciom)) +
geom_boxplot() +
labs(title = "Distribucion del precio - estrato", x = "Estrato", y = "Precio (por mt2)")
# Gráfico de relaciones
ggpairs(base1, columns = c("preciom", "areaconst", "parqueaderos", "banios", "habitaciones"))Modelo de Regresión Lineal Múltiple
En esta sección, se construirá un modelo de regresión lineal múltiple con el objetivo de predecir el precio de las viviendas en función de sus características principales. La regresión lineal es una técnica estadística que permite estimar la relación entre una variable dependiente (precio) y varias variables independientes (como área construida, estrato socioeconómico, número de parqueaderos, baños y habitaciones).
set.seed(1)
#Subset para tomar varias muestras aleatorias
control <- trainControl(method = "cv", number = 10)
# Convertir estrato en variables dummies
base1 <- base1 %>% mutate(estrato = as.factor(estrato))
modelo1 <- train(preciom ~ areaconst + factor(estrato) + parqueaderos + banios + habitaciones,
data = base1,
method = "lm",
trControl = control)
modelo1_coeficientes <- as.data.frame(summary(modelo1$finalModel)$coefficients)
kable(modelo1_coeficientes, format = "html") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))| Estimate | Std. Error | t value | Pr(>|t|) | |
|---|---|---|---|---|
| (Intercept) | 16.6043913 | 18.7915214 | 0.8836108 | 0.3772038 |
| areaconst | 0.7939042 | 0.0443742 | 17.8911085 | 0.0000000 |
factor(estrato)4
|
80.6793353 | 17.5015274 | 4.6098454 | 0.0000048 |
factor(estrato)5
|
135.6495611 | 17.0528332 | 7.9546642 | 0.0000000 |
factor(estrato)6
|
325.7816229 | 26.7821230 | 12.1641448 | 0.0000000 |
| parqueaderos | 2.1743832 | 4.3067024 | 0.5048835 | 0.6137964 |
| banios | 29.5450428 | 5.7517589 | 5.1366970 | 0.0000004 |
| habitaciones | 3.4599782 | 4.6921974 | 0.7373897 | 0.4611276 |
# Extraer información relevante del summary
resumen <- summary(modelo1$finalModel)
resumen_df <- data.frame(
R2 = resumen$r.squared,
R2_ajustado = resumen$adj.r.squared,
Error_std_residuos = resumen$sigma,
F_statistic = resumen$fstatistic[1]
)
# Mostrar en tabla
kable(resumen_df, format = "html") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))| R2 | R2_ajustado | Error_std_residuos | F_statistic | |
|---|---|---|---|---|
| value | 0.6652852 | 0.6620036 | 156.0203 | 202.737 |
A continuación, la interpretación de algunos coeficientes estimados por el modelo:
Intercepto: 16.60 indica el precio base estimado cuando todas las demás variables son cero, aunque en este caso no tiene una interpretación práctica directa.
Área construida: 0.79 sugiere que, en promedio, por cada metro cuadrado adicional, el precio del metro cuadrado aumenta en 7.900 pesos.
Estrato 4: Comparado con el estrato base (estrato 3), una vivienda en estrato 4 se asocia con un incremento de aproximadamente 806.800 pesos en el precio del metro cuadrado.
Estrato 5: Comparado con el estrato base, una vivienda en estrato 5 tiene un aumento promedio de 1.356.500 pesos en el precio del metro cuadrado.
Estrato 6: Comparado con el estrato base, una vivienda en estrato 6 tiene un aumento promedio de 3.257.800 pesos en el precio del metro cuadrado, lo que sugiere una diferencia sustancial en los valores de las viviendas de mayor estrato.
Número de baños: 29.55 implica que, en promedio, una vivienda con un baño adicional tiende a costar 295.500 pesos por metro cuadrado más.
Variables como la cantidad de parqueaderos y habitaciones no se describen porque su efecto no es estadísticamente significativo en el precio (debido al p-valor tan alto)
El coeficiente de determinación ajustado (R² ajustado) es 0.662, lo que indica que aproximadamente el 66.2% de la variabilidad en el precio de las viviendas puede ser explicada por el modelo con las variables seleccionadas. Este valor sugiere que el modelo tiene un buen ajuste, aunque aún existen factores no contemplados que pueden influir en el precio.
Validación de Supuestos
Para garantizar que el modelo sea confiable y sus predicciones sean precisas, es fundamental validar sus supuestos. Los principales aspectos que se verifican incluyen:
- Linealidad: Se analiza si la relación entre las variables predictoras y el precio de la vivienda es lineal.
- Normalidad de los residuos: Se verifica si los residuos del modelo siguen una distribución normal, lo que indicaría que el modelo representa adecuadamente los datos.
- Homoscedasticidad: Se evalúa si los residuos tienen varianza constante en todos los valores de las variables independientes.
- Independencia de los residuos: Se verifica si no hay patrones estructurados en los residuos que podrían indicar una relación no capturada por el modelo.
Los
gráficos anteriores nos empiezan a dar una idea del comportamiento de
los datos. Del primer gráfico, se identifican signos de no linealidad y
posible heterocedasticidad, debido a que la dispersion de los residuos
no es completamente constante y la linea roja muestra una ligera curva
en los valores más altos. Esto también se confirma con el comportamiento
de la tercera gráfica, donde se evidencia un patrón creciente en la
varianza de los residuos a medida que aumentan los valores
ajustados.
Para el segundo gráfico, a pesar de que en el centro los residuos siguen aproximadamente la línea diagonal, hacia los extremos los puntos se desvían significativamente, por lo que los residuos no parecen seguir una distribución normal. Finalmente, del cuarto gráfico, se identifican algunos puntos alejados con alta influencia en el modelo (aquellos cercanos o sobre la linea punteada, definida por la distancia de Cook), puntos que se recomendaría inspeccionar para ver si eliminarlos afecta demasiado las estimaciones.
Predicción para la vivienda
A partir del modelo anteriormente creado, se concluye lo siguiente:
- La predicción para la vivienda 1 con estrato 4 es: 662,337,907 pesos.
- La predicción para la vivienda 1 con estrato 5 es: 772,278,359 pesos.
solicitud1_1 <- data.frame(areaconst = 200, estrato = 4, parqueaderos = 1, banios = 2, habitaciones = 4)
prediccion1_1 <- predict(modelo1, newdata = solicitud1_1)*200*10000solicitud1_2 <- data.frame(areaconst = 200, estrato = 5, parqueaderos = 1, banios = 2, habitaciones = 4)
prediccion1_2 <- predict(modelo1, newdata = solicitud1_2)*200*10000Pero, como se indico anteriormente, los resultados de dicha predicción no serían fiables debido a que el modelo no cumplió los supuestos. Por lo tanto, habría la necesidad de realizar transformaciones a los datos, incluir otras variables o probar con un modelo distinto que permita predecir de manera más fiable los precios de las viviendas a partir de las variables consideradas.
Sugerencia de Ofertas para la vivienda
A continuación se comparten algunas de las viviendas que cumplen con los requisitos mencionados anteriormente, permitiendo algo de holgura en las distintas opciones, con el objetivo de aumentar la cantidad de alternativas a tener en cuenta para tomar una decisión.
ofertas <- base1 %>%
filter(preciom <= 350 & # Permite precios entre 70% y 130% de 350
between(parqueaderos, 1, 2) & # Permite 0, 1 o 2 parqueaderos
between(banios, 2, 3) & # Permite 1, 2 o 3 baños
between(habitaciones, 4, 5) & # Permite 3, 4 o 5 habitaciones
estrato %in% c(4, 5) &
between(areaconst, 200 * 0.8, 200 * 1.2)
) # Permite estrato ±1, es decir, 3, 4, 5, 6
leaflet(ofertas) %>%
addTiles() %>%
addCircleMarkers(~longitud, ~latitud, radius = 3, color = "blue", fill = TRUE, fillOpacity = 0.7, stroke = FALSE, popup = ~as.character(preciom))Caso 2
Análisis exploratorio
# Filtrar apartamentos en zona sur
base2 <- vivienda %>% filter(tipo == "Apartamento", zona == "Zona Sur")
# Mostrar los primeros 3 registros
kable(head(base2, 3), format = "html") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 5098 | Zona Sur | 05 | 4 | 290 | 96 | 1 | 2 | 3 | Apartamento | acopi | -76.53464 | 3.44987 |
| 698 | Zona Sur | 02 | 3 | 78 | 40 | 1 | 1 | 2 | Apartamento | aguablanca | -76.50100 | 3.40000 |
| 8199 | Zona Sur | NA | 6 | 875 | 194 | 2 | 5 | 3 | Apartamento | aguacatal | -76.55700 | 3.45900 |
# Resumen de la base
kable(summary(base2), format = "html") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Min. : 3 | Length:2787 | Length:2787 | Min. :3.00 | Min. : 75.0 | Min. : 40.00 | Min. : 0.000 | Min. :1.000 | Min. :1.000 | Length:2787 | Length:2787 | Min. :-76.57 | Min. :3.334 | |
| 1st Qu.:2292 | Class :character | Class :character | 1st Qu.:4.00 | 1st Qu.: 175.0 | 1st Qu.: 65.00 | 1st Qu.: 1.000 | 1st Qu.:2.000 | 1st Qu.:3.000 | Class :character | Class :character | 1st Qu.:-76.54 | 1st Qu.:3.370 | |
| Median :4004 | Mode :character | Mode :character | Median :5.00 | Median : 245.0 | Median : 85.00 | Median : 1.000 | Median :2.000 | Median :3.000 | Mode :character | Mode :character | Median :-76.53 | Median :3.383 | |
| Mean :4131 | NA | NA | Mean :4.63 | Mean : 297.3 | Mean : 97.47 | Mean : 1.208 | Mean :2.493 | Mean :2.974 | NA | NA | Mean :-76.53 | Mean :3.390 | |
| 3rd Qu.:5876 | NA | NA | 3rd Qu.:5.00 | 3rd Qu.: 335.0 | 3rd Qu.:110.00 | 3rd Qu.: 2.000 | 3rd Qu.:3.000 | 3rd Qu.:3.000 | NA | NA | 3rd Qu.:-76.52 | 3rd Qu.:3.406 | |
| Max. :8302 | NA | NA | Max. :6.00 | Max. :1750.0 | Max. :932.00 | Max. :10.000 | Max. :8.000 | Max. :6.000 | NA | NA | Max. :-76.46 | Max. :3.497 |
Similar a lo sucedido en el caso 1, para este caso, a pesar de que la mayoría de apartamentos se agrupan en la zona sur de la ciudad, hay muchos puntos dispersos en el resto del mapa muy posiblemente debido a coordenadas mal asignadas.
# Mapa de ubicaciones
leaflet(base2) %>%
addTiles() %>%
addCircleMarkers(~longitud, ~latitud, radius = 3, color = "blue", fill = TRUE, fillOpacity = 0.7, stroke = FALSE, popup = ~as.character(preciom))Se procede a revisar las correlaciones entre la variable respuesta (precio) y otras variables. El boxplot evidencia aún más aprtamentos un precio mas alto que el esperado, que en el caso 1, lo que indica que el estrato, posiblemente, no es un predictor tan efectivo del precio del metro cuadrado.
De nuevo, hay una alta correlación entre el precio por metro cuadrado y el area construida tienen un alta correlacion, al igual que con los parqueaderos y los baños, con la variable con la que parece tener una baja correlación son la cantidad de habitaciones. La mayoría de variables parecen estar sesgadas a la derecha, mostrando que la mayoria de los valores estan centrados en las cantidades mas pequeñas. Pero la cantidad de habitaciones si destaca por tener una distribución que intenta asemejarse mása una distribución normal.
# Boxplot
ggplot(base2, aes(x = factor(estrato), y = preciom)) +
geom_boxplot() +
labs(title = "Distribucion del precio - estrato", x = "Estrato", y = "Precio (por mt2)")
# Gráfico de relaciones con GGally
ggpairs(base2, columns = c("preciom", "areaconst", "parqueaderos", "banios", "habitaciones"))Modelo de Regresión Lineal Múltiple
set.seed(1)
control <- trainControl(method = "cv", number = 10)
# Convertir estrato en variables dummies
base2 <- base2 %>% mutate(estrato = as.factor(estrato))
modelo2 <- train(preciom ~ areaconst + factor(estrato) + parqueaderos + banios + habitaciones,
data = base2,
method = "lm",
trControl = control)
modelo2_coeficientes <- as.data.frame(summary(modelo2$finalModel)$coefficients)
kable(modelo2_coeficientes, format = "html") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))| Estimate | Std. Error | t value | Pr(>|t|) | |
|---|---|---|---|---|
| (Intercept) | -1.026451 | 10.1704495 | -0.1009248 | 0.9196174 |
| areaconst | 1.362106 | 0.0462409 | 29.4567461 | 0.0000000 |
factor(estrato)4
|
17.518848 | 6.9294140 | 2.5281861 | 0.0115203 |
factor(estrato)5
|
37.092202 | 7.2486917 | 5.1170892 | 0.0000003 |
factor(estrato)6
|
198.104836 | 9.1264978 | 21.7065560 | 0.0000000 |
| parqueaderos | 45.460490 | 2.8072545 | 16.1939329 | 0.0000000 |
| banios | 41.847411 | 2.9436126 | 14.2163444 | 0.0000000 |
| habitaciones | -15.860217 | 3.3122619 | -4.7883344 | 0.0000018 |
# Extraer información relevante del summary
resumen2 <- summary(modelo2$finalModel)
resumen2_df <- data.frame(
R2 = resumen2$r.squared,
R2_ajustado = resumen2$adj.r.squared,
Error_std_residuos = resumen2$sigma,
F_statistic = resumen2$fstatistic[1]
)
# Mostrar en tabla
kable(resumen2_df, format = "html") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))| R2 | R2_ajustado | Error_std_residuos | F_statistic | |
|---|---|---|---|---|
| value | 0.7886089 | 0.7880764 | 88.18062 | 1481.035 |
A continuación, la interpretación de algunos coeficientes estimados por el modelo:
Intercepto: -1.02 indica el precio base estimado cuando todas las demás variables son cero, aunque, de nuevo, no tiene una interpretación práctica directa.
Área construida: 1.36 sugiere que, en promedio, por cada metro cuadrado adicional, el precio del metro cuadrado aumenta en 13.600 pesos.
Estrato 4: Comparado con el estrato base (estrato 3), una vivienda en estrato 4 se asocia con un incremento de aproximadamente 175.100 pesos en el precio del metro cuadrado.
Estrato 5: Comparado con el estrato base, una vivienda en estrato 5 tiene un aumento promedio de 370.900 pesos en el precio del metro cuadrado.
Estrato 6: Comparado con el estrato base, una vivienda en estrato 6 tiene un aumento promedio de 1.981.000 pesos en el precio del metro cuadrado, que de nuevo sugiere una diferencia sustancial en los valores de las viviendas de mayor estrato.
Número de parqueaderos: 45.46 implica que, en promedio, una vivienda con un parqueadero adicional tiende a costar 454.600 pesos por metro cuadrado más.
Número de baños: 41.85 implica que, en promedio, una vivienda con un baño adicional tiende a costar 418.500 pesos por metro cuadrado más.
Número de habitaciones: -15.86 implica que, en promedio, una vivienda con una habitación adicional costaría aproximadamente 158.600 pesos por metro cuadrado menos. Valor posiblemente no esperado, ya que la expectativa sería que al tener más cuartos, la vivienda costaría más.
El coeficiente de determinación ajustado (R² ajustado) es 0.788, lo que indica que aproximadamente el 78.8% de la variabilidad en el precio de las viviendas puede ser explicada por el modelo con las variables seleccionadas. Este valor sugiere que el modelo tiene un buen ajuste, aunque aún existen factores no contemplados que pueden influir en el precio.
Validación de Supuestos
Del
primer gráfico, nuevamente hay indicios de no linealidad y posible
heterocedasticidad, debido a que la dispersion de los residuos no parece
ser completamente aleatoria y la linea roja muestra una ligera curva en
los valores más altos. Y, de nuevo, la tercera gráfica evidencia un
patrón creciente en la varianza de los residuos a medida que aumentan
los valores ajustados.
Para el segundo gráfico, hacia los extremos los puntos se desvían significativamente, por lo que igulmanete los residuos no parecen seguir una distribución normal. Finalmente, del cuarto gráfico, se identifican varios valores influyentes, que posiblemente podr[ian distorsionar el modelo.
Predicción para la vivienda
A partir del modelo anteriormente creado, se concluye lo siguiente:
- La predicción para la vivienda 1 con estrato 5 es: 1,881,960,825 pesos.
- La predicción para la vivienda 1 con estrato 6 es: 772,278,359 pesos.
solicitud2_1 <- data.frame(areaconst = 300, estrato = 5, parqueaderos = 3, banios = 3, habitaciones = 5)
prediccion2_1 <- predict(modelo2, newdata = solicitud2_1)*300*10000solicitud2_2 <- data.frame(areaconst = 300, estrato = 6, parqueaderos = 3, banios = 3, habitaciones = 5)
prediccion2_2 <- predict(modelo2, newdata = solicitud2_2)*300*10000Pero, de nuevo, los resultados de dicha predicción no serían fiables debido a que el modelo, incluso para el segundo caso, no cumplió los supuestos. Por lo tanto, habría la necesidad de realizar transformaciones a los datos, incluir otras variables o probar con un modelo distinto que permita predecir de manera más fiable los precios de las viviendas a partir de las variables consideradas.
Sugerencia de Ofertas para Vivienda 2
A continuación se comparten algunas de las viviendas que cumplen con los requisitos mencionados anteriormente, permitiendo algo de holgura en las distintas opciones, con el objetivo de aumentar la cantidad de alternativas a tener en cuenta para tomar una decisión.
ofertas2 <- base2 %>%
filter(preciom <= 850 & # Permite precios entre 70% y 130% de 350
between(parqueaderos, 3, 5) & # Permite 0, 1 o 2 parqueaderos
between(banios, 3, 5) & # Permite 1, 2 o 3 baños
between(habitaciones, 4, 6) & # Permite 3, 4 o 5 habitaciones
estrato %in% c(5, 6) &
between(areaconst, 300 * 0.6, 300 * 1.4)
) # Permite estrato ±1, es decir, 3, 4, 5, 6
leaflet(ofertas2) %>%
addTiles() %>%
addCircleMarkers(~longitud, ~latitud, radius = 3, color = "blue", fill = TRUE, fillOpacity = 0.7, stroke = FALSE, popup = ~as.character(preciom))Conclusiones y Recomendaciones
El análisis realizado permitió estimar los precios de dos viviendas en Cali, aplicando modelos de regresión lineal múltiple y evaluando la relación entre las características de las propiedades y sus valores en el mercado. Se encontró que la variable más influyente en el precio es el área construida, seguida por el estrato, con diferencias significativas en los valores entre los estratos más altos y más bajos. Sin embargo, algunas variables, como la cantidad de parqueaderos y habitaciones, no demostraron ser significativas en la predicción del precio.
A pesar de que los modelos presentan un ajuste moderadamente bueno (R² ajustado de 66.2% y 78.8% respectivamente), los análisis de residuos sugieren que no cumplen completamente los supuestos de regresión lineal, lo que puede afectar la fiabilidad de las predicciones. En este sentido, se recomienda explorar otros enfoques, como transformaciones de datos o modelos más avanzados que puedan capturar mejor las relaciones no lineales en los datos.
En cuanto a las recomendaciones de compra, se identificaron múltiples opciones de viviendas que cumplen con los criterios de búsqueda y se encuentran dentro del presupuesto preaprobado. Estas opciones fueron mapeadas y pueden ser evaluadas para la toma de decisiones finales. Se sugiere realizar una inspección detallada de las propiedades y considerar otros factores no contemplados en el modelo, como la calidad de la construcción, ubicación exacta y tendencia del mercado inmobiliario en la ciudad.