Este informe es presentado a la empresa A&C de bienes raíces y tiene el objetivo de apoyar el análisis del mercado de viviendas de tipo apartamento, información extraída del portal Finca Raíz. Antes de iniciar, se importan los datos, se explora su contenido y se evalúa si es necesario hacer limpieza de los datos.
#install.packages("nortest")
library(lmtest)
library(nortest)
library(janitor)
library(tidyverse)
library(dplyr)
library(ggplot2)
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
#devtools::install_github("dgonxalex80/paqueteMETODOS")
library(paqueteMETODOS)
data(vivienda4)
#Exploración general de datos
glimpse(vivienda4)
## Rows: 1,706
## Columns: 5
## $ zona <fct> Zona Norte, Zona Norte, Zona Norte, Zona Sur, Zona Norte, Zo…
## $ estrato <fct> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, …
## $ preciom <dbl> 232.2643, 272.3068, 254.8213, 257.7722, 250.1956, 261.1614, …
## $ areaconst <dbl> 52, 160, 108, 96, 82, 117, 75, 60, 84, 117, 118, 60, 75, 76,…
## $ tipo <fct> Apartamento, Casa, Apartamento, Apartamento, Apartamento, Ca…
head(vivienda4)
## # A tibble: 6 × 5
## zona estrato preciom areaconst tipo
## <fct> <fct> <dbl> <dbl> <fct>
## 1 Zona Norte 4 232. 52 Apartamento
## 2 Zona Norte 4 272. 160 Casa
## 3 Zona Norte 4 255. 108 Apartamento
## 4 Zona Sur 4 258. 96 Apartamento
## 5 Zona Norte 4 250. 82 Apartamento
## 6 Zona Norte 4 261. 117 Casa
tail(vivienda4)
## # A tibble: 6 × 5
## zona estrato preciom areaconst tipo
## <fct> <fct> <dbl> <dbl> <fct>
## 1 Zona Sur 4 222. 54 Apartamento
## 2 Zona Sur 4 246. 64 Apartamento
## 3 Zona Sur 4 228. 68 Apartamento
## 4 Zona Sur 4 212. 47 Apartamento
## 5 Zona Sur 4 227. 60 Apartamento
## 6 Zona Sur 4 245. 91 Apartamento
#Ajustar el tipo de variables zona y tipo a character
vivienda4$zona <- as.character(vivienda4$zona)
vivienda4$tipo <- as.character(vivienda4$tipo)
#Verificación de datos tipo texto y datos duplicados
unique(vivienda4$zona)
## [1] "Zona Norte" "Zona Sur" "Zona Oeste" "Zona Oriente" "Zona Centro"
unique(vivienda4$tipo)
## [1] "Apartamento" "Casa"
unique(vivienda4$estrato)
## [1] 4
## Levels: 3 4 5 6
get_dupes(vivienda4, preciom)
## # A tibble: 0 × 6
## # ℹ 6 variables: preciom <dbl>, dupe_count <int>, zona <chr>, estrato <fct>,
## # areaconst <dbl>, tipo <chr>
La base de datos está organizada, se verificaron los datos duplicados basandose en el valor de las viviendas, no tiene datos duplicados. Adicionalmente, no hay datos faltantes y no hay observaciones con errores de digitación. Debido a lo anterior, se considera posible iniciar la manipulación de la base, por lo que se filtra la base de datos para trabajar sólo con los apartamentos, que son el conjunto de interés para el análisis.
#Filtrado de base de datos
apartamentos <- vivienda4 %>%
filter(tipo == 'Apartamento')
El presente informe pretende encontrar un modelo que permita a la empresa A&C entender mejor el comportamiento del mercado inmobiliario y la relevancia que tienen los metros cuadrados al momento de evaluar el valor de una vivienda de tipo apartamento. En otras palabras, el modelo se construye considerando el valor de las viviendas como la variable respuesta y el área construída como la variable predictora. Con esto en mente, el informe se organiza de la siguiente forma: en el primer apartado se introduce el informe. En segundo lugar, se realiza un análisis exploratorio de las variables de interés, por separado y luego en conjunto. En el tercer apartado, se estiman y evalúan modelos de regresión lineal simple y se analizan los resultados de los coeficientes e indicadores. Después, se trabaja sobre la predicción de un apartamento de 110 metros cuadrados, evaluando la utilidad del modelo. En el quinto apartado se evalúan los supuestos de un modelo lineal frente al modelo producido. Para el sexto título se trabajan algunas transformaciones del modelo, evaluando si los resultados arrojados pueden mejorar y finalmente se presentan conclusiones.
En la primera sección se evalúan las variables de precio y metros cuadrados de la base de datos. Para empezar, se observan sus cuartiles y las medidas de tendencia central:
summary(apartamentos[c('preciom', 'areaconst')])
## preciom areaconst
## Min. :207.4 Min. : 40.00
## 1st Qu.:228.8 1st Qu.: 60.00
## Median :236.1 Median : 70.00
## Mean :237.7 Mean : 75.48
## 3rd Qu.:243.6 3rd Qu.: 84.00
## Max. :305.2 Max. :200.00
Se puede observar que el rango de valores de las propiedades van de 107.4 millones hasta 305.2 millones, con un valor intermedio de 236.1 millones y un promedio de 237.7 millones, la cercanía de estos últimos valores podría indicar una distribución más simétrica. En cuanto al área construída, se observa un rango entre los 40 a 200 métros cuadrados, con una mediana de 70 metros y un promedio de 75, aunque un poco más apartados, también podría presentar una forma simétrica. Para una mejor representación de los datos se evalúan todos los indicadores de distribución central:
apartamentos %>%
summarise(No.viviendas = length(preciom),
Promedio = mean(preciom),
Moda = Mode(preciom),
Desviación_Estándar = round(sd(preciom),2),
Rango = max(preciom) - min(preciom))
## # A tibble: 1 × 5
## No.viviendas Promedio Moda Desviación_Estándar Rango
## <int> <dbl> <dbl> <dbl> <dbl>
## 1 1363 238. 232. 13.3 97.8
apartamentos %>%
summarise(No.viviendas = length(areaconst),
Promedio = mean(areaconst),
Moda = Mode(areaconst),
Desviación_Estándar = round(sd(areaconst),2),
Rango = max(areaconst) - min(areaconst))
## # A tibble: 1 × 5
## No.viviendas Promedio Moda Desviación_Estándar Rango
## <int> <dbl> <dbl> <dbl> <dbl>
## 1 1363 75.5 60 22.6 160
En las tablas presentadas arriba podemos saber que la base de datos de viviendas es conformada por 1363 observaciones, adicional al valor del promedio, encontramos que la moda del valor de los inmuebles es de 232.26 millones COP y que los valores tienen una desviación estándar de 13.29 millones, lo que permite pensar que el precio de los apartamentos tienen baja disperción. En cuanto a los metros cuadrados de las viviendas, encontramos que el tamaño de vivienda que más se repite son las viviendas de 60 metros cuadrados, con una desviación estándar de 22.56 metros y un rango de 160 metros cuadrados. También nos permite pensar que los valores no tienen una alta dispersión. Para una mejor perspectiva de los datos, se realizan gráficos de cajas y alambres que permitan una mejor observación de la distribución de los datos:
par(mfrow = c(1, 2), pty = "s")
par(mar = c(2, 2, 2, 2))
boxplot(apartamentos$preciom, main = "Distribución del Precio de Vivienda")
boxplot(apartamentos$areaconst, main = "Distribución del Área de la Vivienda")
Gracias a los gráficos presentados arriba puede observarse que para ambos casos existe un número considerable de datos atípicos, aunque para el caso de los métros cuadrados se encuentran a una distancia mayor del promedio que para el caso del costo del inmueble. Para cerrar esta sección se presentan histogramas de ambas variables, con el fin de analizar la distribución de los datos:
par(mfrow = c(1, 2), pty = "s")
par(mar = c(2, 2, 2, 2))
hist(apartamentos$preciom, main = "Histograma del Precio de Vivienda", xlab = "Precio en millones de pesos", col = "blue")
hist(apartamentos$areaconst, main = "Histograma del Área de la Vivienda", xlab = "Área en metros cuadrados", col = "lightgreen")
De los gráficos presentados arriba se puede observar que la variable del precio de los inmuebles tiene una distribución más simétrica, aunque con un leve sesgo a la derecha, como se había observado en las tablas es claro que el promedio se encuentra en 237 millones COP. Para la variable del área se encuentra una distribución similar, en cuanto también hay un sesgo leve a la derecha, sin embargo los datos no son tan simétricos. Teniendo en cuenta el análisis realizado hasta aquí puede intuírse que hay una correlación entre las variables, considerando la distribución de ambos conjuntos de datos. A continuación, se evalúan nuevamente las variables, esta vez considerando la manera en que interactúan.
En primera instancia, para observar la posible correlación de las variables precio y area construída se presenta un gráfico de puntos, donde se evalúa el comportamiento de una variable respecto a la otra:
apartamentos %>%
ggplot(aes(preciom, areaconst)) +
geom_point() +
theme_bw()+
labs(x = "Valor de las propiedades en millones",
y = "Area construída en metros cuadrados",
title = "Relación area construída y valor de las viviendas")
Al observar el gráfico resultante es claro que puede haber una correlación positiva entre las variables, es decir, a medida que se aumenta el tamaño del apartamento también aumenta el valor del mismo. Esto se ve reflejado en el comportamiento de los puntos, que representan cada una de las viviendas, al distribuirse de manera ascendente en el gráfico. Adicional al gráfico, se calcula el coeficiente de correlación utilizando el Pearson, que nos permitirá conocer puntualmente el nivel de relación que tienen las variables:
cor.test(apartamentos$preciom,apartamentos$areaconst)
##
## Pearson's product-moment correlation
##
## data: apartamentos$preciom and apartamentos$areaconst
## t = 58.616, df = 1361, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.8305531 0.8607445
## sample estimates:
## cor
## 0.8463271
El resultado del coeficiente de correlación es 0.84, lo que comprueba que las variables tienen una correlación positiva fuerte, dado que el resultado es cercano a 1 y es positivo.
A continuación, se presenta la estimación de un modelo de regresión lineal simple, descrito por la formula \(precio=f(area)+ε\).
#####Modelo lineal simple###
modelo1 = lm(formula = preciom ~ areaconst, data = apartamentos)
summary(modelo1)
##
## Call:
## lm(formula = preciom ~ areaconst, data = apartamentos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -26.5139 -5.0886 -0.0031 4.6406 24.3309
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.001e+02 6.698e-01 298.67 <2e-16 ***
## areaconst 4.984e-01 8.503e-03 58.62 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.081 on 1361 degrees of freedom
## Multiple R-squared: 0.7163, Adjusted R-squared: 0.7161
## F-statistic: 3436 on 1 and 1361 DF, p-value: < 2.2e-16
plot(apartamentos$areaconst, apartamentos$preciom,
main = "Modelo lineal: Precio vs. Área Construida",
xlab = "Área Construida en metros cuadrados",
ylab = "Precio en millones de pesos",
col = "black",
cex = 0.5,
pch = 19)
abline(modelo1, col = "red")
De estos resultados se puede apreciar que el primer coeficiente \(\beta0\), que describe el y intercepto, corresponde a 200. Es decir, sin considerar el tamaño del apartamento el precio de un inmueble promedio puede estar en los 200 millones. Por otro lado, la pendiente de la línea está dada por \(\beta1\) que en este caso corresponde a 0.498, lo que significa que por cada metro cuadrado que aumenta en tamaño un inmueble, su valor aumentará casi 500 mil pesos. Adicionalmente el P value del modelo en general es de 2.2e-16, lo que nos permite determinar que el ajuste del modelo es bastante bueno.
Se genera un intervalo de confianza del 95% para el con el objetivo de observar la posibilidad de oscilacion de los valores de la pendiente:
confint(modelo1, parm = "areaconst", level = 0.95)
## 2.5 % 97.5 %
## areaconst 0.4817357 0.515097
En este caso, el coeficiente podría presentar valores entre 0.48 y 0.515 lo que nos lleva a rechazar la hipótesis nula de \(H0=\beta1=0\).
Finalmente, respecto al valor del R-cuadrado, encontramos que es igual a 0.71, lo que significa que el tamaño del apartamento puede explicar en un 71% el valor de la propiedad. Aunque es un valor significativo, ciertamente implica que para entender mejor el comportamiento de los inmuebles es importante considerar otras variables al análisis.
Ahora, con el objetivo de explorar un poco más el modelo, se experimenta validando la predicción de un apartamento de 110 metros cuadrados:
Prediccion110 <-predict(modelo1, data.frame(areaconst=110),interval="prediction", level=0.95)
Prediccion110
## fit lwr upr
## 1 254.8893 240.9814 268.7971
Según los resultados, un apartamento de 110 metros cuadrados tendría un precio promedio estimado de 254 millones de pesos. Frente a la pregunta ¿un apartamento en la misma zona con 110 metros cuadrados en un precio de 200 millones sería una oferta atractiva? y teniendo en cuenta el modelo presentado hasta ahora, podría decirse que este valor es muy favorable para la compra de un inmueble, al considerar sólamente su tamaño, pues está 54 millones por debajo de lo estimado en el modelo. Sin embargo, como ya se ha comentado, esete modelo sólo considera la veriable del tamaño del inmueble y pueden haber otros factores importantes a la hora de considerar su valor, por ejemplo la zona y el estado del inmueble.
A continuación, se validan los supuestos de un modelo de regresión lineal simple, empleando gráficos y resultados de test correspondientes:
par(mfrow=c(2,2))
plot(modelo1)
shapiro.test(modelo1$residuals)
##
## Shapiro-Wilk normality test
##
## data: modelo1$residuals
## W = 0.99885, p-value = 0.5419
El primer supuesto tiene que ver con la distribución de los residuales de los errores en el modelo, que debe obedecer una distribución normal. En este caso, el Shapiro test arrojó un p-value de 0.54 lo que supera el umbral de 0.05 dando a entender que la distribución puede acercarse a una de tipo normal. Esto lo corroboramos con el gráfico “QQ Residuals” presentado más arriba, donde los valores residuales se acomodan en gran medida a la línea que representa la normalidad. En este sentido, se corrobora la hipótesis nula, teniendo en cuenta que: Hipótesis Nula (H0): La muestra proviene de una población con distribución normal. Hipótesis Alternativa (H1): La muestra no proviene de una población con distribución normal.
Por lo tanto, teniendo en cuenta lo anterior, podemos decir que el supuesto de la distribución normal de los errores se cumple para este modelo.
La homocedasticidad corresponde a la suposición de que los errores del modelo de regresión tienen varianza constante con respecto a la variable independiente o predictor, en este caso, los metros cuadrados del inmueble. Aplicamos entonces el test de Breusch Pagan para verificar este supuesto a través de las siguientes hipótesis: Hipótesis Nula (H0): Los errores del modelo varían de manera constante. (homoscedasticidad). Hipótesis Alternativa (H1): Los errores del modelo no tienen varianza constante (heteroscedasticidad).
bptest(modelo1)
##
## studentized Breusch-Pagan test
##
## data: modelo1
## BP = 0.83288, df = 1, p-value = 0.3614
Al considerar el test presentado, que supera el nivel de significancia de 0.05 al tener un p-value de 0.36 debemos aceptar la hipótesis nula, considerando que hay evidencia suficiente de que los errores cumplen con el supuesto de hommocedasticidad. Adicionalmente, al observar las gráficas de distribución de los errores (Tanto lineal como en raíz cuadrada) puede observarse una varianza a lo largo de la gráfica, a pesar de la acumulación a la izquierda, que se explica con la distribución de los datos. Entonces el supuesto de homocedasticidad se cumpliría para este modelo.
Al observar los gráficos de dispersión de los errores se observa que no hay un patron que permita creer que la relación entre las variables sea exponencial, por el contrario, la varianza de la distribución parece ser constante y permite corroborar que la relación es lineal. Igualmente, como se exploró más arriba, el coeficiente de correlación demuestra una relación lineal bastante alta, al arrojar un valor de 0.84.
En el caso del modelo analizado, como no se tiene en cuenta la variación de los valores de los apartamentos con el transcurso del tiempo, entonces, este supuesto no se evalúa.
Al finalizar esta evaluación puede concluirse que el modelo resultante es bastante confiable y permite predecir los valores de los inmuebles con buena precisión. Sin embargo, en la sección seguiente se realizan dos transformaciones con el objetivo de comparar los resultados y evaluar si es posible mejorar el modelo.
Se aplica la primera transformación de logaritmo sólo a los valores de X.
modelo2=lm(preciom ~ log(areaconst), data=apartamentos)
summary(modelo2)
##
## Call:
## lm(formula = preciom ~ log(areaconst), data = apartamentos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -22.9725 -5.4109 -0.1832 4.9141 24.1899
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 53.8202 3.4091 15.79 <2e-16 ***
## log(areaconst) 42.8778 0.7936 54.03 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.496 on 1361 degrees of freedom
## Multiple R-squared: 0.682, Adjusted R-squared: 0.6818
## F-statistic: 2919 on 1 and 1361 DF, p-value: < 2.2e-16
Al observar el modelo transformado puede reconocerse que el Y intercepto SE UBICA EN 53.8 mientras que la pendiente es de 42.8. A primera vista es claro que los valores cambiaron considerablmente, pero hay que tener en cuenta que al aplicar una tansformación logarítmica la variable independiente deja de ser el área construída y se vuelve su logaritmo. Adicionalmente, el p-value mostrado es de 2.2e-16 lo que implica un buen ajuste del modelo, además de un \(R^2\) de 0.68 que, aunque un poco menor que el modelo original, es considerablemente bueno. Veamos la validación de supuestos mediante los gráficos de residuos.
par(mfrow=c(2,2))
plot(modelo2)
Inicialmente, frente a la verificación de la distribución normal de los residuales, el gráfico QQ Plot parece describir un comportamiento cercano al normal. Sin embargo, para los otros gráficos, se reconocen patrones claros en la distribución de los residuos, particularmente se ve una curva en su distribución frente a los valores ajustados de Y, lo que indicaría que el supuesto de homocedasticidad no se cumple.
Ahora se aplica el logaritmo sólo a los valores de Y.
modelo3=lm(log(preciom) ~ areaconst, data=apartamentos)
summary(modelo3)
##
## Call:
## lm(formula = log(preciom) ~ areaconst, data = apartamentos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.104645 -0.020942 0.000593 0.019371 0.099110
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.318e+00 2.835e-03 1876.11 <2e-16 ***
## areaconst 2.007e-03 3.598e-05 55.77 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.02996 on 1361 degrees of freedom
## Multiple R-squared: 0.6956, Adjusted R-squared: 0.6954
## F-statistic: 3110 on 1 and 1361 DF, p-value: < 2.2e-16
Para la segunda transformación se observa un y intersepto de 5.31 mientras que la pendiente es considerablemente menor con sólo 0.002, lo que implica una variación muy pequeña del valor del inmueble frente a la variación del área del mismo. Adicionalmente, el tercer modelo presenta un p-value de 2.2e-16 y un R-cuadrado de 0.69, ambos indicadores de que el modelo es viable para utilizar. Sin embargo, la variación tan baja de la pendiente genera dudas y es necesario validar primero los supuestos:
par(mfrow=c(2,2))
plot(modelo3)
Para el caso de la segunda transformación parece mantenerse la distribución normal de los residuos, además que se mejora la varianza constante de los residuales. Sin embargo, la linea roja que marca la tendencia no se muestra del todo recta y traza un recorrido descendente, por tanto parece que el modelo original, sin transformaciones, es mejor para analizar el comportamiento de los apartamentos y para generar predicciones sobre sus precios con respecto al area construída.
Para concluir, podemos afirmar que el modelo de regresión simple generado en este ejercicio es una herramienta viable para analizar el comportamiento de los valores de los apartamentos con respecto al área construida. En este sentido, puede recomendarse a la empresa A&C que lo utilice como herramienta para predecir y analizar los precios de conjuntos de apartamentos, sin embargo, como se comentó en otra sección, a la hora de evaluar propiedades particulares deben considerarse otras variables, como la zona donde se encuentra ubicada la propiedad. Debe resaltarse que, una evidencia fuerte de que el modelo es confiable está en que las transformaciones realizadas al mismo arrojaron resultados menos favorables que los del modelo principal, afianzando la confianza que puede generar el primero.