Análisis y propuesta para compra de vivienda

A partir de la información suministrada por C&A dar gestión a la asesoría solicitada en la compra de dos viviendas, se realizó el siguiente análisis que incluye la creación de un modelo de regresión lineal múltiple y la presentación de 5 propuestas que se ajusten a los requerimentos solicitados para ambas casas.

El análisis se dividirá en dos secciones, una para la casa con presupuesto de 350 millones y la segunda para el apartamento con presupuesto de 850 millones.

Datos generales conjunto de datos Vivienda

El conjunto de datos cuenta con 8.322 registros con 13 variables. De las cuales se seleccionarán 8: areaconst, estrato, habitaciones, parqueaderos, banios, zona, preciom, tipo.

Se identifica que existen 3* registros que contienen valores nulos en todas sus columnas (*Existe 1 registro que la variable preciom no es nula, sin embargo, las demás columnas están vacías). Se procede a eliminar estos 3 registros.

La variable parqueaderos posee 1.602 registros con valores faltantes. Se realizó la imputación de dichos valores en cada una de las dos secciones con sus respectivos subconjuntos. Lo anterior con el fin de asignar mejor el valor entre registros semejantes.

1. Casa - Presupuesto 350 millones

Para el análisis de este caso se filtró el conjunto de datos para las viviendas ubicadas en la zona norte, como se muestra a continuación. El conjunto de datos cuenta con 722 registros. Adicionalmente se imputó la variable parqueaderos con la mediana.

## # A tibble: 3 × 10
##   areaconst estrato habitaciones parqueaderos banios zona  preciom tipo  latitud
##       <dbl> <fct>          <dbl>        <dbl>  <dbl> <chr>   <dbl> <chr>   <dbl>
## 1       150 5                  6            2      4 Zona…     320 Casa     3.48
## 2       380 5                  3            2      3 Zona…     780 Casa     3.49
## 3       445 6                  6            2      7 Zona…     750 Casa     3.39
## # ℹ 1 more variable: longitud <dbl>

1.1 Ubicación de casas

A partir de este subconjunto de datos se presenta el siguiente mapa para identificar la ubicación de las viviendas.

De acuerdo con la alcaldía de Cali, la zona norte se ubica en la parte superior del mapa, donde se ubica la mayor parte de puntos. En ese sentido se evidencia que algunos puntos no poseen la ubicación correcta. Para corregir lo anterior, se definió un límite a partir de latitud y longitud que permite filtrar los datos para la zona norte. El mapa que se muestra a continuación contiene los datos filtrados.

Cabe mencionar que la base de 722 registros ahora contiene 500 registros.

1.2 Análisis exploratorio del precio de las casas

Precio vs Área construida y Estrato

El siguiente es un gráfico de dispersión que muestra el precio vs área construida. Los colores de los puntos representan el estrato de las casas.

A partir de lo anterior se concluye que ambas variables tienen relación positiva, es decir, cuando el área construida aumenta, el precio también lo hace. Existe una mayor densidad de puntos de 0 a 500 metros cuadrados y de 0 a 1000 millones de pesos. El estrato del rango anterior, representado en la mezcla de los colores, indica su variabilidad; por otra parte es claro que las casas más grandes y costosas están en los estratos altos.

Precio vs número de habitaciones

No se evidencia una tendencia clara entre el número de habitaciones y el precio de las casas. Se observa que las casas con hasta 5 habitaciones tienen precios más altos entre 0 y 1000 millones. Existe una alta densidad de puntos entre 4 y 6 habitaciones.

Precio vs número de baños

Se evidencia que en las casas el precio aumenta mientras aumenta el número de baños. Al igual que las habitaciones, para cada número de baños se observa la variabilidad del precio, eso sugiere que el precio se ve afectado por otras variables .Existe una alta densidad de puntos entre 3 y 6 baños.

Matriz de corrrelación

La matriz anterior muestra que las variables presentan correlación positiva en cada una de sus combinaciones, es decir, que cuando una aumenta la otra también. Desde el análisis del precio, la variable más importante es el área construida con una correlación de 0,73.

1.3 Modelo de regresión lineal múltiple

Se realizará la construcción de un modelo de regresión lineal múltiple que permita predecir el precio de las casas teniendo en cuenta las variables área construida, estrato, habitaciones, parqueaderos y baños

## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = df_norte)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -814.49  -60.05  -15.20   39.27  946.34 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   15.9181    19.6789   0.809   0.4190    
## areaconst      0.7125     0.0502  14.194  < 2e-16 ***
## estrato4      95.9016    17.7820   5.393 1.08e-07 ***
## estrato5     140.3656    17.1351   8.192 2.24e-15 ***
## estrato6     297.0561    36.8005   8.072 5.35e-15 ***
## habitaciones   6.6976     4.8201   1.390   0.1653    
## parqueaderos  23.0861     5.4727   4.218 2.93e-05 ***
## banios        13.1441     6.3055   2.085   0.0376 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 133.6 on 492 degrees of freedom
## Multiple R-squared:  0.6591, Adjusted R-squared:  0.6542 
## F-statistic: 135.9 on 7 and 492 DF,  p-value: < 2.2e-16

