Enunciado

Maria comenzó como agente de bienes raíces en Cali hace 10 años. Después de laborar dos años para una empresa nacional, se traslado a Bogotá y trabajó para otra agencia de bienes raíces. Sus amigos y familiares la convencieron de que con su experiencia y conocimientos del negocio debía abrir su propia agencia. Terminó por adquirir la licencia de intermediario y al poco tiempo fundó su propia compañía, C&A (Casas y Apartamentos) en Cali. Santiago y Lina, dos vendedores de la empresa anterior aceptaron trabajar en la nueva compaña. En la actualidad ocho agentes de bienes raíces colaboran con ella en C&A.

Actualmente las ventas de bienes raíces en Cali se han visto disminuidas de manera significativa en lo corrido del año. Durante este periodo muchas instituciones bancarias de ahorro y vivienda están prestando grandes sumas de dinero para la industria y la construcción comercial y residencial. Cuando el efecto producto de las tensiones políticas y sociales disminuya, se espera que la actividad económica de este sector se reactive.

Hace dos días, María recibió una carta solicitando 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. Las solicitudes incluyen las siguientes condiciones:

Ayude a María a responder la solicitud, mediante técnicas modelación que usted conoce. Ella requiere le envíe un informe ejecutivo donde analice los dos casos y sus recomendaciones (Informe). Como soporte del informe debe anexar las estimaciones, validaciones y comparación de modelos requeridos (Anexos) .

library(paqueteMODELOS)
## Loading required package: boot
## 
## Attaching package: 'boot'
## The following object is masked from 'package:psych':
## 
##     logit
## Loading required package: broom
## Loading required package: GGally
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
## Loading required package: knitr
## Loading required package: summarytools
## 
## Attaching package: 'summarytools'
## The following object is masked from 'package:lessR':
## 
##     label
## The following object is masked from 'package:tibble':
## 
##     view
library(dplyr)
data(vivienda)

Procesamiento Datos

“En el dataframe data01, se encuentran datos en formato de texto que incluyen palabras en mayúsculas y abreviaciones. Para evitar inconsistencias en los resultados debidas a la variación en la forma de un mismo dato, se ha decidido convertir todos los textos a minúsculas. Por ejemplo: ‘Apartamento’, ‘APARTAMENTO’ y ‘apto.’ serán unificados bajo una misma forma.”

base1 <- mutate_if(vivienda, is.character, tolower)
base1$tipo[base1$tipo == "apto"] <- "apartamento"
unique(base1$tipo)
## [1] "casa"        "apartamento" NA
unique(base1$estrato)
## [1]  3  4  5  6 NA

Punto 1

Realice un filtro a la base de datos e incluya solo las ofertas de : base1: casas, de la zona norte de la ciudad. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta. (Adicional 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, por que?).

conflicts_prefer(mice::filter)
## [conflicted] Will prefer mice::filter over any other package.
base1 <- filter(base1, tipo == "casa",zona == "zona norte")
base1 <- base1 [, c(2,4, 5, 6, 7,8,9,10,12,13)] 
head(base1,3)
print(paste("El numero casas en la zona norte de la ciudad de Cali es de:", nrow(base1)))
## [1] "El numero casas en la zona norte de la ciudad de Cali es de: 722"

Casas-Estratos

tabla_ce = data.frame(table(base1$estrato))
colnames(tabla_ce) = c("estrato", "casas")
tabla_ce

Mapa de casas en zona norte

library(leaflet)
base2 <- na.omit(base1)
mapa_casas = leaflet() %>% addCircleMarkers(lng = base2$longitud,
                                          lat = base2$latitud,
                                          radius = 0.3,
                                          color = "red",
                                          label = base1$id) %>% addTiles()

mapa_casas

Punto 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.

base3 <- base1 [, c(1,2,3,4,6, 7)] 
skim(base3)
Data summary
Name base3
Number of rows 722
Number of columns 6
_______________________
Column type frequency:
character 1
numeric 5
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
zona 0 1 10 10 0 1 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
estrato 0 1 4.20 0.98 3 3.00 4 5.00 6 ▇▅▁▇▂
preciom 0 1 445.91 268.36 89 261.25 390 550.00 1940 ▇▃▁▁▁
areaconst 0 1 264.85 167.17 30 140.00 240 336.75 1440 ▇▃▁▁▁
banios 0 1 3.56 1.52 0 2.00 3 4.00 10 ▅▇▃▁▁
habitaciones 0 1 4.51 1.83 0 3.00 4 5.00 10 ▁▇▅▂▁

