Análisis de Oportunidades de Inversión Inmobiliaria en Cali, Colombia

Autor/a

Dónoban Rojas

Fecha de publicación

03 de septiembre de 2024

1 Informe Ejecutivo

1.1 Resumen Ejecutivo

El presente informe ha sido elaborado a solicitud de C&A (Casas y Apartamentos), una destacada agencia inmobiliaria en Cali, Colombia. Este documento ofrece un análisis exhaustivo del mercado inmobiliario en Cali, con un enfoque particular en las zonas norte y sur de la ciudad. El análisis se basa en diversos modelos de regresión lineal múltiple y otras técnicas avanzadas, desarrollados utilizando datos del mercado local y enriquecidos con un profundo conocimiento del sector y las tendencias económicas regionales.

El objetivo principal de este informe es proporcionar recomendaciones detalladas y fundamentadas para satisfacer las necesidades de vivienda de dos empleados de una compañía internacional cliente de C&A. Se busca garantizar una inversión óptima y una experiencia de vida satisfactoria en Cali.

Para una comprensión más detallada y para resolver cualquier duda técnica, se recomienda consultar los anexos del informe. Estos anexos incluyen todas las estimaciones, comparaciones y validaciones realizadas con los diferentes modelos, proporcionando un respaldo completo de los análisis y hallazgos presentados en este documento.

1.2 Contexto del Mercado Inmobiliario de Cali

Cali, la tercera ciudad más grande de Colombia, está experimentando una fase de transformación en su mercado inmobiliario:

  • Desaceleración Temporal: El sector ha mostrado una disminución en las ventas durante el año en curso, influenciado por tensiones políticas y sociales recientes.
  • Perspectivas de Recuperación: Se anticipa una reactivación del sector una vez que los efectos de estas tensiones disminuyan.
  • Financiación Disponible: Las instituciones bancarias están ofreciendo préstamos significativos para proyectos de construcción comercial y residencial, lo que podría impulsar el desarrollo inmobiliario a mediano plazo.

1.3 Análisis Detallado: Solicitud 1

1.3.1 Especificaciones Requeridas

  • Tipo de Propiedad: Casa
  • Ubicación: Zona Norte
  • Área Construida: 200 m²
  • Estrato Socioeconómico: 4 o 5
  • Habitaciones: 4
  • Baños: 2
  • Parqueaderos: 1
  • Presupuesto Máximo: 350 millones de pesos colombianos

1.3.2 Análisis del Modelo Predictivo

El modelo de regresión lineal múltiple desarrollado, con un R² de 0.6781, muestra una capacidad moderada para explicar la variabilidad en los precios de las propiedades, basándose en las características clave. Aunque ofrece estimaciones útiles, es importante considerar que su nivel de confiabilidad puede no ser adecuado para decisiones donde se necesite alta precisión. Las predicciones de precios y los factores de influencia identificados son los siguientes:

  • Predicciones de Precio:

    • Para propiedades en Estrato 4: El precio estimado es de 337.44 millones de pesos, con un intervalo de confianza del 95% que va desde 304.11 millones hasta 370.76 millones de pesos.
    • Para propiedades en Estrato 5: El precio estimado es de 371.1 millones de pesos, con un intervalo de confianza del 95% que se sitúa entre 340.82 millones y 401.39 millones de pesos.

    Nota: El intervalo de confianza (IC) del 95% indica el rango dentro del cual se espera que se encuentre el valor verdadero del precio con una probabilidad del 95%. Es decir, si se repitiera el estudio múltiples veces, aproximadamente el 95% de esos intervalos de confianza incluirían el precio real.

  • Factores de Influencia en el Precio:

    Los siguientes son los factores más relevantes que influyen en el precio de la vivienda, identificados a partir del modelo de regresión lineal multiple:

    • Área Construida: Por cada metro cuadrado adicional, el valor de la propiedad aumenta en aproximadamente 768,550 pesos, lo que refleja la importancia del tamaño en la determinación del precio.
    • Estrato Socioeconómico: El estrato tiene un impacto significativo en el precio. En comparación con propiedades en el estrato 3, aquellas en el estrato 4 son, en promedio, 83.51 millones de pesos más costosas, mientras que en el estrato 6 el incremento es de 331.07 millones.
    • Número de Parqueaderos: Cada parqueadero adicional eleva el precio de la propiedad aproximadamente en 26.54 millones de pesos, subrayando la relevancia del espacio para vehículos en la valoración.
    • Número de Baños: El precio aumenta aproximadamente en 14.92 millones de pesos por cada baño adicional, indicando que esta característica también es un factor importante para los compradores.
  • Validación del Modelo:

    • División de Datos: 70% para entrenamiento, 30% para validación y prueba.

    • Métricas de Desempeño:

      • R² en datos de prueba: 0.6795
      • Error Cuadrático Medio (MSE): 24,906.44 millones de pesos
      • Error Absoluto Medio (MAE): 96.78 millones de pesos

      Las métricas del modelo indican un rendimiento moderado. El R² de 0.6795 sugiere que el modelo explica aproximadamente el 67.95% de la variabilidad en los precios, pero no captura toda la complejidad del mercado inmobiliario. El MSE de 24,906.44 millones de pesos y el MAE de 96.78 millones de pesos reflejan errores que son significativos en el contexto de los precios inmobiliarios. Esto sugiere que el modelo podría beneficiarse de ajustes adicionales o la consideración de técnicas más avanzadas para mejorar la precisión de las predicciones.

      Es importante destacar que el R² de esta sección corresponde a la etapa de validación, donde el modelo fue entrenado con el 70% de los registros y probado con el 30% restante. Cabe mencionar que este valor es muy cercano al R² obtenido en la etapa del modelo predictivo, lo que refuerza la consistencia del modelo.

1.3.3 Análisis de Mercado y Disponibilidad

A continuación, se presenta un análisis de la disponibilidad de viviendas en el mercado inmobiliario de Cali, enfocándose en casas ubicadas en la zona norte que cumplen con las especificaciones requeridas en la solicitud 1. Los hallazgos clave son los siguientes:

  • Distribución de Oferta:
    • Estrato 4: 120 propiedades en la base de datos
    • Estrato 5: 227 propiedades en la base de datos
  • Ajuste a Especificaciones:
    • Estrato 4: Oferta limitada que cumple todos los criterios.
    • Estrato 5: Mayor disponibilidad, con algunas opciones que superan las especificaciones requeridas.
  • Análisis de Precios:
    • Estrato 4: Generalmente dentro del presupuesto establecido (350 Millones de COP).
    • Estrato 5: En el límite superior del presupuesto (350 Millones de COP), con algunas opciones ligeramente por encima.
  • Ubicaciones Destacadas:

  • Se identificaron 7 propiedades que mejor se ajustan a los criterios establecidos, destacando las de ID 4210, 1342 y 1144 por obtener los puntajes más altos en cuanto a su adecuación a las necesidades del cliente. La siguiente tabla muestra las características de estas casas en la zona norte.

1.3.4 Recomendaciones Estratégicas para Solicitud 1

Basado en el análisis previo, se recomienda lo siguiente:

  • Priorizar Propiedades en Estrato 5:
    • Ofrecen características superiores a lo solicitado.
    • Mayor variedad de opciones disponibles.
    • Potencial de apreciación a largo plazo.
  • Explorar Opciones Selectas en Estrato 4:
    • Investigar a fondo las propiedades que cumplen con todos los criterios.
    • Podrían ofrecer una excelente relación calidad-precio.
  • Estrategia de Negociación:
    • Aprovechar la desaceleración actual del mercado para negociar precios.
    • Enfocarse en propiedades que han estado en el mercado por períodos más largos.
  • Evaluación Integral de Propiedades:
    • Realizar inspecciones detalladas de las 7 ofertas principales identificadas.
    • Considerar factores adicionales como proximidad a servicios, calidad de construcción y potencial de valorización.
  • Análisis de Costo-Beneficio a Largo Plazo:
    • Evaluar el potencial de apreciación de cada propiedad.
    • Considerar costos adicionales como impuestos, mantenimiento y posibles renovaciones.

1.4 Análisis Detallado: Solicitud 2

1.4.1 Especificaciones Requeridas

  • Tipo de Propiedad: Apartamento
  • Ubicación: Zona Sur
  • Área Construida: 300 m²
  • Estrato Socioeconómico: 5 o 6
  • Habitaciones: 5
  • Baños: 3
  • Parqueaderos: 3
  • Presupuesto Máximo: 850 millones de pesos colombianos

1.4.2 Análisis del Modelo Predictivo

El modelo de regresión lineal múltiple para la zona sur, con un R² de 0.7923, proporciona estimaciones confiables de precios basadas en características clave de las propiedades. Similar al modelo de la solicitud anterior, aunque este ofrece estimaciones útiles, es importante considerar que su nivel de confiabilidad puede no ser adecuado para decisiones que requieran alta precisión. Las predicciones de precios y los factores de influencia identificados son los siguientes:

  • Predicciones de Precio:

    • Para propiedades en Estrato 5: El precio estimado es de 682.13 millones de pesos, con un intervalo de confianza del 95% que va desde 656.86 millones hasta 707.41 millones de pesos.
    • Para propiedades en Estrato 6: El precio estimado es de 810.47 millones de pesos, con un intervalo de confianza del 95% que se sitúa entre 785.27 millones y 835.66 millones de pesos.
  • Factores de Influencia en el Precio:

    Los siguientes son los factores más relevantes que influyen en el precio de la vivienda, identificados a partir del modelo de regresión lineal multiple:

    • Área Construida: Cada metro cuadrado adicional incrementa el valor de la propiedad en aproximadamente 1.3 millones de pesos, lo que destaca la importancia del tamaño en la valoración del inmueble.
    • Estrato Socioeconómico: El estrato 6 tiene un impacto notable en el precio, aumentando en promedio 160.02 millones de pesos en comparación con estratos inferiores.
    • Número de Parqueaderos: Por cada parqueadero adicional, el precio de la propiedad aumenta aproximadamente en 72.37 millones de pesos, subrayando la importancia del espacio de estacionamiento en la determinación del valor.
    • Número de Baños: Cada baño adicional eleva el precio de la propiedad aproximadamente en 48.72 millones de pesos, indicando que esta característica es altamente valorada por los compradores.
  • Validación del Modelo:

    • División de Datos: 70% para entrenamiento, 30% para validación y prueba.
    • Métricas de Desempeño:
      • R² en datos de prueba: 0.8077
      • Error Cuadrático Medio (MSE): 7889.124 millones de pesos
      • Error Absoluto Medio (MAE): 55.8322 millones de pesos
      Las métricas del modelo indican un rendimiento moderado. El R² de 0.8077 sugiere que el modelo explica una parte significativa de la variabilidad en los datos de prueba, pero no captura toda la complejidad del mercado inmobiliario. El MSE de 7,889.12 millones de pesos y el MAE de 55.83 millones de pesos reflejan errores que, aunque no insignificantes, son relativamente grandes en el contexto de los precios inmobiliarios. Esto sugiere que el modelo podría beneficiarse de ajustes adicionales o la consideración de técnicas más avanzadas para mejorar la precisión de las predicciones.

1.4.3 Análisis de Mercado y Disponibilidad

A continuación, se presenta un análisis de la disponibilidad de viviendas en el mercado inmobiliario de Cali, enfocándose en apartamentos ubicados en la zona sur que se ajusten a las especificaciones requeridas en la solicitud 2. Los hallazgos clave son los siguientes:

  • Distribución de Oferta:
    • Estrato 5: 786 propiedades en la base de datos
    • Estrato 6: 419 propiedades en la base de datos
  • Ajuste a Especificaciones:
    • No se encontraron ofertas que cumplieran estrictamente con todos los criterios.
    • Se identificaron 7 ofertas potenciales con características cercanas a las requeridas.
  • Análisis de Precios:
    • Las ofertas seleccionadas están dentro del presupuesto máximo de 850 millones.
    • Las propiedades en Estrato 6 se acercan más al límite superior del presupuesto.
  • Ubicaciones Destacadas:

  • Las 7 ofertas potenciales se concentran principalmente en la parte norte y central de la zona sur de Cali. A continuación, se presenta una tabla que muestra las características de estos apartamentos en la zona sur, ordenados según su grado de ajuste a la solicitud.

1.4.4 Recomendaciones Estratégicas para Solicitud 2

Basado en el análisis previo, se recomienda lo siguiente:

  • Recomendar Casas en Lugar de Apartamentos:
    • Dado los altos requerimientos de la solicitud y la escasez de apartamentos que los cumplan completamente, se aconseja al cliente considerar casas en lugar de apartamentos, ya que estas propiedades tienen mayor probabilidad de satisfacer los criterios exigidos.
  • Considerar Propiedades Ligeramente por Debajo de los Requisitos:
    • Debido a la falta de ofertas que cumplan estrictamente con todos los criterios, explorar opciones con áreas construidas entre 250-300 m².
  • Priorizar Ubicación y Calidad sobre Tamaño:
    • Enfocarse en propiedades en zonas premium de la parte norte y central del sur de Cali.
    • Evaluar la calidad de construcción y amenidades ofrecidas.
  • Negociar Mejoras o Adecuaciones:
    • Para propiedades que no cumplen con todos los requisitos, negociar la posibilidad de realizar mejoras o ampliaciones.
  • Considerar el Potencial de Apreciación:
    • Evaluar el potencial de valorización de las propiedades, especialmente en áreas de desarrollo.
  • Evaluar el Costo-Beneficio entre Estratos 5 y 6:
    • Comparar las ventajas específicas de las propiedades en Estrato 6 frente a las de Estrato 5, considerando el presupuesto disponible.
  • Realizar Visitas y Evaluaciones Detalladas:
    • Programar visitas a las 7 ofertas potenciales identificadas.
    • Realizar evaluaciones exhaustivas de la estructura, acabados y entorno de cada propiedad.

1.5 Conclusión

El análisis realizado muestra que el mercado inmobiliario en las zonas norte y sur de Cali ofrece oportunidades atractivas que se ajustan a los requerimientos especificados en ambas solicitudes. Aunque el mercado muestra signos de desaceleración, esto presenta una ventana de oportunidad para negociaciones favorables y potencial de apreciación futura.

Para la Solicitud 1 (casa en zona norte), Se recomienda enfocarse en propiedades de estrato 5, manteniendo cierta flexibilidad en el presupuesto para maximizar la calidad y el potencial de inversión.

Para la Solicitud 2 (apartamento en zona sur), se sugiere considerar propiedades que, aunque no cumplan estrictamente con todos los criterios, ofrezcan una excelente ubicación y calidad, con potencial para adaptaciones o mejoras.

Las opciones seleccionadas para ambas solicitudes no solo cumplirán con las necesidades inmediatas de vivienda de los empleados de la compañía internacional, sino que también representarán una inversión sólida a largo plazo en un mercado con perspectivas de recuperación.

2 Anexo: Memoria de Cálculo

2.1 Introducción

Este estudio se ha elaborado a solicitud de C&A (Casas y Apartamentos), una agencia inmobiliaria establecida en Cali, Colombia. El objetivo principal es proporcionar un análisis detallado y recomendaciones estratégicas en respuesta a una solicitud de asesoría inmobiliaria de un cliente corporativo internacional.

2.1.1 Antecedentes

C&A, fundada por María Casas, una profesional con una década de experiencia en el sector inmobiliario, se ha posicionado como un actor relevante en el mercado de bienes raíces de Cali. La empresa ha experimentado un crecimiento sostenido desde su fundación, contando actualmente con un equipo de ocho agentes inmobiliarios altamente calificados.

2.1.2 Contexto del Mercado

El sector inmobiliario de Cali atraviesa actualmente un período de contracción en las ventas. No obstante, se observan indicadores que sugieren una potencial reactivación:

  1. Incremento en la concesión de créditos por parte de instituciones financieras para proyectos industriales y de construcción, tanto comercial como residencial.
  2. Expectativas de estabilización en el entorno político y social, lo cual podría catalizar la recuperación del sector.

2.1.3 Descripción del Proyecto

