Se usará una base de datos de viviendas, que para su carga se usa el paquete readxl de R
library(readxl)
datosvivienda <- read_excel("datos_vivienda.xlsx")
attach(datosvivienda)
area = Area_contruida
precio = precio_millon
Se puede observar que la base de datos contiene información referente al precio en millones (Y) de unas viviendas dependiendo del área construida (X) que éstas tengan.
Se puede observar que el promedio del área de la vivienda es de 115.7 y además, el promedio del precio de la vivienda en millones es de 332.1
#attach(datosvivienda)
summary(area)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 80.0 86.0 97.0 115.7 130.0 195.0
summary(precio)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 240.0 251.2 305.0 332.1 395.0 480.0
par(mfrow=c(1,2))
hist(area, col="Light blue",main = "Área contruida (m2)",xlab = "m2",ylab = "Muestras")
hist(precio, col="gray", main = "Precio (millones)",xlab = "millones",ylab = "Muestras")
Se puede observar en el gráfico de dispersión que mientras mayor sea el área de la vivienda, el precio va a aumentar. Según el coeficiente de correlación de Pearson que se tiene en éste caso (0.919) se puede decir que la relación entre el área de la vivienda y el precio de ésta es bastante fuerte.
plot(area,precio)
cor(area,precio)
## [1] 0.9190295
Podemos observar que el coeficiente \(\beta_0\) no se debe interpretar porque no tendría sentido hablar de un área de una vivienda de cero metros cuadrados, además de que no se observan valores de cero para el área construida. Por otro lado se observa que el valor p del coeficiente estimado afirma que \(\beta_1\) es significativamente distinto de cero, para lo cual \(\beta_1=2.124\) indica que por cada unidad de área construida que se aumente, el precio de la vivienda va a aumentar en 2.124 millones.
El modelo estimado quedaría:
\(Ŷ_i = 86.234+2.124X_i\)
mod=lm(precio~area)
summary(mod)
##
## Call:
## lm(formula = precio ~ area)
##
## 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 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
Con una confianza del 95%, el verdadero valor de \(\beta_1\) está entre:
(1.905,2.343)
require(ggplot2)
## Loading required package: ggplot2
ggplot(datosvivienda,aes(x=Area_contruida,y=precio_millon))+geom_point()+geom_smooth(method = "lm")+xlab("Área (m2)")+ylab("Precio (millones)")+ggtitle("Regresión lineal precio de vivienda según su área")+theme_bw()
## `geom_smooth()` using formula 'y ~ x'
Beta1_e=2.124
ee_Beta1=0.186
t=qt(0.975,df=24)
LI=Beta1_e-(t*ee_Beta1)
LS=Beta1_e+(t*ee_Beta1)
LI
## [1] 1.740115
LS
## [1] 2.507885
Para el calculo de \(R^2\) se usa la fórmula \(R^2 = SSR/SST\) donde \(SSR\) es la suma de los cuadrados de la regresión y \(SST = SSR + SSE\), siendo \(SSE\) la suma de cuadrados del error. De esta manera \(R^2 = 0,8446\) lo que indica que el modelo explica un 84,45% de la variabilidad total del precio de las viviendas
media = mean(precio)
ssr = sum((mod$fitted.values-media)^2)
sse = sum((precio - mod$fitted.values)^2)
sst = ssr+sse
r2 = ssr/sst
r2
## [1] 0.8446152
Como se aprecia el precio promedio de un apartamento de \(110m^2\) es de 319,870 millones. Donde se puede apreciar que este precio se encuentra en el rango promedio, sin destacar especialmente en ningún aspecto.
Ahora si se presenta una oferta de 200 millones por un apartamento del mismo tamaño es una muy buena oferta, ya que se espera que el precio más bajo promedio del apartamento sea de 306,31 millones
estimado=predict(mod,list(area = 110),interval = "confidence",level = 0.95) #con intervalo de confianza E(y/x0)
estimado
## fit lwr upr
## 1 319.8706 306.3133 333.4279
Podemos observar respecto a los supuestos sobre el error \(e_i\) lo siguiente:
par(mfrow=c(2,2))
plot(mod)
Se define la función b1_interval la cual recibe tres parámetros, un vector de valores \(X\), un vector de valores \(Y\), relacionados como un modelo de regresión lineal donde \(Y\) depende de \(X\) y un intervalo de confianza \((1-\alpha)\%\), donde los dos primeros vectores deben contener la misma cantidad de datos, y el último parámetro es un valor entre 0 y 1, quedando de la siguiente manera b1_interval(X,Y,confidence)
b1_interval <- function(x,y,confidence){
if(length(y)!=length(x))
stop("La cantidad de valores en X y Y no coinciden")
if(confidence<0 || confidence>1)
stop("El nivel de confianza no es un rango permitido (0,1)")
mod = lm(y~x)
b1 = mod$coefficients["x"]
errorB1 = summary(mod)$coefficients[4]
t = qt(confidence, df=(length(x)-2))
LI = b1 - (t*errorB1)
LS = b1 + (t*errorB1)
result = c(LI,LS)
names(result)[1] = "Lim. inferior"
names(result)[2] = "Lim. superior"
return(result)
}
interval = b1_interval(area,precio,0.975)
interval
## Lim. inferior Lim. superior
## 1.740170 2.507771