# Carga de librerías requeridas
library(paqueteMODELOS)
## Cargando paquete requerido: boot
## Cargando paquete requerido: broom
## Warning: package 'broom' was built under R version 4.5.3
## Cargando paquete requerido: GGally
## Cargando paquete requerido: ggplot2
## Warning: package 'ggplot2' was built under R version 4.5.3
## Cargando paquete requerido: gridExtra
## Cargando paquete requerido: knitr
## Warning: package 'knitr' was built under R version 4.5.3
## Cargando paquete requerido: summarytools
## Warning: package 'summarytools' was built under R version 4.5.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.3
## 
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:gridExtra':
## 
##     combine
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Carga de la base de datos original
data("vivienda")

# 1. Diagnóstico de valores nulos (NAs)
nulos_por_columna <- colSums(is.na(vivienda))

# 2. Estructuración y tipificación de variables
vivienda_limpia <- vivienda %>%
  mutate(
    zona = as.factor(zona),
    estrato = as.factor(estrato),
    tipo = as.factor(tipo)
  ) %>%
  # Eliminación de registros con inconsistencias lógicas graves
  filter(preciom > 0, areaconst > 0)

Justificación del Preprocesamiento

Se realizó una depuración inicial de la base de datos global para asegurar la integridad de las estimaciones. Las variables zona, tipo y estrato se transformaron a formato factor, un paso necesario para que el modelo de regresión asigne variables dummy de forma automática y evalúe correctamente el impacto aislado de cada categoría socioeconómica. Adicionalmente, se filtraron los registros con valores de área o precio iguales a cero. La eliminación de estas inconsistencias previene la introducción de sesgos y valores atípicos que afectarían los coeficientes de Mínimos Cuadrados Ordinarios (MCO).

# 1. Filtro estricto para Solicitud 1 (Casa en Zona Norte)
base_norte <- vivienda_limpia %>% 
  filter(tipo == "Casa", zona == "Zona Norte") %>%
  # Selección de variables de interés para el modelo
  select(preciom, areaconst, estrato, habitaciones, parqueaderos, banios, longitud, latitud) %>%
  na.omit()

# Comprobación de los primeros registros
head(base_norte, 3)
## # A tibble: 3 × 8
##   preciom areaconst estrato habitaciones parqueaderos banios longitud latitud
##     <dbl>     <dbl> <fct>          <dbl>        <dbl>  <dbl>    <dbl>   <dbl>
## 1     320       150 5                  6            2      4    -76.5    3.48
## 2     780       380 5                  3            2      3    -76.5    3.49
## 3     625       355 4                  5            3      5    -76.5    3.41
# Diagnóstico Espacial con Leaflet
library(leaflet)
## Warning: package 'leaflet' was built under R version 4.5.3
leaflet(base_norte) %>% 
  addTiles() %>% 
  addCircleMarkers(~longitud, ~latitud, radius = 3, color = "#1E90FF", 
                   stroke = FALSE, fillOpacity = 0.5)

Al observar la dispersión territorial en el mapa generado, se evidencia una clara inconsistencia espacial en la base de datos de origen. Aunque se filtraron estrictamente los registros etiquetados bajo la categoría Zona Norte, una cantidad significativa de puntos georreferenciados recaen visualmente en el centro, el extremo sur de la ciudad y zonas periféricas. Esta anomalía expone errores de captura en la fuente: es posible que existan fallas en el registro de las coordenadas GPS, o bien, que propiedades de otras zonas hayan sido etiquetadas erróneamente como Zona Norte.

# Aplicación del Rango Intercuartílico (IQR) para corregir el error espacial
Q1_lat <- quantile(base_norte$latitud, 0.25, na.rm = TRUE)
Q3_lat <- quantile(base_norte$latitud, 0.75, na.rm = TRUE)
IQR_lat <- Q3_lat - Q1_lat

Q1_lon <- quantile(base_norte$longitud, 0.25, na.rm = TRUE)
Q3_lon <- quantile(base_norte$longitud, 0.75, na.rm = TRUE)
IQR_lon <- Q3_lon - Q1_lon

# Creación de la base definitiva (sin outliers espaciales)
base_norte_limpia <- base_norte %>%
  filter(latitud >= (Q1_lat - 1.5 * IQR_lat) & latitud <= (Q3_lat + 1.5 * IQR_lat),
         longitud >= (Q1_lon - 1.5 * IQR_lon) & longitud <= (Q3_lon + 1.5 * IQR_lon))

