1 Informe Caso C&A

El presente informe tiene como objetivo estimar el precio de viviendas utilizando un modelo de regresión lineal múltiple a partir de variables estructurales de los inmuebles como área construida, número de habitaciones, baños, parqueaderos y estrato socioeconómico.

Se empleó una base de datos de 8.322 registros de viviendas ubicadas en diferentes zonas de la ciudad, inicialmente se realizó un análisis exploratorio para comprender la distribución de las variables y su relación con el precio de la vivienda.

Posteriormente se estimó un modelo de regresión lineal múltiple con el fin de identificar los factores que influyen en el precio de los inmuebles, el modelo fue evaluado mediante pruebas de supuestos como normalidad, homocedasticidad y linealidad.

El modelo se utilizó para realizar predicciones de precios y para identificar ofertas reales del mercado que cumplen con ciertos criterios de precio y área construida.

Los resultados muestran que el área construida, el número de baños, el número de habitaciones y el estrato socioeconómico son variables relevantes en la determinación del precio de la vivienda.

2 Anexo 1. Plan de trabajo

La metodología aplicada para el desarrollo del análisis se estructuró en las siguientes etapas:

  1. Obtención de los datos

Se utilizó una base de datos de viviendas en la ciudad de Cali que contiene información sobre características estructurales de los inmuebles como área construida, número de habitaciones, baños, parqueaderos, estrato socioeconómico y ubicación geográfica.

  1. Limpieza y exploración de datos

Se realizó una revisión de la estructura del dataset, identificación de variables relevantes y análisis exploratorio mediante gráficos y estadísticas descriptivas.

  1. Selección de variables

Se identificaron las variables potencialmente explicativas del precio de la vivienda.

  1. Estimación del modelo

Se estimó un modelo de regresión lineal múltiple utilizando el precio como variable dependiente.

  1. Validación del modelo

Se evaluaron los supuestos del modelo mediante análisis de residuos, normalidad y homocedasticidad.

  1. Predicción

El modelo estimado se utilizó para realizar predicciones de precios y analizar ofertas reales del mercado.

3 Anexo 2. Resultados de la modelación, validación y comparación de modelos

3.1 Explorarcion de los datos

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")=List of 3
##   ..$ cols   :List of 13
##   .. ..$ id          : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ zona        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ piso        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ estrato     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ preciom     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ areaconst   : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ parqueaderos: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ banios      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ habitaciones: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ tipo        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ barrio      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ longitud    : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ latitud     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   ..$ default: list()
##   .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
##   ..$ delim  : chr ";"
##   ..- attr(*, "class")= chr "col_spec"
##  - attr(*, "problems")=<externalptr>
summary(vivienda)
##        id           zona               piso              estrato     
##  Min.   :   1   Length:8322        Length:8322        Min.   :3.000  
##  1st Qu.:2080   Class :character   Class :character   1st Qu.:4.000  
##  Median :4160   Mode  :character   Mode  :character   Median :5.000  
##  Mean   :4160                                         Mean   :4.634  
##  3rd Qu.:6240                                         3rd Qu.:5.000  
##  Max.   :8319                                         Max.   :6.000  
##  NA's   :3                                            NA's   :3      
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 330.0   Median : 123.0   Median : 2.000   Median : 3.000  
##  Mean   : 433.9   Mean   : 174.9   Mean   : 1.835   Mean   : 3.111  
##  3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##  NA's   :2        NA's   :3        NA's   :1605     NA's   :3       
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:8322        Length:8322        Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.54  
##  Median : 3.000   Mode  :character   Mode  :character   Median :-76.53  
##  Mean   : 3.605                                         Mean   :-76.53  
##  3rd Qu.: 4.000                                         3rd Qu.:-76.52  
##  Max.   :10.000                                         Max.   :-76.46  
##  NA's   :3                                              NA's   :3       
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498  
##  NA's   :3
colSums(is.na(vivienda))
##           id         zona         piso      estrato      preciom    areaconst 
##            3            3         2638            3            2            3 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##         1605            3            3            3            3            3 
##      latitud 
##            3

