Teniendo presente la solicitud planteada por su empresa, en relación con el requerimiento de un científico de datos para la construcción de un modelo que oriente sobre los precios de inmuebles de la base de datos que nos remitió, el presente documento tiene como finalidad, realizar análisis exploratorios (simple y bivariado), estimación de modelos de regresión lineal y otras estimaciones, con el fin, de construir un informe que le permita, tomar mejores decisiones.
Como primera medida, consideramos pertinente detallar los tipos de inmuebles que se registran en la base de datos:
# Cargar librerías
library(readr,warn.conflicts = FALSE)
library(dplyr,warn.conflicts = FALSE)
library(ggplot2,warn.conflicts = FALSE)
library(gridExtra,warn.conflicts = FALSE)
library(paqueteMETODOS,warn.conflicts = FALSE)
## Loading required package: cubature
## Loading required package: GGally
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
## Loading required package: MASS
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
## Loading required package: summarytools
## Loading required package: psych
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
## Loading required package: tidyverse
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ lubridate 1.9.3 ✔ tibble 3.2.1
## ✔ purrr 1.0.1 ✔ tidyr 1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ psych::%+%() masks ggplot2::%+%()
## ✖ psych::alpha() masks ggplot2::alpha()
## ✖ gridExtra::combine() masks dplyr::combine()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ MASS::select() masks dplyr::select()
## ✖ tibble::view() masks summarytools::view()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Instalación y carga de paquetes necesarios
#install.packages("learnr") # solo una vez
#install.packages("devtools") # solo una vez
devtools::install_github("dgonxalex80/paqueteMETODOS")
## Skipping install of 'paqueteMETODOS' from a github remote, the SHA1 (9696ffdc) has not changed since last install.
## Use `force = TRUE` to force installation
data(vivienda4)
# Tabla de frecuencias de la variable "tipo"
table_tipo <- table(vivienda4$tipo)
# Gráfico de pastel para visualizar la proporción de tipos de inmuebles con valores y colores
colors <- c("steelblue", "pink") # Define los colores que deseas utilizar
# Crea el gráfico de pastel
pie(table_tipo, main = "Proporción de Tipos de Inmuebles", labels = table_tipo, col = colors)
legend("topright", legend = names(table_tipo), fill = colors) # Agrega una leyenda de colores
Se observa, que se tiene un total de 1.363 apartamentos y 343 casas. Por lo tanto, y de acuerdo a las conversaciones sostenidas con sus directivos, el presente informe se centrará para el tipo de inmueble: Apartamentos
Por último, y teniendo en cuenta la base de datos remitida, se observa que de los 1.706 registros, 30 de ellos corresponden a apartamentos de 200 m2. Y dado que en sus restricciones cololca menor a 200 m2, se le informa, que para hacer un uso completo de la información contenida, estos 30 registros también harán parte del análisis.
Con base en los datos de ofertas de vivienda descargadas del portal Fincaraiz para apartamento de estrato 4 con área construida menor a 200 m2 (vivienda4.RDS), nuestra inmobiliaria requiere su apoyo en la construcción de un modelo que nos oriente sobre los precios de inmuebles.
Con este propósito el equipo de asesores ha diseñado los siguientes pasos para obtener un modelo y así poder a futuro determinar los precios de los inmuebles a negociar
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.
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 (area construida) - incluir gráficos e indicadores apropiados interpretados.
Estime el modelo de regresión lineal simple entre precio=f(area)+ε . Interprete los coeficientes del modelo β0 , β1 en caso de ser correcto.
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.
Calcule e interprete el indicador de bondad R2.
¿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?.
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.
De ser necesario realice una transformación apropiada para mejorar el ajuste y supuestos del modelo.
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?
Con los resultados obtenidos construya un informe para los directivos de la inmobiliaria, indicando el modelo apropiado y sus principales características. A este informe se deben añadir los anexos como evidencia de la realización de los pasos anteriores.
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:
vivienda_apartamentos <- vivienda4 %>%
filter(tipo == "Apartamento")
# Resumen descriptivo de la variable preciom
summary(vivienda_apartamentos$preciom)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 78.0 153.5 185.0 202.4 240.0 645.0
# Calcular la desviación estándar de preciom
desviacion_estandar_preciom <- sd(vivienda_apartamentos$preciom)
# Imprimir las desviaciones estándar
cat("Desviación Estándar de preciom:", desviacion_estandar_preciom, "\n")
## Desviación Estándar de preciom: 65.29049
# Histograma de la variable "preciom" sin valores no válidos
ggplot(vivienda_apartamentos, aes(x = preciom)) +
geom_histogram(binwidth = 3, fill = "blue", color = "grey", na.rm = TRUE) +
labs(title = "Histograma de la variable 'Precio'",
x = "Precio (Millones de pesos)",
y = "Frecuencia")
- El valor mínimo en la variable es 78.
- El primer cuartil (25%) de la variable es 153.5, es decir, que el 25% de los datos son iguales o menores a este valor.
- La mediana de la variable es 185, que corresponde al valor que se encuentra justo en el medio de los datos cuando se ordenan de menor a mayor. Lo que quiere decir, que el 50% de los datos son iguales o menores a este valor.
- La media (promedio) de la variable es 202.4.
- El tercer cuartil (75%) de la variable es 240, es decir, que el 75% de los datos son iguales o menores a este valor.
- El valor máximo en la variable es 645.
- En relación con la desviación estándar, se observa un valor de 65.29049 . Cabe mencionar, que esta es una medida de dispersión que indica cuanto se alejan los valores de la variable de su promedio. Por lo tanto, este valor significa que, en promedio, los valores de la variable precio tienden a estar a unos 65.29049 millones de pesos COP de distancia con respecto a la media.
# Resumen descriptivo de la variable areaconst
summary(vivienda_apartamentos$areaconst)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 40.00 60.00 70.00 75.48 84.00 200.00
# Calcular la desviación estándar de areaconst
desviacion_estandar_areaconst <- sd(vivienda_apartamentos$areaconst)
# Imprimir las desviaciones estándar
cat("Desviación Estándar de areaconst:", desviacion_estandar_areaconst, "\n")
## Desviación Estándar de areaconst: 22.56461
# Histograma de la variable "areaconst" sin valores no válidos
ggplot(vivienda_apartamentos, aes(x = areaconst)) +
geom_histogram(binwidth = 2, fill = "green", color = "blue", na.rm = TRUE) +
labs(title = "Histograma de la variable 'Área construida'",
x = "Área construida (M2)",
y = "Frecuencia")
- El valor mínimo en la variable es 40.
- El primer cuartil (25%) de la variable es 60, es decir, que el 25% de los datos son iguales o menores a este valor.
- La mediana de la variable es 70, que corresponde al valor que se encuentra justo en el medio de los datos cuando se ordenan de menor a mayor. Lo que quiere decir, que el 50% de los datos son iguales o menores a este valor.
- La media (promedio) de la variable es 75.48.
- El tercer cuartil (75%) de la variable es 84, es decir, que el 75% de los datos son iguales o menores a este valor.
- El valor máximo en la variable es 200.
- En relación con la desviación estándar, se observa un valor de 22.56461 . Cabe mencionar, que esta es una medida de dispersión que indica cuanto se alejan los valores de la variable de su promedio. Por lo tanto, este valor significa que, en promedio, los valores de la variable precio tienden a estar a unos 22.56461 m2 de distancia con respecto a la media.
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 (area construida). Incluir gráficos e indicadores apropiados interpretados:
A continuación, se presentan gráficos de análisis bivariado de las variables precio y área construida:
# Gráfico 1: Gráfico de dispersión precio vs área
library(ggplot2)
ggplot(vivienda_apartamentos, aes(x = areaconst, y = preciom)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE, color = "blue") + # Agregar la línea de tendencia
labs(title = "Gráfico de Dispersión con Línea de Tendencia: Precio vs Área Construida",
x = "Área Construida (metros cuadrados)",
y = "Precio (millones de pesos COP)")
## `geom_smooth()` using formula = 'y ~ x'
A continuación, se calcula el índice de correlación de Pearson:
# Cálculo del coeficiente de correlación Pearson
correlation <- cor(vivienda_apartamentos$preciom, vivienda_apartamentos$areaconst)
correlation
## [1] 0.7481389
Estime el modelo de regresión lineal simple entre precio=f(area)+ε . Interprete los coeficientes del modelo β0 , β1 en caso de ser correcto.
# Paso 3: Estimación del modelo de regresión lineal simple
modelo <- lm(preciom ~ areaconst, data = vivienda_apartamentos)
summary(modelo)
##
## Call:
## lm(formula = preciom ~ areaconst, data = vivienda_apartamentos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -225.404 -23.902 -4.754 25.763 209.021
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 39.04679 4.09977 9.524 <2e-16 ***
## areaconst 2.16473 0.05204 41.595 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 43.34 on 1361 degrees of freedom
## Multiple R-squared: 0.5597, Adjusted R-squared: 0.5594
## F-statistic: 1730 on 1 and 1361 DF, p-value: < 2.2e-16
El modelo de regresión lineal simple se expresa así:
precio=β0 + β1*areaconst + ε
Donde, β0= intercepto o la constante,
β1= coeficiente de la variable independiente areaconst,
ε= error aleatorio.
En relación con el análisis de los coeficientes del modelo β0 , β1, se destaca la siguiente información:
1. Intercepto (β0):
El valor del intercepto (β0) es 39.04679.
Este valor representa el precio estimado de una vivienda cuando el área construida (areaconst) es igual a cero. Sin embargo, este caso no tiene sentido, dado que el área construida nunca sería igual a cero en la base de datos. Por lo tanto, el intercepto puede no tener una interpretación práctica directa.
2. Coeficiente de β1 (areaconst):
El valor de β1 es 2.16473.
Este coeficiente representa el cambio esperado en el precio por cada unidad adicional de área construida. Es decir, por cada metro cuadrado adicional de área construida, el precio de la vivienda aumenta en promedio en 2.16473 millones de pesos COP.
Teniendo en cuenta que el coeficiente es positivo y significativo (p-value < 0.001), se puede concluir que hay una relación positiva entre el área construida y el precio del inmueble. Es decir, que a medida que el área construida aumenta, se espera que el precio de la vivienda suba.
3. Análisis adicionales - Los coeficientes son estadísticamente significativos, dado que los valores de p-value asociados a ambos coeficientes son muy pequeños (p-value < 0.001). Lo cual, permite inferir que la relación entre el precio y el área construida es significativa para el modelo planteado.
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.
Para la construción del intervalo de confianza del 95% para el coeficiente β1 en el modelo de regresión lineal, se utiliza la siguiente fórmula:
Intervalo de Confianza=β^1 ± tα/2 * SE (β^1)
Donde,
β^1= estimado del coeficiente β1 del modelo de regresión lineal,
tα/2= valor crítico de la distribución t de Student con n−2 grados de libertad, donde n es el número de observaciones,
SE (β^1)= error estándar del estimado de β1
# Estimado de beta1 (coeficiente de areaconst)
beta1_estimado <- coef(modelo)["areaconst"]
# Error estándar de beta1
se_beta1 <- summary(modelo)$coef["areaconst", "Std. Error"]
# Calcular el número de observaciones (n)
n <- nrow(vivienda_apartamentos)
# Grados de libertad
grados_libertad <- n - 2 # (número de observaciones - número de coeficientes)
# Valor crítico de t para un intervalo de confianza del 95%
valor_critico_t <- qt(0.975, df = grados_libertad)
# Construir el intervalo de confianza
intervalo_confianza <- beta1_estimado + c(-1, 1) * valor_critico_t * se_beta1
# Imprimir el intervalo de confianza
print(intervalo_confianza)
## [1] 2.062640 2.266826
En relación con el análisis del intervalo de confianza para β1, se observa que este, no incluye el valor de 0, por lo tanto, β1, es significativamente diferente de 0. Lo que permite concluir, que existe una relación directa entre el área construida y el precio de las viviendas.
Por último, se compara este resultado con una prueba de hipótesis t:
Como primera medida, se establece la hipótesis nula:
Hipótesis nula (H0): El coeficiente β1 es igual a 0. H0:β1=0,
Hipótesis alternativa (Ha): El coeficiente β1 es distinto de 0. Ha:β1/=0
# Calcular el valor t
valor_t <- (beta1_estimado - 0) / se_beta1
# Calcular los valores críticos t para un nivel de confianza del 95%
valor_critico_t_izquierda <- qt(0.025, df = grados_libertad)
valor_critico_t_derecha <- qt(0.975, df = grados_libertad)
# Realizar la prueba de hipótesis t
if (valor_t < valor_critico_t_izquierda || valor_t > valor_critico_t_derecha) {
cat("Hipótesis nula (H0) rechazada. Hay evidencia de relación entre areaconst y preciom.")
} else {
cat("No se rechaza la hipótesis nula (H0). No hay evidencia de una relación entre areaconst y preciom.")
}
## Hipótesis nula (H0) rechazada. Hay evidencia de relación entre areaconst y preciom.
# Imprimir el valor t y los valores críticos t
cat("Valor t:", valor_t, "\n")
## Valor t: 41.59515
cat("Valor Crítico t (Izquierda):", valor_critico_t_izquierda, "\n")
## Valor Crítico t (Izquierda): -1.961709
cat("Valor Crítico t (Derecha):", valor_critico_t_derecha, "\n")
## Valor Crítico t (Derecha): 1.961709
Por lo tanto, y teniendo en cuenta que el valor de t no está dentro de los rangos críticos, se rechaza la hipótesis nula y se concluye que hay evidencia significativa de la relación entre el área construida y el precio de las viviendas de la población de estudio.
Calcule e interprete el indicador de bondad R2.
Interpretación R2
El coeficiente de determinación (R-cuadrado ajustado) es 0.5594. Es decir, que el 55.94% de la variabilidad en el precio de la vivienda se explica por la variabilidad en el área construida.
Por lo tanto, el modelo explica un porcentaje admisible la variación en el precio de las viviendas en función del área construida.
Teniendo en cuenta que el valor de R2 no es cercano a 1, se entiende que aún existe una cantidad significativa de variabilidad en el precio que no puede ser explicado por el modelo. Es decir, que no se consideran otros factores que pueden estar contribuyendo a esta variabilidad. Por lo tanto, recomendamos la inclusión de otros variables de interés que puedan afectar el precio de la vivienda para futuros estudios.
¿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?.
A continuación, se presenta la estimación del valor del precio promedio para un apartamento de 110 m2 utilizando el modelo de regresión lineal simple presentado en la sección anterior (función definida en la sección 4.3):
# Área construida de 110 m2
area_const <- 110
# Calcular el precio estimado utilizando el modelo
precio_estimado_110 <- coef(modelo)["(Intercept)"] + coef(modelo)["areaconst"] * area_const
# Imprimir el precio estimado
cat("El Precio estimado para un apartamento de 110 metros cuadrados con base en el modelo de regresión lineal es de:", precio_estimado_110, "millones de pesos COP\n")
## El Precio estimado para un apartamento de 110 metros cuadrados con base en el modelo de regresión lineal es de: 277.1674 millones de pesos COP
En relación con la evaluación de conveniencia, y teniendo en cuenta que el valor estimado obtenido es de 277 millones de pesos COP, un apartamento en la misma zona con 110 metros cuadrados y un precio de 200 millones de pesos COP sería una oferta atractiva para ustedes como agentes inmobiliarios, dado que podrían comprarlo por debajo del valor promedio para un posterior venta a mayor precio y obtener un margen de ganancia considerable.
De igual manera, es importante mencionar que esta oferta se puede considerar competitiva en función de los resultados del modelo, pero se deben tener en cuenta otras consideraciones, como la ubicación, cantidad de parqueaderos, cantidad de baños, demanda en el mercado, que le permitan añadir variables para determinar un análisis más completo antes de tomar una decisión de compra o inversión.
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.
Para determinar la validación de los supuestos del modelo de regresión lineal planteado, se considera importante realizar un análisis de diagnóstico que incluya la revisión de gráficos y pruebas de hipótesis. Por lo tanto, es importante validar los siguientes conceptos:
Linealidad: La relación entre la variable independiente (en este caso, areaconst) y la variable dependiente (preciom) debe ser aproximadamente lineal.
Normalidad de los Residuales: Los residuales del modelo deben seguir una distribución normal.
Homocedasticidad: La varianza de los residuales debe ser constante a lo largo de todos los valores de la variable independiente.
Por lo tanto, se presentan los gráficos que permitirán los correspondientes análisis:
library(lmtest,warn.conflicts = FALSE)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(car,warn.conflicts = FALSE)
## Loading required package: carData
# Supuesto 1: Linealidad (Gráfico de dispersión de los residuales vs. valores ajustados)
plot(modelo, which = 1)
El Gráfico de dispersión de los residuales vs. valores ajustados se utiliza para evaluar el supuesto de linealidad del modelo y detectar patrones no lineales en los residuales.
Eje X (Valores Ajustados): valores ajustados o predichos por el modelo para la variable dependiente (preciom).
Eje Y (Residuales): Valores residuales, que son las diferencias entre los valores observados reales y los valores predichos por el modelo.
Si los puntos en el gráfico están dispersos aleatoriamente alrededor de una línea horizontal centrada en cero (el eje Y), esto sugiere que el supuesto de linealidad está satisfecho. Para este caso, no se observan patrones de comportamiento en la relación entre los valores ajustados y los residuales.
– Validación normalidad de residuales
# Supuesto 2: Normalidad de los Residuales (Prueba de normalidad Shapiro-Wilk)
shapiro.test(resid(modelo))
##
## Shapiro-Wilk normality test
##
## data: resid(modelo)
## W = 0.96486, p-value < 2.2e-16
Si el supuesto de normalidad de los residuales se viola (la prueba Shapiro-Wilk arroja un valor significativo), se puede considerar transformar la variable dependiente.
W (Estadístico de Shapiro-Wilk): El valor de W es una estadística de prueba que se utiliza para determinar si los residuales siguen una distribución normal. W= 0.96486.
p-value (Valor p): El valor p es una medida de la evidencia en contra de la hipótesis nula de que los residuales siguen una distribución normal. Valor p < 2.2e-16.
En este caso, el valor de W es cercano a 1, lo que sugiere que los residuales pueden seguir una distribución normal. Sin embargo, se debe tener en cuenta la interpretación del resultado del valor p.
El valor p es prácticamente cero, lo que indica que hay evidencia en contra de la hipótesis nula de normalidad. Es decir, los residuales no siguen una distribución normal.
Dado el valor p, la recomendación, sería rechazar la hipótesis nula de normalidad, es decir, que los valores residuales no son normalmente distribuidos.
Teniendo en cuenta lo anterior, el resultado de la prueba de Shapiro-Wilk sugiere que los residuales del modelo no siguen una distribución normal, lo que puede indicar que el modelo de regresión lineal simple puede no ser el adecuado para describir la relación entre las variables.
Por último, se recomienda el uso de transformaciones de variables.
– Validación Homocedasticidad
# Supuesto 3: Homocedasticidad (Gráfico de dispersión de los residuales estandarizados vs. valores ajustados)
plot(modelo, which = 3)
# Prueba de Breusch-Pagan para homocedasticidad
bptest(modelo)
##
## studentized Breusch-Pagan test
##
## data: modelo
## BP = 292.99, df = 1, p-value < 2.2e-16
En este gráfico, los valores ajustados se representan en el eje X, y los residuales estandarizados (residuales divididos por su desviación estándar) se representan en el eje Y.Estos últimos, están diseñados para tener una varianza constante si se cumple el supuesto de homocedasticidad.
Si los puntos se dispersan aleatoriamente alrededor de una línea horizontal (sin un patrón claro), esto sugiere que se cumple el supuesto de homocedasticidad, lo que significa que la varianza de los residuales es constante en todos los niveles de valores ajustados.
Si el supuesto de homocedasticidad se viola (por ejemplo, si el gráfico de dispersión de residuales estandarizados muestra un patrón de cono), se recomienda la aplicación de transformación de variables.
El resultado del test de Breusch-Pagan (el valor p es prácticamente cero) indica evidencia significativa en contra de la hipótesis nula de homocedasticidad. Lo anterior, que confirma la violación del supuesto.
En resumen, el supuesto de homocedasticidad se viola en el modelo de regresión planteado en la sección 4.3.
Por último, se recomienda el uso de transformaciones de variables.
Punto 4.8: De ser necesario realice una transformación apropiada para mejorar el ajuste y supuestos del modelo.
Punto 4.9: Compare el ajuste y supuestos del modelo inicial y el transformado.
Teniendo en cuenta que los supuestos del modelo de regresión lineal se violan, se plantea la siguiente transformación en las variables en la búsqueda de mejorar el ajuste y los supuestos del modelo: Logarítmica.
–Transformación logarítmica
# Transformación logarítmica de precio
vivienda_apartamentos$log_precio <- log(vivienda_apartamentos$preciom)
# Transformación logarítmica de área construida
vivienda_apartamentos$log_areaconst <- log(vivienda_apartamentos$areaconst)
# Ajustar el modelo con la transformación logarítmica
modelo_log <- lm(log_precio ~ log_areaconst, data = vivienda_apartamentos)
# Supuesto 1: Linealidad (Gráfico de dispersión de los residuales vs. valores ajustados)
plot(modelo_log, which = 1)
# Supuesto 2: Normalidad de los Residuales (Prueba de normalidad Shapiro-Wilk)
shapiro.test(resid(modelo_log))
##
## Shapiro-Wilk normality test
##
## data: resid(modelo_log)
## W = 0.98958, p-value = 2.857e-08
# Supuesto 3: Homocedasticidad (Prueba de Breusch-Pagan para homocedasticidad)
bptest(modelo_log)
##
## studentized Breusch-Pagan test
##
## data: modelo_log
## BP = 92.877, df = 1, p-value < 2.2e-16
A continuación, se realizan los análisis para que se interpreten cada una de las validaciones de supuestos del modelo transformado:
Linealidad: Si los puntos en los gráficos están dispersos aleatoriamente alrededor de una línea horizontal centrada en cero (el eje Y), se sugiere que el supuesto de linealidad está satisfecho. Para este caso, no se observan patrones de comportamiento en la relación entre los valores ajustados y los residuales.
Normalidad de residuales: Teniendo en cuenta que el valore p (p-value) obtenido de la prueba de normalidad Shapiro-Wilk es aproximadamente 0, se sigue manteniendo la premisa que los valores residuales no son normalmente distribuidos.
Homocedasticidad: Teniendo en cuenta el valore p (p-value) obtenido de la prueba Breusch-Pagan es aproximadamente 0, se sigue manteniendo la premisa en contra de la hipótesis nula de homocedasticidad.
– Comparación de modelo inicial y transformación
Para este caso, se presenta el resumen de los modelos:
# Comparación de modelos
summary(modelo)
##
## Call:
## lm(formula = preciom ~ areaconst, data = vivienda_apartamentos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -225.404 -23.902 -4.754 25.763 209.021
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 39.04679 4.09977 9.524 <2e-16 ***
## areaconst 2.16473 0.05204 41.595 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 43.34 on 1361 degrees of freedom
## Multiple R-squared: 0.5597, Adjusted R-squared: 0.5594
## F-statistic: 1730 on 1 and 1361 DF, p-value: < 2.2e-16
summary(modelo_log)
##
## Call:
## lm(formula = log_precio ~ log_areaconst, data = vivienda_apartamentos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.8890 -0.1119 0.0028 0.1343 0.7538
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.48373 0.08703 17.05 <2e-16 ***
## log_areaconst 0.88175 0.02026 43.52 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1914 on 1361 degrees of freedom
## Multiple R-squared: 0.5819, Adjusted R-squared: 0.5816
## F-statistic: 1894 on 1 and 1361 DF, p-value: < 2.2e-16
Para la comparación de los modelos, se presenta el siguiente resumen con las variables de comparación más relevantes:
Teniendo en cuenta lo anterior, la selección de un modelo preferencial, bajo la comparación de los datos descritos,se ejecuta por medio de la selección del modelo con mayor R-cuadrado ajustado, que para este caso, es el modelo logarítmico.
Estime varios modelos y compare los resultados obtenidos. En el mejor de los modelos, ¿se cumplen los supuestos sobre los errores?
Adicional a la transformación establecida, se presentan dos casos más: Raíz cuadrada y Recíproca.
–Transformación Raíz cuadrada
# Transformación de raíz cuadrada de precio
vivienda_apartamentos$sqrt_precio <- sqrt(vivienda_apartamentos$preciom)
# Transformación de raíz cuadrada de área construida
vivienda_apartamentos$sqrt_areaconst <- sqrt(vivienda_apartamentos$areaconst)
# Ajustar el modelo con la transformación de raíz cuadrada
modelo_sqrt <- lm(sqrt_precio ~ sqrt_areaconst, data = vivienda_apartamentos)
# Supuesto 1: Linealidad (Gráfico de dispersión de los residuales vs. valores ajustados)
par(mfrow = c(2, 2))
plot(modelo_sqrt)
# Supuesto 2: Normalidad de los Residuales (Prueba de normalidad Shapiro-Wilk)
shapiro.test(resid(modelo_sqrt))
##
## Shapiro-Wilk normality test
##
## data: resid(modelo_sqrt)
## W = 0.98639, p-value = 5.39e-10
# Supuesto 3: Homocedasticidad (Prueba de Breusch-Pagan para homocedasticidad)
bptest(modelo_sqrt)
##
## studentized Breusch-Pagan test
##
## data: modelo_sqrt
## BP = 197.45, df = 1, p-value < 2.2e-16
summary(modelo_sqrt)
##
## Call:
## lm(formula = sqrt_precio ~ sqrt_areaconst, data = vivienda_apartamentos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.0131 -0.8126 -0.0797 0.9305 5.2401
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.14048 0.28082 7.622 4.65e-14 ***
## sqrt_areaconst 1.38521 0.03232 42.856 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.41 on 1361 degrees of freedom
## Multiple R-squared: 0.5744, Adjusted R-squared: 0.5741
## F-statistic: 1837 on 1 and 1361 DF, p-value: < 2.2e-16
–Transformación recíproco
# Transformación recíproca de precio
vivienda_apartamentos$reciproco_precio <- 1/vivienda_apartamentos$preciom
# Transformación recíproca de área construida
vivienda_apartamentos$reciproco_areaconst <- 1 / vivienda_apartamentos$areaconst
# Ajustar el modelo con la transformación recíproca
modelo_reciproco <- lm(reciproco_precio ~ reciproco_areaconst, data = vivienda_apartamentos)
# Supuesto 1: Linealidad (Gráfico de dispersión de los residuales vs. valores ajustados)
par(mfrow = c(2, 2))
plot(modelo_reciproco)
# Supuesto 2: Normalidad de los Residuales (Prueba de normalidad Shapiro-Wilk)
shapiro.test(resid(modelo_reciproco))
##
## Shapiro-Wilk normality test
##
## data: resid(modelo_reciproco)
## W = 0.96427, p-value < 2.2e-16
# Supuesto 3: Homocedasticidad (Prueba de Breusch-Pagan para homocedasticidad)
bptest(modelo_reciproco)
##
## studentized Breusch-Pagan test
##
## data: modelo_reciproco
## BP = 0.4984, df = 1, p-value = 0.4802
summary(modelo_reciproco)
##
## Call:
## lm(formula = reciproco_precio ~ reciproco_areaconst, data = vivienda_apartamentos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.0040604 -0.0006786 -0.0001167 0.0005261 0.0054855
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.0004085 0.0001190 3.433 0.000614 ***
## reciproco_areaconst 0.3520871 0.0081927 42.976 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.0009848 on 1361 degrees of freedom
## Multiple R-squared: 0.5757, Adjusted R-squared: 0.5754
## F-statistic: 1847 on 1 and 1361 DF, p-value: < 2.2e-16
En relación a la comparación de estos dos modelos transformados, se tiene el siguiente resumen: