Introducción y Contexto

Este informe ejecutivo se estructura para la agencia de bienes raíces C&A (Casas y Apartamentos), fundada por María en la ciudad de Cali. El objetivo es dar respuesta a una compañía internacional que busca reubicar a dos de sus ejecutivos y sus familias, bajo dos perfiles de vivienda (Zona Norte y Zona Sur) y presupuestos específicos, basados en decisiones técnicas según el análisis de una base de datos disponible.

Utilizando el modelo de regresión lineal múltiple, se evalúa la viabilidad financiera de los presupuestos preaprobados y se identifican las mejores ofertas del mercado actual, para ambas necesidades específicas, y de esta manera ayudar a Maria a responder la solicitud.

Para garantizar la fiabilidad de los modelos, se realizó una limpieza rigurosa de la base de datos original, imputando valores nulos en la variable parqueaderos y eliminando algunas variables del dataset que no son relevantes (la variable id y la variable piso, la cual tiene muchos valores faltantes y no es representativa para este análisis), eliminando registros inconsistentes y convirtiendo las variables categóricas (como el estrato) al formato adecuado para el modelado.

Vivienda 1: Casa en Zona Norte

En esta primera parte del ejercicio la empresa está buscando una casa en la Zona Norte, de 200 m² construidos, 1 parqueadero, 2 baños, 4 habitaciones y estrato 4 o 5. Para esta vivienda se tiene un crédito preaprobado de $350 millones de pesos.

Filtro de la Base de Datos y Depuración

Se filtró el inventario para aislar exclusivamente las casas de la Zona Norte. Durante este proceso, se detectaron errores de georreferenciación (puntos ubicados en el sur de la ciudad a pesar de estar etiquetados como “Norte”). Para solucionar esta condición se aplicó un filtro espacial estricto, consistente en restringir la selección a aquellos registros que se encuentren por encima de la latitud 3.44 (la cual divide al norte de la Ciudad de Cali, en conjunto con el Rio Cali); con la finalidad de garantizar la pureza de la muestra y evitar que registros de casas en el centro o en la zona sur se consideren en el análisis, de manera equivocada.

# Filtrar la base de datos que inicialmente se limpió
base1 <- vivienda_clean %>% 
  filter(tipo == "Casa", 
         zona == "Zona Norte",
         latitud > 3.44) %>% # Restringir a aquellos registros que tienen la coordenada latitud mayor a 3.44
  drop_na(preciom, areaconst, estrato, banios, habitaciones, parqueaderos, longitud, latitud)

# Tablas de comprobación cruzada
# Para verificar que sólo nos muestre casas en la zona Norte
conteo_validacion <- as.data.frame.matrix(table(base1$tipo, base1$zona))

conteo_validacion %>%
  kable(caption = "Tabla N°1 - Validación del Filtro: Casas en la Zona Norte") %>%
  kable_styling(full_width = F, position = "left")
Tabla N°1 - Validación del Filtro: Casas en la Zona Norte
Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
Apartamento 0 0 0 0 0
Casa 0 601 0 0 0

La Tabla N°1 comprueba que el filtro ha sido implementado de manera adecuada, indicando que sólo se tomaron los registros de la variable tipo casa y la variable zona norte. Este ejercicio nos deja un total de 601 registros para el análisis, correspondiente a las observaciones que nos permiten realizar el análisis en el segmento deseado de acuerdo a la solicitud.

# Presentar los primeros 3 registros
base1 %>%
  head(4) %>%
  kable(caption = "Tabla N°2 - Primeros registros: Casas en la Zona Norte") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Tabla N°2 - Primeros registros: Casas en la Zona Norte
zona estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
Zona Norte 5 320 150 2 4 6 Casa acopi -76.51341 3.47968
Zona Norte 5 780 380 2 3 3 Casa acopi -76.51674 3.48721
Zona Norte 3 230 160 0 2 3 Casa acopi -76.48641 3.44956
Zona Norte 3 180 120 0 3 3 Casa acopi -76.49768 3.47060

Como se puede observar en la Tabla N°2, se muestran los 4 primeros registros de la base de datos filtrada con las características requeridas. Este es el insumo para realizar el análisis exploratorio de datos y la modelación subsecuente. Para validación se presenta la Figura 1, en la cual se muestran las observaciones que cumplen con los criterios identificadas sobre el mapa de la ciudad de Cali como puntos azules.

# 4.1. Mapa con leaflet para comprobar la ubicación
mapa_base1 <- leaflet(data = base1) %>%
  addTiles() %>%
  addCircleMarkers(~longitud, ~latitud, 
                   radius = 3, 
                   color = "blue", 
                   popup = ~paste("Precio (Millones):", preciom, "<br>Área:", areaconst))

# Imprimir el mapa
mapa_base1

Figura 1. Mapa Interactivo - Distribución de viviendas Zona Norte

Análisis Exploratorio de Datos

El EDA o Análisis exploratorio de Datos es crucial para entender y comprender la estructura que tienen los datos que conforman la base de datos de análisis. En este caso es importante realizar esta exploración para descubrir la distribución de las variables (precio, área, estrato, parqueaderos o número de baños, entre otros). Adicionalmente, permite identificar posibles relaciones entre variables.

# Seleccionamos las variables numéricas y convertimos estrato a numérico solo para la matriz
variables_cor <- base1 %>%
  select(preciom, areaconst, banios, habitaciones, estrato) %>%
  mutate(estrato = as.numeric(as.character(estrato)))

# Seleccionamos las variables de interés de nuestra base filtrada (base1)
# Mantenemos 'estrato' tal cual (como factor)
variables_eda <- base1 %>%
  select(preciom, areaconst, banios, habitaciones, estrato)

# Generamos el gráfico ggpairs
grafico_ggpairs <- ggpairs(variables_eda,
                           title = "Análisis Exploratorio de Datos - Casas en la Zona Norte",
                           # Ajustamos un poco la transparencia de los puntos para que se vea mejor la densidad
                           lower = list(continuous = wrap("points", alpha = 0.4, size = 1, color = "darkblue")),
                           diag = list(continuous = wrap("densityDiag", fill = "lightblue", alpha = 0.6)))

# Mostrar el gráfico
grafico_ggpairs
Figura 2. Matriz de Correlación

Figura 2. Matriz de Correlación

La Figura 2 nos muestra la matriz de correlación múltiple y nos permite extraer información clave sobre la dinámica del mercado de casas en la Zona Norte de Cali.