El conjunto de datos analizado contiene 8,322 observaciones y 13 variables, correspondientes a registros de viviendas con características estructurales, geográficas y socioeconómicas.

En cuanto a la tipología de variables, se identifican variables numéricas continuas (precio, área construida, coordenadas geográficas), discretas (baños, habitaciones, parqueaderos, estrato) y categóricas (zona, tipo de vivienda, barrio y piso), no obstante, algunas variables categóricas se encuentran almacenadas como texto en lugar de factores, lo cual requiere transformación previa para su uso en modelos predictivos.

El análisis descriptivo de la variable objetivo, correspondiente al precio de la vivienda expresado en millones, evidencia una alta dispersión. Se observa un valor mínimo de 58 millones, un máximo de 1,999 millones y una media de 433.9 millones, esta amplitud sugiere la presencia de asimetría positiva y posibles valores atípicos, lo que indica que la distribución del precio probablemente no sigue una distribución normal y podría requerir transformaciones para su modelación adecuada.

Respecto a la calidad de los datos, se detectan valores faltantes en varias variables, destacan especialmente las variables piso (2638 valores faltantes) y parqueaderos (1605 valores faltantes), lo cual representa proporciones considerables de ausencia de información y sugiere la necesidad de aplicar técnicas de imputación o tratamiento específico según la relevancia predictiva de dichas variables, otras variables presentan una cantidad mínima de datos faltantes, lo que no representa un problema significativo.

Adicionalmente, se identifican inconsistencias estructurales en algunas variables, tales como registros con cero baños o cero habitaciones, estos valores no son plausibles, por lo que es razonable interpretarlos como errores de registro o valores faltantes.

3.2 Limpieza y preparación de datos

vivienda_clean <- vivienda %>%
  
  # convertir a factor
  mutate(
    zona = as.factor(zona),
    tipo = as.factor(tipo),
    barrio = as.factor(barrio),
    piso = as.factor(piso)
  ) %>%
  
  # valores imposibles → NA
  mutate(
    banios = ifelse(banios == 0, NA, banios),
    habitaciones = ifelse(habitaciones == 0, NA, habitaciones)
  ) %>%
  
  # imputación simple robusta
  mutate(
    parqueaderos = ifelse(is.na(parqueaderos),
                          median(parqueaderos, na.rm=TRUE),
                          parqueaderos),
    
    banios = ifelse(is.na(banios),
                    median(banios, na.rm=TRUE),
                    banios),
    
    habitaciones = ifelse(is.na(habitaciones),
                          median(habitaciones, na.rm=TRUE),
                          habitaciones)
  ) %>%
  
  # eliminar filas con NA críticos
  drop_na(preciom, areaconst, estrato)

Previo a la estimación de modelos estadísticos, se debe realizar un proceso de limpieza y adecuación del conjunto de datos con el fin de garantizar consistencia, validez semántica y calidad analítica de la información, inicialmente, se transformaron las variables categóricas (zona, tipo de vivienda, barrio y piso) al tipo de dato factor, dado que su representación original como texto impediría su correcta utilización dentro de modelos de regresión.

Posteriormente, se efectuó un control de coherencia sobre variables estructurales de la vivienda, se identificaron registros con valores iguales a cero en las variables número de baños y número de habitaciones, los cuales carecen de sentido dentro del dominio inmobiliario, en consecuencia, dichos valores fueron tratados como datos faltantes, asumiendo que corresponden a errores de digitación.

Con el fin de preservar el tamaño muestral y evitar sesgos derivados de la eliminación masiva de observaciones, los valores faltantes en variables cuantitativas relevantes (parqueaderos, baños y habitaciones) fueron imputados mediante la mediana muestral, esta estrategia se considera robusta frente a distribuciones asimétricas y presencia de valores atípicos, características comunes en bases de datos inmobiliarias.

