1. INTRODUCCIÓN

El mercado inmobiliario en la ciudad de Cali ha experimentado fluctuaciones significativas en las ventas durante el último año, influenciadas por factores políticos, sociales y económicos. Sin embargo, se observa un aumento en la actividad crediticia por parte de instituciones financieras, lo que podría indicar un potencial de recuperación en el futuro cercano.

Ante este escenario dinámico, es crucial para la compañía inmobiliaria C&A (Casas y Apartamentos) comprender en profundidad las tendencias del mercado y adaptarse estratégicamente para satisfacer las necesidades de los clientes y aprovechar las oportunidades emergentes. En este contexto, el análisis detallado presentado en este informe proporcionará a C&A una guía sólida para tomar decisiones informadas y proactivas que impulsen el éxito y la competitividad de la empresa en el sector inmobiliario de Cali.

En respuesta a la solicitud de asesoramiento para la compra de dos viviendas por parte de una compañía internacional, se ha llevado a cabo un exhaustivo análisis del mercado inmobiliario actual en la ciudad de Cali. El objetivo de este informe es proporcionar a C&A una evaluación detallada de las opciones disponibles que se ajusten a los criterios establecidos por la compañía cliente.

El análisis se centra en dos casos específicos: la búsqueda de una casa y un apartamento, cada uno con características y requisitos distintos. Estos casos incluyen consideraciones como el tipo de propiedad, el área construida, el número de parqueaderos, baños y habitaciones, el estrato y la ubicación geográfica en la ciudad. Además, se toma en cuenta el crédito preaprobado por la compañía cliente.

Para abordar esta solicitud, se han empleado técnicas avanzadas de modelado y análisis de datos. El enfoque metodológico incluye un filtrado cuidadoso de la base de datos para seleccionar las propiedades relevantes, seguido de un análisis exploratorio de datos para identificar tendencias y patrones en el mercado inmobiliario. A continuación, se han estimado modelos de regresión para predecir el precio de las viviendas en función de sus características, proporcionando así una herramienta objetiva para evaluar su valor. Además, se ha realizado una validación de supuestos para asegurar la fiabilidad de los modelos y se han generado recomendaciones prácticas basadas en los hallazgos del análisis.

El resultado final de este proyecto es un informe completo que presenta el análisis detallado de las opciones de vivienda para la compañía internacional, así como recomendaciones sólidas y fundamentadas en datos para abordar sus necesidades específicas.

2. OBJETIVOS

El objetivo principal de este proyecto es realizar un análisis minucioso del mercado inmobiliario en Cali para identificar las opciones de vivienda más adecuadas para dos empleados de una compañía internacional. Utilizando un modelo de regresión lineal múltiple y análisis de datos, se busca proporcionar a María y su equipo en C&A recomendaciones sólidas y fundamentadas en datos. Estas recomendaciones les permitirán tomar decisiones informadas y estratégicas para satisfacer las necesidades específicas de los clientes corporativos, asegurando así la máxima satisfacción tanto para la compañía cliente como para sus empleados.

3. IMPORTACIÓN Y LIMPIEZA DE LOS DATOS

En este proyecto se trabajará con la base de datos de los 3 últimos meses proporcionada por la compañía A&C.

Lo primero que se debe hacer para comenzar a trabajar con la base de datos es instalar las librerías que vamos a utilizar en el modelo:

Librerías

  • Librerías necesarias para cargar la base de datos
# devtools::install_github("dgonxalex80/paqueteMODELOS", force = TRUE)
# install.packages("devtools")
library(devtools)
library(paqueteMODELOS)
  • Librerías necesarias para trabajar con el RMarkdown
library(knitr)
library(rmarkdown)
library(kableExtra)
  • Librerías para hacer el análisis descriptivo
library(psych)
library(dplyr)
library(ggplot2)
library(table1)
require(table1)
library(tidyverse)
library(DescTools)
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.3.2
library(plotly)
## Warning: package 'plotly' was built under R version 4.3.3
library(car)
library(lmtest)
  • Librerías para la imputacion de NAs
library(mice)
library(naniar)
library(DescTools)
library(VIM)
  • Librerías para trabajar con datos geoespaciales
# install.packages("leaflet")
# install.packages("sf")
library(leaflet)
## Warning: package 'leaflet' was built under R version 4.3.3
library(sf)
## Warning: package 'sf' was built under R version 4.3.3

Importación de la base de datos

Ahora se procederá a importar los datos para el modelo, los cuales se encuentran en un repositorio de GitHub. Además, se presentará una descripción estructurada de la base de datos que incluye información sobre las clases de cada variable, así como las primeras observaciones de cada una. Este análisis proporcionará una visión general del conjunto de datos.

data(vivienda)
str(vivienda)
## spc_tbl_ [8,322 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id          : num [1:8322] 1147 1169 1350 5992 1212 ...
##  $ zona        : chr [1:8322] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
##  $ piso        : chr [1:8322] NA NA NA "02" ...
##  $ estrato     : num [1:8322] 3 3 3 4 5 5 4 5 5 5 ...
##  $ preciom     : num [1:8322] 250 320 350 400 260 240 220 310 320 780 ...
##  $ areaconst   : num [1:8322] 70 120 220 280 90 87 52 137 150 380 ...
##  $ parqueaderos: num [1:8322] 1 1 2 3 1 1 2 2 2 2 ...
##  $ banios      : num [1:8322] 3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: num [1:8322] 6 3 4 3 3 3 3 4 6 3 ...
##  $ tipo        : chr [1:8322] "Casa" "Casa" "Casa" "Casa" ...
##  $ barrio      : chr [1:8322] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
##  $ longitud    : num [1:8322] -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num [1:8322] 3.43 3.43 3.44 3.44 3.46 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   id = col_double(),
##   ..   zona = col_character(),
##   ..   piso = col_character(),
##   ..   estrato = col_double(),
##   ..   preciom = col_double(),
##   ..   areaconst = col_double(),
##   ..   parqueaderos = col_double(),
##   ..   banios = col_double(),
##   ..   habitaciones = col_double(),
##   ..   tipo = col_character(),
##   ..   barrio = col_character(),
##   ..   longitud = col_double(),
##   ..   latitud = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>

Limpieza de la base de datos

La base de datos cuenta con 8,322 registros, para validar estos datos se deben seguir ciertos pasos.

1. Llevar la base de datos a un data frame, tomando como tamaño de la muestra las 8,322 observaciones, para así analizar todo el conjunto.

vivienda_df <- sample_n(vivienda, 8322)

2. Visualizar datos faltantes