En la diagonal principal encontramos las distribuciones individuales de cada variable. El Precio (preciom) y el área (areaconst) presentan una distribución con asimetría positiva (sesgada hacia la derecha, con una larga cola). Esto indica que el grueso del mercado en la zona norte se concentra en casas de precios y tamaños moderados o estándar (picos altos al lado izquierdo), pero existe un subgrupo exclusivo de propiedades con áreas superiores a los 500 m² y precios muy altos, los cuales actúan como valores atípicos dentro de nuestro análisis. Por su parte para la variable estrato, la muestra nos indica que la mayor concentración de oferta de casas en esta zona se ubica en los estratos 3 y 5, seguidos por el 4. El estrato 6 tiene una participación minoritaria en esta zona de la ciudad.

En el triángulo superior encontramos las correlaciones lineales. En estas casillas observamos el coeficiente de correlación de Pearson (r) el cual nos revela qué tanto se mueven las características físicas en conjunto con el precio de mercado. Es evidente que existe una correlación positiva fuerte (0.741) entre el área construida y el precio. En el mercado de casas, el área total es la métrica insignia que define el valor. Por su parte el número de baños presenta una correlación moderada con el precio (0.552). Sin embargo, las habitaciones tienen la correlación más débil de todas (0.406) pudiendo significar que dividir el área de la casa en más habitaciones no garantiza un aumento lineal en su precio comercial.

La última columna a la derecha relaciona la variable preciom y estrato. Se observa una clara tendencia escalonada. La la mediana del precio da saltos significativos al pasar del estrato 3 al 4, del 4 al 5, y un salto mucho más abrupto del 5 al 6. Así mismo, la relación entre areaconst y estrato muestra cómo aunque estas se mantengan relativamente similares en estratos medios, el precio se dispara en estratos altos; indicando que el mercado tiende a pagar mas por una casa de características similares pero en un mejor barrio.

# Relación entre Precio (Y), Área Construida (X) y Estrato (Color)
grafico_plotly <- plot_ly(data = base1, 
                          x = ~areaconst, 
                          y = ~preciom, 
                          color = ~estrato, 
                          colors = "Set1",  
                          type = 'scatter', 
                          mode = 'markers',
                          # Texto que aparece al pasar el cursor (hover)
                          text = ~paste("<b>Estrato:</b>", estrato,
                                        "<br><b>Área:</b>", areaconst, "m2",
                                        "<br><b>Precio:</b> $", preciom, "M",
                                        "<br><b>Baños:</b>", banios,
                                        "<br><b>Habitaciones:</b>", habitaciones),
                          hoverinfo = 'text',
                          marker = list(size = 8, opacity = 0.7)) %>%
  layout(title = "Relación: Precio vs Área Construida por Estrato (Zona Norte)",
         xaxis = list(title = "Área Construida (m²)"),
         yaxis = list(title = "Precio (Millones COP)"),
         legend = list(title = list(text = '<b> Estrato </b>')))

# Mostrar el gráfico
grafico_plotly

Figura 3. Relación: Precio vs. Area - Estrato

En la Figura 3 se evidencia una clara tendencia ascendente de izquierda a derecha. A medida que aumenta el área construida (eje X), el precio (eje Y) también se incrementa. Sin embargo, no es una línea recta perfecta, lo que nos indica que el área no es el único factor determinante. Adicionalmente se observa cómo los puntos están muy juntos en el rango de 0 a 200 m², pero a medida que pasamos los 400 m², la nube de puntos se dispersa. Esto implica que predecir el valor de una casa pequeña es fácil, pero en casas gigantes, el precio varía dependiendo de otras características no incluídas en este gráfico.

Al analizar el estrato vemos cómo Los puntos rojos (Estrato 3) se aglomeran en la esquina inferior izquierda (áreas pequeñas y precios bajos). Los puntos azules (Estrato 4) y verdes (Estrato 5) se superponen en áreas medianas, pero los verdes tienden a alcanzar precios mucho más altos (hasta 1.500 millones) para áreas similares a los azules. Por su parte los puntos morados (Estrato 6), aunque escasos, se ubican predominantemente en la parte superior de la gráfica, demostrando que cobran el precio más alto por metro cuadrado.

grafico_banios <- plot_ly(data = base1, 
                          x = ~as.factor(banios), # Lo tratamos como factor para el eje X
                          y = ~preciom, 
                          type = "box", 
                          color = I("#3498db"), 
                          boxpoints = "outliers") %>%  
  layout(title = "Distribución del Precio según Número de Baños (Zona Norte)",
         xaxis = list(title = "Número de Baños"),
         yaxis = list(title = "Precio (Millones COP)"))

# Mostrar gráfica
grafico_banios

Figura 4. Relación: Precio vs. Baños

La Figura 4 muestra una tendencia escalonada clara. A medida que el número de baños aumenta (de 1 a 6), el precio también sube progresivamente. Esta relación puede ser un indicador de lujo en el sector inmobiliario. También observable que a medida que las casas tienen mas baños, los precios se hacen mas variables, indicando que pueden oscilar en mayor medida.

grafico_habitaciones <- plot_ly(data = base1, 
                                x = ~as.factor(habitaciones), 
                                y = ~preciom, 
                                type = "box", 
                                color = I("#e74c3c"), 
                                boxpoints = "outliers") %>%
  layout(title = "Distribución del Precio según Número de Habitaciones (Zona Norte)",
         xaxis = list(title = "Número de Habitaciones"),
         yaxis = list(title = "Precio (Millones COP)"))

# Mostrar gráfica
grafico_habitaciones

Figura 5. Relación: Precio vs. Habitaciones

A diferencia del área o los baños, la figura 5 nos muestra el recio vs. las habitaciones. En este caso al observar el paso de 3, a 4, a 5 y a 6 habitaciones, el precio no muestra una subida clara y constante. De hecho, se observa que propiedades con 5 habitaciones tienen una mediana de precio similar o incluso superior a propiedades con 6 y mas habitaciones. En el mercado inmobiliario, segmentar excesivamente un área física en muchos cuartos no incrementa el valor comercial del inmueble, e incluso puede hacerlo menos atractivo por sacrificar la amplitud de los espacios.

grafico_parqueaderos <- plot_ly(data = base1, 
                                x = ~as.factor(parqueaderos), 
                                y = ~preciom, 
                                type = "box", 
                                color = I("#2ecc71"), 
                                boxpoints = "outliers") %>%
  layout(title = "Distribución del Precio según Número de Parqueaderos (Zona Norte)",
         xaxis = list(title = "Número de Parqueaderos"),
         yaxis = list(title = "Precio (Millones COP)"))

# Mostrar gráfica
grafico_parqueaderos

Figura 6. Relación: Precio vs. Parqueaderos