De acuerdo con la información anterior, los coeficientes son los siguientes:

  1. Intercepto: 15,91 es el valor del precio de la casa cuando todas las variables son cero.
  2. areaconst: 0,71 es el coeficiente de regresión, indica que el precio aumenta 0,71 unidades manteniendo las demás variables constantes. Su valor de probabilidad asociado al valor t indica es que es significativo.
  3. estrato4: 95,90 es el coeficiente de regresión, indica que el precio aumenta 95,90 unidades manteniendo las demás variables constantes. Su valor de probabilidad asociado al valor t indica es que es significativo.
  4. estrato5: 140,36 es el coeficiente de regresión, indica que el precio aumenta 140,36 unidades manteniendo las demás variables constantes. Su valor de probabilidad asociado al valor t indica es que es significativo.
  5. estrato6: 297,05 es el coeficiente de regresión, indica que el precio aumenta 297,05 unidades manteniendo las demás variables constantes. Su valor de probabilidad asociado al valor t indica es que es significativo.
  6. habitaciones: 6,69 es el coeficiente de regresión, indica que el precio aumenta 6,69 unidades manteniendo las demás variables constantes. Su valor de probabilidad asociado al valor t indica es que no es significativo.
  7. parqueaderos: 23,08 es el coeficiente de regresión, indica que el precio aumenta 23,08 unidades manteniendo las demás variables constantes. Su valor de probabilidad asociado al valor t indica es que es significativo.
  8. baños: 13,14 es el coeficiente de regresión, indica que el precio aumenta 13,14 unidades manteniendo las demás variables constantes. Su valor de probabilidad asociado al valor t indica es que no es significativo.

El valor de R2 que se muestra en el resumen indica que el modelo creado es capaz de explicar el 65,91% de la variabilidad del precio de las casas.

1.4 Validación de supuestos del modelo

En este apartado se detemrinará si el modelo es adecuado o hay que probar otros caminos que permitan encontrar uno mejor. Para ello se realiza la validación de los supuestos del modelo a partir de la siguiente En este caso se concluye lo siguiente:

  1. En el gráfico Residuals vs Fitted se puede observar que los residuos se distribuyen aleatoriamente alrededor de cero. Sin embargo, en los valores ajustados más altos pareciera que exhiben un patrón por lo que este supuesto no se confirma.
  2. En el gráfico de residuos Q-Q los puntos se desvían de la línea recta en los extremos, lo que sugiere no seguir un distribución normal. Este supuesto no se cumple.
  3. En el gráfico Scale-Location se observa que los residuos estandarizados aumentan a medida que los valores ajustados aumentan. Lo anterior sugiere que la varianza de los residuos no es constante.

Como supuesto adicional, se incluye el Factor de Inflación de Varianza para detectar multicolinealidad:

##                  GVIF Df GVIF^(1/(2*Df))
## areaconst    1.697752  1        1.302978
## estrato      1.616745  3        1.083362
## habitaciones 1.882535  1        1.372055
## parqueaderos 1.157484  1        1.075865
## banios       2.188252  1        1.479274

El criterio para detectar multicolinealidad es:

  • VIF <= 5: no hay problemas de multicolinealidad.
  • 5 > VIF <= 10: hay problemas de multicolinealidad moderada.
  • VIF > 10: hay problemas de multicolinealidad graves

Este modelo no tiene problemas de multicolinealidad. Sin embargo, el modelo no cumple con los supuestos por lo que se sugiere transformar la variable dependiente o transformar la variable dependiente e independiente y así probar cada combinación para validar si el modelo mejora y se ajusta a los supuestos.

1.5 Modelo con división de conjunto de datos en 70/30

Se realiza la creación del modelo que use el 70% de los datos de casas para entrenamiento y el 30% para pruebas. A continuación de muestran sus principales características.

## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = datos_train_casas)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -792.23  -63.39  -11.60   40.58  949.91 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   10.21760   23.70932   0.431  0.66677    
## areaconst      0.68448    0.05801  11.799  < 2e-16 ***
## estrato4     115.23797   22.29718   5.168 4.01e-07 ***
## estrato5     152.52260   21.06822   7.239 2.97e-12 ***
## estrato6     399.24322   46.16805   8.648  < 2e-16 ***
## habitaciones  10.71790    5.54468   1.933  0.05406 .  
## parqueaderos  21.03372    6.60359   3.185  0.00158 ** 
## banios         9.53843    7.51771   1.269  0.20537    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 139.3 on 344 degrees of freedom
## Multiple R-squared:  0.6655, Adjusted R-squared:  0.6587 
## F-statistic: 97.79 on 7 and 344 DF,  p-value: < 2.2e-16

