En el dinámico mercado inmobiliario actual, la fijación precisa de precios es un factor crucial que puede determinar el éxito o fracaso en la negociación de propiedades. La Inmobiliaria A&C reconoce la importancia de contar con herramientas analíticas avanzadas para desarrollar un modelo predictivo que les permita estimar con precisión los precios de los inmuebles que gestionan. En este contexto, se han proporcionado datos detallados de ofertas de vivienda obtenidos del portal Fincaraiz, centrándonos específicamente en apartamentos de estrato 4 con una superficie construida inferior a 200 m².
El presente informe detalla el proceso metodológico seguido para la construcción de este modelo predictivo, que abarca desde la adquisición y exploración de los datos hasta la evaluación y ajuste del modelo final. A través de técnicas de análisis de datos, se busca proporcionar a la Inmobiliaria A&C una herramienta sólida que les permita tomar decisiones informadas en cuanto a la fijación de precios de los inmuebles que administran. Este informe presenta un resumen detallado de los pasos seguidos, los resultados obtenidos y las recomendaciones para la implementación y mejora continua del modelo desarrollado.
Realice un análisis exploratorio de las variables precio de vivienda (millones de pesos COP) y área de la vivienda (metros cuadrados) - incluir gráficos e indicadores apropiados interpretados.
Primero se procede a la importación de librerías:
library(paqueteMETODOS)
library(dplyr)
library(ggplot2)
library(mice)
library(tidyverse)
library(ggmice)
library(plotly)
library(scales)
library(DescTools)
library(openxlsx)
library(stringi)
library(stargazer)
Ahora se procede a importar los datos:
data(vivienda4)
El análisis, y si es necesario, la limpieza de datos, es esencial para asegurar resultados coherentes y precisos. Para comenzar, se analizará la cantidad de observaciones y variables en la base de datos actual.
dim(vivienda4)
## [1] 1706 5
La base de datos inicial consta de 1706 observaciones y 5 variables. A continuación, se presenta un resumen descriptivo de estas variables.
summary(vivienda4)
## zona estrato preciom areaconst
## Zona Centro : 8 3: 0 Min. :207.4 Min. : 40.00
## Zona Norte : 288 4:1706 1st Qu.:230.7 1st Qu.: 60.00
## Zona Oeste : 60 5: 0 Median :238.8 Median : 75.00
## Zona Oriente: 6 6: 0 Mean :243.7 Mean : 87.63
## Zona Sur :1344 3rd Qu.:251.5 3rd Qu.: 98.00
## Max. :309.7 Max. :200.00
## tipo
## Apartamento:1363
## Casa : 343
##
##
##
##
summarytools::descr(vivienda4)
## Non-numerical variable(s) ignored: zona, estrato, tipo
## Descriptive Statistics
## vivienda4
## N: 1706
##
## areaconst preciom
## ----------------- ----------- ---------
## Mean 87.63 243.70
## Std.Dev 36.35 19.56
## Min 40.00 207.41
## Q1 60.00 230.73
## Median 75.00 238.77
## Q3 98.00 251.51
## Max 200.00 309.70
## MAD 22.24 14.19
## IQR 38.00 20.77
## CV 0.41 0.08
## Skewness 1.53 1.26
## SE.Skewness 0.06 0.06
## Kurtosis 1.68 1.25
## N.Valid 1706.00 1706.00
## Pct.Valid 100.00 100.00
Ahora se procede a filtrar los datos basándose en las consideraciones de tomar solo el tipo de vivienda apartamentos, estrato 4 y área construida menor a 200 m2.
data_estrato4_200m <- filter(vivienda4, tipo == "Apartamento", areaconst < 200, estrato == 4)
data_estrato4_200m
## # A tibble: 1,360 × 5
## zona estrato preciom areaconst tipo
## <fct> <fct> <dbl> <dbl> <fct>
## 1 Zona Norte 4 232. 52 Apartamento
## 2 Zona Norte 4 255. 108 Apartamento
## 3 Zona Sur 4 258. 96 Apartamento
## 4 Zona Norte 4 250. 82 Apartamento
## 5 Zona Norte 4 247. 75 Apartamento
## 6 Zona Norte 4 222. 60 Apartamento
## 7 Zona Norte 4 227. 84 Apartamento
## 8 Zona Norte 4 255. 117 Apartamento
## 9 Zona Norte 4 232. 60 Apartamento
## 10 Zona Norte 4 237. 75 Apartamento
## # ℹ 1,350 more rows
Se observa ahora que la base de datos consta de 1360 observaciones y 5 variables después del filtro. Al obtener nuevamente el resumen descriptivo de la base filtrada, se puede observar:
summarytools::descr(data_estrato4_200m)
## Non-numerical variable(s) ignored: zona, estrato, tipo
## Descriptive Statistics
## data_estrato4_200m
## N: 1360
##
## areaconst preciom
## ----------------- ----------- ---------
## Mean 75.20 237.54
## Std.Dev 21.82 12.95
## Min 40.00 207.41
## Q1 60.00 228.78
## Median 70.00 236.13
## Q3 83.00 243.57
## Max 198.00 300.45
## MAD 14.83 10.95
## IQR 23.00 14.78
## CV 0.29 0.05
## Skewness 1.94 1.14
## SE.Skewness 0.07 0.07
## Kurtosis 5.45 2.53
## N.Valid 1360.00 1360.00
## Pct.Valid 100.00 100.00
Este análisis indica que:
Variable areaconst
Media: El área construida promedio es de 75.20 metros cuadrados.
Desviación estándar: La desviación estándar es de 21.82 metros cuadrados, lo que indica que hay una variabilidad moderada en los tamaños de las áreas construidas.
Rango: Los valores van desde 40.00 hasta 198.00 metros cuadrados, mostrando un rango amplio en los tamaños de las áreas.
Mediana: La mediana es de 70.00 metros cuadrados, lo que indica que la mitad de las áreas construidas está por encima y por debajo de este valor.
IQR (rango intercuartil): La diferencia entre el tercer cuartil (83.00 metros cuadrados) y el primer cuartil (60.00 metros cuadrados) es de 23.00 metros cuadrados, indicando que el rango medio del 50% de los datos es moderado.
Coeficiente de variación: El CV de 0.29 muestra cierta variabilidad en los datos en relación con la media.
Sesgo: 1.94 sugiere una asimetría positiva (hacia la derecha), indicando que hay más valores altos que bajos en los datos.
Kurtosis: 5.45 indica que la distribución es leptocúrtica, lo que significa que los datos tienen una forma más alta y con colas más largas en comparación con una distribución normal.
Variable preciom
Media: El precio promedio es de 237.54 millones de pesos.
Desviación estándar: La desviación estándar es de 12.95 millones de pesos, lo que indica que hay una variabilidad baja en los precios.
Rango: Los valores van desde 207.41 hasta 300.45 millones de pesos, mostrando un rango moderado en los precios.
Mediana: La mediana es de 236.13 millones de pesos, lo que indica que la mitad de los precios está por encima y por debajo de este valor, es decir el 50% de las viviendas tienen un precio menor o igual a 236.13 millones.
IQR (rango intercuartil): La diferencia entre el tercer cuartil (243.57 millones de pesos) y el primer cuartil (228.78 millones de pesos) es de 14.78 millones de pesos, lo que indica un rango intermedio del 50% de los datos es estrecho.
Coeficiente de variación: El CV de 0.05 indica una baja variabilidad en los datos en relación con la media.
Sesgo: 1.14 sugiere una asimetría positiva (hacia la derecha), lo que indica que hay más valores altos que bajos en los datos.
Kurtosis: 2.53 indica una distribución ligeramente alta con colas más largas en comparación con una distribución normal.
ggplotly(ggplot(data_estrato4_200m, mapping = aes(x = "", y = preciom))+
geom_boxplot()+
coord_flip()+
labs(title = "Distribucion de precio en millones",
x = "Preciom",
y = "Precio en millones")+
theme_minimal())
Se puede observar que la distribución de la caja es prácticamente simétrica, donde la mediana se sitúa en el centro. Además, la distancia entre los límites o bigotes respecto a la media es simétrica, lo que reafirma una baja variabilidad en los datos.
Ahora se realiza un análisis de la variable área construida.
ggplotly(ggplot(data_estrato4_200m, mapping = aes(x = "", y = areaconst))+
geom_boxplot()+
coord_flip()+
labs(title = "Distribucion de area construida en m2",
x = "Area",
y = "Area construida en m2")+
theme_minimal())
Se puede observar que existe variabilidad en los datos, puesto que la mediana de la caja no es simétrica respecto a Q1 y Q3. Asimismo, en relación a los límites inferior y superior, se puede apreciar que se aproxima más al límite inferior y se aleja del límite superior, lo que reafirma la variabilidad de los datos, como se mencionaba en el resumen descriptivo.
Realice un análisis exploratorio bivariado de datos, enfocado en la relación entre la variable respuesta (precio) en función de la variable predictora (área construida) - incluir gráficos e indicadores apropiados interpretados.**
ggplotly(ggplot(data = data_estrato4_200m)+
geom_point(mapping = aes(x=areaconst, y = preciom), color = "blue"))
cor(data_estrato4_200m$areaconst,data_estrato4_200m$preciom)
## [1] 0.8370114
Al generar el coeficiente de correlación y según la tabla de clasificación de la relación lineal entre las variables, se observa que la variable área construida y el precio en millones de la vivienda tienen una relación lineal positiva fuerte, es decir, que a mayor área construida de la vivienda, mayor será su precio.
Estime el modelo de regresión lineal simple entre precio=f(area)+ε.Interprete los coeficientes del modelo β0, β1 en caso de ser correcto.**
mod = lm(preciom ~areaconst, data = data_estrato4_200m)
summary(mod)
##
## Call:
## lm(formula = preciom ~ areaconst, data = data_estrato4_200m)
##
## Residuals:
## Min 1Q Median 3Q Max
## -26.4010 -5.0783 -0.0175 4.6173 24.3353
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.002e+02 6.899e-01 290.15 <2e-16 ***
## areaconst 4.967e-01 8.811e-03 56.37 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.087 on 1358 degrees of freedom
## Multiple R-squared: 0.7006, Adjusted R-squared: 0.7004
## F-statistic: 3178 on 1 and 1358 DF, p-value: < 2.2e-16
Por lo tanto, el modelo de regresión lineal simple sería: precio = 200.2 + 0.49 * áreaconst. Esto nos indica que para el coeficiente B0, si el área construida fuera igual a 0, el precio en millones de la vivienda sería de 200.2 millones. Ahora, para el coeficiente B1, lo que nos quiere decir es que por cada unidad de área construida, el precio en millones de la vivienda incrementaría en 0.49 millones.Además se puede observar que las Betas son significativas, menores al nivel de significancia(5%), es decir que son relevantes para el modelo y diferente de 0.(p≠0)
Construir un intervalo de confianza (95%) para el coeficiente β1,interpretar y concluir si el coeficiente es igual a cero o no. Compare este resultado con una prueba de hipótesis t.**
confint(mod)
## 2.5 % 97.5 %
## (Intercept) 198.8328481 201.5398110
## areaconst 0.4794099 0.5139806
Esto quiere decir que para la pendiente B1 se puede interpretar que por cada metro cuadrado de área construida, el precio estimado de la vivienda aumenta entre 0.47 y 0.51 millones, con una confianza del 95%.
Calcule e interprete el indicador de bondad o determinación R2**
r_squared <- summary(mod)$r.squared
r_squared
## [1] 0.700588
Esto indica que el modelo explica el 70.05% de la variación de Y(precio en millones).
¿Cuál sería el precio promedio estimado para un apartamento de 110 metros cuadrados? Considera entonces con este resultado que un apartamento en la misma zona con 110 metros cuadrados en un precio de 200 millones sería una atractiva esta oferta? ¿Qué consideraciones adicionales se deben tener?.**
predict(mod, newdata = data.frame(areaconst = 110))
## 1
## 254.8228
Esto indica que el precio promedio estimado para un apartamento de 110 metros cuadrados es de 254.82 millones de pesos. Al analizar estos resultados, se observa que un apartamento en la misma zona por un precio de 200 millones sería una oferta atractiva, ya que es un valor menor al estimado.
Realice la validación de los supuestos del modelo por medio de gráficos apropiados, interpretarlos y sugerir posibles soluciones si se violan algunos de ellos. Utilice las pruebas de hipótesis para la validación de supuestos y compare los resultados con lo observado en los gráficos asociados.**
plot(mod)
Se establece el nivel de significancia que se acepta como evidencia suficiente para aceptar o rechazar la hipótesis nula, en este caso un valor de alfa de 0.05(5%)
Normalidad
shapiro.test(mod$residuals)
##
## Shapiro-Wilk normality test
##
## data: mod$residuals
## W = 0.99883, p-value = 0.5243
Dado que el valor p (0.5243) es mayor que el nivel de significancia de 0.05, no hay evidencia suficiente para rechazar la hipótesis nula de que los datos siguen una distribución normal, por lo tanto se acepta la hipótesis nula de normalidad.
Homoscedasticidad
lmtest::bptest(mod)
##
## studentized Breusch-Pagan test
##
## data: mod
## BP = 0.47718, df = 1, p-value = 0.4897
En este caso con el valor p(0.4897) es mayor que el nivel de significancia de 0.05, por lo tanto no hay evidencia suficiente para rechazar la hipótesis nula de que los residuos tienen una varianza constante(homoscedasticidad) y se acepta la hipótesis nula de homoscedasticidad.
No autocorrelación
lmtest::dwtest(mod)
##
## Durbin-Watson test
##
## data: mod
## DW = 2.0219, p-value = 0.6536
## alternative hypothesis: true autocorrelation is greater than 0
En este caso, el valor de DW(Estadístico de prueba de Durbin-Watson) es 2.0219, que está muy cerca de 2, lo que sugiere que no hay autocorrelación en los residuos del modelo. Además, el valor p es 0.6536, que es considerablemente mayor que el nivel de significancia de 0.05. Esto significa que no hay evidencia suficiente para rechazar la hipótesis nula de no autocorrelación y se acepta la hipótesis nula de no autocorrelación.
Se puede concluir que este modelo satisface los supuestos mencionados anteriormente, por lo tanto, sería la mejor opción hasta el momento. A continuación, se intenta realizar alguna transformación al modelo original para observar si haciendo estas transformaciones se mejoran los supuestos del modelo.
De ser necesario realice una transformación apropiada para mejorar el ajuste y supuestos del modelo.**
mod1 = lm(preciom ~ areaconst, data = data_estrato4_200m) # Lin - Lin
mod2 = lm(preciom ~ log(areaconst), data = data_estrato4_200m) # Lin - Log
mod3 = lm(log(preciom) ~ areaconst, data = data_estrato4_200m) # Log - Lin
mod4 = lm(log(preciom) ~ log(areaconst), data = data_estrato4_200m) # Log - Log
stargazer(mod1, mod2, mod3, mod4, type="text", df=FALSE)
##
## =======================================================================
## Dependent variable:
## ---------------------------------------------------
## preciom log(preciom)
## (1) (2) (3) (4)
## -----------------------------------------------------------------------
## areaconst 0.497*** 0.002***
## (0.009) (0.00004)
##
## log(areaconst) 42.112*** 0.172***
## (0.801) (0.003)
##
## Constant 200.186*** 57.054*** 5.318*** 4.733***
## (0.690) (3.437) (0.003) (0.014)
##
## -----------------------------------------------------------------------
## Observations 1,360 1,360 1,360 1,360
## R2 0.701 0.671 0.682 0.663
## Adjusted R2 0.700 0.671 0.681 0.662
## Residual Std. Error 7.087 7.432 0.030 0.031
## F Statistic 3,177.556*** 2,766.449*** 2,906.067*** 2,667.104***
## =======================================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
Al analizar los valores, se podría concluir que el primer modelo es el mejor debido a su R², pero eso no es suficiente. También es necesario determinar cuál de los escenarios valida mejor los supuestos del modelo. Para ello, se evaluará esta validación tanto gráficamente como a través de pruebas de hipótesis para los modelos (2), (3) y (4).
De ser necesario compare el ajuste y supuestos del modelo inicial y el transformado. Estime varios modelos y compare los resultados obtenidos. En el mejor de los modelos, ¿se cumplen los supuestos sobre los errores?
plot(mod2)
El análisis gráfico muestra un patrón en los residuos, lo que indica que los errores no son independientes, como se busca.
Ahora al analizar con pruebas de hipótesis:
Normalidad
shapiro.test(mod2$residuals)
##
## Shapiro-Wilk normality test
##
## data: mod2$residuals
## W = 0.99736, p-value = 0.02368
El valor p es 0.02368, menor que el nivel de significancia utilizado (0.05), lo que indica que hay suficiente evidencia para rechazar la hipótesis nula de que los datos siguen una distribución normal, por ende no se acepta la hipótesis nula de normalidad.
Homoscedasticidad
lmtest::bptest(mod2)
##
## studentized Breusch-Pagan test
##
## data: mod2
## BP = 7.6515, df = 1, p-value = 0.005672
En este caso, el valor p es 0.005672, que es menor que el nivel de significancia utilizado(0.05). Esto significa que hay suficiente evidencia para rechazar la hipótesis nula de que los residuos tienen una varianza constante (homoscedasticidad), por lo tanto, se puede concluir que los residuos del modelo (mod2) no son homoscedásticos, es decir, la varianza de los residuos no es constante a lo largo de los niveles de las variables independientes.
No autocorrelación
lmtest::dwtest(mod2)
##
## Durbin-Watson test
##
## data: mod2
## DW = 1.9505, p-value = 0.1778
## alternative hypothesis: true autocorrelation is greater than 0
El valor de Durbin-Watson es 1.9505, lo que está muy cerca de 2 y sugiere que los residuos del modelo no presentan autocorrelación significativa. Además, el valor p es 0.1778, considerablemente mayor que el nivel de significancia comúnmente utilizado de 0.05, lo que indica que no hay evidencia suficiente para rechazar la hipótesis nula de no autocorrelación. Por lo tanto, se puede aceptar la hipótesis nula de que los residuos no presentan autocorrelación.
plot(mod3)
Ahora se analiza con pruebas de hipótesis:
Normalidad
shapiro.test(mod3$residuals)
##
## Shapiro-Wilk normality test
##
## data: mod3$residuals
## W = 0.99904, p-value = 0.7137
El valor p es 0.7137, considerablemente mayor que el nivel de significancia comúnmente utilizado de 0.05. Esto indica que no hay evidencia suficiente para rechazar la hipótesis nula de que los datos siguen una distribución normal.
Homoscedasticidad
lmtest::bptest(mod3)
##
## studentized Breusch-Pagan test
##
## data: mod3
## BP = 5.8661, df = 1, p-value = 0.01544
El valor p obtenido del test de Breusch-Pagan para el modelo mod3 es de 0.01544, lo cual es menor que el nivel de significancia utilizado de 0.05. Por lo tanto, hay suficiente evidencia para rechazar la hipótesis nula de que los residuos tienen una varianza constante (homoscedasticidad). Este resultado sugiere que los residuos del modelo podrían no cumplir con el supuesto de homoscedasticidad, lo que podría afectar la validez de los resultados obtenidos.
No autocorrelación
lmtest::dwtest(mod3)
##
## Durbin-Watson test
##
## data: mod3
## DW = 2.0218, p-value = 0.6523
## alternative hypothesis: true autocorrelation is greater than 0
El valor de Durbin-Watson (DW) obtenido para el modelo es de 2.0218, cercano al ideal de 2, lo que indica una falta de autocorrelación significativa en los residuos. Además, el valor p es 0.6523, mayor que el nivel de significancia de 0.05, lo que sugiere que no hay evidencia suficiente para rechazar la hipótesis nula de no autocorrelación.
plot(mod4)
Ahora se analiza con pruebas de hipótesis:
Normalidad
shapiro.test(mod4$residuals)
##
## Shapiro-Wilk normality test
##
## data: mod4$residuals
## W = 0.99855, p-value = 0.3145
El valor p es 0.3145, mayor que el nivel de significancia utilizado de 0.05. Esto indica que no hay evidencia suficiente para rechazar la hipótesis nula de que los datos siguen una distribución normal.
Homoscedasticidad
lmtest::bptest(mod4)
##
## studentized Breusch-Pagan test
##
## data: mod4
## BP = 0.83834, df = 1, p-value = 0.3599
El test de Breusch-Pagan para el modelo mod4 arrojó un valor de estadístico BP de 0.83834 con 1 grado de libertad y un valor p de 0.3599. Dado que el valor p es mayor que el nivel de significancia utilizado de 0.05, no hay suficiente evidencia para rechazar la hipótesis nula de homoscedasticidad.
No autocorrelación
lmtest::dwtest(mod4)
##
## Durbin-Watson test
##
## data: mod4
## DW = 1.9678, p-value = 0.2727
## alternative hypothesis: true autocorrelation is greater than 0
El test de Durbin-Watson para el modelo mod4 arrojó un valor de estadístico DW de 1.9678, y un valor p asociado de 0.2727. Dado que el valor p es mayor que el nivel de significancia utilizado de 0.05, no hay suficiente evidencia para rechazar la hipótesis nula de no autocorrelación.
mod1 = lm(preciom ~ areaconst, data = data_estrato4_200m)
summary(mod1)
##
## Call:
## lm(formula = preciom ~ areaconst, data = data_estrato4_200m)
##
## Residuals:
## Min 1Q Median 3Q Max
## -26.4010 -5.0783 -0.0175 4.6173 24.3353
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.002e+02 6.899e-01 290.15 <2e-16 ***
## areaconst 4.967e-01 8.811e-03 56.37 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.087 on 1358 degrees of freedom
## Multiple R-squared: 0.7006, Adjusted R-squared: 0.7004
## F-statistic: 3178 on 1 and 1358 DF, p-value: < 2.2e-16
par(mfrow = c(1,2))
boxcox(lm(preciom ~ areaconst, data = data_estrato4_200m), lambda = -3:3)
bc<-boxcox(lm(preciom ~ areaconst, data = data_estrato4_200m), lambda = -1:1)
(lambda <- bc$x[which.max(bc$y)])
## [1] 1
Se observa que el lambda es igual a 1 por lo tanto esto sugiere que no es necesario hacer ninguna transformación para la generación de un mejor modelo que valide todos los supuestos.
1. El análisis exploratorio de los datos reveló que la relación entre el precio de la vivienda y el área construida es positiva y fuerte, lo que sugiere que a medida que aumenta el área construida, también lo hace el precio de la vivienda.
2. La construcción de un modelo de regresión lineal simple confirmó esta relación, mostrando que por cada metro cuadrado adicional de área construida, el precio de la vivienda aumenta en aproximadamente 0.49 millones de pesos.
3.La validación de los supuestos del modelo mostró que el modelo inicial satisface todos los supuestos, incluida la normalidad, homogeneidad de la varianza y falta de autocorrelación en los residuos.
4.Sin embargo, al explorar modelos alternativos con transformaciones logarítmicas en las variables, se encontraron algunos problemas, como la falta de homogeneidad de la varianza en el modelo log-lineal.
5.A pesar de estos hallazgos, no se encontró evidencia suficiente para justificar una transformación de las variables, ya que el modelo inicial seguía siendo el más adecuado en términos de ajuste y validez de los supuestos.
6.Por lo tanto, se recomienda utilizar el modelo de regresión lineal simple inicial para predecir los precios de las viviendas en función del área construida, ya que ofrece un buen ajuste y cumple con los supuestos del modelo.
7.Es importante tener en cuenta que, aunque este modelo proporciona una estimación razonable de los precios de las viviendas, también puede haber otros factores importantes a considerar en la fijación de precios, como la ubicación, las características específicas de la propiedad y las condiciones del mercado inmobiliario.