Al observar la Figura 6 y ver los diagramas de cajas, se evidencia que la mediana del precio de las casas es ascendente a medida que ell número de parqueaderos va aumentando, pero este valor tiende a estabilizarse a partir de 4 parqueaderos. En adelante, la variabilidad del precio aumenta considerablemente. Esto puede deberse al uso de las casas, que quizá ya no sean para vivienda sino para instituciones comerciales que requieran una cantidad elevada de parqueaderos.

Estimación del Modelo de Regresión Lineal Múltiple

Procedemos entonces a generar el modelo de regresión lineal múltiple para estimar el precio de las casas en la zona norte en función de las variables areaconst, estrato, habitaciones, parqueaderos, banios; las cuales son relevantes en el mundo inmobiliario.

# Estimar el modelo de regresión lineal múltiple
modelo_norte <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = base1)

# Imprimir el resumen estadístico del modelo
summary(modelo_norte)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = base1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -953.64  -72.23  -16.68   37.01 1080.86 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   18.75073   19.19255   0.977 0.328977    
## areaconst      0.79052    0.04858  16.272  < 2e-16 ***
## estrato4      76.71093   19.05773   4.025 6.43e-05 ***
## estrato5     124.23961   18.48825   6.720 4.27e-11 ***
## estrato6     264.18066   32.17774   8.210 1.39e-15 ***
## habitaciones   6.31851    4.75552   1.329 0.184469    
## parqueaderos  10.06712    4.79606   2.099 0.036236 *  
## banios        23.32172    6.10283   3.821 0.000147 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 155.7 on 593 degrees of freedom
## Multiple R-squared:  0.6509, Adjusted R-squared:  0.6468 
## F-statistic:   158 on 7 and 593 DF,  p-value: < 2.2e-16

La tabla anterior muestra el resultado de la estimación del modelo de regresión lineal múltiple para el precio de las casas en la zona norte de Cali. Iniciamos el análisis identificando las variables que son significativas (aquellas cuyo “p-value” Pr(>|t|) es menor a 0.05). Identificamos que para estas condiciones el área construida (areaconst), los estratos (4, 5 y 6), los parqueaderos (parqueaderos) y el número de baños (banios) son significativas.

Por su parte, la variable habitaciones (p = 0.18) no es significativa, teniendo en cuenta que en el mercado inmobiliario, si mantienes el área total constante, dividir esa área en más habitaciones no necesariamente aumenta el valor (incluso podría reducir el tamaño de cada cuarto, haciéndola menos atractiva).

Ahora bien, revisamos la columna Estimate para interpretar los coeficientes del modelo, es decir, el impacto de cada variable en el precio de la propiedad:

  • Área Construida (areaconst = 0.790): Significa que manteniendo las demás características constantes, por cada metro cuadrado adicional que tenga una casa en la Zona Norte, su precio se incrementa en promedio $790.520 pesos.

  • Estrato 4 (estrato4 = 76.71): Una casa estrato 4 cuesta en promedio 76 millones de pesos más que una casa idéntica en estrato 3.

  • Estrato 5 (estrato5 = 124.23): Una casa estrato 5 cuesta en promedio 124.3 millones de pesos más que una idéntica en estrato 3.

  • Estrato 6 (estrato6 = 264.18): Una casa estrato 6 cuesta en promedio 264 millones de pesos mas respecto al estrato 3. Esto refleja la alta exclusividad de ese estrato en la ciudad.

  • Baños (banios = 23.32): Cada baño adicional le suma aproximadamente 23.3 millones de pesos al valor de la casa, manteniendo el resto de características constantes.

  • Parqueaderos (parqueaderos = 10.06): Cada parqueadero adicional le suma aproximadamente 10 millones de pesos al valor de la casa, manteniendo el resto de características constantes.

El modelo arroja un R-squared Ajustado de 0.6468, lo cual implica un ajuste moderado para datos en el sector inmobiliario. Este modelo es capaz de explicar el 64.68% de la variabilidad de los precios de las casas en la zona norte de Cali basándose únicamente en características físicas como el área construída, el estrato, el número de baños y de parqueaderos. Sin embargo, un 35% del precio obedece a factores que no están incluídos dentro de este modelo. Para mejorar el ajuste de este modelo sería interesante recolectar información como la antigüedad de las casas, su estado de remodelación, cercanía a sitios de interés como hospitales, centros comerciales, centros educativos, entre otros, así como el estado de las vías de acceso, la seguridad percibida y demás. Con esta información podría lograrse un mejor ajuste.

Validación de supuestos del modelo

Para validar los supuestos del modelo y verificar que los resultados matemáticos no están distorsionados, recurrimos a diferentes pruebas estadísticas. En la siguientes gráficas observaremos información relevante, la cual será analizada posteriormente.

# 4. Análisis Gráfico de los Residuos (Opcional pero excelente para el informe)
par(mfrow = c(2, 2)) # Divide la ventana gráfica en 4
plot(modelo_norte)

par(mfrow = c(1, 1)) # Restaura la ventana original

Inicialmente validamos el supuesto de No Multicolinealidad, el cual se puede evaluar a través del Factor de Inflación de la Varianza (VIF) de las variables incluidas en el modelo. Al evaluarlo se identifica que todos los valores se encuentran por debajo del límite mas utilizado de 5, lo cual implica que no hay evidencia de problemas asociados a colinealidad de las variables y cada una de ellas está aportando información única al modelo.

No Multicolinealidad

# 1. Supuesto de No Multicolinealidad (VIF)
# Evalúa si las variables independientes están demasiado correlacionadas entre sí
vif_valores <- vif(modelo_norte)
# print("Valores de VIF:")
print(vif_valores)
##                  GVIF Df GVIF^(1/(2*Df))
## areaconst    1.662460  1        1.289364
## estrato      1.675108  3        1.089784
## habitaciones 1.833535  1        1.354081
## parqueaderos 1.361018  1        1.166627
## banios       2.099060  1        1.448813

La tabla anterior presenta la verificación de No Multicolinealidad (VIF). Todos los valores VIF (Variance Inflation Factor) están entre 1.36 y 2.09 (el más alto es banios con 2.09). Este supuesto se cumple debido a que el VIF no supera el valor de 5. Como todos están muy por debajo, significa que nuestras variables independientes aportan información única y no están “compitiendo” entre sí o repitiendo la misma información.

Normalidad de los Residuos

Para verificar el supuesto de normalidad de los residuos utilizamos una prueba Shapiro-Wilk. A continuación se presenta la tabla con el resultado.

# 2. Supuesto de Normalidad de los Residuos (Prueba de Shapiro-Wilk)
shapiro_test <- shapiro.test(modelo_norte$residuals)
print(shapiro_test)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_norte$residuals
## W = 0.79018, p-value < 2.2e-16

