Introducción

El presente informe tiene como objetivo dar respuesta a la solicitud realizada por Maria para identificar ofertas de vivienda acordes con los requerimientos de dos clientes. Para ello, se emplean tecnicas de analisis exploratorio de datos, regresion lineal multiple, validacion de supuestos y prediccion, con el fin de generar recomendaciones sustentadas para cada caso.

Mod1 - Exploración de los datos

Seleccionamos las casas que se encuentran en la zona norte de la ciudad.

base1 <- vivienda %>%
  filter(tipo == "Casa",
         zona == "Zona Norte")

base1 <- as.data.frame(base1)
head(base1, 3)
##     id       zona piso estrato preciom areaconst parqueaderos banios
## 1 1209 Zona Norte   02       5     320       150            2      4
## 2 1592 Zona Norte   02       5     780       380            2      3
## 3 4057 Zona Norte   02       6     750       445           NA      7
##   habitaciones tipo barrio  longitud latitud
## 1            6 Casa  acopi -76.51341 3.47968
## 2            3 Casa  acopi -76.51674 3.48721
## 3            6 Casa  acopi -76.52950 3.38527

En términos generales, la mayor parte de los puntos geográficos se ubican dentro de la Zona Norte, lo que confirma que el filtro aplicado a la base de datos fue adecuado. Sin embargo, también se observan algunos registros localizados en áreas cercanas o ligeramente fuera de esta zona. Esto puede deberse a diferentes factores, como la forma en que se definen administrativamente las zonas de la ciudad, donde una vivienda puede estar clasificada como perteneciente a la Zona Norte aun cuando sus coordenadas se encuentren cerca de los límites. Asimismo, es posible que algunas coordenadas correspondan a ubicaciones aproximadas o que existan registros con clasificación incorrecta dentro de la base de datos.

library(leaflet)

map <- leaflet(base1) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud,
    lat = ~latitud,
    radius = 2,
    color = "blue")
  
map

Tipo de datos

Se observa la presencia de algunos valores faltantes (NA) en la variable parqueaderos, lo que indica que en ciertos registros no se dispone de información sobre el número de espacios de estacionamiento asociados a la vivienda. Esta situación podría requerir un tratamiento posterior, ya sea mediante imputación o mediante la exclusión de dichos registros, dependiendo del tipo de análisis que se desee realizar.

Por otra parte, la variable estrato aparece registrada como numérica, aunque en términos conceptuales representa una clasificación socioeconómica. Esto significa que, aunque esté almacenada como número en la base de datos, su interpretación corresponde a niveles o categorías que describen el contexto socioeconómico de la vivienda.

# se filtra la base1 para hacer análisis exploraratorio con las varibles de interés 

base1 <- base1 %>%
  select(preciom, areaconst, estrato, habitaciones, parqueaderos, banios)
str(base1, give.attr = FALSE)
## 'data.frame':    722 obs. of  6 variables:
##  $ preciom     : num  320 780 750 625 750 600 420 490 230 190 ...
##  $ areaconst   : num  150 380 445 355 237 160 200 118 160 435 ...
##  $ estrato     : num  5 5 6 4 5 4 5 5 3 3 ...
##  $ habitaciones: num  6 3 6 5 6 5 5 4 3 0 ...
##  $ parqueaderos: num  2 2 NA 3 2 1 4 2 NA NA ...
##  $ banios      : num  4 3 7 5 6 4 4 4 2 0 ...

Medidas de dispersión y centralidad de los datos

Las viviendas analizadas presentan una amplia dispersión en variables como precio y área construida, predominando inmuebles de estratos 4 y 5 con alrededor de 4 habitaciones, 3 baños y 2 parqueaderos.

descr(base1, 
      stats = c("mean", "med", "sd", "min", "q1", "q3", "max", "IQR", "cv"), 
      transpose = TRUE)
