Este informe estima un modelo de regresión lineal múltiple para
explicar el precio de oferta de viviendas en Cali a partir de
características físicas (área, baños, habitaciones y parqueaderos) y
estrato (variable ordinal). A diferencia del análisis previo, tratamos
estrato como cualitativa ordinal, cuantificamos y proporcionamos la
proporción de NA por variable y evitamos eliminar observaciones mediante
imputación razonable en parqueaderos. El análisis incluye EDA con
métricas (media, sd, min, máx, CV), gráficos interactivos (Plotly),
estimación del modelo, validación de supuestos, predicciones y selección
de ofertas compatibles con los presupuestos planteados.
# --- Punto 1: Filtro a Casas en Zona Norte ---
# Filtramos solo las casas en la Zona Norte
base1 <- vivienda %>%
filter(tipo == "Casa", zona == "Zona Norte")
# Mostrar los primeros 3 registros
head(base1, 3)
# Tabla resumen: conteo por estrato
table_estrato <- base1 %>% count(estrato, name = "n")
table_estrato
# Tabla resumen: estadísticas de precio
stats_precio <- base1 %>%
summarise(
n = n(),
min_precio = min(preciom, na.rm = TRUE),
mediana_precio = median(preciom, na.rm = TRUE),
max_precio = max(preciom, na.rm = TRUE)
)
stats_precio
# Mapa interactivo
library(leaflet)
library(htmltools)
leaflet(base1 %>% drop_na(latitud, longitud)) %>%
addTiles() %>%
addCircleMarkers(~longitud, ~latitud,
radius = 4,
color = "#2C7FB8",
popup = ~paste0(
"<b>Casa</b><br>",
"Barrio: ", barrio, "<br>",
"Estrato: ", estrato, "<br>",
"Área: ", areaconst, " m²<br>",
"Habs: ", habitaciones, " | Baños: ", banios, " | Parq: ", parqueaderos, "<br>",
"<b>Precio: </b>", preciom, " M"
))
Se filtraron 722 registros correspondientes a Casas en la Zona
Norte. Los primeros 3 registros evidencian viviendas con estratos 5 y 6,
precios entre 320 y 780 millones y áreas construidas entre 150 y 445 m².
En la distribución por estrato, predominan las casas en estrato 5 (271)
y estrato 3 (235), seguidas por estrato 4 (161) y unas pocas en estrato
6 (55). Los precios en esta zona varían ampliamente, desde 89 millones
hasta casi 1.940 millones, con una mediana de 390 millones, lo que
refleja un mercado heterogéneo en esta parte de la ciudad.
En el mapa (Leaflet), los puntos se concentran en la Zona Norte,
aunque pueden aparecer algunas observaciones ligeramente fuera de los
límites oficiales debido a la forma en que se recolectaron las
coordenadas por webscraping o a la amplitud con que se agrupan los
barrios en “Zona Norte”.
# --- Punto 2: EDA ---
library(naniar)
# 1. Faltantes en variables clave
miss_tbl2 <- naniar::miss_var_summary(vivienda %>%
select(preciom, areaconst, estrato, banios, habitaciones, zona, parqueaderos)) %>%
mutate(prop = round(pct_miss, 2))
miss_tbl2
Conclusión
La mayoría de variables clave (preciom, areaconst, estrato,
banios, habitaciones, zona) tienen proporción de NA muy baja
(<0.05%), por lo que no requieren imputación.Sin embargo, la variable
parqueaderos presenta ~19% de valores faltantes.
Eliminar esas observaciones no es recomendable, ya que
representaría perder casi una quinta parte de la base, lo que podría
sesgar el análisis.
Decisión metodológica: se mantendrá la variable y se aplicará una
imputación sencilla (por la mediana dentro de cada estrato) en el
momento de modelar, para poder conservar la mayor cantidad de
información posible.
# 2. Descriptivos básicos
eda_stats <- vivienda %>%
select(preciom, areaconst, banios, habitaciones) %>%
pivot_longer(everything(), names_to = "variable", values_to = "x") %>%
group_by(variable) %>%
summarise(
n = sum(!is.na(x)),
media = mean(x, na.rm = TRUE),
mediana = median(x, na.rm = TRUE),
sd = sd(x, na.rm = TRUE),
min = min(x, na.rm = TRUE),
max = max(x, na.rm = TRUE),
CV = sd/media
)
eda_stats
Conclusión
El precio promedio de vivienda es 433 M COP, con una mediana
menor (330 M), lo que indica una asimetría positiva (hay valores
extremos muy altos que empujan la media hacia arriba).
El área construida promedio es de 175 m², con gran dispersión (CV
≈ 0.82) y casos extremos hasta 1.745 m² → evidencia de outliers de
propiedades muy grandes.
En baños y habitaciones la dispersión es más baja (CV ≈ 0.46 y
0.40, respectivamente), lo que indica que estas variables están más
concentradas en valores típicos (3–4).
En conjunto, los precios y áreas muestran alta heterogeneidad,
propia de un mercado con distintos segmentos (desde vivienda económica
hasta lujo).
# 3. Distribuciones univariadas
plot_ly(vivienda, x = ~preciom, type = "histogram", nbinsx = 50,
name = "Precio") %>%
layout(title="Distribución de Precios (todas las viviendas)")
plot_ly(vivienda, x = ~areaconst, type = "histogram", nbinsx = 50,
name = "Área construida") %>%
layout(title="Distribución de Área construida")
Conclusión
Precio: sesgo a la derecha, con un “pico” en valores entre
200–400 M, pero con una “cola” larga hacia precios de
lujo.
Área construida: similar comportamiento → la mayoría de viviendas
se concentran entre 100–200 m², pero hay casos extremos muy
grandes
# 4. Relaciones bivariadas
# Precio vs Área construida
plot_ly(vivienda, x = ~areaconst, y = ~preciom, color = ~estrato,
type = "scatter", mode = "markers",
text = ~paste("Zona:", zona, "<br>Estrato:", estrato)) %>%
layout(title = "Precio vs Área construida (color por estrato)")
# Boxplot Precio ~ Estrato
plot_ly(vivienda, x = ~estrato, y = ~preciom, type = "box", color = ~estrato) %>%
layout(title = "Distribución del precio por estrato")
# Boxplot Precio ~ Zona
plot_ly(vivienda, x = ~zona, y = ~preciom, type = "box", color = ~zona) %>%
layout(title = "Distribución del precio por zona")
Precio vs. Área construida: correlación alta (r
= 0.69), lo que confirma que el tamaño de la vivienda es uno de los
principales determinantes del precio.
Precio vs. Estrato (boxplot): las medianas de
precio crecen de forma clara con el estrato. Estratos 5–6 muestran no
solo precios mayores, sino también más dispersión (mayor diversidad en
el segmento alto).
Precio vs. Zona (boxplot): aunque no tenemos
todas las cifras aquí, se evidencia que hay zonas con niveles de precios
significativamente distintos (ej. zonas periféricas más baratas, zonas
centrales/norte/sur más caras). Esto refuerza la importancia de la
ubicación.
# 5. Correlación numérica
num_corr2 <- vivienda %>%
select(preciom, areaconst, banios, habitaciones, parqueaderos) %>%
cor(use = "pairwise.complete.obs")
num_corr2
## preciom areaconst banios habitaciones parqueaderos
## preciom 1.0000000 0.6873520 0.6691456 0.2640912 0.6886785
## areaconst 0.6873520 1.0000000 0.6484165 0.5169129 0.5848290
## banios 0.6691456 0.6484165 1.0000000 0.5899064 0.5705065
## habitaciones 0.2640912 0.5169129 0.5899064 1.0000000 0.2844808
## parqueaderos 0.6886785 0.5848290 0.5705065 0.2844808 1.0000000
areaconst, banios y parqueaderos tienen correlaciones fuertes con el precio (0.68, 0.67 y 0.69 respectivamente).
habitaciones muestra correlación más baja (0.26), lo que indica que no siempre más habitaciones = más valor (por ejemplo, viviendas grandes con pocas habitaciones pero de alta calidad pueden valer más).
Entre predictores, también hay correlaciones altas (areaconst–banios = 0.65, areaconst–parqueaderos = 0.58). Esto implica cierta multicolinealidad, a tener en cuenta al estimar la regresión.
Conclusiónes
# --- Punto 3: Modelo de regresión múltiple ---
# Usamos vivienda completa (ya limpia), con imputación simple en parqueaderos
# Porque parqueaderos tiene ~19% NA → si no se imputa, perderíamos muchos datos
# Imputar parqueaderos por la mediana dentro de estrato (solución sencilla)
vivienda2 <- vivienda %>%
group_by(estrato) %>%
mutate(parqueaderos_imp = ifelse(is.na(parqueaderos),
median(parqueaderos, na.rm = TRUE),
parqueaderos)) %>%
ungroup()
# Creamos base para el modelo
mod_df <- vivienda2 %>%
select(preciom, areaconst, habitaciones, banios,
parqueaderos = parqueaderos_imp, estrato)
# Estrato como factor, baseline = 4 (estrato medio)
mod_df$estrato <- relevel(factor(mod_df$estrato), ref = "4")
# Ajuste del modelo
m1 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios,
data = mod_df)
summary(m1)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = mod_df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1466.47 -68.25 -10.03 45.35 1186.19
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 17.02728 5.93810 2.867 0.00415 **
## areaconst 0.85760 0.01806 47.490 < 2e-16 ***
## estrato3 -34.07156 5.81721 -5.857 4.89e-09 ***
## estrato5 46.12342 4.84836 9.513 < 2e-16 ***
## estrato6 268.05554 6.04193 44.366 < 2e-16 ***
## habitaciones -22.10840 1.76936 -12.495 < 2e-16 ***
## parqueaderos 65.84620 2.30232 28.600 < 2e-16 ***
## banios 51.50863 2.10872 24.426 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 163.9 on 8311 degrees of freedom
## (3 observations deleted due to missingness)
## Multiple R-squared: 0.7516, Adjusted R-squared: 0.7514
## F-statistic: 3592 on 7 and 8311 DF, p-value: < 2.2e-16
Conclusiones
El modelo de regresión múltiple obtuvo un R² ajustado de 0.75,
indicando que las variables incluidas explican el 75% de la variabilidad
de los precios de las viviendas. Esto refleja un ajuste muy
satisfactorio en términos de capacidad explicativa.
La variable área construida es el predictor más relevante, con un
coeficiente positivo (0.86 M por m²). El estrato socioeconómico muestra
diferencias claras: las viviendas de estrato 3 se transan por menos,
mientras que las de estrato 5 y especialmente las de estrato 6 presentan
precios superiores en comparación con estrato 4.
Los baños y parqueaderos también se asocian de manera positiva y
significativa con el precio, confirmando su importancia como atributos
de valor. En contraste, el número de habitaciones presenta un efecto
negativo, lo que sugiere que, a igual área, más cuartos puede implicar
espacios más reducidos y menor lujo, lo que disminuye el
valor.
En conjunto, los resultados son coherentes con la lógica del
mercado inmobiliario: más área, estrato alto y mejores amenidades elevan
el precio. El modelo aún deja un 25% de variabilidad sin explicar, lo
cual abre la puerta a mejoras incorporando variables espaciales o
transformando el precio en logaritmos.
# --- Punto 4: Validación de supuestos ---
# 1. Gráficos de diagnóstico base de R
par(mfrow = c(2,2))
plot(m1) # gráfico de residuos, QQ-plot, leverage, etc.
par(mfrow = c(1,1))
# 2. Normalidad de residuos (test Shapiro sobre muestra grande)
set.seed(123)
res_sample <- sample(residuals(m1), size = 5000) # submuestra para evitar problemas
shapiro.test(res_sample)
##
## Shapiro-Wilk normality test
##
## data: res_sample
## W = 0.83541, p-value < 2.2e-16
# 3. Homoscedasticidad (Breusch-Pagan test)
library(lmtest)
bptest(m1)
##
## studentized Breusch-Pagan test
##
## data: m1
## BP = 1548.2, df = 7, p-value < 2.2e-16
# 4. Influencia de observaciones (Cook’s distance)
cooks <- cooks.distance(m1)
summary(cooks)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000000 0.0000019 0.0000100 0.0002730 0.0000649 0.3472487
# Opcional: ver los casos más influyentes
which(cooks > 4/length(cooks))
## 11 30 64 65 99 101 109 121 132 137 143 153 181 183 217 227
## 11 30 64 65 99 101 109 121 132 137 143 153 181 183 217 227
## 228 231 263 269 280 285 320 340 369 370 371 374 391 406 419 420
## 228 231 263 269 280 285 320 340 369 370 371 374 391 406 419 420
## 429 461 466 480 491 585 588 676 683 684 691 742 751 778 841 898
## 429 461 466 480 491 585 588 676 683 684 691 742 751 778 841 898
## 932 956 975 1001 1005 1043 1156 1157 1171 1291 1302 1326 1327 1333 1335 1342
## 932 956 975 1001 1005 1043 1156 1157 1171 1291 1302 1326 1327 1333 1335 1342
## 1350 1353 1354 1356 1357 1358 1366 1372 1375 1387 1390 1394 1398 1403 1404 1433
## 1350 1353 1354 1356 1357 1358 1366 1372 1375 1387 1390 1394 1398 1403 1404 1433
## 1438 1442 1452 1455 1460 1464 1465 1476 1480 1481 1484 1488 1489 1495 1496 1519
## 1438 1442 1452 1455 1460 1464 1465 1476 1480 1481 1484 1488 1489 1495 1496 1519
## 1520 1521 1554 1561 1563 1564 1568 1582 1605 1640 1664 1666 1727 1730 1734 1735
## 1520 1521 1554 1561 1563 1564 1568 1582 1605 1640 1664 1666 1727 1730 1734 1735
## 1737 1739 1756 1760 1762 1774 1779 1794 1797 1798 1804 1805 1818 1820 1825 1826
## 1737 1739 1756 1760 1762 1774 1779 1794 1797 1798 1804 1805 1818 1820 1825 1826
## 1831 1903 1905 1914 1915 1920 1934 1951 1989 2008 2013 2032 2041 2048 2052 2054
## 1831 1903 1905 1914 1915 1920 1934 1951 1989 2008 2013 2032 2041 2048 2052 2054
## 2178 2181 2194 2195 2208 2308 2432 2494 2497 2500 2520 2531 2594 2626 2651 2678
## 2178 2181 2194 2195 2208 2308 2432 2494 2497 2500 2520 2531 2594 2626 2651 2678
## 2689 2696 2702 2705 2713 2735 2748 2752 2762 2763 2797 2867 2874 2875 2878 2914
## 2689 2696 2702 2705 2713 2735 2748 2752 2762 2763 2797 2867 2874 2875 2878 2914
## 2915 2923 2934 2969 2980 2982 2987 2990 3043 3045 3048 3155 3159 3170 3195 3221
## 2915 2923 2934 2969 2980 2982 2987 2990 3043 3045 3048 3155 3159 3170 3195 3221
## 3228 3251 3293 3296 3297 3298 3306 3313 3316 3330 3354 3373 3379 3381 3387 3388
## 3228 3251 3293 3296 3297 3298 3306 3313 3316 3330 3354 3373 3379 3381 3387 3388
## 3423 3452 3459 3462 3472 3496 3502 3517 3518 3725 3769 3781 3797 3798 3811 3817
## 3423 3452 3459 3462 3472 3496 3502 3517 3518 3725 3769 3781 3797 3798 3811 3817
## 3835 3863 4008 4038 4046 4056 4091 4092 4096 4106 4205 4209 4230 4231 4244 4271
## 3835 3863 4008 4038 4046 4056 4091 4092 4096 4106 4205 4209 4230 4231 4244 4271
## 4276 4319 4322 4334 4335 4357 4410 4415 4458 4461 4504 4516 4539 4590 4599 4607
## 4276 4319 4322 4334 4335 4357 4410 4415 4458 4461 4504 4516 4539 4590 4599 4607
## 4634 4676 4680 4681 4682 4684 4685 4689 4710 4711 4716 4717 4728 4733 4742 4745
## 4634 4676 4680 4681 4682 4684 4685 4689 4710 4711 4716 4717 4728 4733 4742 4745
## 4752 4758 4762 4768 4770 4771 4772 4780 4799 4804 4811 4813 4817 4818 4821 4832
## 4752 4758 4762 4768 4770 4771 4772 4780 4799 4804 4811 4813 4817 4818 4821 4832
## 4874 4945 4946 5002 5015 5020 5022 5023 5024 5026 5028 5030 5040 5042 5044 5045
## 4874 4945 4946 5002 5015 5020 5022 5023 5024 5026 5028 5030 5040 5042 5044 5045
## 5049 5050 5055 5057 5062 5065 5066 5068 5079 5085 5090 5092 5106 5107 5108 5109
## 5049 5050 5055 5057 5062 5065 5066 5068 5079 5085 5090 5092 5106 5107 5108 5109
## 5115 5116 5117 5125 5127 5132 5151 5156 5169 5171 5176 5179 5198 5204 5214 5215
## 5115 5116 5117 5125 5127 5132 5151 5156 5169 5171 5176 5179 5198 5204 5214 5215
## 5282 5296 5304 5307 5308 5311 5315 5317 5333 5339 5341 5342 5343 5347 5358 5360
## 5282 5296 5304 5307 5308 5311 5315 5317 5333 5339 5341 5342 5343 5347 5358 5360
## 5369 5371 5375 5377 5381 5386 5388 5389 5391 5403 5417 5420 5422 5427 5428 5429
## 5369 5371 5375 5377 5381 5386 5388 5389 5391 5403 5417 5420 5422 5427 5428 5429
## 5434 5435 5436 5442 5443 5451 5458 5477 5478 5479 5484 5485 5490 5491 5545 5567
## 5434 5435 5436 5442 5443 5451 5458 5477 5478 5479 5484 5485 5490 5491 5545 5567
## 5568 5585 5657 5673 5674 5683 5689 5749 5857 5862 5863 5866 5868 5870 5871 5873
## 5568 5585 5657 5673 5674 5683 5689 5749 5857 5862 5863 5866 5868 5870 5871 5873
## 5874 5875 5878 5880 5881 5901 5902 5913 5951 5955 5971 5972 5974 5980 6018 6021
## 5874 5875 5878 5880 5881 5901 5902 5913 5951 5955 5971 5972 5974 5980 6018 6021
## 6034 6042 6049 6071 6073 6075 6127 6139 6146 6170 6180 6196 6212 6228 6236 6238
## 6034 6042 6049 6071 6073 6075 6127 6139 6146 6170 6180 6196 6212 6228 6236 6238
## 6246 6253 6257 6259 6270 6273 6279 6280 6283 6304 6308 6313 6321 6323 6324 6325
## 6246 6253 6257 6259 6270 6273 6279 6280 6283 6304 6308 6313 6321 6323 6324 6325
## 6332 6334 6344 6346 6348 6352 6355 6356 6363 6364 6368 6372 6376 6378 6398 6403
## 6332 6334 6344 6346 6348 6352 6355 6356 6363 6364 6368 6372 6376 6378 6398 6403
## 6412 6416 6445 6458 6469 6470 6472 6485 6486 6487 6490 6492 6495 6497 6499 6504
## 6412 6416 6445 6458 6469 6470 6472 6485 6486 6487 6490 6492 6495 6497 6499 6504
## 6505 6507 6510 6512 6513 6514 6516 6520 6522 6532 6536 6540 6541 6549 6552 6565
## 6505 6507 6510 6512 6513 6514 6516 6520 6522 6532 6536 6540 6541 6549 6552 6565
## 6574 6578 6580 6581 6586 6593 6599 6602 6606 6607 6616 6622 6624 6626 6627 6629
## 6574 6578 6580 6581 6586 6593 6599 6602 6606 6607 6616 6622 6624 6626 6627 6629
## 6632 6639 6688 6689 6690 6691 6717 6725 6730 6742 6746 6752 6814 6833 6834 6835
## 6632 6639 6688 6689 6690 6691 6717 6725 6730 6742 6746 6752 6814 6833 6834 6835
## 6837 6873 6906 6920 6928 6933 6934 6938 7257 7258 7280 7522 7710 7855 7951 7954
## 6837 6873 6906 6920 6928 6933 6934 6938 7257 7258 7280 7522 7710 7855 7951 7954
## 7959 8000 8026 8073 8125 8150 8166 8199 8203 8227 8240 8256 8284 8315 8316 8317
## 7959 8000 8026 8073 8125 8150 8166 8199 8203 8227 8240 8256 8284 8315 8316 8317
Conclusión
El diagnóstico de supuestos revela que el modelo, aunque globalmente válido, presenta ciertas desviaciones respecto a los supuestos clásicos. Los residuos muestran un patrón general lineal, aunque con heterocedasticidad significativa según el test de Breusch-Pagan. La normalidad estricta de los residuos es rechazada por el test de Shapiro-Wilk y el QQ-plot muestra colas más pesadas de lo esperado, lo cual es consistente con la presencia de viviendas atípicas (de lujo o muy económicas). Asimismo, se identifican observaciones influyentes a través de Cook’s distance, reflejando la heterogeneidad del mercado.
En la práctica, estas limitaciones no invalidan el modelo, pero se
recomienda:
Usar errores estándar robustos para una inferencia más
confiable.
Explorar transformaciones (ej. logaritmo del precio) para reducir
heterocedasticidad.
Analizar outliers de forma separada, pues pueden representar un
segmento distinto (lujo).
Características de la vivienda 1
Tipo: Casa
Área construida:
200 m²
Parqueaderos: 1
Baños: 2
Habitaciones: 4
Estrato: 4 o 5
Zona: Norte
Crédito preaprobado: 350 M COP
Nota: el modelo m1 no incluye “zona” ni “tipo”
porque el enunciado nos pidió usar solo areaconst + estrato +
habitaciones + parqueaderos + banios.
# --- Punto 5: Predicción de la Vivienda 1 ---
# Creamos dataframe con las características solicitadas
newdata_v1 <- data.frame(
areaconst = 200,
estrato = factor(c(4,5), levels = levels(mod_df$estrato)), # considerar estrato 4 y 5
habitaciones = 4,
parqueaderos = 1,
banios = 2
)
# Predicción con intervalo de confianza
pred_v1 <- predict(m1, newdata = newdata_v1, interval = "prediction", level = 0.95)
pred_v1
## fit lwr upr
## 1 268.9772 -52.388838 590.3433
## 2 315.1006 -6.270723 636.4720
Conclusiones:
Para la vivienda 1 (Casa, 200 m², 4 habitaciones, 2 baños y 1
parqueadero), el modelo predice:
En estrato 4, un precio promedio de 269 millones COP, con un
rango de predicción amplio (entre -52 M y 590 M).
En estrato 5, un precio promedio de 315 millones COP, con un
rango igualmente amplio (entre -6 M y 636 M).
Aunque los intervalos de predicción son muy dispersos (reflejando
la heterogeneidad del mercado), los valores puntuales estimados (269 M
en estrato 4 y 315 M en estrato 5) se encuentran dentro del presupuesto
máximo de 350 millones de la empresa.
Esto indica que la vivienda 1 es viable dentro del presupuesto,
especialmente en estrato 4 y en parte de las ofertas de estrato
5.
# --- Punto 6: Selección de ofertas para la Vivienda 1 ---
# Filtro de propiedades que cumplen las condiciones
ofertas_v1 <- vivienda %>%
filter(tipo == "Casa",
zona == "Zona Norte",
estrato %in% c(4,5),
preciom <= 350,
areaconst >= 180 & areaconst <= 220,
parqueaderos >= 1,
banios >= 2,
habitaciones >= 4)
# Ver cuántas cumplen
nrow(ofertas_v1)
## [1] 10
# Mostrar las primeras 5
head(ofertas_v1, 5)
# Resumen de las ofertas encontradas
ofertas_resumen <- ofertas_v1 %>%
summarise(
n = n(),
min_precio = min(preciom, na.rm=TRUE),
mediana_precio = median(preciom, na.rm=TRUE),
max_precio = max(preciom, na.rm=TRUE)
)
ofertas_resumen
# --- Mapa interactivo con leaflet ---
library(leaflet)
leaflet(ofertas_v1) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud, lat = ~latitud,
popup = ~paste0(
"<b>Precio: </b>", preciom, " M COP<br>",
"<b>Área: </b>", areaconst, " m²<br>",
"<b>Estrato: </b>", estrato, "<br>",
"<b>Habitaciones: </b>", habitaciones, "<br>",
"<b>Baños: </b>", banios, "<br>",
"<b>Parqueaderos: </b>", parqueaderos
),
radius = 6, color = "blue", fillOpacity = 0.6
) %>%
addLegend(position = "bottomright", colors = "blue", labels = "Oferta seleccionada")
Conclusión
Tras aplicar los filtros al conjunto de datos, se encontraron 10
viviendas que cumplen con los requisitos de la solicitud de la Vivienda
1 (Casa, 200 m² aprox., estrato 4 o 5, Zona Norte, con al menos 4
habitaciones, 2 baños, 1 parqueadero y precio ≤ 350 M
COP).
El rango de precios de estas ofertas está entre 300 y 350
millones de pesos, con una mediana de 337.5 millones. Este rango
confirma la existencia de varias opciones viables para la empresa dentro
del presupuesto asignado.
En el mapa interactivo se presentan las 10 propiedades
localizadas en la Zona Norte, lo que permitirá a la compañía analizar no
solo los precios y características, sino también la localización exacta
y la cercanía a servicios y equipamientos urbanos.
Características de la vivienda 2
Tipo: Apartamento
Área
construida: 300 m² (permitimos rango 280–320 m² para asegurar
candidatos)
Parqueaderos: mínimo 3
Baños: mínimo 3
Habitaciones:
mínimo 5
Estrato: 5 o 6
Zona: Sur
Crédito preaprobado:
850 M COP
# --- Punto 7: Vivienda 2 ---
# Filtro de propiedades que cumplen las condiciones
ofertas_v2 <- vivienda %>%
filter(tipo == "Apartamento",
zona == "Zona Sur",
estrato %in% c(5,6),
preciom <= 850,
areaconst >= 280 & areaconst <= 320,
parqueaderos >= 3,
banios >= 3,
habitaciones >= 5)
# Número de ofertas encontradas
nrow(ofertas_v2)
## [1] 1
# Primeras 5 viviendas candidatas
head(ofertas_v2, 5)
# Resumen de precios de estas viviendas
ofertas_resumen_v2 <- ofertas_v2 %>%
summarise(
n = n(),
min_precio = min(preciom, na.rm=TRUE),
mediana_precio = median(preciom, na.rm=TRUE),
max_precio = max(preciom, na.rm=TRUE)
)
ofertas_resumen_v2
# --- Mapa interactivo ---
leaflet(ofertas_v2) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud, lat = ~latitud,
popup = ~paste0(
"<b>Precio: </b>", preciom, " M COP<br>",
"<b>Área: </b>", areaconst, " m²<br>",
"<b>Estrato: </b>", estrato, "<br>",
"<b>Habitaciones: </b>", habitaciones, "<br>",
"<b>Baños: </b>", banios, "<br>",
"<b>Parqueaderos: </b>", parqueaderos
),
radius = 6, color = "green", fillOpacity = 0.6
) %>%
addLegend(position = "bottomright", colors = "green", labels = "Oferta Vivienda 2")
Conclusión
La búsqueda de alternativas que cumplan con las condiciones
establecidas para la Vivienda 2 resultó más estricta que en el caso de
la Vivienda 1. Se identificó una única oferta disponible que coincide
con todos los criterios: apartamento ubicado en la Zona Sur, con área
construida de 300 m², 3 parqueaderos, 5 baños, 6 habitaciones, estrato
5, y un precio de 670 millones COP, valor que se encuentra por debajo
del crédito preaprobado (850 millones COP).
Esto implica que, para esta segunda solicitud, el mercado ofrece
opciones muy limitadas, lo que reduce la capacidad de negociación de la
empresa compradora. Sin embargo, la oferta encontrada satisface
ampliamente los requisitos y se ubica en el rango presupuestal
disponible, por lo que puede considerarse una opción viable y ajustada a
la necesidad planteada.
Modelo predictivo robusto:
El modelo de regresión lineal múltiple explicó aproximadamente el
75% de la variabilidad en los precios (R² ajustado = 0.75), lo que
indica un buen nivel de ajuste para el análisis de
mercado.
Variables como área construida, número de baños y parqueaderos
tienen una influencia positiva y significativa en el precio, mientras
que un mayor número de habitaciones tiende a estar asociado con precios
ligeramente menores (posiblemente por configuraciones de espacio menos
eficientes).
Vivienda 1 – Zona Norte, Casa, estrato 4 o 5:
El modelo predijo un precio esperado en torno a 315 M COP
(intervalo amplio), lo que concuerda con la disponibilidad de ofertas en
el rango presupuestal.
Se identificaron 10 propiedades candidatas en la zona Norte,
todas dentro del rango de 300–350 M COP, con características alineadas a
lo solicitado.
Esto refleja que el mercado para este perfil de vivienda es
dinámico y competitivo, con opciones variadas.
Vivienda 2 – Zona Sur, Apartamento, estrato 5 o 6:
La búsqueda resultó más restringida: solo se encontró una opción
que cumpliera exactamente con los criterios establecidos.
El precio fue de 670 M COP, valor adecuado y menor al crédito
aprobado (850 M COP), pero la escasa disponibilidad muestra que este
segmento del mercado es más limitado y exclusivo.
Validación del modelo:
El análisis de residuos mostró algunas desviaciones respecto a la
normalidad y heterocedasticidad, lo que sugiere que el modelo podría
mejorarse con técnicas más avanzadas (e.g., modelos log-lineales,
machine learning, variables adicionales como barrio o localización
geográfica).
Sin embargo, los resultados obtenidos son suficientemente
consistentes para guiar decisiones prácticas en este contexto.
Para Vivienda 1:
Se recomienda avanzar con el análisis de las 10 ofertas
identificadas en la zona Norte, priorizando aquellas con mejor relación
área/precio.
Dado que el mercado presenta varias opciones, se aconseja
negociar activamente con los vendedores, aprovechando la competencia
entre propiedades similares.
Para Vivienda 2:
Dada la escasez de alternativas, la compañía internacional
debería considerar tomar la única oferta encontrada, ya que cumple con
todos los requisitos y se encuentra por debajo del
presupuesto.
Alternativamente, si se desea más margen de elección, se
recomienda relajar ligeramente los filtros de búsqueda (por ejemplo:
ampliar rango de área construida, considerar estrato 4 o zonas aledañas
al Sur).
C&A debería monitorear continuamente la evolución del mercado
en estratos altos (5 y 6) en la Zona Sur, ya que las oportunidades son
escasas y la demanda puede presionar al alza los precios.
Se recomienda a la empresa ampliar sus bases de datos incluyendo
información de barrios específicos, cercanía a servicios y dinámicas de
valorización, lo que permitiría modelos predictivos más
precisos.