datosNA <- colSums(is.na(vivienda_df))
datosNA <- t(datosNA)
kable(datosNA, format = "html", table.attr = 'class = "table table-striped table-bordered"') %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
3 3 2638 3 2 3 1605 3 3 3 3 3 3

De este gráfico se puede concluir: 1. Las variables piso y parqueadero tienen un total de faltantes de 4,275 faltantes entre las dos. Se hará uan imputación. 2. Dos apartamentos no cuentan con ningún dato diligenciado, por lo que se procederá a eliminarlos al ser pocos registros. 3. Un apartamento solo cuenta con la variable precio diligenciada, las demás están en blanco. Este registro también se eliminará.

3. Eliminar o imputar los datos faltantes

viv_sinNA <- vivienda_df %>%
  filter(!is.na(vivienda_df$id))
moda_parq <- Mode(viv_sinNA$parqueaderos, na.rm = TRUE)
viv_sinNA$parqueaderos[is.na(viv_sinNA$parqueaderos)] <- moda_parq
summary(viv_sinNA$parqueaderos)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   1.000   1.674   2.000  10.000
viv_sinNA$piso <- as.numeric(viv_sinNA$piso)
mediana_piso <- median(viv_sinNA$piso, na.rm = TRUE)
viv_sinNA$piso[is.na(viv_sinNA$piso)] <- mediana_piso
str(viv_sinNA$piso)
##  num [1:8319] 4 3 7 3 3 5 3 1 3 3 ...

Con la imputación de estas dos variables, el mapa de valores faltantes queda sin ningún valor, como se puede ver en la siguiente gráfica

gg_miss_var(viv_sinNA)

4. Requisitos Ahora que ya se tiene la base de datos cargada y limpia, se procederá con una serie de pasos que permitirán llegar a las conclusiones necesarias.

Se realizará un filtro a la base de datos original, esto con el fin de dar solución al caso 1 solicitado, es decir, encontrar un tipo de vivienda que sea una casa. A coninuación se muestran los requerimientos de la compañía internacional:

Caracteristicas Vivienda1 Vivienda2
Tipo Casa Apartamento
Area 200 300
Parqueaderos 1 3
Baños 2 3
Habitaciones 4 5
Estrato 4 5
Zona Norte Sur
Credito pre-aprobado 350M 850M

4. CASO 1: CASAS EN ZONA NORTE

4.1. Filtrado de datos

Se realizará un filtro a la base de datos y se incluirán solo las ofertas de las casas que estén ubicadas en la zona norte, a esto se le llamará “base1”.

Construimos un data frame llamado “base1” al que le llevaremos los datos con los filtros correspondientes a vivienda tipo casa y ubicadas en la zona norte.

base1 <- viv_sinNA %>%
  filter(tipo == "Casa", zona == "Zona Norte")
summary(base1)
##        id             zona                piso          estrato     
##  Min.   :  58.0   Length:722         Min.   :1.000   Min.   :3.000  
##  1st Qu.: 766.2   Class :character   1st Qu.:2.000   1st Qu.:3.000  
##  Median :2257.0   Mode  :character   Median :3.000   Median :4.000  
##  Mean   :2574.6                      Mean   :2.512   Mean   :4.202  
##  3rd Qu.:4225.0                      3rd Qu.:3.000   3rd Qu.:5.000  
##  Max.   :8319.0                      Max.   :7.000   Max.   :6.000  
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  89.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 261.2   1st Qu.: 140.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 390.0   Median : 240.0   Median : 1.000   Median : 3.000  
##  Mean   : 445.9   Mean   : 264.9   Mean   : 1.712   Mean   : 3.555  
##  3rd Qu.: 550.0   3rd Qu.: 336.8   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1940.0   Max.   :1440.0   Max.   :10.000   Max.   :10.000  
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:722         Length:722         Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.53  
##  Median : 4.000   Mode  :character   Mode  :character   Median :-76.52  
##  Mean   : 4.507                                         Mean   :-76.52  
##  3rd Qu.: 5.000                                         3rd Qu.:-76.50  
##  Max.   :10.000                                         Max.   :-76.47  
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.452  
##  Median :3.468  
##  Mean   :3.460  
##  3rd Qu.:3.482  
##  Max.   :3.496

La base 1 cuenta con un total de 722 viviendas tipo casa ubicadas en el norte de la ciudad de Cali.

Para comprobar que tenemos el data frame base 1 correcto vamos a hacer lo siguiente:

1. Presentar los primeros 3 registros

head(base1, 3)
## # A tibble: 3 × 13
##      id zona     piso estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  5944 Zona N…     3       6     460       350            1      5            6
## 2   466 Zona N…     1       3     200       132            1      3            3
## 3   391 Zona N…     3       3     175       180            1      2            3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

2. Tabla de frecuencia de la variable “Tipo”

head(base1$tipo)
## [1] "Casa" "Casa" "Casa" "Casa" "Casa" "Casa"

3. Tabla de frecuencia de la variable “Zona”

head(base1$zona)
## [1] "Zona Norte" "Zona Norte" "Zona Norte" "Zona Norte" "Zona Norte"
## [6] "Zona Norte"

4. Imprimir los valores únicos de cada variable

unique(base1$tipo)
## [1] "Casa"
unique(base1$zona)
## [1] "Zona Norte"

Ahora que hemos comprobado que nuestra base1 quedó bien creada, vamos a graficar un mapa con los puntos de la base.

mapa_b1 <- leaflet(base1) %>%
  addTiles() %>%
  addCircleMarkers(lng=~longitud,lat=~latitud,radius=3)

mapa_b1

Con este mapa, aunque la mayoría de los puntos se concentra en la zona norte, se evidencian puntos ubicados por fuera, ya sea en el oriente, el occidente o en el sur. Esto se puede deber a las siguientes razones:

  • Errores en las variables latitud o longitud. Pueden darse por una mala digitación, problemas de precisión en las coordenadas geográficas o diferencias en la interpretación de las ubicaciones.

  • Propiedades mal etiquetadas. Es posible que algunas propiedades se hayan etiquetado con una zona diferente a la correspondiente según su ubicación geográfica, esto podría darse por confusiones durante el ingreso de los datos o por falta de información precisa.

  • Variabilidad en los límites geográficos. Los límites de las zonas pueden ser ambiguos, lo que puede llevar a cierta superposición entre las zonas.

  • Desplazamiento de coordenadas. En algunas ocasiones, los datos geoespaciales pueden estar desplazados o malinterpretados debido a errores en la recopilación de los datos por cuestiones del dispositivo utilizado para la geolocalización.

4.2. Análisis exploratorio

Vamos a ver un resumen estadístico del data frame base1:

summary(base1)
##        id             zona                piso          estrato     
##  Min.   :  58.0   Length:722         Min.   :1.000   Min.   :3.000  
##  1st Qu.: 766.2   Class :character   1st Qu.:2.000   1st Qu.:3.000  
##  Median :2257.0   Mode  :character   Median :3.000   Median :4.000  
##  Mean   :2574.6                      Mean   :2.512   Mean   :4.202  
##  3rd Qu.:4225.0                      3rd Qu.:3.000   3rd Qu.:5.000  
##  Max.   :8319.0                      Max.   :7.000   Max.   :6.000  
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  89.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 261.2   1st Qu.: 140.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 390.0   Median : 240.0   Median : 1.000   Median : 3.000  
##  Mean   : 445.9   Mean   : 264.9   Mean   : 1.712   Mean   : 3.555  
##  3rd Qu.: 550.0   3rd Qu.: 336.8   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1940.0   Max.   :1440.0   Max.   :10.000   Max.   :10.000  
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:722         Length:722         Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.53  
##  Median : 4.000   Mode  :character   Mode  :character   Median :-76.52  
##  Mean   : 4.507                                         Mean   :-76.52  
##  3rd Qu.: 5.000                                         3rd Qu.:-76.50  
##  Max.   :10.000                                         Max.   :-76.47  
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.452  
##  Median :3.468  
##  Mean   :3.460  
##  3rd Qu.:3.482  
##  Max.   :3.496

De acuerdo con el resumen estadístico de la base1 se puede concluir lo siguiente: - El piso más bajo en el que se ubican las casas es el 1, y el más alto es el piso 7.

  • La mayoría de las casas están ubicadas en piso 3.

  • La media de los pisos es de 2.512, lo que sugiere una ligera asimetría a la izquierda de la curva, es decir, hay más casas ubicadas en pisos bajos que en pisos altos.

  • En el norte el estrato mínimo es el 3 y el máximo es el estrato 6, lo que sugiere qye las propiedades se encuentran en diferentes segmentos socioeconómicos.

  • Según los percentiles y la media la mayoría de las casas tienden a tener un estrato entre 3 y 5, estando más cercanas al estrato 5, pues el tercer cuartil es 5 y la media es de aproximadamente 4.2, adicionalmente, la media es ligeramente mayor que la mediana en un 0.2. Las casas están concentradas en mayor medida en estratos medios altos.

  • El rango de precios de venta es muy amplio, están entre $ 89M y $1,940M.

  • Aunque el rango de precios es amplio, hay una concentración en el rango intermedio, el 50 % de las casas tienen un precio inferior o igual a $ 390M que es la mediana, mientras que la media es de $ 445.9M, esto sugiere una cantidad significativa de viviendas con precios moderados en el conjunto de datos.

  • Igual que los precios, el área construida también presenta un rango muy amplio, hay valores entre los 30 y los 1,440 metros cuadrados, lo que tiene sentido, pues se espera una correlación positiva, ya que entre más grande sea la casa más espacio habitable suelen tener y así pueden ofrecer más comodidades, lo que las hace más deseables y, por lo tanto, más costosas y más sentido tienen si las viviendas están en la misma zona de la ciudad.

  • El promedio de parqueaderos por propiedad es de aproximadamente 1.712, lo que sugiere que la mayoría de las propiedades en el conjunto de datos tienden a tener menos de dos parqueaderos.

  • Aunque el promedio sugiere que la mayoría de las propiedades tienen menos de dos parqueaderos, el rango de valores va desde 1 hasta 10 parqueaderos.

  • Hay un mínimo de baños igual a 0, lo que resulta preocupante, ya que no es normal que una casa no tenga baños. Es importante verificar esta información para futuros análisis.

  • El hecho de que el número medio de baños por propiedad sea aproximadamente 3.555 sugiere que, en promedio, las propiedades tienden a tener más de tres baños.

  • El rango de habitaciones va desde 0 hasta 10, lo que indica una variabilidad significativa en el tamaño de las propiedades en términos de habitaciones. Además, una casa con 0 habitaciones no tiene mucho sentido, pues esto hace más referencia a apartaestudios de un solo ambiente; sin embargo, es algo interesante e importante para futuros análisis.

  • La mediana y la media sugieren que la mayoría de las propiedades tienen entre 3 y 5 habitaciones.

Ahora, veremos un gráfico interactivo de dispersión que muestra la relación entre el precio de las casas, el área construida y el estrato.

disp_parea <- plot_ly(data = base1, x = base1$areaconst, y = base1$preciom,
                      color = base1$estrato,
                      type = "scatter", mode = "markers",
                      text = paste("Habitaciones: ", base1$habitaciones,
                                   "<br>Baños: ", base1$banios),
                      hoverinfo = "text") %>%
              layout(title = "Relación entre precio, área construida y estrato",
                     xaxis = list(title = "Área construida"),
                     yaxis = list(title = "Precio"))

disp_parea

Con este gráfico podemos concluir que hay una correlación fuerte y positiva entre el área construida y el precio de las casas, es decir, a medida que aumenta el área también tiende a aumentar su precio. Por lo tanto, con esto comprobamos que el tamaño de la vivienda es un factor muy importante y un predictor siginificativo en la determinación del precio de la misma. También se puede concluir sobre el estrato que entre más grande la casa y más alto el precio, el estrato también tiende a ser más alto, entre 5 y 6. Por ejemplo, a partir de los $ 1000M casi todas las viviendas pertenecen a estos dos estratos.

A continuación, vamos a ver el gráfico interactivo de correlación entre 5 variables cuantitativas.

cor_matb1 <- cor(base1[, c("preciom", "areaconst", "estrato", "banios", "habitaciones")])

cor_b1 <- plot_ly(z = ~cor_matb1, type = "heatmap",
                                  colorscale = "Viridis",
                                  colorbar = list(title = "Coeficiente de correlación"),
                                  x = colnames(cor_matb1),
                                  y = colnames(cor_matb1),
                                  text = ~paste(colnames(cor_matb1), ": ", round(cor_matb1, 2)),
                                  hoverinfo = "text") %>%
                          layout(title = "Matriz de Correlación (Casas en Zona Norte)",
                                 xaxis = list(title = ""),
                                 yaxis = list(title = ""))

cor_b1

De esta matriz de correlación podemos concluir y corroborar lo visto con la matriz de dispersión, la relación más fuerte con el precio de la vivienda es el área construida, seguida por el estrato y la que menos relación presenta es el número de habitaciones. Esto significa que uno de los predictores más significativos para determinar el precio de una casa es el tamaño. También podemos inferir que no hay correlaciones fuertes entre el número de habiaciones y el área construida y el estrato.