## Descriptive Statistics  
## base1  
## N: 722  
## 
##                        Mean   Median   Std.Dev     Min       Q1       Q3       Max      IQR     CV
## ------------------ -------- -------- --------- ------- -------- -------- --------- -------- ------
##          areaconst   264.85   240.00    167.17   30.00   140.00   337.00   1440.00   196.75   0.63
##             banios     3.56     3.00      1.52    0.00     2.00     4.00     10.00     2.00   0.43
##            estrato     4.20     4.00      0.98    3.00     3.00     5.00      6.00     2.00   0.23
##       habitaciones     4.51     4.00      1.83    0.00     3.00     5.00     10.00     2.00   0.41
##       parqueaderos     2.18     2.00      1.40    1.00     1.00     3.00     10.00     2.00   0.64
##            preciom   445.91   390.00    268.36   89.00   260.00   550.00   1940.00   288.75   0.60

Datos faltantes por atributo

En el conjunto de datos se observa que la única variable con valores faltantes es parqueaderos, la cual presenta 287 registros sin información, equivalentes aproximadamente al 39.75 % del total de observaciones. Por el contrario, las demás variables analizadas (preciom, areaconst, estrato, habitaciones y baños) no presentan datos faltantes. Esto sugiere que la información general de las viviendas es completa, aunque el número de parqueaderos podría requerir algún tratamiento previo antes de incluirse en análisis posteriores.

data.frame(
  NAN = colSums(is.na(base1)),
  Percent = round(colSums(is.na(base1)) / nrow(base1) * 100, 2)
)
##              NAN Percent
## preciom        0    0.00
## areaconst      0    0.00
## estrato        0    0.00
## habitaciones   0    0.00
## parqueaderos 287   39.75
## banios         0    0.00

Valores atípicos de atributos

Los boxplots evidencian la presencia de valores atípicos principalmente en las variables precio y área construida, lo que indica la existencia de viviendas considerablemente más costosas o de mayor tamaño que el promedio. En contraste, variables como estrato, habitaciones, parqueaderos y baños presentan menor dispersión y menos valores extremos, lo que sugiere una distribución más homogénea en estas características.

par(mar = c(8,4,4,2)) 

boxplot(base1,
        las = 2,
        main = "Boxplots de atributos",
        col = "blue",
        ylim = c(0, 2000))

Duplicidad de los datos

Son 17 registros duplicados en la base de datos.

 sum(duplicated(base1))
## [1] 17

Mod 1 - Limpieza de datos

En esta etapa se llevó a cabo un proceso de limpieza y depuración de la base de datos con el objetivo de mejorar su calidad antes de realizar el análisis estadístico y la estimación del modelo. En primer lugar, se corrigieron los registros que presentaban valores iguales a 0 en las variables habitaciones y baños, reemplazándolos por el valor 3, ya que en la práctica no es habitual que una vivienda tenga cero habitaciones o cero baños, por lo que estos valores se consideraron inconsistencias en la base.

Posteriormente, se abordó el problema de valores faltantes en la variable parqueaderos, los cuales fueron reemplazados por la mediana de la variable, con el fin de mantener la estructura de los datos sin afectar significativamente su distribución. Finalmente, se eliminaron los registros duplicados presentes en la base de datos, garantizando que cada observación represente una vivienda única. En conjunto, estos ajustes permiten contar con un conjunto de datos más confiable y adecuado para las etapas posteriores del análisis.

base1$habitaciones[base1$habitaciones == 0] <- 3

base1$banios[base1$banios == 0] <- 3  

Reemplazando los valores NA por la mediana

base1$parqueaderos[is.na(base1$parqueaderos)] <- 
  median(base1$parqueaderos, na.rm = TRUE)

Eliminación de datos duplicados

base1 <- base1[!duplicated(base1), ]

Gráfico de dispersión Precio vs Estrato con ajuste lineal y LOESS

El gráfico muestra que, en general, el precio de las viviendas tiende a aumentar a medida que incrementa el estrato socioeconómico. Tanto la línea del modelo lineal como la del ajuste flexible evidencian una tendencia positiva, lo que sugiere que las viviendas ubicadas en estratos más altos suelen presentar precios mayores, aunque existe cierta variabilidad en los valores observados.

La relación entre precio y estrato puede tratarse adecuadamente como numérica, ya que el ajuste local (LOESS) sigue muy de cerca la tendencia observada en la regresión lineal, lo que evidencia un incremento progresivo del precio a medida que aumenta el estrato y no muestra patrones de curvatura complejos. De esta forma, considerar el estrato como una variable numérica permite representar de manera sencilla su orden jerárquico natural dentro del modelo, evitando introducir múltiples categorías que podrían aumentar innecesariamente los grados de libertad y complicar la interpretación del análisis.

