En esta ocasión se requiere hacer una regresión lineal de la variable precio de vivienda en función de las variables Tipo de vivienda (categorica) y área construida(cuantitativa).Recordemos que la base de datos de vivienda, la cual cuenta con 8319 registros y 12 variables de diferentes viviendas en Cali. A continuación haremos un breve analisis exploratorio de la variable, precio,área construida y tipo de vivienda .
## Media Desviación Asimetría Min Max Coef.var
## 433.8919471 328.6472443 1.8495890 58.0000000 1999.0000000 0.7574403
hist(Vivienda$precio_millon,freq=F,main="Histograma y diagrama de caja-precio",col="aquamarine3",
xlab="Precio en millones",ylab="Densidad")
par(new = TRUE)
boxplot(Vivienda$precio_millon, horizontal = TRUE, axes = FALSE,
lwd = 2, col = rgb(0, 0, 0, alpha = 0.2))
El precio por vivienda toma valores entre 58 millones de pesos y 1999 millones de pesos, el precio promedio es 433 millones sin embargo es de 0.75, indicando que la media de los datos no es tan representativa y pierde confiabilidad. Como se aprecia en la gráfica existe asimetria positiva es decir, la cola de la derecha se alarga.Adicionalmente el 75% (5975) de los datos toma valores menores o igual a 500.
## Media Desviación Asimetría Min Max Coef.var
## 174.9349381 142.9641260 2.6938460 30.0000000 1745.0000000 0.8172417
hist(Vivienda$Area_contruida,freq=F,main="",col="aquamarine3",xlab="Área construida",ylab="Densidad")
par(new = TRUE)
boxplot(Vivienda$Area_contruida,horizontal=TRUE,axes=FALSE,lwd = 2, col = rgb(0, 0, 0, alpha = 0.2))
La variable área construida toma valores entre 30 metros cuadrados y 1745 metros cuadrados, en promedio las viviendas tienen un área de 174 sin embargo coeficiente de variación de 0.81, este valor es aún más cercano a 1 por lo que la media es aún menos representativa de los datos. Como se aprecia en la gráfica anterior obtenemos una asimetría positiva, mucha mas asimetria que la variable precio.Por otro lado,el 75% de los datos tienen áreas menores o igual a 229.
Esta variable tiene dos categorias las cuales son Apartamento y Casa, el 61% de las viviendas son de tipo apartamento y el 38% de tipo casa.
##
## Apartamento Casa
## 0.6130545 0.3869455
Ahora bien, puesto que nuestro interes es ajustar un modelo de regresión para predecir la variable precio realizamos un diagra de caja de ambos tipos de vivienda y el precio.
boxplot(Vivienda$precio_millon~ Vivienda$Tipo, col=c("#A2CD5A","#66CDAA"),xlab = "Tipo de vivienda", ylab = "Precio en millones")
Como se aprecia en el gráfico anterior el precio de una vivienda es aparentemente más grande cuando el tipo de vivienda es una casa los valores de una casa están entre 77 millones y 1999 millones, el precio promedio de una casa es 430 millones . Por otro lado, los precios de los apartamentos están entre 58 y 1950 millones y en promedio el precio de una apartamento es 366.9 millones. Lo anterior nos da un indicio de que el tipo de vivienda puede ser una variable que explique bien el precio de una vivienda.
Para ajustar el modelo de regresión necesitamos hacer una tranformación en la variable Tipo y agregarle un uno si la vivienda es una casa y cero en el caso contrario.Eso lo hacemos con la siguiente función.
mod = lm(precio_millon~Area_contruida+Tipo_Apartamento, data=Newdata)
summary(mod)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Tipo_Apartamento,
## data = Newdata)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2926.71 -122.58 -49.12 71.12 1276.36
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 49.19021 7.17011 6.86 7.36e-12 ***
## Area_contruida 1.79514 0.02145 83.69 < 2e-16 ***
## Tipo_Apartamento 115.29391 6.29551 18.31 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 234.1 on 8316 degrees of freedom
## (3 observations deleted due to missingness)
## Multiple R-squared: 0.4929, Adjusted R-squared: 0.4928
## F-statistic: 4042 on 2 and 8316 DF, p-value: < 2.2e-16
Al ajustar un modelo de regresión de la variable precio en millones en función de las variables área construida y tipo de vivienda, en esta caso pusimos tipo apartamento (valores 1) , el R2 nos dice que el 49% de la variabilidad del precio de la vivienda está siendo explicado por el modelo.En comparación con el modelo anterior en el cual el precio estaba sólo en función del área construida aumentó en un 5% sin embargo el error estándar también aumentó.
El primer coeficiente nos dices que si el área aumenta en un metro cuadrado el precio aumenta en 1.79514 millones y el segundo coeficiente nos dice que el precio de los apartamentos en promedio es 115.29391 millones mayor que el de las casas.
res.stud<-studres(mod)
mod.fit<-mod$fitted.values
par(mfrow=c(1,2))
plot(mod.fit,res.stud,ylab="Residuos estudentizados",xlab="Valores ajustados")
abline(h=0,lty=2)
lines(lowess(res.stud~mod.fit), col = 2)
plot(mod.fit,abs(res.stud),ylab="|Residuos estudentizados|",xlab="Valores ajustados")
lines(lowess(abs(res.stud)~mod.fit), col = 2)
En la figura anterior se observa como la varianza aumenta a medida que lo hacen los valores ajustados, decimos así que el modelo no cumple el supuesto de homocedasticidad.
bptest(mod)
##
## studentized Breusch-Pagan test
##
## data: mod
## BP = 1922.7, df = 2, p-value < 2.2e-16
De la salida anterior se observa que el valor-P es menor que el nivel de significancia usual de 5%, por lo tanto, hay evidencias para decir que no se cumple la homocedasticidad de los errores.
car::qqPlot(mod)
## [1] 1017 3324
El gráfico qqplot muestra como el modelo no cumple con el supuesto de normalidad.
Para solucionar los problemas de incumplimiento de supuestos realizaremos una trasformación por BoxCox.
boxcox = MASS::boxcox(mod,lambda=seq(-3,3,length.out = 1000),
ylab='log-verosimilitud')
boxcox$x[boxcox$y ==max(boxcox$y)]
## [1] 0.03303303
El valor al cual se elevará la variable respuesta es aquel que maximiza la logverosimilitud. De modo que realizamos la transformación Y0.03303 para un nuevo modelo.
modBox<-lm(precio_millon^0.03303~Area_contruida+Tipo,data=Vivienda)
A continuación procederemos a evaluar los supuestos del modelo transformado.
car::qqPlot(modBox)
## [1] 1017 3324
Tras realizar la transformación se nota que ha habido una gran mejora en el gráfico qqplot.
res.stud.box<-studres(modBox)
mod.fit.box<-modBox$fitted.values
par(mfrow=c(1,2))
plot(mod.fit.box,res.stud.box,ylab="Residuos estudentizados",xlab="Valores ajustados")
abline(h=0,lty=2)
lines(lowess(res.stud.box~mod.fit.box), col = 2)
plot(mod.fit.box,abs(res.stud.box),ylab="|Residuos estudentizados|",xlab="Valores ajustados")
lines(lowess(abs(res.stud.box)~mod.fit.box), col = 2)
A pesar de haber logrado una mejora considerable en el gráfico qqPlot, no se obtuvo el mismo resultado para el gráfico de los residuos contra los valores ajustados. Además, se obtiene un valor de R2 de 0.4633, el cual es un poco inferior al obtenido sin la transformación.
summary(modBox)
##
## Call:
## lm(formula = precio_millon^0.03303 ~ Area_contruida + Tipo, data = Vivienda)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.223265 -0.013248 -0.000351 0.012873 0.058205
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.191e+00 3.433e-04 3469.748 <2e-16 ***
## Area_contruida 1.363e-04 1.807e-06 75.392 <2e-16 ***
## TipoCasa -4.729e-03 5.305e-04 -8.914 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01972 on 8316 degrees of freedom
## (3 observations deleted due to missingness)
## Multiple R-squared: 0.4633, Adjusted R-squared: 0.4631
## F-statistic: 3589 on 2 and 8316 DF, p-value: < 2.2e-16