\(W = 0.790183\), \(p\)-value \(< 0.05\) (específicamente \(< 2.2e-16\)). El supuesto no se cumple. Al tener un valor \(p\) tan pequeño, rechazamos la hipótesis nula de normalidad. Al revisar el gráfico (Q-Q Residuals), se observa cómo en la parte superior derecha los puntos se separan de la línea diagonal formando una curva hacia arriba. Esto indica una cola pesada a la derecha indicando que el modelo se equivoca por mucho cuando intenta predecir las casas más costosas/lujosas o atípicas. Esta condición podría mejorarse en futuros modelos realizando una transformación a la variable dependiente, posiblemente a través de una transformación logarítmica.

Homocedasticidad

Para verificar el supuesto de la homocedasticidad se utiliza la prueba de Breusch-Pagan. A continuación se presenta el resultado:

# 3. Supuesto de Homocedasticidad (Prueba de Breusch-Pagan)
# Evalúa si la varianza de los errores es constante
bp_test <- bptest(modelo_norte)
print(bp_test)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_norte
## BP = 119.2, df = 7, p-value < 2.2e-16

\(BP = 119.2\), \(p\)-value \(< 0.05\). El supuesto no se cumple. Rechazamos la hipótesis de que la varianza de los errores es constante; por lo tanto, tenemos un problema de heterocedasticidad. Al observar el gráfico de Residuals vs Fitted observamos una forma de embudo que se abre hacia la derecha. Esto significa que cuando la casa es barata (valores ajustados bajos), el modelo predice muy bien (poca varianza); pero a medida que la casa es más costosa (valores ajustados altos), el margen de error del modelo se dispara.

Valores Atípicos e Influyentes

En el gráfico Residuals vs Leverage, podemos que hay casas específicas que están distorsionando toda la ecuación por ser muy raras. aquellos datos que aparecen posterior a la distancia de Cook suelen ser datos con características muy extremas que están jalando la línea de regresión hacia ellos. Por ende, es prudente en próximos estudios revisar estos valores atípicos si corresponden a errores de digitación en su precio o área, o identificar si el modelo mejora al excluirlos de la muestra.

Predicción del precio de la vivienda

Utilizando el modelo de regresión múltiple calibrado para las casas de la Zona Norte, se estimó el valor de mercado para las características solicitadas (200 m² construidos, 4 habitaciones, 2 baños y 1 parqueadero). Dado que el cliente presenta flexibilidad para ubicarse en los estratos 4 o 5, se evaluaron ambos escenarios contrastándolos con el presupuesto máximo definido por el crédito preaprobado (350 millones de pesos):

# 1. Crear el perfil de las dos opciones para la Vivienda 1 (Estrato 4 y Estrato 5)
solicitud_v1 <- data.frame(
  areaconst = c(200, 200),
  estrato = as.factor(c(4, 5)), # Es vital convertirlo a factor, igual que en la base
  habitaciones = c(4, 4),
  parqueaderos = c(1, 1),
  banios = c(2, 2)
)

# 2. Realizar la predicción calculando el intervalo de confianza (95%)
prediccion_v1 <- predict(modelo_norte, newdata = solicitud_v1, interval = "confidence")

# 3. Unir los resultados con las características para visualizarlos fácilmente
resultados_v1 <- cbind(solicitud_v1, prediccion_v1)

# Imprimir los resultados en consola
print(resultados_v1)
##   areaconst estrato habitaciones parqueaderos banios      fit      lwr      upr
## 1       200       4            4            1      2 335.5502 303.1009 367.9995
## 2       200       5            4            1      2 383.0789 353.5762 412.5816

Escenario 1 (Casa en Estrato 4): El modelo proyecta un valor medio esperado de 335.5 millones de pesos. Con un nivel de confianza del 95%, se estima que las propiedades con este perfil en el mercado real oscilarán entre 303.1 y 367.9 millones de pesos. Este escenario se considera altamente viable, ya que el valor esperado se encuentra dentro del límite del crédito aprobado.

Escenario 2 (Casa en Estrato 5): Al proyectar una propiedad con especificaciones idénticas pero ubicada en estrato 5, el valor medio esperado asciende a 383.1 millones de pesos. El intervalo de confianza indica que los precios de mercado fluctuarán entre 353.5 y 412.5 millones de pesos. Este escenario se clasifica como inviable bajo las restricciones actuales, dado que incluso en el escenario más económico (el límite inferior), el precio supera el crédito disponible.

Según este modelo se recomienda descartar el estrato 5 para esta solicitud específica y enfocar los esfuerzos de los agentes inmobiliarios exclusivamente en captar y presentar opciones en el estrato 4. De lo contrario, la empresa internacional tendría que gestionar una ampliación del crédito de aproximadamente 33 millones de pesos adicionales en promedio.

Potenciales ofertas

Tras contrastar los resultados del modelo predictivo con el inventario actual de propiedades en la Zona Norte, se ha identificado un portafolio de 5 ofertas reales altamente competitivas. Todas las opciones listadas cumplen con el presupuesto máximo de 350 millones de pesos y presentan áreas construidas virtualmente exactas a los 200 m² solicitados.

# 1. Búsqueda y filtrado de las 5 mejores ofertas reales
ofertas_v1 <- base1 %>%
  # Restricción innegociable: Presupuesto máximo de 350 millones
  filter(preciom <= 350) %>%
  # Restricción del cliente: Estrato 4 o 5
  filter(estrato %in% c("4", "5")) %>%
  # Ordenamos las casas por su cercanía al área ideal (200 m2)
  # Usamos valor absoluto (abs) para que no importe si tiene 190m2 o 210m2, ambas están a 10m2 de diferencia
  arrange(abs(areaconst - 200)) %>%
  # Seleccionamos solo el top 5 para el informe
  head(5)

# 2. Imprimir la tabla en consola para analizarla
# print("Top 5 Ofertas Potenciales para la Vivienda 1:")
ofertas_v1 %>% 
  select(preciom, areaconst, estrato, habitaciones, banios, parqueaderos) %>%
  print()
## # A tibble: 5 × 6
##   preciom areaconst estrato habitaciones banios parqueaderos
##     <dbl>     <dbl> <fct>          <dbl>  <dbl>        <dbl>
## 1     350       200 5                  4      3            3
## 2     320       200 5                  4      4            2
## 3     320       200 4                  4      4            2
## 4     335       202 5                  5      4            1
## 5     350       203 5                  5      2            2

Aunque el modelo predictivo estimaba que el valor promedio para el estrato 5 excedía el presupuesto (384 millones), el filtro de inventario real permitió identificar cuatro (4) propiedades en este estrato que cumplen con el límite de 350 millones. Estas casas representan excelentes oportunidades de inversión, al adquirirse por debajo del precio promedio del mercado.

