El sector inmobiliario se ha destacado por ser un mercado complejo y bastante dinámico, donde numerosos factores influyen en la determinación de los precios de las viviendas tanto para la venta como para el alquiler. En este contexto, me complace presentarles a los directivos de la Inmobiliaria A&C un proyecto de modelación estadística, diseñado específicamente para proporcionar una guía sólida en la fijación de precios de las propiedades en este competitivo mercado inmobiliario. Como se definió en los límites del proyecto, el enfoque está dirigido a apartamentos de estrato 4 con un área inferior o igual a los \(200\) \(m^2\).
En un mercado como el inmobiliario, es escencial contar con herramientas de análisis efectivas y certeras, que no se basen solo en la intuición y la experiencia, sino en datos y estadísticas sólidas, las cuales sirvan de soporte para una buena toma de decisiones y un enfoque óptimo de los recursos de la compañía.
Este proyecto se desarrolló a través de una serie de pasos minuciosos, para así disminuir el margen de error en los resultados. Comenzamos con un análisis exploratorio de datos de las variables cíticas: el precio de la vivienda y el área construida.Este análisis nos permitió tener una visión detallada del comportamiento del mercado basados en las características de estas dos variables. A continuación, exploramos la relación entre el precio y el área construida a través de un análisis bivariado, utilizando gráficos y estadísticas para cuantificar esta relación. La piedra angular del proyecto es el modelo de regresión lineal simple, que nos permite comprender cómo el área construida influye en el precio de la vivienda.
La robustez del modelo se evaluó mediante pruebas de hipótesis y medidas de bondad de ajuste. Al identificarse desviaciones de los supuestos, se han propuesto transformaciones apropiadas para mejorar el ajuste del modelo.
El resultado final de este proyecto es un informe completo que presenta las conclusiones y las recomendaciones basadas en el modelo apropiado. La meta es proporcionar una herramienta valiosa que apoye las decisiones relacionadas con la fijación de precios de las propiedades con las que cuenta la inmobiliaria A&C y, en última instancia, elevar la satisfacción tanto de los compradores como de los vendedores en el mercado inmobiliario.
El objetivo principal de este proyecto es desarrollar un modelo de regresión lineal simple que proporcione una guía sólida para la Inmobiliaria A&C en cuanto a la fijación de precios de las viviendas en el segmento de apartamentos de estrato 4 con un área construida menor o igual a los \(200\) \(m^2\). Este modelo tiene como finalidad ayudar a los directivos de la inmobiliaria a comprender cómo el área construida influye en el precio de las propiedades y a tomar decisiones más informadas en la negociación de inmuebles.
Se trabajará con la base de datos proporcionada por la Inmobiliaria A&C, donde tenemos información valiosa descargada del portal Fincaraiz sobre un total de 1.706 viviendas y 5 variables asociadas relacionadas con el tipo de vivienda, la zona donde está ubicada, el estrato, el área construida y el precio, estas variables las veremos paso a paso y en detalle en el desarrollo del proyecto.
Lo primero que se debe hacer para comenzar a trabajar con la base de datos es instalar las librerías que vamos a utilizar en el modelo:
Librerías
library(devtools)
library(paqueteMETODOS)
library(knitr)
library(rmarkdown)
library(kableExtra)
library(psych)
library(dplyr)
library(ggplot2)
library(table1)
require(table1)
library(tidyverse)
library(DescTools)
library(GGally)
library(nortest)
library(stargazer)
Datos
Ahora procederemos a importar los datos para el modelo, los cuales se encuentran en un repositorio de GitHub
#devtools::install_github("dgonxalex80/paqueteMETODOS")
data("vivienda4")
Resumen estadístico
Para tener un panorama más claro de la base de datos, haremos un resumen que contiene las 5 variables y las estadísticas básicas como la media, la mediana, los valores mínimos y máximos, los cuartiles, y la cantidad de valores faltantes (NA). Este resumen es útil para obtener una vista rápida de los datos. Adicionalmente, imprimiremos las 6 primeras observaciones de la base de datos para cerciorarnos de que el cargue estuvo correcto.
resumen_BD <- summary(vivienda4)
kable(resumen_BD, format = "html", table.attr = 'class = "table table-striped table-bordered"') %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
| zona | estrato | preciom | areaconst | tipo | |
|---|---|---|---|---|---|
| Zona Centro : 8 | 3: 0 | Min. : 78.0 | Min. : 40.00 | Apartamento:1363 | |
| Zona Norte : 288 | 4:1706 | 1st Qu.:160.0 | 1st Qu.: 60.00 | Casa : 343 | |
| Zona Oeste : 60 | 5: 0 | Median :210.0 | Median : 75.00 | NA | |
| Zona Oriente: 6 | 6: 0 | Mean :225.4 | Mean : 87.63 | NA | |
| Zona Sur :1344 | NA | 3rd Qu.:265.0 | 3rd Qu.: 98.00 | NA | |
| NA | NA | Max. :760.0 | Max. :200.00 | NA |
head_BD <- head(vivienda4)
kable(head_BD, format = "html", table.attr = 'class = "table table-striped table-bordered"') %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
| zona | estrato | preciom | areaconst | tipo |
|---|---|---|---|---|
| Zona Norte | 4 | 220 | 52 | Apartamento |
| Zona Norte | 4 | 600 | 160 | Casa |
| Zona Norte | 4 | 320 | 108 | Apartamento |
| Zona Sur | 4 | 290 | 96 | Apartamento |
| Zona Norte | 4 | 220 | 82 | Apartamento |
| Zona Norte | 4 | 305 | 117 | Casa |
Como se expresó anteriormente, la base de datos cuenta con 1,706 registros, para validar estos datos se deben seguir ciertos pasos.
1. Primero se debe llevar la base de datos a un data frame para poder analizar y graficar los datos faltantes, tomando como tamaño de la muestra, las 1,706 observaciones, para así analizar todo el conjunto.
vivienda4_df <- sample_n(vivienda4, 1706)
nrow(vivienda4_df)
## [1] 1706
2. Es importante visualizar los datos faltantes para observar su comportamiento
datosNA <- colSums(is.na(vivienda4_df))
datosNA <- t(datosNA)
kable(datosNA, format = "html", table.attr = 'class = "table table-striped table-bordered"') %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
| zona | estrato | preciom | areaconst | tipo |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
Con estos dos pasos y de acuerdo con esta última tabla comprobamos que no hay ningún dato faltante en nuestra base de datos, por lo cual podemos continuar con nuestros análisis.
Para esta etapa de análisis estadístico, nos enfocamos en comprender las características fundamentales de las dos variables clave en nuestro estudio: el precio de la vivienda y el área de la vivienda. Este análisis exploratorio es esencial para obtener una visión general de la distribución de estas variables, lo que nos ayudará a tomar decisiones más informadas sobre el modelo de regresión que desarrollaremos.
Para explorar las variables precio y área construida de manera aislada, comenzamos con un resumen estadístico de ambas, con el fin de entender cómo están distribuidas.
resumen_precio <- t(summary(vivienda4$preciom))
kable(resumen_precio, format = "html", table.attr = 'class = "table table-striped table-bordered"') %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
| Min. | 1st Qu. | Median | Mean | 3rd Qu. | Max. |
|---|---|---|---|---|---|
| 78 | 160 | 210 | 225.3746 | 265 | 760 |
range(resumen_precio)
## [1] 78 760
De acuerdo con la tabla resumen de la variable precio podemos concluir lo siguiente:
Para comprobar lo que se visualizó en la tabla anterior, vamos a graficar un histograma, donde se observa claramente un sesgo a la derecha, la mayoría de los datos están concentrados entre los 160 y 265 millones a la izquierda del histograma. Y contamos con muy pocos datos atípicos que llegan hasta los 760 millones como máximo.
hist(vivienda4$preciom,
main = "Histograma de precios",
ylab = "Frecuencia",
xlab = "Precio (millones de pesos)",
col = "thistle")
abline(v = mean(vivienda4$preciom), col="red", lwd=2, lty=2)
Un dato interesante es evaluar el precio del metro cuadrado en las diferentes zonas de la ciudad, para esto se construyó la siguiente variable:
precio_m2 <- vivienda4$preciom/vivienda4$areaconst
mean(precio_m2)
## [1] 2.651682
Ahora, llevamos esta variable a un boxplot para comparar el comportamiento del precio del metro cuadrado por las 5 zonas.
boxplot(precio_m2~vivienda4$zona,
main = "Distribución del precio del metro cuadrado por zona",
ylab="millones de pesos",
xlab = "zona", las=1,
col=c("salmon","cyan3","wheat","thistle3","lightblue"))
abline(h = mean(precio_m2), col="red", lwd=2, lty=2)
p_prom_zona <- aggregate(precio_m2 ~ vivienda4$zona, data = vivienda4, FUN = mean)
kable(p_prom_zona, format = "html", table.attr = 'class = "table table-striped table-bordered"') %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
| vivienda4$zona | precio_m2 |
|---|---|
| Zona Centro | 2.359209 |
| Zona Norte | 2.589918 |
| Zona Oeste | 2.867193 |
| Zona Oriente | 2.357443 |
| Zona Sur | 2.658351 |
De este gráfico se puede concluir que el precio del metro cuadrado en la zona oriente es el más barato y en la zona oeste se tiene el valor por metro cuadrado más alto, esto puede deberse a las condiciones de las zonas, la seguridad, la cercanía a diferentes lugares; sin embargo, con la información con la que se cuenta, no es posible afirmar la razón.
La zona centro tiende a ser la más equilibrada, pues tiene menos datos atípicos que las demás y tiene una caja relativamente pequeña, lo que sugiere una menor dispersión entre sus datos.
La zona sur presenta un patrón de distribución muy marcado, donde la mayoría de los datos se centran en un valor de 2.7 millones, pero cuenta con mucha variabilidad en el resto de valores, pues los bigotes del boxplot son muy largos y además hay muchos datos atípicos. Esto puede significar que dentro de la zona sur, hay regiones más cotizadas, tal vez por el desarrollo urbanístico, por la seguridad, y por muchas otras razones que no se pueden concluir con estos datos.
Con esta información, se podría segmentar de una mejor manera el mercado, y se podrían lanzar estrategias de acuerdo con cada nicho. Orientar a clientes que buscan economía a zonas como el centro y el oriente y a clientes con una mayor solvencia económica a zonas como el oeste y el sur.
En términos generales, el precio promedio por metro cuadrado independientemente de la zona es de 2.65 millones y de acuerdo con la tabla de precios promedios por zonas, todos oscilan muy cerca de este valor global, lo que nos sugiere un precio relativamente parejo del metro cuadrado en la ciudad.
resumen_area <- t(summary(vivienda4$areaconst))
kable(resumen_area, format = "html", table.attr = 'class = "table table-striped table-bordered"') %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
| Min. | 1st Qu. | Median | Mean | 3rd Qu. | Max. |
|---|---|---|---|---|---|
| 40 | 60 | 75 | 87.62954 | 98 | 200 |
range(resumen_area)
## [1] 40 200
De acuerdo con la tabla resumen de la variable área podemos concluir lo siguiente:
Para corroborar estas conclusiones, vamos a graficar un histograma, donde se observa claramente un sesgo a la derecha, la mayoría de los datos están concentrados entre los 75 y los 98 metros cuadrados a la izquierda del histograma.
hist(vivienda4$areaconst,
main = "Histograma de área",
ylab = "Frecuencia",
xlab = "Metros cuadrados",
col = "thistle")
abline(v = mean(vivienda4$areaconst), col="red", lwd=2, lty=2)
Para ver cómo se distribuyen las áreas según la zona de la ciudad, vamos a graficar unso boxplot.
boxplot(vivienda4$areaconst~vivienda4$zona,
main = "Distribución del área por zona",
ylab="metros cuadrados",
xlab = "zona", las=1,
col=c("salmon","cyan3","wheat","thistle3","lightblue"))
abline(h = mean(vivienda4$areaconst), col="red", lwd=2, lty=2)
a_prom_zona <- aggregate(vivienda4$areaconst ~ vivienda4$zona, data = vivienda4, FUN = mean)
kable(a_prom_zona, format = "html", table.attr = 'class = "table table-striped table-bordered"') %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
| vivienda4\(zona </th> <th style="text-align:right;"> vivienda4\)areaconst | |
|---|---|
| Zona Centro | 112.12500 |
| Zona Norte | 87.78819 |
| Zona Oeste | 81.11667 |
| Zona Oriente | 125.16667 |
| Zona Sur | 87.57292 |
Podemos observar que en las zonas centro y oriente los inmuebles suelen tener las áreas más grandes de manera uniforme y en las zonas sur y norte es donde más datos atípicos vemos respecto a áreas mayores.
Para explorar la relación entre nuestras dos variables clave (precio y área construida), vamos a hacer un análisis exploratorio bivariado, el cual nos permite comprender cómo estas dos variables interactúan y si existe alguna relación lineal entre ellas.
Gráfico de dispersión
Utilizaremos un gráfico de dispersión para visualizar la relación entre el precio de la vivienda y el área construida en metros cuadrados. El precio se representa en el eje vertical (y) y el área en el horizontal (x).
modelo <- lm(vivienda4$preciom~vivienda4$areaconst, data = vivienda4)
plot(vivienda4$areaconst, vivienda4$preciom,
main = "Gráfico de dispersión Precio vs. Área",
xlab = "Área construida (m²)",
ylab = "Precio (millones)")
abline(modelo, col = "red", lwd = 2)
Coeficiente de Pearson
Para cuantificar la relación lineal entre el precio y el área construida, calculamos el coeficiente de correlación de Pearson utilizando la función \(cor()\). Este coeficiente proporciona una medida numérica de la fuerza y dirección de la correlación.
paste("Coeficiente de Pearson = ", cor(vivienda4$areaconst, vivienda4$preciom))
## [1] "Coeficiente de Pearson = 0.763016627167914"
Los resultados obtenidos tanto en el gráfico de dispersión como con el coeficiente de Pearson indican una correlación positivamente moderadamente fuerte entre el precio y el área de las viviendas. Este valor nos sugiere que a medida que el área construida de la vivienda aumenta, el precio de la vivienda también tiende a aumentar en la misma dirección. Decimos que la correlación es moderadamente fuerte y no fuerte porque, aunque ambas variables están positivamente relacionadas, una correlación es fuerte cuando el coeficiente de Pearson es igual o superior a 0.8.
Este hallazgo es importante para comprender la relación entre el precio de la vivienda y el área construida y será útil en la construcción de modelos predictivos y análisis posteriores.
El siguiente paso será la estimación de un modelo de regresión lineal simple para comprender la relación entre los precios de las viviendas (variable respuesta) y el área construida (variable predictora).
Este modelo tiene la siguiente forma: \(precio = \beta_0 + \beta_1(area) + \epsilon\), donde: \(\beta_0\) es el intercepto o el precio base. \(\beta_1\) es el coeficiente de regresión que representa el cambio en el precio por metro cuadrado. \(\epsilon\) es el término de error, que refleja la variabilidad no explicada por el modelo.
Previamente ya habíamos utilizado la función \(lm()\) para ajustar el modelo de regresión lineal. Ahora, para ver los coeficientes \(\beta_0\) y \(\beta_1\) junto con las estadísticas importantes, imprimimos el resumen del modelo.
modelo <- lm(vivienda4$preciom~vivienda4$areaconst, data = vivienda4)
resumen_modelo <- summary(modelo)
resumen_modelo
##
## Call:
## lm(formula = vivienda4$preciom ~ vivienda4$areaconst, data = vivienda4)
##
## 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
De la tabla podemos concluir lo siguiente:
Ahora, veamos en una tabla a parte los coeficientes del modelo.
coeficientes <- resumen_modelo$coef
resumen_df <- as.data.frame(coeficientes)
kable(resumen_df, format = "html", table.attr = 'class = "table table-striped table-bordered"') %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
| Estimate | Std. Error | t value | Pr(>|t|) | |
|---|---|---|---|---|
| (Intercept) | 67.380631 | 3.5100306 | 19.19659 | 0 |
| vivienda4$areaconst | 1.802976 | 0.0370006 | 48.72834 | 0 |
El valor del intercepto \(\beta_0\) es 67.381. Este es el precio base de una vivienda cuando el área construida es igual a cero. En este contexto, el intercepto podría no tener una interpretación práctica real, ya que no tiene sentido que el área construida sea cero para una vivienda. A pesar de esto, el valor-p asociado al intercepto es extremadamente pequeño, lo que indica que el intercepto es muy significativo en el modelo. El intercepto es una parte fundamental del modelo que permite que la línea de regresión se ajuste de manera precisa a los datos, a pesar de que su valor no tenga una interpretación realista en este contexto.
El coeficiente de regresión \(\beta_1\) es 1.803. Esto significa que, en promedio, el precio de las viviendas aumenta en 1.803 millones de pesos por cada metro cuadrado adicional de área construida. El valor-p asociado a \(\beta_1\) es muy pequeño, lo que indica que el coeficiente es significativamente diferente de cero. Esto sugiere que hay una relación lineal significativa entre el precio de la vivienda y el área construida.
El hecho de que los valores-p para ambos coeficientes sean tan pequeños (< 2e-16) indica que ambos son estadísticamente significativos en el modelo. Esto sugiere que el modelo de regresión lineal simple es apropiado para describir la relación entre el precio de la vivienda y el área construida.
El modelo con los datos obtenidos es: \(precio = 67.381 + 1.803(area)\)
En este paso evaluaremos la significancia del coeficiente \(\beta_1\), que representa la relación entre el precio de la vivienda y el área construida.
Construcción del IC del 95 % para \(\beta_1\)
Un intervalo de confianza es un rango de valores que proporciona un límite superior e inferior dentro del cual se espera que se encuentre el verdadero valor del coeficiente β1.
Vamos a construir el IC del 95 % para \(\beta_1\)
IC_beta1 <- confint(modelo, level = 0.95)
print("El intervalo de confianza del 95 % para β1 es:")
## [1] "El intervalo de confianza del 95 % para β1 es:"
IC_beta1
## 2.5 % 97.5 %
## (Intercept) 60.496208 74.265055
## vivienda4$areaconst 1.730404 1.875547
El intervalo de confianza al 95 % para el intercepto \(\beta_0\) va desde 60.496 hasta 74.265 millones. Esto significa que estamos 95 % seguros de que el verdadero valor del intercepto se encuentra en este rango.
El intervalo de confianza al 95 % para \(\beta_1\) va desde 1.7304 hasta 1.8755. Esto significa que estamos 95 % seguros de que el verdadero valor de \(\beta_1\), que representa el cambio en el precio de la vivienda por metro cuadrado, se encuentra en este rango. Dado que el intervalo de confianza para \(\beta_1\) no incluye el valor cero, podemos concluir que \(\beta_1\) es significativamente diferente de cero. Esto sugiere que hay una relación fuerte entre el precio de la vivienda y el área construida. El hecho de que el intervalo no incluya el cero respalda la hipótesis alternativa de que \(\beta_1\) no es igual a cero y que el área construida afecta el precio de la vivienda.
Prueba de hipótesis t
Realizaremos una prueba de hipótesis para determinar si el coeficiente \(\beta_1\) es igual a cero o no. La hipótesis nula \(H_0\) establece que \(\beta_1\) es igual a cero, lo que significa que no hay relación lineal entre el precio de la vivienda y el área construida. La hipótesis alternativa \(H_1\) sugiere que \(\beta_1\) no es igual a cero, lo que indicaría que sí hay una relación significativa entre ambas variables.
t_beta1 <- resumen_modelo$coefficients["vivienda4$areaconst", "t value"]
valor_p <- resumen_modelo$coefficients["vivienda4$areaconst", "Pr(>|t|)"]
print("Prueba de hipótesis t para β1:")
## [1] "Prueba de hipótesis t para β1:"
print(paste("Estadístico t:",t_beta1))
## [1] "Estadístico t: 48.7283442815858"
print(paste("Valor-p:", valor_p))
## [1] "Valor-p: 0"
Dado que el valor-p es igual a cero, podemos concluir que el coeficiente \(\beta_1\), que representa el cambio en el precio de la vivienda por metro cuadrado, es significativamente diferente de cero. Esto respalda la hipótesis alternativa de que hay una relación significativa entre el precio de la vivienda y el área construida. En otras palabras, el área construida tiene un impacto significativo en el precio de las viviendas, y podemos afirmar con confianza que no es igual a cero.
En este paso, calcularemos e interpretaremos el coeficiente de determinación \(R^2\), una medida que indica la proporción de la variabilidad en la variable de respuesta (precio de la vivienda) que se explica por el modelo de regresión. Es decir, \(R^2\) proporciona información sobre qué tan bien el modelo ajustado se ajusta a los datos y cuánta variabilidad se puede atribuir a la variable predictora (área construida).
El cálculo del indicador de bondad \(R^2\) se puede hacer a partir del resumen del modelo de regresión ajustado previamente. Tomamos el resumen del modelo y de allí extraemos el valor de \(R^2\).
r_cuadrado <- resumen_modelo$r.squared
cat("Indicador de bondad R^2: ", r_cuadrado, "\n")
## Indicador de bondad R^2: 0.5821944
\(R^2\) tiene un rango de 0 a 1, donde 0 significa que el modelo no explica ninguna variabilidad en la variable de respuesta (precio de la vivienda), y 1 significa que el modelo explica toda la variabilidad.
En nuestro caso, \(R^2\) es igual a 0.58219, lo que indica que el modelo de regresión explica aproximadamente el 58.22 % de la variabilidad en el precio de la vivienda. Esto sugiere que el modelo tiene un ajuste moderado en la explicación de la variabilidad de los precios. El modelo puede explicar más de la mitad de la variabilidad en los precios de las viviendas en función del área construida. Aunque no es un ajuste perfecto, es un valor razonablemente bueno, lo que nos lleva a que el área construida es una variable relevante para predecir los precios de las viviendas.
En este paso, calcularemos el precio promedio estimado para un apartamento de 110 metros cuadrados utilizando el modelo de regresión lineal simple que hemos desarrollado. Luego, evaluaremos la atractividad de esta oferta teniendo en cuenta el precio estimado y otras consideraciones adicionales.
Debemos estimar el precio utilizando el modelo de regresión
precio_estimado <- coef(modelo)["(Intercept)"] + coef(modelo)["vivienda4$areaconst"] * 110
cat("El precio estimado para un apartamento de 110 metros cuadrador es: ", precio_estimado, "millones de pesos\n")
## El precio estimado para un apartamento de 110 metros cuadrador es: 265.7079 millones de pesos
Dado que el precio estimado para un apartamento de 110 metros cuadrados es de 265.7079 millones de pesos, una oferta de 200 millones para una vivienda en la misma zona y con la misma área construida sí es atractiva en términos de precio. Sin embargo, es fundamental considerar que el precio no es el único factor que influye en la atractividad de una oferta inmobiliaria. Otros factores, como la ubicación exacta, la calidad de la construcción, la composición de la vivienda, las comodidades y las preferencias individuales de los compradores, también desempeñan un papel importante en la decisión de compra.
En este paso, realizaremos la validación de los supuestos fundamentales del modelo de regresión lineal simple. Estos supuestos son esenciales para que el modelo sea válido y confiable. Para llevar a cabo la validación, utilizaremos gráficos apropiados, pruebas de hipótesis y compararemos los resultados obtenidos con lo observado en los gráficos asociados.
Los supuestos clave a validar son los siguientes:
1. Linealidad: Verificaremos si la relación entre la variable predictora (área construida) y la variable respuesta (precio) es lineal. Utilizaremos gráficos de dispersión para evaluar esta linealidad.
ggplot(data = vivienda4, aes(x = vivienda4$areaconst, y = vivienda4$preciom)) +
geom_point() +
labs(x = "Área Construida (m²)", y = "Precio (millones de pesos)",
title = "Gráfico de Dispersión: Área Construida vs. Precio")
De acuerdo con el gráfico de dispersión es posible afirmar que existe una relación de linealidad positiva entre el precio y el área construida, es decir, que a medida que aumenta el área aumenta el precio de la vivienda.
Otra forma de verificar la linealidad es con un gráfico de los errores contra los valores ajustados.
errores <- resid(modelo)
plot(modelo$fitted.values, errores)
abline(h = 0, col = "red")
En este gráfico no se observa un patrón definido y los errores parecen dispersarse aleatoriamente alrededor de la línea horizontal en 0 (línea roja en el gráfico), esto es una señal positiva de que el supuesto de linealidad se mantiene.
2. Normalidad de los errores: Comprobaremos si los errores del modelo siguen una distribución normal. Utilizaremos gráficos de densidad, gráficos QQ (quantile-quantile) y pruebas de normalidad, como la prueba de Shapiro-Wilk.
ggplot(data.frame(Errores = errores), aes(x = Errores)) +
geom_density(fill = "lightblue", color = "black") +
labs(title = "Gráfico de densidad de los errores", x = "Errores")
qqnorm(errores)
qqline(errores, col = "red")
shapiro.test(errores)
##
## Shapiro-Wilk normality test
##
## data: errores
## W = 0.92671, p-value < 2.2e-16
Los resultados obtenidos nos permiten concluir que los errores no siguen una distribución normal:
3. Homoscedasticidad: Este es un supuesto importante en el análisis de regresión. Cuando se cumple, significa que la variabilidad de los errores es constante en todos los niveles de los valores ajustados, lo que facilita la interpretación de los coeficientes y las inferencias basadas en el modelo.
Para comprobar que cumplimos con el supuesto de homoscedasticidad haremos la prueba de Breusch-Pagan. La hipótesis nula en esta prueba es que los errores son homoscedásticos (la varianza de los errores es constante). La hipótesis alternativa es que los errores son heteroscedásticos (la varianza de los errores no es constante).
lmtest::bptest(modelo)
##
## studentized Breusch-Pagan test
##
## data: modelo
## BP = 152.8, df = 1, p-value < 2.2e-16
Con base en esta prueba, la conclusión a la que llegamos es que el valor-p asociado al estadístico Breusch-Pagan es extremadamente pequeño, lo que sugiere la presencia de heterocedasticidad en nuestro modelo de regresión. Es decir, se rechaza el supuesto de homoscedasticidad.
4. Independencia de los errores: Comprobaremos si los errores son independientes uno de otro, es decir, no hay correlación entre ellos. Utilizaremos gráficos de autocorrelación de errores y pruebas estadísticas, como el test de Durbin-Watson.
acf(errores, main = "Gráfico de autocorrelación de los errores")
lmtest::dwtest(modelo)
##
## Durbin-Watson test
##
## data: modelo
## DW = 1.6713, p-value = 5.124e-12
## alternative hypothesis: true autocorrelation is greater than 0
El valor de Durbin-Watson (DW) es menor que 2 (en este caso, 1.6713), lo que sugiere la presencia de autocorrelación positiva en los errores. Un valor de DW cercano a 2 indica independencia, mientras que valores menores a 2 sugieren autocorrelación positiva.
El valor-p es muy pequeño (5.124e-12), lo que indica que la autocorrelación en los errores es significativa desde una perspectiva estadística.
Basados en los resultados de la gráfica de autocorrelación y la prueba Durbin-Watson, podemos concluir que los errores en nuestro modelo de regresión muestran evidencia significativa de autocorrelación positiva. Esto sugiere que el supuesto de independencia de los errores no se cumple en el modelo. Es importante abordar la autocorrelación positiva para garantizar la validez de las inferencias y ajustes del modelo.
5. Presencia de Outliers: La detección de outliers (datos atípicos) es una parte fundamental del análisis de datos y la modelación estadística. Ayuda a identificar problemas en los datos, evaluar la idoneidad del modelo y tomar decisiones informadas en función de la naturaleza de los valores atípicos y su impacto en los resultados.
Para evaluar si nuestro modelo tiene outliers, vamos a graficar un boxplot de nuestros errores y a almacenar en una variable todos los outliers.
boxplot(errores, main = "Boxplot de los errores", col = "lightblue3", outcol = "red", pch = 19, outline = TRUE)
outliers <- boxplot(errores, plot = FALSE)$out
length(outliers)
## [1] 76
De acuerdo con lo anterior, tenemos un total de 76 observaciones que se comportan como datos atípicos, lo que equivale a casi el 4.4 % del total de las observaciones.
En este paso de nuestro proyecto de modelación estadística, nos encontramos con la necesidad de mejorar el ajuste y cumplir con los supuestos de nuestro modelo de regresión lineal simple. Cuando los supuestos del modelo no se cumplen, es crucial explorar diferentes enfoques para abordar estos problemas y garantizar que nuestro modelo sea válido y confiable.
Las transformaciones pueden ayudar a linealizar la relación entre las variables, reducir la heterocedasticidad o mejorar la distribución de los errores. Los tipos de transformaciones que podrían ser útiles incluyen transformaciones logarítmicas, de raíz cuadrada, de potencia o incluso transformaciones más avanzadas como la transformación de Box-Cox.
Para este punto vamos a aplicar una transformación logarítimca a nuestro modelo.
modelo <- lm(vivienda4$preciom~vivienda4$areaconst, data = vivienda4)
modelo2_loglin <- lm(log(vivienda4$preciom) ~ vivienda4$areaconst, data = vivienda4)
modelo3_linlog <- lm(vivienda4$preciom ~ log(vivienda4$areaconst), data = vivienda4)
modelo4_loglog <- lm(log(vivienda4$preciom) ~ log(vivienda4$areaconst), data = vivienda4)
modelo5_boxcox <- boxcox(lm(vivienda4$preciom~vivienda4$areaconst, data = vivienda4))
modelo6_sqrt <- lm(sqrt(vivienda4$preciom) ~ vivienda4$areaconst, data = vivienda4)
summary(modelo)
##
## Call:
## lm(formula = vivienda4$preciom ~ vivienda4$areaconst, data = vivienda4)
##
## 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
resumen_modelo2 <- summary(modelo2_loglin)
resumen_modelo3 <- summary(modelo3_linlog)
resumen_modelo4 <- summary(modelo4_loglog)
resumen_modelo6 <- summary(modelo6_sqrt)
Una vez obtenido todas las transformaciones de los modelos, vamos a proceder a visualizar los \(R^2\) de cada una para así decidir cuál será nuestro modelo final y así calcular los supuestos.
r_cuadrado2 <- resumen_modelo2$r.squared
r_cuadrado3 <- resumen_modelo3$r.squared
r_cuadrado4 <- resumen_modelo4$r.squared
r_cuadrado6 <- resumen_modelo6$r.squared
valores_r2 <- c(r_cuadrado, r_cuadrado2, r_cuadrado3, r_cuadrado4, r_cuadrado6)
modelos <- c("Modelo original", "Modelo Log-Lin", "Modelo Lin-Log", "Modelo Log-Log", "Modelo Raíz cuadrada")
df_r_cuadrado <- data.frame(Modelo = modelos, R_cuadrado = valores_r2)
kable(df_r_cuadrado, format = "html", table.attr = 'class = "table table-striped table-bordered"') %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
| Modelo | R_cuadrado |
|---|---|
| Modelo original | 0.5821944 |
| Modelo Log-Lin | 0.5708913 |
| Modelo Lin-Log | 0.6144140 |
| Modelo Log-Log | 0.6386834 |
| Modelo Raíz cuadrada | 0.5864821 |
De acuerdo con estos resultados el modelo que mejor se ajusta en la explicación de la variabilidad de los precios en función del área construida es el Modelo 4, con la transformación logaritmo-logaritmo, pues explica esta variabilidad en un 63.868 %.
En este paso, realizaremos la validación de los supuestos fundamentales del modelo de regresión lineal simple con las variables transformadas
Los supuestos clave a validar son los siguientes:
1. Linealidad
log_area <- log(vivienda4$areaconst)
log_precio <- log(vivienda4$preciom)
ggplot(data = vivienda4, aes(x = log_area, y = log_precio)) +
geom_point() +
labs(x = "Área Construida (m²)", y = "Precio (millones de pesos)",
title = "Gráfico de Dispersión: Área Construida vs. Precio")
De acuerdo con el gráfico de dispersión podemos afirmar que existe una relación de linealidad positiva entre el precio y el área construida en este modelo transformado, es decir, a medida que aumenta el área aumenta el precio de la vivienda.
Otra forma de verificar la linealidad es con un gráfico de los errores contra los valores ajustados.
erroresM4 <- resid(modelo4_loglog)
plot(modelo4_loglog$fitted.values, erroresM4)
abline(h = 0, col = "red")
En este gráfico no se observa un patrón definido y los errores parecen dispersarse aleatoriamente alrededor de la línea horizontal en 0 (línea roja en el gráfico), esto es una señal positiva de que el supuesto de linealidad se mantiene.
2. Normalidad de los errores:
ggplot(data.frame(Errores = erroresM4), aes(x = Errores)) +
geom_density(fill = "lightblue", color = "black") +
labs(title = "Gráfico de densidad de los errores", x = "Errores")
qqnorm(erroresM4)
qqline(erroresM4, col = "red")
shapiro.test(erroresM4)
##
## Shapiro-Wilk normality test
##
## data: erroresM4
## W = 0.9934, p-value = 6.631e-07
Los resultados obtenidos nos permiten concluir que los errores de este modelo tienen un comportamiento más asociado a la normalidad, aunque siguen sin ser completamente normales, esto debido a que el valor-p sigue siendo muy pequeño.
3. Homoscedasticidad:
lmtest::bptest(modelo4_loglog)
##
## studentized Breusch-Pagan test
##
## data: modelo4_loglog
## BP = 65.105, df = 1, p-value = 7.101e-16
Con base en esta prueba, la conclusión a la que llegamos es que el valor-p asociado al estadístico Breusch-Pagan es extremadamente pequeño, lo que sugiere la presencia de heterocedasticidad en nuestro modelo de regresión. Es decir, se rechaza el supuesto de homoscedasticidad.
4. Independencia de los errores:
acf(erroresM4, main = "Gráfico de autocorrelación de los errores")
lmtest::dwtest(modelo4_loglog)
##
## Durbin-Watson test
##
## data: modelo4_loglog
## DW = 1.5104, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
El valor de Durbin-Watson (DW) es menor que 2 (en este caso, 1.5104), lo que sugiere la presencia de autocorrelación positiva en los errores. Un valor de DW menor a 2 sugiere autocorrelación positiva.
El valor-p es muy pequeño (2.2e-16), lo que indica que la autocorrelación en los errores es significativa desde una perspectiva estadística.
Basados en los resultados de la gráfica de autocorrelación y la prueba Durbin-Watson, podemos concluir que los errores en nuestro modelo de regresión transformado muestran evidencia significativa de autocorrelación positiva. Esto sugiere que el supuesto de independencia de los errores no se cumple en el modelo. Es importante abordar la autocorrelación positiva para garantizar la validez de las inferencias y ajustes del modelo.
5. Presencia de Outliers:
boxplot(erroresM4, main = "Boxplot de los errores", col = "lightblue3", outcol = "red", pch = 19, outline = TRUE)
outliersM4 <- boxplot(erroresM4, plot = FALSE)$out
length(outliersM4)
## [1] 30
De acuerdo con lo anterior, tenemos un total de 30 observaciones que se comportan como datos atípicos, es decir, 46 menos que en el modelo inicial. Pasamos de un 4.4 % de valores atípicos a un 1.76 %.
Basándonos en el análisis, el modelo que mejor se ajusta a los datos y proporciona un alto valor de \(R^2\) es el modelo logarítmico-logarítmico (log-log). Aunque este modelo no cumple con todos los supuestos de la regresión lineal, su capacidad predictiva es notable. Sin embargo, es importante tener en cuenta que, debido a las transformaciones, la interpretación de los coeficientes puede ser menos directa en términos prácticos.
Se sugiere utilizar el modelo log-log para predecir los precios de la vivienda, pero también es vital ser consciente de que existen ciertas limitaciones y supuestos no cumplidos. Además, se recomienda seguir monitoreando y recopilando datos adicionales para refinar el modelo en el futuro y considerar otras variables relevantes, como ubicación, calidad de construcción y características específicas de las viviendas. Este enfoque brindará una base sólida para la toma de decisiones en la fijación de precios de la inmobiliaria.