Al revisar la estructura general de la base de datos se observa que inicialmente cuenta con 13 variables, entre ellas variables numéricas (precio, área construida, baños, habitaciones, estrato, latitud y longitud) y variables categóricas (zona, tipo, barrio y piso).
En cuanto a los valores faltantes, la mayoría de las variables presentan una cantidad mínima de datos perdidos (entre 2 y 3 registros). Sin embargo, la variable piso tiene un número considerable de valores faltantes (2638), y parqueaderos también presenta una cantidad importante (1605). Esto es relevante porque puede influir en el tamaño efectivo de muestra al momento de estimar los modelos.
Después del filtrado realizado para el caso de estudio, la base de trabajo queda conformada por 8 variables numéricas y 8322 registros, lo cual constituye un tamaño de muestra amplio para realizar el análisis de regresión.
En el resumen estadístico de las variables numéricas se observa que el precio presenta una alta dispersión (media 433.89 y desviación estándar 328.65), con valores que van desde 58 hasta 1999 millones, lo que sugiere presencia de viviendas de alto valor que podrían generar asimetría. El área construida también muestra gran variabilidad (mínimo 30 m² y máximo 1745 m²), lo que indica heterogeneidad en el tipo de vivienda. Las variables baños y habitaciones presentan distribuciones más concentradas alrededor de 3 y 4 respectivamente. La variable estrato se concentra principalmente entre 4 y 5. Las coordenadas latitud y longitud muestran poca variabilidad, como es esperable, ya que corresponden a una zona geográfica específica.
En términos generales, se identifica que el precio y el área construida presentan mayor dispersión en comparación con las demás variables, lo cual anticipa que podrían tener un peso importante dentro del modelo de regresión.
DT::datatable(
tabla_dic,
options = list(pageLength = 25, scrollX = TRUE),
caption = "Variables, tipo y cantidad de faltantes"
)
DT::datatable(primeros, options = list(scrollX = TRUE))
res_num
| Name | Piped data |
| Number of rows | 8322 |
| Number of columns | 8 |
| _______________________ | |
| Column type frequency: | |
| numeric | 8 |
| ________________________ | |
| Group variables | None |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| preciom | 2 | 1.00 | 433.89 | 328.65 | 58.00 | 220.00 | 330.00 | 540.00 | 1999.00 | ▇▂▁▁▁ |
| areaconst | 3 | 1.00 | 174.93 | 142.96 | 30.00 | 80.00 | 123.00 | 229.00 | 1745.00 | ▇▁▁▁▁ |
| parqueaderos | 1605 | 0.81 | 1.84 | 1.12 | 1.00 | 1.00 | 2.00 | 2.00 | 10.00 | ▇▁▁▁▁ |
| banios | 3 | 1.00 | 3.11 | 1.43 | 0.00 | 2.00 | 3.00 | 4.00 | 10.00 | ▇▇▃▁▁ |
| habitaciones | 3 | 1.00 | 3.61 | 1.46 | 0.00 | 3.00 | 3.00 | 4.00 | 10.00 | ▂▇▂▁▁ |
| estrato | 3 | 1.00 | 4.63 | 1.03 | 3.00 | 4.00 | 5.00 | 5.00 | 6.00 | ▅▆▁▇▆ |
| latitud | 3 | 1.00 | 3.42 | 0.04 | 3.33 | 3.38 | 3.42 | 3.45 | 3.50 | ▃▇▅▇▅ |
| longitud | 3 | 1.00 | -76.53 | 0.02 | -76.59 | -76.54 | -76.53 | -76.52 | -76.46 | ▁▅▇▂▁ |
Para el Caso 1 se realizó un filtro considerando únicamente viviendas tipo casa ubicadas en la Zona Norte, obteniendo un total de 722 registros. La verificación cruzada entre las variables tipo y zona confirma que todos los registros corresponden efectivamente a casas en la zona norte, lo que indica que el filtro fue aplicado correctamente.
Al revisar los primeros registros se observa variabilidad en características como área construida, estrato y número de habitaciones, lo que sugiere que, aun dentro de una misma zona, existe heterogeneidad en el tipo de vivienda y en los precios.
Este conjunto de datos constituye la base de trabajo para el análisis exploratorio y la posterior estimación del modelo de regresión lineal múltiple.
############################################################
# CASO 1 – Vivienda 1
# Filtro: Casas en Zona Norte
############################################################
#Crear base1
base1 <- vivienda %>%
filter(tipo == "Casa",
zona == "Zona Norte")
# Tamaño de la base
n_base1 <- nrow(base1)
# Tabla de verificación tipo y zona
tabla_verif <- table(base1$tipo, base1$zona)
# Primeros registros
primeros_base1 <- head(base1, 3)
# Mostrar resultados
cat("### Caso 1 – Base filtrada: Casas en Zona Norte\n\n")
## ### Caso 1 – Base filtrada: Casas en Zona Norte
cat("Número de registros:", n_base1, "\n\n")
## Número de registros: 722
cat("### Verificación tipo vs zona\n\n")
## ### Verificación tipo vs zona
tabla_verif
##
## Zona Norte
## Casa 722
cat("\n\n### Primeros 3 registros\n\n")
##
##
## ### Primeros 3 registros
DT::datatable(primeros_base1, options = list(scrollX = TRUE))
Validación geográfica de la clasificación por zona
Aunque inicialmente se filtró la base utilizando la variable categórica “Zona Norte”, al visualizar los puntos en el mapa se observa que algunas viviendas se ubican en sectores más centrales e incluso ligeramente hacia el sur.
Esto indica que la variable zona podría presentar algunas inconsistencias en su clasificación, ya sea por errores de codificación o porque los límites utilizados en la base no coinciden exactamente con la división geográfica real de la ciudad.
Teniendo en cuenta que el análisis depende directamente de una correcta segmentación por zona, se consideró necesario complementar el filtro categórico con un criterio adicional basado en la latitud, con el fin de depurar mejor los registros y trabajar únicamente con viviendas que efectivamente correspondan a la zona norte.
############################################################
# Mapa – Validación espacial de Zona Norte
############################################################
leaflet(base1) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud,
lat = ~latitud,
radius = 3,
color = "blue",
popup = ~paste0("Precio: ", preciom,
"<br>Área: ", areaconst,
"<br>Estrato: ", estrato)
)
Análisis de latitud
La mayoría de las viviendas se concentra en un rango aproximado entre 3.45 y 3.50, lo cual es coherente con la ubicación geográfica del norte de Cali. Sin embargo, también aparecen algunas observaciones con latitudes cercanas a 3.33, que corresponden más a sectores centrales o incluso hacia el sur de la ciudad. Esto sugiere que la variable categórica zona podría tener algunas inconsistencias en su clasificación.
Por esta razón, se decidió realizar una depuración adicional utilizando la latitud como criterio complementario, con el fin de trabajar únicamente con registros que realmente correspondan a la zona norte y así garantizar mayor coherencia en el análisis.
############################################################
# Análisis de latitud – Verificación Norte vs Centro/Sur
############################################################
summary(base1$latitud)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3.33 3.45 3.47 3.46 3.48 3.50
quantile(base1$latitud, probs = c(0, 0.25, 0.5, 0.75, 1))
## 0% 25% 50% 75% 100%
## 3.333 3.452 3.468 3.482 3.496
hist(base1$latitud,
col = "lightblue",
main = "Distribución de Latitud - Casas Zona Norte",
xlab = "Latitud")
Depuración geográfica basada en latitud
Aunque inicialmente se filtró la base utilizando la variable categórica “Zona Norte”, el análisis exploratorio de la latitud mostró la presencia de algunas observaciones con valores cercanos a 3.33, que corresponden geográficamente a sectores más centrales o incluso del sur de la ciudad. Esta dispersión hace pensar que podrían existir inconsistencias en la clasificación de la variable zona.
Con el fin de mantener coherencia espacial en el análisis y trabajar únicamente con viviendas que realmente se encuentren en el norte de Cali, se decidió complementar el filtro categórico con un criterio basado en la distribución observada de la latitud. Dado que el bloque principal de concentración inicia aproximadamente en 3.44 y que el primer cuartil de la muestra original se ubica alrededor de 3.452, se adoptó como punto de corte una latitud mínima de 3.44.
Aplicando este criterio se eliminaron observaciones potencialmente mal clasificadas, reduciendo la base de 722 a 603 registros, lo que permite trabajar con una submuestra más homogénea y consistente para la estimación del modelo de regresión.
############################################################
# Depuración geográfica - Zona Norte real
############################################################
base1_dep <- base1 %>%
filter(latitud >= 3.44)
nrow(base1_dep)
## [1] 603
summary(base1_dep$latitud)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3.44 3.46 3.47 3.47 3.48 3.50
############################################################
# Correlación - Casas Zona Norte depurada
############################################################
vars_modelo <- base1_dep %>%
select(preciom, areaconst, estrato, banios, habitaciones, parqueaderos)
cor_matrix <- cor(vars_modelo, use = "complete.obs")
round(cor_matrix, 2)
## preciom areaconst estrato banios habitaciones parqueaderos
## preciom 1.00 0.69 0.52 0.54 0.37 0.41
## areaconst 0.69 1.00 0.36 0.50 0.44 0.30
## estrato 0.52 0.36 1.00 0.37 0.05 0.26
## banios 0.54 0.50 0.37 1.00 0.61 0.39
## habitaciones 0.37 0.44 0.05 0.61 1.00 0.24
## parqueaderos 0.41 0.30 0.26 0.39 0.24 1.00
Relación entre precio y área construida
El gráfico muestra una tendencia claramente creciente entre el área construida y el precio de la vivienda. Aunque existe dispersión —particularmente en áreas superiores a 400 m²— la relación general es lineal positiva, consistente con la teoría económica del mercado inmobiliario.
Se identifican algunos valores extremos con precios superiores a 1500 millones, los cuales podrían influir en la estimación del modelo y deberán ser considerados en la validación de supuestos.
############################################################
# Precio vs Área Construida
############################################################
plot_ly(base1_dep,
x = ~areaconst,
y = ~preciom,
type = "scatter",
mode = "markers") %>%
layout(title = "Precio vs Área Construida",
xaxis = list(title = "Área Construida"),
yaxis = list(title = "Precio (millones)"))
Relación entre precio y estrato
El precio tiende a incrementarse conforme aumenta el estrato socioeconómico. No obstante, la dispersión dentro de cada estrato es considerable, lo que indica que el estrato por sí solo no explica completamente el valor de la vivienda, pero sí aporta información relevante.
############################################################
# Precio vs Estrato
############################################################
plot_ly(base1_dep,
x = ~estrato,
y = ~preciom,
type = "scatter",
mode = "markers") %>%
layout(title = "Precio vs Estrato",
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio (millones)"))
Relación entre precio y número de baños
Se observa una tendencia creciente entre el número de baños y el precio. Sin embargo, la variabilidad dentro de cada categoría es amplia, especialmente en viviendas con 3 o más baños.
Esto sugiere que el número de baños captura parcialmente la calidad o tamaño de la vivienda, pero podría estar correlacionado con el área construida.
############################################################
# Precio vs Baños
############################################################
plot_ly(base1_dep,
x = ~banios,
y = ~preciom,
type = "scatter",
mode = "markers") %>%
layout(title = "Precio vs Número de Baños",
xaxis = list(title = "Baños"),
yaxis = list(title = "Precio (millones)"))
Habitaciones y parqueaderos
La relación entre habitaciones y precio es más débil que la observada con baños y área. Esto puede deberse a que el número de habitaciones no siempre refleja lujo o calidad, sino simplemente distribución interna.
En el caso de parqueaderos, la relación positiva es moderada, aunque se observan valores atípicos con múltiples parqueaderos que no necesariamente presentan precios proporcionalmente altos.
############################################################
# Precio vs Habitaciones
############################################################
plot_ly(base1_dep,
x = ~habitaciones,
y = ~preciom,
type = "scatter",
mode = "markers") %>%
layout(title = "Precio vs Habitaciones",
xaxis = list(title = "Habitaciones"),
yaxis = list(title = "Precio (millones)"))
############################################################
# Precio vs Parqueaderos
############################################################
plot_ly(base1_dep,
x = ~parqueaderos,
y = ~preciom,
type = "scatter",
mode = "markers") %>%
layout(title = "Precio vs Parqueaderos",
xaxis = list(title = "Parqueaderos"),
yaxis = list(title = "Precio (millones)"))
Estimación del modelo completo
Se estimó un modelo de regresión lineal múltiple incluyendo como variables explicativas el área construida, el estrato, el número de baños, el número de habitaciones y el número de parqueaderos.
El modelo resultó globalmente significativo (p < 0.001) y presenta un R² de 0.606, lo que indica que aproximadamente el 60% de la variación en el precio de las viviendas es explicada por las variables incluidas.
En términos de magnitud e impacto estadístico, el área construida es la variable que mayor influencia tiene sobre el precio, seguida del estrato socioeconómico. Asimismo, el número de baños y parqueaderos también muestran efectos significativos.
Por otro lado, la variable habitaciones no resultó estadísticamente significativa (p = 0.368). Esto sugiere que, una vez se controla por área y otras características de calidad de la vivienda, el número de habitaciones no aporta información adicional relevante para explicar el precio.
Este comportamiento es consistente con el análisis exploratorio previo, donde se observó una relación entre habitaciones y baños, lo que podría estar reflejando cierto grado de redundancia entre estas variables.
############################################################
# Modelo completo - Casas Zona Norte
############################################################
modelo_full <- lm(preciom ~ areaconst + estrato + banios +
habitaciones + parqueaderos,
data = base1_dep)
summary(modelo_full)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones +
## parqueaderos, data = base1_dep)
##
## Residuals:
## Min 1Q Median 3Q Max
## -788.3 -72.4 -13.7 43.7 976.2
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -221.2054 47.6581 -4.64 0.0000047356029 ***
## areaconst 0.6849 0.0562 12.18 < 0.0000000000000002 ***
## estrato 75.1539 10.6103 7.08 0.0000000000066 ***
## banios 21.9749 8.2636 2.66 0.0082 **
## habitaciones 5.4529 6.0529 0.90 0.3682
## parqueaderos 25.4155 6.1236 4.15 0.0000408016681 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 157 on 389 degrees of freedom
## (208 observations deleted due to missingness)
## Multiple R-squared: 0.606, Adjusted R-squared: 0.601
## F-statistic: 120 on 5 and 389 DF, p-value: <0.0000000000000002
Indicadores clave de ajuste
############################################################
# Indicadores de ajuste
############################################################
r2 <- summary(modelo_full)$r.squared
r2_adj <- summary(modelo_full)$adj.r.squared
cat("R2:", round(r2, 3), "\n")
## R2: 0.606
cat("R2 ajustado:", round(r2_adj, 3), "\n")
## R2 ajustado: 0.601
AIC(modelo_full)
## [1] 5125
BIC(modelo_full)
## [1] 5153
Modelo Parsimonioso
Dado que la variable habitaciones no resultó estadísticamente significativa en el modelo completo, se estimó un modelo parsimonioso excluyéndola.
El nuevo modelo mantiene un nivel de ajuste prácticamente igual (R² = 0.605 frente a 0.606 del modelo completo) y presenta un AIC ligeramente menor (5124 vs 5125), lo que indica una mejora marginal en términos de parsimonia.
En consecuencia, se opta por el modelo reducido, ya que logra una capacidad explicativa similar utilizando un menor número de parámetros, lo cual es consistente con el principio de simplicidad en la modelación.
modelo_reducido <- lm(preciom ~ areaconst + estrato +
banios + parqueaderos,
data = base1_dep)
summary(modelo_reducido)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + parqueaderos,
## data = base1_dep)
##
## Residuals:
## Min 1Q Median 3Q Max
## -779.7 -74.7 -14.2 43.6 983.3
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -201.5857 42.3808 -4.76 0.0000027772336 ***
## areaconst 0.6978 0.0544 12.84 < 0.0000000000000002 ***
## estrato 72.3505 10.1412 7.13 0.0000000000048 ***
## banios 25.9666 6.9736 3.72 0.00023 ***
## parqueaderos 25.5147 6.1212 4.17 0.0000378385056 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 157 on 390 degrees of freedom
## (208 observations deleted due to missingness)
## Multiple R-squared: 0.605, Adjusted R-squared: 0.601
## F-statistic: 149 on 4 and 390 DF, p-value: <0.0000000000000002
AIC(modelo_full, modelo_reducido)
## df AIC
## modelo_full 7 5125
## modelo_reducido 6 5124
Selección del modelo final
Con el objetivo de mantener un modelo más simple, se decidió eliminar la variable número de habitaciones, ya que no resultó estadísticamente significativa en el modelo completo.
Al comparar ambos modelos se observa que el R² ajustado permanece igual (0.601) y que el AIC disminuye ligeramente en el modelo reducido (5124 frente a 5125). Además, todas las variables que permanecen en el modelo son estadísticamente significativas.
Esto indica que la variable habitaciones no aporta información adicional relevante una vez se controla por área construida, estrato, baños y parqueaderos.
Por lo tanto, se adopta como modelo final el modelo reducido:
Precio=f(Área + Estrato + Baños + Parqueaderos)
Este modelo mantiene prácticamente la misma capacidad explicativa, pero con una estructura más sencilla y consistente con el principio de parsimonia.
Linealidad y Homocedasticidad
En el gráfico Residuals vs Fitted se observa que los residuos se distribuyen alrededor de cero y no presentan un patrón claramente curvo, lo que sugiere que la forma lineal del modelo es adecuada para describir la relación entre las variables.
No obstante, en el gráfico Scale-Location se aprecia que la dispersión de los residuos tiende a aumentar ligeramente a medida que crecen los valores ajustados. Esto indica un posible comportamiento de heterocedasticidad leve, particularmente en viviendas de mayor precio.
En resumen, la suposición de linealidad parece cumplirse, se evidencia un ligero aumento en la variabilidad para precios más altos.Este comportamiento es frecuente en modelos del mercado inmobiliario, donde las viviendas de mayor valor suelen presentar mayor dispersión en los precios.
Como alternativa metodológica, podría evaluarse en futuros análisis el uso de una transformación logarítmica del precio o estimadores robustos. Sin embargo, para los propósitos de este ejercicio, se mantiene el modelo en su forma original.
############################################################
# Diagnósticos gráficos básicos
############################################################
par(mfrow=c(2,2))
plot(modelo_reducido)
Normalidad de los residuos
En el gráfico Q-Q se observa que los residuos siguen de manera razonable la línea teórica en la parte central de la distribución. Sin embargo, en las colas se presentan desviaciones más marcadas, especialmente en los valores extremos.
El test de Shapiro-Wilk arroja un estadístico 𝑊=0.83 con un p-valor < 0.001, lo que lleva a rechazar formalmente la hipótesis de normalidad estricta.
No obstante, es importante considerar que el tamaño de la muestra es relativamente grande, y en estos casos este tipo de pruebas tiende a detectar como significativas incluso pequeñas desviaciones respecto a la normalidad.
En este análisis se observa que la distribución es aproximadamente simétrica en la zona central. Las principales desviaciones se concentran en las colas, asociadas a viviendas de precio muy alto o muy bajo. Por lo tanto, aunque la normalidad no se cumple de manera estricta, esta situación no invalida el modelo. Sin embargo, debe mencionarse como una limitación y tenerse en cuenta al interpretar los resultados.
############################################################
# Histograma residuos
############################################################
hist(residuals(modelo_reducido),
main="Histograma de Residuos",
col="lightblue")
############################################################
# Test de normalidad
############################################################
shapiro.test(residuals(modelo_reducido))
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo_reducido)
## W = 0.83, p-value <0.0000000000000002
Observaciones Influyentes
El análisis de la distancia de Cook permitió identificar algunas observaciones potencialmente influyentes, en particular los registros 411, 316 y 518.
La observación 518 destaca especialmente, ya que presenta un leverage alto (0.186) y una distancia de Cook cercana a 1.38, lo que indica que podría estar ejerciendo una influencia importante sobre la estimación de los coeficientes del modelo.
Sin embargo, en este ejercicio no se procedió a eliminar ninguna observación. Se considera más apropiado documentar su existencia como parte del diagnóstico del modelo.
Es posible que estos registros correspondan a propiedades atípicas, por ejemplo viviendas de alto valor o con características poco comunes, lo cual es consistente con la naturaleza del mercado inmobiliario.
influencePlot(modelo_reducido, id.method="identify")
## StudRes Hat CookD
## 315 -1.478 0.127989 0.06397
## 316 6.228 0.007228 0.05149
## 411 6.705 0.032429 0.27085
## 518 -5.716 0.186573 1.38628
Conclusion de la validación
En términos generales, el modelo cumple de manera razonable los supuestos principales de la regresión lineal. No obstante, se identifican algunos aspectos que vale la pena tener en cuenta:
Se observa una leve heterocedasticidad en viviendas de mayor precio.
La normalidad no se cumple estrictamente en las colas de la distribución.
Existen algunas observaciones potencialmente influyentes asociadas a valores extremos.
Aunque estas situaciones no invalidan el modelo, sí deben considerarse al momento de interpretar los resultados y, especialmente, al realizar predicciones para viviendas de alto valor.
Intervalo de confianza (media):
############################################################
# Predicción Vivienda 1 - Estrato 4 y 5
############################################################
nueva_viv_4 <- data.frame(
areaconst = 200,
estrato = 4,
banios = 2,
parqueaderos = 1
)
nueva_viv_5 <- data.frame(
areaconst = 200,
estrato = 5,
banios = 2,
parqueaderos = 1
)
pred_4 <- predict(modelo_reducido, nueva_viv_4, interval = "confidence")
pred_5 <- predict(modelo_reducido, nueva_viv_5, interval = "confidence")
pred_4
## fit lwr upr
## 1 304.8 278.9 330.8
pred_5
## fit lwr upr
## 1 377.2 345 409.4
Intervalo de predicción (vivienda individual):
pred_4_pred <- predict(modelo_reducido, nueva_viv_4, interval = "prediction")
pred_5_pred <- predict(modelo_reducido, nueva_viv_5, interval = "prediction")
pred_4_pred
## fit lwr upr
## 1 304.8 -5.453 615.1
pred_5_pred
## fit lwr upr
## 1 377.2 66.31 688.1
Predicción Vivienda 1
Se estimó el precio para una vivienda tipo casa de 200 m², con 2 baños y 1 parqueadero, ubicada en la zona norte, considerando las dos opciones de estrato solicitadas (4 y 5).
Para estrato 4, el modelo arroja una estimación aproximada de 304.8 millones de pesos, valor que se encuentra dentro del crédito preaprobado de 350 millones. El intervalo de confianza ubica el precio esperado entre 278.9 y 330.8 millones, lo cual refuerza que esta alternativa es financieramente viable.
Por otro lado, para estrato 5 la estimación puntual es de 377.2 millones, superando el presupuesto disponible. Incluso el límite inferior del intervalo de confianza se acerca bastante al monto máximo financiable, lo que implica un mayor riesgo de exceder la capacidad crediticia.
En este contexto, la opción en estrato 4 resulta más coherente con el presupuesto aprobado y ofrece un menor nivel de riesgo financiero.
############################################################
# Filtro de ofertas potenciales - Vivienda 1
############################################################
ofertas_v1 <- base1_dep %>%
filter(preciom <= 350) %>%
filter(estrato == 4) %>%
filter(banios >= 2) %>%
filter(parqueaderos >= 1) %>%
filter(areaconst >= 150 & areaconst <= 250) %>%
arrange(abs(areaconst - 200))
head(ofertas_v1, 10)
## # A tibble: 7 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1144 Zona N… <NA> 4 320 200 2 4 4
## 2 1644 Zona N… 01 4 270 171 3 4 4
## 3 464 Zona N… 02 4 330 165 1 4 4
## 4 4471 Zona N… 02 4 340 162 1 4 4
## 5 94 Zona N… 02 4 265 162 1 3 4
## 6 3586 Zona N… 01 4 330 240 1 2 3
## 7 1020 Zona N… 02 4 230 250 2 3 5
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
# Seleccionar mínimo 5
ofertas_v1_seleccion <- head(ofertas_v1, 5)
ofertas_v1_seleccion
## # A tibble: 5 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1144 Zona N… <NA> 4 320 200 2 4 4
## 2 1644 Zona N… 01 4 270 171 3 4 4
## 3 464 Zona N… 02 4 330 165 1 4 4
## 4 4471 Zona N… 02 4 340 162 1 4 4
## 5 94 Zona N… 02 4 265 162 1 3 4
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
#Mapa
library(leaflet)
leaflet(ofertas_v1_seleccion) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud,
lat = ~latitud,
popup = ~paste0(
"Precio: ", preciom, " millones<br>",
"Área: ", areaconst, " m²<br>",
"Baños: ", banios, "<br>",
"Parqueaderos: ", parqueaderos
),
radius = 6,
color = "blue"
)
Con base en el modelo de regresión estimado y en la revisión de las ofertas disponibles en el mercado, la estimación para una vivienda tipo en estrato 4 se sitúa alrededor de 304 millones de pesos, valor que resulta coherente con las propiedades reales identificadas en la base de datos.
Además, se encontraron varias alternativas que se ajustan al presupuesto de 350 millones, lo que indica que existe oferta suficiente dentro de este rango de precio.
En este contexto, el estrato 4 se presenta como una opción financieramente viable y alineada con el comportamiento observado del mercado en la zona norte.
Por lo tanto, se recomienda enfocar la búsqueda en casas de estrato 4, priorizando áreas entre 170 y 210 m², donde se observa mayor concentración de oferta dentro del rango presupuestal aprobado.
Para el segundo caso se realizó un filtro considerando únicamente viviendas tipo apartamento ubicadas en la Zona Sur, obteniendo un total de 2787 registros.
La tabla de verificación entre las variables tipo y zona confirma que todos los registros corresponden efectivamente a apartamentos en la zona sur, lo que indica que el filtro fue aplicado correctamente.
############################################################
# CASO 2 – Vivienda 2
# Filtro: Apartamentos Zona Sur
############################################################
#Crear base2
base2 <- vivienda %>%
filter(tipo == "Apartamento",
zona == "Zona Sur")
# Tamaño de la base
n_base2 <- nrow(base2)
# Tabla de verificación tipo y zona
tabla_verif <- table(base2$tipo, base2$zona)
# Primeros registros
primeros_base2 <- head(base2, 3)
# Mostrar resultados
cat("### Caso 2 – Base filtrada: Apartamentos en Zona Sur\n\n")
## ### Caso 2 – Base filtrada: Apartamentos en Zona Sur
cat("Número de registros:", n_base2, "\n\n")
## Número de registros: 2787
cat("### Verificación tipo vs zona\n\n")
## ### Verificación tipo vs zona
tabla_verif
##
## Zona Sur
## Apartamento 2787
cat("\n\n### Primeros 3 registros\n\n")
##
##
## ### Primeros 3 registros
DT::datatable(primeros_base2, options = list(scrollX = TRUE))
Validación geográfica de la clasificación por zona
Al visualizar los puntos en el mapa se observa que, aunque existe una fuerte concentración en el sur de la ciudad, también aparecen algunas observaciones ubicadas en sectores más centrales e incluso hacia el norte. Esto sugiere que la variable categórica zona podría presentar inconsistencias de clasificación, o que los límites geográficos no son estrictamente precisos.
Por esta razón, se considera pertinente realizar una validación adicional utilizando la variable latitud como criterio cuantitativo complementario, con el fin de depurar posibles registros mal clasificados.
leaflet(base2) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud,
lat = ~latitud,
radius = 4,
color = "red"
)
Análisis de latitud
El análisis descriptivo de la latitud muestra que la mayor concentración de apartamentos se encuentra entre 3.37 y 3.41, con una mediana de 3.38. No obstante, se identifican valores que alcanzan hasta 3.50, lo cual geográficamente corresponde a sectores más centrales e incluso del norte de la ciudad.
Esta dispersión sugiere que, aunque el filtro categórico por “Zona Sur” fue aplicado correctamente, podrían existir observaciones cuya ubicación real no corresponde estrictamente al sur de la ciudad.
############################################################
# Análisis de latitud –
############################################################
summary(base2$latitud)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3.33 3.37 3.38 3.39 3.41 3.50
quantile(base2$latitud, probs = c(0,0.25,0.5,0.75,1))
## 0% 25% 50% 75% 100%
## 3.334 3.370 3.383 3.406 3.497
hist(base2$latitud,
col = "lightblue",
main = "Distribución de Latitud - Apto Zona Sur",
xlab = "Latitud")
Depuración geográfica basada en latitud
Con el fin de garantizar coherencia espacial en el análisis y trabajar únicamente con apartamentos efectivamente ubicados en el sur de Cali, se adoptó un criterio de depuración basado en la distribución empírica de la latitud.
Dado que el tercer cuartil se sitúa en 3.406 y que el bloque principal de concentración parece finalizar alrededor de 3.41, se estableció como punto de corte una latitud máxima de 3.43.
Este criterio permite eliminar observaciones potencialmente mal clasificadas hacia zonas centrales o del norte, manteniendo una submuestra geográficamente más homogénea para la estimación del modelo.
Aplicando este filtro, la base se redujo de 2787 a 2503 registros (≈10% de las observaciones), lo que indica una depuración moderada orientada a mejorar la consistencia espacial sin afectar significativamente el tamaño muestral.
base2_dep <- base2 %>%
filter(latitud <= 3.43)
nrow(base2)
## [1] 2787
nrow(base2_dep)
## [1] 2503
En la base depurada de apartamentos en zona sur, el precio presenta correlaciones positivas altas con área construida (0.74), baños (0.71) y parqueaderos (0.72), y una relación moderada con estrato (0.65). En contraste, habitaciones (0.29) muestra una asociación más débil con el precio, lo que sugiere que su aporte puede ser menor una vez se controla por tamaño y características de calidad.
############################################################
# Correlación - Apartamentos Zona Sur depurada
############################################################
vars_modelo2 <- base2_dep %>%
select(preciom, areaconst, estrato, banios, habitaciones, parqueaderos)
cor_matrix2 <- cor(vars_modelo2, use = "complete.obs")
round(cor_matrix2, 2)
## preciom areaconst estrato banios habitaciones parqueaderos
## preciom 1.00 0.74 0.65 0.71 0.29 0.72
## areaconst 0.74 1.00 0.45 0.66 0.40 0.60
## estrato 0.65 0.45 1.00 0.54 0.17 0.51
## banios 0.71 0.66 0.54 1.00 0.51 0.57
## habitaciones 0.29 0.40 0.17 0.51 1.00 0.23
## parqueaderos 0.72 0.60 0.51 0.57 0.23 1.00
Relación entre precio y área construida
El gráfico muestra una relación claramente creciente entre el área construida y el precio de los apartamentos en la zona sur. La tendencia general es lineal positiva: a mayor tamaño del inmueble, mayor valor de mercado. Se observa mayor concentración de datos entre 50 y 250 m², donde el comportamiento es bastante consistente.
Sin embargo, a partir de áreas superiores a 300 m² aumenta la dispersión y aparecen algunos valores atípicos, tanto en precios elevados como en áreas inusualmente grandes. Estos puntos extremos podrían influir en la estimación del modelo y deberán considerarse en la validación de supuestos.
plot_ly(base2_dep,
x = ~areaconst,
y = ~preciom,
type = "scatter",
mode = "markers",
opacity = 0.5) %>%
layout(title = "Precio vs Área Construida (Aptos Zona Sur)",
xaxis = list(title = "Área construida (m²)"),
yaxis = list(title = "Precio (millones)"))
Relación entre precio y estrato
Se evidencia una tendencia creciente del precio conforme aumenta el estrato socioeconómico. Los apartamentos en estrato 6 presentan, en promedio, valores significativamente superiores a los de estratos 3 y 4, lo que confirma la influencia de la localización y el nivel socioeconómico en la formación del precio.
No obstante, dentro de cada estrato existe dispersión considerable, especialmente en estratos 5 y 6. Esto indica que, aunque el estrato aporta información relevante, por sí solo no explica completamente la variabilidad del precio.
plot_ly(base2_dep,
x = ~estrato,
y = ~preciom,
type = "scatter",
mode = "markers",
opacity = 0.5) %>%
layout(title = "Precio vs Estrato (Aptos Zona Sur)",
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio (millones)"))
Relación entre precio y número de baños
Se observa una relación positiva entre el número de baños y el precio del inmueble. A medida que aumentan los baños, el rango de precios tiende a desplazarse hacia valores más altos, especialmente a partir de 3 y 4 baños.
Sin embargo, la variabilidad dentro de cada categoría es amplia, lo que sugiere que el número de baños captura parcialmente características asociadas al tamaño o calidad del apartamento, pero no determina de manera aislada su valor.
plot_ly(base2_dep,
x = ~banios,
y = ~preciom,
type = "scatter",
mode = "markers",
opacity = 0.5) %>%
layout(title = "Precio vs Número de Baños (Aptos Zona Sur)",
xaxis = list(title = "Baños"),
yaxis = list(title = "Precio (millones)"))
Relación entre precio y número de habitaciones
La relación entre habitaciones y precio es positiva, pero menos marcada que la observada con área o baños. Aunque los apartamentos con mayor número de habitaciones tienden a presentar precios más altos, existe superposición considerable entre categorías.
Esto sugiere que el número de habitaciones no necesariamente refleja lujo o calidad, sino más bien distribución interna, y podría estar altamente correlacionado con el área construida.
plot_ly(base2_dep,
x = ~habitaciones,
y = ~preciom,
type = "scatter",
mode = "markers",
opacity = 0.5) %>%
layout(title = "Precio vs Habitaciones (Aptos Zona Sur)",
xaxis = list(title = "Habitaciones"),
yaxis = list(title = "Precio (millones)"))
Relación entre precio y parqueaderos
El gráfico muestra una relación positiva moderada entre el número de parqueaderos y el precio. En general, los apartamentos con más parqueaderos tienden a ubicarse en rangos de precio superiores, lo cual es coherente con el segmento de mercado de mayor valor.
Sin embargo, se observan algunos valores atípicos con múltiples parqueaderos que no presentan precios proporcionalmente altos, lo que indica que esta variable complementa la explicación del precio, pero no lo determina de manera independiente.
plot_ly(base2_dep,
x = ~parqueaderos,
y = ~preciom,
type = "scatter",
mode = "markers",
opacity = 0.5) %>%
layout(title = "Precio vs Parqueaderos (Aptos Zona Sur)",
xaxis = list(title = "Parqueaderos"),
yaxis = list(title = "Precio (millones)"))
Se estimó un modelo de regresión lineal múltiple para los apartamentos ubicados en la zona sur, considerando como variables explicativas el área construida, el estrato socioeconómico, el número de baños, el número de habitaciones y el número de parqueaderos.
El modelo resultó globalmente significativo (p < 0.001), lo que indica que, en conjunto, las variables incluidas sí aportan información relevante para explicar el comportamiento del precio.
El R² obtenido es 0.751 y el R² ajustado es 0.750, lo que significa que aproximadamente el 75% de la variación en el precio de los apartamentos es explicada por el modelo. Este nivel de ajuste es alto y, además, superior al observado en el Caso 1, lo que sugiere que en la zona sur las variables estructurales capturan mejor la dinámica de precios.
En cuanto a los coeficientes estimados:
El área construida tiene un efecto positivo y altamente significativo (β = 1.20, p < 0.001). En términos prácticos, un metro cuadrado adicional incrementa el precio en aproximadamente 1.2 millones de pesos, manteniendo constantes las demás variables.
El estrato también presenta un efecto positivo importante (β = 57.83, p < 0.001), lo que confirma que el componente socioeconómico influye de manera significativa en la formación del precio.
El número de baños muestra un efecto positivo y significativo (β = 49.41, p < 0.001), coherente con la valorización de inmuebles con mayor comodidad.
Los parqueaderos presentan uno de los efectos más altos (β = 84.94, p < 0.001), lo cual es lógico en este segmento del mercado, donde la disponibilidad de parqueo suele ser un factor diferenciador.
En el caso de habitaciones, aunque el coeficiente es estadísticamente significativo (p < 0.001), el signo es negativo (β = −23.01).
El signo negativo en habitaciones indica que, manteniendo constante el área total, un mayor número de habitaciones puede asociarse con una ligera disminución en el precio. Esto puede interpretarse como un efecto de distribución del espacio: si el área es la misma, dividirla en más habitaciones puede implicar espacios más reducidos, lo cual podría afectar la percepción de amplitud del inmueble.
Este resultado también es consistente con el análisis exploratorio previo, donde se observó que habitaciones tenía una relación menos directa con el precio y podría estar capturando parte del efecto ya explicado por el área construida.
############################################################
# Modelo completo - Apartamentos Zona Sur
############################################################
modelo2_full <- lm(preciom ~ areaconst + estrato + banios +
habitaciones + parqueaderos,
data = base2_dep)
summary(modelo2_full)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones +
## parqueaderos, data = base2_dep)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1017.8 -43.0 -2.4 40.8 929.2
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -258.8331 16.4815 -15.70 < 0.0000000000000002 ***
## areaconst 1.2042 0.0563 21.38 < 0.0000000000000002 ***
## estrato 57.8330 3.2495 17.80 < 0.0000000000000002 ***
## banios 49.4115 3.5546 13.90 < 0.0000000000000002 ***
## habitaciones -23.0106 4.1166 -5.59 0.000000026 ***
## parqueaderos 84.9355 4.4143 19.24 < 0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 97.9 on 2147 degrees of freedom
## (350 observations deleted due to missingness)
## Multiple R-squared: 0.751, Adjusted R-squared: 0.75
## F-statistic: 1.29e+03 on 5 and 2147 DF, p-value: <0.0000000000000002
Indicadores clave de ajuste
############################################################
# Indicadores de ajuste
############################################################
r2_2 <- summary(modelo2_full)$r.squared
r2_adj_2 <- summary(modelo2_full)$adj.r.squared
cat("R2:", round(r2_2, 3), "\n")
## R2: 0.751
cat("R2 ajustado:", round(r2_adj_2, 3), "\n")
## R2 ajustado: 0.75
AIC(modelo2_full)
## [1] 25856
BIC(modelo2_full)
## [1] 25896
Selección del modelo final
Dado que todas las variables incluidas en el modelo completo resultaron estadísticamente significativas y que el R² ajustado es alto (0.750), se mantiene el modelo completo como especificación final.
El modelo adoptado es:
Precio=f(Área + Estrato + Baños + Habitaciones + Parqueaderos)
Este modelo presenta una capacidad explicativa elevada y mantiene coherencia con la teoría económica del mercado inmobiliario, donde tanto el tamaño, la localización socioeconómica como las características internas del inmueble influyen en la formación del precio.
Linealidad y Homocedasticidad
En el gráfico Residuals vs Fitted los residuos se distribuyen alrededor de cero y no se observa un patrón claramente curvo. Esto sugiere que la relación lineal planteada en el modelo es razonable para explicar el precio a partir de las variables incluidas.
No obstante, al observar la dispersión de los residuos, se nota que esta tiende a aumentar cuando los valores ajustados son más altos. En el gráfico Scale-Location también se percibe esta tendencia creciente, lo que indica que la variabilidad del error no es completamente constante.
En otras palabras, para apartamentos de mayor precio la dispersión es mayor, lo cual es bastante habitual en el mercado inmobiliario, donde los inmuebles más costosos suelen presentar más diferencias en características y negociación.
En síntesis:
La linealidad del modelo parece adecuada.
Se observa heterocedasticidad moderada en los precios más altos.
El modelo sigue siendo útil, aunque la varianza no es perfectamente constante.
Si se quisiera mejorar este aspecto, podría evaluarse una transformación logarítmica del precio o el uso de errores estándar robustos. Sin embargo, para los fines de este análisis, el modelo mantiene una capacidad explicativa adecuada.
############################################################
# Diagnósticos gráficos básicos
############################################################
par(mfrow=c(2,2))
plot(modelo2_full)
Normalidad de los residuos
En el gráfico Q-Q se observa que los residuos siguen de manera razonable la línea teórica en la parte central de la distribución. No obstante, se presentan desviaciones marcadas en ambas colas, particularmente en los valores extremos.
El test de Shapiro-Wilk arroja un estadístico W = 0.78 con un p-valor < 0.001, lo que implica el rechazo formal de la hipótesis de normalidad estricta. Sin embargo, dado el tamaño de la muestra (más de 2.000 observaciones), este tipo de prueba tiende a detectar como significativas incluso pequeñas desviaciones. En términos prácticos, la distribución es aproximadamente simétrica en la zona central, y las principales desviaciones se concentran en observaciones asociadas a apartamentos atípicos de muy alto o muy bajo precio.
Por lo tanto, aunque la normalidad no se cumple de manera estricta, esta situación no invalida el modelo. No obstante, debe mencionarse como una limitación del análisis.
############################################################
# Histograma residuos
############################################################
hist(residuals(modelo2_full),
main="Histograma de Residuos",
col="lightblue")
############################################################
# Test de normalidad
############################################################
shapiro.test(residuals(modelo2_full))
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo2_full)
## W = 0.78, p-value <0.0000000000000002
Observaciones Influyentes
El análisis de la distancia de Cook permitió identificar algunas observaciones potencialmente influyentes, en particular los registros 886, 917, 1393 y 2151.
La observación 2151 destaca de manera importante, ya que presenta un leverage elevado (0.23) y una distancia de Cook cercana a 6.99, valor considerablemente alto que indica una fuerte influencia sobre la estimación de los coeficientes.
Las observaciones 886 y 917 también muestran niveles de influencia relevantes, aunque de menor magnitud. En el caso de 1393, se observa un residuo studentizado alto, aunque con leverage relativamente bajo.
Estas observaciones probablemente corresponden a apartamentos con características extremas (áreas muy grandes, precios muy elevados o combinaciones poco frecuentes de atributos), lo cual es consistente con la naturaleza del mercado inmobiliario.
En este ejercicio no se procedió a eliminar ninguna observación. Se considera más apropiado documentar su existencia como parte del diagnóstico del modelo.
library(car)
influencePlot(modelo2_full, id.method="identify")
## StudRes Hat CookD
## 886 -7.924 0.097367 1.0973
## 917 -2.988 0.164757 0.2925
## 1393 9.733 0.007537 0.1149
## 2151 -12.253 0.230077 6.9922
Conclusion de la validación
En términos generales, el modelo para apartamentos en la zona sur cumple de manera razonable los supuestos principales de la regresión lineal. No obstante, se identifican aspectos relevantes:
Se presenta heterocedasticidad moderada, especialmente en precios altos.
La normalidad estricta no se cumple, particularmente en las colas de la distribución.
Existen observaciones influyentes, destacando el registro 2151.
Estas situaciones no invalidan el modelo, pero sí deben considerarse al interpretar los coeficientes y, especialmente, al realizar predicciones para apartamentos de alto valor.
Especificación alternativa (modelo log-lineal)
Alternativa: modelo log-lineal
Con el fin de mejorar el comportamiento de los residuos observado en el modelo lineal inicial, se estimó una versión alternativa utilizando el logaritmo del precio como variable dependiente.
Este modelo también resultó globalmente significativo (p < 0.001) y presentó un R² ajustado de 0.793, superior al 0.750 obtenido en el modelo original. Esto indica que, al modelar el precio en términos logarítmicos, se logra explicar una mayor proporción de la variabilidad observada.
En esta versión, los coeficientes pueden interpretarse aproximadamente como cambios porcentuales en el precio. Los resultados muestran que el área construida, el estrato, el número de baños y el número de parqueaderos mantienen efectos positivos y estadísticamente significativos.
En términos prácticos:
Un metro cuadrado adicional incrementa el precio en aproximadamente 0.22%.
Un aumento en el estrato se asocia con un incremento cercano al 23%.
Un baño adicional aumenta el precio alrededor de un 12%.
Un parqueadero adicional incrementa el precio aproximadamente en 17%.
Por su parte, la variable habitaciones no resultó significativa (p = 0.23), lo que sugiere que, una vez controlado el tamaño y otras características del inmueble, el número de habitaciones no aporta información adicional relevante.
Linealidad y Homocedasticidad
En el gráfico Residuals vs Fitted se observa una distribución más estable de los residuos en comparación con el modelo lineal inicial. No se aprecia un patrón curvo claro, lo que indica que la forma funcional adoptada describe adecuadamente la relación entre las variables.
En el gráfico Scale-Location la dispersión se mantiene más uniforme a lo largo de los valores ajustados. Aunque aún existe cierta variabilidad en precios altos, el patrón de heterocedasticidad es menos marcado que en el modelo anterior.
En conjunto, la transformación logarítmica mejora el comportamiento del modelo frente al supuesto de varianza constante.
Normalidad de residuos
El gráfico Q-Q muestra una mejor alineación con la línea teórica en la parte central de la distribución. Aunque persisten algunas desviaciones en las colas, estas son menos evidentes que en el modelo lineal original.
Esto sugiere una mejora en la aproximación a la normalidad, especialmente en el rango donde se concentra la mayoría de los datos.
Observaciones influyentes
El análisis de leverage y distancia de Cook continúa señalando algunas observaciones potencialmente influyentes, particularmente los registros 886 y 2151.
En especial, el registro 2151 presenta un nivel de influencia relativamente alto. Sin embargo, este tipo de casos es común en el mercado inmobiliario, donde pueden existir propiedades con características o precios atípicos.
No se eliminaron observaciones, ya que forman parte de la realidad del mercado; simplemente se documenta su efecto dentro del diagnóstico del modelo.
############################################################
# Modelo log-lineal - Apartamentos Zona Sur
############################################################
modelo2_log <- lm(log(preciom) ~ areaconst + estrato +
banios + habitaciones + parqueaderos,
data = base2_dep)
summary(modelo2_log)
##
## Call:
## lm(formula = log(preciom) ~ areaconst + estrato + banios + habitaciones +
## parqueaderos, data = base2_dep)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.8162 -0.1434 0.0074 0.1461 0.7789
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.763292 0.037392 100.64 <0.0000000000000002 ***
## areaconst 0.002231 0.000128 17.46 <0.0000000000000002 ***
## estrato 0.232913 0.007372 31.59 <0.0000000000000002 ***
## banios 0.124518 0.008064 15.44 <0.0000000000000002 ***
## habitaciones -0.011160 0.009339 -1.19 0.23
## parqueaderos 0.169864 0.010015 16.96 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.222 on 2147 degrees of freedom
## (350 observations deleted due to missingness)
## Multiple R-squared: 0.793, Adjusted R-squared: 0.793
## F-statistic: 1.65e+03 on 5 and 2147 DF, p-value: <0.0000000000000002
Comparación de ajuste
############################################################
# Comparación de modelos
############################################################
summary(modelo2_full)$adj.r.squared
## [1] 0.7501
summary(modelo2_log)$adj.r.squared
## [1] 0.7927
AIC(modelo2_full, modelo2_log)
## df AIC
## modelo2_full 7 25856.4
## modelo2_log 7 -360.9
par(mfrow=c(2,2))
plot(modelo2_log)
Conclusión comparativa de modelos
Al comparar ambos modelos, el modelo log-lineal muestra:
Un mayor R² ajustado.
Mejor comportamiento de los residuos.
Menor evidencia de heterocedasticidad.
Una interpretación más natural en términos porcentuales.
Por estas razones, se adopta el modelo log-lineal como modelo final para realizar las predicciones y recomendaciones del caso.
############################################################
# Predicción Vivienda 2 (Apto Zona Sur) - Estrato 5 y 6
# Modelo log-lineal: log(preciom) ~ ...
############################################################
# 1) Nuevas viviendas (según enunciado)
nueva_viv2_5 <- data.frame(
areaconst = 300,
estrato = 5,
banios = 3,
habitaciones = 5,
parqueaderos = 3
)
nueva_viv2_6 <- data.frame(
areaconst = 300,
estrato = 6,
banios = 3,
habitaciones = 5,
parqueaderos = 3
)
# 2) Predicción en escala log (media)
pred_log_5_conf <- predict(modelo2_log, nueva_viv2_5, interval = "confidence")
pred_log_6_conf <- predict(modelo2_log, nueva_viv2_6, interval = "confidence")
pred_log_5_conf
## fit lwr upr
## 1 6.424 6.37 6.479
pred_log_6_conf
## fit lwr upr
## 1 6.657 6.602 6.712
# 3) Intervalo de predicción (en escala log)
pred_log_5_pred <- predict(modelo2_log, nueva_viv2_5, interval = "prediction")
pred_log_6_pred <- predict(modelo2_log, nueva_viv2_6, interval = "prediction")
pred_log_5_pred
## fit lwr upr
## 1 6.424 5.985 6.863
pred_log_6_pred
## fit lwr upr
## 1 6.657 6.218 7.096
# 4) Transformación a escala original con corrección de sesgo
# Factor de corrección: exp(sigma^2 / 2)
sigma <- summary(modelo2_log)$sigma
fc <- exp((sigma^2)/2)
# Media (confidence)
pred_5_mill <- exp(pred_log_5_conf) * fc
pred_6_mill <- exp(pred_log_6_conf) * fc
pred_5_mill
## fit lwr upr
## 1 632.1 598.5 667.5
pred_6_mill
## fit lwr upr
## 1 797.9 755 843.2
# Predicción individual (prediction)
pred_5_mill_pred <- exp(pred_log_5_pred) * fc
pred_6_mill_pred <- exp(pred_log_6_pred) * fc
pred_5_mill_pred
## fit lwr upr
## 1 632.1 407.5 980.4
pred_6_mill_pred
## fit lwr upr
## 1 797.9 514.3 1238
Se estimó el precio para un apartamento de 300 m², con 3 baños, 5 habitaciones y 3 parqueaderos, ubicado en la zona sur, considerando las dos alternativas de estrato solicitadas (5 y 6) y un crédito preaprobado de 850 millones de pesos.
Para estrato 5, el modelo log-lineal arroja una estimación puntual aproximada de 632.1 millones de pesos. El intervalo de confianza para el valor promedio esperado se ubica entre 598.5 y 667.5 millones, lo que indica que, en promedio, la vivienda se encuentra ampliamente dentro del presupuesto aprobado.
Para estrato 6, la estimación puntual asciende a 797.9 millones de pesos, con un intervalo de confianza entre 755.0 y 843.2 millones. En este caso, aunque el valor esperado es mayor, incluso el límite superior del intervalo de confianza se mantiene cercano pero aún dentro del crédito preaprobado de 850 millones.
Al analizar el intervalo de predicción —que refleja la posible variabilidad del precio de una vivienda individual— los rangos se amplían considerablemente. Para estrato 5 el precio podría ubicarse entre 407.5 y 980.4 millones, mientras que para estrato 6 el rango estimado se encuentra entre 514.3 y 1,238 millones.
Esto implica que, aunque el valor promedio estimado para ambos estratos se ajusta al presupuesto disponible, en el caso de estrato 6 existe un mayor riesgo de que propiedades específicas superen el monto financiable.
En consecuencia, desde una perspectiva de control de riesgo financiero, la alternativa en estrato 5 resulta más conservadora y presenta menor probabilidad de exceder el crédito preaprobado, mientras que la opción en estrato 6 ofrece un mayor nivel esperado de valorización y calidad, pero con una mayor exposición a variabilidad en el precio final.
############################################################
# Filtro de ofertas potenciales - Vivienda 2
############################################################
valor_estimado_v2_e5 <- 632
valor_estimado_v2_e6 <- 798
ofertas_v2 <- base2_dep %>%
filter(preciom <= 850) %>% # dentro del crédito
filter(estrato %in% c(5,6)) %>% # según solicitud
filter(banios >= 3) %>%
filter(parqueaderos >= 3) %>%
filter(habitaciones >= 5) %>%
filter(areaconst >= 240 & areaconst <= 360) %>% # rango cercano a 300
mutate(dif_modelo = case_when(
estrato == 5 ~ abs(preciom - valor_estimado_v2_e5),
estrato == 6 ~ abs(preciom - valor_estimado_v2_e6)
)) %>%
arrange(dif_modelo)
head(ofertas_v2, 10)
## # A tibble: 2 × 14
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 7512 Zona S… <NA> 5 670 300 3 5 6
## 2 8036 Zona S… <NA> 5 530 256 3 5 5
## # ℹ 5 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## # dif_modelo <dbl>
ofertas_v2_seleccion <- head(ofertas_v2, 5)
ofertas_v2_seleccion
## # A tibble: 2 × 14
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 7512 Zona S… <NA> 5 670 300 3 5 6
## 2 8036 Zona S… <NA> 5 530 256 3 5 5
## # ℹ 5 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## # dif_modelo <dbl>
############################################################
# Seleccionar ofertas (hasta 5) - Vivienda 2
############################################################
# Si tienes el valor objetivo (300 m2), ordena por cercanía a 300
ofertas_v2_seleccion <- ofertas_v2 %>%
arrange(abs(areaconst - 300)) %>%
head(5)
ofertas_v2_seleccion
## # A tibble: 2 × 14
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 7512 Zona S… <NA> 5 670 300 3 5 6
## 2 8036 Zona S… <NA> 5 530 256 3 5 5
## # ℹ 5 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## # dif_modelo <dbl>
############################################################
# Mapa con zoom automático
############################################################
leaflet(ofertas_v2_seleccion) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud, lat = ~latitud,
popup = ~paste0(
"<b>ID:</b> ", id, "<br>",
"<b>Precio:</b> ", preciom, " millones<br>",
"<b>Área:</b> ", areaconst, " m²<br>",
"<b>Estrato:</b> ", estrato, "<br>",
"<b>Habitaciones:</b> ", habitaciones, "<br>",
"<b>Baños:</b> ", banios, "<br>",
"<b>Parqueaderos:</b> ", parqueaderos
),
radius = 6, color = "blue", fillOpacity = 0.8
) %>%
fitBounds(
lng1 = min(ofertas_v2_seleccion$longitud, na.rm = TRUE),
lat1 = min(ofertas_v2_seleccion$latitud, na.rm = TRUE),
lng2 = max(ofertas_v2_seleccion$longitud, na.rm = TRUE),
lat2 = max(ofertas_v2_seleccion$latitud, na.rm = TRUE)
)
Con base en el modelo log-lineal estimado, el valor esperado para un apartamento de 300 m², con 3 baños, 5 habitaciones y 3 parqueaderos en la zona sur se sitúa aproximadamente en 632 millones para estrato 5 y 798 millones para estrato 6, valores que se encuentran dentro del crédito preaprobado de 850 millones de pesos.
Tomando como referencia esta estimación y considerando las restricciones establecidas (estrato 5 o 6, mínimo 3 baños, 3 parqueaderos, 5 habitaciones y área cercana a 300 m²), se realizó un filtrado en la base de datos de ofertas disponibles en el mercado.
Como resultado, únicamente dos propiedades cumplen simultáneamente con todas las condiciones solicitadas dentro del rango presupuestal aprobado. Este resultado sugiere que el segmento de apartamentos de alto estándar en la zona sur, con estas características específicas, presenta una oferta relativamente limitada.
El análisis geográfico muestra que ambas alternativas se encuentran en sectores consolidados de la zona sur, lo cual es consistente con el perfil socioeconómico requerido.
Desde el punto de vista estratégico, la oferta en estrato 5 (aproximadamente 670 millones) se ubica por debajo del valor estimado por el modelo para estrato 6 y ofrece un amplio margen respecto al presupuesto disponible.
La segunda alternativa también se mantiene dentro del rango financiero, aunque con menor dispersión en opciones comparables.
En contraste con la Vivienda 1 —donde se observó mayor disponibilidad dentro del rango presupuestal—, en el caso de la Vivienda 2 el mercado presenta menor profundidad en el segmento específico solicitado.
Por lo tanto, se recomienda, considerar estas dos alternativas como opciones prioritarias de análisis. Evaluar la posibilidad de ampliar ligeramente el rango de área o flexibilizar alguna característica secundaria si se desea incrementar el número de opciones comparables. Iniciar procesos de negociación, dado que el número reducido de ofertas puede limitar el poder de elección.