1 Introducción

En un mercado inmobiliario en constante evolución, es fundamental para las empresas del sector entender a profundidad las dinámicas que influyen en la oferta y la demanda de propiedades. En este informe se realiza un análisis detallado de las solicitudes de compra de dos viviendas en la ciudad de Cali. El objetivo es identificar las mejores opciones de compra en las zonas Norte y Sur, basándose en un análisis exploratorio de datos y en la estimación de modelos de regresión lineal múltiple.

2 Objetivos Generales y Específicos

2.1 Objetivo General

Identificar las mejores ofertas de vivienda en las zonas Norte y Sur de Cali utilizando técnicas de análisis exploratorio y modelos de regresión.

2.2 Objetivos Específicos

  • Filtrar y analizar las características de las viviendas en las zonas de interés.
  • Construir un modelo de regresión lineal múltiple para predecir los precios.
  • Validar los resultados y hacer predicciones para las solicitudes específicas.
  • Presentar las mejores ofertas en un formato visual y fácil de interpretar.

3 Métodos

3.1 1. Carga de Datos y Limpieza

En esta sección se procede con la carga de los datos de la base de datos vivienda utilizando el paquete paqueteMODELOS. Después de la carga, se realiza una limpieza de los datos, incluyendo la validación de tipos de datos, la conversión de valores a mayúsculas para garantizar la consistencia, y el manejo de valores nulos. Además, se eliminan los registros duplicados para asegurar la integridad de los datos.

3.2 2. Manejo de Valores Nulos

En esta sección, se aborda el manejo de los valores nulos en la base de datos. Se eliminan los registros con valores nulos en la columna id y se reemplazan los valores nulos en las columnas piso y parqueaderos utilizando la moda agrupada por la zona.

3.3 3. Eliminación de Duplicados

En esta sección, se identifican y eliminan los registros duplicados de la base de datos. Este paso es crucial para evitar sesgos en el análisis y asegurar que cada entrada en la base de datos sea única.

## [1] 62
## [1] 0.7452819

3.4 4. Análisis Exploratorio de Datos

En esta sección, se realiza un análisis exploratorio de los datos, enfocado en variables clave como el precio, área construida, número de baños, habitaciones, parqueaderos, y la distribución por estrato, tipo de vivienda y zona.

## Warning: Removed 247 rows containing non-finite outside the scale range
## (`stat_count()`).

3.5 Filtrado de Vivienda 1

3.5.1 (Casa en la Zona Norte)

En esta sección, se realiza el filtrado de los datos para seleccionar únicamente las viviendas que cumplen con las características de la primera solicitud: casas ubicadas en la zona Norte de Cali. Además, se utiliza la librería leaflet para visualizar las ubicaciones de las propiedades filtradas en un mapa interactivo.

Inicialmente, se identificaron problemas con la ubicación de algunas viviendas, ya que algunos registros no correspondían a la Zona Norte según las coordenadas geográficas proporcionadas. Por esta razón, se utilizó un rango específico de latitud y longitud que delimita mejor la zona Norte de Cali, para asegurar que todas las propiedades incluidas se encuentren en esa área.

## # A tibble: 3 × 13
## # Groups:   zona [1]
##      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  4057 ZONA N… 02          6     750       445            1      7            6
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

Durante el análisis inicial, se detectaron datos fuera de la zona Norte, lo cual hizo necesario delimitar mejor las coordenadas para garantizar que las propiedades filtradas realmente pertenecieran a esa área. Las coordenadas aproximadas que delimitan la zona Norte de Cali son las siguientes:

Latitud: entre 3.45 y 3.50 Longitud: entre -76.55 y -76.50

3.5.1.1 Código con las Coordenadas Delimitadas:

## # A tibble: 3 × 13
## # Groups:   zona [1]
##      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  1003 ZONA N… <NA>        3     380       300            1      5            8
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

El análisis geográfico confirma que las viviendas seleccionadas se encuentran en la Zona Norte de Cali, ajustadas a las coordenadas correctas y filtradas según sus características. Este enfoque asegura que las propiedades mostradas en este informe corresponden exactamente a la ubicación deseada, sin incluir viviendas en áreas que no cumplan con los requisitos.

## # A tibble: 3 × 13
## # Groups:   zona [1]
##      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  1003 ZONA N… <NA>        3     380       300            1      5            8
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

3.5.1.2 Análisis Exploratorio de Datos: Correlación entre Precio y Variables Clave

El objetivo de esta sección es realizar un análisis exploratorio para identificar la relación entre el precio de las viviendas y variables clave como el área construida, estrato, número de baños, número de habitaciones, y la zona donde se ubican las viviendas.

Para este análisis, se utilizan gráficos interactivos generados con el paquete plotly, los cuales permiten visualizar las correlaciones de manera dinámica y clara.

## 
## Attaching package: '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
3.5.1.2.1 Relación entre Área Construida y Precio

El gráfico muestra una correlación positiva entre el área construida y el precio de la vivienda. A medida que aumenta el área construida, el precio tiende a incrementarse. Este comportamiento es esperado, dado que viviendas con mayor área suelen tener más espacios y comodidades, lo que justifica un mayor valor en el mercado. No obstante, se observa cierta dispersión en las viviendas de gran tamaño, lo que sugiere que el precio no depende exclusivamente del área, sino también de otros factores como la ubicación y los acabados.

3.5.1.2.2 Relación entre Número de Baños, Habitaciones y Parqueaderos con el Precio

Tanto el número de baños como el de habitaciones y parqueaderos presentan una tendencia similar: a mayor número de estos, el precio de la vivienda es mayor. Sin embargo, se nota una mayor dispersión en estas variables, lo que indica que, aunque son factores relevantes, su impacto en el precio no es tan determinante como el área construida. Las viviendas con más baños, habitaciones y parqueaderos tienden a ser más costosas, pero la relación no es tan lineal como en el caso del área.

3.5.1.3 Modelo de Regresión Lineal Múltiple

En este análisis, estimamos un modelo de regresión lineal múltiple que relaciona el precio de las viviendas con variables como el área construida, estrato, número de habitaciones, parqueaderos y baños.

