Carga de datos:
# Cargar los datos
vivienda_ca <- read.csv("vivienda-ca.csv")
# Explorar la estructura de los datos
str(vivienda_ca)
## 'data.frame': 8322 obs. of 13 variables:
## $ id : int 8312 8311 8307 8296 8297 8298 8299 8300 8286 8287 ...
## $ zona : chr "Zona Oeste" "Zona Oeste" "Zona Oeste" "Zona Sur" ...
## $ piso : int 4 1 NA 2 NA NA 2 NA NA 2 ...
## $ estrato : int 6 6 5 3 5 5 6 5 5 5 ...
## $ preciom : int 1300 480 1200 220 330 1350 305 480 275 285 ...
## $ areaconst: num 318 300 800 150 112 390 125 280 74 120 ...
## $ parquea : int 2 1 4 1 2 8 2 4 1 2 ...
## $ banios : int 4 4 7 2 4 10 3 4 2 4 ...
## $ habitac : int 2 4 5 4 3 10 3 4 3 3 ...
## $ tipo : chr "Apartamento" "Casa" "Casa" "Casa" ...
## $ barrio : chr "arboleda" "normandía" "miraflores" "el guabal" ...
## $ longitud : num -76576 -76571 -76568 -76565 -76565 ...
## $ latitud : num 3454 3454 3455 3417 3408 ...
1.Filtro BD (Base1):
# Filtrar las casas de la zona norte
casas_norte <- subset(vivienda_ca, tipo == "Casa" & zona == "Zona Norte")
# Mostrar los primeros 3 registros de casas en la zona norte
head(casas_norte, 3)
## id zona piso estrato preciom areaconst parquea banios habitac tipo
## 78 8088 Zona Norte NA 3 149 130 NA 2 3 Casa
## 417 6812 Zona Norte 7 4 670 470 4 5 5 Casa
## 460 6673 Zona Norte NA 5 750 300 2 3 5 Casa
## barrio longitud latitud
## 78 brisas de los -76555 3417.00
## 417 tejares de san -76545 3.44
## 460 el gran limonar -76544 3397.00
# Calcular precio promedio por estrato
precio_promedio_por_estrato <- aggregate(casas_norte$preciom, by = list(casas_norte$estrato), FUN = mean)
# Contar el número de casas por estrato
casas_por_estrato <- table(casas_norte$estrato)
# Mostrar los resultados
precio_promedio_por_estrato
## Group.1 x
## 1 3 245.6157
## 2 4 441.9308
## 3 5 550.0815
## 4 6 818.2545
casas_por_estrato
##
## 3 4 5 6
## 229 159 270 55
# Coordenadas de Cali, Colombia (latitud y longitud)
lat_cali <- 3.4516
lng_cali <- -76.5320
# Mapa centrado en Cali, Colombia
mapa_bases <- leaflet(data = casas_norte) %>%
addTiles() # Agregar capa de mapas base
# Establecer la vista inicial del mapa en Cali y ajustar el zoom
mapa_bases <- mapa_bases %>%
setView(lng = lng_cali, lat = lat_cali, zoom = 12) # Ajusta el valor de zoom según lo desees
# Añadir los puntos de las bases al mapa
mapa_bases <- mapa_bases %>%
addMarkers(
lng = ~longitud,
lat = ~latitud,
popup = ~barrio
)
# Mostrar el mapa
mapa_bases
total_registros <- nrow(vivienda_ca)
registros_en_zona_norte <- nrow(casas_norte)
registros_fuera_de_zona_norte <- total_registros - registros_en_zona_norte
cat("Total de registros:", total_registros, "\n")
## Total de registros: 8322
cat("Registros en la zona norte:", registros_en_zona_norte, "\n")
## Registros en la zona norte: 713
cat("Registros fuera de la zona norte:", registros_fuera_de_zona_norte, "\n")
## Registros fuera de la zona norte: 7609
2. Análisis Exploratorio Correlación:
# Gráfico de dispersión del precio vs. área construida
scatter_area_precio <- plot_ly(data = vivienda_ca, x = ~areaconst, y = ~preciom,
text = ~paste("Zona:", zona),
type = "scatter", mode = "markers", marker = list(size = 8))
# Gráfico de dispersión del precio vs. estrato
scatter_estrato_precio <- plot_ly(data = vivienda_ca, x = ~estrato, y = ~preciom,
text = ~paste("Zona:", zona),
type = "scatter", mode = "markers", marker = list(size = 8))
# Gráfico de dispersión del precio vs. número de baños
scatter_banios_precio <- plot_ly(data = vivienda_ca, x = ~banios, y = ~preciom,
text = ~paste("Zona:", zona),
type = "scatter", mode = "markers", marker = list(size = 8))
# Gráfico de dispersión del precio vs. número de habitaciones
scatter_habitaciones_precio <- plot_ly(data = vivienda_ca, x = ~habitac, y = ~preciom,
text = ~paste("Zona:", zona),
type = "scatter", mode = "markers", marker = list(size = 8))
# Mostrar los gráficos en una cuadrícula
subplot(scatter_area_precio, scatter_estrato_precio, scatter_banios_precio, scatter_habitaciones_precio,
nrows = 2, margin = 0.05) %>%
layout(title = "Correlación entre el Precio de la Casa y Variables Relevantes",
xaxis = list(title = "Variable Independiente"),
yaxis = list(title = "Precio de la Casa"))
3. Modelo regresión lineal múltiple:
# Estimar el modelo de regresión lineal múltiple
modelo <- lm(preciom ~ areaconst + estrato + habitac + parquea + banios, data = vivienda_ca)
# Mostrar un resumen del modelo
summary(modelo)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitac + parquea +
## banios, data = vivienda_ca)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1412.57 -88.36 -17.55 56.24 1101.38
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -380.7629 14.3638 -26.51 <2e-16 ***
## areaconst 0.8510 0.0222 38.33 <2e-16 ***
## estrato 97.9107 2.8342 34.55 <2e-16 ***
## habitac -31.2744 2.2613 -13.83 <2e-16 ***
## parquea 74.4922 2.5900 28.76 <2e-16 ***
## banios 61.0554 2.6271 23.24 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 177.2 on 6711 degrees of freedom
## (1605 observations deleted due to missingness)
## Multiple R-squared: 0.7206, Adjusted R-squared: 0.7204
## F-statistic: 3462 on 5 and 6711 DF, p-value: < 2.2e-16
5. Predicción precio vivienda:
# Valores de las variables independientes para la primera solicitud
areaconstruida_solicitud <- 150
estrato_solicitud <- 4
habitaciones_solicitud <- 3
parqueaderos_solicitud <- 2
banios_solicitud <- 2
# Crear un dataframe con estos valores
solicitud <- data.frame(
areaconst = areaconstruida_solicitud,
estrato = estrato_solicitud,
habitac = habitaciones_solicitud,
parquea = parqueaderos_solicitud,
banios = banios_solicitud
)
# Realizar la predicción usando el modelo
precio_predicho <- predict(modelo, newdata = solicitud)
# Mostrar el precio predicho
precio_predicho
## 1
## 315.8025
6. Predicción potenciales ofertas:
# Calcular las predicciones de precio para todas las viviendas en el conjunto de datos original
predicciones_precio <- predict(modelo, newdata = vivienda_ca)
# Crear un nuevo dataframe con las predicciones de precio y coordenadas geográficas
ofertas_potenciales <- data.frame(
longitud = vivienda_ca$longitud,
latitud = vivienda_ca$latitud,
precio_predicho = predicciones_precio
)
# Filtrar las ofertas potenciales dentro del rango de crédito preaprobado
ofertas_potenciales <- subset(ofertas_potenciales, precio_predicho <= 350)
# Ordenar las ofertas potenciales por precio predicho en orden ascendente
ofertas_potenciales <- ofertas_potenciales[order(ofertas_potenciales$precio_predicho), ]
# Seleccionar al menos 5 ofertas potenciales (las 5 más asequibles)
ofertas_seleccionadas <- head(ofertas_potenciales, 5)
# Cargar la biblioteca leaflet
library(leaflet)
# Crear un mapa de Cali con las ofertas potenciales
mapa_ofertas <- leaflet(data = ofertas_seleccionadas) %>%
addTiles() # Agregar capa de mapas base
# Añadir los puntos de las ofertas potenciales al mapa
mapa_ofertas <- mapa_ofertas %>%
addMarkers(
lng = ~longitud,
lat = ~latitud,
popup = ~paste("Precio Predicho: $", round(precio_predicho, 2), " millones")
)
# Mostrar el mapa
mapa_ofertas
7. Segunda solicitud:
# Calcular las predicciones de precio para todas las viviendas en el conjunto de datos original
predicciones_precio <- predict(modelo, newdata = vivienda_ca)
# Crear un nuevo dataframe con las predicciones de precio y coordenadas geográficas
ofertas_potenciales <- data.frame(
longitud = vivienda_ca$longitud,
latitud = vivienda_ca$latitud,
precio_predicho = predicciones_precio
)
# Filtrar las ofertas potenciales dentro del rango de crédito preaprobado
ofertas_potenciales <- subset(ofertas_potenciales, precio_predicho <= 850)
# Ordenar las ofertas potenciales por precio predicho en orden ascendente
ofertas_potenciales <- ofertas_potenciales[order(ofertas_potenciales$precio_predicho), ]
# Seleccionar al menos 5 ofertas potenciales (las 5 más asequibles)
ofertas_seleccionadas <- head(ofertas_potenciales, 5)
# Cargar la biblioteca leaflet
library(leaflet)
# Coordenadas de Cali, Colombia (latitud y longitud)
lat_cali <- 3.4516
lng_cali <- -76.5320
# Crear un mapa centrado en Cali, Colombia con un zoom adecuado
mapa_ofertas <- leaflet() %>%
setView(lng = lng_cali, lat = lat_cali, zoom = 13) # Ajustar el valor de zoom según sea necesario
# Agregar capa de mapas base
mapa_ofertas <- mapa_ofertas %>%
addTiles()
# Añadir los puntos de las ofertas potenciales al mapa
mapa_ofertas <- mapa_ofertas %>%
addMarkers(
data = ofertas_seleccionadas,
lng = ~longitud,
lat = ~latitud,
popup = ~paste("Precio Predicho: $", round(precio_predicho, 2), " millones")
)
# Mostrar el mapa
mapa_ofertas