Finalmente, se eliminaron únicamente aquellos registros que presentaban valores faltantes en variables críticas para el modelado (precio, área construida y estrato), dado que la ausencia de estos atributos impide cualquier estimación válida.

Como resultado de este proceso se obtuvo una base depurada y consistente, apta para el análisis estadístico y la estimación de modelos de regresión lineal múltiple.

3.3 1 Filtro a la base de datos

base1 <- vivienda_clean %>%
  filter(tipo == "Casa",
         zona == "Zona Norte")
head(base1,3)
## # A tibble: 3 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <fct>   <fct>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1209 Zona N… 02          5     320       150            2      4            6
## 2  1592 Zona N… 02          5     780       380            2      3            3
## 3  4057 Zona N… 02          6     750       445            2      7            6
## # ℹ 4 more variables: tipo <fct>, barrio <fct>, longitud <dbl>, latitud <dbl>
table(base1$tipo)
## 
## Apartamento        Casa 
##           0         722
table(base1$zona)
## 
##  Zona Centro   Zona Norte   Zona Oeste Zona Oriente     Zona Sur 
##            0          722            0            0            0
summary(base1$latitud)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   3.333   3.452   3.468   3.460   3.482   3.496
summary(base1$longitud)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -76.59  -76.53  -76.52  -76.52  -76.50  -76.47
plot_ly(
  base1,
  x = ~longitud,
  y = ~latitud,
  type = "scatter",
  mode = "markers",
  text = ~paste("Precio:", preciom,
                "<br>Area:", areaconst,
                "<br>Barrio:", barrio),
  marker = list(size = 6)
)

Se realizó un proceso de filtrado sobre la base depurada con el objetivo de seleccionar únicamente las observaciones correspondientes a viviendas tipo casa ubicadas en la zona norte de la ciudad con un resultado de 722 registros.

La verificación de la consistencia del filtro se llevó a cabo mediante tablas de frecuencia para las variables tipo y zona, los resultados evidenciaron que todas las observaciones corresponden a viviendas tipo casa y que todas pertenecen a la zona norte, confirmando la correcta aplicación.

La inspección de los primeros registros permitió corroborar que las variables numéricas presentan valores posibles dentro del contexto inmobiliario, sin evidencia de datos faltantes ni inconsistencias estructurales.

Se construyó una visualización geoespacial utilizando las coordenadas de latitud y longitud disponibles en el conjunto de datos, el mapa muestra una concentración espacial coherente de los registros, formando un patrón compacto sin observaciones dispersas fuera del área esperada.

3.4 2 Análisis exploratorio

plot_ly(base1,
        x = ~areaconst,
        y = ~preciom,
        color = ~estrato,
        type = "scatter",
        mode = "markers") %>%
  layout(
    xaxis = list(title = "Área construida (m²)"),
    yaxis = list(title = "Precio (millones de pesos)"),
    legend = list(title = list(text = "Estrato"))
  )
cor(base1[,c("preciom","areaconst","estrato","banios","habitaciones","parqueaderos")])
##                preciom areaconst   estrato    banios habitaciones parqueaderos
## preciom      1.0000000 0.7313480 0.6123503 0.5585036    0.3614330    0.3033762
## areaconst    0.7313480 1.0000000 0.4573818 0.5029157    0.4272849    0.2586839
## estrato      0.6123503 0.4573818 1.0000000 0.4243331    0.1038405    0.2039056
## banios       0.5585036 0.5029157 0.4243331 1.0000000    0.5905484    0.3060827
## habitaciones 0.3614330 0.4272849 0.1038405 0.5905484    1.0000000    0.2067401
## parqueaderos 0.3033762 0.2586839 0.2039056 0.3060827    0.2067401    1.0000000

Se realizó un análisis exploratorio con el fin de evaluar la relación entre el precio de la vivienda y sus principales características estructurales y socioeconómicas, el gráfico de dispersión entre el precio y el área construida evidencia una relación positiva clara, indicando que viviendas con mayor superficie tienden a presentar precios más altos. Esta tendencia es consistente con la teoría económica del mercado inmobiliario, donde el tamaño del inmueble constituye uno de los principales determinantes del valor.