3.5.1.3.1 Resultados del Modelo

A continuación, presentamos el resumen del modelo y un análisis detallado de los coeficientes y su significancia estadística.

## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = vivienda_1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -753.39  -84.81  -21.95   43.57 1029.71 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -160.47199   49.44344  -3.246  0.00127 ** 
## areaconst       0.90272    0.06487  13.916  < 2e-16 ***
## estrato        57.64663   11.00633   5.238 2.59e-07 ***
## habitaciones    8.34194    6.02758   1.384  0.16711    
## parqueaderos    9.96365    6.38239   1.561  0.11926    
## banios         18.88105    7.39874   2.552  0.01107 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 170.9 on 415 degrees of freedom
## Multiple R-squared:  0.5736, Adjusted R-squared:  0.5685 
## F-statistic: 111.7 on 5 and 415 DF,  p-value: < 2.2e-16

## [1] "El valor de R² del modelo es: 0.574"

El gráfico de Residuos vs Valores Ajustados muestra cómo se distribuyen los residuos en relación con los valores ajustados por el modelo de regresión lineal múltiple. En un modelo adecuado, se espera que los residuos estén distribuidos aleatoriamente alrededor de la línea horizontal en 0, lo cual indicaría que el modelo no presenta patrones sistemáticos y que las predicciones del modelo son razonablemente precisas.

En este caso, observamos que los residuos parecen estar distribuidos de forma aleatoria, aunque con una ligera dispersión a medida que los valores ajustados aumentan. Esto sugiere que el modelo captura bien la relación entre las variables, pero podría haber cierta variabilidad no explicada en los precios más altos, lo que indica que el modelo podría beneficiarse de ajustes adicionales o la inclusión de más variables explicativas. Sin embargo, no se observan patrones claros que sugieran un ajuste inadecuado del modelo.

3.5.1.4 Validación de los Supuestos del Modelo

A continuación, se valida el cumplimiento de los principales supuestos del modelo de regresión lineal, mediante la visualización de cuatro gráficos: Residuos vs Valores Ajustados, Normal Q-Q, Scale-Location y Residuals vs Leverage.

En los gráficos de diagnóstico del modelo de regresión lineal múltiple, se valida el cumplimiento de los principales supuestos:

Residuals vs Fitted: Este gráfico evalúa la homocedasticidad. Los puntos están distribuidos de manera aleatoria alrededor de la línea cero, lo que sugiere que los residuos tienen varianza constante. Sin embargo, se observa cierta dispersión en los valores altos, lo que indica que podría haber heterocedasticidad leve en los valores más altos de los ajustados. Una posible mejora sería probar transformaciones como logaritmos o incluir más variables explicativas.

Normal Q-Q: Este gráfico permite evaluar si los residuos siguen una distribución normal. La mayoría de los puntos siguen la línea diagonal, aunque hay algunos valores extremos que se desvían al final, indicando la presencia de algunos outliers. Podría ser útil revisar estos puntos influyentes y analizar si corresponden a errores de datos o características inusuales.

Scale-Location: Este gráfico mide si la variabilidad de los residuos es constante a lo largo de los valores ajustados. Aunque hay una tendencia ascendente leve en los residuos estandarizados, en general, el gráfico no muestra un patrón claro, lo que indica que la variabilidad es relativamente constante. Sin embargo, si fuera necesario mejorar, podría considerarse la inclusión de una variable que explique mejor las observaciones extremas.

Residuals vs Leverage: Este gráfico permite identificar observaciones influyentes. Algunos puntos con valores altos de leverage (por ejemplo, las observaciones 103 y 413) indican que estas observaciones tienen un impacto considerable en el modelo. No obstante, su distancia de Cook está por debajo de 1, lo que sugiere que no son extremadamente influyentes. Aun así, se podría considerar una revisión adicional de estas observaciones.

Sugerencias

Aunque el modelo cumple con los supuestos básicos de la regresión, se podrían hacer algunas mejoras. Esto incluye probar transformaciones en las variables para mejorar la homocedasticidad y revisar las observaciones influyentes que podrían estar afectando la precisión del modelo. Sin embargo, no es estrictamente necesario aplicar estas mejoras, ya que el modelo, en general, presenta un buen ajuste.

3.5.1.5 Predicción del Precio y Ofertas Potenciales

A continuación, realizamos la predicción del precio de la vivienda para la primera solicitud, y sugerimos potenciales ofertas dentro del rango de 350 millones de pesos.

3.5.1.5.1 Entrenamiento y Prueba del Modelo

Para asegurar la reproducibilidad y validar el modelo, dividimos los datos en un conjunto de entrenamiento (70%) y uno de prueba (30%).

## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = entrenamiento)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -728.89  -79.07  -23.94   44.22  808.03 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -127.84450   55.55625  -2.301   0.0221 *  
## areaconst       0.87796    0.07271  12.075  < 2e-16 ***
## estrato        58.40180   12.71366   4.594 6.52e-06 ***
## habitaciones   -1.27171    6.86160  -0.185   0.8531    
## parqueaderos   19.26506    7.59930   2.535   0.0118 *  
## banios         17.04686    8.07189   2.112   0.0356 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 160.9 on 288 degrees of freedom
## Multiple R-squared:  0.601,  Adjusted R-squared:  0.594 
## F-statistic: 86.75 on 5 and 288 DF,  p-value: < 2.2e-16

3.5.1.6 Métricas de Rendimiento del Modelo

Se evalúan las métricas de rendimiento del modelo, como el RMSE (Raíz del Error Cuadrático Medio), el MAE (Error Absoluto Medio) y el R², para medir la precisión de las predicciones.

##           id         zona         piso      estrato      preciom    areaconst 
##            0            0           53            0            0            0 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##            0            0            0            0            0            0 
##      latitud 
##            0
## [1] "RMSE: 192.177673627861"
## [1] "MAE: 103.431836164916"
## [1] "R²: 0.413859168204186"
3.5.1.6.1 Predicción para la Primera Solicitud

Utilizamos las características de la primera solicitud para predecir el precio de la vivienda

