##Introducción

La siguiente base de datos contiene información sobre el área y el precio en millones de apartamentos en Cali. En este informe se encontrará si estas dos variables tienen algún tipo de relación.

##Análisis exploratorio

Para inicar, se analizarán cada una de las variables de forma separada

Primero, se realizó un resumen de la base de datos, en donde se puede evidenciar que el minimo de area construida es de 80 m^2, el máximo es de 195 m^2, y su promedio es de 115.7.En cuanto a la variable del precio, se puede observar que el minimo es de 240 millones, el máximo es de 480, y el promedio es de 332.1

summary(datos_vivienda)
##  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
hist(x=datos_vivienda$Area_contruida, main= "Histograma del Área construida",xlab="Área construida", ylab= "Frecuencia")

En el histograma anterior se puede observar que los datos están sesgados a la derecha, es decir que la mayoría del área construida está en un rango de 80 a 100 m^2

hist(x=datos_vivienda$precio_millon, main= "Histograma del precio",xlab="Precio (millones)", ylab= "Frecuencia")

En el histograma del precio, se observa que este cuenta con dos picos, es decir que es bimodal, los precios de los apartamentos están entre 200 y 30; y entre 350 y 450 millones.

boxplot( x=datos_vivienda$Area_contruida)

boxplot( x=datos_vivienda$precio_millon)

De los diagramas de cajas de ambas variables, se puede decir que ninguna tiene datos atípicos y que cuentan con una mayor disperción en la parte superior.

##Análisis exploratorio bivariado

Ahora se realzará un análisis de las variables pero de forma conjunta, para saber si tienen alguna relación.

plot( x=datos_vivienda$Area_contruida, y=datos_vivienda$precio_millon, main= "Gráfico área vs precio",xlab="Área construida", ylab= "Precio (millones)")

En la gráfica de los datos, se puede evidenciar que a simple vista, la información parece tener una correlación lineal positiva.Para confirmar esto, se hará una prueba de correlación de los datos.

cor( x=datos_vivienda$Area_contruida, y=datos_vivienda$precio_millon)
## [1] 0.9190295

Utilizando la función cor de Rstudio, se obtuvo que efectivamente, el área construida y el precio tienen una correlación alta positiva (0.9190295)

##Estimación del modelo lineal simple

Para continuar, se realizará la estimación del modelo de regresión lineal, en donde se podrán apreciar los coeficientes β0 y β1

mod= lm (precio_millon~Area_contruida, data = datos_vivienda)
summary (mod)
## 
## Call:
## lm(formula = precio_millon ~ Area_contruida, data = datos_vivienda)
## 
## 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

La ecuación de la recta de mínimos cuadrados es:

y= 2.124X+86.234

Esto quiere decir que por cada metro cuadrado de área construida adicional, el precio aumentará en más o menos 2 millones. Además se se evidencia el valor del R2 (0.8446), lo que indica que el modelo explica el 84% de la variabilidad del precio. También se puede notar que el p-valor de cada una de los coeficientes(β0 y β1) es significante pues es extremadamente pequeño.

plot( x=datos_vivienda$Area_contruida, y=datos_vivienda$precio_millon, main= "Gráfico área vs precio",xlab="Área construida", ylab= "Precio (millones)")
abline(mod)

##Interevalo de confianza para β1

confint(object=mod, parm="Area_contruida", level=0.95)
##                  2.5 %   97.5 %
## Area_contruida 1.74017 2.507771

Con un nivel de confianza de 95%, se puede ver que el intervalo de β1 es (1.740, 2.508). como se evidencia, en el intervalo no está el 0, es decir que el modelo debe incluir a β1

Ahora se compara este resultado con una prueba de hipotesis t:

H0: β1=0

H1: β1≠0

t.test (x=datos_vivienda$Area_contruida,conf.level = 0.95)
## 
##  One Sample t-test
## 
## data:  datos_vivienda$Area_contruida
## t = 16.605, df = 25, p-value = 5.166e-15
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  101.3907 130.1032
## sample estimates:
## mean of x 
##  115.7469

Como en la hipotesis t se obtuvo un p-valor muy pequeño, por debajo de α=0.05, entonces se rechaza H0, lo que indica que β1≠0 y este coeficiente debe ser incluido en el modelo.

