Introducción

El presente informe tiene como objetivo dar respuesta a la solicitud realizada por María, mediante la aplicación de técnicas de modelación estadística y analítica de datos. En este documento se analizan detalladamente los dos casos planteados, utilizando metodologías cuantitativas que permitan evaluar su comportamiento, identificar patrones relevantes y generar conclusiones fundamentadas.

1. Entendimiento de los datos - Mod1 Casas

library(dplyr)
library(leaflet)
library(ggplot2)
library(summarytools)
library(knitr)
library(mice)
# devtools::install_github("centromagis/paqueteMODELOS", force = TRUE)
library(paqueteMODELOS)
library(corrplot)
library(tidyverse)
library(GGally)
library(lmtest)
data("vivienda")

Selección de casas ubicadas 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 general, la mayoría de los puntos se concentran en el Zona Norte, lo cual valida el filtro aplicado. No obstante, se identifican algunos registros en zonas periféricas, lo que podría explicarse por:

Definición administrativa de zona, es decir, el registro puede estar catalogado como “Zona Norte” aunque sus coordenadas estén en el límite.

Errores en coordenadas, Coordenadas aproximadas

Registros atípicos, podrían existir registros mal clasificados en la base de datos.

library(leaflet)

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

Tipo de datos de cada atributo y estructura general

Se identifican valores faltantes (NA) en el atributo categórico parqueaderos Adicional, la variable estrato está clasificada como dato numérico.

# 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

Se identifica que hay inmubles con 0 habitaciones o 0 baños, lo cual no es común en la realidad.

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

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 muestran una alta dispersión y presencia de valores atípicos en las variables precio y área construida, lo cual es totalmente factible y esperado en el mercado inmobiliario. Los inmuebles no son bienes homogéneo.

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

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

Resgistros duplicados en el conjunto de datos

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

a. Limpieza de datos - Mod1 Casas

Se remplazan con la mediana los valores en 0 de los atributos banios y habitaciones, no es comun encontrar inmubles sin estas característica. En ambos casos la mediana de los atributos es equivalente a 3

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

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

Los datos faltantes de el atributo parqueadero se remplazan con la mediana

# Reemplazar NA en la variable parqueadero por la mediana
base1$parqueaderos[is.na(base1$parqueaderos)] <- 
  median(base1$parqueaderos, na.rm = TRUE)

Se eliminan registros duplicados

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

La relación entre Precio y Estrato se justifica como numérica dado que la línea de ajuste local (LOESS) sigue de cerca la trayectoria de la regresión lineal, validando una tendencia ascendente proporcional sin curvaturas complejas. Este enfoque simplifica el modelo al utilizar un solo coeficiente para capturar el orden jerárquico natural de los datos, evitando la dispersión de grados de libertad que implicaría categorizarlos.

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")

Asociación entre las variables cuantitativas

Los gráficos de correlación y distribución revelan que el precio de las viviendas tiene una relación lineal positiva muy fuerte con el área construida (\(0.731\)) y moderada con el estrato (\(0.612\)), mientras que todas las variables presentan una asimetría positiva marcada, concentrando la mayoría de las unidades en rangos de precios y tamaños bajos con una “cola” de propiedades de lujo. Se observa una correlación significativa entre los predictores, especialmente entre habitaciones y baños (\(0.576\)), lo que sugiere una posible multicolinealidad que debe vigilarse en el modelo de regresión múltiple. Finalmente, las gráficas de densidad confirman que los datos no siguen una distribución normal, validando la necesidad de evaluar transformaciones para estabilizar la varianza del modelo.

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

b. Estimación - Mod1 Casas

El modelo muestra que área construida (β=0.7828; p<2e-16), estrato (β=83.27; p<2e-16), parqueaderos (β=16.01; p=0.0057) y baños (β=28.05; p=1.55e-06) son estadísticamente significativos, mientras que habitaciones no lo es (β=3.19; p=0.495). Esto implica que, manteniendo constantes las demás variables, un aumento de 1 unidad en área incrementa el precio en 0.78 unidades, un nivel adicional de estrato aumenta el precio en 83.27, un parqueadero adicional en 16.01 y un baño adicional en 28.05, resultados lógicos en el mercado inmobiliario; la no significancia de habitaciones podría deberse a colinealidad con área. El modelo tiene un R²=0.6536 (R² ajustado=0.6511), por lo que explica el 65.36% de la variación del precio, lo que indica un buen ajuste para datos sociales; podría mejorarse incluyendo variables como ubicación, antigüedad o transformaciones logarítmicas para capturar no linealidades.

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

