library(readxl)
datos =read_excel("C:/Mesa/datos_vivienda.xlsx")
1.1. Se observa que la base de datos contiene información sobre el registro de los precios de vivienda -“millones de pesos COP” (y) de las viviendas en relación con el área de la vivienda(x) en metros cuadrados.
1.2. Se observa que el promedio de los precios es 332.1 millones de pesos con una desviación estándar de $ 82.14423, mientras el promedio del área construida es 115.7 M2 con una desviación estándar de 35.54 M2, también se observa que las viviendas con área construida de 170 M2 tienen la mayor variabilidad del precio.
attach(datos)
summary(datos)
## Area_contruida precio_millon
## Min. : 80.0 Min. :240.0
## 1st Qu.: 86.0 1st Qu.:251.2
## Median : 97.0 Median :305.0
## Mean :115.7 Mean :332.1
## 3rd Qu.:130.0 3rd Qu.:395.0
## Max. :195.0 Max. :480.0
desvest_Area_contruida = sd(Area_contruida, na.rm = TRUE)
desvest_precio_millon = sd(precio_millon , na.rm = TRUE)
desvest=data.frame(desvest_Area_contruida,desvest_precio_millon)
desvest
| desvest_Area_contruida | desvest_precio_millon |
|---|---|
| 35.54332 | 82.14423 |
with(datos, boxplot(precio_millon ~ Area_contruida, ylab='Precio (millones)'))
Veamos la correlación entre Area_contruida y precio_millon Se observa que a mayor Area_contruida el precio aumenta y su relación es fuerte de acuerdo con el coeficiente de correlación de Pearson (0,919).
plot(Area_contruida, precio_millon,main = "Diagrama de dispersión",xlab = "Área construida", ylab = "Precio por millón ",pch=16)
cor(Area_contruida,precio_millon,use ="complete.obs" )
## [1] 0.9190295
Se observa que el coeficiente \(\beta_0\) no se debe interpretar por que no se observan valores areas construidas en cero. Por otro lado el \(\beta_1=2.124\) nos indica que por cada metro cuadrado que se aumente el precio se incrementa en 2,124 pesos.
De igual forma el area construida tiene codigos de significancia ***, signfica que su relación es estructural con el precio de la vivienda
Ecuación de regresión \(precio(area)\)=\(86.234\)+\(2.124\)*\(area\)
mod=lm(precio_millon~Area_contruida,data=datos)
summary(mod)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -51.673 -25.612 -6.085 24.875 67.650
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 86.234 22.479 3.836 0.000796 ***
## Area_contruida 2.124 0.186 11.422 3.45e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 33.05 on 24 degrees of freedom
## Multiple R-squared: 0.8446, Adjusted R-squared: 0.8381
## F-statistic: 130.5 on 1 and 24 DF, p-value: 3.45e-11
El efecto que tiene área construida en el precio oscila entre 1.759447 y 2.488553, como el cero no está incluido en el intervalo esto reafirma la significancia del área frente al precio de la vivienda
t=qnorm(0.975)
li=2.124 -(t* 0.186)
ls=2.124 +(t* 0.186)
inter_conf=data.frame(li,ls)
inter_conf
| li | ls |
|---|---|
| 1.759447 | 2.488553 |
confint(object=mod, level=0.95)
## 2.5 % 97.5 %
## (Intercept) 39.83983 132.627917
## Area_contruida 1.74017 2.507771
Adicionalmente se observa que el coeficiente es significativamente distinto de cero. Se observa que el ajuste del modelo es de \(R^2=0.8446\) es decir que el modelo explica el 84% de la variabilidad de los precios de las vivivendas.
summary(mod)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -51.673 -25.612 -6.085 24.875 67.650
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 86.234 22.479 3.836 0.000796 ***
## Area_contruida 2.124 0.186 11.422 3.45e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 33.05 on 24 degrees of freedom
## Multiple R-squared: 0.8446, Adjusted R-squared: 0.8381
## F-statistic: 130.5 on 1 and 24 DF, p-value: 3.45e-11
6.1 De acuerdo con las estimaciones del modelo para un área de 110 m2 el precio promedio estimado seria de $ 319.87
6.2 Realizando la estimación con el modelo y considerando los intervalos de confianza tomado el menor precio promedio $ 306.3133, la oferta de 200 millones es 53% más alta, lo que constituye una muy buena oferta.
6.3 Se debe considerar también el error de estimación del modelo, el cual determina la probabilidad de que esa estimación se ajuste a la realidad de los datos, por otro lado, para determinar el precio de una vivienda pueden influir otros factores como el tipo de vivienda, ubicación, condiciones de seguridad, distancia a centros comerciales, red de salud pública, colegios, entro otros.
precio=predict(mod,list(Area_contruida=110))
precio
## 1
## 319.8706
precio_intervalos=predict(mod,list(Area_contruida=110),interval = "confidence")
precio_intervalos
## fit lwr upr
## 1 319.8706 306.3133 333.4279
Nota: Los valores ajustados \(y^i\) y los residuos \(ei\)=\(y^i\)−\(yi\) se pueden obtener con los comandos fitted y residuals respectivamente. Los residuos estandarizados se obtienen con rstandard
residuos = rstandard(mod)
valores.ajustados = fitted(mod)
plot(valores.ajustados, residuos, main = "Residuos estandarizados vs valores ajustados")
par(mfrow=c(2,2))
plot(mod)
8.1 Se transforma el modelo a hiperbólico
x=1/Area_contruida
mod_ajustado=lm(precio_millon~x,data=datos)
summary(mod_ajustado)
##
## Call:
## lm(formula = precio_millon ~ x, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -36.987 -16.743 -5.023 18.547 44.379
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 635.35 18.27 34.77 < 2e-16 ***
## x -32464.72 1895.32 -17.13 5.84e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 23.05 on 24 degrees of freedom
## Multiple R-squared: 0.9244, Adjusted R-squared: 0.9212
## F-statistic: 293.4 on 1 and 24 DF, p-value: 5.839e-15
9.1 Se observa que mejora el supuesto de aleatoriedad de los errores grafica 5 y mejora la normalidad grafica 6 respecto al modelo anterior
9.2 Se oberva que se mejora el ajuste del modelo de 0,84 a 0,92 lo que se concluye que el modelo ajustado explica en un 92% la variabilidad de los precios de las viviendas.
9.3 Se calcula la predicción con el nuevo modelo y arroja para un área de 110 m2 el precio promedio pasa de $319.87 a $340.216 que corresponde a un 6,36% de incremento
9.4 El modelo ajustado haciendo la validación cruzada con la tecnica MAE se obtiene un 6,2% de probabilidad de error de predicción, lo que constituye un buen modelo predictivo.
summary(mod)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -51.673 -25.612 -6.085 24.875 67.650
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 86.234 22.479 3.836 0.000796 ***
## Area_contruida 2.124 0.186 11.422 3.45e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 33.05 on 24 degrees of freedom
## Multiple R-squared: 0.8446, Adjusted R-squared: 0.8381
## F-statistic: 130.5 on 1 and 24 DF, p-value: 3.45e-11
summary(mod_ajustado)
##
## Call:
## lm(formula = precio_millon ~ x, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -36.987 -16.743 -5.023 18.547 44.379
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 635.35 18.27 34.77 < 2e-16 ***
## x -32464.72 1895.32 -17.13 5.84e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 23.05 on 24 degrees of freedom
## Multiple R-squared: 0.9244, Adjusted R-squared: 0.9212
## F-statistic: 293.4 on 1 and 24 DF, p-value: 5.839e-15
print("Validación de supuestos modelo inicial sobre el error")
## [1] "Validación de supuestos modelo inicial sobre el error"
par(mfrow=c(2,2))
plot(mod)
print("Validación de supuestos modelo transformado sobre el error")
## [1] "Validación de supuestos modelo transformado sobre el error"
par(mfrow=c(2,2))
plot(mod_ajustado)
precio2=predict(mod_ajustado,list(x=(1/110)))
precio2
## 1
## 340.216
validar_modelo=function(){
precio_predict=array(NA,26)
for (i in 1:26) {
datos_training=datos[-i,]
datos_test=datos[i,]
x=1/datos_training$Area_contruida
mod=lm(precio_millon~x,data=datos_training)
precio_predict[i]=mean(predict(mod,list(x=(1/datos_test$Area_contruida))))
}
return(precio_predict)
}
precio_predict=validar_modelo()
res=data.frame(datos,precio_predict)
head(res)
| Area_contruida | precio_millon | precio_predict |
|---|---|---|
| 86 | 250 | 258.4787 |
| 118 | 385 | 359.0972 |
| 130 | 395 | 385.0559 |
| 181 | 419 | 461.8544 |
| 86 | 240 | 259.2754 |
| 98 | 320 | 303.3532 |
MAE=mean(abs(res$precio_millon-res$precio_predict))
MAE
## [1] 20.60411
MAE/mean(res$precio_millon)*100
## [1] 6.204618