En respuesta a una solicitud específica, nuestra firma inmobiliaria ha llevado a cabo un análisis detallado de dos casos particulares en el mercado de bienes raíces de Cali. El objetivo primordial consiste en proporcionar cotizaciones para viviendas que se ajusten a las necesidades y requisitos del cliente. Para ello, se han considerado ciertas características clave, incluyendo el tipo de propiedad, el área construida, el número de parqueaderos, la cantidad de baños, el estrato socioeconómico y la ubicación geográfica.
Para el primer caso, se aplicó el Modelo de Regresión Lineal Múltiple (RLM), cuya descripción detallada se presenta en el Anexo 2. Los resultados del análisis arrojaron las siguientes cotizaciones:
Es importante destacar que ambas cotizaciones se encuentran por debajo del crédito preaprobado por el banco y cumplen con todas las condiciones requeridas por el cliente.
Dado que las cotizaciones están por debajo del monto del crédito preaprobado, se procede a la siguiente etapa del análisis, que implica la identificación de las ofertas disponibles en el mercado que se ajusten a las restricciones específicas del cliente. A continuación, se presentan las cinco opciones más atractivas, considerando las preferencias y necesidades del cliente, así como los parámetros mencionados anteriormente. Cada una de estas opciones será presentada al cliente para su revisión y consideración. Además, nuestra firma inmobiliaria estará disponible para brindar asesoramiento adicional y facilitar el proceso de adquisición de la propiedad seleccionada.
Para detalles adicionales, por favor consulte el Anexo 2 para obtener información sobre el Modelo de Regresión Lineal Múltiple utilizado en este análisis.
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 4458 | Zona Norte | 02 | 4 | 315 | 270 | 2 | 4 | 4 | Casa | el bosque | -76.53176 | 3.48780 |
| 1009 | Zona Norte | NA | 5 | 250 | 243 | 1 | 4 | 5 | Casa | el bosque | -76.50755 | 3.47838 |
| 1020 | Zona Norte | 02 | 4 | 230 | 250 | 2 | 3 | 5 | Casa | la merced | -76.50799 | 3.47424 |
| 1887 | Zona Norte | 01 | 5 | 340 | 203 | 2 | 3 | 4 | Casa | vipasa | -76.51803 | 3.48257 |
| 1914 | Zona Norte | 02 | 5 | 300 | 205 | 2 | 5 | 6 | Casa | vipasa | -76.51832 | 3.48138 |
Para el segundo caso, se aplicó el Modelo de Regresión Lineal Múltiple (RLM), cuya descripción detallada se presenta en el Anexo 2. Sin embargo, es importante señalar que los resultados del modelo sugieren un precio de cotización que podría no ser realista en el actual mercado inmobiliario. Esto se debe a la dificultad de encontrar ofertas que se ajusten a las condiciones específicas del comprador.
Los precios sugeridos por el modelo de RLM son los siguientes:
Dado que estos precios sugeridos pueden no reflejar adecuadamente el mercado, a continuación se presentan cinco ofertas disponibles, algunas de las cuales pueden exceder el monto del crédito preaprobado de 850 millones de pesos. La evaluación final de estas ofertas queda a consideración del cliente. Cada una de estas ofertas se presenta como una posible opción para el cliente, teniendo en cuenta sus requisitos y preferencias. Nuestra firma inmobiliaria está disponible para proporcionar asesoramiento adicional y facilitar el proceso de selección de la propiedad que mejor se adapte a las necesidades del cliente.
Para detalles adicionales, por favor consulte el Anexo 2 para obtener información sobre el Modelo de Regresión Lineal Múltiple utilizado en este análisis.
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 6175 | Zona Sur | 05 | 5 | 350 | 270 | 3 | 3 | 4 | Apartamento | capri | -76.54100 | 3.39200 |
| 5758 | Zona Sur | NA | 6 | 950 | 329 | 4 | 5 | 4 | Apartamento | ciudad jardín | -76.53800 | 3.36300 |
| 6275 | Zona Sur | NA | 6 | 950 | 330 | 4 | 6 | 4 | Apartamento | ciudad jardín | -76.54175 | 3.37103 |
| 4962 | Zona Sur | NA | 6 | 980 | 274 | 3 | 4 | 4 | Apartamento | ciudad jardin | -76.53400 | 3.36900 |
| 6868 | Zona Sur | 03 | 3 | 370 | 300 | 3 | 6 | 5 | Apartamento | melendez | -76.54537 | 3.37812 |
En el proceso de cotización de viviendas para nuestros clientes, hemos seleccionado un enfoque basado en el Modelo de Regresión Lineal Múltiple (RLM) para pronosticar los precios de las propiedades. Este enfoque se ha elegido por diversas razones, que se detallan a continuación:
Simplicidad: El Modelo de RLM es reconocido por su simplicidad y facilidad de comprensión, lo que lo hace especialmente adecuado para análisis exploratorios y para presentar resultados de manera efectiva a stakeholders que pueden no tener un conocimiento técnico profundo. Esta simplicidad es esencial para asegurar que nuestros clientes puedan comprender fácilmente las cotizaciones propuestas.
Interpretación de Coeficientes: Una característica fundamental del Modelo de RLM es la interpretación directa de sus coeficientes. Esto significa que podemos entender de manera intuitiva cómo cada variable independiente impacta en el precio de la vivienda. Esta capacidad de interpretación facilita la identificación de las características clave que influyen en el valor de una propiedad y proporciona información valiosa tanto para nuestros analistas como para nuestros clientes.
Para abordar de manera efectiva los casos presentados, seguimos una metodología sólida que consta de tres etapas fundamentales:
Limpieza de Datos: Comenzamos con una exhaustiva limpieza de datos para garantizar la calidad y la integridad de la información utilizada en nuestro análisis. Esto implica la identificación y corrección de valores atípicos, datos faltantes y cualquier otro problema que pueda afectar la precisión de nuestras cotizaciones.
Análisis Exploratorio de Variables: A continuación, llevamos a cabo un análisis exploratorio de variables para comprender mejor la distribución y la relación entre las características de las propiedades y sus precios. Este paso nos ayuda a identificar tendencias, patrones y posibles variables relevantes para el modelo de RLM.
Modelado y Validación de Supuestos: Una vez completadas las etapas anteriores, procedemos al planteamiento de los modelos de RLM. Utilizamos técnicas estadísticas avanzadas para validar los supuestos del modelo, asegurando que se cumplan los requisitos necesarios para obtener estimaciones confiables.
Este enfoque metodológico integral garantiza que nuestras cotizaciones estén respaldadas por análisis sólidos y que sean precisas y confiables. Nuestra prioridad es proporcionar a nuestros clientes información precisa y útil para tomar decisiones informadas en el mercado inmobiliario.
Importación y resumen de los datos
data("vivienda")
df <- vivienda
# Reordenar df
df <- df %>% select(id, zona, tipo, barrio, piso, estrato, preciom, areaconst, parqueaderos, banios, habitaciones, longitud, latitud)
kable(head(df, n = 5))
| id | zona | tipo | barrio | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1147 | Zona Oriente | Casa | 20 de julio | NA | 3 | 250 | 70 | 1 | 3 | 6 | -76.51168 | 3.43382 |
| 1169 | Zona Oriente | Casa | 20 de julio | NA | 3 | 320 | 120 | 1 | 2 | 3 | -76.51237 | 3.43369 |
| 1350 | Zona Oriente | Casa | 20 de julio | NA | 3 | 350 | 220 | 2 | 2 | 4 | -76.51537 | 3.43566 |
| 5992 | Zona Sur | Casa | 3 de julio | 02 | 4 | 400 | 280 | 3 | 5 | 3 | -76.54000 | 3.43500 |
| 1212 | Zona Norte | Apartamento | acopi | 01 | 5 | 260 | 90 | 1 | 2 | 3 | -76.51350 | 3.45891 |
summary(df)
## id zona tipo barrio
## Min. : 1 Length:8322 Length:8322 Length:8322
## 1st Qu.:2080 Class :character Class :character Class :character
## Median :4160 Mode :character Mode :character Mode :character
## Mean :4160
## 3rd Qu.:6240
## Max. :8319
## NA's :3
## piso estrato preciom areaconst
## Length:8322 Min. :3.000 Min. : 58.0 Min. : 30.0
## Class :character 1st Qu.:4.000 1st Qu.: 220.0 1st Qu.: 80.0
## Mode :character Median :5.000 Median : 330.0 Median : 123.0
## Mean :4.634 Mean : 433.9 Mean : 174.9
## 3rd Qu.:5.000 3rd Qu.: 540.0 3rd Qu.: 229.0
## Max. :6.000 Max. :1999.0 Max. :1745.0
## NA's :3 NA's :2 NA's :3
## parqueaderos banios habitaciones longitud
## Min. : 1.000 Min. : 0.000 Min. : 0.000 Min. :-76.59
## 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 3.000 1st Qu.:-76.54
## Median : 2.000 Median : 3.000 Median : 3.000 Median :-76.53
## Mean : 1.835 Mean : 3.111 Mean : 3.605 Mean :-76.53
## 3rd Qu.: 2.000 3rd Qu.: 4.000 3rd Qu.: 4.000 3rd Qu.:-76.52
## Max. :10.000 Max. :10.000 Max. :10.000 Max. :-76.46
## NA's :1605 NA's :3 NA's :3 NA's :3
## latitud
## Min. :3.333
## 1st Qu.:3.381
## Median :3.416
## Mean :3.418
## 3rd Qu.:3.452
## Max. :3.498
## NA's :3
Verificar si existe faltante de datos
md.pattern(df)
## preciom id zona tipo barrio estrato areaconst banios habitaciones longitud
## 4808 1 1 1 1 1 1 1 1 1 1
## 1909 1 1 1 1 1 1 1 1 1 1
## 876 1 1 1 1 1 1 1 1 1 1
## 726 1 1 1 1 1 1 1 1 1 1
## 1 1 0 0 0 0 0 0 0 0 0
## 2 0 0 0 0 0 0 0 0 0 0
## 2 3 3 3 3 3 3 3 3 3
## latitud parqueaderos piso
## 4808 1 1 1 0
## 1909 1 1 0 1
## 876 1 0 1 1
## 726 1 0 0 2
## 1 0 0 0 12
## 2 0 0 0 13
## 3 1605 2638 4275
Se han identificado dos registros que carecen de datos en todas sus variables, y un tercer registro que contiene información únicamente en una de sus variables. Por tanto, se ha llevado a cabo la eliminación de estos tres registros del conjunto de datos.
df <- df[!is.na(df$id), ]
Se ha considerado que aquellos registros que presentan valores faltantes (NA) en la variable ‘piso’ corresponden, por defecto, al primer piso. Del mismo modo, se ha supuesto que los registros con valores faltantes en la variable ‘parqueadero’ indican que la vivienda carece de parqueaderos.
# Llenar los registros de NA en la columna "piso" con el número 1
df$piso <- ifelse(is.na(df$piso), 1, df$piso)
# Llenar los registros de NA en la columna "parqueaderos" con el número 0
df$parqueaderos <- ifelse(is.na(df$parqueaderos), 0, df$parqueaderos)
# Declarar variables categoricas como tal
df$piso <- factor(df$piso)
df$estrato <- factor(df$estrato)
md.pattern(df)
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## id zona tipo barrio piso estrato preciom areaconst parqueaderos banios
## 8319 1 1 1 1 1 1 1 1 1 1
## 0 0 0 0 0 0 0 0 0 0
## habitaciones longitud latitud
## 8319 1 1 1 0
## 0 0 0 0
Se Filtran las casas que se encuentran en la zona norte y se grafica
# Filtrar casas zona norte
df1 <- df[df$tipo == "Casa", ]
df1 <- df1[df1$zona == "Zona Norte", ]
kable(head(df1, n = 3))
| id | zona | tipo | barrio | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1209 | Zona Norte | Casa | acopi | 02 | 5 | 320 | 150 | 2 | 4 | 6 | -76.51341 | 3.47968 |
| 1592 | Zona Norte | Casa | acopi | 02 | 5 | 780 | 380 | 2 | 3 | 3 | -76.51674 | 3.48721 |
| 4057 | Zona Norte | Casa | acopi | 02 | 6 | 750 | 445 | 0 | 7 | 6 | -76.52950 | 3.38527 |
# Imprimir valores unicos de Zona
print(unique(df1$zona))
## [1] "Zona Norte"
# Creando el mapa
maps <- leaflet(df1) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud)
maps
Es evidente que la categorización geográfica de ‘Zona Norte’ no siempre refleja con precisión la ubicación real de las viviendas mencionadas, debido a errores en la clasificación geográfica. En consecuencia, se realiza un proceso de corrección para asignar de manera precisa las ubicaciones según sus coordenadas geográficas.
# Definir zona dependiendo la posicion geografica
df$zona <- NA
df$zona <- ifelse(df$longitud < -76.537138, "Zona Oeste", df$zona)
df$zona <- ifelse(df$longitud > -76.485196, "Zona Oriente", df$zona)
df$zona <- ifelse(df$latitud > 3.460322, "Zona Norte", df$zona)
df$zona <- ifelse(df$latitud < 3.404536, "Zona Sur", df$zona)
df$zona <- ifelse(is.na(df$zona), "Zona Centro", df$zona)
# Filtrar y graficar casas de la zona norte
df1 <- df[df$tipo == "Casa", ]
df1 <- df1[df1$zona == "Zona Norte", ]
kable(head(df1, n = 3))
| id | zona | tipo | barrio | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1209 | Zona Norte | Casa | acopi | 02 | 5 | 320 | 150 | 2 | 4 | 6 | -76.51341 | 3.47968 |
| 1592 | Zona Norte | Casa | acopi | 02 | 5 | 780 | 380 | 2 | 3 | 3 | -76.51674 | 3.48721 |
| 504 | Zona Norte | Casa | acopi | 1 | 3 | 180 | 120 | 0 | 3 | 3 | -76.49768 | 3.47060 |
# Imprimir valores unicos de Zona
print(unique(df1$zona))
## [1] "Zona Norte"
# Creando el mapa
maps <- leaflet(df1) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud)
maps
Gracias a la nueva clasificación geográfica, se ha logrado asignar de manera precisa la etiqueta ‘Zona Norte’ a las viviendas que realmente se encuentran en dicha área, corrigiendo así las imprecisiones previas en la categorización geográfica.
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.
ggpairs(df1[,7:11], title=" ")
Al examinar la matriz de diagrama de dispersión, es evidente que las variables predictoras exhiben una correlación baja entre sí, lo cual es un indicador favorable para el modelo de Regresión Lineal Múltiple (RLM) que se está considerando. Esta baja correlación sugiere que no existe multicolinealidad, lo que fortalece la robustez del modelo.
Por otro lado, se observa que las variables ‘precio’ y ‘área construida’ presentan una asimetría hacia la izquierda en sus distribuciones, mientras que las variables ‘parqueaderos’, ‘baños’ y ‘habitaciones’ muestran distribuciones con diferentes picos y valles, lo que indica concentraciones de datos en distintos puntos a lo largo de sus rangos.
modelo <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = df1)
summary(modelo)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = df1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -860.47 -57.76 -13.63 35.43 942.86
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 54.33921 18.44101 2.947 0.003350 **
## areaconst 0.74602 0.04583 16.277 < 2e-16 ***
## estrato4 63.82907 17.84550 3.577 0.000379 ***
## estrato5 102.93561 16.93853 6.077 2.31e-09 ***
## estrato6 356.93216 33.57898 10.630 < 2e-16 ***
## habitaciones -0.61195 4.66376 -0.131 0.895655
## parqueaderos 18.33363 4.44531 4.124 4.30e-05 ***
## banios 22.41181 6.23423 3.595 0.000354 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 138.5 on 543 degrees of freedom
## Multiple R-squared: 0.6956, Adjusted R-squared: 0.6916
## F-statistic: 177.2 on 7 and 543 DF, p-value: < 2.2e-16
Del análisis del modelo, se puede concluir que la variable ‘habitaciones’ no muestra significancia, considerando un nivel de confianza del 95% (α = 0.05). Además, es importante destacar que el modelo exhibe un coeficiente de determinación ajustado (R² ajustado) de 0.6916, lo cual es un indicador positivo. Este valor sugiere que el modelo tiene un buen rendimiento al explicar una gran parte de la variabilidad en la variable de respuesta (Y).
En relación a la variable ‘habitaciones’, se ha realizado un análisis más detallado, que incluye el cálculo de la media y la mediana. Además, se ha evaluado la normalidad de esta variable para comprender mejor su comportamiento en el contexto del modelo.
# Calcular la media
media <- mean(df1$habitaciones)
# Calcular la mediana
mediana <- median(df1$habitaciones)
# Realizar la prueba de normalidad en la columna
prueba_nor <- shapiro.test(df1$habitaciones)
# Mostrar los resultados
print(paste("Media:", media))
## [1] "Media: 4.51905626134301"
print(paste("Mediana:", mediana))
## [1] "Mediana: 4"
print(prueba_nor)
##
## Shapiro-Wilk normality test
##
## data: df1$habitaciones
## W = 0.88102, p-value < 2.2e-16
la variable ‘habitaciones’ sigue una distribución normal, con una media de 4.51 y una mediana de 4. Esto sugiere que, independientemente de la configuración específica de las casas en la zona norte, el número de habitaciones tiende a mantenerse en valores cercanos a la media. Este hallazgo contribuye a comprender por qué esta variable no muestra significancia en el modelo.
Como resultado de esta observación y debido a que la variable no es estadisticamente significativa, se ha procedido a la creación de un nuevo modelo, excluyendo la variable ‘habitaciones’.
modelo <- lm(preciom ~ areaconst + estrato + parqueaderos + banios, data = df1)
residuos <- resid(modelo)
summary(modelo)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios,
## data = df1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -861.26 -57.48 -13.45 35.65 942.99
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 53.14172 16.00996 3.319 0.000963 ***
## areaconst 0.74443 0.04417 16.855 < 2e-16 ***
## estrato4 64.38269 17.32388 3.716 0.000223 ***
## estrato5 103.62007 16.10075 6.436 2.70e-10 ***
## estrato6 358.18405 32.16594 11.136 < 2e-16 ***
## parqueaderos 18.29520 4.43164 4.128 4.23e-05 ***
## banios 21.95978 5.19119 4.230 2.74e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 138.4 on 544 degrees of freedom
## Multiple R-squared: 0.6956, Adjusted R-squared: 0.6922
## F-statistic: 207.1 on 6 and 544 DF, p-value: < 2.2e-16
A continuación, se realiza un análisis de estos coeficientes:
Intercept (Intercepto): El valor estimado del precio de una vivienda cuando todas las variables independientes son cero, es decir, el precio base de una vivienda.
areaconst (Área Construida): Un aumento de una unidad en el área construida se asocia con un aumento de aproximadamente 0.74443 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.
estrato4: Para las viviendas en el estrato 4 en comparación con el estrato de referencia, se espera un aumento de aproximadamente 64.38269 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.
estrato5: Para las viviendas en el estrato 5 en comparación con el estrato de referencia, se espera un aumento de aproximadamente 103.62007 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.
estrato6: Para las viviendas en el estrato 6 en comparación con el estrato de referencia, se espera un aumento de aproximadamente 358.18405 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.
parqueaderos: Un aumento de una unidad en el número de parqueaderos se asocia con un aumento de aproximadamente 18.29520 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.
banios (Baños): Un aumento de una unidad en el número de baños se asocia con un aumento de aproximadamente 21.95978 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.
Homocedasticidad
#Homocedasticidad. Gráfico de residuos estandarizados vs. valores ajustados
plot(modelo, which = 3)
Del grafico se puede observar que la varianza de los residuos no es constante, para poder verificar esto se realiza a continuación el test de Breusch-Pagan
#Test de Breusch-Pagan para homocedasticidad
bptest(residuos ~ fitted(modelo))
##
## studentized Breusch-Pagan test
##
## data: residuos ~ fitted(modelo)
## BP = 71.252, df = 1, p-value < 2.2e-16
El resultado del Breusch-Pagan test es altamente significativo, con un valor de estadístico BP de 71.252 y un grado de libertad (df) de 1. El p-valor calculado es prácticamente nulo, lo que sugiere una fuerte evidencia en contra de la hipótesis nula de homocedasticidad en el modelo. En otras palabras, existe una clara heterocedasticidad en los datos, lo que indica que la varianza de los errores no es constante a lo largo de las observaciones.
Se viola el supuesto de varianza constante de los errores
Errores aleatorios con distribución normal
#Normalidad. Gráfico de cuantiles de los residuos vs. cuantiles teóricos normales
qqnorm(residuos)
shapiro.test(residuos)
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.81966, p-value < 2.2e-16
El resultado del Shapiro-Wilk normality test arroja un valor de estadístico W igual a 0.81966 y un p-valor prácticamente nulo (< 2.2e-16). Esto proporciona una fuerte evidencia en contra de la hipótesis nula de que los datos siguen una distribución normal. En otras palabras, los errores no se ajustan a una distribución normal concluión a la que podemos llegar tambien en el grafico Q-Q.
Se viola el supuesto de que los errores se distribuyen de forma normal
Los errores tienen media cero
# Prueba estadística de la media de los residuos
t_test <- t.test(residuos)
print(mean(residuos))
## [1] -6.597135e-15
print(t_test)
##
## One Sample t-test
##
## data: residuos
## t = -1.1251e-15, df = 550, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -11.51748 11.51748
## sample estimates:
## mean of x
## -6.597135e-15
los resultados de esta prueba t-test sugieren que no hay evidencia de que la media de los residuos sea significativamente diferente de cero. El p-valor alto (igual a 1) indica que no hay suficiente evidencia para rechazar la hipótesis nula de que la media de los residuos es igual a cero
No se viola este supuesto
Los errores son mutuamente independientes
# Gráfico de residuos vs. orden de observación
plot(residuos, type = "o", ylab = "Residuos", xlab = "Orden de Observación")
abline(h = 0, col = "red", lty = 2)
# Calcula el estadístico Durbin-Watson
dwtest(modelo)
##
## Durbin-Watson test
##
## data: modelo
## DW = 1.9013, p-value = 0.1086
## alternative hypothesis: true autocorrelation is greater than 0
Al examinar tanto el gráfico de los residuos como los resultados de la prueba Durbin-Watson, llegamos a la conclusión de que los errores en el modelo son mutuamente independientes. En particular, el valor del estadístico Durbin-Watson (DW) es 1.9013, lo cual está cercano a 2. Un valor de DW cercano a 2 generalmente sugiere que los residuos son independientes entre sí. Además, dado que el p-valor asociado con la prueba es mayor que 0.05, no encontramos evidencia significativa de autocorrelación en los residuos.
No se viola el supuesto de independencia de los errores en este modelo
sol1_1 <- data.frame(
areaconst = 200,
estrato = "4",
habitaciones = 4,
parqueaderos = 1,
banios = 2
)
sol1_2 <- data.frame(
areaconst = 200,
estrato = "5",
habitaciones = 4,
parqueaderos = 1,
banios = 2
)
pre_sol1_1 <- predict(modelo, newdata = sol1_1)
pre_sol1_2 <- predict(modelo, newdata = sol1_2)
cat("Cotizacion de la vivienda estrato 4:", pre_sol1_1,"\n")
## Cotizacion de la vivienda estrato 4: 328.6259
cat("Cotizacion de la vivienda estrato 5:", pre_sol1_2,"\n")
## Cotizacion de la vivienda estrato 5: 367.8633
Se detallan las sugerencias y sus respectivas ubicaciones para todas las ofertas potenciales que satisfacen las condiciones del comprador.
| id | zona | tipo | barrio | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 4267 | Zona Norte | Casa | el bosque | 01 | 5 | 335 | 202.0 | 1 | 4 | 5 | -76.53044 | 3.48399 |
| 4800 | Zona Norte | Casa | el bosque | 01 | 5 | 340 | 250.0 | 2 | 4 | 4 | -76.53300 | 3.46500 |
| 4209 | Zona Norte | Casa | el bosque | 02 | 5 | 350 | 300.0 | 3 | 5 | 6 | -76.53010 | 3.48577 |
| 4422 | Zona Norte | Casa | el bosque | 02 | 5 | 350 | 240.0 | 2 | 3 | 6 | -76.53136 | 3.48635 |
| 4458 | Zona Norte | Casa | el bosque | 02 | 4 | 315 | 270.0 | 2 | 4 | 4 | -76.53176 | 3.48780 |
| 4483 | Zona Norte | Casa | el bosque | 02 | 5 | 342 | 250.0 | 1 | 4 | 6 | -76.53197 | 3.48752 |
| 1009 | Zona Norte | Casa | el bosque | 1 | 5 | 250 | 243.0 | 1 | 4 | 5 | -76.50755 | 3.47838 |
| 1270 | Zona Norte | Casa | el bosque | 1 | 5 | 350 | 203.0 | 2 | 2 | 5 | -76.51448 | 3.48531 |
| 3453 | Zona Norte | Casa | la campiña | 1 | 5 | 340 | 240.0 | 2 | 5 | 6 | -76.52640 | 3.48211 |
| 819 | Zona Norte | Casa | la flora | 02 | 5 | 350 | 264.0 | 2 | 3 | 4 | -76.50330 | 3.46412 |
| 3053 | Zona Norte | Casa | la flora | 02 | 5 | 320 | 230.0 | 2 | 4 | 4 | -76.52353 | 3.48352 |
| 937 | Zona Norte | Casa | la merced | 02 | 4 | 350 | 280.0 | 2 | 3 | 4 | -76.50603 | 3.46643 |
| 952 | Zona Norte | Casa | la merced | 02 | 4 | 330 | 275.0 | 2 | 3 | 5 | -76.50647 | 3.47516 |
| 1020 | Zona Norte | Casa | la merced | 02 | 4 | 230 | 250.0 | 2 | 3 | 5 | -76.50799 | 3.47424 |
| 1108 | Zona Norte | Casa | la merced | 02 | 4 | 330 | 260.0 | 1 | 3 | 4 | -76.51060 | 3.48108 |
| 766 | Zona Norte | Casa | la merced | 1 | 5 | 321 | 249.0 | 1 | 5 | 5 | -76.50291 | 3.46757 |
| 1163 | Zona Norte | Casa | la merced | 1 | 5 | 350 | 216.0 | 2 | 2 | 4 | -76.51218 | 3.48181 |
| 3043 | Zona Norte | Casa | la merced | 1 | 5 | 330 | 275.0 | 2 | 3 | 5 | -76.52350 | 3.48329 |
| 1849 | Zona Norte | Casa | prados del norte | 1 | 5 | 330 | 246.0 | 2 | 4 | 4 | -76.51800 | 3.47000 |
| 3101 | Zona Norte | Casa | san vicente | 02 | 5 | 340 | 355.0 | 2 | 5 | 8 | -76.52377 | 3.46384 |
| 1151 | Zona Norte | Casa | urbanización la merced | 1 | 5 | 320 | 210.0 | 2 | 3 | 5 | -76.51200 | 3.47600 |
| 1887 | Zona Norte | Casa | vipasa | 01 | 5 | 340 | 203.0 | 2 | 3 | 4 | -76.51803 | 3.48257 |
| 2544 | Zona Norte | Casa | vipasa | 01 | 4 | 340 | 264.5 | 2 | 4 | 4 | -76.52096 | 3.47665 |
| 1842 | Zona Norte | Casa | vipasa | 02 | 5 | 350 | 240.0 | 2 | 3 | 4 | -76.51800 | 3.48100 |
| 1914 | Zona Norte | Casa | vipasa | 02 | 5 | 300 | 205.0 | 2 | 5 | 6 | -76.51832 | 3.48138 |
| 1822 | Zona Norte | Casa | vipasa | 1 | 4 | 340 | 295.0 | 2 | 2 | 4 | -76.51777 | 3.48060 |
| 1943 | Zona Norte | Casa | vipasa | 1 | 5 | 350 | 346.0 | 1 | 2 | 4 | -76.51847 | 3.47503 |
# Filtrar APT zona Sur
df2 <- df[df$tipo == "Apartamento", ]
df2 <- df2[df2$zona == "Zona Sur", ]
kable(head(df2, n = 3))
| id | zona | tipo | barrio | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1724 | Zona Sur | Apartamento | acopi | 01 | 5 | 240 | 87 | 1 | 3 | 3 | -76.51700 | 3.36971 |
| 4386 | Zona Sur | Apartamento | acopi | 01 | 5 | 310 | 137 | 2 | 3 | 4 | -76.53105 | 3.38296 |
| 6857 | Zona Sur | Apartamento | acopi | 03 | 3 | 100 | 49 | 0 | 1 | 2 | -76.54531 | 3.37775 |
# Imprimir valores unicos de Zona
print(unique(df2$zona))
## [1] "Zona Sur"
# Creando el mapa
maps <- leaflet(df2) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud)
maps
ggpairs(df2[,7:11], title=" ")
Es evidente que existe una fuerte correlación entre el precio de las viviendas y el área construida. Sin embargo, al analizar las variables predictoras, encontramos una alta correlación únicamente entre la cantidad de baños y el área construida. Además, es interesante notar que las variables de parqueaderos, baños y habitaciones muestran patrones de concentración de datos en ciertos puntos, evidenciados por la presencia de picos y valles en sus distribuciones.
modelo2 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = df2)
residuos2 <- resid(modelo2)
summary(modelo2)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = df2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1219.38 -38.00 0.26 33.06 873.18
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -18.46671 13.00872 -1.420 0.155879
## areaconst 1.45787 0.05404 26.977 < 2e-16 ***
## estrato4 17.53434 9.38919 1.868 0.061967 .
## estrato5 33.07259 9.68612 3.414 0.000651 ***
## estrato6 179.61965 11.82556 15.189 < 2e-16 ***
## habitaciones -17.75743 3.98827 -4.452 8.92e-06 ***
## parqueaderos 49.04515 3.41023 14.382 < 2e-16 ***
## banios 49.75506 3.61529 13.762 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 96.85 on 2156 degrees of freedom
## Multiple R-squared: 0.788, Adjusted R-squared: 0.7873
## F-statistic: 1145 on 7 and 2156 DF, p-value: < 2.2e-16
Basándonos en el modelo de Regresión Lineal Múltiple (RLM), podemos concluir que ni la variable ‘estrato 4’ ni el intercepto son estadísticamente significativos. No obstante, es importante destacar que el modelo exhibe un R-cuadrado ajustado (Adjusted R-squared) de 0.7873, lo que sugiere que es capaz de explicar una alta variabilidad en los datos.
A continuación, realizamos un análisis de estos coeficientes:
Intercepto: El valor del intercepto representa el precio base de una vivienda cuando todas las demás variables son nulas.
areaconst (Área Construida): Cada unidad adicional en el área construida se asocia con un aumento de aproximadamente 1.45787 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.
estrato4: Para las viviendas en el estrato 4 en comparación con el estrato de referencia, se espera un aumento de aproximadamente 17.53434 unidades en el precio, manteniendo todas las demás variables constantes.
estrato5: Para las viviendas en el estrato 5 en comparación con el estrato de referencia, se espera un aumento de aproximadamente 33.07259 unidades en el precio, manteniendo todas las demás variables constantes.
estrato6: Para las viviendas en el estrato 6 en comparación con el estrato de referencia, se espera un aumento de aproximadamente 179.61965 unidades en el precio, manteniendo todas las demás variables constantes.
habitaciones: Cada unidad adicional en el número de habitaciones se asocia con una disminución de aproximadamente 17.75743 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.
parqueaderos: Cada unidad adicional en el número de parqueaderos se asocia con un aumento de aproximadamente 49.04515 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.
banios (Baños): Cada unidad adicional en el número de baños se asocia con un aumento de aproximadamente 49.75506 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.
Homocedasticidad
#Homocedasticidad. Gráfico de residuos estandarizados vs. valores ajustados
plot(modelo2, which = 3)
#Test de Breusch-Pagan para homocedasticidad
bptest(residuos2 ~ fitted(modelo2))
##
## studentized Breusch-Pagan test
##
## data: residuos2 ~ fitted(modelo2)
## BP = 313.78, df = 1, p-value < 2.2e-16
Estadístico BP (Breusch-Pagan): El valor del estadístico BP es 313.78. Este valor representa la magnitud de la prueba y se utiliza para evaluar si hay heterocedasticidad (variabilidad no constante) en los residuos del modelo.
Valor p (p-value): El p-valor es prácticamente cero (menor que 2.2e-16). Esto indica que la probabilidad de observar un estadístico BP tan extremo bajo la hipótesis nula de homocedasticidad es extremadamente baja.
Dado que el p-valor es esencialmente cero, hay una fuerte evidencia para rechazar la hipótesis nula de homocedasticidad en el modelo. En otras palabras, los datos muestran heterocedasticidad, lo que significa que la varianza de los errores no es constante a lo largo de las observaciones.
Se viola el supuesto de homocedasticidad
Errores aleatorios con distribución normal
#Normalidad. Gráfico de cuantiles de los residuos vs. cuantiles teóricos normales
qqnorm(residuos2)
shapiro.test(residuos2)
##
## Shapiro-Wilk normality test
##
## data: residuos2
## W = 0.75599, p-value < 2.2e-16
Estadístico W: El valor del estadístico W es 0.75599. Este estadístico se utiliza para calcular la diferencia entre la distribución de los datos observados y la distribución normal esperada. En general, cuanto más cerca esté W de 1, más similar es la distribución de los datos a una distribución normal.
Valor p (p-value): El p-valor es prácticamente cero (menor que 2.2e-16). Esto indica que la probabilidad de observar un estadístico W tan bajo bajo la hipótesis nula de que los datos siguen una distribución normal es extremadamente baja.
Dado que el p-valor es esencialmente cero, hay una fuerte evidencia para rechazar la hipótesis nula de que los datos siguen una distribución normal. En otras palabras, los datos no se ajustan a una distribución normal.
Se viola el supuesto de normalidad de los errores
Los errores tienen media cero
# Prueba estadística de la media de los residuos
t_test <- t.test(residuos2)
print(mean(residuos2))
## [1] -4.198685e-15
print(t_test)
##
## One Sample t-test
##
## data: residuos2
## t = -2.02e-15, df = 2163, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -4.076276 4.076276
## sample estimates:
## mean of x
## -4.198685e-15
Los resultados de la prueba t indican que el valor es prácticamente cero, lo que sugiere que la media de los residuos se encuentra efectivamente muy próxima a cero. Además, el p-valor es igual a 1, lo que significa que no disponemos de evidencia significativa para rechazar la hipótesis nula de que la media de los residuos es igual a cero.
No se viola este supuesto
Los errores son mutuamente independientes
# Gráfico de residuos vs. orden de observación
plot(residuos2, type = "o", ylab = "Residuos", xlab = "Orden de Observación")
abline(h = 0, col = "red", lty = 2)
# Calcula el estadístico Durbin-Watson
dwtest(modelo2)
##
## Durbin-Watson test
##
## data: modelo2
## DW = 1.7031, p-value = 1.774e-12
## alternative hypothesis: true autocorrelation is greater than 0
El valor del estadístico Durbin-Watson (DW) es igual a 1.7031, lo cual, al ser menor que 2, sugiere la presencia de autocorrelación positiva en los residuos del modelo. Además, el p-valor asociado es extremadamente pequeño, con un valor de 1.774e-12. Este hallazgo proporciona una evidencia sólida en contra de la hipótesis nula que sostiene que no hay autocorrelación en los residuos. En otras palabras, estos resultados sugieren que existe una autocorrelación significativa en los residuos del modelo.
Se viola este supuesto
sol2_1 <- data.frame(
areaconst = 300,
estrato = "5",
habitaciones = 5,
parqueaderos = 3,
banios = 3
)
sol2_2 <- data.frame(
areaconst = 300,
estrato = "6",
habitaciones = 5,
parqueaderos = 3,
banios = 3
)
pre_sol2_1 <- predict(modelo2, newdata = sol2_1)
pre_sol2_2 <- predict(modelo2, newdata = sol2_2)
cat("El precio pronosticado de la vivienda estrato 5 es:", pre_sol2_1,"\n")
## El precio pronosticado de la vivienda estrato 5 es: 659.5818
cat("El precio pronosticado de la vivienda estrato 6 es:", pre_sol2_2,"\n")
## El precio pronosticado de la vivienda estrato 6 es: 806.1289
Se detallan las sugerencias y sus respectivas ubicaciones para todas las ofertas potenciales que satisfacen las condiciones del comprador.
# Filtrar valores del df
ofertas2 <- subset(df2, banios > 2 & parqueaderos > 2 & habitaciones > 3 & areaconst > 250 & preciom < 1200)
kable(ofertas2)
| id | zona | tipo | barrio | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 6175 | Zona Sur | Apartamento | capri | 05 | 5 | 350 | 270 | 3 | 3 | 4 | -76.54100 | 3.39200 |
| 5248 | Zona Sur | Apartamento | ciudad jardín | 08 | 6 | 1150 | 344 | 4 | 5 | 5 | -76.53533 | 3.36971 |
| 6023 | Zona Sur | Apartamento | ciudad jardín | 08 | 6 | 1150 | 464 | 4 | 6 | 5 | -76.54000 | 3.36800 |
| 5532 | Zona Sur | Apartamento | ciudad jardín | 1 | 6 | 1150 | 344 | 4 | 5 | 4 | -76.53700 | 3.37000 |
| 5758 | Zona Sur | Apartamento | ciudad jardín | 1 | 6 | 950 | 329 | 4 | 5 | 4 | -76.53800 | 3.36300 |
| 6275 | Zona Sur | Apartamento | ciudad jardín | 1 | 6 | 950 | 330 | 4 | 6 | 4 | -76.54175 | 3.37103 |
| 4962 | Zona Sur | Apartamento | ciudad jardin | 1 | 6 | 980 | 274 | 3 | 4 | 4 | -76.53400 | 3.36900 |
| 6868 | Zona Sur | Apartamento | melendez | 03 | 3 | 370 | 300 | 3 | 6 | 5 | -76.54537 | 3.37812 |
#Mapa
maps <- leaflet(ofertas2) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud)
maps