1 Actividad 2

1.1 Problema

Se solicita 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 utilizando técnicas modelación de regresión lineal.

Se requiere un informe ejecutivo donde analicen los dos casos y las recomendaciones (Informe). Como soporte del informe debe anexar las estimaciones, validaciones y comparación de modelos requeridos (Anexos).

# Carga de base de paquetes y librerías requeridas para el ejercicio

library(dplyr)
library(tidyverse)
library(modelr)
library(readr)
library(plotly)
library(purrr)
library(lubridate)
library(tibble)
library(moments)
library(hexbin)
library(splines)
library(paqueteMODELOS)

1.2 Carga de la base de datos

#carga de data
#data("vivienda")
#str(vivienda)
#write.csv(vivienda, "datos_vivienda.csv", row.names = TRUE)

vivienda <- read.csv("datos_vivienda.csv")

1.3 Preparación de los datos

#Convertir todos los caracteres a minúsculas
vivienda$zona <- tolower(vivienda$zona)
vivienda$tipo <- tolower(vivienda$tipo)
vivienda$barrio <- tolower(vivienda$barrio)

# valido tipos apartamento y casa
resumen_tipo<-vivienda$tipo
resumen_tipo <- table(resumen_tipo)
resumen_tipo
## resumen_tipo
## apartamento        casa 
##        5100        3219
# valido variable zona
resumen_zona<-vivienda$zona
resumen_zona <- table(resumen_zona)
resumen_zona
## resumen_zona
##  zona centro   zona norte   zona oeste zona oriente     zona sur 
##          124         1920         1198          351         4726
# valido variable barrio


# quitar tildes en barrio
vivienda$barrio = str_replace_all(vivienda$barrio,"á", "a")
vivienda$barrio = str_replace_all(vivienda$barrio,"é", "e")
vivienda$barrio = str_replace_all(vivienda$barrio,"í", "i")
vivienda$barrio = str_replace_all(vivienda$barrio,"ó", "o")
vivienda$barrio = str_replace_all(vivienda$barrio,"ú", "u")
#corregir caracteres extraños en algunos nombres de barrio
vivienda$barrio = str_replace_all(vivienda$barrio,"alférez real", "alferez real")
vivienda$barrio = str_replace_all(vivienda$barrio,"base aérea", "base aerea")
vivienda$barrio = str_replace_all(vivienda$barrio,"ciudad meléndez", "ciudad melendez")
vivienda$barrio = str_replace_all(vivienda$barrio,"el trébol", "el trebol")
vivienda$barrio = str_replace_all(vivienda$barrio,"juanamb√∫", "juanambu")
vivienda$barrio = str_replace_all(vivienda$barrio,"las américas", "las americas")
vivienda$barrio = str_replace_all(vivienda$barrio,"rep√∫blica de israel", "republica de israel")
vivienda$barrio = str_replace_all(vivienda$barrio,"meléndez", "melendez")
# corrección barrio agua blanca por aguablanca
vivienda <- vivienda %>%
  mutate(barrio = ifelse(barrio == "agua blanca", "aguablanca", barrio))
##correr en consola estas lineas para validar cambios en var barrio
#resumen_barrio<-vivienda$barrio
#resumen_barrio <- table(resumen_barrio)
#resumen_barrio
# Detección de datos faltantes

vivienda_na <- colSums(is.na(vivienda)) %>%
  as.data.frame()
vivienda_na

Faltantes Fríticos piso 2638 faltantes -> 32% de la data parqueaderos 1605 faltantes -> 19% de la data Los demás faltantes son irrelevantes pues reprensentan un porcentaje ínfimo de la muestra (<=0.04%)

# Imputación de valores faltantes de parqueaderos a 0

vivienda$parqueaderos[is.na(vivienda$parqueaderos)] <- 0

#vivienda_parquea0<-subset(vivienda, vivienda$parquea==0)
# se reemplazaron 1606 datos faltantes por 0
#verifico faltantes de parqueadero

vivienda_na <- colSums(is.na(vivienda)) %>%
  as.data.frame()
vivienda_na
# Imputación de valores faltantes de piso por la moda

# Función para calcular la moda
calcular_moda <- function(x) {
  uniq_x <- unique(x[!is.na(x)]) # Excluir NAs y valores duplicados
  uniq_x[which.max(tabulate(match(x, uniq_x)))]
}

