María, propietaria de la agencia inmobiliaria C&A (Casas y Apartamentos) en Cali, ha recibido una solicitud de una compañía internacional para la compra de dos viviendas. Se requiere realizar un análisis estadístico para determinar los precios de mercado y sugerir opciones adecuadas.
El presente informe detalla:
Un análisis exploratorio de datos para evaluar los factores que influyen en el precio de la vivienda.
La estimación de modelos de regresión lineal múltiple para predecir los precios de las viviendas solicitadas.
La validación de supuestos del modelo para garantizar su confiabilidad.
La recomendación de ofertas adecuadas basadas en el análisis realizado.
# Instalación de paquetes (solo si es necesario)
if (!require("devtools")) install.packages("devtools")
devtools::install_github("centromagis/paqueteMODELOS", force = TRUE)
## cli (3.6.3 -> 3.6.4) [CRAN]
## pander (0.6.5 -> 0.6.6) [CRAN]
## curl (6.2.0 -> 6.2.1) [CRAN]
## xfun (0.50 -> 0.51 ) [CRAN]
## package 'cli' successfully unpacked and MD5 sums checked
## package 'pander' successfully unpacked and MD5 sums checked
## package 'curl' successfully unpacked and MD5 sums checked
## package 'xfun' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Setoro\AppData\Local\Temp\RtmpIZrSEZ\downloaded_packages
## ── R CMD build ─────────────────────────────────────────────────────────────────
## checking for file 'C:\Users\Setoro\AppData\Local\Temp\RtmpIZrSEZ\remotes442076ec1240\Centromagis-paqueteMODELOS-3b06257/DESCRIPTION' ... ✔ checking for file 'C:\Users\Setoro\AppData\Local\Temp\RtmpIZrSEZ\remotes442076ec1240\Centromagis-paqueteMODELOS-3b06257/DESCRIPTION'
## ─ preparing 'paqueteMODELOS': (5.8s)
## checking DESCRIPTION meta-information ... ✔ checking DESCRIPTION meta-information
## ─ checking for LF line-endings in source and make files and shell scripts
## ─ checking for empty or unneeded directories
## ─ building 'paqueteMODELOS_0.1.0.tar.gz'
##
##
# Carga de librerías
library(paqueteMODELOS)
library(tidyverse)
library(ggplot2)
library(plotly)
library(sf)
library(leaflet)
library(GGally)
library(car)
# Cargar los datos
data("vivienda")
# Vista general de la base de datos
str(vivienda)
## spc_tbl_ [8,322 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ id : num [1:8322] 1147 1169 1350 5992 1212 ...
## $ zona : chr [1:8322] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : chr [1:8322] NA NA NA "02" ...
## $ estrato : num [1:8322] 3 3 3 4 5 5 4 5 5 5 ...
## $ preciom : num [1:8322] 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num [1:8322] 70 120 220 280 90 87 52 137 150 380 ...
## $ parqueaderos: num [1:8322] 1 1 2 3 1 1 2 2 2 2 ...
## $ banios : num [1:8322] 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: num [1:8322] 6 3 4 3 3 3 3 4 6 3 ...
## $ tipo : chr [1:8322] "Casa" "Casa" "Casa" "Casa" ...
## $ barrio : chr [1:8322] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
## $ longitud : num [1:8322] -76.5 -76.5 -76.5 -76.5 -76.5 ...
## $ latitud : num [1:8322] 3.43 3.43 3.44 3.44 3.46 ...
## - attr(*, "spec")=
## .. cols(
## .. id = col_double(),
## .. zona = col_character(),
## .. piso = col_character(),
## .. estrato = col_double(),
## .. preciom = col_double(),
## .. areaconst = col_double(),
## .. parqueaderos = col_double(),
## .. banios = col_double(),
## .. habitaciones = col_double(),
## .. tipo = col_character(),
## .. barrio = col_character(),
## .. longitud = col_double(),
## .. latitud = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
Se analiza la relación entre el precio de la vivienda y variables como área construida, estrato, número de baños, número de habitaciones y parqueaderos
# Filtrar casas en la zona norte
casas_norte <- vivienda %>%
filter(tipo == "Casa" & zona == "Zona Norte")
# Mapa de ubicación
leaflet(casas_norte) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud, popup = ~paste("Precio:", preciom, "millones"))
# Matriz de correlación
cor_matrix <- cor(casas_norte %>% select(preciom, areaconst, estrato, banios, habitaciones), use="complete.obs")
print(cor_matrix)
## preciom areaconst estrato banios habitaciones
## preciom 1.0000000 0.7313480 0.6123503 0.5233357 0.3227096
## areaconst 0.7313480 1.0000000 0.4573818 0.4628152 0.3753323
## estrato 0.6123503 0.4573818 1.0000000 0.4083039 0.1073141
## banios 0.5233357 0.4628152 0.4083039 1.0000000 0.5755314
## habitaciones 0.3227096 0.3753323 0.1073141 0.5755314 1.0000000
# Gráfico interactivo de dispersión
ggpairs(casas_norte, columns = c("preciom", "areaconst", "estrato", "banios", "habitaciones"))
# Filtrar apartamentos en la zona sur
aptos_sur <- vivienda %>%
filter(tipo == "Apartamento" & zona == "Zona Sur")
# Visualizar los primeros registros
head(aptos_sur, 3)
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 5098 Zona S… 05 4 290 96 1 2 3
## 2 698 Zona S… 02 3 78 40 1 1 2
## 3 8199 Zona S… <NA> 6 875 194 2 5 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
# Mapa de ubicación de los apartamentos en la zona sur
leaflet(aptos_sur) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud,
popup = ~paste("Precio:", preciom, "millones"))
# Matriz de correlación
cor_matrix_aptos <- cor(aptos_sur %>% select(preciom, areaconst, estrato, banios, habitaciones), use="complete.obs")
print(cor_matrix_aptos)
## preciom areaconst estrato banios habitaciones
## preciom 1.0000000 0.7579955 0.6727067 0.7196705 0.3317538
## areaconst 0.7579955 1.0000000 0.4815593 0.6618179 0.4339608
## estrato 0.6727067 0.4815593 1.0000000 0.5686171 0.2125953
## banios 0.7196705 0.6618179 0.5686171 1.0000000 0.5149227
## habitaciones 0.3317538 0.4339608 0.2125953 0.5149227 1.0000000
# Gráfico interactivo de dispersión
ggpairs(aptos_sur, columns = c("preciom", "areaconst", "estrato", "banios", "habitaciones"))
Se estima un modelo de regresión lineal múltiple para predecir el precio de las viviendas en función de variables clave.
# Modelo de regresión
modelo_casas <- lm(preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos, data = casas_norte)
# Resumen del modelo
summary(modelo_casas)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones +
## parqueaderos, data = casas_norte)
##
## Residuals:
## Min 1Q Median 3Q Max
## -784.29 -77.56 -16.03 47.67 978.61
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -238.17090 44.40551 -5.364 1.34e-07 ***
## areaconst 0.67673 0.05281 12.814 < 2e-16 ***
## estrato 80.63495 9.82632 8.206 2.70e-15 ***
## banios 18.89938 7.48800 2.524 0.012 *
## habitaciones 7.64511 5.65873 1.351 0.177
## parqueaderos 24.00598 5.86889 4.090 5.14e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 155.1 on 429 degrees of freedom
## (287 observations deleted due to missingness)
## Multiple R-squared: 0.6041, Adjusted R-squared: 0.5995
## F-statistic: 130.9 on 5 and 429 DF, p-value: < 2.2e-16
El modelo de regresión lineal múltiple estima el precio de las casas en la zona norte con base en área construida, estrato, número de baños, número de habitaciones y número de parqueaderos. A continuación, interpreto los resultados clave:
Cada coeficiente indica cuánto cambia el precio de la vivienda por unidad adicional de la variable correspondiente, manteniendo las demás constantes.
Área Construida (areaconst):
Coeficiente: 0.6767
Interpretación: Por cada metro cuadrado adicional de construcción, el precio de la vivienda aumenta en 0.68 millones de pesos (680 mil pesos).
P-valor: <0.001 → Es estadísticamente significativo.
Estrato (estrato):
Coeficiente: 80.63
Interpretación: Subir de un estrato al siguiente se asocia con un aumento promedio de 80.6 millones de pesos en el precio de la vivienda.
P-valor: <0.001 → Es estadísticamente significativo.
Número de Baños (banios):
Coeficiente: 18.89
Interpretación: Cada baño adicional incrementa el precio de la vivienda en 18.9 millones de pesos.
P-valor: 0.012 → Es estadísticamente significativo.
Número de Habitaciones
(habitaciones):
Coeficiente: 7.65
Interpretación: Cada habitación adicional incrementa el precio de la vivienda en 7.6 millones de pesos, pero con un P-valor de 0.177, lo que indica que no es estadísticamente significativo.
Esto sugiere que el número de habitaciones no es un predictor fuerte del precio, posiblemente porque ya está correlacionado con el área construida.
Número de Parqueaderos
(parqueaderos):
Coeficiente: 24.01
Interpretación: Cada parqueadero adicional incrementa el precio de la vivienda en 24 millones de pesos.
P-valor: <0.001 → Es estadísticamente significativo.
R² = 0.604
Interpretación: El modelo explica 60.4% de la variabilidad en los precios de las viviendas, lo que indica un ajuste moderado.
Posible mejora: Incluir más variables como la antigüedad de la vivienda, calidad de materiales o ubicación exacta del barrio.
Para garantizar la validez de los modelos de regresión, se revisan los siguientes supuestos:
Linealidad: Se verifica la relación lineal entre las variables.
Normalidad de los residuos: Se analiza si los residuos siguen una distribución normal.
Homoscedasticidad: Se evalúa si la varianza de los residuos es constante.
Independencia de los residuos: Se revisa si los errores están correlacionados.
# Validación de supuestos para Casas
par(mfrow = c(2, 2))
plot(modelo_casas)
Residuos vs. Valores Ajustados (Linealidad y Homoscedasticidad)
Observación: Se observa cierta dispersión en los residuos, pero sin un patrón curvo fuerte, lo que sugiere que el supuesto de linealidad es razonablemente válido.
Problema: Hay indicios de heterocedasticidad (patrón más disperso en algunos valores).
Gráfico Q-Q (Normalidad de los residuos)
Observación: Los residuos no siguen perfectamente la línea diagonal, especialmente en los extremos, lo que sugiere una distribución no completamente normal.
Posible solución: Aplicar una transformación
logarítmica al precio (log(preciom)) para mejorar la
normalidad.
Escala-Localización (Homoscedasticidad)
Observación: Se observa un patrón disperso en la varianza de los residuos.
Posible solución: Utilizar errores robustos o transformar variables.
Residuos vs. Leverage (Outliers e Influencia)
Observación: Algunos puntos tienen valores de influencia elevados. Esto indica que algunas observaciones tienen un impacto desproporcionado en el modelo.
Posible solución: Revisar estos outliers y considerar eliminarlos o transformarlos.
vivienda_1 <- data.frame(
areaconst = 200,
estrato = 4,
banios = 2,
habitaciones = 4,
parqueaderos = 1
)
prediccion_1 <- predict(modelo_casas, vivienda_1)
print(paste("Precio estimado de la vivienda 1:", round(prediccion_1, 2), "millones"))
## [1] "Precio estimado de la vivienda 1: 312.1 millones"
Se filtran las ofertas en la zona norte que cumplen con las condiciones del cliente (precio ≤ 350 millones, área ≥ 200 m², estrato 4 o 5, al menos 2 baños, 4 habitaciones y 1 parqueadero).
opciones_norte <- casas_norte %>%
filter(preciom <= 350,
areaconst >= 200,
estrato %in% c(4,5),
banios >= 2,
habitaciones >= 4,
parqueaderos >= 1)
# Mapa con las opciones finales para Vivienda 1
leaflet(opciones_norte) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud,
popup = ~paste("Precio:", preciom, "millones"))
El modelo tiene un ajuste moderado (R² = 60.4%), pero se podría mejorar incluyendo más variables.
Las variables área construida, estrato, baños y parqueaderos son significativas, mientras que el número de habitaciones no lo es.
Se detectan problemas menores en la normalidad y homoscedasticidad, pero son manejables con transformaciones o errores robustos.
Algunos outliers podrían estar afectando el modelo, y es recomendable revisarlos.
modelo_aptos <- lm(preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos, data = aptos_sur)
# Resumen del modelo
summary(modelo_aptos)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones +
## parqueaderos, data = aptos_sur)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1092.02 -42.28 -1.33 40.58 926.56
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -261.62501 15.63220 -16.736 < 2e-16 ***
## areaconst 1.28505 0.05403 23.785 < 2e-16 ***
## estrato 60.89709 3.08408 19.746 < 2e-16 ***
## banios 50.69675 3.39637 14.927 < 2e-16 ***
## habitaciones -24.83693 3.89229 -6.381 2.11e-10 ***
## parqueaderos 72.91468 3.95797 18.422 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 98.02 on 2375 degrees of freedom
## (406 observations deleted due to missingness)
## Multiple R-squared: 0.7485, Adjusted R-squared: 0.748
## F-statistic: 1414 on 5 and 2375 DF, p-value: < 2.2e-16
El modelo de regresión lineal múltiple estima el precio de los apartamentos en la zona sur considerando área construida, estrato, número de baños, número de habitaciones y parqueaderos.
Cada coeficiente indica cuánto cambia el precio del apartamento por unidad adicional de la variable correspondiente.
Área Construida (areaconst):
Coeficiente: 1.2850
Interpretación: Cada metro cuadrado adicional de construcción incrementa el precio del apartamento en 1.29 millones de pesos.
P-valor: <0.001 → Es estadísticamente significativo.
Estrato (estrato):
Coeficiente: 60.90
Interpretación: Subir un nivel en estrato incrementa el precio en 60.9 millones de pesos.
P-valor: <0.001 → Es estadísticamente significativo.
Número de Baños (banios):
Coeficiente: 50.69
Interpretación: Cada baño adicional incrementa el precio en 50.7 millones de pesos.
P-valor: <0.001 → Es estadísticamente significativo.
Número de Habitaciones
(habitaciones):
Coeficiente: -24.83
Interpretación: Contrario a lo esperado, cada habitación adicional reduce el precio del apartamento en 24.8 millones.
P-valor: <0.001 → Es estadísticamente significativo, pero con un efecto inesperado.
Posible explicación: En algunos casos, más habitaciones pueden implicar menor área por habitación, reduciendo el valor del apartamento.
Número de Parqueaderos
(parqueaderos):
Coeficiente: 72.91
Interpretación: Cada parqueadero adicional incrementa el precio en 72.9 millones de pesos.
P-valor: <0.001 → Es estadísticamente significativo.
R² = 0.749
Interpretación: El modelo explica 74.9% de la variabilidad en los precios de los apartamentos, lo que indica un ajuste sólido.
Mejoras posibles: Se podrían incluir variables como ubicación exacta del barrio, antigüedad del edificio o amenidades adicionales.
Para garantizar la validez de los modelos de regresión, se revisan los siguientes supuestos:
Linealidad: Se verifica la relación lineal entre las variables.
Normalidad de los residuos: Se analiza si los residuos siguen una distribución normal.
Homoscedasticidad: Se evalúa si la varianza de los residuos es constante.
Independencia de los residuos: Se revisa si los errores están correlacionados.
# Validación de supuestos para Apartamentos
par(mfrow = c(2, 2))
plot(modelo_aptos)
Residuos vs. Valores Ajustados (Linealidad y Homoscedasticidad)
Observación: Se observa una dispersión más o menos uniforme, pero hay cierta variabilidad en los residuos a diferentes niveles de ajuste.
Conclusión: No hay un patrón curvo fuerte, por lo que la suposición de linealidad es válida. Sin embargo, puede haber indicios de heterocedasticidad.
Gráfico Q-Q (Normalidad de los residuos)
Observación: Se observan desviaciones significativas en los extremos, indicando que los residuos no siguen una distribución normal.
Conclusión: El modelo podría
beneficiarse de una transformación logarítmica del precio
(log(preciom)) para mejorar la normalidad de los
residuos.
Escala-Localización (Homoscedasticidad)
Observación: Se nota una dispersión no completamente uniforme de los residuos, lo que sugiere una leve heterocedasticidad.
Conclusión: Para corregir esto, se podrían usar errores robustos o considerar una transformación de las variables.
El modelo tiene un ajuste sólido (R² = 74.9%), explicando bien la variabilidad en los precios.
Las variables más significativas son área construida, estrato, número de baños y parqueaderos.
El coeficiente negativo para el número de habitaciones sugiere que más habitaciones podrían reducir el precio si disminuyen el área por habitación.
Hay problemas menores de normalidad y heterocedasticidad, que podrían corregirse con transformaciones o modelos más robustos.
vivienda_2 <- data.frame(
areaconst = 300,
estrato = 5,
banios = 3,
habitaciones = 5,
parqueaderos = 3
)
prediccion_2 <- predict(modelo_aptos, vivienda_2)
print(paste("Precio estimado de la vivienda 2:", round(prediccion_2, 2), "millones"))
## [1] "Precio estimado de la vivienda 2: 675.02 millones"
Se filtran las ofertas en la zona sur que cumplen con las condiciones del cliente (precio ≤ 850 millones, área ≥ 300 m², estrato 5 o 6, al menos 3 baños, 5 habitaciones y 3 parqueaderos).
opciones_sur <- aptos_sur %>%
filter(preciom <= 850,
areaconst >= 300,
estrato %in% c(5,6),
banios >= 3,
habitaciones >= 5,
parqueaderos >= 3)
# Mapa con las opciones finales para Vivienda 2
leaflet(opciones_sur) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud,
popup = ~paste("Precio:", preciom, "millones"))
Los modelos de regresión lineal permitieron identificar los factores que más influyen en el precio de las viviendas en Cali, diferenciando entre casas en la zona norte y apartamentos en la zona sur. En ambos casos, las variables más relevantes fueron:
Área Construida: Se confirmó que a mayor área, mayor precio, con un impacto positivo y significativo en ambos modelos.
Estrato Socioeconómico: Se evidenció que las viviendas en estratos más altos tienen precios significativamente mayores.
Número de Baños: Cada baño adicional incrementa el valor de la vivienda, siendo una variable importante en la toma de decisiones de compra.
Número de Parqueaderos: Se encontró que los parqueaderos tienen un impacto positivo considerable en el precio, lo que indica que los compradores valoran la disponibilidad de estacionamiento.
Por otro lado, el número de habitaciones mostró un comportamiento contradictorio. En las casas en la zona norte no fue una variable significativa, mientras que en los apartamentos en la zona sur tuvo un efecto negativo, posiblemente porque un mayor número de habitaciones podría implicar menor área por habitación, reduciendo su atractivo.
Para las casas en la zona norte, el modelo logró explicar el 60.4% de la variabilidad en los precios (R² = 0.604), lo que indica un ajuste moderado.
Para los apartamentos en la zona sur, el modelo tuvo un mejor desempeño, explicando el 74.9% de la variabilidad en los precios (R² = 0.749).
A pesar de los ajustes relativamente buenos, se sugiere considerar variables adicionales, como la antigüedad de la vivienda, ubicación exacta (barrio) y calidad de materiales, para mejorar la capacidad predictiva de los modelos.
La validación de los supuestos de regresión reveló algunas oportunidades de mejora:
Linealidad: En general, la relación entre las variables independientes y el precio parece ser lineal, aunque se podrían explorar modelos polinomiales o interacciones entre variables para mejorar el ajuste.
Normalidad de los Residuos: Se detectaron
desviaciones en la normalidad, especialmente en los apartamentos. Esto
sugiere que aplicar una transformación logarítmica
(log(preciom)) podría mejorar el ajuste del
modelo.
Homoscedasticidad: Se encontraron indicios de heterocedasticidad en ambos modelos, lo que sugiere que la varianza de los residuos no es constante. Se recomienda el uso de errores robustos o modelos más flexibles para corregir este problema.
Outliers e Influencia: Se detectaron observaciones con alta influencia en ambos modelos. Se recomienda analizar estos datos para determinar si corresponden a viviendas con características únicas o si se trata de datos atípicos que podrían distorsionar el modelo.
Se realizaron predicciones de precios para dos solicitudes específicas:
Casa en Zona Norte
Precio estimado: ≈ 312.1 millones de pesos
Se identificaron opciones dentro del presupuesto de 350 millones, cumpliendo con las características solicitadas (≥ 200m², estrato 4 o 5, al menos 2 baños, 4 habitaciones y 1 parqueadero).
Apartamento en Zona Sur
Precio estimado: ≈ 675.02 millones de pesos
Se encontraron opciones dentro del presupuesto de 850 millones, cumpliendo con los requisitos de área, estrato, baños y parqueaderos.
Los mapas generados permiten visualizar estas opciones y facilitar la toma de decisiones por parte de María y sus clientes.
Basado en los hallazgos del análisis, se recomienda a María lo siguiente:
Utilizar estos modelos como referencia para asesorar a futuros clientes y entender mejor el comportamiento del mercado inmobiliario en Cali.
Complementar el análisis con más variables, como la ubicación exacta del barrio, la antigüedad de la vivienda y características adicionales que influyan en el precio.
Aplicar transformaciones logarítmicas al precio para mejorar la normalidad de los residuos y estabilizar la varianza.
Explorar modelos más avanzados, como regresión con efectos espaciales o modelos de aprendizaje automático, para mejorar la precisión de las predicciones.
Realizar seguimiento a las propiedades con mayor influencia en el modelo, ya que podrían ser casos atípicos que afectan los resultados.
El análisis realizado permite a C&A (Casas y Apartamentos) contar con una metodología cuantitativa para evaluar el precio de las viviendas en Cali, ofreciendo a los clientes recomendaciones basadas en datos. Aunque los modelos presentan limitaciones, estos pueden ser refinados con información adicional y técnicas estadísticas más avanzadas.
María ahora tiene una herramienta objetiva y basada en evidencia para responder la solicitud de la compañía internacional, asegurando que las opciones propuestas están respaldadas por un análisis robusto del mercado.