##Indicador de bondad y ajuste R2

Como se había analizado anteriormente, el valor del R2 (0.8446), lo que indica que el modelo explica el 84% de la variabilidad del precio. Ahora se realizará el ajuste de este valor:

summary(mod)$adj.r.squared 
## [1] 0.8381408

Al observar el R2 ajustado, se puede concluir que para esta regresión, implica que el 83.81% de la variación en el precio se explica por el área construida

##Precio promedio estimado para un apartamento de 110 metros cuadrados

Teniendo en cuenta la ecuación de la recta

y= 2.124X+86.234

y= 2.124(110)+86.234

y=319.874

El precio de un apartamento de 110 m^2 es de 319.874 millones. Si se tiene una oferta de un apartamento de 110 m^2 a un precio de 200, es considerada una muy buena oferta, pues se estaría ahorrando aproximadamente un 37.47% del valor del apartamento. En este caso se debe tener en cuenta si el apartamento tiene algún daño que no se pude arreglar, o si los dueños tienen una deuda y no lo puedan pagar o también si necesitan venderlo rápido por motivo de algún viaje

##Validación de supuestos

Linealidad:

residuos <- residuals(mod)
plot(datos_vivienda$Area_contruida, residuos, pch = 16, col = 'steelblue')
points(loess.smooth(datos_vivienda$Area_contruida, residuos), type = 'l', lwd = 2, lty = 2)

plot(datos_vivienda$precio_millon, residuos, pch = 16, col = 'steelblue')
points(loess.smooth(datos_vivienda$precio_millon, residuos), type = 'l', lwd = 2, lty = 2)

De las gráficas anteriores de cada una de las variables vs los residuos, se puede notar que no siguen un comportamiento lineal. Una solución para ajustar el modelo, es agregando un término de orden superior al modelo o transformar las variables.

Homogeneidad de varianzas:

Para comprobar si las varianzas son homogeneas, se utilizará la función bptest, con las siguientes hipotesis:

H_0:Sus varianzas son homogeneas

H_1:Sus no varianzas son homogeneas

library(lmtest)
bptest( mod)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod
## BP = 5.8737, df = 1, p-value = 0.01537

Con un p-valor = 0.01537, menor a α=0.05, se rechaza la hipótesis nula. Por lo tanto suponemos que las varianzas no son homogeneas.Una solución para su ajuste, es transformar las variables.

Independencia de los residuos:

Para saber si son independientes o no, se tendrán en cuenta las siguientes hipotesis:

H_0:La autocorrelación está presente en los residuos

H_1:La autocorrelación no está presente en los residuos

y <- matrix(datos_vivienda$precio_millon,ncol=1)
x <- matrix(datos_vivienda$Area_contruida,ncol=1)
library(lmtest)
dwtest(y~x)
## 
##  Durbin-Watson test
## 
## data:  y ~ x
## DW = 1.8831, p-value = 0.3831
## alternative hypothesis: true autocorrelation is greater than 0

Al obtener un p valor de 0.3831, se puede concluir que no se rechaza la hipotesis nula, por lo tanto, los residuos no presentan autocorrelación.

Normalidad:

hist(x=residuos, main= "Histograma de los residuos",xlab="residuos", ylab= "Frecuencia")

qqnorm(residuos)
qqline(residuos, col = "steelblue", lwd = 2)

Según se observa en las gráficas, el comportamiento de los residuos se asemeja a una distribución normal. Para conprobarlo, se realizará la prueba de Shapiro-Wilk, con las siguientes hipotesis

H_0:La distribución es normal

H_1:La distribución no es normal

shapiro.test(residuos)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos
## W = 0.95489, p-value = 0.3009

Como en la prueba de Shapiro-Wilk se obtuvo un p-valor mucho mayor a α=0.05, entonces no se rechaza H_0, lo que indica que la distribución de los residuos es normal.

##Transformación de ajuste

library(normtest)
library(car)
library(tseries)
library(nortest)
library(MASS)

bm= boxcox(lm(datos_vivienda$precio_millon~datos_vivienda$Area_contruida))