# Calcular la moda de la variable piso
moda <- calcular_moda(vivienda$piso)

# Imputar los valores NA con la media
vivienda$piso[is.na(vivienda$piso)] <- moda

#verifico faltantes de piso

vivienda_na <- colSums(is.na(vivienda)) %>%
  as.data.frame()
vivienda_na
# Agrego variable precio/m2

vivienda <- mutate(vivienda, precio_m2=preciom/areaconst)

# Gráfico de Relación TIPO INMUEBLE VS PRECIO PROMEDIO:

boxplot(precio_m2 ~ tipo, data = vivienda, xlab = "Tipo", ylab = "Precio - MM", main = "Precio metro cuadrado VS Tipo inmueble")

Mediante el diagrama de caja que compara el valor por metro cuadrado encontramos que la media de precio por metro cuadrado resulta ser mayor en apartamentos que en casas.

2 CASO VIVIENDA 1: CASA ZONA NORTE

3 1. Filtrado de la base de datos

Realizar un filtro a la base de datos que incluya solo las ofertas de casas de la zona norte de la ciudad.

Presentar los primeros 3 registros de las bases y algunas tablas que comprueben la consulta.

# FILTRO CASAS DE LA ZONA NORTE

vivienda_casas_norte<-filter(vivienda, vivienda$tipo == "casa", vivienda$zona == "zona norte")

#Valido las dimensiones del subset de casas de la zona norte
dim(vivienda_casas_norte)
## [1] 722  14
#Obtengo los primeros 3 registros del dataframe
head(vivienda_casas_norte, 3)
# verifico algunas estadísticas básicas del dataframe para una visión general de las variables numéricas y categóricas.
summary(vivienda_casas_norte)
##        id             zona                piso          estrato     
##  Min.   :  58.0   Length:722         Min.   :1.000   Min.   :3.000  
##  1st Qu.: 766.2   Class :character   1st Qu.:2.000   1st Qu.:3.000  
##  Median :2257.0   Mode  :character   Median :2.000   Median :4.000  
##  Mean   :2574.6                      Mean   :1.997   Mean   :4.202  
##  3rd Qu.:4225.0                      3rd Qu.:2.000   3rd Qu.:5.000  
##  Max.   :8319.0                      Max.   :7.000   Max.   :6.000  
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  89.0   Min.   :  30.0   Min.   : 0.000   Min.   : 0.000  
##  1st Qu.: 261.2   1st Qu.: 140.0   1st Qu.: 0.000   1st Qu.: 2.000  
##  Median : 390.0   Median : 240.0   Median : 1.000   Median : 3.000  
##  Mean   : 445.9   Mean   : 264.9   Mean   : 1.314   Mean   : 3.555  
##  3rd Qu.: 550.0   3rd Qu.: 336.8   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1940.0   Max.   :1440.0   Max.   :10.000   Max.   :10.000  
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:722         Length:722         Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.53  
##  Median : 4.000   Mode  :character   Mode  :character   Median :-76.52  
##  Mean   : 4.507                                         Mean   :-76.52  
##  3rd Qu.: 5.000                                         3rd Qu.:-76.50  
##  Max.   :10.000                                         Max.   :-76.47  
##     latitud        precio_m2     
##  Min.   :3.333   Min.   :0.2569  
##  1st Qu.:3.452   1st Qu.:1.3746  
##  Median :3.468   Median :1.6641  
##  Mean   :3.460   Mean   :1.8460  
##  3rd Qu.:3.482   3rd Qu.:2.1396  
##  Max.   :3.496   Max.   :7.0000
# Presento tabla de frecuencia para la variable 'estrato'
table(vivienda_casas_norte$estrato)
## 
##   3   4   5   6 
## 235 161 271  55

##Histograma interactivo para validar distribución de variable preciom

# Histograma interactivo
fig3 <- plot_ly(x = ~vivienda_casas_norte$preciom, type = 'histogram')
fig3

Presentar un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas y explicar por qué.

library(leaflet)

# Definir las coordenadas centrales de Cali, Colombia
cali_coords <- c(lat = 3.4516, lng = -76.5319)

