Con base en los datos de ofertas de vivienda descargadas del portal Fincaraiz para apartamentos de estrato 4 con área construida menor a 200 m^2. la inmobiliaria A&C requiere el apoyo de un científico 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.
head(df)
## # 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
Inicialmente se explora la base en general, de esta forma se sabe que consta de 5 columnas entre las que se encuentran el estrato que en todo caso es 4, el tipo de vivienda, su área construida, la zona de la ciudad en que se ubica y su precio.
Se observan algunos registros relacionados a casas y, como el problema nos habla solo de apartamentos, los eliminamos del dataset.
Valores únicos iniciales para la variable tipo
unique(df$tipo)
## [1] Apartamento Casa
## Levels: Apartamento Casa
df = subset(df, tipo != "Casa")
Valores únicos posteriores para la variable tipo
unique(df$tipo)
## [1] Apartamento
## Levels: Apartamento Casa
Análisis estadístico del área
summary(df$areaconst)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 40.00 60.00 70.00 75.48 84.00 200.00
Análisis estadístico del precio
summary(df$preciom)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 207.4 228.8 236.1 237.7 243.6 305.2
md.pattern(df, rotate.names = TRUE)
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## zona estrato preciom areaconst tipo
## 1363 1 1 1 1 1 0
## 0 0 0 0 0 0
La búsqueda de valores nulos no arroja resultados, es decir, los 1363 registros de casas tienen su información completa.
# Histograma de la variable area
hist(df$areaconst,
main = "Distribución del área construida en metros",
las=1,
xlab = "Área(m2)",
ylab = "Frecuencia",
col = "#AFEEEE")
La distribución de los datos evidencia que la variable área es simétrica sesgada a la izquierda, se observa que la gran mayoría de las viviendas se encuentran en áreas entrs los 50 y 100 metros.
# Histograma de la variable precio
hist(df$preciom,
main = "Distribución de precio de las viviendas",
las=1,
xlab = "Precio en Millones de Pesos",
ylab = "Frecuencia",
col = "#AFEEEE")
La distribución de los datos muestra una distribución simétrica del precio con un sesgo a la izquierda pero no tan dispersa como el área.
# Scatter Plot del precio de las viviendas por área
ggplot(data = df, aes(x = areaconst, y = preciom)) +
geom_point() +
labs(x = "Area Construida (m2)", y = "Precio (millones)") +
ggtitle("Área Construida vs Precio de las Viviendas")+
theme(plot.title = element_text(hjust = 0.5),
panel.background = element_rect(fill = "white",
linewidth = 0.5,
linetype = 'dotted')
)
Al examinar el gráfico de dispersión del área vs el precio, confirmamos una clara tendencia ascendente y consistente entre ambos factores. Esto nos lleva a concluir que el precio de una propiedad se ve notablemente afectado por su dimensión y en forma positiva, es decir, el aumento del área de una vivienda tiende a aumentar el precio de esta. En resumen, este análisis nos brinda una mejor comprensión sobre cómo el tamaño de una propiedad influye en su valor.
cor(df$areaconst,df$preciom)
## [1] 0.8463271
La correlación entre el precio y el área es alta, con un coeficiente de 0.84 (correlación positiva fuerte), lo que indica una relación significativa entre ambas variables. Esto sugiere que a medida que aumenta el tamaño de la vivienda, es probable que el precio también lo haga de manera proporcional. Sin embargo, es importante recordar que la correlación no implica causalidad. Aunque consideraremos estas variables como respuesta y predictoras en nuestro análisis, debemos tener en cuenta que otros factores pueden influir en los precios de las viviendas además del tamaño.
mod = lm(preciom~areaconst, data=df)
resumen <- summary(mod)
resumen
##
## Call:
## lm(formula = preciom ~ areaconst, data = df)
##
## 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
El coeficiente Betha0 (200.1) representa el intercepto, es decir, el precio esperado cuando el área (variable independiente) es cero. Sin embargo, en el contexto del modelo, esta interpretación puede no ser relevante, ya que es poco probable que el área de una propiedad sea cero en la realidad. Por lo tanto, una interpretación más adecuada es que Betha representa el precio base para el apartamento más pequeño imaginable (200.1 millones), y a partir de este punto, los precios aumentan dependiendo del área y del coeficiente Betha1. Por otro lado, el coeficiente Betha1 (0.4984) representa la pendiente, es decir, el cambio esperado en el precio por cada unidad de cambio en el área. En este caso, por cada unidad adicional en el área de la propiedad, el precio previsto aumenta en aproximadamente 498 mil pesos.
intervalo_confianza <- confint(mod)
# Interpretar el intervalo de confianza
cat("Intervalo de confianza del 95% para beta1:", intervalo_confianza[2, 1], "a", intervalo_confianza[2, 2], "\n")
## Intervalo de confianza del 95% para beta1: 0.4817357 a 0.515097
# Realizar la prueba de hipótesis t
# Extraer el valor estimado del coeficiente beta1 y su error estándar
beta1_estimado <- coef(mod)[2]
error_estandar_beta1 <- summary(mod)$coef[2, "Std. Error"]
# Calcular el valor de la prueba t
valor_t <- beta1_estimado / error_estandar_beta1
# Determinar los grados de libertad
grados_libertad <- length(mod$residuals) - length(coef(mod))
# Definir el nivel de significancia
nivel_significancia <- 0.05
# Obtener el valor crítico de la distribución t
valor_critico_t <- qt(1 - nivel_significancia / 2, df = grados_libertad)
# Imprimir los resultados
cat("Valor de la prueba t:", valor_t, "\n")
## Valor de la prueba t: 58.61576
cat("Valor crítico t:", valor_critico_t, "\n")
## Valor crítico t: 1.961709
# Comparar el valor de la prueba t con el valor crítico t
if (abs(valor_t) > valor_critico_t) {
cat("Se rechaza la hipótesis nula. El coeficiente beta1 es significativamente diferente de cero.\n")
} else {
cat("No se rechaza la hipótesis nula. No hay suficiente evidencia para afirmar que el coeficiente beta1 es diferente de cero.\n")
}
## Se rechaza la hipótesis nula. El coeficiente beta1 es significativamente diferente de cero.
Los intervalos de confianza nos indican que, por cada metro cuadrado que aumente el área de la casa, el precio de esta aumenta entre 4.8 millones y 5.1 millones con una confianza del 95%.
Se observa una dependencia del área ya que esta afecta el precio con su cambio, aun así, esta significancia debe ser corroborada mediante la prueba de hipótesis t.
Debido a que el valor t es mucho valor al valor crítico, se rechaza la hipótesis nula y por ende se corrobora la significancia del parámetro B1 en el modelo de regresión.
# Extraer el valor de R-squared
r_cuadrado <- resumen$r.squared
# Imprimir el valor de R-squared
cat("Coeficiente de bondad R2:", r_cuadrado, "\n")
## Coeficiente de bondad R2: 0.7162696
El coeficiente de determinación R2 emerge como una herramienta fundamental en la evaluación de modelos de regresión, ya que ofrece una medida de la capacidad del modelo para explicar la variabilidad observada en los datos. En nuestro análisis, el valor de R^2 obtenido es aproximadamente 0.716, lo que sugiere que alrededor del 71.6% de la variabilidad en el precio de las propiedades puede ser explicada por el modelo de regresión lineal simple que hemos aplicado. En esencia, esto implica que el área de las propiedades, siendo la única variable independiente en nuestro modelo, tiene la capacidad de explicar casi tres cuartas partes de la variación observada en los precios.
Este hallazgo respalda la existencia de una relación significativa entre el área de las propiedades y sus precios, lo que valida la utilidad del modelo para explicar y predecir el comportamiento de los precios en función del área. Sin embargo, es vital destacar que el R2, aunque proporciona información valiosa, no ofrece una evaluación exhaustiva de la validez del modelo por sí solo. Por lo tanto, se recomienda complementar su interpretación con otras métricas y análisis adicionales para obtener una comprensión más completa de la relación entre las variables y la capacidad predictiva del modelo.
predict(mod, data.frame(areaconst=110), interval = "prediction", level = 0.95)
## fit lwr upr
## 1 254.8893 240.9814 268.7971
El modelo de RLS estima que el precio promedio de una vivienda de 110 metros cuadrados es de 254.9 millones de pesos. Por lo tanto, una oferta para la misma vivienda a un precio de 200 millones de pesos podría considerarse muy atractiva para un comprador (y menos favorable para un vendedor), ya que implicaría un descuento del 21.5% según las estimaciones del modelo. Sin embargo, es importante recordar que esta evaluación se basa exclusivamente en el precio estimado por el modelo y no tiene en cuenta otros factores cruciales como la ubicación específica del inmueble, sus características individuales, y cualquier otra variable relevante que pueda afectar el valor de la propiedad. Por lo tanto, se recomienda un análisis más amplio y detallado antes de realizar cualquier decisión importante en el mercado inmobiliario.
El comportamiento lineal puede observarse directamente del grafico de dispersión, como se mencionó anteriormente, el precio tiende a crecer de forma lineal con el aumento del área. Este hallazgo sugiere que se cumple la suposición de linealidad del modelo de regresión.
plot(mod, which = 1)
Al notar una línea horizontal en el gráfico de dispersión de los residuos versus los valores ajustados, se puede interpretar positivamente en cuanto al cumplimiento del supuesto de homocedasticidad en el modelo RLS. Este patrón sugiere que la varianza de los errores alrededor de la línea de regresión se mantiene constante a través de los diferentes niveles de los valores ajustados. Esta consistencia en la dispersión de los residuos implica que las estimaciones de los parámetros del modelo son eficientes y las inferencias basadas en ellas son válidas en términos prácticos.
bptest(mod)
##
## studentized Breusch-Pagan test
##
## data: mod
## BP = 0.83288, df = 1, p-value = 0.3614
Adicionalmente, el test de Breusch-Pagan muestra un valor de prueba (BP) de 0.83288 y un valor p asociado de 0.3614. Con un nivel de significancia del 0.05, como el valor p (0.3614) es mayor que este umbral, no se rechaza la hipótesis nula de homocedasticidad. Por lo tanto, no hay evidencia suficiente para afirmar que existe heterocedasticidad en el modelo de regresión lineal.
qqnorm(resid(mod))
qqline(resid(mod))
hist(resid(mod), main = "Histograma de Residuos", xlab = "Residuos")
Basándonos en la forma de la curva en el histograma y en cómo los puntos se alinean con la línea diagonal en el gráfico Q-Q Plot, parece indicar que los residuos siguen una distribución normal.
shapiro.test(resid(mod))
##
## Shapiro-Wilk normality test
##
## data: resid(mod)
## W = 0.99885, p-value = 0.5419
También se lleva a cabo el test de Shapiro-Wilk para evaluar la normalidad de los residuos del modelo, obteniendo un estadístico W de 0.99885 con un valor p asociado de 0.5419. Al ser el valor p (0.5419) mayor que cualquier nivel de significancia comúnmente utilizado, no hay suficiente evidencia para rechazar la hipótesis nula de normalidad de los residuos. Por lo tanto, podemos suponer que los residuos del modelo siguen una distribución normal.
Al evaluar la linealidad, homocedasticidad y normalidad de los residuos, no se observa evidencia significativa que sugiera una violación de estos supuestos. Al revisar a detalle los gráficos, se nota una distribución uniforme de los residuos y una alineación cercana a la línea de referencia en las gráficas residuales. Basado en estos hallazgos, es posible afirmar afirmar que la relación lineal entre las variables se mantiene sólida, sin necesidad de aplicar transformaciones adicionales al modelo.
Como se descarta la idea de realizar transformaciones para mejorar los supuestos, no es necesario realizar esta comparación.
modelo_original = lm(df$preciom~df$areaconst)
modelo_log = lm(df$preciom~log(df$areaconst))
modelo_sqrt = lm(df$preciom~sqrt(df$areaconst))
modelo_exp = lm(df$preciom~exp(df$areaconst))
resumen_modelo_original <- summary(modelo_original)
resumen_modelo_log <- summary(modelo_log)
resumen_modelo_sqrt <- summary(modelo_sqrt)
resumen_modelo_exp <- summary(modelo_exp)
Modelos = c(" Original", "Logaritmo", "Raiz Cuadrada", "Exponencial")
R2_Modelos = c(resumen_modelo_original$r.squared, resumen_modelo_log$r.squared, resumen_modelo_sqrt$r.squared, resumen_modelo_exp$r.squared)
tabla = data.frame(Modelos, R2_Modelos)
print(tabla)
## Modelos R2_Modelos
## 1 Original 0.71626963
## 2 Logaritmo 0.68201588
## 3 Raiz Cuadrada 0.70614304
## 4 Exponencial 0.06322411
Se implementan 3 modelos adicionales, uno con transformación logarítmica, uno raíz cuadrada y otro exponencial. Como resultado de su análisis, se observó que el modelo original exhibe un coeficiente de bondad (R2) más alto en comparación con los otros modelos alternativos, alcanzando aproximadamente un valor de 0.716. Este hallazgo indica que alrededor del 71.6% de la variabilidad en el precio de las viviendas puede ser explicada por el tamaño de construcción utilizando este modelo. Además, durante la validación de los supuestos para este modelo original, se confirmó que se cumplen los requisitos de linealidad, homocedasticidad y normalidad tanto mediante análisis gráficos como pruebas de hipótesis.