## [1] "Predicción para la primera solicitud: 358.83"
3.5.1.6.2 Sugerencia de Ofertas Potenciales

A continuación, filtramos las viviendas cuyo precio predicho es menor o igual a 350 millones, y mostramos las 5 mejores ofertas.

3.5.2 Mapa de las Ofertas Potenciales (Zona norte, Casas)

A continuación, se presenta un mapa interactivo con las 5 mejores ofertas de vivienda sugeridas.

3.6 Filtrado de Vivienda 2

3.6.1 (Casa en la Zona Sur)

En esta sección, se realiza el filtrado de las viviendas para la segunda solicitud, seleccionando las casas que se encuentran en la zona sur de Cali. Al igual que con la zona norte, se identificaron problemas con la ubicación de algunas propiedades, por lo que se establecieron rangos de latitud y longitud específicos para asegurar que las viviendas estén correctamente ubicadas en la zona sur.

## # A tibble: 3 × 13
## # Groups:   zona [1]
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1   698 ZONA S… 02          3      78        40            1      1            2
## 2  6975 ZONA S… 06          4     220        75            1      2            3
## 3  7396 ZONA S… <NA>        3     115        58            1      2            2
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
## # A tibble: 3 × 13
## # Groups:   zona [1]
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1   698 ZONA S… 02          3      78        40            1      1            2
## 2  6975 ZONA S… 06          4     220        75            1      2            3
## 3  7396 ZONA S… <NA>        3     115        58            1      2            2
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

3.6.1.1 Análisis Exploratorio de Datos: Correlación entre Precio y Variables Clave

Vamos a replicar el análisis exploratorio de datos para la vivienda 2 (apartamentos en la zona sur), utilizando los gráficos interactivos de Plotly. Esto nos permitirá identificar las relaciones entre el precio del apartamento y las variables clave como área construida, estrato, número de baños, número de habitaciones, y número de parqueaderos.

3.6.1.2 Relación entre Área Construida y Precio

El gráfico muestra una correlación positiva entre el área construida y el precio de la vivienda en la zona sur. A medida que el área construida aumenta, el precio tiende a incrementarse, lo cual es un comportamiento esperado, ya que las propiedades con mayor área suelen ofrecer más espacios y comodidades, lo que justifica su mayor valor en el mercado. Sin embargo, también se observa cierta dispersión en las viviendas de gran tamaño, lo que sugiere que el precio no está exclusivamente determinado por el área construida, sino que otros factores, como la ubicación, los acabados o las características adicionales de la vivienda, también pueden tener un impacto significativo en su valor.

3.6.1.3 Relación entre Estrato, Número de Baños, Habitaciones y Parqueaderos con el Precio

Tanto el estrato como el número de baños, habitaciones y parqueaderos presentan una tendencia similar en relación con el precio de la vivienda. A mayor cantidad de estas características, el precio tiende a ser más elevado. En el caso del estrato, las viviendas en los niveles más altos (5 y 6) tienen precios considerablemente superiores, reflejando un acceso a mejores servicios y zonas más exclusivas. Para los baños, habitaciones y parqueaderos, se observa que a medida que aumenta su número, el precio tiende a incrementarse, pero con una mayor dispersión, lo que sugiere que, si bien estas características influyen en el precio, no son tan determinantes como el área construida. Las propiedades con más baños, habitaciones o parqueaderos son generalmente más costosas, pero la relación no es tan lineal ni fuerte como en el caso del área.

3.6.1.4 Modelo de Regresión Lineal Múltiple

En este análisis, estimamos un modelo de regresión lineal múltiple que relaciona el precio de las viviendas en la Zona Sur con variables como el área construida, estrato, número de habitaciones, parqueaderos y baños.

3.6.1.4.1 Resultados del Modelo

A continuación, presentamos el resumen del modelo y un análisis detallado de los coeficientes y su significancia estadística para la Zona Sur.

## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = vivienda_2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -950.08  -35.63   -3.65   36.36  956.44 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -258.36085   16.36033 -15.792   <2e-16 ***
## areaconst       1.12126    0.05953  18.835   <2e-16 ***
## estrato        49.97588    3.43639  14.543   <2e-16 ***
## habitaciones   -9.29833    4.34964  -2.138   0.0327 *  
## parqueaderos   80.52665    4.72647  17.037   <2e-16 ***
## banios         53.30423    4.00459  13.311   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 89.23 on 1682 degrees of freedom
## Multiple R-squared:  0.7431, Adjusted R-squared:  0.7424 
## F-statistic: 973.1 on 5 and 1682 DF,  p-value: < 2.2e-16

## [1] "El valor de R² del modelo para la Zona Sur es: 0.743"

El gráfico de Residuos vs Valores Ajustados para la Zona Sur muestra una distribución de los residuos alrededor de la línea de referencia en 0. La mayoría de los residuos parecen estar bien distribuidos, lo que sugiere que el modelo de regresión lineal múltiple captura de manera aceptable la relación entre las variables y el precio de las viviendas en esta zona.

Sin embargo, a medida que los valores ajustados aumentan, se observa una dispersión mayor de los residuos, similar al patrón identificado en la Zona Norte. Esto indica que, aunque el modelo explica bien los precios en general, existen factores adicionales que podrían estar afectando los precios más altos. Estos factores podrían incluir la calidad de los acabados, la ubicación precisa dentro de la Zona Sur o características únicas de las propiedades no capturadas en el modelo. Aunque el modelo presenta un buen ajuste general, es posible que la inclusión de más variables o la consideración de interacciones entre variables mejore su precisión.

3.6.1.5 Validación de los Supuestos del Modelo

En esta sección se valida el cumplimiento de los principales supuestos del modelo de regresión lineal múltiple para la Vivienda 2. Para esto, se presentan cuatro gráficos de diagnóstico: Residuos vs Valores Ajustados, Normal Q-Q, Scale-Location y Residuals vs Leverage.

