1. ENUNCIADO

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:

Vivienda 1:

Casa con area de 200 mts, 1 parqueadero, 2 baños, 4 habitaciones, estrato 4 o 5, zona norte y valor 350 millones.

vivienda 2:

Apartamento, área 300 mts 3 parqueaderos, 3 baños, 5 habitaciones, estrato 5 o 6, zona sur, precio 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) .

1.1 Detección de faltantes

viviendau <- unique(vivienda)
vis_miss(viviendau)

Se observa que parqueaderos y piso tienen una cantidad importante de faltantes.

glimpse(viviendau)
## Rows: 8,321
## Columns: 13
## $ id           <dbl> 1147, 1169, 1350, 5992, 1212, 1724, 2326, 4386, 1209, 159…
## $ zona         <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur…
## $ piso         <chr> NA, NA, NA, "02", "01", "01", "01", "01", "02", "02", "02…
## $ estrato      <dbl> 3, 3, 3, 4, 5, 5, 4, 5, 5, 5, 6, 4, 5, 6, 4, 5, 5, 4, 5, …
## $ preciom      <dbl> 250, 320, 350, 400, 260, 240, 220, 310, 320, 780, 750, 62…
## $ areaconst    <dbl> 70, 120, 220, 280, 90, 87, 52, 137, 150, 380, 445, 355, 2…
## $ parqueaderos <dbl> 1, 1, 2, 3, 1, 1, 2, 2, 2, 2, NA, 3, 2, 2, 1, 4, 2, 2, 2,…
## $ banios       <dbl> 3, 2, 2, 5, 2, 3, 2, 3, 4, 3, 7, 5, 6, 2, 4, 4, 4, 3, 2, …
## $ habitaciones <dbl> 6, 3, 4, 3, 3, 3, 3, 4, 6, 3, 6, 5, 6, 2, 5, 5, 4, 3, 3, …
## $ tipo         <chr> "Casa", "Casa", "Casa", "Casa", "Apartamento", "Apartamen…
## $ barrio       <chr> "20 de julio", "20 de julio", "20 de julio", "3 de julio"…
## $ longitud     <dbl> -76.51168, -76.51237, -76.51537, -76.54000, -76.51350, -7…
## $ latitud      <dbl> 3.43382, 3.43369, 3.43566, 3.43500, 3.45891, 3.36971, 3.4…

Se imputan piso y parqueaderos utilizando los 5 vecinos más cercanos:

vivienda_imp <- kNN(viviendau, variable = c("piso", "parqueaderos"), k = 5)

Se realiza gráfico interactivo con los datos de vivienda imputados:

# Selección de columnas solicitadas:
vivienda_graf <- vivienda_imp %>% select(preciom, areaconst, estrato, banios, habitaciones, zona)

# gráfico de correlación
ggpairs_plot <- ggpairs(vivienda_graf, 
                        aes(color = zona, alpha = 0.5),
                        lower = list(continuous = wrap("points", alpha = 0.3)),
                        diag = list(continuous = "densityDiag"),
                        upper = list(continuous = wrap("cor", size = 3))) +
                theme_bw()

# Convertir el gráfico a interactivo de plotly
ggpairs_plotly <- ggplotly(ggpairs_plot)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggpairs_plotly

Se observan las correlaciones entre las diferentes variables siendo la más representativa la correlación entre precio y área, la mayor cantidad de viviendas se encuentra en la zona sur.

2. Casas Norte

Se realiza un filtro doble que evite que se detecten casas de otras zonas, bien sea porque estén mal etiquetadas la longitud y latitud o porque la zona esté incorrecta.

vivienda_Nor <- vivienda_imp%>%filter(zona == "Zona Norte", tipo == "Casa")
head(vivienda_Nor, 3)

2.1 Se realiza mapa con las viviendas etiquetadas como zona norte:

k_nort <- data.frame(
  lat = vivienda_Nor$latitud,
  long = vivienda_Nor$longitud
)

