Introducción

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.

1) Filtro a casas en Zona Norte

# --- 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”.

2) EDA

# --- 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

  • El análisis exploratorio muestra que las variables clave presentan muy pocos datos faltantes (<0.05%), lo que permite trabajar sin necesidad de imputación.
  • El precio y el área construida tienen distribuciones asimétricas, con alta dispersión y outliers que reflejan la heterogeneidad del mercado inmobiliario (desde viviendas económicas hasta de lujo).
  • La relación entre área construida y precio es positiva y fuerte, y lo mismo ocurre con baños y parqueaderos. Por su parte, el número de habitaciones presenta una relación débil con el precio, lo que indica que no siempre más habitaciones implican un mayor valor de mercado.
  • Los boxplots confirman que los precios medianos aumentan sistemáticamente con el estrato socioeconómico, y que ciertas zonas concentran precios significativamente más altos que otras.
  • Finalmente, las correlaciones entre predictores revelan multicolinealidad moderada, especialmente entre área, baños y parqueaderos, lo cual debe considerarse en el modelo de regresión.

3) Modelo de regresión múltiple

# --- 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.

4) Validación de supuestos

# --- 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).

5) Predicción de la vivienda 1

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.

6) Selección de ofertas para la vivienda 1

# --- 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.

7) Predicción de la vivienda 2

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.

8) Conclusiones y recomendaciones

8.1 Conclusiones principales

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.

8.2 Recomendaciones estratégicas para C&A

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).

8.3 Recomendaciones generales:

  • 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.