library(readxl)
datos_vivienda <- read_excel("datos_vivienda.xlsx")
datos_vivienda
## # A tibble: 26 x 2
## Area_contruida precio_millon
## <dbl> <dbl>
## 1 86 250
## 2 118 385
## 3 130 395
## 4 181 419
## 5 86 240
## 6 98 320
## 7 170 480
## 8 96 268
## 9 85 240
## 10 170 450
## # ... with 16 more rows
Se observa que la base de datos contiene información sobre el precio (en millones de pesos) de una propiedad [X], de acuerdo a el área construida (en metros cuadrados) de esta propiedad [Y]
attach(datos_vivienda)
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
par(mfrow = c(1,2))
hist(Area_contruida, col = "gray")
hist( precio_millon, col = "gray")
Observamos que el promedio del área construida de las propiedades es de 115.7 m\(^2\). También observamos que el precio promedio es de 332.1 millones de pesos.
plot(Area_contruida, precio_millon)
cor(Area_contruida, precio_millon)
## [1] 0.9190295
Al ver el gráfico de puntos entre el área construida y el precio en millones podemos observar una relación directamente proporcional y podríamos llegar a pensar que es lineal, aunque se puede llegar también a observar una ligera curvatura de los datos siguiendo un comportamiento parecido al de la función \(Y = ln(X)\).
Al calcular el coeficiente de correlación de Pearson entre las 2 variables nos arroja aproximadamente 0.92, lo cual nos confirma la fuerte relación entre las 2 variables.
mod = lm(precio_millon~Area_contruida)
summary(mod)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida)
##
## 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
plot(Area_contruida, precio_millon)
abline(mod, col="red")
Observamos que el modelo estimado de regresión lineal simple es: \(Precio = 86.234 + (2.124)(Área)\).
\(\beta_0= 86.234\) En este caso el coeficiente \(\beta_0\) no es interpretable ya que, al estar hablando en area construida, no tiene sentido hablar de una propiedad con área construida igual a 0. Esto se podría analizar como el precio del lote, sin embargo no se nos hace referencia a esto en la descripción de los datos, por lo que hacemos caso omiso a de ello. Además, se observa que el coeficiente es significativamente diferente de cero.
\(\beta_1 = 2.124\) nos indica que por cada metro cuadrado construido adicional, el precio se incrementa en aproximadamente COP $2’124,000. Además, se observa que el coeficiente es significativamente diferente de cero.
beta_1 = 2.124
ee_b1 = 0.186
t = qt(df = 24,p = 0.975)
Li = (beta_1 - ee_b1*t)
Ls = (beta_1 + ee_b1*t)
c(Li,Ls)
## [1] 1.740115 2.507885
Del proceso de construcción del intervalo de confianza para \(\beta_1\) podemos concluir que en dicho intervalo [1.74, 2.5] no se encuentra contenido el 0, por lo que podemos concluir que \(\beta_1\) es significativamente distinto de 0. Esto es reafirmado por la prueba de hipótesis t.
Planteamos \(H_0: \beta_1 = 0\) vs \(H_1: \beta_1 \neq 0\)
t_b1 = 11.422
t <= t_b1
## [1] TRUE
Como el valor de prueba de t es mayor que el valor t estadístico rechazamos la hipótesis nula \(H_0: \beta_1 = 0\). Por lo que concluimos que este coeficiente es distinto de 0.
El summary del modelo nos arroja el valor de \(R^2 = 0.84\), según este valor se puede concluir que: El modelo explica el 84% de la variabilidad del precio de una vivienda en función de su área construida.
summary(mod)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida)
##
## 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
R_2 = 0.8446
predict(mod, list(Area_contruida=110))
## 1
## 319.8706
predict(mod, list(Area_contruida=110), interval = "confidence")
## fit lwr upr
## 1 319.8706 306.3133 333.4279
Con base en la predicción realizada sobre el modelo, podemos concluir que el precio de un apartamento de \(110 m^2\) es de, aproximadamente COP $319’870,600. Además, con base en el intervalo [306.3, 333.4], podemos afirmar que el precio de un apartamento de \(110 m^2\) oscila entre COP $306’313,300 y COP $333’427,900, por lo que, un apartamento de esta área por COP $200’000,000 se puede considerar como una buena oferta.
ei = mod$residuals
par(mfrow = c(2,2))
plot(mod)
Podemos observar, respecto a los supuestos del \(e_i\), lo siguiente:
Media cero: Se cumple por defecto.
Homogeneidad de varianza: Se observa que tiene un comportamiento no aleatorio, por lo que no se valida este supuesto.
Normalidad: Se observa en la gráfica que los datos se no ajustan muy bien a la línea de normalidad en el QQPlot, por lo que podemos afirmar que no siguen una distribución normal.
Independencia: Dado que estos registros no corresponden a datos en el tiempo o espacio, no se tiene un orden temporal para realizar la validación del supuesto. Se valida por la definición del tipo de datos de corte transversal.
Como se mencionó en el punto 2 se puede observar una relación ligeramente curvada con la forma de la función: \(Y = ln(X)\). Ahora, observamos que el modelo se puede ver como \(Y = \beta_0 +\beta_1ln(X) + \varepsilon\)
Por esto, decidimos realizar una transformación de la forma \(X^* = ln(X)\), por lo que nuestro modelo transformado queda de la forma \(Y = \beta_0 +\beta_1X^* + \varepsilon\)
lnx = log(Area_contruida)
plot(lnx, precio_millon)
Vemos que en la transformación del modelo se observa una relación mucho más lineal que anteriormente.
mod_t = lm(precio_millon~lnx)
summary(mod_t)
##
## Call:
## lm(formula = precio_millon ~ lnx)
##
## Residuals:
## Min 1Q Median 3Q Max
## -45.837 -20.153 -1.878 20.145 55.145
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -948.53 89.09 -10.65 1.42e-10 ***
## lnx 271.88 18.88 14.40 2.63e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 27 on 24 degrees of freedom
## Multiple R-squared: 0.8963, Adjusted R-squared: 0.8919
## F-statistic: 207.4 on 1 and 24 DF, p-value: 2.63e-13
plot(lnx, precio_millon)
abline(mod_t, col="blue")
Ahora, el modelo transformado es: \(Y = -948.53 + 271.88X\), que nos indica que: Por un aumento unitario en el \(ln(Áreaconstruida)\), el precio aumenta en promedio COP $27’188.000
Observamos que ahora, el ajuste \(R^2 = 0.89\) del modelo transformado aumentó con respecto al del modelo original. Este ajuste nos dice que: El modelo transformado explica el 89% de la variabilidad del precio de una vivienda en función del logaritmo natural de su área construida.
Ahora, realicemos la prueba de supuestos de nuevo para el modelo transformado:
ei_t = mod_t$residuals
par(mfrow = c(2,2))
plot(mod_t)
Podemos observar, respecto a los supuestos del \(e_i\), lo siguiente:
Media cero: Se cumple por defecto.
Homogeneidad de varianza: Se observa ahora, que el modelo transformado tiene un comportamiento bastante más aleatorio, por lo que afirmamos que este supuesto se cumple este supuesto gráficamente.
Normalidad: Se observa en la gráfica que los datos ahora se ajustan mucho mejor a la línea de normalidad en el QQPlot, por lo que podemos afirmar que este supuesto también se cumple gráficamente
Independencia: Dado que estos registros no corresponden a datos en el tiempo o espacio, no se tiene un orden temporal para realizar la validación del supuesto. Se valida por la definición del tipo de datos de corte transversal.
IC_Beta1 = function(X,Y,alfa,decimal){
mod = lm(Y~X)
beta_1 = mod$coefficients[2]
ee_b1 = coef(summary(mod))[,2][2]
t = qt(df = length(X)-2 ,p = alfa + (1-alfa)/2)
Li = round((beta_1 - ee_b1*t), decimal)
Ls = round((beta_1 + ee_b1*t), decimal)
intervalo = paste("El intervalo de confianza al", alfa*100, "% para β1 es: [", Li, ",", Ls, "]")
return(intervalo)
}
Nota: Adicionalmente añadimos un cuarto parámetro que indica cuantos decimales se quieren en los límites del intervalo.
Ejemplos:
Verificando esta función con los datos utilizados en los puntos anteriores comprobamos que está correctamente definida y arroja los valores hallados en el punto 4:
IC_Beta1(datos_vivienda$Area_contruida, datos_vivienda$precio_millon, 0.95, 2)
## [1] "El intervalo de confianza al 95 % para ß1 es: [ 1.74 , 2.51 ]"
También podemos realizar la prueba con una base de datos diferente. Por ejemplo, probemos la función con la base de datos de ventas usada en la clase 7 del curso:
library(readxl)
ventas <- read_excel("ventas.xlsx")
IC_Beta1(ventas$clientes, ventas$ventas, 0.90, 3)
## [1] "El intervalo de confianza al 90 % para ß1 es: [ 0.186 , 0.335 ]"