Análisis Exploratorio

Se indica que algunas casas carecen de baños o habitaciones, lo cual es poco común. Por esta razón, se ha decidido excluirlas del análisis.

summary(base3)
##      zona              estrato         preciom         areaconst     
##  Length:722         Min.   :3.000   Min.   :  89.0   Min.   :  30.0  
##  Class :character   1st Qu.:3.000   1st Qu.: 261.2   1st Qu.: 140.0  
##  Mode  :character   Median :4.000   Median : 390.0   Median : 240.0  
##                     Mean   :4.202   Mean   : 445.9   Mean   : 264.9  
##                     3rd Qu.:5.000   3rd Qu.: 550.0   3rd Qu.: 336.8  
##                     Max.   :6.000   Max.   :1940.0   Max.   :1440.0  
##      banios        habitaciones   
##  Min.   : 0.000   Min.   : 0.000  
##  1st Qu.: 2.000   1st Qu.: 3.000  
##  Median : 3.000   Median : 4.000  
##  Mean   : 3.555   Mean   : 4.507  
##  3rd Qu.: 4.000   3rd Qu.: 5.000  
##  Max.   :10.000   Max.   :10.000

Se observa que el precio de las casas en la zona norte de la ciudad de Cali varía entre 89 millones y 1.940 millones de pesos. Además, el precio promedio de la mitad de las casas es de 390 millones de pesos. En cuanto al área construida, el promedio es de 240 metros cuadrados, aunque algunas casas presentan un área mínima de 30 metros cuadrados.

Correlación

correlacion <- base3 [, c(2,3,4, 5, 6)] 
chart.Correlation(correlacion, hist = TRUE, method = "pearson")

Se observa que el precio de las casas tiene una gran relación con el área construida, lo que indica que a mayor área, mayor será el precio. Asimismo, se observa una relación positiva entre el estrato y el precio de la casa. Sin embargo, al examinar la relación entre el precio y el número de habitaciones, así como entre el precio y el número de baños, se encuentra una relación débil.

Precio - Area

library(plotly)
ggplotly(ggplot(base3,
                aes(y=preciom, x=areaconst)) + geom_point() + geom_smooth() + theme_bw())
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Al analizar la relación entre el precio de las casas y el área construida, se observa inicialmente una relación directa y lineal entre ambas variables, lo cual también es respaldado por la matriz de correlación. Sin embargo, a medida que el tamaño de la vivienda aumenta, algunas casas muestran precios considerablemente más bajos de lo esperado. Por ejemplo, una casa con un área de 1.440 metros cuadrados tiene un precio de solo 370 millones de pesos, lo que podría indicar un valor incongruente o que la propiedad se encuentra en un estrato de menor valor. Esto no sería del todo sorprendente, ya que una casa con un área de 200 metros cuadrados no tiene el mismo precio en el estrato 3 que en el estrato 6.

Precio - Estrato

Antes de comenzar, se decidió crear la variable “estrato2” como una variable de tipo texto, permitiendo así su tratamiento como categórica en la visualización de los datos. La variable original se llama “estrato”.

base6 <- base3
estrato2 <- as.character(base3$estrato)
base6 <- cbind(base6,estrato2)
p_estrato <- ggplot(base6,aes(x=estrato2,y=preciom, fill=estrato2))+
            geom_boxplot()+
            labs(x="Estrato",y="Precio en Millones",title="Relacion estrato - precio") + 
            theme (panel.background = element_blank()
            )

plotly::ggplotly(p_estrato)

Precio Baños

plot_ly(base6,x=~banios,y=~preciom,type="scatter", mode = "markers",
        color=~estrato2, symbol = ~estrato2)

Precio Habitaciones

plot_ly(base6,x=~habitaciones,y=~preciom,type="scatter", mode = "markers",
        color=~estrato2, symbol = ~estrato2)

Punto 3

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).

Creación Variable Dummy

