data(vivienda)

Objetivo

El objetivo es desarrollar un modelo de Regresión Múltiple que tenga la capacidad de prever con precisión el valor de los inmuebles. Posteriormente, con base en este modelo, se generarán recomendaciones personalizadas para María, proporcionándole orientación sobre posibles adquisiciones inmobiliarias que se ajusten a sus necesidades y preferencias.

Análisis de calidad de la información.

Datos faltantes:

colSums(is.na(vivienda))
##           id         zona         piso      estrato      preciom    areaconst 
##            3            3         2638            3            2            3 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##         1605            3            3            3            3            3 
##      latitud 
##            3

Se eliminan incosistecias

which(is.na(vivienda$id))
## [1] 8320 8321 8322
vivienda <- vivienda[-c (8320, 8321, 8322), ]
table(vivienda$tipo)
## 
## Apartamento        Casa 
##        5100        3219

Base Zona Norte

Se filtra la base por zona norte y se hace un mapa de puntos

vivienda_ZN <- vivienda %>% filter(zona=='Zona Norte', tipo == 'Casa')
head(vivienda_ZN)
## # A tibble: 6 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1209 Zona N… 02          5     320       150            2      4            6
## 2  1592 Zona N… 02          5     780       380            2      3            3
## 3  4057 Zona N… 02          6     750       445           NA      7            6
## 4  4460 Zona N… 02          4     625       355            3      5            5
## 5  6081 Zona N… 02          5     750       237            2      6            6
## 6  7824 Zona N… 02          4     600       160            1      4            5
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

Mapa de las casas Zona Norte

library(leaflet)
## Warning: package 'leaflet' was built under R version 4.3.3
vivienda_map<-vivienda_ZN[,c("longitud","latitud")]

mapa <- leaflet(vivienda_map) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud, 
    lat = ~latitud,
    radius = 1, # tamaño de los puntos
    color = "green", # color de los puntos
    fillOpacity = 0.7 # opacidad del relleno
  )
mapa

En el mapa se encuentra evidencia de que hay casas que no se encuentran ubicadas en la zona norte. Esto puede deberse a errores de digitación en la longitud y latitud. Es necesario corregirlos desde la fuente.

Análisis de correlación

vivienda_ZN <- vivienda_ZN[, c("areaconst", "preciom", "banios", "habitaciones","estrato","parqueaderos")]
correlation_matrix <- cor(vivienda_ZN,use = "pairwise.complete.obs")
corrplot(correlation_matrix, method = "number", type = "upper", number.cex = 0.5)

color_letra <- "blue"
tamaño_letra <- 7

# Crear el gráfico con ggpairs
ggpairs(vivienda_ZN[,1:5], title="Correlación y Distribución", 
        text_color = color_letra, text_size = tamaño_letra)

El análisis de la matriz de correlaciones indica que varias variables están interrelacionadas con la variable “precio”. Aunque la variable ‘Habitaciones’ muestra una correlación débil, su inclusión en el modelo podría ser significativa. Es importante destacar que la correlación más fuerte se observa entre el área y el precio, lo que sugiere una relación importante entre estas dos variables.

# Gráfico de dispersión interactivo
plot_ly(data = vivienda_ZN, x = ~areaconst, y = ~preciom, color = ~factor(estrato)) %>%
  add_markers(showlegend = TRUE, legendgroup = "Estrato")%>%
  layout(title = "Relación entre Área Construida y Precio de la Casa",
         xaxis = list(title = "Área Construida"),
         yaxis = list(title = "Precio de la Casa"),
         legend = list(
           title = list(text = "Estrato"),
           itemsizing = "constant",
           itemwidth = 100,
           itemheight = 20,
           bgcolor = "rgba(255, 255, 255, 0.5)",
           bordercolor = "rgba(0, 0, 0, 0.5)",
           borderwidth = 1,
           x = 0.85,
           y = 0.9
         ))

Según podemos observar en el gráfico, existe una tendencia donde el precio tiende a aumentar a medida que el área construida es mayor. Además, se destaca que las casas de estrato 3 tienden a ser más económicos y de menor tamaño en comparación con otros estratos.

