Maria comenzó como agente de bienes raíces en Cali hace 10 años. Después de laborar dos años para una empresa nacional, se traslado a Bogotá y trabajó para otra agencia de bienes raíces. Sus amigos y familiares la convencieron de que con su experiencia y conocimientos del negocio debía abrir su propia agencia. Terminó por adquirir la licencia de intermediario y al poco tiempo fundó su propia compañía, C&A (Casas y Apartamentos) en Cali. Santiago y Lina, dos vendedores de la empresa anterior aceptaron trabajar en la nueva compaña. En la actualidad ocho agentes de bienes raíces colaboran con ella en C&A.
Actualmente las ventas de bienes raíces en Cali se han visto disminuidas de manera significativa en lo corrido del año. Durante este periodo muchas instituciones bancarias de ahorro y vivienda están prestando grandes sumas de dinero para la industria y la construcción comercial y residencial. Cuando el efecto producto de las tensiones políticas y sociales disminuya, se espera que la actividad económica de este sector se reactive.
Hace dos días, María recibió una carta solicitando asesoría para la compra de dos viviendas por parte de una compañía internacional que desea ubicar a dos de sus empleados con sus familias en la ciudad. Las solicitudes incluyen las siguientes condiciones:
| Características | Vivienda_1 | Vivienda_2 |
|---|---|---|
| Tipo | Casa | Apartamento |
| Área construida (m2) | 200 | 300 |
| Parqueaderos | 1 | 3 |
| Baños | 2 | 3 |
| Habitaciones | 4 | 5 |
| Estrato | 4 o 5 | 5 o 6 |
| Zona | Norte | Sur |
| Crédito preaprobado (millones COP) | 350 | 850 |
Ayude a María a responder la solicitud, mediante técnicas modelación que usted conoce. Ella requiere le envíe un informe ejecutivo donde analice los dos casos y sus recomendaciones (Informe). Como soporte del informe debe anexar las estimaciones, validaciones y comparación de modelos requeridos (Anexos) .
Los datos de los tres últimos meses se adjuntan en la base que puede obtener con el siguiente código en R:
| Variable | Descripción |
|---|---|
| zona | Ubicación de la vivienda: Zona Centro, Zona Norte, … |
| piso | Piso que ocupa la vivienda: primer piso, segundo piso… |
| estrato | Estrato socioeconómico: 3,4,5,6 |
| preciom | Precio de la vivienda en millones de pesos |
| areaconst | Área construida |
| parqueaderos | Número de parqueaderos |
| banios | Número de baños |
| habitaciones | Número de habitaciones |
| tipo | Tipo de vivienda: Casa, Apartamento |
| barrio | Barrio de ubicación de la vivienda: 20 de Julio, Álamos, … |
| longitud | Coordenada geográfica |
| latitud | Coordenada geográfica |
En este paso se descargan los datos desde el paqueteMOD:
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona O… <NA> 3 250 70 1 3 6
## 2 1169 Zona O… <NA> 3 320 120 1 2 3
## 3 1350 Zona O… <NA> 3 350 220 2 2 4
## 4 5992 Zona S… 02 4 400 280 3 5 3
## 5 1212 Zona N… 01 5 260 90 1 2 3
## 6 1724 Zona N… 01 5 240 87 1 3 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Los tipos de variable son los siguientes:
| Variable | Tipo_estadistico | Comentario |
|---|---|---|
| id | Identificador | No se usa para modelar |
| zona | Categórica nominal | Categorías sin orden |
| piso | Discreta ordinal | Niveles con orden |
| estrato | Discreta ordinal | Valores 1–6 |
| preciom | Numérica continua | Precio en millones |
| areaconst | Numérica continua | Área en m² |
| parqueaderos | Numérica discreta | Conteo |
| banios | Numérica discreta | Conteo |
| habitaciones | Numérica discreta | Conteo |
| tipo | Categórica nominal | Casa / apartamento |
| barrio | Categórica nominal | Nombre del barrio |
| lat | Numérica continua | Coordenada geográfica |
| long | Numérica continua | Coordenada geográfica |
Pasos requeridos para la obtención de los resultados:
## # A tibble: 6 × 2
## # Groups: zona [6]
## zona n
## <fct> <int>
## 1 Zona Centro 124
## 2 Zona Norte 1920
## 3 Zona Oeste 1198
## 4 Zona Oriente 351
## 5 Zona Sur 4726
## 6 <NA> 3
## Rows: 722
## Columns: 13
## $ id <chr> "1209", "1592", "4057", "4460", "6081", "7824", "7987", "…
## $ zona <fct> Zona Norte, Zona Norte, Zona Norte, Zona Norte, Zona Nort…
## $ piso <dbl> 2, 2, 2, 2, 2, 2, 2, 3, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ estrato <dbl> 5, 5, 6, 4, 5, 4, 5, 5, 3, 3, 3, 3, 5, 3, 4, 4, 5, 5, 4, …
## $ preciom <dbl> 320, 780, 750, 625, 750, 600, 420, 490, 230, 190, 180, 50…
## $ areaconst <dbl> 150, 380, 445, 355, 237, 160, 200, 118, 160, 435, 120, 21…
## $ parqueaderos <dbl> 2, 2, NA, 3, 2, 1, 4, 2, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ banios <dbl> 4, 3, 7, 5, 6, 4, 4, 4, 2, 0, 3, 6, 5, 5, 3, 3, 4, 5, 5, …
## $ habitaciones <dbl> 6, 3, 6, 5, 6, 5, 5, 4, 3, 0, 3, 6, 4, 8, 4, 3, 4, 6, 4, …
## $ tipo <fct> Casa, Casa, Casa, Casa, Casa, Casa, Casa, Casa, Casa, Cas…
## $ barrio <fct> acopi, acopi, acopi, acopi, acopi, acopi, acopi, acopi, a…
## $ long <dbl> -76.51341, -76.51674, -76.52950, -76.53179, -76.54044, -7…
## $ lat <dbl> 3.47968, 3.48721, 3.38527, 3.40590, 3.36862, 3.42125, 3.4…
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <chr> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1209 Zona N… 2 5 320 150 2 4 6
## 2 1592 Zona N… 2 5 780 380 2 3 3
## 3 4057 Zona N… 2 6 750 445 NA 7 6
## # ℹ 4 more variables: tipo <fct>, barrio <fct>, long <dbl>, lat <dbl>
Del gráfico se concluye que es necesario corregir la variable de zona porque se encuentran mal clasificadas una gran cantidad de viviendas. Probablemente la clasificación se realizó manualmente y corresponden a errores de digitación. Afortunadamente, se cuenta con las coordenadas de ubicación. Así, con el fin de analizar la distribución geográfica de las viviendas, se realizó una clasificación de las observaciones a partir de sus coordenadas geográficas (latitud y longitud).
Se utilizaron los valores de los cuartiles y la mediana de las coordenadas para identificar cinco zonas aproximadas dentro de la ciudad: Norte, Sur, Oriente, Oeste y Centro. Las viviendas con latitudes superiores al tercer cuartil se clasificaron como Zona Norte, mientras que aquellas con latitudes inferiores al primer cuartil se clasificaron como Zona Sur. De manera similar, las longitudes extremas permitieron identificar las zonas Oriente y Oeste. Las observaciones restantes se clasificaron como Zona Centro.
Esta clasificación permite estudiar la distribución espacial de las viviendas y analizar posibles diferencias en variables como precio, área construida o número de habitaciones según la ubicación geográfica.
lat >= 3.452 ~ “Zona Norte”,lat <= 3.381 ~ “Zona Sur”, long <= -76.542 ~ “Zona Oeste”, long >= -76.519 ~ “Zona Oriente”, TRUE ~ “Zona Centro”
Así se observa la nueva clasificación:
| Name | base1 |
| Number of rows | 8322 |
| Number of columns | 14 |
| _______________________ | |
| Column type frequency: | |
| character | 2 |
| factor | 3 |
| numeric | 9 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| id | 3 | 1 | 1 | 4 | 0 | 8319 | 0 |
| zona_geo | 0 | 1 | 8 | 12 | 0 | 5 | 0 |
Variable type: factor
| skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
|---|---|---|---|---|---|
| zona | 3 | 1 | FALSE | 5 | Zon: 4726, Zon: 1920, Zon: 1198, Zon: 351 |
| tipo | 3 | 1 | FALSE | 2 | Apa: 5100, Cas: 3219 |
| barrio | 3 | 1 | FALSE | 436 | val: 1008, ciu: 516, pan: 409, la : 366 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| piso | 2638 | 0.68 | 3.77 | 2.61 | 1.00 | 2.00 | 3.00 | 5.00 | 12.00 | ▇▃▁▁▁ |
| estrato | 3 | 1.00 | 4.63 | 1.03 | 3.00 | 4.00 | 5.00 | 5.00 | 6.00 | ▅▆▁▇▆ |
| preciom | 2 | 1.00 | 433.89 | 328.65 | 58.00 | 220.00 | 330.00 | 540.00 | 1999.00 | ▇▂▁▁▁ |
| areaconst | 3 | 1.00 | 174.93 | 142.96 | 30.00 | 80.00 | 123.00 | 229.00 | 1745.00 | ▇▁▁▁▁ |
| parqueaderos | 1605 | 0.81 | 1.84 | 1.12 | 1.00 | 1.00 | 2.00 | 2.00 | 10.00 | ▇▁▁▁▁ |
| banios | 3 | 1.00 | 3.11 | 1.43 | 0.00 | 2.00 | 3.00 | 4.00 | 10.00 | ▇▇▃▁▁ |
| habitaciones | 3 | 1.00 | 3.61 | 1.46 | 0.00 | 3.00 | 3.00 | 4.00 | 10.00 | ▂▇▂▁▁ |
| long | 3 | 1.00 | -76.53 | 0.02 | -76.59 | -76.54 | -76.53 | -76.52 | -76.46 | ▁▅▇▂▁ |
| lat | 3 | 1.00 | 3.42 | 0.04 | 3.33 | 3.38 | 3.42 | 3.45 | 3.50 | ▃▇▅▇▅ |
A partir del resumen de datos se encuentran variables que es necesario procesar antes de poder realizar la modelación:
## # A tibble: 3 × 14
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <chr> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 <NA> <NA> 1 NA NA NA 0 NA NA
## 2 <NA> <NA> 1 NA NA NA 0 NA NA
## 3 <NA> <NA> 1 NA 330 NA 0 NA NA
## # ℹ 5 more variables: tipo <fct>, barrio <fct>, long <dbl>, lat <dbl>,
## # zona_geo <chr>
## # A tibble: 10 × 1
## barrio
## <fct>
## 1 20 de julio
## 2 3 de julio
## 3 acopi
## 4 agua blanca
## 5 aguablanca
## 6 aguacatal
## 7 alameda
## 8 alameda del rio
## 9 alameda del río
## 10 alamos
En este punto se analiza la variable barrio. Al revisar los barrios únicos en las primeras observaciones se identificaron inconsistencias en la digitación y codificación de esta variable, como diferencias en el uso de mayúsculas, presencia o ausencia de tildes, espacios adicionales y caracteres especiales.
Por lo anterior, se realizó un proceso de estandarización aplicando las siguientes transformaciones:
Este proceso permite reducir categorías duplicadas que en realidad corresponden al mismo barrio pero estaban registradas con diferentes formas de escritura.
Finalmente, se comparó el número de categorías únicas antes y después del proceso de depuración para verificar la reducción de inconsistencias en la codificación de la variable.
## [1] "Antes de la depuración: 436 | Después de la depuración: 389"
Adicionalmente, es necesario agrupar los barrios antes realizar el modelo para evitar problemas de demasiados niveles, lo ideal es reducir los barrios a los más frecuentes y poner el resto en una categoría “otros”.
Hasta este punto se encuentra con la base de datos sin datos perdidos y con la zona corregida:
| Name | base1 |
| Number of rows | 8319 |
| Number of columns | 14 |
| _______________________ | |
| Column type frequency: | |
| character | 2 |
| factor | 3 |
| numeric | 9 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| id | 0 | 1 | 1 | 4 | 0 | 8319 | 0 |
| zona_geo | 0 | 1 | 8 | 12 | 0 | 5 | 0 |
Variable type: factor
| skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
|---|---|---|---|---|---|
| zona | 0 | 1 | FALSE | 5 | Zon: 4726, Zon: 1920, Zon: 1198, Zon: 351 |
| tipo | 0 | 1 | FALSE | 2 | Apa: 5100, Cas: 3219 |
| barrio | 0 | 1 | FALSE | 21 | Oth: 3755, val: 1009, ciu: 540, pan: 412 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| piso | 0 | 1 | 2.89 | 2.52 | 1.00 | 1.00 | 2.00 | 4.00 | 12.00 | ▇▂▁▁▁ |
| estrato | 0 | 1 | 4.63 | 1.03 | 3.00 | 4.00 | 5.00 | 5.00 | 6.00 | ▅▆▁▇▆ |
| preciom | 0 | 1 | 433.90 | 328.67 | 58.00 | 220.00 | 330.00 | 540.00 | 1999.00 | ▇▂▁▁▁ |
| areaconst | 0 | 1 | 174.93 | 142.96 | 30.00 | 80.00 | 123.00 | 229.00 | 1745.00 | ▇▁▁▁▁ |
| parqueaderos | 0 | 1 | 1.48 | 1.24 | 0.00 | 1.00 | 1.00 | 2.00 | 10.00 | ▇▁▁▁▁ |
| banios | 0 | 1 | 3.11 | 1.43 | 0.00 | 2.00 | 3.00 | 4.00 | 10.00 | ▇▇▃▁▁ |
| habitaciones | 0 | 1 | 3.61 | 1.46 | 0.00 | 3.00 | 3.00 | 4.00 | 10.00 | ▂▇▂▁▁ |
| long | 0 | 1 | -76.53 | 0.02 | -76.59 | -76.54 | -76.53 | -76.52 | -76.46 | ▁▅▇▂▁ |
| lat | 0 | 1 | 3.42 | 0.04 | 3.33 | 3.38 | 3.42 | 3.45 | 3.50 | ▃▇▅▇▅ |
Para complementar el análisis exploratorio de datos, se utilizan
gráficos interactivos mediante la librería plotly. Este
tipo de visualizaciones permite explorar dinámicamente la información,
identificar patrones, detectar valores atípicos y analizar relaciones
entre variables.
Observando la distribución del precio de la vivienda se observa que no se distribuye normal, sino que tiene cola pesada a la derecha.
Este gráfico permite analizar si existe una relación entre el número de habitaciones y el precio de la vivienda.
El siguiente gráfico permite evaluar si el número de baños influye en el precio de la vivienda.
El siguiente gráfico permite evaluar si el piso en que se ubica la vivienda influye en el precio.
La matriz de correlación permite identificar relaciones lineales entre variables numéricas. Valores cercanos a 1 o -1 indican relaciones fuertes entre variables.
A continuación, se ajusta un modelo de regresión lineal para explicar el precio de la vivienda en función de diferentes características estructurales de la vivienda.
##
## Call:
## lm(formula = preciom ~ areaconst + habitaciones + banios + parqueaderos +
## estrato + tipo + zona_geo + piso + barrio, data = base1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1586.32 -79.28 -8.11 49.30 1196.47
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -201.17686 18.81704 -10.691 < 2e-16 ***
## areaconst 0.95202 0.01915 49.721 < 2e-16 ***
## habitaciones -20.44924 1.82590 -11.200 < 2e-16 ***
## banios 51.13968 2.15194 23.764 < 2e-16 ***
## parqueaderos 44.04608 1.96243 22.445 < 2e-16 ***
## estrato 69.66965 2.76586 25.189 < 2e-16 ***
## tipoCasa -4.35778 5.38296 -0.810 0.418222
## zona_geoZona Norte 16.98037 6.00584 2.827 0.004705 **
## zona_geoZona Oeste 1.20793 6.60351 0.183 0.854863
## zona_geoZona Oriente 0.88006 7.62144 0.115 0.908074
## zona_geoZona Sur 6.82551 7.19363 0.949 0.342736
## piso 1.23958 0.79453 1.560 0.118764
## barrioaguacatal 131.30893 21.09856 6.224 5.09e-10 ***
## barriobrisas de los -13.49020 23.15049 -0.583 0.560099
## barriocaney -61.08803 22.18172 -2.754 0.005900 **
## barriociudad 2000 -45.97192 21.84810 -2.104 0.035394 *
## barriociudad jardin 44.13601 15.90442 2.775 0.005531 **
## barriocristales 58.11556 22.97032 2.530 0.011424 *
## barrioel caney -71.02527 17.96884 -3.953 7.79e-05 ***
## barrioel ingenio -94.03866 17.93655 -5.243 1.62e-07 ***
## barrioel limonar -103.00143 19.76550 -5.211 1.92e-07 ***
## barrioel refugio -72.91357 20.80028 -3.505 0.000458 ***
## barriola flora -76.31916 16.52615 -4.618 3.93e-06 ***
## barriola hacienda -37.25444 18.96205 -1.965 0.049484 *
## barriolos cristales 26.42228 19.56556 1.350 0.176909
## barrionormandia 163.15127 19.41201 8.405 < 2e-16 ***
## barriopance 118.14794 16.41315 7.198 6.63e-13 ***
## barrioprados del norte -98.07302 20.23106 -4.848 1.27e-06 ***
## barriosanta teresita 191.94224 17.50538 10.965 < 2e-16 ***
## barriourbanizacion la flora -67.81954 22.95185 -2.955 0.003137 **
## barriovalle del lili -66.15171 14.77665 -4.477 7.68e-06 ***
## barrioOther -25.27242 13.79533 -1.832 0.066994 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 164.6 on 8287 degrees of freedom
## Multiple R-squared: 0.7502, Adjusted R-squared: 0.7493
## F-statistic: 802.8 on 31 and 8287 DF, p-value: < 2.2e-16
Se define primero el modelo nulo (solo intercepto) y posteriormente el modelo completo con todos los predictores disponibles.
## Step Df Deviance Resid. Df Resid. Dev AIC
## 1 NA NA 8318 898516169 96418.86
## 2 + areaconst -1 424506409.21 8317 474009760 91100.72
## 3 + estrato -1 172418100.99 8316 301591659 87341.25
## 4 + barrio -20 40249041.07 8296 261342618 86189.62
## 5 + parqueaderos -1 20878378.21 8295 240464240 85498.98
## 6 + banios -1 11756090.86 8294 228708149 85083.99
## 7 + habitaciones -1 3859718.82 8293 224848430 84944.40
## 8 + zona_geo -4 279946.59 8289 224568483 84942.03
## 9 + piso -1 96298.33 8288 224472185 84940.47
El procedimiento de selección forward stepwise muestra cómo se van incorporando progresivamente las variables que mejor explican la variabilidad del precio de las viviendas (preciom). Inicialmente, el modelo parte de un modelo nulo que solo incluye el intercepto y presenta un AIC de 96418.86. La primera variable incorporada es areaconst, que genera una reducción considerable del AIC y de la desviación residual, indicando que el área construida es el principal determinante del precio. Posteriormente se agrega barrio, lo que evidencia que la ubicación específica de la vivienda tiene un fuerte impacto en el valor del inmueble. En los siguientes pasos se incorporan parqueaderos, banios, estrato y habitaciones, variables que también contribuyen a mejorar el ajuste del modelo al reducir progresivamente el AIC. Finalmente se añade la variable piso, aunque su contribución al modelo es menor en comparación con las variables anteriores. En general, los resultados sugieren que las características físicas de la vivienda y su ubicación son factores clave en la determinación del precio, siendo el área construida y el barrio los predictores más influyentes.
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + barrio + parqueaderos +
## banios + habitaciones + zona_geo + piso, data = base1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1580.09 -79.41 -7.89 50.04 1193.62
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -202.70896 18.72123 -10.828 < 2e-16 ***
## areaconst 0.94683 0.01804 52.483 < 2e-16 ***
## estrato 70.11426 2.71073 25.865 < 2e-16 ***
## barrioaguacatal 131.82903 21.08834 6.251 4.27e-10 ***
## barriobrisas de los -13.39105 23.14968 -0.578 0.562973
## barriocaney -61.27191 22.18010 -2.762 0.005749 **
## barriociudad 2000 -47.32621 21.78351 -2.173 0.029841 *
## barriociudad jardin 43.39056 15.87741 2.733 0.006292 **
## barriocristales 58.24820 22.96926 2.536 0.011233 *
## barrioel caney -71.36600 17.96353 -3.973 7.16e-05 ***
## barrioel ingenio -93.98992 17.93607 -5.240 1.64e-07 ***
## barrioel limonar -103.27207 19.76226 -5.226 1.78e-07 ***
## barrioel refugio -73.23162 20.79613 -3.521 0.000432 ***
## barriola flora -76.60518 16.52203 -4.637 3.60e-06 ***
## barriola hacienda -37.72442 18.95277 -1.990 0.046575 *
## barriolos cristales 26.66006 19.56294 1.363 0.172988
## barrionormandia 163.76669 19.39672 8.443 < 2e-16 ***
## barriopance 117.94752 16.41094 7.187 7.19e-13 ***
## barrioprados del norte -98.15426 20.23039 -4.852 1.25e-06 ***
## barriosanta teresita 192.80651 17.47243 11.035 < 2e-16 ***
## barriourbanizacion la flora -68.01957 22.95004 -2.964 0.003047 **
## barriovalle del lili -66.25555 14.77578 -4.484 7.42e-06 ***
## barrioOther -25.46255 13.79304 -1.846 0.064922 .
## parqueaderos 44.02885 1.96227 22.438 < 2e-16 ***
## banios 50.89044 2.12976 23.895 < 2e-16 ***
## habitaciones -20.72573 1.79364 -11.555 < 2e-16 ***
## zona_geoZona Norte 17.15507 6.00184 2.858 0.004270 **
## zona_geoZona Oeste 1.48190 6.59469 0.225 0.822209
## zona_geoZona Oriente 0.70509 7.61822 0.093 0.926261
## zona_geoZona Sur 6.93017 7.19232 0.964 0.335299
## piso 1.43057 0.75868 1.886 0.059382 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 164.6 on 8288 degrees of freedom
## Multiple R-squared: 0.7502, Adjusted R-squared: 0.7493
## F-statistic: 829.6 on 30 and 8288 DF, p-value: < 2.2e-16
Se selecciona aleatoriamente el 60% de los datos para el entrenamiento del modelo.
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + barrio + parqueaderos +
## banios + habitaciones + zona_geo + piso, data = base1, subset = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1055.04 -81.04 -7.90 51.06 1185.20
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -205.65033 24.69812 -8.327 < 2e-16 ***
## areaconst 0.95520 0.02328 41.029 < 2e-16 ***
## estrato 68.58082 3.58043 19.154 < 2e-16 ***
## barrioaguacatal 148.14849 28.07510 5.277 1.37e-07 ***
## barriobrisas de los -1.62010 29.38870 -0.055 0.956040
## barriocaney -56.29487 27.91324 -2.017 0.043772 *
## barriociudad 2000 -48.11376 30.16947 -1.595 0.110824
## barriociudad jardin 55.55588 21.30055 2.608 0.009130 **
## barriocristales 70.85525 29.99512 2.362 0.018204 *
## barrioel caney -58.10493 23.49678 -2.473 0.013436 *
## barrioel ingenio -89.02903 23.83089 -3.736 0.000189 ***
## barrioel limonar -117.09599 27.14098 -4.314 1.63e-05 ***
## barrioel refugio -70.35971 27.43298 -2.565 0.010353 *
## barriola flora -63.92906 22.14245 -2.887 0.003904 **
## barriola hacienda -29.62564 25.06465 -1.182 0.237275
## barriolos cristales 12.57304 25.84597 0.486 0.626662
## barrionormandia 204.81112 25.74127 7.957 2.18e-15 ***
## barriopance 123.22703 21.99917 5.601 2.24e-08 ***
## barrioprados del norte -75.73998 26.88394 -2.817 0.004862 **
## barriosanta teresita 200.91033 22.99799 8.736 < 2e-16 ***
## barriourbanizacion la flora -66.19770 29.60407 -2.236 0.025389 *
## barriovalle del lili -54.74839 19.93630 -2.746 0.006051 **
## barrioOther -10.93880 18.55512 -0.590 0.555533
## parqueaderos 43.85876 2.54991 17.200 < 2e-16 ***
## banios 54.06991 2.74904 19.669 < 2e-16 ***
## habitaciones -22.46622 2.35232 -9.551 < 2e-16 ***
## zona_geoZona Norte 9.21332 7.83205 1.176 0.239507
## zona_geoZona Oeste 3.93221 8.62592 0.456 0.648511
## zona_geoZona Oriente -3.15606 10.02504 -0.315 0.752913
## zona_geoZona Sur 3.99651 9.37051 0.426 0.669763
## piso 0.98505 0.97940 1.006 0.314572
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 166.9 on 4960 degrees of freedom
## Multiple R-squared: 0.751, Adjusted R-squared: 0.7495
## F-statistic: 498.6 on 30 and 4960 DF, p-value: < 2.2e-16
El modelo final elegido presenta un buen ajuste y capacidad explicativa, aunque el error residual indica que todavía existe variabilidad en los precios que no es capturada completamente por las variables consideradas.
El error estándar residual (Residual standard error = 167) indica que, en promedio, las predicciones del modelo se desvían alrededor de 167 millones de pesos respecto al valor real del precio de las viviendas. Este valor se calcula a partir de 4961 grados de libertad, que corresponden aproximadamente al número de observaciones menos el número de parámetros estimados en el modelo.
El coeficiente de determinación \(R^2\)=0.751 muestra que aproximadamente el 75.1% de la variabilidad del precio de las viviendas es explicada por las variables incluidas en el modelo (como área construida, número de habitaciones, baños, parqueaderos, estrato, barrio, etc.). Esto indica que el modelo tiene una buena capacidad explicativa.
El \(R^2\) ajustado (0.7495) tiene en cuenta el número de variables incluidas en el modelo y penaliza la inclusión de predictores innecesarios. En este caso, el valor sigue siendo alto (74.95%), lo que sugiere que la mayoría de las variables aportan información relevante para explicar el precio.
Finalmente, el estadístico F = 515.9 con un p-valor menor a 2.2e-16 indica que el modelo es globalmente significativo. Es decir, existe evidencia estadística muy fuerte para afirmar que al menos una de las variables explicativas está relacionada con el precio de la vivienda, y que el modelo es mejor que un modelo sin predictores.
Se calcula el error cuadrático medio (MSE) utilizando el conjunto de prueba.
## [1] 26123.44
Se repite el proceso de entrenamiento y validación 100 veces para analizar la variabilidad del error de predicción.
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = base1, statistic = fun_coeficientes, R = 9999)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* -202.7089648 0.196221463 19.19503376
## t2* 0.9468251 0.002234377 0.05081084
## t3* 70.1142639 -0.047940630 3.21725403
## t4* 131.8290281 0.030687754 24.04913741
## t5* -13.3910509 0.037064829 12.70190898
## t6* -61.2719083 0.260055856 13.16819355
## t7* -47.3262053 0.059612020 14.88851863
## t8* 43.3905602 0.051085882 14.88305745
## t9* 58.2482001 0.536669663 26.02839236
## t10* -71.3659984 0.117571079 12.16995236
## t11* -93.9899158 0.178204954 13.02551588
## t12* -103.2720668 0.262564422 15.37957752
## t13* -73.2316196 0.121392935 13.91635078
## t14* -76.6051835 0.129350993 12.61786250
## t15* -37.7244241 0.194940342 14.12346626
## t16* 26.6600555 0.277324126 19.04197761
## t17* 163.7666897 0.555177163 25.03630181
## t18* 117.9475154 0.154280968 17.43063818
## t19* -98.1542589 0.234043880 13.83240280
## t20* 192.8065126 0.015744075 20.52226367
## t21* -68.0195684 0.245205093 17.10918965
## t22* -66.2555488 0.212605942 11.31253356
## t23* -25.4625467 0.134450580 11.16483215
## t24* 44.0288507 -0.052538929 3.22832526
## t25* 50.8904447 -0.064782193 3.28418885
## t26* -20.7257270 -0.071598834 2.46249385
## t27* 17.1550684 0.071068232 6.12706311
## t28* 1.4819028 0.052928116 6.78622618
## t29* 0.7050893 0.121236019 6.20051181
## t30* 6.9301694 0.066053377 7.00233107
## t31* 1.4305728 -0.005858102 0.78256003
Este resultado corresponde a un bootstrap no paramétrico aplicado a los coeficientes del modelo de regresión. El objetivo del bootstrap es evaluar la estabilidad y variabilidad de los coeficientes del modelo mediante la generación de muchas muestras aleatorias con reemplazo (en este caso 9999 muestras).
En la tabla se presentan tres columnas principales. La columna original muestra el valor del coeficiente estimado en el modelo ajustado con la muestra original de datos. La columna bias indica el sesgo del estimador, es decir, la diferencia promedio entre los coeficientes estimados en las muestras bootstrap y el coeficiente original. En este caso, la mayoría de los valores de sesgo son cercanos a cero, lo que sugiere que los estimadores no presentan un sesgo importante. Finalmente, la columna std. error corresponde al error estándar bootstrap, que mide la variabilidad de cada coeficiente entre las diferentes muestras generadas.
Por ejemplo, el coeficiente t1 tiene un valor original de aproximadamente -201.66, con un sesgo muy pequeño (0.32) y un error estándar de 19.03, lo que indica que su estimación es relativamente estable. De forma similar, el coeficiente t2 presenta un valor cercano a 0.95 con un error estándar pequeño (0.05), lo que sugiere una estimación bastante precisa. Otros coeficientes, como t4 o t16, presentan errores estándar más grandes, lo que indica mayor variabilidad en su estimación.
En términos generales, los resultados del bootstrap indican que los coeficientes del modelo son relativamente estables, ya que los sesgos estimados son pequeños y los errores estándar no muestran variaciones extremas. Esto sugiere que el modelo presenta una estimación consistente de los parámetros, y que los resultados obtenidos no dependen excesivamente de una muestra específica del conjunto de datos. Sin embargo, algunos coeficientes con errores estándar mayores podrían requerir un análisis adicional para evaluar su importancia dentro del modelo.
| r.squared | adj.r.squared | sigma | statistic | p.value | df | logLik | AIC | BIC | deviance | df.residual | nobs |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0.750 | 0.749 | 164.572 | 829.572 | 0 | 30 | -54243.38 | 108550.8 | 108775.6 | 224472185 | 8288 | 8319 |
| 0.709 | 0.708 | 177.489 | 919.377 | 0 | 22 | -54875.96 | 109799.9 | 109968.6 | 261342618 | 8296 | 8319 |
| 0.664 | 0.664 | 190.437 | 8229.711 | 0 | 2 | -55471.78 | 110951.6 | 110979.7 | 301591659 | 8316 | 8319 |
| 0.472 | 0.472 | 238.732 | 7448.412 | 0 | 1 | -57352.51 | 114711.0 | 114732.1 | 474009760 | 8317 | 8319 |
##
## ==========================================================================
## Dependent variable:
## ----------------------------------------------
## preciom
## modelo1 modelo2 modelo3 modelo4
## --------------------------------------------------------------------------
## areaconst 0.947*** 1.242*** 1.293*** 1.580***
## (0.018) (0.015) (0.015) (0.018)
##
## estrato 70.114*** 110.986*** 145.466***
## (2.711) (2.512) (2.110)
##
## barrioaguacatal 131.829*** 216.974***
## (21.088) (22.132)
##
## barriobrisas de los -13.391 45.350
## (23.150) (24.480)
##
## barriocaney -61.272** -22.452
## (22.180) (23.649)
##
## barriociudad 2000 -47.326* -0.600
## (21.784) (23.026)
##
## barriociudad jardin 43.391** 121.065***
## (15.877) (16.355)
##
## barriocristales 58.248* 98.708***
## (22.969) (24.227)
##
## barrioel caney -71.366*** -24.099
## (17.964) (18.768)
##
## barrioel ingenio -93.990*** -45.578*
## (17.936) (18.882)
##
## barrioel limonar -103.272*** -50.254*
## (19.762) (20.806)
##
## barrioel refugio -73.232*** -16.727
## (20.796) (21.526)
##
## barriola flora -76.605*** -28.765
## (16.522) (16.918)
##
## barriola hacienda -37.724* 3.926
## (18.953) (19.775)
##
## barriolos cristales 26.660 73.996***
## (19.563) (20.298)
##
## barrionormandia 163.767*** 238.182***
## (19.397) (20.188)
##
## barriopance 117.948*** 214.731***
## (16.411) (16.949)
##
## barrioprados del norte -98.154*** -38.820
## (20.230) (21.175)
##
## barriosanta teresita 192.807*** 258.278***
## (17.472) (18.145)
##
## barriourbanizacion la flora -68.020** -9.271
## (22.950) (24.090)
##
## barriovalle del lili -66.256*** -25.192
## (14.776) (15.262)
##
## barrioOther -25.463 17.985
## (13.793) (14.444)
##
## parqueaderos 44.029***
## (1.962)
##
## banios 50.890***
## (2.130)
##
## habitaciones -20.726***
## (1.794)
##
## zona_geoZona Norte 17.155**
## (6.002)
##
## zona_geoZona Oeste 1.482
## (6.595)
##
## zona_geoZona Oriente 0.705
## (7.618)
##
## zona_geoZona Sur 6.930
## (7.192)
##
## piso 1.431
## (0.759)
##
## Constant -202.709*** -334.623*** -466.301*** 157.476***
## (18.721) (18.073) (9.630) (4.136)
##
## --------------------------------------------------------------------------
## Observations 8,319 8,319 8,319 8,319
## R2 0.750 0.709 0.664 0.472
## Adjusted R2 0.749 0.708 0.664 0.472
## ==========================================================================
## Note: *p<0.05; **p<0.01; ***p<0.001
Los resultados del modelo de regresión final permiten identificar qué variables tienen mayor impacto en el precio de las viviendas (preciom) y cuáles resultan estadísticamente significativas.
En primer lugar, el área construida (areaconst) es el predictor más importante, con un coeficiente de 0.95 y un valor t muy alto (52.48) con p-valor ≈ 0. Esto indica que, en promedio, cada metro cuadrado adicional aumenta el precio de la vivienda en aproximadamente 0.95 millones de pesos, manteniendo constantes las demás variables.
Otra variable altamente significativa es el estrato, con un coeficiente de 69.9. Esto implica que aumentar un nivel de estrato incrementa el precio en aproximadamente 70 millones de pesos, lo cual refleja el fuerte efecto socioeconómico de la ubicación sobre el valor de la vivienda.
Entre las características físicas, también destacan el número de baños y parqueaderos, ambos con coeficientes positivos y altamente significativos. En particular, cada baño adicional aumenta el precio en aproximadamente 50.9 millones, mientras que cada parqueadero adicional incrementa el valor en cerca de 44 millones de pesos.
En contraste, el coeficiente de habitaciones es negativo (-20.78), lo cual puede interpretarse como que, manteniendo constante el área construida, un mayor número de habitaciones implica espacios más pequeños, lo que tiende a reducir el precio promedio de la vivienda.
Respecto a la ubicación por barrio, se observan diferencias importantes frente al barrio de referencia. Algunos barrios presentan primas de precio, como Santa Teresita (+193 millones), Normandía (+163 millones) y Pance (+118 millones), lo que sugiere que son zonas con viviendas de mayor valor. En cambio, barrios como El Limonar, El Ingenio o Prados del Norte presentan coeficientes negativos, indicando precios relativamente menores respecto al barrio base.
Finalmente, la variable zona geográfica tiene efectos más moderados. Solo Zona Norte resulta estadísticamente significativa, con un incremento aproximado de 17.6 millones en el precio. Las demás zonas no muestran efectos significativos. En conjunto, estos resultados sugieren que el precio de las viviendas está principalmente determinado por el área construida, el estrato socioeconómico, las características del inmueble y el barrio específico donde se ubica la propiedad.
Una vez ajustado el modelo de regresión lineal, es necesario verificar si se cumplen los supuestos del modelo. Entre los supuestos principales se encuentran:
Para ello se analizan diferentes gráficos y pruebas estadísticas.
Los gráficos de diagnóstico permiten evaluar visualmente el cumplimiento de los supuestos del modelo.
Interpretación de los gráficos:
Este gráfico permite evaluar la linealidad y homocedasticidad del modelo. Idealmente, los residuos deberían distribuirse aleatoriamente alrededor de cero sin mostrar patrones claros. En el gráfico se observa que, a medida que aumentan los valores ajustados (precios estimados), la dispersión de los residuos también aumenta ligeramente. Esto sugiere la presencia de heterocedasticidad, es decir, que la varianza de los errores no es constante. Además, algunos puntos extremos indican posibles observaciones atípicas.
Q-Q Residuals: Este gráfico compara la distribución de los residuos con una distribución normal teórica. Si los residuos fueran normales, los puntos seguirían aproximadamente la línea diagonal. En este caso se observa que en los extremos los puntos se alejan de la línea, lo que indica desviaciones de la normalidad, especialmente en las colas de la distribución.
Scale-Location: Este gráfico también evalúa la homocedasticidad. Se espera observar una banda horizontal con dispersión constante. Sin embargo, la línea roja muestra una tendencia creciente, lo que confirma que la variabilidad de los residuos aumenta con el valor ajustado del modelo. Esto refuerza la evidencia de heterocedasticidad en el modelo.
Residuals vs Leverage: Este gráfico permite identificar observaciones influyentes que pueden afectar significativamente el ajuste del modelo. La mayoría de los puntos presentan valores de leverage bajos, lo que es positivo. No obstante, algunas observaciones aparecen más alejadas y cercanas a las líneas de Cook’s distance, lo que sugiere que podrían tener una influencia importante en el modelo y sería recomendable analizarlas con mayor detalle.
En conjunto, los gráficos indican que, aunque el modelo presenta una buena capacidad explicativa, existen indicios de heterocedasticidad, desviaciones de normalidad y algunos posibles puntos influyentes, por lo que podrían considerarse transformaciones de variables (por ejemplo, logaritmo del precio) o métodos robustos para mejorar el ajuste del modelo. Esto se confirma con las siguientes pruebas:
Se aplica la prueba de Shapiro-Wilk para evaluar si los residuos siguen una distribución normal.
##
## Shapiro-Wilk normality test
##
## data: res
## W = 0.84194, p-value < 2.2e-16
Interpretación:
En este caso se rechaza la normalidad de los residuos. Al no cumplirse el supuesto se podría considerar aplicar transformaciones sobre la variable respuesta, como el logaritmo del precio o hacer la transformación a \(precio/m^2\).
La multicolinealidad ocurre cuando dos o más variables explicativas están altamente correlacionadas. Para detectarla se utiliza el Factor de Inflación de la Varianza (VIF).
## GVIF Df GVIF^(1/(2*Df))
## areaconst 2.042978 1 1.429328
## estrato 2.390541 1 1.546137
## barrio 9.698375 20 1.058443
## parqueaderos 1.827585 1 1.351882
## banios 2.841524 1 1.685682
## habitaciones 2.104781 1 1.450786
## zona_geo 5.432186 4 1.235583
## piso 1.119542 1 1.058084
Interpretación:
En este caso no se presenta multicolinealidad en la mayoría de las variables. No obstante, en el barrio se deterca una multicolineadlidad moderada, al igual que en zona. Por lo cual podría considerarse eliminar o combinar estas variables altamente correlacionadas.
Se puede aplicar la prueba de Breusch-Pagan para evaluar la igualdad de varianza de los residuos.
##
## studentized Breusch-Pagan test
##
## data: modelo_final
## BP = 1502.2, df = 30, p-value < 2.2e-16
Interpretación:
En este caso se confirma que se detecta heterocedasticidad.
Si se detecta heterocedasticidad, se podría considerar realizar:transformaciones en las variables o usar un método de errores robustos.
Adicionalmente, se analizan las distancias de Cook para detectar observaciones que tengan una influencia excesiva sobre el modelo.
Las observaciones que superen el umbral pueden considerarse potencialmente influyentes y deben ser revisadas.
El análisis de los supuestos permite evaluar si el modelo de regresión lineal es adecuado para explicar la variable precio de la vivienda. En caso de detectarse desviaciones importantes respecto a los supuestos,como es el caso, se podrían considerar alternativas como:
Transformaciones de variables (logaritmo del precio, o calcular precio por metro cuadrado)
Eliminación de valores atípicos.
Uso de modelos robustos.
Adición de variables que mejoren el modelo hedónico de viviendas.
Primero se estima el valor esperado de mercado de cada vivienda utilizando el modelo de regresión.
El modelo de regresión se utiliza para estimar el valor de mercado de las viviendas a partir de sus características. Posteriormente, estas predicciones se utilizan como base para identificar oportunidades de compra dentro del conjunto de ofertas disponibles. En particular, se seleccionan aquellas viviendas cuyo precio de oferta se encuentra por debajo del valor estimado por el modelo y que además cumplen con la restricción presupuestal establecida para la vivienda 1.
Una vez estimado el modelo de regresión para el precio de las viviendas, es posible utilizar sus predicciones para identificar oportunidades de compra. En particular, se busca responder a la solicitud asociada a la vivienda 1, considerando que la empresa dispone de un crédito preaprobado máximo de 350 millones de pesos.
Se calcula la diferencia entre el precio estimado por el modelo y el precio de oferta observado.
Un valor positivo indica que la vivienda podría estar subvalorada respecto al mercado, siendo una mejor opción.
Dado que el crédito máximo disponible es de 350 millones de pesos, se filtran únicamente las viviendas dentro de este rango y con las demás características deseadas por María.
Se ordenan las viviendas según la conveniencia y se seleccionan las cinco mejores alternativas.
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | long | lat | precio_predicho | oportunidad_precio |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1914 | Zona Norte | 2 | 5 | 300 | 205 | 2 | 5 | 6 | Casa | Other | -76.51832 | 3.48138 | 554.6707 | 254.6707 |
| 4210 | Zona Norte | 1 | 5 | 350 | 200 | 3 | 3 | 4 | Casa | Other | -76.53010 | 3.48503 | 532.2054 | 182.2054 |
| 1343 | Zona Norte | 2 | 5 | 320 | 200 | 2 | 4 | 4 | Casa | la flora | -76.51524 | 3.48893 | 489.3550 | 169.3550 |
| 1151 | Zona Norte | 1 | 5 | 320 | 210 | 2 | 3 | 5 | Casa | Other | -76.51200 | 3.47600 | 476.9191 | 156.9191 |
| 1887 | Zona Norte | 1 | 5 | 340 | 203 | 2 | 3 | 4 | Casa | Other | -76.51803 | 3.48257 | 491.0171 | 151.0171 |
Estas viviendas representan las cinco ofertas potenciales recomendadas para la empresa.
Finalmente, las viviendas seleccionadas se representan en un mapa interactivo para facilitar su análisis espacial.
A partir de las características definidas para la vivienda 1, se filtraron las propiedades que cumplen con los criterios de tipo de vivienda (casa), área construida cercana a 200 m², al menos un parqueadero, mínimo dos baños y cuatro habitaciones, estrato entre 4 y 5, ubicación en la zona norte y un precio inferior al crédito preaprobado de 350 millones de pesos.
Posteriormente, estas viviendas se ordenaron según el indicador de oportunidad de precio, definido como la diferencia entre el precio estimado por el modelo de regresión y el precio de oferta observado en el mercado. Valores más altos indican que la vivienda podría estar subvalorada respecto a su valor esperado.
Los resultados muestran cinco viviendas potenciales con áreas entre 200 y 210 m², entre 2 y 3 parqueaderos y entre 3 y 5 baños, ubicadas principalmente en barrios de la zona norte como La Flora. La mejor oportunidad identificada presenta una diferencia de aproximadamente 255 millones de pesos entre el precio estimado por el modelo y el precio de oferta, lo que sugiere una posible subvaloración significativa en el mercado.
En general, las oportunidades identificadas presentan diferencias de precio entre 151 y 255 millones de pesos, lo que indica que estas propiedades podrían representar alternativas atractivas para la empresa dentro del presupuesto disponible.
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | long | lat | zona_geo | habitaciones_jitter | banios_jitter | piso_jitter | precio_predicho | oportunidad_precio |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 7512 | Zona Sur | 1 | 5 | 670 | 300 | 3 | 5 | 6 | Apartamento | Other | -76.55 | 3.409 | Zona Oeste | 6.027671 | 5.01867 | 0.9454087 | 671.5442 | 1.54423 |
Al aplicar los criterios de búsqueda definidos para la vivienda 2 (apartamento de aproximadamente 300 m², al menos 3 parqueaderos, mínimo 3 baños, 5 habitaciones, estrato 5 o 6, ubicado en la zona sur y con precio inferior a 850 millones de pesos), se identificó únicamente una vivienda que cumple simultáneamente con todas las condiciones establecidas.
Esta propiedad presenta un área construida de 300 m², 3 parqueaderos, 5 baños y 6 habitaciones, con un precio de oferta de 670 millones de pesos. El modelo de regresión estima un valor de mercado cercano a 671.48 millones, lo que genera una diferencia de aproximadamente 1.48 millones de pesos entre el precio estimado y el precio observado.
Esta diferencia relativamente pequeña sugiere que el precio de la vivienda se encuentra muy cercano a su valor esperado de mercado, por lo que no se identifica una oportunidad significativa de subvaloración en comparación con otras propiedades analizadas, pero cumple con las condiciones solicitadas por la cliente.
No obstante, es una gran oportunidad al corresponder a las características deseadas y encontrarse dentro del rango de presupuesto del cliente: más de 178 millones por debajo.
##Recomendación para María (Inmobiliria C&A)
Presentarle las opciones de cada uno de los mapas, donde encontrará:
Propiedades que son consideradas la mejor oportunidad (precio oferta < precio predicho).
Propiedades que se encuentran dentro del rango de crédito solicitadas por los clientes.