Con base en los datos de ofertas de vivienda descargadas del portal Fincaraiz para apartamento de estrato 4 con área construida menor a 200 m2 (vivienda4.RDS) la inmobiliaria A&C requiere el apoyo de un cientifico de datos en la construcción de un modelo que lo oriente sobre los precios de inmuebles.
Con este propósito el equipo de asesores a diseñado los siguientes pasos para obtener un modelo y así poder a futuro determinar los precios de los inmuebles a negociar. Con los resultados obtenidos construya un informe para los directivos de la inmobiliaria, indicando el modelo apropiado y sus principales características.
Para realizar este análisis, se utilizó la base de datos de propiedades recopilada por B&C, que incluye información sobre el precio, la ubicación, las características, y las ventas de viviendas en Cali. Se emplearon técnicas estadísticas descriptivas para identificar tendencias y patrones en los datos. El análisis se centró en tres áreas principales: precios de las viviendas, tipos de viviendas ofertadas, y características de las viviendas.
Primero, se procedió con la importación de la base de datos a nuestro entorno de trabajo, seguido de la integración de diversas bibliotecas esenciales para el análisis y representación gráfica de los datos, tales como RColorBrewer, ggplot2, ggfortify y MASS. Posteriormente, se llevó a cabo una revisión preliminar de los datos para reconocer las distintas variables presentes: zona, estrato, preciom, areaconst y tipo.
Durante la fase de limpieza de datos, se realizar los siguientes cambios:
Se realizó imputación de datos faltantes usando el promedio para la variable respectiva.
#install.packages("learnr") # solo una vez#·install.packages("devtools") # solo una vez
#devtools::install_github("dgonxalex80/paqueteMET")
library(paqueteMET)
library(RColorBrewer)
library(ggplot2)
library(ggfortify)
library(MASS)
#Cargar data
data(vivienda4)
# Calcular el promedio de la variable 'preciom' excluyendo NA
promedio_preciom <- mean(vivienda4$preciom, na.rm = TRUE)
# Reemplazar los NA con el promedio en la variable 'preciom'
vivienda4$preciom[is.na(vivienda4$preciom)] <- promedio_preciom
# Opcional: Verificar cambios
summary(vivienda4$preciom)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 78.0 160.0 210.0 225.4 265.0 760.0
# Calcular el promedio de la variable 'areaconst' excluyendo NA
promedio_areaconst <- mean(vivienda4$areaconst, na.rm = TRUE)
# Reemplazar los NA con el promedio en la variable 'areaconst'
vivienda4$areaconst[is.na(vivienda4$areaconst)] <- promedio_areaconst
# Opcional: Verificar cambios
summary(vivienda4$areaconst)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 40.00 60.00 75.00 87.63 98.00 200.00
En promedio las viviendas tienen un precio de 225.37 Millones de pesos con ua desviación estandar de 85.8 millones y un rango de 682 millones. Adicionalmente, la varianza fue de 7276.2 con un coeficiente de variación de 38.1%.
# Calcula el promedio del precio
promedio_precio <- mean(vivienda4$preciom, na.rm = TRUE)
sd_precio <- sd(vivienda4$preciom, na.rm = TRUE)
promedio_precio
## [1] 225.3746
sd_precio
## [1] 85.88524
max(vivienda4$preciom)-min(vivienda4$preciom) # rango
## [1] 682
var(vivienda4$preciom) # varianza
## [1] 7376.274
sd(vivienda4$preciom)/mean(vivienda4$preciom)*100 # coeficiente de variación
## [1] 38.10778
El histograma y el indice de asimetria para el precio muestran una desviación de los datos hacia los valores más bajos.
rapportools::skewness(vivienda4$preciom)
## [1] 1.489466
hist(vivienda4$preciom)
Así mismo, el gráfico de densidad y el indice de curtosis muetran una distribución leptocúrtica de esta variable.
rapportools::kurtosis(vivienda4$preciom)
## [1] 3.565408
plot(density(vivienda4$preciom))
Con respecto al área de la vivienda, el area promedio es de 87.6m2 con una desviación estándar de 36.3m2 y un rango de 160. El el coeficiente de variación fue más alto que el del precio, alcanzando un 41.4%.
# Calcula el promedio del areaconst
promedio_area <- mean(vivienda4$areaconst, na.rm = TRUE)
sd_precio <- sd(vivienda4$areaconst, na.rm = TRUE)
print(promedio_area)
## [1] 87.62954
print(sd_precio)
## [1] 36.34651
max(vivienda4$areaconst)-min(vivienda4$areaconst) # rango
## [1] 160
var(vivienda4$areaconst) # varianza
## [1] 1321.069
sd(vivienda4$areaconst)/mean(vivienda4$areaconst)*100 # coeficiente de variación
## [1] 41.47746
Similar al precio, el histograma y el indice de asimetria para el área muestran una desviación de los datos hacia los valores más bajos.
rapportools::skewness(vivienda4$areaconst)
## [1] 1.531445
hist(vivienda4$areaconst)
shapiro.test(vivienda4$areaconst)
##
## Shapiro-Wilk normality test
##
## data: vivienda4$areaconst
## W = 0.8168, p-value < 2.2e-16
En este caso, dado que el valor p es extremadamente bajo, se rechaza la hipótesis nula de que vivienda4$areaconst sigue una distribución normal. Esto sugiere que los datos no se distribuyen normalmente según la prueba de Shapiro-Wilk.
rapportools::kurtosis(vivienda4$areaconst)
## [1] 1.677247
plot(density(vivienda4$areaconst))
Teniendo en cuenta los resultados anteriores, se determina que es apropiado usar estadistica no parametrica debido a la distrubución no normal de los datos.
cor(vivienda4$preciom,vivienda4$areaconst, method = "spearman")
## [1] 0.8276617
cor.test(vivienda4$preciom,vivienda4$areaconst, method = "spearman")
## Warning in cor.test.default(vivienda4$preciom, vivienda4$areaconst, method =
## "spearman"): Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: vivienda4$preciom and vivienda4$areaconst
## S = 142615757, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.8276617
plot(vivienda4$preciom,vivienda4$areaconst) # diagrama de dispersión
El test de correlación de Spearman revela una correlación alta y estadisticamente significativa. Sin embargo, el gráfico de dispersión revela que la asociación podría ser no lineal.
mod = lm(vivienda4$preciom~vivienda4$areaconst)
summary_model <- summary(mod)
summary_model
##
## Call:
## lm(formula = vivienda4$preciom ~ vivienda4$areaconst)
##
## Residuals:
## Min 1Q Median 3Q Max
## -195.86 -31.95 -8.95 27.87 431.17
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 67.381 3.510 19.20 <2e-16 ***
## vivienda4$areaconst 1.803 0.037 48.73 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 55.53 on 1704 degrees of freedom
## Multiple R-squared: 0.5822, Adjusted R-squared: 0.5819
## F-statistic: 2374 on 1 and 1704 DF, p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(mod)
El modelo de regresión lineal revela que hay una asociación estadisticametne significativa entre la variable predictora (area construida) y la variable respuesta (precio). El intercepto (valor inicial) es de 67.3 millones COP y por cada m2 que aumenta el área, el precio aumenta 1.8 millones COP. Sin embargo, las graficas del modelo evidencian que probable outliers, por lo que se deberá hacer un testeo de los supuestos.
shapiro.test(mod$residuals)
##
## Shapiro-Wilk normality test
##
## data: mod$residuals
## W = 0.92671, p-value < 2.2e-16
# Calcula el intervalo de confianza para los coeficientes del modelo
confint(mod, "vivienda4$areaconst", level = 0.95)
## 2.5 % 97.5 %
## vivienda4$areaconst 1.730404 1.875547
summary_model$r.squared
## [1] 0.5821944
El indicador de bondad o coeficiente de determinación revela que el modelo con una única variable predictora (área construida) es capaz de explicar un 58% del resultado en la variable precio.
intercept <- summary_model$coefficients[1, "Estimate"]
intercept
## [1] 67.38063
beta1 <- summary_model$coefficients[2, "Estimate"]
beta1
## [1] 1.802976
area <- 110
ppe = intercept + beta1 * area
ppe
## [1] 265.7079
result <- paste("El precio promedio estimado de un apartamento de", area, "m2 es", ppe, "millones COP")
# Print the message
print(result)
## [1] "El precio promedio estimado de un apartamento de 110 m2 es 265.70794935968 millones COP"
El precio promedio estimado de un apartamento de 110 m2 es 265.70794935968 millones COP. Es decir, que un apartamento con las condiciones descritas a un valor de 200 millones COP sería una oferta muy atractiva para el cliente. Sin embargo, se debe tener en cuenta que el modelo solo explica parcialmete (58%) del precio. Habrá que considerarse variables como el número de parqueaderos, tipo de vivienda, etc, que pueden condicionar las preferencias del cliente.
Normalidad <- shapiro.test(mod$residuals)
Normalidad
##
## Shapiro-Wilk normality test
##
## data: mod$residuals
## W = 0.92671, p-value < 2.2e-16
Homocesdasticidad <- lmtest::bptest(mod)
Homocesdasticidad
##
## studentized Breusch-Pagan test
##
## data: mod
## BP = 152.8, df = 1, p-value < 2.2e-16
No_autocorrelacion <- lmtest::dwtest(mod)
No_autocorrelacion
##
## Durbin-Watson test
##
## data: mod
## DW = 1.6713, p-value = 5.124e-12
## alternative hypothesis: true autocorrelation is greater than 0
Los residuos no son normales, no son homocedásticos y están autocorrelacionados. Cada uno de estos problemas puede afectar seriamente la confiabilidad y validez de los resultados del modelo de regresión.
Outliers
par(mfrow=c(1,2))
boxplot(vivienda4$preciom)
boxplot(vivienda4$areaconst)
transformacion <-boxcox(mod, lambda = seq(-0.5, 0.5, by = 0.1))
print(transformacion)
## $x
## [1] -0.500000000 -0.489898990 -0.479797980 -0.469696970 -0.459595960
## [6] -0.449494949 -0.439393939 -0.429292929 -0.419191919 -0.409090909
## [11] -0.398989899 -0.388888889 -0.378787879 -0.368686869 -0.358585859
## [16] -0.348484848 -0.338383838 -0.328282828 -0.318181818 -0.308080808
## [21] -0.297979798 -0.287878788 -0.277777778 -0.267676768 -0.257575758
## [26] -0.247474747 -0.237373737 -0.227272727 -0.217171717 -0.207070707
## [31] -0.196969697 -0.186868687 -0.176767677 -0.166666667 -0.156565657
## [36] -0.146464646 -0.136363636 -0.126262626 -0.116161616 -0.106060606
## [41] -0.095959596 -0.085858586 -0.075757576 -0.065656566 -0.055555556
## [46] -0.045454545 -0.035353535 -0.025252525 -0.015151515 -0.005050505
## [51] 0.005050505 0.015151515 0.025252525 0.035353535 0.045454545
## [56] 0.055555556 0.065656566 0.075757576 0.085858586 0.095959596
## [61] 0.106060606 0.116161616 0.126262626 0.136363636 0.146464646
## [66] 0.156565657 0.166666667 0.176767677 0.186868687 0.196969697
## [71] 0.207070707 0.217171717 0.227272727 0.237373737 0.247474747
## [76] 0.257575758 0.267676768 0.277777778 0.287878788 0.297979798
## [81] 0.308080808 0.318181818 0.328282828 0.338383838 0.348484848
## [86] 0.358585859 0.368686869 0.378787879 0.388888889 0.398989899
## [91] 0.409090909 0.419191919 0.429292929 0.439393939 0.449494949
## [96] 0.459595960 0.469696970 0.479797980 0.489898990 0.500000000
##
## $y
## [1] -3842.529 -3841.258 -3840.015 -3838.801 -3837.616 -3836.461 -3835.335
## [8] -3834.239 -3833.172 -3832.136 -3831.130 -3830.154 -3829.209 -3828.294
## [15] -3827.410 -3826.557 -3825.735 -3824.944 -3824.185 -3823.458 -3822.762
## [22] -3822.098 -3821.466 -3820.867 -3820.300 -3819.766 -3819.264 -3818.796
## [29] -3818.361 -3817.959 -3817.590 -3817.256 -3816.955 -3816.688 -3816.456
## [36] -3816.258 -3816.094 -3815.966 -3815.872 -3815.814 -3815.790 -3815.803
## [43] -3815.851 -3815.935 -3816.055 -3816.212 -3816.405 -3816.634 -3816.901
## [50] -3817.205 -3817.545 -3817.924 -3818.340 -3818.793 -3819.285 -3819.815
## [57] -3820.384 -3820.991 -3821.636 -3822.321 -3823.045 -3823.809 -3824.612
## [64] -3825.454 -3826.337 -3827.260 -3828.223 -3829.227 -3830.272 -3831.357
## [71] -3832.484 -3833.652 -3834.861 -3836.113 -3837.406 -3838.741 -3840.119
## [78] -3841.539 -3843.002 -3844.507 -3846.056 -3847.648 -3849.284 -3850.963
## [85] -3852.686 -3854.453 -3856.265 -3858.120 -3860.020 -3861.966 -3863.956
## [92] -3865.991 -3868.071 -3870.197 -3872.369 -3874.586 -3876.850 -3879.160
## [99] -3881.516 -3883.919
Dado que el análisis con Box-Cox sugiere un rango de λ entre -0.5 y 0, esto indica que una transformación con un valor de λ dentro de este rango podría ayudar a mejorar la distribución de los datos de tu modelo. Las 2 transformaciones que podrian ser útiles son la transformación logarítmica y de tipo recíproco cuadrático.
Transformación de tipo recíproco cuadrático.
#Ajuste de tipo recíproco cuadrátic
vivienda4$preciom_cuadratico <- (vivienda4$preciom^(-0.5))
mod_cuadratico <- lm(vivienda4$preciom_cuadratico ~ vivienda4$areaconst)
summary(mod_cuadratico)
##
## Call:
## lm(formula = vivienda4$preciom_cuadratico ~ vivienda4$areaconst)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.031383 -0.006234 0.000418 0.005621 0.033640
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.046e-02 5.005e-04 180.7 <2e-16 ***
## vivienda4$areaconst -2.363e-04 5.276e-06 -44.8 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.007918 on 1704 degrees of freedom
## Multiple R-squared: 0.5408, Adjusted R-squared: 0.5405
## F-statistic: 2007 on 1 and 1704 DF, p-value: < 2.2e-16
# Ajuste logaritmico
vivienda4$preciom_log <- log(vivienda4$preciom)
mod_log <- lm(vivienda4$preciom_log ~ vivienda4$areaconst)
summary(mod_log)
##
## Call:
## lm(formula = vivienda4$preciom_log ~ vivienda4$areaconst)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.80097 -0.16347 -0.02737 0.16610 1.14818
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.7238296 0.0143492 329.21 <2e-16 ***
## vivienda4$areaconst 0.0072020 0.0001513 47.61 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.227 on 1704 degrees of freedom
## Multiple R-squared: 0.5709, Adjusted R-squared: 0.5706
## F-statistic: 2267 on 1 and 1704 DF, p-value: < 2.2e-16
Normalidad <- shapiro.test(mod_cuadratico$residuals)
Normalidad
##
## Shapiro-Wilk normality test
##
## data: mod_cuadratico$residuals
## W = 0.99287, p-value = 2.407e-07
Homocesdasticidad <- lmtest::bptest(mod_cuadratico)
Homocesdasticidad
##
## studentized Breusch-Pagan test
##
## data: mod_cuadratico
## BP = 4.3205, df = 1, p-value = 0.03765
No_autocorrelacion <- lmtest::dwtest(mod_cuadratico)
No_autocorrelacion
##
## Durbin-Watson test
##
## data: mod_cuadratico
## DW = 1.4447, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
Logaritmico
Normalidad <- shapiro.test(mod_log$residuals)
Normalidad
##
## Shapiro-Wilk normality test
##
## data: mod_log$residuals
## W = 0.99287, p-value = 2.395e-07
Homocesdasticidad <- lmtest::bptest(mod_log)
Homocesdasticidad
##
## studentized Breusch-Pagan test
##
## data: mod_log
## BP = 53.271, df = 1, p-value = 2.906e-13
No_autocorrelacion <- lmtest::dwtest(mod_log)
No_autocorrelacion
##
## Durbin-Watson test
##
## data: mod_log
## DW = 1.5006, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
Después de realizar ambas transformaciones se evidencia que aunque el valor W es muy cercano a 1, lo que podría sugerir una distribución casi normal de los residuos, el valor p bajo indica que se rechaza la hipótesis de normalidad.
Adicionalmente, el resultado de la prueba de Breusch-Pagan señala la presencia de heterocedasticidad significativa en los residuos. Esto implica que la varianza de los residuos no es constante a lo largo de las observaciones, lo que puede comprometer la eficacia de los tests estadísticos y la fiabilidad de los coeficientes estimados.
Finalmente, la Prueba de Durbin-Watson indica la presencia de autocorrelación positiva en los residuo en ambas transformaciones.
En este informe se ha desarrollado un modelo estadístico para predecir los precios de apartamentos de estrato 4 en Cali, utilizando datos recopilados por la inmobiliaria A&C. El análisis exploratorio inicial mostró que tanto el precio como el área de los apartamentos tienen una distribución que se aleja de la normalidad, lo que sugiere que modelos lineales simples podrían no ser adecuados sin una transformación previa de los datos.
El modelo de regresión lineal simple construido, que predice el precio en función del área, indicó una relación significativa, pero con problemas inherentes como heterocedasticidad, no normalidad y autocorrelación de los residuos. Estos problemas pueden afectar la validez de los resultados del modelo, como se observó en las pruebas de Shapiro-Wilk, Breusch-Pagan y Durbin-Watson.
Las transformaciones realizadas, incluyendo la logarítmica y la de tipo recíproco cuadrático, intentaron abordar estas cuestiones. Aunque estas transformaciones mejoraron algunos aspectos del ajuste del modelo, no resolvieron completamente los problemas de supuestos básicos, como la homocedasticidad y la autocorrelación.
El modelo de regresión inicial mostró una capacidad moderada para explicar la variabilidad de los precios de los apartamentos en función de su área. Sin embargo, el análisis subraya la importancia de considerar no solo la significancia estadística de los modelos, sino también su capacidad para cumplir con los supuestos estadísticos necesarios para inferencias válidas.
Los resultados indican que un apartamento de 110 m² tendría un precio promedio estimado significativamente superior a 200 millones de COP, sugiriendo que una oferta de 200 millones para un apartamento de este tamaño podría ser atractiva para los compradores, bajo las condiciones actuales del mercado.
Para futuros análisis, se recomienda explorar modelos más robustos que puedan manejar las peculiaridades de los datos, como modelos de regresión no lineal o técnicas de machine learning que puedan proporcionar mayor flexibilidad y precisión. Además, es crucial realizar un monitoreo constante del mercado para actualizar los modelos conforme a las nuevas tendencias y variaciones en los datos de las propiedades.
Finalmente, al tomar decisiones basadas en estos modelos, los directivos deben considerar también factores externos como cambios en la economía local, políticas de vivienda y preferencias de los consumidores, que pueden influir significativamente en el mercado inmobiliario y, por ende, en los precios de las propiedades.