Los gráficos de diagnóstico del modelo de regresión lineal para la vivienda en la Zona Sur muestran un comportamiento similar al de la primera vivienda. En el gráfico Residuals vs Fitted, los residuos se distribuyen en torno a la línea cero, aunque se observa cierta dispersión para los valores ajustados más altos, lo que sugiere una posible heterocedasticidad en estos casos. El gráfico Normal Q-Q revela que los residuos siguen la línea diagonal, aunque algunos valores extremos se desvían, lo que indica la presencia de outliers.

En el gráfico Scale-Location, se observa una ligera tendencia ascendente, lo que puede indicar que la varianza de los residuos no es completamente constante, pero el patrón no es lo suficientemente fuerte como para indicar un problema grave. Finalmente, en el gráfico Residuals vs Leverage, se identifican algunos puntos con alto leverage, que podrían influir en el modelo, aunque la distancia de Cook muestra que no tienen un impacto excesivo en el modelo.

Sugerencias

A modo de sugerencia, aunque el modelo cumple con los supuestos generales de la regresión, sería recomendable explorar transformaciones de las variables o la inclusión de variables adicionales para mejorar el ajuste y reducir la influencia de las observaciones atípicas en el modelo.

3.6.1.6 Predicción del Precio y Ofertas Potenciales (Zona Sur, Apartamentos)

A continuación, realizamos la predicción del precio de la vivienda para la segunda solicitud, y sugerimos potenciales ofertas dentro del rango de 850 millones de pesos.

Entrenamiento y Prueba del Modelo Para asegurar la reproducibilidad y validar el modelo, dividimos los datos en un conjunto de entrenamiento (70%) y uno de prueba (30%).

## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = entrenamiento)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -868.49  -34.97   -4.53   36.72  957.74 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -270.38150   20.10226 -13.450   <2e-16 ***
## areaconst       1.02543    0.06941  14.773   <2e-16 ***
## estrato        49.32225    4.29479  11.484   <2e-16 ***
## habitaciones   -6.53025    5.36752  -1.217    0.224    
## parqueaderos   89.22705    5.64293  15.812   <2e-16 ***
## banios         55.30992    4.81464  11.488   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 91.12 on 1175 degrees of freedom
## Multiple R-squared:  0.726,  Adjusted R-squared:  0.7248 
## F-statistic: 622.6 on 5 and 1175 DF,  p-value: < 2.2e-16
##           id         zona         piso      estrato      preciom    areaconst 
##            0            0          128            0            0            0 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##            0            0            0            0            0            0 
##      latitud 
##            0
## [1] "RMSE: 83.3797190971322"
## [1] "MAE: 53.2594034772093"
## [1] "R²: 0.754986834965834"
## [1] "Predicción para la segunda solicitud: 709.48"
3.6.1.6.1 Sugerencia de Ofertas Potenciales

A continuación, filtramos las viviendas cuyo precio predicho es menor o igual a 850 millones, y mostramos las 5 mejores ofertas con estrato entre 5 y 6.

3.6.2 Mapa de las Ofertas Potenciales (Zona norte, Casas)

A continuación, se presenta un mapa interactivo con las 5 mejores ofertas de vivienda sugeridas.

4 Resultados

4.1 Vivienda Zona Norte

4.1.1 Sugerencias

Mapa de las Ofertas Potenciales (Zona norte, Casas)

En respuesta a la primera solicitud de vivienda, que cuenta con un crédito pre-aprobado de 350 millones de pesos, se han identificado cinco ofertas potenciales que cumplen con este requisito financiero. Los precios predichos de estas propiedades varían entre 329 y 344 millones de pesos, lo que las hace accesibles dentro del presupuesto establecido.

Las propiedades se encuentran ubicadas en la zona norte de Cali, y tienen características que varían en términos de área construida, estrato, número de habitaciones, parqueaderos y baños. En cuanto al área construida, los inmuebles oscilan entre 90 m² y 162 m². En cuanto al estrato, todas las viviendas se encuentran entre estrato 4 y 5, lo cual garantiza un nivel adecuado de servicios y calidad de vida en la zona. Las ofertas cuentan con entre 1 y 2 parqueaderos, y entre 2 y 5 baños, lo que ofrece un rango de opciones dependiendo de las preferencias de los compradores.

Cada oferta ha sido geolocalizada en un mapa interactivo, lo cual facilita la visualización de su ubicación exacta dentro de la ciudad. Esto permitirá a los compradores tener una idea clara de la accesibilidad y la proximidad a puntos de interés dentro de la zona norte. Con base en los resultados obtenidos, estas propiedades representan opciones viables y atractivas que cumplen con las características solicitadas

4.2 Vivienda Zona Sur

4.2.1 Sugerencias

En respuesta a la segunda solicitud de vivienda, que cuenta con un crédito pre-aprobado de 850 millones de pesos, se han identificado cinco apartamentos potenciales que cumplen con este requisito financiero. Los precios predichos de estas propiedades varían entre 792 y 850 millones de pesos, lo que las hace accesibles dentro del presupuesto establecido.

Estas propiedades se encuentran ubicadas en la zona sur de Cali y presentan características que varían en términos de área construida, estrato, número de habitaciones, parqueaderos y baños. Las áreas construidas de los inmuebles oscilan entre 251 m² y 486 m². En cuanto al estrato, los apartamentos están clasificados entre estrato 5 y 6, lo cual garantiza un alto nivel de servicios y calidad de vida en la zona. Además, las propiedades cuentan con entre 3 y 4 parqueaderos, y entre 4 y 5 baños, lo que ofrece un rango de opciones que se ajustan a las preferencias y necesidades del comprador.

Cada oferta ha sido geolocalizada en un mapa interactivo, facilitando la visualización de su ubicación exacta dentro de la ciudad. Esto permite a los compradores evaluar no solo las características internas de cada apartamento, sino también la proximidad a puntos de interés clave en la zona sur. Con base en los resultados obtenidos, estas propiedades representan opciones viables y atractivas que se ajustan a las especificaciones solicitadas en la segunda solicitud.

5 Anexos

install.packages("devtools") # solo la primera
devtools::install_github("centromagis/paqueteMODELOS", force =TRUE)
library(paqueteMODELOS)
data("vivienda")

