Paso 3: Análisis exploratorio (≤ 850 millones)
En este paso se realizó un análisis exploratorio de los apartamentos
ubicados en la zona sur cuyo precio es igual o inferior a 850 millones
de pesos, con el fin de entender mejor las relaciones entre el precio y
las variables predictoras disponibles: área construida, estrato, número
de baños, habitaciones y zona.
A través de un gráfico de dispersión múltiple (splom), se evidencian
algunas tendencias clave:
Existe una relación positiva clara entre el precio y el área
construida, es decir, a mayor área, mayor es el precio del
apartamento.
El estrato también muestra una tendencia creciente con el precio, lo
que indica que propiedades en estratos más altos suelen tener mayor
valor.
Las variables baños y habitaciones también presentan asociaciones
positivas, aunque menos definidas, con el precio.
La mayor concentración de ofertas se encuentra en rangos de precios
entre 200 y 600 millones, lo que puede ser relevante para acotar la
búsqueda en el rango presupuestal disponible.
Este análisis permite identificar patrones clave en el mercado del
sur de la ciudad y facilitar la construcción de un modelo predictivo más
robusto en pasos posteriores.
ofertas_850 <- base_sur_apart %>%
filter(.data[[precio_col]] <= 850000000)
eda_vars <- c(precio_col, area_col, estrato_col, banos_col, cuartos_col, zona_col)
eda_vars <- eda_vars[!is.na(eda_vars) & eda_vars %in% names(ofertas_850)]
eda_df <- ofertas_850 %>%
select(all_of(eda_vars)) %>%
na.omit()
plot_ly(type = 'splom', data = eda_df,
dimensions = lapply(eda_vars[1:5], function(colname) list(label = colname, values = ~ get(colname))),
marker = list(size = 5, color = 'rgba(0, 150, 255, 0.5)')) %>%
layout(title = "Relaciones entre Precio y Variables Predictoras (≤ 850M)")
Paso 4: Modelo de regresión
En esta etapa se construyó un modelo de regresión lineal múltiple
para estimar el precio de los apartamentos en la zona sur de Cali,
utilizando como variables predictoras: área construida, estrato, número
de habitaciones, parqueaderos y baños.
Los resultados del modelo indican lo siguiente:
Todas las variables son estadísticamente significativas (p <
0.001), lo que confirma su relevancia en la predicción del precio.
El área construida tiene el mayor impacto positivo en el precio,
seguida de los baños y parqueaderos.
Curiosamente, el número de habitaciones muestra un coeficiente
negativo, lo que podría indicar que, manteniendo las demás variables
constantes, más habitaciones podrían asociarse con una reducción del
precio, posiblemente por efectos de distribución interna o
ubicación.
El coeficiente de estrato también muestra un efecto positivo
importante sobre el precio.
En cuanto a la calidad del modelo:
El R-cuadrado ajustado es de 0.748, lo que indica que el modelo
explica aproximadamente el 75% de la variabilidad del precio, lo cual es
una muy buena capacidad predictiva para un modelo lineal.
El error estándar residual es de 98.02, lo que indica una dispersión
relativamente controlada en las predicciones.
El modelo fue ajustado sobre 2.376 observaciones (tras eliminar
casos con datos faltantes) y es altamente significativo (valor-p <
2.2e-16).
Este modelo ofrece una base sólida para estimar precios de
apartamentos en la zona sur y será útil para generar recomendaciones de
compra en función del crédito disponible.
predictoras <- c(area_col, estrato_col, cuartos_col, parq_col, banos_col)
predictoras <- predictoras[!is.na(predictoras) & predictoras %in% names(base_sur_apart)]
formula_mod <- as.formula(paste0("`", precio_col, "` ~ ", paste0("`", predictoras, "`", collapse = " + ")))
modelo_sur <- lm(formula_mod, data = base_sur_apart)
summary(modelo_sur)
##
## Call:
## lm(formula = formula_mod, data = base_sur_apart)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1092.02 -42.28 -1.33 40.58 926.56
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -261.62501 15.63220 -16.736 < 2e-16 ***
## areaconst 1.28505 0.05403 23.785 < 2e-16 ***
## estrato 60.89709 3.08408 19.746 < 2e-16 ***
## habitaciones -24.83693 3.89229 -6.381 2.11e-10 ***
## parqueaderos 72.91468 3.95797 18.422 < 2e-16 ***
## banios 50.69675 3.39637 14.927 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 98.02 on 2375 degrees of freedom
## (406 observations deleted due to missingness)
## Multiple R-squared: 0.7485, Adjusted R-squared: 0.748
## F-statistic: 1414 on 5 and 2375 DF, p-value: < 2.2e-16
Paso 5: Validación de supuestos
En el Paso 5 para la Zona Sur, la validación de supuestos muestra
que los residuos presentan cierta dispersión creciente en valores
ajustados altos, lo que indica posible heterocedasticidad, y el QQ plot
revela desviaciones de la normalidad en los extremos, señalando que los
residuos no siguen completamente una distribución normal. Estos
hallazgos sugieren que, aunque el modelo es adecuado, podría
beneficiarse de ajustes o transformaciones para mejorar la precisión y
cumplir mejor con los supuestos del modelo lineal.
En el análisis de validación de supuestos para el modelo de la Zona
Sur, el gráfico QQ muestra que los residuos se desvían de la línea
diagonal en los extremos, indicando que no siguen una distribución
normal. Esto se confirma con la prueba de Shapiro-Wilk, que reporta un
valor W de 0.79118 y un p-valor menor a 2.2e-16, rechazando la
normalidad. Además, la prueba de Breusch-Pagan revela heterocedasticidad
con un valor BP de 754.81 y un p-valor también menor a 2.2e-16. Por
último, la prueba de Durbin-Watson muestra una estadística cercana a 2,
sugiriendo que no hay autocorrelación significativa en los residuos. En
resumen, aunque no se cumple la normalidad ni la homocedasticidad, no
hay evidencia de autocorrelación.
res <- resid(modelo_sur)
fitted <- fitted(modelo_sur)
ggplot(data.frame(res, fitted), aes(x = fitted, y = res)) +
geom_point() + geom_hline(yintercept = 0, linetype = 2) + theme_minimal() +
ggtitle("Residuos vs Valores Ajustados — Zona Sur")

ggplot(data.frame(res), aes(sample = res)) +
stat_qq() + stat_qq_line() + theme_minimal() +
ggtitle("QQ Plot de Residuos — Zona Sur")

shapiro.test(res)
##
## Shapiro-Wilk normality test
##
## data: res
## W = 0.79118, p-value < 2.2e-16
bptest(modelo_sur)
##
## studentized Breusch-Pagan test
##
## data: modelo_sur
## BP = 754.81, df = 5, p-value < 2.2e-16
durbinWatsonTest(modelo_sur)
## lag Autocorrelation D-W Statistic p-value
## 1 0.2314604 1.533316 0
## Alternative hypothesis: rho != 0
Paso 6: Predicción y ofertas sugeridas