library(fastDummies)
base4 <- dummy_cols(base3,select_columns = "estrato")
# base 4 contiene 9 variables que incluyen estrato_3,estrato_4,estrato_5,estrato_6
head(base4)
base_mlineal <- base4[,c(2,3,4,5,6,7,8,9,10)]
base_mlineal <- na.omit(base_mlineal) 
glimpse(base_mlineal)
## Rows: 722
## Columns: 9
## $ estrato      <dbl> 5, 5, 6, 4, 5, 4, 5, 5, 3, 3, 3, 3, 5, 3, 4, 4, 5, 5, 4, …
## $ preciom      <dbl> 320, 780, 750, 625, 750, 600, 420, 490, 230, 190, 180, 50…
## $ areaconst    <dbl> 150, 380, 445, 355, 237, 160, 200, 118, 160, 435, 120, 21…
## $ banios       <dbl> 4, 3, 7, 5, 6, 4, 4, 4, 2, 0, 3, 6, 5, 5, 3, 3, 4, 5, 5, …
## $ habitaciones <dbl> 6, 3, 6, 5, 6, 5, 5, 4, 3, 0, 3, 6, 4, 8, 4, 3, 4, 6, 4, …
## $ estrato_3    <int> 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, …
## $ estrato_4    <int> 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, …
## $ estrato_5    <int> 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, …
## $ estrato_6    <int> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
head(base4)

Regresión lineal

mod_casas <- lm(preciom ~ areaconst + estrato_4 + estrato_5 + estrato_6 + habitaciones + banios, data = base_mlineal)
summary(mod_casas)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato_4 + estrato_5 + estrato_6 + 
##     habitaciones + banios, data = base_mlineal)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -972.05  -73.02  -15.60   45.95 1064.25 
## 
## Coefficients:
##               Estimate Std. Error t value             Pr(>|t|)    
## (Intercept)   30.27964   17.60512   1.720               0.0859 .  
## areaconst      0.82657    0.04289  19.274 < 0.0000000000000002 ***
## estrato_4     85.86991   17.27886   4.970           0.00000084 ***
## estrato_5    139.49127   16.13506   8.645 < 0.0000000000000002 ***
## estrato_6    330.33116   26.46332  12.483 < 0.0000000000000002 ***
## habitaciones   1.81876    4.10123   0.443               0.6576    
## banios        25.83183    5.34112   4.836           0.00000162 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 156.9 on 715 degrees of freedom
## Multiple R-squared:  0.6611, Adjusted R-squared:  0.6583 
## F-statistic: 232.5 on 6 and 715 DF,  p-value: < 0.00000000000000022

El intercepto del modelo indica que una vivienda en la zona norte tiene un valor autónomo de 30 millones de pesos. El parámetro asociado al área muestra que un metro cuadrado adicional incrementa el valor de la vivienda en 826.570 pesos, lo cual es teóricamente correcto, ya que a mayor área, mayor debería ser el precio, y este parámetro es estadísticamente significativo. Respecto al estrato, la variable correspondiente al estrato 3 no se incluyó en el análisis para evitar problemas de multicolinealidad perfecta. Los parámetros para los estratos 4, 5 y 6 son estadísticamente significativos, indicando que, manteniendo todo lo demás constante, pertenecer al estrato 4 agrega 85 millones al precio, al estrato 5 agrega 139 millones, y al estrato 6 agrega 330 millones. En cuanto al número de habitaciones, el parámetro, aunque teóricamente correcto al ser positivo, no es estadísticamente significativo, sugiriendo que una habitación adicional incrementa el precio en 1 millón de pesos, pero no de manera relevante ni concluyente. Por otro lado, el parámetro para el número de baños es estadísticamente significativo al 95% de confianza, indicando que un baño adicional aumenta el valor de la vivienda en 25 millones de pesos. El R² ajustado del modelo es del 66%, lo que sugiere que los regresores explican el 66% de las variaciones en el precio de la vivienda. Sin embargo, este nivel de ajuste puede no ser completamente satisfactorio, lo que podría generar incertidumbre al valorar una vivienda o al elegir la mejor opción. Para mejorar el ajuste del modelo, se podría considerar incorporar nuevos determinantes del precio, como accesibilidad, servicios públicos, cercanía a dotacionales y transporte, o explorar una forma funcional diferente, ya que el modelo podría no ser lineal.

Punto 4

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).

par(mfrow = c(2, 2)) 
plot(mod_casas)

El gráfico “Residuals vs Fitted” muestra que los residuos oscilan alrededor de cero, lo cual es un indicio de linealidad en los parámetros.

Test Shapiro