# Crear un mapa centrado en Cali y agregar los puntos
leaflet(data = vivienda_casas_norte) %>%
  addTiles() %>%  # Agregar el fondo del mapa
  setView(lng = cali_coords["lng"], lat = cali_coords["lat"], zoom = 12) %>%  # Centrarse en Cali
  addCircleMarkers(~longitud, ~latitud,  # Usar las columnas de longitud y latitud
                   radius = 5,  # Tamaño de los puntos
                   color = "blue",  # Color de los puntos
                   stroke = FALSE,  # Sin borde en los puntos
                   fillOpacity = 0.7,  # Opacidad de los puntos
                   label = ~paste("Tipo: ", tipo),  # Etiqueta mostrando el tipo de vivienda
                   labelOptions = labelOptions(noHide = FALSE, direction = "auto"))

4 2. Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.

4.1 Tabla de correlacion de variables numericas

# convertir variable piso a numérico
vivienda_casas_norte$piso <- as.numeric(as.character(vivienda_casas_norte$piso))

#calcular tabla de correlacion de variables numericas
cor_matrix <- cor(vivienda_casas_norte[,3:9])
cor_matrix
##                       piso    estrato     preciom  areaconst  parqueaderos
## piso          1.0000000000 -0.1093198 -0.01601832 0.02490458 -0.0006436714
## estrato      -0.1093198135  1.0000000  0.61235030 0.45738180  0.3495772176
## preciom      -0.0160183216  0.6123503  1.00000000 0.73134800  0.3171471739
## areaconst     0.0249045780  0.4573818  0.73134800 1.00000000  0.3171473009
## parqueaderos -0.0006436714  0.3495772  0.31714717 0.31714730  1.0000000000
## banios        0.1044026345  0.4083039  0.52333570 0.46281525  0.3267373570
## habitaciones  0.1013881596  0.1073141  0.32270961 0.37533231  0.2689443373
##                 banios habitaciones
## piso         0.1044026    0.1013882
## estrato      0.4083039    0.1073141
## preciom      0.5233357    0.3227096
## areaconst    0.4628152    0.3753323
## parqueaderos 0.3267374    0.2689443
## banios       1.0000000    0.5755314
## habitaciones 0.5755314    1.0000000

4.2 Correlograma de matriz de correlación

library(corrplot)
corrplot(cor_matrix, type="upper", order="hclust",
         tl.col = "black", tl.srt = 45)

En la matriz de correlación vemos que la variable objetivo “precio” tiene alta correlación con las demás variables numéricas, excepto con la variable “piso”, lo que nos lleva a concluir que el número de pisos de la casa no es tan determinante en el precio de venta, como si lo son las demás variables.

También podemos ver en el correlograma que las variables independientes no guardan correlación significativa entre sí, por lo tanto no existe colinealidad y todas son susceptibles de ser incluidas en el modelo de regresión lineal.

5 3. Modelo de regresión lineal múltiple

Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).

# 
reg_casas <- lm(preciom ~ piso + banios + habitaciones + parqueaderos + estrato + areaconst, data = vivienda_casas_norte)

summary(reg_casas, digits=5)
## 
## Call:
## lm(formula = preciom ~ piso + banios + habitaciones + parqueaderos + 
##     estrato + areaconst, data = vivienda_casas_norte)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -959.81  -80.43  -17.42   50.54 1068.87 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -223.41398   39.44659  -5.664 2.15e-08 ***
## piso           -5.99485   11.54753  -0.519    0.604    
## banios         27.29998    5.38203   5.072 5.01e-07 ***
## habitaciones    1.47961    4.16679   0.355    0.723    
## parqueaderos   -1.67863    4.31725  -0.389    0.698    
## estrato        85.82055    7.49251  11.454  < 2e-16 ***
## areaconst       0.82738    0.04372  18.923  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 159.2 on 715 degrees of freedom
## Multiple R-squared:  0.6509, Adjusted R-squared:  0.648 
## F-statistic: 222.2 on 6 and 715 DF,  p-value: < 2.2e-16

El coeficiente R2 de 0.6509 nos representa un nivel aceptable del modelo, tratándose de variables numéricas.

Los estimados de banios (27.3) y estrato (85.8) nos muestran que son quienes aportan de manera altamente significativa al precio de la casa en la zona norte, así como el área construida, mientras que el número de habitaciones aportan de manera mínima al precio del inmueble.

6 4. Validación de supuestos del modelo

Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer).