# Crea un mapa
map_N <- leaflet(k_nort) %>%
  addTiles() %>%
  addMarkers(
    lng = ~long,
    lat = ~lat,
    popup = ~paste("Latitud:", lat, "<br>", "Longitud:", long)
  )

map_N # Muestra el mapa

Se observa que existen casas etiquetadas como zona norte distribuidas por toda la ciudad, en este caso pueden haber errores de digitación tanto de la zona como de latitud y longitud, por esta razón se propone un filtro doble en la siguiente sección.

Se calculan las casas ubicadas al norte de Cali, se realiza una detección de la zona Norte creando un rectangulo que aproxima esta zona mediante la latitud y la longitud y también se filtran las casas que están marcadas solo como zona norte.Para la definición de la zona aproximada, se utilizaron los datos de las zonas de la página de la alcaldía de Cali.

Casas_Norte <- vivienda_imp%>%filter(latitud >= 3.4532 & latitud<=3.5297, longitud <= -76.4734 & longitud>= -76.5373,
                                     tipo == "Casa", zona == "Zona Norte")
head(Casas_Norte, 3)

Se verifican las viviendas del norte ubicándolas en el mapa:

library(leaflet)

ubic_nort <- data.frame(
  lat = Casas_Norte$latitud,
  long = Casas_Norte$longitud
)

# Crea un mapa
map <- leaflet(ubic_nort) %>%
  addTiles() %>%
  addMarkers(
    lng = ~long,
    lat = ~lat,
    popup = ~paste("Latitud:", lat, "<br>", "Longitud:", long)
  )
map # Muestra el mapa

Convertir estrato y zona a factor

Casas_Norte$estrato <- as.factor(Casas_Norte$estrato)
Casas_Norte$zona <- as.factor(Casas_Norte$zona)

2.2 Gráfico interactivo de casas Zona Norte

# Seleccionar las columnas relevantes del data frame
Casas_sel <- Casas_Norte %>% select(preciom, areaconst, estrato, banios, habitaciones)

# Crear el gráfico de correlación usando ggpairs
ggpairs_plot <- ggpairs(Casas_sel, 
                        aes(color = estrato, alpha = 0.5),
                        lower = list(continuous = wrap("points", alpha = 0.3)),
                        diag = list(continuous = "densityDiag"),
                        upper = list(continuous = wrap("cor", size = 3))) +
                theme_bw()

# Convertir el gráfico a un objeto interactivo de plotly
ggpairs_plotly <- ggplotly(ggpairs_plot)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggpairs_plotly

En este mapa se puede observar la distribución de correlaciones respecto a cada uno de los estratos y se deduce información importante como por ejemplo que la correlación entre precio y habitaciones para los estratos 5 y 6 son bajas y que la correlación entre precio y área contruida es mas alta que entre las demás variables.

2.3 División datos

Se realiza división de las casas al norte en conjunto de entrenamiento y de prueba utilizando una relación 70% para entrenamiento y 30% para prueba:

set.seed(123)
div <- sample.split(Casas_Norte, SplitRatio = 0.7)

casas_train_data <- subset(Casas_Norte, div == TRUE)
casas_test_data <- subset(Casas_Norte, div == FALSE)

2.4 Se construye el modelo de regresión

# Ajustar el modelo de regresión lineal múltiple
Casas_rl <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = casas_train_data)

# Resumen del modelo para obtener los coeficientes y las estadísticas
summary(Casas_rl)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = casas_train_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -716.25  -58.42  -10.84   37.16  991.63 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    9.13374   23.81204   0.384 0.701530    
## areaconst      0.89692    0.06774  13.240  < 2e-16 ***
## estrato4      69.21119   22.67483   3.052 0.002448 ** 
## estrato5      97.01597   21.83581   4.443 1.20e-05 ***
## estrato6     261.23832   42.28735   6.178 1.84e-09 ***
## habitaciones  11.96178    6.19816   1.930 0.054445 .  
## parqueaderos  24.12455    6.44974   3.740 0.000215 ***
## banios         4.38195    7.56279   0.579 0.562694    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 141.3 on 343 degrees of freedom
## Multiple R-squared:  0.688,  Adjusted R-squared:  0.6816 
## F-statistic:   108 on 7 and 343 DF,  p-value: < 2.2e-16

