El presente informe busca comprender los factores que determinan el precio de una vivienda con ciertas características definidas. De esta forma, la idea es adentrarse en el análisis del precio de viviendas en las zonas norte y sur dependiendo de las necesidades concretas del cliente.
A través de un conjunto de datos denominado “vivienda”, que tien información detallada sobre diversas viviendas, este estudio busca identificar la relación entre el precio de la vivienda y las variables de área construida, estrato, número de cuartos, número de parqueaderos, número de baños mediante un modelo de regresión múltiple.
Para alcanzar los objetivos planteados, se empleará la siguiente metodología:
De acuerdo al estudio realizado, la relación entre el precio de una vivienda estrato en Cali y su área construida, estrato, número de cuartos, número de parqueaderos, número de baños, según análisis descriptivos proporcionados en los anexos demuestran una relación prevalente entre las variables del análsis y la variable de precio. Lo cual tiene sentido en tanto que a mayor tamaño de vivienda, se espera que su precio sea mayor, igualmente entre el estrato, la cantidad de baños y la cantidad de parqueaderos. El modelo estadístico de regresión lineal multiple permitió ajustar el precio de una vivienda con mayor precisión en función de varias de sus características, facilitando establecer las dos opciones de el mercado inmobiliario local para las ofertas que se recibieron. En la gráfica que se muestra a continuación se puede evidenciar cómo están relacionados los datos y los resultados para los modelos aplicados, siendo (1) el modelo original para casas de zona norte, (2) el modelo para casas de zona norte usando train-test split, (3) el modelo original para apartamentos en zona sur y (4) el modelo usando train-test split para apartamentos en la zona sur.
Sobre el modelo de regresión, se puede interpretar que aproxiamdamente y en promedio el 70 % de la variabilidad en la variable dependiente (precio en millones) está explicada por las variables independientes (area construida en metros cuadrados, estrato, número de cuartos, número de parqueaderos, número de baños). Esto significa que el modelo propuesto captura una porción considerable de la variabilidad en el precio que puede ser atribuida a la relación con las variables independientes o características de una propiedad. Además, con base en el análisis de los estadísticos de regresión y las pruebas de hipótesis, se puede concluir que los coeficientes de los modelos son estadísticamente significativos para realizar las regresiones múltiples. Esto implica que las variables independientes correspondientes tienen un efecto significativo en la predicción de la variable dependiente.
Es clave también destacar que ninguno de los modelo propuestos en este análisis cumple con los supuestos de homocedasticidad, autocorrelación y normalidad en los errores. En primer lugar, la homocedasticidad, que implica que la varianza de los errores es constante en todos los niveles de la variable independiente, se verifica mediante pruebas estadísticas adecuadas, como el test de Breusch-Pagan, que no encontró evidencia significativa de homoscedasticidad en los residuos del modelo. Además, la autocorrelación, que indica la falta de independencia entre los errores, se evaluó a través del test de Durbin-Watson, que encontró evidencia de autocorrelación en los residuos del modelo. Por último, la normalidad en los errores, que supone que los errores se distribuyen normalmente, se verificó mediante el test de Shapiro-Wilk, que también encontró evidencia significativa de desviación de una distribución normal en los residuos del modelo. Estos resultados indican que el modelo de regresión lineal simple utilizado en este análisis NO satisface los supuestos fundamentales necesarios para realizar inferencias válidas y confiables sobre la relación entre las variables. Los resultados aquí mencionados se pueden validar en la sección 2.4 y 3.4 del apartado de anexos.
Este informe contribuye a una mejor comprensión de los factores que determinan el precio de las viviendas en Cali, particularmente en el segmento de casas en zona norte y apartamentos en zona sur. La identificación de un modelo estadístico que describe la relación entre el precio, el área construida, , estrato, número de cuartos, número de parqueaderos y número de baños permitiría tomar mejores decisiones con respecto a la elección de viviendas.
La alta proporción de variabilidad en el precio de una propiedad explicada por las variables independientes del modelo, en promedio un 70 % para los cuatro modelos probados en este documento. Lo que sugiere que el modelo de regresión lineal es una herramienta útil para predecir el precio de una propiedad basándose en su área, estrato, número de cuartos, número de parqueaderos, número de baños. Esta relación significativa entre las variables independientes y el precio proporciona una base sólida para estimar el valor de las propiedades.
El hecho de que los coeficientes del modelo sean estadísticamente significativos implica que las variables de análisis tienen un efecto significativo en la predicción del precio de una propiedad. Esto sugiere que, en promedio, por cada metro cuadrado adicional de área construida, el precio de la vivienda aumenta en promedio 1.6469 unidades monetarias en el caso del tercer modelo probado. Esta información es útil para comprender cómo varía el precio de una propiedad en función de sus características.
Dado que el modelo captura una porción considerable de la variabilidad en el precio de una propiedad y los coeficientes son estadísticamente significativos, puede ser una herramienta valiosa para la toma de decisiones en el mercado inmobiliario. Los agentes del mercado, los tasadores de propiedades y los compradores potenciales pueden utilizar este modelo para estimar el precio de las propiedades y tomar decisiones informadas sobre la compra, venta o valoración de bienes raíces.
Se procede a realizar un filtro a la base de datos usando la variable
tipo para verificar las casas y la variable
zona para identificar las que se encuentran en la Zona
Norte. Se hace la visualización de las primeras tres líneas:
cond_vector <- (vivienda$tipo == "Casa") & (vivienda$zona == "Zona Norte")
viviendas_norte <- subset(vivienda, cond_vector)
head(viviendas_norte, 3)
Así mismo, se realiza la gráfica de los registros con ubicaciones en zona norte, lo que genera como resultado la siguiete imagen, la cual fue realizada utilizando PowerBI:
Se evidencia que existen varios registros que están por fuera de la zona norte. Como resultado de este hallazgo, se propone elegir puntos estratégicos con base en la observación de la gráfica y el conocimiento de las zonas, para definir límites estrictos y poder tomar la base de datos de una mejor manera.
Así pues, el filtro arbitrario se generará de la siguiente manera:
Para que el nuevo mapa quede de la siguiente manera. Para efectos ilustrativos se están dejando las anteriores categorizaciones de las zonas, aunque para nuestro ejercicio se van a tomar estos puntos como ZONA NORTE:
Por lo tanto, nuestra nueva consulta para trabajo, llamada
viviendas_norte será la calculada con el siguiente
código:
cond_vector <- (vivienda$tipo == "Casa") & (vivienda$latitud > 3.46467) & (vivienda$longitud > -76.5354)
viviendas_norte <- subset(vivienda, cond_vector)
cat("Cantidad columnas: ", ncol(viviendas_norte), "Cantidad filas: ", nrow(viviendas_norte))
## Cantidad columnas: 13 Cantidad filas: 493
head(viviendas_norte, 3)
Se hace el slice por variables de interés para nuestro ejercicio:
interest_cols <- c("preciom", "areaconst", "estrato", "banios", "habitaciones")
viviendas_norte <- viviendas_norte[, interest_cols]
viviendas_norte
Análisis exploratorio de datos, enfocado en la relación entre la variable respuesta (precio) en función de las variables predictoras (área construida, estrato, número de cuartos, número de parqueaderos, número de baños)
Boxplot para verificar la relación entre el estrato
(variable categórica ordinal) y preciom:
# Se convierte estrato a un factor para evitar que se considere una variable numérica
# viviendas_norte$estrato <- factor(viviendas_norte$estrato, ordered = TRUE)
viviendas_norte$estrato <- as.character(viviendas_norte$estrato)
# Create box plot
plot <- plot_ly(viviendas_norte, x = ~estrato, y = ~preciom, type = 'box') %>%
layout(title = "Precio vs. Estrato")
plot
En la gráfica de boxplot se puede verificar la relación entre el estrato con respecto al precio de la vivienda. Se puede evidenciar la existencia de outliers para viviendas (casas, zona norte) de estrato 3. Las viviendas estrato 6 tienen un precio más alto en promedio siendo su mediana 850 millones, comparado con viviendas estrato 5 con precio mediano de 450 millones y estrato 4 con precio mediano de 367 millones.
Gráfico de dispersión para visualizar la relación entre el área construida y el precio de la vivienda
# Crear un gráfico de dispersión de precio vs. área construida
plot <- plot_ly(viviendas_norte, x = ~areaconst, y = ~preciom,
type = 'scatter', mode = 'markers',
marker = list(color = 'blue'))
# Agregar título y etiquetas
plot <- plot %>% layout(title = "Relación entre Precio y Área Construida",
xaxis = list(title = "Área Construida"),
yaxis = list(title = "Precio"))
plot
La gráfica sugiere que exite una relación lineal positiva entre el precio por metro cuadrado y la cantidad de metros cuadrados construidos de la vivienda. Lo cual tiene sentido práctico y lógico, en cuanto que una vivienda sea más grande mayor tiende a ser su precio.
Matriz de correlación para realizar una visualización de la interacción de las variables con respecto a nuestra variable objetivo (preciom) y entre dependientes:
# Crear una matriz de correlación excluyendo "estrato"
corr_matrix <- cor(viviendas_norte[, -which(names(viviendas_norte) == "estrato")])
# Visualizar la matriz de correlación como un mapa de calor
plot_ly(z = corr_matrix, x = colnames(corr_matrix), y = colnames(corr_matrix),
type = "heatmap", colorscale = "Inferno") %>%
layout(title = "Matriz de Correlación")
Según lo observado en la visualización, se confirma la fuerte asociación que existe entre el precio de la vivienda y el área construida con una correlación positiva de 0.78. Así mismo, existe una correlación con los baños de la casa y el precio de 0.57, lo cual también es un índice alto. Las habitaciones son las que menos correlación poseen con respecto al precio, con un coeficiente de 0.35, la cual es la más baja de todas, pero no se podría subestimar por el momento.
Aplicación del modelo de regresión lineal múltiple para realizar el
ajuste de la variable preciom:
# Ajustar el modelo de regresión lineal múltiple
reg_model <- lm(preciom ~ ., data = viviendas_norte)
# Resumen del modelo
summary(reg_model)
##
## Call:
## lm(formula = preciom ~ ., data = viviendas_norte)
##
## Residuals:
## Min 1Q Median 3Q Max
## -658.79 -59.97 -7.83 36.57 937.56
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 22.1850 18.4701 1.201 0.230285
## areaconst 0.8469 0.0499 16.971 < 2e-16 ***
## estrato4 76.4058 17.6007 4.341 1.73e-05 ***
## estrato5 112.5566 16.5465 6.802 3.03e-11 ***
## estrato6 348.9814 34.7554 10.041 < 2e-16 ***
## banios 23.0237 6.4745 3.556 0.000413 ***
## habitaciones 4.9699 4.6904 1.060 0.289861
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 130.7 on 486 degrees of freedom
## Multiple R-squared: 0.715, Adjusted R-squared: 0.7115
## F-statistic: 203.2 on 6 and 486 DF, p-value: < 2.2e-16
Interpretaciones de los valores obtenidos: * Intercept : Representa el precio promedio de una vivienda cuando todas las variables predictoras son cero. Sin embargo, es poco probable que una vivienda tenga un área construida, baños y habitaciones igual a cero. Este valor sirve principalmente como punto de referencia para la interpretación de los otros coeficientes.
areaconst: Por cada metro cuadrado adicional de área construida, el precio de la vivienda aumenta en promedio 0.8469 unidades monetarias, manteniendo constantes las demás variables. Este coeficiente es altamente significativo (p < 0.001), lo que indica una fuerte relación positiva entre el área construida y el precio.
estrato4, estrato5, estrato6: Estos coeficientes representan la diferencia en el precio promedio de una vivienda en comparación con el estrato base (estrato3), cuando todas las demás variables se mantienen constantes. Por ejemplo, una vivienda en el estrato 4 es, en promedio, 76.4058 unidades monetarias más cara que una vivienda en el estrato base.
banios (23.0237): Por cada baño adicional, el precio de la vivienda aumenta en promedio 23.0237 unidades monetarias, manteniendo constantes las demás variables. Este coeficiente también es altamente significativo, lo que sugiere una fuerte relación positiva entre el número de baños y el precio.
habitaciones (4.9699): El coeficiente es positivo, pero no es estadísticamente significativo (p = 0.289861). Esto indica que no hay evidencia suficiente para concluir que el número de habitaciones tenga un impacto significativo en el precio de las viviendas, al menos cuando se consideran las otras variables en el modelo.
R-cuadrado (0.715): Indica que el modelo explica aproximadamente el 71.5% de la variabilidad en el precio de las viviendas. Este es un valor relativamente alto, lo que sugiere que el modelo se ajusta razonablemente bien a los datos.
Mejoras posibles en el ajuste del modelo:
Validación de los supuestos del modelo por medio de gráficos apropiados, interpretarlos y sugerir posibles soluciones si se violan algunos de ellos. Utilizar las pruebas de hipótesis para la validación de supuestos y comparar los resultados con lo observado en los gráficos asociados:
res = resid(reg_model)
shapiro.test(res)
##
## Shapiro-Wilk normality test
##
## data: res
## W = 0.84222, p-value < 2.2e-16
Analizando el p-value de la prueba, que es muy pequeño, se puede decir que se rechaza la hipótesis nula de que los datos provienen de una distribución normal. Lo que quiere decir que los errores pueden ser no normalmente distribuidos, lo que viola el supuesto que se está comprobando. Este resultado tiene implicaciones dado que se puede afectar la validez de las inferencias estadísticas.
Este hecho se podría intentar solucionar realizando trasnformaciones sobre los datos, la más común en su aplicación es el logaritmo. Aunque se pueden utilizar otro tipo de transformaciones, como raíces cuadradas, entre otros.
lmtest::bptest(reg_model)
##
## studentized Breusch-Pagan test
##
## data: reg_model
## BP = 75.166, df = 6, p-value = 3.548e-14
Dado que el p-valor es significativamente menor que 0.05, se rechaza la hipótesis nula de homocedasticidad. Esto sugiere que existe evidencia de heterocedasticidad en los residuos del modelo de regresión. La violación de este supuesto, como en la normalidad de los errores, sugiere que las pruebas estadísticas que se apliquen pierden poder explicativo, por lo tanto las estimaciones de los coeficientes y sus errores estándar pueden ser sesgados.
Los pasos a seguir sugeridos pueden ser crear gráficos de residuos para identificar patrones de heterocedasticidad visualmente.Y considerar transformaciones de las variables dependiente o independientes para reducir la heterocedasticidad. Las transformaciones pueden ayudar como en el punto anterior.
lmtest::dwtest(reg_model)
##
## Durbin-Watson test
##
## data: reg_model
## DW = 1.826, p-value = 0.02226
## alternative hypothesis: true autocorrelation is greater than 0
Como el p-valor es significativamente menor que 0.05, se rechaza la hipótesis nula de ausencia de autocorrelación. Esto sugiere que existe evidencia de autocorrelación positiva de primer orden en los residuos del modelo de regresión. La autocorrelación puede invalidar las inferencias estadísticas basadas en el modelo de regresión. Las estimaciones de los coeficientes y sus errores estándar pueden ser sesgados
Para poder arreglar este tipo de situaciones se puede considerar transformaciones de las variables dependiente o independiente para reducir la autocorrelación. Así mismo la literatura suguiete usar modelos autorregresivos como los modelos de regresión autorregresivos (AR) o modelos de media móvil (MA) para incorporar la autocorrelación en el modelo.
par(mfrow=c(1,2))
qqnorm(res)
qqline(res)
hist(res, main = "Histograma de Residuos")
Como se puede observar en las gráficas, los datos no siguen una
distribución normal, la distribución de los datos es asimétrica y
presenta colas más pesadas o más ligeras que una distribución normal.
Además, la distribución es no lineal, sino que la relación entre los
cuantiles de los datos y los cuantiles de una distribución normal no es
lineal, sino que sigue un patrón curvilíneo.
Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud:
data_to_pred <- data.frame(
areaconst = 200,
parqueaderos = 1,
estrato = c("4", "5"),
banios = 2,
habitaciones = 4
)
predict(reg_model, data_to_pred, level = 0.95, interval = "confidence")
## fit lwr upr
## 1 333.8927 302.8846 364.9008
## 2 370.0435 342.5239 397.5631
De acuerdo con el modelo, se estima que una vivienda unifamiliar de 200 m² ubicada en el estrato 4 de la zona norte, con las características descritas, tendrá un valor promedio de mercado de 333.89 millones. Con un nivel de confianza del 95 %, se espera que el precio real se encuentre entre 302.88 y 364.90 millones. Para una vivienda similar ubicada en el estrato 5, el valor promedio estimado asciende a 370.04 millones, con un intervalo de confianza del 95% que oscila entre 342.52 y $397.56 millones.
set.seed(1)
# Dividir el conjunto de datos en entrenamiento y prueba
smp_size <- floor(0.70 * nrow(viviendas_norte))
train_ind <- sample(seq_len(nrow(viviendas_norte)), size = smp_size)
train_data <- viviendas_norte[train_ind, ]
test_data <- viviendas_norte[-train_ind, ]
# Crear y entrenar el modelo de regresión lineal
model_test <- lm(preciom ~ ., data = train_data)
summary(model_test)
##
## Call:
## lm(formula = preciom ~ ., data = train_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -694.61 -59.95 -12.21 39.46 929.86
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 27.29166 24.30074 1.123 0.262201
## areaconst 0.89996 0.06678 13.476 < 2e-16 ***
## estrato4 79.28273 23.05390 3.439 0.000657 ***
## estrato5 107.05226 20.78584 5.150 4.43e-07 ***
## estrato6 374.91079 44.81471 8.366 1.59e-15 ***
## banios 18.27028 7.92994 2.304 0.021831 *
## habitaciones 5.24970 5.91244 0.888 0.375221
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 140.2 on 338 degrees of freedom
## Multiple R-squared: 0.6708, Adjusted R-squared: 0.6649
## F-statistic: 114.8 on 6 and 338 DF, p-value: < 2.2e-16
El resultado que se muestra en el resumen del modelo significa que aproximadamente el 67.08% de la variación en los precios de las viviendas puede ser explicada por las variables independientes incluidas en el modelo. Lo que nos da un ajuste bueno pero no superior con respecto a la capacidad de explicación de las variables. Un valor más alto indicaría un mejor ajuste del modelo a los datos.
# Hacer predicciones en el conjunto de prueba
predicciones <- predict(model_test, newdata = test_data)
# Evaluar el modelo
rmse <- sqrt(mean((predicciones - test_data$preciom)^2))
cat("Error cuadrático medio (RMSE):", rmse, "\n")
## Error cuadrático medio (RMSE): 107.6541
Un RMSE de 107.6541 significa que, en promedio, las predicciones del
modelo se desvían del valor real en 107.6541 unidades. Como la variable
objetivo es preciom, significa que en promedio las
predicciones del modelo se desvían 107 millones de pesos. Considerando
que las viviendas tienen un precio entre 300 a casi 800 millones de
pesos, el error promedio esperado puede ser de más de cien millones de
pesos. En este caso puede no considerarse un modelo muy efectivo en la
estimación dado que tiene problemas para realizar predicciones precisas
aunque su ajuste (R2) sea aproximadamente 70 %.
# Evaluar el modelo
mae <- mean(predicciones - test_data$preciom)
cat("Error Absoluto Medio (MAE):", mae, "\n")
## Error Absoluto Medio (MAE): 7.975118
Un Error Absoluto Medio (MAE) de 7.97 millones de pesos en un modelo de predicción significa que, en promedio, las predicciones de están desviadas de los precios reales en 7.975118 millones de pesos. Es decir, si se toma la diferencia absoluta entre el precio real de una vivienda y el precio que el modelo predice para esa misma vivienda, y se calcula el promedio de todas esas diferencias se obtiene el valor de 7 millones de pesos.
Se procede a realizar un filtro a la base de datos usando la variable
tipo para verificar los apartamentos y la variable
zona para identificar las que se encuentran en la Zona Sur
Se hace la visualización de las primeras tres líneas:
cond_vector <- (vivienda$tipo == "Apartamento") & (vivienda$zona == "Zona Sur")
viviendas_sur <- subset(vivienda, cond_vector)
head(viviendas_sur, 3)
Así mismo, se realiza la gráfica de los registros con ubicaciones en zona sur, lo que genera como resultado la siguiete imagen, la cual fue realizada utilizando PowerBI:
Se evidencia que existen varios registros que están por fuera de la zona sur, en general la mayoría. Como resultado de este hallazgo, se propone elegir puntos estratégicos con base en la observación de la gráfica y el conocimiento de las zonas, para definir límites estrictos y poder tomar la base de datos de una mejor manera.
Así pues, el filtro arbitrario se generará de la siguiente manera:
Para que el nuevo mapa quede de la siguiente manera. Para efectos ilustrativos se están dejando las anteriores categorizaciones de las zonas, aunque para nuestro ejercicio se van a tomar estos puntos como ZONA SUR:
Por lo tanto, nuestra nueva consulta para trabajo, llamada
viviendas_sur será la calculada con el siguiente
código:
cond_vector <- (vivienda$tipo == "Apartamento") & (vivienda$latitud < 3.40282)
viviendas_sur <- subset(vivienda, cond_vector)
cat("Cantidad columnas: ", ncol(viviendas_sur), "Cantidad filas: ", nrow(viviendas_sur))
## Cantidad columnas: 13 Cantidad filas: 2126
tail(viviendas_sur, 3)
Se hace el slice por variables de interés para nuestro ejercicio:
interest_cols <- c("preciom", "areaconst", "estrato", "banios", "habitaciones")
viviendas_sur <- viviendas_sur[, interest_cols]
viviendas_sur
Análisis exploratorio de datos, enfocado en la relación entre la variable respuesta (precio) en función de las variables predictoras (área construida, estrato, número de cuartos, número de parqueaderos, número de baños)
Boxplot para verificar la relación entre el estrato
(variable categórica ordinal) y preciom:
# Se convierte estrato a un factor para evitar que se considere una variable numérica
# viviendas_sur$estrato <- factor(viviendas_sur$estrato, ordered = TRUE)
viviendas_sur$estrato <- as.character(viviendas_sur$estrato)
# Create box plot
plot <- plot_ly(viviendas_sur, x = ~estrato, y = ~preciom, type = 'box') %>%
layout(title = "Precio vs. Estrato")
plot
En la gráfica de boxplot se puede verificar la relación entre el estrato con respecto al precio de la vivienda. Se puede evidenciar la existencia de outliers para viviendas (apartamentos, zona sur) de todos los estratos. Los apartamentos estrato 6 tienen un precio más alto en promedio siendo su mediana 580 millones, comparado con apartamentos estrato 5 con precio mediano de 280 millones y estrato 4 con precio mediano de 185 millones.
Gráfico de dispersión para visualizar la relación entre el área construida y el precio del apartamento
# Crear un gráfico de dispersión de precio vs. área construida
plot <- plot_ly(viviendas_sur, x = ~areaconst, y = ~preciom,
type = 'scatter', mode = 'markers',
marker = list(color = 'blue'))
# Agregar título y etiquetas
plot <- plot %>% layout(title = "Relación entre Precio y Área Construida",
xaxis = list(title = "Área Construida"),
yaxis = list(title = "Precio"))
plot
La gráfica sugiere que exite una relación lineal positiva entre el precio por metro cuadrado y la cantidad de metros cuadrados construidos de la vivienda. Lo cual tiene sentido práctico y lógico, en cuanto que un apartamento sea más grande mayor tiende a ser su precio.
Matriz de correlación para realizar una visualización de la interacción de las variables con respecto a nuestra variable objetivo (preciom) y entre dependientes:
# Crear una matriz de correlación excluyendo "estrato"
corr_matrix <- cor(viviendas_sur[, -which(names(viviendas_sur) == "estrato")])
# Visualizar la matriz de correlación como un mapa de calor
plot_ly(z = corr_matrix, x = colnames(corr_matrix), y = colnames(corr_matrix),
type = "heatmap", colorscale = "Inferno") %>%
layout(title = "Matriz de Correlación")
Según lo observado en la visualización, se confirma la fuerte asociación que existe entre el precio de la vivienda y el área construida con una correlación positiva de 0.77. Así mismo, existe una correlación con los baños del apartamento y el precio de 0.74, lo cual también es un índice alto. Las habitaciones son las que menos correlación poseen con respecto al precio, con un coeficiente de 0.32, la cual es la más baja de todas, pero no se podría subestimar por el momento.
Aplicación del modelo de regresión lineal múltiple para realizar el
ajuste de la variable preciom:
# Ajustar el modelo de regresión lineal múltiple
reg_model_sur <- lm(preciom ~ ., data = viviendas_sur)
# Resumen del modelo
summary(reg_model_sur)
##
## Call:
## lm(formula = preciom ~ ., data = viviendas_sur)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1392.73 -38.21 -1.80 36.19 893.85
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -23.68215 13.82435 -1.713 0.086845 .
## areaconst 1.64457 0.05504 29.878 < 2e-16 ***
## estrato4 23.91898 10.02355 2.386 0.017107 *
## estrato5 52.08005 10.22883 5.091 3.87e-07 ***
## estrato6 213.93338 12.24778 17.467 < 2e-16 ***
## banios 58.38508 3.75150 15.563 < 2e-16 ***
## habitaciones -14.85644 4.20387 -3.534 0.000418 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 101.3 on 2119 degrees of freedom
## Multiple R-squared: 0.7686, Adjusted R-squared: 0.7679
## F-statistic: 1173 on 6 and 2119 DF, p-value: < 2.2e-16
Interpretaciones de los valores obtenidos: * Intercept : Representa el precio promedio de una vivienda cuando todas las variables predictoras son cero. Sin embargo, es poco probable que una vivienda tenga un área construida, baños y habitaciones igual a cero. En este caso es negativo y no significativo según la estimación de los resultados del modelo.
areaconst: Por cada metro cuadrado adicional de área construida, el precio de la vivienda aumenta en promedio 1.6469 unidades monetarias, manteniendo constantes las demás variables. Este coeficiente es altamente significativo (p < 0.001), lo que indica una fuerte relación positiva entre el área construida y el precio.
estrato4, estrato5, estrato6: Estos coeficientes representan la diferencia en el precio promedio de una vivienda en comparación con el estrato base (estrato3), cuando todas las demás variables se mantienen constantes. Por ejemplo, una vivienda en el estrato 4 es, en promedio, 23.91 unidades monetarias más cara que una vivienda en el estrato base.
banios: Por cada baño adicional, el precio de la vivienda aumenta en promedio 58.38508 unidades monetarias, millones de pesos en este caso, manteniendo constantes las demás variables. Este coeficiente también es altamente significativo, lo que sugiere una fuerte relación positiva entre el número de baños y el precio.
habitaciones: El coeficiente es negativo (-14.85644), y resulta ser estadísticamente significativo (p = 0.000418). Esto indica que entre más habitaciones tiene un apartamento en la zona sur de Cali, mayor es su precio. Esto se puede deber a que los apartamentos más costosos y de mayor estrato por lo general tienen menos habitaciones, aunque habría que realizar la validación con la persona experta del negocio.
Mejoras posibles en el ajuste del modelo:
El hecho de que el coeficiente del intercepto no sea significativo podría deberse a que no tiene una interpretación práctica dentro de la lógica del modelo. Entonces se debería excluir para realizar las predicciones.
Se puede intentar hacer modelaciones distintas para encontrar mejores ajustes de los datos hacia el modelo, por ejemplo transformaciones logaríticas u otro tipo de transformaciones lineales.
Validación de los supuestos del modelo por medio de gráficos apropiados, interpretarlos y sugerir posibles soluciones si se violan algunos de ellos. Utilizar las pruebas de hipótesis para la validación de supuestos y comparar los resultados con lo observado en los gráficos asociados:
res = resid(reg_model_sur)
shapiro.test(res)
##
## Shapiro-Wilk normality test
##
## data: res
## W = 0.7359, p-value < 2.2e-16
Analizando el p-value de la prueba, que es muy pequeño, se puede decir que se rechaza la hipótesis nula de que los datos provienen de una distribución normal. Lo que quiere decir que los errores pueden ser no normalmente distribuidos, lo que viola el supuesto que se está comprobando. Este resultado tiene implicaciones dado que se puede afectar la validez de las inferencias estadísticas.
Este hecho se podría intentar solucionar realizando trasnformaciones sobre los datos, la más común en su aplicación es el logaritmo. Aunque se pueden utilizar otro tipo de transformaciones, como raíces cuadradas, entre otros.
lmtest::bptest(reg_model_sur)
##
## studentized Breusch-Pagan test
##
## data: reg_model_sur
## BP = 844.68, df = 6, p-value < 2.2e-16
Dado que el p-valor es significativamente menor que 0.05, se rechaza la hipótesis nula de homocedasticidad. Esto sugiere que existe evidencia de heterocedasticidad en los residuos del modelo de regresión. La violación de este supuesto, como en la normalidad de los errores, sugiere que las pruebas estadísticas que se apliquen pierden poder explicativo, por lo tanto las estimaciones de los coeficientes y sus errores estándar pueden ser sesgados.
Los pasos a seguir sugeridos pueden ser crear gráficos de residuos para identificar patrones de heterocedasticidad visualmente.Y considerar transformaciones de las variables dependiente o independientes para reducir la heterocedasticidad. Las transformaciones pueden ayudar como en el punto anterior.
lmtest::dwtest(reg_model_sur)
##
## Durbin-Watson test
##
## data: reg_model_sur
## DW = 1.7533, p-value = 4.937e-09
## alternative hypothesis: true autocorrelation is greater than 0
Como el p-valor es significativamente menor que 0.05, se rechaza la hipótesis nula de ausencia de autocorrelación. Esto sugiere que existe evidencia de autocorrelación positiva de primer orden en los residuos del modelo de regresión. La autocorrelación puede invalidar las inferencias estadísticas basadas en el modelo de regresión. Las estimaciones de los coeficientes y sus errores estándar pueden ser sesgados
Para poder arreglar este tipo de situaciones se puede considerar transformaciones de las variables dependiente o independiente para reducir la autocorrelación. Así mismo la literatura suguiete usar modelos autorregresivos como los modelos de regresión autorregresivos (AR) o modelos de media móvil (MA) para incorporar la autocorrelación en el modelo.
par(mfrow=c(1,2))
qqnorm(res)
qqline(res)
hist(res, main = "Histograma de Residuos")
Como se puede observar en las gráficas, los datos no siguen una
distribución normal, la distribución de los datos es asimétrica y
presenta colas más pesadas o más ligeras que una distribución normal.
Además, la distribución es no lineal, sino que la relación entre los
cuantiles de los datos y los cuantiles de una distribución normal no es
lineal, sino que sigue un patrón curvilíneo.
Con el modelo identificado debe predecir el precio del apartamento con las características de la segunda solicitud:
data_to_pred <- data.frame(
areaconst = 300,
parqueaderos = 3,
estrato = c("5", "6"),
banios = 3,
habitaciones = 5
)
predict(reg_model_sur, data_to_pred, level = 0.95, interval = "confidence")
## fit lwr upr
## 1 622.6430 597.9122 647.3737
## 2 784.4963 759.0944 809.8982
De acuerdo con el modelo, se estima que un apartamento de 300 m² ubicada en el estrato 4 de la zona sur, con las características descritas, tendrá un valor promedio de mercado de 622.64 millones. Con un nivel de confianza del 95 %, se espera que el precio real se encuentre entre 597.91 y 647.37 millones. Para una vivienda similar ubicada en el estrato 5, el valor promedio estimado asciende a 784.49 millones, con un intervalo de confianza del 95% que oscila entre 759.09 y 809.89 millones.
set.seed(1)
# Dividir el conjunto de datos en entrenamiento y prueba
smp_size <- floor(0.70 * nrow(viviendas_sur))
train_ind <- sample(seq_len(nrow(viviendas_sur)), size = smp_size)
train_data <- viviendas_sur[train_ind, ]
test_data <- viviendas_sur[-train_ind, ]
# Crear y entrenar el modelo de regresión lineal
model_test_sur <- lm(preciom ~ ., data = train_data)
summary(model_test_sur)
##
## Call:
## lm(formula = preciom ~ ., data = train_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1411.09 -39.21 -2.33 35.71 880.28
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -37.30769 17.25363 -2.162 0.03075 *
## areaconst 1.65938 0.06645 24.970 < 2e-16 ***
## estrato4 12.92811 12.43876 1.039 0.29882
## estrato5 38.34925 12.70743 3.018 0.00259 **
## estrato6 197.94331 15.35090 12.895 < 2e-16 ***
## banios 65.35926 4.71650 13.858 < 2e-16 ***
## habitaciones -11.19028 5.21793 -2.145 0.03215 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 104.9 on 1481 degrees of freedom
## Multiple R-squared: 0.7623, Adjusted R-squared: 0.7614
## F-statistic: 791.7 on 6 and 1481 DF, p-value: < 2.2e-16
El resultado que se muestra en el resumen del modelo significa que aproximadamente el 76.23% de la variación en los precios de los apartamentos puede ser explicada por las variables independientes incluidas en el modelo. Lo que nos da un ajuste bueno pero no superior con respecto a la capacidad de explicación de las variables. Un valor más alto indicaría un mejor ajuste del modelo a los datos.
# Hacer predicciones en el conjunto de prueba
predicciones <- predict(model_test_sur, newdata = test_data)
# Evaluar el modelo
rmse <- sqrt(mean((predicciones - test_data$preciom)^2))
cat("Error cuadrático medio (RMSE):", rmse, "\n")
## Error cuadrático medio (RMSE): 93.63229
Un RMSE de 93.63229 significa que, en promedio, las predicciones del
modelo se desvían del valor real en 93.63 unidades. Como la variable
objetivo es preciom, significa que en promedio las
predicciones del modelo se desvían 93 millones de pesos. Considerando
que las viviendas tienen un precio entre 84 a casi 750 millones de
pesos, el error promedio esperado puede ser de casi cien millones de
pesos. En este caso puede no considerarse un modelo muy efectivo en la
estimación dado que tiene problemas para realizar predicciones precisas
aunque su ajuste (R2) sea aproximadamente 70 %.
# Evaluar el modelo
mae <- mean(predicciones - test_data$preciom)
cat("Error Absoluto Medio (MAE):", mae, "\n")
## Error Absoluto Medio (MAE): 12.82812
Un Error Absoluto Medio (MAE) de 12.82 millones de pesos en un modelo de predicción significa que, en promedio, las predicciones de están desviadas de los precios reales en 12.82 millones de pesos. Es decir, si se toma la diferencia absoluta entre el precio real de una vivienda y el precio que el modelo predice para esa misma vivienda, y se calcula el promedio de todas esas diferencias se obtiene el valor de 13 millones de pesos.