Se observa que el R2 es 66,55%, un variabilidad explicada mejor que la del modelo entrenado con todos los datos. A continuación se muestra el Error Cuadrático Medio (MSE) y el Error Absoluto Medio (MAE):

## Error Cuadrático Medio (MSE): 15287.14
## Error Absoluto Medio (MAE): 83.90374

El MSE indica que la diferencia entre los valores reales y predichos es de 15287,14. En este caso la variable a predecir se interpreta en millones, los valores inician desde 0 hasta valores por encima de 1.500 sin incluir los ceros para millones. Que el valor de MSE sea grande podría sugerir que el rendimiento no es el óptimo.

Por su parte el MAE indica la media de las diferencias absolutas entre los valores reales y predichos. En promedio el modelo se equivoca en 83,90 millones en la predicción del precio.

A partir del modelo anterior se realiza la predicción del apartamento con las características solicitadas.

## El precio estimado para una casa de estrato 4 con las características indicadas es 476.1045 millones COP
## El precio estimado para una casa de estrato 5 con las características indicadas es 513.3892 millones COP

1.6 Predicción casa

En el apartado anterior se usó el modelo entrenado con la partición 70/30 para predecir el precio de las casas, ahora se repetirá el proceso con el modelo entrenado con todos los datos. A continuación se muestra el precio estimado para una casa de estrato 4 con 200 m2 de área construida, 4 habitaciones, 1 parqueadero y 2 habitaciones.

## El precio estimado para una casa de estrato 4 con las características indicadas es 467.7356 millones COP
## El precio estimado para una casa de estrato 5 con las características indicadas es 512.1995 millones COP

A pesar de que ambas predicciones exceden el presupuesto preaprobado de 350 millones COP, se mostrarán en el mapa las viviendas que coinciden con las características solicitadas.

1.7 Mapa con ofertas

A continuación, se muestra nuevamente el mapa con ofertas que cumplen con las condiciones solicitadas para la casa.

En el mapa se observan 32 ofertas para las condiciones solicitadas. Cabe resaltar que ninguna casa coincidió exactamente con las características solicitadas, por lo tanto se incluyeron aquellas viviendas así:

  1. Precio menor o igual a 350 millones COP
  2. Área construida mayor o igual a 200 metros cuadrados
  3. Estrato 4 y 5
  4. Habitaciones mayor o iguales a 4
  5. Parqueaderos mayor o iguales a 1
  6. Baños mayor o iguales 2

Al situarse sobre cada punto se observarán las características de la casa.

2. Apartamento - Presupuesto 850 millones

Para el análisis de este caso se filtró el conjunto de datos para las viviendas ubicadas en la zona sur, como se muestra a continuación. El conjunto de datos cuenta con 2787 registros. Adicionalmente se imputó la variable parqueaderos con la mediana.

## # A tibble: 3 × 10
##   areaconst estrato habitaciones parqueaderos banios zona  preciom tipo  latitud
##       <dbl> <fct>          <dbl>        <dbl>  <dbl> <chr>   <dbl> <chr>   <dbl>
## 1        96 4                  3            1      2 Zona…     290 Apar…    3.45
## 2        40 3                  2            1      1 Zona…      78 Apar…    3.4 
## 3       194 6                  3            2      5 Zona…     875 Apar…    3.46
## # ℹ 1 more variable: longitud <dbl>

2.1 Ubicación de apartamentos

A partir de este subconjunto de datos se presenta el siguiente mapa para identificar la ubicación de las viviendas.

De acuerdo con la alcaldía de Cali, la zona sur se ubica en la parte inferior del mapa, donde se ubica la mayor parte de puntos. En ese sentido se evidencia que algunos puntos no poseen la ubicación correcta. Para corregir lo anterior, se definió un límite a partir de latitud y longitud que permite filtrar los datos para la zona sur. El mapa que se muestra a continuación contiene los datos filtrados.

Cabe mencionar que la base de 2787 registros ahora contiene 2089 registros.

En el siguiente link se encuentra el documento, que contiene el mapa de Cali, usado para filtrar los datos según la zona.

2.2 Análisis exploratorio del precio de los apartamentos

Precio vs Área construida y Estrato

El siguiente es un gráfico de dispersión que muestra el precio vs área construida. Los colores de los puntos representan el estrato de los apartamentos.