ggplot(base1, aes(x = estrato, y = preciom)) +
  geom_point(alpha = 0.4) +
  geom_smooth(method = "lm", se = FALSE, color = "blue") +      # línea lineal
  geom_smooth(method = "loess", se = FALSE, color = "red") +    # línea flexible
  labs(title = "Precio vs Estrato",
       x = "Estrato",
       y = "Precio")
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'

Matríz de dispersión y correlación entre las variables del modelo

La matriz de dispersión permite analizar simultáneamente la relación entre todas las variables del conjunto de datos. En la diagonal se observan las distribuciones de cada variable, mientras que en la parte inferior aparecen los gráficos de dispersión y en la parte superior los coeficientes de correlación entre cada par de variables.

Los resultados muestran que el precio de la vivienda presenta una fuerte correlación positiva con el área construida (0.729) y una relación moderada con estrato (0.607) y número de baños (0.558). Esto indica que las viviendas con mayor área, ubicadas en estratos más altos y con más baños tienden a tener precios más elevados.

Por otro lado, variables como habitaciones (0.362) y parqueaderos (0.306) presentan una correlación positiva, aunque más moderada, con el precio. Esto sugiere que estas características también influyen en el valor de la vivienda, pero en menor medida. En general, los resultados evidencian relaciones positivas entre la mayoría de las variables estructurales de la vivienda y su precio.

ggpairs(base1[,1:6], title=" ") 

Mod 1 - Estimación

El modelo de regresión lineal múltiple indica que el área construida, el estrato, los parqueaderos y el número de baños tienen una relación positiva y estadísticamente significativa con el precio de la vivienda. Esto significa que, a medida que aumenta cualquiera de estas características, el precio de la vivienda tiende a incrementarse.

Por otro lado, la variable habitaciones no resulta estadísticamente significativa, lo que sugiere que, manteniendo constantes las demás variables del modelo, su efecto sobre el precio no es relevante dentro de este análisis.

Asimismo, el modelo presenta un R² de 0.6536, lo que indica que aproximadamente el 65.36% de la variabilidad del precio de las viviendas es explicada por las variables incluidas en el modelo. Finalmente, el estadístico F significativo confirma que el modelo en su conjunto es adecuado para explicar la relación entre las características de las viviendas y su precio.

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

summary(mod1)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = base1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -905.80  -77.01  -17.02   46.58 1082.84 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -260.48369   32.04457  -8.129 1.98e-15 ***
## areaconst       0.78216    0.04545  17.211  < 2e-16 ***
## estrato        83.27302    7.39915  11.254  < 2e-16 ***
## habitaciones    3.19498    4.67920   0.683   0.4950    
## parqueaderos   16.00927    5.77287   2.773   0.0057 ** 
## banios         28.05011    5.78712   4.847 1.55e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 158.9 on 696 degrees of freedom
## Multiple R-squared:  0.6536, Adjusted R-squared:  0.6511 
## F-statistic: 262.6 on 5 and 696 DF,  p-value: < 2.2e-16

Mod 1 - Validación de Supuestos

Los gráficos de diagnóstico permiten evaluar si el modelo de regresión lineal cumple con los supuestos básicos. En el gráfico Residuals vs Fitted se observa que los residuos se distribuyen alrededor de cero, aunque se aprecia cierta dispersión creciente para valores ajustados más altos. Esto sugiere una posible presencia de heterocedasticidad.

El gráfico Q-Q Residuals muestra que los puntos se alinean aproximadamente con la línea teórica en la parte central, aunque en los extremos se presentan desviaciones, lo que indica que la normalidad de los residuos se cumple parcialmente, pero existen algunos valores atípicos.

En el gráfico Scale-Location se observa una ligera tendencia creciente en la dispersión de los residuos, lo que refuerza la posibilidad de varianza no constante en algunos niveles del modelo.

