Con base en los datos de ofertas de vivienda descargadas del portal Fincaraiz para apartamento de estrato 4 con área construida menor a 200 m2 la inmobiliaria A&C requiere el apoyo de un cientifico de datos en la construcción de un modelo que lo oriente sobre los precios de inmuebles.
Con este propósito el equipo de asesores a diseñado los siguientes pasos para obtener un modelo y así poder a futuro determinar los precios de los inmuebles a negociar
Con los datos disponibles se cuenta con información de la zona en que se ubican las viviendas dentro de Cali, el estrato socioeconómico al cual pertenece, el precio publicado de la vivienda (en millones COP) y el tipo de vivienda, es decir, si son casas o apartamentos, sin embargo, para el ejercicio de la inmobiliaria A&C sólo se usarán los datos de apartamentos por motivos de negocio.
Como se observa en los gráficos de distribución (histograma y boxplot) se tienen algunos datos atípicos en los valores más altos. También el promedio (línea verde) de los precios en Cali es de 202, el cual es un valor muy cercano a la mediana (línea roja), que se ubica en 185. Esto quiere decir que los precios de los apartamentos en Cali tienden a costar 202 millones de pesos colombianos (COP), y la mitad de los apartamentos cuestan menos de 185 millones COP. Por otro lado, el 25% de los apartamentos son de menos de 153.5 millones COP, siendo el mínimo 78 millones COP, y el 25% de los apartamentos más costosos se ubican entre 185 y 240 millones COP. Además, los datos tienen una variación estandar de 65.2904917.
En los gráficos de arriba se observa que se tienen algunos datos atípicos en los valores más altos. También el promedio (línea verde) de las áreas de los apartamentos en Cali es de 75, el cual es un valor muy cercano a la mediana (línea roja), que se ubica en 70. Esto quiere decir que el área de los apartamentos en Cali tienden a ser de 75 metros cuadrados, y la mitad de los apartamentos tienen áreas de menos de 70 metros cuadrados. Por otro lado, el 25% de los apartamentos son de menos de 60 metros cuadrados, siendo el apartamentos más pequeño de 40 metros cuadrados, y el 25% de los apartamentos más grandes se ubican entre 70 y 84 metros cuadrados. Además, los datos tienen una variación estandar de 22.5646097.
Ahora bien, al analizar la respuesta del precio de los apartamentos en función del tamaño del mismo, se obtiene que:
Como se observa en el diagrama de dispersión, es posible identificar una relación entre el área del apartamento y el precio de la misma. Sin embargo, a medida que el área del apartamento es más grande esta relación parece más difusa. En otras palabras, parece indicar una relación lineal entre el área del apartamento y su precio, sin embargo, puede haber una variabilidad considerable en los precios para un rango dado de áreas construidas.
Además, la línea de regresión lineal (en azul), sugiere que esta relación es positiva. Para calcular el nivel de correlación, se recurriría al coeficiente de correlación de Pearson, sin embargo, como previamente se vio, los datos tienen outliers, por lo que se recomienda usar el coeficiente de correlación de Spearman. Al calcularlo, este tiene un valor de 0.78 lo que indica que sí existe una relación entre ambas variables y esta relación es positiva fuerte, sin embargo, esta no quiere decir que haya una causalidad entre ellas.
Se busca estimar el modelo de regresión lineal de forma Y=β0+β1X+ε, donde la variable x es el área del apartamento, es decir, será la variable predictora del precio. Al estimar el modelo se obtiene que el valor β0, es decir, el valor que eventualmente tendría un apartamento con un área de 0 metros cuadrados, sería 39.05 millones COP, mientras que β1, que es la razón de cambio entre la variable predictora y la variable de interés, es 2.16, en otras palabras, quiere decir que por cada metro cuadrado de un apartamento, el precio estará aumentando en 2.16 millones COP, además, al ser positivo quiere decir que mientras una aumenta, la otra también, y viceversa.
A modo de resumen se tiene que:
##
## Call:
## lm(formula = preciom ~ areaconst, data = vivienda4)
##
## Residuals:
## Min 1Q Median 3Q Max
## -225.404 -23.902 -4.754 25.763 209.021
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 39.04679 4.09977 9.524 <2e-16 ***
## areaconst 2.16473 0.05204 41.595 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 43.34 on 1361 degrees of freedom
## Multiple R-squared: 0.5597, Adjusted R-squared: 0.5594
## F-statistic: 1730 on 1 and 1361 DF, p-value: < 2.2e-16
Siendo más precisos, al construir un intervalo de confianza para el coeficiente β1 del 95%, realmente quiere decir que, por cada unidad de área (metro cuadrado), el precio del apartamento va a aumentar entre 31 millones COP y 2.06 millones COP, con una confianza del 95%. No basta sólo con esto, es necesario saber si el valor encontrado de variación es significativamente diferente de cero, para lo cual se usa evalúa el p-value del coeficiente β1, que en este caso es 1.0563274^{-244}, lo que significa que sí es significativamente diferente de cero. Lo mismo ocurre para el coeficiente β0
Ahora bien, respecto al indicador de bondad R^2, según el modelo de regresión lineal, su valor es 0.5597, lo cual indica que aproximadamente el 55.97% de la variabilidad en la variable de respuesta “precio del apartamento” se explica mediante el modelo de regresión lineal ajustado. En otras palabras, a pesar de que la variable del área logra explicar más de la mitad de la variación del precio de los apartamentos, no explica completamente su comportamiento. Aún hay cerca de un 40% de las variaciones en el precio de los apartamentos que no se explica por el tamaño delos mismos.
Por ejemplo, en el caso de querer estimar el valor de un apartamento de 100 metros cuadrados, el modelo lineal estimado predice que el precio de un apartamento de área promedio 110 metros cuadrados su precio promedio sería de 277.17 millones de COP, pudiendo variar entre 272.96 millones de COP y 281.38 millones de COP. Ahora si se quisiera evaluar un nuevo apartamento de 110 metros cuadrados, el modelo predice que tendría un precio promedio de 277.17 millones de COP, pudiendo variar entre 192.04 millones de COP y 362.29 millones de COP, lo que quiere decir que en el caso de ofertarse un nuevo apartamento de 110 metros cuadrados por 200 millones COP, estaría entre los más llamativos ya que se ubicarían en los precios más bajos que podrían ofertarse.
El primer supuesto que se descarta es la no existencia de outliers, pues en la exploración univariada, con el boxplot de las variables de interés se encontró que existen outliers.
Por otro lado, según el test de Shapiro-Wilk, los errores no siguen una distribución normal, por el p valor tan bajo (1.1630657^{-17}). Dado que el valor p es prácticamente cero, se tiene una fuerte evidencia en contra de la hipótesis de normalidad. Esto sugiere que los residuales pueden estar distribuidos de manera no normal en la población.
##
## Shapiro-Wilk normality test
##
## data: modelo1$residuals
## W = 0.96486, p-value < 2.2e-16
Respecto a la variabilidad de los errores respecto a la línea de regresión lineal del modelo, se puede decir que sigue una condición de heterocedasticidad. Esto significa que la varianza de los residuales no es constante en todas las observaciones y que hay una relación sistemática entre la varianza de los residuales y la variable independiente en el modelo.
##
## studentized Breusch-Pagan test
##
## data: modelo1
## BP = 292.99, df = 1, p-value < 2.2e-16
Finalmente, frente a la existencia, o no, de correlación entre los errores del modelo, el test de Durbin-Watson concluye que existe correlación entre los errores, siendo una correlación positiva.
##
## Durbin-Watson test
##
## data: modelo1
## DW = 1.443, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
Teniendo esto en cuenta, el modelo no cumple con los supuestos lo que puede tener implicaciones en la validez de las estimaciones y las pruebas de hipótesis basadas en el modelo de regresión.
En el caso de los outliers al ser considerados como datos reales válidos pero atipicos, no se considera eliminarlos, por el contrario, se sugiere realizar una transformación de los datos como, por ejemplo, una transformación logaritmica. Para definir la mejor transformación de los datos se empleará el método Box-Cox.
Ahora, con esto en mente, y el valor de lambda de -0.13, quiere decir
que la variable dependiente debe estar en escala logarítmica. Por lo que
se procede a realizar el ajuste en el cambio de modelo como sigue:
##
## Call:
## lm(formula = log(preciom) ~ log(areaconst), data = vivienda4)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.8890 -0.1119 0.0028 0.1343 0.7538
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.48373 0.08703 17.05 <2e-16 ***
## log(areaconst) 0.88175 0.02026 43.52 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1914 on 1361 degrees of freedom
## Multiple R-squared: 0.5819, Adjusted R-squared: 0.5816
## F-statistic: 1894 on 1 and 1361 DF, p-value: < 2.2e-16
Al hacer el ajuste planteado se tiene que con este ajuste, el nuevo modelo estaría explicando el 58.19%. Por lo que no está cambiando mucho, aún así sigue siendo significativamente diferente de 0 ambos coeficientes.
Ahora, evaluando diferentes modelos, se tiene que:
##
## =============================================================================================================================
## Dependent variable:
## ---------------------------------------------------------------------------------------------------------
## preciom log(preciom) preciom (preciomlambda - 1)/lambda preciom0.5 sqrt(preciom)
## (1) (2) (3) (4) (5) (6) (7)
## -----------------------------------------------------------------------------------------------------------------------------
## areaconst 2.165*** 0.009*** 0.005*** 0.071*** 0.071***
## (0.052) (0.0002) (0.0001) (0.002) (0.002)
##
## log(areaconst) 0.882*** 195.419***
## (0.020) (4.445)
##
## Constant 39.047*** 1.484*** 4.551*** -635.532*** 3.446*** 8.728*** 8.728***
## (4.100) (0.087) (0.019) (19.092) (0.010) (0.138) (0.138)
##
## -----------------------------------------------------------------------------------------------------------------------------
## Observations 1,363 1,363 1,363 1,363 1,363 1,363 1,363
## R2 0.560 0.582 0.520 0.587 0.512 0.545 0.545
## Adjusted R2 0.559 0.582 0.519 0.587 0.512 0.545 0.545
## Residual Std. Error 43.339 0.191 0.205 41.982 0.103 1.458 1.458
## F Statistic 1,730.157*** 1,894.288*** 1,473.424*** 1,933.199*** 1,428.335*** 1,629.340*** 1,629.340***
## =============================================================================================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
Al comparar los diferentes modelos, se escoge el modelo que más pueda explicar el comporamiento del precio, en este caso sería el modelo 4, que es: lm, preciom ~ log(areaconst), vivienda4, pues el tamaño de los apartamentos logra explicar el 58.68 % del precio, lo cual significa una pequeña mejora frente al modelo 2. Ahora, con este último modelo que es el que mejor explica el comportamiento, se evaluarán los supuestos nuevamente.
Respecto a los supuestos se tiene que:
##
## Shapiro-Wilk normality test
##
## data: modelo4$residuals
## W = 0.95826, p-value < 2.2e-16
##
## studentized Breusch-Pagan test
##
## data: modelo4
## BP = 214.66, df = 1, p-value < 2.2e-16
##
## Durbin-Watson test
##
## data: modelo4
## DW = 1.4775, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
Lo que quiere decir que aún con el modelo mejor ajustado, los supuestos no se cumplen.
#if(!require(devtools)) install.packages("devtools",repos = "http://cran.us.r-project.org")
#devtools::install_github("dgonxalex80/paqueteMETODOS")
library(paqueteMETODOS)
library(ggplot2)
library(gridExtra)
library(dplyr)
library(cowplot)
library(stargazer)
data(vivienda4)
vivienda_original <- vivienda4
vivienda4 <- vivienda4 %>% filter(tipo=="Apartamento")
# revision de datos faltantes
faltantes <- colSums(is.na(vivienda4))
n_db <- names(vivienda4)
exp_pre <- describe(vivienda4$preciom)
exp_area <- describe(vivienda4$areaconst)
# Boxplot precio
boxplot_precio <- ggplot(vivienda4, aes(y = preciom))+
geom_boxplot() +
labs(x = "Precio (en millones COP)", y = NULL)
# Histograma precio
hist_precio <- ggplot(vivienda4, aes(x = preciom)) +
geom_histogram(fill = "blue", color = "black", alpha = 0.7) +
labs( x = "Precio (en millones COP)", y = "Frecuencia") +
geom_vline(xintercept = exp_pre$mean, color = "red", linetype = "dashed") +
geom_vline(xintercept = exp_pre$median, color = "green", linetype = "dashed")
# Combinar los gráficos con un título general
combined_plot <- plot_grid(hist_precio, boxplot_precio, labels = c("Histograma", "Boxplot"), ncol = 2)
# Agregar un título general
title <- ggdraw() +
draw_label("Distribución de precios de los apartamentos en Cali", fontface = "bold")
# Colocar el título general y los gráficos en una cuadrícula
final_plot <- plot_grid(title, combined_plot, ncol = 1, rel_heights = c(0.1, 1))
# Mostrar el gráfico final
final_plot
# Boxplot precio
boxplot_precio <- ggplot(vivienda4, aes(y = areaconst))+
geom_boxplot() +
labs(x = "Área (en metros cuadrados)", y = NULL)
# Histograma precio
hist_precio <- ggplot(vivienda4, aes(x = areaconst)) +
geom_histogram(fill = "blue", color = "black", alpha = 0.7) +
labs( x = "Área (en metros cuadrados)", y = "Frecuencia") +
geom_vline(xintercept = exp_area$mean, color = "red", linetype = "dashed") +
geom_vline(xintercept = exp_area$median, color = "green", linetype = "dashed")
# Combinar los gráficos con un título general
combined_plot <- plot_grid(hist_precio, boxplot_precio, labels = c("Histograma", "Boxplot"), ncol = 2)
# Agregar un título general
title <- ggdraw() +
draw_label("Distribución de área de los apartamentos en Cali", fontface = "bold")
# Colocar el título general y los gráficos en una cuadrícula
final_plot <- plot_grid(title, combined_plot, ncol = 1, rel_heights = c(0.1, 1))
# Mostrar el gráfico final
final_plot
ggplot(vivienda4, aes(x = areaconst, y = preciom)) +
geom_point() +
geom_smooth(method = "lm", # Agregar la línea de regresión lineal
se = FALSE) + # No mostrar intervalos de confianza
labs(title = "Precio de los apartamentos en Cali en función del área", x = "Área", y = "Precio (millones COP)")
matriz_correlacion <- cor(vivienda4$areaconst, vivienda4$preciom, method = "spearman")
modelo1 <- lm(preciom ~ areaconst, data= vivienda4)
intervalo <- confint(modelo1, level = 0.95)
summary(modelo1)
pred_media <- predict(modelo1, data.frame(areaconst=110), interval = "confidence", level = 0.95)
pred_nov <- predict(modelo1, data.frame(areaconst=110), interval = "predict", level = 0.95)
shapiro.test(modelo1$residuals)
lmtest::bptest(modelo1)
lmtest::dwtest(modelo1)
par(mfrow = c(1,2))
boxcox(lm(vivienda4$preciom ~ vivienda4$areaconst, data=vivienda4), lambda = -3:3)
bc<-boxcox(lm(vivienda4$preciom ~ vivienda4$areaconst), lambda = -1:1)
lambda <- bc$x[which.max(bc$y)]
modelo2 <- lm(log(preciom) ~ log(areaconst), data= vivienda4)
summary(modelo2)
modelo3 <- lm(log(preciom) ~ areaconst, data= vivienda4)
modelo4 <- lm(preciom ~ log(areaconst), data= vivienda4)
modelo5 <- lm((preciom^lambda-1)/lambda ~ areaconst, data = vivienda4)
modelo6 <- lm(preciom^0.5 ~ areaconst, data = vivienda4)
modelo7 <- lm(sqrt(preciom) ~ areaconst, data = vivienda4)
stargazer(modelo1, modelo2, modelo3, modelo4, modelo5, modelo6, modelo7, type = "text", df = FALSE)
shapiro.test(modelo4$residuals)
lmtest::bptest(modelo4)
lmtest::dwtest(modelo4)