La representacion de colores por estrato socioeconómico muestra que los valores más elevados de precio se concentran en estratos superiores, lo que sugiere una influencia significativa del nivel socioeconómico sobre la valoración del inmueble.

Por otra parte se observa asimismo que la dispersión aumenta conforme crece el área, lo que indica la presencia de heterocedasticidad potencial y mayor variabilidad de precios en viviendas de gran tamaño.

Para complementar el análisis visual, se calculó la matriz de correlación entre la variable respuesta y los predictores cuantitativos.

Los resultados evidencian que el área construida presenta la mayor asociación lineal con el precio (r = 0.73), seguida del estrato (r = 0.61) y el número de baños (r = 0.56), estas magnitudes sugieren que dichas variables constituyen los predictores más influyentes dentro del conjunto analizado, en contraste, el número de parqueaderos (r = 0.30) y de habitaciones (r = 0.36) muestran relaciones más moderadas.

3.5 3 Estimación del modelo de regresión lineal múltiple

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

summary(modelo)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones + 
##     parqueaderos, data = base1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -907.61  -78.52  -16.44   46.93 1083.04 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -262.70888   31.17897  -8.426  < 2e-16 ***
## areaconst       0.78647    0.04456  17.648  < 2e-16 ***
## estrato        84.49022    7.23261  11.682  < 2e-16 ***
## banios         27.61511    5.70976   4.836 1.62e-06 ***
## habitaciones    2.82393    4.57807   0.617  0.53754    
## parqueaderos   15.63461    5.69019   2.748  0.00615 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 157.5 on 716 degrees of freedom
## Multiple R-squared:  0.6578, Adjusted R-squared:  0.6554 
## F-statistic: 275.2 on 5 and 716 DF,  p-value: < 2.2e-16

Se estimó un modelo de regresión lineal múltiple con el objetivo de explicar el precio de las viviendas en función de sus características estructurales y socioeconómicas, el modelo resultó globalmente significativo (F = 275.2, p < 0.001), lo que indica que el conjunto de variables explicativas posee capacidad predictiva sobre la variable respuesta.

El coeficiente de determinación fue R² = 0.6578 (R² ajustado = 0.6554), lo que implica que aproximadamente el 66% de la variabilidad observada en el precio de las viviendas es explicada por las variables incluidas en el modelo.

El área construida presentó un efecto positivo y altamente significativo (β = 0.79, p < 0.001), indicando que cada metro cuadrado adicional incrementa el precio promedio en aproximadamente 0.79 millones de pesos. El estrato socioeconómico también mostró una influencia considerable (β = 84.49, p < 0.001), sugiriendo que un aumento de una unidad en el estrato se asocia con un incremento promedio de 84.5 millones de pesos en el valor del inmueble.

El número de baños resultó estadísticamente significativo (β = 27.62, p < 0.001), evidenciando que esta característica constituye un determinante relevante del precio, el número de parqueaderos presentó un efecto positivo significativo (β = 15.63, p = 0.006), aunque de menor magnitud relativa.

Por otra parte el número de habitaciones no resultó estadísticamente significativo (p = 0.538), lo cual sugiere que, una vez controlado el efecto del área construida y otras variables estructurales, esta característica no aporta información adicional relevante para explicar el precio.

3.6 4 Validación de supuestos

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

Se evaluaron los supuestos del modelo de regresión lineal mediante gráficos diagnósticos de residuos, el análisis del gráfico de residuos frente a valores ajustados muestra una ligera tendencia sistemática y un incremento en la dispersión de los errores a medida que aumenta el valor predicho, lo cual sugiere la presencia de heterocedasticidad moderada.