C&A ha recibido una solicitud de asesoría para la adquisición de dos propiedades en Cali, destinadas a albergar a ejecutivos de una compañía internacional y sus familias. Las especificaciones de las propiedades requeridas son las siguientes:

  1. Propiedad A:
    • Tipología: Casa
    • Área construida: 200 m²
    • Características: 1 parqueadero, 2 baños, 4 habitaciones
    • Ubicación: Zona Norte
    • Estrato socioeconómico: 4 o 5
    • Presupuesto máximo: 350 millones de pesos
  2. Propiedad B:
    • Tipología: Apartamento
    • Área construida: 300 m²
    • Características: 3 parqueaderos, 3 baños, 5 habitaciones
    • Ubicación: Zona Sur
    • Estrato socioeconómico: 5 o 6
    • Presupuesto máximo: 850 millones de pesos

2.1.4 Objetivos del Estudio

  1. Analizar exhaustivamente el mercado inmobiliario de Cali, con énfasis en las zonas y tipologías de interés.
  2. Desarrollar modelos estadísticos predictivos para la valoración de propiedades.
  3. Identificar y recomendar opciones de propiedades que se ajusten óptimamente a los requerimientos especificados.
  4. Proporcionar un soporte analítico robusto para la toma de decisiones estratégicas de C&A y su cliente.

2.1.5 Metodología

Este análisis se fundamenta en una combinación de técnicas avanzadas de modelación estadística y análisis geoespacial para evaluar el mercado inmobiliario en Cali, con un enfoque en las zonas norte y sur. A continuación, se detallan las fases clave del proceso analítico:

  1. Procesamiento y Limpieza de Datos: Se realizó una limpieza exhaustiva de la base de datos, lo que incluyó la corrección de inconsistencias y la creación de una nueva columna de “zona” debido a errores detectados en los datos originales. Este paso fue crucial para garantizar la precisión y confiabilidad del análisis posterior.

  2. Filtrado de Datos: Se depuró la base de datos para enfocarse en ofertas de casas ubicadas en la zona norte de la ciudad. Los primeros tres registros filtrados fueron revisados, acompañados de tablas y mapas que validan la consulta. Se discutieron los puntos que no se ubicaban en la zona esperada, analizando posibles razones para estas discrepancias.

  3. Análisis Exploratorio de Datos (EDA): Se llevó a cabo un análisis exploratorio enfocado en la relación entre el precio de las casas y variables como área construida, estrato, número de baños, habitaciones y la zona de ubicación. Se utilizaron gráficos interactivos con Plotly para facilitar la interpretación de los resultados.

  4. Modelado Predictivo: Se estimó un modelo de regresión lineal múltiple utilizando las variables seleccionadas en el EDA. Se interpretaron los coeficientes, evaluando su significancia estadística y contextualizando los resultados en el mercado inmobiliario local. Además, se analizó el coeficiente R² y se discutió la calidad del ajuste del modelo, sugiriendo posibles mejoras.

  5. Validación de Supuestos del Modelo: Se validaron los supuestos del modelo de regresión, proporcionando interpretaciones de los resultados y sugiriendo posibles correcciones en caso de problemas detectados, aunque no se implementaron dichas correcciones.

  6. Predicción de Precios y Recomendación de Ofertas: Con el modelo validado, se realizaron predicciones del precio de la vivienda para las características de la primera solicitud de la empresa. Basado en las predicciones y el crédito pre-aprobado de 350 millones de pesos, se sugirieron al menos cinco ofertas potenciales, representadas en un mapa y discutidas en detalle.

  7. Partición de Datos y Validación de Modelo: Los datos fueron divididos aleatoriamente en un conjunto de entrenamiento (70%) y uno de prueba (30%). El modelo fue reestimado con la muestra de entrenamiento, y se realizaron predicciones en el conjunto de prueba. Se calcularon y analizaron las métricas de error cuadrático medio (MSE), error absoluto medio (MAE) y R² para evaluar el desempeño del modelo.

  8. Análisis para la Segunda Solicitud: Se replicaron los pasos del 2 al 7 para una segunda solicitud, enfocada en Apartamentos en la zona Sur de Cali, ajustando el análisis a este nuevo contexto.

Cada fase del análisis se complementa con visualizaciones interactivas y mapas detallados para una interpretación clara de los resultados.

2.2 Preparación de datos

En esta sección, se aborda el proceso fundamental de preparación de datos para el análisis estadístico de viviendas en la ciudad de Cali. Comenzando con la importación del conjunto de datos, se detalla el proceso de exploración, limpieza y estandarización de los datos. Se abordan aspectos como la identificación y manejo de valores faltantes, la eliminación de registros duplicados, la verificación de datos espaciales y la estandarización de variables clave. Además, se describe el proceso de imputación de datos para variables con valores faltantes, asegurando así la integridad y coherencia del conjunto de datos antes de proceder con el análisis detallado. Este capítulo sienta las bases sólidas para los análisis subsiguientes, garantizando la fiabilidad y calidad de los resultados obtenidos.

2.2.1 Importación de datos

Los datos utilizados en este informe corresponden con el conjunto de datos denominado vivienda. Este dataset fue importado y se estableció como la base principal para llevar a cabo el análisis del mercado inmobiliario.

Mostrar/Ocultar Código
vivienda

La base de datos consta de 13 variables y un total de 8,322 filas registradas. A continuación, se presenta una definición detallada de cada una de las 13 variables en el conjunto de datos, con el fin de facilitar una comprensión clara de su representación.

  1. id: Identificador único asignado a cada registro.

  2. zona: Zona de la ciudad de Cali en la que se ubica el inmueble.

  3. piso: Número del piso en el que se encuentra el apartamento o número de pisos que tiene una casa.

  4. estrato: Estrato socioeconómico del inmueble.

  5. preciom: Precio del inmueble expresado en millones de pesos colombianos.

  6. areaconst: Área construida del inmueble en metros cuadrados.

  7. parqueaderos: Número de parqueaderos disponibles.

  8. banios: Número de baños en el inmueble.

  9. habitaciones: Número de habitaciones en el inmueble.

  10. tipo: Tipo de vivienda.

  11. barrio: Barrio en el que se encuentra la vivienda.

  12. longitud: Coordenada geográfica de longitud.

  13. latitud: Coordenada geográfica de latitud.

2.2.2 Ordenamiento y Limpieza de Datos

El proceso de ordenamiento y limpieza de datos es fundamental para garantizar la integridad y confiabilidad de cualquier análisis posterior. En esta sección, se abordan diferentes aspectos, desde la identificación de datos faltantes hasta la corrección de registros duplicados y la estandarización de variables clave. Además, se examinan datos espaciales para verificar su coherencia y se lleva a cabo la imputación de valores para garantizar la completitud del conjunto de datos. A continuación, se detallan los pasos realizados en cada etapa, destacando la importancia de cada proceso en la preparación de los datos para un análisis riguroso.

Datos Faltantes

Debido a la variabilidad en la integridad de los datos, es importante destacar que no todos los registros contienen valores para cada variable. Por esta razón, se presenta a continuación una tabla resumida que muestra los valores faltantes en cada columna (variable) del dataframe vivienda. Cada entrada de esta tabla proporciona el nombre de la columna y la cantidad de valores faltantes correspondientes.

Mostrar/Ocultar Código
# tabla de datos faltantes
faltantes <- colSums(is.na(vivienda)) %>%
                 as.data.frame() 
faltantes # tabla de datos faltantes

De acuerdo con esta tabla, se observa que las variables piso y parqueaderos presentan una cantidad significativa de datos faltantes, con 2,638 y 1,605 valores ausentes, respectivamente. Además, se evidencia que las demás variables presentan al menos dos registros sin información correspondiente.

Para obtener una mejor visión de los datos faltantes, se ha generado un gráfico que muestra la distribución de valores ausentes en el conjunto de datos vivienda. En este gráfico, la parte izquierda ilustra la proporción de datos faltantes para cada variable, mientras que en la parte derecha se observan las filas inferiores, representadas en azul, que indican registros completos sin datos faltantes. Las filas resaltadas con cuadrados rojos señalan las combinaciones de variables con datos faltantes. Este enfoque proporciona una representación visual clara de la presencia de datos faltantes en el conjunto de datos.

Mostrar/Ocultar Código
VIM::aggr(vivienda, cex.axis = 0.5, cex.lab= 0.8)  # graficos de datos faltantes

Estas gráficas revelan que la proporción de datos faltantes en las variables piso y parqueaderos es significativa y no pueden ser ignorados sin más. Es imperativo realizar una imputación de datos para estas variables a fin de evitar pérdida de información y asegurar la integridad del análisis.

Eliminación de registros vacios y duplicados

En primera instancia, se eliminaron aquellos registros que carecían de información en al menos dos variables, lo que resultó en la eliminación de 3 registros, quedando un total de 8319 filas (registros).

Mostrar/Ocultar Código
# Eliminar registros que no tengan por lo menos 2 variables con algun valor
dvf_sin_filas_vacias <- vivienda[rowSums(!is.na(vivienda)) >= 2, , drop = FALSE]
dim(dvf_sin_filas_vacias)
[1] 8319   13

Posteriormente, se identificaron y examinaron posibles registros duplicados. Tras esta evaluación, no se encontraron registros duplicados.

Mostrar/Ocultar Código
# Identificar y visualizar filas duplicadas
duplicados_filas <- dvf_sin_filas_vacias[duplicated(dvf_sin_filas_vacias) | duplicated(dvf_sin_filas_vacias, fromLast = TRUE), ]
duplicados_filas

Para concluir la verificación de duplicados, se aseguró de que la variable id tuviera un valor único para cada uno de los registros.

Mostrar/Ocultar Código
any(duplicated(dvf_sin_duplicados$id))
[1] FALSE

El resultado FALSE indica que todos los valores de id son únicos, confirmando así la ausencia de registros duplicados. Con esta fase completada, la base de datos está lista para continuar con los siguientes procesos de verificación e imputación de datos.

Verificación de datos espaciales

Antes de proceder con el filtrado de datos y la exploración inicial, es fundamental analizar la distribución espacial de los inmuebles en Cali, clasificados por tipo y zona. Estas características son esenciales para establecer los criterios de filtrado y llevar a cabo un análisis riguroso. Por lo tanto, se generaron dos mapas: uno que ilustra la distribución de los inmuebles por tipo (apartamento o casa) y otro que representa las diferentes zonas geográficas de la ciudad.

Mostrar/Ocultar Código
# Combina las coordenadas en un objeto sf
dvf_sf <- st_as_sf(dvf_sin_duplicados, coords = c("longitud", "latitud"), crs = 4326)

# Crea mapa Distribución por tipo con ggplot2
ggplot() +
  geom_sf(data = cali, fill = "white", color = "black") + 
  geom_sf(data = dvf_sf, aes(color = tipo)) +
  ggtitle("Distribución Espacial por tipo") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  labs(x = "Longitud", y = "Latitud") 

Mostrar/Ocultar Código
# Crea mapa Distribución Espacial con ggplot2
ggplot() +
  geom_sf(data = cali, fill = "white", color = "black") + 
  geom_sf(data = dvf_sf, aes(color = zona)) +
  ggtitle("Distribución Espacial por Zona") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  labs(x = "Longitud", y = "Latitud") 

