Decripción del Problema

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 (vivienda4.RDS)

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 ha diseñado los siguientes pasos para obtener un modelo y así poder a futuro determinar los precios de los inmuebles a negociar

1. Análisis exploratorio

Se realiza para las variables precio de vivienda (millones de pesos COP) y área de la vivienda (metros cuadrados).

# filtramos la base de datos vivienda4 seleccionando solo apartamentos
df1 <- subset(vivienda4, vivienda4$tipo =="Apartamento") 
head(df1)

Después de filtrar la base de datos de vivendas, se observa un total de 1363 apartamentos de estrato 4.

# ordenamos por el precio de más bajo al más alto
df1 <- df1[order(df1$preciom), ]
# muestra la base de datos vivienda4 con las columnas seleccionadas precio y area construida
head(df1 [, c(3, 4)]) 
#asignación de variables x, y
x <- df1$areaconst
y <- df1$preciom
par(mfrow=c(1,4))

hist(x=x, 
     xlab ="Metros Cuadrados", 
     xlim = c(0,200),
     ylim = c(0,0.03),
     col="cyan", 
     main="Histograma [Area]",
     freq=FALSE)

lines(density(x), col = "darkviolet", lwd = 2)

boxplot(x=x,
        xlab="Metros Cuadrados", 
        col="cyan",
        main="Caja [Area]")


hist(x=y, 
     xlab ="Millones COP", 
     xlim = c(0,200),
     ylim = c(0,0.01),
     col="magenta", 
     main="Histograma [Precio]",
     freq=FALSE)

lines(density(y), col = "darkblue", lwd = 2)

boxplot(x=y,
        xlab="Millones COP", 
        ylim = c(50,550),
        col="magenta",
        main="Caja [Precio]")

De la gráfica se puede observar que para la variable area construida, sigue aparentemente una distribución normal, pero para la variable precio no se precisa con certeza esa campana de gauss.

summary(df1)
##            zona      estrato     preciom        areaconst     
##  Zona Centro :   7   3:   0   Min.   : 78.0   Min.   : 40.00  
##  Zona Norte  : 237   4:1363   1st Qu.:153.5   1st Qu.: 60.00  
##  Zona Oeste  :  52   5:   0   Median :185.0   Median : 70.00  
##  Zona Oriente:   2   6:   0   Mean   :202.4   Mean   : 75.48  
##  Zona Sur    :1065            3rd Qu.:240.0   3rd Qu.: 84.00  
##                               Max.   :645.0   Max.   :200.00  
##           tipo     
##  Apartamento:1363  
##  Casa       :   0  
##                    
##                    
##                    
## 
#agrupamos resultados en un data frame
median_area <- median(x)    
mean_area <- mean(x)
sd_area <- sd(x)
median_precio <- median(y) 
mean_precio <- mean(y)
sd_precio <- sd(y)
df_exploratorio <- data.frame(median_area,mean_area,sd_area,median_precio,mean_precio,sd_precio)
df_exploratorio

Anális de los apartamentos de estrato 4:

Las zonas predominantes en las que se encuentran los apartamentos son en la zona Norte y Zona Sur siendo esta última la de mayor cobertura.

Los 1363 apartamentos de estrato 4, comprenden áreas de construcción de 40 a 200 metros cuadrados y precios entre los 78 y 650 millones de peso COP.

Los datos nos revelan que el promedio del área construida de la oferta de viviendas es de 75,48 metros cuadrados, De acuerdo a lo observado en el gráfico de caja, la mediana (70 m2) se encuentra cerca de la media (75,48 m2) y una desviación estándar de 22.56461 confirman una baja dispersión de los datos con una mayor concentración para viviendas con área construida inferior a los 100 m2 lo cual se evidencia en la curva de densidad dibujada sobre el histograma. También podemos precisar que la mitad de las viviendas ofertadas tienen un área construida menor o igual a los 70 m2 y sólo un 25% superan los 84 m2.

Si el promedio de los apartamentos constan de 75,48 metros cuadrados, los agentes de bienes inmuebles deben considerar, que en ese metraje existe la posibilidad de ubicar un espacio de 3 habitaciones, sala, comedor y cocina, lo cual satisface las necesidades en general de una famila de estrato 4.

