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
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)]) 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.
## 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_exploratorioLas 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.
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.
##
## 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.
Con respecto al modelo de regresión lineal simple donde y = precio, x = área se tiene la siguiente función
\[precio = f(area)+ε\]
##
## 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 |
construimos el intervalo de confianza para el percentil (95%) para el coeficiente β1.
## 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.
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.
Anteriormente hemos definido para el modelo lineal que df1$areaconst corresponda a la variable X
## 2.5 % 97.5 %
## x 2.06264 2.266826
Predicción del precio promedio para un apartamento de 110 metros cuadrados.
## fit lwr upr
## 1 277.1674 272.9573 281.3775
## 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.
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
##
## 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
##
## 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.
# 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")'
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.
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")'
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"))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.
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
##
## ================================================
## 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
\[ Precio = 39.04679 + 2.16473(x) + ε\]
los mejores indicadores los tiene el modelo exponencial lm = log(y) ~ x
\[ log(\hat{y})= 4.551 + 0.009(x) + ε\]