Con base en los datos de ofertas de vivienda descargadas del portal Fincaraiz para apartamento de estrato 4 con área construida menor a 200 m^2 (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 a diseñado los siguientes pasos para obtener un modelo y así poder a futuro determinar los precios de los inmuebles a negociar.
library(paqueteMET)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
library(nortest)
library(lawstat)
##
## Attaching package: 'lawstat'
## The following object is masked from 'package:car':
##
## levene.test
1.Realice un análisis exploratorio de las variables precio de vivienda (millones de pesos COP) y área de la vivienda (metros cuadrados) - incluir gráficos e indicadores apropiados interpretados.
data(vivienda4)
names(vivienda4)
## [1] "zona" "estrato" "preciom" "areaconst" "tipo"
Primero se realiza el filtro en la base de datos, teniendo en cuenta que existen tanto apartamentos como casas, ya que el analisis apunta a apartamentos estrato 4 con área menor a 200m^2
vivienda4 %>% filter(tipo=="Apartamento")-> vivienda4_
vivienda4_ %>% filter(estrato==4)-> vivienda4_
vivienda4_ %>% filter(areaconst<200)-> vivienda4_
Se fijará variables para las columnas precios y área de la base vivienda4_,
Precio <- vivienda4_$preciom
Area <- vivienda4_$areaconst
summary(Precio)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 78 153 185 202 240 645
par(mfrow=c(1,2))
boxplot(Precio, main='Precio (Millones)', ylab='Precio', col = 'blue')
Realizando un analisis descriptivo a partir del precio nos damos cuenta que el apartamento más económico es de 78 millones de pesos y el más costoso vale 645 millones de pesos, los apartamentos en promedio tienen un valor de 202 millones, y en cuanto al gráfico de cajas nos muestra que la distribución a partir del precio presenta un sesgo hacia la derecha a causa de valores atípicos, asi como confirma que los precios en su mayoria estan al rededor de los 200 millones de pesos.
summary(Area)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 40.0 60.0 70.0 75.2 83.0 198.0
par(mfrow=c(1,2))
boxplot(Area, main='Area (m^2)', ylab='Area', col = 'blue')
Por lado del área de los predios a partir del analisis descriptivo se evidencia que el apto más pequeño mide 40m^2 y el más grande teniendo en cuenta que estamos revisando los menores a 200m^2 mide 198m^2, los aptos en promedio estan midiendo 75.2m^2, y en cuanto al gráfico de cajas nos muestra que la distribución a partir del área de igual manera que en el precio, presenta un sesgo hacia la derecha a causa de valores atípicos, asi como confirma que la mayoria de los apartamentos miden al rededor de 75.2m^2.
mode <- function(Precio) {
return(as.numeric(names(which.max(table(Precio)))))
}
mode(Precio)
## [1] 150
mode(Area)
## [1] 60
Por otro lado el precio mas recurrente en los apartamentos de estrato 4 con área menor a 200 m^2 es 150 millones de pesos colombianos y el área que más se repite en los mismos es de 60m^2.
plot(Area, Precio, main='Área (m^2) vs Precio (Millones)', xlab='Área', ylab='Precio', col='blue')
Graficamente se evidencia que existe una correlación de manera directa
pues a mayor área del predio mayor valor tiene, sin embargo a
continuación se realizará la comprobación a partir del coeficiente de
correlación.
cor(Area, Precio)
## [1] 0.7431338
La correlación es buena teniendo en cuenta que tiene un valor cercano a 1, sin embargo podria llegar a ser mejor.
Regresion <- lm(Precio ~ Area)
summary(Regresion)
##
## Call:
## lm(formula = Precio ~ Area)
##
## Residuals:
## Min 1Q Median 3Q Max
## -228.412 -23.589 -4.653 25.674 207.336
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 36.62292 4.20667 8.706 <2e-16 ***
## Area 2.19868 0.05372 40.926 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 43.21 on 1358 degrees of freedom
## Multiple R-squared: 0.5522, Adjusted R-squared: 0.5519
## F-statistic: 1675 on 1 and 1358 DF, p-value: < 2.2e-16
El coeficiente estimado Bo= corresponde a 36.62 El coeficiente estimado B1=2.1986 Por lo cual la ecuación dada para precio es Precio= 36.62+2.19X
confint(Regresion, level = 0.95)
## 2.5 % 97.5 %
## (Intercept) 28.370647 44.875201
## Area 2.093294 2.304074
summary(Regresion)$coefficients
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 36.622924 4.20667014 8.705918 8.972924e-18
## Area 2.198684 0.05372357 40.925877 3.301551e-239
Teniendo en cuenta que en la regresión lineal que habiamos realizado antes, teniamos el P-valor aproximadamente igual a cero y el intervalo de confianza menor a 2.09, a partir de la hipotesis nula que relaciona B1 igual 0 y la Hipotesis alternativa donde B1 es diferente de cero, se evidencia que al caer el P-valor en la zona de rechazo, se rechaza la hipotesis nula, por tanto B1 no es igual a cero.
summary(Regresion)$r.squared
## [1] 0.5522478
El R^2 debe ser cercano a uno para lograr interpretar la mayor cantidad de puntos, según el resultado a partir del modelo se logra un indicador de variación de 55% que no es malo pero podria mejorar.
¿Cuál sería el precio promedio estimado para un apartamento de 110 metros cuadrados? Considera entonces con este resultado que un apartamento en la misma zona con 110 metros cuadrados en un precio de 200 millones sería una atractiva esta oferta? ¿Qué consideraciones adicionales se deben tener?.
Precio=36.622924+2.198684(Area)
Precio=36.622924+2.198684(110)
Precio=278.478164El precio promedio de un apto de 110m^2 corresponde a 278 millones de pesos aproximadamente, por lo cual un apto con el mismo área y en un valor de 200 millones de pesos es una oferta muy atractiva, se debe considerar de igual manera que es un estimado inicial por lo cual no es 100% confiable.
Residuales <- Regresion$residuals
Val_ajustados <- Regresion$fitted.values
Prueba de linealidad
plot(Area, Precio, main='Área (m^2) vs Precio (Millones)', xlab='Área', ylab='Precio', col='red')
abline(Regresion, col = "blue")
cor(Area, Precio)
## [1] 0.7431338
Teniendo en cuenta la relación que se presenta a traves del grafico de dispersión, se observa una correlación lineal positiva entre las variables analizadas. De manera que, según la data conforme las viviendas tienen una mayor área el precio de las mismas aumenta de manera considerable.
Normalidad
par(mfrow=c(1,2))
hist(Residuales, main="Histograma", xlab="Residuales", ylab="Frecuencia", col="blue")
qqnorm(Residuales, main="QQplot", xlab="Q teóricos", ylab="Q muestra", col="red")
qqline(Residuales, col = "blue", lwd="1")
Esta prueba de normalidad revisa si la distribución de los datos es
normal, en el gráfico de histograma se evidencia que todas las medidas
de los datos se encuentran dentro de normalidad, mientras que en la
grafica QQPlot se realiza una comparación entre los datos ajustados y la
linea teorica dando claridad, pensando en mejorar el modelo se pueden
encontrar diferentes variables como el tiempo de uso del apartamento o
acabados del mismo, para corroborar los resultados dados a partir de la
grafica se va a realizar a continuación un test con el fin de ratificar
los datos de normalidad.
Shapiro-Wilk
shapiro.test(Residuales)
##
## Shapiro-Wilk normality test
##
## data: Residuales
## W = 0.96464, p-value < 2.2e-16
Este Test busca revisar si los datos siguen una distribución normal, en esta caso especifico se indica que el intervalo de confianza corresponde a 0.9646 y el P-valor es cercano a cero, por lo cual se rechaza la hipotesis nula.
Homocedasticidad
plot(Val_ajustados, Residuales, main="Val_ajustados Vs Residuales", xlab="Val_ajustados", ylab="Residuales", col="red")
abline(0,0, col="blue")
Esta prueba revisa que la varianza de los errores sea contante, para este caso al revisarse en la gráfica se evidencia que no es homocedastico.
Breusch-Pagan
bptest(Regresion)
##
## studentized Breusch-Pagan test
##
## data: Regresion
## BP = 303.81, df = 1, p-value < 2.2e-16
Teniendo en cuenta que la homocedasticidad se rechaza se utiliza este test para revisar que los valores estimados se comportan de la misma manera que los valores teoricos.
Independencia
Row <- row.names(vivienda4_)
plot(Precio, Residuales, xlab="Precio", ylab="Residuales", main = "Precio vs Residuales", col="blue")
Esta prueba revisa que los valores estimados se comportan de la misma manera que los valores teoricos, en esta caso a medida que crece el Precio, crece los valores residuales.
Durbin-Watson:
durbinWatsonTest(Regresion)
## lag Autocorrelation D-W Statistic p-value
## 1 0.2791007 1.438078 0
## Alternative hypothesis: rho != 0
Esta prueba se utiliza para detectar la presencia de autocorrelación en los residuos de un analisis de la regresión.
Trf <- log(Area)
Regresion1 <- lm(Precio ~ Trf)
summary(Regresion1)
##
## Call:
## lm(formula = Precio ~ Trf)
##
## Residuals:
## Min 1Q Median 3Q Max
## -195.847 -21.239 -1.573 22.108 261.907
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -633.526 19.397 -32.66 <2e-16 ***
## Trf 194.944 4.518 43.15 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 41.94 on 1358 degrees of freedom
## Multiple R-squared: 0.5782, Adjusted R-squared: 0.5779
## F-statistic: 1862 on 1 and 1358 DF, p-value: < 2.2e-16
A pesar de realizar la transformación a partir del logaritmo en la variable del área, el modelo no mejoro significativamente debido a que el R^2 en el modelo paso de 55% a 57% la explicación de la variabilidad de los datos.
Val_ajustados1 <- Regresion1$fitted.values
Residuales1 <- Regresion1$residuals
plot(Trf, Precio, main='Log(Área (m^2)) vs Precio (Millones)', xlab='Logaritmo (Área)', ylab='Precio', col='red')
abline(Regresion1, col = "blue")
Validación
par(mfrow=c(2,2))
hist(Residuales1, main="Histograma", xlab="Residuales", ylab="Frecuencia", col="red")
qqnorm(Residuales1, main="QQplot", xlab="Q teóricos", ylab="Q muestra", col="blue")
qqline(Residuales1, col = "red", lwd="1")
plot(Val_ajustados1, Residuales1, main="Val_ajustados vs Residuales", xlab="Val_ajustados", ylab="Residuales", col="red")
abline(0,0, col="blue")
plot(Precio, Residuales1, xlab="Precio", ylab="Residuales", main = "Precio vs Residuales", col="blue")
shapiro.test(Residuales1)
##
## Shapiro-Wilk normality test
##
## data: Residuales1
## W = 0.95777, p-value < 2.2e-16
Este Test busca revisar si los datos siguen una distribución normal, en esta caso especifico se indica que el intervalo de confianza corresponde a 0.95777 y el P-valor es cercano a cero, por lo cual se rechaza la hipotesis nula.
bptest(Regresion1)
##
## studentized Breusch-Pagan test
##
## data: Regresion1
## BP = 217.76, df = 1, p-value < 2.2e-16
Esta prueba revisa que los valores estimados se comportan de la misma manera que los valores teoricos.
durbinWatsonTest(Regresion1)
## lag Autocorrelation D-W Statistic p-value
## 1 0.2580271 1.479578 0
## Alternative hypothesis: rho != 0
Esta prueba se utiliza para detectar la presencia de autocorrelación en los residuos de un analisis de la regresión.
Valores atipicos
Q1_Area <- quantile(Area, 0.25)
Q3_Area <- quantile(Area, 0.75)
IQR_Area <- Q3_Area - Q1_Area
lim_inf_Area <- Q1_Area - 2 * IQR_Area
lim_sup_Area <- Q3_Area + 2 * IQR_Area
Q1_Precio <- quantile(Precio, 0.25)
Q3_Precio <- quantile(Precio, 0.75)
IQR_Precio <- Q3_Precio - Q1_Precio
lim_inf_Precio <- Q1_Precio - 1.5 * IQR_Precio
lim_sup_Precio <- Q3_Precio + 1.5 * IQR_Precio
datos <- vivienda4_[,c("preciom", "areaconst")]
datos1 <- datos[datos$areaconst > lim_inf_Area & datos$areaconst < lim_sup_Area,]
data <- datos1[datos1$preciom > lim_inf_Precio & datos1$preciom < lim_sup_Precio,]
Area1 <- data$areaconst
Precio1 <- data$preciom
plot(Area1, Precio1)
Los modelos estimados no cumplen con los supuestos de normalidad, homocedasticidad e independencia, esto podria ser en primera medida debido a que el sesgo de las variables del precio y área era demasiado grande y no permitio desde el principio generar un modelo confiable.
Para futuros trabajos se recomienda utilizar estrategias de limpieza de datos que permitan mejorar la calidad de información. Una de las desventajas del uso de modelos de regresión lineal es que son altamente influenciables por los valores atipicos, en este tipo de situaciones es necesario revisar los datos con el fin de corregirlos o eliminarlos, como por ejemplo la variable Precio que tenia valores muy alejados hacia los extremos superiores.
Pese a que se tiene un coeficiente de correlación alto entre las variables consideradas, esta no es condicion suficiente para garantizar un buen ajuste del modelo y por ende unas buenas predicciones. En este caso estamos viendo que a mayor área es mayor el precio a pagar por los predios, por lo tanto es necesario considerar otro tipo de factores tanto endogenos como exogenos que pueden influir en el rendimiento del modelo.