Los agentes de ventas deben ser atentos al promedio del precio de compra de estos apartamentos, pues los 202.4 millones de pesos son un costo significativo, y es ahí donde los vendedores de bienes inmuebles tienen el gran reto de hacer que las personas adquieran este producto.

Para la variable precio de la oferta de viviendas, la mediana es de 185 millones, para valores que oscilan entre los 78 millones (mínimo) y los 645 millones (máximo). De acuerdo a lo observado en el gráfico de caja, la mediana (185 millones) alejada de la media (202.4373) y una alta desviación estándar (65.29049) confirman una dispersión de los datos aunque sin una concentración de datos tan bien definida, lo cual se evidencia en la curva de densidad dibujada sobre el histograma, con una concentración de precios más o menos homogéneos por debajo y por encima de los 250 millones, con una mayor concentración hacia viviendas más económicas entre los 78 y los 185 millones de pesos colombianos. También podemos precisar que la mitad de las viviendas se oferta a un precio menor o igual a los 185 millones y sólo un 25% están en un rango de costosas superando los 240 millones de pesos colombianos.

2. Análisis Bivariado

Enfocados en la relación entre la variable respuesta (precio) en función de la variable predictora (area construida)

cov_area_precio <- cov(y,x) #covarianza
# Gráfico PerformanceAnalytics
df_area_precio <- data.frame(y, x)
chart.Correlation(df_area_precio, histogram = TRUE)

Observando la gráfica de dispersión podemos destacar una tendencia directa o creciente en la relación del precio de la vivienda y su área construida. Recordemos que el coeficiente de Pearson 0.75 es un indicador que nos ayuda a medir la fuerza de la relación lineal entre un par de variables continuas, podemos destacar una tendencia directa o creciente en la relación del precio de la vivienda y su área construida, lo cual en el negocio de los bienes inmuebles tiene lógica, pues entre más área de construcción tiene una vivienda, más alto es su precio de venta.

Coeficiente de Correlación de Pearson

cor_precio_area<- cor.test(y,x) #coeficiente de correlación de pearson
cor_precio_area
## 
##  Pearson's product-moment correlation
## 
## data:  y and x
## t = 41.595, df = 1361, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.7237938 0.7706237
## sample estimates:
##       cor 
## 0.7481389

Hipótesis alternativa: la correlación verdadera no es igual a 0. Intervalo de confianza del percentil 95 es: 0,7237938 0,7706237

Al tener un valor de (0.75) podemos determinar que la asociación que mide la relación lineal entre el precio y el área construida se considera una correlación positiva alta, pero no del todo perfecta pero tiende ha formar una linealidad.

3. Estimación del modelo

Con respecto al modelo de regresión lineal simple donde y = precio, x = área se tiene la siguiente función

\[precio = f(area)+ε\]

modelo_lineal = lm(y ~ x)
summary(modelo_lineal)
## 
## Call:
## lm(formula = y ~ x)
## 
## 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 <0.0000000000000002 ***
## x            2.16473    0.05204  41.595 <0.0000000000000002 ***
## ---
## 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: < 0.00000000000000022

De acuerdo al modelo lineal calculado anteriormente se tiene la ecuación: \[Y = β_0 + β_1X + ε\] donde:

X, es la variable dependiente o de respuesta, en este caso Área Construida Y, es la variable independiente o predictora, en este caso Precio β0, es el intercepto de la recta con el eje vertical. En este caso igual a 39.04679 β1, se conoce como pendiente y determina la inclinación de la recta. igual a 2.16473

si reemplazamos los valores se consigue:

\[ Precio = 39.04679 + 2.16473(x) + ε\]

En cuanto a la interpretación de los coeficientes, podemos mencionar que β0 no se puede interpretar porque no es coherente considerar alguna vivienda sin área construida o lo que es igual a indicar con cero (0) metros cuadrados construidos.

Para el caso del coeficiente β1 podemos interpretar: que por cada metro cuadrado adicional que tenga la vivienda, el precio de la misma se incrementa en 2.16473 millones de pesos colombianos.

Hipótesis Estadístico de prueba valor p
H0: B0 = 0 9.524 <0.0000000000000002 ***
H1: B0 ≠ 0
H0: B1 = 0 41.595 <0.0000000000000002 ***
H1: B1 ≠ 0