No se detectan inconvenientes en la distribución espacial por tipo de inmueble; sin embargo, el mapa de distribución por zona revela la presencia de puntos ubicados fuera de su zona correspondiente. Esta anomalía ya había sido documentada en informes previos, como en el “Evaluación Estratégica del Mercado de Propiedades Urbanas en Cali” (https://rpubs.com/donoban/evaluacion-estrategica-cali-inmobiliaria), que utiliza la misma base de datos como referencia.

Para adecuar este estudio, se decidió crear una nueva columna de zona ajustada, denominada zona_geo. Con este propósito, se realizó la búsqueda de un shapefile oficial de la Alcaldía de Cali con la distribución de las zonas geográficas. Sin embargo, no se encontró tal archivo. En su lugar, se halló un PDF con las zonas geográficas actualizadas (https://www.cali.gov.co/planeacion/publicaciones/169423/zonas_geograficas_idesc/), que además muestra las comunas que conforman dichas zonas. Con base en esta información y en el mapa base de la Ciudad de Cali, que incluye un shapefile con información de barrios y comunas (https://data.amerigeoss.org/dataset/capa-de-barrios-y-sectores-geograficos-de-santiago-de-cali), se procedió a crear en QGIS el shapefile de las zonas geográficas, siguiendo el proceso detallado a continuación:

  1. A partir del mapa de barrios y comunas de Cali, se realizó un “disolve” en QGIS utilizando las comunas.

  2. Se creó la columna zona_geo, asignando las comunas a las diferentes zonas geográficas según la siguiente distribución:

  • Norte: 2, 4, 5, 6
  • Occidente: 1, 18, 19, 20
  • Oriente: 7, 13, 14, 15, 16, 21
  • Sur: 17, 22
  • Centro: 3, 8, 9, 10, 11, 12
  1. Finalmente, se realizó un nuevo “disolve” basado en la columna zona_geo, obteniendo así el shapefile corregido de las zonas geográficas, como se ve a continuación.
Mostrar/Ocultar Código
mapazonas <- ggplot() +
  # Agregar el shape de Cali y colorear según la columna zona_geo
  geom_sf(data = zonas_geo, aes(fill = zona_geo), color = "darkgrey") +
  scale_fill_viridis_d(option = "plasma") +  
  # Títulos y tema
  labs(title = "Zonas Geográficas Cali",
       x = "Longitud", y = "Latitud") +
  theme_minimal() +  # Aplicar un tema minimalista
  labs(fill = "Zona Geográfica") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # 

print(mapazonas)

Con este shapefile, es posible generar una nueva columna en nuestra base de datos al cruzar el shape con las coordenadas de cada punto, lo que resultó en una tabla como la que se presenta a continuación.

Mostrar/Ocultar Código
# Convierte dataframe a un objeto sf
vivienda_sf <- st_as_sf(dvf_sin_duplicados, coords = c("longitud", "latitud"), crs = st_crs(4326))

# Verifica si ambos objetos tienen el mismo CRS
if (st_crs(vivienda_sf) != st_crs(zonas_geo)) {
  # Reproyecta 'vivienda_sf' para que coincida con el CRS de 'zonas_geo'
  vivienda_sf <- st_transform(vivienda_sf, st_crs(zonas_geo))
}

# Realiza una unión espacial para asignar la zona a cada registro
vivienda_zonas <- st_join(vivienda_sf, zonas_geo, left = TRUE)

# Extrae la columna zona_geo y agrégala al DataFrame
dvf_sin_duplicados$zona_geo <- vivienda_zonas$zona_geo

# Revisa el resultado
head(dvf_sin_duplicados)

Ahora se vuelve a generar el mapa de distribución espacial por zona para corroborar la ubicación de los puntos.

Mostrar/Ocultar Código
# Combina las coordenadas en un objeto sf
dvf_sf <- st_as_sf(dvf_sin_duplicados, coords = c("longitud", "latitud"), crs = 4326)

# Crea mapa Distribución Espacial con ggplot2
ggplot() +
  geom_sf(data = cali, fill = "white", color = "black") + 
  geom_sf(data = dvf_sf, aes(color = zona_geo)) +
  ggtitle("Distribución Espacial por Zona") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  labs(x = "Longitud", y = "Latitud") 

Como resultado se observa que los puntos ahora coinciden con las zonas correspondientes, por lo que podemos proceder con el análisis.

Estandarización de datos

Posteriormente, durante la revisión de los datos, se observa que existen inmuebles cuyas características no concuerdan con el tipo de inmueble reportado, como el registro con el ID 886. Este registro indica que es una casa con 10 pisos y un área construida de apenas 60 metros cuadrados, lo cual parece ser un error de ingreso de datos. Para abordar estas inconsistencias, se aplica una regla de corrección: un inmueble catalogado como “casa” no puede tener más de 5 pisos y debe tener un área construida mínima de 25 metros cuadrados por piso. En consecuencia, los registros que no cumplan la condición se reasignaran como “apartamento”.

Mostrar/Ocultar Código
# Convertir 'piso' a numérico
df2$piso <- as.numeric(df2$piso)

# Verificar las condiciones y actualizar la variable "tipo"
df2$tipo[df2$tipo == "Casa" & df2$piso >= 5 & df2$areaconst < (25 * df2$piso)] <- "Apartamento"

Inconsistencias en las variables banios y habitaciones

Se consideró que cualquier tipo de inmueble debe tener al menos una habitación y un baño. Sin embargo, se detectó que existen registros en estas variables que reportan un valor igual a cero, lo cual es incoherente ya que un inmueble habitable como mínimo debe poseer un baño y una habitación.

Mostrar/Ocultar Código
num_zerosb <- sum(df2$banios == 0, na.rm = TRUE)
num_zerosh <- sum(df2$habitaciones == 0, na.rm = TRUE)

cat(num_zerosb, num_zerosh)
45 66

Se detectaron 45 registros con valor cero en la variable banios y 66 en la variable habitaciones Dado que estas ocurrencias representan una pequeña proporción con respecto al total de 8319 registros, se optó por un reemplazo directo, sustituyendo estos ceros (0) por el valor uno (1).

Mostrar/Ocultar Código
# Imputación de valores en la variable habitaciones
df2$habitaciones[df2$habitaciones == 0] <- 1

# Imputación de valores en la variable baños
df2$banios[df2$banios == 0] <- 1

Imputación de datos

Al analizar los datos faltantes, se observa que las variables piso y parqueaderos tienen una alta proporción de valores ausentes. Eliminar estos registros podría causar una pérdida significativa de información, lo que afectaría la calidad y utilidad del análisis. Para abordar este problema de manera eficaz, se ha optado por imputar los valores faltantes en estas dos variables utilizando la técnica de KNN (K-Nearest Neighbors) del paquete VIM. Esta técnica es particularmente adecuada debido a la proximidad geográfica definida por las coordenadas de longitud y latitud.

El método de KNN se basa en la premisa de que las viviendas cercanas tienden a compartir características similares debido a factores como la arquitectura de las zonas y la homogeneidad de las construcciones en áreas específicas. Es razonable asumir que propiedades ubicadas en la misma vecindad tienen características comparables, como el número de pisos o parqueaderos, influenciadas por el diseño y las regulaciones locales. Al utilizar KNN, se aprovecha esta proximidad para estimar los valores faltantes basándose en las características de propiedades vecinas, lo que mejora la precisión y coherencia de la imputación.

Mostrar/Ocultar Código
# Convertir el DataFrame en un objeto sf
df2_sf <- st_as_sf(df2, coords = c("longitud", "latitud"), crs = 4326)  # 4326 es el CRS WGS84

# Agregar las columnas de longitud y latitud de nuevo al objeto sf
df2_sf$longitud <- df2$longitud
df2_sf$latitud <- df2$latitud

# Imputar valores faltantes usando KNN
df2_imputed <- kNN(df2_sf, 
                   variable = c("piso", "parqueaderos"), 
                   k = 5,  # Número de vecinos más cercanos
                   dist_var = c("longitud", "latitud"))

# Convertir de nuevo a un DataFrame normal
df2_imputed <- as.data.frame(df2_imputed)

# Redondear y convertir a entero las variables imputadas
df2_imputed$piso <- as.integer(round(df2_imputed$piso))
df2_imputed$parqueaderos <- as.integer(round(df2_imputed$parqueaderos))

Se verifica que no haya registros nulos en nuestra base de datos.

Mostrar/Ocultar Código
faltantes <- colSums(is.na(df2_imputed)) %>%
                 as.data.frame() # se revisa si quedaron datos sin imputar

faltantes

Se ha verificado que no existen registros nulos en la base de datos. Como paso final en el procesamiento de los datos, eliminaremos las columnas geometry, piso_imp, parqueaderos_imp, y la columna original zona, que ha sido reemplazada por zona_geo. Estas columnas ya no son necesarias y serán removidas del DataFrame para centrarnos únicamente en las variables de interés, que son las siguientes:

Mostrar/Ocultar Código
# Eliminar las columnas no necesarias
df_final <- df2_imputed %>%
  select(-geometry, -piso_imp, -parqueaderos_imp, -zona)

# Verificar las columnas restantes
names(df_final)
 [1] "id"           "piso"         "estrato"      "preciom"      "areaconst"   
 [6] "parqueaderos" "banios"       "habitaciones" "tipo"         "barrio"      
[11] "zona_geo"     "longitud"     "latitud"     
Mostrar/Ocultar Código
# Guardar df_final como archivo RDS
saveRDS(df_final, file = "df_final.rds")

2.3 Análisis de la Solicitud 1: Casa en Zona Norte

2.3.1 Filtrado de Datos y Exploración Inicial

Se realizó un filtrado de la base de datos utilizando las columnas tipo y zona_geo, seleccionando únicamente los registros correspondientes a Casa en la zona Norte. A continuación, se presentan los primeros 3 registros resultantes de esta filtración.

Mostrar/Ocultar Código
# 1. Filtrar la base de datos
base1 <- df_final %>%
  filter(tipo == "Casa", zona_geo == "Norte")

# Mostrar los primeros 3 registros
kable(head(base1, 3))
id piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio zona_geo longitud latitud
1209 2 5 320 150 2 4 6 Casa acopi Norte -76.51341 3.47968
1592 2 5 780 380 2 3 3 Casa acopi Norte -76.51674 3.48721
504 2 3 180 120 1 3 3 Casa acopi Norte -76.49768 3.47060

Se ha confirmado que los primeros registros corresponden a los criterios de filtrado. A continuación, se procederá a verificar la efectividad del filtro aplicado. Primero, se revisará el número total de registros. Luego, se validará el filtro revisando los valores únicos en las columnas tipo y zona_geo.

Mostrar/Ocultar Código
#Número de registros en el datafram
nrow(base1)
[1] 578
Mostrar/Ocultar Código
# Para ver cuáles son los valores únicos en cada columna "zona_geo" y "tipo"
columnas_de_interes <- c("zona_geo","tipo")
valores_unicos_seleccionados <- sapply(base1[columnas_de_interes], unique)
print(valores_unicos_seleccionados)
zona_geo     tipo 
 "Norte"   "Casa" 

De lo anterior, se concluye que se han filtrado correctamente los 578 registros de la base de datos. A continuación, se procederá a crear un mapa con los puntos correspondientes a estos registros, superpuestos sobre el mapa de barrios de Cali. Este mapa mostrará los precios y la distribución de las viviendas.

Mostrar/Ocultar Código
# Convertir las coordenadas de base1 a un objeto sf
base1_sf <- st_as_sf(base1, coords = c("longitud", "latitud"), crs = 4326)

# Crear el mapa
mapa <- ggplot() +
  # Agregar el shape de Cali como fondo
  geom_sf(data = cali, fill = "lightgrey", color = "darkgrey") +
  # Agregar los puntos de las casas
  geom_sf(data = base1_sf, aes(color = preciom), size = 2, alpha = 0.7) +
  # Escala de color para el precio
  scale_color_gradient(low = "blue", high = "red", name = "Precio (Millones de COP)") +
  # Títulos y tema
  labs(title = "Ubicación de Casas en Zona Norte de Cali",
       x = "Longitud", y = "Latitud") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Mostrar el mapa
print(mapa)

Los puntos se han ubicado correctamente en su respectiva zona gracias al procesamiento previo que definió la columna de zonas geográficas (zona_geo). Con la base de datos debidamente definida y los puntos situados en las ubicaciones esperadas, podemos proceder con el análisis. Además, al generar el mapa, se observa que en la zona Norte, los precios parecen aumentar hacia el oeste y disminuir hacia el este.

2.3.2 Análisis Exploratorio de Datos

En este capítulo, se realiza un análisis exploratorio de datos enfocado en la correlación entre el precio de las casas y variables clave como el área construida, el estrato socioeconómico, el número de baños, el número de habitaciones y el número de parqueaderos. Se emplean gráficos interactivos generados con el paquete plotly para visualizar estas relaciones de manera detallada y dinámica. Además, se utiliza la función summary para obtener y analizar las estadísticas descriptivas principales de cada variable.

Mostrar/Ocultar Código
kable(summary(base1))
id piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio zona_geo longitud latitud
Min. : 83.0 Min. : 1.000 Min. :3.00 Min. : 100.0 Min. : 30.0 Min. : 1.000 Min. : 1.000 Min. : 1.000 Length:578 Length:578 Length:578 Min. :-76.54 Min. :3.451
1st Qu.: 595.2 1st Qu.: 2.000 1st Qu.:3.00 1st Qu.: 250.0 1st Qu.: 135.5 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 3.000 Class :character Class :character Class :character 1st Qu.:-76.52 1st Qu.:3.467
Median :1334.5 Median : 2.000 Median :4.00 Median : 380.0 Median : 235.0 Median : 2.000 Median : 3.000 Median : 4.000 Mode :character Mode :character Mode :character Median :-76.52 Median :3.475
Mean :1995.2 Mean : 2.324 Mean :4.19 Mean : 433.2 Mean : 259.5 Mean : 1.922 Mean : 3.533 Mean : 4.609 NA NA NA Mean :-76.51 Mean :3.475
3rd Qu.:3206.8 3rd Qu.: 3.000 3rd Qu.:5.00 3rd Qu.: 547.5 3rd Qu.: 336.0 3rd Qu.: 2.000 3rd Qu.: 4.000 3rd Qu.: 5.000 NA NA NA 3rd Qu.:-76.50 3rd Qu.:3.484
Max. :5944.0 Max. :10.000 Max. :6.00 Max. :1800.0 Max. :1500.0 Max. :10.000 Max. :10.000 Max. :10.000 NA NA NA Max. :-76.48 Max. :3.496
Mostrar/Ocultar Código
# Contar la frecuencia de cada categoría en la columna 'estrato'
categoria_frecuencia <- table(base1$estrato)

# Captura la salida de la tabla de frecuencias
output <- capture.output(print(categoria_frecuencia))

# Combina la etiqueta con la salida capturada en una sola cadena
cat("Frecuencia de cada estrato:\n", paste(output, collapse = "\n"))
Frecuencia de cada estrato:
 
  3   4   5   6 
193 120 227  38 

El análisis descriptivo del conjunto de datos inmobiliarios revela que la mayoría de las propiedades tienen entre 1 y 2 pisos y están ubicadas en el estrato socioeconómico 5, que es el más frecuente. Los precios varían de 100 a 1800 millones de pesos, con una mediana de 380 millones y una media ligeramente superior, indicando una concentración en precios más bajos con algunos valores atípicos más altos. El área construida tiene una mediana de 235 m² y una media de 259.5 m². La mayoría de las propiedades cuentan con entre 1 y 2 parqueaderos, entre 2 y 4 baños, y el número de habitaciones varía de 1 a 10, con una mediana de 4, lo que sugiere una predominancia de propiedades de tamaño medio.

Mostrar/Ocultar Código
# Correlación entre precio y área construida
plot_area <- plot_ly(base1, x = ~areaconst, y = ~preciom, type = "scatter", mode = "markers",
                     text = ~paste("ID:", id, "<br>Precio:", preciom, "millones"),
                     hoverinfo = "text",
                     name = "Registros") %>% 
  add_lines(y = ~fitted(lm(preciom ~ areaconst, data = base1)), 
            line = list(color = 'red', width = 2), 
            name = "Línea de tendencia") %>%
  layout(title = "Precio vs Área Construida",
         xaxis = list(title = "Área Construida (m²)"),
         yaxis = list(title = "Precio (Millones de COP)"))

plot_area

Esta gráfica de dispersión ilustra la relación entre el precio de las propiedades y su área construida. La línea de tendencia roja muestra una fuerte correlación positiva entre estas variables. A medida que aumenta el área construida, se observa un incremento general en el precio de la propiedad. La densidad de puntos es mayor en áreas construidas menores a 500 m², sugiriendo que estas son las propiedades más comunes en el mercado. Se aprecia una dispersión creciente en los precios a medida que aumenta el área construida, lo que indica que otros factores, además del tamaño, influyen significativamente en el precio de las propiedades más grandes. Algunos puntos se alejan notablemente de la línea de tendencia, especialmente en áreas construidas mayores, lo que podría representar propiedades de lujo o con características únicas que justifican precios sustancialmente más altos o más bajos que la tendencia general.

Mostrar/Ocultar Código
# Precio por Estrato
plot_estrato <- plot_ly(base1, x = ~as.factor(estrato), y = ~preciom, type = "box",
                        text = ~paste("Zona:", zona_geo),
                        hoverinfo = "y+text") %>%
  layout(title = "Distribución de Precios por Estrato",
         xaxis = list(title = "Estrato"),
         yaxis = list(title = "Precio (Millones de COP)"))

plot_estrato

Este diagrama de caja y bigotes muestra la distribución de precios de propiedades en función del estrato socioeconómico. Se observa una clara tendencia ascendente en los precios a medida que aumenta el estrato, lo cual es consistente con la estratificación socioeconómica. El estrato 3 presenta la menor mediana de precios y la menor dispersión, mientras que el estrato 6 muestra la mayor mediana y la mayor variabilidad en precios. Es notable la presencia de valores atípicos en todos los estratos, particularmente en los estratos 4 y 5, lo que sugiere la existencia de propiedades de lujo o con características excepcionales en estos niveles. La superposición de los rangos intercuartílicos entre estratos adyacentes indica que, si bien hay una tendencia general al aumento de precios con el estrato, existe una considerable variabilidad que probablemente se deba a otros factores como ubicación específica, características de la propiedad o condiciones del mercado local.

Mostrar/Ocultar Código
# Precio vs Número de Habitaciones
plot_habitaciones <- plot_ly(base1, x = ~habitaciones, y = ~preciom, type = "scatter", mode = "markers",
                             text = ~paste("ID:", id, "<br>Precio:", preciom, "millones"),
                             hoverinfo = "text") %>%
  layout(title = "Precio vs Número de Habitaciones",
         xaxis = list(title = "Número de Habitaciones"),
         yaxis = list(title = "Precio (Millones de COP)"))

plot_habitaciones

Esta gráfica de dispersión muestra la relación entre el precio de las propiedades (en millones) y el número de habitaciones. Se observa una tendencia general ascendente, lo que sugiere una correlación positiva entre estas variables. A medida que aumenta el número de habitaciones, tiende a incrementarse el precio de la propiedad. Sin embargo, la dispersión de los puntos indica una variabilidad considerable en los precios para cada número de habitaciones. Es notable que la mayoría de las propiedades se concentran entre 2 y 6 habitaciones, con precios que varían ampliamente en este rango. Las propiedades con más de 8 habitaciones son menos frecuentes y tienden a tener precios más elevados, aunque con una dispersión significativa. Esta relación no lineal sugiere que otros factores, además del número de habitaciones, influyen en la determinación del precio.

Mostrar/Ocultar Código
# Precio vs Número de Baños
plot_banios <- plot_ly(base1, x = ~banios, y = ~preciom, type = "scatter", mode = "markers",
                       text = ~paste("ID:", id, "<br>Precio:", preciom, "millones"),
                       hoverinfo = "text") %>%
  layout(title = "Precio vs Número de Baños",
         xaxis = list(title = "Número de Baños"),
         yaxis = list(title = "Precio (Millones de COP)"))

plot_banios

El gráfico ilustra la relación entre el precio de las propiedades y el número de baños. Similar a la gráfica anterior, se aprecia una tendencia positiva general. Las propiedades con más baños tienden a tener precios más altos, aunque la dispersión es considerable. La mayoría de las propiedades se concentran entre 1 y 4 baños, con una amplia gama de precios en este rango. Es interesante notar que las propiedades con 5 o más baños son menos comunes pero generalmente comandan precios más elevados. La dispersión de los puntos sugiere que, si bien existe una correlación positiva, otros factores también influyen significativamente en el precio. Además, la densidad de puntos disminuye notablemente para propiedades con más de 6 baños, lo que podría indicar que estas son propiedades de lujo o atípicas en el mercado.

Mostrar/Ocultar Código
# Nuevo gráfico para número de parqueaderos
plot_parqueaderos <- plot_ly(base1, x = ~parqueaderos, y = ~preciom, type = "scatter", mode = "markers",
                             text = ~paste("ID:", id, "<br>Precio:", preciom, "millones"),
                             hoverinfo = "text") %>%
  layout(title = "Precio vs Número de Parqueaderos",
         xaxis = list(title = "Número de Parqueaderos"),
         yaxis = list(title = "Precio (Millones de COP)"))

plot_parqueaderos

El análisis de la relación entre el precio de las propiedades y el número de parqueaderos muestra una tendencia positiva, aunque menos pronunciada que en los casos de habitaciones y baños. La distribución de los datos revela que la mayoría de las propiedades en el mercado ofrecen entre 1 y 4 parqueaderos. Es importante notar que el eje x comienza en 1, indicando que todas las propiedades en este conjunto de datos tienen al menos un parqueadero. La dispersión de precios es considerable en todas las categorías, lo que sugiere que otros factores, más allá del número de parqueaderos, tienen una influencia significativa en la determinación del precio. Se observan algunos valores atípicos con precios elevados, particularmente en propiedades con 2 a 4 parqueaderos, lo que podría indicar que estas propiedades poseen características adicionales de alto valor que no están capturadas únicamente por esta variable.

Mostrar/Ocultar Código
# Calcular la matriz de correlación usando Spearman
variables_numericas <- base1 %>% 
  select(preciom, areaconst, banios, habitaciones, parqueaderos) %>%
  cor(use = "complete.obs", method = "spearman")

# Crear el gráfico de calor para la matriz de correlación
plot_correlacion <- plot_ly(
  x = colnames(variables_numericas), 
  y = rownames(variables_numericas), 
  z = variables_numericas, 
  type = "heatmap",
  colorscale = "Viridis",
  text = matrix(sprintf("%.2f", variables_numericas), nrow = nrow(variables_numericas)),
  texttemplate = "%{text}",
  textfont = list(color = "white", size = 12)
) %>%
  layout(title = "Matriz de Correlación (Spearman)",
         xaxis = list(title = ""),
         yaxis = list(title = ""))
plot_correlacion

Esta matriz de correlación ofrece una visión completa de las relaciones entre diversas variables relacionadas con las propiedades. Los colores más cálidos (amarillo) indican correlaciones más fuertes, mientras que los colores más fríos (azul oscuro) representan correlaciones más débiles. Se observa que el precio (‘preciom’) tiene la correlación más fuerte con el área construida (‘areaconst’) (0.85), lo que sugiere que el tamaño de la propiedad es el factor más influyente en el precio. El número de baños también muestra una correlación moderada con el precio (0.64), mientras que el número de habitaciones y parqueaderos presentan correlaciones más débiles (0.45 y 0.54, respectivamente). Es interesante notar la fuerte correlación entre el número de baños y el área construida (0.62), lo que sugiere que las propiedades más grandes tienden a tener más baños. Esta matriz proporciona una valiosa perspectiva sobre cómo las diferentes características de las propiedades se interrelacionan y afectan su valoración en el mercado.

El análisis de los gráficos revela que el mercado inmobiliario examinado presenta una estructura de precios compleja y multifacética. La distribución de precios en función del estrato socioeconómico muestra una tendencia claramente ascendente, con incrementos significativos en la mediana y la dispersión de precios a medida que se avanza a estratos superiores. Esto subraya la influencia crucial de la ubicación y el contexto socioeconómico en la valoración de las propiedades. La relación entre el precio y el área construida exhibe una fuerte correlación positiva, indicando que el tamaño de la propiedad es un factor determinante en su valor de mercado. La matriz de correlación evidencia interacciones complejas entre las variables, destacando que el área construida y el estrato socioeconómico tienen las correlaciones más significativas con el precio, seguidos por el número de baños y parqueaderos. Estas observaciones sugieren que, aunque el tamaño y la ubicación son factores primordiales, características adicionales como el número de habitaciones, baños y parqueaderos también influyen considerablemente en la determinación del precio, aunque en diferentes grados.

2.3.3 Modelo de Regresión Lineal Múltiple

En esta sección se presentarán los resultados del modelo de regresión lineal múltiple desarrollado para predecir los precios de casas en la zona norte de Cali. Se examinarán las principales métricas de desempeño del modelo, incluyendo el R², que indica el porcentaje de variabilidad en los precios que el modelo puede explicar. También se discutirá la significancia estadística de las variables predictoras como el área construida, el estrato, el número de habitaciones, parqueaderos y baños, y se evaluará cómo estas variables influyen en el precio de las viviendas. Además, se explorarán posibles áreas de mejora para el modelo.

Mostrar/Ocultar Código
base1$estrato <- factor(base1$estrato) # Asegurarse de que estrato es tratado como factor

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

# Resumen del modelo
resumen <- summary(modelo)

# Imprimir el resumen
print(resumen)

Call:
lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
    banios, data = base1)

Residuals:
    Min      1Q  Median      3Q     Max 
-877.90  -64.62  -17.83   36.41 1085.96 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)   36.41128   20.05607   1.815    0.070 .  
areaconst      0.76855    0.04821  15.942  < 2e-16 ***
estrato4      83.51483   18.99512   4.397 1.31e-05 ***
estrato5     117.17730   17.77338   6.593 9.85e-11 ***
estrato6     331.07629   31.91066  10.375  < 2e-16 ***
habitaciones   1.85458    4.96795   0.373    0.709    
parqueaderos  26.54133    5.36131   4.951 9.76e-07 ***
banios        14.92106    6.59431   2.263    0.024 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 152.1 on 570 degrees of freedom
Multiple R-squared:  0.6781,    Adjusted R-squared:  0.6742 
F-statistic: 171.6 on 7 and 570 DF,  p-value: < 2.2e-16

