Cargar datos

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.

1. Análisis exploratorio

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")

2. Análisis exploratorio bivariado de datos

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

3. Estimación del modelo de regresión lineal simple

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

4. Intervalo de confianza para β1 al 95%

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

5. Cálculo del estadístico R-cuadrado

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

6. Precio promedio estimado

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

7. Validación de Supuestos

Podemos observar respecto a los supuestos sobre el error \(e_i\) lo siguiente:

  1. Media cero: Se cumple por defecto.
  2. Varianza Constante: Se observa en la gráfica 1 de residuales vs ajustados que el comportamiento no es aleatorio, ya que indica una tendencia cuadrática. Se valida graficamente.
  3. Normalidad: Se observa en la grafica 2 que los datos se ajustan bien a la linea de normalidad en el qqplot. Es decir se valida graficamente.
  4. Independencia: Dado que estos registros no corresponden a datos en el tiempo no se tiene un orden temporal para realizar la validación de este supuesto. Se valida por definición del tipo de datos de corte transversal.
par(mfrow=c(2,2))
plot(mod)

10. Función para calcular intervalo de confianza

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