# Introduccion 
#Objetivos 
## Objetivos Generales
##Objetivos especificos 
#Metodos 
# Resultado 
##Limpiexa de datos 

######################################################### Limpieza de datos 

# Validar los tipos de datos
sapply(vivienda, class)

#convertir a mayusculas los valores 
char_columns <- sapply(vivienda, is.character)
vivienda[char_columns] <- lapply(vivienda[char_columns], toupper)

## Validación de datos null
colSums(is.na(vivienda))

#Eliminacioin tres registor null
vivienda <- vivienda[!is.na(vivienda$id),]
##Volvemos a validar que registros continuan nullos 
colSums(is.na(vivienda)) ##  identificamos que al eliminar los valores nullos de id unicamente quedamos con valores nullos en parquedaros y pisos que a pesar de ser variables numericas en este caso nos funcionaban como variables categoricas, ya que, nos permitia entender que caracteristicas buscaban los posibles compradores ahora es importante saber cual es el procentaje de valores nullos para tomar una desicion

# Calcular el porcentaje de valores nullos por columna
percentage_na_per_column <- colSums(is.na(vivienda)) / nrow(vivienda) * 100
# Mostrar el porcentaje de valores nulos por columna
percentage_na_per_column
## Se identifica que existe un total de 19.26% de datos nulos para parqueadero mientras que para piso tenemos un 31.67 es importante mencionar que en este caso no podemos realizar un ponderado con la media la mediana o la moda

# Reemplazar NA en la columna 'piso' con la media de 'piso' agrupada por 'zona'
vivienda <- vivienda %>%
  group_by(zona) %>%
  mutate(piso = ifelse(is.na(piso), mean(piso, na.rm = TRUE), piso))

# Reemplazar NA en la columna 'parqueaderos' con la media de 'parqueaderos' agrupada por 'zona'
vivienda <- vivienda %>%
  group_by(zona) %>%
  mutate(parqueaderos = ifelse(is.na(parqueaderos), mean(parqueaderos, na.rm = TRUE), parqueaderos))

# Eliminar filas duplicadas considerando todas las columnas excepto 'id'

total_filas <- nrow(vivienda)
duplicados <- sum(duplicated(vivienda[, -which(names(vivienda) == "id")]))
porcentaje_duplicados <- (duplicados / total_filas) * 100
duplicados
porcentaje_duplicados

vivienda_sin_duplicados <- vivienda[!duplicated(vivienda[, -which(names(vivienda) == "id")]), ]
# Mostrar el DataFrame sin duplicados
vivienda_sin_duplicados

setwd("C:/Users/anaso/OneDrive/Desktop")
######################################## Analisis exploratorio de los Datos
## precio y area constuida 
boxplot(vivienda_sin_duplicados$preciom, main="Boxplot de Precios", ylab="Precio")
boxplot(vivienda_sin_duplicados$areaconst, main="Boxplot de Área Construida", ylab="Área Construida")

install.packages("ggplot2")
install.packages("dplyr")
library(ggplot2)
library(dplyr)
# Banios
png(filename = "C:/ruta_a_donde_quieres_guardar/plot.png", width = 480, height = 480)
# Aquí tu código para generar la gráfica
dev.off()
ggplot(vivienda_sin_duplicados, aes(x=banios, fill=factor(banios))) +
  geom_bar() +
  theme_minimal() +
  labs(title="Distribución de Baños", x="Número de Baños", y="Frecuencia") +
  theme(axis.text.x = element_text(angle=45, hjust=1)) +
  scale_fill_brewer(palette="Set3")  # Usa una paleta de colores diferente

# Estrato
ggplot(vivienda_sin_duplicados, aes(x=estrato, fill=factor(estrato))) +
  geom_bar() +
  theme_minimal() +
  labs(title="Distribución de Estrato", x="Estrato", y="Frecuencia") +
  theme(axis.text.x = element_text(angle=45, hjust=1)) +
  scale_fill_brewer(palette="Set3")  # Usa una paleta de colores diferente

# Habitaciones
ggplot(vivienda_sin_duplicados, aes(x=habitaciones, fill=factor(habitaciones))) +
  geom_bar() +
  theme_minimal() +
  labs(title="Distribución de Habitaciones", x="Número de Habitaciones", y="Frecuencia") +
  theme(axis.text.x = element_text(angle=45, hjust=1)) +
  scale_fill_brewer(palette="Set3")  # Usa una paleta de colores diferente

# Parqueaderos
ggplot(vivienda_sin_duplicados, aes(x=parqueaderos, fill=factor(parqueaderos))) +
  geom_bar() +
  theme_minimal() +
  labs(title="Distribución de Parqueaderos", x="Número de Parqueaderos", y="Frecuencia") +
  theme(axis.text.x = element_text(angle=45, hjust=1)) +
  scale_fill_brewer(palette="Set3")  # Usa una paleta de colores diferente

# Piso
ggplot(vivienda_sin_duplicados, aes(x=piso, fill=factor(piso))) +
  geom_bar() +
  theme_minimal() +
  labs(title="Distribución de Pisos", x="Número de Pisos", y="Frecuencia") +
  theme(axis.text.x = element_text(angle=45, hjust=1)) +
  scale_fill_brewer(palette="Set3")  # Usa una paleta de colores diferente

# Tipo
ggplot(vivienda_sin_duplicados, aes(x=tipo, fill=factor(tipo))) +
  geom_bar() +
  theme_minimal() +
  labs(title="Distribución de Tipo de Vivienda", x="Tipo de Vivienda", y="Frecuencia") +
  theme(axis.text.x = element_text(angle=45, hjust=1)) +
  scale_fill_brewer(palette="Set3")  # Usa una paleta de colores diferente

# Zona
ggplot(vivienda_sin_duplicados, aes(x=zona, fill=factor(zona))) +
  geom_bar() +
  theme_minimal() +
  labs(title="Distribución por Zona", x="Zona", y="Frecuencia") +
  theme(axis.text.x = element_text(angle=45, hjust=1)) +
  scale_fill_brewer(palette="Set3")  # Usa una paleta de colores diferente



