1 Introducción

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).

2 Descripción y exploración preliminar del conjunto de datos

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)
data(vivienda)

2.1 Análisis de la Vivienda 1: Casas en la Zona Norte

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.

base1 <- vivienda %>%
  filter(tipo == "Casa",
         zona == "Zona Norte")

head(base1,3)
## # 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>
table(base1$tipo)
## 
## Casa 
##  722
table(base1$zona)
## 
## 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.

2.2 Filtro Geográfico

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)

2.3 Estructura del dataset

dplyr::glimpse(base1_limpia)
## 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…

3 Análisis exploratorio de los datos

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.

4 Estimación y Análisis del Modelo de Regresión Lineal Múltiple

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

4.1 Resultados del modelo de regresión lineal múltiple

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.

4.2 Indicadores de rendimiento

# 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")
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:

  1. Acierto del 71% (\(R^2 = 0.71\)): Imagina que el precio de una casa es un rompecabezas. Nuestro modelo logró armar el 71% de ese rompecabezas usando solo el tamaño de la casa, el estrato y los baños. Es un porcentaje muy alto y confiable para tomar una decisión de compra.
  2. Margen de Error (RMSE y MAE):En promedio, el modelo se puede alejar unos 87 millones del precio real.Esto se debe a que en el Norte hay casas muy antiguas que necesitan remodelación y otras que están como nuevas. Como el modelo no sabe si la cocina es moderna o de hace 30 años, ahí es donde aparece esa diferencia.

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.

5 Validación de Supuestos del Modelo

# 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)

  • Prueba de Breusch-Pagan: El p-valor obtenido (\(3.93 \times 10^{-14}\)) es significativamente menor a 0.05.
  • Interpretación: Se rechaza la hipótesis de varianza constante. Existe Heterocedasticidad.
  • Evidencia Visual: En el gráfico Residuals vs Fitted, los residuos se expanden en forma de “ventilador” o “embudo” a medida que aumentan los valores ajustados.
  • Contexto: Esto es muy lógico en el mercado inmobiliario del Norte. Las casas económicas tienen precios muy similares entre sí, pero a medida que las casas son más lujosas, la varianza de precios se dispara debido a acabados, marcas de diseño o urgencia del vendedor.

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.

6 Predicción del precio de viviendas

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.

6.1 Predicción de una vivienda

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.

7 Identificación de Ofertas Potenciales

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)")
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:

  • Consistencia de Precio: El precio promedio de estas ofertas es de \(313.2\) millones, lo cual guarda una cercanía del \(97\%\) con la predicción del modelo (\(304.24\) millones). Esto confirma que el modelo es una herramienta de valoración altamente precisa para el mercado del Norte.
  • Eficiencia del Estrato 4: Las ofertas en barrios como La Merced (ID 937) y El Bosque (ID 4458) demuestran que, en estrato 4, el cliente puede obtener incluso más área de la solicitada (\(270\)-\(280\) \(m^2\)) sin exceder su crédito de \(350\) millones.
  • Oportunidades de Inversión: La vivienda en Granada (ID 4727) destaca por tener un precio de \(296\) millones ofreciendo \(232\) \(m^2\), situándose como la opción con mejor costo por metro cuadrado de la selección.
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.

8 Segunda Solicitud : $850 Millones

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

8.1 Filtrado y Preparación de Datos

Primero aislamos los datos que cumplen con el perfil de la segunda solicitud.

# Filtrado de la base original para la Vivienda 2
base2_sur <- vivienda %>% 
  filter(zona == "Zona Sur", 
         tipo == "Apartamento", 
         estrato %in% c(5, 6)) %>%
  # Limpieza de datos faltantes en variables clave para el modelo
  filter(!is.na(preciom), !is.na(areaconst), !is.na(estrato))

