Introducción

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:

  1. Tipo vivienda: Apartamentos
  2. Estrato: 4
  3. Área construida: menor a 200m2
#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)

Pasos

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:

Paso 1: Análisis exploratorio por variable

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.

Paso 2: Análisis exploratorio bivariado

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

Paso 3: Estimación del modelo RLS

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.

Paso 4: Prueba de hipótesis

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.

Paso 5: Indicador de bondad R2

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

Paso 6: Escenario de estimación

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.

Paso 7: Validación de supuestos del modelo RLS

Luego de el ejemplo anterior comprobando que el modelo funciona, evaluaremos los supuestos del modelo.

Normalidad

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

Varianza constante

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

No autocorrelación de errores

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

Visualización gráfica de los supuestos

A contiuación veremos las interpretaciones anteriores de manera gráfica:

par(mfrow=c(2,2))
plot(modelo1)

Paso 8: Transformación del modelo y supuestos

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

Paso 9: Comparación modelo inicial - modelo transformado

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.

Paso 10: Estimación de otros modelos

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)

Resultados y Conclusiones

De acuerdo con los ejercicios realizados anteriormente y la evaluación de supuestos podemos concluir que:

  1. 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.

  2. 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.

  3. 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.