A partir de lo anterior se concluye que existe una mayor densidad de puntos de 0 a 200 metros cuadrados y de 0 a 1000 millones de pesos. Para rango anterior, el estrato se identifica mejor principalmente en los estratos más altos. A partir de 200 metros cuadrados los precios se vuelven más dispersos. La tendencia coincide con la oferta actual de metros construidos para apartamentos, el costo se relacionará con la zona y comodidades del mismo junto a las zonas sociales.

Precio vs número de habitaciones

Se evidencia que en los apartamentos el precio aumenta mientras aumenta el número de habitaciones. Para cada número de habitaciones se observa la variabilidad del precio, eso sugiere que el precio se ve afectado por otras variables .Existe una alta densidad de puntos entre 3 y 4 habitaciones.

Precio vs número de baños

El comportamiento en los apartamentos es similar a las casas. Se evidencia mucho mejor que el precio aumenta mientras aumenta el número de baños. Al igual que las habitaciones, para cada número de baños se observa la variabilidad del precio, eso sugiere que el precio se ve afectado por otras variables .Existe una alta densidad de puntos entre 3 y 5 baños.

Matriz de corrrelación

La matriz anterior muestra que las variables presentan correlación positiva en cada una de sus combinaciones, es decir, que cuando una aumenta la otra también. Desde el análisis del precio, la variable más importante es el área construida con una correlación de 0,76, seguida del número de baños con 0,73.

2.3 Modelo de regresión lineal múltiple

Se realizará la construcción de un modelo de regresión lineal múltiple que permita predecir el precio de los apartamentos teniendo en cuenta las variables área construida, estrato, habitaciones, parqueaderos y baños

## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = df_sur)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1009.15   -37.11    -2.91    35.28   899.98 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -68.01081   14.08585  -4.828 1.48e-06 ***
## areaconst      1.22714    0.05447  22.530  < 2e-16 ***
## estrato4      27.72689   10.10709   2.743  0.00613 ** 
## estrato5      49.90265   10.22466   4.881 1.14e-06 ***
## estrato6     184.37685   12.00438  15.359  < 2e-16 ***
## habitaciones  -7.82468    3.95652  -1.978  0.04810 *  
## parqueaderos  75.92805    4.32647  17.550  < 2e-16 ***
## banios        43.36835    3.45916  12.537  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 90.93 on 2081 degrees of freedom
## Multiple R-squared:  0.7907, Adjusted R-squared:   0.79 
## F-statistic:  1123 on 7 and 2081 DF,  p-value: < 2.2e-16

De acuerdo con la información anterior, los coeficientes son los siguientes:

  1. Intercepto: -68,01 es el valor del precio de la casa cuando todas las variables son cero.
  2. areaconst: 1,22 es el coeficiente de regresión, indica que el precio aumenta 1,22 unidades manteniendo las demás variables constantes. Su valor de probabilidad asociado al valor t indica es que es significativo.
  3. estrato4: 27,72 es el coeficiente de regresión, indica que el precio aumenta 27,72 unidades manteniendo las demás variables constantes. Su valor de probabilidad asociado al valor t indica es que es significativo.
  4. estrato5: 49,90 es el coeficiente de regresión, indica que el precio aumenta 49,90 unidades manteniendo las demás variables constantes. Su valor de probabilidad asociado al valor t indica es que es significativo.
  5. estrato6: 184,37 es el coeficiente de regresión, indica que el precio aumenta 184,37 unidades manteniendo las demás variables constantes. Su valor de probabilidad asociado al valor t indica es que es significativo.
  6. habitaciones: -7,82 es el coeficiente de regresión, indica que el precio disminuye -7,82 unidades manteniendo las demás variables constantes. Su valor de probabilidad asociado al valor t indica es que es significativo.
  7. parqueaderos: 75,92 es el coeficiente de regresión, indica que el precio aumenta 75,92 unidades manteniendo las demás variables constantes. Su valor de probabilidad asociado al valor t indica es que es significativo.
  8. baños: 43,36 es el coeficiente de regresión, indica que el precio aumenta 43,36 unidades manteniendo las demás variables constantes. Su valor de probabilidad asociado al valor t indica es que es significativo.

El valor de R2 que se muestra en el resumen indica que el modelo creado es capaz de explicar el 79,07% de la variabilidad del precio de los apartamentos.

2.4 Validación de supuestos del modelo

En este apartado se detemrinará si el modelo es adecuado o hay que probar otros caminos que permitan encontrar uno mejor. Para ello se realiza la validación de los supuestos del modelo a partir de la siguiente En este caso se concluye lo siguiente:

  1. En el gráfico Residuals vs Fitted se puede observar que los residuos se distribuyen aleatoriamente alrededor de cero. Sin embargo, en los valores ajustados más altos pareciera que exhiben un patrón por lo que este supuesto no se confirma.
  2. En el gráfico de residuos Q-Q los puntos se desvían de la línea recta en los extremos, lo que sugiere no seguir un distribución normal. Este supuesto no se cumple.
  3. En el gráfico Scale-Location se observa que los residuos estandarizados aumentan a medida que los valores ajustados aumentan. Lo anterior sugiere que la varianza de los residuos no es constante.