# Mapa comprobatorio (El resultado limpio)
leaflet(base_norte_limpia) %>% 
  addTiles() %>% 
  addCircleMarkers(~longitud, ~latitud, radius = 3, color = "#228B22", 
                   stroke = FALSE, fillOpacity = 0.5)

Para garantizar la validez espacial sin eliminar datos de forma subjetiva, se implementó un algoritmo estadístico de detección de valores atípicos mediante el Rango Intercuartílico (IQR). Se calcularon los límites de dispersión tolerables matemáticamente para las coordenadas de latitud y longitud. Este método paramétrico eliminó objetivamente el ruido espacial, asegurando que las estimaciones del modelo correspondan estrictamente a la dinámica del mercado del norte de Cali.

# 2. Análisis Exploratorio de Datos (EDA)

# Matriz de correlación para variables continuas
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.5.3
## corrplot 0.95 loaded
vars_numericas <- base_norte_limpia %>% 
  select(preciom, areaconst, habitaciones, parqueaderos, banios)
matriz_cor <- cor(vars_numericas)

# Visualización de la matriz de correlación
corrplot(matriz_cor, method = "number", type = "upper", 
         tl.col = "black", tl.srt = 45, 
         title = "Correlación de Variables - Zona Norte", 
         mar = c(0,0,1,0))

# Gráfico Interactivo con Plotly (Precio vs Área por Estrato)
library(plotly)
## Warning: package 'plotly' was built under R version 4.5.3
## 
## Adjuntando el paquete: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(ggplot2)

grafico_base <- ggplot(base_norte_limpia, aes(x = areaconst, y = preciom, color = estrato)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE, size = 0.5) +
  labs(title = "Dinámica de Precios: Área Construida vs Precio por Estrato",
       x = "Área Construida (m2)", 
       y = "Precio (Millones COP)", 
       color = "Estrato") +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
ggplotly(grafico_base)
## `geom_smooth()` using formula = 'y ~ x'

Análisis Exploratorio y de Correlaciones A partir de la matriz de correlación de Pearson obtenida para el subconjunto de la Zona Norte, se observa que la variable estructural con mayor asociación lineal positiva respecto al precio de venta (preciom) es el área construida (areaconst), registrando un coeficiente de 0.68. Esto confirma teóricamente que los metros cuadrados constituyen el principal vector explicativo en la valoración inmobiliaria de este sectorLas variables de confort y dotación secundaria como los baños (0.54), los parqueaderos (0.43) y las habitaciones (0.37) muestran correlaciones moderadas. Cabe destacar que la correlación relativamente baja de las habitaciones frente al área sugiere que contar con más cuartos no necesariamente implica un mayor valor si estos reducen su tamaño, validando la preponderancia del espacio útil global.

El gráfico de dispersión interactivo complementa este diagnóstico, evidenciando una tendencia lineal positiva consistente a lo largo de los diferentes estratos socioeconómicos, sirviendo como base preliminar para la especificación del modelo de regresión múltiple por Mínimos Cuadrados Ordinarios (MCO).

# 3. Estimación del Modelo de Regresión Lineal Múltiple (MCO)

# Ajuste del modelo principal para la Zona Norte
modelo_norte <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, 
                   data = base_norte_limpia)

# Resumen estadístico detallado de los coeficientes, t-values y R-squared
summary(modelo_norte)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = base_norte_limpia)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -759.11  -69.91  -16.22   41.21 1000.64 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   10.07804   28.31432   0.356   0.7221    
## areaconst      0.65744    0.05632  11.672  < 2e-16 ***
## estrato4      78.38689   25.86311   3.031   0.0026 ** 
## estrato5     142.91725   23.94066   5.970 5.35e-09 ***
## estrato6     265.41535   39.48426   6.722 6.38e-11 ***
## habitaciones   6.83802    6.00979   1.138   0.2559    
## parqueaderos  27.54446    6.02169   4.574 6.43e-06 ***
## banios        19.09859    8.33698   2.291   0.0225 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 154.7 on 390 degrees of freedom
## Multiple R-squared:  0.605,  Adjusted R-squared:  0.5979 
## F-statistic: 85.32 on 7 and 390 DF,  p-value: < 2.2e-16

