En la actualidad el sector inmobiliario es altamente competitivo, por lo tanto las distintas entidades en este sector deben estar preparadas para realizar las mejores ofertas a sus clientes sin perder una competencia sana con su benchmark. A raíz de esta necesidad, variables tan importantes para los clientes como el precio de los inmuebles han tenido la necesidad de ser cálculadas mediante modelos que evalúen diferentes características, con el fin de asegurar el mejor precio.
Para la inmobiliaria A&C esta necesidad es una realidad, y es por esto que se propone por medio de un análisis y los datos de oferta obtenidos en Fincaraíz crear un módelo que permita predecir el precio de un inmueble con ciertas características.
A continuación se importan los datos de oferta de la plataforma Fincaraíz para realizar el modelo de estimación de precios para la inmobiliaria A&c, con las siguientes características:
#librerias con información inicial
devtools::install_github("dgonxalex80/paqueteMETODOS")
library(paqueteMETODOS)
data(vivienda4)
#data set con las características descritas anteriormente
aptos=subset(vivienda4, vivienda4$tipo=="Apartamento" & vivienda4$estrato==4 & vivienda4$preciom<=200)
En esta sección instalaremos e importaremos las demás librerías necesarias para la ejecución del proceso.
library(paqueteMET)
library(ggplot2)
library(psych)
library(dplyr)
library(tidyverse)
library(mice)
Con el fin de predecir el precio, se plantea la creación de un modelo por medio de RLS en función de el área de las viviendas tipo Apartamento. Los pasos ejecutados se describen a continuación:
Inicialmente, vamos a realizar un análisis del dataset general y de las variables precio y área construída, las cuales utilizaremos en el ejercicio.
summary(aptos)
## zona estrato preciom areaconst tipo
## Zona Centro : 4 3: 0 Min. : 78 Min. : 40.00 Apartamento:769
## Zona Norte :124 4:769 1st Qu.:140 1st Qu.: 58.00 Casa : 0
## Zona Oeste : 35 5: 0 Median :156 Median : 60.00
## Zona Oriente: 0 6: 0 Mean :157 Mean : 64.47
## Zona Sur :606 3rd Qu.:170 3rd Qu.: 70.00
## Max. :200 Max. :160.00
hist(aptos$preciom)
hist(aptos$areaconst)
Como podemos ver, el dataset de apartamentos tiene una fuerte
concentración de inmuebles en la Zona Sur, con precios en el rango de
78mm hasta 200mm y áreas construidas entre los 40m2 y los 160m2. Los
precios aparentemente tienen una distribución normal con sesgo a la
derecha, y el área construída está sesgada hacia la izquierda.
De manera gráfica vemos que los datos en relación área construída y precio se concentran en el cuadrante superior izquierdo, mostrando una especie de relación lineal entre estos datos.
plot(aptos$areaconst,aptos$preciom)
De igual forma, al calcular el índice de correlación de las variables
vemos que tienen una relación lineal postiva débil, lo cual soporta lo
visto en la gráfica anterior.
cor(aptos$areaconst,aptos$preciom)
## [1] 0.4418913
Centrados en la solicitud de A&C, realizamos un análisis sobre la relación de precios y área construida.
modelo1<-lm(preciom~areaconst, data=aptos)
summary(modelo1)
##
## Call:
## lm(formula = preciom ~ areaconst, data = aptos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -78.23 -12.11 0.15 11.66 49.40
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 108.44962 3.62651 29.91 <2e-16 ***
## areaconst 0.75273 0.05518 13.64 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 19.53 on 767 degrees of freedom
## Multiple R-squared: 0.1953, Adjusted R-squared: 0.1942
## F-statistic: 186.1 on 1 and 767 DF, p-value: < 2.2e-16
Como resultado de esto, entre las vaiables existe una relación positiva, en la que el precio aumenta si el área construída aumenta.
Para evaluar el modelo, realizaremos una prueba de hipótesis en la que: H0: p-value=0 H1: p-value != 0
Para esto traemos nuevamente el resumen del modelo anterior:
summary(modelo1)
##
## Call:
## lm(formula = preciom ~ areaconst, data = aptos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -78.23 -12.11 0.15 11.66 49.40
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 108.44962 3.62651 29.91 <2e-16 ***
## areaconst 0.75273 0.05518 13.64 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 19.53 on 767 degrees of freedom
## Multiple R-squared: 0.1953, Adjusted R-squared: 0.1942
## F-statistic: 186.1 on 1 and 767 DF, p-value: < 2.2e-16
t_critic=qt(0.05,767)
t_critic
## [1] -1.646843
confint(object = modelo1, parm="areaconst", level = 0.95)
## 2.5 % 97.5 %
## areaconst 0.6444181 0.8610474
Como podemos ver, el valor para el estadístico T es igual a 13.64, pero el valor crítico para T a un nivel de significancia del 0.05 p-value=2.2e-16. Por tanto podemos rechazar la hipótesis nula de que el coeficiente es igual a 0.
Para el indicador de bondad R2, de acuerdo con los resulatdos del modelo planteado vemos que el modelo se explica un 19,42% por tanto podemos concluir que un modelo con únicamente la variable área construída explica de manera débil el precio de un inmueble.
summary(modelo1)
##
## Call:
## lm(formula = preciom ~ areaconst, data = aptos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -78.23 -12.11 0.15 11.66 49.40
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 108.44962 3.62651 29.91 <2e-16 ***
## areaconst 0.75273 0.05518 13.64 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 19.53 on 767 degrees of freedom
## Multiple R-squared: 0.1953, Adjusted R-squared: 0.1942
## F-statistic: 186.1 on 1 and 767 DF, p-value: < 2.2e-16
A modo de prueba del modelo realizado, vamos a calcular el precio para un apartamento con área estimada de 110m2.
predict(modelo1, data.frame(areaconst=110), interval = "confidence", level = 0.95)
## fit lwr upr
## 1 191.2502 186.129 196.3714
Como podemos observar, para un área de 110m2, el modelo predice un precio de 191.25mm, con un 95% de confianza que el precio real puede variar en el intervalo de 186.13mm y 196.37mm.
Luego de el ejemplo anterior comprobando que el modelo funciona, evaluaremos los supuestos del modelo.
En el primer supuesto que es normalidad podemos apreciar que los errores no siguen una distribución normal, con un p-value=1.26%
shapiro.test(modelo1$residuals)
##
## Shapiro-Wilk normality test
##
## data: modelo1$residuals
## W = 0.99498, p-value = 0.01255
Al evaluar el supuesto de varianza constante podemos apreciar que por medio del test de Breusch-Pagan existe heteroscedasticidad en los residuos del modelo, lo cual se rectifica con la prueba de Goldfeld-Quandt. Teniendo en cuenta lo anterior podemos concluir que es necesaria una transformación del modelo más adelante.
lmtest::bptest(modelo1)
##
## studentized Breusch-Pagan test
##
## data: modelo1
## BP = 23.789, df = 1, p-value = 1.075e-06
lmtest::gqtest(modelo1)
##
## Goldfeld-Quandt test
##
## data: modelo1
## GQ = 0.89347, df1 = 383, df2 = 382, p-value = 0.8645
## alternative hypothesis: variance increases from segment 1 to 2
Sobre el supuesto de no autocorrelación de errores, la prueba Durbin-Watson nos indica que existe autocorrelación positiva en los errores del modelo, violando este supuesto de la regresión lineal.
lmtest::dwtest(modelo1)
##
## Durbin-Watson test
##
## data: modelo1
## DW = 1.4354, p-value = 2.036e-15
## alternative hypothesis: true autocorrelation is greater than 0
A contiuación veremos las interpretaciones anteriores de manera gráfica:
par(mfrow=c(2,2))
plot(modelo1)
Luego de evaluar los supuestos del modelo, se puede concluir que es necesario realizar una transformación del modelo, por tanto por medio de una transformación BOXCOX identificaremos cuál sería la transformación ideal para este modelo.
library(MASS)
bc <- boxcox(lm(preciom~areaconst, data=aptos), lambda = -2:2)
lambda <- bc$x[which.max(bc$y)]
lambda
## [1] 1.070707
Teniendo en cuenta lo anterior y el resultado de lambda, realizaremos la transformación lineal de y y evaluaremos nuevamente los supuestos. En este nuevo modelo calculado, vemos que el modelo explica un 18.48% de la variable precio, y se rechaza la hipótesis nula de que el coeficiente es igual a 0.
modelo2<-lm(log(preciom)~areaconst, data=aptos)
summary(modelo2)
##
## Call:
## lm(formula = log(preciom) ~ areaconst, data = aptos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.60115 -0.07365 0.00970 0.08108 0.29260
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.7377024 0.0237725 199.29 <2e-16 ***
## areaconst 0.0047860 0.0003617 13.23 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.128 on 767 degrees of freedom
## Multiple R-squared: 0.1859, Adjusted R-squared: 0.1848
## F-statistic: 175.1 on 1 and 767 DF, p-value: < 2.2e-16
Sobre los supuestos del modelo podemos concluir que los errores no siguen una distribución normal, el modelo es heteroscedastico y los errores están autocorrelacionados.
shapiro.test(modelo2$residuals)
##
## Shapiro-Wilk normality test
##
## data: modelo2$residuals
## W = 0.982, p-value = 4.028e-08
lmtest::bptest(modelo2)
##
## studentized Breusch-Pagan test
##
## data: modelo2
## BP = 6.8852, df = 1, p-value = 0.008691
lmtest::dwtest(modelo2)
##
## Durbin-Watson test
##
## data: modelo2
## DW = 1.4277, p-value = 8.626e-16
## alternative hypothesis: true autocorrelation is greater than 0
Para los resultados del modelo1 (modelo inicial) y el modelo transformado (log de y) podemos realizar la siguiente comparación:
tibble(
Modelo = c("Modelo inicial", "Modelo transf. lineal Y"),
R_cuadrado = c(summary(modelo1)$r.squared, summary(modelo2)$r.squared),
error_cuadrático_medio = c(summary(modelo1)$sigma^2, summary(modelo2)$sigma^2),
error_estándar_de_estimación = c(summary(modelo1)$sigma, summary(modelo2)$sigma)
)
Como podemos ver en la tabla anterior, el modelo inicial tiene una mejor explicación del resultado de precio de acuerdo con el área construída, pero el modelo con la transformación lineal de Y (log) tiene un menor error cuadrático medio, mostrando un mejor ajuste del modelo de datos.
Para comprobar si hay otras transformaciones que permitan un modelo más ajustado, realizaremos la prueba con 4 distintos modelos (el modelo inicial incluido) y compararemos los resultados.
modelo3=lm(preciom~log(areaconst), data=aptos) # Lin - Log
modelo4=lm(log(preciom)~log(areaconst), data=aptos) # Log - Log
tibble(
Modelo = c("Modelo Lin-Lin", "Modelo Log-Lin", "Modelo Lin-Log", "Modelo Log-Log"),
R_cuadrado = c(summary(modelo1)$r.squared, summary(modelo2)$r.squared, summary(modelo3)$r.squared, summary(modelo4)$r.squared),
R_cuadrado_aj = c(summary(modelo1)$adj.r.squared, summary(modelo2)$adj.r.squared, summary(modelo3)$adj.r.squared, summary(modelo4)$adj.r.squared),
error_cuadrático_medio = c(summary(modelo1)$sigma^2, summary(modelo2)$sigma^2, summary(modelo3)$sigma^2, summary(modelo4)$sigma^2)
)
Como podemos ver en la tabla anterior, el modelo que más explica la predicción de Y(precio) con un 23.13% de probabilidad es el modelo 3 Lin-Log (tranformación de la variable área), pero en cuanto al error cuadrático medio, vemos que el modelo con menor error es el modelo 4 Log-Log (transformación de X y Y)
De acuerdo con los ejercicios realizados anteriormente y la evaluación de supuestos podemos concluir que:
El precio no es posible predecirse únicamente por la variable área construída, ya que si bien tienen una correlación media estas dos variables, no es suficiente para ser un buen predictor del precio en la forma de modelo de regresión lineal simple o en cualquiera de sus transformaciones.
Partiendo del comportamiento de las variables precio y área construida es posible que incluso al agregar nuevas variables para hacer más robusto el modelo puede ser necesaria una transformación que habría que evaluarse por medio de boxcox.
Los modelos planteados en el ejercicio anterior no son útiles para oredecir el valor de precio de acuerdo con valores de área construida, generalizando que los valores que se predicen en el modelo serán similares a los valores actuales en la base de datos.