# Creación del mapa interactivo con leaflet
library(leaflet)

mapa <- leaflet(vivienda_sin_duplicados, options = leafletOptions(minZoom = 11, maxZoom = 40)) %>%
  addTiles() %>%
  addCircleMarkers(
    ~longitud, ~latitud,
    color = "#034A94",
    clusterOptions = markerClusterOptions(spiderfyDistanceMultiplier = 1.5)
  )

mapa

## 
# Filtrar Vivienda 1 (Casa)

vivienda_1 <- vivienda_sin_duplicados %>%
  filter(tipo == "CASA", 
         zona == "ZONA NORTE")

head(vivienda_1, 3)


mapa <- leaflet(vivienda_1, options = leafletOptions(minZoom = 11, maxZoom = 40)) %>%
  addTiles() %>%
  addCircleMarkers(
    ~longitud, ~latitud,
    color = "#034A94",
    clusterOptions = markerClusterOptions(spiderfyDistanceMultiplier = 1.5)
  )

mapa
 ##### solucion norte de cali 

# Coordenadas aproximadas para la Zona Norte de Cali
lat_norte_min <- 3.45
lat_norte_max <- 3.50
lon_norte_min <- -76.55
lon_norte_max <- -76.50

# Filtrar casas en la Zona Norte y dentro del rango de coordenadas
vivienda_1 <- vivienda_sin_duplicados %>%
  filter(tipo == "CASA", 
         zona == "ZONA NORTE",
         latitud >= lat_norte_min & latitud <= lat_norte_max & 
           longitud >= lon_norte_min & longitud <= lon_norte_max)

# Mostrar los primeros tres registros de las ofertas filtradas
head(vivienda_1, 3)

# Crear el mapa con las propiedades filtradas
mapa <- leaflet(vivienda_1, options = leafletOptions(minZoom = 11, maxZoom = 40)) %>%
  addTiles() %>%
  addCircleMarkers(
    ~longitud, ~latitud,
    color = "#034A94",
    clusterOptions = markerClusterOptions(spiderfyDistanceMultiplier = 1.5)
  )

# Mostrar el mapa
mapa

############### paso 2
library(plotly)

# Gráfico de dispersión: Precio vs Área Construida
plot_area <- plot_ly(vivienda_1, x = ~areaconst, y = ~preciom, type = 'scatter', mode = 'markers',
                     marker = list(size = 10, color = 'rgba(255, 182, 193, .9)', line = list(color = 'rgba(152, 0, 0, .8)', width = 2))) %>%
  layout(title = "Relación entre Área Construida y Precio",
         xaxis = list(title = "Área Construida (m²)"),
         yaxis = list(title = "Precio (millones de pesos)"))

# Mostrar el gráfico
plot_area

# Gráfico de dispersión: Precio vs Estrato
plot_estrato <- plot_ly(vivienda_1, x = ~estrato, y = ~preciom, type = 'scatter', mode = 'markers',
                        marker = list(size = 10, color = 'rgba(135, 206, 250, .9)', line = list(color = 'rgba(0, 0, 139, .8)', width = 2))) %>%
  layout(title = "Relación entre Estrato y Precio",
         xaxis = list(title = "Estrato"),
         yaxis = list(title = "Precio (millones de pesos)"))

# Mostrar el gráfico
plot_estrato

# Gráfico de dispersión: Precio vs Número de Baños
plot_banios <- plot_ly(vivienda_1, x = ~banios, y = ~preciom, type = 'scatter', mode = 'markers',
                       marker = list(size = 10, color = 'rgba(144, 238, 144, .9)', line = list(color = 'rgba(0, 100, 0, .8)', width = 2))) %>%
  layout(title = "Relación entre Número de Baños y Precio",
         xaxis = list(title = "Número de Baños"),
         yaxis = list(title = "Precio (millones de pesos)"))

# Mostrar el gráfico
plot_banios

# Gráfico de dispersión: Precio vs Número de Habitaciones
plot_habitaciones <- plot_ly(vivienda_1, x = ~habitaciones, y = ~preciom, type = 'scatter', mode = 'markers',
                             marker = list(size = 10, color = 'rgba(255, 165, 0, .9)', line = list(color = 'rgba(255, 69, 0, .8)', width = 2))) %>%
  layout(title = "Relación entre Número de Habitaciones y Precio",
         xaxis = list(title = "Número de Habitaciones"),
         yaxis = list(title = "Precio (millones de pesos)"))

# Mostrar el gráfico
plot_habitaciones

# Gráfico de dispersión: Precio vs Número de Parqueaderos
plot_parqueaderos <- plot_ly(vivienda_1, x = ~parqueaderos, y = ~preciom, type = 'scatter', mode = 'markers',
                             marker = list(size = 10, color = 'rgba(0, 191, 255, .9)', line = list(color = 'rgba(0, 0, 255, .8)', width = 2))) %>%
  layout(title = "Relación entre Número de Parqueaderos y Precio",
         xaxis = list(title = "Número de Parqueaderos"),
         yaxis = list(title = "Precio (millones de pesos)"))

# Mostrar el gráfico
plot_parqueaderos


##### paso 3 
# Crear el modelo de regresión lineal múltiple
modelo_completo <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = vivienda_1)

# Resumen del modelo para ver los resultados
summary(modelo_completo)

# Crear el gráfico de Residuos vs Valores Ajustados
plot(modelo_completo$fitted.values, resid(modelo_completo),
     main = "Gráfico de Residuos vs Valores Ajustados",
     xlab = "Valores Ajustados",
     ylab = "Residuos",
     pch = 19, col = "blue")

# Añadir una línea horizontal en 0 para referencia
abline(h = 0, col = "red", lwd = 2)



# Ampliar el tamaño de los márgenes y ajustar el espacio
par(mfrow = c(2, 2), mar = c(5, 5, 2, 2))

# 1. Residuals vs Fitted
plot(modelo_completo, which = 1)

# 2. Normal Q-Q
plot(modelo_completo, which = 2)

# 3. Scale-Location
plot(modelo_completo, which = 3)