Interpretación de Coeficientes del Modelo MCO

Área Construida (areaconst): Por cada metro cuadrado adicional que posea una casa en la Zona Norte, su precio estimado se incrementa en promedio en 0.65 millones de pesos, manteniendo constantes las demás variables (p<2×10^(-16)).

Efecto Estrato: Tomando como referencia la categoría base, los estratos superiores muestran primas de precio marcadas y crecientes. Vivir en estrato 6 incrementa el valor esperado de la vivienda en 265.41 millones de pesos en promedio frente a la categoría base, evidenciando el fuerte peso de la segmentación socioeconómica urbana.

Dotación Adicional: Cada baño adicional aporta un incremento estimado de 19.10 millones (p=0.0225) y cada parqueadero suma 27.54 millones (p<0.001). Por su parte, la variable habitaciones carece de significancia estadística (p=0.2559), sugiriendo que el mercado valora más los metros cuadrados libres y las amenidades que el número fraccionado de habitaciones.

Discusión del Ajuste Global e Implicaciones Metodológicas

El coeficiente de determinación ajustado (R^2 ajustado = 0.5979) indica que el modelo captura cerca del 60% de la varianza de los precios en la Zona Norte. Desde la perspectiva de la econometría inmobiliaria urbana, este valor es altamente respetable, dado que los mercados de vivienda presentan una alta heterogeneidad intrínseca.

El 40% de la variabilidad restante que no logra explicar el modelo se atribuye a factores no observables o variables omitidas que inciden de manera determinante en la formación de precios pero que no están disponibles en la muestra general, tales como: el estado de conservación y renovación de los acabados internos, la seguridad específica de la cuadra, la cercanía a ejes viales principales o centros comerciales, y la arquitectura específica del inmueble.

Para futuras iteraciones o mejoras del modelo de C&A, se recomienda incorporar variables cualitativas de tipología constructiva (por ejemplo, si el inmueble pertenece a conjunto cerrado con amenidades como piscina o vigilancia privada), lo que presumiblemente reduciría el sesgo por omisión de variables y elevaría la precisión predictiva.

# 4. Validación de Supuestos del Modelo (Multicolinealidad y Homocedasticidad)

library(car)
## Warning: package 'car' was built under R version 4.5.3
## Cargando paquete requerido: carData
## Warning: package 'carData' was built under R version 4.5.3
## 
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following object is masked from 'package:boot':
## 
##     logit
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.5.3
## Cargando paquete requerido: zoo
## Warning: package 'zoo' was built under R version 4.5.3
## 
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
# 1. Diagnóstico de Multicolinealidad (VIF)
print("--- FACTOR DE INFLACIÓN DE LA VARIANZA (VIF) ---")
## [1] "--- FACTOR DE INFLACIÓN DE LA VARIANZA (VIF) ---"
vif_resultados <- vif(modelo_norte)
print(vif_resultados)
##                  GVIF Df GVIF^(1/(2*Df))
## areaconst    1.526945  1        1.235696
## estrato      1.436399  3        1.062215
## habitaciones 1.853416  1        1.361402
## parqueaderos 1.220606  1        1.104810
## banios       2.225999  1        1.491978
# 2. Prueba de Homocedasticidad de Breusch-Pagan
print("--- PRUEBA DE BREUSCH-PAGAN ---")
## [1] "--- PRUEBA DE BREUSCH-PAGAN ---"
bp_prueba <- bptest(modelo_norte)
print(bp_prueba)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_norte
## BP = 70.176, df = 7, p-value = 1.361e-12
# 3. Gráficos de diagnóstico de residuos estándar
par(mfrow = c(2, 2))
plot(modelo_norte)

par(mfrow = c(1, 1))

Análisis e Interpretación de los Gráficos de Diagnóstico

La evaluación gráfica de los residuos del modelo para la Zona Norte nos permite examinar el comportamiento de los errores y validar los supuestos estadísticos base:

# 5. Predicción de precio e intervalo para la Vivienda 1 (Zona Norte)

vivienda_1 <- data.frame(
  areaconst = 200,
  estrato = "4",
  habitaciones = 4,
  parqueaderos = 1,
  banios = 2
)

prediccion_v1 <- predict(modelo_norte, newdata = vivienda_1, interval = "prediction", level = 0.95)

