if(!require(remotes)) install.packages("remotes")
## Cargando paquete requerido: remotes
remotes::install_github("centromagis/paqueteMODELOS", force = TRUE)
## Downloading GitHub repo centromagis/paqueteMODELOS@HEAD
## Running `R CMD build`...
## * checking for file 'C:\Users\EQUIPO\AppData\Local\Temp\RtmpK0wavG\remotes12e431bf47f0\Centromagis-paqueteMODELOS-3b06257/DESCRIPTION' ... OK
## * preparing 'paqueteMODELOS':
## * checking DESCRIPTION meta-information ... OK
## * checking for LF line-endings in source and make files and shell scripts
## * checking for empty or unneeded directories
## * building 'paqueteMODELOS_0.1.0.tar.gz'
## Installing package into 'C:/Users/EQUIPO/AppData/Local/R/win-library/4.6'
## (as 'lib' is unspecified)
library(paqueteMODELOS)
## Cargando paquete requerido: boot
## Cargando paquete requerido: broom
## Cargando paquete requerido: GGally
## Cargando paquete requerido: ggplot2
## Cargando paquete requerido: gridExtra
## Cargando paquete requerido: knitr
## Cargando paquete requerido: summarytools
data("vivienda")
str(vivienda)
## 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")=List of 3
## ..$ cols :List of 13
## .. ..$ id : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ zona : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ piso : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ estrato : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ preciom : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ areaconst : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ parqueaderos: list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ banios : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ habitaciones: list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ tipo : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ barrio : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ longitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ latitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## ..$ default: list()
## .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
## ..$ delim : chr ";"
## ..- attr(*, "class")= chr "col_spec"
## - attr(*, "problems")=<pointer: (nil)>
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?).
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:gridExtra':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
library(leaflet)
data("vivienda")
base1 <- vivienda %>%
filter(tipo == "Casa" & zona == "Zona Norte") %>%
drop_na()
head(base1, 3)
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1209 Zona N… 02 5 320 150 2 4 6
## 2 1592 Zona N… 02 5 780 380 2 3 3
## 3 4460 Zona N… 02 4 625 355 3 5 5
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
mapa_base1 <- leaflet(base1) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud,
lat = ~latitud,
radius = 4,
color = "darkblue",
stroke = FALSE,
fillOpacity = 0.7,
popup = ~paste("<b>Barrio:</b>", barrio, "<br>",
"<b>Precio:</b> $", preciom, "M")
)
mapa_base1
Al analizar el resultado, se evidencia que no todos los puntos se ubican al norte de Cali, aunque en su mayoria se concentran en la zona norte, hay varios puntos atipicos dispersos sobre el centro y sur, esto puede ser causado por errores de digitacion de la persona que anuncio el inmuevle, imprecision en la geocodicacion, o algun tipo de estrategia comercial donde los agentes busquen clasificar los inmuebles sobre zonas de mayor demanda, solo para que los clientes entren y la vean.
Realice 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.
if(!require(plotly)) install.packages("plotly")
## Cargando paquete requerido: plotly
##
## Adjuntando el paquete: 'plotly'
## 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(plotly)
library(ggplot2)
library(dplyr)
correlaciones <- base1 %>%
select(preciom, areaconst, estrato, banios, habitaciones) %>%
cor(use = "complete.obs")
cat("Correlaciones con el Precio (preciom):\n")
## Correlaciones con el Precio (preciom):
print(round(correlaciones[,"preciom"], 2))
## preciom areaconst estrato banios habitaciones
## 1.00 0.67 0.49 0.47 0.38
grafico_dispersion <- ggplot(base1, aes(x = areaconst, y = preciom,
color = as.factor(estrato),
text = paste("Baños:", banios,
"<br>Habitaciones:", habitaciones))) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
labs(title = "Precio vs Área Construida por Estrato (Zona Norte)",
x = "Área Construida (m²)",
y = "Precio (Millones COP)",
color = "Estrato") +
theme_minimal()
ggplotly(grafico_dispersion, tooltip = c("x", "y", "color", "text"))
## `geom_smooth()` using formula = 'y ~ x'
La variable con la correlacion mas alta es el area construida, lo que indica que el tamaño de la casa es lo que mas impulsa su precio, seguido del estrato y los baños, por ultimo las habitaciones. En el grafico se observa otro valor atipico de una propiedad de estrato 3 con mas de 1400m2 con un precio muy bajo con relacion a los demas, lo que sugiere un error de digitacion
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).
modelo_norte <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = base1)
summary(modelo_norte)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = base1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -761.11 -84.10 -16.36 52.22 925.67
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -245.62878 60.86958 -4.035 7.27e-05 ***
## areaconst 0.66444 0.06703 9.913 < 2e-16 ***
## estrato 85.58184 13.17690 6.495 4.51e-10 ***
## habitaciones 8.91428 7.14129 1.248 0.213
## parqueaderos 28.05949 6.77575 4.141 4.74e-05 ***
## banios 11.49860 9.51130 1.209 0.228
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 152.8 on 248 degrees of freedom
## Multiple R-squared: 0.5952, Adjusted R-squared: 0.587
## F-statistic: 72.92 on 5 and 248 DF, p-value: < 2.2e-16
Del resultado se puede inferir que las variables de area construida, estrato y parqueaderos son las unicas estadisticamente significativas Área construida (0.664): Por cada metro cuadrado extra, el precio de la casa aumenta en promedio 0.664 millones de pesos (664,440 COP), asumiendo que lo demás se mantiene constante. Es un comportamiento del mercado completamente lógico. Estrato (85.58): Pasar de un estrato al siguiente incrementa el valor de la propiedad en aproximadamente 85.58 millones de pesos. Tiene sentido, dado que el estrato refleja la valorización y los servicios del sector. Parqueaderos (28.06): Cada espacio de estacionamiento adicional aporta unos 28.06 millones al precio final. Habitaciones y Baños (No significativos): Al tener p-valores altos (0.213 y 0.228), el modelo nos dice que no aportan información relevante al precio si ya conocemos el área. Es lógico: dividir una casa de 200 m2 en más cuartos no la hace más costosa; lo que realmente cuesta es el tamaño total.
El \(R^2\) múltiple es de 0.5952. Esto significa que las variables seleccionadas logran explicar aproximadamente el 59.5% de la variabilidad de los precios en la Zona Norte. Es un ajuste moderado aceptable, pero deja un 40.5% del precio explicado por factores que no estamos midiendo, los cuales pueden ser por el no tratamiento de datos atipicos, una necesidad de simplificar el modelo o incluir nuevas variables asociadas a los inmuebles.
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).
if(!require(performance)) install.packages("performance")
## Cargando paquete requerido: performance
if(!require(see)) install.packages("see")
## Cargando paquete requerido: see
library(performance)
check_model(modelo_norte)
De los graficos se puede inferir:
Normalidad: Como se sospechaba, los puntos azules siguen la línea verde en el centro, pero se desvían formando una ligera curva en los extremos. Esto indica que los residuos no son perfectamente normales, principalmente debido a propiedades con precios atípicos que el modelo no logra predecir con exactitud.
Homocedasticidad: La línea verde de referencia no es plana ni horizontal; presenta una curva ascendente clara a medida que aumentan los valores ajustados. Esto significa que hay heterocedasticidad: el modelo comete errores más grandes al intentar predecir las casas más costosas.
Observaciones Influyentes: El gráfico muestra que existe al menos un valor atípico extremo (el punto etiquetado como 231) que tiene un alto nivel de influencia, lo que podría estar distorsionando la línea de regresión.
Colinealidad: Este supuesto sí se cumple a la perfección. Todos los puntos están en la zona verde baja, lo que indica que nuestras variables independientes no son redundantes entre sí.
Para solucionar los problemas de normalidad y homocedasticidad, se podría aplicar una transformación logarítmica a la variable respuesta, o sea el precio y al área construida. Adicionalmente, sería prudente identificar y remover los valores atípicos extremos antes de entrenar el modelo nuevamente.
Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.
nuevas_viviendas <- data.frame(
areaconst = c(200, 200),
estrato = c(4, 5),
parqueaderos = c(1, 1),
banios = c(2, 2),
habitaciones = c(4, 4)
)
predicciones <- predict(modelo_norte, newdata = nuevas_viviendas)
cat("Precio estimado (Estrato 4): $", round(predicciones[1], 2), "Millones\n")
## Precio estimado (Estrato 4): $ 316.3 Millones
cat("Precio estimado (Estrato 5): $", round(predicciones[2], 2), "Millones\n")
## Precio estimado (Estrato 5): $ 401.88 Millones
Se le debe responder a la compañia internacional, que el presupuesto preaprobado de 350M es viable para la casa de estrato 4, y que alli es donde se debe enfocar la busqueda, decartando el estrato 5 ya que esta a mas de 50M encima del presupuesto
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.
ofertas_vivienda1 <- base1 %>%
filter(preciom <= 350 & estrato == 4) %>%
mutate(diferencia_area = abs(areaconst - 200)) %>%
arrange(diferencia_area) %>%
head(5)
print("Top 5 Ofertas Potenciales (Estrato 4) para Vivienda 1:")
## [1] "Top 5 Ofertas Potenciales (Estrato 4) para Vivienda 1:"
ofertas_vivienda1 %>%
select(barrio, preciom, areaconst, estrato, habitaciones, banios, parqueaderos)
## # A tibble: 5 × 7
## barrio preciom areaconst estrato habitaciones banios parqueaderos
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 vipasa 270 171 4 4 4 3
## 2 el bosque 330 165 4 4 4 1
## 3 el bosque 340 162 4 4 4 1
## 4 zona norte 265 162 4 4 3 1
## 5 la merced 330 240 4 3 2 1
mapa_ofertas1 <- leaflet(ofertas_vivienda1) %>%
addTiles() %>%
addMarkers(
lng = ~longitud,
lat = ~latitud,
popup = ~paste("<b>Barrio:</b>", barrio, "<br>",
"<b>Precio:</b> $", preciom, "M<br>",
"<b>Área:</b>", areaconst, "m²<br>",
"<b>Estrato:</b>", estrato)
)
mapa_ofertas1
Cumplimiento Financiero: Absolutamente todas las opciones están por
debajo del crédito preaprobado de 350 millones, oscilando entre los 265
y 340 millones. Esto representa un ahorro significativo para la compañía
internacional.
- La Opción Estrella (Vipasa): Con un precio de 270 millones, esta casa
destaca enormemente. Aunque su área es un poco menor a lo esperado (171
m2), supera las expectativas en comodidades: ofrece los 4 cuartos
solicitados, pero entrega 4 baños y 3 parqueaderos (el cliente solo
pedía 2 y 1, respectivamente). Es la mejor relación
costo-beneficio.
- La Opción de Mayor Espacio (La Merced): Si para la familia del
empleado es innegociable tener una casa grande, esta opción ofrece 240
m2 por 330 millones. Cumple con los baños y parqueaderos exactos, pero
el cliente tendría que sacrificar una habitación, ya que solo cuenta con
3 (frente a las 4 solicitadas).
Opciones Estándar (El Bosque): Las dos casas en El Bosque (330 y 340
millones) tienen áreas más reducidas (162-165 m2), pero cumplen con las
4 habitaciones y ofrecen 4 baños. Su costo por metro cuadrado es más
elevado, lo que sugiere que podrían estar más remodeladas o en un sector
de mayor valorización. - Opción Económica (Zona Norte general): Por 265
millones, cumple con las 4 habitaciones y supera los baños (3), pero con
un área de 162 m2.
Validación Geográfica: El mapa confirma que las 5 propiedades están estratégicamente ubicadas dentro del corredor norte de la ciudad (cerca de vías principales como la Avenida 6 Norte). No hay falsos positivos geográficos en esta selección.
base2 <- vivienda %>%
filter(tipo == "Apartamento" & zona == "Zona Sur") %>%
drop_na()
print("Primeros 3 registros de base2:")
## [1] "Primeros 3 registros de base2:"
head(base2, 3)
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 5098 Zona S… 05 4 290 96 1 2 3
## 2 698 Zona S… 02 3 78 40 1 1 2
## 3 6975 Zona S… 06 4 220 75 1 2 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
mapa_base2 <- leaflet(base2) %>%
addTiles() %>%
addCircleMarkers(
lng = ~longitud,
lat = ~latitud,
radius = 4,
color = "darkred",
stroke = FALSE,
fillOpacity = 0.5,
popup = ~paste("<b>Barrio:</b>", barrio, "<br>",
"<b>Precio:</b> $", preciom, "M")
)
mapa_base2
Aunque la gran masa de puntos rojos está correctamente aglomerada en el sur de Cali, hay una cantidad considerable de propiedades esparcidas por el centro, oriente e incluso en el extremo norte. Esta dispersión se debe a los mismos factores detectados en la Zona Norte: anunciantes que seleccionan la zona equivocada por error o estrategia comercial, y fallas del algoritmo de georreferenciación al procesar direcciones incompletas.
correlaciones_sur <- base2 %>%
select(preciom, areaconst, estrato, banios, habitaciones) %>%
cor(use = "complete.obs")
cat("Correlaciones con el Precio (Apartamentos Zona Sur):\n")
## Correlaciones con el Precio (Apartamentos Zona Sur):
print(round(correlaciones_sur[,"preciom"], 2))
## preciom areaconst estrato banios habitaciones
## 1.00 0.72 0.65 0.72 0.32
grafico_dispersion_sur <- ggplot(base2, aes(x = areaconst, y = preciom,
color = as.factor(estrato),
text = paste("Baños:", banios,
"<br>Habitaciones:", habitaciones))) +
geom_point(alpha = 0.5) +
geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
labs(title = "Precio vs Área Construida por Estrato (Apartamentos Sur)",
x = "Área Construida (m²)",
y = "Precio (Millones COP)",
color = "Estrato") +
theme_minimal()
ggplotly(grafico_dispersion_sur, tooltip = c("x", "y", "color", "text"))
## `geom_smooth()` using formula = 'y ~ x'
Para este caso el area construida y el numero de baños tienen la misma correlacion con el precio, seguido del estrato que muestra el peso de la ubicacion, ya que estos valores muestran que el sector sur tiene mejores viviendas y comodidades. Visualmente, el estrato 6 (puntos morados) domina la parte alta de los precios. Sin embargo, en la esquina inferior derecha resaltan un par de propiedades (una de casi 1000 m2) con precios absurdamente bajos; estos son los típicos errores de digitación que ensucian el modelo.
modelo_sur <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = base2)
summary(modelo_sur)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = base2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1023.81 -41.49 -1.62 40.43 935.25
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -265.88631 16.98801 -15.651 < 2e-16 ***
## areaconst 1.21225 0.06101 19.870 < 2e-16 ***
## estrato 57.95258 3.46882 16.707 < 2e-16 ***
## habitaciones -18.60682 4.29409 -4.333 1.55e-05 ***
## parqueaderos 82.36047 5.06287 16.268 < 2e-16 ***
## banios 47.52768 3.87136 12.277 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 95.6 on 1854 degrees of freedom
## Multiple R-squared: 0.7367, Adjusted R-squared: 0.736
## F-statistic: 1038 on 5 and 1854 DF, p-value: < 2.2e-16
De lo anterior se interpreta lo siguiente:
library(performance)
check_model(modelo_sur)
Normalidad de los residuos: La gran mayoría de los puntos se adhieren a
la línea de referencia central, pero se observa una desviación severa en
la cola derecha (los puntos suben drásticamente). Esto indica que los
residuos no son normales y que el modelo tiene problemas para predecir
los apartamentos con precios atípicamente altos.
Homocedasticidad: La línea verde sube de forma muy pronunciada a medida que avanzan los valores ajustados. Existe una clara heterocedasticidad; es decir, la ecuación es decente prediciendo apartamentos estándar, pero su margen de error se dispara drásticamente al intentar predecir los inmuebles más costosos.
Observaciones Influyentes: El gráfico confirma nuestras sospechas. Los puntos 646 y 675 cruzan las líneas de contorno rojas punteadas. Estas propiedades representan valores atípicos extremos (probablemente errores de digitación de los anunciantes) que tienen tanta influencia que están deformando el modelo.
Colinealidad: Este es el único supuesto que se cumple a la perfección. Ninguna variable supera el umbral (todas están en la zona verde inferior con VIF bajo), lo que significa que no hay redundancia de información entre el área, los baños, el estrato y los parqueaderos.
Se recomienda eliminar explicitamente las observaciones 646 y 675 para limpiar el ruido, y generar una transformacion logaritmica sobre el precio para corregit la heterocedasticidad.
nuevas_viviendas2 <- data.frame(
areaconst = c(300, 300),
estrato = c(5, 6),
parqueaderos = c(3, 3),
banios = c(3, 3),
habitaciones = c(5, 5)
)
predicciones2 <- predict(modelo_sur, newdata = nuevas_viviendas2)
cat("Precio estimado (Estrato 5): $", round(predicciones2[1], 2), "Millones\n")
## Precio estimado (Estrato 5): $ 684.18 Millones
cat("Precio estimado (Estrato 6): $", round(predicciones2[2], 2), "Millones\n")
## Precio estimado (Estrato 6): $ 742.13 Millones
En este caso la capacidad financiera de la compañia internacional permite elegir apartamentos en estrato 6 sin problema, con las comodidades requeridas.
ofertas_vivienda2 <- base2 %>%
filter(preciom <= 850 & estrato == 6) %>%
mutate(diferencia_area = abs(areaconst - 300)) %>% # Buscamos cercanía a los 300m2 solicitados
arrange(diferencia_area) %>%
head(5)
print("Top 5 Ofertas Potenciales (Estrato 6) para Vivienda 2:")
## [1] "Top 5 Ofertas Potenciales (Estrato 6) para Vivienda 2:"
ofertas_vivienda2 %>%
select(barrio, preciom, areaconst, estrato, habitaciones, banios, parqueaderos)
## # A tibble: 5 × 7
## barrio preciom areaconst estrato habitaciones banios parqueaderos
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 el ingenio 700 250 6 5 4 2
## 2 pance 600 230 6 4 5 2
## 3 ciudad jardín 695 227 6 3 3 3
## 4 quintas de don 660 224. 6 4 5 2
## 5 ciudad jardín 650 223 6 3 5 3
mapa_ofertas2 <- leaflet(ofertas_vivienda2) %>%
addTiles() %>%
addMarkers(
lng = ~longitud,
lat = ~latitud,
popup = ~paste("<b>Barrio:</b>", barrio, "<br>",
"<b>Precio:</b> $", preciom, "M<br>",
"<b>Área:</b>", areaconst, "m²<br>",
"<b>Estrato:</b>", estrato)
)
mapa_ofertas2
Con base a lo anterior, se puede concluir que las mejores opciones se distribuyen asi:
La validación espacial en el mapa confirma que estas propiedades están ubicadas de forma precisa, sin errores de geocodificación, en los corredores residenciales de mayor valorización del sur de Cali. La recomendación gerencial para María es presentar la oferta de El Ingenio como la propuesta principal, ya que satisface la necesidad crítica de acomodar a la familia en 5 habitaciones, sugiriendo utilizar el enorme remanente del presupuesto (150 millones) para solucionar el parqueadero faltante.