4.3. Análisis de Regresión Lineal Múltiple

Vamos a hacer la estimación del modelo de Regresión Lineal Múltiple

modelo_base1 <- lm(preciom ~ areaconst + areaconst + estrato + banios + habitaciones + parqueaderos, data = base1)

summary(modelo_base1)
## 
## Call:
## lm(formula = preciom ~ areaconst + areaconst + estrato + banios + 
##     habitaciones + parqueaderos, data = base1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -950.02  -78.88  -18.61   45.40 1080.18 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -232.83115   29.71292  -7.836 1.68e-14 ***
## areaconst       0.81995    0.04372  18.755  < 2e-16 ***
## estrato        84.47244    7.30150  11.569  < 2e-16 ***
## banios         26.18460    5.35894   4.886 1.27e-06 ***
## habitaciones    0.82417    4.14235   0.199    0.842    
## parqueaderos    5.71822    5.25772   1.088    0.277    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 159 on 716 degrees of freedom
## Multiple R-squared:  0.6513, Adjusted R-squared:  0.6489 
## F-statistic: 267.5 on 5 and 716 DF,  p-value: < 2.2e-16
  • El intercepto (−232.83) representa el valor esperado del precio de una casa cuando todas las variables independientes son iguales a cero. En este caso, no tiene una interpretación práctica ya que no tiene sentido que todas las variables independientes sean cero en el contexto del modelo.

  • El coeficiente para el área construida (0.81995) es positivo y significativo (p-valor < 0.001), lo que indica que, manteniendo todas las demás variables constantes, un aumento de una unidad en el área construida se asocia con un aumento de aproximadamente 0.82 unidades en el precio de la casa.

  • El coeficiente 84.47 para el estrato indica que, en promedio, por cada unidad adicional en el estrato de una vivienda, el precio de la casa aumenta en 84.47 millones, manteniendo todas las demás variables constantes. Por ejemplo, si una casa tiene un estrato de 3 y otra casa similar tiene un estrato de 4, se espera que la segunda casa tenga un precio de 84.47 millones más que la primera casa.

  • El coeficiente para el número de baños es 26.18, coeficiente positivo y significativo, esto quiere decir que, manteniendo todas las demás variables constantes, un aumento de una unidad en el número de baños se asocia con un aumento de aproximadamente 26.18 millones en el precio de la casa.

  • Para el número de habitaciones, el coeficiente de 0.82 no es significativo (valor-p = 0.842), es decir, no hay suficiente evidencia para concluir que el número de habitaciones incida significativamente en el precio de la casa. Así mismo podemos concluir para el número de parqueaderos con coeficiente y valor- p de 5.72 y 0.277 respectivamente.

  • El coeficiente de determinación ajustado \(R^2\) del modelo es 0.6489, lo que significa que aproximadamente el 64.89% de la variabilidad en el precio de las casas puede ser explicada por las variables incluidas en el modelo.Esto indica que el modelo tiene un buen ajuste y que las variables explicativas seleccionadas capturan una cantidad significativa de la variabilidad en el precio de las casas en la zona norte de Cali.

  • El valor de la estadística F es 267.5 con un valor-p muy bajo \((<2.2e^{−16})\), lo que indica que al menos una de las variables independientes tiene un efecto significativo en el precio de las casas en el modelo.

4.4. Evaluación de supuestos

1. Linealidad

resid_base1 <- resid(modelo_base1)
valajus_base1 <- fitted(modelo_base1)
plot(valajus_base1, resid_base1, xlab = "Valores ajustados", ylab = "Residuos estandarizados", main = "Linealidad: Residuos vs. Valores ajustados", col = "steelblue")
abline(h = 0, col = "red")

#Gráfico QQ
qqnorm(resid_base1)
qqline(resid_base1)

El gráfico de dispersión de los residuos estandarizados versus los valores ajustados muestra una dispersión de puntos alrededor de la línea horizontal, con algunos puntos muy cercanos a la línea cero y otros más lejanos, y además observamos que la dispersión tiende a aumentar a medida que los valores ajustados aumentan, esto sugiere una posible violación del supuesto de linealidad. La dispersión creciente podría indicar una falta de homocedasticidad, lo que significa que la varianza de los errores no es constante a lo largo de los valores ajustados.

Por otro lado, en el gráfico QQ (Quantile-Quantile), la mayoría de los puntos están cerca de la línea diagonal y siguen su forma, pero algunos puntos comienzan a desviarse significativamente de la línea, adoptando una forma de “S” estirada, esto puede sugerir que los residuos no siguen una distribución normal en toda la gama de valores ajustados y que tienen colas más pesadas o una distribución sesgada en comparación con una distribución normal.

2. Normalidad de los residuos

# Histograma de residuos estandarizados
hist(resid_base1, breaks = 20, main = "Normalidad de los residuos: Histograma", col = "steelblue2")

# Prueba de Shapiro-Wilk
shapiro.test(resid_base1)
## 
##  Shapiro-Wilk normality test
## 
## data:  resid_base1
## W = 0.83487, p-value < 2.2e-16

De acuerdo con estas dos de normalidad, se rechaza la hipótesis nula de que los datos probvienen de una distribución normal. En el histograma, se observa una campana con un pico alto y estrecho, junto con colas largas, esto sugiere que la distribución de los datos es leptocúrtica. Esto significa que los datos están más concentrados alrededor de la media y tienen colas más pesadas en comparación con una distribución normal. Las colas largas indican que hay valores extremos en los datos, lo que puede deberse a la presencia de valores atípicos o una mayor variabilidad en los datos.

Por otro lado, en la prueba de Shapiro-Wilk, el valor W del estadístico se acerca a 1, lo que indica una cierta cercanía a la normalidad, sin embargo, el valor p asociado es extremadamente pequeño (< 2.2e-16), lo que significa que es muy poco probable que los datos provengan de una distribución normal.

3. Homocedastacidad

# Prueba de Breusch-Pagan
bp_testb1 <- bptest(modelo_base1)
bp_testb1
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_base1
## BP = 136.22, df = 5, p-value < 2.2e-16

El resultado del test de Breusch-Pagan indica que los errores no tienen varianzas constantes, debido a que el valor p muy bajo, lo que sugiere que la homocedasticidad no se cumple en este modelo de regresión lineal múltiple.

4. Independencia de los residuos

# Gráfico de autocorrelación de los residuos
acf(resid_base1)

# Prueba de Durbin-Watson
durbinWatsonTest(modelo_base1)
##  lag Autocorrelation D-W Statistic p-value
##    1    -0.004029199      2.003172   0.974
##  Alternative hypothesis: rho != 0