Como supuesto adicional, se incluye el Factor de Inflación de Varianza para detectar multicolinealidad:

##                  GVIF Df GVIF^(1/(2*Df))
## areaconst    2.162200  1        1.470442
## estrato      1.894517  3        1.112371
## habitaciones 1.444436  1        1.201847
## parqueaderos 1.956169  1        1.398631
## banios       2.663556  1        1.632041

El criterio para detectar multicolinealidad es:

  • VIF <= 5: no hay problemas de multicolinealidad.
  • 5 > VIF <= 10: hay problemas de multicolinealidad moderada.
  • VIF > 10: hay problemas de multicolinealidad graves

Este modelo no tiene problemas de multicolinealidad. Sin embargo, el modelo no cumple con los supuestos por lo que se sugiere transformar la variable dependiente o transformar la variable dependiente e independiente y así probar cada combinación para validar si el modelo mejora y se ajusta a los supuestos.

2.5 Modelo con división de conjunto de datos en 70/30

Se realiza la creación del modelo que use el 70% de los datos de apartamentos para entrenamiento y el 30% para pruebas. A continuación de muestran sus principales características.

## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = datos_train_apto)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -806.69  -36.92   -3.77   35.21  867.43 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -70.94728   16.85842  -4.208 2.73e-05 ***
## areaconst      0.99108    0.06163  16.081  < 2e-16 ***
## estrato4      32.09087   11.79753   2.720   0.0066 ** 
## estrato5      57.09051   11.94969   4.778 1.95e-06 ***
## estrato6     201.48805   14.16785  14.221  < 2e-16 ***
## habitaciones  -4.88525    4.80446  -1.017   0.3094    
## parqueaderos  89.14807    5.64212  15.800  < 2e-16 ***
## banios        40.45818    4.17291   9.695  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 91 on 1457 degrees of freedom
## Multiple R-squared:  0.7834, Adjusted R-squared:  0.7824 
## F-statistic: 752.8 on 7 and 1457 DF,  p-value: < 2.2e-16

Se observa que el R2 es 78,34%, un variabilidad explicada menor que la del modelo entrenado con todos los datos. A continuación se muestra el Error Cuadrático Medio (MSE) y el Error Absoluto Medio (MAE):

## Error Cuadrático Medio (MSE): 8606.375
## Error Absoluto Medio (MAE): 56.44594

El MSE indica que la diferencia entre los valores reales y predichos es de 8606,375. En este caso la variable a predecir se interpreta en millones, los valores inician desde 0 hasta valores por encima de 1.500 sin incluir los ceros para millones. Que el valor de MSE sea grande podría sugerir que el rendimiento no es el óptimo.

Por su parte el MAE indica la media de las diferencias absolutas entre los valores reales y predichos. En promedio el modelo se equivoca en 56,44 millones en la predicción del precio.

A partir del modelo anterior se realiza la predicción del apartamento con las características solicitadas.

## El precio estimado para un apartamento de estrato 5 con las características indicadas es 647.8587 millones COP
## El precio estimado para un apartamento de estrato 6 con las características indicadas es 792.2562 millones COP

2.6 Predicción apartamento

En este apartado se usará el modelo entrenado con todo el conjunto de datos que explica mejor la variabilidad del precio. A continuación se muestra el precio estimado para un apartamento de estrato 5 con 300 m2 de área construida, 5 habitaciones, 3 parqueadero y 3 habitaciones.

## El precio estimado para un apartamento de estrato 5 con las características indicadas es 668.7999 millones COP

Se realiza la misma predicción, pero esta vez el estrato es 6 por lo que el precio estimado es el siguiente.

## El precio estimado para un apartamento de estrato 5 con las características indicadas es 803.2741 millones COP

En este modelo, las predicciones no superan el crédito preaprobado. A continuación se mostrarán las ofertas de apartamentos en el mapa.

2.7 Mapa con ofertas

A continuación, se muestra nuevamente el mapa con ofertas que cumplen con las condiciones solicitadas para el apartamento.

A pesar de que se solicitaron mínimo 5 ofertas, la combinación requerida para el apartamento solo arroja 2 ofertas. Cabe resaltar que ningún apartamento coincidió exactamente con las características solicitadas, por lo tanto se incluyeron aquellas viviendas así:

  1. Precio menor o igual a 850 millones COP
  2. Área construida mayor o igual a 300 metros cuadrados
  3. Estrato 5 y 6
  4. Habitaciones mayor o iguales a 5
  5. Parqueaderos mayor o iguales a 3
  6. Baños mayor o iguales 3