str(bm)
## List of 2
##  $ x: num [1:100] -2 -1.96 -1.92 -1.88 -1.84 ...
##  $ y: num [1:100] 11.4 11.5 11.7 11.8 11.9 ...
valor_de_lambda<-bm$ lambdahat
valor_de_lambda
## NULL
lambda= bm$x
lik= bm$y
bcm=cbind(lambda,lik)
bcm[order(lik),]
##             lambda      lik
##   [1,] -2.00000000 11.41250
##   [2,] -1.95959596 11.54055
##   [3,] -1.91919192 11.66779
##   [4,] -1.87878788 11.79421
##   [5,] -1.83838384 11.91980
##   [6,] -1.79797980 12.04455
##   [7,] -1.75757576 12.16845
##   [8,] -1.71717172 12.29150
##   [9,] -1.67676768 12.41368
##  [10,] -1.63636364 12.53500
##  [11,] -1.59595960 12.65544
##  [12,] -1.55555556 12.77499
##  [13,] -1.51515152 12.89365
##  [14,] -1.47474747 13.01140
##  [15,] -1.43434343 13.12823
##  [16,] -1.39393939 13.24414
##  [17,] -1.35353535 13.35912
##  [18,] -1.31313131 13.47315
##  [19,] -1.27272727 13.58623
##  [20,] -1.23232323 13.69834
##  [21,] -1.19191919 13.80947
##  [22,] -1.15151515 13.91961
##  [23,] -1.11111111 14.02876
##  [24,] -1.07070707 14.13689
##  [25,] -1.03030303 14.24399
##  [26,] -0.98989899 14.35006
##  [27,] -0.94949495 14.45508
##  [28,] -0.90909091 14.55904
##  [29,] -0.86868687 14.66192
##  [30,] -0.82828283 14.76371
##  [31,] -0.78787879 14.86439
##  [32,] -0.74747475 14.96396
##  [33,] -0.70707071 15.06238
##  [34,] -0.66666667 15.15966
##  [35,] -0.62626263 15.25577
##  [36,] -0.58585859 15.35070
##  [37,] -0.54545455 15.44443
##  [38,] -0.50505051 15.53694
##  [39,] -0.46464646 15.62822
##  [40,] -0.42424242 15.71824
##  [41,] -0.38383838 15.80700
##  [42,] -0.34343434 15.89446
##  [43,] -0.30303030 15.98062
##  [44,] -0.26262626 16.06545
##  [45,] -0.22222222 16.14893
##  [46,] -0.18181818 16.23103
##  [47,] -0.14141414 16.31175
##  [48,] -0.10101010 16.39106
##  [49,] -0.06060606 16.46893
##  [50,] -0.02020202 16.54534
##  [51,]  0.02020202 16.62027
##  [52,]  0.06060606 16.69370
##  [53,]  0.10101010 16.76560
##  [54,]  0.14141414 16.83594
##  [55,]  0.18181818 16.90471
##  [56,]  0.22222222 16.97188
##  [57,]  0.26262626 17.03741
##  [58,]  0.30303030 17.10129
##  [59,]  0.34343434 17.16348
##  [60,]  0.38383838 17.22396
##  [61,]  0.42424242 17.28270
##  [62,]  0.46464646 17.33967
##  [63,]  0.50505051 17.39485
##  [64,]  0.54545455 17.44819
##  [65,]  0.58585859 17.49968
##  [66,]  0.62626263 17.54928
##  [67,]  0.66666667 17.59696
##  [68,]  0.70707071 17.64269
##  [69,]  0.74747475 17.68644
##  [70,]  0.78787879 17.72817
##  [71,]  0.82828283 17.76785
##  [72,]  0.86868687 17.80545
##  [73,]  0.90909091 17.84094
##  [74,]  2.00000000 17.87081
##  [75,]  0.94949495 17.87428
##  [76,]  0.98989899 17.90543
##  [77,]  1.95959596 17.90578
##  [78,]  1.03030303 17.93437
##  [79,]  1.91919192 17.93769
##  [80,]  1.07070707 17.96105
##  [81,]  1.87878788 17.96657
##  [82,]  1.11111111 17.98545
##  [83,]  1.83838384 17.99246
##  [84,]  1.15151515 18.00752
##  [85,]  1.79797980 18.01538
##  [86,]  1.19191919 18.02724
##  [87,]  1.75757576 18.03537
##  [88,]  1.23232323 18.04456
##  [89,]  1.71717172 18.05246
##  [90,]  1.27272727 18.05944
##  [91,]  1.67676768 18.06669
##  [92,]  1.31313131 18.07187
##  [93,]  1.63636364 18.07810
##  [94,]  1.35353535 18.08179
##  [95,]  1.59595960 18.08671
##  [96,]  1.39393939 18.08917
##  [97,]  1.55555556 18.09257
##  [98,]  1.43434343 18.09397
##  [99,]  1.51515152 18.09571
## [100,]  1.47474747 18.09617
lamvalue=bm$x[which(bm$y==max(bm$y))]
lamvalue
## [1] 1.474747

