El mercado inmobiliario constituye un sector clave dentro de la dinámica económica de las ciudades, dado que refleja tanto las condiciones de oferta y demanda de vivienda como el comportamiento de variables socioeconómicas asociadas al desarrollo urbano. En este contexto, las agencias de bienes raíces requieren herramientas analíticas que les permitan evaluar adecuadamente las características de las viviendas disponibles en el mercado y estimar su valor de forma objetiva para apoyar procesos de compra, venta y asesoría a clientes.
En el presente estudio se analiza una base de datos correspondiente a ofertas inmobiliarias registradas durante los últimos meses en la ciudad de Cali. A partir de esta información se realiza un proceso de filtrado para identificar las viviendas que cumplen con características específicas relacionadas con el tipo de inmueble y su localización geográfica.
Tabla 1. Dimensión del conjunto de datos
# Construcción de la base 1: casas en zona norte
base1 <- vivienda %>%
filter(tipo == "Casa", zona == "Zona Norte")
# Resumen de la base filtrada
knitr::kable(
data.frame(
Concepto = c("Número de observaciones", "Número de variables"),
Valor = dim(base1)
),
caption = "Resumen de la base filtrada: casas en zona norte"
)
| Concepto | Valor |
|---|---|
| Número de observaciones | 722 |
| Número de variables | 13 |
# Primeros 3 registros
base1 %>%
head(3) %>%
knitr::kable(caption = "Primeros 3 registros de la base 1")
| 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 | NA | 7 | 6 | Casa | acopi | -76.52950 | 3.38527 |
En particular, se construye una base de análisis compuesta por 722 observaciones correspondientes a casas ubicadas en la zona norte de la ciudad, lo cual permite enfocar el estudio en un segmento del mercado relevante para la solicitud recibida.
Tabla 2. “Verificación del filtrado por tipo de vivienda y zona geográfica”
# Tabla de verificación por tipo en la base filtrada
base1 %>%
count(tipo) %>%
knitr::kable(caption = "Verificación de la variable tipo en base 1")
| tipo | n |
|---|---|
| Casa | 722 |
# Tabla de verificación por zona en la base filtrada
base1 %>%
count(zona) %>%
knitr::kable(caption = "Verificación de la variable zona en base 1")
| zona | n |
|---|---|
| Zona Norte | 722 |
# Tabla de contingencia en la base original
tabla_cruce <- table(vivienda$tipo, vivienda$zona)
knitr::kable(
as.data.frame.matrix(tabla_cruce),
caption = "Tabla de contingencia tipo vs zona en la base original"
)
| Zona Centro | Zona Norte | Zona Oeste | Zona Oriente | Zona Sur | |
|---|---|---|---|---|---|
| Apartamento | 24 | 1198 | 1029 | 62 | 2787 |
| Casa | 100 | 722 | 169 | 289 | 1939 |
Se realizó un filtro sobre la base original para construir la base 1, compuesta exclusivamente por ofertas de casas ubicadas en la zona norte de la ciudad. La validez del procedimiento se comprobó mediante la presentación de los primeros tres registros de la base resultante, tablas de frecuencia para las variables tipo y zona, y una tabla de contingencia en la base original.
Figura 1. Localización geográfica de las viviendas filtradas en la zona norte
leaflet(base1) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud,
lat = ~latitud,
radius = 4,
popup = ~paste0(
"<b>Barrio:</b> ", barrio, "<br>",
"<b>Precio:</b> ", preciom, " millones<br>",
"<b>Área:</b> ", areaconst, " m²<br>",
"<b>Estrato:</b> ", estrato
)
)
Aunque la base fue filtrada para incluir únicamente casas de la zona norte, en el mapa se observan puntos distribuidos en otras áreas de la ciudad. Esto puede explicarse por varios factores relacionados con la calidad y definición de los datos:
La variable zona puede haber sido definida por criterios inmobiliarios o comerciales y no necesariamente por límites geográficos exactos. Por ello, algunos barrios catalogados como “zona norte” podrían ubicarse geográficamente hacia zonas intermedias de la ciudad.
Las coordenadas de latitud y longitud pueden contener errores de registro, digitación o geocodificación. Esto provoca que algunas viviendas aparezcan ubicadas en lugares que no corresponden con su zona real.
Es posible que durante la recolección de la información se hayan asignado valores incorrectos a la variable zona, generando discrepancias entre la clasificación y la ubicación espacial.
El análisis exploratorio de datos (EDA) constituye una etapa fundamental para comprender la estructura, distribución y relaciones entre las variables presentes en el conjunto de datos. En este caso, se examinan aspectos clave relacionados con la distribución de precios, áreas, estratos socioeconómicos, zonas geográficas y tipos de vivienda.
Tabla 3. Estadísticos descriptivos de las variables analíticas
# Selección de variables de interés
eda_base <- base1 %>%
select(preciom, areaconst, estrato, banios, habitaciones, zona) %>%
na.omit() %>%
mutate(estrato = factor(estrato))
tabla_desc <- eda_base %>%
summarise(
Precio_Min = min(preciom),
Precio_Q1 = quantile(preciom,0.25),
Precio_Mediana = median(preciom),
Precio_Media = mean(preciom),
Precio_Q3 = quantile(preciom,0.75),
Precio_Max = max(preciom),
Area_Min = min(areaconst),
Area_Media = mean(areaconst),
Area_Max = max(areaconst),
Estrato_Medio = mean(estrato),
Banios_Medio = mean(banios),
Habitaciones_Medio = mean(habitaciones)
)
tabla_desc_long <- stack(tabla_desc)
tabla_desc_final <- data.frame(
Indicador = tabla_desc_long$ind,
Valor = round(tabla_desc_long$values,2)
)
kable(tabla_desc_final,
caption = "Estadísticos descriptivos de las variables analizadas")
| Indicador | Valor |
|---|---|
| Precio_Min | 89.00 |
| Precio_Q1 | 261.25 |
| Precio_Mediana | 390.00 |
| Precio_Media | 445.91 |
| Precio_Q3 | 550.00 |
| Precio_Max | 1940.00 |
| Area_Min | 30.00 |
| Area_Media | 264.85 |
| Area_Max | 1440.00 |
| Estrato_Medio | NA |
| Banios_Medio | 3.56 |
| Habitaciones_Medio | 4.51 |
Se calcularon estadísticos descriptivos con el fin de caracterizar las variables relevantes para el análisis del precio de la vivienda. En la base filtrada se observan 722 observaciones, con un precio promedio cercano a 446 millones de pesos y una mediana de 390 millones, lo que sugiere la presencia de algunas viviendas de alto valor que incrementan el promedio. En términos estructurales, las viviendas presentan en promedio 264 m² de área construida, pertenecen a estrato 4, y cuentan aproximadamente con 3.5 baños y 4.5 habitaciones.
Figura 2. Relación entre el precio de la vivienda y el área construida
plot_ly(
data = eda_base,
x = ~areaconst,
y = ~preciom,
type = "scatter",
mode = "markers",
text = ~paste(
"Área:", areaconst,
"<br>Precio:", preciom,
"<br>Estrato:", estrato,
"<br>Baños:", banios,
"<br>Habitaciones:", habitaciones
),
hoverinfo = "text"
) %>%
layout(
title = "Precio vs Área construida",
xaxis = list(title = "Área construida"),
yaxis = list(title = "Precio (millones)")
)
El diagrama de dispersión evidencia una relación positiva entre el área construida y el precio de la vivienda. En general, a medida que aumenta el tamaño de la propiedad, el valor de mercado tiende a incrementarse. Este comportamiento es consistente con la lógica del mercado inmobiliario, donde el área disponible constituye uno de los principales determinantes del precio.
Sin embargo, también se observa una alta dispersión en los precios para áreas similares, especialmente entre viviendas con áreas superiores a los 300 m². Esto sugiere que el precio no depende únicamente del tamaño del inmueble, sino también de otros factores relevantes como el estrato socioeconómico, la ubicación específica del barrio, la calidad de la construcción o el número de amenidades.
Adicionalmente, se identifican algunos valores atípicos, particularmente viviendas con áreas muy grandes (superiores a 1000 m²) y precios elevados. Estas observaciones podrían corresponder a propiedades de características especiales dentro del mercado.
En términos generales, el patrón observado respalda la inclusión del área construida como una variable explicativa relevante en el modelo de regresión del precio de la vivienda.
Figura 3. Distribución del precio de la vivienda según estrato socioeconómico
plot_ly(
data = eda_base,
x = ~as.factor(estrato),
y = ~preciom,
type = "box",
color = ~as.factor(estrato)
) %>%
layout(
title = "Distribución del precio según estrato",
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio (millones)")
)
El diagrama de cajas muestra una relación creciente entre el estrato socioeconómico y el precio de las viviendas. Se observa que a medida que aumenta el estrato, también se incrementa la mediana del precio, lo cual refleja el patrón esperado del mercado inmobiliario urbano.
Las viviendas de estrato 3 presentan los precios más bajos y una menor dispersión relativa, mientras que en estratos 5 y 6 se observan precios significativamente más altos y una mayor variabilidad. Esto puede explicarse porque en los estratos más altos existen propiedades con características muy heterogéneas en términos de tamaño, acabados, ubicación dentro del sector y amenidades.
Asimismo, se identifican algunos valores atípicos, particularmente en estratos altos, donde aparecen viviendas con precios considerablemente superiores al resto de las observaciones. Este comportamiento es típico en mercados inmobiliarios donde ciertas propiedades poseen características exclusivas.
En consecuencia, los resultados sugieren que el estrato socioeconómico es una variable relevante para explicar las diferencias en el precio de las viviendas, lo cual justifica su inclusión en el modelo de regresión utilizado posteriormente.
Figura 4. Distribución del precio de la vivienda según número de baños
plot_ly(
data = eda_base,
x = ~as.factor(banios),
y = ~preciom,
type = "box",
color = ~as.factor(banios)
) %>%
layout(
title = "Distribución del precio según número de baños",
xaxis = list(title = "Número de baños"),
yaxis = list(title = "Precio (millones)")
)
El diagrama de cajas muestra una relación positiva entre el número de baños y el precio de las viviendas. En general, las propiedades con mayor número de baños tienden a presentar valores de mercado más elevados, lo cual es consistente con las características del mercado inmobiliario, donde los baños adicionales suelen reflejar viviendas de mayor tamaño, mejor equipamiento o mayor nivel de confort.
Se observa que a partir de tres o más baños la mediana del precio comienza a incrementarse de forma más evidente. Además, la dispersión de los precios también aumenta a medida que crece el número de baños, lo cual sugiere una mayor heterogeneidad en las características de las viviendas dentro de estos grupos.
Asimismo, se identifican algunos valores atípicos, especialmente en viviendas con mayor número de baños, lo que podría estar asociado a propiedades de lujo o inmuebles con características arquitectónicas particulares. En general, los resultados sugieren que el número de baños constituye una variable relevante en la explicación del precio de las viviendas.
Figura 5. Distribución del precio de la vivienda según número de habitaciones
plot_ly(
data = eda_base,
x = ~as.factor(habitaciones),
y = ~preciom,
type = "box",
color = ~as.factor(habitaciones)
) %>%
layout(
title = "Distribución del precio según número de habitaciones",
xaxis = list(title = "Número de habitaciones"),
yaxis = list(title = "Precio (millones)")
)
La relación entre el número de habitaciones y el precio de la vivienda muestra una tendencia creciente, en la cual las propiedades con mayor número de habitaciones tienden a presentar precios más altos. Este comportamiento resulta coherente con la lógica del mercado inmobiliario, dado que un mayor número de habitaciones generalmente se asocia con viviendas más amplias o con mayor capacidad de ocupación.
En el gráfico se observa que las medianas del precio aumentan progresivamente a medida que crece el número de habitaciones, especialmente a partir de cuatro habitaciones. Sin embargo, también se evidencia una considerable dispersión en los precios dentro de cada categoría, lo que sugiere que el número de habitaciones no es el único factor determinante del valor del inmueble.
Adicionalmente, se identifican algunos valores extremos en viviendas con un número elevado de habitaciones, lo cual puede estar asociado a propiedades de gran tamaño o con características particulares dentro del mercado. En conjunto, los resultados indican que el número de habitaciones constituye un factor importante para explicar la variación en los precios de las viviendas.
Figura 6. Distribución del precio de la vivienda según zona geográfica
eda_zona <- vivienda %>%
filter(tipo == "Casa") %>%
select(preciom, zona) %>%
na.omit()
plot_ly(
data = eda_zona,
x = ~zona,
y = ~preciom,
type = "box",
color = ~zona
) %>%
layout(
title = "Distribución del precio según zona",
xaxis = list(title = "Zona"),
yaxis = list(title = "Precio (millones)")
)
El diagrama de cajas permite observar diferencias significativas en la distribución del precio de las viviendas entre las distintas zonas de la ciudad. En particular, las zonas oeste y sur presentan las medianas de precio más elevadas, lo cual sugiere que en estas áreas se concentran propiedades de mayor valor dentro del mercado inmobiliario.
Por otro lado, las zonas centro y oriente presentan niveles de precio más bajos en comparación con las demás zonas, lo que podría estar asociado a diferencias en el nivel socioeconómico, la calidad del entorno urbano o el tipo de viviendas predominantes en dichas áreas.
Asimismo, se observa una mayor dispersión en algunas zonas, lo que indica una mayor heterogeneidad en las características de las propiedades disponibles. En particular, la zona oeste muestra una amplia variabilidad en los precios, lo que podría reflejar la coexistencia de viviendas de diferentes tamaños y características dentro de la misma área.
En general, los resultados evidencian que la ubicación geográfica constituye un factor relevante en la determinación del precio de las viviendas, lo que justifica su análisis dentro del estudio del mercado inmobiliario.
Tabla 4. Matriz de correlación entre las variables numéricas del modelo
cor_data <- eda_base %>%
select(preciom, areaconst, banios, habitaciones)
cor_matrix <- round(cor(cor_data, use = "complete.obs"), 3)
knitr::kable(cor_matrix, caption = "Matriz de correlación entre variables numéricas")
| preciom | areaconst | banios | habitaciones | |
|---|---|---|---|---|
| preciom | 1.000 | 0.731 | 0.523 | 0.323 |
| areaconst | 0.731 | 1.000 | 0.463 | 0.375 |
| banios | 0.523 | 0.463 | 1.000 | 0.576 |
| habitaciones | 0.323 | 0.375 | 0.576 | 1.000 |
plot_ly(
x = colnames(cor_matrix),
y = rownames(cor_matrix),
z = cor_matrix,
type = "heatmap"
) %>%
layout(
title = "Mapa de calor de correlaciones",
xaxis = list(title = ""),
yaxis = list(title = "")
)
La matriz de correlación permite evaluar la intensidad y dirección de la relación lineal entre las principales variables numéricas del estudio. En primer lugar, se observa una correlación positiva relativamente alta entre el precio de la vivienda y el área construida (0.731), lo cual indica que el tamaño del inmueble constituye uno de los factores más importantes en la determinación de su valor de mercado.
Asimismo, el número de baños presenta una correlación moderada con el precio (0.523), lo que sugiere que las viviendas con mayor número de baños tienden a ser más costosas. De manera similar, el número de habitaciones también muestra una relación positiva con el precio (0.323), aunque con menor intensidad en comparación con las otras variables.
Por otro lado, se observa una correlación relativamente alta entre el número de habitaciones y el número de baños (0.576), lo cual es coherente dado que las viviendas más grandes suelen contar con mayor cantidad de ambos espacios. No obstante, estos niveles de correlación no parecen ser lo suficientemente altos como para generar problemas severos de multicolinealidad dentro del modelo de regresión.
En conjunto, estos resultados respaldan la inclusión de las variables estructurales de la vivienda como determinantes relevantes del precio dentro del modelo econométrico estimado.
tabla 5. Cantidad de valores faltantes por variable en la base de datos
# Número de NA por variable
na_por_variable <- base1 %>%
summarise(across(everything(), ~sum(is.na(.)))) %>%
tidyr::pivot_longer(cols = everything(),
names_to = "Variable",
values_to = "Cantidad_NA")
kable(
na_por_variable,
caption = "Cantidad de valores NA por variable en base1"
)
| Variable | Cantidad_NA |
|---|---|
| id | 0 |
| zona | 0 |
| piso | 372 |
| estrato | 0 |
| preciom | 0 |
| areaconst | 0 |
| parqueaderos | 287 |
| banios | 0 |
| habitaciones | 0 |
| tipo | 0 |
| barrio | 0 |
| longitud | 0 |
| latitud | 0 |
El análisis de valores faltantes muestra que la mayoría de las variables del conjunto de datos no presentan registros perdidos. Sin embargo, se identifican valores faltantes en las variables piso (372 observaciones) y parqueaderos (287 observaciones). Dado que la variable piso no forma parte de las variables utilizadas en el modelo de regresión, su ausencia no afecta directamente el proceso de estimación.
tabla 6. Distribución del número de parqueaderos en las viviendas
# Frecuencia de parqueaderos (sin NA)
tabla_parq <- base1 %>%
filter(!is.na(parqueaderos)) %>%
count(parqueaderos) %>%
mutate(porcentaje = round(100 * n / sum(n), 2))
kable(tabla_parq, caption = "Distribución de número de parqueaderos (sin NA)")
| parqueaderos | n | porcentaje |
|---|---|---|
| 1 | 161 | 37.01 |
| 2 | 158 | 36.32 |
| 3 | 49 | 11.26 |
| 4 | 40 | 9.20 |
| 5 | 11 | 2.53 |
| 6 | 8 | 1.84 |
| 7 | 5 | 1.15 |
| 8 | 1 | 0.23 |
| 9 | 1 | 0.23 |
| 10 | 1 | 0.23 |
En el caso de parqueaderos, se observa que la distribución de los valores disponibles se concentra principalmente entre uno y dos parqueaderos, y la mediana es igual a 2. Por esta razón, se decidió imputar los valores faltantes utilizando la mediana, ya que este estadístico es robusto frente a valores extremos y permite mantener la estructura general de la distribución sin introducir sesgos significativos en el análisis. Esta imputación permite conservar el tamaño de la muestra para la estimación del modelo de regresión.
tabla 7. Medidas de tendencia central para la variable número de parqueaderos
stats_parq <- base1 %>%
summarise(
media = mean(parqueaderos, na.rm = TRUE),
mediana = median(parqueaderos, na.rm = TRUE),
)
kable(stats_parq, caption = "Medidas de tendencia central para parqueaderos")
| media | mediana |
|---|---|
| 2.181609 | 2 |
mediana_parq <- median(base1$parqueaderos, na.rm = TRUE)
base1 <- base1 %>%
mutate(parqueaderos = ifelse(is.na(parqueaderos), mediana_parq, parqueaderos))
tabla 8. Resumen de la base utilizada para la estimación del modelo de regresión
# Base para modelación
modelo_base <- base1 %>%
select(preciom, areaconst, estrato, habitaciones, parqueaderos, banios) %>%
na.omit() %>%
mutate(estrato = factor(estrato))
# Resumen de la base usada en el modelo
kable(
data.frame(
Concepto = c("Número de observaciones", "Número de variables"),
Valor = dim(modelo_base)
),
caption = "Resumen de la base empleada en la regresión"
)
| Concepto | Valor |
|---|---|
| Número de observaciones | 722 |
| Número de variables | 6 |
La Tabla 8 presenta un resumen de la base de datos utilizada para la estimación del modelo de regresión lineal múltiple. Después del proceso de depuración e imputación de valores faltantes, el modelo se estimó utilizando 722 observaciones y 6 variables relevantes para explicar el precio de las viviendas.
El tamaño de la muestra resulta adecuado para la estimación del modelo, lo cual permite obtener estimaciones estables y estadísticamente confiables de los parámetros. Las variables consideradas corresponden a características estructurales de las viviendas, tales como el área construida, el estrato socioeconómico, el número de habitaciones, el número de parqueaderos y el número de baños.
Estas variables fueron seleccionadas debido a su relevancia teórica y empírica dentro del análisis del mercado inmobiliario, ya que representan factores comúnmente asociados con la valoración de las propiedades residenciales.
tabla 9. Coeficientes estimados del modelo de regresión lineal múltiple
# Estimación del modelo de regresión lineal múltiple
modelo_lm <- lm(
preciom ~ areaconst + factor(estrato) + habitaciones + parqueaderos + banios,
data = modelo_base
)
# Resumen general del modelo
summary(modelo_lm)
##
## Call:
## lm(formula = preciom ~ areaconst + factor(estrato) + habitaciones +
## parqueaderos + banios, data = modelo_base)
##
## Residuals:
## Min 1Q Median 3Q Max
## -933.85 -71.11 -14.45 48.04 1072.76
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.6492 18.8210 0.460 0.64598
## areaconst 0.8115 0.0429 18.916 < 2e-16 ***
## factor(estrato)4 84.8879 17.1771 4.942 9.65e-07 ***
## factor(estrato)5 136.2928 16.0700 8.481 < 2e-16 ***
## factor(estrato)6 328.4214 26.3102 12.483 < 2e-16 ***
## habitaciones 1.5514 4.0773 0.380 0.70369
## parqueaderos 17.5554 5.6248 3.121 0.00187 **
## banios 23.4042 5.3655 4.362 1.48e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 155.9 on 714 degrees of freedom
## Multiple R-squared: 0.6657, Adjusted R-squared: 0.6624
## F-statistic: 203.1 on 7 and 714 DF, p-value: < 2.2e-16
# Tabla de coeficientes
tabla_coef <- broom::tidy(modelo_lm) %>%
mutate(across(where(is.numeric), ~round(., 4)))
kable(
tabla_coef,
caption = "Coeficientes estimados del modelo de regresión lineal múltiple"
)
| term | estimate | std.error | statistic | p.value |
|---|---|---|---|---|
| (Intercept) | 8.6491 | 18.8210 | 0.4595 | 0.6460 |
| areaconst | 0.8115 | 0.0429 | 18.9155 | 0.0000 |
| factor(estrato)4 | 84.8879 | 17.1771 | 4.9419 | 0.0000 |
| factor(estrato)5 | 136.2929 | 16.0700 | 8.4812 | 0.0000 |
| factor(estrato)6 | 328.4214 | 26.3101 | 12.4827 | 0.0000 |
| habitaciones | 1.5514 | 4.0773 | 0.3805 | 0.7037 |
| parqueaderos | 17.5554 | 5.6248 | 3.1211 | 0.0019 |
| banios | 23.4042 | 5.3655 | 4.3620 | 0.0000 |
La Tabla 9 presenta los coeficientes estimados del modelo de regresión lineal múltiple utilizado para explicar el precio de las viviendas en función de sus características estructurales. En general, los resultados indican que varias de las variables incluidas en el modelo presentan efectos estadísticamente significativos sobre el precio de las propiedades.
En primer lugar, el área construida muestra un efecto positivo y altamente significativo. El coeficiente estimado indica que, manteniendo constantes las demás variables, un incremento de una unidad en el área construida aumenta el precio esperado de la vivienda en aproximadamente 0.81 millones de pesos, lo cual es consistente con la lógica del mercado inmobiliario.
Respecto al estrato socioeconómico, tratado como variable categórica, se observa que las viviendas ubicadas en estratos superiores presentan precios significativamente mayores en comparación con el estrato base. En particular, las viviendas de estrato 4, 5 y 6 presentan incrementos aproximados de 84.9, 136.3 y 328.4 millones de pesos, respectivamente, lo que refleja el fuerte efecto que tiene el nivel socioeconómico del sector sobre el valor de las propiedades.
En cuanto a las demás variables estructurales, el número de parqueaderos y el número de baños presentan efectos positivos y estadísticamente significativos, lo que indica que viviendas con mayores comodidades tienden a alcanzar precios más elevados. Por el contrario, el número de habitaciones no resulta estadísticamente significativo en el modelo, lo que sugiere que su efecto sobre el precio podría estar parcialmente capturado por otras variables relacionadas con el tamaño de la vivienda, como el área construida.
tabla 10. Intervalos de confianza al 95% de los coeficientes del modelo de regresión
# Intervalos de confianza de los coeficientes
tabla_ic <- confint(modelo_lm) %>%
as.data.frame() %>%
tibble::rownames_to_column("Variable") %>%
rename(IC_Inf = `2.5 %`, IC_Sup = `97.5 %`) %>%
mutate(across(where(is.numeric), ~round(., 4)))
kable(
tabla_ic,
caption = "Intervalos de confianza al 95% de los coeficientes"
)
| Variable | IC_Inf | IC_Sup |
|---|---|---|
| (Intercept) | -28.3019 | 45.6002 |
| areaconst | 0.7272 | 0.8957 |
| factor(estrato)4 | 51.1643 | 118.6116 |
| factor(estrato)5 | 104.7427 | 167.8430 |
| factor(estrato)6 | 276.7669 | 380.0759 |
| habitaciones | -6.4535 | 9.5563 |
| parqueaderos | 6.5122 | 28.5986 |
| banios | 12.8702 | 33.9381 |
La Tabla 10 presenta los intervalos de confianza al 95% para los coeficientes estimados del modelo. Se observa que los intervalos asociados a área construida, estrato, parqueaderos y baños no incluyen el valor cero, lo que confirma que estas variables tienen un efecto estadísticamente significativo sobre el precio de la vivienda.
En particular, el estrato socioeconómico muestra incrementos importantes en el precio esperado frente al estrato base, con efectos que aumentan a medida que el nivel socioeconómico es mayor. Por su parte, el área construida mantiene un intervalo estrecho y positivo, lo que evidencia un efecto consistente sobre el valor del inmueble.
En contraste, el intervalo correspondiente al número de habitaciones incluye el valor cero, lo que sugiere que esta variable no presenta un efecto estadísticamente significativo dentro del modelo, posiblemente debido a que su influencia se encuentra capturada parcialmente por el área construida.
tabla 11. Medidas de ajuste del modelo de regresión
# Medidas de ajuste
tabla_ajuste <- data.frame(
Medida = c("R2", "R2 ajustado", "Error estándar residual", "Estadístico F", "p-valor modelo"),
Valor = c(
summary(modelo_lm)$r.squared,
summary(modelo_lm)$adj.r.squared,
summary(modelo_lm)$sigma,
summary(modelo_lm)$fstatistic[1],
pf(
summary(modelo_lm)$fstatistic[1],
summary(modelo_lm)$fstatistic[2],
summary(modelo_lm)$fstatistic[3],
lower.tail = FALSE
)
)
) %>%
mutate(Valor = round(Valor, 4))
kable(
tabla_ajuste,
caption = "Medidas de ajuste del modelo"
)
| Medida | Valor |
|---|---|
| R2 | 0.6657 |
| R2 ajustado | 0.6624 |
| Error estándar residual | 155.9253 |
| Estadístico F | 203.1087 |
| p-valor modelo | 0.0000 |
La Tabla 11 presenta las principales métricas de ajuste del modelo estimado. El coeficiente de determinación R² = 0.6657 indica que aproximadamente 66.6% de la variabilidad del precio de las viviendas es explicada por las variables incluidas en el modelo, lo cual representa un nivel de ajuste adecuado para modelos aplicados al mercado inmobiliario.
El R² ajustado (0.6624) es muy cercano al R², lo que sugiere que las variables incluidas aportan capacidad explicativa real y no generan sobreajuste significativo.
Adicionalmente, el estadístico F del modelo resulta altamente significativo (p-valor < 0.001), lo que confirma que, en conjunto, las variables incluidas en la regresión contribuyen significativamente a explicar el comportamiento del precio de las viviendas.
Figura 7. Gráficos de diagnóstico del modelo de regresión lineal
par(mfrow = c(2,2))
plot(modelo_lm)
Los gráficos de diagnóstico permiten evaluar visualmente los supuestos básicos del modelo de regresión. En el gráfico Residuals vs Fitted se observa una ligera dispersión creciente de los residuos a medida que aumenta el valor ajustado, lo que sugiere posibles indicios de heterocedasticidad.
El gráfico Q-Q de los residuos muestra que, aunque gran parte de los puntos sigue la línea teórica, existen desviaciones en los extremos, lo que indica que la distribución de los residuos podría apartarse ligeramente de la normalidad.
Por su parte, el gráfico Scale-Location refuerza la posible presencia de heterocedasticidad moderada. Finalmente, el gráfico Residuals vs Leverage permite identificar algunas observaciones con mayor influencia potencial sobre el modelo, aunque ninguna parece representar un caso extremadamente influyente.
tabla 12. Factor de inflación de la varianza (VIF) de las variables explicativas
# Multicolinealidad
vif_valores <- car::vif(modelo_lm)
tabla_vif <- as.data.frame(vif_valores) %>%
tibble::rownames_to_column("Variable") %>%
mutate(across(where(is.numeric), ~round(., 4)))
kable(
tabla_vif,
caption = "Indicadores de multicolinealidad del modelo"
)
| Variable | GVIF | Df | GVIF^(1/(2*Df)) |
|---|---|---|---|
| areaconst | 1.5251 | 1 | 1.2350 |
| factor(estrato) | 1.4881 | 3 | 1.0685 |
| habitaciones | 1.6468 | 1 | 1.2833 |
| parqueaderos | 1.1222 | 1 | 1.0593 |
| banios | 1.9825 | 1 | 1.4080 |
La Tabla 12 presenta los valores del Factor de Inflación de la Varianza (VIF) para las variables explicativas incluidas en el modelo. Todos los valores se encuentran muy por debajo del umbral común de 5, lo que indica que no existe evidencia de problemas importantes de multicolinealidad entre las variables independientes.
Esto sugiere que cada variable aporta información relativamente independiente para explicar el precio de las viviendas y que las estimaciones de los coeficientes del modelo son estables.
Figura 8. Prueba de normalidad de Shapiro-Wilk para los residuos del modelo
residuos <- residuals(modelo_lm)
shapiro.test(residuos)
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.82765, p-value < 2.2e-16
qqnorm(residuos)
qqline(residuos, col = "red")
La prueba de Shapiro-Wilk evalúa si los residuos del modelo siguen una distribución normal. El resultado obtenido presenta un p-valor menor a 0.05, lo que indica evidencia estadística para rechazar la hipótesis nula de normalidad.
No obstante, en muestras grandes como la utilizada en este estudio, es común que pequeñas desviaciones de la normalidad resulten estadísticamente significativas. Por esta razón, el análisis gráfico de los residuos resulta complementario para evaluar este supuesto, y en este caso sugiere que las desviaciones no son excesivamente severas.
tabla 13. Prueba de Breusch-Pagan para evaluar homoscedasticidad de los residuos
library(lmtest)
bptest(modelo_lm)
##
## studentized Breusch-Pagan test
##
## data: modelo_lm
## BP = 134.03, df = 7, p-value < 2.2e-16
La prueba de Breusch-Pagan permite evaluar si la varianza de los residuos es constante a lo largo de los valores ajustados del modelo. El resultado presenta un p-valor menor a 0.05, por lo que se rechaza la hipótesis nula de homoscedasticidad. Esto sugiere la presencia de heterocedasticidad, es decir, que la variabilidad de los errores no es constante.
Aunque este resultado no invalida el modelo, indica que podrían aplicarse métodos de corrección como errores estándar robustos o transformaciones de variables para mejorar la estimación.
tabla 14. Prueba de Durbin-Watson para evaluar independencia de errores
library(lmtest)
dwtest(modelo_lm)
##
## Durbin-Watson test
##
## data: modelo_lm
## DW = 1.6994, p-value = 1.952e-05
## alternative hypothesis: true autocorrelation is greater than 0
La prueba de Durbin-Watson evalúa la presencia de autocorrelación en los residuos del modelo. El estadístico obtenido es cercano a 1.69, valor relativamente próximo a 2, lo que sugiere una baja autocorrelación entre los errores.
Aunque el p-valor indica evidencia estadística de autocorrelación positiva, en contextos de datos transversales como el presente estudio este efecto suele ser limitado y no representa un problema crítico para la interpretación del modelo.
Figura 9. Distancia de Cook para la identificación de observaciones influyentes
cooksd <- cooks.distance(modelo_lm)
plot(cooksd,
type="h",
main="Distancia de Cook",
ylab="Cook's distance")
abline(h = 4/length(cooksd), col="red")
La distancia de Cook permite identificar observaciones que podrían tener una influencia desproporcionada sobre la estimación del modelo. En la figura se observa que la mayoría de las observaciones se encuentran por debajo del umbral de referencia, lo que indica que su influencia sobre el modelo es limitada.
No obstante, se identifican algunos casos aislados con valores relativamente más altos, lo que sugiere la presencia de ciertas observaciones potencialmente influyentes. Estas podrían corresponder a viviendas con características atípicas, como precios o áreas significativamente mayores al promedio.
tabla 15. Características evaluadas para la predicción de la vivienda solicitada
# Escenarios de predicción para la vivienda 1
nueva_vivienda1 <- data.frame(
estrato = factor(c(4, 5), levels = levels(modelo_base$estrato)),
areaconst = c(200, 200),
habitaciones = c(4, 4),
parqueaderos = c(1, 1),
banios = c(2, 2)
)
# Predicciones
pred_conf <- predict(
modelo_lm,
newdata = nueva_vivienda1,
interval = "confidence",
level = 0.95
)
pred_pred <- predict(
modelo_lm,
newdata = nueva_vivienda1,
interval = "prediction",
level = 0.95
)
# Tabla 1: características del caso
tabla_caso_v1 <- nueva_vivienda1 %>%
mutate(Credito_Maximo = 350)
kable(
tabla_caso_v1,
caption = "Características evaluadas para la vivienda 1",
col.names = c("Estrato", "Área", "Habitaciones", "Parqueaderos", "Baños", "Crédito máximo")
)
| Estrato | Área | Habitaciones | Parqueaderos | Baños | Crédito máximo |
|---|---|---|---|---|---|
| 4 | 200 | 4 | 1 | 2 | 350 |
| 5 | 200 | 4 | 1 | 2 | 350 |
La Tabla 15 presenta las características utilizadas para estimar el precio de la vivienda solicitada. Se evaluaron dos escenarios posibles correspondientes a estrato 4 y estrato 5, manteniendo constantes las demás características de la vivienda: 200 m² de área construida, 4 habitaciones, 2 baños y 1 parqueadero, con un crédito máximo disponible de 350 millones de pesos. Estos escenarios permiten analizar si la vivienda solicitada es viable dentro del presupuesto dependiendo del nivel de estrato socioeconómico.
tabla 16. Resultados de predicción del precio para la vivienda solicitada
# Tabla 2: resultados de predicción
tabla_resultado_v1 <- nueva_vivienda1 %>%
mutate(
Precio_Estimado = round(pred_conf[, "fit"], 2),
IC_95 = paste0("[", round(pred_conf[, "lwr"], 2), " ; ", round(pred_conf[, "upr"], 2), "]"),
IP_95 = paste0("[", round(pred_pred[, "lwr"], 2), " ; ", round(pred_pred[, "upr"], 2), "]"),
Viable = ifelse(round(pred_conf[, "fit"], 2) <= 350, "Sí", "No")
) %>%
select(estrato, Precio_Estimado, IC_95, IP_95, Viable)
kable(
tabla_resultado_v1,
caption = "Resultados de predicción para la vivienda 1",
col.names = c("Estrato", "Precio estimado", "IC 95%", "IP 95%", "Viable")
)
| Estrato | Precio estimado | IC 95% | IP 95% | Viable |
|---|---|---|---|---|
| 4 | 326.4 | [295.71 ; 357.09] | [18.74 ; 634.06] | Sí |
| 5 | 377.8 | [349.63 ; 405.98] | [70.38 ; 685.23] | No |
La Tabla 16 muestra los resultados de la predicción del precio estimado para la vivienda solicitada según el modelo de regresión. Para el caso de estrato 4, el modelo estima un precio aproximado de 326.4 millones de pesos, valor que se encuentra dentro del límite del crédito preaprobado, por lo que se considera una opción viable.
En contraste, para el estrato 5 el precio estimado es cercano a 377.8 millones de pesos, superando el presupuesto disponible. Por lo tanto, este escenario no sería viable dentro del límite de financiamiento establecido. Estos resultados sugieren que, para cumplir con el presupuesto disponible, la búsqueda debería concentrarse principalmente en viviendas de estrato 4.
base1_pred <- base1 %>%
mutate(estrato = factor(estrato, levels = levels(modelo_base$estrato))) %>%
mutate(
precio_pred = predict(modelo_lm, newdata = .)
)
ofertas_v1 <- base1_pred %>%
filter(
precio_pred <= 350, # viables según el modelo
estrato %in% c(4,5),
habitaciones >= 4,
banios >= 2,
parqueaderos >= 1
)
tabla 17. Ofertas potenciales de viviendas para la solicitud 1 según el modelo
ofertas_v1 <- base1_pred %>%
filter(
preciom <= 350, # precio real dentro del presupuesto
precio_pred <= 350, # modelo también lo considera viable
estrato %in% c(4,5),
habitaciones >= 4,
banios >= 2,
parqueaderos >= 1
)
ofertas_top5 <- ofertas_v1 %>%
mutate(
dif_area = abs(areaconst - 200)
) %>%
arrange(dif_area, precio_pred) %>%
slice(1:5)
kable(
ofertas_top5 %>%
select(
barrio,
estrato,
preciom,
precio_pred,
areaconst,
habitaciones,
banios,
parqueaderos
),
caption = "Ofertas potenciales para la vivienda 1 según el modelo"
)
| barrio | estrato | preciom | precio_pred | areaconst | habitaciones | banios | parqueaderos |
|---|---|---|---|---|---|---|---|
| el bosque | 4 | 330 | 344.8066 | 165.00 | 4 | 4 | 1 |
| zona norte | 4 | 265 | 318.9681 | 162.00 | 4 | 3 | 1 |
| el bosque | 4 | 340 | 342.3722 | 162.00 | 4 | 4 | 1 |
| la merced | 4 | 280 | 306.7961 | 147.00 | 4 | 3 | 1 |
| ciudad los álamos | 4 | 215 | 298.3912 | 143.85 | 4 | 2 | 2 |
La Tabla 17 presenta cinco viviendas potenciales identificadas a partir del modelo de predicción y de los criterios definidos en la solicitud. Las propiedades seleccionadas cumplen con las características estructurales mínimas requeridas y presentan precios estimados inferiores a 350 millones de pesos, lo que las hace compatibles con el crédito preaprobado.
Las viviendas sugeridas se concentran principalmente en estrato 4, lo cual coincide con los resultados obtenidos en el ejercicio de predicción, donde este estrato resultó ser el único compatible con el presupuesto disponible. Además, las áreas construidas oscilan aproximadamente entre 143 m² y 165 m², lo que representa alternativas razonablemente cercanas al tamaño solicitado, manteniendo condiciones adecuadas de habitaciones, baños y parqueaderos.
En conjunto, estas ofertas representan opciones realistas dentro del mercado analizado, que cumplen con las restricciones financieras y las características generales solicitadas por el cliente.
Figura 10. Localización geográfica de las viviendas sugeridas para la solicitud
library(leaflet)
leaflet(ofertas_top5) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud,
lat = ~latitud,
radius = 7,
color = "blue",
popup = ~paste0(
"<b>Barrio:</b> ", barrio,
"<br><b>Estrato:</b> ", estrato,
"<br><b>Precio mercado:</b> ", preciom, " millones",
"<br><b>Precio estimado:</b> ", round(precio_pred,2), " millones",
"<br><b>Área:</b> ", areaconst,
"<br><b>Habitaciones:</b> ", habitaciones,
"<br><b>Baños:</b> ", banios
)
)
La Figura 10 muestra la ubicación geográfica de las viviendas sugeridas para la solicitud 1 dentro de la ciudad de Cali. A partir del mapa se observa que las propiedades seleccionadas se concentran principalmente en sectores de la zona norte y zonas cercanas del área urbana, lo cual es consistente con el filtro aplicado inicialmente sobre la base de datos.
La distribución espacial evidencia que las ofertas identificadas se encuentran relativamente próximas entre sí, lo que sugiere que el modelo logró identificar zonas específicas del mercado inmobiliario donde es posible encontrar viviendas que cumplen simultáneamente con las características estructurales solicitadas y con la restricción presupuestal de 350 millones de pesos.
En conjunto, el mapa permite visualizar de forma clara las alternativas disponibles para el cliente, facilitando la comparación de opciones y la toma de decisiones dentro del área geográfica de interés.
El análisis para la segunda solicitud inicia con la construcción de una base de datos filtrada que contiene exclusivamente ofertas correspondientes a apartamentos ubicados en la zona sur de la ciudad. Este proceso permite enfocar el estudio en el segmento del mercado inmobiliario que responde a las características generales de la solicitud planteada, particularmente en términos del tipo de inmueble y su localización geográfica.
Tabla 18. Dimensión del conjunto de datos para apartamentos en la zona sur
# Construcción de la base 2: apartamentos en zona sur
base2 <- vivienda %>%
filter(tipo == "Apartamento", zona == "Zona Sur")
# Resumen de la base filtrada
knitr::kable(
data.frame(
Concepto = c("Número de observaciones", "Número de variables"),
Valor = dim(base2)
),
caption = "Resumen de la base filtrada: apartamentos en zona sur"
)
| Concepto | Valor |
|---|---|
| Número de observaciones | 2787 |
| Número de variables | 13 |
# Primeros 3 registros
base2 %>%
head(3) %>%
knitr::kable(caption = "Primeros 3 registros de la base 2")
| 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 |
La Tabla 18 presenta la dimensión de la base filtrada, la cual está compuesta por 2,787 observaciones y 13 variables. Este tamaño de muestra resulta adecuado para realizar análisis estadísticos y estimaciones econométricas con un nivel razonable de precisión. Las variables disponibles incluyen información relevante sobre las características estructurales de las viviendas, como área construida, número de habitaciones, baños, parqueaderos, estrato socioeconómico, así como variables de localización como barrio, latitud y longitud.
Tabla 19. Primeros registros de la base filtrada de apartamentos en la zona sur
# Verificación de la variable tipo en la base filtrada
base2 %>%
count(tipo) %>%
knitr::kable(caption = "Verificación de la variable tipo en base 2")
| tipo | n |
|---|---|
| Apartamento | 2787 |
# Verificación de la variable zona en la base filtrada
base2 %>%
count(zona) %>%
knitr::kable(caption = "Verificación de la variable zona en base 2")
| zona | n |
|---|---|
| Zona Sur | 2787 |
# Tabla de contingencia en la base original
tabla_cruce_2 <- table(vivienda$tipo, vivienda$zona)
knitr::kable(
as.data.frame.matrix(tabla_cruce_2),
caption = "Tabla de contingencia tipo vs zona en la base original"
)
| Zona Centro | Zona Norte | Zona Oeste | Zona Oriente | Zona Sur | |
|---|---|---|---|---|---|
| Apartamento | 24 | 1198 | 1029 | 62 | 2787 |
| Casa | 100 | 722 | 169 | 289 | 1939 |
La Tabla 19 muestra los primeros registros de la base resultante, lo cual permite verificar la estructura de la información y confirmar que las observaciones corresponden efectivamente a apartamentos ubicados en la zona sur. En estos registros se observan diferentes niveles de precio, área construida y características internas de las viviendas, lo que evidencia la heterogeneidad existente dentro del mercado inmobiliario analizado.
Posteriormente, se presentan tablas de verificación para confirmar la validez del procedimiento de filtrado. En primer lugar, la tabla de frecuencia de la variable tipo indica que las 2,787 observaciones corresponden exclusivamente a apartamentos, lo que confirma que el filtro aplicado sobre el tipo de inmueble fue correctamente ejecutado. De manera similar, la verificación de la variable zona muestra que todas las observaciones pertenecen a Zona Sur, validando el segundo criterio del proceso de selección.
Finalmente, la tabla de contingencia construida a partir de la base original permite observar la distribución conjunta de los inmuebles según su tipo y zona dentro de toda la ciudad. En esta tabla se evidencia que la zona sur concentra un número considerable de ofertas de apartamentos en comparación con otras zonas, lo cual refuerza la pertinencia del subconjunto seleccionado para el análisis de la segunda solicitud.
Figura 11. Localización geográfica de los apartamentos filtrados en la zona sur
leaflet(base2) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud,
lat = ~latitud,
radius = 4,
popup = ~paste0(
"<b>Barrio:</b> ", barrio, "<br>",
"<b>Precio:</b> ", preciom, " millones<br>",
"<b>Área:</b> ", areaconst, " m²<br>",
"<b>Estrato:</b> ", estrato
)
)
La Figura 11 presenta la localización geográfica de los apartamentos incluidos en la base filtrada correspondiente a la zona sur de la ciudad. A partir del mapa se observa una alta concentración de ofertas inmobiliarias en los sectores del sur y suroccidente del área urbana, lo cual es consistente con la clasificación utilizada en la base de datos.
La distribución espacial de los puntos evidencia que la mayoría de las viviendas se agrupan en corredores residenciales consolidados, donde tradicionalmente se concentra la oferta de apartamentos dentro del mercado inmobiliario de la ciudad. No obstante, también se observan algunas ubicaciones que parecen extenderse hacia sectores cercanos a otras zonas urbanas.
Este comportamiento puede explicarse por varias razones. En primer lugar, la variable zona utilizada en la base de datos puede responder a criterios inmobiliarios o comerciales más que a una delimitación geográfica estricta, por lo que algunos barrios clasificados como zona sur podrían encontrarse próximos a los límites con otras zonas de la ciudad. En segundo lugar, pueden existir errores de georreferenciación asociados al registro de las coordenadas de latitud y longitud. Finalmente, también es posible que durante la captura de la información se hayan asignado clasificaciones de zona que no corresponden exactamente con la ubicación espacial de la vivienda.
Tabla 20. Estadísticos descriptivos de las variables analíticas para apartamentos en la zona sur
# Selección de variables de interés
eda_base2 <- base2 %>%
select(preciom, areaconst, estrato, banios, habitaciones, zona) %>%
na.omit()
tabla_desc2 <- eda_base2 %>%
summarise(
Precio_Min = min(preciom),
Precio_Q1 = quantile(preciom, 0.25),
Precio_Mediana = median(preciom),
Precio_Media = mean(preciom),
Precio_Q3 = quantile(preciom, 0.75),
Precio_Max = max(preciom),
Area_Min = min(areaconst),
Area_Media = mean(areaconst),
Area_Max = max(areaconst),
Estrato_Mediano = median(estrato),
Banios_Medio = mean(banios),
Habitaciones_Medio = mean(habitaciones)
)
tabla_desc2_long <- stack(tabla_desc2)
tabla_desc2_final <- data.frame(
Indicador = tabla_desc2_long$ind,
Valor = round(tabla_desc2_long$values, 2)
)
kable(
tabla_desc2_final,
caption = "Estadísticos descriptivos de apartamentos en zona sur"
)
| Indicador | Valor |
|---|---|
| Precio_Min | 75.00 |
| Precio_Q1 | 175.00 |
| Precio_Mediana | 245.00 |
| Precio_Media | 297.29 |
| Precio_Q3 | 335.00 |
| Precio_Max | 1750.00 |
| Area_Min | 40.00 |
| Area_Media | 97.47 |
| Area_Max | 932.00 |
| Estrato_Mediano | 5.00 |
| Banios_Medio | 2.49 |
| Habitaciones_Medio | 2.97 |
eda_base2 <- eda_base2 %>%
mutate(estrato = factor(estrato))
La Tabla 20 presenta los estadísticos descriptivos de las principales variables analizadas para los apartamentos ubicados en la zona sur de la ciudad. Estos indicadores permiten caracterizar de manera general la estructura del mercado inmobiliario dentro del subconjunto de datos considerado.
En términos de precios, se observa que el valor mínimo registrado es de 75 millones de pesos, mientras que el precio máximo alcanza aproximadamente 1,750 millones de pesos, lo que evidencia una amplia heterogeneidad en las características de los apartamentos disponibles en el mercado. La mediana del precio es de 245 millones, mientras que el precio promedio se sitúa alrededor de 297 millones, lo que sugiere la presencia de algunas propiedades de mayor valor que elevan el promedio respecto a la mediana.
En relación con el área construida, los apartamentos presentan superficies que van desde 40 m² hasta aproximadamente 932 m², con un promedio cercano a 97 m², lo cual indica que la mayoría de las viviendas corresponde a apartamentos de tamaño medio dentro del mercado urbano.
Respecto a las características estructurales, el estrato socioeconómico mediano corresponde al estrato 5, lo que sugiere que una parte importante de la oferta inmobiliaria en la zona sur se concentra en segmentos de nivel socioeconómico medio–alto. Por su parte, los apartamentos presentan en promedio 2.49 baños y cerca de 3 habitaciones, lo cual es consistente con configuraciones típicas de apartamentos familiares en zonas residenciales consolidadas de la ciudad.
Figura 12. Relación entre el precio del apartamento y el área construida
plot_ly(
data = eda_base2,
x = ~areaconst,
y = ~preciom,
type = "scatter",
mode = "markers",
text = ~paste(
"Área:", areaconst,
"<br>Precio:", preciom,
"<br>Estrato:", estrato,
"<br>Baños:", banios,
"<br>Habitaciones:", habitaciones
),
hoverinfo = "text"
) %>%
layout(
title = "Precio vs Área construida",
xaxis = list(title = "Área construida"),
yaxis = list(title = "Precio (millones)")
)
La Figura 12 muestra la relación entre el precio de los apartamentos y el área construida. En el gráfico de dispersión se observa una relación positiva entre ambas variables, lo que indica que, en términos generales, los apartamentos con mayor área tienden a presentar precios más elevados.
La mayor concentración de observaciones se ubica en apartamentos con áreas aproximadas entre 50 m² y 200 m², con precios que oscilan principalmente entre 150 y 600 millones de pesos. Este comportamiento sugiere que la mayor parte de la oferta inmobiliaria en la zona sur corresponde a apartamentos de tamaño medio dentro del mercado residencial.
No obstante, también se identifican algunos valores atípicos, particularmente apartamentos con áreas superiores a 400 m² y precios que pueden superar los 1,500 millones de pesos. Estas observaciones probablemente corresponden a propiedades de características exclusivas o ubicadas en sectores de mayor valorización dentro de la ciudad.
Figura 13. Distribución del precio de los apartamentos según estrato socioeconómico
plot_ly(
data = eda_base2,
x = ~as.factor(estrato),
y = ~preciom,
type = "box",
color = ~as.factor(estrato)
) %>%
layout(
title = "Distribución del precio según estrato",
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio (millones)")
)
La Figura 13 presenta la distribución del precio de los apartamentos según el estrato socioeconómico. El diagrama de cajas muestra una tendencia creciente entre el estrato y el precio de las viviendas, lo cual es consistente con la estructura del mercado inmobiliario urbano.
Se observa que los apartamentos de estrato 3 y 4 presentan los niveles de precio más bajos y una menor dispersión relativa. En contraste, los apartamentos de estrato 5 y especialmente estrato 6 exhiben precios considerablemente más altos y una mayor variabilidad. Esto puede explicarse porque en los estratos superiores suelen encontrarse propiedades con características más diversas en términos de tamaño, ubicación específica dentro del sector, acabados y amenidades.
Asimismo, en los estratos más altos se observan valores atípicos de precios muy elevados, lo que refleja la existencia de apartamentos de lujo dentro de estos segmentos del mercado. En consecuencia, el estrato socioeconómico aparece como un factor importante en la explicación de las diferencias de precio entre las viviendas.
Figura 14. Distribución del precio de los apartamentos según número de baños
plot_ly(
data = eda_base2,
x = ~as.factor(banios),
y = ~preciom,
type = "box",
color = ~as.factor(banios)
) %>%
layout(
title = "Distribución del precio según número de baños",
xaxis = list(title = "Número de baños"),
yaxis = list(title = "Precio (millones)")
)
La Figura 14 muestra la distribución del precio de los apartamentos según el número de baños. En general, se observa una relación positiva entre el número de baños y el precio de las viviendas, lo cual es consistente con la lógica del mercado inmobiliario, donde un mayor número de baños suele asociarse con apartamentos más amplios o con un mayor nivel de confort.
A medida que aumenta el número de baños, la mediana del precio tiende a incrementarse, particularmente en apartamentos con cuatro o más baños, donde se observan precios significativamente más altos. Además, la dispersión de los precios también aumenta en estas categorías, lo que sugiere que los apartamentos con más baños presentan una mayor heterogeneidad en sus características.
En algunos casos se identifican valores extremos con precios muy elevados, lo que podría estar asociado a apartamentos de gran tamaño o propiedades de lujo dentro del mercado inmobiliario.
Figura 15. Distribución del precio de los apartamentos según número de habitaciones
plot_ly(
data = eda_base2,
x = ~as.factor(habitaciones),
y = ~preciom,
type = "box",
color = ~as.factor(habitaciones)
) %>%
layout(
title = "Distribución del precio según número de habitaciones",
xaxis = list(title = "Número de habitaciones"),
yaxis = list(title = "Precio (millones)")
)
La Figura 15 presenta la distribución del precio de los apartamentos según el número de habitaciones. En términos generales, se observa una tendencia creciente en el precio a medida que aumenta el número de habitaciones, lo que indica que las viviendas con mayor capacidad habitacional suelen alcanzar valores de mercado más altos.
Las medianas del precio tienden a incrementarse especialmente a partir de cuatro habitaciones, lo cual sugiere que estos apartamentos corresponden a propiedades de mayor tamaño o con configuraciones residenciales más amplias. Sin embargo, dentro de cada categoría también se observa una dispersión considerable en los precios, lo que evidencia que el número de habitaciones no es el único factor que determina el valor de los apartamentos.
Adicionalmente, se identifican algunos valores extremos en apartamentos con mayor número de habitaciones, lo que podría estar relacionado con propiedades de gran tamaño o con características arquitectónicas particulares dentro del mercado.
Figura 16. Distribución del precio de los apartamentos según zona geográfica
eda_zona2 <- vivienda %>%
filter(tipo == "Apartamento") %>%
select(preciom, zona) %>%
na.omit()
plot_ly(
data = eda_zona2,
x = ~zona,
y = ~preciom,
type = "box",
color = ~zona
) %>%
layout(
title = "Distribución del precio según zona",
xaxis = list(title = "Zona"),
yaxis = list(title = "Precio (millones)")
)
La Figura 16 muestra la distribución del precio de los apartamentos según la zona geográfica dentro de la ciudad. El diagrama de cajas permite comparar tanto la mediana de los precios como la dispersión de los valores entre las distintas zonas urbanas.
Se observa que la zona oeste presenta los niveles de precio más elevados, con una mediana considerablemente superior a las demás zonas y una dispersión amplia de valores. Este comportamiento puede estar asociado a la presencia de sectores residenciales de alto nivel socioeconómico, donde se concentran apartamentos de mayor tamaño, mejores acabados o ubicaciones con mayor valorización inmobiliaria.
Por su parte, las zonas centro, norte y sur presentan niveles de precio intermedios, aunque también se identifican diferencias importantes dentro de cada zona, lo que refleja la heterogeneidad del mercado inmobiliario urbano. En estas zonas pueden coexistir apartamentos de distintos tamaños, antigüedad y características constructivas.
La zona oriente, en contraste, presenta los niveles de precio más bajos y una menor dispersión relativa, lo cual sugiere que la oferta inmobiliaria en este sector corresponde principalmente a apartamentos de menor valor dentro del mercado.
Tabla 21. Matriz de correlación entre las variables numéricas del modelo para apartamentos
cor_data2 <- eda_base2 %>%
select(preciom, areaconst, banios, habitaciones)
cor_matrix2 <- round(cor(cor_data2, use = "complete.obs"), 3)
kable(
cor_matrix2,
caption = "Matriz de correlación entre variables numéricas"
)
| preciom | areaconst | banios | habitaciones | |
|---|---|---|---|---|
| preciom | 1.000 | 0.758 | 0.720 | 0.332 |
| areaconst | 0.758 | 1.000 | 0.662 | 0.434 |
| banios | 0.720 | 0.662 | 1.000 | 0.515 |
| habitaciones | 0.332 | 0.434 | 0.515 | 1.000 |
plot_ly(
x = colnames(cor_matrix2),
y = rownames(cor_matrix2),
z = cor_matrix2,
type = "heatmap"
) %>%
layout(
title = "Mapa de calor de correlaciones",
xaxis = list(title = ""),
yaxis = list(title = "")
)
La Tabla 21 presenta la matriz de correlación entre las variables numéricas consideradas en el análisis del modelo: precio, área construida, número de baños y número de habitaciones.
Los resultados muestran que la variable con mayor correlación con el precio es el área construida (0.758), lo que indica una relación positiva relativamente fuerte entre el tamaño del apartamento y su valor de mercado. Este resultado es consistente con la lógica del mercado inmobiliario, donde viviendas con mayor superficie suelen tener precios más elevados.
Asimismo, se observa una correlación positiva entre el precio y el número de baños (0.720), lo que sugiere que los apartamentos con mayor número de baños tienden a corresponder a propiedades de mayor tamaño o con un nivel de confort superior. En contraste, la correlación entre el precio y el número de habitaciones (0.332) es más moderada, lo que indica que esta variable tiene una relación más débil con el valor de la vivienda en comparación con el área construida o el número de baños.
Adicionalmente, se observan correlaciones positivas entre las variables explicativas, particularmente entre área construida y número de baños (0.682), lo que refleja que apartamentos más grandes suelen incluir más servicios internos. Sin embargo, estas correlaciones no parecen ser lo suficientemente altas como para sugerir problemas severos de multicolinealidad.
Tabla 22. Cantidad de valores faltantes por variable en la base de apartamentos
na_por_variable2 <- base2 %>%
summarise(across(everything(), ~sum(is.na(.)))) %>%
tidyr::pivot_longer(
cols = everything(),
names_to = "Variable",
values_to = "Cantidad_NA"
)
kable(
na_por_variable2,
caption = "Cantidad de valores NA por variable en base2"
)
| Variable | Cantidad_NA |
|---|---|
| id | 0 |
| zona | 0 |
| piso | 622 |
| estrato | 0 |
| preciom | 0 |
| areaconst | 0 |
| parqueaderos | 406 |
| banios | 0 |
| habitaciones | 0 |
| tipo | 0 |
| barrio | 0 |
| longitud | 0 |
| latitud | 0 |
La Tabla 22 presenta la cantidad de valores faltantes para cada variable dentro de la base de datos utilizada en el análisis. En general, se observa que la mayoría de las variables relevantes para el modelo no presentan valores faltantes, lo que garantiza una adecuada calidad de la información disponible.
No obstante, se identifican valores faltantes en dos variables específicas: piso, con 622 observaciones faltantes, y parqueaderos, con 406 observaciones faltantes. En el caso de la variable piso, esta no forma parte de las variables explicativas consideradas en el modelo de regresión, por lo que su ausencia no afecta directamente la estimación del modelo.
Por otra parte, la variable parqueaderos sí constituye una variable explicativa relevante dentro del modelo, por lo que es necesario considerar un tratamiento adecuado de los valores faltantes antes de proceder con la estimación. En este contexto, se opta por imputar estos valores utilizando medidas de tendencia central, lo cual permite mantener el tamaño de la muestra y evitar la pérdida de información.
Tabla 23. Distribución del número de parqueaderos en los apartamentos
tabla_parq2 <- base2 %>%
filter(!is.na(parqueaderos)) %>%
count(parqueaderos) %>%
mutate(porcentaje = round(100 * n / sum(n),2))
kable(
tabla_parq2,
caption = "Distribución de número de parqueaderos"
)
| parqueaderos | n | porcentaje |
|---|---|---|
| 1 | 1551 | 65.14 |
| 2 | 718 | 30.16 |
| 3 | 79 | 3.32 |
| 4 | 31 | 1.30 |
| 10 | 2 | 0.08 |
La Tabla 23 presenta la distribución del número de parqueaderos en los apartamentos incluidos en la base de datos. Los resultados muestran que la mayor parte de los apartamentos cuenta con un solo parqueadero, con aproximadamente 1,551 observaciones, lo que representa la categoría más frecuente dentro del conjunto de datos.
En segundo lugar, se encuentran los apartamentos con dos parqueaderos, que también representan una proporción importante de la muestra. En contraste, los apartamentos con tres o más parqueaderos son considerablemente menos frecuentes, lo que sugiere que este tipo de características es más común en propiedades de mayor valor o ubicadas en segmentos de mercado más exclusivos.
Dado que la distribución de esta variable se concentra principalmente en uno o dos parqueaderos, resulta razonable utilizar la mediana como criterio de imputación para los valores faltantes, ya que esta medida es menos sensible a valores extremos y representa adecuadamente el comportamiento central de la variable.
Tabla 24. Medidas de tendencia central para la variable número de parqueaderos
stats_parq2 <- base2 %>%
summarise(
media = mean(parqueaderos, na.rm = TRUE),
mediana = median(parqueaderos, na.rm = TRUE)
)
kable(
stats_parq2,
caption = "Medidas de tendencia central para parqueaderos"
)
| media | mediana |
|---|---|
| 1.414532 | 1 |
mediana_parq2 <- median(base2$parqueaderos, na.rm = TRUE)
base2 <- base2 %>%
mutate(
parqueaderos = ifelse(
is.na(parqueaderos),
mediana_parq2,
parqueaderos
)
)
Tabla 25. Resumen de la base utilizada para la estimación del modelo de regresión
modelo_base2 <- base2 %>%
select(preciom, areaconst, estrato, habitaciones, parqueaderos, banios) %>%
na.omit() %>%
mutate(estrato = factor(estrato))
kable(
data.frame(
Concepto = c("Número de observaciones","Número de variables"),
Valor = dim(modelo_base2)
),
caption = "Resumen de la base empleada en la regresión"
)
| Concepto | Valor |
|---|---|
| Número de observaciones | 2787 |
| Número de variables | 6 |
La Tabla 25 presenta un resumen de la base de datos utilizada para la estimación del modelo de regresión lineal múltiple. El modelo fue estimado utilizando 2,787 observaciones y 6 variables, lo que proporciona un tamaño de muestra suficientemente amplio para realizar inferencias estadísticas robustas.
Las variables consideradas en la estimación incluyen el área construida, el estrato socioeconómico, el número de habitaciones, el número de parqueaderos y el número de baños, las cuales representan características estructurales relevantes para explicar el valor de mercado de los apartamentos. Este conjunto de variables permite capturar distintos aspectos del inmueble que influyen en la formación del precio dentro del mercado inmobiliario.
Tabla 26. Coeficientes estimados del modelo de regresión lineal múltiple para apartamentos
modelo_lm2 <- lm(
preciom ~ areaconst + factor(estrato) + habitaciones + parqueaderos + banios,
data = modelo_base2
)
summary(modelo_lm2)
##
## Call:
## lm(formula = preciom ~ areaconst + factor(estrato) + habitaciones +
## parqueaderos + banios, data = modelo_base2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1096.93 -35.43 -2.08 34.61 894.26
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -43.32991 10.13354 -4.276 1.97e-05 ***
## areaconst 1.33359 0.04576 29.142 < 2e-16 ***
## factor(estrato)4 28.96511 6.86300 4.220 2.52e-05 ***
## factor(estrato)5 54.59210 7.08763 7.702 1.84e-14 ***
## factor(estrato)6 209.07531 8.88859 23.522 < 2e-16 ***
## habitaciones -11.54029 3.16593 -3.645 0.000272 ***
## parqueaderos 61.62033 3.50854 17.563 < 2e-16 ***
## banios 38.25237 2.85475 13.400 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 87.6 on 2779 degrees of freedom
## Multiple R-squared: 0.7914, Adjusted R-squared: 0.7909
## F-statistic: 1506 on 7 and 2779 DF, p-value: < 2.2e-16
tabla_coef2 <- broom::tidy(modelo_lm2) %>%
mutate(across(where(is.numeric), ~round(.,4)))
kable(
tabla_coef2,
caption = "Coeficientes estimados del modelo de regresión"
)
| term | estimate | std.error | statistic | p.value |
|---|---|---|---|---|
| (Intercept) | -43.3299 | 10.1335 | -4.2759 | 0e+00 |
| areaconst | 1.3336 | 0.0458 | 29.1424 | 0e+00 |
| factor(estrato)4 | 28.9651 | 6.8630 | 4.2205 | 0e+00 |
| factor(estrato)5 | 54.5921 | 7.0876 | 7.7024 | 0e+00 |
| factor(estrato)6 | 209.0753 | 8.8886 | 23.5218 | 0e+00 |
| habitaciones | -11.5403 | 3.1659 | -3.6452 | 3e-04 |
| parqueaderos | 61.6203 | 3.5085 | 17.5630 | 0e+00 |
| banios | 38.2524 | 2.8547 | 13.3996 | 0e+00 |
La Tabla 26 presenta los coeficientes estimados del modelo de regresión lineal múltiple que relaciona el precio de los apartamentos con sus principales características estructurales.
Los resultados muestran que el área construida tiene un efecto positivo y estadísticamente significativo sobre el precio de los apartamentos. En particular, el coeficiente estimado indica que cada metro cuadrado adicional de área construida incrementa el precio del apartamento en aproximadamente 1.33 millones de pesos, manteniendo constantes las demás variables del modelo.
En relación con el estrato socioeconómico, los coeficientes asociados a los estratos 4, 5 y 6 son positivos y estadísticamente significativos, lo que indica que los apartamentos ubicados en estratos más altos tienden a presentar precios superiores en comparación con el estrato de referencia. En particular, el incremento es especialmente notable en el caso del estrato 6, donde el efecto estimado supera los 200 millones de pesos, lo que refleja la fuerte influencia del nivel socioeconómico en la valorización inmobiliaria.
Por su parte, el número de parqueaderos también presenta un efecto positivo y significativo, indicando que disponer de un parqueadero adicional incrementa el valor del apartamento en aproximadamente 61 millones de pesos. De manera similar, el número de baños muestra un impacto positivo sobre el precio, con un incremento aproximado de 38 millones de pesos por baño adicional, lo que refleja la importancia de las comodidades internas en la valoración de la vivienda.
En contraste, el coeficiente asociado al número de habitaciones resulta negativo y estadísticamente significativo. Este resultado puede interpretarse considerando que, para un mismo nivel de área construida, un mayor número de habitaciones puede implicar espacios más reducidos o una distribución interna diferente del inmueble, lo cual podría afectar la percepción de valor dentro del mercado.
Tabla 27. Intervalos de confianza al 95% de los coeficientes del modelo
tabla_ic2 <- confint(modelo_lm2) %>%
as.data.frame() %>%
tibble::rownames_to_column("Variable") %>%
rename(IC_Inf = `2.5 %`, IC_Sup = `97.5 %`) %>%
mutate(across(where(is.numeric), ~round(.,4)))
kable(
tabla_ic2,
caption = "Intervalos de confianza al 95% de los coeficientes"
)
| Variable | IC_Inf | IC_Sup |
|---|---|---|
| (Intercept) | -63.1999 | -23.4599 |
| areaconst | 1.2439 | 1.4233 |
| factor(estrato)4 | 15.5080 | 42.4222 |
| factor(estrato)5 | 40.6945 | 68.4897 |
| factor(estrato)6 | 191.6464 | 226.5042 |
| habitaciones | -17.7481 | -5.3325 |
| parqueaderos | 54.7407 | 68.4999 |
| banios | 32.6547 | 43.8500 |
La Tabla 27 presenta los intervalos de confianza al 95% para los coeficientes estimados del modelo de regresión. Estos intervalos permiten evaluar el rango dentro del cual es probable que se encuentre el verdadero valor del parámetro poblacional.
En todos los casos, los intervalos de confianza de las variables explicativas no incluyen el valor cero, lo que confirma la significancia estadística de los coeficientes estimados. Esto refuerza la evidencia de que las variables consideradas en el modelo tienen un efecto real sobre el precio de los apartamentos.
Asimismo, los intervalos relativamente estrechos observados en algunas variables, como el área construida, sugieren una estimación precisa del efecto de estas variables sobre el precio de la vivienda.
Tabla 28. Medidas de ajuste del modelo de regresión para apartamentos
# Medidas de ajuste
tabla_ajuste2 <- data.frame(
Medida = c(
"R2",
"R2 ajustado",
"Error estándar residual",
"Estadístico F",
"p-valor modelo"
),
Valor = c(
summary(modelo_lm2)$r.squared,
summary(modelo_lm2)$adj.r.squared,
summary(modelo_lm2)$sigma,
summary(modelo_lm2)$fstatistic[1],
pf(
summary(modelo_lm2)$fstatistic[1],
summary(modelo_lm2)$fstatistic[2],
summary(modelo_lm2)$fstatistic[3],
lower.tail = FALSE
)
)
) %>%
mutate(Valor = round(Valor,4))
kable(
tabla_ajuste2,
caption = "Medidas de ajuste del modelo"
)
| Medida | Valor |
|---|---|
| R2 | 0.7914 |
| R2 ajustado | 0.7909 |
| Error estándar residual | 87.5958 |
| Estadístico F | 1506.1979 |
| p-valor modelo | 0.0000 |
La Tabla 28 presenta las principales medidas de ajuste del modelo de regresión. El coeficiente de determinación R² es aproximadamente 0.7914, lo que indica que el modelo logra explicar cerca del 79% de la variabilidad observada en el precio de los apartamentos a partir de las variables incluidas en la estimación.
El R² ajustado, que tiene en cuenta el número de variables explicativas del modelo, presenta un valor muy similar (0.7909), lo que sugiere que las variables incorporadas aportan información relevante para explicar el comportamiento del precio.
Adicionalmente, el estadístico F presenta un valor elevado y un p-valor prácticamente igual a cero, lo que indica que el modelo es globalmente significativo desde el punto de vista estadístico. En otras palabras, las variables explicativas consideradas en conjunto contribuyen de manera significativa a explicar el precio de los apartamentos.
En términos generales, estos resultados indican que el modelo presenta un buen nivel de ajuste, aunque todavía podrían explorarse mejoras mediante la inclusión de otras variables relevantes del mercado inmobiliario, como características del barrio, antigüedad del inmueble o variables adicionales de localización.
Figura 17. Gráficos de diagnóstico del modelo de regresión lineal para apartamentos
par(mfrow = c(2,2))
plot(modelo_lm2)
La Figura 17 presenta los gráficos de diagnóstico utilizados para evaluar visualmente los principales supuestos del modelo de regresión lineal.
En el gráfico Residuals vs Fitted se observa que los residuos se distribuyen alrededor de la línea horizontal cercana a cero, lo que indica que el modelo captura adecuadamente la relación promedio entre las variables. Sin embargo, también se aprecia una ligera dispersión creciente de los residuos a medida que aumentan los valores ajustados, lo cual puede sugerir la presencia de cierta heterocedasticidad.
El Q-Q plot permite comparar la distribución de los residuos con una distribución normal teórica. En este gráfico se observa que la mayoría de los puntos siguen razonablemente la línea de referencia en la zona central, aunque se presentan desviaciones en los extremos, lo que sugiere que algunos residuos extremos se alejan del comportamiento normal.
El gráfico Scale-Location refuerza la evidencia de que la dispersión de los residuos tiende a aumentar para valores más altos del precio estimado, lo cual es consistente con la posible presencia de heterocedasticidad en el modelo.
Finalmente, el gráfico Residuals vs Leverage permite identificar observaciones con alta influencia potencial sobre la estimación del modelo. Se observan algunos puntos con mayor leverage que podrían tener una influencia relativamente alta en los coeficientes estimados, lo que motiva un análisis adicional mediante la distancia de Cook.
Tabla 29. Factor de inflación de la varianza (VIF) de las variables explicativas
# Multicolinealidad
vif_valores2 <- car::vif(modelo_lm2)
tabla_vif2 <- as.data.frame(vif_valores2) %>%
tibble::rownames_to_column("Variable") %>%
mutate(across(where(is.numeric), ~round(.,4)))
kable(
tabla_vif2,
caption = "Indicadores de multicolinealidad del modelo"
)
| Variable | GVIF | Df | GVIF^(1/(2*Df)) |
|---|---|---|---|
| areaconst | 2.1010 | 1 | 1.4495 |
| factor(estrato) | 1.8158 | 3 | 1.1045 |
| habitaciones | 1.4561 | 1 | 1.2067 |
| parqueaderos | 1.8056 | 1 | 1.3437 |
| banios | 2.5834 | 1 | 1.6073 |
La Tabla 29 presenta los valores del Factor de Inflación de la Varianza (VIF) para las variables explicativas del modelo. Los resultados muestran que todos los valores se encuentran claramente por debajo de los umbrales comúnmente utilizados para identificar problemas de multicolinealidad.
En particular, los valores de GVIF^(1/(2*Df)) se ubican aproximadamente entre 1.10 y 1.61, lo que indica que las variables explicativas no presentan una relación lineal excesiva entre sí. Esto sugiere que cada variable aporta información independiente al modelo y que las estimaciones de los coeficientes no están afectadas de manera significativa por problemas de colinealidad.
En consecuencia, puede concluirse que no existen problemas importantes de multicolinealidad en el modelo, lo que contribuye a la estabilidad y confiabilidad de las estimaciones obtenidas.
Figura 18. Evaluación de la normalidad de los residuos mediante prueba de Shapiro-Wilk
residuos2 <- residuals(modelo_lm2)
shapiro.test(residuos2)
##
## Shapiro-Wilk normality test
##
## data: residuos2
## W = 0.7744, p-value < 2.2e-16
qqnorm(residuos2)
qqline(residuos2, col = "red")
La Figura 18 presenta la evaluación de la normalidad de los residuos mediante el gráfico Q-Q y la prueba de Shapiro-Wilk. Los resultados de la prueba indican un p-valor menor a 0.05, lo que implica rechazar formalmente la hipótesis nula de normalidad de los residuos.
Sin embargo, es importante considerar que en muestras grandes, como la utilizada en este estudio, pequeñas desviaciones respecto a la normalidad pueden resultar estadísticamente significativas. El gráfico Q-Q muestra que la mayor parte de los residuos sigue razonablemente la línea de referencia en la región central, aunque se observan desviaciones en los extremos de la distribución.
En términos prácticos, estas desviaciones suelen estar asociadas a la presencia de algunos valores atípicos o propiedades con precios considerablemente diferentes al promedio del mercado inmobiliario.
Tabla 30. Prueba de Breusch-Pagan para evaluar homoscedasticidad
library(lmtest)
bptest(modelo_lm2)
##
## studentized Breusch-Pagan test
##
## data: modelo_lm2
## BP = 818.93, df = 7, p-value < 2.2e-16
La Tabla 30 presenta los resultados de la prueba de Breusch-Pagan, utilizada para evaluar el supuesto de homoscedasticidad del modelo. El resultado muestra un p-valor menor a 0.05, lo que indica evidencia estadística de heterocedasticidad en los residuos.
Este resultado sugiere que la varianza de los residuos no es completamente constante a lo largo de los valores estimados del modelo. En el contexto del mercado inmobiliario, este comportamiento es relativamente común, ya que las propiedades de mayor valor tienden a presentar mayor variabilidad en sus precios.
Aunque en este ejercicio no es necesario corregir el problema, en aplicaciones prácticas podrían considerarse alternativas como el uso de errores estándar robustos, transformaciones de variables o modelos econométricos que permitan manejar este tipo de comportamiento en la varianza.
Tabla 31. Prueba de Durbin-Watson para evaluar independencia de errores
library(lmtest)
dwtest(modelo_lm2)
##
## Durbin-Watson test
##
## data: modelo_lm2
## DW = 1.7121, p-value = 1.061e-14
## alternative hypothesis: true autocorrelation is greater than 0
La Tabla 31 presenta los resultados de la prueba de Durbin-Watson, utilizada para evaluar la presencia de autocorrelación en los residuos del modelo. El valor obtenido del estadístico es aproximadamente 1.71, acompañado de un p-valor muy pequeño.
En general, valores del estadístico cercanos a 2 sugieren ausencia de autocorrelación significativa. En este caso, aunque el resultado estadístico sugiere cierta evidencia de correlación positiva entre los residuos, este tipo de problema suele ser más relevante en datos de series de tiempo que en datos de corte transversal como los utilizados en este análisis.
Por lo tanto, la posible autocorrelación observada no representa un problema crítico para la interpretación del modelo en este contexto.
Figura 19. Distancia de Cook para identificar observaciones influyentes
cooksd2 <- cooks.distance(modelo_lm2)
plot(
cooksd2,
type="h",
main="Distancia de Cook",
ylab="Cook's distance"
)
abline(h = 4/length(cooksd2), col="red")
La Figura 19 presenta la distancia de Cook, utilizada para identificar observaciones potencialmente influyentes en la estimación del modelo. En el gráfico se observan algunas observaciones que superan el umbral de referencia, lo que indica que podrían tener una influencia relativamente alta en los coeficientes estimados.
Estas observaciones probablemente corresponden a apartamentos con características poco comunes dentro del mercado, como propiedades de gran tamaño o con precios significativamente más altos que el promedio.
No obstante, la mayoría de las observaciones se encuentra por debajo del umbral de referencia, lo que sugiere que el modelo no está dominado por un número reducido de observaciones extremas.
Tabla 32. Características evaluadas para la predicción del apartamento solicitado
nueva_vivienda2 <- data.frame(
estrato = factor(c(5,6), levels = levels(modelo_base2$estrato)),
areaconst = c(300,300),
habitaciones = c(5,5),
parqueaderos = c(3,3),
banios = c(3,3)
)
tabla_caso_v2 <- nueva_vivienda2 %>%
mutate(Credito_Maximo = 850)
kable(
tabla_caso_v2,
caption = "Características evaluadas para la vivienda 2",
col.names = c("Estrato","Área","Habitaciones","Parqueaderos","Baños","Crédito máximo")
)
| Estrato | Área | Habitaciones | Parqueaderos | Baños | Crédito máximo |
|---|---|---|---|---|---|
| 5 | 300 | 5 | 3 | 3 | 850 |
| 6 | 300 | 5 | 3 | 3 | 850 |
La Tabla 32 presenta las características del apartamento considerado en la segunda solicitud del cliente. La vivienda analizada corresponde a un apartamento ubicado en la zona sur, con un área construida de 300 m², cinco habitaciones, tres baños y tres parqueaderos. Además, el cliente dispone de un crédito preaprobado máximo de 850 millones de pesos.
Debido a que el estrato de la vivienda puede ser 5 o 6, se evaluaron dos escenarios posibles dentro del modelo de regresión con el fin de estimar el precio esperado bajo cada una de estas condiciones socioeconómicas.
Tabla 33. Resultados de predicción del precio para el apartamento solicitado
pred_conf2 <- predict(
modelo_lm2,
newdata = nueva_vivienda2,
interval = "confidence",
level = 0.95
)
pred_pred2 <- predict(
modelo_lm2,
newdata = nueva_vivienda2,
interval = "prediction",
level = 0.95
)
tabla_resultado_v2 <- nueva_vivienda2 %>%
mutate(
Precio_Estimado = round(pred_conf2[, "fit"],2),
IC_95 = paste0("[", round(pred_conf2[, "lwr"],2)," ; ", round(pred_conf2[, "upr"],2),"]"),
IP_95 = paste0("[", round(pred_pred2[, "lwr"],2)," ; ", round(pred_pred2[, "upr"],2),"]"),
Viable = ifelse(round(pred_conf2[, "fit"],2) <= 850,"Sí","No")
) %>%
select(estrato, Precio_Estimado, IC_95, IP_95, Viable)
kable(
tabla_resultado_v2,
caption = "Resultados de predicción para la vivienda 2",
col.names = c("Estrato","Precio estimado","IC 95%","IP 95%","Viable")
)
| Estrato | Precio estimado | IC 95% | IP 95% | Viable |
|---|---|---|---|---|
| 5 | 653.26 | [633.69 ; 672.82] | [480.39 ; 826.13] | Sí |
| 6 | 807.74 | [787.95 ; 827.53] | [634.84 ; 980.64] | Sí |
La Tabla 33 presenta los resultados de la predicción del precio para el apartamento solicitado según los dos escenarios evaluados. En el caso de un apartamento de estrato 5, el modelo estima un precio aproximado de 653 millones de pesos, con un intervalo de confianza que se ubica aproximadamente entre 634 y 673 millones de pesos.
Por su parte, si el apartamento corresponde a estrato 6, el precio estimado aumenta hasta aproximadamente 808 millones de pesos, lo que refleja el impacto significativo del estrato socioeconómico en el valor de mercado de la vivienda.
En ambos escenarios, el precio estimado se encuentra por debajo del límite del crédito preaprobado de 850 millones de pesos, lo que sugiere que la vivienda solicitada podría ser financieramente viable para el cliente dentro de las condiciones del modelo estimado.
base2_pred <- base2 %>%
mutate(estrato = factor(estrato, levels = levels(modelo_base2$estrato))) %>%
mutate(
precio_pred = predict(modelo_lm2, newdata = .)
)
ofertas_v2 <- base2_pred %>%
filter(
preciom <= 850,
precio_pred <= 850,
estrato %in% c(5,6),
habitaciones >= 4,
banios >= 3,
parqueaderos >= 2
)
Tabla 34. Ofertas potenciales de apartamentos para la solicitud 2 según el modelo
ofertas_top5_v2 <- ofertas_v2 %>%
mutate(
dif_area = abs(areaconst - 300)
) %>%
arrange(dif_area, precio_pred) %>%
slice(1:5)
kable(
ofertas_top5_v2 %>%
select(
barrio,
estrato,
preciom,
precio_pred,
areaconst,
habitaciones,
banios,
parqueaderos
),
caption = "Ofertas potenciales para la vivienda 2 según el modelo"
)
| barrio | estrato | preciom | precio_pred | areaconst | habitaciones | banios | parqueaderos |
|---|---|---|---|---|---|---|---|
| seminario | 5 | 670 | 718.2214 | 300.00 | 6 | 5 | 3 |
| cuarto de legua | 5 | 410 | 635.4948 | 295.55 | 4 | 4 | 2 |
| cuarto de legua | 5 | 520 | 668.1011 | 320.00 | 4 | 4 | 2 |
| ciudadela pasoancho | 5 | 650 | 634.8015 | 275.00 | 5 | 5 | 2 |
| capri | 5 | 350 | 624.7894 | 270.00 | 4 | 3 | 3 |
La Tabla 34 presenta las ofertas potenciales de apartamentos identificadas a partir de las predicciones del modelo de regresión y de las condiciones establecidas en la segunda solicitud del cliente. Para la selección de estas viviendas se consideraron simultáneamente las restricciones del crédito preaprobado, las características estructurales del inmueble y la proximidad del área construida respecto al valor solicitado de 300 m².
Los resultados muestran que las viviendas sugeridas se ubican principalmente en barrios como Seminario, Cuarto de Legua, Ciudadela Pasoancho y Capri, sectores reconocidos dentro de la zona sur de la ciudad por su carácter residencial y su cercanía a servicios urbanos, corredores viales y equipamientos educativos.
En términos de precios, todas las viviendas seleccionadas presentan valores de mercado inferiores al límite de 850 millones de pesos, cumpliendo así con la restricción financiera establecida por el cliente. Adicionalmente, los precios estimados por el modelo se encuentran dentro de rangos consistentes con las características de cada inmueble, lo que sugiere que las propiedades identificadas representan alternativas razonables dentro del mercado inmobiliario analizado.
En cuanto a las características físicas de las viviendas, se observa que los apartamentos seleccionados presentan áreas construidas cercanas al valor solicitado, así como configuraciones de cuatro o más habitaciones, múltiples baños y presencia de parqueaderos, lo que los convierte en opciones potencialmente adecuadas para las necesidades del cliente.
Figura 20. Localización geográfica de los apartamentos sugeridos para la solicitud 2
leaflet(ofertas_top5_v2) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud,
lat = ~latitud,
radius = 7,
color = "blue",
popup = ~paste0(
"<b>Barrio:</b> ", barrio,
"<br><b>Estrato:</b> ", estrato,
"<br><b>Precio mercado:</b> ", preciom, " millones",
"<br><b>Precio estimado:</b> ", round(precio_pred,2), " millones",
"<br><b>Área:</b> ", areaconst,
"<br><b>Habitaciones:</b> ", habitaciones,
"<br><b>Baños:</b> ", banios,
"<br><b>Parqueaderos:</b> ", parqueaderos
)
)
La Figura 20 presenta la localización geográfica de las cinco viviendas sugeridas dentro de la zona sur de la ciudad. La visualización permite identificar la distribución espacial de las ofertas seleccionadas y evaluar su cercanía a distintos sectores urbanos.
Se observa que las viviendas se encuentran concentradas en sectores residenciales consolidados del sur de la ciudad, particularmente en áreas cercanas a corredores urbanos importantes y zonas con alta disponibilidad de servicios, comercio y equipamientos urbanos. Esta localización resulta consistente con la presencia de apartamentos de estratos medio–alto y alto, que suelen caracterizar el mercado inmobiliario de estas zonas.
La representación espacial de las viviendas facilita además la comparación entre las distintas alternativas disponibles, permitiendo identificar posibles ventajas en términos de ubicación, accesibilidad o cercanía a puntos de interés dentro de la ciudad.
El presente análisis permitió estudiar el comportamiento del mercado inmobiliario de la ciudad a partir de información de ofertas de vivienda y mediante la aplicación de técnicas de análisis exploratorio de datos y modelos de regresión lineal múltiple. En particular, se analizaron dos solicitudes de vivienda con diferentes características estructurales y restricciones presupuestales.
En primer lugar, el análisis exploratorio de datos evidenció que variables como el área construida, el estrato socioeconómico, el número de baños y el número de parqueaderos presentan relaciones positivas con el precio de las viviendas. Estos resultados son consistentes con la lógica del mercado inmobiliario, donde propiedades con mayor tamaño, mejores características internas y ubicadas en sectores socioeconómicos más altos tienden a alcanzar mayores valores de mercado.
La matriz de correlación mostró que el área construida es la variable con mayor asociación con el precio, seguida del número de baños, lo cual respalda su inclusión dentro del modelo de regresión. Asimismo, el análisis descriptivo permitió identificar una amplia heterogeneidad en el mercado inmobiliario, tanto en términos de precios como en características físicas de las viviendas.
Posteriormente, se estimó un modelo de regresión lineal múltiple para explicar el precio de los apartamentos en función de sus características estructurales. Los resultados mostraron que la mayoría de las variables incluidas en el modelo son estadísticamente significativas, destacándose especialmente el efecto del área construida, el estrato socioeconómico y el número de parqueaderos. El modelo presentó un coeficiente de determinación cercano al 79%, lo que indica que una proporción importante de la variabilidad del precio puede explicarse mediante las variables consideradas.
En cuanto a la validación de supuestos, el análisis mostró que no existen problemas relevantes de multicolinealidad entre las variables explicativas. Sin embargo, se identificó evidencia de heterocedasticidad y desviaciones de normalidad en los residuos, situaciones relativamente comunes en modelos aplicados a datos de mercado inmobiliario. En aplicaciones más avanzadas, estos aspectos podrían abordarse mediante el uso de errores estándar robustos o transformaciones en las variables.
A partir del modelo estimado se realizaron predicciones para las características de la segunda solicitud, correspondiente a un apartamento de 300 m², cinco habitaciones, tres baños y tres parqueaderos, ubicado en estrato 5 o 6. Los resultados indicaron precios estimados cercanos a 653 millones para estrato 5 y aproximadamente 808 millones para estrato 6, ambos dentro del límite del crédito preaprobado de 850 millones de pesos, lo que sugiere que la solicitud es financieramente viable dentro del mercado analizado.
Finalmente, utilizando las predicciones del modelo y las restricciones establecidas por el cliente, se identificaron cinco ofertas potenciales de vivienda ubicadas en barrios de la zona sur como Seminario, Cuarto de Legua, Ciudadela Pasoancho y Capri. Estas viviendas cumplen con las condiciones estructurales y financieras definidas en la solicitud, constituyendo alternativas razonables dentro del mercado inmobiliario disponible.