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
)
mapaEn 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:
- 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:
- Cada aumento unitario en el área construida (
areaconst) se asocia, en promedio, con un aumento de $0.68 en el precio de la vivienda.
- 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.
- 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.
- 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
)
mapaEn 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:
- 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:
- Cada aumento unitario en el área construida (
areaconst) se asocia, en promedio, con un aumento de $1.28 en el precio de la vivienda.
- 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.
- 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.
- 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.