8.2 Análisis Exploratorio de Datos (EDA)

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.

  1. Relación Precio vs. Área por EstratoAl comparar los estratos 5 y 6 en el sur, se observa una divergencia clara en la valoración del metro cuadrado:
  • Diferencial de Valor: La pendiente del Estrato 6 (línea turquesa) es significativamente más pronunciada que la del Estrato 5 (línea salmón). Esto indica que, en el mercado de lujo del sur, el solo hecho de pertenecer al estrato superior incrementa drásticamente el precio marginal por cada metro cuadrado adicional.
  • Dispersión: Se observa una mayor densidad de apartamentos en el rango de \(50\) a \(250\) \(m^2\) para ambos estratos, con precios que oscilan principalmente entre los \(250\) y \(750\) millones de pesos.
  1. Matriz de Correlación: Determinantes del PrecioLa matriz de correlación confirma cuáles son los “motores” del valor en este segmento:
  • Variables Críticas: El Área Construida (\(0.70\)) y el número de Parqueaderos (\(0.70\)) son los predictores con mayor fuerza de asociación lineal respecto al precio (preciom).
  • Baños y Habitaciones: El número de baños (\(0.67\)) también presenta una correlación alta, mientras que el número de habitaciones (\(0.28\)) es el predictor más débil. Esto sugiere que en el sur se valora más la amplitud de las zonas sociales y el confort (baños por habitación) que la cantidad de alcobas.
  1. Impacto de los Parqueaderos: En los edificios del sur, el parqueadero no es solo un accesorio, es un activo de valor:
  • Escalabilidad del Precio: El gráfico de cajas muestra un incremento escalonado y constante de la mediana del precio a medida que aumentan los parqueaderos.
  • Salto Premium: Existe un salto notable en el valor al pasar de 2 a 3 parqueaderos, lo que suele caracterizar a los apartamentos de tipo Penthouse o de áreas superiores a los \(150\) \(m^2\) en sectores como Pance o Ciudad Jardín.

8.3 Estimación del Modelo y Validación de Supuestos

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")
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:

  • Poder de Explicación (\(R^2 = 0.61\)): El modelo logra explicar el 61% de por qué los apartamentos en el sur tienen precios tan diferentes. Es un resultado sólido para el mercado de lujo, donde el estrato y el área son los que mandan.
  • Margen de Error (RMSE y MAE): El error promedio es de unos 79 millones (MAE).En el Sur (estratos 5 y 6), entran en juego los “detalles invisibles”: una vista privilegiada, un club house con piscina climatizada o acabados importados. Como estos datos no están en el modelo, el sistema los detecta como una desviación, pero la tendencia general sigue siendo muy confiable.

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:

  • Heterocedasticidad (Prueba Breusch-Pagan): La heterocedasticidad detectada confirma que en el mercado del Sur, a mayor lujo, mayor es la varianza. Esto sugiere que para el cliente de la Vivienda 2 ($850 millones), el modelo es una excelente base, pero la decisión final debe considerar el ‘factor premium’ (vistas, acabados) que el modelo captura como residuo
  • Normalidad (Prueba Shapiro-Wilk): El p-valor también es extremadamente bajo (\(< 2.2 \times 10^{-16}\)). Los residuos no siguen una distribución normal.Justificación para el informe: Esto se debe a la presencia de “Outliers” o apartamentos de súper-lujo (Penthouses) que se alejan del comportamiento promedio del mercado.

8.4 Predicción para la Solicitud 2 ($850M)

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:

  • Escenario A (Optimización de Inversión): El cliente puede adquirir el apartamento solicitado y conservar casi \(300\) millones para inversiones adicionales, remodelaciones de lujo extremo o reducción del tiempo del crédito.
  • Escenario B (Upgrade de Propiedad): Con los \(850\) millones disponibles, el cliente no solo puede aspirar a \(150\) \(m^2\), sino que podría buscar un Penthouse o un apartamento de más de \(220\)-\(250\) \(m^2\) en el mismo sector de Pance o Ciudad Jardín.
  • Escenario C (Ubicación Premium): El presupuesto le permite ser extremadamente exigente con la ubicación exacta (proyectos nuevos o con las mejores zonas comunes del sur), ya que el precio estimado para una unidad “estándar” de estrato 6 está muy por debajo de su límite.

8.5 Ofertas Potenciales y Mapa Final

# 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")
Top 5 Ofertas Sugeridas - Apartamentos Zona Sur
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")

9 Conclusiones Generales del Informe Inmobiliario

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.