4. intervalo de confianza

construimos el intervalo de confianza para el percentil (95%) para el coeficiente β1.

# Intervalo de confianza del 95%
confint(modelo_lineal, level=0.95)
##                2.5 %    97.5 %
## (Intercept) 31.00423 47.089340
## x            2.06264  2.266826

Con un nivel de confianza del 95% y un 5% de error α, podemos determinar que el coeficiente β1 para el caso del área construida (x) podría tomar un valor entre los 2,06264 y los 2,266826 millones por cada metro cuadrado construido.

Adicionalmente, lo que se logra observar en la prueba de hipotesis t en la tabla de resumen (summary) del modelo de regresión lineal es un P-Value igual <0.0000000000000002 lo que indica un nivel de confianza del 99.9% (***).

En ninguno de los dos casos el coeficiente fue igual a cero (0), por lo cual existe evidencia estadística de que el precio y el área construida están correlacionados y dicha correlación es significativa.

5. Indicador de bondad R2

r2 = summary(modelo_lineal)$r.squared
print( paste("Coeficiente de determinación (R2) es de: ", r2) )
## [1] "Coeficiente de determinación (R2) es de:  0.559711740661315"

El Coeficiente de Determinación también conocido como R2, es una medida de ajuste que indica si finalmente las estimaciones (predicciones) que se logran con la recta de regresión reflejan la realidad.

El R2 del modelo lineal es del 0.559711 que evidencia un buen ajuste a los datos aunque no excelente y nos permite determinar que el área construida de una vivienda explica el 55.97% de la variabilidad de los precios por millón de dichas viviendas.

6. Inferencia parámetros

Anteriormente hemos definido para el modelo lineal que df1$areaconst corresponda a la variable X

confint(object = modelo_lineal, parm="x", level = 0.95)
##     2.5 %   97.5 %
## x 2.06264 2.266826

Predicción de E[Y|xo]

Predicción del precio promedio para un apartamento de 110 metros cuadrados.

predict( modelo_lineal, data.frame(x=110), interval="confidence", level = 0.95 )
##        fit      lwr      upr
## 1 277.1674 272.9573 281.3775

Predicción de Y0

predict(modelo_lineal, data.frame(x=110), interval = "prediction", level = 0.95)
##        fit      lwr      upr
## 1 277.1674 192.0449 362.2899

¿Para un apartamento con 110 m2 el precio es de 200 COP millones sería una buena oferta?

Si el precio promedio esperado de oferta para una vivienda de 110 metros cuadrados es de 277.1674 millones de pesos colombianos. El intervalo de confianza para la predicción del precio nos indica que el promedio estaría entre los 272.9573 - 281.3775 millones de pesos colombianos con un 95% de confianza. Por lo tanto un apartamento de 110 metros cuadrados en la misma zona a un precio de 200 millones es claramente una OFERTA ATRACTIVA para los interesados.

También se debe tener en cuenta los años de antigüedad del inmueble, el valor de la administración, estrato socio-económico, entre otras, así como la elección del modelo de predicción dependiendo de la naturaleza continua o discreta de sus variables y la correlación entre las mismas.

7. Supuestos del modelo

Modelo lineal simple:

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

De la anterior gráfica se puede interpretar:

Supuesto Descripción
Varianza constante un patrón de “abanico”. Es decir, los residuos son cercanos a 0 para valores de x pequeños y están más extendidos para valores de x grandes. problemas de dispersión irregular. En todos los casos la varianza de los residuos aumenta con los valores ajustados, esto indica que la variabilidad de los errores aumenta al aumentar su media.
Normalidad De acuerdo a lo observado en la Gráfica #2 de Normalidad la mayoría de los datos no se ajustan de forma ligera a la línea de normalidad del QQ-Plot, por lo tanto no se cumple el supuesto. líneas hacia arriba o abajo indican asimetrías, curvas en las colas de la distribución
Linealidad De acuerdo a lo observado en la Gráfica #1 “Residuales vs. Valores Ajustados” la variable dependiente parece estar linealmente relacionada con la independiente y lo evidenciamos porque la curva de ajuste en rojo es aproximadamente una recta horizontal. Muestra que para valores ajustados altos, los residuales son grandes