El gráfico cuantil–cuantil indica que los residuos siguen aproximadamente una distribución normal en la región central, aunque se observan desviaciones en los extremos, lo que evidencia colas ligeramente pesadas asociadas a observaciones atípicas, sin embargo la desviación no es lo suficientemente pronunciada como para invalidar la aplicabilidad del modelo.

El gráfico de escala–localización confirma la presencia de heterocedasticidad, dado que la variabilidad de los residuos estandarizados aumenta con el nivel de predicción.

El análisis de residuos frente a leverage revela la existencia de algunas observaciones influyentes, aunque ninguna presenta un efecto desproporcionado sobre la estimación de los coeficientes.

Se puede decir que los resultados indican que el modelo cumple razonablemente los supuestos de linealidad y normalidad, pero presenta evidencia moderada de heterocedasticidad.

Como posibles mejoras metodológicas, se recomienda considerar transformaciones de la variable respuesta (por ejemplo, logaritmo del precio), estimación con errores robustos o el uso de modelos alternativos que permitan varianza no constante.

3.7 5 Predicción del precio de la vivienda

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

predict(modelo, newdata = nueva)
##        1 
## 399.1964

Se estimó el precio esperado de una vivienda con las características especificadas en la solicitud mediante el modelo de regresión lineal múltiple previamente ajustado, el valor predicho fue de 399.2 millones de pesos, lo cual representa el precio promedio esperado bajo condiciones de mercado similares a las observadas en la base de datos analizada.

Al comparar este resultado con el presupuesto máximo disponible de 350 millones de pesos, se evidencia que el valor estimado excede la capacidad de financiamiento en aproximadamente 49 millones, esto sugiere que las características solicitadas corresponden a un inmueble superior al rango presupuestal establecido

***Considerando el coeficiente estimado para el área construida, se puede inferir que una reducción aproximada de 62 metros cuadrados permitiría ajustar el precio esperado al límite presupuestal sin modificar las demás características estructurales. Este resultado resalta la relevancia del tamaño del inmueble como principal determinante del precio dentro del modelo.

3.8 6 Ofertas reales del mercado

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

nrow(ofertas1)
## [1] 39
head(ofertas1,5)
## # A tibble: 5 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <fct>   <fct>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  7471 Zona N… <NA>        4     330       240            2      4            4
## 2  4210 Zona N… 01          5     350       200            3      3            4
## 3  4267 Zona N… 01          5     335       202            1      4            5
## 4  4800 Zona N… 01          5     340       250            2      4            4
## 5  4209 Zona N… 02          5     350       300            3      5            6
## # ℹ 4 more variables: tipo <fct>, barrio <fct>, longitud <dbl>, latitud <dbl>
top5_1 <- ofertas1 %>%
  arrange(preciom, desc(areaconst)) %>%
  head(5)

top5_1
## # A tibble: 5 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <fct>   <fct>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1020 Zona N… 02          4     230       250            2      3            5
## 2  1009 Zona N… <NA>        5     250       243            1      4            5
## 3  7432 Zona N… 01          4     260       280            2      4            6
## 4  4727 Zona N… 02          4     296       232            2      6            4
## 5  1914 Zona N… 02          5     300       205            2      5            6
## # ℹ 4 more variables: tipo <fct>, barrio <fct>, longitud <dbl>, latitud <dbl>
library(leaflet)

leaflet(top5_1) %>%
  addTiles() %>%
  addCircleMarkers(~longitud, ~latitud,
                   radius = 6,
                   color = "blue",
                   stroke = FALSE,
                   fillOpacity = 0.9,
                   popup = ~paste0(
                     "<b>Precio:</b> ", preciom, " millones",
                     "<br><b>Área:</b> ", areaconst, " m²",
                     "<br><b>Estrato:</b> ", estrato,
                     "<br><b>Habitaciones:</b> ", habitaciones,
                     "<br><b>Baños:</b> ", banios,
                     "<br><b>Parqueaderos:</b> ", parqueaderos,
                     "<br><b>Barrio:</b> ", barrio
                   ))

