knitr::opts_chunk$set(echo = TRUE,warning = FALSE,cache=FALSE, message=FALSE,
library(alr4),
library(MASS),
library(effects),
library(car),
library(lmtest),
library(nortest),
library(readxl),
library(gplots),
library(readxl),
library(lmtest)
)
Se realizará un breve análisis univariado para las variables precio_vivienda y Area_vivienda, con fines de observar como se comportan individualmente estas para luego observar su comportamiento conjunto en un análisis bivariado a fines de encontrar una relación que ayude a ajustar un modelo apropiado.
Primero debemos cargar nuesta base de datos de las viviendas en la ciudad de Cali, con la que vamos a trabajar a continuación:
Datos <- read_excel("Datos_Vivienda.xlsx")
attach(Datos)
head(Datos)
## # A tibble: 6 x 12
## Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## <chr> <chr> <dbl> <dbl> <dbl> <chr> <dbl>
## 1 Zona Sur 2 6 880 237 2 5
## 2 Zona Oeste 2 4 1200 800 3 6
## 3 Zona Sur 3 5 250 86 NA 2
## 4 Zona Sur NA 6 1280 346 4 6
## 5 Zona Sur 2 6 1300 600 4 7
## 6 Zona Sur 3 6 513 160 2 4
## # ... with 5 more variables: Habitaciones <dbl>, Tipo <chr>, Barrio <chr>,
## # cordenada_longitud <dbl>, Cordenada_latitud <dbl>
Procedemos a cargar el boxplot de ambas variables, el cual sirve de guía para visualizar como se están comportando los datos
par(mfrow=c(1,2))
boxplot(precio_millon, xlab = "Precio de vivienda (Millones)", ylab="Millones")
boxplot(Area_contruida, xlab="Area construida", ylab="Metros cuadrados")
Al observar los boxplot, se nota que contamos con valores atípicos en cada variable y tienen una distribución asimétrica hacia la derecha, lo cual nos puede indicar que la media no es buen indicador de centralidad ya que esta se ve facilmente afectado por los valores típicos. Este análisis se puede realizar más a profundidad con las siguientes estadísticas descriptivas:
summary(precio_millon)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 58.0 220.0 330.0 433.9 540.0 1999.0 2
summary(Area_contruida)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 30.0 80.0 123.0 174.9 229.0 1745.0 3
Que como se puede apreciar los precios (millón) de las viviendas cuentan con una media de 433.9 millones y una mediana de 330, además, su valor mínimo está en 58 millones y el máximo hasta 1999 millones. Para el area construida (metros cuadrados) se presenta una media de 174.9 metros cuadrados y una mediana de 123 metros cuadrados, con unos valores mínimos y máximos de 30 metros cuadrados y 1745 metros cuadrados respectivamente.
Se hará un análisis de relación entre estas dos variables, observando como se comportan en conjunto luego de haber observado su comportamiento particular.
plot(Area_contruida,precio_millon)
En el gráfico de Area_construida vs precio_millon se puede apreciar un poco una relación lineal positiva, indicando que cuando aumenta el area construida, también aumenta el precio de la vivienda, para observar esta relación, se realizará el test de correlación de pearson a continuación.
cor.test(precio_millon,Area_contruida)
##
## Pearson's product-moment correlation
##
## data: precio_millon and Area_contruida
## t = 86.304, df = 8317, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.6758453 0.6985236
## sample estimates:
## cor
## 0.687352
Obteniendo un resultado de 0.687352, se puede decir que las variables cuentan con una relación de 0.68, lo cual es un buen indicio para ajustar un modelo entre estas dos variables.
Luego de observar el comportamiento de las variables tanto individual como conjuntamente, se procede a ajustar un modelo, revisando sus supuestos, e indicadores de ajuste, a fin de encontrar el mejor modelo para las variables expuestas.
Ajustando el modelo, obtenemos las siguientes estimaciones de los coeficientes:
mod1=lm(precio_millon~Area_contruida)
coefficients(mod1)
## (Intercept) Area_contruida
## 157.476360 1.580176
Obteniendo un valor para el \(\beta_{0}\) de 157.4, al tener valores alejados del 0, no es lógico realizar una interpretación de este coeficiente, ya que solo se utilizará como una constante para ajustar la recta del modelo de regresión. Para el \(\beta_{1}\), tenemos un valor de de 1.58, por lo que, por cada vez que el area aumente un metro cuadrado, el precio aumentará 1.58 millones de pesos.
Este intervalo de confianza nos indica el rango en el cual se puede mover el coeficiente _0 y _1
confint(mod1)
## 2.5 % 97.5 %
## (Intercept) 149.367981 165.584740
## Area_contruida 1.544286 1.616067
El intercepto _0 sus valores se encuentran en un rango entre 149.36 y 165.58 con un 95% de confianza, mientras que el _1 sus valores se encuentran entre 1.544 y 1.616 con un 95% de confianza siendo este un intervalo pequeño y el coeficiente no pasa por el 0.
*Ho = Bi = 0 Vs *H1 =Bi
para esto el summary de R nos dara los valores criticos de tabla t y los valores p para contrastar la hipotesis
summary(mod1)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2659.88 -120.78 -47.55 67.27 1330.10
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 157.47636 4.13640 38.07 <2e-16 ***
## Area_contruida 1.58018 0.01831 86.30 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 238.7 on 8317 degrees of freedom
## (3 observations deleted due to missingness)
## Multiple R-squared: 0.4725, Adjusted R-squared: 0.4724
## F-statistic: 7448 on 1 and 8317 DF, p-value: < 2.2e-16
con una significancia de 0.05 los valores P para cada uno de los coeficientes nos indica que se rechaza la hipótesis nula por lo tanto los betas son diferentes de 0.
Del Resumen anterior se obtuvo un R-squared: 0.4725, lo cual este nos indica que el modelo explica el 47.25% de la variabilidad de los datos de respuesta (precio por millon), con poca fuerza para confiar en este modelo.
x.nuevo=data.frame(Area_contruida = 110)
predict(mod1, x.nuevo, interval = 'prediction')
## fit lwr upr
## 1 331.2958 -136.712 799.3036
fit = media, lwr y upr = intervalo de confiaza del 95% para el un apartamento de 110 metros cuadrados
Con un valor de 331.29 millones de pesos en promedio por un apartamento de 110 metros cuadrados, en comparación de un apartamento en la misma zona con 110 metros cuadrados que tiene un precio de 200 millones esa vivienda tiene un menor precio que el promedio de los apartamentos con estas características por lo tanto sería una buena oferta para comprar, teniendo en cuenta que no solo el área debe importar en el precio final de la vivienda, dado que pueden tener número de habitaciones diferentes u otros agregados de los apartamentos.
res.stud.MOD1 = studres(mod1)
mod.fit.MOD1 = mod1$fitted.values
par(mfrow=c(1,2))
plot(mod.fit.MOD1,res.stud.MOD1, ylab='residuos estudentizados',
xlab='valores ajustados',main='(grafico residuos estudentizados )')
abline(h=0,lty=2)
lines(lowess(res.stud.MOD1~mod.fit.MOD1), col = 2)
plot(mod.fit.MOD1,abs(res.stud.MOD1),
ylab='|residuos estudentizados|',
xlab='valores ajustados',main='(grafico residuos estudentizados absolutos)')
lines(lowess(abs(res.stud.MOD1)~mod.fit.MOD1), col = 2)
En el gráfico delos residuos estudentizados vemos como los residuos estan alrededor del cero, pero con una notoria curvatura en la linea de suavizacion del cual podemos observar que no hay homocedasticidad en ambos graficos,Podemos decir que la relación entre el precio de vivienda y su covariable Area construida No cumple el supuesto de homocedasticidad, el supuesto de linealidad no se cumple al observar en la forma que la en la que la curvatura sigue el grafico de dispersíon
#codigo para prueba de homocedasticidad
library(lmtest)
bptest(mod1, ~ Area_contruida +I(Area_contruida^2), data=Datos)
##
## studentized Breusch-Pagan test
##
## data: mod1
## BP = 1985.2, df = 2, p-value < 2.2e-16
Como prueba formal Breusch-Pagan nos indica un valor p de aproximadamente 0 por lo tanto de se rechaza la hipotesis de que los residuos son homocedasticos (no cumple el supuesto), como posible solucion una transformación logarítmica tanto a la variable respuesta, así como la covariable dado que se observa que no hay una relación totalmente lineal.
$H_0:$La distribución de X es normal.
$H_1:$La distribución de X no es normal.
qqPlot(res.stud.MOD1)
## [1] 3324 1017
ad.test(res.stud.MOD1)
##
## Anderson-Darling normality test
##
## data: res.stud.MOD1
## A = 347.17, p-value < 2.2e-16
Aqui se realiza una prueba de bondad de ajuste para comprobar su normalidad y se usara el estadistico Andersor-Darling el cual cumple con los requisitos de este teniendo un tamaño de muestra grande,con un p valor de 2.2e-16, se rechaza la Hipotesis nula, con esto tenemos que los datos no tienen una distribucion normal, no cumpliendo el supuesto de normalidad, una propuesta de solucion al incumplimiento de este supuesto es la tranformacion de Box-Cox el cual ayuda a mejorar el ajuste de normalidad en los residuos.
mod2 = lm(log(precio_millon)~log(Area_contruida))
res.std2 = stdres(mod2)
summary(mod2)
##
## Call:
## lm(formula = log(precio_millon) ~ log(Area_contruida))
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.38452 -0.27746 0.00791 0.27372 1.22444
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.890171 0.033060 57.17 <2e-16 ***
## log(Area_contruida) 0.802429 0.006655 120.58 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4042 on 8317 degrees of freedom
## (3 observations deleted due to missingness)
## Multiple R-squared: 0.6361, Adjusted R-squared: 0.6361
## F-statistic: 1.454e+04 on 1 and 8317 DF, p-value: < 2.2e-16
se obtuvo un R-squared: 0.6361, lo cual este nos indica que el modelo explica el 63.61% de la variabilidad de los datos de respuesta (precio por millon), con el debida transformación de logaritmo, mejorando así el ajuste.
par(mfrow=c(1,2))
plot(mod2$fitted.values,res.std2)
abline(h=0,lty=2)
lines(lowess(res.std2~mod2$fitted.values), col = 2)
plot(mod2$fitted.values,sqrt(res.std2^2))
lines(lowess(I(sqrt(res.std2^2))~mod2$fitted.values), col = 2)
bptest(mod2, ~ Area_contruida +I(Area_contruida^2), data=Datos)
##
## studentized Breusch-Pagan test
##
## data: mod2
## BP = 542.15, df = 2, p-value < 2.2e-16
De los gráficos se puede notar el cumplimiento del supuesto de homocedasticidad siendo la prueba gráfica mas potente para la decisión de este, la prueba formal no indica rechazar la hipótesis de homocedasticidad
qqPlot(res.std2)
## [1] 1017 3324
ad.test(res.std2)
##
## Anderson-Darling normality test
##
## data: res.std2
## A = 1.1421, p-value = 0.0055
La prueba gráfica nos indica que cumple con el supuesto de normalidad sin embargo se puede notar unos datos atípicos en los extremos de las 2 colas, lo cual es un indicador que por estos datos la prueba esta dando resultados de rechazar la hipótesis de que los residuos se distribuyen normales.
| Modelos | Inicial | Transformado |
|---|---|---|
| R cuadrado | 0.4725 | 0.6361 |
| Supuesto normalidad | se rechaza | No se rechaza |
| Supuesto heterocedasticidad | se rechaza | No se rechaza |
Por lo tanto la transformación nos ayuda a dar un mejor ajuste y validar supuestos para el modelo de regresion precio vivienda con su covariable Area construida.