Modelo de Regresión Multiple

# Estimar el modelo de regresión lineal múltiple
modelo <- lm(preciom ~ areaconst + estrato + habitaciones +  banios + parqueaderos, data = vivienda_ZN)

# Mostrar un resumen del modelo
summary(modelo)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + banios + 
##     parqueaderos, data = vivienda_ZN)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -784.29  -77.56  -16.03   47.67  978.61 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -238.17090   44.40551  -5.364 1.34e-07 ***
## areaconst       0.67673    0.05281  12.814  < 2e-16 ***
## estrato        80.63495    9.82632   8.206 2.70e-15 ***
## habitaciones    7.64511    5.65873   1.351    0.177    
## banios         18.89938    7.48800   2.524    0.012 *  
## parqueaderos   24.00598    5.86889   4.090 5.14e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 155.1 on 429 degrees of freedom
##   (287 observations deleted due to missingness)
## Multiple R-squared:  0.6041, Adjusted R-squared:  0.5995 
## F-statistic: 130.9 on 5 and 429 DF,  p-value: < 2.2e-16

Interpretación de los Coeficientes:

  1. Intercepto: El valor estimado del precio de la vivienda cuando todas las demás variables explicativas son cero es de -$238.17.

Coeficientes de las variables explicativas:

  1. Cada aumento unitario en el área construida (areaconst) se asocia, en promedio, con un aumento de $0.68 en el precio de la vivienda.
  2. El estrato (estrato) está positivamente asociado con el precio de la vivienda, con un aumento estimado de $80.63 en el precio por cada aumento en el estrato.
  3. El número de baños (banios) y el número de parqueaderos (parqueaderos) también están positivamente asociados con el precio de la vivienda, con aumentos estimados de $18.90 y $24.01 en el precio por cada baño y parqueadero adicionales, respectivamente.
  4. El número de habitaciones (habitaciones) no es estadísticamente significativo en este modelo, ya que su valor p es mayor que 0.05, lo que sugiere que no tiene un efecto significativo en el precio de la vivienda.

R cuadrado:

El R cuadrado indica que aproximadamente el 60.41% de la variabilidad en el precio de la vivienda se explica por las variables incluidas en el modelo. En cuanto ha el F-statistic proporciona una prueba de significancia global para el modelo de regresión. Dado que hay un p-value menor a 0.05 indica que el modelo es significativo en la predicción del precio de la vivienda.

Supuestos del Modelo

Linealidad y Homocedasticidad

# Gráficos de diagnóstico del modelo
par(mfrow = c(2, 2))
plot(modelo)

Los gráficos muestra que los errores no son estan completamente aleatorios lo cual puede que no cumpla, con el supuesto de Homocedasticidad

Normalidad de los Residuos

residuos <- residuals(modelo)
prueba_shapiro <- shapiro.test(residuos)

# Mostrar el resultado de la prueba
print(prueba_shapiro)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos
## W = 0.85246, p-value < 2.2e-16

El resultado del p-valor es menor a 0.05 lo cual es suficiente evidencia para rechazar la hipótesis de normalidad, lo cual podria concluir que los residuos no siguen una distribución normal. y por ende el suspuesto no se cumple.

Para cumplir este supuesto se podría aplicar transformaciones a las variables predictoras o a la variable de respuesta, esto puede ayudar a hacer que los residuos se ajusten mejor a una distribución normal. Algunas transformaciones comunes incluyen la raíz cuadrada, el logaritmo, la raíz cúbica, entre otras.

Independencia de los residuos

residuos <- residuals(modelo)
# Graficar el gráfico de autocorrelación de los residuos
acf(residuos)

Este supuesto sí se cumple, por la gráfica podemos concluir que los residuos son independientes

Multicolinealidad

vif(modelo)
##    areaconst      estrato habitaciones       banios parqueaderos 
##     1.460998     1.307757     1.721015     1.967421     1.226334

Por medio de la prueba VIF podemos concluir que el supuesto de No Multicolinealidad se cumple.

Predicción

Para realizar la predicción se toman lo dos escenarios establecidos en donde el variante es el estrato.

