Actividad - Regresión Lineal Simple

Con base en los datos de ofertas de vivienda descargadas del portal Fincaraiz (datos_vivienda.xls - descarga) realizar los siguientes puntos:

  1. Realice un análisis exploratorio de las variables precio de vivienda (millones de pesos COP) y area de la vivienda (metros cuadrados) - incluir graficos e indicadores apropiados interpretados.
library(readxl)
datos_vivienda_3 <- read_excel("D:/MAESTRIA EN CIENCIA DE DATOS/1 SEMESTRE/Metodos y Simulacion Estadistica/MODULO 3/datos_vivienda-3.xlsx")
require(ggplot2)
## Loading required package: ggplot2
require(ggpubr)
## Loading required package: ggpubr
#Cómputos estadísticos básicos para variable AREA CONSTRUIDA

promedio_area= mean(datos_vivienda_3$Area_contruida)
mediana_area= median(datos_vivienda_3$Area_contruida)
min_area=min(datos_vivienda_3$Area_contruida)
max_area=max(datos_vivienda_3$Area_contruida)
var_area= var(datos_vivienda_3$Area_contruida)
sd_area= sd(datos_vivienda_3$Area_contruida)

tabla_area=data.frame(promedio_area,mediana_area,min_area,max_area, var_area, sd_area)
tabla_area
promedio_area mediana_area min_area max_area var_area sd_area
115.7469 97 80 195 1263.328 35.54332
g3=ggplot(datos_vivienda_3,aes(x=Area_contruida))+geom_histogram(binwidth=20, fill="#69b3a2", color="white")+theme_bw() 
g3

# De la tabla resumen, notamos que hay una diferencia significativa entre el promedio del área y la mediana; y si contrastamos con la desviación estándar de 35, podemos inferir que los datos no son homogéneos, ya que el rango de la data va entre 80 a 195 m2. Por otro lado, el histograma, afianza la afirmación anterior, en el sentido que no tiene un comportamiento definido.  


g4=boxplot(datos_vivienda_3$Area_contruida, horizontal = TRUE)
stripchart(datos_vivienda_3$Area_contruida, method = "jitter", pch = 19, add = TRUE, col = "blue")
abline(v=mean(datos_vivienda_3$Area_contruida),col="red",lwd=4)

#De la gráfica de Boxplot, notamos que el 50% de los datos corresponden a áreas comprendidas entre 85 m2 y 130 m2; y se evidencian además dos valores atípicos >= 180 m2. 

g5= ggplot(datos_vivienda_3,aes(x=Area_contruida))+geom_density(kernel="gaussian",fill="#69b3a2", color="white")+theme_bw() 
g5

#De la gráfica de densidad podemos notar que la mayor cantidad de casas tienen un área de 75 m2 a 100 m2 y presenta un comportamiento del número de casas prioritariamente decreciente a medida que aumenta el valor del área construida.

g6= ggplot(datos_vivienda_3,aes(x=Area_contruida))+geom_dotplot(fill="#69b3a2", color="white")+theme_bw()
#axis(1, at = seq(round(min(datos_vivienda_3$Area_contruida)),
                 #round(max(datos_vivienda_3$Area_contruida)), by = 10),
     #labels = 75:200)
g6
## Bin width defaults to 1/30 of the range of the data. Pick better value with `binwidth`.

#Del gráfico de puntos podemos obtener información aún más precisa, y notamos que el mayor número de casas (9 casas correspondientes a los 9 puntos graficados) tienen áreas aproximadas a 85 m2. Entre 135 y 170 m2 no se evidencia construcciones y mayores a 175 m2, son muy raras (sólo 2)
ggarrange(g3, g4, g5, g6, labels = c("A", "B", "C", "D"),ncol = 2, nrow = 2)
## Bin width defaults to 1/30 of the range of the data. Pick better value with `binwidth`.

#Cómputos estadísticos básicos para variable PRECIO

promedio_valor= mean(datos_vivienda_3$precio_millon)
mediana_valor= median(datos_vivienda_3$precio_millon)
min_valor=min(datos_vivienda_3$precio_millon)
max_valor=max(datos_vivienda_3$precio_millon)
var_valor= var(datos_vivienda_3$precio_millon)
sd_valor= sd(datos_vivienda_3$precio_millon)

tabla_valor=data.frame(promedio_valor,mediana_valor,min_valor,max_valor, var_valor, sd_valor)
tabla_valor
promedio_valor mediana_valor min_valor max_valor var_valor sd_valor
332.0769 305 240 480 6747.674 82.14423
g1=ggplot(datos_vivienda_3,aes(x=precio_millon))+geom_histogram(binwidth=30, fill="#69b3a2", color="white")+theme_bw() 
g1

# De la tabla resumen, notamos que hay una diferencia significativa entre el promedio del área y la mediana; y si contrastamos con la desviación estándar de 82, podemos inferir que los datos no son homogéneos, ya que el rango de la data va entre 240 a 480 m2. Por otro lado, el histograma, afianza la afirmación anterior, en el sentido que no tiene un comportamiento definido.