Al situarse sobre cada punto se observarán las características del apartamento.

3. Conclusiones

  1. La matriz de correlación tanto para apartamentos como casas determinó que el precio tiene correlación positiva con todas las demás variables. Es decir, cuando una variable independientes aumenta, la dependiente también lo hace.

  2. En general, los modelos de regresión lineal múltiple, tanto para casas como para apartamentos, tienen mejor rendimiento desde la métrica R2 cuando se entrenan usando todo el conjunto de datos. Aquellos entrenados con el 70% de los datos tienen un rendimiento cercano al mencionado anteriormente.

  3. Los modelos con mejor rendimiento no cumplieron los supuestos. Esto indicaría que existe un mejor modelo que se puede encontrar a través de la transformación de las variables dependiente y/o independiente.

  4. El modelo para las casas determinó que el precio de las viviendas con las características solicitadas para estrato 4 y 5 son 467,7 y 512,1 millones COP respectivamente. El modelo para los apartamentos determinó que el precio de las viviendas con las características solicitadas para estrato 5 y 6 son 668,7 y 803,2 millones COP respectivamente.

  5. Finalmente, se identificaron en cada conjunto de datos 32 ofertas de casas y 2 ofertas de apartamentos para las condiciones solicitadas.

4. Anexos

A continuación se muestran los anexos que soportan el análisis realizado anteriormente.

4.1 Datos generales

#Dimensiones del conjunto de datos
cat("Observaciones:", nrow(vivienda), "\n")
cat("Variables:", ncol(vivienda), "\n")
#Variables usadas para construir el modelo
df <- vivienda[, c("areaconst", "estrato", "habitaciones", "parqueaderos", "banios", "zona", "preciom", "tipo", "latitud", "longitud")]
colSums(is.na(df))
na <- df[is.na(df$tipo),]
df <- df[complete.cases(vivienda[ , 1]),]
#Se valida que no tengan errores ortográficos o duplicidad en nombres
unique(df$zona)
unique(df$tipo)
df$estrato <- as.factor(df$estrato)
#Conjuntos de datos para cada zona y tipo
df_norte <- subset(df, zona == "Zona Norte" & tipo == "Casa")
df_sur <- subset(df, zona == "Zona Sur" & tipo == "Apartamento")

4.2 Casa - Presupuesto 350 millones

#Imputación de parqueaderos con mediana
df_norte$parqueaderos[is.na(df_norte$parqueaderos)] <- median(df_norte$parqueaderos, na.rm = TRUE)
leaflet(df_norte) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, radius = 1)
# Límites
lat_norte_min <- 3.4590760476259175
long_norte_max <- -76.47274743134287
long_norte_min <- -76.53342515659959

# Base filtrada
df_norte <- df_norte %>%
  filter(
    latitud >= lat_norte_min &
    longitud >= long_norte_min &
    longitud <= long_norte_max
  )

# Mapa
leaflet(df_norte) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, radius = 1)
s1 <- plot_ly(df_norte, x = ~areaconst, y = ~preciom, type = 'scatter', mode = 'markers',
                text = ~paste("Estrato:", estrato, "<br>Baños:", banios, "<br>Habitaciones:", habitaciones),
                marker = list(size = 10, color = ~estrato, colorscale = 'Viridis')) %>%
  layout(title = "Precio vs. Área Construida Zona Norte",
         xaxis = list(title = "Área construida (m²)"),
         yaxis = list(title = "Precio (millones de pesos)"))

s1
s2 <- plot_ly(df_norte, x = ~habitaciones, y = ~preciom, type = 'scatter', mode = 'markers',
                marker = list(size = 10, color = ~preciom, colorscale = 'Viridis'),
                text = ~paste("Precio: ", preciom, "<br>Habitaciones: ", habitaciones)) %>%
  layout(title = "Precio y Número de Habitaciones",
         xaxis = list(title = "Número de Habitaciones"),
         yaxis = list(title = "Precio (Millones de pesos)"))
s2
s3 <- plot_ly(df_norte, x = ~banios, y = ~preciom, type = 'scatter', mode = 'markers',
                marker = list(size = 10, color = ~preciom, colorscale = 'Viridis'),
                text = ~paste("Precio: ", preciom, "<br>Baños: ", banios)) %>%
  layout(title = "Precio y Número de Baños",
         xaxis = list(title = "Número de Baños"),
         yaxis = list(title = "Precio (Millones de pesos)"))
s3
m_casa<- df_norte[, c("preciom", "areaconst", "habitaciones", "banios")]
corr_casa <- cor(m_casa, use = "complete.obs")
ggcorrplot(corr_casa, 
           method = "circle", 
           type = "lower", 
           lab = TRUE, 
           lab_size = 3, 
           colors = c("blue", "white", "red"), 
           title = "Matriz de Correlación Casas",
           ggtheme = theme_minimal())