6.1 Estimación de residuos

predict <- vivienda_casas_norte %>%
  add_predictions(reg_casas) %>%
  add_residuals(reg_casas)

# valido que la media de los residuos tienda a CERO
mean(predict$resid)
## [1] -4.677885e-12

6.2 Histograma de residuos

# Se valida distribución normal de los residuos
hist(predict$resid)

6.3 Gráfica de residuos contra variable dependiente estimada

predict%>%
  ggplot(aes(x=pred, y=resid^2)) +
  geom_point() + 
  geom_smooth(color="red", se=FALSE)

6.4 validar covarianza de pred contra residuos es constante

6.5 graficamente

predict%>%
     ggplot(aes(x=pred,y=resid))+
     geom_point()+
     geom_smooth(color="red",se=FALSE)

6.6 Covarianza de pred contra residuos numericamente

cov(predict$pred,predict$resid)
## [1] 4.843298e-11

7 5. Predecir el precio de la casa solicitada

Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.

Casa en Estrato 4 área construida 200 * 0.82738 parqueaderos 1 * (-1.67863) baños 2 * 27.29998 habitaciones 4 * 1.47961 estrato 4 * 85.82055 (Intercept) -223.41398

precio_casa_norte_4 <- -223.41398 + 200 * 0.82738 + 1 * (-1.67863) + 2 * 27.29998 + 4 * 85.82055
precio_casa_norte_4
## [1] 338.2655

El precio predicho para una casa estrato 4 en la zona norte de la ciudad de Cali es de: $338,2655 millones de pesos, por tanto, se encuentra dentro del cupo de crédito preaprobado

Casa en Estrato 5 área construida 200 * 0.82738 parqueaderos 1 * (-1.67863) baños 2 * 27.29998 habitaciones 4 * 1.47961 estrato 4 * 85.82055 (Intercept) -223.41398

precio_casa_norte_5 <- -223.41398 + 200 * 0.82738 + 1 * (-1.67863) + 2 * 27.29998 + 5 * 85.82055
precio_casa_norte_5
## [1] 424.0861

El precio predicho para una casa estrato 5 en la zona norte de la ciudad de Cali es de: $424.0861 millones de pesos, por tanto, se encuentra fuera del cupo de crédito preaprobado

El comprador debería optar por una casa en el estrato 4.

8 6. Potenciales ofertas de la vivienda solicitada (casa)

Con las predicciones del modelo sugiera potenciales ofertas que responda a la solicitud de la vivienda 1. Tenga encuentra que la empresa tiene crédito pre-aprobado de máximo 350 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.

Características Vivienda 1 Tipo Casa área construida 200 parqueaderos 1
baños 2 habitaciones 5 estrato 4 o 5 zona Norte Crédito preaprobado 350 millones

# Filtrar registros que cumplan con las características de búsqueda
filtro_casas_norte <- subset(vivienda_casas_norte,
                           banios >= 2 & 
                           habitaciones >= 5 & 
                           parqueaderos >= 1 & 
                           estrato >= 4 & 
                           estrato <= 5 & 
                           areaconst >= 200 &
                           preciom < 350)

# Ver cantidad de inmuebles que cumplen con el filtro
nrow(filtro_casas_norte)
## [1] 13

13 casas cumplen los requisitos del filtro. Se muestra una tabla con 10 propuestas

# Ver los primeros registros que cumplen el filtro
head(filtro_casas_norte,10)
# Crear un mapa centrado en Cali y agregar los puntos
leaflet(data = filtro_casas_norte) %>%
  addTiles() %>%  # Agregar el fondo del mapa
  setView(lng = cali_coords["lng"], lat = cali_coords["lat"], zoom = 12) %>%  # Centrarse en Cali
  addCircleMarkers(~longitud, ~latitud,  # Usar las columnas de longitud y latitud
                   radius = 5,  # Tamaño de los puntos
                   color = "blue",  # Color de los puntos
                   stroke = FALSE,  # Sin borde en los puntos
                   fillOpacity = 0.7,  # Opacidad de los puntos
                   label = ~paste("Id: ", id),  # Etiqueta mostrando el id de vivienda
                   labelOptions = labelOptions(noHide = FALSE, direction = "auto"))

Mediante el mapa interactivo podemos identificar que los inmuebles con id 7432 y 7470 no se encuentran dentro de la zona norte, por lo tanto no se deben tomar en cuenta en la recomendación.

