ANÁLISIS VIVIENDA 1

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

ANÁLISIS VIVIENDA 2

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"
  1. 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 que 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 1, donde se tuvo en cuenta la interacción entre el estrato y el área construida (MAE= 49.64 y R2=83.14%). De acuerdo con el modelo seleccionado, se interpretan los parámetros de la siguiente forma:

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.