El modelo de regresión lineal múltiple para predecir el precio de las viviendas en Cali muestra resultados interesantes y, en su mayoría, lógicos. El modelo incluye cinco variables predictoras: área construida, estrato, número de habitaciones, número de parqueaderos y número de baños. Con un R² de 0.6781, el modelo explica aproximadamente el 67.81% de la variabilidad en el precio de las viviendas, lo que indica un ajuste moderadamente bueno, aunque sugiere que existen otros factores no capturados que también influyen en el precio.

Para determinar la significancia estadística de las variables, nos basamos principalmente en los valores p (Pr(>|t|)) y los estadísticos t. Cuanto menor sea el valor p y mayor el valor absoluto del estadístico t, más significativa es la variable. Basándonos en estos criterios, podemos ordenar las variables de más a menos significativa: área construida, estrato, número de parqueaderos, número de baños y, por último, número de habitaciones, que no resulta estadísticamente significativa.

La variable más significativa es el área construida, con un coeficiente de 0.76855 y un valor p extremadamente bajo (< 2e-16). Esto significa que, en promedio, por cada metro cuadrado adicional de construcción, el precio de la vivienda aumenta en 0.76855 millones de pesos, manteniendo las demás variables constantes. Este resultado es lógico y esperado, ya que el tamaño de la vivienda es tradicionalmente un factor crucial en la determinación de su precio.

El estrato socioeconómico también muestra un impacto altamente significativo, con coeficientes que van desde 83.51483 millones de pesos para estrato 4, hasta 331.07629 millones de pesos para estrato 6, todos con valores p muy bajos (p < 2e-16 para estrato 6). Esto implica que, al aumentar un nivel de estrato, el precio de la vivienda se incrementa considerablemente, todo lo demás constante. Cabe destacar que en el modelo de regresión, estrato3 se ha utilizado como la categoría de referencia. Esto significa que los coeficientes de estrato4, estrato5 y estrato6 representan el incremento en el precio en comparación con estrato3. Es decir, el coeficiente de estrato4 refleja el efecto adicional de estar en estrato4 en comparación con estrato3, y así sucesivamente para las demás categorías.

El número de parqueaderos tiene un coeficiente significativo de 26.54133 (valor p = 9.76e-07), indicando que cada parqueadero adicional aumenta el precio de la vivienda en 26.54133 millones de pesos, manteniendo las demás variables constantes. Este resultado refleja el alto valor que se le da al espacio de estacionamiento en Cali, posiblemente debido a la creciente congestión vehicular y la escasez de espacios de parqueo en algunas zonas.

El número de baños también resulta significativo, con un coeficiente de 14.92106 (valor p = 0.024). Esto sugiere que cada baño adicional incrementa el precio de la vivienda en 14.92106 millones de pesos, todo lo demás igual. Este hallazgo es lógico, ya que los baños adicionales suelen ser considerados como un lujo y un indicador de comodidad en una vivienda.

Sorprendentemente, el número de habitaciones no muestra un efecto estadísticamente significativo en el precio (valor p = 0.709). Esto podría deberse a una posible multicolinealidad con otras variables, como el área construida, o podría indicar que en el mercado inmobiliario de Cali, otros factores tienen más peso en la determinación del precio.

Por otro lado, el intercepto del modelo, de 36.41128 millones de pesos, representa el precio estimado de una vivienda cuando todas las demás variables son cero. Aunque el valor del intercepto no es estadísticamente significativo (valor p = 0.070), ofrece una referencia base para el precio en ausencia de otras características.

También se calcularon los intervalos de confianza para los coeficientes del modelo, que se presentan a continuación.

Mostrar/Ocultar Código
# Intervalos de confianza para los coeficientes
intervalos <- confint(modelo)
print(intervalos)
                   2.5 %      97.5 %
(Intercept)   -2.9815351  75.8040938
areaconst      0.6738629   0.8632403
estrato4      46.2058560 120.8238034
estrato5      82.2679881 152.0866032
estrato6     268.3994595 393.7531191
habitaciones  -7.9031460  11.6123137
parqueaderos  16.0109955  37.0716597
banios         1.9689578  27.8731640

De los intervalos de confianza podemos observar que tanto el área construida como el estrato socioeconómico son los predictores más significativos, con intervalos de confianza estrechos que no incluyen el cero, lo que indica un impacto positivo y estadísticamente significativo en el precio. Los coeficientes asociados a los parqueaderos y baños también muestran una influencia positiva y significativa, aunque sus intervalos de confianza más amplios sugieren una menor precisión en las estimaciones. En contraste, el número de habitaciones no presenta un efecto significativo, ya que su intervalo de confianza incluye el cero.

2.3.4 Validación de Supuestos

En la validación de los supuestos de un modelo de regresión lineal múltiple, es crucial verificar que las condiciones necesarias para la validez de las inferencias estadísticas se cumplan. Esto incluye la normalidad de los residuos, la homocedasticidad, la ausencia de multicolinealidad y la independencia de los errores. Si alguno de estos supuestos es violado, las estimaciones del modelo pueden volverse sesgadas o ineficientes, comprometiendo la confiabilidad de los resultados. En esta sección, se examinan estos supuestos a través de diversas gráficas diagnóstico, pruebas estadísticas y se discuten las implicaciones de los resultados obtenidos, junto con posibles estrategias para mejorar el ajuste y la validez del modelo.

Mostrar/Ocultar Código
# Gráficos de diagnóstico
par(mfrow = c(2,2))
plot(modelo)

El análisis de los gráficos de diagnóstico del modelo de regresión lineal revela aspectos importantes sobre la calidad y las suposiciones del modelo:

  1. Residuales vs. Valores Ajustados: Este gráfico muestra una tendencia no lineal y un patrón de embudo, con la variabilidad de los residuos aumentando a medida que aumentan los valores ajustados. Esto sugiere la presencia de heterocedasticidad y posiblemente una relación no lineal entre algunas variables predictoras y la variable respuesta. La línea roja, que debería ser aproximadamente horizontal, muestra una curvatura, indicando que el modelo podría estar mal especificado o que se requieren transformaciones en algunas variables.

  2. Q-Q de Residuales: El gráfico Q-Q muestra desviaciones de la normalidad en ambos extremos de la distribución, especialmente en los valores más altos. Esto indica que los residuos no siguen una distribución perfectamente normal, lo que podría afectar la validez de las inferencias estadísticas basadas en el modelo.

  3. Scale-Location: Este gráfico también muestra un patrón de embudo, con una tendencia ascendente en la línea roja. Esto refuerza la evidencia de heterocedasticidad, sugiriendo que la varianza de los residuos no es constante a lo largo del rango de valores predichos.

  4. Residuales vs. Leverage: Se observan algunos puntos con alto leverage y residuos estandarizados grandes, aunque no parecen haber observaciones que excedan claramente los límites de la distancia de Cook (líneas punteadas). Sin embargo, hay puntos que podrían considerarse influyentes y que merecen una investigación más detallada, como el 494.

En conclusión, los gráficos de diagnóstico revelan que el modelo de regresión lineal actual no cumple con algunas de las suposiciones fundamentales, en especial las relacionadas con la homocedasticidad y la linealidad. Por lo tanto, es necesario proceder con una validación exhaustiva de estos supuestos, mediante algunos test.

Mostrar/Ocultar Código
# Test de normalidad de residuos (Shapiro-Wilk)
shapiro.test(residuals(modelo))

    Shapiro-Wilk normality test

data:  residuals(modelo)
W = 0.81695, p-value < 2.2e-16

El test de normalidad de residuos (Shapiro-Wilk), muestra un valor p extremadamente bajo (< 2.2e-16) lo cual indica que los residuos no siguen una distribución normal. Esto confirma lo observado en el gráfico Q-Q. Para mejorar el modelo, se podría transformar la variable dependiente (por ejemplo, usando una transformación logarítmica o Box-Cox) o explorar modelos más robustos que no asuman normalidad, como los modelos lineales generalizados (GLM).

Mostrar/Ocultar Código
# Test de homocedasticidad (Breusch-Pagan)
bptest(modelo)

    studentized Breusch-Pagan test

data:  modelo
BP = 103.75, df = 7, p-value < 2.2e-16

El test de homocedasticidad (Breusch-Pagan) tiene un valor p muy bajo (< 2.2e-16) sugiere la presencia de heterocedasticidad, lo que significa que la varianza de los residuos no es constante. Para abordar esto, se puede considerar una transformación de las variables o utilizar estimaciones robustas de la varianza (como errores estándar robustos) que sean menos sensibles a la heterocedasticidad o explorar modelos que permitan varianza no constante, como los modelos de regresión ponderada o los modelos lineales generalizados.

Mostrar/Ocultar Código
# Multicolinealidad
vif(modelo)
                 GVIF Df GVIF^(1/(2*Df))
areaconst    1.745044  1        1.321001
estrato      1.647756  3        1.086798
habitaciones 1.874018  1        1.368948
parqueaderos 1.280855  1        1.131749
banios       2.265327  1        1.505100

Los valores de VIF están todos por debajo de 5, lo que sugiere que no hay un problema significativo de multicolinealidad entre las variables independientes. Esto implica que las estimaciones de los coeficientes de regresión son confiables y no están infladas por la colinealidad entre las variables.

Mostrar/Ocultar Código
# 8. Independencia de residuos (Durbin-Watson)
dwtest(modelo)

    Durbin-Watson test

data:  modelo
DW = 1.9312, p-value = 0.1839
alternative hypothesis: true autocorrelation is greater than 0

El estadístico Durbin-Watson de 1.9312 está cerca de 2, lo que indica que no hay evidencia significativa de autocorrelación en los residuos, sugiriendo que los errores son aproximadamente independientes entre sí. Además, el valor p de 0.1839 no es lo suficientemente bajo como para rechazar la hipótesis nula de ausencia de autocorrelación positiva.

Mostrar/Ocultar Código
# 9. Valores influyentes
influencePlot(modelo)

Este gráfico revela la presencia de varias observaciones potencialmente problemáticas, especialmente el punto 494, que podría estar distorsionando significativamente los resultados del modelo. Estas observaciones merecen una investigación más detallada para determinar si son errores de datos, casos atípicos legítimos o si reflejan fenómenos importantes no capturados adecuadamente por el modelo actual. Dependiendo de esta investigación, podría ser necesario considerar la transformación de variables, la inclusión de términos de interacción, o incluso la remoción justificada de ciertas observaciones para mejorar la robustez y la capacidad predictiva del modelo.