Finalmente, el gráfico Residuals vs Leverage permite identificar posibles observaciones influyentes. Aunque se observan algunos puntos alejados, la mayoría de las observaciones se concentran dentro de los límites de la distancia de Cook, lo que sugiere que no existen observaciones extremadamente influyentes que comprometan gravemente el modelo.

En general, el modelo presenta un comportamiento razonable, aunque podrían explorarse transformaciones o ajustes adicionales para mejorar el cumplimiento de algunos supuestos.

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

El estadístico Durbin-Watson (DW = 1.6243) junto con un p-valor muy pequeño (2.528e-07) indica evidencia de autocorrelación positiva en los residuos del modelo, lo que sugiere que el supuesto de independencia de los errores podría no cumplirse completamente.

dwtest(mod1)
## 
##  Durbin-Watson test
## 
## data:  mod1
## DW = 1.6243, p-value = 2.528e-07
## alternative hypothesis: true autocorrelation is greater than 0

Mod 1 - Predicción del Precio

La predicción del modelo indica que una vivienda con 200 m² de área construida, 4 habitaciones, 1 parqueadero y 2 baños tendría un precio aproximado de 313.93 millones en estrato 4 y 397.20 millones en estrato 5, lo que muestra que el incremento del estrato se asocia con un aumento en el precio estimado de la vivienda.

precio <- data.frame(
  areaconst = c(200, 200),
  estrato = c(4, 5),
  habitaciones = c(4, 4),
  parqueaderos = c(1, 1),
  banios = c(2, 2)
)


predict(mod1, newdata = precio)
##        1        2 
## 313.9295 397.2025

Oferta de Casas

A partir del filtrado realizado sobre la base de datos, se identificaron varias viviendas que cumplen con las condiciones establecidas en la solicitud. Especificamente, se seleccionaron propiedades de tipo casa ubicadas en la Zona Norte, con estrato 4, area construida menor o igual a 200 m², al menos 4 habitaciones, 2 banos y 1 parqueadero, y con un precio igual o inferior a 350 millones de pesos.

Los resultados muestran que existen varias alternativas en el mercado que se ajustan a estas caracteristicas y que se encuentran dentro del presupuesto disponible. Estas viviendas representan opciones potenciales para ser consideradas en la recomendacion final, ya que cumplen simultaneamente con los criterios de ubicacion, caracteristicas fisicas y capacidad de financiamiento definidos en el analisis.

ofertas_viables <- vivienda %>%
  filter( tipo == "Casa",
          areaconst <= 200,
          parqueaderos == 1,
          banios >= 2,
          habitaciones == 4,
          estrato == 4,
          zona == "Zona Norte",
          preciom <= 350
        )

ofertas_viables <- as.data.frame(ofertas_viables)
head(ofertas_viables, 5)
##     id       zona piso estrato preciom areaconst parqueaderos banios
## 1 1666 Zona Norte   02       4     275       120            1      2
## 2  464 Zona Norte   02       4     330       165            1      4
## 3 4471 Zona Norte   02       4     340       162            1      4
## 4 1055 Zona Norte <NA>       4     280       147            1      3
## 5 1107 Zona Norte <NA>       4     330       140            1      3
##   habitaciones tipo    barrio  longitud latitud
## 1            4 Casa    alamos -76.51700 3.47500
## 2            4 Casa el bosque -76.49657 3.45140
## 3            4 Casa el bosque -76.53188 3.48770
## 4            4 Casa la merced -76.50880 3.48699
## 5            4 Casa la merced -76.51057 3.48113

Mod2 - Exploración de los datos

Selección de los apartamentos ubicados al sur de la ciudad de Cali.

base2 <- vivienda %>%
  filter(tipo == "Apartamento",
         zona == "Zona Sur")

base2 <- as.data.frame(base2)
head(base2, 3)
##     id     zona piso estrato preciom areaconst parqueaderos banios habitaciones
## 1 5098 Zona Sur   05       4     290        96            1      2            3
## 2  698 Zona Sur   02       3      78        40            1      1            2
## 3 8199 Zona Sur <NA>       6     875       194            2      5            3
##          tipo     barrio  longitud latitud
## 1 Apartamento      acopi -76.53464 3.44987
## 2 Apartamento aguablanca -76.50100 3.40000
## 3 Apartamento  aguacatal -76.55700 3.45900