De acuerdo con los valores obtenidos, se úede generar la formula de precio teniendo en cuenta el intercepto y los estimados de cada una de las variables.

Se obtuvo un \(R^2\) ajustado de 0.70 el cual indica que las variables independientes utilizadas explican en un 70% la variación del precio. En general las variables tienen buena significacncia, sin embargo, habitaciones parece ser una variable no muy relevante para el modelo, por lo que puede omitirse para mejorar el modelo.

Se calcula el factor de inflación de la varianza VIF:

vif(Casas_rl)
##                  GVIF Df GVIF^(1/(2*Df))
## areaconst    1.933246  1        1.390412
## estrato      1.652981  3        1.087372
## habitaciones 1.943730  1        1.394177
## parqueaderos 1.345062  1        1.159768
## banios       2.132283  1        1.460234

Dado que los valores de VIF dieron más bajos de 5, indica que no tenemos problemas de multicolinealidad.

par(mfrow = c(2, 2))
plot(Casas_rl)

Se observa que los residuos son aproximadamente normales, por lo que el modelo parece ser una buena aproximación para calcular el precio de las casas de la zona norte.

2.5 Casas sugeridas Norte

#data frame para estrato 4
casa_e4 <- data.frame(
  areaconst = 200,
  estrato = as.factor(4),
  habitaciones = 4,
  parqueaderos = 1,
  banios = 2
)

#data frame para estrato 5
casa_e5 <- data.frame(
  areaconst = 200,
  estrato = as.factor(5),
  habitaciones = 4,
  parqueaderos = 1,
  banios = 2
)
# Predicción del precio para estrato 4
precio_casa_e4 <- predict(Casas_rl, casa_e4)

# Predicción del precio para estrato 5
precio_casa_e5 <- predict(Casas_rl, casa_e5)

# Mostrar los precios predichos
print(paste("Precio casa estrato 4: ", round(precio_casa_e4, 2)))
## [1] "Precio casa estrato 4:  338.46"
print(paste("Precio casa estrato 5: ", round(precio_casa_e5, 2)))
## [1] "Precio casa estrato 5:  366.27"

El modelo realiza una aproximación buena, pues los valores predichos por el modelo se acercan al valor que se requiere de 350 millones.

predicciones_c <- predict(Casas_rl, newdata = casas_test_data)

# Comparar las predicciones con los valores reales
resultados_c <- data.frame(Real = casas_test_data$precio, Prediccion_c = predicciones_c)
head(resultados_c)
# Crear la gráfica con ggplot2
ggplot(resultados_c, aes(x = Real, y = Prediccion_c)) +
  geom_point(color = "blue", alpha = 0.5) +  # precios reales vs predichos
  geom_abline(slope = 1, intercept = 0, color = "red", linetype = "dashed") +
  labs(title = "Comparación de Precio Real vs Predicho",
       x = "Precio Real",
       y = "Precio Predicho") +
  theme_minimal()

El modelo se aproxima relativamente bien para el valor de la casa que estamos buscando, sin embargo, si se necesitara una casa con un valor por encima de los 1000 millones se requeriría buscar otro modelo, pues los valores de precio calculado y precio real se separan bastante.

# Calcular los precios predichos para todas las observaciones
Casas_Norte$precio_pred <- predict(Casas_rl, newdata = Casas_Norte)

Se detectan las casas que presentan un valor de 350 millones o un poco más bajo en su precio real, dado que es el verdadero precio que pagará la em presa por ella.