El análisis de los supuestos del modelo de regresión lineal revela tanto cumplimientos como violaciones, lo que impacta la validez estadística del modelo. Entre los aspectos que se cumplen, el test de Durbin-Watson arrojó un valor de 1.9312, cercano a 2, lo que indica que no hay evidencia significativa de autocorrelación en los residuos, sugiriendo que el supuesto de independencia se mantiene. Además, no se observa un problema significativo de multicolinealidad, ya que los valores de VIF están por debajo de 2.5 para todas las variables.

No obstante, se han identificado problemas en otros supuestos. La prueba de Shapiro-Wilk revela una desviación significativa de la normalidad en los residuos (W = 0.81695, p < 2.2e-16), y el test de Breusch-Pagan detecta heterocedasticidad (BP = 103.75, p < 2.2e-16). Estos resultados sugieren que las estimaciones e inferencias del modelo podrían no ser completamente confiables.

Estos hallazgos subrayan la necesidad de reevaluar la estructura del modelo. Para mejorar su validez, se pueden considerar varias estrategias. Primero, dado que se observa una desviación significativa de la normalidad en los residuos, se podría explorar la transformación de las variables dependientes e independientes para lograr una distribución más normal. Alternativamente, la aplicación de métodos de estimación robustos a la heterocedasticidad, como los errores estándar robustos, podría mitigar el impacto de la heterocedasticidad detectada por el test de Breusch-Pagan.

Además, la inclusión de términos no lineales o interacciones entre variables podría capturar relaciones más complejas que el modelo lineal actual no está considerando. Si estos enfoques no solucionan los problemas, podría ser beneficioso adoptar modelos más flexibles, como los Modelos Aditivos Generalizados (GAM) o los Modelos Lineales Generalizados (GLM), que son capaces de manejar mejor la no linealidad y la heterocedasticidad. Estos modelos ofrecen una mayor flexibilidad en la especificación de la relación entre las variables, lo que podría mejorar la adaptación del modelo a los datos y aumentar la precisión de las inferencias realizadas.

2.3.5 Predicción de precio de solicitud 1.

En esta sección, se utilizará el modelo de regresión lineal múltiple previamente desarrollado para predecir el precio de una propiedad específica, tomando en cuenta sus características particulares como el área construida, estrato, número de habitaciones, parqueaderos y baños. Se compararán las predicciones para la misma propiedad en dos estratos diferentes, con el fin de evaluar cómo varía el precio estimado y si este se ajusta al presupuesto máximo disponible. Además, se incluirán los intervalos de confianza para proporcionar una estimación del rango en el cual podría situarse el precio real.

Mostrar/Ocultar Código
# Crear dos data frames con las características de la Propiedad A
propiedad_A_estrato4 <- data.frame(
  areaconst = 200,      # Área construida
  estrato = factor(4, levels = levels(modelo$model$estrato)),  # Convertir a factor con niveles del modelo
  habitaciones = 4,     # Número de habitaciones
  parqueaderos = 1,     # Número de parqueaderos
  banios = 2            # Número de baños
)

propiedad_A_estrato5 <- data.frame(
  areaconst = 200,      # Área construida
  estrato = factor(5, levels = levels(modelo$model$estrato)),  # Convertir a factor con niveles del modelo
  habitaciones = 4,     # Número de habitaciones
  parqueaderos = 1,     # Número de parqueaderos
  banios = 2            # Número de baños
)

# Realizar las predicciones con intervalo de confianza
prediccion_estrato4 <- predict(modelo, newdata = propiedad_A_estrato4, interval = "confidence")
prediccion_estrato5 <- predict(modelo, newdata = propiedad_A_estrato5, interval = "confidence")

# Crear la cadena de salida combinada para estrato 4
output_estrato4 <- sprintf(
  "Predicción para la Propiedad A (Estrato 4):\nPrecio Estimado: %.2f millones de pesos\nIntervalo de Confianza: [%.2f, %.2f] millones de pesos\n",
  prediccion_estrato4[1], prediccion_estrato4[2], prediccion_estrato4[3]
)

# Crear la cadena de salida combinada para estrato 5
output_estrato5 <- sprintf(
  "Predicción para la Propiedad A (Estrato 5):\nPrecio Estimado: %.2f millones de pesos\nIntervalo de Confianza: [%.2f, %.2f] millones de pesos\n",
  prediccion_estrato5[1], prediccion_estrato5[2], prediccion_estrato5[3]
)

# Imprimir la salida combinada
cat(output_estrato4, "\n", output_estrato5)
Predicción para la Propiedad A (Estrato 4):
Precio Estimado: 337.44 millones de pesos
Intervalo de Confianza: [304.11, 370.76] millones de pesos
 
 Predicción para la Propiedad A (Estrato 5):
Precio Estimado: 371.10 millones de pesos
Intervalo de Confianza: [340.82, 401.39] millones de pesos

Para una casa de estrato 4, el modelo predice un precio de 337.44 millones de pesos, con un intervalo de confianza del 95% que va de 304.11 millones a 370.76 millones, abarcando el presupuesto máximo de 350 millones y sugiriendo que es posible que el precio real esté dentro del presupuesto. Por otro lado, para una casa en la zona norte de estrato 5, la predicción es de 371.1 millones de pesos, con un intervalo de 340.82 millones a 401.39 millones, superando el presupuesto en promedio y solo incluyendo el límite presupuestario dentro del intervalo, lo que podria hacer menos probable que se ajuste al presupuesto establecido.

2.3.6 Análisis de ofertas potenciales

El análisis inicia con la selección de propiedades en la base de datos (base1) que satisfacen criterios específicos: área construida mínima de 200 metros cuadrados, al menos 1 parqueadero, 2 baños, 4 habitaciones, estrato 4 o 5, y un precio máximo de 350 millones de pesos. Luego, se calcula una puntuación de ajuste para cada propiedad, que mide la proximidad de sus características a las especificaciones deseadas. Las propiedades se ordenan según esta puntuación, priorizando aquellas con puntuaciones más bajas, ya que indican un mejor cumplimiento de los requisitos. Finalmente, se eligen y presentan las 7 ofertas principales, destacando las propiedades que mejor se ajustan a los criterios establecidos.

Mostrar/Ocultar Código
# Filtrar propiedades potenciales
ofertas_potenciales <- base1 %>%
  filter(
    areaconst >= 200,
    parqueaderos >= 1,
    banios >= 2,
    habitaciones >= 4,
    estrato %in% c(4, 5),
    preciom <= 350  # Presupuesto máximo
  ) %>%
  mutate(
    # Calcular la puntuación de ajuste basándose en la distancia de cada propiedad a los valores ideales
    puntuacion_ajuste = (
      abs(areaconst - 200) +
      abs(parqueaderos - 1) +
      abs(banios - 2) +
      abs(habitaciones - 4)
    )
  ) %>%
  arrange(puntuacion_ajuste) %>%  # Ordenar por puntuación de ajuste, menor puntuación es mejor
  head(7)  # Tomar las 7 mejores ofertas

# Mostrar las ofertas filtradas y ordenadas
ofertas_potenciales

Las ofertas que mejor ajuste tienen a la solicitud son las de id 4210, 1342 y 1144. Posteriormente, con las 7 ofertas potenciales seleccionadas, se realiza el siguiente mapa con su ubicación.

Mostrar/Ocultar Código
# Transformar cali a WGS84 (EPSG:4326)
cali_wgs84 <- st_transform(cali, 4326)

# Convertir las coordenadas de ofertas_seleccionadas a un objeto sf
ofertas_sf <- st_as_sf(ofertas_potenciales, coords = c("longitud", "latitud"), crs = 4326)

# Calcular los límites para el zoom con un buffer
buffer <- 0.005
x_range <- range(st_coordinates(ofertas_sf)[,1])
y_range <- range(st_coordinates(ofertas_sf)[,2])
x_limits <- c(x_range[1] - buffer, x_range[2] + buffer)
y_limits <- c(y_range[1] - buffer, y_range[2] + buffer)

# Crear el mapa actualizado
mapa_actualizado <- ggplot() +
  # Agregar el shape de Cali como fondo
  geom_sf(data = cali_wgs84, fill = "lightgrey", color = "darkgrey") +
  # Agregar los puntos de las ofertas potenciales
  geom_sf(data = ofertas_sf, aes(color = "Ofertas potenciales"), size = 3, shape = 23, fill = "yellow") +
  # Agregar etiquetas para las ofertas potenciales
  geom_sf_text(data = ofertas_sf, aes(label = round(id, 1)), 
               color = "black", size = 2.5, fontface = "bold", nudge_y = 0.001) +
  # Títulos y tema
  labs(title = "Ubicación de Casas en Zona Norte de Cali",
       subtitle = "Ofertas Potenciales Destacadas en Verde/Amarillo",
       x = "Longitud", y = "Latitud") +
  # Leyenda para las ofertas potenciales
  scale_color_manual(name = "Leyenda", values = "green", labels = "Ofertas potenciales") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  # Añadir zoom a las ofertas potenciales
  coord_sf(xlim = x_limits, ylim = y_limits, expand = TRUE)

# Mostrar el mapa
print(mapa_actualizado)

El análisis del mercado revela una escasez de propiedades de estrato 4 que cumplan con todos los criterios deseados. Aunque el modelo de regresión lineal múltiple estimó un precio de 337.44 millones de pesos para una propiedad en este estrato, con un intervalo de confianza del 95% entre 304.11 y 370.76 millones de pesos, la disponibilidad real en el mercado es limitada. En contraste, las propiedades en estrato 5, aunque se sitúan en el límite superior del presupuesto, ofrecen oportunidades que no solo cumplen con las especificaciones requeridas, sino que en algunos casos las superan. A pesar de que el modelo predijo un precio más elevado de 371.1 millones de pesos para este estrato, con un intervalo de confianza del 95% entre 340.82 y 401.39 millones de pesos, estas ofertas representan opciones más robustas en comparación con las de estrato 4.

La diferencia en el número de registros entre los estratos 4 y 5 en la base de datos puede explicar por qué encontramos más ofertas reales en estrato 5 (Ver Análisis Exploratorio). Con 227 registros para estrato 5 frente a solo 120 para estrato 4, el mayor volumen de datos en estrato 5 proporciona una representación más completa y diversa de las propiedades disponibles. Esto significa que es más probable encontrar una mayor cantidad de ofertas dentro de este estrato simplemente porque hay más datos disponibles para analizar. En contraste, el menor número de registros en estrato 4 puede limitar la variedad y la cantidad de ofertas visibles, lo que podría resultar en una percepción de menor disponibilidad en comparación con estrato 5.

2.3.7 División de Datos y Evaluación del Modelo

En esta sección, se realiza una evaluación del modelo de regresión lineal múltiple desarrollado para predecir los precios de las propiedades, ahora utilizando un enfoque basado en la división de datos. El conjunto de datos se divide aleatoriamente en dos subconjuntos: el 70% se destina al entrenamiento del modelo, mientras que el 30% restante se reserva para su validación y prueba. El modelo se entrena con el subconjunto de entrenamiento y se generan predicciones utilizando los datos de prueba. Posteriormente, se calculan e interpretan las métricas de desempeño, como el Error Cuadrático Medio (MSE), el Error Absoluto Medio (MAE) y el coeficiente de determinación (R²), con el objetivo de evaluar la precisión del modelo y su capacidad para generalizar a nuevos datos.

Mostrar/Ocultar Código
# Asegurarse de que la columna 'estrato' es un factor
base1$estrato <- factor(base1$estrato)

# Dividir los datos en entrenamiento (70%) y prueba (30%)
set.seed(123) # Para reproducibilidad
indice_entrenamiento <- sample(seq_len(nrow(base1)), size = 0.7 * nrow(base1))
datos_entrenamiento <- base1[indice_entrenamiento, ]
datos_prueba <- base1[-indice_entrenamiento, ]

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

# Resumen del modelo
resumen_modelo <- summary(modelo)
print(resumen_modelo)

Call:
lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
    banios, data = datos_entrenamiento)

Residuals:
    Min      1Q  Median      3Q     Max 
-914.60  -68.57  -14.93   35.98 1066.88 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    2.67860   24.73757   0.108 0.913828    
areaconst      0.76974    0.05878  13.095  < 2e-16 ***
estrato4      82.84506   21.99443   3.767 0.000191 ***
estrato5     118.20746   20.89091   5.658 2.94e-08 ***
estrato6     275.51695   39.25695   7.018 9.80e-12 ***
habitaciones   8.51406    5.90999   1.441 0.150481    
parqueaderos  23.90300    6.24616   3.827 0.000151 ***
banios        16.11195    7.62939   2.112 0.035327 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 151.3 on 396 degrees of freedom
Multiple R-squared:  0.6666,    Adjusted R-squared:  0.6607 
F-statistic: 113.1 on 7 and 396 DF,  p-value: < 2.2e-16

Los resultados del modelo muestran un R² de 0.6666, muy cercano al 0.6781 obtenido previamente al entrenar con todos los datos, lo que indica que el modelo mantiene una capacidad consistente para predecir los precios de las propiedades, incluso con la división del conjunto de datos. La significancia de los coeficientes, especialmente para areaconst y los estratos, refuerza que estos factores siguen siendo determinantes en el precio. Con el modelo definido, procederemos a evaluar su desempeño utilizando el conjunto de datos de prueba. Analizaremos las métricas de desempeño del modelo para determinar su capacidad para generalizar a datos no vistos.

Mostrar/Ocultar Código
# Realizar predicciones con los datos de prueba
predicciones <- predict(modelo, newdata = datos_prueba)

# Calcular métricas de desempeño
# Error Cuadrático Medio (MSE)
mse <- mean((datos_prueba$preciom - predicciones)^2)

# Error Absoluto Medio (MAE)
mae <- mean(abs(datos_prueba$preciom - predicciones))

# R^2
r2 <- 1 - (sum((datos_prueba$preciom - predicciones)^2) / sum((datos_prueba$preciom - mean(datos_prueba$preciom))^2))

# Imprimir las métricas
cat("Error Cuadrático Medio (MSE):", mse, "\n")
Error Cuadrático Medio (MSE): 24906.44 
Mostrar/Ocultar Código
cat("Error Absoluto Medio (MAE):", mae, "\n")
Error Absoluto Medio (MAE): 96.77953 
Mostrar/Ocultar Código
cat("R^2:", r2, "\n")
R^2: 0.6794897 

Los resultados de las métricas de desempeño del modelo de regresión lineal múltiple muestran un R² de 67.9%, indicando que el modelo explica una parte significativa de la variabilidad en los precios de las viviendas, aunque aún queda un 32.1% sin explicar. El Error Cuadrático Medio (MSE) es de 24,906.44, mientras que el Error Absoluto Medio (MAE) es de 96.78 millones de pesos. Estos valores sugieren que, aunque el modelo es útil para estimar precios, existe una desviación considerable entre las predicciones y los precios reales. La comparación con el modelo anterior, que usó todos los datos y obtuvo un R² de 67.81%, muestra resultados muy similares, confirmando la estabilidad del rendimiento del modelo.

2.4 Análisis de la Solicitud 2: Apartamento en Zona Sur

2.4.1 Filtrado de Datos y Exploración Inicial

Se realizó un filtrado de la base de datos utilizando las columnas tipo y zona_geo, seleccionando únicamente los registros correspondientes a Apartamento en la zona Sur. A continuación, se presentan los primeros 3 registros resultantes de esta filtración.

Mostrar/Ocultar Código
# 1. Filtrar la base de datos
base2 <- df_final %>%
  filter(tipo == "Apartamento", zona_geo == "Sur")

# Mostrar los primeros 3 registros
kable(head(base2, 3))
id piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio zona_geo longitud latitud
1724 1 5 240 87 1 3 3 Apartamento acopi Sur -76.51700 3.36971
4386 1 5 310 137 2 3 4 Apartamento acopi Sur -76.53105 3.38296
5424 3 4 320 108 2 3 3 Apartamento acopi Sur -76.53638 3.40770

Se ha confirmado que los primeros registros cumplen con los criterios de filtrado establecidos. A continuación, se procederá a verificar la efectividad del filtro aplicado. Primero, se revisará el número total de registros. Luego, se validará el filtro revisando los valores únicos en las columnas tipo y zona_geo.

