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

4. Validación de supuestos:

# Validación de supuestos del modelo
# 1. Linealidad
plot(modelo)

# 2. Homocedasticidad
residuos_estandarizados <- rstandard(modelo)
valores_ajustados <- fitted(modelo)
plot(valores_ajustados, residuos_estandarizados)

# 3. Normalidad de los residuos
qqnorm(residuos_estandarizados)
qqline(residuos_estandarizados)

# Prueba de normalidad Shapiro-Wilk
#shapiro.test(residuos_estandarizados)

# Histograma de los residuos estandarizados
hist(residuos_estandarizados, breaks = 20, main = "Histograma de Residuos Estandarizados")

# 4. Independencia de los residuos
acf(residuos_estandarizados)

# 5. No multicolinealidad
correlacion_variables_independientes <- cor(vivienda_ca[, c("areaconst", "estrato", "habitac", "parquea", "banios")])
correlacion_variables_independientes
##           areaconst estrato habitac parquea banios
## areaconst         1      NA      NA      NA     NA
## estrato          NA       1      NA      NA     NA
## habitac          NA      NA       1      NA     NA
## parquea          NA      NA      NA       1     NA
## banios           NA      NA      NA      NA      1

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