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.
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.
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>
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.
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.
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.
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.
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.
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:
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.
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:
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:
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.
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
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.
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í:
Al situarse sobre cada punto se observarán las características de la casa.
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>
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.
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.
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.
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.
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.
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:
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.
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:
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:
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.
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
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.
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í:
Al situarse sobre cada punto se observarán las características del apartamento.
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.
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.
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.
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.
Finalmente, se identificaron en cada conjunto de datos 32 ofertas de casas y 2 ofertas de apartamentos para las condiciones solicitadas.
A continuación se muestran los anexos que soportan el análisis realizado anteriormente.
#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")
#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
)
#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
)