# 4. Residuals vs Leverage
plot(modelo_completo, which = 5)

# Restaurar la configuración gráfica original
par(mfrow = c(1, 1))



#################################################################################
# Fijar la semilla para asegurar la reproducibilidad
set.seed(123)

# Dividir los datos en un 70% para entrenamiento y un 30% para prueba
indices <- sample(1:nrow(vivienda_1), size = 0.7 * nrow(vivienda_1))
entrenamiento <- vivienda_1[indices, ]
prueba <- vivienda_1[-indices, ]

# Entrenar el modelo de regresión lineal múltiple con el conjunto de entrenamiento
modelo_entrenamiento <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = entrenamiento)

# Mostrar el resumen del modelo entrenado
summary(modelo_entrenamiento)

# Verificar valores faltantes en el conjunto de prueba
colSums(is.na(prueba))

# Eliminar filas con valores faltantes en el conjunto de prueba
prueba <- na.omit(prueba)

# Volver a realizar las predicciones si hubo cambios en el conjunto de prueba
predicciones_prueba <- predict(modelo_entrenamiento, newdata = prueba)

# Calcular las métricas de rendimiento
rmse <- sqrt(mean((prueba$preciom - predicciones_prueba)^2))
mae <- mean(abs(prueba$preciom - predicciones_prueba))
r2 <- 1 - sum((prueba$preciom - predicciones_prueba)^2) / sum((prueba$preciom - mean(prueba$preciom))^2)

# Mostrar las métricas
print(paste("RMSE:", rmse))
print(paste("MAE:", mae))
print(paste("R²:", r2))

# Crear un data frame con las características de la primera solicitud
solicitud_1 <- data.frame(areaconst = 200, 
                          estrato = 4.5, 
                          habitaciones = 4, 
                          parqueaderos = 1, 
                          banios = 2)

# Utilizar el modelo para predecir el precio de la vivienda
prediccion_1 <- predict(modelo_entrenamiento, newdata = solicitud_1)

# Mostrar la predicción
print(paste("Predicción para la primera solicitud:", prediccion_1))

# Añadir la predicción de precios al conjunto de datos
vivienda_1$prediccion_precio <- predict(modelo_entrenamiento, newdata = vivienda_1)

# Filtrar viviendas con precio predicho menor o igual a 350 millones
ofertas_potenciales <- vivienda_1 %>%
  filter(prediccion_precio <= 350) %>%
  arrange(desc(prediccion_precio))  # Ordenar de mayor a menor según el precio predicho

# Seleccionar las 5 mejores ofertas
mejores_ofertas <- head(ofertas_potenciales, 5)

# Cargar la librería leaflet
library(leaflet)

# Verificar si 'longitud' y 'latitud' están en el data frame
if(!all(c("longitud", "latitud") %in% colnames(mejores_ofertas))) {
  stop("Faltan las columnas 'longitud' o 'latitud' en 'mejores_ofertas'")
}

# Crear un mapa para mostrar las ofertas potenciales
mapa_ofertas <- leaflet(mejores_ofertas) %>%
  addTiles() %>%
  addCircleMarkers(~longitud, ~latitud, color = "blue", 
                   popup = ~paste("Precio predicho:", round(prediccion_precio, 2), "millones de pesos",
                                  "<br>Área construida:", areaconst, "m²",
                                  "<br>Estrato:", estrato,
                                  "<br>Habitaciones:", habitaciones,
                                  "<br>Parqueaderos:", parqueaderos,
                                  "<br>Baños:", banios))

# Mostrar el mapa
mapa_ofertas


#################################################################################




##############################################################################################
# Filtrar Vivienda 2 (Apartamento)
sapply(vivienda_sin_duplicados, class)

# Coordenadas aproximadas para la Zona Sur de Cali
lat_sur_min <- 3.35
lat_sur_max <- 3.40
lon_sur_min <- -76.60
lon_sur_max <- -76.55

# Filtrar apartamentos en la Zona Sur y dentro del rango de coordenadas
vivienda_2 <- vivienda_sin_duplicados %>%
  filter(tipo == "APARTAMENTO", 
         zona == "ZONA SUR",
         latitud >= lat_sur_min & latitud <= lat_sur_max & 
           longitud >= lon_sur_min & longitud <= lon_sur_max)

# Mostrar los primeros tres registros de las ofertas filtradas
head(vivienda_2, 3)

# Crear el mapa con las propiedades filtradas
mapa <- leaflet(vivienda_2, options = leafletOptions(minZoom = 11, maxZoom = 40)) %>%
  addTiles() %>%
  addCircleMarkers(
    ~longitud, ~latitud,
    color = "#034A94",
    clusterOptions = markerClusterOptions(spiderfyDistanceMultiplier = 1.5)
  )

# Mostrar el mapa
mapa

############### Paso 2: Análisis Exploratorio con Gráficos de Dispersión
library(plotly)

# Gráfico de dispersión: Precio vs Área Construida
plot_area <- plot_ly(vivienda_2, x = ~areaconst, y = ~preciom, type = 'scatter', mode = 'markers',
                     marker = list(size = 10, color = 'rgba(255, 182, 193, .9)', line = list(color = 'rgba(152, 0, 0, .8)', width = 2))) %>%
  layout(title = "Relación entre Área Construida y Precio (Zona Sur)",
         xaxis = list(title = "Área Construida (m²)"),
         yaxis = list(title = "Precio (millones de pesos)"))

# Mostrar el gráfico
plot_area

# Gráfico de dispersión: Precio vs Estrato
plot_estrato <- plot_ly(vivienda_2, x = ~estrato, y = ~preciom, type = 'scatter', mode = 'markers',
                        marker = list(size = 10, color = 'rgba(135, 206, 250, .9)', line = list(color = 'rgba(0, 0, 139, .8)', width = 2))) %>%
  layout(title = "Relación entre Estrato y Precio (Zona Sur)",
         xaxis = list(title = "Estrato"),
         yaxis = list(title = "Precio (millones de pesos)"))

# Mostrar el gráfico
plot_estrato

