Maria comenzó como agente de bienes raíces en Cali hace 10 años. Después de laborar dos años para una empresa nacional, se traslado a Bogotá y trabajó para otra agencia de bienes raíces. Sus amigos y familiares la convencieron de que con su experiencia y conocimientos del negocio debía abrir su propia agencia. Terminó por adquirir la licencia de intermediario y al poco tiempo fundó su propia compañía, C&A (Casas y Apartamentos) en Cali. Santiago y Lina, dos vendedores de la empresa anterior aceptaron trabajar en la nueva compaña. En la actualidad ocho agentes de bienes raíces colaboran con ella en C&A.
Actualmente las ventas de bienes raíces en Cali se han visto disminuidas de manera significativa en lo corrido del año. Durante este periodo muchas instituciones bancarias de ahorro y vivienda están prestando grandes sumas de dinero para la industria y la construcción comercial y residencial. Cuando el efecto producto de las tensiones políticas y sociales disminuya, se espera que la actividad económica de este sector se reactive.
Hace dos días, María recibió una carta solicitando asesoría para la compra de dos viviendas por parte de una compañía internacional que desea ubicar a dos de sus empleados con sus familias en la ciudad. Las solicitudes incluyen las siguientes condiciones:
| Características | Vivienda 1 | Vivienda 2 |
|---|---|---|
| Tipo | Capa | Apartamento |
| Área construida | 200 | 300 |
| Parquaderos | 1 | 3 |
| Baños | 2 | 3 |
| Habitaciones | 4 | 5 |
| Estrato | 4 o 5 | 5 o 6 |
| Zona | Norte | Sur |
| Crédito preaprobado | 350 millones | 850 millones |
Ayude a María a responder la solicitud, mediante técnicas modelación que usted conoce. Ella requiere le envíe un informe ejecutivo donde analice los dos casos y sus recomendaciones (Informe). Como soporte del informe debe anexar las estimaciones, validaciones y comparación de modelos requeridos (Anexos) .
Datos Los datos de los tres últimos meses se adjuntan en la base que puede obtener con el siguiente código en R
| Variable | Descripción |
|---|---|
| zona | Ubicación de la vivienda: Zona Centro, Zona Norte,… |
| piso | Piso que ocupa la vivienda: primer piso, segundo piso… |
| estrato | Estrato socio-económico: 3, 4, 5, 6 |
| preciom | Precio de la vivienda en millones de pesos |
| areaconst | Área construida |
| parqueaderos | Número de parqueaderos |
| banios | Número de baños |
| habitaciones | Número de habitaciones |
| tipo | Tipo de vivienda: Casa, Apartamento |
| barrio | Barrio de ubicación de la vivienda: 20 de Julio, Alamos,… |
| longitud | Coordenada geográfica |
| latitud | Coordenada geográfica |
## spc_tbl_ [8,322 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ id : num [1:8322] 1147 1169 1350 5992 1212 ...
## $ zona : chr [1:8322] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : chr [1:8322] NA NA NA "02" ...
## $ estrato : num [1:8322] 3 3 3 4 5 5 4 5 5 5 ...
## $ preciom : num [1:8322] 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num [1:8322] 70 120 220 280 90 87 52 137 150 380 ...
## $ parqueaderos: num [1:8322] 1 1 2 3 1 1 2 2 2 2 ...
## $ banios : num [1:8322] 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: num [1:8322] 6 3 4 3 3 3 3 4 6 3 ...
## $ tipo : chr [1:8322] "Casa" "Casa" "Casa" "Casa" ...
## $ barrio : chr [1:8322] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
## $ longitud : num [1:8322] -76.5 -76.5 -76.5 -76.5 -76.5 ...
## $ latitud : num [1:8322] 3.43 3.43 3.44 3.44 3.46 ...
## - attr(*, "spec")=
## .. cols(
## .. id = col_double(),
## .. zona = col_character(),
## .. piso = col_character(),
## .. estrato = col_double(),
## .. preciom = col_double(),
## .. areaconst = col_double(),
## .. parqueaderos = col_double(),
## .. banios = col_double(),
## .. habitaciones = col_double(),
## .. tipo = col_character(),
## .. barrio = col_character(),
## .. longitud = col_double(),
## .. latitud = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona O… <NA> 3 250 70 1 3 6
## 2 1169 Zona O… <NA> 3 320 120 1 2 3
## 3 1350 Zona O… <NA> 3 350 220 2 2 4
## 4 5992 Zona S… 02 4 400 280 3 5 3
## 5 1212 Zona N… 01 5 260 90 1 2 3
## 6 1724 Zona N… 01 5 240 87 1 3 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
## id zona piso estrato
## Min. : 1 Length:8322 Length:8322 Min. :3.000
## 1st Qu.:2080 Class :character Class :character 1st Qu.:4.000
## Median :4160 Mode :character Mode :character Median :5.000
## Mean :4160 Mean :4.634
## 3rd Qu.:6240 3rd Qu.:5.000
## Max. :8319 Max. :6.000
## NA's :3 NA's :3
## preciom areaconst parqueaderos banios
## Min. : 58.0 Min. : 30.0 Min. : 1.000 Min. : 0.000
## 1st Qu.: 220.0 1st Qu.: 80.0 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 330.0 Median : 123.0 Median : 2.000 Median : 3.000
## Mean : 433.9 Mean : 174.9 Mean : 1.835 Mean : 3.111
## 3rd Qu.: 540.0 3rd Qu.: 229.0 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1999.0 Max. :1745.0 Max. :10.000 Max. :10.000
## NA's :2 NA's :3 NA's :1605 NA's :3
## habitaciones tipo barrio longitud
## Min. : 0.000 Length:8322 Length:8322 Min. :-76.59
## 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76.54
## Median : 3.000 Mode :character Mode :character Median :-76.53
## Mean : 3.605 Mean :-76.53
## 3rd Qu.: 4.000 3rd Qu.:-76.52
## Max. :10.000 Max. :-76.46
## NA's :3 NA's :3
## latitud
## Min. :3.333
## 1st Qu.:3.381
## Median :3.416
## Mean :3.418
## 3rd Qu.:3.452
## Max. :3.498
## NA's :3
Transformación y limpieza de datos
vivienda$parqueaderos[is.na(vivienda$parqueaderos)] <- 0
moda_piso <- Mode(vivienda$piso, na.rm = TRUE)
vivienda$piso[is.na(vivienda$piso)] <- moda_piso
vivienda <- na.omit(vivienda)
vivienda$tipo <- ifelse(vivienda$tipo=="Casa","CASA",ifelse(vivienda$tipo=="casa","CASA",vivienda$tipo))
vivienda$tipo <- ifelse(vivienda$tipo=="apto","APARTAMENTO",ifelse(vivienda$tipo=="Apartamento","APARTAMENTO",vivienda$tipo))
vivienda$barrio <- trimws(chartr("ÁÉÍÓÚ", "AEIOU", toupper(vivienda$barrio)))
vivienda$longitud <- ifelse(vivienda$longitud<=-90,vivienda$longitud/1000,vivienda$longitud)
vivienda$latitud <- ifelse(vivienda$latitud>=270,vivienda$latitud/1000,vivienda$latitud)
vivienda$estrato <- as.character(vivienda$estrato)
vivienda$piso <- as.character(vivienda$piso)
vivienda <- data.frame(vivienda)Realice un filtro a la base de datos e incluya solo las ofertas de : base1: casas, de la zona norte de la ciudad. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas, por que?).
## [1] 722
vivienda1 <- dplyr::filter(vivienda, tipo=="CASA" & zona=="Zona Norte" & banios>0 & habitaciones>0
& latitud>=3.4556 & longitud>=-76.5403)
library(DT)## Warning: package 'DT' was built under R version 4.4.2
vivienda1.coord <- data.frame(
lat = c(vivienda1$latitud),
long = c(vivienda1$longitud)
)
# Crea mapa
map <- leaflet(vivienda1.coord) %>%
addTiles() %>%
addMarkers(
lng = ~long,
lat = ~lat,
layerId = 1,
popup = ~as.character(lat)
) %>%
addRectangles(
lng1=-76.5403, lat1=3.4556,
lng2=max(vivienda1$longitud), lat2=max(vivienda1$latitud),
fillColor = "transparent",color="red"
)
# Mostrar mapa
mapRealice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.
##
## Kruskal-Wallis rank sum test
##
## data: preciom by estrato
## Kruskal-Wallis chi-squared = 278.2, df = 3, p-value < 2.2e-16
plot1 <- ggplot(vivienda1, aes(x = areaconst, y = preciom)) +
geom_point(aes(color = estrato)) +
labs(x = "Área Construida (m2)",
y = "Precio (millones)") +
theme_minimal()
ggplotly(plot1)## [1] 0.7419
plot3 <- ggplot(vivienda1, aes(x = banios, y = preciom)) +
geom_point(aes(color = estrato)) +
labs(x = "# baños",
y = "Precio (millones)") +
theme_minimal()
ggplotly(plot3)## [1] 0.555
plot4 <- ggplot(vivienda1, aes(x = parqueaderos, y = preciom)) +
geom_point(aes(color = estrato)) +
labs(x = "# parqueaderos",
y = "Precio (millones)") +
theme_minimal()
ggplotly(plot4)## [1] 0.4616
plot2 <- ggplot(vivienda1, aes(x = habitaciones, y = preciom)) +
geom_point(aes(color = estrato)) +
labs(x = "# habitaciones",
y = "Precio (millones)") +
theme_minimal()
ggplotly(plot2)## [1] 0.421
Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños)) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).
ModeloRLM = lm(data=vivienda1, preciom~areaconst+habitaciones+banios+parqueaderos+estrato)
summary(ModeloRLM)##
## Call:
## lm(formula = preciom ~ areaconst + habitaciones + banios + parqueaderos +
## estrato, data = vivienda1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -886.52 -63.40 -13.09 34.15 1105.27
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 33.37412 20.28759 1.645 0.10057
## areaconst 0.74076 0.05195 14.258 < 2e-16 ***
## habitaciones 7.91285 5.13864 1.540 0.12421
## banios 15.66939 6.49960 2.411 0.01627 *
## parqueaderos 14.64259 4.68507 3.125 0.00188 **
## estrato4 85.73019 19.27868 4.447 1.07e-05 ***
## estrato5 126.34566 18.75614 6.736 4.37e-11 ***
## estrato6 267.78089 34.63721 7.731 5.66e-14 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 144.2 on 514 degrees of freedom
## Multiple R-squared: 0.6571, Adjusted R-squared: 0.6524
## F-statistic: 140.7 on 7 and 514 DF, p-value: < 2.2e-16
## (Intercept) areaconst habitaciones banios parqueaderos estrato4
## 33.3741159 0.7407591 7.9128491 15.6693901 14.6425928 85.7301878
## estrato5 estrato6
## 126.3456615 267.7808927
## [1] 0.6571137
Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer)
Normalidad <- shapiro.test(ModeloRLM$residuals)
homocedasticidad <- lmtest::bptest(ModeloRLM)
autocorrelacion <- lmtest::dwtest(ModeloRLM)
resultados <- rbind(
c("Normalidad", Normalidad$method, format(Normalidad$p.value,
scientific = TRUE)),
c("Homocedasticidad", homocedasticidad$method, format(homocedasticidad$p.value,
scientific = TRUE)),
c("No Autocorrelación", autocorrelacion$method, format(autocorrelacion$p.value,
scientific = TRUE)))
colnames(resultados) <- c("Prueba", "Método", "Valor p")
kable(resultados)| Prueba | Método | Valor p |
|---|---|---|
| Normalidad | Shapiro-Wilk normality test | 5.493929e-26 |
| Homocedasticidad | studentized Breusch-Pagan test | 1.372001e-19 |
| No Autocorrelación | Durbin-Watson test | 2.166482e-02 |
Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.
Vivienda_1 = data.frame( areaconst=c(200,200),
habitaciones=c(4,4),
banios=c(2,2),
parqueaderos=c(1,1),
estrato=c("4","5")
)
knitr::kable(Vivienda_1)| areaconst | habitaciones | banios | parqueaderos | estrato |
|---|---|---|---|---|
| 200 | 4 | 2 | 1 | 4 |
| 200 | 4 | 2 | 1 | 5 |
## 1 2
## 344.8889 385.5044
Con las predicciones del modelo sugiera potenciales ofertas que responda a la solicitud de la vivienda 1. Tenga encuentra que la empresa tiene crédito pre-aprobado de máximo 350 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.
parametros_vivienda_1 <- which((vivienda1$estrato=="4" | vivienda1$estrato=="5") & vivienda1$areaconst>=200 & vivienda1$parqueaderos>=1 & vivienda1$banios>=2 & vivienda1$habitaciones>=4 & vivienda1$preciom<=350)| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 326 | 3101 | Zona Norte | 02 | 5 | 340 | 355 | 2 | 5 | 8 | CASA | SAN VICENTE | -76.52377 | 3.46384 |
| 503 | 1943 | Zona Norte | 02 | 5 | 350 | 346 | 1 | 2 | 4 | CASA | VIPASA | -76.51847 | 3.47503 |
| 75 | 4209 | Zona Norte | 02 | 5 | 350 | 300 | 3 | 5 | 6 | CASA | EL BOSQUE | -76.53010 | 3.48577 |
| 500 | 1822 | Zona Norte | 02 | 4 | 340 | 295 | 2 | 2 | 4 | CASA | VIPASA | -76.51777 | 3.48060 |
| 203 | 937 | Zona Norte | 02 | 4 | 350 | 280 | 2 | 3 | 4 | CASA | LA MERCED | -76.50603 | 3.46643 |
oferta_5 <- head(oferta_5, 5)
oferta_5.coord <- data.frame(
lat = c(oferta_5$latitud),
long = c(oferta_5$longitud)
)
map_oferta <- leaflet(oferta_5.coord) %>%
addTiles() %>%
addMarkers(
lng = ~long,
lat = ~lat,
layerId = 1,
popup = ~as.character(lat)
) %>%
addRectangles(
lng1=-76.5403, lat1=3.4556,
lng2=max(oferta_5$longitud), lat2=max(oferta_5$latitud),
fillColor = "transparent",color="red"
)
map_ofertaRealice un filtro a la base de datos e incluya solo las ofertas de : base2: apto, de la zona sur de la ciudad. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas, por que?).
## [1] 2787
vivienda2 <- dplyr::filter(vivienda, tipo=="APARTAMENTO" & zona=="Zona Sur" & banios>0 & habitaciones>0
& latitud>=3.4556 & longitud>=-76.5403)
library(DT)
datatable(vivienda2, list(pageLength=3))vivienda2.coord <- data.frame(
lat = c(vivienda2$latitud),
long = c(vivienda2$longitud)
)
# Crea mapa
map <- leaflet(vivienda2.coord) %>%
addTiles() %>%
addMarkers(
lng = ~long,
lat = ~lat,
layerId = 1,
popup = ~as.character(lat)
) %>%
addRectangles(
lng1=-76.5403, lat1=3.4556,
lng2=max(vivienda2$longitud), lat2=max(vivienda2$latitud),
fillColor = "transparent",color="red"
)
# Mostrar mapa
mapRealice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio del apto) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.
##
## Kruskal-Wallis rank sum test
##
## data: preciom by estrato
## Kruskal-Wallis chi-squared = 25.714, df = 3, p-value = 1.094e-05
plot1 <- ggplot(vivienda2, aes(x = areaconst, y = preciom)) +
geom_point(aes(color = estrato)) +
labs(x = "Área Construida (m2)",
y = "Precio (millones)") +
theme_minimal()
ggplotly(plot1)## [1] 0.7979
plot3 <- ggplot(vivienda2, aes(x = banios, y = preciom)) +
geom_point(aes(color = estrato)) +
labs(x = "# baños",
y = "Precio (millones)") +
theme_minimal()
ggplotly(plot3)## [1] 0.675
plot4 <- ggplot(vivienda2, aes(x = parqueaderos, y = preciom)) +
geom_point(aes(color = estrato)) +
labs(x = "# parqueaderos",
y = "Precio (millones)") +
theme_minimal()
ggplotly(plot4)## [1] 0.2624
plot2 <- ggplot(vivienda2, aes(x = habitaciones, y = preciom)) +
geom_point(aes(color = estrato)) +
labs(x = "# habitaciones",
y = "Precio (millones)") +
theme_minimal()
ggplotly(plot2)## [1] 0.3233
Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños)) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).
ModeloRLM = lm(data=vivienda2, preciom~areaconst+habitaciones+banios+parqueaderos+estrato)
summary(ModeloRLM)##
## Call:
## lm(formula = preciom ~ areaconst + habitaciones + banios + parqueaderos +
## estrato, data = vivienda2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -266.301 -15.215 -1.521 24.410 219.318
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -39.002 61.021 -0.639 0.525
## areaconst 1.928 0.365 5.284 1.79e-06 ***
## habitaciones 4.267 16.487 0.259 0.797
## banios 20.547 16.882 1.217 0.228
## parqueaderos 5.061 6.333 0.799 0.427
## estrato4 39.562 45.219 0.875 0.385
## estrato5 71.700 45.829 1.565 0.123
## estrato6 238.301 56.149 4.244 7.60e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 60.62 on 61 degrees of freedom
## Multiple R-squared: 0.779, Adjusted R-squared: 0.7537
## F-statistic: 30.73 on 7 and 61 DF, p-value: < 2.2e-16
## (Intercept) areaconst habitaciones banios parqueaderos estrato4
## -39.002047 1.928432 4.267389 20.547518 5.061100 39.561726
## estrato5 estrato6
## 71.699735 238.301372
## [1] 0.779047
Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer)
Normalidad <- shapiro.test(ModeloRLM$residuals)
homocedasticidad <- lmtest::bptest(ModeloRLM)
autocorrelacion <- lmtest::dwtest(ModeloRLM)
resultados <- rbind(
c("Normalidad", Normalidad$method, format(Normalidad$p.value,
scientific = TRUE)),
c("Homocedasticidad", homocedasticidad$method, format(homocedasticidad$p.value,
scientific = TRUE)),
c("No Autocorrelación", autocorrelacion$method, format(autocorrelacion$p.value,
scientific = TRUE)))
colnames(resultados) <- c("Prueba", "Método", "Valor p")
kable(resultados)| Prueba | Método | Valor p |
|---|---|---|
| Normalidad | Shapiro-Wilk normality test | 2.862657e-07 |
| Homocedasticidad | studentized Breusch-Pagan test | 4.938793e-06 |
| No Autocorrelación | Durbin-Watson test | 5.642057e-03 |
Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.
Vivienda_2 = data.frame( areaconst=c(300,300),
habitaciones=c(5,5),
banios=c(3,3),
parqueaderos=c(3,3),
estrato=c("5","6")
)
knitr::kable(Vivienda_2)| areaconst | habitaciones | banios | parqueaderos | estrato |
|---|---|---|---|---|
| 300 | 5 | 3 | 3 | 5 |
| 300 | 5 | 3 | 3 | 6 |
## 1 2
## 709.3900 875.9916
Con las predicciones del modelo sugiera potenciales ofertas que responda a la solicitud de la vivienda 1. Tenga encuentra que la empresa tiene crédito pre-aprobado de máximo 350 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.
parametros_vivienda_2 <- which((vivienda2$estrato=="5" | vivienda2$estrato=="6") & vivienda2$areaconst>=300 & vivienda2$parqueaderos>=3 & vivienda2$banios>=3 & vivienda2$habitaciones>=5 & vivienda2$preciom<=850)| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|
oferta_5 <- head(oferta_5, 5)
oferta_5.coord <- data.frame(
lat = c(oferta_5$latitud),
long = c(oferta_5$longitud)
)
map_oferta <- leaflet(oferta_5.coord) %>%
addTiles() %>%
addMarkers(
lng = ~long,
lat = ~lat,
layerId = 1,
popup = ~as.character(lat)
) %>%
addRectangles(
lng1=-76.5403, lat1=3.4556,
lng2=max(oferta_5$longitud), lat2=max(oferta_5$latitud),
fillColor = "transparent",color="red"
) ## Warning in max(oferta_5$longitud): ningun argumento finito para max; retornando
## -Inf
## Warning in max(oferta_5$latitud): ningun argumento finito para max; retornando
## -Inf