El mapa interactivo generado muestra la distribución geográfica de las ofertas filtradas según los criterios de la solicitud 1 (precio ≤ 350 millones y área construida ≥ 150 m²), localizadas dentro de la base previamente depurada y restringida a viviendas tipo casa en la zona norte de la ciudad.

Visualmente se observa que la mayoría de los puntos se concentran en el sector norte–noroccidental del área urbana, lo cual es coherente con el filtro aplicado sobre la variable categórica zona.

Esta concentración sugiere que el conjunto de datos presenta consistencia espacial entre la clasificación categórica y las coordenadas geográficas registradas.

En términos de oferta, se identificaron 5 propiedades potencialmente elegibles, lo cual indica que el mercado disponible dentro del rango presupuestal solicitado es relativamente amplio, esto favorece la probabilidad de encontrar alternativas que optimicen simultáneamente precio, tamaño y características estructurales.

3.9 7 Segunda solicitud de $850 millones

3.9.1 1 Filtro a la base de datos

base2 <- vivienda_clean %>%
  filter(tipo == "Apartamento",
         zona == "Zona Sur")
head(base2,3)
## # A tibble: 3 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <fct>   <fct>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  5098 Zona S… 05          4     290        96            1      2            3
## 2   698 Zona S… 02          3      78        40            1      1            2
## 3  8199 Zona S… <NA>        6     875       194            2      5            3
## # ℹ 4 more variables: tipo <fct>, barrio <fct>, longitud <dbl>, latitud <dbl>
table(base2$tipo)
## 
## Apartamento        Casa 
##        2787           0
table(base2$zona)
## 
##  Zona Centro   Zona Norte   Zona Oeste Zona Oriente     Zona Sur 
##            0            0            0            0         2787
summary(base2$latitud)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   3.334   3.370   3.383   3.390   3.406   3.497
summary(base2$longitud)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -76.57  -76.54  -76.53  -76.53  -76.52  -76.46
plot_ly(
  base2,
  x = ~longitud,
  y = ~latitud,
  type = "scatter",
  mode = "markers",
  text = ~paste("Precio:", preciom,
                "<br>Area:", areaconst,
                "<br>Barrio:", barrio),
  marker = list(size = 6)
)

Se realizó el filtrado de la base de datos para seleccionar exclusivamente apartamentos ubicados en la Zona Sur de la ciudad, el subconjunto resultante contiene 2.787 observaciones, todas correspondientes a la categoría Apartamento y a la zona objetivo, lo cual confirma la correcta aplicación del criterio de selección.

El análisis preliminar evidencia una alta heterogeneidad en términos de precio, área construida y estrato socioeconómico, lo que sugiere un mercado amplio y diversificado dentro del sector sur, los rangos de latitud y longitud se encuentran dentro de valores coherentes para la ubicación geográfica esperada, sin indicios de errores de georreferenciación.

El tamaño considerable del subconjunto favorece la estabilidad estadística en etapas posteriores de modelado y permite realizar estimaciones con mayor nivel de confianza en comparación con segmentos de mercado más pequeños.

3.9.2 2 Análisis exploratorio

plot_ly(base2,
        x = ~areaconst,
        y = ~preciom,
        color = ~estrato,
        type = "scatter",
        mode = "markers") %>%
  layout(
    xaxis = list(title = "Área construida (m²)"),
    yaxis = list(title = "Precio (millones de pesos)"),
    legend = list(title = list(text = "Estrato"))
  )
cor(base2[,c("preciom","areaconst","estrato","banios","habitaciones","parqueaderos")])
##                preciom areaconst   estrato    banios habitaciones parqueaderos
## preciom      1.0000000 0.7579955 0.6727067 0.7307938    0.3454114    0.5357706
## areaconst    0.7579955 1.0000000 0.4815593 0.6789678    0.4522052    0.4472369
## estrato      0.6727067 0.4815593 1.0000000 0.5717600    0.2133095    0.3021866
## banios       0.7307938 0.6789678 0.5717600 1.0000000    0.5212821    0.4300994
## habitaciones 0.3454114 0.4522052 0.2133095 0.5212821    1.0000000    0.1708171
## parqueaderos 0.5357706 0.4472369 0.3021866 0.4300994    0.1708171    1.0000000