# Definir el rango de tolerancia
tol <- 10

# Filtrar las viviendas que se ajusten al precio de 350 con una tolerancia de +/- 20
casa_350 <- Casas_Norte[abs(Casas_Norte$preciom - 340) <= tol, ]

# 10 viviendas que se acercan al precio buscado
head(casa_350, 10)
precio_casa <- 350
areaconst_casa <- 200
parqueaderos_casa <- 1
banios_casa <- 2
habitaciones_casa <- 4
estrato_casa <- c(4, 5)

# Calcular la distancia de cada vivienda a los valores objetivo
casa_sugerida <- casa_350 %>%
  # Filtrar por estrato objetivo
  filter(estrato %in% estrato_casa) %>%
  # Calcular distancia usando una métrica de distancia (por ejemplo, la suma de diferencias absolutas)
  mutate(
    distancia = abs(preciom - precio_casa) +
                abs(areaconst - areaconst_casa) +
                abs(parqueaderos - parqueaderos_casa) +
                abs(banios - banios_casa) +
                abs(habitaciones - habitaciones_casa)
  ) %>%
  # Ordenar por la distancia calculada, las más cercanas primero
  arrange(distancia)

# Mostrar las viviendas más cercanas
head(casa_sugerida)

Se seleccionan los 5 primeros registros, pues son los más cercanos a la vivienda requerida y además se elimina el registro que presenta 3 habitaciones, pues está fuera de lo solicitado:

casas_sug <- head(casa_sugerida)
casas_sug <- casas_sug[-3, ]
casas_sug

Se presentan las 5 casas con valor similar al solicitado,

Mapa_nort <- data.frame(
  lat = casas_sug$latitud,
  long = casas_sug$longitud
)

# Crea un mapa
map <- leaflet(Mapa_nort) %>%
  addTiles() %>%
  addMarkers(
    lng = ~long,
    lat = ~lat,
    popup = ~paste("Latitud:", lat, "<br>", "Longitud:", long)
  )
map # Muestra el mapa

3. Apartamentos zona sur

Apartamentos_Sur <- vivienda_imp%>%filter(latitud >= 3.3252 & latitud<=3.4087, longitud <= -76.5229 & longitud>= -76.5475, 
                                          tipo == "Apartamento", zona == "Zona Sur")

3.1 Mapa de apartamentos Zona Sur

library(leaflet)

ubic_sur <- data.frame(
  lat = Apartamentos_Sur$latitud,
  long = Apartamentos_Sur$longitud
)

# Crea un mapa
map_s <- leaflet(ubic_sur) %>%
  addTiles() %>%
  addMarkers(
    lng = ~long,
    lat = ~lat,
    popup = ~paste("Latitud:", lat, "<br>", "Longitud:", long)
  )

map_s # Muestra el mapa

Convertir estrato y zona a factor.

Apartamentos_Sur$estrato <- as.factor(Apartamentos_Sur$estrato)
Apartamentos_Sur$zona <- as.factor(Apartamentos_Sur$zona)
head(Apartamentos_Sur, 3)

3.2 Gráfico interactivo de apartamentos Zona Sur

# Seleccionar las columnas relevantes del data frame
Aptos_sel <- Apartamentos_Sur %>% select(preciom, areaconst, estrato, banios, habitaciones)

# Crear el gráfico de correlación usando ggpairs
ggpairs_plot <- ggpairs(Aptos_sel, 
                        aes(color = estrato, alpha = 0.5),
                        lower = list(continuous = wrap("points", alpha = 0.3)),
                        diag = list(continuous = "densityDiag"),
                        upper = list(continuous = wrap("cor", size = 3))) +
                theme_bw()

# Convertir el gráfico a un objeto interactivo de plotly
ggpairs_plotly <- ggplotly(ggpairs_plot)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggpairs_plotly

Mediante este gráfico interactivo se pueden observar las características de los apartamentos en el sur, dentro de ellas se encuentra que en su mayoría cuentan con tres habitaciones, las correlaciones más representativas se encuentran entre precio y área y entre precio y baños.