la mayoría de las viviendas se concentra en la zona sur de la ciudad de Cali, lo cual confirma que el filtro aplicado a la base de datos es consistente con la información analizada. Sin embargo, también se identifican algunos puntos ubicados en áreas cercanas a los límites de esta zona o en sectores periféricos de la ciudad.

mapA <- leaflet(base2) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud,
    lat = ~latitud,
    radius = 2,
    color = "green"
  )

mapA

Tipo de datos

La base de datos utilizada para este análisis está conformada por 2787 observaciones y 6 variables, todas registradas como variables numéricas. Estas variables corresponden al precio de la vivienda, área construida, estrato socioeconómico, número de habitaciones, número de parqueaderos y número de baños, las cuales representan características estructurales relevantes de los inmuebles.

La estructura de los datos es adecuada para el análisis estadístico y la construcción de modelos de regresión, ya que las variables seleccionadas están directamente relacionadas con la determinación del precio de la vivienda. No obstante, se observa la presencia de valores faltantes (NA) en la variable parqueaderos, lo que indica que en algunos registros no se dispone de información sobre el número de espacios de estacionamiento asociados a la vivienda. Por lo tanto, será necesario considerar un tratamiento para estos valores faltantes en las etapas posteriores del análisis.

base2 <- base2 %>%
  select(preciom, areaconst, estrato, habitaciones, parqueaderos, banios)
str(base2, give.attr = FALSE)
## 'data.frame':    2787 obs. of  6 variables:
##  $ preciom     : num  290 78 875 135 135 220 210 105 115 220 ...
##  $ areaconst   : num  96 40 194 117 78 75 72 68 58 84 ...
##  $ estrato     : num  4 3 6 3 3 4 3 3 3 4 ...
##  $ habitaciones: num  3 2 3 3 3 3 3 3 2 3 ...
##  $ parqueaderos: num  1 1 2 NA NA 1 2 NA 1 NA ...
##  $ banios      : num  2 1 5 2 1 2 2 2 2 2 ...

Medidas de dispersión y centralidad de los datos

Las estadísticas descriptivas muestran que las viviendas analizadas presentan, en promedio, 97 m² de área construida, cerca de 3 habitaciones y alrededor de 2 baños, ubicadas principalmente en estratos entre 4 y 5. Asimismo, el precio promedio es cercano a 297 millones de pesos, aunque se observa una alta variabilidad en esta variable, lo que indica la presencia de viviendas con características y valores muy diferentes dentro de la muestra.

descr(base2, 
      stats = c("mean", "med", "sd", "min", "q1", "q3", "max", "IQR", "cv"), 
      transpose = TRUE)
## Descriptive Statistics  
## base2  
## N: 2787  
## 
##                        Mean   Median   Std.Dev     Min       Q1       Q3       Max      IQR     CV
## ------------------ -------- -------- --------- ------- -------- -------- --------- -------- ------
##          areaconst    97.47    85.00     52.57   40.00    65.00   110.00    932.00    45.00   0.54
##             banios     2.49     2.00      0.93    0.00     2.00     3.00      8.00     1.00   0.38
##            estrato     4.63     5.00      0.84    3.00     4.00     5.00      6.00     1.00   0.18
##       habitaciones     2.97     3.00      0.63    0.00     3.00     3.00      6.00     0.00   0.21
##       parqueaderos     1.41     1.00      0.67    1.00     1.00     2.00     10.00     1.00   0.47
##            preciom   297.29   245.00    191.55   75.00   175.00   335.00   1750.00   160.00   0.64

Datos faltantes por atributo

El análisis de datos faltantes muestra que la única variable con valores ausentes es parqueaderos, la cual presenta 406 registros faltantes, equivalentes al 14.57% del total de observaciones. En contraste, las demás variables analizadas no presentan valores perdidos, lo que indica que la base de datos es en general consistente, aunque será necesario considerar algún tratamiento para los valores faltantes en parqueaderos antes de continuar con el análisis.

data.frame(
  NAN = colSums(is.na(base2)),
  Percent = round(colSums(is.na(base2)) / nrow(base2) * 100, 2)
)
##              NAN Percent
## preciom        0    0.00
## areaconst      0    0.00
## estrato        0    0.00
## habitaciones   0    0.00
## parqueaderos 406   14.57
## banios         0    0.00