Dado que el p-valor es mayor que cualquier nivel de significancia común (como 0.05), no hay suficiente evidencia para rechazar la hipótesis nula de que no hay autocorrelación en los residuos. Esto sugiere que los residuos son independientes entre sí y no muestran autocorrelación.

5. Ausencia de multicolinealidad

# Cálculo de factores de inflación de la varianza (VIF)
vif(modelo_base1)
##    areaconst      estrato       banios habitaciones parqueaderos 
##     1.522848     1.468261     1.901338     1.634209     1.200333

Cuando los valores de VIF son bajos y están por debajo de ciertos umbrales (generalmente 10), sugiere que no hay multicolinealidad significativa entre esas variables. Por lo tanto, se puede concluir que no hay preocupaciones importantes de multicolinealidad en el modelo.

4.5. Predicciones

Para predecir el precio de la vivienda utilizando el modelo de regresión lineal identificado, vamos a proporcionar los valores de las características definidas por el cliente para el caso 1.

Ya que el estrato puede ser 4 o 5, vamos a ver el resultado con ambas posibilidades

caso1_1 <- data.frame(areaconst = 200, parqueaderos = 1, banios = 2, habitaciones = 4, estrato = 4)
caso1_2 <- data.frame(areaconst = 200, parqueaderos = 1, banios = 2, habitaciones = 4, estrato = 5)
predprecio_c1_1 <- predict(modelo_base1, newdata = caso1_1)
predprecio_c1_2 <- predict(modelo_base1, newdata = caso1_2)
print(paste("El precio que se predice para el caso 1, con un estrato 4 es: ", predprecio_c1_1))
## [1] "El precio que se predice para el caso 1, con un estrato 4 es:  330.433511919081"
print(paste("El precio que se predice para el caso 1, con un estrato 5 es: ", predprecio_c1_2))
## [1] "El precio que se predice para el caso 1, con un estrato 5 es:  414.905948601876"

De acuerdo con estos resultados tenemos que es posible conseguir una casa con las características solicitadas por la compañía, siempre y cuando sea en un estrato 4, el precio en este estrato sería de aproximadamente $ 330.4M. Si en vez de ser estrato 4 la casa está ubicada en un estrato 5, el precio sería de $ 414.9M, es decir, $64.9M más de los $350M preaprobados en el crédito.

4.6. Ofertas potenciales

Lo primero que se debe hacer es filtrar las viviendas que cumplan con las condiciones establecidas por la compañía internacional.

cond_base1 <- base1 %>%
  filter(
    areaconst >= 200,
    parqueaderos >= 1,
    banios >= 2,
    habitaciones >= 4,
    estrato %in% c(4,5),
    preciom <= 350
  )

Ahora, fijaremos una semilla para que el resultado no nos cambie a medida que ejcutamos el código. Y posteriormente generaremos las 5 ofertas potenciales.

set.seed(123)

if (nrow(cond_base1) > 0) {
  # Tomar 5 ofertas potenciales si hay observaciones
  ofertas_b1 <- cond_base1 %>%
    sample_n(5, replace = TRUE) # Usar sampling con reemplazo para evitar errores si el tamaño de cond_base1 < 5
  print(ofertas_b1)
} else {
  print("No hay observaciones que cumplan con todas las condiciones establecidas.")
}
## # A tibble: 5 × 13
##      id zona     piso estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1887 Zona N…     1       5     340       203            2      3            4
## 2  4483 Zona N…     2       5     342       250            1      4            6
## 3  4458 Zona N…     2       4     315       270            2      4            4
## 4   952 Zona N…     2       4     330       275            2      3            5
## 5  1020 Zona N…     2       4     230       250            2      3            5
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

Y, por último, graficaremos estas ofertas en un mapa que nos permita ver dónde quedan ubicadas las casas.

mapa_ofertasb1 <- leaflet(ofertas_b1) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud,
    lat = ~latitud,
    radius = 5, # Tamaño de los marcadores
    color = "blue", # Color de los marcadores
    popup = ~paste("Precio: $", preciom, "M") # Información emergente al hacer clic en los marcadores
  )

mapa_ofertasb1

5. CASO 2: APARTAMENTOS EN ZONA SUR

5.1. Filtrado de datos

Se realizará un segundo filtro a la base de datos, donde se incluirán solo las ofertas de los apartamentos que estén ubicados en la zona sur, a esto se le llamará “base2”.

Construimos un data frame llamado “base2” al que le llevaremos los datos con los filtros correspondientes a vivienda tipo apartamento y ubicadas en la zona sur.

base2 <- viv_sinNA %>%
  filter(tipo == "Apartamento", zona == "Zona Sur")
summary(base2)
##        id           zona                piso           estrato    
##  Min.   :   3   Length:2787        Min.   : 1.000   Min.   :3.00  
##  1st Qu.:2292   Class :character   1st Qu.: 3.000   1st Qu.:4.00  
##  Median :4004   Mode  :character   Median : 3.000   Median :5.00  
##  Mean   :4131                      Mean   : 4.141   Mean   :4.63  
##  3rd Qu.:5876                      3rd Qu.: 5.000   3rd Qu.:5.00  
##  Max.   :8302                      Max.   :12.000   Max.   :6.00  
##     preciom         areaconst       parqueaderos        banios     
##  Min.   :  75.0   Min.   : 40.00   Min.   : 1.000   Min.   :0.000  
##  1st Qu.: 175.0   1st Qu.: 65.00   1st Qu.: 1.000   1st Qu.:2.000  
##  Median : 245.0   Median : 85.00   Median : 1.000   Median :2.000  
##  Mean   : 297.3   Mean   : 97.47   Mean   : 1.354   Mean   :2.488  
##  3rd Qu.: 335.0   3rd Qu.:110.00   3rd Qu.: 2.000   3rd Qu.:3.000  
##  Max.   :1750.0   Max.   :932.00   Max.   :10.000   Max.   :8.000  
##   habitaciones       tipo              barrio             longitud     
##  Min.   :0.000   Length:2787        Length:2787        Min.   :-76.57  
##  1st Qu.:3.000   Class :character   Class :character   1st Qu.:-76.54  
##  Median :3.000   Mode  :character   Mode  :character   Median :-76.53  
##  Mean   :2.966                                         Mean   :-76.53  
##  3rd Qu.:3.000                                         3rd Qu.:-76.52  
##  Max.   :6.000                                         Max.   :-76.46  
##     latitud     
##  Min.   :3.334  
##  1st Qu.:3.370  
##  Median :3.383  
##  Mean   :3.390  
##  3rd Qu.:3.406  
##  Max.   :3.497