modelo_casas <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = df_norte)
summary(modelo_casas)
par(mfrow = c(2, 2))
plot(modelo_casas)
vif_valor <- vif(modelo_casas)
vif_valor
library(caret)
set.seed(123)
particion_casas <- createDataPartition(df_norte$preciom, p = 0.7, list = FALSE)
datos_train_casas <- df_norte[particion_casas, ]
datos_test_casas <- df_norte[-particion_casas, ]

modelo_casas_7030 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = datos_train_casas)
summary(modelo_casas_7030)
predicciones_casas <- predict(modelo_casas_7030, newdata = datos_test_casas)

valores_reales_casas <- datos_test_casas$preciom

mse_casas <- mean((predicciones_casas - valores_reales_casas)^2)

mae_casas <- mean(abs(predicciones_casas - valores_reales_casas))

cat("Error Cuadrático Medio (MSE):", mse_casas, "\n")
cat("Error Absoluto Medio (MAE):", mae_casas, "\n")
casa_e4_7030 <- data.frame(areaconst = 300, estrato = factor(4, levels = c(4,5,6)), habitaciones = 5, parqueaderos = 3, banios = 3)
prediccion_casa_e4_7030 <- predict(modelo_casas_7030, casa_e4_7030)

casa_e5_7030 <- data.frame(areaconst = 300, estrato = factor(5, levels = c(4,5,6)), habitaciones = 5, parqueaderos = 3, banios = 3)
prediccion_casa_e5_7030 <- predict(modelo_casas_7030, casa_e5_7030)
cat("El precio estimado para una casa de estrato 4 con las características indicadas es", prediccion_casa_e4_7030[1], "millones COP\n")
cat("El precio estimado para una casa de estrato 5 con las características indicadas es", prediccion_casa_e5_7030[1], "millones COP" )
casa_e4 <- data.frame(areaconst = 300, estrato = factor(4, levels = c(4,5,6)), habitaciones = 5, parqueaderos = 3, banios = 3)
prediccion_casa_e4 <- predict(modelo_casas, casa_e4)

casa_e5 <- data.frame(areaconst = 300, estrato = factor(5, levels = c(4,5,6)), habitaciones = 5, parqueaderos = 3, banios = 3)
prediccion_casa_e5 <- predict(modelo_casas, casa_e5)
cat("El precio estimado para una casa de estrato 4 con las características indicadas es", prediccion_casa_e4[1], "millones COP\n")
cat("El precio estimado para una casa de estrato 5 con las características indicadas es", prediccion_casa_e5[1], "millones COP" )
ofertas_casa <- subset(df_norte, preciom <= 350 & areaconst >= 200 & estrato %in% c(4,5) & habitaciones >= 4 & parqueaderos >= 1 & banios >= 2)

leaflet(ofertas_casa) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud,
    lat = ~latitud,
    popup = ~paste(
      "<b>Área construida:</b>", areaconst, "m²<br>",
      "<b>Precio:</b>", preciom, "millones<br>",
      "<b>Baños:</b>", banios, "<br>",
      "<b>Habitaciones:</b>", habitaciones, "<br>",
      "<b>Parqueaderos:</b>", parqueaderos
    ),
    radius = 5,
    color = "blue",
    stroke = FALSE,
    fillOpacity = 0.8
  )

4.3 Apartamentos - Prespuesto 850 millones

#Imputación con mediana
df_sur$parqueaderos[is.na(df_sur$parqueaderos)] <- median(df_sur$parqueaderos, na.rm = TRUE)
df_sur <- subset(df, zona == "Zona Sur" & tipo == "Apartamento")
df_sur$parqueaderos[is.na(df_sur$parqueaderos)] <- median(df_sur$parqueaderos, na.rm = TRUE)
head(df_sur, 3)
leaflet(df_sur) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, radius = 1)
# Límites
lat_sur_max <- 3.41569687184311
long_sur_max <- -76.51308451456076
long_sur_min <- -76.54810840027045

# Base filtrada
df_sur <- df_sur %>%
  filter(
    latitud <= lat_sur_max &
    longitud >= long_sur_min &
    longitud <= long_sur_max
)


# Mapa
leaflet(df_sur) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, radius = 1)
s4 <- plot_ly(df_sur, x = ~areaconst, y = ~preciom, type = 'scatter', mode = 'markers',
                text = ~paste("Estrato:", estrato, "<br>Baños:", banios, "<br>Habitaciones:", habitaciones),
                marker = list(size = 10, color = ~estrato, colorscale = 'Viridis')) %>%
  layout(title = "Precio vs. Área Construida Zona Sur",
         xaxis = list(title = "Área construida (m²)"),
         yaxis = list(title = "Precio (millones de pesos)"))