Valores atípicos de atributos

Los boxplots permiten identificar la presencia de valores atípicos principalmente en las variables precio y área construida, lo que indica que existen viviendas con valores considerablemente más altos que la mayoría de las observaciones. En contraste, variables como estrato, habitaciones, parqueaderos y baños presentan menor dispersión y una distribución más concentrada, lo que sugiere una mayor homogeneidad en estas características dentro del conjunto de datos.

par(mar = c(8,4,4,2)) 

boxplot(base2,
        las = 2,
        main = "Boxplots de atributos",
        col = "green",
        ylim = c(0, 2000))

Duplicidad de los datos

Son 398 registros duplicados en la base de datos.

 sum(duplicated(base2))
## [1] 398

Mod 2 - Limpieza de datos

En esta etapa se realizó un proceso de depuración y preparación de los datos con el objetivo de mejorar la calidad de la información antes de realizar el análisis estadístico. En primer lugar, se corrigieron los registros que presentaban valores iguales a 0 en las variables habitaciones y baños, reemplazándolos por valores más coherentes con la realidad de una vivienda. Posteriormente, los valores faltantes en la variable parqueaderos fueron reemplazados utilizando la mediana, lo que permite conservar la distribución de los datos sin introducir sesgos significativos.

Adicionalmente, se aplicó un filtro al área construida, conservando únicamente aquellas viviendas con valores entre 40 y 500 metros cuadrados, con el fin de eliminar observaciones poco realistas o extremas que pudieran afectar el análisis. Finalmente, se eliminaron los registros duplicados presentes en la base de datos, garantizando que cada observación corresponda a una vivienda única y mejorando así la consistencia del conjunto de datos para las etapas posteriores del estudio.

base2$habitaciones[base2$habitaciones == 0] <- 3

base2$banios[base2$banios == 0] <- 2  

Reemplazando los valores NA por la mediana

base2$parqueaderos[is.na(base2$parqueaderos)] <- 
  median(base2$parqueaderos, na.rm = TRUE)
base2 <- base2[base2$areaconst >= 40 & base2$areaconst <= 500, ]

Eliminación de datos duplicados

base2 <- base2[!duplicated(base2), ]

Se crearon variables indicadoras o variables dummy a partir de la variable estrato, con el fin de representar cada nivel de estrato dentro del modelo. Específicamente, se generaron tres nuevas variables: D1, D2 y D3, que toman el valor de 1 cuando la vivienda pertenece al estrato 4, 5 o 6 respectivamente, y 0 en caso contrario.

Este procedimiento permite incorporar la información del estrato en el modelo de manera más flexible, facilitando la comparación entre diferentes niveles socioeconómicos y permitiendo evaluar cómo cambia el precio de la vivienda según el estrato al que pertenece.

base2$D1 <- as.numeric(base2$estrato == 4)
base2$D2 <- as.numeric(base2$estrato == 5)
base2$D3 <- as.numeric(base2$estrato == 6)

Matriz de correlación entre las variables del modelo

La matriz de dispersión permite analizar de forma simultánea las relaciones entre todas las variables incluidas en el modelo, tanto las variables estructurales de la vivienda como las variables dummy creadas para representar los diferentes estratos. En la diagonal se observan las distribuciones de cada variable, en la parte inferior aparecen los gráficos de dispersión, y en la parte superior se presentan los coeficientes de correlación entre cada par de variables.

Los resultados muestran que el precio de la vivienda presenta una relación positiva fuerte con el área construida (0.822), lo que indica que las viviendas con mayor tamaño tienden a tener precios más altos. Asimismo, se observa una relación positiva importante entre el precio y variables como número de baños (0.723) y parqueaderos (0.686), lo que sugiere que estas características también influyen en el valor de la vivienda.

En cuanto a las variables dummy de estrato, se observa que D3 (estrato 6) presenta una correlación positiva con el precio (0.684), lo que indica que las viviendas pertenecientes a este estrato suelen tener precios más elevados. Por el contrario, D1 (estrato 4) muestra una relación negativa con el precio (-0.363), lo que sugiere que las viviendas de este estrato tienden a tener valores más bajos en comparación con estratos superiores.