Para comprobar que tenemos el data frame base 2 correcto vamos a hacer lo siguiente:

1. Presentar los primeros 3 registros

head(base2, 3)
## # A tibble: 3 × 13
##      id zona     piso estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  3099 Zona S…     7       4     235        78            1      2            3
## 2  3983 Zona S…     3       4     140        58            1      2            3
## 3  7209 Zona S…     5       3     110        56            1      2            3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

2. Tabla de frecuencia de la variable “Tipo”

head(base2$tipo)
## [1] "Apartamento" "Apartamento" "Apartamento" "Apartamento" "Apartamento"
## [6] "Apartamento"

3. Tabla de frecuencia de la variable “Zona”

head(base2$zona)
## [1] "Zona Sur" "Zona Sur" "Zona Sur" "Zona Sur" "Zona Sur" "Zona Sur"

4. Imprimir los valores únicos de cada variable

unique(base2$tipo)
## [1] "Apartamento"
unique(base2$zona)
## [1] "Zona Sur"

Ahora que hemos comprobado que nuestra base2 quedó bien creada, vamos a graficar un mapa con los puntos de la base.

mapa_b2 <- leaflet(base2) %>%
  addTiles() %>%
  addCircleMarkers(lng=~longitud,lat=~latitud,radius=3)

mapa_b2

Este mapa revela una concentración mayoritaria de apartamentos en la zona sur, aunque se observan puntos dispersos en áreas como el centro, el oriente, el occidente y el norte. Esta dispersión puede atribuirse a diversas razones:

  • Errores en las coordenadas geográficas: Posibles fallos en la entrada de datos, imprecisiones en la captura de las coordenadas o discrepancias en la interpretación de las ubicaciones podrían provocar estos desvíos.

  • Etiquetado incorrecto de propiedades: Existe la posibilidad de que algunas propiedades se hayan etiquetado erróneamente con una zona diferente a la correspondiente según su ubicación real. Esto podría deberse a errores durante la entrada de datos o a la falta de información precisa.

  • Variabilidad en los límites geográficos: Los límites entre las zonas pueden ser ambiguos, lo que podría resultar en cierta superposición entre ellas, contribuyendo así a la dispersión de los puntos.

  • Desplazamiento de coordenadas: En ciertas ocasiones, los datos geoespaciales pueden estar desplazados o malinterpretados debido a errores en la recolección de datos, posiblemente relacionados con el dispositivo utilizado para la geolocalización.

5.2. Análisis exploratorio

Vamos a ver un resumen estadístico del data frame base2:

summary(base2)
##        id           zona                piso           estrato    
##  Min.   :   3   Length:2787        Min.   : 1.000   Min.   :3.00  
##  1st Qu.:2292   Class :character   1st Qu.: 3.000   1st Qu.:4.00  
##  Median :4004   Mode  :character   Median : 3.000   Median :5.00  
##  Mean   :4131                      Mean   : 4.141   Mean   :4.63  
##  3rd Qu.:5876                      3rd Qu.: 5.000   3rd Qu.:5.00  
##  Max.   :8302                      Max.   :12.000   Max.   :6.00  
##     preciom         areaconst       parqueaderos        banios     
##  Min.   :  75.0   Min.   : 40.00   Min.   : 1.000   Min.   :0.000  
##  1st Qu.: 175.0   1st Qu.: 65.00   1st Qu.: 1.000   1st Qu.:2.000  
##  Median : 245.0   Median : 85.00   Median : 1.000   Median :2.000  
##  Mean   : 297.3   Mean   : 97.47   Mean   : 1.354   Mean   :2.488  
##  3rd Qu.: 335.0   3rd Qu.:110.00   3rd Qu.: 2.000   3rd Qu.:3.000  
##  Max.   :1750.0   Max.   :932.00   Max.   :10.000   Max.   :8.000  
##   habitaciones       tipo              barrio             longitud     
##  Min.   :0.000   Length:2787        Length:2787        Min.   :-76.57  
##  1st Qu.:3.000   Class :character   Class :character   1st Qu.:-76.54  
##  Median :3.000   Mode  :character   Mode  :character   Median :-76.53  
##  Mean   :2.966                                         Mean   :-76.53  
##  3rd Qu.:3.000                                         3rd Qu.:-76.52  
##  Max.   :6.000                                         Max.   :-76.46  
##     latitud     
##  Min.   :3.334  
##  1st Qu.:3.370  
##  Median :3.383  
##  Mean   :3.390  
##  3rd Qu.:3.406  
##  Max.   :3.497

De este análisis exploratorio de datos podemos extraer varias conclusiones:

  • El precio medio de los apartamentos en el sur es de aproximadamente $ 297.3 millones de pesos, con una variabilidad considerable que se refleja en el rango de precios que va desde $ 75 millones hasta 1750 millones de pesos.

  • Los apartamentos tienen en promedio 97.47 metros cuadrados de área construida, con una cantidad media de habitaciones cercana a 3 y cerca de 2.5 baños en promedio. La mayoría de los apartamentos tienen entre 1 y 2 parqueaderos.

  • Si bien el número medio de pisos en los que se encuentran los apartamentos es de alrededor de 4.14, están ubicadas en un rango que va desde 1 hasta 12 pisos

  • La mayoría de las viviendas se encuentran en estratos 4 y 5, con una media de estrato de 4.63.

Ahora, veremos un gráfico interactivo de dispersión que muestra la relación entre el precio de las casas, el área construida y el estrato.

disp_parea <- plot_ly(data = base2, x = base2$areaconst, y = base2$preciom,
                      color = base2$estrato,
                      type = "scatter", mode = "markers",
                      text = paste("Habitaciones: ", base2$habitaciones,
                                   "<br>Baños: ", base2$banios),
                      hoverinfo = "text") %>%
              layout(title = "Relación entre precio, área construida y estrato",
                     xaxis = list(title = "Área construida"),
                     yaxis = list(title = "Precio"))

disp_parea

De este gráfico se puede concluir que hay una correlación fuerte y positiva entre el área construida y el precio de los apartamentos, es decir, a medida que aumenta el área también tiende a aumentar su precio. Con esto se comprueba que el tamaño de la vivienda es un factor muy importante y un predictor siginificativo en la determinación del precio de la misma. También podemos concluir que entre más alto el estrato del apartamento, también tiende a ser más alto el precio. En este caso de los apartamentos en el sur, hay mucha más variedad en los precios y los apartamentos tienden a tener un tamaño de 200 metros cuadrados o menos, acá está la mayor concentración de datos.