3.3 División datos

set.seed(123)
div_aptos <- sample.split(Apartamentos_Sur, SplitRatio = 0.7)

aptos_train_data <- subset(Apartamentos_Sur, div == TRUE)
aptos_test_data <- subset(Apartamentos_Sur, div == FALSE)

3.4 Se construye el modelo de regresión

# Ajustar el modelo de regresión lineal múltiple
Aptos_rl <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = aptos_train_data)

# Resumen del modelo para obtener los coeficientes y las estadísticas
summary(Aptos_rl)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = aptos_train_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -913.91  -52.36   -3.62   47.28  901.60 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -25.04288   27.94963  -0.896  0.37052    
## areaconst      1.11049    0.08315  13.356  < 2e-16 ***
## estrato4      17.80796   20.87076   0.853  0.39377    
## estrato5      36.11743   19.98790   1.807  0.07114 .  
## estrato6     170.93231   22.79214   7.500 1.67e-13 ***
## habitaciones -23.69562    7.92165  -2.991  0.00286 ** 
## parqueaderos  80.57885    7.11820  11.320  < 2e-16 ***
## banios        52.45463    6.23773   8.409  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 117.8 on 815 degrees of freedom
## Multiple R-squared:  0.7479, Adjusted R-squared:  0.7458 
## F-statistic: 345.5 on 7 and 815 DF,  p-value: < 2.2e-16

En la construcción del modelo de regresión, se obtuvo un \(R^2\) ajustado de 0.74 con lo que las variables que se usaron en el modelo, explican en un 74% la variabilidad del precio. Las que mayor significancia tienen fueron area construida, en el modelo con el estrato 6 este tiene buena significancia, también parqueaderos y baños. Habitaciones tiene una menos significancia que las otras variables.

Se evalúa el VIF:

vif(Aptos_rl)
##                  GVIF Df GVIF^(1/(2*Df))
## areaconst    1.736273  1        1.317677
## estrato      1.831560  3        1.106123
## habitaciones 1.478133  1        1.215785
## parqueaderos 1.777589  1        1.333262
## banios       2.624992  1        1.620183

Al ser menor de 5 implica que no hay problemas de multicolinealidad.

par(mfrow = c(2, 2))
plot(Aptos_rl)

Los residuales se mueven al rededor de los valores ajustados y de acuerdo con el Q-Q plot el modelo es bueno para predecir los valores de los apartamentos del sur.

2.5 Apartamentos sugeridos Sur

# Crear un data frame con las características de la vivienda
# Crear un data frame para estrato 4
apto_e5 <- data.frame(
  areaconst = 850,
  estrato = as.factor(5),
  habitaciones = 5,
  parqueaderos = 3,
  banios = 3
)
apto_e6 <- data.frame(
  areaconst = 850,
  estrato = as.factor(6),
  habitaciones = 5,
  parqueaderos = 3,
  banios = 3  
)
# Predicción del precio para estrato 4
precio_apto_e5 <- predict(Aptos_rl, apto_e5)

# Predicción del precio para estrato 5
precio_apto_e6 <- predict(Aptos_rl, apto_e6)

# Mostrar los precios predichos
print(paste("Precio apartamento estrato 5: ", round(precio_apto_e5, 2)))
## [1] "Precio apartamento estrato 5:  1235.62"
print(paste("Precio apartamento estrato 6: ", round(precio_apto_e6, 2)))
## [1] "Precio apartamento estrato 6:  1370.43"

Se realiza una predicción de los apartamentos que se requieren para el estrato 5 y 6, sin embargo, el modelo detecta que el precio para un apartamento con estas características supera los 1200 millones.

predicciones_a <- predict(Aptos_rl, newdata = aptos_test_data)