c. validación de supuestos

Normalidad: En el gráfico Q-Q los residuos se apartan de la línea en las colas (especialmente la derecha), lo que indica que no hay normalidad perfecta y existen valores atípicos

Varianza constante (Homoscedasticidad): En Residuals vs Fitted y Scale-Location se observa una ligera forma de embudo creciente; la dispersión aumenta cuando crecen los valores ajustados, lo que sugiere posible heterocedasticidad leve (la varianza no parece completamente constante).

Independecia El estadístico Durbin-Watson = 1.6243 es menor que 2 y el p-value = 2.528e-07 (< 0.05), por lo que se rechaza la hipótesis nula de independencia.

Sería recomendable usar errores estándar robustos o considerar una transformación (por ejemplo log del precio) para mejorar el ajuste del modelo.

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

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

d. Predecir precio de la casa

Oferta 1 = 313.93 → Precio estimado si la vivienda es estrato 4

Ofertad 2 = 397.20 → Precio estimado si la vivienda es estrato 5

(Suponiendo que preciom está en millones, serían $314 millones y $397 millones).

Con base en el modelo, la vivienda en estrato 4 tiene un precio estimado de 314 millones, por lo que se ajusta al crédito máximo de 350 millones. En cambio, en estrato 5 el precio estimado es 397 millones, superando el límite aprobado. Por tanto, se recomienda optar por estrato 4 o reducir características como área o número de baños si se desea mantener estrato 5.

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

Identificación de inmuebles para oferta real.

Para responder a la solicitud de compra, el análisis determinó que el enfoque debe centrarse en viviendas de Estrato 4 en la Zona Norte, ya que el modelo estadístico estima para estas un precio de $313.92 millones, lo que se ajusta perfectamente al crédito preaprobado de $350 millones, a diferencia del Estrato 5 que excede el presupuesto con una valoración de $397.20 millones. Bajo este criterio, se identificaron 5 ofertas potenciales en los barrios El Bosque, La Merced y Álamos, destacando especialmente las propiedades en El Bosque por ofrecer hasta 4 baños y metrajes superiores a los 160 \(m^2\), posicionándose como las opciones que mejor equilibran el confort deseado y la viabilidad financiera; estas viviendas representan una oportunidad estratégica de negociación, dado que sus precios de mercado son competitivos frente a la predicción del modelo y aseguran que la inversión del cliente esté respaldada por las dinámicas reales de valorización de la zona norte de Cali.

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
oferta <- data.frame(
  lat = c(3.47500, 3.45140, 3.48770, 3.48699, 3.48113),
  long = c(-76.51700, -76.49657, -76.53188 , -76.50880 , -76.51057)
)

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

map1 # Muestra el mapa

2. Entendimiento de los datos - Mod2 Apartamento

Selección de apartamentos ubicados en la zona sur de la ciudad Santiago 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

En general, la mayoría de los puntos se concentran en el Zona sur, lo cual valida el filtro aplicado. No obstante, se identifican algunos registros en zonas periféricas, lo que podría explicarse por:

Definición administrativa de zona, es decir, el registro puede estar catalogado como “Zona Norte” aunque sus coordenadas estén en el límite.

Errores en coordenadas, Coordenadas aproximadas

Registros atípicos, podrían existir registros mal clasificados en la base de datos.

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

mapA

Tipo de datos de cada atributo y estructura general

Se identifican valores faltantes (NA) en el atributo categórico parqueaderos Adicional, la variable estrato está clasificada como dato numérico.

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


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