Test de Shapiro - Wilk

#normalidad
shapiro.test(resid(modelo_lineal))
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(modelo_lineal)
## W = 0.96486, p-value < 0.00000000000000022

Como el p valor (0.00000000000000022) es menor a alfa (0,05), se rechaza la hipótesis nula

Test de Breusch-Pagan

#varianza Homocedasticidad
bptest(modelo_lineal)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_lineal
## BP = 292.99, df = 1, p-value < 0.00000000000000022

Como el valor-P es pequeño entonces hay evidencias para rechazar la hipótesis de homocedasticidad.

8. Mejora y supuestos

Transformaciones para linealizar el modelo

modelo_exponencial = lm(formula = log(y) ~ x) # log - lin
modelo_logaritmico = lm(formula = y ~ log(x)) # lin - log  
modelo_dos_logaritmico = lm(formula = log(y) ~ log(x)) # log - log
modelo_inverso = lm(formula = (1/y) ~ x) # 1/lin - lin

Análisis Residuales

# Exponencial
grf_modelo_exponencial <- ggplot(data = df1, aes(y, modelo_exponencial$residuals)) +
  geom_point() +  geom_smooth(color = "darkviolet") + 
  geom_hline(yintercept = 0) + theme_classic() + 
  labs(title = "", 
       x = 'Precio/Millón (COP$)', 
       y = 'Residuos')

# Logarítmico
grf_modelo_logaritmico <- ggplot(data = df1, aes(y, modelo_logaritmico$residuals)) +
  geom_point() +  geom_smooth(color = "darkviolet") + 
  geom_hline(yintercept = 0) + theme_classic() + 
  labs(title = "", 
       x = 'Precio/Millón (COP$)', 
       y = 'Residuos')

ggarrange(grf_modelo_exponencial,
          grf_modelo_logaritmico, 
          widths = c(2,2),
          labels = c("Exponencial", "Logarítmico"))
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

# Dos Logarítmico
grf_modelo_dos_logaritmico <- ggplot(data =df1, aes(y, modelo_dos_logaritmico$residuals)) +
  geom_point() +  geom_smooth(color = "darkorange") + 
  geom_hline(yintercept = 0) + theme_classic() + 
  labs(title = "", 
       x = 'Precio/Millón (COP$)', 
       y = 'Residuos')

# Inverso
grf_modelo_inverso <- ggplot(data = df1, aes(y, modelo_inverso$residuals)) +
  geom_point() +  geom_smooth(color = "darkorange") + 
  geom_hline(yintercept = 0) + theme_classic() + 
  labs(title = "", 
       x = 'Precio/Millón (COP$)', 
       y = 'Residuos')

ggarrange(grf_modelo_dos_logaritmico,
          grf_modelo_inverso, 
           widths = c(2,2),
          labels = c("Dos Lograrítmico", " Inverso"))
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

Interpretación Gáficas

Al aplicar diferentes transformaciones a las variables buscamos aumentar la medida de ajuste y bondad R2. Por tanto, en los R2 obtenidos para las diferentes transformaciones podemos observar que mejora el ajuste a los datos. Además, si observamos los plot de Residuales vs. Precio, podemos determinar que los errores tienden a una media cero (0) con varianza no constante, por lo cual se acépta las técnicas de regresión lineal simple.

9. Comparación Ajuste

Cálculo para modelo polinomial cuadrático y polinomial cúbico

modelo_cuadratico <- lm(y ~ poly(x, 2))
modelo_cubico <- lm(y ~ poly(x, 3))

Modelo_final <- c("Lineal", "Exponencial", "Logaritmico", "Dos Logaritmico", "Inverso","Polinomial Cuadrático", "Polinomial Cúbico")

R_Cuadrado_final <- c(summary(modelo_lineal)$r.squared, 
                summary(modelo_exponencial)$r.squared,
                summary(modelo_logaritmico)$r.squared,
                summary(modelo_dos_logaritmico)$r.squared,
                summary(modelo_inverso)$r.squared,
                summary(modelo_cuadratico)$r.squared,
                summary(modelo_cubico)$r.squared)