En general, la matriz evidencia que las características físicas de la vivienda, como el área construida, los baños y los parqueaderos, junto con el nivel de estrato, tienen una relación relevante con el precio, lo que respalda su inclusión en el modelo de regresión para explicar el comportamiento del valor de los inmuebles.

ggpairs(base2[, c(1,2,4,5,6,7,8,9)], title = " ")

Mod 2 - Estimación de los Aptos

El modelo de regresión lineal múltiple muestra que varias de las variables incluidas tienen una influencia significativa en el precio de la vivienda. En particular, el área construida, el número de baños, los parqueaderos y las variables dummy asociadas al estrato (D1, D2 y D3) presentan coeficientes positivos y estadísticamente significativos, lo que indica que incrementos en estas características se asocian con mayores precios de las viviendas.

Por otro lado, la variable habitaciones presenta un coeficiente negativo, lo que sugiere que, manteniendo constantes las demás variables del modelo, un mayor número de habitaciones podría estar asociado con una ligera disminución en el precio, posiblemente debido a que viviendas con muchas habitaciones no necesariamente implican mayor área o mejores características.

Asimismo, el modelo presenta un R² de 0.8142, lo que significa que aproximadamente el 81.42% de la variabilidad del precio de las viviendas es explicada por las variables incluidas en el modelo, evidenciando un buen nivel de ajuste. Finalmente, el estadístico F altamente significativo confirma que el modelo en su conjunto es adecuado para explicar el comportamiento del precio de las viviendas dentro de la muestra analizada.

mod2  <-lm(formula = preciom ~ areaconst + habitaciones + banios + parqueaderos + D1 + D2 + D3, data = base2)
summary(mod2)
## 
## Call:
## lm(formula = preciom ~ areaconst + habitaciones + banios + parqueaderos + 
##     D1 + D2 + D3, data = base2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -438.93  -37.67    1.29   35.90  808.76 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -21.19521   10.79747  -1.963   0.0498 *  
## areaconst      2.05320    0.05981  34.329  < 2e-16 ***
## habitaciones -25.55160    3.49696  -7.307 3.75e-13 ***
## banios        28.15407    3.13070   8.993  < 2e-16 ***
## parqueaderos  46.09713    3.65563  12.610  < 2e-16 ***
## D1            29.53274    7.25876   4.069 4.89e-05 ***
## D2            49.66236    7.39936   6.712 2.41e-11 ***
## D3           192.75856    9.20155  20.948  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 86.41 on 2313 degrees of freedom
## Multiple R-squared:  0.8142, Adjusted R-squared:  0.8137 
## F-statistic:  1448 on 7 and 2313 DF,  p-value: < 2.2e-16

Mod 2 - Validación de Supuestos

Los gráficos de diagnóstico permiten evaluar si el modelo cumple con los supuestos de la regresión lineal. En el gráfico Residuals vs Fitted se observa que los residuos se distribuyen alrededor de cero, lo que indica un ajuste razonable del modelo, aunque se aprecia una ligera dispersión creciente en valores ajustados altos. El gráfico Q-Q Residuals muestra que la mayoría de los puntos sigue la línea teórica, lo que sugiere que la normalidad de los residuos se cumple de manera aproximada, aunque existen algunas desviaciones en los extremos. Finalmente, el gráfico Residuals vs Leverage evidencia que la mayoría de las observaciones no presenta una influencia excesiva sobre el modelo. En general, el modelo presenta un comportamiento adecuado, aunque podrían existir algunos valores atípicos o ligera heterocedasticidad.

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

El estadístico Durbin-Watson (DW = 1.6981) junto con un p-valor muy pequeño (1.247e-13) indica evidencia de autocorrelación positiva en los residuos del modelo, lo que sugiere que el supuesto de independencia de los errores podría no cumplirse completamente.

dwtest(mod2)
## 
##  Durbin-Watson test
## 
## data:  mod2
## DW = 1.6981, p-value = 1.247e-13
## alternative hypothesis: true autocorrelation is greater than 0

Mod 2 - Predicción del Precio