La solicitud inicial exigía 2 baños y 1 parqueadero. Las cinco ofertas encontradas no solo cumplen con este requisito, sino que lo superan ampliamente, ofreciendo entre 3 y 4 baños, y hasta 3 espacios de parqueo, sin exceder el presupuesto.

# 3. Crear el mapa interactivo con las 5 ofertas
mapa_ofertas_v1 <- leaflet(data = ofertas_v1) %>%
  addTiles() %>%
  # Usamos AwesomeMarkers para que resalten más en el mapa
  addAwesomeMarkers(
    ~longitud, ~latitud,
    label = ~paste("Precio: $", preciom, "M"),
    popup = ~paste("<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)
  )

# Mostrar el mapa
mapa_ofertas_v1

Figura 8. Mapa Potenciales Ofertas - Zona Norte

Vivienda 2: Apartamento en Zona Sur

En esta segunda parte del ejercicio la empresa está buscando un apartamento en la Zona Sur, de 300 m² construidos, 3 parqueadero, 3 baños, 5 habitaciones y estrato 5 o 6. Para esta vivienda se tiene un crédito preaprobado de $850 millones de pesos.

Filtro de la Base de Datos y Depuración

Se filtró el inventario para aislar exclusivamente los apartamentos de la Zona Sur. Durante este proceso, se detectaron errores de georreferenciación (puntos ubicados en el norte o centro de la ciudad a pesar de estar etiquetados como “Sur”). Para solucionar esta condición se aplicó un filtro espacial estricto, consistente en restringir la selección a aquellos registros que se encuentren por debajo de la latitud 3.43 (coordenada que delimita geográficamente el inicio del clúster sur de la Ciudad de Cali); con la finalidad de garantizar la pureza de la muestra y evitar que registros de apartamentos en el centro, occidente o en la zona norte se consideren en el análisis, de manera equivocada.

# Presentar los primeros 3 registros
base2 <- vivienda_clean %>% 
  filter(tipo == "Apartamento", 
         zona == "Zona Sur",
         # Usaremos < 3.43 para limpiar datos que hayan caído en el centro o norte por error.
         latitud < 3.43) %>% 
  drop_na(preciom, areaconst, estrato, banios, habitaciones, parqueaderos, longitud, latitud)

# Tablas de comprobación cruzada
# Esto nos verifica que sólo hayan APARTAMENTOS y que sólo estén en zona SUR
# Convertimos el objeto table a data.frame para que kable lo procese mejor
conteo_validacion_2 <- as.data.frame.matrix(table(base2$tipo, base2$zona))

conteo_validacion_2 %>%
  kable(caption = "Tabla N°3 - Validación del Filtro: Apartamentos en la Zona Sur") %>%
  kable_styling(full_width = F, position = "left")
Tabla N°3 - Validación del Filtro: Apartamentos en la Zona Sur
Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
Apartamento 0 0 0 0 2502
Casa 0 0 0 0 0

La Tabla N°3 comprueba que el filtro ha sido implementado de manera adecuada, indicando que sólo se tomaron los registros de la variable tipo apartamento y la variable zona sur. Este ejercicio nos deja un total de 2502 registros para el análisis, correspondiente a las observaciones que nos permiten realizar el análisis en el segmento deseado de acuerdo a la solicitud.

# Presentar los primeros 4 registros
base2 %>%
  head(4) %>%
  kable(caption = "Tabla N°4 - Primeros registros: Apartamentis en la Zona Sur") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Tabla N°4 - Primeros registros: Apartamentis en la Zona Sur
zona estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
Zona Sur 3 78 40 1 1 2 Apartamento aguablanca -76.50100 3.40000
Zona Sur 4 220 75 1 2 3 Apartamento alférez real -76.54627 3.39109
Zona Sur 3 115 58 1 2 2 Apartamento alférez real -76.54924 3.39121
Zona Sur 4 220 84 0 2 3 Apartamento alferez real -76.54600 3.39000

Como se puede observar en la Tabla N°4, se muestran los 4 primeros registros de la base de datos filtrada con las características requeridas. Este es el insumo para realizar el análisis exploratorio de datos y la modelación subsecuente. Para validación se presenta la Figura 9, en la cual se muestran las observaciones que cumplen con los criterios identificadas sobre el mapa de la ciudad de Cali como puntos rojos.

# 3. Mapa interactivo de comprobación
mapa_base2 <- leaflet(data = base2) %>%
  addTiles() %>%
  addCircleMarkers(~longitud, ~latitud, 
                   radius = 3, 
                   color = "darkred", # Cambiamos a rojo para diferenciar del modelo anterior
                   popup = ~paste("<b>Precio:</b> $", preciom, "M<br>",
                                  "<b>Área:</b>", areaconst, "m²<br>",
                                  "<b>Estrato:</b>", estrato))
# Mostrar el mapa
mapa_base2

Figura 9. Mapa Interactivo - Distribución de viviendas Zona Sur

# CÁLCULO DE DATOS FILTRADOS
# 2. Comprobar cuántos registros nos quedaron para entrenar el modelo
print(paste("Total de Apartamentos en la Zona Sur:", nrow(base2)))
## [1] "Total de Apartamentos en la Zona Sur: 2502"

Análisis Exploratorio de Datos

La Figura 10 nos muestra la matriz de correlación múltiple y nos permite extraer información clave sobre la dinámica del mercado de apartamentos en la Zona sur de Cali.

# 1. Seleccionamos las variables de interés
# Nota: 'estrato' debe seguir siendo un factor (variable categórica)
variables_eda_sur <- base2 %>%
  select(preciom, areaconst, banios, habitaciones, parqueaderos, estrato)

# 2. Generamos la matriz integral con ggpairs
grafico_ggpairs_sur <- ggpairs(variables_eda_sur,
                               title = "Análisis Exploratorio - Apartamentos Zona Sur",
                               lower = list(continuous = wrap("points", alpha = 0.3, size = 1, color = "darkred")),
                               diag = list(continuous = wrap("densityDiag", fill = "salmon", alpha = 0.6)))

# Mostrar la matriz
grafico_ggpairs_sur
Figura 10. Matriz de Correlación

Figura 10. Matriz de Correlación

En la diagonal principal encontramos las distribuciones individuales de cada variable. El precio (preciom) y el área (areaconst) presentan una distribución con fuerte asimetría positiva (sesgada hacia la derecha, con una larga cola). Esto indica que el grueso del mercado de apartamentos en la zona sur se concentra en precios y tamaños estándar (picos altos al lado izquierdo), pero existe un subgrupo exclusivo de propiedades de ultra-lujo con áreas de gran formato que actúan como marcados valores atípicos dentro de nuestro análisis. Por su parte, para la variable estrato, la muestra nos indica que la mayor concentración de oferta en esta zona se ubica abrumadoramente en los estratos 4 y 5, con una participación muy fuerte y protagónica del estrato 6. A diferencia del mercado de casas, aquí el estrato 3 tiene una presencia casi nula.

En el triángulo superior encontramos las correlaciones lineales. En estas casillas observamos el coeficiente de correlación de Pearson (r), el cual nos revela qué tanto se mueven las características físicas en conjunto con el precio de mercado. Es evidente que existe una correlación positiva muy fuerte (0.754) entre el área construida y el precio. Sin embargo, la gran diferencia en el mercado de apartamentos radica en las amenidades: el número de baños presenta una correlación altísima (0.724), al igual que los parqueaderos (0.696), convirtiéndose en fuertes indicadores de estatus y valor comercial. Por el contrario, las habitaciones tienen la correlación más débil de todas (0.323), lo que reafirma el comportamiento del segmento de lujo: dividir el área del apartamento en demasiadas habitaciones pequeñas no garantiza un aumento en su precio, ya que el comprador premium prioriza los espacios sociales amplios.

La última columna a la derecha relaciona la variable preciom y estrato. Se observa una clara tendencia escalonada. La mediana del precio da saltos significativos al pasar del estrato 4 al 5, pero experimenta un salto muchísimo más abrupto al ingresar al estrato 6. Así mismo, la relación entre areaconst y estrato muestra que, aunque las áreas se mantengan relativamente similares en los estratos 4 y 5, en el estrato 6 la caja se alarga y los precios se disparan sin un techo definido (alcanzando valores atípicos extremos); esto indica que en el sur de Cali, el mercado está dispuesto a pagar un ‘premium’ exorbitante por la exclusividad de un apartamento en el mejor barrio, independientemente de su tamaño base.

# GRÁFICO INTERACTIVO CON PLOTLY

# Relación entre Precio (Y), Área Construida (X) y Estrato (Color)
grafico_plotly_2 <- plot_ly(data = base2, 
                          x = ~areaconst, 
                          y = ~preciom, 
                          color = ~estrato, # El color diferencia los estratos
                          colors = "Set1",  # Paleta de colores atractiva
                          type = 'scatter', 
                          mode = 'markers',
                          # Texto que aparece al pasar el cursor (hover)
                          text = ~paste("<b>Estrato:</b>", estrato,
                                        "<br><b>Área:</b>", areaconst, "m2",
                                        "<br><b>Precio:</b> $", preciom, "M",
                                        "<br><b>Baños:</b>", banios,
                                        "<br><b>Habitaciones:</b>", habitaciones),
                          hoverinfo = 'text',
                          marker = list(size = 8, opacity = 0.7)) %>%
  layout(title = "Relación: Precio vs Área Construida por Estrato (Zona Sur)",
         xaxis = list(title = "Área Construida (m²)"),
         yaxis = list(title = "Precio (Millones COP)"),
         legend = list(title = list(text = '<b> Estrato </b>')))

# Mostrar el gráfico
grafico_plotly_2

Figura 11. Relación: Precio vs. Area - Estrato

En la gráfica se evidencia una clara tendencia ascendente de izquierda a derecha. A medida que aumenta el área construida (eje X), el precio (eje Y) también se incrementa. Sin embargo, la dispersión no forma una línea recta, lo que nos indica que el área no es el único factor determinante en la propiedad horizontal. Adicionalmente, se observa cómo los puntos están densamente agrupados en el rango de 0 a 150 m², pero a medida que superamos los 200 m², la nube de puntos se dispersa verticalmente de forma drástica. Esto implica que predecir el valor de un apartamento estándar es relativamente predecible, pero en apartamentos de gran formato (como los 300 m² requeridos para la Vivienda 2), el precio varía enormemente dependiendo de otras características de lujo y exclusividad no incluidas en este gráfico.

Al analizar el estrato, observamos dinámicas muy particulares del mercado en el sur: los puntos rojos (Estrato 3) y azules (Estrato 4) se aglomeran en la esquina inferior izquierda, fuertemente limitados a áreas pequeñas y precios bajos. Los puntos verdes (Estrato 5) muestran una gran dispersión horizontal, abarcando desde áreas pequeñas hasta tamaños gigantes (incluso presentando valores atípicos de hasta 900 m²), pero manteniendo en su mayoría precios que no superan la barrera de los 800 millones. Por su parte, el verdadero protagonista del valor es el estrato 6 (puntos morados): dominan la parte central y superior de la gráfica con un comportamiento casi vertical, demostrando que en el sur de Cali este nivel socioeconómico cobra un premium altísimo por metro cuadrado, alcanzando precios de hasta 1.800 millones para áreas concentradas entre los 200 y 400 m².

grafico_banios2 <- plot_ly(data = base2, 
                          x = ~as.factor(banios), # Lo tratamos como factor para el eje X
                          y = ~preciom, 
                          type = "box", 
                          color = I("#3498db"), 
                          boxpoints = "outliers") %>%  
  layout(title = "Distribución del Precio según Número de Baños (Zona Sur)",
         xaxis = list(title = "Número de Baños"),
         yaxis = list(title = "Precio (Millones COP)"))

# Mostrar gráfica
grafico_banios2

Figura 12. Relación: Precio vs. Baños

En la distribución del precio según el número de baños para los apartamentos de la Zona Sur, se evidencia una clara y fuerte tendencia escalonada ascendente. Observamos que al pasar de 1 a 6 baños, la mediana del precio sube de manera progresiva y sustancial. En el mercado de propiedad horizontal del sur, contar con múltiples baños es un indicador directo de lujo, estatus y alto metraje. Además, a medida que este número aumenta (especialmente en los rangos de 4 a 6 baños), las cajas se hacen notablemente más altas y se multiplican los valores atípicos en la parte superior. Esto indica que en el segmento premium los precios se vuelven mucho más volátiles y pueden oscilar en rangos de cientos de millones de pesos.

grafico_habitaciones2 <- plot_ly(data = base2, 
                                x = ~as.factor(habitaciones), 
                                y = ~preciom, 
                                type = "box", 
                                color = I("#e74c3c"), 
                                boxpoints = "outliers") %>%
  layout(title = "Distribución del Precio según Número de Habitaciones (Zona Sur)",
         xaxis = list(title = "Número de Habitaciones"),
         yaxis = list(title = "Precio (Millones COP)"))

# Mostrar gráfica
grafico_habitaciones2

Figura 13. Relación: Precio vs. Habitaciones

A diferencia del comportamiento claramente ascendente observado con el área o los baños, la distribución del precio frente al número de habitaciones en la Zona Sur se comporta diferente. Si bien existe un pequeño incremento en las medianas del precio al pasar de 1 a 6 habitaciones, ya que más cuartos suelen implicar una mayor área base, el hallazgo crítico se encuentra en la dispersión de los valores atípicos, dado que estos valores se concentran en las propiedades de 3 y 4 habitaciones, haciendo referencia quizá a zonas muy espaciosas pero de pocos cuartos.

grafico_parqueaderos2 <- plot_ly(data = base2, 
                                x = ~as.factor(parqueaderos), 
                                y = ~preciom, 
                                type = "box", 
                                color = I("#2ecc71"), 
                                boxpoints = "outliers") %>%
  layout(title = "Distribución del Precio según Número de Parqueaderos (Zona sur)",
         xaxis = list(title = "Número de Parqueaderos"),
         yaxis = list(title = "Precio (Millones COP)"))

# Mostrar gráfica
grafico_parqueaderos2

Figura 14. Relación: Precio vs. Parqueaderos

Al observar los diagramas de caja, se evidencia que la mediana del precio de los apartamentos asciende progresivamente a medida que el número de parqueaderos aumenta de 0 a 4. Asimismo, la variabilidad del precio y los valores atípicos crecen considerablemente en estas categorías superiores. El caso aislado de 10 parqueaderos representa una anomalía, posiblemente un error de digitación. Esto indica que, en la propiedad horizontal, contar con múltiples parqueaderos es una característica directa de lujo y estatus.

Estimación del Modelo de Regresión Lineal Múltiple

Procedemos entonces a generar el modelo de regresión lineal múltiple para estimar el precio de los apartamentos en la zona sur en función de las variables areaconst, estrato, habitaciones, parqueaderos, banios; las cuales son relevantes en el mundo inmobiliario.

# 1. Estimar el modelo con la base del sur (base2)
modelo_sur <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = base2)