g2=boxplot(datos_vivienda_3$precio_millon, horizontal = TRUE)
stripchart(datos_vivienda_3$precio_millon, method = "jitter", pch = 19, add = TRUE, col = "blue")
abline(v=mean(datos_vivienda_3$precio_millon),col="red",lwd=4)

#De la gráfica de Boxplot, notamos que el 50% de los datos corresponden a precios comprendidos entre 250 y 400 millones; y se evidencian además dos valores atípicos >= 450 millones.

g11= ggplot(datos_vivienda_3,aes(x=precio_millon))+geom_density(kernel="gaussian",fill="#69b3a2", color="white")+theme_bw() 
g11

#De la gráfica de densidad podemos notar que los precios con mayor densidad est´pan del orden <300 millones, lo que significa, que en este rango podremos encontrar la mayor cantidad de casas, Sin emrgo, también se resalta que hay un buen número de casas con precios que rondan los 400 millones. 

g21= ggplot(datos_vivienda_3,aes(x=precio_millon))+geom_dotplot(fill="#69b3a2", color="white")+theme_bw() 
g21
## Bin width defaults to 1/30 of the range of the data. Pick better value with `binwidth`.

#Del gráfico de puntos podemos obtener información aún más precisa, y notamos que 14 de las 26 viviendas tienen un costo menor a 300 millones, 6 casas tienen un costo mayor a 400 millones y el restante (7 casas) su precio varía entre 300 a 400 millones 
ggarrange(g1, g2, g11, g21, labels = c("A", "B", "C", "D"),ncol = 2, nrow = 2)
## Bin width defaults to 1/30 of the range of the data. Pick better value with `binwidth`.

#2. Realice un análisis exploratorio bivariado de datos enfocado en la relación entre la variable respuesta (y=precio) en función de la variable predictora (x=area) - incluir graficos e indicadores apropiados interpretados.

g18= ggplot(datos_vivienda_3, aes (x=Area_contruida, y=precio_millon))+  geom_point(fill="#69b3a2", color="black")+ theme_bw() 
g18

g8= ggplot(datos_vivienda_3, aes (x=Area_contruida, y=precio_millon))+  geom_point(fill="#69b3a2", color="black")+ geom_smooth(fill="#69b3a2", color="black") + theme_bw() 
g8
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

g0= ggplot(datos_vivienda_3, aes (x=Area_contruida, y=precio_millon))+  geom_point(fill="#69b3a2", color="black")+geom_quantile(fill="#69b3a2", color="blue")+ theme_bw() 
g0
## Smoothing formula not specified. Using: y ~ x

g10= ggplot(datos_vivienda_3, aes (x=Area_contruida, y=precio_millon))+ geom_rug(fill="#69b3a2", color="black")+theme_bw() 
g10

ggarrange(g18, g8, g0, g10, labels = c("A", "B", "C", "D"),ncol = 2, nrow = 2)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## Smoothing formula not specified. Using: y ~ x

# De las gráficas de análisis bivariado para variables cuantitativas se tiene que se evidencia un comportamiento de relación directa entre el valor de la viviendia y el área construida, es decir, que a mayor área se espera que el valor de la vivienda sea mayor. Esto se conoce como Relación Lineal Positiva

#3. Estime el modelo de regresión lineal simple entre precio = f(area)+e. Interprete los coeficientes del modelo pendiente, intercepto; en caso de ser correcto.

attach(datos_vivienda_3)
plot( Area_contruida,precio_millon, pch=16)

#cómputo del coeficiente de correlación

cor(Area_contruida,precio_millon)
## [1] 0.9190295
#El coeficiente de correlación es de r=0.9190295, lo cual está en el rango de 0.8 a 1, por lo cual presenta una Relación Lineal Positiva Fuerte. 
#summary(mod)
#par(mfrow=c(2,2))
#plot(mod)


plot( Area_contruida,precio_millon, pch=16)
mod=lm(precio_millon~Area_contruida, data=datos_vivienda_3)
y_mod=86.234+2.124*Area_contruida
lines(Area_contruida, y_mod, col="green4")

#4. Construir un intervalo de confianza (95%) para el coeficiente Beta1, interpretar y concluir si el coeficiente es igual a cero o no. Compare este resultado con una prueba de hipotesis t.

#Rta: un intervalo de confianza del (1-alpha)% para Beta1 es: 

#Limite superior = Beta1_estimador+ valor de "t"* error estándar
#Limite inferior = Beta1_estimador- valor de "t"*error estándar

qnorm(0.975) #este es para nivel de confianza de 95%, ya que queda 0.25% de cada lado, cada cola
## [1] 1.959964
ls= 2.124 + (1.96*0.186)
li= 2.124 - (1.96*0.186)

data.frame(li,ls)
li ls
1.75944 2.48856
#el valor de "t" depende del nivel de confianza y la cantidad de datos (n-2). El intervalo de confianza para Beta1 es de 1.76 a 2.49, y no incluye el cero, lo cual significa que nunca se anulará porque lo cual tendrá siempre influencia en la predicción del precio de la vivienda.  