# Comparar las predicciones con los valores reales
resultados_a <- data.frame(Real = aptos_test_data$precio, Prediccion_a = predicciones_a)
head(resultados_a)
# Crear la gráfica con ggplot2
ggplot(resultados_a, aes(x = Real, y = Prediccion_a)) +
  geom_point(color = "blue", alpha = 0.5) +  # precios reales vs predichos
  geom_abline(slope = 1, intercept = 0, color = "red", linetype = "dashed") +
  labs(title = "Comparación de Precio Real vs Predicho Apartamentos Sur",
       x = "Precio Real",
       y = "Precio Predicho") +
  theme_minimal()

Igual que ocurrió con las casas, el modelo se comporta bien aproximadamente hasta valores un poco inferiores a los 800 millones, se puede mejorar probablemente el modelo si se omiten en el modelo de regresión algunas de las variables como por ejemplo habitaciones.

# Calcular los precios predichos para todas las observaciones
Apartamentos_Sur$precio_pred <- predict(Aptos_rl, newdata = Apartamentos_Sur)
# Definir el rango de tolerancia
tol_a <- 20

# Filtrar las viviendas que se ajusten al precio de 350 con una tolerancia de +/- 20
apto_850 <- Apartamentos_Sur[abs(Apartamentos_Sur$preciom - 830) <= tol, ]

# 10 viviendas que se acercan al precio buscado
head(apto_850)
precio_apto <- 850
areaconst_apto <- 300
parqueaderos_apto <- 3
banios_apto <- 3
habitaciones_apto <- 5
estrato_apto <- c(5, 6)

# Calcular la distancia de cada vivienda a los valores objetivo
apto_sugerido <- apto_850 %>%
  # Filtrar por estrato objetivo
  filter(estrato %in% estrato_apto) %>%
  # Calcular distancia usando una métrica de distancia (por ejemplo, la suma de diferencias absolutas)
  mutate(
    distancia = abs(preciom - precio_apto) +
                abs(areaconst - areaconst_apto) +
                abs(parqueaderos - parqueaderos_apto) +
                abs(banios - banios_apto) +
                abs(habitaciones - habitaciones_apto)
  ) %>%
  # Ordenar por la distancia calculada, las más cercanas primero
  arrange(distancia)

# Mostrar las viviendas más cercanas
head(apto_sugerido)

No se encontraron apartamentos sugeridos en la zona sur con las características requieridas, pues para el precio dado de 850 millones se encuentran apartamentos con menor area y sin la cantidad de habitaciones que requieren.

4. Recomendaciones

Para el cliente que

*** ANEXO - CARTA A CLIENTE***

Estimada Maria,

De acuerdo con su solicitud para la búsqueda de dos viviendas en la Ciudad de Cali, utilizando la base de datos proporcionada, hemos encontrado varias opciones de vivienda para el cliente que necesita una casa de 200\(m^2\) las cueles se presentan a continuación:

head(casas_sug)
map

Para el segundo cliente, que requiere un apartamento de 300\(m^2\) en la zona sur, no hemos encontrado una oferta que se adapte a las necesidades, pues en esta zona y con las características suministradas, se requiere de un monto mayor a los 1200 millones. Debido a esto presentamos otras ofertas que se adaptan al presupuesto establecido para que puedan tomar una decisión el respecto:

head(apto_sugerido)

La ubicación de los apartamentos sugeridos que están en el presupuesto asignado es la siguiente:

Mapa_sur <- data.frame(
  lat = apto_sugerido$latitud,
  long = apto_sugerido$longitud
)

# Crea un mapa
mapa_s <- leaflet(Mapa_sur) %>%
  addTiles() %>%
  addMarkers(
    lng = ~long,
    lat = ~lat,
    popup = ~paste("Latitud:", lat, "<br>", "Longitud:", long)
  )

mapa_s # Muestra el mapa

Esperamos que este informe haya sido de ayuda para las necesidades del cliente y que puedan tomar una decisión sobre las sugerencias realizadas.