9 CASO VIVIENDA 2: APARTAMENTO ZONA SUR

10 1. Filtrado de la base de datos

Realizar un filtro a la base de datos que incluya solo las ofertas de apartamentos de la zona sur de la ciudad.

Presentar los primeros 3 registros de las bases y algunas tablas que comprueben la consulta.

# FILTRO APARTAMENTOS DE LA ZONA SUR

vivienda_apartamentos_sur<-filter(vivienda, vivienda$tipo == "apartamento", vivienda$zona == "zona sur")

#Valido las dimensiones del subset de casas de la zona norte
dim(vivienda_apartamentos_sur)
## [1] 2787   14
#Obtengo los primeros 3 registros del dataframe
head(vivienda_apartamentos_sur, 3)
# verifico algunas estadísticas básicas del dataframe para una visión general de las variables numéricas y categóricas.
summary(vivienda_apartamentos_sur)
##        id           zona                piso           estrato    
##  Min.   :   3   Length:2787        Min.   : 1.000   Min.   :3.00  
##  1st Qu.:2292   Class :character   1st Qu.: 2.000   1st Qu.:4.00  
##  Median :4004   Mode  :character   Median : 3.000   Median :5.00  
##  Mean   :4131                      Mean   : 3.918   Mean   :4.63  
##  3rd Qu.:5876                      3rd Qu.: 5.000   3rd Qu.:5.00  
##  Max.   :8302                      Max.   :12.000   Max.   :6.00  
##     preciom         areaconst       parqueaderos        banios     
##  Min.   :  75.0   Min.   : 40.00   Min.   : 0.000   Min.   :0.000  
##  1st Qu.: 175.0   1st Qu.: 65.00   1st Qu.: 1.000   1st Qu.:2.000  
##  Median : 245.0   Median : 85.00   Median : 1.000   Median :2.000  
##  Mean   : 297.3   Mean   : 97.47   Mean   : 1.208   Mean   :2.488  
##  3rd Qu.: 335.0   3rd Qu.:110.00   3rd Qu.: 2.000   3rd Qu.:3.000  
##  Max.   :1750.0   Max.   :932.00   Max.   :10.000   Max.   :8.000  
##   habitaciones       tipo              barrio             longitud     
##  Min.   :0.000   Length:2787        Length:2787        Min.   :-76.57  
##  1st Qu.:3.000   Class :character   Class :character   1st Qu.:-76.54  
##  Median :3.000   Mode  :character   Mode  :character   Median :-76.53  
##  Mean   :2.966                                         Mean   :-76.53  
##  3rd Qu.:3.000                                         3rd Qu.:-76.52  
##  Max.   :6.000                                         Max.   :-76.46  
##     latitud        precio_m2    
##  Min.   :3.334   Min.   :0.281  
##  1st Qu.:3.370   1st Qu.:2.473  
##  Median :3.383   Median :2.902  
##  Mean   :3.390   Mean   :2.988  
##  3rd Qu.:3.406   3rd Qu.:3.405  
##  Max.   :3.497   Max.   :6.414
# Presento tabla de frecuencia para la variable 'estrato'
table(vivienda_apartamentos_sur$estrato)
## 
##    3    4    5    6 
##  201 1091 1033  462

##Histograma interactivo para validar distribución de variable preciom

# Histograma interactivo
fig4 <- plot_ly(x = ~vivienda_apartamentos_sur$preciom, type = 'histogram')
fig4

Presentar un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas y explicar por qué.

#library(leaflet)

# Definir las coordenadas centrales de Cali, Colombia
cali_coords <- c(lat = 3.4516, lng = -76.5319)

# Crear un mapa centrado en Cali y agregar los puntos
leaflet(data = vivienda_apartamentos_sur) %>%
  addTiles() %>%  # Agregar el fondo del mapa
  setView(lng = cali_coords["lng"], lat = cali_coords["lat"], zoom = 12) %>%  # Centrarse en Cali
  addCircleMarkers(~longitud, ~latitud,  # Usar las columnas de longitud y latitud
                   radius = 5,  # Tamaño de los puntos
                   color = "blue",  # Color de los puntos
                   stroke = FALSE,  # Sin borde en los puntos
                   fillOpacity = 0.7,  # Opacidad de los puntos
                   label = ~paste("Tipo: ", tipo),  # Etiqueta mostrando el tipo de vivienda
                   labelOptions = labelOptions(noHide = FALSE, direction = "auto"))