# 5. Calcule e interprete el indicador de bondad y ajuste R2.

summary(mod)
## 
## Call:
## lm(formula = precio_millon ~ Area_contruida, data = datos_vivienda_3)
## 
## 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
#Del resumen podemos observar que si se incrementa por ejemplo un 1 % el área de la construcción, el precio de la vivienda aumetaría 2%. 
#El intercepto nos da nociones, entre otras,  de un valor estándar básico, y es el valor del metro cuadrado, sin embargo, notamos un comportamiento anorma, ya que no es lógico que 1m2 cueste 88 millones de pesos. 
#El coeficiente R^2 es de 0.84, lo cual pertenece al rango 0.7 a 0.9, significando que el modelo presenta un ajuste Bueno, a los datos. Además podemos mencionar que el modelo explica en un 84% el valor del precio de la vivienda con respecto a su área construida. 

par(mfrow=c(2,2))
plot(mod)

#6. Cual seria el precio promedio estimado para un apartamento de 110 metros cuadrados? Considera entonces con este resultado que un apartemento en la misma zona con 110 metros cuadrados en un precio de 200 millones seria una buena oferta? Que consideraciones adicionales se deben tener?.

#Para usar la fórmula anetriormente calculada con la finalidad de predecir nuevos valores, lo realizamos de la siguiente manera:


y_mod_est=86.234+2.124*110
y_mod_est
## [1] 319.874
#Otra forma con función predict
mod=lm(precio_millon~Area_contruida, data=datos_vivienda_3)
predict(mod,newdata= list(Area_contruida=110))
##        1 
## 319.8706
#Según la función, tenemos que para un área de 110 m2, el valor estimado es de 319 millones de pesos. Por lo cual, en principio un aparatmento con esas dimensiones por un valor de 200 millones sería una buena oferta, sin embargo, entran en juego otras variables que el modelo no considera, como por ejemplo, antiguedad de la vivienda, si es zona peatonal, si tiene parqueadero, número de habitaciones, número de pisos, si está hipotecada o no; en fin, son muchas variables que al tener estos datos sería mucho más acertado tomar una decisión. 


#7. Realice la validación de supuestos del modelo por medio de gráficos apropiados, interpretarlos y sugerir posibles soluciones si se violan algunos de ellos.
par(mfrow=c(2,2))
plot(mod)

#El gráfico Residuales vs Fitted debería mostrar una completa aletoriedad porque se espera que los residuales no tengan ningún comportamiento. Es decir, que la relacional que establecimos puede ser que no sea necesariamente lineal. 

#Igualmente el gráfico de normalidad vemos que hay algunos puntos que no están completamente cercanos a la línea de la distribución normal, lo cual refuerza la afirmación anterior. 

#Como los supuestos de aletoriedad de los errores no se están cumplimiendo entonces podríamos intentar ingresar alguna transformación que logre un mejor ajuste. 

#8 y 9 . De ser necesario realice una transformación apropiada para mejorar el ajuste y supuestos del modelo. De ser necesario compare el ajuste y supuestos del modelo inicial y el transformado.

#Vamos a utlizar una transformación doblemente logarítmica y comparamos medidas de bondad y validación de supuestos

mod_trans=lm(log(precio_millon)~log(Area_contruida), data=datos_vivienda_3)
summary(mod_trans)
## 
## Call:
## lm(formula = log(precio_millon) ~ log(Area_contruida), data = datos_vivienda_3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.13325 -0.07583 -0.01435  0.07501  0.16051 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          1.96408    0.29228    6.72 5.97e-07 ***
## log(Area_contruida)  0.80928    0.06194   13.06 2.11e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.08859 on 24 degrees of freedom
## Multiple R-squared:  0.8767, Adjusted R-squared:  0.8716 
## F-statistic: 170.7 on 1 and 24 DF,  p-value: 2.109e-12
par(mfrow=c(2,2))
plot(mod_trans)

#Vamos a utlizar una transformación logarítmica y comparamos medidas de bondad y validación de supuestos

mod_trans2=lm(precio_millon~log(Area_contruida), data=datos_vivienda_3)
summary(mod_trans2)
## 
## Call:
## lm(formula = precio_millon ~ log(Area_contruida), data = datos_vivienda_3)
## 
## 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 ***
## log(Area_contruida)   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
par(mfrow=c(2,2))
plot(mod_trans2)

R2_sin_transformacion= 0.844
R2_transf_logaritmica=0.896
R2_transf_potencia=0.876

tabla_R2= data.frame(
R2_sin_transformacion,
R2_transf_logaritmica,
R2_transf_potencia)
tabla_R2
R2_sin_transformacion R2_transf_logaritmica R2_transf_potencia
0.844 0.896 0.876
#Así entonces la mejor transformación es la logarítmica. Además si comparamos los supuestos del modelo incial sin ningún tipo de transformación y el ajustado, vemos que tienen un mejor comportamiento, por ejemplo en el gráfico Q-Q los datos se ajustan más a la línea normal.