OPC1 <- data.frame(areaconst = 200, parqueaderos = 1, banios = 2, habitaciones = 4, estrato = 4)

OPC2 <- data.frame(areaconst = 200, parqueaderos = 1, banios = 2, habitaciones = 4, estrato = 5)

# Realizar la predicción utilizando el modelo ajustado
prediccion1 <- predict(modelo, OPC1)
prediccion2 <- predict(modelo, OPC2)

# Fusionar las predicciones en un solo conjunto de datos
prediccion_total <- data.frame(prediccion1, prediccion2)
colnames(prediccion_total)<-c("Predicción 1", "Prediccion 2")

# Mostrar la predicción
tabla_md <- kable(prediccion_total, format = "markdown",caption = "Precio de los Inmuebles") %>%
kable_styling("condensed")
## Warning in kable_styling(., "condensed"): Please specify format in kable.
## kableExtra can customize either HTML or LaTeX outputs. See
## https://haozhu233.github.io/kableExtra/ for details.
print(tabla_md)
## 
## 
## Table: Precio de los Inmuebles
## 
## | Predicción 1| Prediccion 2|
## |------------:|------------:|
## |      312.101|     392.7359|

Como se observa en la tabla, la casa con las características que pide María, en estrato cuatro, puede costar un aproximado de 312 millones, y en estrato cinco, 392 millones.

Recomendacion <- vivienda %>%  filter(zona == "Zona Norte", tipo =="Casa", estrato == 4, preciom >= 345 & preciom <= 355) %>% arrange(desc(areaconst))
tabla_r<-head(Recomendacion, n = 2)
tabla_r<-tabla_r[,c(1,3:9,11)]
tabla_mr <- kable(tabla_r, format = "markdown",caption = "Recomendación") %>%
kable_styling("condensed")
## Warning in kable_styling(., "condensed"): Please specify format in kable.
## kableExtra can customize either HTML or LaTeX outputs. See
## https://haozhu233.github.io/kableExtra/ for details.
print(tabla_mr)
## 
## 
## Table: Recomendación
## 
## |   id|piso | estrato| preciom| areaconst| parqueaderos| banios| habitaciones|barrio    |
## |----:|:----|-------:|-------:|---------:|------------:|------:|------------:|:---------|
## | 5031|03   |       4|     350|       350|            1|      4|            5|salomia   |
## |  937|02   |       4|     350|       280|            2|      3|            4|la merced |

Se recomiendan dos casas, una en el barrio Salomía y otra en el barrio La Merced. Ambas son de estrato 4 y tienen un área construida mayor de lo deseado, así como más habitaciones y baños de los requeridos.

Base Zona Sur

Se filtra la base por zona sur y se hace un mapa de puntos

vivienda_ZS <- vivienda %>% filter(zona=='Zona Sur', tipo == 'Apartamento')
head(vivienda_ZS)
## # A tibble: 6 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  5098 Zona S… 05          4     290        96            1      2            3
## 2   698 Zona S… 02          3      78        40            1      1            2
## 3  8199 Zona S… <NA>        6     875       194            2      5            3
## 4  1241 Zona S… <NA>        3     135       117           NA      2            3
## 5  5370 Zona S… <NA>        3     135        78           NA      1            3
## 6  6975 Zona S… 06          4     220        75            1      2            3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

Mapa de los Apartamentos Zona Sur

library(leaflet)

vivienda_map<-vivienda_ZS[,c("longitud","latitud")]

mapa <- leaflet(vivienda_map) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud, 
    lat = ~latitud,
    radius = 1, # tamaño de los puntos
    color = "green", # color de los puntos
    fillOpacity = 0.7 # opacidad del relleno
  )
mapa

En el mapa se encuentra evidencia de que hay apartamentos que no se encuentran ubicadas en la zona sur. Esto puede deberse a errores de digitación en la longitud y latitud. Es necesario corregirlos desde la fuente.

Análisis de correlación

vivienda_ZS <- vivienda_ZS[, c("areaconst", "preciom", "banios", "habitaciones","estrato","parqueaderos")]
correlation_matrix <- cor(vivienda_ZS,use = "pairwise.complete.obs")
corrplot(correlation_matrix, method = "number", type = "upper", number.cex = 0.5)