Ahora que se ha hallado el valor de lambda, se realizará el ajuste del modelo utilizando este valor

mod2=lm((datos_vivienda$precio_millon^(lamvalue-1))/lamvalue~datos_vivienda$Area_contruida) 
summary(mod2)
## 
## Call:
## lm(formula = (datos_vivienda$precio_millon^(lamvalue - 1))/lamvalue ~ 
##     datos_vivienda$Area_contruida)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -0.8027 -0.4276 -0.1039  0.3936  1.0146 
## 
## Coefficients:
##                               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                   6.888928   0.355864   19.36 3.75e-16 ***
## datos_vivienda$Area_contruida 0.032008   0.002944   10.87 9.36e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5232 on 24 degrees of freedom
## Multiple R-squared:  0.8312, Adjusted R-squared:  0.8242 
## F-statistic: 118.2 on 1 and 24 DF,  p-value: 9.361e-11

La ecuación de la recta de mínimos cuadrados es:

y= 6.88+0.032x

Teniendo ya lista la transformación, se verificará que esta tenga un mejor ajuste, y se comprobará que haya mejorado especificamente, que tengan una relación lineal, y que sus varianzas sean homogeneas.

##Comparación de modelos

Linealidad:

precio<- datos_vivienda$precio_millon
area<- datos_vivienda$Area_contruida
residuos2 <- residuals(mod2)
plot(area, residuos2, pch = 16, col = 'steelblue')
points(loess.smooth(area, residuos2), type = 'l', lwd = 2, lty = 2)

plot(precio, residuos2, pch = 16, col = 'steelblue')
points(loess.smooth(precio, residuos2), type = 'l', lwd = 2, lty = 2)

Se puede observar en el eje y, que en este modelo, los residuos son un poco más lineales que en el modelo sin ajustar

Homogeneidad de varianzas:

Para comprobar si las varianzas son homogeneas, se utilizará la función bptest, con las siguientes hipotesis:

H_0:Sus varianzas son homogeneas

H_1:Sus no varianzas son homogeneas

library(lmtest)
bptest( mod2)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod2
## BP = 4.473, df = 1, p-value = 0.03443

Con un p-valor = 0.03443, menor a α=0.05, se rechaza la hipótesis nula. Pero se evidencia que el valor aumentó en comparación con el modelo sin ajustar. De igual manera suponemos que las varianzas no son homogeneas.

Independencia de los residuos:

Para saber si son independientes o no, se tendrán en cuenta las siguientes hipotesis:

H_0:La autocorrelación está presente en los residuos

H_1:La autocorrelación no está presente en los residuos

y <- matrix(precio,ncol=1)
x <- matrix(area,ncol=1)
library(lmtest)
dwtest(y~x)
## 
##  Durbin-Watson test
## 
## data:  y ~ x
## DW = 1.8831, p-value = 0.3831
## alternative hypothesis: true autocorrelation is greater than 0

Al igual que en el modelo anterior, no se rechaza la hipotesis nula, por lo tanto, los residuos no presentan autocorrelación.

Normalidad:

hist(x=residuos2, main= "Histograma de los residuos",xlab="residuos", ylab= "Frecuencia")

qqnorm(residuos2)
qqline(residuos2, col = "steelblue", lwd = 2)

H_0:La distribución es normal

H_1:La distribución no es normal

shapiro.test(residuos2)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos2
## W = 0.94558, p-value = 0.1824

Como se puede observar en las gráficas, y en la prueba de Shapiro-Wilk se obtuvo un p-valor de 0.1824, el cuál es menor al del modelo anterior, pero sigue siendo mayor a α=0.05, entonces no se rechaza H_0, y los residuos siguen un comportamiento normal