11 2. Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio del apartamento) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.

11.1 Tabla de correlacion de variables numericas

# convertir variable piso a numérico
vivienda_apartamentos_sur$piso <- as.numeric(as.character(vivienda_apartamentos_sur$piso))

#calcular tabla de correlacion de variables numericas
cor_matrix <- cor(vivienda_apartamentos_sur[,3:9])
cor_matrix
##                      piso    estrato    preciom    areaconst parqueaderos
## piso         1.0000000000 0.03861201 0.03892962 0.0005839222   0.04669085
## estrato      0.0386120135 1.00000000 0.67270665 0.4815592627   0.54913528
## preciom      0.0389296155 0.67270665 1.00000000 0.7579955264   0.67474970
## areaconst    0.0005839222 0.48155926 0.75799553 1.0000000000   0.55867749
## parqueaderos 0.0466908458 0.54913528 0.67474970 0.5586774943   1.00000000
## banios       0.0464176498 0.56861707 0.71967045 0.6618178702   0.56514551
## habitaciones 0.0042302681 0.21259528 0.33175381 0.4339607747   0.28631173
##                  banios habitaciones
## piso         0.04641765  0.004230268
## estrato      0.56861707  0.212595282
## preciom      0.71967045  0.331753812
## areaconst    0.66181787  0.433960775
## parqueaderos 0.56514551  0.286311726
## banios       1.00000000  0.514922735
## habitaciones 0.51492273  1.000000000

11.2 Correlograma de matriz de correlación

#library(corrplot)
corrplot(cor_matrix, type="upper", order="hclust",
         tl.col = "black", tl.srt = 45)

En la matriz de correlación vemos que la variable objetivo “precio” tiene alta correlación con las demás variables numéricas, excepto con la variable “piso”, lo que nos lleva a concluir que el piso del apartamento no es tan determinante en el precio de venta, como si lo son las demás variables.

También podemos ver en el correlograma que las variables independientes no guardan correlación significativa entre sí, por lo tanto no existe colinealidad y todas son susceptibles de ser incluidas en el modelo de regresión lineal.

12 3. Modelo de regresión lineal múltiple

Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).

# 
reg_apartamentos <- lm(preciom ~ piso + banios + habitaciones + parqueaderos + estrato + areaconst, data = vivienda_apartamentos_sur)

summary(reg_apartamentos, digits=5)
## 
## Call:
## lm(formula = preciom ~ piso + banios + habitaciones + parqueaderos + 
##     estrato + areaconst, data = vivienda_apartamentos_sur)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1256.18   -42.70    -1.77    35.62   934.64 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -223.49058   13.71905 -16.291  < 2e-16 ***
## piso            0.67205    0.70404   0.955     0.34    
## banios         48.48305    3.04339  15.931  < 2e-16 ***
## habitaciones  -22.67249    3.39587  -6.676 2.94e-11 ***
## parqueaderos   48.26713    3.02516  15.955  < 2e-16 ***
## estrato        56.98218    2.79664  20.375  < 2e-16 ***
## areaconst       1.46283    0.04881  29.967  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 95.18 on 2780 degrees of freedom
## Multiple R-squared:  0.7537, Adjusted R-squared:  0.7531 
## F-statistic:  1417 on 6 and 2780 DF,  p-value: < 2.2e-16

El coeficiente R2 de 0.7537 nos representa un nivel bueno del modelo, tratándose de variables numéricas.

Los estimados de banios (48.48), parqueaderos (48.27) y estrato (56.98) nos muestran que son quienes aportan de manera altamente significativa al precio del apartamento en la zona sur, así como el área construida, mientras que el piso y el número de habitaciones aportan de manera mínima al precio del inmueble.

13 4. Validación de supuestos del modelo

Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer).

13.1 Estimación de residuos

predict2 <- vivienda_apartamentos_sur %>%
  add_predictions(reg_apartamentos) %>%
  add_residuals(reg_apartamentos)

# valido que la media de los residuos tienda a CERO
mean(predict2$resid)
## [1] -2.945711e-12

13.2 Histograma de residuos