shapiro.test(mod_casas$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  mod_casas$residuals
## W = 0.83094, p-value < 0.00000000000000022

Los residuos no siguen una distribucion normal

Test Breusch-P

library(lmtest)
bptest(mod_casas)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_casas
## BP = 136.91, df = 6, p-value < 0.00000000000000022

Los resultados de la prueba de Breusch-Pagan generan un p-valor menor a 5%, es decir, los residuos no tienen varianza constante, o no son homocedásticos.

Multicolinealidad

library(corrplot)
pairs(base3[, c("estrato", "areaconst", "banios", "habitaciones")])

La relación lineal entre el número de baños y el número de habitaciones es esperada, ya que es lógico suponer que, a mayor número de habitaciones, una casa debería tener más baños. Para evaluar si esta relación genera un nivel de multicolinealidad que pueda afectar el modelo, se analiza el factor de inflación de la varianza (VIF).

library(car)
## Loading required package: carData
vif_mod_casas <- vif(mod_casas)
vif_mod_casas
##    areaconst    estrato_4    estrato_5    estrato_6 habitaciones       banios 
##     1.505726     1.517649     1.790770     1.445872     1.646112     1.940813

Dado que no se presentan valores superiores a 5, se puede concluir que la posible relación lineal observada en algunas variables no parece generar problemas significativos de multicolinealidad.

Punto 5

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

primera_solicitud <- base4[1, ]

print("primera solicitud: ")
## [1] "primera solicitud: "
print(primera_solicitud)
## # A tibble: 1 × 10
##   zona       estrato preciom areaconst banios habitaciones estrato_3 estrato_4
##   <chr>        <dbl>   <dbl>     <dbl>  <dbl>        <dbl>     <int>     <int>
## 1 zona norte       5     320       150      4            6         0         0
## # ℹ 2 more variables: estrato_5 <int>, estrato_6 <int>
prediccion_precio <- predict(mod_casas, newdata = primera_solicitud)

print(paste("El precio predicho para la primera solicitud es:", prediccion_precio, "millones."))
## [1] "El precio predicho para la primera solicitud es: 407.99611774808 millones."

Punto 6

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.

Prediccion precio vivienda

# Selecciona la primera solicitud del dataset base4
primera_solicitud <- base4[1, ]

# Asegúrate de que la primera solicitud contiene las variables necesarias
primera_solicitud <- primera_solicitud[, c("areaconst", "estrato_4", "estrato_5", "estrato_6", "habitaciones", "banios")]

# Predice el precio de la vivienda utilizando el modelo entrenado
prediccion_precio <- predict(mod_casas, newdata = primera_solicitud)

# Imprime el precio predicho
print(paste("El precio predicho para la primera solicitud es:", round(prediccion_precio, 2), "millones."))
## [1] "El precio predicho para la primera solicitud es: 408 millones."

Ofertas Potenciales

ofertas_potenciales <- base1[base1$preciom <= 350, ]
ofertas_potenciales <- ofertas_potenciales[order(abs(ofertas_potenciales$preciom - prediccion_precio)), ]
ofertas_seleccionadas <- head(ofertas_potenciales, 5)

print("Ofertas potenciales seleccionadas:")
## [1] "Ofertas potenciales seleccionadas:"
print(ofertas_seleccionadas)
## # A tibble: 5 × 10
##   zona       estrato preciom areaconst parqueaderos banios habitaciones tipo 
##   <chr>        <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl> <chr>
## 1 zona norte       4     350       118           NA      3            3 casa 
## 2 zona norte       4     350        98            2      3            4 casa 
## 3 zona norte       5     350       200            3      3            4 casa 
## 4 zona norte       5     350       300            3      5            6 casa 
## 5 zona norte       5     350       240            2      3            6 casa 
## # ℹ 2 more variables: longitud <dbl>, latitud <dbl>

Mapa

library(leaflet)

mapa <- leaflet() %>%
  addTiles()

for (i in 1:nrow(ofertas_seleccionadas)) {
  mapa <- mapa %>%
    addMarkers(
      lat = ofertas_seleccionadas$latitud[i],
      lng = ofertas_seleccionadas$longitud[i],
      popup = paste("Precio:", round(ofertas_seleccionadas$preciom[i] / 1e6, 2), "millones",
                    "| Habitaciones:", ofertas_seleccionadas$habitaciones[i],
                    "| Baños:", ofertas_seleccionadas$banios[i])
    )
}
mapa

Punto 7

Realice los pasos del 1 al 6. Para la segunda solicitud que tiene un crédito pre-aprobado por valor de $850 millones.

Filtrar datos

base1 <- mutate_if(vivienda, is.character, tolower)
base1 <- filter(base1, tipo == "casa", zona == "zona norte")
base1 <- base1[, c(2, 4, 5, 6, 7, 8, 9, 10, 12, 13)]

Analisis exploratorio

base3 <- base1[, c(1, 2, 3, 4, 6, 7)]
skim(base3)
Data summary
Name base3
Number of rows 722
Number of columns 6
_______________________
Column type frequency:
character 1
numeric 5
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
zona 0 1 10 10 0 1 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
estrato 0 1 4.20 0.98 3 3.00 4 5.00 6 ▇▅▁▇▂
preciom 0 1 445.91 268.36 89 261.25 390 550.00 1940 ▇▃▁▁▁
areaconst 0 1 264.85 167.17 30 140.00 240 336.75 1440 ▇▃▁▁▁
banios 0 1 3.56 1.52 0 2.00 3 4.00 10 ▅▇▃▁▁
habitaciones 0 1 4.51 1.83 0 3.00 4 5.00 10 ▁▇▅▂▁
summary(base3)
##      zona              estrato         preciom         areaconst     
##  Length:722         Min.   :3.000   Min.   :  89.0   Min.   :  30.0  
##  Class :character   1st Qu.:3.000   1st Qu.: 261.2   1st Qu.: 140.0  
##  Mode  :character   Median :4.000   Median : 390.0   Median : 240.0  
##                     Mean   :4.202   Mean   : 445.9   Mean   : 264.9  
##                     3rd Qu.:5.000   3rd Qu.: 550.0   3rd Qu.: 336.8  
##                     Max.   :6.000   Max.   :1940.0   Max.   :1440.0  
##      banios        habitaciones   
##  Min.   : 0.000   Min.   : 0.000  
##  1st Qu.: 2.000   1st Qu.: 3.000  
##  Median : 3.000   Median : 4.000  
##  Mean   : 3.555   Mean   : 4.507  
##  3rd Qu.: 4.000   3rd Qu.: 5.000  
##  Max.   :10.000   Max.   :10.000
# Correlación
correlacion <- base3[, c(2, 3, 4, 5, 6)]
chart.Correlation(correlacion, hist = TRUE, method = "pearson")

# Gráficos interactivos
library(plotly)
ggplotly(ggplot(base3, aes(y = preciom, x = areaconst)) + geom_point() + geom_smooth() + theme_bw())
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
base6 <- base3
estrato2 <- as.character(base3$estrato)
base6 <- cbind(base6, estrato2)

p_estrato <- ggplot(base6, aes(x = estrato2, y = preciom, fill = estrato2)) +
  geom_boxplot() +
  labs(x = "Estrato", y = "Precio en Millones", title = "Relacion estrato - precio") +
  theme(panel.background = element_blank())

plotly::ggplotly(p_estrato)
plot_ly(base6, x = ~banios, y = ~preciom, type = "scatter", mode = "markers", color = ~estrato2, symbol = ~estrato2)
plot_ly(base6, x = ~habitaciones, y = ~preciom, type = "scatter", mode = "markers", color = ~estrato2, symbol = ~estrato2)

Regresion Multiple

library(fastDummies)
base4 <- dummy_cols(base3, select_columns = "estrato")

base_mlineal <- base4[, c(2, 3, 4, 5, 6, 7, 8, 9, 10)]
base_mlineal <- na.omit(base_mlineal)
glimpse(base_mlineal)
## Rows: 722
## Columns: 9
## $ estrato      <dbl> 5, 5, 6, 4, 5, 4, 5, 5, 3, 3, 3, 3, 5, 3, 4, 4, 5, 5, 4, …
## $ preciom      <dbl> 320, 780, 750, 625, 750, 600, 420, 490, 230, 190, 180, 50…
## $ areaconst    <dbl> 150, 380, 445, 355, 237, 160, 200, 118, 160, 435, 120, 21…
## $ banios       <dbl> 4, 3, 7, 5, 6, 4, 4, 4, 2, 0, 3, 6, 5, 5, 3, 3, 4, 5, 5, …
## $ habitaciones <dbl> 6, 3, 6, 5, 6, 5, 5, 4, 3, 0, 3, 6, 4, 8, 4, 3, 4, 6, 4, …
## $ estrato_3    <int> 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, …
## $ estrato_4    <int> 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, …
## $ estrato_5    <int> 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, …
## $ estrato_6    <int> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
mod_casas <- lm(preciom ~ areaconst + estrato_4 + estrato_5 + estrato_6 + habitaciones + banios, data = base_mlineal)
summary(mod_casas)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato_4 + estrato_5 + estrato_6 + 
##     habitaciones + banios, data = base_mlineal)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -972.05  -73.02  -15.60   45.95 1064.25 
## 
## Coefficients:
##               Estimate Std. Error t value             Pr(>|t|)    
## (Intercept)   30.27964   17.60512   1.720               0.0859 .  
## areaconst      0.82657    0.04289  19.274 < 0.0000000000000002 ***
## estrato_4     85.86991   17.27886   4.970           0.00000084 ***
## estrato_5    139.49127   16.13506   8.645 < 0.0000000000000002 ***
## estrato_6    330.33116   26.46332  12.483 < 0.0000000000000002 ***
## habitaciones   1.81876    4.10123   0.443               0.6576    
## banios        25.83183    5.34112   4.836           0.00000162 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 156.9 on 715 degrees of freedom
## Multiple R-squared:  0.6611, Adjusted R-squared:  0.6583 
## F-statistic: 232.5 on 6 and 715 DF,  p-value: < 0.00000000000000022

Validacion modelo

par(mfrow = c(2, 2))
plot(mod_casas)

# Test Shapiro
shapiro.test(mod_casas$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  mod_casas$residuals
## W = 0.83094, p-value < 0.00000000000000022
# Test Breusch-Pagan
library(lmtest)
bptest(mod_casas)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_casas
## BP = 136.91, df = 6, p-value < 0.00000000000000022
# Multicolinealidad
library(corrplot)
pairs(base3[, c("estrato", "areaconst", "banios", "habitaciones")])

library(car)
vif_mod_casas <- vif(mod_casas)
vif_mod_casas
##    areaconst    estrato_4    estrato_5    estrato_6 habitaciones       banios 
##     1.505726     1.517649     1.790770     1.445872     1.646112     1.940813

Predicción Precio segunda solicitud

segunda_solicitud <- base4[2, ]

segunda_solicitud <- segunda_solicitud[, c("areaconst", "estrato_4", "estrato_5", "estrato_6", "habitaciones", "banios")]

prediccion_precio_segunda <- predict(mod_casas, newdata = segunda_solicitud)

print(paste("El precio predicho para la segunda solicitud es:", round(prediccion_precio_segunda, 2), "millones."))
## [1] "El precio predicho para la segunda solicitud es: 566.82 millones."

Ofertas Potenciales

ofertas_potenciales_segunda <- base1[base1$preciom <= 850, ]
ofertas_potenciales_segunda <- ofertas_potenciales_segunda[order(abs(ofertas_potenciales_segunda$preciom - prediccion_precio_segunda)), ]
ofertas_seleccionadas_segunda <- head(ofertas_potenciales_segunda, 5)

print("Ofertas potenciales seleccionadas para la segunda solicitud:")
## [1] "Ofertas potenciales seleccionadas para la segunda solicitud:"
print(ofertas_seleccionadas_segunda)
## # A tibble: 5 × 10
##   zona       estrato preciom areaconst parqueaderos banios habitaciones tipo 
##   <chr>        <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl> <chr>
## 1 zona norte       5     570       250           NA      3            5 casa 
## 2 zona norte       4     570       270            2      4            4 casa 
## 3 zona norte       5     570       536            2      6            6 casa 
## 4 zona norte       5     570       371            4      6            4 casa 
## 5 zona norte       5     570       412            1      3            5 casa 
## # ℹ 2 more variables: longitud <dbl>, latitud <dbl>

Mapa

library(leaflet)


mapa_segunda <- leaflet() %>%
  addTiles()

for (i in 1:nrow(ofertas_seleccionadas_segunda)) {
  mapa_segunda <- mapa_segunda %>%
    addMarkers(
      lat = ofertas_seleccionadas_segunda$latitud[i],
      lng = ofertas_seleccionadas_segunda$longitud[i],
      popup = paste("Precio:", round(ofertas_seleccionadas_segunda$preciom[i] / 1e6, 2), "millones",
                    "| Habitaciones:", ofertas_seleccionadas_segunda$habitaciones[i],
                    "| Baños:", ofertas_seleccionadas_segunda$banios[i])
    )
}

mapa_segunda