print("--- PREDICCIÓN DE PRECIO (VIVIENDA 1) ---")
## [1] "--- PREDICCIÓN DE PRECIO (VIVIENDA 1) ---"
print(prediccion_v1)
##        fit      lwr      upr
## 1 313.0463 6.185099 619.9075

5. Evaluación de Viabilidad y Estimación de Precio (Vivienda 1)

Con base en la estimación del modelo de regresión múltiple, el precio esperado para una casa en la Zona Norte con 200 metros cuadrados de área construida, estrato 4, cuatro habitaciones, un parqueadero y dos baños es de 313.05 millones de pesos.

Dado que la compañía internacional dispone de un crédito preaprobado de 350 millones de pesos, el modelo concluye que el presupuesto es financieramente viable para adquirir una propiedad con estas especificaciones estructurales, dejando un margen a favor de aproximadamente 37 millones de pesos.

Es importante señalar que el intervalo de predicción al 95% de confianza es amplio (oscilando entre 6.18 y 619.91 millones de pesos). Esta amplitud es la manifestación numérica de la heterocedasticidad diagnosticada en la evaluación de los supuestos del modelo. Confirma que, si bien el valor central esperado se ajusta al presupuesto, existe una alta dispersión en la oferta real. En consecuencia, el presupuesto es suficiente, pero requerirá que la agencia C&A realice una selección cuidadosa del inventario, ya que el mercado permite encontrar esta misma configuración arquitectónica en un rango de precios altamente volátil.

# 6. Identificación de ofertas reales y visualización en mapa (Vivienda 1)
library(dplyr)
library(leaflet)

# Filtrar el top 5 de opciones que cumplan el presupuesto y estrato
ofertas_v1 <- base_norte_limpia %>%
  filter(estrato == "4", preciom <= 350) %>%
  arrange(desc(areaconst)) %>% 
  head(5)

# Imprimir las propiedades seleccionadas para el informe
print("--- TOP 5 DE OFERTAS REALES (PRESUPUESTO <= 350 MILLONES) ---")
## [1] "--- TOP 5 DE OFERTAS REALES (PRESUPUESTO <= 350 MILLONES) ---"
print(ofertas_v1 %>% select(preciom, areaconst, habitaciones, banios, parqueaderos))
## # A tibble: 5 × 5
##   preciom areaconst habitaciones banios parqueaderos
##     <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1     350       350            5      4            1
## 2     335       300            4      4            3
## 3     340       295            4      2            2
## 4     350       280            4      3            2
## 5     330       275            5      3            2
# Generar el mapa interactivo
mapa_v1 <- leaflet(data = ofertas_v1) %>%
  addTiles() %>%
  addMarkers(
    lng = ~longitud, 
    lat = ~latitud,  
    popup = ~paste("<b>Precio:</b> $", preciom, " Millones<br>",
                   "<b>Área:</b>", areaconst, "m²<br>",
                   "<b>Habitaciones:</b>", habitaciones, "<br>",
                   "<b>Baños:</b>", banios)
  )

# Mostrar el mapa
mapa_v1

6. Ofertas Potenciales en el Mercado (Vivienda 1)

Tras confirmar la viabilidad financiera del presupuesto con el modelo de regresión, se procedió a escanear el inventario real disponible en la Zona Norte. El objetivo es entregarle a la compañía internacional opciones tangibles y accionables que cumplan con la restricción del crédito preaprobado (350 millones de pesos) y los requisitos espaciales (estrato 4).

El filtro arroja excelentes perspectivas para el comprador. Como se observa en la tabla adjunta y en el mapa interactivo, la agencia C&A cuenta con un top 5 de propiedades altamente competitivas. Destaca el hecho de que el mercado actual permite acceder a casas de áreas significativamente mayores a los 200 m² solicitados (alcanzando hasta 350 m²) manteniendo el tope financiero. Estas opciones superan las expectativas estructurales del cliente en número de habitaciones y baños, brindando un portafolio muy atractivo para iniciar las visitas comerciales.

# 7. Segunda solicitud (Apartamento en Zona Sur)

# Filtro de los datos base
base_sur <- vivienda_limpia %>%
  filter(tipo == "Apartamento", zona == "Zona Sur") %>%
  select(preciom, areaconst, estrato, habitaciones, parqueaderos, banios, longitud, latitud) %>%
  na.omit()