Mostrar/Ocultar Código
# Número de registros en el DataFrame
nrow(base2)
[1] 1994
Mostrar/Ocultar Código
# Para ver cuáles son los valores únicos en cada columna "zona_geo" y "tipo"
columnas_de_interes <- c("zona_geo","tipo")
valores_unicos_seleccionados <- sapply(base2[columnas_de_interes], unique)
print(valores_unicos_seleccionados)
     zona_geo          tipo 
        "Sur" "Apartamento" 

De lo anterior, se concluye que se han filtrado correctamente los 1994 registros de la base de datos. A continuación, se procederá a crear un mapa con los puntos correspondientes a estos registros, superpuestos sobre el mapa de barrios de Cali. Este mapa mostrará los precios y la distribución de los apartamentos.

Mostrar/Ocultar Código
# Convertir las coordenadas de base2 a un objeto sf
base2_sf <- st_as_sf(base2, coords = c("longitud", "latitud"), crs = 4326)

# Crear el mapa
mapa <- ggplot() +
  # Agregar el shape de Cali como fondo
  geom_sf(data = cali, fill = "lightgrey", color = "darkgrey") +
  # Agregar los puntos de los apartamentos
  geom_sf(data = base2_sf, aes(color = preciom), size = 2, alpha = 0.7) +
  # Escala de color para el precio
  scale_color_gradient(low = "blue", high = "red", name = "Precio (Millones de COP)") +
  # Títulos y tema
  labs(title = "Ubicación de Apartamentos en Zona Sur de Cali",
       x = "Longitud", y = "Latitud") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Mostrar el mapa
print(mapa)

Los puntos se han ubicado correctamente en su respectiva zona gracias al procesamiento previo que definió la columna de zonas geográficas (zona_geo). Con la base de datos debidamente definida y los puntos situados en las ubicaciones esperadas, podemos proceder con el análisis. Además, al generar el mapa, se observa que en la Zona Sur, los precios parecen variar significativamente en función de la ubicación, con una tendencia a aumentar hacia el la parte más sur y disminuir hacia el norte.

2.4.2 Análisis Exploratorio de Datos

En este capítulo, se realiza un análisis exploratorio de datos enfocado en la correlación entre el precio de las casas y variables clave como el área construida, el estrato socioeconómico, el número de baños, el número de habitaciones y el número de parqueaderos. Se emplean gráficos interactivos generados con el paquete plotly para visualizar estas relaciones de manera detallada y dinámica. Además, se utiliza la función summary para obtener y analizar las estadísticas descriptivas principales de cada variable. Este enfoque integrado permite una comprensión exhaustiva de los factores que influyen en la valoración de las propiedades, proporcionando una base sólida para la interpretación de los datos y la toma de decisiones en el mercado inmobiliario.

Mostrar/Ocultar Código
kable(summary(base2))
id piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio zona_geo longitud latitud
Min. :1250 Min. : 1.00 Min. :3.000 Min. : 70.0 Min. : 40.00 Min. : 1.00 Min. :1.000 Min. :1.000 Length:1994 Length:1994 Length:1994 Min. :-76.55 Min. :3.334
1st Qu.:2201 1st Qu.: 2.00 1st Qu.:4.000 1st Qu.: 190.0 1st Qu.: 68.00 1st Qu.: 1.00 1st Qu.:2.000 1st Qu.:3.000 Class :character Class :character Class :character 1st Qu.:-76.54 1st Qu.:3.366
Median :3562 Median : 4.00 Median :5.000 Median : 260.0 Median : 86.00 Median : 1.00 Median :2.000 Median :3.000 Mode :character Mode :character Mode :character Median :-76.53 Median :3.373
Mean :3767 Mean : 4.34 Mean :4.785 Mean : 318.8 Mean : 99.76 Mean : 1.41 Mean :2.559 Mean :2.956 NA NA NA Mean :-76.53 Mean :3.375
3rd Qu.:5304 3rd Qu.: 5.00 3rd Qu.:5.000 3rd Qu.: 350.0 3rd Qu.:110.00 3rd Qu.: 2.00 3rd Qu.:3.000 3rd Qu.:3.000 NA NA NA 3rd Qu.:-76.52 3rd Qu.:3.385
Max. :7664 Max. :12.00 Max. :6.000 Max. :1750.0 Max. :932.00 Max. :10.00 Max. :7.000 Max. :6.000 NA NA NA Max. :-76.51 Max. :3.411
Mostrar/Ocultar Código
# Contar la frecuencia de cada categoría en la columna 'estrato'
categoria_frecuencia2 <- table(base2$estrato)

# Captura la salida de la tabla de frecuencias
output <- capture.output(print(categoria_frecuencia2))

# Combina la etiqueta con la salida capturada en una sola cadena
cat("Frecuencia de cada categoría:\n", paste(output, collapse = "\n"))
Frecuencia de cada categoría:
 
  3   4   5   6 
 59 730 786 419 

El análisis del cuadro resumen revela información clave sobre los apartamentos en la zona sur de Cali. El precio de las viviendas varía significativamente, con una media de 318.8 millones de pesos y una mediana de 260 millones, indicando una alta dispersión en los precios. El área construida muestra una variabilidad considerable, con una media de 99.76 m², sugiriendo que las propiedades tienen un tamaño bastante diverso. La mayoría de las viviendas tienen entre 1 y 2 parqueaderos y entre 1 y 3 baños, con una tendencia central hacia un menor número de estas características. El número de habitaciones también tiende a ser bajo, con una media cercana a 3. En términos de estrato socioeconómico, el estrato 5 es el más frecuente, lo que refleja una notable concentración de propiedades en este segmento. Esta distribución en estratos, junto con la variabilidad en precios y características, sugiere una amplia gama de condiciones socioeconómicas en la zona.

Mostrar/Ocultar Código
# Correlación entre precio y área construida
plot_area <- plot_ly(base2, x = ~areaconst, y = ~preciom, type = "scatter", mode = "markers",
                     text = ~paste("ID:", id, "<br>Precio:", preciom, "millones"),
                     hoverinfo = "text",
                     name = "Registros") %>% 
  add_lines(y = ~fitted(lm(preciom ~ areaconst, data = base2)), 
            line = list(color = 'red', width = 2), 
            name = "Línea de tendencia") %>%
  layout(title = "Precio vs Área Construida",
         xaxis = list(title = "Área Construida (m²)"),
         yaxis = list(title = "Precio (Millones de COP)"))

plot_area

Existe una clara correlación positiva entre el precio y el área construida, como lo muestra la línea de tendencia roja. La mayoría de los datos se agrupan en la parte inferior izquierda, indicando una alta concentración de apartamentos más pequeños y económicos. Se observan algunos casos atípicos con áreas grandes pero precios relativamente bajos, lo que podría indicar otros factores influyentes como la ubicación o el estado del inmueble.

Mostrar/Ocultar Código
# Precio por Estrato
plot_estrato <- plot_ly(base2, x = ~as.factor(estrato), y = ~preciom, type = "box",
                        text = ~paste("Zona:", zona_geo),
                        hoverinfo = "y+text") %>%
  layout(title = "Distribución de Precios por Estrato",
         xaxis = list(title = "Estrato"),
         yaxis = list(title = "Precio (Millones de COP)"))

plot_estrato

Se evidencia un aumento general del precio a medida que se sube de estrato socioeconómico. El estrato 6 muestra la mediana de precios más alta y el rango más amplio. Hay un solapamiento significativo en los precios entre estratos, especialmente entre el 4 y el 5, lo que sugiere que el estrato no es el único determinante del precio. Se observan valores atípicos en todos los estratos, particularmente en el 5 y 6.

Mostrar/Ocultar Código
# Precio vs Número de Habitaciones
plot_habitaciones <- plot_ly(base2, x = ~habitaciones, y = ~preciom, type = "scatter", mode = "markers",
                             text = ~paste("ID:", id, "<br>Precio:", preciom, "millones"),
                             hoverinfo = "text") %>%
  layout(title = "Precio vs Número de Habitaciones",
         xaxis = list(title = "Número de Habitaciones"),
         yaxis = list(title = "Precio (Millones de COP)"))

plot_habitaciones

Se aprecia una correlación positiva entre el precio y el número de habitaciones. Los apartamentos de 3 y 4 habitaciones muestran el rango de precios más amplio y tienden a alcanzar los precios más altos. Hay menos datos para apartamentos de 5 y 6 habitaciones, pero estos mantienen precios elevados, sugiriendo que son propiedades de lujo o más exclusivas.

Mostrar/Ocultar Código
# Precio vs Número de Baños
plot_banios <- plot_ly(base2, x = ~banios, y = ~preciom, type = "scatter", mode = "markers",
                       text = ~paste("ID:", id, "<br>Precio:", preciom, "millones"),
                       hoverinfo = "text") %>%
  layout(title = "Precio vs Número de Baños",
         xaxis = list(title = "Número de Baños"),
         yaxis = list(title = "Precio (Millones de COP)"))

plot_banios

Existe una correlación positiva entre el precio y el número de baños. El rango de precios se amplía con más baños, especialmente para unidades con 3 a 5 baños. La mayoría de los apartamentos tienen entre 1 y 5 baños, con menos datos para 6 y 7 baños. Los apartamentos más caros generalmente tienen entre 4 y 6 baños, indicando una relación entre lujo y cantidad de baños.

Mostrar/Ocultar Código
# Nuevo gráfico para número de parqueaderos
plot_parqueaderos <- plot_ly(base2, x = ~parqueaderos, y = ~preciom, type = "scatter", mode = "markers",
                             text = ~paste("ID:", id, "<br>Precio:", preciom, "millones"),
                             hoverinfo = "text") %>%
  layout(title = "Precio vs Número de Parqueaderos",
         xaxis = list(title = "Número de Parqueaderos"),
         yaxis = list(title = "Precio (Millones de COP)"))

plot_parqueaderos

Se observa una leve correlación positiva entre el precio y el número de parqueaderos. La mayoría de los apartamentos tienen entre 1 y 4 parqueaderos, con los precios más altos concentrados en aquellos que tienen de 2 a 4 espacios. Existe un caso atípico (ID = 5908) con 10 parqueaderos a un precio moderado, lo que sugiere que otros factores también influyen en el precio además del número de parqueaderos, o que este dato es totalmente atipico.

Mostrar/Ocultar Código
# 5. Matriz de correlación
variables_numericas <- base2 %>% 
  select(preciom, areaconst, banios, habitaciones, parqueaderos) %>%
  cor(use = "complete.obs", method = "spearman")

plot_correlacion <- plot_ly(
  x = colnames(variables_numericas), 
  y = rownames(variables_numericas), 
  z = variables_numericas, 
  type = "heatmap",
  colorscale = "Viridis",
  text = matrix(sprintf("%.2f", variables_numericas), nrow = nrow(variables_numericas)),
  texttemplate = "%{text}",
  textfont = list(color = "white", size = 12)
) %>%
  layout(title = "Matriz de Correlación (spearman)",
         xaxis = list(title = ""),
         yaxis = list(title = ""))

plot_correlacion

La matriz muestra fuertes correlaciones positivas entre varias características. El precio (preciom) tiene la correlación más fuerte con el área construida (areaconst) (0.89). También hay correlaciones significativas entre baños y área construida (0.78). El número de habitaciones muestra correlaciones moderadas con otras variables. Esto sugiere que el área construida y el número de baños son factores altamente influyentes en el precio de los apartamentos en esta área de Cali.

El análisis revela que en la zona sur de Cali, el precio de los apartamentos está fuertemente influenciado por el área construida y el número de baños, con una correlación significativa entre estas variables. Los apartamentos más grandes y con más baños tienden a ser más costosos, destacando una relación clara entre tamaño, lujo y valor. A pesar de que el número de habitaciones y parqueaderos también afecta el precio, su impacto es menos pronunciado. La distribución de precios por estrato muestra solapamientos, sugiriendo que factores adicionales como la ubicación y el estado del inmueble juegan un papel importante en la valoración de las propiedades. La matriz de correlación refuerza la idea de que el tamaño, las características internas de las viviendas, y la ubicación son los principales determinantes del precio en esta zona de Cali.

2.4.3 Modelo de Regresión Lineal Múltiple

En esta sección se presentarán los resultados del modelo de regresión lineal múltiple desarrollado para predecir los precios de apartamentos en la zona sur de Cali. Se examinarán las principales métricas de desempeño del modelo, incluyendo el R², que indica el porcentaje de variabilidad en los precios que el modelo puede explicar. También se discutirá la significancia estadística de las variables predictoras como el área construida, el estrato, el número de habitaciones, parqueaderos y baños, y se evaluará cómo estas variables influyen en el precio de las viviendas. Además, se explorarán posibles áreas de mejora para el modelo.

Mostrar/Ocultar Código
base2$estrato <- factor(base2$estrato) # Asegurarse de que estrato es tratado como factor

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

# Resumen del modelo
resumen2 <- summary(modelo2)

# Imprimir el resumen
print(resumen2)

Call:
lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
    banios, data = base2)

Residuals:
     Min       1Q   Median       3Q      Max 
-1073.61   -36.87    -3.05    37.61   889.36 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -66.34392   16.84361  -3.939 8.47e-05 ***
areaconst      1.29871    0.05578  23.284  < 2e-16 ***
estrato4      11.31591   13.05821   0.867   0.3863    
estrato5      31.68502   13.19343   2.402   0.0164 *  
estrato6     160.01721   14.82992  10.790  < 2e-16 ***
habitaciones  -7.22042    4.20990  -1.715   0.0865 .  
parqueaderos  72.37140    4.40756  16.420  < 2e-16 ***
banios        48.72283    3.67727  13.250  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 93.67 on 1986 degrees of freedom
Multiple R-squared:  0.793, Adjusted R-squared:  0.7923 
F-statistic:  1087 on 7 and 1986 DF,  p-value: < 2.2e-16

El modelo de regresión lineal múltiple para predecir el precio de apartamentos en la zona sur, muestra resultados interesantes y, en su mayoría, lógicos. Al igual que el caso anterior, este incluye cinco variables predictoras: área construida, estrato, número de habitaciones, número de parqueaderos y número de baños. Con un R² ajustado de 0.7923, este modelo explica aproximadamente el 79.23% de la variabilidad en el precio de las viviendas, lo que indica un ajuste considerablemente mejor que el modelo de la solicitud anterior, que tenía un R-cuadrado de 0.6781.

Para determinar la significancia estadística de las variables, nos basamos principalmente en los valores p (Pr(>|t|)) y los estadísticos t. Cuanto menor sea el valor p y mayor el valor absoluto del estadístico t, más significativa es la variable. Basándonos en estos criterios, podemos ordenar las variables de más a menos significativa: área construida, número de parqueaderos, número de baños, estrato 6, estrato 5, número de habitaciones y estrato 4.

La variable más significativa es el área construida, con un coeficiente de 1.29871 y un valor p extremadamente bajo (< 2e-16). Esto significa que, en promedio, por cada metro cuadrado adicional de construcción, el precio de la vivienda aumenta en 1.29871 millones de pesos, manteniendo las demás variables constantes. Este resultado es lógico y esperado, ya que el tamaño de la vivienda es tradicionalmente un factor crucial en la determinación de su precio.

El número de parqueaderos muestra un impacto altamente significativo, con un coeficiente de 72.37140 (valor p < 2e-16), indicando que cada parqueadero adicional aumenta el precio de la vivienda en 72.37140 millones de pesos, manteniendo las demás variables constantes. Este resultado refleja el alto valor que se le da al espacio de estacionamiento, posiblemente debido a la creciente congestión vehicular y la escasez de espacios de parqueo en algunas zonas.

El número de baños también resulta altamente significativo, con un coeficiente de 48.72283 (valor p < 2e-16). Esto sugiere que cada baño adicional incrementa el precio de la vivienda en 48.72283 millones de pesos, todo lo demás igual. Este hallazgo es lógico, ya que los baños adicionales suelen ser considerados como un lujo y un indicador de comodidad en una vivienda.

