1 Introducción

C&A (Casas y Apartamentos) recibió una solicitud de asesoría para la compra de dos viviendas por parte de una compañía internacional que desea ubicar a dos de sus empleados en la ciudad de Cali. Este informe presenta un análisis basado en técnicas de modelación estadística para apoyar la toma de decisiones, utilizando datos del mercado inmobiliario de los últimos tres meses.

Resumen de solicitudes:

Característica Vivienda 1 (Casa) Vivienda 2 (Apartamento)
Tipo Casa Apartamento
Área construida 200 m² 300 m²
Parqueaderos 1 3
Baños 2 3
Habitaciones 4 5
Estrato 4 o 5 5 o 6
Zona Norte Sur
Crédito preaprobado $350 millones $850 millones

2 Carga de datos y librerías

# Instalar paqueteMODELOS si no está disponible
# devtools::install_github("centromagis/paqueteMODELOS", force = TRUE)

library(paqueteMODELOS)
library(tidyverse)
library(plotly)
library(leaflet)
library(corrplot)   # Para matriz de correlación
library(car)        # Para pruebas de supuestos (vif, etc.)
library(lmtest)     # Para pruebas de supuestos (Breusch-Pagan, etc.)
library(nortest)    # Para prueba de normalidad (Anderson-Darling)
library(knitr)
library(kableExtra)
library(DataExplorer)
library(skimr)
library(dplyr)

# Cargar datos
data("vivienda")

# Vista general del dataset
glimpse(vivienda)
## Rows: 8,322
## Columns: 13
## $ id           <dbl> 1147, 1169, 1350, 5992, 1212, 1724, 2326, 4386, 1209, 159…
## $ zona         <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur…
## $ piso         <chr> NA, NA, NA, "02", "01", "01", "01", "01", "02", "02", "02…
## $ estrato      <dbl> 3, 3, 3, 4, 5, 5, 4, 5, 5, 5, 6, 4, 5, 6, 4, 5, 5, 4, 5, …
## $ preciom      <dbl> 250, 320, 350, 400, 260, 240, 220, 310, 320, 780, 750, 62…
## $ areaconst    <dbl> 70, 120, 220, 280, 90, 87, 52, 137, 150, 380, 445, 355, 2…
## $ parqueaderos <dbl> 1, 1, 2, 3, 1, 1, 2, 2, 2, 2, NA, 3, 2, 2, 1, 4, 2, 2, 2,…
## $ banios       <dbl> 3, 2, 2, 5, 2, 3, 2, 3, 4, 3, 7, 5, 6, 2, 4, 4, 4, 3, 2, …
## $ habitaciones <dbl> 6, 3, 4, 3, 3, 3, 3, 4, 6, 3, 6, 5, 6, 2, 5, 5, 4, 3, 3, …
## $ tipo         <chr> "Casa", "Casa", "Casa", "Casa", "Apartamento", "Apartamen…
## $ barrio       <chr> "20 de julio", "20 de julio", "20 de julio", "3 de julio"…
## $ longitud     <dbl> -76.51168, -76.51237, -76.51537, -76.54000, -76.51350, -7…
## $ latitud      <dbl> 3.43382, 3.43369, 3.43566, 3.43500, 3.45891, 3.36971, 3.4…
library(mice)

# Ver patrón de datos faltantes
md.pattern(vivienda, rotate.names = TRUE)

##      preciom id zona estrato areaconst banios habitaciones tipo barrio longitud
## 4808       1  1    1       1         1      1            1    1      1        1
## 1909       1  1    1       1         1      1            1    1      1        1
## 876        1  1    1       1         1      1            1    1      1        1
## 726        1  1    1       1         1      1            1    1      1        1
## 1          1  0    0       0         0      0            0    0      0        0
## 2          0  0    0       0         0      0            0    0      0        0
##            2  3    3       3         3      3            3    3      3        3
##      latitud parqueaderos piso     
## 4808       1            1    1    0
## 1909       1            1    0    1
## 876        1            0    1    1
## 726        1            0    0    2
## 1          0            0    0   12
## 2          0            0    0   13
##            3         1605 2638 4275
# Imputación múltiple (m=5 imputaciones, método predictive mean matching)
vivienda_imp <- mice(vivienda, 
                     m       = 5,        # número de imputaciones
                     method  = "pmm",    # predictive mean matching
                     seed    = 123,      # reproducibilidad
                     printFlag = FALSE)

# Extraer un conjunto imputado completo (el primero de los 5)
vivienda_completo <- complete(vivienda_imp, action = 1)

# Verificar que no quedan NAs en parqueaderos
cat("NAs en parqueaderos antes de imputar:", sum(is.na(vivienda$parqueaderos)), "\n")
## NAs en parqueaderos antes de imputar: 1605
cat("NAs en parqueaderos después de imputar:", sum(is.na(vivienda_completo$parqueaderos)), "\n")
## NAs en parqueaderos después de imputar: 0
vivienda <- vivienda_completo

3 VIVIENDA 1: Casa en Zona Norte

3.1 Paso 1: Filtro de datos

Se construye la base de datos base1 filtrando únicamente las casas ubicadas en la Zona Norte de Cali. Los nombres de las categorías están en mayúsculas, conforme al estándar del dataset original.

# Preprocesamiento: estandarizar variables categóricas a mayúsculas
vivienda <- vivienda %>%
  mutate(
    tipo = toupper(tipo),
    zona = toupper(zona),
    barrio = toupper(barrio)
  )

# Filtrar: Casas en Zona Norte
base1 <- vivienda %>%
  filter(tipo == "CASA", zona == "ZONA NORTE")

cat("Número de registros en base1 (Casas - Zona Norte):", nrow(base1), "\n")
## Número de registros en base1 (Casas - Zona Norte): 722

3.1.1 Primeros 3 registros