El análisis exploratorio de los apartamentos ubicados en la zona sur muestra una relación positiva clara entre el área construida y el precio del inmueble, en el gráfico de dispersión se observa que, a medida que aumenta el tamaño del apartamento, el precio tiende a incrementarse, lo cual es consistente con el comportamiento esperado en el mercado inmobiliario.

Al diferenciar los puntos por estrato socioeconómico se evidencia que los apartamentos pertenecientes a estratos más altos tienden a concentrarse en niveles de precio superiores, incluso cuando presentan áreas similares a las de estratos más bajos, esto sugiere que el estrato captura parcialmente el efecto de la ubicación y de la calidad del entorno urbano.

La matriz de correlación respalda estas observaciones, mostrando que el precio presenta una fuerte relación positiva con el área construida (0.758), así como correlaciones importantes con el número de baños (0.731) y con el estrato (0.673). De igual manera, las variables parqueaderos (0.536) y habitaciones (0.345) presentan asociaciones positivas moderadas con el precio, los resultados sugieren que el valor de los apartamentos depende tanto de sus características físicas como del contexto socioeconómico en el que se encuentran.

3.9.3 3 Estimación del modelo de regresión lineal múltiple

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

summary(modelo2)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones + 
##     parqueaderos, data = base2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1220.18   -45.92    -1.84    42.15   930.76 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -313.07217   13.76231 -22.749   <2e-16 ***
## areaconst       1.43389    0.04945  28.996   <2e-16 ***
## estrato        68.89369    2.66828  25.820   <2e-16 ***
## banios         50.49365    3.11622  16.204   <2e-16 ***
## habitaciones  -16.90343    3.54826  -4.764    2e-06 ***
## parqueaderos   50.62045    3.16578  15.990   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 95.02 on 2781 degrees of freedom
## Multiple R-squared:  0.7544, Adjusted R-squared:  0.7539 
## F-statistic:  1708 on 5 and 2781 DF,  p-value: < 2.2e-16

Con el fin de cuantificar la relación entre el precio y las características de los apartamentos, se estimó un modelo de regresión lineal múltiple en el cual el precio en millones de pesos se explica a partir del área construida, el estrato, el número de baños, el número de habitaciones y la cantidad de parqueaderos.

Los resultados muestran que todas las variables incluidas en el modelo son estadísticamente significativas, con valores p inferiores a 0.001, en particular, el área construida tiene un coeficiente positivo de aproximadamente 1.43, lo que indica que por cada metro cuadrado adicional el precio del apartamento aumenta en promedio 1.43 millones de pesos, manteniendo constantes las demás variables.

El estrato presenta también un efecto positivo considerable, ya que subir un nivel de estrato incrementa el precio en aproximadamente 68.9 millones de pesos, el número de baños y de parqueaderos tiene efectos positivos cercanos a 50 millones de pesos por unidad adicional, reflejando la importancia de estos atributos en la valoración del inmueble.

Por otro lado, el número de habitaciones presenta un coeficiente negativo, lo cual puede interpretarse como un efecto de redistribución del espacio interno, manteniendo constante el área total, un mayor número de habitaciones implica espacios más pequeños, lo que podría reducir ligeramente el valor percibido del apartamento.

En términos de ajuste global, el modelo presenta un coeficiente de determinación R² de aproximadamente 0.754, lo que indica que cerca del 75.4% de la variabilidad observada en los precios es explicada por las variables incluidas en el modelo.

3.9.4 4 Validación de supuestos

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

La evaluación de los supuestos del modelo se realizó mediante los gráficos de diagnóstico tradicionales de regresión lineal.