El estrato socioeconómico muestra un impacto significativo, especialmente para el estrato 6, con un coeficiente de 160.01721 millones de pesos (valor p < 2e-16). El estrato 5 también es significativo (p = 0.0164), mientras que el estrato 4 no muestra una diferencia significativa con respecto al estrato de referencia (estrato 3). Esto implica que, al aumentar a estratos más altos, el precio de la vivienda se incrementa considerablemente, todo lo demás constante.

Sorprendentemente, el número de habitaciones muestra un efecto negativo marginalmente significativo en el precio (coeficiente -7.22042, valor p = 0.0865). Esto podría deberse a una posible multicolinealidad con otras variables, como el área construida, o podría indicar que, en este mercado inmobiliario, otros factores tienen más peso en la determinación del precio cuando se controlan las demás variables.

El modelo también incluye una constante (Intercept) de -66.34392, que es estadísticamente significativa (p = 8.47e-05). Esto sugiere que hay un ajuste negativo base en el precio cuando todas las demás variables son cero, aunque en la práctica es poco probable encontrar una vivienda con tales características.

En general, este modelo proporciona una buena capacidad predictiva para los precios de las viviendas, capturando la influencia de factores clave como el tamaño, las comodidades (parqueaderos y baños) y la ubicación socioeconómica (estrato). Sin embargo, como en todo modelo estadístico, es importante recordar que pueden existir otros factores no incluidos que también influyen en el precio de las viviendas.

También se calcularon los intervalos de confianza para los coeficientes del modelo, que se presentan a continuación.

Mostrar/Ocultar Código
# Intervalos de confianza para los coeficientes
intervalos2 <- confint(modelo2)
print(intervalos2)
                  2.5 %     97.5 %
(Intercept)  -99.376921 -33.310919
areaconst      1.189319   1.408095
estrato4     -14.293328  36.925147
estrato5       5.810592  57.559440
estrato6     130.933373 189.101038
habitaciones -15.476706   1.035866
parqueaderos  63.727472  81.015326
banios        41.511131  55.934538

Los intervalos de confianza de los coeficientes revelan varios puntos clave: el intercepto tiene un intervalo amplio y negativo, sugiriendo incertidumbre en su valor. El coeficiente para el área construida es positivo y bien estimado, indicando un impacto consistente en el precio. Los estratos 5 y 6 tienen efectos significativos y positivos, con intervalos que sugieren un aumento claro en el precio de las propiedades, mientras que el estrato 4 muestra un efecto incierto. El número de habitaciones no tiene un efecto claro sobre el precio, dado que su intervalo incluye valores negativos, mientras que los parqueaderos y los baños tienen efectos positivos y significativos en el precio, con intervalos que confirman su influencia en el valor de las propiedades.

2.4.4 Validación de Supuestos

En la validación de los supuestos de un modelo de regresión lineal múltiple, es crucial verificar que las condiciones necesarias para la validez de las inferencias estadísticas se cumplan. Esto incluye la normalidad de los residuos, la homocedasticidad, la ausencia de multicolinealidad y la independencia de los errores. Si alguno de estos supuestos es violado, las estimaciones del modelo pueden volverse sesgadas o ineficientes, comprometiendo la confiabilidad de los resultados. En esta sección, se examinan estos supuestos a través de diversas gráficas diagnóstico, pruebas estadísticas y se discuten las implicaciones de los resultados obtenidos, junto con posibles estrategias para mejorar el ajuste y la validez del modelo.

Mostrar/Ocultar Código
# Gráficos de diagnóstico
par(mfrow = c(2,2))
plot(modelo2)

El análisis de los gráficos de diagnóstico del modelo de regresión lineal revela aspectos importantes sobre la calidad y las suposiciones del modelo:

  1. Residuales vs. Valores Ajustados: En este caso, se evidencia que hay cierta curvatura en los residuos, especialmente para valores ajustados más altos. Esto podría indicar que hay una relación no lineal que el modelo no está capturando completamente. También se observa que la variabilidad de los residuos aumenta ligeramente para valores ajustados más altos, lo que podría sugerir heterocedasticidad.

  2. Q-Q de Residuales: En este gráfico, se observa que los puntos siguen bastante bien la línea diagonal en el centro, pero se desvían en las colas, especialmente en la cola superior derecha. Esto sugiere que los residuos tienen colas más pesadas que una distribución normal, lo que podría indicar la presencia de valores atípicos o que el modelo no está capturando completamente la variabilidad en los datos para valores extremos.

  3. Scale-Location: Aquí la línea roja tiene una ligera tendencia ascendente, lo que sugiere que la varianza de los residuos aumenta ligeramente con los valores ajustados. Esto indica una posible violación del supuesto de homocedasticidad, aunque no parece ser muy severa.

  4. Residuales vs. Leverage: En este gráfico, vemos varios puntos que están fuera de las líneas de Cook’s distance, especialmente en la parte superior derecha. Estos puntos podrían estar ejerciendo una influencia significativa en el modelo y merecen una investigación más detallada.

En conclusión, los gráficos de diagnóstico sugieren que el modelo de regresión podría no capturar una relación no lineal en los datos y presenta una ligera heterocedasticidad. Los residuos no siguen perfectamente una distribución normal, especialmente en los valores extremos, y algunos puntos influyentes podrían estar afectando los resultados. Estos hallazgos indican que el modelo puede necesitar ajustes adicionales para mejorar su precisión y robustez.Se revisará esto a más profundidad con los siguientes test.

Mostrar/Ocultar Código
# Test de normalidad de residuos (Shapiro-Wilk)
shapiro.test(residuals(modelo2))

    Shapiro-Wilk normality test

data:  residuals(modelo2)
W = 0.77007, p-value < 2.2e-16

El valor p es extremadamente bajo (< 2.2e-16), lo que indica un fuerte rechazo de la hipótesis nula de normalidad. Esto sugiere que los residuos no siguen una distribución normal. Este resultado es consistente con lo que observamos en el gráfico Q-Q de residuales, donde se observan desviaciones de la normalidad, especialmente en las colas.

Mostrar/Ocultar Código
# Test de homocedasticidad (Breusch-Pagan)
bptest(modelo2)

    studentized Breusch-Pagan test

data:  modelo2
BP = 688.44, df = 7, p-value < 2.2e-16

El valor p muy bajo (< 2.2e-16) indica un fuerte rechazo de la hipótesis nula de homocedasticidad. Esto sugiere que hay evidencia significativa de heterocedasticidad en el modelo. Este resultado confirma lo identificadó en el gráfico Scale-Location, donde se evidencia que la varianza de los residuos no era completamente constante.

Mostrar/Ocultar Código
# Multicolinealidad
vif(modelo2)
                 GVIF Df GVIF^(1/(2*Df))
areaconst    2.121023  1        1.456373
estrato      1.965213  3        1.119184
habitaciones 1.412478  1        1.188477
parqueaderos 1.922542  1        1.386558
banios       2.681098  1        1.637406

Los valores de VIF están todos por debajo de 5, lo que sugiere que no hay un problema significativo de multicolinealidad entre las variables independientes. Esto implica que las estimaciones de los coeficientes de regresión son confiables y no están infladas por la colinealidad entre las variables.

Mostrar/Ocultar Código
# 8. Independencia de residuos (Durbin-Watson)
dwtest(modelo2)

    Durbin-Watson test

data:  modelo2
DW = 1.7142, p-value = 6.494e-11
alternative hypothesis: true autocorrelation is greater than 0

El estadístico DW está cerca de 2 (que indica no autocorrelación), pero el valor p muy bajo (6.494e-11) sugiere que hay evidencia significativa de autocorrelación positiva en los residuos. Esto podría indicar que hay algún patrón en los datos que el modelo no está capturando completamente.

Mostrar/Ocultar Código
# 9. Valores influyentes
influencePlot(modelo2)

Este gráfico revela la presencia de varias observaciones potencialmente problemáticas, especialmente el punto 1680, que podría estar distorsionando significativamente los resultados del modelo. Estas observaciones merecen una investigación más detallada para determinar si son errores de datos, casos atípicos legítimos o si reflejan fenómenos importantes no capturados adecuadamente por el modelo actual. Dependiendo de esta investigación, podría ser necesario considerar la transformación de variables, la inclusión de términos de interacción, o incluso la remoción justificada de ciertas observaciones para mejorar la robustez y la capacidad predictiva del modelo.

El modelo de regresión lineal múltiple para predecir el precio de las viviendas muestra un buen ajuste general, con un R² ajustado de 0.7923. Sin embargo, los diagnósticos revelan el incumplimiento de varios supuestos clave: los residuos no siguen una distribución normal, hay evidencia de heterocedasticidad y se detecta autocorrelación en los residuos. Aunque no se identifican problemas graves de multicolinealidad, estas violaciones sugieren que el modelo, a pesar de su buen rendimiento aparente, podría beneficiarse de mejoras para aumentar su precisión y validez estadística.

Para mejorar el modelo, se recomienda considerar transformaciones de variables, aplicando, por ejemplo, una transformación logarítmica al precio para abordar la no normalidad y la heterocedasticidad. También se puede explorar la transformación Box-Cox para encontrar la más adecuada. Además, se sugiere incluir términos no lineales, como cuadráticos o cúbicos, para variables como el área construida o el número de baños, con el fin de capturar mejor las relaciones no lineales con el precio.

Otra recomendación es explorar interacciones entre variables significativas, como entre el estrato y el área construida o entre el número de habitaciones y baños, para identificar efectos combinados importantes en el precio de las viviendas. Es crucial también tratar los valores atípicos e influyentes, identificando puntos de datos que afectan significativamente al modelo y considerando su tratamiento por separado.

La inclusión de variables adicionales, como la antigüedad de la propiedad o características del vecindario, puede ayudar a abordar la autocorrelación observada. Además, se recomienda considerar modelos alternativos que sean menos sensibles a los incumplimientos de los supuestos de normalidad y homocedasticidad, como la regresión cuantílica o modelos de regresión generalizada.

Implementar técnicas de validación cruzada puede ayudar a evaluar la capacidad de generalización del modelo y evitar el sobreajuste, determinando si el modelo es demasiado complejo o necesita mayor flexibilidad. Finalmente, realizar un análisis detallado de los residuos por grupos, como por estrato o rango de precios, permitirá evaluar si el modelo funciona mejor para ciertos segmentos del mercado inmobiliario.

2.4.5 Predicción de precio de solicitud 2.

En esta sección, se utilizará el modelo de regresión lineal múltiple desarrollado para predecir el precio de la solicitud 2, tomando en cuenta sus características particulares como el área construida, estrato, número de habitaciones, parqueaderos y baños. Se compararán las predicciones para la misma propiedad en dos estratos diferentes, con el fin de evaluar cómo varía el precio estimado y si este se ajusta al presupuesto máximo disponible. Además, se incluirán los intervalos de confianza para proporcionar una estimación del rango en el cual podría situarse el precio real.

Mostrar/Ocultar Código
# Crear dos data frames con las características de la Propiedad B
propiedad_B_estrato5 <- data.frame(
  areaconst = 300,      # Área construida
  estrato = factor(5, levels = levels(modelo2$model$estrato)),  # Convertir a factor con niveles del modelo
  habitaciones = 5,     # Número de habitaciones
  parqueaderos = 3,     # Número de parqueaderos
  banios = 3            # Número de baños
)

propiedad_B_estrato6 <- data.frame(
  areaconst = 300,      # Área construida
  estrato = factor(6, levels = levels(modelo2$model$estrato)),  # Convertir a factor con niveles del modelo
  habitaciones = 5,     # Número de habitaciones
  parqueaderos = 3,     # Número de parqueaderos
  banios = 3            # Número de baños
)

# Realizar las predicciones con intervalo de confianza
prediccion2_estrato5 <- predict(modelo2, newdata = propiedad_B_estrato5, interval = "confidence")
prediccion2_estrato6 <- predict(modelo2, newdata = propiedad_B_estrato6, interval = "confidence")

# Crear la cadena de salida combinada para estrato 5
output2_estrato5 <- sprintf(
  "Predicción para la Propiedad B (Estrato 5):\nPrecio Estimado: %.2f millones de pesos\nIntervalo de Confianza: [%.2f, %.2f] millones de pesos\n",
  prediccion2_estrato5[1], prediccion2_estrato5[2], prediccion2_estrato5[3]
)

# Crear la cadena de salida combinada para estrato 6
output2_estrato6 <- sprintf(
  "Predicción para la Propiedad B (Estrato 6):\nPrecio Estimado: %.2f millones de pesos\nIntervalo de Confianza: [%.2f, %.2f] millones de pesos\n",
  prediccion2_estrato6[1], prediccion2_estrato6[2], prediccion2_estrato6[3]
)

# Imprimir la salida combinada
cat(output2_estrato5, "\n", output2_estrato6)
Predicción para la Propiedad B (Estrato 5):
Precio Estimado: 682.13 millones de pesos
Intervalo de Confianza: [656.86, 707.41] millones de pesos
 
 Predicción para la Propiedad B (Estrato 6):
Precio Estimado: 810.47 millones de pesos
Intervalo de Confianza: [785.27, 835.66] millones de pesos

Los resultados de la predicción muestran que para un apartamento en la zona sur de estrato 5, el precio estimado es de 682.13 millones de pesos, con un intervalo de confianza que va de 656.86 a 707.41 millones de pesos. En contraste, para el Estrato 6, el precio estimado es de 810.47 millones de pesos, con un intervalo de confianza entre 785.27 y 835.66 millones de pesos. Dado que el presupuesto máximo para comprar un apartamento en el sur de Cali es de 850 millones de pesos, ambas estimaciones están dentro del presupuesto, aunque la propiedad en Estrato 6 se acerca más al límite superior, lo que podría influir en la decisión de compra según las características del estrato.

2.4.6 Análisis de ofertas potenciales

El análisis inicia con la selección de propiedades en la base de datos (base2) que satisfacen criterios específicos: área construida mínima de 300 metros cuadrados, al menos 3 parqueadero, 3 baños, 5 habitaciones, estrato 5 o 6, y un precio máximo de 850 millones de pesos. Luego, se calcula una puntuación de ajuste para cada propiedad, que mide la proximidad de sus características a las especificaciones deseadas. Las propiedades se ordenan según esta puntuación, priorizando aquellas con puntuaciones más bajas, ya que indican un mejor cumplimiento de los requisitos. Finalmente, se eligen y presentan las 7 ofertas principales, destacando las propiedades que mejor se ajustan a los criterios establecidos.

Mostrar/Ocultar Código
ofertas_filtradas <- base2 %>%
  filter(
    areaconst >= 300,
    parqueaderos >= 3,
    banios >= 3,
    habitaciones >= 5,
    estrato %in% c(5, 6),
    preciom <= 850  # Presupuesto máximo
  )

print(ofertas_filtradas)
 [1] id           piso         estrato      preciom      areaconst   
 [6] parqueaderos banios       habitaciones tipo         barrio      
[11] zona_geo     longitud     latitud     
<0 rows> (or 0-length row.names)

Después de aplicar el primer filtro, no se encontró ninguna oferta que cumpliera con las condiciones mínimas establecidas para esta solicitud. Por lo tanto, se reducirán los requisitos del filtro y se ordenarán las propiedades según su puntuación de ajuste, priorizando aquellas que estén más cerca de cumplir con las especificaciones deseadas.

Mostrar/Ocultar Código
# Filtrar propiedades potenciales
ofertas_potenciales2 <- base2 %>%
  filter(
    areaconst >= 200,
    parqueaderos >= 2,
    banios >= 2,
    habitaciones >= 4,
    estrato %in% c(5, 6),
    preciom <= 850  # Presupuesto máximo
  ) %>%
  mutate(
    # Calcular la puntuación de ajuste basándose en la distancia de cada propiedad a los valores ideales
    puntuacion_ajuste2 = (
      abs(areaconst - 300) +
      abs(parqueaderos - 3) +
      abs(banios - 3) +
      abs(habitaciones - 5)
    )
  ) %>%
  arrange(puntuacion_ajuste2) %>%  # Ordenar por puntuación de ajuste, menor puntuación es mejor
  head(7)  # Tomar las 7 mejores ofertas

# Mostrar las ofertas filtradas y ordenadas
ofertas_potenciales2