# 2. Mostrar el resumen estadístico
summary(modelo_sur)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = base2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1090.05   -37.01     0.68    33.57   904.54 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -5.9913    10.7608  -0.557   0.5777    
## areaconst      1.3188     0.0492  26.803  < 2e-16 ***
## estrato4      17.7574     7.4479   2.384   0.0172 *  
## estrato5      34.1322     7.7728   4.391 1.17e-05 ***
## estrato6     192.2783     9.7344  19.752  < 2e-16 ***
## habitaciones -14.7074     3.4062  -4.318 1.64e-05 ***
## parqueaderos  51.7766     3.1284  16.551  < 2e-16 ***
## banios        41.3799     3.0881  13.400  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 88.94 on 2494 degrees of freedom
## Multiple R-squared:  0.7856, Adjusted R-squared:  0.785 
## F-statistic:  1306 on 7 and 2494 DF,  p-value: < 2.2e-16

La tabla anterior muestra el resultado de la estimación del modelo de regresión lineal múltiple para el precio de los apartamentos en la Zona Sur de Cali. A diferencia del mercado de casas, iniciamos el análisis destacando que absolutamente todas las variables son estadísticamente significativas (su p-value es menor a 0.05 y poseen asteriscos de significancia).

Al revisar la columna Estimate, interpretamos el impacto directo de cada variable en el precio de la propiedad (manteniendo las demás constantes):

  • Área Construida (areaconst = 1.32): Por cada metro cuadrado adicional, el precio del apartamento se incrementa en promedio 1.32 millones de pesos.

  • Estrato: Un apartamento estrato 4 cuesta 17.7 millones más que uno estrato 3; en estrato 5 sube a 34.1 millones adicionales; y el estrato 6 suma 192.3 millones de pesos adicionales frente al estrato base, reflejando la alta exclusividad del sur.

  • Habitaciones (habitaciones = -14.71): Presenta un impacto negativo. Por cada habitación adicional, el apartamento pierde en promedio 14.7 millones de pesos de valor. Para este escenario, al mantener el área constante pero dividirla en múltiples cuartos pequeños hace menos atractiva la propiedad, ya que se prefieren áreas sociales amplias.

  • Parqueaderos (parqueaderos = 51.78): Cada espacio de garaje extra le suma 51.8 millones al valor del apartamento.

  • Baños (banios = 41.38): Cada baño adicional incrementa el precio en 41.4 millones.