Las predicciones del modelo indican que un apartamento con 300 m² de área construida, 5 habitaciones, 3 parqueaderos y 3 baños tendría un precio aproximado de 739.42 millones si pertenece al estrato 5 y 882.52 millones si pertenece al estrato 6. Estos resultados muestran que, manteniendo constantes las demás características del apartamento, un mayor estrato socioeconómico se asocia con un aumento en el precio estimado del inmueble, lo que refleja la influencia del nivel socioeconómico en el valor de las propiedades.

precio2 <- data.frame(
  areaconst = c(300, 300),
  habitaciones = c(5, 5),
  parqueaderos = c(3, 3),
  banios = c(3, 3),
  D1 = c(0,0),   # estrato 4
  D2 = c(1,0),   # estrato 5
  D3 = c(0,1)    # estrato 6
)

predict(mod2, newdata = precio2)
##        1        2 
## 739.4226 882.5188

El filtrado permitió identificar dos apartamentos que cumplen con las características solicitadas, ubicados en la Zona Sur, con estrato 5, área construida menor o igual a 300 m², al menos 5 habitaciones, 2 baños y 3 parqueaderos, y con un precio inferior a 850 millones de pesos. Estas propiedades representan opciones viables dentro del presupuesto establecido, por lo que podrían considerarse como alternativas potenciales para satisfacer la solicitud planteada.

ofertas_viables2 <- vivienda %>%
  filter( tipo == "Apartamento",
          areaconst <= 300,
          parqueaderos >= 3,
          banios >= 2,
          habitaciones >= 5,
          estrato == 5,
          zona == "Zona Sur",
          preciom <= 850
        )

ofertas_viables2 <- as.data.frame(ofertas_viables2)
head(ofertas_viables2, 5)
##     id     zona piso estrato preciom areaconst parqueaderos banios habitaciones
## 1 7512 Zona Sur <NA>       5     670       300            3      5            6
## 2 8036 Zona Sur <NA>       5     530       256            3      5            5
##          tipo    barrio  longitud latitud
## 1 Apartamento seminario -76.55000 3.40900
## 2 Apartamento seminario -76.55408 3.40748

Ubicación en el mapa

oferta2 <- data.frame(
  lat = c(3.40900, 3.40748),
  long = c(-76.55000 , -76.49657)
)

# Crea un mapa
mapA2 <- leaflet(oferta2) %>%
  addTiles() %>%
  addMarkers(
    lng = ~long,
    lat = ~lat,
   
      )

mapA2 # Muestra el mapa

Conclusiones generales

A partir de los análisis realizados y de los modelos estimados, se observa que el modelo 2 presenta un mejor desempeño explicativo que el modelo 1. Mientras el primer modelo logra explicar aproximadamente el 65.36 % de la variación del precio de las viviendas, el segundo modelo alcanza un R² cercano al 81.42 %, lo que evidencia un ajuste superior y una mayor capacidad para describir el comportamiento del precio de los inmuebles.

Una de las principales razones de esta mejora radica en la forma en que se incorporó la variable estrato dentro del modelo. En el primer modelo se consideró como una variable numérica continua, asumiendo una relación lineal directa con el precio. En cambio, en el segundo modelo se utilizaron variables dummy para representar los distintos estratos, lo que permitió capturar de manera más precisa las diferencias entre cada nivel socioeconómico y su efecto específico sobre el precio de la vivienda.

Adicionalmente, los resultados muestran que variables como el área construida, el número de baños, los parqueaderos y el nivel de estrato tienen una influencia importante en la determinación del precio de los inmuebles. Esto confirma que tanto las características físicas de la vivienda como su ubicación socioeconómica son factores relevantes en el mercado inmobiliario.

En cuanto a las solicitudes analizadas para la compra de viviendas en la ciudad de Cali, se identificó que existe una mayor disponibilidad de opciones en el caso de las casas, donde se encontraron varias ofertas que cumplen con las condiciones establecidas. Por el contrario, en el caso de los apartamentos, el número de alternativas que satisfacen simultáneamente los criterios definidos es menor, lo que limita las opciones disponibles para la toma de decisión. En conjunto, el análisis permite orientar de manera más informada la selección de propiedades que se ajusten tanto a las características requeridas como al presupuesto establecido.