Se identifica que hay inmubles con 0 habitaciones o 0 baños, lo cual no es común en la realidad.

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 14% de los datos del atributo parqueaderos son faltantes

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 muestran una alta dispersión y presencia de valores atípicos en las variable área construida, se evidencian apartamentos con ares cercana a los 1000 metros cuadrados. En cuanto al atributo preciom se evidencian valores atípicos, apartamentos con precio superior a 1.500 millones, estos datos son plausibes por la zona donde se ubican los inmubles.

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

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

Resgistros duplicados en el conjunto de datos

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

a. Limpieza de datos - Mod2 Apto

Se remplazan con la mediana los valores en 0 de los atributos banios y habitaciones, no es comun encontrar inmubles sin estas característica.

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

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

Los datos faltantes de el atributo parqueadero se remplazan con la mediana

# Reemplazar NA en la variable parqueadero por la mediana
base2$parqueaderos[is.na(base2$parqueaderos)] <- 
  median(base2$parqueaderos, na.rm = TRUE)

Se realizó un tratamiento de los valores atípicos en el atributo área construida para los apartamentos. Considerando que el promedio del área construida es de 98 m², se identificaron valores extremos que podían afectar el análisis. Por ello, se aplicó un proceso de depuración de datos con el fin de conservar únicamente valores representativos del mercado, dejando en la base apartamentos con áreas construidas aproximadas entre 40 y 500 m².

En cuanto al atributo preciom, no se hizo trataiento a los datos atípicos por ser valores reales.

base2 <- base2[base2$areaconst >= 40 & base2$areaconst <= 500, ]

Se eliminan registros duplicados

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

La variable estrato, aunque originalmente se encuentra en formato numérico, representa una variable categórica, ya que cada valor corresponde a una categoría socioeconómica y no a una escala numérica continua. Por esta razón, se decidió crear manualmente variables dummy (binarias) a partir de dicha variable, con el fin de representar adecuadamente cada categoría dentro del modelo de regresión lineal múltiple.

ESTRATO 3 = categoría queda como referencia (la base del modelo). D1 = ESTRATO 4 D2 = ESTRATO 5 D3 = ESTRATO 6

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

Asociación entre las variables cuantitativas

La matriz de correlaciones muestra que el precio del apartamento (preciom) tiene una relación positiva fuerte con área construida (0.822), baños (0.723) y parqueaderos (0.686), lo que indica que viviendas más grandes y con más comodidades tienden a tener mayor valor. También se observa una correlación moderada con habitaciones (0.328). Entre las variables explicativas destaca la relación entre área y baños (0.731) y área y parqueaderos (0.627), lo que sugiere que las viviendas de mayor tamaño concentran más servicios. En cuanto a las variables dummy, D3 presenta una correlación positiva con el precio (0.684) mientras D1 muestra una relación negativa (-0.363), indicando diferencias de precio según la categoría representada.

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

b. Estimación - Mod2 Apartamentos

El modelo de regresión lineal muestra que el precio de la vivienda se explica principalmente por el área construida, cuyo coeficiente es 2.05, indicando que por cada unidad adicional de área el precio aumenta en promedio 2.05 millones, manteniendo constantes las demás variables. También se observa que cada baño adicional incrementa el precio en 28.15 millones y cada parqueadero en 46.10 millones, mientras que una habitación adicional reduce el precio en 25.55 millones, posiblemente porque viviendas con muchas habitaciones suelen tener menor área por espacio. En cuanto a las variables de estrato representadas por dummies, D1 aumenta el precio en 29.53 millones, D2 en 49.66 millones y D3 en 192.76 millones respecto a la categoría base, lo que evidencia una fuerte diferencia de valor según el estrato. Todos los coeficientes son estadísticamente significativos (p < 0.05). El modelo presenta un R² de 0.8142 y un R² ajustado de 0.8137, lo que indica que aproximadamente el 81.4% de la variación del precio de la vivienda es explicada por las variables incluidas, mostrando un muy buen nivel de ajuste del modelo.

El modelo presenta un buen desempeño (R² = 0.814), pero puede mejorarse incorporando variables adicionales y revisando algunos supuestos del modelo. En primer lugar, se podrían incluir variables estructurales del inmueble como antigüedad, tipo de vivienda, área del lote o presencia de zonas comunes

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