color_letra <- "blue"
tamaño_letra <- 7

# Crear el gráfico con ggpairs
ggpairs(vivienda_ZS[,1:5], title="Correlación y Distribución", 
        text_color = color_letra, text_size = tamaño_letra)

El análisis de la matriz de correlaciones indica que varias variables están interrelacionadas con la variable “precio”. Aunque la variable ‘Habitaciones’ muestra una correlación muy baja, su inclusión en el modelo podría ser significativa. Es importante destacar que las correlaciones más fuertes se observan entre el área, cantidad de baños y el precio , lo que sugiere unas relaciones importantes con la variable respuesta.

# Gráfico de dispersión interactivo
plot_ly(data = vivienda_ZS, x = ~areaconst, y = ~preciom, color = ~factor(estrato)) %>%
  add_markers(showlegend = TRUE, legendgroup = "Estrato")%>%
  layout(title = "Relación entre Área Construida y Precio de la Casa",
         xaxis = list(title = "Área Construida"),
         yaxis = list(title = "Precio de la Casa"),
         legend = list(
           title = list(text = "Estrato"),
           itemsizing = "constant",
           itemwidth = 100,
           itemheight = 20,
           bgcolor = "rgba(255, 255, 255, 0.5)",
           bordercolor = "rgba(0, 0, 0, 0.5)",
           borderwidth = 1,
           x = 0.85,
           y = 0.9
         ))

Según podemos observar en el gráfico, existe una tendencia donde el precio tiende a aumentar a medida que el área construida es mayor. Además, se destaca que los apartamentos no tienen tan marcado el aumento de precio con respecto al estrato.

Modelo de Regresión Multiple

# Estimar el modelo de regresión lineal múltiple
modelo <- lm(preciom ~ areaconst + estrato + habitaciones +  banios + parqueaderos, data = vivienda_ZS)

# Mostrar un resumen del modelo
summary(modelo)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + banios + 
##     parqueaderos, data = vivienda_ZS)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1092.02   -42.28    -1.33    40.58   926.56 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -261.62501   15.63220 -16.736  < 2e-16 ***
## areaconst       1.28505    0.05403  23.785  < 2e-16 ***
## estrato        60.89709    3.08408  19.746  < 2e-16 ***
## habitaciones  -24.83693    3.89229  -6.381 2.11e-10 ***
## banios         50.69675    3.39637  14.927  < 2e-16 ***
## parqueaderos   72.91468    3.95797  18.422  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 98.02 on 2375 degrees of freedom
##   (406 observations deleted due to missingness)
## Multiple R-squared:  0.7485, Adjusted R-squared:  0.748 
## F-statistic:  1414 on 5 and 2375 DF,  p-value: < 2.2e-16

Interpretación de los Coeficientes:

  1. Intercepto: El valor estimado del precio de la vivienda cuando todas las demás variables explicativas son cero es de -$261.62.

Coeficientes de las variables explicativas:

  1. Cada aumento unitario en el área construida (areaconst) se asocia, en promedio, con un aumento de $1.28 en el precio de la vivienda.
  2. El estrato (estrato) está positivamente asociado con el precio de la vivienda, con un aumento estimado de $60.89 en el precio por cada aumento en el estrato.
  3. El número de baños (banios) y el número de parqueaderos (parqueaderos) también están positivamente asociados con el precio de la vivienda, con aumentos estimados de $50.69 y $72.91 en el precio por cada baño y parqueadero adicionales, respectivamente.
  4. El número de habitaciones (habitaciones) tiene un efecto negativo en el precio, disminuyendo aproximadamente en $-24.83 el precio de lo inmuebles.

R cuadrado:

El R cuadrado indica que aproximadamente el 74.85% de la variabilidad en el precio de la vivienda se explica por las variables incluidas en el modelo. En cuanto ha el F-statistic proporciona una prueba de significancia global para el modelo de regresión. Dado que hay un p-value menor a 0.05 indica que el modelo es significativo en la predicción del precio de la vivienda.

