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.
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.
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")
| 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"))
| 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
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
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.
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.
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.
# 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.
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.
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.
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.
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.
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
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.
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")
| 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"))
| 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"
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
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.
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.
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
par(mfrow = c(1, 1)) # Restaura la vista
# 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í.
# 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.
# 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
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.
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