Estimar y validar modelos de Regresión Lineal Múltiple para explicar y predecir el precio de vivienda (millones de pesos) en Cali para apoyar la toma de decisiones para dos solicitudes:
Vivienda 1: Casa en Zona Norte, 200 m², 1 parqueadero, 2 baños, 4 habitaciones, estrato 4–5, crédito ≤ 350 M.
Vivienda 2: Apartamento en Zona Sur, 300 m², 3 parqueaderos, 3 baños, 5 habitaciones, estrato 5–6, crédito ≤ 850 M.
Se realizó una zonificación por coordenadas para diferenciar las viviendas ubicadas en la zona Norte y Sur de la ciudad de Cali, encontrándose los siguientes resultados:
Cantidad de viviendas por Zona Norte y Zona Sur
df %>% count(zona_geo) %>% kable(caption = "Frecuencia por zona geográfica derivada")
| zona_geo | n |
|---|---|
| Zona Sur (geo) | 3572 |
| Zona Norte (geo) | 3145 |
Mapa división de viviendas en Zona Norte
# Mapa exploratorio (Casas Norte)
leaflet(casas_norte_geo) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud, lat = ~latitud,
popup = ~paste0("<b>", barrio, "</b><br>",
"Zona (geo): ", zona_geo, "<br>",
"Estrato: ", estrato, "<br>",
"Área: ", areaconst, " m²<br>",
"Baños/Hab/Parq: ", banios, " / ", habitaciones, " / ", parqueaderos, "<br>",
"Precio (M): ", round(preciom, 1)),
radius = 6, stroke = FALSE, fillOpacity = 0.85,
clusterOptions = markerClusterOptions()
)
Mapa división de viviendas en Zona Sur
# Mapa exploratorio (Aptos Sur)
leaflet(apto_sur_geo) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud, lat = ~latitud,
popup = ~paste0("<b>", barrio, "</b><br>",
"Zona (geo): ", zona_geo, "<br>",
"Estrato: ", estrato, "<br>",
"Área: ", areaconst, " m²<br>",
"Baños/Hab/Parq: ", banios, " / ", habitaciones, " / ", parqueaderos, "<br>",
"Precio (M): ", round(preciom, 1)),
radius = 6, stroke = FALSE, fillOpacity = 0.85,
clusterOptions = markerClusterOptions()
)
Precio Vs Estrato – Casas en Zona Norte
# Boxplot Precio por Estrato (interactivo)
b_c1 <- ggplot(casas_norte_geo, aes(x = factor(estrato), y = preciom)) +
geom_boxplot(outlier.alpha = 0.2) +
labs(title = "Precio por Estrato — Casas Zona Norte (geo)",
x = "Estrato", y = "Precio (millones)") +
theme_minimal()
ggplotly(b_c1, tooltip = c("x","y"))
Precio Vs Estrato – Apartamentos en Zona Sur
b_c2 <- ggplot(apto_sur_geo, aes(x = factor(estrato), y = preciom)) +
geom_boxplot(outlier.alpha = 0.2) +
labs(title = "Precio por Estrato — Apartamentos Zona Sur (geo)",
x = "Estrato", y = "Precio (millones)") +
theme_minimal()
ggplotly(b_c2, tooltip = c("x","y"))
Precio Vs Zona – Casas
bp_casas <- ggplot(casas_all, aes(x = zona_geo, y = preciom)) +
geom_boxplot(outlier.alpha = 0.2) +
labs(title = "Precio por Zona (geo) — CASAS",
x = "Zona derivada por coordenadas", y = "Precio (millones)") +
theme_minimal()
ggplotly(bp_casas, tooltip = c("x","y"))
Precio Vs Zona – Apartamentos
bp_apto <- ggplot(apto_all, aes(x = zona_geo, y = preciom)) +
geom_boxplot(outlier.alpha = 0.2) +
labs(title = "Precio por Zona (geo) — APARTAMENTOS",
x = "Zona derivada por coordenadas", y = "Precio (millones)") +
theme_minimal()
ggplotly(bp_apto, tooltip = c("x","y"))
Vivienda 1
print(g_v1)
Ofertas Potenciales Sugeridas para la Compra de la Vivienda 1
print_table(tabla_v1,
caption = paste0("Vivienda 1 (Casa · Zona Norte) — Top ", nrow(tabla_v1),
" (área ", res_v1$criterio, ", ppto ≤ 350 M)")
)
##
##
## Table: Vivienda 1 (Casa · Zona Norte) — Top 5 (área ±20%, ppto ≤ 350 M)
##
## Rank Barrio Zona Estrato Perfil Precio (M) Pred (M) Delta (obs - pred) (M) Señal
## ----- ------------- ----------------- -------- ---------------------- ----------- --------- ----------------------- -----------
## 1 la flora Zona Norte (geo) 5 200 m² | H4 | B4 | P2 320.0 552.3 -232.3 obs < pred
## 2 la merced Zona Norte (geo) 4 200 m² | H4 | B4 | P2 320.0 445.6 -125.6 obs < pred
## 3 el bosque Zona Norte (geo) 5 200 m² | H4 | B3 | P3 350.0 573.2 -223.2 obs < pred
## 4 san fernando Zona Norte (geo) 4 198 m² | H5 | B2 | P1 300.0 291.4 8.6 obs ≥ pred
## 5 el bosque Zona Norte (geo) 5 202 m² | H5 | B4 | P1 335.0 475.5 -140.5 obs < pred
Mapa Ofertas Potencias de Vivienda 1
map_v1
Vivienda 2
print(g_v2)
Ofertas Potenciales Sugeridas para la Compra de la Vivienda 2
print_table(tabla_v2,
caption = paste0("Vivienda 2 (Apto · Zona Sur) — Top ", nrow(tabla_v2),
" (área ", res_v2$criterio, ", ppto ≤ 850 M)")
)
##
##
## Table: Vivienda 2 (Apto · Zona Sur) — Top 2 (área ±60%, ppto ≤ 850 M)
##
## Rank Barrio Zona Estrato Perfil Precio (M) Pred (M) Delta (obs - pred) (M) Señal
## ----- ---------- --------------- -------- ---------------------- ----------- --------- ----------------------- -----------
## 1 seminario Zona Sur (geo) 5 300 m² | H6 | B5 | P3 670.0 781.7 -111.7 obs < pred
## 2 seminario Zona Sur (geo) 5 256 m² | H5 | B5 | P3 530.0 741.9 -211.9 obs < pred
Mapa Ofertas Potencias de Vivienda 1
map_v2
Vivienda 1 (≤ 350 M):
Se debe enfocar en casas del Norte alrededor de 200 m², con 2 baños y 1 parqueadero. Si el precio se acerca al tope de 350 M, se puede considerar reducir el área a 180–190 m² o ser más flexible con el número de habitaciones (tienen menos impacto que el área). Para negociar, se puede usar el intervalo de predicción al 95% (PI95) como banda: cerca del centro y evitar pasar del límite superior.
Vivienda 2 (≤ 850 M).
Con el margen de presupuesto en el Sur (estratos 5–6), priorizar 3 parqueaderos y 3 baños; el área se podría ajustar entre 280–320 m² . Comparar siempre el precio publicado con el precio que predice el modelo (Δ = obs − pred): si la Δ es negativa, es una buena oportunidad; si es positiva, se debe negociar.