# Comprobación de los primeros registros
head(base_sur, 3)
## # A tibble: 3 × 8
##   preciom areaconst estrato habitaciones parqueaderos banios longitud latitud
##     <dbl>     <dbl> <fct>          <dbl>        <dbl>  <dbl>    <dbl>   <dbl>
## 1     290        96 4                  3            1      2    -76.5    3.45
## 2      78        40 3                  2            1      1    -76.5    3.4 
## 3     875       194 6                  3            2      5    -76.6    3.46
# Limpieza de outliers espaciales (Zona Sur)
Q1_lat_s <- quantile(base_sur$latitud, 0.25)
Q3_lat_s <- quantile(base_sur$latitud, 0.75)
IQR_lat_s <- Q3_lat_s - Q1_lat_s

Q1_lon_s <- quantile(base_sur$longitud, 0.25)
Q3_lon_s <- quantile(base_sur$longitud, 0.75)
IQR_lon_s <- Q3_lon_s - Q1_lon_s

base_sur_limpia <- base_sur %>%
  filter(latitud >= (Q1_lat_s - 1.5 * IQR_lat_s) & latitud <= (Q3_lat_s + 1.5 * IQR_lat_s),
         longitud >= (Q1_lon_s - 1.5 * IQR_lon_s) & longitud <= (Q3_lon_s + 1.5 * IQR_lon_s))

# Mapa comprobatorio de la Zona Sur limpia
library(leaflet)
leaflet(base_sur_limpia) %>%
  addTiles() %>%
  addCircleMarkers(~longitud, ~latitud, radius = 3, color = "#228B22", 
                   stroke = FALSE, fillOpacity = 0.5)

Al visualizar espacialmente la oferta de apartamentos, es común encontrar coordenadas atípicas que sitúan inmuebles fuera de la zona sur o incluso fuera del perímetro urbano de Cali. Estas desviaciones ocurren frecuentemente por errores de digitación en los portales inmobiliarios, fallos de precisión del GPS al capturar la ubicación, o valores por defecto de la plataforma.

Para corregir esta distorsión y no sesgar el análisis, se aplicó un filtro de limpieza espacial basado en los rangos intercuartílicos de la latitud y longitud. Como se observa en el mapa comprobatorio, el procedimiento fue exitoso: la muestra definitiva concentra todos los puntos verdes de manera exclusiva en la Zona Sur de la ciudad, cuidando que el modelo posterior evalúe el sector geográfico correcto.

# Análisis exploratorio de correlación (Apartamentos Zona Sur)
library(plotly)

# Preparar variables numéricas para la matriz
datos_cor_sur <- base_sur_limpia %>%
  select(preciom, areaconst, habitaciones, parqueaderos, banios)

# Convertir estrato a numérico para incluirlo en la correlación
datos_cor_sur$estrato <- as.numeric(as.character(base_sur_limpia$estrato))

# Calcular la matriz de correlación
matriz_sur <- cor(datos_cor_sur, use = "complete.obs")

# Generar el gráfico interactivo con plotly
plot_ly(x = colnames(matriz_sur), 
        y = rownames(matriz_sur), 
        z = matriz_sur, 
        type = "heatmap", 
        colorscale = "RdBu") %>%
  layout(title = "Correlación - Apartamentos Zona Sur")

Al analizar el mapa de calor interactivo para los apartamentos de la Zona Sur, se identifican las variables que más influyen en el precio del inmueble:

# Estimación del modelo de regresión lineal múltiple (Zona Sur)
modelo_sur <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, 
                 data = base_sur_limpia)

# Resumen del modelo
summary(modelo_sur)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = base_sur_limpia)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -997.13  -40.39   -0.56   37.32  900.96 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -36.03578   13.09835  -2.751  0.00599 ** 
## areaconst      1.21756    0.05171  23.548  < 2e-16 ***
## estrato4      31.32776    9.58263   3.269  0.00109 ** 
## estrato5      50.51677    9.64171   5.239 1.76e-07 ***
## estrato6     200.12252   11.24550  17.796  < 2e-16 ***
## habitaciones -15.40280    3.75472  -4.102 4.24e-05 ***
## parqueaderos  72.36095    4.12112  17.559  < 2e-16 ***
## banios        40.24659    3.30656  12.172  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 92.08 on 2278 degrees of freedom
## Multiple R-squared:  0.7777, Adjusted R-squared:  0.777 
## F-statistic:  1139 on 7 and 2278 DF,  p-value: < 2.2e-16