kable(head(base1, 3),
      caption = "Tabla 1. Primeros 3 registros - Casas Zona Norte",
      align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Tabla 1. Primeros 3 registros - Casas Zona Norte
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
1209 ZONA NORTE 02 5 320 150 2 4 6 CASA ACOPI -76.51341 3.47968
1592 ZONA NORTE 02 5 780 380 2 3 3 CASA ACOPI -76.51674 3.48721
4057 ZONA NORTE 02 6 750 445 3 7 6 CASA ACOPI -76.52950 3.38527

Los tres primeros registros corresponden al barrio Acopi, todos en estrato 5 y 6, con precios entre $320M y $780M y áreas entre 150 y 445 m²

3.1.2 Verificación del filtro

# Tabla de frecuencias tipo x zona para confirmar el filtro
tab_verificacion <- base1 %>%
  count(tipo, zona) %>%
  rename(`Tipo` = tipo, `Zona` = zona, `N registros` = n)

kable(tab_verificacion,
      caption = "Tabla 2. Verificación del filtro: tipo y zona",
      align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Tabla 2. Verificación del filtro: tipo y zona
Tipo Zona N registros
CASA ZONA NORTE 722
# Distribución de estratos en base1
tab_estrato <- base1 %>%
  count(estrato) %>%
  rename(`Estrato` = estrato, `N registros` = n) %>%
  mutate(`Porcentaje (%)` = round(`N registros` / sum(`N registros`) * 100, 1))

kable(tab_estrato,
      caption = "Tabla 3. Distribución por estrato - Casas Zona Norte",
      align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Tabla 3. Distribución por estrato - Casas Zona Norte
Estrato N registros Porcentaje (%)
3 235 32.5
4 161 22.3
5 271 37.5
6 55 7.6

los 722 registros corresponden exclusivamente a CASA en ZONA NORTE, sin contaminación de otros tipos o zonas.

El mercado objetivo (estratos 4 y 5) representa el 59.8% de la oferta disponible — una base razonablemente amplia para encontrar opciones.

3.1.3 Mapa de ubicación - Casas Zona Norte

# Paleta de colores por estrato
pal1 <- colorFactor(palette = c("#2196F3","#4CAF50","#FF9800","#F44336"),
                    domain = base1$estrato)

leaflet(base1) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addCircleMarkers(
    lng        = ~longitud,
    lat        = ~latitud,
    radius     = 5,
    color      = ~pal1(estrato),
    fillOpacity = 0.8,
    stroke     = FALSE,
    popup      = ~paste0(
      "<b>Barrio:</b> ", barrio, "<br>",
      "<b>Estrato:</b> ", estrato, "<br>",
      "<b>Precio:</b> $", preciom, " M<br>",
      "<b>Área:</b> ", areaconst, " m²<br>",
      "<b>Habitaciones:</b> ", habitaciones, "<br>",
      "<b>Baños:</b> ", banios
    )
  ) %>%
  addLegend("bottomright",
            pal    = pal1,
            values = ~estrato,
            title  = "Estrato",
            opacity = 0.9) %>%
  addLegend("topright",
            colors = "gray",
            labels = paste0("n = ", nrow(base1), " casas"),
            title  = "Zona Norte")

Discusión del mapa: Al visualizar los puntos sobre el mapa de Cali, la mayoría de los registros se concentran en la franja norte de la ciudad, abarcando barrios como el norte de Granada, El Refugio, Ciudad Jardín Norte y sectores aledaños. Sin embargo, es posible observar algunos puntos dispersos que se alejan de la zona geográfica esperada. Esto puede deberse a que la clasificación por zona en el dataset responde a criterios administrativos o catastrales del sistema inmobiliario, los cuales no siempre coinciden exactamente con los límites geográficos informales de la “Zona Norte” de Cali. En consecuencia, ciertos barrios limítrofes pueden estar asignados a esta zona aunque físicamente se perciban como parte de otra área.


3.2 Paso 2: Análisis Exploratorio de Datos (EDA)

El EDA tiene como objetivo explorar la relación entre el precio de la vivienda (preciom) y las variables predictoras clave: área construida, estrato, número de baños, número de habitaciones y número de parqueaderos.

3.2.1 Estadísticas descriptivas generales

desc_v1 <- base1 %>%
  select(preciom, areaconst, estrato, habitaciones, parqueaderos, banios) %>%
  summarise(across(everything(), list(
    Media   = ~round(mean(., na.rm = TRUE), 1),
    Mediana = ~round(median(., na.rm = TRUE), 1),
    DE      = ~round(sd(., na.rm = TRUE), 1),
    Min     = ~round(min(., na.rm = TRUE), 1),
    Max     = ~round(max(., na.rm = TRUE), 1)
  ))) %>%
  pivot_longer(everything(),
               names_to  = c("Variable", "Estadístico"),
               names_sep = "_") %>%
  pivot_wider(names_from = "Estadístico", values_from = "value")

kable(desc_v1,
      caption = "Tabla 4. Estadísticas descriptivas - Casas Zona Norte",
      align   = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Tabla 4. Estadísticas descriptivas - Casas Zona Norte
Variable Media Mediana DE Min Max
preciom 445.9 390 268.4 89 1940
areaconst 264.9 240 167.2 30 1440
estrato 4.2 4 1.0 3 6
habitaciones 4.5 4 1.8 0 10
parqueaderos 2.0 2 1.3 1 10
banios 3.6 3 1.5 0 10

Apreciaciones:

  • La mediana menor que la media indica sesgo positivo, pocas casas muy caras jalan el promedio hacia arriba.

  • La casa típica tiene 240 m², la solicitud pide 200 m² — está por debajo del promedio, lo que es favorable para el presupuesto.

  • El estrato típico es 4

  • La configuración típica es 4 habitaciones.

  • Distribución del precio

plot_ly(base1, x = ~preciom, type = "histogram",
        nbinsx = 40,
        marker = list(color = "steelblue",
                      line  = list(color = "white", width = 0.5))) %>%
  layout(
    title  = list(text = "Figura 1. Distribución del precio de casas - Zona Norte"),
    xaxis  = list(title = "Precio (millones COP)"),
    yaxis  = list(title = "Frecuencia"),
    bargap = 0.05
  )

Distribucion del precio: La distribución del precio es claramente asimétrica hacia la derecha, la mayoría de las casas se concentran entre $89M y $600M, pero hay una cola de propiedades de alto valor que llegan hasta $1.940M. Esto confirma que la mediana ($390M) es más representativa del mercado que la media ($445.9M). El crédito preaprobado de $350M se ubica por debajo de la mediana, lo que significa que la búsqueda se enfoca en el 50% más económico del mercado.

3.2.2 Precio vs Área construida

plot_ly(base1, x = ~areaconst, y = ~preciom,
        type   = "scatter",
        mode   = "markers",
        color  = ~factor(estrato),
        colors = c("#2196F3","#4CAF50","#FF9800","#F44336"),
        marker = list(opacity = 0.7, size = 7),
        text   = ~paste0("Barrio: ", barrio,
                         "<br>Precio: $", preciom, " M",
                         "<br>Área: ", areaconst, " m²",
                         "<br>Estrato: ", estrato),
        hoverinfo = "text") %>%
  layout(
    title  = list(text = "Figura 2. Precio vs Área construida (color = estrato)"),
    xaxis  = list(title = "Área construida (m²)"),
    yaxis  = list(title = "Precio (millones COP)"),
    legend = list(title = list(text = "Estrato"))
  )

Se evidencia una relación positiva clara que indica que a mayor área, mayor precio. Los puntos coloreados por estrato muestran que las casas de estrato 5 y 6 se concentran en la esquina superior derecha (más grandes y más caras), mientras que los estratos 3 y 4 forman el grueso del mercado en el rango de interés. La dispersión es considerable, lo que explica el R² moderado del modelo.

3.2.3 Precio por Estrato

plot_ly(base1, x = ~factor(estrato), y = ~preciom,
        type   = "box",
        color  = ~factor(estrato),
        colors = c("#2196F3","#4CAF50","#FF9800","#F44336"),
        boxpoints = "outliers") %>%
  layout(
    title  = list(text = "Figura 3. Distribución del precio por estrato"),
    xaxis  = list(title = "Estrato socioeconómico"),
    yaxis  = list(title = "Precio (millones COP)"),
    showlegend = FALSE
  )

Las medianas crecen progresivamente con el estrato, confirmando que el estrato es un determinante importante del precio. Sin embargo, hay solapamiento notable entre estratos contiguos, especialmente entre 4 y 5, puede significar que es posible encontrar una casa de estrato 4 bien ubicada a un precio similar al de una de estrato 5 con características inferiores.

3.2.4 Precio por Número de Baños

plot_ly(base1, x = ~factor(banios), y = ~preciom,
        type      = "box",
        color     = ~factor(banios),
        boxpoints = "outliers") %>%
  layout(
    title  = list(text = "Figura 4. Distribución del precio por número de baños"),
    xaxis  = list(title = "Número de baños"),
    yaxis  = list(title = "Precio (millones COP)"),
    showlegend = FALSE
  )

A mayor número de baños, mayor precio, aunque la relación no es perfectamente lineal. Las casas con 2 baños se ubican en el rango medio-bajo de precios, coherente con el presupuesto disponible. Se observan valores atípicos en categorías de 6+ baños, propiedades de lujo que no son relevantes para esta búsqueda.

3.2.5 Precio por Número de Habitaciones

plot_ly(base1, x = ~factor(habitaciones), y = ~preciom,
        type      = "box",
        color     = ~factor(habitaciones),
        boxpoints = "outliers") %>%
  layout(
    title  = list(text = "Figura 5. Distribución del precio por número de habitaciones"),
    xaxis  = list(title = "Número de habitaciones"),
    yaxis  = list(title = "Precio (millones COP)"),
    showlegend = FALSE
  )

La relación es positiva hasta 5-6 habitaciones, pero irregular en categorías extremas (0-1 o 9-10 habitaciones) que tienen muy pocos registros. Las casas de 4 habitaciones muestran una distribución amplia de precios, lo que confirma que las habitaciones por sí solas no determinan el precio, el área y el estrato pesan más.

3.2.6 Precio por Número de Parqueaderos

plot_ly(base1, x = ~factor(parqueaderos), y = ~preciom,
        type      = "box",
        color     = ~factor(parqueaderos),
        boxpoints = "outliers") %>%
  layout(
    title  = list(text = "Figura 6. Distribución del precio por número de parqueaderos"),
    xaxis  = list(title = "Número de parqueaderos"),
    yaxis  = list(title = "Precio (millones COP)"),
    showlegend = FALSE
  )

Existe una tendencia positiva entre más parqueaderos, mayor precio. La categoría de un parqueadero se ubica en el rango más bajo, favorable para el presupuesto. Después de la imputación, esta variable tiene mayor representación en todas sus categorías, lo que estabiliza la distribución.

3.2.7 Matriz de correlación

library(corrplot)

# Variables numéricas de interés
vars_num <- base1 %>%
  select(preciom, areaconst, estrato, habitaciones, parqueaderos, banios) %>%
  filter(complete.cases(.))

cor_mat1 <- cor(vars_num, method = "spearman")

# Visualización interactiva con plotly (heatmap)
plot_ly(
  x = colnames(cor_mat1),
  y = colnames(cor_mat1),
  z = round(cor_mat1, 2),
  type       = "heatmap",
  colorscale = "RdBu",
  zmin = -1, zmax = 1,
  text       = round(cor_mat1, 2),
  texttemplate = "%{text}",
  showscale  = TRUE
) %>%
  layout(
    title = list(text = "Figura 7. Matriz de correlación - Casas Zona Norte"),
    xaxis = list(title = ""),
    yaxis = list(title = "")
  )
  • areaconst (ρ = 0.78) : predictor dominante

  • estrato (ρ = 0.60) : segunda variable más influyente

  • banios (ρ = 0.56) : correlación moderada-alta

  • parqueaderos (ρ = 0.48) : correlación moderada

  • habitaciones (ρ = 0.37) : la más débil

La correlación entre predictores más alta es baños y habitaciones (ρ = 0.55), señal de dependencia entre variables pero sin llegar a niveles problemáticos de multicolinealidad.

3.3 Paso 3: Modelo de Regresión Lineal Múltiple

Siguiendo el mismo criterio metodológico que para la Vivienda 2, se estima el modelo de regresión lineal múltiple con variables continuas únicamente. Los registros con valores faltantes en parqueaderos son excluidos automáticamente mediante eliminación por lista.

# Modelo con variables continuas únicamente
modelo1 <- lm(preciom ~ areaconst + habitaciones + parqueaderos + banios,
              data = base1)

# Resumen del modelo
resumen1 <- summary(modelo1)

# Tabla de coeficientes formateada
coef_tabla1 <- as.data.frame(resumen1$coefficients)
coef_tabla1 <- coef_tabla1 %>%
  mutate(
    Significancia = case_when(
      `Pr(>|t|)` < 0.001 ~ "***",
      `Pr(>|t|)` < 0.01  ~ "**",
      `Pr(>|t|)` < 0.05  ~ "*",
      `Pr(>|t|)` < 0.1   ~ ".",
      TRUE                ~ ""
    )
  )
colnames(coef_tabla1) <- c("Estimado", "Error Estándar", "Valor t", "p-valor", "Sig.")

kable(round(coef_tabla1[, 1:4], 4),
      caption = "Tabla 14. Coeficientes del modelo de regresión - Casas Zona Norte",
      align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  add_footnote(c("Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1",
                 paste0("R² = ", round(resumen1$r.squared, 4),
                        " | R² ajustado = ", round(resumen1$adj.r.squared, 4),
                        " | F = ", round(resumen1$fstatistic[1], 2))),
               notation = "none")
Tabla 14. Coeficientes del modelo de regresión - Casas Zona Norte
Estimado Error Estándar Valor t p-valor
(Intercept) 37.1450 18.2849 2.0315 0.0426
areaconst 0.9178 0.0445 20.6298 0.0000
habitaciones -9.9099 4.2225 -2.3470 0.0192
parqueaderos 42.1300 5.5730 7.5596 0.0000
banios 35.3345 5.5459 6.3713 0.0000
Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1
R² = 0.6125 | R² ajustado = 0.6104 | F = 283.36

Interpretación de coeficientes:

  • Intercepto ($37.1M, p = 0.043): Precio teórico base cuando todos los predictores son cero. Sin interpretación práctica en el mercado inmobiliario.

  • areaconst (0.92M por m², p < 0.001): Por cada metro cuadrado adicional de área construida, el precio de la casa aumenta en promedio 920.000 pesos. Es el predictor más estable y significativo del modelo. Para la solicitud de 200 m², este predictor contribuye aproximadamente $184M al precio base.

  • habitaciones (-9.9M por habitación, p = 0.019): Efecto negativo y significativo. Controlando por área construida, cada habitación adicional reduce el precio en 9.9M en promedio. Esto es coherente: si el área está fija y se agregan habitaciones, cada una resulta más pequeña, reduciendo el valor percibido. En términos comerciales, una casa de 200 m² con 6 habitaciones pequeñas vale menos que una con 4 habitaciones amplias.

  • parqueaderos (42.1M por parqueadero, p < 0.001): Cada parqueadero adicional agrega 42.1M al precio — el efecto marginal más alto de todas las variables de conteo. Refleja la alta valoración del parqueadero en el mercado de casas de la Zona Norte. Para la solicitud de 1 parqueadero, este predictor contribuye 42.1M al precio estimado.

  • banios (35.3M por baño, p < 0.001): Cada baño adicional agrega 35.3M. Los baños reflejan indirectamente el nivel de acabados y la amplitud de la vivienda. Para la solicitud de 2 baños, contribuyen 70.7M al precio estimado.

  • R² = 0.61: El modelo explica el 61.3% de la variabilidad del precio de las casas en Zona Norte. El 38.7% restante no capturado refleja factores no incluidos en el modelo: ubicación específica dentro de la zona, antigüedad de la construcción, calidad de acabados, estado de conservación, negociación individual y, notablemente, el estrato que fue excluido a pesar de tener ρ = 0.60 con el precio.


3.4 Paso 4: Validación de Supuestos

# Datos diagnósticos
diag_df1 <- data.frame(
  fitted    = fitted(modelo1),
  residuals = residuals(modelo1),
  std_resid = rstandard(modelo1),
  obs       = 1:length(fitted(modelo1))
)

# 1. Residuales vs Valores ajustados
p_rv1 <- plot_ly(diag_df1, x = ~fitted, y = ~residuals,
                 type = "scatter", mode = "markers",
                 marker = list(color = "steelblue", opacity = 0.5, size = 5)) %>%
  add_lines(x = range(diag_df1$fitted), y = c(0, 0),
            line = list(color = "black", dash = "dash")) %>%
  layout(
    title  = list(text = "Figura 8. Residuales vs Valores ajustados"),
    xaxis  = list(title = "Valores ajustados (millones COP)"),
    yaxis  = list(title = "Residuales"),
    showlegend = FALSE
  )
p_rv1
# 2. QQ-plot
qq1    <- qqnorm(diag_df1$std_resid, plot.it = FALSE)
qq_df1 <- data.frame(teorico = qq1$x, muestral = qq1$y)

p_qq1 <- plot_ly(qq_df1, x = ~teorico, y = ~muestral,
                 type = "scatter", mode = "markers",
                 marker = list(color = "steelblue", opacity = 0.5, size = 5)) %>%
  add_lines(x = range(qq_df1$teorico), y = range(qq_df1$teorico),
            line = list(color = "black", dash = "dash")) %>%
  layout(
    title  = list(text = "Figura 9. Q-Q Plot de residuales estandarizados"),
    xaxis  = list(title = "Cuantiles teóricos"),
    yaxis  = list(title = "Cuantiles muestrales"),
    showlegend = FALSE
  )
p_qq1
# 3. Scale-Location
p_sl1 <- plot_ly(diag_df1, x = ~fitted, y = ~sqrt(abs(std_resid)),
                 type = "scatter", mode = "markers",
                 marker = list(color = "steelblue", opacity = 0.5, size = 5)) %>%
  layout(
    title  = list(text = "Figura 10. Scale-Location"),
    xaxis  = list(title = "Valores ajustados (millones COP)"),
    yaxis  = list(title = "√|Residuales estandarizados|"),
    showlegend = FALSE
  )
p_sl1
# 4. Histograma de residuales
p_hist1 <- plot_ly(diag_df1, x = ~residuals, type = "histogram",
                   nbinsx = 40,
                   marker = list(color = "steelblue",
                                 line = list(color = "white", width = 0.5))) %>%
  layout(
    title  = list(text = "Figura 11. Distribución de residuales"),
    xaxis  = list(title = "Residuales"),
    yaxis  = list(title = "Frecuencia"),
    bargap = 0.05
  )
p_hist1
  • Figura 8. Residuales vs Valores ajustados: Se espera una nube aleatoria alrededor de cero. Si se observa un patrón en forma de embudo (varianza creciente) confirma la heterocedasticidad detectada por Breusch-Pagan — común en datos de precios donde la variabilidad aumenta con el valor de la propiedad.

  • Figura 9. QQ-Plot: Las colas del QQ-plot se alejan de la línea diagonal, especialmente en los extremos, confirmando la no normalidad de los residuales. Esto es típico cuando hay propiedades de lujo ($1.000M+) que generan residuales grandes.

  • Figura 10. Scale-Location: Si la línea roja tiene pendiente positiva, confirma heterocedasticidad — el modelo predice mejor las casas baratas que las caras, lo que es esperable en un mercado tan heterogéneo.

  • Figura 11. Histograma de residuales: Se espera una distribución aproximadamente simétrica centrada en cero, pero con colas más pesadas de lo normal por los valores atípicos del mercado de lujo.

# Pruebas formales
ad1  <- ad.test(residuals(modelo1))
bp1  <- bptest(modelo1)
vif1 <- vif(modelo1)

# Tabla resumen supuestos
supuestos_tabla1 <- data.frame(
  Supuesto    = c("Normalidad de residuales", "Homocedasticidad"),
  Prueba      = c("Anderson-Darling", "Breusch-Pagan"),
  Estadístico = c(round(ad1$statistic, 4), round(bp1$statistic, 4)),
  `p-valor`   = c(format.pval(ad1$p.value, digits = 4),
                  format.pval(bp1$p.value, digits = 4)),
  Conclusión  = c(
    ifelse(ad1$p.value < 0.05, "Se rechaza H₀: residuales NO normales", "No se rechaza H₀: residuales normales"),
    ifelse(bp1$p.value < 0.05, "Se rechaza H₀: varianza NO constante (heterocedasticidad)", "No se rechaza H₀: varianza constante")
  )
)

kable(supuestos_tabla1,
      caption = "Tabla 15. Resumen de pruebas de supuestos - Modelo Casas Zona Norte",
      align   = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE)
Tabla 15. Resumen de pruebas de supuestos - Modelo Casas Zona Norte
Supuesto Prueba Estadístico p.valor Conclusión
A Normalidad de residuales Anderson-Darling 26.3792 < 2.2e-16 Se rechaza H₀: residuales NO normales
BP Homocedasticidad Breusch-Pagan 145.0123 < 2.2e-16 Se rechaza H₀: varianza NO constante (heterocedasticidad)
# Tabla VIF
vif_tabla1 <- data.frame(
  Variable    = names(vif1),
  VIF         = round(vif1, 4),
  Diagnóstico = ifelse(vif1 > 10, "Multicolinealidad severa",
                       ifelse(vif1 > 5, "Multicolinealidad moderada", "Sin problema"))
)

kable(vif_tabla1,
      caption = "Tabla 16. Factor de Inflación de Varianza (VIF) - Modelo Casas Zona Norte",
      align   = "c",
      row.names = FALSE) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Tabla 16. Factor de Inflación de Varianza (VIF) - Modelo Casas Zona Norte
Variable VIF Diagnóstico
areaconst 1.4210 Sin problema
habitaciones 1.5302 Sin problema
parqueaderos 1.3967 Sin problema
banios 1.8351 Sin problema

Interpretación de supuestos:

  • Linealidad (Figura 8): Se evalúa si los residuales se distribuyen aleatoriamente alrededor de cero, el patrón sistemático al lado izquierdo del grafico sugiere una relación no lineal entre el precio y los predictores.

  • Normalidad (Figuras 9, 11 y Tabla 15): Dado el tamaño muestral de 722 registros, el Teorema del Límite Central garantiza validez asintótica de las inferencias incluso si los residuales no son estrictamente normales.

  • Homocedasticidad (Figura 10 y Tabla 15): Breusch-Pagan = 145.01, p < 2.2e-16 → Heterocedasticidad confirmada, es común en datos de precios de vivienda, donde la variabilidad del precio tiende a aumentar con el valor de la propiedad, se sugiere usar mínimos cuadrados ponderados (WLS) o errores estándar robustos de Huber-White.

  • Multicolinealidad (Tabla 16): VIF < 5 indica ausencia de multicolinealidad problemática. Valores entre 5 y 10 sugieren correlación moderada entre predictores, y superiores a 10 indicarían un problema severo, no hubo reportes de estos valores.


3.5 Paso 5: Predicción - Vivienda 1

Se estima el precio de una casa con las características exactas de la solicitud: 200 m² de área construida, estrato 4 o 5, 4 habitaciones, 1 parqueadero y 2 baños. Se realizan predicciones para ambos estratos solicitados.

# Solicitud - Vivienda 1 (estrato 4)
solicitud1_e4 <- data.frame(
  areaconst    = 200,
  habitaciones = 4,
  parqueaderos = 1,
  banios       = 2
)

# Predicciones
pred1    <- predict(modelo1, newdata = solicitud1_e4,
                    interval = "prediction", level = 0.95)
pred1_ci <- predict(modelo1, newdata = solicitud1_e4,
                    interval = "confidence",  level = 0.95)

# Tabla de resultados
pred_tabla1 <- data.frame(
  ` `                    = c("Precio estimado",
                             "Intervalo de predicción 95% (límite inferior)",
                             "Intervalo de predicción 95% (límite superior)",
                             "Intervalo de confianza 95% (límite inferior)",
                             "Intervalo de confianza 95% (límite superior)"),
  `Valor (millones COP)` = c(round(pred1[1, "fit"], 2),
                             round(pred1[1, "lwr"], 2),
                             round(pred1[1, "upr"], 2),
                             round(pred1_ci[1, "lwr"], 2),
                             round(pred1_ci[1, "upr"], 2))
)

kable(pred_tabla1,
      caption = "Tabla 17. Resultados de predicción - Casa Zona Norte (200 m², 4 hab., 1 parq., 2 baños)",
      align   = c("l", "c"),
      col.names = c("Resultado", "Valor (millones COP)")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Tabla 17. Resultados de predicción - Casa Zona Norte (200 m², 4 hab., 1 parq., 2 baños)
Resultado Valor (millones COP)
Precio estimado 293.86
Intervalo de predicción 95% (límite inferior) -35.55
Intervalo de predicción 95% (límite superior) 623.27
Intervalo de confianza 95% (límite inferior) 275.21
Intervalo de confianza 95% (límite superior) 312.50
cat("\nPrecio estimado:", round(pred1[1, "fit"], 2), "millones COP\n")
## 
## Precio estimado: 293.86 millones COP
cat("Crédito preaprobado: 350 millones COP\n")
## Crédito preaprobado: 350 millones COP
cat("Diferencia:", round(350 - pred1[1, "fit"], 2), "millones\n")
## Diferencia: 56.14 millones

El precio estimado de 293.86M está 56.14M por debajo del crédito preaprobado de 350M, lo que le da a la empresa un margen de negociación cómodo. El intervalo de confianza al 95% (275.2M – 312.5M) es preciso y completamente dentro del presupuesto. Sin embargo, el intervalo de predicción individual (-35.6M a $623.3M) es muy amplio — reflejo del R² de 0.61 y la alta variabilidad intrínseca del mercado. El límite inferior negativo es matemáticamente posible pero comercialmente incoherente, y es una señal de que el modelo tiene dificultades para predecir propiedades individuales con alta precisión.


3.6 Paso 6: Ofertas Recomendadas - Vivienda 1

# Filtrar ofertas que cumplen criterios de la solicitud
ofertas1 <- base1 %>%
  filter(
    preciom      <= 350,
    estrato      %in% c(4, 5),
    habitaciones >= 4,
    parqueaderos >= 1,
    banios       >= 2,
    areaconst    >= 160   # margen del 20% sobre los 200m² solicitados
  ) %>%
  arrange(abs(preciom - pred1[1, "fit"])) %>%
  mutate(
    `Diferencia vs estimado (M)` = round(preciom - pred1[1, "fit"], 2),
    `Dentro del crédito`         = ifelse(preciom <= 350, "✓ Sí", "✗ No")
  )

# Seleccionar columnas relevantes
ofertas1_display <- ofertas1 %>%
  select(barrio, estrato, preciom, areaconst,
         habitaciones, parqueaderos, banios,
         `Diferencia vs estimado (M)`) %>%
  head(5)

kable(ofertas1_display,
      caption = "Tabla 18. Top 5 ofertas recomendadas - Casa Zona Norte",
      align   = "c",
      col.names = c("Barrio", "Estrato", "Precio (M)", "Área (m²)",
                    "Habitaciones", "Parqueaderos", "Baños",
                    "Δ vs estimado (M)")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  column_spec(3, bold = TRUE, color = "white",
              background = "#2196F3")
Tabla 18. Top 5 ofertas recomendadas - Casa Zona Norte
Barrio Estrato Precio (M) Área (m²) Habitaciones Parqueaderos Baños Δ vs estimado (M)
GRANADA 4 296 232 4 1 6 2.14
VIPASA 5 300 205 6 2 5 6.14
LOS ANDES 4 280 180 4 2 3 -13.86
EL BOSQUE 4 315 270 4 2 4 21.14
VIPASA 4 270 171 4 3 4 -23.86

3.6.1 Mapa de ofertas recomendadas - Vivienda 1

top5_v1 <- ofertas1 %>% head(5)
top5_v1 <- top5_v1 %>% mutate(rank = paste0("Opción ", row_number()))

pal_ofertas1 <- colorNumeric(palette = "Blues",
                              domain  = top5_v1$preciom)

leaflet(top5_v1) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addCircleMarkers(
    lng         = ~longitud,
    lat         = ~latitud,
    radius      = 12,
    color       = ~pal_ofertas1(preciom),
    fillOpacity = 0.9,
    stroke      = TRUE,
    weight      = 2,
    popup       = ~paste0(
      "<b>", rank, "</b><br>",
      "<b>Barrio:</b> ", barrio, "<br>",
      "<b>Estrato:</b> ", estrato, "<br>",
      "<b>Precio:</b> $", preciom, " M<br>",
      "<b>Área:</b> ", areaconst, " m²<br>",
      "<b>Habitaciones:</b> ", habitaciones, "<br>",
      "<b>Baños:</b> ", banios, "<br>",
      "<b>Parqueaderos:</b> ", parqueaderos
    ),
    label = ~rank
  ) %>%
  addLegend("bottomright",
            pal     = pal_ofertas1,
            values  = ~preciom,
            title   = "Precio (M COP)",
            opacity = 0.9)
  • Opción 1 Granada (296M, 232 m²): La más cercana al precio estimado. Estrato 4, área superior a los 200 m² solicitados, cumple exactamente las 4 habitaciones y tiene 6 baños, muy por encima de los 2 solicitados, lo que sugiere una propiedad con buen nivel de acabados. Es la recomendación principal.

  • Opción 2 Vipasa (300M, 205 m²): Estrato 5, apenas por encima de los 200 m² solicitados. Tiene 6 habitaciones, más de lo requerido pero en 205 m² implican habitaciones relativamente pequeñas. Válida si la ubicación en estrato 5 es prioritaria para la empresa.

  • Opción 3 Los Andes (280M, 180 m²): La más económica del listado y 13.9M por debajo del estimado. Área ligeramente inferior a los 200 m² solicitados , punto a negociar. Estrato 4, 3 baños. Opción válida si el presupuesto es la prioridad.

  • Opción 4 El Bosque (315M, 270 m²): La de mayor área del listado con 270 m², 35% más de lo solicitado. Estrato 4, precio más alto pero aún dentro del crédito con $35M de margen. Es la mejor opción en relación área/precio si el espacio es prioritario.

  • Opción 5 Vipasa (270M, 171 m²): La más económica y la que más se aleja del estimado (-23.9M). Área por debajo de lo solicitado (171 m² vs 200 m²), pero tiene 3 parqueaderos más de lo requerido. Podría ser útil si la empresa valora tener parqueadero adicional, sin embargo poco probable.


4 VIVIENDA 2: Apartamento en Zona Sur

4.1 Filtro de datos

En este escenario se filtra el dataset inicial con las siguientes condiciones:

tipo=Apartamento

zona=Zona Sur

Conteo de datos

Una vez filtrado el dataset se observa que hay 2787 casas ubicadas en la zona sur.

## Número de registros de Apartamentos - Zona Sur: 2787

Primeros 3 registros

Tabla 2. Primeros 3 registros - Apartamento Zona Sur
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
5098 ZONA SUR 05 4 290 96 1 2 3 APARTAMENTO ACOPI -76.53464 3.44987
698 ZONA SUR 02 3 78 40 1 1 2 APARTAMENTO AGUABLANCA -76.50100 3.40000
8199 ZONA SUR NA 6 875 194 2 5 3 APARTAMENTO AGUACATAL -76.55700 3.45900

Como se observa en la tabla anterior todos los datos corresponden al filtro especificado y a pesar que sean casas ubicadas en la misma zona difieren en algunas variables lo cual indica que el sur de cali no es homogéneo. Adicionalmente, se observan barrios como aguablanca y acopi los cuales no pertencen al sur de Cali, de modo que se podría decir que existe un error en esa variable.

4.2 Mapa de la zona sur

En el mapa es posible evidenciar que las casas no están correctamente etiquetadas con respecto a la zona, ya que se observan puntos distribuidos a lo largo de toda la ciudad, incluyendo las zonas oriente, occidente y norte. Esto sugiere la presencia de observaciones que han sido clasificadas como Zona Sur cuando en realidad pertenecen a otras áreas.

Esta situación podría afectar el modelo de regresión lineal, debido a que se estarían incluyendo datos que no corresponden a la zona de interés, lo que puede introducir ruido en el análisis y sesgar las estimaciones del modelo.

Como recomendación, para mejorar el proceso de filtrado se podría considerar la variable longitud y establecer un límite horizontal que permita discriminar con mayor precisión las viviendas ubicadas realmente en la zona sur.

4.3 Análsis exploratorio de los datos

Teniendo en cuenta que las variables a utilizar en el modelo de regresión lineal múltiple son: areaconst,preciom,zona,estrato, parqueaderos, banios, habitaciones, se procede a realizar un análisis exploratorio con enfásis en ellas.

4.3.1 Estadísticas Descriptivas

El conjunto de datos analizado contiene 2787 observaciones y 7 variables, de las cuales 5 son numéricas, 1 es categórica tipo factor y 1 es de tipo carácter.

La variable zona es de tipo carácter y no presenta valores faltantes. Además, solo contiene un valor único, lo cual es consistente con el proceso de filtrado del conjunto de datos, ya que todas las observaciones corresponden a la Zona Sur.

La variable estrato es de tipo factor ordenado y tampoco presenta datos faltantes. Se identifican cuatro niveles de estrato socioeconómico (3, 4, 5 y 6). La mayor proporción de viviendas corresponde al estrato 4 con 1091 observaciones, seguido del estrato 5 con 1033, estrato 6 con 462 y estrato 3 con 201 observaciones. Esto sugiere que el conjunto de datos está compuesto principalmente por viviendas de estratos medios y medio-altos.

En cuanto a las variables numéricas, se observan las siguientes características:

  • Área construida (areaconst): presenta un promedio de 97.47 m² con una desviación estándar de 52.57, lo que indica una variabilidad moderada en el tamaño de las viviendas. Los valores oscilan entre 40 m² y 932 m², lo que sugiere la presencia de algunas propiedades considerablemente más grandes que el promedio.

  • Precio (preciom): tiene un promedio de 297.29 millones de COP y una desviación estándar de 191.55, lo que evidencia una dispersión considerable en los precios de las viviendas. El rango observado va desde 75 millones hasta 1750 millones de COP, lo que indica la existencia de propiedades de alto valor dentro del conjunto de datos.

  • Parqueaderos (parqueaderos): es la única variable que presenta valores faltantes, con 406 observaciones sin información, lo que corresponde aproximadamente al 15% del total de los datos. El número promedio de parqueaderos es 1.41, con valores que van desde 1 hasta 10.

  • Baños (banios): presenta un promedio de 2.49 baños por vivienda, con valores entre 0 y 8, lo que refleja cierta variabilidad en las características de las propiedades.

  • Habitaciones (habitaciones): tiene un promedio de 2.97 habitaciones, con un rango entre 0 y 6, lo cual es consistente con el tamaño promedio de las viviendas observado en el área construida.

En términos generales, el conjunto de datos presenta buena calidad de información, ya que la mayoría de las variables no contienen valores faltantes. La única variable con datos ausentes es parqueaderos, lo que podría requerir algún tratamiento previo al análisis, como imputación o eliminación de observaciones. Asimismo, la dispersión observada en variables como precio y área construida sugiere la posible presencia de valores extremos, lo cual sería conveniente analizar en etapas posteriores del análisis exploratorio.

Adicionalmente la alta variabilidad observada en variables tales como: areaconst y preciom, es debido a que hay casas mal etiquetadas en zona. Por ejemplo, los estratos socieconomicos de la zona oriente son muy diferentes de los que hay en la zona sur de la ciudad de Cali.

Data summary
Name vivienda_zona_sur_selecte…
Number of rows 2787
Number of columns 7
_______________________
Column type frequency:
character 1
factor 1
numeric 5
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
zona 0 1 8 8 0 1 0

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
estrato 0 1 TRUE 4 4: 1091, 5: 1033, 6: 462, 3: 201

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
areaconst 0 1.00 97.47 52.57 40 65 85 110 932 ▇▁▁▁▁
preciom 0 1.00 297.29 191.55 75 175 245 335 1750 ▇▁▁▁▁
parqueaderos 406 0.85 1.41 0.67 1 1 1 2 10 ▇▁▁▁▁
banios 0 1.00 2.49 0.93 0 2 2 3 8 ▁▇▁▁▁
habitaciones 0 1.00 2.97 0.63 0 3 3 3 6 ▁▂▇▂▁

4.3.2 Distribución del precio

La Figura 1 muestra la distribución del precio de los apartamentos ubicados en la zona sur. Se observa que la mayor concentración de viviendas se encuentra en el rango aproximado entre 100 y 400 millones de COP, lo que indica que la mayoría de los apartamentos del conjunto de datos se ubican en precios medios dentro del mercado inmobiliario de la zona.

La distribución presenta una asimetría positiva (sesgo a la derecha), ya que existe una cola larga hacia valores altos de precio. Esto significa que, aunque la mayoría de los apartamentos tienen precios relativamente moderados, también existen algunas propiedades con precios considerablemente más altos, que superan los 800 millones e incluso alcanzan valores cercanos a 1700 millones de COP.

Asimismo, la frecuencia de observaciones disminuye gradualmente a medida que aumenta el precio, lo cual es consistente con el comportamiento típico del mercado inmobiliario: las propiedades más costosas son menos comunes.

En general, el histograma sugiere la posible presencia de valores extremos o propiedades de lujo, lo que podría influir en medidas como la media del precio. Por esta razón, en análisis posteriores podría ser útil considerar transformaciones de la variable precio (por ejemplo, logaritmos) o analizar medidas robustas como la mediana.

plot_ly(vivienda_zona_sur_selected, x = ~preciom, type = "histogram",
        nbinsx = 40,
        marker = list(color = "steelblue",
                      line  = list(color = "white", width = 0.5))) %>%
  layout(
    title  = list(text = "Figura 1. Distribución del precio de Apartamentos - Zona Sur"),
    xaxis  = list(title = "Precio (millones COP)"),
    yaxis  = list(title = "Frecuencia"),
    bargap = 0.05
  )

4.3.3 Precio vs Área construida

La Figura 2 muestra la relación entre el precio de los apartamentos y el área construida, diferenciando las observaciones según el estrato socioeconómico.

En el gráfico se observa una relación positiva entre el área construida y el precio de las viviendas. Es decir, a medida que aumenta el tamaño del apartamento, el precio tiende a incrementarse. Este comportamiento es consistente con lo esperado en el mercado inmobiliario, donde las propiedades con mayor área suelen tener mayor valor.

Asimismo, el color de los puntos permite identificar diferencias entre estratos socioeconómicos. Se observa que los apartamentos de estrato 6 (color rojo) tienden a concentrarse en los niveles más altos de precio, incluso para áreas similares, lo que sugiere que la ubicación o las características asociadas a este estrato incrementan el valor de las propiedades. Por su parte, los estratos 3 y 4 presentan precios relativamente más bajos y se concentran principalmente en áreas construidas menores.

También se aprecia una mayor dispersión del precio a medida que aumenta el área, lo que indica que para apartamentos más grandes existe una mayor variabilidad en los precios, posiblemente debido a diferencias en calidad, ubicación específica, amenidades u otras características no observadas.

Finalmente, se identifican algunos valores atípicos, particularmente apartamentos con áreas muy grandes o precios muy elevados, que podrían corresponder a propiedades de lujo y que podrían influir en análisis estadísticos posteriores.

plot_ly(vivienda_zona_sur_selected, x = ~areaconst, y = ~preciom,
        type   = "scatter",
        mode   = "markers",
        color  = ~factor(estrato),
        colors = c("#2196F3","#4CAF50","#FF9800","#F44336"),
        marker = list(opacity = 0.7, size = 7),
        text   = ~paste0("Precio: $", preciom, " M",
                         "<br>Área: ", areaconst, " m²",
                         "<br>Estrato: ", estrato),
        hoverinfo = "text") %>%
  layout(
    title  = list(text = "Figura 2. Precio vs Área construida (color = estrato)"),
    xaxis  = list(title = "Área construida (m²)"),
    yaxis  = list(title = "Precio (millones COP)"),
    legend = list(title = list(text = "Estrato"))
  )

4.3.4 Precio por Estrato

La Figura 3 presenta diagramas de caja (boxplots) del precio de los apartamentos según el estrato socioeconómico. Este tipo de gráfico permite comparar la mediana, dispersión y presencia de valores atípicos entre los diferentes estratos.

En primer lugar, se observa una relación creciente entre el estrato y el precio de los apartamentos. A medida que aumenta el estrato socioeconómico, también aumenta el nivel de precios de las viviendas. Los apartamentos de estrato 3 presentan los precios más bajos, con una mediana cercana a los 120–140 millones de COP, mientras que el estrato 6 muestra los precios más altos, con una mediana alrededor de 550–600 millones de COP.

Además, la variabilidad de los precios aumenta en los estratos más altos. En particular, el estrato 6 presenta un rango intercuartílico más amplio y una mayor dispersión general, lo que indica que existe una mayor heterogeneidad en los precios de este segmento del mercado.

El gráfico también muestra la presencia de valores atípicos (outliers) en todos los estratos, especialmente en los estratos 5 y 6, donde aparecen apartamentos con precios considerablemente superiores al resto de las observaciones. Estos valores probablemente corresponden a propiedades de mayor lujo o con características especiales.

En general, el gráfico evidencia que el estrato socioeconómico está fuertemente asociado con el precio de los apartamentos, lo que sugiere que esta variable podría ser un factor importante a incluir en modelos econométricos que expliquen el precio de la vivienda.

plot_ly(vivienda_zona_sur_selected, x = ~estrato, y = ~preciom,
        type   = "box",
        color  = ~estrato,
        colors = c("#2196F3","#4CAF50","#FF9800","#F44336"),
        boxpoints = "outliers") %>%
  layout(
    title  = list(text = "Figura 3. Distribución del precio por estrato"),
    xaxis  = list(title = "Estrato socioeconómico"),
    yaxis  = list(title = "Precio (millones COP)"),
    showlegend = FALSE
  )

4.3.5 Precio por Número de Baños

La Figura 4 muestra la distribución del precio de los apartamentos según el número de baños, utilizando diagramas de caja para comparar los diferentes grupos.

En general, se observa una relación positiva entre el número de baños y el precio de los apartamentos. A medida que aumenta el número de baños, también tiende a incrementarse el precio de la vivienda. Por ejemplo, los apartamentos con 1 o 2 baños presentan precios medianos relativamente bajos, mientras que aquellos con 4, 5 o 6 baños muestran medianas considerablemente más altas.

Además, se evidencia que la dispersión de los precios aumenta con el número de baños. Los apartamentos con mayor cantidad de baños presentan rangos intercuartílicos más amplios y mayor variabilidad en los precios, lo que sugiere que estas propiedades pueden diferenciarse más en términos de tamaño, calidad o ubicación.

El gráfico también muestra la presencia de valores atípicos (outliers) en varios grupos, especialmente en los apartamentos con 3, 4 y 5 baños, donde aparecen propiedades con precios significativamente superiores al resto. Estos valores probablemente corresponden a viviendas de mayor tamaño o características de lujo.

Por otro lado, los grupos con 7 y 8 baños presentan muy pocas observaciones, lo que explica que sus diagramas de caja sean menos representativos. En general, el gráfico sugiere que el número de baños es una característica relevante asociada al precio de los apartamentos, por lo que podría ser una variable explicativa importante en modelos econométricos del precio de la vivienda.

plot_ly(vivienda_zona_sur_selected, x = ~factor(banios), y = ~preciom,
        type      = "box",
        color     = ~factor(banios),
        boxpoints = "outliers") %>%
  layout(
    title  = list(text = "Figura 4. Distribución del precio por número de baños"),
    xaxis  = list(title = "Número de baños"),
    yaxis  = list(title = "Precio (millones COP)"),
    showlegend = FALSE
  )

4.3.6 Precio por Número de Habitaciones

La Figura 5 presenta un diagrama de cajas que muestra la distribución del precio de los apartamentos en función del número de habitaciones en la zona sur de Cali.

En general, se observa una tendencia creciente entre el número de habitaciones y el precio de los apartamentos. A medida que aumenta la cantidad de habitaciones, la mediana del precio tiende a incrementarse de manera consistente, lo que sugiere que los apartamentos con mayor número de habitaciones corresponden a propiedades de mayor tamaño o con mejores características, lo cual se refleja en precios más altos.

Los apartamentos con 0 a 2 habitaciones presentan los niveles de precio más bajos y una variabilidad moderada, con medianas que oscilan entre 150 y 250 mil COP. A partir de 3 habitaciones en adelante se observa un incremento notable tanto en las medianas como en la dispersión de los valores, indicando que este tipo de propiedades pertenece a segmentos progresivamente más altos del mercado inmobiliario. Particularmente, los apartamentos de 4, 5 y 6 habitaciones presentan medianas entre 300 y 600 mil COP, con rangos de variabilidad significativamente más amplios.

Asimismo, se identifican valores atípicos (outliers) especialmente en apartamentos de 3, 4, 5 y 6 habitaciones, representados por puntos fuera de los bigotes del diagrama. Estos valores corresponden a apartamentos con precios significativamente superiores al resto dentro de su misma categoría de número de habitaciones, lo que podría indicar propiedades de lujo, con ubicaciones privilegiadas o con características especiales que las diferencian del segmento mayoritario.

Finalmente, se observa que para 5 y 6 habitaciones la variabilidad es particularmente alta, alcanzando precios que superan los 1,500 mil COP en algunos casos. En conjunto, el gráfico evidencia que el número de habitaciones es una variable positivamente asociada con el precio de los apartamentos en la zona sur de Cali, demostrando que este es un factor determinante importante en la valoración de estas propiedades inmobiliarias.

plot_ly(vivienda_zona_sur_selected, x = ~factor(habitaciones), y = ~preciom,
        type      = "box",
        color     = ~factor(habitaciones),
        boxpoints = "outliers") %>%
  layout(
    title  = list(text = "Figura 5. Distribución del precio por número de habitaciones"),
    xaxis  = list(title = "Número de habitaciones"),
    yaxis  = list(title = "Precio (millones COP)"),
    showlegend = FALSE
  )

4.3.7 Precio por Número de Parqueaderos

La Figura 6 presenta un diagrama de cajas que muestra la distribución del precio de los apartamentos en función del número de parqueaderos en la zona sur de Cali.

En general, se observa una tendencia creciente clara entre el número de parqueaderos y el precio de los apartamentos. A medida que aumenta la cantidad de parqueaderos, la mediana del precio tiende a incrementarse de manera progresiva, lo que sugiere que los apartamentos con mayor número de parqueaderos corresponden a propiedades de mejor calidad o ubicadas en zonas más valoradas, lo cual se refleja en precios más altos.

Los apartamentos con 1 parqueadero presentan los niveles de precio más bajos, con una mediana cercana a 200 mil COP y una variabilidad moderada. A medida que aumenta a 2 parqueaderos, se observa un incremento notable en la mediana (aproximadamente 350-400 mil COP), aunque la dispersión sigue siendo relativamente controlada. En contraste, a partir de 3 parqueaderos se evidencia un salto significativo tanto en la mediana (alrededor de 650-700 mil COP) como en la amplitud de la distribución, indicando que este tipo de propiedades pertenece a segmentos más altos del mercado inmobiliario.

Asimismo, se identifican valores atípicos (outliers) especialmente en apartamentos de 1, 3 y 4 parqueaderos, representados por puntos fuera de los bigotes del diagrama. Estos valores corresponden a apartamentos con precios significativamente superiores al resto dentro de su misma categoría de número de parqueaderos, lo que podría indicar propiedades de lujo o con características especiales que las diferencian del segmento mayoritario.

Finalmente, los apartamentos con 4 parqueaderos presentan la mediana más alta (alrededor de 950 mil COP) y una considerable variabilidad, alcanzando valores de hasta 1,550 mil COP. De manera interesante, los apartamentos con 10 parqueaderos muestran una mediana más baja (alrededor de 600 mil COP) y una dispersión moderada, lo que sugiere que este segmento representa un número reducido de observaciones o propiedades con características diferentes. En conjunto, el gráfico evidencia que el número de parqueaderos es una variable fuertemente asociada con el precio de los apartamentos en la zona sur de Cali, demostrando que la disponibilidad de espacios de parqueo es un factor determinante importante en la valoración de estas propiedades.

plot_ly(vivienda_zona_sur_selected, x = ~factor(parqueaderos), y = ~preciom,
        type      = "box",
        color     = ~factor(parqueaderos),
        boxpoints = "outliers") %>%
  layout(
    title  = list(text = "Figura 6. Distribución del precio por número de parqueaderos"),
    xaxis  = list(title = "Número de parqueaderos"),
    yaxis  = list(title = "Precio (millones COP)"),
    showlegend = FALSE
  )

4.3.8 Parqueaderos por estrato

La Figura 6 presenta un diagrama de cajas que muestra la distribución del número de parqueaderos según el estrato socioeconómico de los apartamentos en la zona sur de Cali.

En general, se observa una tendencia creciente moderada entre el estrato socioeconómico y la cantidad de parqueaderos. A medida que aumenta el estrato, la mediana del número de parqueaderos tiende a incrementarse, lo que sugiere que los apartamentos ubicados en estratos más altos corresponden a propiedades con mejor dotación de espacios de parqueo, reflejando diferencias socioeconómicas en la disponibilidad de servicios complementarios.

Los apartamentos del estrato 3 presentan el menor número de parqueaderos, con una mediana aproximada de 1 parqueadero y baja variabilidad. De manera similar, el estrato 4 exhibe una distribución muy comparable, con medianas cercanas a 1 parqueadero, sugiriendo que estos estratos mantienen características similares en cuanto a la dotación de espacios de parqueo. En contraste, a partir del estrato 5 se evidencia un incremento notable tanto en la mediana como en la dispersión de los valores, con medianas cercanas a 1-2 parqueaderos, aunque con mayor variabilidad que los estratos inferiores.

Asimismo, se identifican valores atípicos (outliers) en prácticamente todas las categorías de estrato, representados por puntos distribuidos fuera de los bigotes del diagrama. Estos valores corresponden a apartamentos con un número de parqueaderos significativamente superior al resto dentro de su misma categoría de estrato, alcanzando en algunos casos hasta 10 parqueaderos. Esto indica que incluso dentro de estratos socioeconómicos más bajos existen propiedades excepcionales con dotación amplia de servicios.

Finalmente, el estrato 6 presenta medianas cercanas a 2 parqueaderos con variabilidad moderada, demostrando que aunque es el estrato más alto, la dotación de parqueaderos sigue siendo relativamente conservadora en la mediana. Sin embargo, cuenta con varios outliers que alcanzan 3 y 4 parqueaderos. En conjunto, el gráfico evidencia que el estrato socioeconómico está moderadamente asociado con la cantidad de parqueaderos, aunque la relación es menos pronunciada de lo que podría esperarse. Esto sugiere que en la zona sur de Cali, la disponibilidad de parqueaderos no es un diferenciador tan fuerte entre estratos como en otras zonas, indicando que otros factores como la ubicación específica dentro de la zona o características arquitectónicas de los edificios también influyen significativamente en la dotación de espacios de parqueo.

plot_ly(vivienda_zona_sur_selected, x =~estrato , y = ~parqueaderos,
        type      = "box",
        color     = ~estrato,
        boxpoints = "outliers") %>%
  layout(
    title  = list(text = "Figura 7. Distribución del Parqueadero por Estrato"),
    xaxis  = list(title = "Estrato"),
    yaxis  = list(title = "Parqueaderos"),
    showlegend = FALSE
  )

4.4 Correlacion

vivienda_num <- vivienda_zona_sur_selected %>%
  select(where(is.numeric))

cor_matrix <- cor(vivienda_num, use = "complete.obs", method="spearman")

plot_ly(
  x = colnames(cor_matrix),
  y = colnames(cor_matrix),
  z = round(cor_matrix, 2),
  type       = "heatmap",
  colorscale = "RdBu",
  zmin = -1, zmax = 1,
  text       = round(cor_matrix, 2),
  texttemplate = "%{text}",
  showscale  = TRUE
) %>% layout(
    title = list(text = "Figura 8. Matriz de correlación - Apartamentos Zona Sur"),
    xaxis = list(title = ""),
    yaxis = list(title = "")
  )

La Figura 8 presenta una matriz de correlación que muestra las relaciones lineales entre las variables numéricas consideradas en el análisis de los apartamentos de la zona sur de Cali. Esta matriz permite identificar qué variables tienden a aumentar o disminuir conjuntamente.

Es importante resaltar que se utilizó el coeficiente de Spearman que no requiere que los datos sigan una distribución normal.

Correlaciones Fuertes Positivas

Se identifican varias correlaciones positivas fuertes (valores cercanos a 1), que indican relaciones directas entre variables:

  • Precio y Área construida (0.85): Existe una correlación fuerte entre el área construida y el precio de los apartamentos, sugiriendo que las propiedades con mayor tamaño tienden a tener precios más altos. Esta es una de las relaciones más intuitivas y determinantes en el mercado inmobiliario de la zona sur.

  • Baños y Área construida (0.76): Se observa una correlación fuerte entre el número de baños y el área construida, indicando que los apartamentos más grandes típicamente incluyen más espacios sanitarios. Esta relación es lógica, ya que propiedades de mayor tamaño incorporan más comodidades.

  • Precio y Baños (0.68): Se observa una correlación fuerte entre el número de baños y el precio, lo que indica que esta es una variable importante en la determinación del valor de los apartamentos.

  • Parqueaderos y Precio (0.69): Existe una correlación fuerte entre el número de parqueaderos y el precio, confirmando que la disponibilidad de espacios de parqueo influye en la valoración, aunque menos que el área o el número de baños.

Correlaciones Moderadas

Las variables Habitaciones y Parqueaderos presentan correlaciones moderadas con otras variables:

  • Habitaciones y Baños (0.51): Se observa una correlación moderada-fuerte, sugiriendo que apartamentos con más habitaciones tienden a tener más baños.

  • Habitaciones y Área construida (0.49): Esta correlación moderada indica que el número de habitaciones está asociado con el tamaño total, aunque de manera menos consistente que otras variables.

  • Baños y Parqueaderos (0.58): Existe una correlación moderada entre estas variables, sugiriendo que apartamentos con más baños también tienden a tener más parqueaderos, reflejando propiedades de mayor tamaño y mejor dotación de servicios.

Correlaciones Débiles

Se identifican algunas correlaciones débiles, particularmente:

  • Habitaciones y Parqueaderos (0.28): La correlación muy débil sugiere que el número de habitaciones está prácticamente independiente de la cantidad de parqueaderos, indicando que estos son factores independientes en la caracterización de los apartamentos.

  • Precio y Habitaciones (0.33): Aunque presente, esta correlación es débil, reafirmando que el número de habitaciones por sí solo es un predictor limitado del precio de los apartamentos en comparación con otras variables.

  • Área construida y Habitaciones (0.49): Correlación moderada-baja que sugiere que el área no está completamente determinada por el número de habitaciones, indicando variabilidad en el tamaño de los espacios.

Interpretación Integral

La matriz de correlación revela que el área construida es la variable más fuertemente asociada con el precio de los apartamentos (0.85), seguida por el número de parqueaderos (0.69) y número de baños (0.68). En contraste, el número de habitaciones presenta una relación moderada y relativamente débil con el precio (0.33), lo que sugiere que la cantidad de espacios habitacionales es menos determinante que el tamaño total y la calidad de las acabados (reflejada en baños).

Estos resultados sugieren que el tamaño físico y la dotación de servicios (área construida, baños y parqueaderos) son factores más determinantes en la valoración de apartamentos en la zona sur de Cali que la cantidad de espacios habitacionales. Además, la fuerte correlación entre área construida, baños y precio indica que estas variables están fuertemente interconectadas, sugiriendo que modelos predictivos de precio deberían incluir el área construida como una variable central, complementada con el número de baños como un indicador secundario importante.

4.5 Preprocesamiento

4.5.1 Imputación

Anteriormente se identificó en la figura 7 que existe una relación entre parqueaderos y estrato, de modo que se procedió a imputar la mediana por estrato para los parqueaderos faltantes como se observa en la siguiente tabla.

Valores utilizados para la imputación de parqueaderos por estrato
estrato n_total n_na_parqueaderos mediana_parqueaderos n_imputados n_porcentaje_imputados
3 201 94 1 94 46.77
4 1091 256 1 256 23.46
5 1033 43 1 43 4.16
6 462 13 2 13 2.81

4.6 Modelo de Regresión Lineal Múltiple

Una vez se tiene el dataset filtrado y sin valores faltantes para la variable parqueaderos se procede a crear el modelo de regresión múltiple con base en las siguientes variables.

\[ preciom = \beta_0 + areaconst\beta_1 + estrato\beta_2 + habitaciones\beta_3 + parqueaderos\beta_4 + banios\beta_5 \]

# Estimar modelo
modelo2 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios,
              data = df_prep_imputed_sur)

df_prep_imputed_sur$precio_pred <- predict(modelo2)
# Resumen del modelo
summary(modelo2)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = df_prep_imputed_sur)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1089.61   -35.73    -2.02    34.86   896.70 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   29.13147    8.91056   3.269 0.001091 ** 
## areaconst      1.32455    0.04599  28.800  < 2e-16 ***
## estrato.L    144.35635    6.17411  23.381  < 2e-16 ***
## estrato.Q     61.84107    4.31670  14.326  < 2e-16 ***
## estrato.C     29.04406    3.09895   9.372  < 2e-16 ***
## habitaciones -11.78981    3.16794  -3.722 0.000202 ***
## parqueaderos  61.90642    3.55664  17.406  < 2e-16 ***
## banios        38.86084    2.85147  13.628  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 87.67 on 2779 degrees of freedom
## Multiple R-squared:  0.791,  Adjusted R-squared:  0.7905 
## F-statistic:  1503 on 7 and 2779 DF,  p-value: < 2.2e-16

Se estimó un modelo de regresión lineal múltiple con el objetivo de explicar el precio de las viviendas (preciom) a partir de las variables área construida (areaconst), estrato socioeconómico (estrato), número de habitaciones (habitaciones), número de parqueaderos (parqueaderos) y número de baños (banios).

Prueba F del modelo

La prueba F evalúa la significancia global del modelo mediante el contraste de hipótesis:

\[ H_0: \beta_1 = \beta_2 = \cdots = \beta_k = 0 \]

\[ H_1: \text{Al menos uno de los coeficientes es diferente de 0} \]

El resultado obtenido fue:

  • F-statistic = 1503
  • p-value < 2.2e-16

Dado que el valor p es menor a 0.05, se rechaza la hipótesis nula, lo que indica que el modelo es estadísticamente significativo en su conjunto. Esto implica que al menos una de las variables explicativas contribuye significativamente a explicar la variabilidad del precio de las viviendas.

Significancia de los parámetros

La significancia de cada parámetro se evalúa mediante el valor p (Pr(>|t|)) asociado a cada coeficiente. En este modelo, todos los coeficientes presentan valores p menores a 0.05, por lo que se consideran estadísticamente significativos.

Interpretación de los coeficientes

  • Intercepto (29.13)
    Representa el valor esperado del precio cuando todas las variables explicativas toman valor cero. En la práctica funciona como un punto de referencia dentro del modelo.

  • Área construida (areaconst)
    El coeficiente estimado es 1.32, lo que indica que por cada metro cuadrado adicional de área construida, el precio de la vivienda aumenta en promedio 1.32 millones de COP, manteniendo constantes las demás variables.

  • Estrato socioeconómico (estrato)
    La variable estrato se modela mediante contrastes polinomiales (L, Q y C), lo que indica que existe una relación creciente entre el estrato y el precio de las viviendas. En términos generales, los estratos más altos tienden a presentar precios mayores.

  • Habitaciones (habitaciones)
    El coeficiente estimado es -11.78, lo que sugiere que, manteniendo constantes las demás variables, un incremento en el número de habitaciones se asocia con una disminución promedio de 11.78 millones de COP en el precio. Este resultado puede estar relacionado con la correlación entre habitaciones y área construida.

  • Parqueaderos (parqueaderos)
    El coeficiente estimado es 61.9, indicando que cada parqueadero adicional incrementa el precio de la vivienda en aproximadamente 61.9 millones de COP, manteniendo constantes las demás variables.

  • Baños (banios)
    El coeficiente estimado es 38.86, lo que sugiere que cada baño adicional incrementa el precio de la vivienda en promedio 38.86 millones de COP, manteniendo constantes las demás variables.

Coeficiente de determinación

El modelo presenta un coeficiente de determinación:

\[ R^2 = 0.791 \]

Esto indica que aproximadamente el 79.1% de la variabilidad del precio de las viviendas es explicada por las variables incluidas en el modelo.

El R² ajustado = 0.791 es muy cercano al R², lo que sugiere que el modelo mantiene una buena capacidad explicativa sin evidencias de sobreajuste.

Ecuación del modelo

La ecuación estimada del modelo de regresión es:

\[ \hat{Precio}_i = 29.13 + 1.32 \, AreaConst_i + 144.35 \, Estrato_{L,i} + 61.84 \, Estrato_{Q,i} + 29.04 \, Estrato_{C,i} - 11.78 \, Habitaciones_i + 61.9 \, Parqueaderos_i + 38.86 \, Banios_i + \varepsilon_i \] Media de los residuales

Con respecto al supuesto de media cero de los residuales, se observa que la media obtenida es -2.02, la cual es prácticamente insignificante en relación con la escala de los precios (expresados en millones de COP). Esta desviación mínima sugiere que el modelo cumple adecuadamente con el supuesto de que los errores tienen una media aproximadamente igual a cero.

4.7 Validación de supuestos

En esta subsección se verificarán los siguientes supuestos para determinar si el modelo es estadísticamente válido:

  • Normalidad de errores

  • Homocedasticidad

  • Independencia

  • Media de los errores

4.7.1 Normalidad de errores

El histograma muestra la distribución de frecuencias de los residuales del modelo de regresión. Se observa que los residuales presentan una distribución aproximadamente normal con un pico central marcado alrededor de cero, indicando que la mayoría de los errores del modelo se concentran en valores cercanos a cero. Sin embargo, la distribución exhibe un patrón de leve asimetría a la derecha, con una cola extendida hacia valores positivos que alcanzan hasta aproximadamente 500 unidades. Esta característica sugiere que el modelo tiende a subestimar los precios de algunos apartamentos, particularmente aquellos con características excepcionales. En general, la forma acampanada del histograma es compatible con la distribución normal, aunque con algunas desviaciones en las colas.

residuales2 <- data.frame(res = residuals(modelo2))
residuales_std2 <- rstandard(modelo2)
plot_ly(residuales2, x = ~res, type = "histogram",
        marker = list(color = "coral")) %>%
  layout(title = "Distribución de residuales - Modelo V2",
         xaxis = list(title = "Residuales"))

El gráfico QQ-Plot compara los cuantiles observados de los residuales estandarizados con los cuantiles teóricos de una distribución normal, representados por la línea roja. Se observa que los puntos siguen muy cercanamente la línea de referencia en la región central (aproximadamente entre -2 y 2 en el eje x), lo que indica que los residuales en el rango típico se distribuyen de manera compatible con la normalidad. Sin embargo, en las colas, especialmente en la cola superior derecha, se presentan desviaciones claras donde los puntos se alejan notablemente de la línea roja. Esta pauta sugiere la presencia de valores extremos más severos que los esperados bajo una distribución normal perfecta, indicando que existen apartamentos cuyo comportamiento se desvía significativamente del patrón general del modelo.

qqnorm(residuales_std2, main="QQ-Plot de los Residuales Estandarizados", col="blue")
qqline(residuales_std2, col="red", lwd=2)

a prueba estadística de Anderson-Darling, que evalúa formalmente la normalidad de los datos, arrojó un p-valor de 2.2e-16 (prácticamente cero). Este valor sumamente pequeño proporciona evidencia suficiente para rechazar la hipótesis nula de normalidad. Aunque las gráficas visuales sugieren una distribución aproximadamente normal, la prueba estadística indica que los residuales se desvían significativamente de una distribución normal perfecta, principalmente debido a las desviaciones observadas en las colas de la distribución.

# Prueba de Anderson-Darling
ad.test(residuals(modelo2))
## 
##  Anderson-Darling normality test
## 
## data:  residuals(modelo2)
## A = 92.945, p-value < 2.2e-16

El supuesto de normalidad se cumple de manera moderada pero incompleta. Aunque los residuales presentan características generalmente normales en la región central, con un histograma de forma aproximadamente acampanada y un QQ-Plot que sigue la línea de referencia en valores típicos, existen desviaciones significativas en las colas de la distribución.

La prueba estadística de Anderson-Darling rechaza la hipótesis de normalidad, lo que indica que las desviaciones observadas, aunque parezcan pequeñas visualmente, son estadísticamente significativas. Esto sugiere que no se cumple estrictamente el supuesto, aunque el modelo mantiene una validez práctica aceptable para realizar inferencias en el rango central de los datos. Las predicciones para apartamentos con características típicas son confiables, pero aquellas en los extremos (precios muy altos o muy bajos) deben interpretarse con mayor cautela, ya que el modelo tiene dificultades para capturar adecuadamente estos comportamientos atípicos.

Recomendaciones para Mejorar el Supuesto de Normalidad

1. Transformación de la variable dependiente

Aplicar una transformación logarítmica al precio (variable dependiente) es la recomendación más directa. Esto comprime los valores extremos altos y tiende a estabilizar la varianza, lo que generalmente mejora la normalidad de los residuales. La transformación log-precio es especialmente útil en datos inmobiliarios donde existe asimetría a la derecha.

2. Identificar y tratar valores atípicos

Realizar un análisis exhaustivo de los outliers identificados en las colas de la distribución. Estos pueden deberse a errores de entrada, propiedades con características muy especiales u apartamentos con precios anómalos. Considerar si deben excluirse o si necesitan variables adicionales que expliquen su comportamiento.

3. Incluir variables adicionales relevantes

La presencia de residuales extremos sugiere que existen factores no capturados por el modelo actual. Incorporar variables como ubicación específica (coordenadas geográficas), antigüedad del edificio, amenidades especiales o certificaciones de sostenibilidad podría mejorar significativamente el ajuste y reducir las desviaciones.

4. Considerar modelos alternativos

Explorar modelos de regresión robusta o Mínimos Cuadrados Ponderados (WLS) que son menos sensibles a outliers y a desviaciones de normalidad. También es posible utilizar métodos de regresión cuantílica que no requieren el supuesto de normalidad.

5. Validar la especificación del modelo

Revisar si la forma funcional del modelo es adecuada. Evaluar la inclusión de términos de interacción, polinomios u otras transformaciones que pudieran capturar relaciones no lineales y mejorar la distribución de los residuales.

4.7.2 Homocedasticidad

En esta subsección se verificará el supuesto de Homocedasticidad para cada uno de los modelos, cabe resaltar que se utilizarán las siguientes pruebas de hipótesis.

Non-constant Variance Score

\(H_{0}\): La varianza de los errores es constante

\(H_{1}\): La varianza depende la variable predictora

\(\alpha=0.05\)

Goldfeld–Quandt Test

\(H_{0}:\sigma_{1}^2=\sigma_{2}^2\)

\(H_{1}:\sigma_{1}^2\ne\sigma_{2}^2\)

\(\alpha=0.05\)

Harrison–McCabe Test

\(H_{0}\): La varianza de los errores es constante

\(H_{1}\): La varianza aumenta o disminuye a lo largo de las observaciones

\(\alpha=0.05\)

Análisis Visual: Residuales vs Valores Ajustados

El gráfico de dispersión muestra la relación entre los valores predichos por el modelo y los residuales. Se observa que:

  • Los residuales se distribuyen alrededor de la línea horizontal en cero (línea roja), lo que es favorable para el supuesto de homocedasticidad.
  • Existe una dispersión relativamente uniforme de los puntos a lo largo del rango de predicciones, concentrándose principalmente en valores ajustados entre 200 y 1000 mil COP.
  • La amplitud de la dispersión se mantiene prácticamente constante en todo el rango de valores predichos, sin patrones claros de aumento o disminución en la varianza.
  • Aunque existen algunos valores atípicos alejados de la banda central, la mayoría de los residuales permanecen dentro de un rango similar, sugiriendo una varianza estable.
df_prep_imputed_sur$residuales <- residuals(modelo2)

fig <- plot_ly(
  df_prep_imputed_sur,
  x = ~precio_pred,
  y = ~residuales,
  type = "scatter",
  mode = "markers",
  marker = list(color = "blue")
)

fig <- fig %>% layout(
  title = "Residuales vs Valores Ajustados",
  xaxis = list(title = "Valores Ajustados"),
  yaxis = list(title = "Residuales"),
  shapes = list(
    list(
      type = "line",
      x0 = min(df_prep_imputed_sur$precio_pred),
      x1 = max(df_prep_imputed_sur$precio_pred),
      y0 = 0,
      y1 = 0,
      line = list(color = "red", dash = "dash")
    )
  )
)

fig

Varianza de errores

Pruebas Estadísticas de Homocedasticidad

1. Harrison–McCabe Test

  • Resultado: HMC = 0.52455, p-valor = 0.956

  • Interpretación: El p-valor de 0.956 es alto, muy superior al nivel de significancia de 0.05. Esto indica que no hay evidencia suficiente para rechazar la hipótesis nula.

  • Conclusión: La varianza de los errores es constante a lo largo de las observaciones. Este resultado favorece fuertemente el cumplimiento del supuesto.

2. Goldfeld–Quandt Test

  • Resultado: GQ = 0.90474, df₁ = 1386, df₂ = 1385, p-valor = 0.9687

  • Interpretación: El p-valor de 0.9687 es extremadamente alto, indicando que no hay diferencias significativas en la varianza entre dos segmentos de datos.

  • Conclusión: Al dividir los datos en dos grupos, las varianzas resultan ser estadísticamente iguales, proporcionando evidencia fuerte de homocedasticidad.

3. Non-constant Variance Score Test

  • Resultado: χ² = 5897.296, Df = 1, p-valor < 2.2e-16

  • Interpretación: El p-valor prácticamente nulo proporciona evidencia estadística para rechazar la hipótesis nula.

  • Conclusión: La varianza de los errores depende significativamente de los valores predichos, indicando presencia de heterocedasticidad en el modelo.

lmtest::hmctest(modelo2)
## 
##  Harrison-McCabe test
## 
## data:  modelo2
## HMC = 0.52455, p-value = 0.974
lmtest::gqtest(modelo2)
## 
##  Goldfeld-Quandt test
## 
## data:  modelo2
## GQ = 0.90474, df1 = 1386, df2 = 1385, p-value = 0.9687
## alternative hypothesis: variance increases from segment 1 to 2
car::ncvTest(modelo2)
## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 5897.296, Df = 1, p = < 2.22e-16

Los resultados de las tres pruebas estadísticas no son consistentes. Mientras que Harrison–McCabe y Goldfeld–Quandt sugieren que el supuesto se cumple, el Non-constant Variance Score Test rechaza contundentemente la hipótesis de homocedasticidad. Esta discrepancia sugiere que:

  • Las primeras dos pruebas detectan que la varianza no aumenta de manera sistemática a lo largo de las observaciones.
  • El Non-constant Variance Score Test, más sensible a patrones de heterocedasticidad complejos, identifica que la varianza sí depende de variables predictoras específicas.

Conclusión

El supuesto de homocedasticidad se cumple de manera parcial e inconsistente. Aunque la varianza parece estable visualmente y según dos pruebas estadísticas, la prueba Non-constant Variance Score proporciona evidencia estadística muy fuerte de que la varianza depende de los valores predichos.

Implicaciones: - Los errores estándar podrían estar sesgados en algunas variables predictoras. - Los intervalos de confianza para predicciones específicas pueden ser inadecuados. - El modelo mantiene validez general para inferencias, pero requiere cautela en interpretaciones.

Recomendación: Considerar el uso de errores estándar robustos (Huber-White) al reportar resultados o aplicar una transformación logarítmica de la variable dependiente para estabilizar la varianza de manera más definitiva.

4.7.3 Independencia

En esta sección se verificará si los residuos son independientes a lo largo del tiempo y para ello se utilizarán gráficos y los siguientes test que se encargan de determinar si existe alguna autocorrelación entre ellos.

Test de Durbin-Watson: Evalúa la presencia de autocorrelación de primer orden en los errores del modelo. Es especialmente útil en datos ordenados temporalmente.

Test de Breusch-Godfrey: Es una generalización del Durbin-Watson Test, que permite detectar autocorrelación de orden superior en los errores.

En general, para los tests anteriores las pruebas de hipótesis se formulan de la siguiente forma:

\(H_{0}\): Los errores son independientes, es decir, no presentan autocorrelación.

\(H_{1}\): Los errores no son independientes, es decir, presentan autocorrelación.

\(\alpha\): 0.05

Análisis Visual: Residuos vs Índice de Observación

El gráfico muestra la evolución de los residuales a lo largo de todas las observaciones ordenadas secuencialmente. Se observa que:

  • Los residuales fluctúan alrededor de cero de manera general, sin una tendencia clara ascendente o descendente a lo largo del índice de observación.

  • Existe una dispersión considerable y relativamente uniforme en los puntos, indicando variabilidad consistente en los errores.

  • Se aprecia un patrón aleatorio predominante en la mayoría del rango, sin agrupamientos obvios o estructuras sistemáticas que sugieran dependencia.

  • Aunque existen algunos picos aislados (valores atípicos con residuales grandes), estos aparecen de manera dispersa sin formar patrones correlacionados, lo que es favorable para el supuesto de independencia.

resid_data <- data.frame(
  Observacion = seq_along(residuals(modelo2)),  # Índice de cada observación
  Residuales = residuals(modelo2)              # Valores de los residuos
)

fig <- plot_ly(
  data = resid_data,
  x = ~Observacion,
  y = ~Residuales,
  type = "scatter",
  mode = "markers+lines",
  marker = list(color = "deeppink", size = 6),
  line = list(color = "black", dash = "dash"),
  name = "Residuales"
)

fig <- fig %>% layout(
  xaxis = list(title = "Índice de la Observación"),
  yaxis = list(title = "Residuales"),
  shapes = list(
    list(
      type = "line",
      x0 = min(resid_data$Observacion),
      x1 = max(resid_data$Observacion),
      y0 = 0,
      y1 = 0,
      line = list(color = "red")
    )
  )
)

fig

Residuos del Modelo vs Índice de Observación

Pruebas Estadísticas de Autocorrelación

1. Durbin-Watson Test

  • Resultado: DW = 1.7075, p-valor = 4.087e-15

  • Interpretación: El estadístico DW de 1.7075 está cercano a 2, lo que sugeriría independencia. Sin embargo, el p-valor sumamente pequeño (4.087e-15 << 0.05) proporciona evidencia estadística de que se rechaza la hipótesis nula.

  • Conclusión: A pesar de que el estadístico DW sugiere una autocorrelación débil, las pruebas estadísticas indican que existe autocorrelación estadísticamente significativa en los errores de primer orden.

2. Breusch-Godfrey Test (Autocorrelación de orden superior)

  • Resultado: LM test = 59.258, df = 1, p-valor = 1.383e-14

  • Conclusión: El p-valor extremadamente pequeño (1.383e-14 << 0.05) proporciona evidencia muy contundente para rechazar la hipótesis nula. Este test confirma que existe autocorrelación en los errores, incluso considerando órdenes superiores de dependencia.

dwtest(modelo2)
## 
##  Durbin-Watson test
## 
## data:  modelo2
## DW = 1.7075, p-value = 4.087e-15
## alternative hypothesis: true autocorrelation is greater than 0
bgtest(modelo2)
## 
##  Breusch-Godfrey test for serial correlation of order up to 1
## 
## data:  modelo2
## LM test = 59.258, df = 1, p-value = 1.383e-14

El modelo incumple el supuesto de independencia de los residuales, aunque de manera menos severa que en análisis anteriores. Ambas pruebas estadísticas coinciden en rechazar la hipótesis nula de independencia con p-valores prácticamente nulos, proporcionando evidencia contundente de autocorrelación.

Específicamente:

  • Los residuales presentan autocorrelación estadísticamente significativa

  • La autocorrelación es detectada tanto en primer orden (Durbin-Watson) como en órdenes superiores (Breusch-Godfrey)

  • Sin embargo, el patrón visual es menos estructurado que en modelos anteriores, sugiriendo que la autocorrelación es más débil pero presente

Implicaciones del Incumplimiento

  1. Estimadores ineficientes: Los coeficientes siguen siendo insesgados, pero no son los de mínima varianza.

  2. Errores estándar subestimados: Los errores estándar reportados son más pequeños de lo debido, lo que lleva a:

    • Intervalos de confianza más estrechos que los apropiados
    • Pruebas de significancia estadística infladas
    • Posible sobrestimación de la precisión de las estimaciones
  3. Predicciones con intervalos de confianza inadecuados: Las predicciones pueden tener incertidumbre mayor a la reportada.

Recomendaciones

Para abordar la autocorrelación se sugiere:

  1. Incluir variables espaciales: Agregar variables geográficas que capturen dependencias espaciales entre observaciones cercanas, ya que los apartamentos pueden estar agrupados por zonas.

  2. Estructura de correlación mejorada: Utilizar modelos que permitan estructuras de autocorrelación (modelos de series de tiempo o regresión con efectos espaciales).

  3. Errores estándar ajustados: Reportar errores estándar robustos a autocorrelación (Newey-West) para obtener intervalos de confianza más confiables.

  4. Transformación de variables: Considerar transformaciones que mejoren la especificación del modelo y reduzcan la autocorrelación residual.

4.8 Predicción

Una vez obtenido el modelo de regresión lineal múltiple se procede a predecir el valor justo que tendría una propiedad con las características especificadas para la vivienda 2.

La predicción 1 corresponde a la propiedad de estrato 5 y la segunda a la propiedad de estrato 6.

nuevos_datos <- data.frame(
  areaconst = c(300,300),
  estrato = factor(c(5,6)),
  habitaciones = c(5,5),
  parqueaderos = c(3,3),
  banios= c(3,3)
)

pred <- predict(modelo2, newdata = nuevos_datos)

tabla_pred <- data.frame(
  Prediccion = c("Predicción 1", "Predicción 2"),
  Valor = pred
)

knitr::kable(tabla_pred,format = "html", caption="Predicciones") %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive","float_left"))
Predicciones
Prediccion Valor
Predicción 1 651.7241
Predicción 2 804.1011

4.9 Elección de vivienda

Con base en las predicciones que se observan anteriormente se procede a escoger las viviendas que mejor se adaptarían a las condiciones del cliente.

vivienda_seleccion <- dplyr::filter(vivienda_zona_sur, id %in% c(4266,5306,4952,8036,7182)) %>% dplyr::select(areaconst,preciom, parqueaderos, banios, habitaciones, barrio) %>% arrange(desc(preciom))

knitr::kable(vivienda_seleccion,format = "html", caption="Oferta de viviendas") %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive","float_left"))
Oferta de viviendas
areaconst preciom parqueaderos banios habitaciones barrio
573 730 3 8 5 GUADALUPE
250 700 2 4 5 EL INGENIO
275 650 2 5 5 CIUDADELA PASOANCHO
600 650 2 4 5 EL INGENIO
256 530 3 5 5 SEMINARIO

Ranking de Ofertas de Viviendas - Análisis Comparativo

OPCIÓN RECOMENDADA: GUADALUPE

Características:

  • Área construida: 573 m²

  • Precio: 730 millones COP

  • Parqueaderos: 3

  • Baños: 8

  • Habitaciones: 5

  • Ubicación: Guadalupe (zona sur)

Por qué es la mejor opción: Esta propuesta es la más atractiva porque supera significativamente las expectativas del cliente en todos los aspectos críticos. Con un precio de 730 millones (120 millones por debajo del presupuesto), ofrece casi el doble del área construida (573 m² vs 300 m²). Aunque tiene 8 baños en lugar de 3, esto representa un valor agregado considerable, indicando una propiedad de mayor calidad y mejor acabada. Los 3 parqueaderos coinciden exactamente con el requerimiento, y mantiene las 5 habitaciones solicitadas. Lo más importante es que el cliente obtiene una vivienda de mayor tamaño y calidad por un precio significativamente menor, lo que representa excelente valor en el mercado.

EL INGENIO (opción 600 m² - 650 millones)

Características:

  • Área construida: 600 m²

  • Precio: 650 millones COP

  • Parqueaderos: 2

  • Baños: 4

  • Habitaciones: 5

  • Ubicación: El Ingenio (zona sur)

Por qué considerarla: Esta es la segunda opción más competitiva, con el precio más bajo del mercado (650 millones, 200 millones por debajo del presupuesto). Ofrece un área construida de 600 m², el doble de lo requerido, y mantiene las 5 habitaciones. Sin embargo, tiene 2 parqueaderos en lugar de 3, lo que representa una limitación respecto al requerimiento. Con 4 baños en lugar de 3, sigue siendo una vivienda bien equipada. Este apartamento es ideal para un cliente que prioriza precio y amplitud, y puede tolerar un parqueadero menos.

CIUDADELA PASOANCHO

Características:

  • Área construida: 275 m²

  • Precio: 650 millones COP

  • Parqueaderos: 2

  • Baños: 5

  • Habitaciones: 5

  • Ubicación: Ciudadela Pasoancho (zona sur)

Por qué considerarla: Aunque comparte precio con El Ingenio (650 millones), esta opción es menos favorable porque el área construida es la más pequeña del portafolio (275 m², prácticamente igual a los 300 m² requeridos). Con solo 2 parqueaderos, también presenta la misma limitación que El Ingenio. Sin embargo, con 5 baños compensa parcialmente esta limitación, indicando que a pesar de no ser más grande, está mejor acabada. Es una opción válida para quien quiere precio bajo pero no busca mayor amplitud.

EL INGENIO (opción 250 m² - 700 millones)

Características:

  • Área construida: 250 m²

  • Precio: 700 millones COP

  • Parqueaderos: 2

  • Baños: 4

  • Habitaciones: 5

  • Ubicación: El Ingenio (zona sur)

Por qué considerarla: Esta opción tiene el área construida más pequeña de todas (250 m²), menor incluso que los 300 m² requeridos. Con un precio de 700 millones, es más cara que otras alternativas con mayor tamaño (como Guadalupe a 730 millones o la otra opción de El Ingenio a 650 millones). Los 2 parqueaderos también representan una limitación. Sin embargo, mantiene las 5 habitaciones y 4 baños, lo que sugiere que el espacio disponible está bien optimizado. Es una alternativa para clientes con espacio muy limitado pero necesidad de mantener funcionalidad.

SEMINARIO

Características:

  • Área construida: 256 m²

  • Precio: 530 millones COP

  • Parqueaderos: 3

  • Baños: 5

  • Habitaciones: 5

  • Ubicación: Seminario (zona sur)

Por qué considerarla: Esta es una propuesta única en su valor. Con 530 millones es la más económica, dejando 320 millones para inversión adicional. Cumple exactamente con los 3 parqueaderos requeridos y mantiene 5 habitaciones y 5 baños (mejor que lo solicitado). Sin embargo, el área construida de 256 m² es la segunda más pequeña después de El Ingenio (250 m²). Aunque supera el presupuesto disponible en menos del 30%, el tamaño reducido es una consideración importante. Es ideal para un cliente que dispone de flexibilidad presupuestal y prioriza ahorrar dinero, siendo la opción más económica del mercado.

Resumen Ejecutivo

Posición Opción Área (m²) Precio (mill.) Ventaja Principal
GUADALUPE 573 730 Mejor relación área-precio, supera expectativas
EL INGENIO (600m²) 600 650 Más económico con gran amplitud
CIUDADELA PASOANCHO 275 650 Precio bajo, bien acabado
EL INGENIO (250m²) 250 700 Funcional, espacio optimizado
SEMINARIO 256 530 Opción más económica del mercado

Conclusión: La Opción GUADALUPE es la recomendación principal porque ofrece la mejor propuesta de valor integral: cumple o supera todos los requerimientos, proporciona área adicional significativa, mantiene excelente precio y es la propiedad de más alta calidad del portafolio disponible.

5 Conclusiones

5.1 Vivienda 1 — Casa en Zona Norte

El presente análisis utilizó técnicas de modelación estadística para apoyar la decisión de compra de dos viviendas por parte de una empresa internacional en la ciudad de Cali. A continuación se presentan los hallazgos principales:

El mercado de casas en la Zona Norte presenta un precio promedio de $445.9 millones con mediana de $390 millones, distribución asimétrica típica de mercados inmobiliarios. El crédito preaprobado de $350 millones se ubica por debajo de la mediana, enfocando la búsqueda en el segmento más económico, aunque los estratos 4 y 5 representan el 59.8% de la oferta disponible — base suficiente para encontrar opciones que cumplan el perfil.

El modelo explica el 61.3% de la variabilidad del precio (n = 722). El área construida es el predictor dominante (0.92M por m²), seguido de parqueaderos (42.1M por unidad) y baños (35.3M por unidad). Las habitaciones presentan efecto negativo (-9.9M) al controlar por área — más habitaciones en el mismo espacio implica ambientes más pequeños y menor valor percibido. El 38.7% no explicado refleja principalmente la ausencia del estrato como predictor (ρ = 0.60), cuya incorporación como variable categórica mejoraría el ajuste.

Los supuestos de normalidad y homocedasticidad se violan, patrón esperado en datos de precios inmobiliarios. Con n = 722 las inferencias son válidas por el Teorema del Límite Central. No se detectó multicolinealidad (VIF máximo = 1.84).

El precio estimado es 293.86 millones, con un margen de 56.14M respecto al crédito preaprobado. Se recomienda prioritariamente la propiedad en Granada (estrato 4, 296M, 232 m²) por ser la más cercana al estimado con características superiores a las solicitadas, y como alternativa El Bosque (estrato 4, 315M, 270 m²) si el espacio habitable es la prioridad.

Consideraciones metodológicas:

  • Se utilizó correlación de Spearman en lugar de Pearson, dado el carácter ordinal de variables como estrato, baños y habitaciones, y la distribución asimétrica del precio.

  • El estrato no fue incluido como predictor continuo dado su naturaleza categórica ordinal.

  • La validación de supuestos puede mostrar violaciones de normalidad y homocedasticidad, comunes en datos de precios inmobiliarios. Dado el tamaño muestral, las predicciones siguen siendo válidas de forma asintótica por el Teorema del Límite Central.

  • El mercado inmobiliario de Cali atraviesa una desaceleración en el periodo analizado, lo que puede representar una oportunidad de negociación favorable para la empresa compradora.

5.2 Limitaciones — Vivienda 1

El estrato fue excluido del modelo por su naturaleza categórica ordinal, pero representa la segunda variable más correlacionada con el precio (ρ = 0.60). Su incorporación como factor(estrato) mejoraría el R² de forma considerable.

5.3 Vivienda 2 - Apartamento en zona sur

El presente análisis empleó un modelo de regresión lineal múltiple para estimar el precio de viviendas en la zona sur de Cali y apoyar la selección de una propiedad que cumpla con los requerimientos del cliente. A continuación se presentan los principales hallazgos:

El modelo se construyó a partir de 2.787 observaciones e incorpora como predictores el área construida, estrato socioeconómico, número de habitaciones, parqueaderos y baños. El ajuste obtenido es elevado, explicando aproximadamente el 79.1% de la variabilidad del precio de las viviendas (R² = 0.791), lo que indica una alta capacidad explicativa del modelo para este mercado inmobiliario.

El área construida se consolida como el principal determinante del precio, con un efecto estimado de 1.32 millones de pesos por cada metro cuadrado adicional, lo cual es consistente con la lógica del mercado inmobiliario. El estrato socioeconómico también presenta un impacto significativo y creciente en el valor de la propiedad, evidenciando que viviendas ubicadas en estratos más altos tienden a tener precios considerablemente mayores. Entre las variables de equipamiento, los parqueaderos (61.9 millones por unidad) y los baños (38.9 millones por unidad) contribuyen positivamente al valor de la vivienda, reflejando que estos atributos incrementan la percepción de comodidad y calidad del inmueble. Por otro lado, el número de habitaciones presenta un efecto negativo (-11.8 millones) al controlar por área construida, lo cual sugiere que, para un mismo tamaño de vivienda, dividir el espacio en más habitaciones puede reducir la amplitud de los ambientes y, por tanto, el valor percibido.

Respecto a los supuestos del modelo, se observan algunas violaciones que son comunes en análisis de precios inmobiliarios. La normalidad de los residuos no se cumple estrictamente, aunque las gráficas muestran una tendencia razonable hacia la normalidad. En cuanto a la homocedasticidad, los resultados de las pruebas son mixtos: mientras que el test de Harrison–McCabe (p = 0.956) y el test de Goldfeld–Quandt (p = 0.9687) sugieren varianza constante de los errores, el Non-constant Variance Score Test detecta heterocedasticidad significativa. Esta discrepancia es frecuente en modelos con gran cantidad de observaciones y variables estructurales del mercado.

La independencia de los errores tampoco se cumple completamente. Tanto el test de Durbin-Watson (DW = 1.7075, p < 0.05) como el test de Breusch-Godfrey (p ≈ 1.38e-14) evidencian autocorrelación estadísticamente significativa en los residuos. Este fenómeno puede explicarse por la dependencia estructural entre variables del mercado inmobiliario, ya que viviendas con mayor área construida suelen incluir más baños y habitaciones, generando relaciones naturales entre los predictores que se reflejan en los errores del modelo.

Con base en el modelo estimado, se obtuvieron predicciones de precio justo de 651.7 millones y 804.1 millones de pesos para las viviendas evaluadas según sus características estructurales. Al comparar estas estimaciones con las ofertas disponibles en el mercado, la alternativa más conveniente resulta ser la propiedad ubicada en Guadalupe (zona sur).

Esta vivienda presenta 573 m² de área construida, 5 habitaciones, 8 baños y 3 parqueaderos, con un precio de 730 millones de pesos, ubicándose dentro del rango estimado por el modelo y 120 millones por debajo del presupuesto máximo disponible. Además, ofrece un área considerablemente superior a la solicitada (573 m² frente a los 300 m² requeridos), lo que representa una mejora sustancial en espacio habitable. Aunque el número de baños supera el requerimiento inicial, esto puede interpretarse como un indicador de una propiedad de mayor calidad y mejor equipamiento.

En consecuencia, la vivienda ubicada en Guadalupe se recomienda como la opción óptima, ya que combina un precio competitivo con características superiores a las requeridas, proporcionando un excelente balance entre valor de mercado, espacio habitable y nivel de equipamiento.

5.4 Consideraciones Generales

Los resultados obtenidos deben interpretarse con cautela dado que el dataset presenta limitaciones metodológicas relevantes:

Calidad de los datos:

  • parqueaderos registra un 19.3% de valores faltantes, superando el umbral recomendado del 10% para imputación confiable. No es posible verificar si estos NAs son aleatorios o sistemáticos, lo que introduce sesgo potencial en los coeficientes estimados independientemente del método empleado.
  • piso presenta un 31.7% de NAs, lo que impidió su inclusión como predictor a pesar de su relevancia comercial, especialmente en apartamentos.
  • Valores extremos como 0 habitaciones, 0 baños o 10 parqueaderos sugieren errores de captura en el registro de las propiedades.

Sobre el modelo:

  • La heterocedasticidad confirmada indica que el modelo predice con menor precisión las propiedades de alto valor. Se sugiere explorar errores estándar robustos de Huber-White o transformación logarítmica del precio.

  • El intervalo de predicción individual amplio [-35.6M, 623.3M] con límite inferior negativo evidencia que el modelo tiene limitaciones para valorar propiedades individuales con precisión.

Sobre las ofertas:

  • Las coordenadas geográficas de algunos registros no corresponden exactamente a la Zona Norte, sugiriendo inconsistencias en la clasificación zonal del dataset que podrían afectar la representatividad de las bases filtradas. —

6 Anexos

6.1 Anexo A: Resumen estadístico completo — Base 1 (Casas Zona Norte)

kable(summary(base1[, c("preciom", "areaconst", "estrato",
                         "habitaciones", "parqueaderos", "banios")]),
      caption = "Anexo A. Resumen estadístico - Casas Zona Norte") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Anexo A. Resumen estadístico - Casas Zona Norte
preciom areaconst estrato habitaciones parqueaderos banios
Min. : 89.0 Min. : 30.0 Min. :3.000 Min. : 0.000 Min. : 1.000 Min. : 0.000
1st Qu.: 261.2 1st Qu.: 140.0 1st Qu.:3.000 1st Qu.: 3.000 1st Qu.: 1.000 1st Qu.: 2.000
Median : 390.0 Median : 240.0 Median :4.000 Median : 4.000 Median : 2.000 Median : 3.000
Mean : 445.9 Mean : 264.9 Mean :4.202 Mean : 4.507 Mean : 2.011 Mean : 3.555
3rd Qu.: 550.0 3rd Qu.: 336.8 3rd Qu.:5.000 3rd Qu.: 5.000 3rd Qu.: 2.000 3rd Qu.: 4.000
Max. :1940.0 Max. :1440.0 Max. :6.000 Max. :10.000 Max. :10.000 Max. :10.000

6.2 Anexo C: Matriz de correlación de Spearman — Base 1

cor_anexo1 <- cor(
  base1 %>% select(preciom, areaconst, estrato, habitaciones, parqueaderos, banios) %>%
    filter(complete.cases(.)),
  method = "spearman"
)

kable(round(cor_anexo1, 3),
      caption = "Anexo C. Matriz de correlación de Spearman - Casas Zona Norte") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Anexo C. Matriz de correlación de Spearman - Casas Zona Norte
preciom areaconst estrato habitaciones parqueaderos banios
preciom 1.000 0.813 0.711 0.398 0.634 0.617
areaconst 0.813 1.000 0.541 0.458 0.560 0.554
estrato 0.711 0.541 1.000 0.173 0.480 0.449
habitaciones 0.398 0.458 0.173 1.000 0.340 0.581
parqueaderos 0.634 0.560 0.480 0.340 1.000 0.524
banios 0.617 0.554 0.449 0.581 0.524 1.000