1. Se realizá el cargue del data set, se ajusta el tipo de dato del estrato y se considera los datos NA como sin parqueadero (0), y por último, se realiza el filtro por zona norte y tipo de vivienda casa, además se filtran los registros que tengan número de habitaciones y baños diferentes de 0.
#install.packages("devtools") # solo la primera vez
#devtools::install_github("dgonxalex80/paqueteMOD", force =TRUE)
library(paqueteMOD)
data("vivienda")
vivienda$Estrato=factor(vivienda$Estrato)
vivienda$parqueaderos<-replace(vivienda$parqueaderos,vivienda$parqueaderos=="NA",0)
vivienda$parqueaderos<-as.numeric(vivienda$parqueaderos)
vivienda_subset=vivienda[vivienda$Zona=="Zona Norte" & vivienda$Tipo=="Casa" & vivienda$Banos!=0 & vivienda$Habitaciones!=0,]
head(vivienda_subset)
## Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## 58 Zona Norte NA 5 400 212 0 2
## 88 Zona Norte NA 3 175 130 0 3
## 94 Zona Norte 2 4 265 162 1 3
## 98 Zona Norte NA 3 120 130 1 2
## 110 Zona Norte 3 3 125 140 1 2
## 118 Zona Norte 2 3 140 130 1 2
## Habitaciones Tipo Barrio cordenada_longitud
## 58 4 Casa santa mónica residencial -76.47300
## 88 4 Casa brisas de los -76.48200
## 94 4 Casa zona norte -76.48238
## 98 4 Casa floralia -76.48271
## 110 4 Casa calimio norte -76.48386
## 118 3 Casa calimio norte -76.48452
## Cordenada_latitud
## 58 3.41800
## 88 3.47800
## 94 3.46786
## 98 3.47055
## 110 3.48502
## 118 3.48630
2. Se identifica que hay 3 registros con valores nulos, y por lo tanto, se decide eliminar estos registros para no tener problemas posteriores, esto se considera una limpieza preliminar del dataset. De acuerdo con los filtros realizados y la eliminación de estos 3 registros, se obtiene un dataset con 700 observaciones.
vivienda_subset[rowSums(is.na(vivienda_subset)) == ncol(vivienda_subset),]
## Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## NA <NA> <NA> <NA> NA NA NA NA
## NA.1 <NA> <NA> <NA> NA NA NA NA
## NA.2 <NA> <NA> <NA> NA NA NA NA
## Habitaciones Tipo Barrio cordenada_longitud Cordenada_latitud
## NA NA <NA> <NA> NA NA
## NA.1 NA <NA> <NA> NA NA
## NA.2 NA <NA> <NA> NA NA
data_subset=vivienda_subset[rowSums(is.na(vivienda_subset)) != ncol(vivienda_subset),]
head(data_subset)
## Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## 58 Zona Norte NA 5 400 212 0 2
## 88 Zona Norte NA 3 175 130 0 3
## 94 Zona Norte 2 4 265 162 1 3
## 98 Zona Norte NA 3 120 130 1 2
## 110 Zona Norte 3 3 125 140 1 2
## 118 Zona Norte 2 3 140 130 1 2
## Habitaciones Tipo Barrio cordenada_longitud
## 58 4 Casa santa mónica residencial -76.47300
## 88 4 Casa brisas de los -76.48200
## 94 4 Casa zona norte -76.48238
## 98 4 Casa floralia -76.48271
## 110 4 Casa calimio norte -76.48386
## 118 3 Casa calimio norte -76.48452
## Cordenada_latitud
## 58 3.41800
## 88 3.47800
## 94 3.46786
## 98 3.47055
## 110 3.48502
## 118 3.48630
y <- table1::table1(~ Zona+Tipo, data = data_subset)
y
| Overall (N=700) |
|
|---|---|
| Zona | |
| Zona Norte | 700 (100%) |
| Tipo | |
| Casa | 700 (100%) |
3. Se importan las librerias necesarias y se crea el mapa con las ubicaciones de las viviendas ofertadas. En el mapa se puede identificar que aunque se hizo el filtro de la zona Norte de Cali, hay algunas viviendas con ubicación en la zona sur. Una razón que podría justificar este comportamiento, es que al momento de la recolección de las observaciones se cometieron errores al etiquetar la zona de los registros, o que hay errores en las variables de ubicación (latitud y longitud).
#install.packages("maps")
library(maps)
#install.packages("mapdata")
library(mapdata)
library(ggplot2)
library(ggrepel)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
#install.packages("raster")
library(raster)
## Loading required package: sp
##
## Attaching package: 'raster'
## The following object is masked from 'package:dplyr':
##
## select
#install.packages("sf")
library(sf)
## Linking to GEOS 3.9.3, GDAL 3.5.2, PROJ 8.2.1; sf_use_s2() is TRUE
library(ggmap)
## ℹ Google's Terms of Service: <]8;;https://mapsplatform.google.comhttps://mapsplatform.google.com]8;;>
## ℹ Please cite ggmap if you use it! Use `citation("ggmap")` for details.
register_google("AIzaSyB3DlKKdgMb2SUniuBYeax3aLAZexDNJGw")
cali<-get_map(c(-76.5, 3.43), zoom=12)
## ℹ <]8;;https://maps.googleapis.com/maps/api/staticmap?center=3.43,-76.5&zoom=12&size=640x640&scale=2&maptype=terrain&language=en-EN&key=xxxhttps://maps.googleapis.com/maps/api/staticmap?center=3.43,-76.5&zoom=12&size=640x640&scale=2&maptype=terrain&language=en-EN&key=xxx]8;;>
mapa<-ggmap(cali)
mapa<-mapa+
ggtitle( "Mapa de Cali - análisis 1")+
geom_point(data=data_subset, aes(cordenada_longitud, Cordenada_latitud),
color= "red", size=0.5)
mapa
4. Análisis exploratorio
Se identifica que las distribuciones para las variables precio, área
construida, baños y habitaciones tienen un sesgo positivo, además que
para todas estas variables se rechaza la hipótesis nula de que las
variables sigan una distribución normal con un 95% de confianza. De
forma general, el precio promedio de las viviendas tipo casa y ubicadas
en la zona norte es de COP 443 millones, el promedio del área construida
de estas viviendas es de 262 mts, además estas viviendas tienen en
promedio 4.63 habitaciones y 3.60 baños. En cuanto a la variable
categórica estrato, se observa una diferencia en las distribuciones del
precio para cada estrato, lo que podría dar una primera relación de que
el precio de las viviendas si depende del estrato.
Con respecto a las correlaciones entre las variables explicativas numéricas y el precio de las viviendas, hay una correlación significativa de 73% entre el precio de las viviendas y el área construida, para las variables de numero de baños y habitaciones esta correlación es inferior al 60% (56% y 37%, respectivamente). Para revisar la multicolinealidad entre las variables explicativas, la más alta correlación (60%) se presenta entre el número de baños y habitaciones, entre las demás variables esta correlación está por debajo del 50%.
A través de las gráficas de dispersión, se observa que existe una diferencia en el precio de la vivienda en función del área construida y el estrato, es decir, que el precio del metro cuadrado varia en función del estrato, por lo que, evaluaremos la interacción de ambas variables. En cuanto a las variables de numero de baños y habitaciones no identificamos una posible interacción con el estrato.
#install.packages("plotly")
#install.packages("GGally")
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggmap':
##
## wind
## The following object is masked from 'package:raster':
##
## select
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(GGally)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
require(ggpubr)
## Loading required package: ggpubr
##
## Attaching package: 'ggpubr'
## The following object is masked from 'package:raster':
##
## rotate
require(ggplot2)
Datos_graf=select(data_subset, precio_millon, Area_contruida, Banos, Habitaciones)
p1<-ggplotly(ggpairs(Datos_graf))
## Warning: Can only have one: highlight
## Warning: Can only have one: highlight
## Warning: Can only have one: highlight
p1
y <- table1::table1(~precio_millon+Area_contruida+Banos+Habitaciones, data =data_subset)
y
| Overall (N=700) |
|
|---|---|
| precio_millon | |
| Mean (SD) | 443 (268) |
| Median [Min, Max] | 390 [89.0, 1940] |
| Area_contruida | |
| Mean (SD) | 262 (167) |
| Median [Min, Max] | 240 [30.0, 1440] |
| Banos | |
| Mean (SD) | 3.60 (1.47) |
| Median [Min, Max] | 3.00 [1.00, 10.0] |
| Habitaciones | |
| Mean (SD) | 4.63 (1.69) |
| Median [Min, Max] | 4.00 [1.00, 10.0] |
p2<-plot_ly(data_subset, x=~Area_contruida, y=~precio_millon, color=~Estrato, type="scatter", mode="markers", marker=list(size=~Estrato), symbol =~Estrato)
p2
p3<-plot_ly(data_subset, x=~Banos, y=~precio_millon, color=~Estrato, type="scatter", mode="markers", marker=list(size=~Estrato), symbol =~Estrato)
p3
p4<-plot_ly(data_subset, x=~Habitaciones, y=~precio_millon, color=~Estrato, type="scatter", mode="markers", marker=list(size=~Estrato), symbol =~Estrato)
p4
p5<-plot_ly(data_subset, y=~precio_millon, color=~Estrato)%>%add_boxplot(x=~Estrato)
p5
shapiro.test(data_subset$precio_millon)
##
## Shapiro-Wilk normality test
##
## data: data_subset$precio_millon
## W = 0.85952, p-value < 2.2e-16
shapiro.test(data_subset$Area_contruida)
##
## Shapiro-Wilk normality test
##
## data: data_subset$Area_contruida
## W = 0.85991, p-value < 2.2e-16
shapiro.test(data_subset$Habitaciones)
##
## Shapiro-Wilk normality test
##
## data: data_subset$Habitaciones
## W = 0.87309, p-value < 2.2e-16
shapiro.test(data_subset$Banos)
##
## Shapiro-Wilk normality test
##
## data: data_subset$Banos
## W = 0.91589, p-value < 2.2e-16
shapiro.test(data_subset$parqueaderos)
##
## Shapiro-Wilk normality test
##
## data: data_subset$parqueaderos
## W = 0.80666, p-value < 2.2e-16
5. Regresión lineal multiple
a. Primero se realizó una prueba ANOVA para identificar la significancia de la interacción entre las variables estrato y área construida. El resultado de esta prueba F es que si es significativa con un 95% de confianza.
#significancia de la interaccion
fit1 <- lm(precio_millon~Area_contruida:Estrato+Estrato+Banos+Habitaciones+parqueaderos, data=data_subset)
fit2 <- lm(precio_millon~Area_contruida+Estrato+Banos+Habitaciones+parqueaderos, data=data_subset)
anova(fit2,fit1,test="F")
## Analysis of Variance Table
##
## Model 1: precio_millon ~ Area_contruida + Estrato + Banos + Habitaciones +
## parqueaderos
## Model 2: precio_millon ~ Area_contruida:Estrato + Estrato + Banos + Habitaciones +
## parqueaderos
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 692 16859159
## 2 689 16028236 3 830923 11.906 1.311e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
b. Se realiza un modelo inicial (modelo0 precio=area_construida:estrato + area_construida + estrato + numero_habitaciones + numero_baños + parqueaderos) donde se considera cada variable independiente y la interacción entre el estrato y el área construida. Sin embargo, los parámetros obtenidos no son coherentes al negocio, ya que al interpretar el beta para la variable estrato 4 (-65.85) nos indica que el valor promedio de una casa en el norte Cali de estrato 4 es 65 millones más económica que en estrato 3, lo que va en contra de lo real. Por lo anterior, se deciden hacer dos modelos, en el primero solo se va a incluir la interacción y en el segundo no se va a incluir interacción.
modelo0<-lm(precio_millon~Area_contruida:Estrato+Estrato+Banos+Habitaciones+parqueaderos, data=data_subset)
summary(modelo0)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida:Estrato + Estrato +
## Banos + Habitaciones + parqueaderos, data = data_subset)
##
## Residuals:
## Min 1Q Median 3Q Max
## -726.73 -68.09 -18.45 47.95 968.36
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 69.2365 20.5364 3.371 0.00079 ***
## Estrato4 -65.8577 33.9557 -1.940 0.05285 .
## Estrato5 42.4328 27.0560 1.568 0.11726
## Estrato6 263.7452 53.7796 4.904 1.17e-06 ***
## Banos 29.2068 5.7853 5.048 5.71e-07 ***
## Habitaciones 7.2124 4.7291 1.525 0.12769
## parqueaderos 1.6372 4.2873 0.382 0.70268
## Area_contruida:Estrato3 0.3844 0.0851 4.517 7.38e-06 ***
## Area_contruida:Estrato4 1.0770 0.1088 9.898 < 2e-16 ***
## Area_contruida:Estrato5 0.8754 0.0579 15.118 < 2e-16 ***
## Area_contruida:Estrato6 0.7711 0.1175 6.563 1.04e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 152.5 on 689 degrees of freedom
## Multiple R-squared: 0.6802, Adjusted R-squared: 0.6755
## F-statistic: 146.5 on 10 and 689 DF, p-value: < 2.2e-16
c. En el modelo 1 (modelo1 precio=area_construida:estrato + numero_habitaciones + numero_baños + parqueaderos) se realizó la selección de variables backward con el criterio p-valor, de este se obtuvo que las variables significativas y que explican el precio de las viviendas son la interacción entre el área construida y el estrato, y la variable número de baños, ya que para ninguna se rechazó la hipótesis nula sobre los parámetros betas, además el R2 ajustado que se obtuvo de este modelo es de 66.10%. Al realizar la prueba ANOVA sobre este modelo se obtiene que estas variables son significativas para explicar el precio de la vivienda, y al realizar la prueba POSANOVA que se realizó sobre la variable estrato, se obtuvo que si hay una diferencia significativa en el precio de las viviendas para cada estrato.
library(glmtoolbox)
modelo1<-lm(precio_millon~Area_contruida:Estrato+Banos+Habitaciones+parqueaderos, data=data_subset)
mod_backward1<-stepCriterion(modelo1,direction = 'backward',criterion = "p-value")
##
## Family: gaussian
## Link function: identity
##
## Initial model:
## ~ Area_contruida:Estrato + Banos + Habitaciones + parqueaderos
##
##
## Step 0 :
## df AIC BIC adj.R-squared prd.R-squared
## - parqueaderos 1 9063.5482 9099.9568 0.6614 0.6456
## - Habitaciones 1 9064.8491 9101.2578 0.6608 0.6450
## - Banos 1 9096.6230 9133.0317 0.6450 0.6292
## - Area_contruida:Estrato 4 9523.9352 9546.6906 0.3436 0.3365
## <none> 9065.1337 9106.0934 0.6611 0.6440
## Mallows' CP Pr(>F)(*)
## - parqueaderos 6.4099 0.5222
## - Habitaciones 7.6980 0.1930
## - Banos 39.9113 8.832e-09
## - Area_contruida:Estrato 656.0917 < 2.2e-16
## <none> 8.0000
##
## Step 1 : - parqueaderos
##
## df AIC BIC adj.R-squared prd.R-squared
## - Habitaciones 1 9063.4174 9095.2749 0.6610 0.6464
## - Banos 1 9096.3084 9128.1660 0.6447 0.6303
## - Area_contruida:Estrato 4 9544.9990 9563.2033 0.3226 0.3171
## <none> 9063.5482 9099.9568 0.6614 0.6456
## Mallows' CP Pr(>F)(*)
## - Habitaciones 6.2613 0.1739
## - Banos 39.6613 4.515e-09
## - Area_contruida:Estrato 699.2488 < 2.2e-16
## <none> 6.4099
##
## Step 2 : - Habitaciones
##
## df AIC BIC adj.R-squared prd.R-squared
## - Banos 1 9122.3415 9149.6480 0.6307 0.6157
## - Area_contruida:Estrato 4 9544.4280 9558.0813 0.3222 0.3202
## <none> 9063.4174 9095.2749 0.6610 0.6464
## Mallows' CP Pr(>F)(*)
## - Banos 67.3935 7.883e-15
## - Area_contruida:Estrato 700.0961 < 2.2e-16
## <none> 6.2613
##
##
## Final model:
## ~ Banos + Area_contruida:Estrato
##
## ********************************************************************************************
## (*) p-values of the F test
## Effects are included when their p-values are lower than 0.05
## Effects are dropped when their p-values are higher than 0.05
summary(mod_backward1)
## Length Class Mode
## initial 1 -none- character
## direction 1 -none- character
## criterion 1 -none- character
## final 1 -none- character
##anova
modelo_variables1<-lm(precio_millon~Area_contruida:Estrato+Banos, data=data_subset)
anova(modelo_variables1)
## Analysis of Variance Table
##
## Response: precio_millon
## Df Sum Sq Mean Sq F value Pr(>F)
## Banos 1 16195845 16195845 666.34 < 2.2e-16 ***
## Area_contruida:Estrato 4 17052237 4263059 175.39 < 2.2e-16 ***
## Residuals 694 16868228 24306
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##posanova
#install.packages("agricolae")
require(agricolae)
## Loading required package: agricolae
compara=LSD.test(modelo_variables1,c("Estrato"))
compara
## $statistics
## MSerror Df Mean CV
## 24305.8 694 443.1714 35.17898
##
## $parameters
## test p.ajusted name.t ntr alpha
## Fisher-LSD none Estrato 4 0.05
##
## $means
## precio_millon std r LCL UCL Min Max Q25 Q50 Q75
## 3 243.2795 121.0670 229 223.0519 263.5070 89 1100 160.0 210 300
## 4 426.6026 210.3872 151 401.6927 451.5126 160 1800 317.5 380 520
## 5 550.4419 247.3180 267 531.7090 569.1749 125 1940 390.0 480 650
## 6 813.6604 288.4320 53 771.6145 855.7062 430 1600 590.0 780 930
##
## $comparison
## NULL
##
## $groups
## precio_millon groups
## 6 813.6604 a
## 5 550.4419 b
## 4 426.6026 c
## 3 243.2795 d
##
## attr(,"class")
## [1] "group"
d. En el modelo 2 (modelo1 precio=area_construida + estrato + numero_habitaciones + numero_baños + parqueaderos) se realizó la selección de variables backward con el criterio p-valor, de este se obtuvo que las variables significativas y que explican el precio de las viviendas son el área construida, el estrato y la variable número de baños, ya que para ninguna se rechazó la hipótesis nula sobre los parámetros betas, además el R2 ajustado que se obtuvo de este modelo es de 63.96%. Al realizar la prueba ANOVA sobre este modelo se obtiene que estas variables son significativas para explicar el precio de la vivienda, y al realizar la prueba POSANOVA que se realizó sobre la variable estrato, se obtuvo que si hay una diferencia significativa en el precio de las viviendas para cada estrato.
modelo2<-lm(precio_millon~Area_contruida+Estrato+Banos+Habitaciones+parqueaderos, data=data_subset)
mod_backward2<-stepCriterion(modelo2,direction = 'backward',criterion = "p-value")
##
## Family: gaussian
## Link function: identity
##
## Initial model:
## ~ Area_contruida + Estrato + Banos + Habitaciones + parqueaderos
##
##
## Step 0 :
## df AIC BIC adj.R-squared prd.R-squared
## - parqueaderos 1 9065.5828 9101.9914 0.6604 0.6468
## - Habitaciones 1 9065.7694 9102.1780 0.6603 0.6469
## - Banos 1 9089.1626 9125.5712 0.6488 0.6353
## - Estrato 3 9198.4004 9225.7069 0.5883 0.5740
## - Area_contruida 1 9311.1559 9347.5645 0.5177 0.5076
## <none> 9067.0409 9108.0007 0.6602 0.6454
## Mallows' CP Pr(>F)(*)
## - parqueaderos 6.5358 0.4644
## - Habitaciones 6.7205 0.3963
## - Banos 30.2616 1.053e-06
## - Estrato 152.0284 < 2.2e-16
## - Area_contruida 297.5600 < 2.2e-16
## <none> 8.0000
##
## Step 1 : - parqueaderos
##
## df AIC BIC adj.R-squared prd.R-squared
## - Habitaciones 1 9064.4298 9096.2873 0.6605 0.6482
## - Banos 1 9088.4125 9120.2700 0.6487 0.6365
## - Estrato 3 9200.3952 9223.1506 0.5865 0.5737
## - Area_contruida 1 9313.9277 9345.7853 0.5151 0.5063
## <none> 9065.5828 9101.9914 0.6604 0.6468
## Mallows' CP Pr(>F)(*)
## - Habitaciones 5.3743 0.36
## - Banos 29.5416 7.189e-07
## - Estrato 154.8475 < 2.2e-16
## - Area_contruida 302.2878 < 2.2e-16
## <none> 6.5358
##
## Step 2 : - Habitaciones
##
## df AIC BIC adj.R-squared prd.R-squared
## - Banos 1 9105.2982 9132.6047 0.6396 0.6285
## - Estrato 3 9205.8141 9224.0184 0.5827 0.5717
## - Area_contruida 1 9339.1732 9366.4797 0.4966 0.4911
## <none> 9064.4298 9096.2873 0.6605 0.6482
## Mallows' CP Pr(>F)(*)
## - Banos 47.1642 7.175e-11
## - Estrato 161.8705 < 2.2e-16
## - Area_contruida 339.5918 < 2.2e-16
## <none> 5.3743
##
##
## Final model:
## ~ Area_contruida + Estrato + Banos
##
## ********************************************************************************************
## (*) p-values of the F test
## Effects are included when their p-values are lower than 0.05
## Effects are dropped when their p-values are higher than 0.05
summary(mod_backward2)
## Length Class Mode
## initial 1 -none- character
## direction 1 -none- character
## criterion 1 -none- character
## final 1 -none- character
##anova
modelo_variables2<-lm(precio_millon~Area_contruida+Estrato+Banos, data=data_subset)
anova(modelo_variables2)
## Analysis of Variance Table
##
## Response: precio_millon
## Df Sum Sq Mean Sq F value Pr(>F)
## Area_contruida 1 26740934 26740934 1098.597 < 2.2e-16 ***
## Estrato 3 5415885 1805295 74.167 < 2.2e-16 ***
## Banos 1 1066850 1066850 43.829 7.175e-11 ***
## Residuals 694 16892641 24341
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##posanova
#install.packages("agricolae")
require(agricolae)
compara=LSD.test(modelo_variables2,c("Estrato"))
compara
## $statistics
## MSerror Df Mean CV
## 24340.98 694 443.1714 35.20443
##
## $parameters
## test p.ajusted name.t ntr alpha
## Fisher-LSD none Estrato 4 0.05
##
## $means
## precio_millon std r LCL UCL Min Max Q25 Q50 Q75
## 3 243.2795 121.0670 229 223.0373 263.5217 89 1100 160.0 210 300
## 4 426.6026 210.3872 151 401.6747 451.5306 160 1800 317.5 380 520
## 5 550.4419 247.3180 267 531.6955 569.1884 125 1940 390.0 480 650
## 6 813.6604 288.4320 53 771.5841 855.7367 430 1600 590.0 780 930
##
## $comparison
## NULL
##
## $groups
## precio_millon groups
## 6 813.6604 a
## 5 550.4419 b
## 4 426.6026 c
## 3 243.2795 d
##
## attr(,"class")
## [1] "group"
e. Debido a que el R2 ajustado para ambos modelos fue muy similar, se realizó validación cruzada aleatoria para la estimación de los parámetros de las variables ya seleccionadas para ambos modelos, esta validación cruzada se realizó utilizando una base de datos de entrenamiento con el 80% de las observaciones y se realizaron 1,000 iteraciones. La selección del modelo final se realizó con el obtuvo un mejor MAE, esto con el objetivo de contar con un modelo para una mejor predicción. Por lo anterior, el modelo seleccionado en este caso fue el 2, donde no se tuvo en cuenta la interacción entre el estrato y el área construida (MAE= 98.18 y R2=66.05%). De acuerdo con el modelo seleccionado, se interpretan los parámetros de la siguiente forma:
Se tiene que 𝑏0= 25.29. Este resultado indica que al dejar las demás variables estáticas: el precio esperado de una vivienda de estrato 3 es de COP 25 millones.
Se tiene que 𝑏1= 0.79. Este resultado indica que: Por cada metro adicional en el área construida se espera un aumento en COP 790 mil en el precio de la vivienda.
Se tiene que 𝑏2= 72.97. Este resultado indica que: El precio esperado de una vivienda de estrato 4 aumenta COP 72 millones frente a la vivienda de estrato 3.
Se tiene que 𝑏3= 135.66. Este resultado indica que: El precio esperado de una vivienda de estrato 5 aumenta COP 135 millones frente a la vivienda de estrato 3.
Se tiene que 𝑏4= 318.74. Este resultado indica que: El precio esperado de una vivienda de estrato 6 aumenta COP 318 millones frente a la vivienda de estrato 3.
Se tiene que 𝑏5= 32.47. Este resultado indica que: Por cada baño adicional se espera un aumento en COP 32 millones en el precio de la vivienda.
#install.packages("caret")
library(caret)
## Loading required package: lattice
set.seed(37)
control=trainControl(method = "LGOCV",number=1000,p=0.8)
mod_cv1=train(precio_millon~Area_contruida:Estrato+Banos,data=data_subset,method="lm",trControl=control,metric="MAE")
mod_cv1
## Linear Regression
##
## 700 samples
## 3 predictor
##
## No pre-processing
## Resampling: Repeated Train/Test Splits Estimated (1000 reps, 80%)
## Summary of sample sizes: 561, 561, 561, 561, 561, 561, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 157.4078 0.6547945 99.84042
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
summary(mod_cv1)
##
## Call:
## lm(formula = .outcome ~ ., data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -781.57 -71.92 -21.61 45.77 1065.71
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 88.52679 16.65638 5.315 1.44e-07 ***
## Banos 37.99465 4.78276 7.944 7.91e-15 ***
## `Area_contruida:Estrato3` 0.35181 0.06741 5.219 2.38e-07 ***
## `Area_contruida:Estrato4` 0.81348 0.06359 12.793 < 2e-16 ***
## `Area_contruida:Estrato5` 0.93861 0.04339 21.632 < 2e-16 ***
## `Area_contruida:Estrato6` 1.27496 0.06052 21.067 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 155.9 on 694 degrees of freedom
## Multiple R-squared: 0.6634, Adjusted R-squared: 0.661
## F-statistic: 273.6 on 5 and 694 DF, p-value: < 2.2e-16
varImp(mod_cv1)
## lm variable importance
##
## Overall
## `Area_contruida:Estrato5` 100.00
## `Area_contruida:Estrato6` 96.56
## `Area_contruida:Estrato4` 46.15
## Banos 16.60
## `Area_contruida:Estrato3` 0.00
plot(varImp(mod_cv1))
set.seed(37)
control=trainControl(method = "LGOCV",number=1000,p=0.8)
mod_cv2=train(precio_millon~Area_contruida+Estrato+Banos,data=data_subset,method="lm",trControl=control,metric="MAE")
mod_cv2
## Linear Regression
##
## 700 samples
## 3 predictor
##
## No pre-processing
## Resampling: Repeated Train/Test Splits Estimated (1000 reps, 80%)
## Summary of sample sizes: 561, 561, 561, 561, 561, 561, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 156.7209 0.6584173 98.04137
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
summary(mod_cv2)
##
## Call:
## lm(formula = .outcome ~ ., data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -935.28 -73.16 -16.53 47.44 1087.04
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 25.29855 16.06822 1.574 0.116
## Area_contruida 0.79867 0.04354 18.345 < 2e-16 ***
## Estrato4 72.97539 17.23530 4.234 2.60e-05 ***
## Estrato5 135.66243 15.89866 8.533 < 2e-16 ***
## Estrato6 318.74219 26.25005 12.143 < 2e-16 ***
## Banos 32.47268 4.90496 6.620 7.18e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 156 on 694 degrees of freedom
## Multiple R-squared: 0.6629, Adjusted R-squared: 0.6605
## F-statistic: 273 on 5 and 694 DF, p-value: < 2.2e-16
varImp(mod_cv2)
## lm variable importance
##
## Overall
## Area_contruida 100.00
## Estrato6 56.05
## Estrato5 30.47
## Banos 16.91
## Estrato4 0.00
plot(varImp(mod_cv2))
summary(mod_cv2)
##
## Call:
## lm(formula = .outcome ~ ., data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -935.28 -73.16 -16.53 47.44 1087.04
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 25.29855 16.06822 1.574 0.116
## Area_contruida 0.79867 0.04354 18.345 < 2e-16 ***
## Estrato4 72.97539 17.23530 4.234 2.60e-05 ***
## Estrato5 135.66243 15.89866 8.533 < 2e-16 ***
## Estrato6 318.74219 26.25005 12.143 < 2e-16 ***
## Banos 32.47268 4.90496 6.620 7.18e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 156 on 694 degrees of freedom
## Multiple R-squared: 0.6629, Adjusted R-squared: 0.6605
## F-statistic: 273 on 5 and 694 DF, p-value: < 2.2e-16
6. Validación de supuestos
- Media cero: En la primera gráfica (residuales vs ajustados) se observa que los errores no tienen un comportamiento aleatorio con media cero.
- Varianza constante: En esta misma gráfica se identifica un aumento de la varianza, por lo tanto, se puede inferir que los errores no cumplen con la propiedad de varianza constante. Adicionalmente, de acuerdo con las diferentes pruebas que evalúa si la varianza constante, se puede concluir que los errores del modelo de regresión lineal no tienen varianza constante ya que en todos los casos se rechaza la hipótesis nula.
- Independencia: Con base en la prueba estadistica de Durbin-Watson, se identifica que los errores del modelo de regresión lineal cumplen con la propiedad de independencia ya que no se rechaza la hipótesis nula. Sin embargo, se conoce de antemano que los datos se tomaron con corte transversal y no dependen del tiempo.
- Normalidad: De acuerdo con el segundo gráfico (Q-Q Plot), se identifica que los errores en su mayoría no siguen una distribución normal. En base a la prueba de shapiro-wilk, se puede concluir que los errores del modelo de regresión lineal no siguen una distribución normal ya que se rechaza la hipótesis nula con un nivel de confianza del 95%.
- Multicolinealidad: En base a los VIF obtenidos en el modelo seleccionado, se puede confirmar que se presentan una multicolinealidad baja entre las variables explicativas, ya que en todos los casos es menor 1.8, por lo que podemos concluir que las variables seleccionadas son correctas para el modelo y explicar el precio de las viviendas.
A. Normalidad
par(mfrow = c(2, 2))
plot(mod_cv2$finalModel)
e= mod_cv2$finalModel$residuals
# Ho: los errores tienen distribución normal
shapiro.test(e)
##
## Shapiro-Wilk normality test
##
## data: e
## W = 0.83008, p-value < 2.2e-16
B. Independencia
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
# Ho: los errores son independientes (no estan relacionados)
dwtest(mod_cv2$finalModel)
##
## Durbin-Watson test
##
## data: mod_cv2$finalModel
## DW = 1.988, p-value = 0.4237
## alternative hypothesis: true autocorrelation is greater than 0
C. Varianza constante
# Ho: la varianza de los erroes es constante
gqtest(mod_cv2$finalModel)
##
## Goldfeld-Quandt test
##
## data: mod_cv2$finalModel
## GQ = 5.5944, df1 = 344, df2 = 344, p-value < 2.2e-16
## alternative hypothesis: variance increases from segment 1 to 2
bptest(mod_cv2$finalModel)
##
## studentized Breusch-Pagan test
##
## data: mod_cv2$finalModel
## BP = 129.03, df = 5, p-value < 2.2e-16
#install.packages("glmtoolbox")
library(glmtoolbox)
vdtest(mod_cv2$finalModel)
##
## Score test for varying dispersion parameter
##
## Statistic = 855.9964
## degrees of freedom = 5
## p-value = < 2.22e-16
D. Multicolinealidad
require(car)
## Loading required package: car
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
vif(mod_cv2$finalModel)
## Area_contruida Estrato4 Estrato5 Estrato6 Banos
## 1.510639 1.445277 1.715080 1.386770 1.488530
7. Predicción del precio vivienda 1
Se realizó la predicción del precio de las viviendas para la solicitud usando el modelo seleccionado anteriormente, en base a estas características, se obtuvo que el precio de una casa en estrato 4 tendría un precio de COP 322 millones, y que una casa con estas mismas características, pero de estrato 5 tendría un precio de COP 385 millones.
vivienda1_opc1<-data.frame(Area_contruida=200,Estrato4=1,Estrato5=0,Estrato6=0,Banos=2,Habitaciones=4)
vivienda1_opc2<-data.frame(Area_contruida=200,Estrato4=0,Estrato5=1,Estrato6=0,Banos=2,Habitaciones=4)
Precio_opcion1<-predict(mod_cv2$finalModel,data.frame(vivienda1_opc1),type="response")
Precio_opcion2<-predict(mod_cv2$finalModel,data.frame(vivienda1_opc2),type="response")
print(Precio_opcion1)
## 1
## 322.9539
print(Precio_opcion2)
## 1
## 385.641
8. Potenciales ofertas
A continuación, se muestran las posibles ofertas que coinciden con las características solicitadas y en el mapa la ubicación de estas. En primer lugar, la vivienda de estrato 4 tiene un precio de COP 360 millones, es decir, COP 38 millones por encima del valor de la predicción que se realizó con el modelo seleccionado, de acuerdo con el crédito preaprobado tendría un faltante de COP 10 millones, es importante señalar que esta vivienda tiene 16 mts más que el área construida que se utilizó en la predicción y que podría explicar la diferencia del valor predicho y el valor real de esta vivienda.
En segundo lugar, para las viviendas ofertadas en estrato 5 los precios son de COP 350, 400 y 550 millones, mientras que el valor de la predicción es de COP 385 millones, por lo que para dos de estas ofertas el valor predicho si está en un punto medio y para la última oferta si está muy por debajo, para este caso también es importante señalar que estas viviendas tienen más metros que el área construida que se utilizó en la predicción y que podría explicar las diferencias entre la predicción y los precios de las ofertas. En conclusión, se considera que la tercera oferta que se muestra en la tabla cumple con las características solicitadas y con el crédito preaprobado, por lo que seria la mejor opción.
pot_ofertas_1<-filter(data_subset, Area_contruida>="200" & Area_contruida<="220" & Estrato=="4" & Habitaciones=="4" & Banos=="2")
pot_ofertas_2<-filter(data_subset, Area_contruida>="200" & Area_contruida<="220" & Estrato=="5" & Habitaciones=="4" & Banos=="2")
pot_ofertas<-rbind(pot_ofertas_1,pot_ofertas_2)
pot_ofertas
## # A tibble: 4 × 12
## Zona piso Estrato preci…¹ Area_…² parqu…³ Banos Habit…⁴ Tipo Barrio corde…⁵
## * <chr> <chr> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <dbl>
## 1 Zona… 2 4 360 216 2 2 4 Casa la me… -76.5
## 2 Zona… NA 5 400 212 0 2 4 Casa santa… -76.5
## 3 Zona… NA 5 350 216 2 2 4 Casa la me… -76.5
## 4 Zona… NA 5 550 200 3 2 4 Casa santa… -76.5
## # … with 1 more variable: Cordenada_latitud <dbl>, and abbreviated variable
## # names ¹precio_millon, ²Area_contruida, ³parqueaderos, ⁴Habitaciones,
## # ⁵cordenada_longitud
## # ℹ Use `colnames()` to see all variable names
cali2<-get_map(c(-76.5, 3.45), zoom=13)
## ℹ <]8;;https://maps.googleapis.com/maps/api/staticmap?center=3.45,-76.5&zoom=13&size=640x640&scale=2&maptype=terrain&language=en-EN&key=xxxhttps://maps.googleapis.com/maps/api/staticmap?center=3.45,-76.5&zoom=13&size=640x640&scale=2&maptype=terrain&language=en-EN&key=xxx]8;;>
mapa_1<-ggmap(cali2)
mapa_1<-mapa_1+
ggtitle( "Mapa de Cali - análisis 1")+
geom_point(data=pot_ofertas, aes(cordenada_longitud, Cordenada_latitud),
color= "red", size=2.5)
mapa_1
1. Se realizá el cargue del data set y se realiza el filtro por zona sur y tipo de vivienda apartamento, además se filtran los registros que tengan número de habitaciones y baños diferentes de 0.
vivienda_subset2=vivienda[vivienda$Zona=="Zona Sur" & vivienda$Tipo=="Apartamento"& vivienda$Banos!=0 & vivienda$Habitaciones!=0,]
head(vivienda_subset2)
## # A tibble: 6 × 12
## Zona piso Estrato preci…¹ Area_…² parqu…³ Banos Habit…⁴ Tipo Barrio corde…⁵
## <chr> <chr> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <dbl>
## 1 Zona… 3 5 250 86 0 2 3 Apar… multi… -76.5
## 2 Zona… NA 6 1280 346 4 6 5 Apar… ciuda… -76.5
## 3 Zona… 5 5 310 82.5 1 2 3 Apar… valle… -76.5
## 4 Zona… 9 4 240 80 1 2 3 Apar… valle… -76.5
## 5 Zona… 6 6 690 150 2 5 4 Apar… pance -76.5
## 6 Zona… NA 5 230 70 1 2 2 Apar… valle… -76.5
## # … with 1 more variable: Cordenada_latitud <dbl>, and abbreviated variable
## # names ¹precio_millon, ²Area_contruida, ³parqueaderos, ⁴Habitaciones,
## # ⁵cordenada_longitud
## # ℹ Use `colnames()` to see all variable names
2. Se identifica que hay 3 registros con valores nulos, y por lo tanto, se decide eliminar estos registros para no tener problemas posteriores, esto se considera una limpieza preliminar del dataset. De acuerdo con los filtros realizados y la eliminación de estos 3 registros, se obtiene un dataset con 2777 observaciones.
vivienda_subset2[rowSums(is.na(vivienda_subset2)) == ncol(vivienda_subset2),]
## # A tibble: 3 × 12
## Zona piso Estrato preci…¹ Area_…² parqu…³ Banos Habit…⁴ Tipo Barrio corde…⁵
## <chr> <chr> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <dbl>
## 1 <NA> <NA> <NA> NA NA NA NA NA <NA> <NA> NA
## 2 <NA> <NA> <NA> NA NA NA NA NA <NA> <NA> NA
## 3 <NA> <NA> <NA> NA NA NA NA NA <NA> <NA> NA
## # … with 1 more variable: Cordenada_latitud <dbl>, and abbreviated variable
## # names ¹precio_millon, ²Area_contruida, ³parqueaderos, ⁴Habitaciones,
## # ⁵cordenada_longitud
## # ℹ Use `colnames()` to see all variable names
data_subset2=vivienda_subset2[rowSums(is.na(vivienda_subset2)) != ncol(vivienda_subset2),]
head(data_subset2)
## # A tibble: 6 × 12
## Zona piso Estrato preci…¹ Area_…² parqu…³ Banos Habit…⁴ Tipo Barrio corde…⁵
## <chr> <chr> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <dbl>
## 1 Zona… 3 5 250 86 0 2 3 Apar… multi… -76.5
## 2 Zona… NA 6 1280 346 4 6 5 Apar… ciuda… -76.5
## 3 Zona… 5 5 310 82.5 1 2 3 Apar… valle… -76.5
## 4 Zona… 9 4 240 80 1 2 3 Apar… valle… -76.5
## 5 Zona… 6 6 690 150 2 5 4 Apar… pance -76.5
## 6 Zona… NA 5 230 70 1 2 2 Apar… valle… -76.5
## # … with 1 more variable: Cordenada_latitud <dbl>, and abbreviated variable
## # names ¹precio_millon, ²Area_contruida, ³parqueaderos, ⁴Habitaciones,
## # ⁵cordenada_longitud
## # ℹ Use `colnames()` to see all variable names
y <- table1::table1(~ Zona+Tipo, data = data_subset2)
y
| Overall (N=2777) |
|
|---|---|
| Zona | |
| Zona Sur | 2777 (100%) |
| Tipo | |
| Apartamento | 2777 (100%) |
3. Se crea el mapa con las ubicaciones de las
viviendas ofertadas. En el mapa se puede identificar que aunque se hizo
el filtro de la zona Sur de Cali, hay algunos apartamentos con ubicación
en la zona norte. Una razón que podría justificar este comportamiento,
es que al momento al momento de la recolección de las observaciones se
cometieron errores al etiquetar la zona de los registros, o que hay
errores en las variables de ubicación (latitud y longitud)
mapa2<-ggmap(cali)
mapa2<-mapa2+
ggtitle( "Mapa de Cali - análisis 2")+
geom_point(data=data_subset2, aes(cordenada_longitud, Cordenada_latitud),
color= "red", size=0.5)
mapa2
4. Análisis exploratorio
Se identifica que las distribuciones para las variables precio, área construida, número de baños y habitaciones tienen un sesgo positivo, además que para todas estas variables se rechaza la hipótesis nula de que las variables sigan una distribución normal con un 95% de confianza. De forma general, el precio promedio de las viviendas tipo apartamento y ubicadas en la zona sur es de COP 297 millones, el promedio del área construida de estas viviendas es de 97 mts, además estas viviendas tienen en promedio 2.97 habitaciones y 2.49 baños. En cuanto a la variable categórica estrato, se observa una diferencia en las distribuciones del precio para cada estrato, principalmente para las viviendas de estrato 6, esto podría dar una primera relación de que el precio de las viviendas si depende del estrato.
Con respecto a las correlaciones entre las variables explicativas numéricas y el precio de las viviendas, hay una correlación significativa de 75% entre el precio de las viviendas y el área construida y también hay una correlación significativa de 73% entre el precio de las viviendas y el número de baños, para la variable de número de habitaciones esta correlación es del 34%. Para revisar la multicolinealidad entre las variables explicativas, la más alta correlación (68%) se presenta entre el número de baños y el área construida, entre las demás variables esta correlación está por debajo del 52%.
A través de las gráficas de dispersión, se observa que existe una diferencia en el precio de la vivienda en función del área construida y el estrato, es decir, que el precio del metro cuadrado varia en función del estrato, por lo que, evaluaremos la interacción de ambas variables. En cuanto a las variables de numero de baños y habitaciones no identificamos una posible interacción con el estrato.
Datos_graf2=select(data_subset2, precio_millon, Area_contruida, Banos, Habitaciones)
p6<-ggplotly(ggpairs(Datos_graf2))
## Warning: Can only have one: highlight
## Warning: Can only have one: highlight
## Warning: Can only have one: highlight
p6
y <- table1::table1(~precio_millon+Area_contruida+Banos+Habitaciones, data =data_subset2)
y
| Overall (N=2777) |
|
|---|---|
| precio_millon | |
| Mean (SD) | 297 (191) |
| Median [Min, Max] | 245 [75.0, 1750] |
| Area_contruida | |
| Mean (SD) | 97.3 (51.9) |
| Median [Min, Max] | 85.0 [40.0, 932] |
| Banos | |
| Mean (SD) | 2.49 (0.928) |
| Median [Min, Max] | 2.00 [1.00, 8.00] |
| Habitaciones | |
| Mean (SD) | 2.97 (0.612) |
| Median [Min, Max] | 3.00 [1.00, 6.00] |
p7<-plot_ly(data_subset2, x=~Area_contruida, y=~precio_millon, color=~Estrato, type="scatter", mode="markers", marker=list(size=~Estrato), symbol =~Estrato)
p7
p8<-plot_ly(data_subset2, x=~Banos, y=~precio_millon, color=~Estrato, type="scatter", mode="markers", marker=list(size=~Estrato), symbol =~Estrato)
p8
p9<-plot_ly(data_subset2, x=~Habitaciones, y=~precio_millon, color=~Estrato, type="scatter", mode="markers", marker=list(size=~Estrato), symbol =~Estrato)
p9
p10<-plot_ly(data_subset2, y=~precio_millon, color=~Estrato)%>%add_boxplot(x=~Estrato)
p10
shapiro.test(data_subset2$precio_millon)
##
## Shapiro-Wilk normality test
##
## data: data_subset2$precio_millon
## W = 0.757, p-value < 2.2e-16
shapiro.test(data_subset2$Area_contruida)
##
## Shapiro-Wilk normality test
##
## data: data_subset2$Area_contruida
## W = 0.68696, p-value < 2.2e-16
shapiro.test(data_subset2$Habitaciones)
##
## Shapiro-Wilk normality test
##
## data: data_subset2$Habitaciones
## W = 0.75782, p-value < 2.2e-16
shapiro.test(data_subset2$Banos)
##
## Shapiro-Wilk normality test
##
## data: data_subset2$Banos
## W = 0.79268, p-value < 2.2e-16
shapiro.test(data_subset2$parqueaderos)
##
## Shapiro-Wilk normality test
##
## data: data_subset2$parqueaderos
## W = 0.80874, p-value < 2.2e-16
**5. Regresión lineal multiple
a. Primero se realizó una prueba ANOVA para identificar la significancia de la interacción entre las variables estrato y área construida. El resultado de esta prueba F es que si es significativa con un 95% de confianza.
#significancia de la interaccion
fit1 <- lm(precio_millon~Area_contruida:Estrato+Estrato+Banos+Habitaciones+parqueaderos, data=data_subset2)
fit2 <- lm(precio_millon~Area_contruida+Estrato+Banos+Habitaciones+parqueaderos, data=data_subset2)
anova(fit2,fit1,test="F")
## Analysis of Variance Table
##
## Model 1: precio_millon ~ Area_contruida + Estrato + Banos + Habitaciones +
## parqueaderos
## Model 2: precio_millon ~ Area_contruida:Estrato + Estrato + Banos + Habitaciones +
## parqueaderos
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2769 21586478
## 2 2766 15564528 3 6021950 356.72 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
b. Se realiza un modelo inicial (modelo0 precio=area_construida:estrato + area_construida + estrato + numero_habitaciones + numero_baños + parqueaderos) donde se considera cada variable independiente y la interacción entre el estrato y el área construida. Sin embargo, los parámetros obtenidos no son coherentes al negocio, ya que al interpretar el beta para la variable estrato 4 (-21.70) y para la variable estrato 6 (-78.45) nos indica que el valor promedio de un apartamento en el sur Cali de estrato 4 es COP 21 millones más económica que en estrato 3 y que en el estrato 6 es COP 78 millones más económica, lo que va en contra de lo real. Por lo anterior, se deciden hacer dos modelos, en el primero solo se va a incluir la interacción y en el segundo no se va a incluir interacción.
modelo0<-lm(precio_millon~Area_contruida:Estrato+Estrato+Banos+Habitaciones+parqueaderos, data=data_subset2)
summary(modelo0)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida:Estrato + Estrato +
## Banos + Habitaciones + parqueaderos, data = data_subset2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -538.47 -34.00 -2.64 29.96 770.41
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 43.11579 14.06315 3.066 0.002191 **
## Estrato4 -21.70168 14.77979 -1.468 0.142127
## Estrato5 72.41083 14.31391 5.059 4.50e-07 ***
## Estrato6 -78.45520 16.54103 -4.743 2.21e-06 ***
## Banos 36.06230 2.54498 14.170 < 2e-16 ***
## Habitaciones -9.38460 2.86204 -3.279 0.001055 **
## parqueaderos 37.86244 2.50639 15.106 < 2e-16 ***
## Area_contruida:Estrato3 0.64978 0.17823 3.646 0.000272 ***
## Area_contruida:Estrato4 1.30538 0.09267 14.086 < 2e-16 ***
## Area_contruida:Estrato5 0.63091 0.04780 13.199 < 2e-16 ***
## Area_contruida:Estrato6 3.02351 0.06530 46.300 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 75.01 on 2766 degrees of freedom
## Multiple R-squared: 0.8461, Adjusted R-squared: 0.8455
## F-statistic: 1521 on 10 and 2766 DF, p-value: < 2.2e-16
c. En el modelo 1 (modelo1 precio=area_construida:estrato + numero_habitaciones + numero_baños + parqueaderos) se realizó la selección de variables backward con el criterio p-valor, de este se obtuvo que las variables significativas y que explican el precio de las viviendas son la interacción entre el área construida y el estrato, y las variables número de baños, habitaciones y parqueaderos, ya que para ninguna se rechazó la hipótesis nula sobre los parámetros betas, además el R2 ajustado que se obtuvo de este modelo es de 83.16%. Sin embargo, se decide excluir la variable número de habitaciones ya que el beta es negativo y no tiene sentido en este análisis. Al realizar la prueba ANOVA sobre este modelo se obtiene que estas variables son significativas para explicar el precio de la vivienda, y al realizar la prueba POSANOVA que se realizó sobre la variable estrato, se obtuvo que si hay una diferencia significativa en el precio de las viviendas para cada estrato.
modelo1<-lm(precio_millon~Area_contruida:Estrato+Banos+Habitaciones+parqueaderos, data=data_subset2)
mod_backward1<-stepCriterion(modelo1,direction = 'backward',criterion = "p-value")
##
## Family: gaussian
## Link function: identity
##
## Initial model:
## ~ Area_contruida:Estrato + Banos + Habitaciones + parqueaderos
##
##
## Step 0 :
## df AIC BIC adj.R-squared prd.R-squared
## - Habitaciones 1 32113.099 32160.532 0.8314 0.8253
## - Banos 1 32301.216 32348.649 0.8196 0.8117
## - parqueaderos 1 32340.600 32388.033 0.8170 0.8094
## - Area_contruida:Estrato 4 34246.468 34276.113 0.6362 0.6337
## <none> 32111.004 32164.366 0.8316 0.8249
## Mallows' CP Pr(>F)(*)
## - Habitaciones 10.086 0.04334
## - Banos 204.447 < 2e-16
## - parqueaderos 246.832 < 2e-16
## - Area_contruida:Estrato 3222.544 < 2e-16
## <none> 8.000
##
##
## Final model:
## ~ Area_contruida:Estrato + Banos + Habitaciones + parqueaderos
##
## ********************************************************************************************
## (*) p-values of the F test
## Effects are included when their p-values are lower than 0.05
## Effects are dropped when their p-values are higher than 0.05
summary(mod_backward1)
## Length Class Mode
## initial 1 -none- character
## direction 1 -none- character
## criterion 1 -none- character
## final 1 -none- character
summary(modelo1)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida:Estrato + Banos +
## Habitaciones + parqueaderos, data = data_subset2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -814.30 -37.01 -3.35 32.44 749.74
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 52.30092 7.66916 6.820 1.12e-11 ***
## Banos 36.60113 2.59820 14.087 < 2e-16 ***
## Habitaciones -5.99974 2.96822 -2.021 0.0433 *
## parqueaderos 40.18302 2.58932 15.519 < 2e-16 ***
## Area_contruida:Estrato3 0.38352 0.08901 4.309 1.70e-05 ***
## Area_contruida:Estrato4 0.78775 0.05716 13.783 < 2e-16 ***
## Area_contruida:Estrato5 0.99680 0.04362 22.853 < 2e-16 ***
## Area_contruida:Estrato6 2.41035 0.04678 51.526 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 78.32 on 2769 degrees of freedom
## Multiple R-squared: 0.832, Adjusted R-squared: 0.8316
## F-statistic: 1960 on 7 and 2769 DF, p-value: < 2.2e-16
##anova
modelo_variables1<-lm(precio_millon~Area_contruida:Estrato+Banos+parqueaderos, data=data_subset2)
anova(modelo_variables1)
## Analysis of Variance Table
##
## Response: precio_millon
## Df Sum Sq Mean Sq F value Pr(>F)
## Banos 1 54388552 54388552 8855.78 < 2.2e-16 ***
## parqueaderos 1 9708930 9708930 1580.85 < 2.2e-16 ***
## Area_contruida:Estrato 4 20027674 5006918 815.25 < 2.2e-16 ***
## Residuals 2770 17012200 6142
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##posanova
#install.packages("agricolae")
require(agricolae)
compara=LSD.test(modelo_variables1,c("Estrato"))
compara
## $statistics
## MSerror Df Mean CV
## 6141.588 2770 296.9273 26.39309
##
## $parameters
## test p.ajusted name.t ntr alpha
## Fisher-LSD none Estrato 4 0.05
##
## $means
## precio_millon std r LCL UCL Min Max Q25 Q50 Q75
## 3 141.0850 62.75787 200 130.2192 151.9508 75 580 110 128 147.5
## 4 203.6289 67.56683 1086 198.9659 208.2919 78 645 154 188 240.0
## 5 293.0466 100.64557 1031 288.2608 297.8323 93 1250 230 280 330.0
## 6 593.6478 256.25489 460 586.4831 600.8125 128 1750 410 580 700.0
##
## $comparison
## NULL
##
## $groups
## precio_millon groups
## 6 593.6478 a
## 5 293.0466 b
## 4 203.6289 c
## 3 141.0850 d
##
## attr(,"class")
## [1] "group"
d. En el modelo 2 (modelo1 precio=area_construida + estrato + numero_habitaciones + numero_baños + parqueaderos) se realizó la selección de variables backward con el criterio p-valor, de este se obtuvo que las variables significativas y que explican el precio de las viviendas son el área construida, el estrato, el número de baños, habitaciones y parqueaderos, ya que para ninguna se rechazó la hipótesis nula sobre los parámetros betas, además el R2 ajustado que se obtuvo de este modelo es de 78.60%. Sin embargo, decidimos excluir la variable número de habitaciones ya que el beta es negativo y esto no tiene sentido para este análisis. Al realizar la prueba ANOVA sobre este modelo se obtiene que estas variables son significativas para explicar el precio de la vivienda, y al realizar la prueba POSANOVA que se realizó sobre la variable estrato, se obtuvo que si hay una diferencia significativa en el precio de las viviendas para cada estrato.
modelo2<-lm(precio_millon~Area_contruida+Estrato+Banos+Habitaciones+parqueaderos, data=data_subset2)
mod_backward2<-stepCriterion(modelo2,direction = 'backward',criterion = "p-value")
##
## Family: gaussian
## Link function: identity
##
## Initial model:
## ~ Area_contruida + Estrato + Banos + Habitaciones + parqueaderos
##
##
## Step 0 :
## df AIC BIC adj.R-squared prd.R-squared
## - Habitaciones 1 32797.225 32844.658 0.7843 0.7751
## - Banos 1 32968.129 33015.562 0.7706 0.7592
## - parqueaderos 1 33003.096 33050.529 0.7677 0.7564
## - Area_contruida 1 33501.453 33548.886 0.7221 0.7200
## - Estrato 3 33557.305 33592.880 0.7162 0.7034
## <none> 32776.404 32829.766 0.7860 0.7758
## Mallows' CP Pr(>F)(*)
## - Habitaciones 28.849 1.844e-06
## - Banos 206.065 < 2.2e-16
## - parqueaderos 243.686 < 2.2e-16
## - Area_contruida 834.710 < 2.2e-16
## - Estrato 909.092 < 2.2e-16
## <none> 8.000
##
##
## Final model:
## ~ Area_contruida + Estrato + Banos + Habitaciones + parqueaderos
##
## ********************************************************************************************
## (*) p-values of the F test
## Effects are included when their p-values are lower than 0.05
## Effects are dropped when their p-values are higher than 0.05
summary(mod_backward2)
## Length Class Mode
## initial 1 -none- character
## direction 1 -none- character
## criterion 1 -none- character
## final 1 -none- character
summary(modelo2)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Estrato + Banos +
## Habitaciones + parqueaderos, data = data_subset2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1128.01 -36.37 0.19 32.96 902.12
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.03597 10.20047 -0.102 0.919
## Area_contruida 1.35976 0.04723 28.787 < 2e-16 ***
## Estrato4 17.49104 6.95729 2.514 0.012 *
## Estrato5 36.93566 7.27806 5.075 4.13e-07 ***
## Estrato6 198.17289 9.18097 21.585 < 2e-16 ***
## Banos 42.05035 2.97293 14.144 < 2e-16 ***
## Habitaciones -15.86854 3.31972 -4.780 1.84e-06 ***
## parqueaderos 45.27180 2.93647 15.417 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 88.29 on 2769 degrees of freedom
## Multiple R-squared: 0.7866, Adjusted R-squared: 0.786
## F-statistic: 1458 on 7 and 2769 DF, p-value: < 2.2e-16
##anova
modelo_variables2<-lm(precio_millon~Area_contruida+Estrato+Banos+parqueaderos, data=data_subset2)
anova(modelo_variables2)
## Analysis of Variance Table
##
## Response: precio_millon
## Df Sum Sq Mean Sq F value Pr(>F)
## Area_contruida 1 57951797 57951797 7375.57 < 2.2e-16 ***
## Estrato 3 17406215 5802072 738.43 < 2.2e-16 ***
## Banos 1 2197086 2197086 279.62 < 2.2e-16 ***
## parqueaderos 1 1817652 1817652 231.33 < 2.2e-16 ***
## Residuals 2770 21764605 7857
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##posanova
#install.packages("agricolae")
require(agricolae)
compara=LSD.test(modelo_variables2,c("Estrato"))
compara
## $statistics
## MSerror Df Mean CV
## 7857.258 2770 296.9273 29.85283
##
## $parameters
## test p.ajusted name.t ntr alpha
## Fisher-LSD none Estrato 4 0.05
##
## $means
## precio_millon std r LCL UCL Min Max Q25 Q50 Q75
## 3 141.0850 62.75787 200 128.7948 153.3752 75 580 110 128 147.5
## 4 203.6289 67.56683 1086 198.3547 208.9031 78 645 154 188 240.0
## 5 293.0466 100.64557 1031 287.6335 298.4596 93 1250 230 280 330.0
## 6 593.6478 256.25489 460 585.5439 601.7517 128 1750 410 580 700.0
##
## $comparison
## NULL
##
## $groups
## precio_millon groups
## 6 593.6478 a
## 5 293.0466 b
## 4 203.6289 c
## 3 141.0850 d
##
## attr(,"class")
## [1] "group"
Se tiene que 𝑏0= 41.09. Este resultado indica que al dejar las demás variables en 0: el precio inicial de una vivienda es de COP 41 millones en cualquier estrato.
Se tiene que 𝑏1=34.66. Este resultado indica que: Por cada baño adicional se espera un aumento en promedio de COP 34 millones en el precio de la vivienda.
Se tiene que 𝑏2= 39.92. Este resultado indica que: Por cada parqueadero adicional se espera un aumento en promedio de COP 39 millones en el precio de la vivienda.
Se tiene que 𝑏3= 0.34. Este resultado indica que: Por cada metro adicional de la vivienda en estrato 3 se espera un aumento en promedio de COP 340 mil en el precio de la vivienda.
Se tiene que 𝑏4= 0.76. Este resultado indica que: Por cada metro adicional de la vivienda en estrato 4 se espera un aumento en promedio de COP 760 mil en el precio de la vivienda.
Se tiene que 𝑏5= 0.98. Este resultado indica que: Por cada metro adicional de la vivienda en estrato 5 se espera un aumento en promedio de COP 980 mil en el precio de la vivienda.
Se tiene que 𝑏6= 2.40. Este resultado indica que: Por cada metro adicional de la vivienda en estrato 6 se espera un aumento en promedio de COP 2 millones en el precio de la vivienda.
set.seed(37)
control=trainControl(method = "LGOCV",number=1000,p=0.8)
mod_cv1=train(precio_millon~Area_contruida:Estrato+Banos+parqueaderos,data=data_subset2,method="lm",trControl=control,metric="MAE")
mod_cv1
## Linear Regression
##
## 2777 samples
## 4 predictor
##
## No pre-processing
## Resampling: Repeated Train/Test Splits Estimated (1000 reps, 80%)
## Summary of sample sizes: 2222, 2222, 2222, 2222, 2222, 2222, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 79.22285 0.8277956 49.51408
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
summary(mod_cv1)
##
## Call:
## lm(formula = .outcome ~ ., data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -799.98 -36.43 -3.03 31.90 752.34
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 41.09348 5.30139 7.751 1.27e-14 ***
## Banos 34.66026 2.41561 14.348 < 2e-16 ***
## parqueaderos 39.92439 2.58760 15.429 < 2e-16 ***
## `Area_contruida:Estrato3` 0.34544 0.08704 3.969 7.41e-05 ***
## `Area_contruida:Estrato4` 0.76727 0.05628 13.633 < 2e-16 ***
## `Area_contruida:Estrato5` 0.98067 0.04290 22.857 < 2e-16 ***
## `Area_contruida:Estrato6` 2.40742 0.04678 51.459 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 78.37 on 2770 degrees of freedom
## Multiple R-squared: 0.8318, Adjusted R-squared: 0.8314
## F-statistic: 2283 on 6 and 2770 DF, p-value: < 2.2e-16
varImp(mod_cv1)
## lm variable importance
##
## Overall
## `Area_contruida:Estrato6` 100.00
## `Area_contruida:Estrato5` 39.77
## parqueaderos 24.13
## Banos 21.86
## `Area_contruida:Estrato4` 20.35
## `Area_contruida:Estrato3` 0.00
plot(varImp(mod_cv1))
set.seed(37)
control=trainControl(method = "LGOCV",number=1000,p=0.8)
mod_cv2=train(precio_millon~Area_contruida+Estrato+Banos+parqueaderos,data=data_subset2,method="lm",trControl=control,metric="MAE")
mod_cv2
## Linear Regression
##
## 2777 samples
## 4 predictor
##
## No pre-processing
## Resampling: Repeated Train/Test Splits Estimated (1000 reps, 80%)
## Summary of sample sizes: 2222, 2222, 2222, 2222, 2222, 2222, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 89.60374 0.7805617 53.08299
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
summary(mod_cv2)
##
## Call:
## lm(formula = .outcome ~ ., data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1095.99 -37.07 1.72 32.51 912.65
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -35.29691 7.28649 -4.844 1.34e-06 ***
## Area_contruida 1.32473 0.04685 28.278 < 2e-16 ***
## Estrato4 20.90230 6.94783 3.008 0.00265 **
## Estrato5 40.14467 7.27556 5.518 3.75e-08 ***
## Estrato6 206.45320 9.05156 22.809 < 2e-16 ***
## Banos 36.89361 2.78119 13.265 < 2e-16 ***
## parqueaderos 44.81477 2.94647 15.210 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 88.64 on 2770 degrees of freedom
## Multiple R-squared: 0.7848, Adjusted R-squared: 0.7843
## F-statistic: 1684 on 6 and 2770 DF, p-value: < 2.2e-16
varImp(mod_cv2)
## lm variable importance
##
## Overall
## Area_contruida 100.00
## Estrato6 78.36
## parqueaderos 48.28
## Banos 40.59
## Estrato5 9.93
## Estrato4 0.00
plot(varImp(mod_cv2))
summary(mod_cv1)
##
## Call:
## lm(formula = .outcome ~ ., data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -799.98 -36.43 -3.03 31.90 752.34
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 41.09348 5.30139 7.751 1.27e-14 ***
## Banos 34.66026 2.41561 14.348 < 2e-16 ***
## parqueaderos 39.92439 2.58760 15.429 < 2e-16 ***
## `Area_contruida:Estrato3` 0.34544 0.08704 3.969 7.41e-05 ***
## `Area_contruida:Estrato4` 0.76727 0.05628 13.633 < 2e-16 ***
## `Area_contruida:Estrato5` 0.98067 0.04290 22.857 < 2e-16 ***
## `Area_contruida:Estrato6` 2.40742 0.04678 51.459 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 78.37 on 2770 degrees of freedom
## Multiple R-squared: 0.8318, Adjusted R-squared: 0.8314
## F-statistic: 2283 on 6 and 2770 DF, p-value: < 2.2e-16
6. Validación de supuestos
- Media cero: En la primera gráfica (residuales vs ajustados) se observa que los errores no tienen un comportamiento aleatorio con media cero.
- Varianza constante: En esta misma gráfica se identifica un aumento de la varianza, por lo tanto, se puede inferir que los errores no cumplen con la propiedad de varianza constante. Adicionalmente, de acuerdo con las diferentes pruebas que evalúa si la varianza constante, se puede concluir que los errores del modelo de regresión lineal no tienen varianza constante ya que en todos los casos se rechaza la hipótesis nula.
- Independencia: Con base en la prueba estadistica de Durbin-Watson, se identifica que los errores del modelo de regresión lineal no cumplen con la propiedad de independencia ya que se rechaza la hipótesis nula. Sin embargo, se conoce de antemano que los datos se tomaron con corte transversal y no dependen del tiempo, por esta razón, los resultados de esta prueba no se consideran para evaluar el supuesto de independencia.
- Normalidad: De acuerdo con el segundo gráfico (Q-Q Plot), se identifica que los errores en su mayoría no siguen una distribución normal. En base a la prueba de shapiro-wilk, se puede concluir que los errores del modelo de regresión lineal no siguen una distribución normal ya que se rechaza la hipótesis nula con un nivel de confianza del 95%.
- Multicolinealidad: En base a los VIF obtenidos en el modelo seleccionado, se puede confirmar que se presentan una multicolinealidad baja entre las variables explicativas, ya que en todos los casos es menor 4.4, por lo que podemos concluir que las variables seleccionadas son correctas para el modelo y explicar el precio de las viviendas.
A. Normalidad
par(mfrow = c(2, 2))
plot(mod_cv1$finalModel)
e= mod_cv1$finalModel$residuals
# Ho: los errores tienen distribución normal
shapiro.test(e)
##
## Shapiro-Wilk normality test
##
## data: e
## W = 0.81775, p-value < 2.2e-16
B. Independencia
library(lmtest)
# Ho: los errores son independientes (no estan relacionados)
dwtest(mod_cv1$finalModel)
##
## Durbin-Watson test
##
## data: mod_cv1$finalModel
## DW = 1.8231, p-value = 1.424e-06
## alternative hypothesis: true autocorrelation is greater than 0
C. Varianza constante
# Ho: la varianza de los erroes es constante
gqtest(mod_cv1$finalModel)
##
## Goldfeld-Quandt test
##
## data: mod_cv1$finalModel
## GQ = 4.1191, df1 = 1382, df2 = 1381, p-value < 2.2e-16
## alternative hypothesis: variance increases from segment 1 to 2
bptest(mod_cv1$finalModel)
##
## studentized Breusch-Pagan test
##
## data: mod_cv1$finalModel
## BP = 686.7, df = 6, p-value < 2.2e-16
#install.packages("glmtoolbox")
library(glmtoolbox)
vdtest(mod_cv1$finalModel)
##
## Score test for varying dispersion parameter
##
## Statistic = 8092.296
## degrees of freedom = 6
## p-value = < 2.22e-16
D. Multicolinealidad
require(car)
vif(mod_cv2$finalModel)
## Area_contruida Estrato4 Estrato5 Estrato6 Banos
## 2.089778 4.062799 4.367057 4.002062 2.354928
## parqueaderos
## 1.851137
7. Predicción del precio vivienda 1
Se realizó la predicción del precio de las viviendas para la solicitud usando el modelo seleccionado anteriormente, en base a estas características, se obtuvo que el precio de un apartamento en estrato 5 tendría un precio de COP 559 millones, y que un apartamento con estas mismas características, pero de estrato 6 tendría un precio de COP 987 millones.
Precio_opcion1<-as.matrix(mod_cv1$finalModel$coefficients[1]+(mod_cv1$finalModel$coefficients[2]*3)+(mod_cv1$finalModel$coefficients[3]*3)+(mod_cv1$finalModel$coefficients[6]*300))
Precio_opcion2<-as.matrix(mod_cv1$finalModel$coefficients[1]+(mod_cv1$finalModel$coefficients[2]*3)+(mod_cv1$finalModel$coefficients[3]*3)+(mod_cv1$finalModel$coefficients[7]*300))
print(Precio_opcion1[1])
## [1] 559.0469
print(Precio_opcion2[1])
## [1] 987.0747
8. Potenciales ofertas
A continuación, se muestran las posibles ofertas que coinciden con las características solicitadas y en el mapa la ubicación de estas. Sin embargo, ninguna de estas cumple con la condición de que tenga 3 parqueaderos. En primer lugar, la vivienda de estrato 5 tiene un precio de COP 650 millones, es decir, COP 91 millones por encima del valor de la predicción que se realizó con el modelo seleccionado, de acuerdo con el crédito preaprobado tendría un sobrante de COP 200 millones, es importante señalar que esta vivienda tiene menos metros cuadrados que el área construida que se utilizó en la predicción.
En segundo lugar, para las viviendas ofertadas en estrato 6 los precios son de COP 1,150 y 1,280 millones, mientras que el valor de la predicción es de COP 987 millones, por lo que para estas ofertas el valor predicho si está por debajo de las ofertas, para este caso es importante señalar que estas viviendas tienen más metros que el área construida que se utilizó en la predicción y que podría explicar las diferencias entre la predicción y los precios de las ofertas. En conclusión, se considera que la primera oferta que se muestra en la tabla cumple con las características solicitadas y con el crédito preaprobado, por lo que seria la mejor opción.
pot_ofertas_1<-filter(data_subset2, Area_contruida>="280" & Area_contruida<="350" & Estrato=="5" & Habitaciones=="5" & Banos=="3")
pot_ofertas_2<-filter(data_subset2, Area_contruida>="280" & Area_contruida<="350" & Estrato=="6" & Habitaciones=="5" & Banos=="3")
pot_ofertas<-rbind(pot_ofertas_1,pot_ofertas_2)
pot_ofertas
## # A tibble: 0 × 12
## # … with 12 variables: Zona <chr>, piso <chr>, Estrato <fct>,
## # precio_millon <dbl>, Area_contruida <dbl>, parqueaderos <dbl>, Banos <dbl>,
## # Habitaciones <dbl>, Tipo <chr>, Barrio <chr>, cordenada_longitud <dbl>,
## # Cordenada_latitud <dbl>
## # ℹ Use `colnames()` to see all variable names
pot_ofertas_1<-filter(data_subset2, Area_contruida>="270" & Area_contruida<="350" & Estrato=="5" & Habitaciones=="5")
pot_ofertas_2<-filter(data_subset2, Area_contruida>="270" & Area_contruida<="350" & Estrato=="6" & Habitaciones=="5")
pot_ofertas<-rbind(pot_ofertas_1,pot_ofertas_2)
pot_ofertas
## # A tibble: 4 × 12
## Zona piso Estrato preci…¹ Area_…² parqu…³ Banos Habit…⁴ Tipo Barrio corde…⁵
## <chr> <chr> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <dbl>
## 1 Zona… 12 5 650 275 2 5 5 Apar… ciuda… -76.5
## 2 Zona… NA 6 1280 346 4 6 5 Apar… ciuda… -76.5
## 3 Zona… 8 6 1150 344 4 5 5 Apar… ciuda… -76.5
## 4 Zona… 8 6 1150 346 2 6 5 Apar… ciuda… -76.5
## # … with 1 more variable: Cordenada_latitud <dbl>, and abbreviated variable
## # names ¹precio_millon, ²Area_contruida, ³parqueaderos, ⁴Habitaciones,
## # ⁵cordenada_longitud
## # ℹ Use `colnames()` to see all variable names
cali2<-get_map(c(-76.5, 3.41), zoom=13)
## ℹ <]8;;https://maps.googleapis.com/maps/api/staticmap?center=3.41,-76.5&zoom=13&size=640x640&scale=2&maptype=terrain&language=en-EN&key=xxxhttps://maps.googleapis.com/maps/api/staticmap?center=3.41,-76.5&zoom=13&size=640x640&scale=2&maptype=terrain&language=en-EN&key=xxx]8;;>
mapa_1<-ggmap(cali2)
mapa_1<-mapa_1+
ggtitle( "Mapa de Cali - análisis 2")+
geom_point(data=pot_ofertas, aes(cordenada_longitud, Cordenada_latitud),
color= "red", size=2.8)
mapa_1
Observaciones Como posibles opciones para mejorar los modelos para la predicción de los precios de las viviendas, se pueden realizar transformaciones sobre las variables explicativas y la variable dependiente, con el objetivo de que se cumpla el supuesto de normalidad de los errores. Adicionalmente, se podría evaluar los datos atípicos o observaciones que puedan ser influénciales en la estimación del modelo. Otra opción es recurrir a metodologías más versátiles o dinámicas donde no sea necesario que las observaciones tengan una relación lineal.