Ahora vamos a ver el gráfico interactivo de correlación entre 5 variables cuantitativas.

cor_matb2 <- cor(base2[, c("preciom", "areaconst", "estrato", "banios", "habitaciones")])

cor_b2 <- plot_ly(z = ~cor_matb2, type = "heatmap",
                                  colorscale = "Viridis",
                                  colorbar = list(title = "Coeficiente de correlación"),
                                  x = colnames(cor_matb2),
                                  y = colnames(cor_matb2),
                                  text = ~paste(colnames(cor_matb2), ": ", round(cor_matb2, 2)),
                                  hoverinfo = "text") %>%
                          layout(title = "Matriz de Correlación (Apartamentos en el sur)",
                                 xaxis = list(title = ""),
                                 yaxis = list(title = ""))

cor_b2

En esta matriz de correlación podemos ver que las correlaciones entre el área , el número de baños y el estrato cn el precio del apartamento son más fuertes que en el Caso1. Para los apartamentos de la zona sur es más relevante para el precio el número de baños que el estrato. El número de habitaciones es también en este caso el factor menos correlacionado con el precio.

5.3. Análisis de Regresión Lineal Múltiple

Vamos a hacer la estimación del modelo de Regresión Lineal Múltiple

modelo_base2 <- lm(preciom ~ areaconst + areaconst + estrato + banios + habitaciones + parqueaderos, data = base2)

summary(modelo_base2)
## 
## Call:
## lm(formula = preciom ~ areaconst + areaconst + estrato + banios + 
##     habitaciones + parqueaderos, data = base2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1151.66   -37.75    -2.59    38.06   922.20 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -266.91089   12.89132 -20.705  < 2e-16 ***
## areaconst       1.36019    0.04843  28.084  < 2e-16 ***
## estrato        59.23620    2.66624  22.217  < 2e-16 ***
## banios         44.71978    2.98956  14.959  < 2e-16 ***
## habitaciones  -17.89121    3.32828  -5.376 8.27e-08 ***
## parqueaderos   73.20959    3.65913  20.007  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 92.99 on 2781 degrees of freedom
## Multiple R-squared:  0.7648, Adjusted R-squared:  0.7643 
## F-statistic:  1808 on 5 and 2781 DF,  p-value: < 2.2e-16
  • El intercepto del modelo es -266.91089, lo que indica que, cuando todas las demás variables independientes son cero, el precio base de un apartamento es de aproximadamente -266.91089 millones de pesos. Sin embargo, en la práctica, este valor no tiene interpretación, ya que todas las variables independientes no pueden ser cero simultáneamente.

  • Todas las variables independientes, incluida el número de habitaciones que inicialmente parecía no ser significativo, resultan ser significativas en este modelo, como se evidencia por sus valores p muy bajos.

  • El coeficiente de determinación ajustado {R^2} del modelo es 0.7643, lo que indica que aproximadamente el 76.43% de la variabilidad en el precio de los apartamentos se explica por las variables incluidas en el modelo.Esto sugiere que el modelo tiene una buena capacidad predictiva en términos generales.

  • El valor de la estadística F es 1808 con un valor-p muy bajo (<2.2e−16), al tener un valor-p extremadamente pequeño, se rechaza la hipótesis nula de que todos los coeficientes de regresión son iguales a cero, lo que significa que al menos una de las variables independientes tiene un efecto significativo en el precio de los apartamentos.

5.4. Evaluación de supuestos

1. Linealidad

resid_base2 <- resid(modelo_base2)
valajus_base2 <- fitted(modelo_base2)
plot(valajus_base2, resid_base2, xlab = "Valores ajustados", ylab = "Residuos estandarizados", main = "Linealidad: Residuos vs. Valores ajustados")
abline(h = 0, col = "red")

#Gráfico QQ
qqnorm(resid_base2)
qqline(resid_base2)

El análisis de los gráficos revela ciertas observaciones importantes. En el gráfico de dispersión de los residuos estandarizados versus los valores ajustados, notamos una dispersión de puntos alrededor de una línea horizontal. Algunos puntos están próximos a la línea cero, mientras que otros se alejan más de ella. Además, esta dispersión tiende a incrementarse a medida que aumentan los valores ajustados, lo cual sugiere una posible discrepancia con el supuesto de linealidad.

En el gráfico QQ (Quantile-Quantile), la mayoría de los puntos se encuentran cercanos a la línea diagonal y siguen su patrón esperado. Sin embargo, algunos puntos empiezan a divergir notablemente de esta línea, adoptando una forma de “S” alargada. Esto sugiere que los residuos podrían no seguir una distribución normal en toda la gama de valores ajustados, presentando colas más pesadas o una distribución sesgada en comparación con una distribución normal estándar.

2. Normalidad de los residuos

# Histograma de residuos estandarizados
hist(resid_base2, breaks = 20, main = "Normalidad de los residuos: Histograma")

# Prueba de Shapiro-Wilk
shapiro.test(resid_base2)
## 
##  Shapiro-Wilk normality test
## 
## data:  resid_base2
## W = 0.78223, p-value < 2.2e-16

Según los resultados obtenidos de las pruebas de normalidad, se puede rechazar la hipótesis nula que sostiene que los datos se distribuyen de manera normal. Al observar el histograma, se aprecia una forma con características de campana, donde se destaca un pico alto y estrecho, junto con colas prolongadas. Las colas prolongadas indican la presencia de valores extremos en los datos, posiblemente atribuibles a valores atípicos o una mayor variabilidad en los datos.

La prueba Shapiro-Wilk, tiene un valor p asociado que es realmente pequeño \((< 2.2e^{-16})\), lo que significa lo cual sugiere altamente que es altamente improbable que los datos provengan de una distribución normal.

3. Homeostacidad

# Prueba de Breusch-Pagan
bp_testb2 <- bptest(modelo_base2)
bp_testb2
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_base2
## BP = 893.52, df = 5, p-value < 2.2e-16

El resultado del test de Breusch-Pagan revela que los errores presentan una varianza no constante, ya que el valor p asociado es muy bajo. Esto sugiere que el supuesto de homocedasticidad no se satisface en el modelo de regresión lineal múltiple analizado.

4. Independencia de los residuos

# Gráfico de autocorrelación de los residuos
acf(resid_base2)

# Prueba de Durbin-Watson
durbinWatsonTest(modelo_base2)
##  lag Autocorrelation D-W Statistic p-value
##    1     -0.03061408      2.061004   0.114
##  Alternative hypothesis: rho != 0