Interpretación del Modelo de Regresión (Vivienda 2)

1. Análisis de Coeficientes y Significancia Al evaluar los resultados, se observa que todos los coeficientes del modelo son estadísticamente significativos (p-valor < 0.05). Sus interpretaciones, manteniendo las demás variables constantes (ceteris paribus), son las siguientes:

2. Ajuste del Modelo y Mejoras El modelo presenta un R cuadrado múltiple de 0.7777. Esto significa que las variables estructurales incluidas explican el 77.77% de la variabilidad de los precios de los apartamentos en la Zona Sur. Es un nivel de ajuste muy favorable para datos de sección cruzada en bienes raíces.

Para mejorar el porcentaje de explicación del modelo (R cuadrado), sería necesario incorporar variables externas al conjunto de datos actual que también impactan el precio. Entre ellas se podrían sugerir: la antigüedad del edificio, el valor de la cuota de administración, el piso en el que se ubica el apartamento, y la presencia de amenidades en el conjunto cerrado (piscina, gimnasio, zonas húmedas).

# Validación de supuestos del modelo (Zona Sur)
par(mfrow = c(2, 2))
plot(modelo_sur)

### 4. Validación de Supuestos del Modelo (Vivienda 2)

Al analizar los gráficos de diagnóstico de los residuos para el modelo de la Zona Sur, se evidencian los siguientes comportamientos:

Sugerencias de mejora: Para mitigar los problemas de heterocedasticidad y falta de normalidad identificados, se sugiere metodológicamente: 1. Aplicar una transformación logarítmica a la variable dependiente precio (log(preciom)) y al área construida, lo cual suele estabilizar la varianza y suavizar el efecto de los valores extremos. 2. Auditar manualmente las observaciones influyentes marcadas por el modelo (como el caso 1968) para determinar si corresponden a errores de digitación o a propiedades de lujo reales que deberían aislarse en un segmento de mercado distinto.

# 1. Predicción puntual del modelo para los requerimientos del cliente
cliente_solicitud <- data.frame(
  areaconst = 300,
  estrato = factor(5, levels = levels(base_sur_limpia$estrato)),
  habitaciones = 5,
  parqueaderos = 2,
  banios = 3
)

# Cálculo del precio estimado y su intervalo de confianza
predict(modelo_sur, newdata = cliente_solicitud, interval = "confidence")
##        fit      lwr      upr
## 1 568.1953 546.8901 589.5005
# 2. Búsqueda de opciones reales en el inventario del sur que cumplan con el presupuesto (<= 850M)
ofertas_reales_sur <- base_sur_limpia %>%
  filter(areaconst >= 250, preciom <= 850, habitaciones >= 4, banios >= 3)

# Mostrar cuántas opciones encontró y los detalles de las primeras
head(ofertas_reales_sur)
## # A tibble: 6 × 8
##   preciom areaconst estrato habitaciones parqueaderos banios longitud latitud
##     <dbl>     <dbl> <fct>          <dbl>        <dbl>  <dbl>    <dbl>   <dbl>
## 1     350      270  5                  4            3      3    -76.5    3.39
## 2     650      275  5                  5            2      5    -76.5    3.39
## 3     410      296. 5                  4            2      4    -76.6    3.41
## 4     490      288  5                  4            1      5    -76.6    3.41
## 5     520      320  5                  4            2      4    -76.6    3.41
## 6     690      486  5                  4            2      4    -76.5    3.38

Análisis de Ofertas Potenciales (Zona Sur - Vivienda 2)

A partir del filtrado de la base de datos bajo los criterios de presupuesto máximo ($850 millones), metraje y comodidades requeridas, se identificaron 6 opciones inmobiliarias reales en la Zona Sur que satisfacen plenamente las necesidades de la compañía internacional:

library(leaflet)
# Tomamos estrictamente las 6 ofertas de la tabla
mapa_ofertas <- head(ofertas_reales_sur, 6)

leaflet(mapa_ofertas) %>%
  addTiles() %>%
  addCircleMarkers(~longitud, ~latitud, radius = 8, color = "blue",
                   stroke = FALSE, fillOpacity = 1,
                   popup = paste("<b>Precio:</b>", mapa_ofertas$preciom, "M<br>",
                                 "<b>Área:</b>", mapa_ofertas$areaconst, "m²"))