s4
s5 <- plot_ly(df_sur, x = ~habitaciones, y = ~preciom, type = 'scatter', mode = 'markers',
                marker = list(size = 10, color = ~preciom, colorscale = 'Viridis'),
                text = ~paste("Precio: ", preciom, "<br>Habitaciones: ", habitaciones)) %>%
  layout(title = "Precio y Número de Habitaciones",
         xaxis = list(title = "Número de Habitaciones"),
         yaxis = list(title = "Precio (Millones de pesos)"))
s5
s6 <- plot_ly(df_sur, x = ~banios, y = ~preciom, type = 'scatter', mode = 'markers',
                marker = list(size = 10, color = ~preciom, colorscale = 'Viridis'),
                text = ~paste("Precio: ", preciom, "<br>Baños: ", banios)) %>%
  layout(title = "Precio y Número de Baños",
         xaxis = list(title = "Número de Baños"),
         yaxis = list(title = "Precio (Millones de pesos)"))
s6
m_apto<- df_sur[, c("preciom", "areaconst", "habitaciones", "banios")]
corr_apto <- cor(m_apto, use = "complete.obs")
ggcorrplot(corr_apto, 
           method = "circle", 
           type = "lower", 
           lab = TRUE, 
           lab_size = 3, 
           colors = c("blue", "white", "red"), 
           title = "Matriz de Correlación Apartamentos",
           ggtheme = theme_minimal())
modelo_apto <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = df_sur)
summary(modelo_apto)
par(mfrow = c(2, 2))
plot(modelo_apto)
vif_valor_apto <- vif(modelo_apto)
vif_valor_apto
library(caret)
set.seed(123)
particion_apto <- createDataPartition(df_sur$preciom, p = 0.7, list = FALSE)
datos_train_apto <- df_sur[particion_apto, ]
datos_test_apto <- df_sur[-particion_apto, ]

modelo_apto_7030 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = datos_train_apto)
summary(modelo_apto_7030)
predicciones <- predict(modelo_apto_7030, newdata = datos_test_apto)

valores_reales <- datos_test_apto$preciom

mse <- mean((predicciones - valores_reales)^2)

mae <- mean(abs(predicciones - valores_reales))

cat("Error Cuadrático Medio (MSE):", mse, "\n")
cat("Error Absoluto Medio (MAE):", mae, "\n")
apto_e5_7030 <- data.frame(areaconst = 300, estrato = factor(5, levels = c(4,5,6)), habitaciones = 5, parqueaderos = 3, banios = 3)
prediccion_apto_e5_7030 <- predict(modelo_apto_7030, apto_e5_7030)

apto_e6_7030 <- data.frame(areaconst = 300, estrato = factor(6, levels = c(4,5,6)), habitaciones = 5, parqueaderos = 3, banios = 3)
prediccion_apto_e6_7030 <- predict(modelo_apto_7030, apto_e6_7030)
cat("El precio estimado para un apartamento de estrato 5 con las características indicadas es", prediccion_apto_e5_7030[1], "millones COP\n")
cat("El precio estimado para un apartamento de estrato 6 con las características indicadas es", prediccion_apto_e6_7030[1], "millones COP" )
apto_e5 <- data.frame(areaconst = 300, estrato = factor(5, levels = c(4,5,6)), habitaciones = 5, parqueaderos = 3, banios = 3)
prediccion_apto_e5 <- predict(modelo_apto, apto_e5)
cat("El precio estimado para un apartamento de estrato 5 con las características indicadas es", prediccion_apto_e5[1], "millones COP" )
apto_e6 <- data.frame(areaconst = 300, estrato = factor(6, levels = c(4,5,6)), habitaciones = 5, parqueaderos = 3, banios = 3)
prediccion_apto_e6 <- predict(modelo_apto, apto_e6)
cat("El precio estimado para un apartamento de estrato 5 con las características indicadas es", prediccion_apto_e6[1], "millones COP" )
ofertas_apto <- subset(df_sur, preciom <= 850 & areaconst >= 300 & estrato %in% c(5,6) & habitaciones <= 5 & parqueaderos <= 3 & banios <= 3)

leaflet(ofertas_apto) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud,
    lat = ~latitud,
    popup = ~paste(
      "<b>Área construida:</b>", areaconst, "m²<br>",
      "<b>Precio:</b>", preciom, "millones<br>",
      "<b>Baños:</b>", banios, "<br>",
      "<b>Habitaciones:</b>", habitaciones, "<br>",
      "<b>Parqueaderos:</b>", parqueaderos
    ),
    radius = 5,
    color = "blue",
    stroke = FALSE,
    fillOpacity = 0.8
  )