c. validación de supuestos

Los supuestos del modelo de regresión no se cumplen satisfactoriamente: la Normalidad se rechaza visualmente en el gráfico Q-Q Residuals, donde los puntos se alejan drásticamente de la diagonal en los extremos, indicando colas pesadas. La varianza constante (homocedasticidad) falla, ya que los gráficos Residuals vs Fitted y Scale-Location muestran un patrón de “embudo” con una dispersión que aumenta junto a los valores ajustados. La independencia no se cumple, pues la prueba de Durbin-Watson arroja un estadístico DW=1.6981 con un p-value=1.247×10−13, lo que evidencia una autocorrelación positiva estadísticamente significativa que invalida el supuesto de errores aleatorios independientes

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

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

d. Predecir precio del apartamento

La predicción del modelo indica que el precio estimado varía según el estrato. Para la oferta 1, donde D2 = (estrato 5) el modelo estima un precio de 739.42 millones de pesos. En la oferta 2, donde D3 = (estrato 6), el precio estimado aumenta a 882.52 millones de pesos. Esto muestra que, manteniendo constantes las características físicas del inmueble, el estrato influye significativamente en el valor de la vivienda, generando una diferencia aproximada de 143 millones de pesos entre un apartamento de estrato 5 y uno de estrato 6 con las mismas características.

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

Identificación de inmuebles para oferta real.

Para atender la solicitud de compra de la Vivienda 2, el análisis se centró en apartamentos ubicados en la zona sur, con características cercanas a 300 m² de área, alrededor de 5 habitaciones, 3 baños y 3 parqueaderos, considerando que el inmueble podría pertenecer a estrato 5 o 6. Con base en el modelo de regresión, se estimó un precio aproximado de $739.42 millones para estrato 5 y $882.52 millones para estrato 6, por lo que, dado el presupuesto disponible de $850 millones, resulta más viable enfocar la búsqueda en apartamentos de estrato 5. Bajo estos criterios se identificaron dos ofertas potenciales ubicadas en el barrio Seminario (Zona Sur): la primera corresponde a un apartamento de 300 m², 6 habitaciones, 5 baños y 3 parqueaderos con un precio de $670 millones, y la segunda a un apartamento de 256 m², 5 habitaciones, 5 baños y 3 parqueaderos con un precio de $530 millones.

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
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

Análisis general

El modelo 1 (mod1) para predecir el precio de las casas obtuvo un R² = 0.6536, mientras que el modelo 2 (mod2) para estimar el precio de los apartamentos alcanzó un R² = 0.8142, lo que indica que el segundo modelo presenta una mayor capacidad explicativa y un mejor ajuste, logrando explicar aproximadamente el 81.4 % de la variación del precio, frente al 65.4 % explicado por el primer modelo. Una de las razones que podría explicar este mejor desempeño es la forma en que se incorporó la variable estrato: en el mod2 se construyeron variables dummy para las categorías de estrato (3, 4, 5 y 6), permitiendo capturar diferencias específicas entre cada categoría, mientras que en el mod1 el estrato se trató como una variable numérica continua, asumiendo implícitamente que su efecto sobre el precio sigue una relación lineal creciente y proporcional. Sin embargo, en la realidad del mercado inmobiliario esta relación puede presentar saltos o diferencias no lineales entre estratos, por lo que el uso de variables dummy permite representar mejor estas variaciones, contribuyendo así a una predicción más precisa del precio de los apartamentos en el segundo modelo.

Con referencia a las solicitudes recibidas por María para asesorar la compra de dos viviendas destinadas a empleados de una compañía internacional, el análisis de la base de datos permitió identificar que existe una mayor disponibilidad de ofertas que cumplen con las condiciones en el caso de las casas. En particular, se encontraron cinco inmuebles tipo casa que se ajustan a las características solicitadas, lo que brinda al cliente un mayor margen de elección y posibilidades de negociación dentro del mercado. En contraste, para el caso de apartamentos solo se identificaron dos propiedades que cumplen con los criterios establecidos, lo que reduce las alternativas disponibles y limita la capacidad de comparación entre opciones.