Debido a que el valor p es superior a cualquier nivel de significancia usual, como 0.05, no disponemos de evidencia suficiente para descartar la hipótesis nula de que no hay autocorrelación en los residuos. Esto indica que los residuos exhiben independencia entre sí y no muestran autocorrelación.

5. Ausencia de multicolinealidad

# Cálculo de factores de inflación de la varianza (VIF)
vif(modelo_base2)
##    areaconst      estrato       banios habitaciones parqueaderos 
##     2.088431     1.624197     2.514122     1.428028     1.742717

Cuando los valores de VIF son bajos y están por debajo de ciertos umbrales (generalmente 10), indica que no hay multicolinealidad significativa entre esas variables. De esta manera, se puede concluir que no hay preocupaciones relevantes de multicolinealidad en el modelo.

5.5. Predicciones

Para predecir el precio de la vivienda utilizando el modelo de regresión lineal identificado, vamos a proporcionar los valores de las características definidas por el cliente para el caso 1.

Ya que el estrato puede ser 5 o 6, vamos a ver el resultado con ambas posibilidades

caso2_1 <- data.frame(areaconst = 300, parqueaderos = 3, banios = 3, habitaciones = 5, estrato = 5)
caso2_2 <- data.frame(areaconst = 300, parqueaderos = 3, banios = 3, habitaciones = 5, estrato = 6)

Seguimos con la predicción del precio de la vivienda:

predprecio_c2_1 <- predict(modelo_base2, newdata = caso2_1)
predprecio_c2_2 <- predict(modelo_base2, newdata = caso2_2)
print(paste("El precio que se predice para el caso 1, con un estrato 5 es: ", predprecio_c2_1))
## [1] "El precio que se predice para el caso 1, con un estrato 5 es:  701.658882740237"
print(paste("El precio que se predice para el caso 1, con un estrato 6 es: ", predprecio_c2_2))
## [1] "El precio que se predice para el caso 1, con un estrato 6 es:  760.895087725248"

Según los resultados tenemos que se puede conseguir un apartamento con las características solicitadas por la compañía, ya sea en un estrato 5 o en un estrato 6. Los precios serían de aproximadamente $ 701.7M y $ 760.9M respectivamente, es decir, valores inferiores al crédito preaprobado.

5.6. Ofertas potenciales

Lo primero que se debe hacer es filtrar las viviendas que cumplan con las condiciones establecidas por la compañía internacional.

cond_base2 <- base2 %>%
  filter(
    areaconst >= 300,
    parqueaderos >= 3,
    banios >= 3,
    habitaciones >= 5,
    estrato %in% c(5,6),
    preciom <= 850
  )

Ahora, fijaremos una semilla para que el resultado no nos cambie a medida que ejcutamos el código. Y posteriormente generaremos las 5 ofertas potenciales.

set.seed(123)

if (nrow(cond_base2) > 0) {
  # Tomar 5 ofertas potenciales si hay observaciones
  ofertas_b2 <- cond_base2 %>%
    sample_n(5, replace = TRUE) # Usar sampling con reemplazo para evitar errores si el tamaño de cond_base2 < 5
  print(ofertas_b2)
} else {
  print("No hay observaciones que cumplan con todas las condiciones establecidas.")
}
## # A tibble: 5 × 13
##      id zona     piso estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  7512 Zona S…     3       5     670       300            3      5            6
## 2  7512 Zona S…     3       5     670       300            3      5            6
## 3  7512 Zona S…     3       5     670       300            3      5            6
## 4  7182 Zona S…     3       5     730       573            3      8            5
## 5  7512 Zona S…     3       5     670       300            3      5            6
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

Y, por último, graficaremos estas ofertas en un mapa que nos permita ver dónde quedan ubicadas las casas.

mapa_ofertasb2 <- leaflet(ofertas_b2) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud,
    lat = ~latitud,
    radius = 5, # Tamaño de los marcadores
    color = "blue", # Color de los marcadores
    popup = ~paste("Precio: $", preciom, "M") # Información emergente al hacer clic en los marcadores
  )

mapa_ofertasb2

6. CONCLUSIONES

  • El proyecto ha proporcionado un análisis detallado del mercado de casas en la zona norte y apartamentos en la zona sur, identificando tendencias, características clave y precios predominantes.

  • Se ha desarrollado un modelo de regresión lineal múltiple que puede predecir el precio de las casas y los apartamentos en función de variables como el área construida, el número de habitaciones, baños, estrato y parqueaderos. Este modelo ofrece a la Inmobiliaria C&A una herramienta sólida para estimar el valor de las propiedades y tomar decisiones fundamentadas.

  • Se han identificado oportunidades de inversión en la zona norte y en la zona sur, destacando áreas con mayor concentración de viviendas y precios competitivos. La Inmobiliaria C&A puede aprovechar estos hallazgos para expandir su cartera de propiedades o mejorar su posicionamiento en el mercado.

  • Aunque el modelo de regresión lineal múltiple cumple con muchos supuestos, se observaron algunas discrepancias en la linealidad y la normalidad de los residuos. La Inmobiliaria C&A debe considerar estas limitaciones al interpretar los resultados del modelo.

8. RECOMENDACIONES

  • Utilizando los resultados del análisis de regresión, la Inmobiliaria C&A puede segmentar el mercado de viviendas en función de las características más relevantes para los compradores, como el tamaño del área construida, el número de habitaciones y baños, y el estrato. Esto permitirá a la empresa adaptar su estrategia de marketing y ofrecer propiedades más alineadas con las preferencias específicas de cada segmento.

  • Utilizando el modelo de regresión desarrollado, la Inmobiliaria C&A puede ajustar sus estrategias de fijación de precios para reflejar de manera más precisa las características específicas de cada propiedad. Esto podría implicar la revisión de los precios de las viviendas en función de su área construida, el número de habitaciones y baños, y otras variables relevantes, con el objetivo de maximizar el retorno de la inversión.

  • Dado que el área construida y el número de baños emergieron como predictores significativos del precio de los apartamentos, la Inmobiliaria C&A podría explorar estrategias de diferenciación para destacar sus propiedades en el mercado. Esto podría implicar la promoción de apartamentos con características únicas, como diseños innovadores, acabados de alta calidad o comodidades adicionales, que agreguen valor percibido y justifiquen precios más altos.

  • La Inmobiliaria C&A puede utilizar los resultados del análisis de regresión para evaluar la competitividad de sus precios en relación con otras propiedades en las diferentes zonas. Al comparar el precio de sus viviendas con propiedades similares en términos de área construida, número de habitaciones y baños, y estrato, la empresa puede identificar oportunidades para ajustar sus precios y mejorar su posición en el mercado.