El gráfico de residuos versus valores ajustados muestra que los residuos se distribuyen alrededor de cero, aunque se observa cierta dispersión creciente a medida que aumentan los valores ajustados, lo cual sugiere la posible presencia de heterocedasticidad moderada.

El gráfico Q-Q indica que los residuos siguen razonablemente la distribución normal en la parte central, aunque se observan desviaciones en los extremos, lo que puede deberse a la presencia de algunos valores atípicos asociados a propiedades de muy alto valor o tamaño.

El gráfico Scale-Location confirma la ligera tendencia creciente en la variabilidad de los residuos, mientras que el gráfico de residuos versus leverage muestra algunos puntos con mayor influencia potencial sobre el modelo, aunque la mayoría de las observaciones se mantienen dentro de los límites aceptables definidos por la distancia de Cook.

Los resultados sugieren que el modelo cumple de manera razonable los supuestos básicos de la regresión lineal, con pequeñas desviaciones que son comunes en datos provenientes del mercado inmobiliario.

3.9.5 5 Predicción del precio de la vivienda

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

predict(modelo2, newdata = nueva)
##        1 
## 749.2831

Utilizando el modelo estimado, se realizó la predicción del precio para un apartamento con las características solicitadas por el cliente, área construida de 300 metros cuadrados, tres baños, cinco habitaciones, tres parqueaderos y un estrato socioeconómico entre 5 y 6, el resultado obtenido indica un precio estimado cercano a 749 millones de pesos, este valor se encuentra dentro del presupuesto máximo aprobado de 850 millones de pesos, lo cual sugiere que, desde la perspectiva del modelo estadístico, el inmueble solicitado es económicamente viable dentro de las condiciones establecidas por el cliente.

3.9.6 6 Ofertas reales del mercado

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

nrow(ofertas2)
## [1] 2
head(ofertas2,5)
## # A tibble: 2 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <fct>   <fct>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  7182 Zona S… <NA>        5     730       573            3      8            5
## 2  7512 Zona S… <NA>        5     670       300            3      5            6
## # ℹ 4 more variables: tipo <fct>, barrio <fct>, longitud <dbl>, latitud <dbl>
top5_2 <- ofertas2 %>%
  arrange(preciom, desc(areaconst)) %>%
  head(5)

top5_2
## # A tibble: 2 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <fct>   <fct>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  7512 Zona S… <NA>        5     670       300            3      5            6
## 2  7182 Zona S… <NA>        5     730       573            3      8            5
## # ℹ 4 more variables: tipo <fct>, barrio <fct>, longitud <dbl>, latitud <dbl>
leaflet(top5_2) %>%
  addTiles() %>%
  addCircleMarkers(~longitud, ~latitud,
                   radius = 6,
                   color = "red",
                   stroke = FALSE,
                   fillOpacity = 0.9,
                   popup = ~paste0(
                     "<b>Precio:</b> ", preciom, " millones",
                     "<br><b>Área:</b> ", areaconst, " m²",
                     "<br><b>Estrato:</b> ", estrato,
                     "<br><b>Habitaciones:</b> ", habitaciones,
                     "<br><b>Baños:</b> ", banios,
                     "<br><b>Parqueaderos:</b> ", parqueaderos,
                     "<br><b>Barrio:</b> ", barrio
                   ))

Finalmente, se realizó un filtrado de la base de datos con el fin de identificar ofertas reales del mercado que cumplieran simultáneamente con las características solicitadas por el cliente, incluyendo el presupuesto máximo, el área mínima, el número de habitaciones, baños y parqueaderos, así como el rango de estrato requerido.

El análisis permitió identificar un conjunto de propiedades que satisfacen estos criterios, lo cual indica que el mercado inmobiliario en la zona sur ofrece dos alternativas viables dentro de las condiciones establecidas.

La visualización de estas ofertas mediante un mapa interactivo facilita además la identificación de su distribución espacial dentro de la ciudad, permitiendo complementar el análisis cuantitativo con una perspectiva geográfica que puede apoyar la toma de decisiones del comprador.