# Gráfico de dispersión: Precio vs Número de Baños
plot_banios <- plot_ly(vivienda_2, x = ~banios, y = ~preciom, type = 'scatter', mode = 'markers',
                       marker = list(size = 10, color = 'rgba(144, 238, 144, .9)', line = list(color = 'rgba(0, 100, 0, .8)', width = 2))) %>%
  layout(title = "Relación entre Número de Baños y Precio (Zona Sur)",
         xaxis = list(title = "Número de Baños"),
         yaxis = list(title = "Precio (millones de pesos)"))

# Mostrar el gráfico
plot_banios

# Gráfico de dispersión: Precio vs Número de Habitaciones
plot_habitaciones <- plot_ly(vivienda_2, x = ~habitaciones, y = ~preciom, type = 'scatter', mode = 'markers',
                             marker = list(size = 10, color = 'rgba(255, 165, 0, .9)', line = list(color = 'rgba(255, 69, 0, .8)', width = 2))) %>%
  layout(title = "Relación entre Número de Habitaciones y Precio (Zona Sur)",
         xaxis = list(title = "Número de Habitaciones"),
         yaxis = list(title = "Precio (millones de pesos)"))

# Mostrar el gráfico
plot_habitaciones

# Gráfico de dispersión: Precio vs Número de Parqueaderos
plot_parqueaderos <- plot_ly(vivienda_2, x = ~parqueaderos, y = ~preciom, type = 'scatter', mode = 'markers',
                             marker = list(size = 10, color = 'rgba(0, 191, 255, .9)', line = list(color = 'rgba(0, 0, 255, .8)', width = 2))) %>%
  layout(title = "Relación entre Número de Parqueaderos y Precio (Zona Sur)",
         xaxis = list(title = "Número de Parqueaderos"),
         yaxis = list(title = "Precio (millones de pesos)"))

# Mostrar el gráfico
plot_parqueaderos

############### Paso 3: Estimar el Modelo de Regresión Lineal Múltiple

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

# Resumen del modelo para ver los resultados
summary(modelo_completo_2)

# Crear el gráfico de Residuos vs Valores Ajustados
plot(modelo_completo_2$fitted.values, resid(modelo_completo_2),
     main = "Gráfico de Residuos vs Valores Ajustados (Zona Sur)",
     xlab = "Valores Ajustados",
     ylab = "Residuos",
     pch = 19, col = "blue")

# Añadir una línea horizontal en 0 para referencia
abline(h = 0, col = "red", lwd = 2)

# Ampliar el tamaño de los márgenes y ajustar el espacio
par(mfrow = c(2, 2), mar = c(5, 5, 2, 2))

# 1. Residuals vs Fitted
plot(modelo_completo_2, which = 1)

# 2. Normal Q-Q
plot(modelo_completo_2, which = 2)

# 3. Scale-Location
plot(modelo_completo_2, which = 3)

# 4. Residuals vs Leverage
plot(modelo_completo_2, which = 5)

# Restaurar la configuración gráfica original
par(mfrow = c(1, 1))

############### Paso 4: Predicciones y Selección de Ofertas Potenciales

# Fijar la semilla para asegurar la reproducibilidad
set.seed(123)

# Dividir los datos en un 70% para entrenamiento y un 30% para prueba
indices_2 <- sample(1:nrow(vivienda_2), size = 0.7 * nrow(vivienda_2))
entrenamiento_2 <- vivienda_2[indices_2, ]
prueba_2 <- vivienda_2[-indices_2, ]

# Entrenar el modelo de regresión lineal múltiple con el conjunto de entrenamiento
modelo_entrenamiento_2 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = entrenamiento_2)

# Mostrar el resumen del modelo entrenado
summary(modelo_entrenamiento_2)

# Realizar las predicciones en el conjunto de prueba
predicciones_prueba_2 <- predict(modelo_entrenamiento_2, newdata = prueba_2)

# Calcular las métricas de rendimiento
rmse_2 <- sqrt(mean((prueba_2$preciom - predicciones_prueba_2)^2))
mae_2 <- mean(abs(prueba_2$preciom - predicciones_prueba_2))
r2_2 <- 1 - sum((prueba_2$preciom - predicciones_prueba_2)^2) / sum((prueba_2$preciom - mean(prueba_2$preciom))^2)

# Mostrar las métricas
print(paste("RMSE:", rmse_2))
print(paste("MAE:", mae_2))
print(paste("R²:", r2_2))

# Crear un data frame con las características de la segunda solicitud
solicitud_2 <- data.frame(areaconst = 300, 
                          estrato = 5.5, 
                          habitaciones = 5, 
                          parqueaderos = 3, 
                          banios = 3)

# Utilizar el modelo para predecir el precio del apartamento
prediccion_2 <- predict(modelo_entrenamiento_2, newdata = solicitud_2)

# Mostrar la predicción
print(paste("Predicción para la segunda solicitud:", prediccion_2))

# Añadir la predicción de precios al conjunto de datos
vivienda_2$prediccion_precio <- predict(modelo_entrenamiento_2, newdata = vivienda_2)

# Filtrar apartamentos con precio predicho menor o igual a 850 millones
ofertas_potenciales_2 <- vivienda_2 %>%
  filter(prediccion_precio <= 850) %>%
  arrange(desc(prediccion_precio))  # Ordenar de mayor a menor según el precio predicho

# Seleccionar las 5 mejores ofertas
mejores_ofertas_2 <- head(ofertas_potenciales_2, 5)

# Crear un mapa para mostrar las ofertas potenciales
mapa_ofertas_2 <- leaflet(mejores_ofertas_2) %>%
  addTiles() %>%
  addCircleMarkers(~longitud, ~latitud, color = "blue", 
                   popup = ~paste("Precio predicho:", round(prediccion_precio, 2), "millones de pesos",
                                  "<br>Área construida:", areaconst, "m²",
                                  "<br>Estrato:", estrato,
                                  "<br>Habitaciones:", habitaciones,
                                  "<br>Parqueaderos:", parqueaderos,
                                  "<br>Baños:", banios))

# Mostrar el mapa
mapa_ofertas_2


##############################################################################################