El modelo arroja un R-squared Ajustado de 0.785, lo cual representa un ajuste sobresaliente para el sector inmobiliario. Esto implica que el modelo es capaz de explicar el 78.5% de la variabilidad de los precios basándose únicamente en estas características físicas. Solo un 21.5% del precio depende de factores no incluidos, como la vista de los balcones, la antigüedad del edificio, zonas comunes (piscinas, gimnasios) o acabados de lujo, no considerados en este estudio.

Validación de Supuestos del Modelo

Para validar los supuestos del modelo y verificar que los resultados matemáticos no están distorsionados, recurrimos a diferentes pruebas estadísticas. En la siguientes gráficas observaremos información relevante, la cual será analizada posteriormente.

# 5. Análisis Gráfico de los Residuos
par(mfrow = c(2, 2)) # Divide la ventana para ver 4 gráficos
plot(modelo_sur)
Figura 15. Análisis Gráfico de Supuestos del Modelo

Figura 15. Análisis Gráfico de Supuestos del Modelo

par(mfrow = c(1, 1)) # Restaura la vista

No Multicolinealidad

# 1. Supuesto de No Multicolinealidad (VIF)
# print("--- 1. Prueba VIF (Multicolinealidad) ---")
vif_sur <- vif(modelo_sur)
print(vif_sur)
##                  GVIF Df GVIF^(1/(2*Df))
## areaconst    2.096753  1        1.448017
## estrato      1.872026  3        1.110159
## habitaciones 1.438594  1        1.199414
## parqueaderos 1.864471  1        1.365456
## banios       2.617456  1        1.617855

La tabla presenta la verificación de No Multicolinealidad (VIF) para el modelo de la Vivienda 2. Todos los valores se encuentran entre 1.43 y 2.61 (siendo banios el más alto con 2.61). Al estar todos estrictamente por debajo del umbral crítico de 5, el supuesto estadístico se cumple. Esto garantiza que las variables independientes analizadas aportan información única al modelo y no están ‘compitiendo’ ni repitiendo información entre sí.

Normalidad de los Residuos

# 2. Supuesto de Normalidad de los Residuos (Shapiro-Wilk)
#print("--- 2. Prueba de Shapiro-Wilk (Normalidad) ---")
shapiro_sur <- shapiro.test(modelo_sur$residuals)
print(shapiro_sur)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_sur$residuals
## W = 0.75696, p-value < 2.2e-16