Supuestos del Modelo

Linealidad y Homocedasticidad

# Gráficos de diagnóstico del modelo
par(mfrow = c(2, 2))
plot(modelo)

Los gráficos muestra que los errores no son estan completamente aleatorios lo cual puede que no cumpla, con el supuesto de Homocedasticidad

Normalidad de los Residuos

residuos <- residuals(modelo)
prueba_shapiro <- shapiro.test(residuos)

# Mostrar el resultado de la prueba
print(prueba_shapiro)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos
## W = 0.79118, p-value < 2.2e-16

El resultado del p-valor es menor a 0.05 lo cual es suficiente evidencia para rechazar la hipótesis de normalidad, lo cual podria concluir que los residuos no siguen una distribución normal. y por ende el suspuesto no se cumple.

Para cumplir este supuesto se podría aplicar transformaciones a las variables predictoras o a la variable de respuesta, esto puede ayudar a hacer que los residuos se ajusten mejor a una distribución normal. Algunas transformaciones comunes incluyen la raíz cuadrada, el logaritmo, la raíz cúbica, entre otras.

Independencia de los residuos

residuos <- residuals(modelo)
# Graficar el gráfico de autocorrelación de los residuos
acf(residuos)

Este supuesto sí se cumple, por la gráfica podemos concluir que los residuos son independientes

Multicolinealidad

vif(modelo)
##    areaconst      estrato habitaciones       banios parqueaderos 
##     2.066518     1.545162     1.429280     2.529494     1.737878

Por medio de la prueba VIF podemos concluir que el supuesto de No Multicolinealidad se cumple.

Predicción

Para realizar la predicción se toman lo dos escenarios establecidos en donde el variante es el estrato.

OPC1 <- data.frame(areaconst = 300, parqueaderos = 3, banios = 3, habitaciones = 5, estrato = 5)

OPC2 <- data.frame(areaconst = 300, parqueaderos = 3, banios = 3, habitaciones = 5, estrato = 6)

# Realizar la predicción utilizando el modelo ajustado
prediccion1 <- predict(modelo, OPC1)
prediccion2 <- predict(modelo, OPC2)

# Fusionar las predicciones en un solo conjunto de datos
prediccion_total <- data.frame(prediccion1, prediccion2)
colnames(prediccion_total)<-c("Predicción 1", "Prediccion 2")

# Mostrar la predicción
tabla_md <- kable(prediccion_total, format = "markdown",caption = "Precio de los Inmuebles") %>%
kable_styling("condensed")
print(tabla_md)
## 
## 
## Table: Precio de los Inmuebles
## 
## | Predicción 1| Prediccion 2|
## |------------:|------------:|
## |     675.0247|     735.9218|

Como se observa en la tabla, el apartamento con las características que pide María, en estrato cinco, puede costar un aproximado de 675 millones, y en estrato seis, 735 millones.

Recomendacion <- vivienda %>%  filter(zona == "Zona Sur", tipo =="Apartamento", estrato == 6, preciom >= 600 & preciom <= 850) %>% arrange(desc(areaconst))
tabla_r<-head(Recomendacion, n = 2)
tabla_r<-tabla_r[,c(1,3:9,11)]
tabla_mr <- kable(tabla_r, format = "markdown",caption = "Recomendación") %>%
kable_styling("condensed")
print(tabla_mr)
## 
## 
## Table: Recomendación
## 
## |   id|piso | estrato| preciom| areaconst| parqueaderos| banios| habitaciones|barrio     |
## |----:|:----|-------:|-------:|---------:|------------:|------:|------------:|:----------|
## | 5574|NA   |       6|     850|       352|            4|      3|            3|pance      |
## | 4266|05   |       6|     700|       250|            2|      4|            5|el ingenio |

Se recomiendan dos apartamentos, uno en el barrio El Ingenio, que tiene un área construida mayor de lo deseado, y otro en el barrio La Guadalupe. Ambos son de estrato 6 y tienen la cantidad requerida de baños, así como más habitaciones. Se sugiere a María considerar la reducción de la exigencia en el número de parqueaderos y optar por la opción más económica, ya que tiene mejores características.