Las primeras tres ofertas identificadas cumplen parcialmente con los requisitos establecidos, aunque presentan algunas desviaciones. La primera propiedad (ID: 5306) tiene un área construida de 275 metros cuadrados, 2 parqueaderos, 5 baños y 5 habitaciones, pero no alcanza los 300 metros cuadrados requeridos. La segunda propiedad (ID: 6175) también presenta una desviación en el área construida, con 270 metros cuadrados, y tiene solo 4 habitaciones en lugar de 5. La tercera propiedad (ID: 4266) cumple con el estrato 6 y los demás criterios, pero su área es de solo 250 metros cuadrados, significativamente menor a lo solicitado. Aunque ninguna propiedad alcanza el área mínima requerida, todas se encuentran dentro del presupuesto y ofrecen características atractivas.

Posteriormente, con las 7 ofertas potenciales seleccionadas, se realiza el siguiente mapa con su ubicación.

Mostrar/Ocultar Código
# Transformar cali a WGS84 (EPSG:4326)
cali_wgs84 <- st_transform(cali, 4326)

# Convertir las coordenadas de ofertas_seleccionadas a un objeto sf
ofertas_sf <- st_as_sf(ofertas_potenciales2, coords = c("longitud", "latitud"), crs = 4326)

# Calcular los límites para el zoom con un buffer
buffer <- 0.008
x_range <- range(st_coordinates(ofertas_sf)[,1])
y_range <- range(st_coordinates(ofertas_sf)[,2])
x_limits <- c(x_range[1] - buffer, x_range[2] + buffer)
y_limits <- c(y_range[1], y_range[2])

# Crear el mapa actualizado
mapa_actualizado <- ggplot() +
  # Agregar el shape de Cali como fondo
  geom_sf(data = cali_wgs84, fill = "lightgrey", color = "darkgrey") +
  # Agregar los puntos de las ofertas potenciales
  geom_sf(data = ofertas_sf, aes(color = "Ofertas potenciales"), size = 3, shape = 23, fill = "yellow") +
  # Agregar etiquetas para las ofertas potenciales
  geom_sf_text(data = ofertas_sf, aes(label = round(id, 1)), 
               color = "black", size = 2.5, fontface = "bold", nudge_y = 0.001) +
  # Títulos y tema
  labs(title = "Ubicación de Casas en Zona Norte de Cali",
       subtitle = "Ofertas Potenciales Destacadas en Verde/Amarillo",
       x = "Longitud", y = "Latitud") +
  # Leyenda para las ofertas potenciales
  scale_color_manual(name = "Leyenda", values = "green", labels = "Ofertas potenciales") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  # Añadir zoom a las ofertas potenciales
  coord_sf(xlim = x_limits, ylim = y_limits, expand = TRUE)

# Mostrar el mapa
print(mapa_actualizado)

El mapa muestra las ofertas potenciales destacadas en verde y amarillo, ilustrando propiedades que se ajustan a los criterios establecidos, aunque algunas ofertas se han incluido con ciertas concesiones debido a la falta de opciones perfectas.

Las ofertas están principalmente concentradas en la parte norte y central de la zona sur de Cali, con una notable agrupación en la zona superior del mapa, lo que podría indicar áreas de alto interés. Se observa un grupo de tres ofertas cercanas (5306, 6175 y 5273), posiblemente en un desarrollo específico. Además, dos ofertas aisladas (5644 y 5624) al sur sugieren oportunidades únicas o barrios con características diferentes.

2.4.7 División de Datos y Evaluación del Modelo

En esta sección, se realiza una evaluación del modelo de regresión lineal múltiple desarrollado para predecir los precios de los apartamentos en el sur de Cali, ahora utilizando un enfoque basado en la división de datos. El conjunto de datos se divide aleatoriamente en dos subconjuntos: el 70% se destina al entrenamiento del modelo, mientras que el 30% restante se reserva para su validación y prueba. El modelo se entrena con el subconjunto de entrenamiento y se generan predicciones utilizando los datos de prueba. Posteriormente, se calculan e interpretan las métricas de desempeño, como el Error Cuadrático Medio (MSE), el Error Absoluto Medio (MAE) y el coeficiente de determinación (R²), con el objetivo de evaluar la precisión del modelo y su capacidad para generalizar a nuevos datos.

Mostrar/Ocultar Código
# Asegurarse de que la columna 'estrato' es un factor
base2$estrato <- factor(base2$estrato)

# Dividir los datos en entrenamiento (70%) y prueba (30%)
set.seed(123) # Para reproducibilidad
indice_entrenamiento <- sample(seq_len(nrow(base2)), size = 0.7 * nrow(base2))
datos_entrenamiento <- base2[indice_entrenamiento, ]
datos_prueba <- base2[-indice_entrenamiento, ]

# Estimar el modelo de regresión lineal múltiple con los datos de entrenamiento
modelo2 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = datos_entrenamiento)

# Resumen del modelo
resumen_modelo <- summary(modelo2)
print(resumen_modelo)

Call:
lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
    banios, data = datos_entrenamiento)

Residuals:
    Min      1Q  Median      3Q     Max 
-991.27  -38.64   -3.22   40.70  894.93 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -58.31206   20.37804  -2.862  0.00428 ** 
areaconst      1.20611    0.06429  18.760  < 2e-16 ***
estrato4      11.61285   15.39382   0.754  0.45075    
estrato5      30.57761   15.50191   1.973  0.04875 *  
estrato6     166.40418   17.52954   9.493  < 2e-16 ***
habitaciones  -9.54728    5.17083  -1.846  0.06505 .  
parqueaderos  77.46469    5.24596  14.767  < 2e-16 ***
banios        48.36254    4.49192  10.767  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 95.88 on 1387 degrees of freedom
Multiple R-squared:  0.7859,    Adjusted R-squared:  0.7848 
F-statistic: 727.3 on 7 and 1387 DF,  p-value: < 2.2e-16

El análisis del modelo de regresión lineal muestra un R² de 0.7859, lo que indica que aproximadamente el 78.59% de la variabilidad en los precios de las propiedades se explica por las variables incluidas en el modelo. Este valor es significativamente alto, sugiriendo un buen ajuste del modelo a los datos. Los coeficientes de las variables independientes revelan que areaconst, estrato5, estrato6, parqueaderos y banios tienen una influencia estadísticamente significativa en el precio, con valores p muy bajos (menores a 0.05), lo que confirma su importancia en la predicción de precios. En particular, el coeficiente para estrato6 es notablemente alto, lo que indica que propiedades en este estrato tienden a tener precios significativamente mayores. Sin embargo, el efecto de habitaciones es marginalmente significativo (p=0.06505), sugiriendo que su impacto en el precio es menos pronunciado en comparación con otras variables. El error estándar residual de 95.88 y los valores extremos de los residuos sugieren que el modelo puede no capturar todos los matices de los datos, pero en general, el modelo parece ser robusto y ofrece una buena base para la predicción de precios. La siguiente etapa será evaluar el desempeño del modelo con datos de prueba para validar su capacidad de generalización.

Mostrar/Ocultar Código
# Realizar predicciones con los datos de prueba
predicciones <- predict(modelo2, newdata = datos_prueba)

# Calcular métricas de desempeño
# Error Cuadrático Medio (MSE)
mse <- mean((datos_prueba$preciom - predicciones)^2)

# Error Absoluto Medio (MAE)
mae <- mean(abs(datos_prueba$preciom - predicciones))

# R^2
r2 <- 1 - (sum((datos_prueba$preciom - predicciones)^2) / sum((datos_prueba$preciom - mean(datos_prueba$preciom))^2))

# Imprimir las métricas
cat("Error Cuadrático Medio (MSE):", mse, "\n")
Error Cuadrático Medio (MSE): 7889.124 
Mostrar/Ocultar Código
cat("Error Absoluto Medio (MAE):", mae, "\n")
Error Absoluto Medio (MAE): 55.8322 
Mostrar/Ocultar Código
cat("R^2:", r2, "\n")
R^2: 0.8077056 

Los resultados de las métricas de desempeño del modelo de regresión lineal múltiple muestran un R² de 0.8077, lo que indica que el modelo explica aproximadamente el 80.77% de la variabilidad en los precios de las propiedades, evidenciando un ajuste robusto. El Error Cuadrático Medio (MSE) es de 7889.124 millones de pesos, lo que refleja la magnitud promedio de los errores al cuadrado entre las predicciones y los precios reales. El Error Absoluto Medio (MAE) es de 55.8322 millones de pesos, indicando que, en promedio, las predicciones del modelo están a 55.83 millones de pesos de los valores reales. Estos resultados sugieren que el modelo ofrece una precisión razonable y ha mejorado en comparación con modelos anteriores, proporcionando una buena estimación de los precios de las propiedades.

2.5 Conclusiones y Recomendaciones Finales

2.5.1 Conclusiones

El análisis del mercado inmobiliario en las zonas norte y sur de Cali revela un panorama complejo y estratificado, con dinámicas de precios influenciadas por diversos factores. Los hallazgos principales son:

Factores Determinantes de Precio

  • Área Construida y Estrato Socioeconómico: Emergen como los predictores más significativos del precio de las propiedades tanto en la zona norte como en la sur. Otras variables como el número de baños y parqueaderos también muestran una influencia considerable, aunque en menor medida.

Diferencias por Zona

  • Zona Norte: Se observó una clara tendencia ascendente en los precios a medida que aumenta el estrato socioeconómico, con diferencias notables entre los estratos 4, 5 y 6.
  • Zona Sur: El mercado de apartamentos demostró ser igualmente diverso, con una fuerte influencia del área construida y el estrato socioeconómico en la determinación de los precios.

Desempeño de los Modelos

  • Zona Norte: El modelo explicó aproximadamente el 67% de la variabilidad en los precios de las casas.
  • Zona Sur: El modelo para apartamentos mostró un mejor ajuste, explicando alrededor del 80.77% de la variabilidad.

Limitaciones de los Modelos

Ambos modelos presentaron algunas violaciones de los supuestos estadísticos, incluyendo no normalidad de los residuos, heterocedasticidad y, en el caso del sur, autocorrelación. Esto sugiere la necesidad de refinamientos adicionales para mejorar su precisión y capacidad predictiva.

Disponibilidad de Propiedades

  • Zona Norte: Se encontró una mayor oferta de inmuebles que cumplen con criterios específicos en el estrato 5 en comparación con el estrato 4.
  • Zona Sur: La búsqueda de apartamentos con características muy específicas (área construida mínima de 300 m², 3 parqueaderos, 3 baños, 5 habitaciones, estrato 5 o 6, precio máximo de 850 millones) resultó infructuosa, sugiriendo una escasez de propiedades que satisfagan simultáneamente todos estos criterios.

2.5.2 Recomendaciones

Basándose en los hallazgos del análisis, se proponen las siguientes recomendaciones:

Refinamiento de los Modelos

  • Explorar transformaciones de variables, especialmente para el precio, para abordar la no normalidad y la heterocedasticidad.
  • Considerar la inclusión de términos no lineales o interacciones entre variables para capturar relaciones más complejas.
  • Investigar y tratar adecuadamente los valores atípicos e influyentes identificados.

Ampliación de Variables

Incorporar variables adicionales como la antigüedad de la propiedad, características del vecindario o amenidades cercanas para mejorar la capacidad predictiva de los modelos y abordar problemas como la autocorrelación.

Técnicas de Modelado Alternativas

Explorar modelos más robustos como la regresión cuantílica, los Modelos Aditivos Generalizados (GAM) o los Modelos Lineales Generalizados (GLM) para capturar mejor las dinámicas del mercado.

Segmentación del Mercado

Realizar análisis separados para diferentes segmentos del mercado, ya sea por estrato, rango de precios o tipo de propiedad, para capturar mejor las dinámicas específicas de cada sector.

Análisis Geoespacial Profundo

Profundizar en el análisis de la distribución geográfica de las propiedades, considerando factores como la proximidad a servicios, zonas verdes o vías principales.

Validación Continua y Actualización

Implementar un proceso de validación cruzada más exhaustivo y establecer un sistema de actualización regular de los modelos con datos recientes.

Integración de Conocimiento Experto

Complementar el análisis cuantitativo con el conocimiento de expertos locales en bienes raíces para interpretar los resultados en el contexto de las tendencias y particularidades del mercado inmobiliario de Cali.

Estrategia de Búsqueda Flexible

Para propiedades con requisitos muy específicos, como en el caso de la solicitud para el sur de la ciudad, se recomienda flexibilizar algunos criterios, priorizando los más importantes para el cliente.

La implementación de estas recomendaciones proporcionará a C&A una base más sólida para la toma de decisiones informadas en el mercado inmobiliario de Cali, mejorando su capacidad para satisfacer las necesidades específicas de sus clientes corporativos internacionales y adaptarse a las dinámicas cambiantes del mercado local.

2.6 Datos de la sesión

Mostrar/Ocultar Código
sessionInfo()
R version 4.3.2 (2023-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 11 x64 (build 22631)

Matrix products: default


locale:
[1] LC_COLLATE=English_World.utf8  LC_CTYPE=English_World.utf8   
[3] LC_MONETARY=English_World.utf8 LC_NUMERIC=C                  
[5] LC_TIME=English_World.utf8    

time zone: America/Bogota
tzcode source: internal

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
 [1] car_3.1-2            carData_3.0-5        lmtest_0.9-40       
 [4] zoo_1.8-12           plotly_4.10.4        VIM_6.2.2           
 [7] colorspace_2.1-1     sf_1.0-15            lubridate_1.9.3     
[10] forcats_1.0.0        stringr_1.5.1        dplyr_1.1.4         
[13] purrr_1.0.2          readr_2.1.5          tidyr_1.3.1         
[16] tibble_3.2.1         tidyverse_2.0.0      paqueteMODELOS_0.1.0
[19] summarytools_1.0.1   knitr_1.48           gridExtra_2.3       
[22] GGally_2.2.1         ggplot2_3.5.1        broom_1.0.6         
[25] boot_1.3-28.1       

loaded via a namespace (and not attached):
 [1] tidyselect_1.2.1   viridisLite_0.4.2  farver_2.1.2       lazyeval_0.2.2    
 [5] fastmap_1.1.1      digest_0.6.34      timechange_0.3.0   lifecycle_1.0.4   
 [9] magrittr_2.0.3     compiler_4.3.2     rlang_1.1.3        tools_4.3.2       
[13] utf8_1.2.4         yaml_2.3.10        data.table_1.15.4  labeling_0.4.3    
[17] htmlwidgets_1.6.4  sp_2.1-3           classInt_0.4-10    plyr_1.8.9        
[21] RColorBrewer_1.1-3 abind_1.4-5        KernSmooth_2.23-22 withr_3.0.1       
[25] nnet_7.3-19        fansi_1.0.6        e1071_1.7-14       scales_1.3.0      
[29] MASS_7.3-60        cli_3.6.2          rmarkdown_2.26     generics_0.1.3    
[33] rstudioapi_0.15.0  robustbase_0.99-2  httr_1.4.7         reshape2_1.4.4    
[37] tzdb_0.4.0         DBI_1.2.1          proxy_0.4-27       pander_0.6.5      
[41] matrixStats_1.3.0  base64enc_0.1-3    vctrs_0.6.5        Matrix_1.6-1.1    
[45] jsonlite_1.8.8     hms_1.1.3          rapportools_1.1    crosstalk_1.2.1   
[49] magick_2.8.4       vcd_1.4-12         units_0.8-5        glue_1.7.0        
[53] DEoptimR_1.1-3     ggstats_0.6.0      codetools_0.2-19   stringi_1.8.3     
[57] gtable_0.3.5       munsell_0.5.1      pillar_1.9.0       htmltools_0.5.8.1 
[61] R6_2.5.1           tcltk_4.3.2        evaluate_0.24.0    lattice_0.21-9    
[65] backports_1.5.0    pryr_0.1.6         class_7.3-22       Rcpp_1.0.12       
[69] checkmate_2.3.2    laeken_0.5.3       ranger_0.16.0      xfun_0.46         
[73] pkgconfig_2.0.3   

2.7 Contacto

https://www.linkedin.com/in/donoban-rojas/