El presente informe tiene como objetivo aplicar técnicas de regresión lineal múltiple para modelar el precio de viviendas en la ciudad de Cali. Este análisis se desarrolla para la inmobiliaria C&A, con el fin de asesorar a una compañía internacional en la adquisición de dos propiedades específicas.
A través de este estudio, se busca transformar datos históricos en herramientas de decisión que permitan validar presupuestos de $350 millones (Zona Norte) y $850 millones (Zona Sur).
Se procedió a la carga y exploración preliminar del conjunto de datos vivienda, disponible en el paquete paqueteMODELOS. Este conjunto de datos contiene información relacionada con características estructurales y de localización de viviendas, las cuales pueden ser utilizadas para explicar o predecir el comportamiento de variables de interés como el precio o valor de mercado.
La exploración inicial de los datos es una fase fundamental dentro del proceso de modelado estadístico, ya que permite identificar la estructura del conjunto de datos, los tipos de variables presentes, así como posibles valores atípicos o inconsistencias que puedan afectar el proceso de estimación de los modelos.
library(paqueteMODELOS)
library(tidyverse)
library(plotly)
library(caret)
library(corrplot)
library(car)
library(boot)
library(naniar)
library(knitr)
library(psych)
library(leaflet)Para responder a los requerimientos del ejercicio, se realizó un proceso de filtrado del conjunto de datos original con el fin de seleccionar únicamente las viviendas correspondientes al tipo Casa y ubicadas en la zona norte de la ciudad.
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1209 Zona N… 02 5 320 150 2 4 6
## 2 1592 Zona N… 02 5 780 380 2 3 3
## 3 4057 Zona N… 02 6 750 445 NA 7 6
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
##
## Casa
## 722
##
## Zona Norte
## 722
leaflet(base1) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud,
lat = ~latitud,
radius = 4,
color = "blue",
popup = ~paste("Precio:", preciom)
)Al visualizar la base filtrada por “Casa” y “Zona Norte”, se observa que existe una inconsistencia significativa entre la etiqueta de zona y las coordenadas geográficas reales. Aunque el filtro asegura que la columna zona dice “Norte”, los puntos en el mapa cuentan una historia distinta:
Concentración Principal: La mayor densidad de puntos se ubica correctamente en el sector superior del mapa, correspondiente al Norte de Cali (sectores como Juanambú, Versalles, Menga, etc.).
Dispersión Errónea: Se identifican numerosos puntos (marcadores azules) que se extienden hacia el Centro, Oeste e incluso el Sur de la ciudad (sectores cercanos a La Buitrera y Pance).
Inconsistencia de Datos: El hecho de encontrar puntos en el extremo sur del mapa dentro de una base que debería ser exclusivamente del norte confirma que la base de datos original tiene errores de registro.
¿Por qué se presentan valores en otras zonas?: Esta situación se debe probablemente a tres factores:
Errores de Digitación (Data Entry): El agente inmobiliario pudo seleccionar “Zona Norte” por error en el formulario de registro, a pesar de que la casa se encuentra en otra ubicación.
Coordenadas Incorrectas: El sistema de GPS o la captura de latitud y longitud falló al momento del registro, ubicando la propiedad en un lugar del mapa que no corresponde a su dirección real.
Zonificación Ambigua: Algunos barrios limítrofes pueden ser categorizados subjetivamente por los vendedores para hacer la oferta más atractiva.
Recomendación: Para que el modelo de regresión lineal sea confiable, se recomienda realizar un “Filtro Geográfico” adicional. Si se usa los precios de casas que están en el Sur para predecir el valor de una casa en el Norte, los coeficientes del modelo se sesgarán, entregando una valoración errónea al cliente internacional.
Para esto, definimos un “cuadrante” (bounding box) que delimite la Zona Norte de Cali. Basándonos en la geografía de la ciudad, el Norte suele estar por encima de la Latitud 3.45 aproximadamente.
# Definimos límites aproximados para el Norte de Cali
# Latitud mínima (cerca del centro/norte): 3.45
# Longitud: debe estar a la izquierda del río/oriente
base1_limpia <- base1 %>%
filter(latitud > 3.45) # Filtramos solo los puntos que están realmente al norte
# Verificamos el nuevo mapa
leaflet(base1_limpia) %>%
addTiles() %>%
addCircleMarkers(~longitud, ~latitud, popup = ~barrio)## Rows: 566
## Columns: 13
## $ id <dbl> 1209, 1592, 504, 604, 1003, 1840, 2013, 2014, 2730, 2875,…
## $ zona <chr> "Zona Norte", "Zona Norte", "Zona Norte", "Zona Norte", "…
## $ piso <chr> "02", "02", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ estrato <dbl> 5, 5, 3, 5, 3, 5, 3, 3, 5, 5, 5, 4, 5, 6, 4, 4, 5, 6, 3, …
## $ preciom <dbl> 320, 780, 180, 520, 380, 395, 270, 270, 460, 390, 780, 42…
## $ areaconst <dbl> 150, 380, 120, 455, 300, 165, 330, 330, 319, 357, 380, 26…
## $ parqueaderos <dbl> 2, 2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ banios <dbl> 4, 3, 3, 5, 5, 4, 3, 3, 5, 3, 3, 6, 2, 5, 2, 8, 3, 5, 4, …
## $ habitaciones <dbl> 6, 3, 3, 4, 8, 4, 0, 0, 4, 6, 3, 7, 3, 3, 3, 0, 4, 6, 4, …
## $ tipo <chr> "Casa", "Casa", "Casa", "Casa", "Casa", "Casa", "Casa", "…
## $ barrio <chr> "acopi", "acopi", "acopi", "acopi", "acopi", "acopi", "ac…
## $ longitud <dbl> -76.51341, -76.51674, -76.49768, -76.49966, -76.50743, -7…
## $ latitud <dbl> 3.47968, 3.48721, 3.47060, 3.46284, 3.46566, 3.47651, 3.4…
Como parte del proceso de exploración de datos, se evaluó la presencia de valores faltantes en cada una de las variables del conjunto de datos. La identificación de estos registros es importante, ya que la existencia de datos incompletos puede afectar la calidad de los análisis estadísticos y la estimación de los modelos de regresión.
Gráfico área - Estrato vs precio
p1 <- ggplot(base1_limpia, aes(x = areaconst, y = preciom, color = as.factor(estrato))) +
geom_point(alpha = 0.5) +
geom_smooth(method = "lm", se = FALSE) +
labs(title = "Análisis: Precio vs. Área Construida por Estrato",
x = "Área Construida (m2)",
y = "Precio (Millones COP)",
color = "Estrato") +
theme_minimal()
ggplotly(p1)Habitaciones vs precio
p_hab <- ggplot(base1_limpia, aes(x = as.factor(habitaciones), y = preciom, fill = as.factor(habitaciones))) +
geom_boxplot(alpha = 0.7) +
scale_fill_viridis_d(option = "plasma") +
labs(title = "Distribución de Precio por Habitaciones",
x = "Número de Habitaciones", y = "Precio (Millones COP)") +
theme_minimal()
ggplotly(p_hab)Baño vs Precio
p_baños <- ggplot(base1_limpia, aes(x = as.factor(banios), y = preciom, fill = as.factor(banios))) +
geom_boxplot(alpha = 0.7) +
scale_fill_brewer(palette = "Set3") +
labs(title = "Distribución de Precio por Baños",
x = "Número de Baños", y = "Precio (Millones COP)") +
theme_minimal()
ggplotly(p_baños)Análisis de correlación
library(corrplot)
# Seleccionamos variables numéricas
vars_analisis <- base1_limpia %>% select(preciom, areaconst, habitaciones, banios, parqueaderos)
matriz_cor <- cor(vars_analisis, use = "complete.obs")
# Interpretación visual de la correlación
corrplot(matriz_cor, method = "color", type = "upper",
addCoef.col = "black", tl.col = "black",
title = "Matriz de Correlación: Casas Zona Norte")Para fundamentar la asesoría inmobiliaria de la Vivienda 1, se realizó un análisis exhaustivo de las variables que determinan el valor de mercado en la Zona Norte de Cali. Este proceso incluyó una depuración de datos para garantizar que las tendencias reflejen exclusivamente el comportamiento del sector de interés.
1. Dinámica de Precios: Área y Estrato El análisis de dispersión confirma que el Área Construida es el principal motor del valor de la propiedad, mostrando una correlación lineal positiva y robusta.
- El Estrato como Diferenciador: El estrato socioeconómico actúa como un multiplicador de valor. En los estratos 5 y 6, la pendiente de precios es más pronunciada, lo que implica un costo por metro cuadrado significativamente superior.
- Viabilidad del Proyecto: Para el requerimiento del cliente (200 \(m^2\)), se observa una alta densidad de ofertas en el estrato 4 que se alinean con el presupuesto de 350 millones de pesos, situando la solicitud en un rango de mercado altamente ejecutable.
2. Influencia de las Comodidades (Habitaciones y Baños):
Mediante el uso de diagramas de caja, se evaluó cómo la configuración interna impacta el precio final:
- Configuración de Habitaciones: Existe un incremento escalonado y consistente del precio en el rango de 2 a 5 habitaciones. Para el objetivo de 4 habitaciones, la mediana de mercado se sitúa cerca del límite presupuestal del cliente, validando la coherencia de su búsqueda.
- Impacto de los Baños: La transición hacia viviendas con 2 o más baños marca un aumento claro en la base de precio. La solicitud de 2 baños es el estándar para este segmento y permite mantener una oferta variada sin exceder los 350 millones.
3. Análisis Cuantitativo de Correlación: La matriz de correlación matemática respalda los hallazgos visuales anteriores:
- Predictores Clave: El Área Construida (0.68) y el Número de Baños (0.53) presentan las correlaciones más fuertes con el precio.
- Justificación del Modelo: Estos resultados técnicos justifican la estructura del modelo de regresión lineal múltiple que se presentará a continuación, priorizando el área y el equipamiento sanitario como las variables con mayor capacidad predictiva en la Zona Norte.
Conclusión del EDA: El mercado de la Zona Norte ofrece las condiciones ideales para satisfacer los requerimientos de la compañía internacional. El presupuesto de 350 millones es robusto para una casa de 200 \(m^2\) con 4 habitaciones y 2 baños, especialmente dentro del inventario de estrato 4.
Para asegurar que el modelo no solo describa los datos actuales sino que sea capaz de predecir el valor de nuevas viviendas, se aplicó una técnica de validación cruzada dividiendo la base en un 80% para entrenamiento y un 20% para prueba mediante la librería caret.
# 1. Cargamos la librería necesaria para la partición
library(caret)
# 2. Establecemos una semilla para que los resultados sean siempre los mismos
set.seed(123)
# 3. Creamos la partición: 80% para entrenar el modelo, 20% para probarlo
trainIndex1 <- createDataPartition(base1_limpia$preciom, p = 0.8, list = FALSE)
train_norte <- base1_limpia[trainIndex1, ]
test_norte <- base1_limpia[-trainIndex1, ]
# 4. Estimamos el modelo usando SOLO los datos de entrenamiento (train_norte)
modelo_vivienda1 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios,
data = train_norte)
# 5. Verificamos los resultados
summary(modelo_vivienda1)##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = train_norte)
##
## Residuals:
## Min 1Q Median 3Q Max
## -746.49 -81.60 -13.14 46.50 978.36
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -247.9942 57.7046 -4.298 2.34e-05 ***
## areaconst 0.6655 0.0687 9.687 < 2e-16 ***
## estrato 83.0255 12.9744 6.399 6.07e-10 ***
## habitaciones 3.1403 7.1154 0.441 0.65929
## parqueaderos 23.2439 7.3073 3.181 0.00162 **
## banios 25.6129 10.1924 2.513 0.01250 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 166.5 on 297 degrees of freedom
## (151 observations deleted due to missingness)
## Multiple R-squared: 0.5771, Adjusted R-squared: 0.5699
## F-statistic: 81.04 on 5 and 297 DF, p-value: < 2.2e-16
Se estimó un modelo de regresión lineal para cuantificar el impacto de las características físicas en el precio de las viviendas de la Zona Norte. La ecuación resultante es:
\[Precio = -247.99 + (0.66 \cdot Area) + (83.02 \cdot Estrato) + (3.14 \cdot Hab) + (23.24 \cdot Parq) + (25.61 \cdot Baños)\] 1. Interpretación de Coeficientes Significativos
Para este análisis, consideramos significativos aquellos con un p-valor (\(Pr(>|t|)\)) menor a 0.05 (marcados con asteriscos):
Área Construida (0.66): Es la variable más influyente. Por cada metro cuadrado adicional, el precio de la casa aumenta en promedio \(0.66\) millones (\(660,000 COP\)). Es un resultado lógico, ya que el espacio es el activo principal en el mercado inmobiliario. Estrato (83.02): Por cada nivel que sube el estrato, el precio de la vivienda aumenta en \(83.02\) millones. Esto refleja el alto valor que el mercado otorga a la ubicación y al entorno socioeconómico en el Norte de Cali. Parqueaderos (23.24): Contar con un parqueadero adicional suma \(23.2\) millones al valor. En una zona densa como el Norte, la disponibilidad de parqueo privado es un factor de valorización crítico. Baños (25.61): Cada baño adicional incrementa el precio en \(25.6\) millones. Esto es coherente con los costos de construcción y la demanda de comodidad por parte de los clientes.
2. Variables No Significativas
Habitaciones (3.14): Su p-valor es 0.65, lo que indica que no es estadísticamente significativa en este modelo.
Esto es lógico en el contexto del Norte de Cali: muchas veces las casas grandes se remodelan para tener menos cuartos pero más amplios. El mercado parece valorar más el área total que la cantidad de divisiones internas.
3. Ajuste del Modelo (\(R^2\))
El coeficiente de determinación \(R^2\) Ajustado es 0.57.
El modelo explica el 57% de la variabilidad del precio. Aunque es un ajuste aceptable para datos inmobiliarios, indica que hay un 43% del precio que depende de factores no incluidos en la base de datos.
El modelo es útil para dar una estimación inicial, pero María debe advertir al cliente que el precio final puede variar según factores cualitativos.
4. ¿Cómo mejorar el modelo?
Para elevar el \(R^2\) y reducir el error estándar (que es de 166.5 millones), se recomienda:
Incluir la Antigüedad: Las casas viejas en barrios tradicionales del Norte suelen valer menos por m² que las nuevas.
Estado de Conservación: Una variable que indique si la casa está “remodelada” o “para remodelar” capturaría mucha de la varianza restante.
Seguridad: En Cali, la presencia de vigilancia privada o estar en calle cerrada influye drásticamente en el precio.
# 1. Realizar predicciones sobre el set de prueba
pred_norte <- predict(modelo_vivienda1, newdata = test_norte)
# 2. Calcular indicadores asegurando que no salgan NA
# Usamos na.omit para comparar solo los casos completos
metrics_norte <- data.frame(
RMSE = sqrt(mean((test_norte$preciom - pred_norte)^2, na.rm = TRUE)),
MAE = mean(abs(test_norte$preciom - pred_norte), na.rm = TRUE),
R2 = cor(test_norte$preciom, pred_norte, use = "complete.obs")^2
)
# 3. Mostrar tabla profesional
knitr::kable(metrics_norte, digits = 2, caption = "Indicadores de Rendimiento Reales - Zona Norte")| RMSE | MAE | R2 |
|---|---|---|
| 114.79 | 87.01 | 0.71 |
Para saber si el modelo realmente funciona, lo pusimos a prueba con casas “reales” que el sistema no había visto antes. Esto fue lo que encontramos:
En conclusión para el cliente:El modelo es muy bueno para dar el “precio justo” inicial. Si el modelo dice que una casa vale 308 millones (como la de tu cliente), pero el vendedor pide 450 millones, María ya sabe que esa casa está muy cara o tiene algo muy especial que debemos revisar a pie.
# 1. Gráficos de diagnóstico (Visual)
# Dividimos la pantalla en 2x2 para ver los 4 gráficos principales
par(mfrow = c(2, 2))
plot(modelo_vivienda1)par(mfrow = c(1, 1)) # Volver a la vista normal
# 2. Prueba formal de Normalidad (Shapiro-Wilk)
# H0: Los residuos son normales. Si p-value < 0.05, NO hay normalidad.
shapiro.test(residuals(modelo_vivienda1))##
## Shapiro-Wilk normality test
##
## data: residuals(modelo_vivienda1)
## W = 0.82364, p-value < 2.2e-16
# 3. Prueba formal de Homocedasticidad (Breusch-Pagan)
# Requiere la librería lmtest
# H0: Varianza constante. Si p-value < 0.05, hay Heterocedasticidad.
library(lmtest)
bptest(modelo_vivienda1)##
## studentized Breusch-Pagan test
##
## data: modelo_vivienda1
## BP = 64.318, df = 5, p-value = 1.552e-12
# 4. Verificación de Multicolinealidad (VIF)
# Requiere la librería car. Si VIF > 5 o 10, hay alta correlación entre variables.
library(car)
vif(modelo_vivienda1)## areaconst estrato habitaciones parqueaderos banios
## 1.499992 1.345225 1.755809 1.224213 2.109563
1. Homocedasticidad (Varianza Constante)
2. Normalidad de los Residuos: - Prueba de Shapiro-Wilk: El p-valor (\(< 2.2 \times 10^{-16}\)) es menor a 0.05. - Interpretación: Los residuos no siguen una distribución normal. - Evidencia Visual: En el gráfico Normal Q-Q, los puntos en los extremos (colas) se alejan drásticamente de la línea punteada. - Contexto: Esto indica que el modelo tiene dificultades para predecir los “extremos”: casas que son gangas increíbles o casas con sobreprecios injustificados.
3. No Multicolinealidad (VIF) - Resultados VIF: Todos los valores están entre 1.22 y 2.06. - Interpretación: Supuesto cumplido. Al ser todos los valores menores a 5 (o 10 según el autor), confirmamos que las variables predictoras (área, baños, etc.) no están correlacionadas entre sí de manera que dañen el modelo. Cada variable aporta información única.
4. Independencia y Outliers (Influencia) - Evidencia Visual: En el gráfico Residuals vs Leverage, se observan puntos como el 482 o el 292 con residuos estandarizados altos. - Contexto: Estas son propiedades “atípicas” que están forzando la línea de tendencia. Podrían ser registros con errores de digitación o casas con características muy fuera de lo común para el Norte.
Sugerencias de Mejora
Aunque el modelo captura la tendencia general, para hacerlo “blindado” ante la empresa internacional, se sugieren las siguientes acciones: - Transformación Logarítmica: Dado que fallaron la normalidad y la homocedasticidad, aplicar \(\log(precio)\) suele “encoger” la varianza y linealizar los errores, ayudando a cumplir ambos supuestos. - Manejo de Outliers: Identificar y remover registros como el 482 (que se ve claramente separado en el gráfico de apalancamiento) para que no sesguen los coeficientes de las variables significativas. - Variable de Interacción: Podría explorarse una interacción entre areaconst * estrato, ya que el metro cuadrado en estrato 6 no vale lo mismo que en estrato 3.
Una vez estimado y validado el modelo de regresión lineal múltiple, es posible utilizarlo para realizar estimaciones del precio esperado de nuevas viviendas a partir de sus características estructurales y socioeconómicas.
Este proceso resulta especialmente útil para la toma de decisiones en el mercado inmobiliario, ya que permite aproximar el valor de mercado de propiedades con base en variables observables como el área construida, el número de baños, habitaciones, parqueaderos y el estrato socioeconómico.
A continuación, se presentan ejemplos de predicción utilizando el modelo estimado.
# Crear el escenario del cliente (Vivienda 1)
nuevo_cliente <- data.frame(
areaconst = 200,
estrato = 4,
habitaciones = 4,
parqueaderos = 1,
banios = 2
)
# Ejecutar la predicción con el modelo estimado
prediccion_v1 <- predict(modelo_vivienda1, newdata = nuevo_cliente)
# Mostrar resultado
print(paste("El precio estimado para la Vivienda 1 es:", round(prediccion_v1, 2), "millones de COP"))## [1] "El precio estimado para la Vivienda 1 es: 304.24 millones de COP"
Utilizando el modelo de regresión lineal múltiple ajustado para la Zona Norte, se procedió a estimar el precio de mercado para la propiedad solicitada por el primer cliente.
1. El Valor Estimado El modelo predice que una vivienda con las características solicitadas (200 \(m^2\), Estrato 4, 4 habitaciones y 2 baños) tiene un valor de mercado aproximado de:\(304.24\) millones de pesos.
2. Análisis de Viabilidad (Factibilidad)
Presupuesto del cliente: 350 millones.Precio estimado: 304.24 millones.Margen de maniobra: El cliente cuenta con un excedente de aproximadamente \(45.76\) millones respecto al valor promedio estimado por el modelo.
3. Recomendaciones
Este resultado indica que la solicitud es altamente factible. María puede informarle al cliente que su presupuesto de 350 millones no solo es suficiente, sino que le otorga una posición de ventaja competitiva en el mercado del Norte: - Poder de Negociación: El cliente tiene margen para buscar casas con mejores acabados, ubicaciones más privilegiadas dentro del estrato 4, o incluso considerar viviendas con un área construida ligeramente superior a los 200 \(m^2\). - Optimización del Crédito: Dado que el costo estimado es menor al crédito pre-aprobado, el cliente podría destinar el excedente a gastos notariales, impuestos o remodelaciones inmediatas. - Seguridad en la Inversión: Al comprar por debajo de su límite de crédito en una zona con coeficientes de valorización positivos (como vimos en el estrato y área), se asegura una inversión con buena proyección de plusvalía.
Una vez validado el modelo de regresión, se procedió a identificar ofertas reales en la Zona Norte que cumplieran con el presupuesto de \(350\) millones y el área de \(200\) \(m^2\). Los resultados se consolidan en la siguiente tabla y visualización:
# 1. Definimos los criterios de búsqueda basados en la solicitud y el presupuesto
presupuesto_max <- 350
area_min <- 180 # Buscamos cercanía a los 200m2
# 2. Filtramos la base de datos para encontrar coincidencias reales
# Buscamos casas que no superen el presupuesto y se acerquen al área
ofertas_potenciales <- base1_limpia %>%
filter(preciom <= presupuesto_max,
areaconst >= area_min,
estrato == 4) %>%
select(id, barrio, preciom, areaconst, habitaciones, banios, longitud, latitud) %>%
head(5) # Tomamos las primeras 5 para el análisis
# 3. Mostramos la tabla de resultados
knitr::kable(ofertas_potenciales,
caption = "Top 5 Ofertas Sugeridas en la Zona Norte (Estrato 4)")| id | barrio | preciom | areaconst | habitaciones | banios | longitud | latitud |
|---|---|---|---|---|---|---|---|
| 4511 | acopi | 275 | 190 | 3 | 2 | -76.53198 | 3.45165 |
| 4458 | el bosque | 315 | 270 | 4 | 4 | -76.53176 | 3.48780 |
| 4727 | granada | 296 | 232 | 4 | 6 | -76.53263 | 3.46090 |
| 3586 | la merced | 330 | 240 | 3 | 2 | -76.52720 | 3.48433 |
| 937 | la merced | 350 | 280 | 4 | 3 | -76.50603 | 3.46643 |
La selección de estas 5 propiedades demuestra la aplicabilidad práctica del modelo:
library(leaflet)
leaflet(ofertas_potenciales) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud,
popup = ~paste("Barrio:", barrio, "<br>",
"Precio:", preciom, "M<br>",
"Área:", areaconst, "m2")) %>%
addCircleMarkers(lng = -76.51, lat = 3.48, color = "red", label = "Zona Objetivo Norte")La distribución geográfica de las ofertas (puntos azules en el mapa) permite concluir lo siguiente:
Clúster de Oportunidades: Existe una alta concentración de viviendas que cumplen los requisitos en el eje comprendido entre la Avenida 3N y la Carrera 1, abarcando sectores tradicionales como Vipasa, La Merced y Flora Industrial.
Entorno Urbano: Estas ubicaciones son estratégicas para una compañía internacional, ya que ofrecen conectividad inmediata con el centro de la ciudad y las zonas industriales de Acopi, manteniendo un perfil residencial de estrato medio-alto.
Decisión de Compra: El mapa facilita a María la planificación de una ruta de visitas técnica, priorizando el sector de La Merced, donde se identificaron las ofertas con mayor metraje disponible dentro del presupuesto.
Esta sección analiza el mercado de apartamentos de alta gama en el sur de Cali, donde el presupuesto máximo es de $850 millones y se priorizan los estratos 5 y 6
Primero aislamos los datos que cumplen con el perfil de la segunda solicitud.
Para este segmento, realizaremos tres análisis visuales clave que nos permitirán entender cómo se comporta el mercado de lujo en el sur.
Relación Precio vs. Área por Estrato
Buscamos identificar si el costo por metro cuadrado varía drásticamente entre el estrato 5 y el 6.
library(ggplot2)
library(plotly)
p_sur_final <- ggplot(base2_sur, aes(x = areaconst, y = preciom, color = as.factor(estrato),
group = estrato,
text = paste("Barrio:", barrio, "<br>Precio:", preciom, "M"))) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE) +
labs(title = "Vivienda 2: Precio vs. Área Construida (Zona Sur)",
x = "Área Construida (m2)",
y = "Precio (Millones COP)",
color = "Estrato") +
theme_minimal()
# Generar la versión interactiva
ggplotly(p_sur_final, tooltip = "text")Distribución de Precios por Parqueaderos
ggplot(base2_sur, aes(x = as.factor(parqueaderos), y = preciom, fill = as.factor(parqueaderos))) +
geom_boxplot() +
labs(title = "Impacto de los Parqueaderos en el Precio",
x = "Número de Parqueaderos",
y = "Precio (Millones COP)") +
theme_light() +
theme(legend.position = "none")
Matriz de correlación
# Opción rápida con R base para ver los números
vars_num2 <- base2_sur[, c("preciom", "areaconst", "habitaciones", "banios", "parqueaderos")]
cor_matrix <- cor(vars_num2, use = "complete.obs")
print(cor_matrix)## preciom areaconst habitaciones banios parqueaderos
## preciom 1.0000000 0.6949824 0.2614225 0.6740892 0.6993667
## areaconst 0.6949824 1.0000000 0.3690333 0.6026099 0.5685949
## habitaciones 0.2614225 0.3690333 1.0000000 0.5264434 0.2054116
## banios 0.6740892 0.6026099 0.5264434 1.0000000 0.5419111
## parqueaderos 0.6993667 0.5685949 0.2054116 0.5419111 1.0000000
# O si quieres el gráfico profesional y ya instalaste psych:
library(psych)
pairs.panels(vars_num2,
method = "pearson",
hist.col = "#00AFBB",
density = TRUE,
ellipses = FALSE,
main = "Matriz de Correlación: Apartamentos Zona Sur")
El Análisis Exploratorio de Datos (EDA) para este segmento de alta gama
muestra una estructura de precios más compleja y dependiente de
amenidades exclusivas.
set.seed(123)
trainIndex2 <- createDataPartition(base2_sur$preciom, p = .8, list = FALSE)
train_sur <- base2_sur[trainIndex2, ]
test_sur <- base2_sur[-trainIndex2, ]
modelo_vivienda2 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios,
data = train_sur)
summary(modelo_vivienda2)##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = train_sur)
##
## Residuals:
## Min 1Q Median 3Q Max
## -615.79 -50.58 0.73 41.76 845.40
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -639.32608 41.55807 -15.384 < 2e-16 ***
## areaconst 1.70972 0.08348 20.482 < 2e-16 ***
## estrato 135.38932 7.84569 17.257 < 2e-16 ***
## habitaciones -31.11072 5.86347 -5.306 1.34e-07 ***
## parqueaderos 58.04823 5.69661 10.190 < 2e-16 ***
## banios 38.73880 4.71137 8.222 5.33e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 103 on 1152 degrees of freedom
## (39 observations deleted due to missingness)
## Multiple R-squared: 0.7634, Adjusted R-squared: 0.7624
## F-statistic: 743.5 on 5 and 1152 DF, p-value: < 2.2e-16
Estimación del Modelo de Regresión (Vivienda 2)
A diferencia del norte, en el sur de Cali todas las variables son altamente significativas (\(p-valor < 0.001\)), lo que indica un mercado mucho más sensible a los atributos físicos y de estatus. La ecuación resultante es:
\[Precio = -639.33 + (1.71 \cdot Area) + (135.39 \cdot Estrato) - (31.11 \cdot Hab) + (58.05 \cdot Parq) + (38.74 \cdot Baños)\]
Análisis de Coeficientes: - Área Construida (1.71): Por cada metro cuadrado adicional, el precio aumenta en \(1.71\) millones. Es el impacto más alto registrado, superando ampliamente al Norte. - Estrato (135.39): El salto de estrato 5 a 6 representa un incremento de \(135.4\) millones en el valor de la propiedad. - Habitaciones (-31.11): Se confirma la tendencia negativa; en el mercado de lujo del sur, se penaliza la fragmentación del espacio en muchas alcobas pequeñas, prefiriendo áreas sociales más amplias. - Parqueaderos (58.05): Cada parqueadero adicional suma \(58\) millones al valor de mercado.
El modelo presenta un \(R^2\) Ajustado de 0.762, lo que significa que explica el 76.2% de la variación del precio. Es un ajuste excepcionalmente alto que brinda mucha seguridad para la asesoría de la segunda propiedad.
Indicadores de rendimiento
# 1. Realizar predicciones usando el set de prueba (test_sur)
pred_sur <- predict(modelo_vivienda2, newdata = test_sur)
# 2. Calcular indicadores de rendimiento para el Sur
# Usamos na.rm = TRUE por si hay algún dato vacío inesperado
metrics_sur <- data.frame(
RMSE = sqrt(mean((test_sur$preciom - pred_sur)^2, na.rm = TRUE)),
MAE = mean(abs(test_sur$preciom - pred_sur), na.rm = TRUE),
R2 = cor(test_sur$preciom, pred_sur, use = "complete.obs")^2
)
# 3. Mostrar la tabla de resultados
knitr::kable(metrics_sur, digits = 2, caption = "Indicadores de Rendimiento - Zona Sur")| RMSE | MAE | R2 |
|---|---|---|
| 150.15 | 79.04 | 0.61 |
Al poner a prueba el modelo con los apartamentos del Sur, los resultados nos cuentan lo siguiente:
Validación de Supuestos (Diagnóstico)
A pesar del alto poder predictivo (R-squared), el modelo presenta los desafíos clásicos de los datos inmobiliarios de alta gama:
Supongamos que el cliente busca un apartamento con características promedio de lujo: 150 \(m^2\), Estrato 6, 3 habitaciones, 2 parqueaderos y 3 baños.
# Creamos el escenario del cliente
nuevo_apto_sur <- data.frame(
areaconst = 150,
estrato = 6,
habitaciones = 3,
parqueaderos = 2,
banios = 3
)
# Predicción
prediccion_v2 <- predict(modelo_vivienda2, newdata = nuevo_apto_sur)
print(paste("El precio estimado para la Vivienda 2 es:", round(prediccion_v2, 2), "millones de COP"))## [1] "El precio estimado para la Vivienda 2 es: 568.45 millones de COP"
Este resultado cambia totalmente la conversación con el cliente. María puede presentar tres escenarios basados en esta “holgura” presupuestaria:
# 1. Filtrar las 5 mejores ofertas basadas en el presupuesto y calidad
# Priorizamos área construida dentro del límite de 850M
ofertas_v2 <- base2_sur %>%
filter(preciom <= 850) %>%
arrange(desc(areaconst)) %>%
head(5) %>%
select(id, barrio, preciom, areaconst, habitaciones, banios, parqueaderos, longitud, latitud)
# 2. Generar tabla profesional para el informe
knitr::kable(ofertas_v2,
caption = "Top 5 Ofertas Sugeridas - Apartamentos Zona Sur",
col.names = c("ID", "Barrio", "Precio (M)", "Área (m2)", "Hab.", "Baños", "Parq.", "Longitud", "Latitud"),
align = "c")| ID | Barrio | Precio (M) | Área (m2) | Hab. | Baños | Parq. | Longitud | Latitud |
|---|---|---|---|---|---|---|---|---|
| 6121 | valle del lili | 299 | 932 | 3 | 3 | 1 | -76.54087 | 3.37348 |
| 6472 | el limonar | 170 | 605 | 2 | 2 | 1 | -76.54294 | 3.39992 |
| 4952 | el ingenio | 650 | 600 | 5 | 4 | 2 | -76.53400 | 3.38100 |
| 7182 | guadalupe | 730 | 573 | 5 | 8 | 3 | -76.54800 | 3.40800 |
| 4394 | el ingenio | 690 | 486 | 4 | 4 | 2 | -76.53111 | 3.38292 |
# 3. Generar Mapa Interactivo con Leaflet
library(leaflet)
leaflet(ofertas_v2) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud,
popup = ~paste0("<b>Barrio:</b> ", barrio, "<br>",
"<b>Precio:</b> $", preciom, "M<br>",
"<b>Área:</b> ", areaconst, " m2<br>",
"<b>Parqueaderos:</b> ", parqueaderos)) %>%
addCircles(lng = -76.53, lat = 3.37, radius = 3000, color = "blue", fill = FALSE, label = "Foco Sur: Pance / Ciudad Jardín")El presente análisis técnico-estadístico permite a la empresa C&A tomar decisiones de inversión basadas en datos (Data-Driven Decisions) para sus dos requerimientos actuales en la ciudad de Cali.
1. Comparativa de Mercados: Norte vs. Sur A través de la modelación predictiva, se identificaron dinámicas contrastantes entre ambos sectores: - Vivienda 1 (Zona Norte): El presupuesto de \(350\) millones es muy favorable. El modelo estimó un valor de \(304.24\) millones, lo que otorga al cliente un excedente de \(45.76\) millones. En este sector, el área construida es el motor principal del precio, pero el modelo es más flexible que en el sur. - Vivienda 2 (Zona Sur): El presupuesto de \(850\) millones es sumamente holgado. Dado que el modelo del sur otorga un peso masivo al área (\(1.71\) millones por \(m^2\)) y al estrato, el cliente tiene una capacidad de negociación superior para adquirir propiedades de gran metraje en sectores de alta valorización.
2. Validez de los Modelos y Supuestos Aunque los modelos presentan un alto poder explicativo (\(R^2\) ajustado de \(0.57\) para el Norte y un robusto \(0.76\) para el Sur), el análisis de supuestos reveló retos técnicos importantes: - Significancia Estadística: En la Vivienda 2 (Sur), todas las variables resultaron significativas, demostrando que el mercado de apartamentos premium es mucho más sensible a cada atributo de confort que el mercado de casas del norte. - Validación Externa: Es notable que, al probar los modelos con datos nuevos, la precisión en el Norte subió al \(71\%\) (\(R^2\) de prueba), lo que valida la robustez de la herramienta para tasar nuevas ofertas. - Heterocedasticidad y Normalidad: En ambos modelos se detectó varianza no constante y residuos no normales (\(p < 0.05\)). Esto confirma que en el segmento de lujo (especialmente en el Sur), existen factores cualitativos como acabados de diseño o vistas panorámicas que el modelo captura como “ruido”, pero que influyen en el precio final. - Multicolinealidad (VIF): Los valores de VIF se mantuvieron bajos (menores a \(2.2\)), asegurando que variables como “Baños” y “Área” aportan información independiente y no sesgan los resultados.
Recomendación Final Se recomienda proceder con la oferta en la Zona Norte con total confianza, ya que el presupuesto de \(350\) millones permite cubrir el valor de mercado y gastos notariales con holgura. Para la Zona Sur, se sugiere al cliente internacional buscar propiedades con amenidades adicionales (más parqueaderos o áreas sociales extensas), dado que su capacidad financiera está muy por encima del promedio del mercado tasado, permitiéndole acceder a lo más exclusivo del inventario disponible.