# Se valida distribución normal de los residuos
hist(predict2$resid)

13.3 Gráfica de residuos contra variable dependiente estimada

predict2%>%
  ggplot(aes(x=pred, y=resid^2)) +
  geom_point() + 
  geom_smooth(color="red", se=FALSE)

13.4 validar covarianza de pred contra residuos es constante

13.5 graficamente

predict2%>%
     ggplot(aes(x=pred,y=resid))+
     geom_point()+
     geom_smooth(color="red",se=FALSE)

13.6 Covarianza de pred contra residuos numericamente

cov(predict2$pred,predict2$resid)
## [1] 1.266714e-10

14 5. Predecir el precio del apartamento solicitado

Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.

Apartamento en estrato 5 área construida 300 * 1.46283 parqueaderos 3 * 48.26713 baños 3 * 48.48305 habitaciones 5 * -22.67249 estrato 5 * 56.98218

(Intercept) -223.49058

precio_apartamento_sur_5 <- -223.49058 + 300 * 1.46283 + 3 * 48.26713 + 3 * 48.48305 + 5 * -22.67249 + 5 * 56.98218
precio_apartamento_sur_5
## [1] 677.1574

El precio predicho para un apartamento en estrato 5 en la zona sur de la ciudad de Cali es de: $677.1574 millones de pesos, por tanto, se encuentra dentro del cupo de crédito preaprobado de 850 millones.

Apartamento en Estrato 6

área construida 300 * 1.46283 parqueaderos 3 * 48.26713 baños 3 * 48.48305 habitaciones 5 * -22.67249 estrato 6 * 56.98218

(Intercept) -223.49058

precio_apartamento_sur_6 <- -223.49058 + 300 * 1.46283 + 3 * 48.26713 + 3 * 48.48305 + 5 * -22.67249 + 6 * 56.98218
precio_apartamento_sur_6
## [1] 734.1396

El precio predicho para un apartamento en estrato 6 en la zona sur de la ciudad de Cali es de: $734.1396 millones de pesos, por tanto, se encuentra dentro del cupo de crédito preaprobado de 850 millones.

El comprador puede considerar la adquisición en estrato 5 o 6

15 6. potenciales ofertas de la vivienda solicitada (casa)

Con las predicciones del modelo sugiera potenciales ofertas que responda a la solicitud de la vivienda 1. Tenga encuentra que la empresa tiene crédito pre-aprobado de máximo 350 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.

Características Vivienda 2 Tipo Apartamento área construida 300 parqueaderos 3 baños 3 habitaciones 5 estrato 5 o 6 zona Sur crédito preaprobado 850 millones

# Filtrar registros que cumplan con las características de búsqueda
filtro_aptos_norte <- subset(vivienda_casas_norte,
                           banios >= 3 & 
                           habitaciones >= 5 & 
                           parqueaderos >= 3 & 
                           estrato >= 5 & 
                           estrato <= 6 & 
                           areaconst >= 300 &
                           preciom <= 850)

# Ver cantidad de inmuebles que cumplen con el filtro
nrow(filtro_aptos_norte)
## [1] 30

Se identifican 30 inmuebles que satisfacen los requerimientos del filtro

Se presentan los 10 primeros resultados del filtro:

# Ver los primeros registros que cumplen el filtro
head(filtro_aptos_norte,10)
# Crear un mapa centrado en Cali y agregar los puntos
leaflet(data = filtro_aptos_norte) %>%
  addTiles() %>%  # Agregar el fondo del mapa
  setView(lng = cali_coords["lng"], lat = cali_coords["lat"], zoom = 12) %>%  # Centrarse en Cali
  addCircleMarkers(~longitud, ~latitud,  # Usar las columnas de longitud y latitud
                   radius = 5,  # Tamaño de los puntos
                   color = "blue",  # Color de los puntos
                   stroke = FALSE,  # Sin borde en los puntos
                   fillOpacity = 0.7,  # Opacidad de los puntos
                   label = ~paste("Id: ", id),  # Etiqueta mostrando el tipo de vivienda
                   labelOptions = labelOptions(noHide = FALSE, direction = "auto"))

Mediante el mapa interactivo podemos identificar que los inmuebles con id 677 y 978 no se encuentran dentro de la zona norte, por lo tanto no se deben tomar en cuenta en la recomendación.