modelo_final <- data.frame(Modelo_final, R_Cuadrado_final)
colnames(modelo_final) <- c('Modelos','R cuadrado')
# Cuadrático
grf_modelo_cuadratico <- ggplot(data = df1, aes(y, modelo_cuadratico$residuals)) +
  geom_point() +  geom_smooth(color = "green") + 
  geom_hline(yintercept = 0) + theme_classic() + 
  labs(title = "", 
       x = 'Precio/Millón (COP$)', 
       y = 'Residuos')

# Cúbico
grf_modelo_cubico <- ggplot(data = df1, aes(y, modelo_cubico$residuals)) +
  geom_point() +  geom_smooth(color = "green") + 
  geom_hline(yintercept = 0) + theme_classic() + 
  labs(title = "", 
       x = 'Precio/Millón (COP$)', 
       y = 'Residuos')

ggarrange(grf_modelo_cuadratico, grf_modelo_cubico, labels = c("Polinomial Cuadrático", "Polinomial Cúbico"))
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

Comparación de modelos

ggplot(data=df1, aes(x, y))+
  geom_point()+
  stat_smooth(method="lm", formula= y~x, color="darkviolet", aes(colour = "Lineal"))+
  stat_smooth(method="lm", formula= y~poly(x,2), color="darkorange", aes(colour = "Cuadrática"))+
  stat_smooth(method="lm", formula= y~poly(x,3), color="green", aes(colour = "Cúbica"))

modelo_final

Análisis de modelos

Con cualquiera de los dos modelos mejora un poco la aleatoriedad de los residuales y por lo tanto puede explicar un 58 % la variación del precio de la vivienda, en comparación con el 55.97 % logrado con el modelo lineal simple.

10. Mejor Modelo

stargazer(modelo_lineal, 
          modelo_exponencial,
          modelo_logaritmico, 
          modelo_dos_logaritmico,
          type="text", df=FALSE)
## 
## =======================================================================
##                                     Dependent variable:                
##                     ---------------------------------------------------
##                          y          log(y)         y          log(y)   
##                         (1)          (2)          (3)          (4)     
## -----------------------------------------------------------------------
## x                     2.165***     0.009***                            
##                       (0.052)      (0.0002)                            
##                                                                        
## log(x)                                         195.419***    0.882***  
##                                                 (4.445)      (0.020)   
##                                                                        
## Constant             39.047***     4.551***   -635.532***    1.484***  
##                       (4.100)      (0.019)      (19.092)     (0.087)   
##                                                                        
## -----------------------------------------------------------------------
## Observations           1,363        1,363        1,363        1,363    
## R2                     0.560        0.520        0.587        0.582    
## Adjusted R2            0.559        0.519        0.587        0.582    
## Residual Std. Error    43.339       0.205        41.982       0.191    
## F Statistic         1,730.157*** 1,473.424*** 1,933.199*** 1,894.288***
## =======================================================================
## Note:                                       *p<0.1; **p<0.05; ***p<0.01
stargazer(modelo_cuadratico, 
          modelo_cubico,

          type="text", df=FALSE)
## 
## ================================================
##                         Dependent variable:     
##                     ----------------------------
##                                  y              
##                          (1)            (2)     
## ------------------------------------------------
## poly(x, 2)1          1,802.689***               
##                        (42.184)                 
##                                                 
## poly(x, 2)2          -369.073***                
##                        (42.184)                 
##                                                 
## poly(x, 3)1                        1,802.689*** 
##                                      (41.819)   
##                                                 
## poly(x, 3)2                         -369.073*** 
##                                      (41.819)   
##                                                 
## poly(x, 3)3                         208.469***  
##                                      (41.819)   
##                                                 
## Constant              202.437***    202.437***  
##                        (1.143)        (1.133)   
##                                                 
## ------------------------------------------------
## Observations            1,363          1,363    
## R2                      0.583          0.591    
## Adjusted R2             0.583          0.590    
## Residual Std. Error     42.184        41.819    
## F Statistic           951.371***    653.654***  
## ================================================
## Note:                *p<0.1; **p<0.05; ***p<0.01

Ecuación del modelo lineal

\[ Precio = 39.04679 + 2.16473(x) + ε\]

Ecuación del mejor modelo

los mejores indicadores los tiene el modelo exponencial lm = log(y) ~ x

\[ log(\hat{y})= 4.551 + 0.009(x) + ε\]