Para el estadístico de Shapiro-Wilk obtenemos un valor W = 0.75696 con un p-value < 0.05 (específicamente < 2.2e-16). Por lo tanto, el supuesto de normalidad no se cumple. Al tener un valor p tan cercano a cero, rechazamos la hipótesis nula de distribución normal de los residuos. Al corroborar esto visualmente con el gráfico de (Q-Q Residuals), se observa cómo en la parte superior derecha los puntos se separan abruptamente de la línea diagonal punteada, formando una curva pronunciada hacia arriba. Esto nos indica que el modelo pierde precisión y subestima el valor real cuando intenta predecir los apartamentos más costosos, atípicos en el sur. Esta condición podría mitigarse en iteraciones futuras del modelo aplicando una transformación matemática a la variable dependiente (precio), como por ejemplo, una transformación logarítmica.

Homocedasticidad

# 3. Supuesto de Homocedasticidad (Breusch-Pagan)
#print("--- 3. Prueba de Breusch-Pagan (Homocedasticidad) ---")
bp_sur <- bptest(modelo_sur)
print(bp_sur)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_sur
## BP = 801.4, df = 7, p-value < 2.2e-16

\(BP = 801.4\), \(p\)-value \(< 0.05\). el supuesto no se cumple. Al tener un valor p tan pequeño, rechazamos la hipótesis nula de que la varianza de los errores es constante, confirmando la presencia de una fuerte heterocedasticidad. Al corroborar esto visualmente con el gráfico (Residuals vs Fitted), se observa una clara forma de embudo que se abre hacia la derecha. Esto significa que cuando el apartamento es de precio estándar o moderado, el modelo predice con alta precisión y poca varianza; pero a medida que intentamos predecir el valor de propiedades de lujo o penthouses más costosos, el margen de error del modelo se dispara drásticamente debido a características de lujo que no están capturadas en la base de datos

Predicción del precio de la vivienda

Utilizando el modelo de regresión múltiple calibrado para los apartamentos de la Zona Sur, se estimó el valor de mercado para las características solicitadas (300 m² construidos, 4 habitaciones, 3 baños y 3 parqueadero). Dado que el cliente presenta flexibilidad para ubicarse en los estratos 5 o 6, se evaluaron ambos escenarios contrastándolos con el presupuesto máximo definido por el crédito preaprobado (850 millones de pesos):

# 1. Crear el data.frame con los dos perfiles solicitados por el cliente
# Es vital que los nombres de las columnas sean idénticos a los del modelo
solicitud_v2 <- data.frame(
  areaconst = c(300, 300),
  estrato = as.factor(c("5", "6")), # Lo convertimos a factor para activar las variables dummy
  habitaciones = c(5, 5),
  parqueaderos = c(3, 3),
  banios = c(3, 3)
)

# 2. Ejecutar la función predict() pidiendo el intervalo de confianza al 95%
prediccion_v2 <- predict(modelo_sur, newdata = solicitud_v2, interval = "confidence")

# 3. Unir la tabla de características con los resultados de la predicción
resultados_v2 <- cbind(solicitud_v2, prediccion_v2)

# Mostrar los resultados limpios en la consola
#print("Resultados de Predicción - Apartamentos Zona Sur:")
print(resultados_v2)
##   areaconst estrato habitaciones parqueaderos banios      fit      lwr      upr
## 1       300       5            5            3      3 629.7107 608.9586 650.4628
## 2       300       6            5            3      3 787.8568 766.3664 809.3471

Escenario 1 (Apartamento en Estrato 5): El modelo predice un valor medio de mercado de 629.7 millones de pesos (intervalo de confianza del 95%). Este escenario es altamente viable, generando un excedente sustancial sobre el crédito aprobado.

Escenario 2 (Apartamento en Estrato 6): Al proyectar la misma propiedad con el nivel de exclusividad del estrato 6, el valor medio esperado asciende a 787.8 millones de pesos. Este escenario también es viable y se mantiene dentro del límite de los 850 millones.

Es importante advertir al cliente que la solicitud de 5 habitaciones en un área de 300 m² ejerce un efecto “penalizador” en el precio según el modelo matemático. En el segmento de lujo de la Zona Sur, el mercado valora más los espacios sociales amplios que la hiper-segmentación en múltiples cuartos.

Potenciales ofertas

Tras contrastar las predicciones con el inventario disponible en la Zona Sur (2,502 registros), se realizó una búsqueda para identificar las ofertas reales que mejor se ajusten a los requerimientos del cliente (Apartamento, 300 m², estrato 5 o 6, 5 habitaciones, 3 parqueaderos, 3 baños) con un límite estricto de 850 millones de pesos.

# 1. Filtrar las 5 mejores opciones reales
ofertas_v2 <- base2 %>%
  # Restricción estricta de presupuesto
  filter(preciom <= 850) %>%
  # Restricción de estrato
  filter(estrato %in% c("5", "6")) %>%
  # Ordenar por cercanía al área solicitada (300 m2)
  arrange(abs(areaconst - 300)) %>%
  # Extraer el Top 5
  head(5)

# 2. Imprimir la tabla de resultados para analizarla
#print("Top 5 Ofertas Potenciales para la Vivienda 2 (Apartamentos Sur):")
ofertas_v2 %>% 
  select(preciom, areaconst, estrato, habitaciones, banios, parqueaderos) %>%
  print()
## # A tibble: 5 × 6
##   preciom areaconst estrato habitaciones banios parqueaderos
##     <dbl>     <dbl> <fct>          <dbl>  <dbl>        <dbl>
## 1     670      300  5                  6      5            3
## 2     410      296. 5                  4      4            2
## 3     490      288  5                  4      5            1
## 4     520      320  5                  4      4            2
## 5     650      275  5                  5      5            2

Estrato 5: Al buscar la mayor coincidencia en área y características, el inventario arroja propiedades en estrato 5. La opción más destacada es el Registro 1 (670 Millones). Este apartamento ofrece exactamente los 300 m² solicitados, cumple con los 3 parqueaderos exigidos y supera las expectativas en baños (5) y habitaciones (6). Representa un ahorro masivo de 180 millones frente al presupuesto aprobado.

# 3. Mapear las opciones seleccionadas
mapa_ofertas_v2 <- leaflet(data = ofertas_v2) %>%
  addTiles() %>%
  addAwesomeMarkers(
    ~longitud, ~latitud,
    label = ~paste("Precio: $", preciom, "M"),
    popup = ~paste("<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)
  )

# Mostrar el mapa
mapa_ofertas_v2

Figura 16. Mapa Potenciales Ofertas - Zona Sur