Emerson Trujillo Sierra
library(readxl)
library(ggplot2)
datos_viviendas<- read_excel("C:/Users/portatil/DatosR/Metodos2/Datos_Vivienda.xlsx")
attach(datos_viviendas)
head(datos_viviendas,n = c(6,7))
## # A tibble: 6 × 7
## Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## <chr> <chr> <dbl> <dbl> <dbl> <chr> <dbl>
## 1 Zona Sur 2 6 880 237 2 5
## 2 Zona Oeste 2 4 1200 800 3 6
## 3 Zona Sur 3 5 250 86 NA 2
## 4 Zona Sur NA 6 1280 346 4 6
## 5 Zona Sur 2 6 1300 600 4 7
## 6 Zona Sur 3 6 513 160 2 4
a. Realice un filtro a la base de datos e incluya solo las ofertas de apartamentos, de la zona norte de la ciudad con precios inferiores a los 500 millones de pesos y áreas menores a 300 mt2. Presente los primeros 3 registros de la base y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de la base, discutir si todos los puntos se ubican en la zona norte o se presentan valores en otras zonas, por que?).
#Filtros:
filtro = which ( datos_viviendas$Tipo == "Apartamento" & datos_viviendas$Zona == "Zona Norte" & datos_viviendas$precio_millon < 500 & datos_viviendas$Area_contruida < 300)
#datos filtrados:
viviendas_fil = datos_viviendas[filtro,]
# arqueadero pasarlo a tipo númerico
viviendas_filt <- transform(viviendas_fil, parqueaderos = as.numeric(parqueaderos))
#Reemplazar NA
viviendas_filt[is.na(viviendas_filt)] <- 0
head(viviendas_filt, n = c(6,7))
## Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## 1 Zona Norte 2 3 135 56 1 1
## 2 Zona Norte NA 3 78 54 2 1
## 3 Zona Norte NA 5 340 106 2 2
## 4 Zona Norte 1 3 135 103 1 3
## 5 Zona Norte 1 3 75 54 1 2
## 6 Zona Norte NA 4 175 77 1 2
require(leaflet)
leaflet() %>% addCircleMarkers(lng= viviendas_filt$cordenada_longitud, lat=viviendas_filt$Cordenada_latitud, radius = 4, color = "red") %>% addTiles()
En el mapa donde se referencia todos los apartamentos ubicados en la zona norte de la ciudad,ademas con precios inferiores a los 500 millones y areas menores a 300 m2, se puede observar que muchos de los puntos se encuentran referenciados en la zona sur, incluso algunos en la zona oeste y oriente, esto se debe a que en la base de datos original a muchos apartamentos que quedan en la zona sur, oeste y oriente le han reistrado coordenada longitud y latitud norte, en este caso como el modelo grafica las ubicaciones respecto a la longitud y latitud entonces se esta presentadno el error.
b. Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio del apartamento) en función del área construida, estrato y si tiene parqueadero. Use gráficos interactivos con plotly e interprete los resultados.
grafico=ggplot(viviendas_filt,aes(y=precio_millon,x=Area_contruida)) + geom_point(colour = "red", size = 2) + geom_smooth()
grafico
De acuerdo al grafico Se puede observar una relación directa, es decir a mayor área contruida, mayor es el precio.
grafico=ggplot(viviendas_filt,aes(y=precio_millon,x=Estrato)) + geom_point(colour = "red", size = 2) + geom_smooth()
grafico
Según el gráfico se puede observar que entre mayor sea el estrato, mayor es el precio de la vivienda.
grafico=ggplot(viviendas_filt,aes(y=precio_millon,x=parqueaderos)) + geom_point(colour = "red", size = 2) + geom_smooth()
grafico
Según el gráfico no se puede definir una relación existente entre el numero de parqueaderos vs el precio de la vivienda.
C. Estime un modelo de regresión lineal múltiple con las variables del punto anterior e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).
modelo_multi_vivi = lm(precio_millon ~ Area_contruida + Estrato + parqueaderos, data = viviendas_filt )
summary(modelo_multi_vivi)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Estrato + parqueaderos,
## data = viviendas_filt)
##
## Residuals:
## Min 1Q Median 3Q Max
## -216.571 -31.564 -1.213 27.889 224.053
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -157.38220 7.71190 -20.408 < 2e-16 ***
## Area_contruida 0.94938 0.06054 15.682 < 2e-16 ***
## Estrato 68.99436 2.26623 30.445 < 2e-16 ***
## parqueaderos 22.64906 2.73064 8.294 3.24e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 53.75 on 1073 degrees of freedom
## Multiple R-squared: 0.7629, Adjusted R-squared: 0.7623
## F-statistic: 1151 on 3 and 1073 DF, p-value: < 2.2e-16
La ecuación de regresión corresponde a: Preciomillon = −157.38220 + 0.94938(Area_contruida) + 68.99436(Estrato) + 22.64906(parqueaderos)
R cuadrado es igual a 0.7623 significa que la variables: area construida, estrato y parquaderos explican el 76% del precio del apartamento.
Hipótesis para ßo: Ho:βo=0,Ha:β0≠0
p−value=2e−16∗∗∗
Ya que p-value < 0.05, se rechaza H0: ß0 = 0 Hipótesis para ß1: H0:β1=0,Ha:β1≠0
p−value=2e−16∗∗∗
Ya que p-value < 0.05, se rechaza Ho: ß2 = 0 Hipótesis para ß2: Ho:β2=0,Ha:β2≠0
p−value=2e−16∗∗∗
ya que p-value < 0.05, se rechaza Ho: ß2 = 0 Hipótesis para ß3: Ho:β3=0,Ha:β3≠0
p−value=3.24e−16∗∗∗
Ya que p-value < 0.05, se rechaza Ho: ß3 = 0
d. Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas solo realizar sugerencias de que se podría hacer).
par(mfrow = c(2, 2))
plot(modelo_multi_vivi)
Supuesto 1: El valor esperado de los errores es cero E[u]=0
summary(modelo_multi_vivi$residuals)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -216.571 -31.564 -1.213 0.000 27.889 224.053
t.test(modelo_multi_vivi$residuals, mu=0)
##
## One Sample t-test
##
## data: modelo_multi_vivi$residuals
## t = 6.246e-16, df = 1076, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -3.209419 3.209419
## sample estimates:
## mean of x
## 1.021631e-15
p-value = 1 > α = 0.05, se tiene evidencia suficiente para no rechazar que Ho: ßo = 0, por tanto el supuesto se cumple.
Supuesto 2 : Los errores tienen varianza constante. V[ui]=σ2
library(lmtest)
lmtest::gqtest(modelo_multi_vivi) ##La prueba de Goldfeld-Quandt se utiliza para determinar si la heterocedasticidad está presente en un modelo de regresión.##
##
## Goldfeld-Quandt test
##
## data: modelo_multi_vivi
## GQ = 1.8151, df1 = 535, df2 = 534, p-value = 4.04e-12
## alternative hypothesis: variance increases from segment 1 to 2
como p-value = 4.04e-12 < α = 0.05, se rechaza la hipotesis nula, quiere decir que, los errores no tienen varianza constante, el supuesto no se cumple.
Supuesto 3 : u es una variable con distribución normal. u∼ Normal
shapiro.test(modelo_multi_vivi$residuals)
##
## Shapiro-Wilk normality test
##
## data: modelo_multi_vivi$residuals
## W = 0.98702, p-value = 3.509e-08
Como p-value = 3.509e-08 < α = 0.05, se rechaza la hipótesis nula, quiere decir que, los errores no se distibuyen de forma normal, el supuesto no se cumple.
Supuesto 4 : Los errores son independientes unos de otros E[ui,uj]
lmtest::dwtest(modelo_multi_vivi)
##
## Durbin-Watson test
##
## data: modelo_multi_vivi
## DW = 1.757, p-value = 2.992e-05
## alternative hypothesis: true autocorrelation is greater than 0
Como p-value = 2.992e-05 < α = 0.05, se rechaza la hipótesis nula, quiere decir que, los errores no son indepentientes, el supuesto no se cumple.
e. Con el modelo identificado predecir el precio de un apartamento con 100 mt2, de estrato 4 y con parqueadero. ¿Si este apartamento lo están ofreciendo en 450 millones cual seria su opinión con base en el resultado del modelo considera que es una buena oferta?
#con un parqueadero:
predict(modelo_multi_vivi,list(Area_contruida=100, Estrato = 4, parqueaderos = 1), interval = "confidence" )
## fit lwr upr
## 1 236.1822 232.2449 240.1195
#con dos parqueaderos:
predict(modelo_multi_vivi,list(Area_contruida=100, Estrato = 4, parqueaderos = 2), interval = "confidence" )
## fit lwr upr
## 1 258.8313 251.7806 265.8819
#con tres parqueaderos:
predict(modelo_multi_vivi,list(Area_contruida=100, Estrato = 4, parqueaderos = 3), interval = "confidence" )
## fit lwr upr
## 1 281.4803 269.5918 293.3689
#con cuatro parqueaderos:
predict(modelo_multi_vivi,list(Area_contruida=100, Estrato = 4, parqueaderos = 4), interval = "confidence" )
## fit lwr upr
## 1 304.1294 287.0889 321.1699
De acuerdo con el modelo de precio estimado de apartamentos, no seria una buena oferta, ya que la predicción con diferentes cantidades de parqueaderos nos da un precio inferior a 450 millones.
f. Con las predicciones del modelo sugiera potenciales ofertas para una persona interesada en un apartamento en la zona norte con mas de 100 mt2 de área, de estrato 4, que tenga parqueadero y tenga encuenta que la persona tiene un crédito preaprobado de máximo 400 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.
Aptos = which ( viviendas_filt$Area_contruida >100 & viviendas_filt$Estrato == 4 & viviendas_filt$parqueaderos >=1 & viviendas_filt$precio_millon <= 400 & viviendas_filt$precio_millon >= 236.1822)
#datos filtrados:
viviendas_filt2 = viviendas_filt[Aptos,]
min(viviendas_filt2$precio_millon)
## [1] 240
max(viviendas_filt2$Area_contruida)
## [1] 287
Aptos1 = which((viviendas_filt2$precio_millon == 240 | viviendas_filt2$Area_contruida == 287 | viviendas_filt2$Habitaciones ==4 | viviendas_filt2$Banos ==3) & (viviendas_filt2$Barrio =="la flora" | viviendas_filt2$Barrio == "versalles") )
viviendas_Filt5 = viviendas_filt2[Aptos1,]
head(viviendas_Filt5,n = c(7,7))
## Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## 418 Zona Norte 4 4 380 123 1 3
## 755 Zona Norte NA 4 265 125 2 3
## 788 Zona Norte 2 4 380 126 2 3
## 800 Zona Norte 6 4 270 152 1 3
## 844 Zona Norte 2 4 240 103 1 2
## 893 Zona Norte NA 4 270 111 1 3
## 921 Zona Norte 7 4 300 126 2 4
require(leaflet)
leaflet() %>% addCircleMarkers(lng= viviendas_Filt5$cordenada_longitud, lat=viviendas_Filt5$Cordenada_latitud,radius = 8, color = "red") %>% addTiles()