Realice un filtro a la base de datos e incluya sólo las ofertas de apartamentos. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta.
En este primer paso cargamos la base de datos que contiene 5100 registros y 13 variables.
# Filtrar la base de datos para obtener solo apartamentos
vivienda <- vivienda %>%
filter(tipo == "Apartamento")
# Mostrar el resultado
head(vivienda, 3)# Dimensiones de la base de datos
dim_vivienda <- dim(vivienda)
n_rows <- dim_vivienda[1]
n_cols <- dim_vivienda[2]
# Resumen de la información
summary_info <- data.frame(
Descripción = c("Número de filas", "Número de columnas"),
Cantidad = c(n_rows, n_cols)
)
# Mostrar la tabla del tamaño
kable(summary_info) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| Descripción | Cantidad |
|---|---|
| Número de filas | 5100 |
| Número de columnas | 13 |
Para poder aplicar modelos de regresión lineal, se debe garantizar que la base de datos no tenga valores null. El preprocesamiento se orienta únicamente a hacer las imputaciones correspondientes.
na_counts <- colSums(is.na(vivienda))
na_summary <- data.frame(
Variable = names(na_counts),
NAs = na_counts
)
library(knitr)
library(kableExtra)
kable(na_summary) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| Variable | NAs | |
|---|---|---|
| id | id | 0 |
| zona | zona | 0 |
| piso | piso | 1381 |
| estrato | estrato | 0 |
| preciom | preciom | 0 |
| areaconst | areaconst | 0 |
| parqueaderos | parqueaderos | 869 |
| banios | banios | 0 |
| habitaciones | habitaciones | 0 |
| tipo | tipo | 0 |
| barrio | barrio | 0 |
| longitud | longitud | 0 |
| latitud | latitud | 0 |
######3.1 convertir variables categóricas a numéricas ######
vivienda$piso <- as.numeric(as.character(vivienda$piso))
vivienda$barrio_num <- as.numeric(factor(vivienda$barrio))
vivienda$zona_num <- as.numeric(factor(vivienda$zona))
######3.2 Imputar la variable piso con el paquete mice ######
# Crear un conjunto de datos con las variables relevantes para la imputación
data_impute <- vivienda[, c("estrato", "preciom", "areaconst", "banios", "habitaciones", "barrio_num", "zona_num", "piso")]
# Realizar la imputación utilizando el método MICE (Multiple Imputation by Chained Equations)
set.seed(123) # Establece una semilla para la reproducibilidad
imputed_data <- mice(data_impute, method = "pmm", m = 5, maxit = 50, printFlag = FALSE)
# Combinar los conjuntos de datos imputados en un único conjunto de datos
imputed_data_complete <- complete(imputed_data)
# Agregar la columna imputada "piso_imp" a la tabla vivienda
vivienda$piso <- imputed_data_complete$piso
# Ver el resultado
na_piso <- sum(is.na(vivienda$piso))
print(paste("Cantidad de NAs en la variable 'piso':", na_piso))## [1] "Cantidad de NAs en la variable 'piso': 0"
######Imputar los valores NA de la variable parquea con ceros
vivienda$parqueaderos <- replace(vivienda$parqueaderos, is.na(vivienda$parqueaderos), 0)
na_parquea <- sum(is.na(vivienda$parqueaderos))
# Ver el resultado
na_piso <- sum(is.na(vivienda$parqueaderos))
print(paste("Cantidad de NAs en la variable 'Parqueaderos':", na_piso))## [1] "Cantidad de NAs en la variable 'Parqueaderos': 0"
rm(barrio_frec, na_values, tabla_na, vivienda_con_duplicados, data_impute, imputed_data, imputed_data_complete) # borrado de tablas que no se usanEn resumen, en esta sección de preparación de las bases de datos, se imputaron valores faltantes en parqueaderos y piso.
Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.
Se crea una nueva tabla eliminando las variables que no le aportarán al modelado: estas son tipo, barrio, latitud, longitud, id.
# Crear la nueva tabla vivienda_work
vivienda_work <- vivienda[, c("id", "piso", "estrato", "areaconst", "parqueaderos", "preciom", "banios", "habitaciones", "zona_num")]
vivienda_work# gráfico para 'areaconst'
box1 <- plot_ly(data = vivienda_work, y = ~preciom, x = ~areaconst, type = "box") %>%
layout(title = "Área Construida vs Precio",
xaxis = list(title = "Área Construida"),
yaxis = list(title = "Precio"))
# gráfico para 'estrato'
box2 <- plot_ly(data = vivienda_work, y = ~preciom, x = ~estrato, type = "box") %>%
layout(title = "Estrato vs Precio",
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio"))
# Grafico para 'banios'
box3 <- plot_ly(data = vivienda_work, y = ~preciom, x = ~banios, type = "box") %>%
layout(title = "Baños vs Precio",
xaxis = list(title = "Baños"),
yaxis = list(title = "Precio"))
# gráfico para 'habitaciones'
box4 <- plot_ly(data = vivienda_work, y = ~preciom, x = ~habitaciones, type = "box") %>%
layout(title = "Habitaciones vs Precio",
xaxis = list(title = "Habitaciones"),
yaxis = list(title = "Precio"))
# Gráfico para 'zona_num'
box5 <- plot_ly(data = vivienda_work, y = ~preciom, x = ~zona_num, type = "box") %>%
layout(title = "Zona vs Precio",
xaxis = list(title = "Zona"),
yaxis = list(title = "Precio"))
# Organizar todos los gráficos en una grilla (2 filas, 3 columnas para ajustar todos)
grid <- subplot(box1, box2, box3, box4, box5,
nrows = 3,
shareX = FALSE,
shareY = TRUE,
titleX = TRUE,
titleY = TRUE)
# Mostrar la grilla
gridSe explican a continuación los gráficos:
Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).
vivienda_work$estrato <- as.factor(vivienda_work$estrato) # Asegurarse de que estrato es un factor
dummies <- model.matrix(~ estrato - 1, data = vivienda_work) # -1 para no incluir intercepto
# Añadir las variables dummy al dataframe original
vivienda_work <- cbind(vivienda_work, dummies)# Ajustar el modelo de regresión lineal múltiple
modelo <- lm(preciom ~ areaconst + estrato3 + estrato4 + estrato5 + estrato6 + habitaciones + banios, data = vivienda_work)
# Resumen del modelo
summary(modelo)##
## Call:
## lm(formula = preciom ~ areaconst + estrato3 + estrato4 + estrato5 +
## estrato6 + habitaciones + banios, data = vivienda_work)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1925.63 -48.37 -0.36 42.36 979.54
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 205.28125 10.61205 19.34 <2e-16 ***
## areaconst 2.27234 0.04083 55.65 <2e-16 ***
## estrato3 -217.30955 8.23556 -26.39 <2e-16 ***
## estrato4 -197.64917 6.45149 -30.64 <2e-16 ***
## estrato5 -162.94739 5.59533 -29.12 <2e-16 ***
## estrato6 NA NA NA NA
## habitaciones -36.12829 3.30160 -10.94 <2e-16 ***
## banios 57.62116 2.98961 19.27 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 133.5 on 5093 degrees of freedom
## Multiple R-squared: 0.7873, Adjusted R-squared: 0.787
## F-statistic: 3141 on 6 and 5093 DF, p-value: < 2.2e-16
Intercepto (205.28): indica el valor promedio de precio cuando todas las variables independientes son cero. En la práctica, esto puede no ser muy interpretativo ya que cero puede no ser un valor plausible para variables como areaconst, habitaciones y banios.
Área Construida (areaconst): Coeficiente: 2.27 Por cada unidad adicional en el área construida (areaconst), el precio del apartamento (preciom) aumenta en promedio 2.27 millones, manteniendo constantes todas las demás variables. Este coeficiente es estadísticamente significativo (p < 2e-16), lo que sugiere que la relación entre areaconst y preciom no es debida al azar.
Estrato 3 (estrato3): Coeficiente: -217.31 Los apartamentos en el estrato 3 tienen un precio promedio 217.31 millones de pesos menor que el estrato base que sería el estrato 6, manteniendo constantes todas las demás variables. El coeficiente es estadísticamente significativo (p < 2e-16).
Estrato 4 (estrato4): Coeficiente: -197.65 Los apartamentos en el estrato 4 tienen un precio promedio 197.65 millones de pesos menor que el estrato base, manteniendo constantes todas las demás variables. Este coeficiente es estadísticamente significativo (p < 2e-16).
Estrato 5 (estrato5): Coeficiente: -162.95 Los apartamentos en el estrato 5 tienen un precio promedio 162.95 millones menor que el estrato base, manteniendo constantes todas las demás variables. Este coeficiente es estadísticamente significativo (p < 2e-16).
Estrato 6 (estrato6): Los coeficientes no están definidos (NA) debido a singularidades, lo que ocurre cuando hay colinealidad perfecta u otra razón que hace que esta variable no se estime. Esta variable está combinada con las tres variables dummy de estrato (estrato3, estrato4 y estrato5), y está absorbiendo toda la variabilidad. Se eliminará para obtener las métricas del modelo y la validación de los supuestos.
Número de Habitaciones (habitaciones): Coeficiente: -36.13 Contrario a lo esperado, por cada habitación adicional, el precio del apartamento decrece en 36.13 millones, manteniendo constantes todas las demás variables. Este coeficiente es estadísticamente significativo (p < 2e-16), aunque el resultado es ilógico y podría indicar un problema de multicolinealidad o alguna otra cuestión en los datos.
Número de Baños (banios): Coeficiente: 57.62 Por cada baño adicional, el precio del apartamento aumenta en promedio 57.62 millones de pesos, manteniendo constantes todas las demás variables. Este coeficiente es estadísticamente significativo (p < 2e-16).
R-cuadrado ajustado (0.787): Indica que aproximadamente el 78.7% de la variabilidad en el preciom es explicada por las variables independientes del modelo. Este valor sugiere que el modelo tiene un buen ajuste a los datos.
Error estándar residual (133.5): Mide la cantidad de variabilidad en los datos que el modelo no explica. Un valor más bajo indicaría un mejor ajuste.
El efecto positivo del área construida (areaconst) tiene sentido porque un área construida más grande generalmente estaría asociada con propiedades de mayor valor.
La presencia de efectos negativos para estrato3, estrato4 y estrato5 también podría indicar una comparación con el estrato base que posiblemente sea un estrato más alto o más deseable, lo que es coherente si se asume que el estrato base es el estrato 6.
El efecto negativo de habitaciones es inusual y puede sugerir problemas de multicolinealidad. Otra posibilidad es que las habitaciones adicionales estén asociadas con un tipo de inmueble específico que tiende a ser más barato, pero esta interpretación debe ser confirmada mirando los datos más detenidamente.
El efecto positivo del número de baños es coherente con la expectativa de que más baños incrementan el confort y el precio de una propiedad.
Dada la anomalía con las habitaciones, sería prudente realizar un análisis adicional para examinar la colinealidad entre las variables, así como posibles interacciones o segmentaciones dentro de los datos que podrían estar influyendo en estos resultados.
Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer).
La colinealidad entre variables en un modelo de regresión lineal multivariado es la existencia de una alta correlación entre las variables independientes o predictoras. Esto hace que sea difícil o imposible estimar de forma confiable los coeficientes de regresión individuales de las variables
La prueba de factor de inflación de la varianza (VIF) es un método estadístico que se utiliza para detectar la multicolinealidad en un análisis de regresión de mínimos cuadrados. Los valores de VIF mayores a 5 o 10 indican colinealidad alta y deben ser investigados.
# Ajustar el modelo de regresión lineal múltiple sin la variable estrato6
modelo_mod <- lm(preciom ~ areaconst + estrato3 + estrato4 + estrato5 + habitaciones + banios, data = vivienda_work)
# Resumen del nuevo modelo
summary(modelo_mod)##
## Call:
## lm(formula = preciom ~ areaconst + estrato3 + estrato4 + estrato5 +
## habitaciones + banios, data = vivienda_work)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1925.63 -48.37 -0.36 42.36 979.54
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 205.28125 10.61205 19.34 <2e-16 ***
## areaconst 2.27234 0.04083 55.65 <2e-16 ***
## estrato3 -217.30955 8.23556 -26.39 <2e-16 ***
## estrato4 -197.64917 6.45149 -30.64 <2e-16 ***
## estrato5 -162.94739 5.59533 -29.12 <2e-16 ***
## habitaciones -36.12829 3.30160 -10.94 <2e-16 ***
## banios 57.62116 2.98961 19.27 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 133.5 on 5093 degrees of freedom
## Multiple R-squared: 0.7873, Adjusted R-squared: 0.787
## F-statistic: 3141 on 6 and 5093 DF, p-value: < 2.2e-16
## areaconst estrato3 estrato4 estrato5 habitaciones banios
## 2.295373 2.127836 2.377050 2.028739 1.425481 2.921282
Al revisar los resultados, se determina colinealidad moderada pues presenta valores menores a 3.
La homocedasticidad y la heterocedasticidad son conceptos estadísticos que se refieren a la varianza de los errores en un modelo lineal: Homocedasticidad: Se dice que un modelo lineal es homocedástico cuando la varianza de los errores es la misma en todas las muestras. Esto significa que los residuos se distribuyen de manera homogénea para todos los valores de la variable de predicción. Heterocedasticidad: Un modelo lineal es heterocedástico cuando la varianza de los errores no es la misma en todas las muestras.
A continuación se harán las pruebas de heterocedasticidad, por el método gráfico y la prueba de Breusch-Pagan
Distribución de los Residuos:
Idealmente, los residuos (puntos) deben estar distribuidos aleatoriamente alrededor de la línea horizontal (0 Residuals), sin patrones claros. Esto indicaría homocedasticidad, es decir, la varianza constante de los errores del modelo para todas las observaciones.
El gráfico presenta algunos patrones que deben ser analizados:
Varianza creciente: Observamos que a medida que aumentan los valores ajustados (fitted values), también parece aumentar la dispersión de los residuos. Esto indica que hay heterocedasticidad y sugiere que la varianza de los errores no es constante.
Concentración de residuos en la parte central: La mayoría de los residuos están concentrados alrededor de la línea central cuando los valores ajustados son bajos a medios, pero la varianza aumenta con los valores ajustados más altos.
Línea Roja (Locally Weighted Scatterplot Smoothing, LOESS): La línea roja suavizada en el gráfico debería idealmente ser horizontal y quedar cerca de la línea cero si el modelo es adecuado. En el gráfico, es visible que la línea roja tiende a inclinarse hacia arriba a medida que los valores ajustados aumentan. Esto confirma evidencia de heterocedasticidad y puede sugerir problemas con la adecuación del modelo.
Valores atípicos (Outliers): Los datos identificados con números (1563, 4979, 4567) son posibles valores atípicos. Existen valores de residuos extremos que pueden afectar la precisión y validación del modelo.
##
## studentized Breusch-Pagan test
##
## data: modelo_mod
## BP = 1465.2, df = 6, p-value < 2.2e-16
Resultados: df = 6: Los grados de libertad de la prueba, que corresponden al número de variables explicativas en el modelo. p-value < 2.2e-16: El valor p es extremadamente pequeño.
Conclusión Valor p extremadamente pequeño (< 2.2e-16): Esto indica que rechazamos la hipótesis nula de homocedasticidad con un alto nivel de confianza. Por lo tanto, podemos concluir que hay heterocedasticidad en los residuos del modelo.
El Q-Q (Quantile-Quantile) plot es una herramienta gráfica que ayuda a evaluar si los residuos del modelo de regresión siguen una distribución normal
library(nortest)
# Prueba de Kolmogorov-Smirnov para normalidad
ks.test(residuals(modelo_mod), "pnorm", mean = mean(residuals(modelo_mod)), sd = sd(residuals(modelo_mod)))##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: residuals(modelo_mod)
## D = 0.16055, p-value < 2.2e-16
## alternative hypothesis: two-sided
Conclusiones
Análisis gráfico:
Normalidad de los Residuos: La mayor parte de los residuos centrales parece seguir una distribución normal, pero las claras desviaciones en los extremos indican que en general, los residuos no son perfectamente normales. Si las desviaciones de la normalidad son significativas, pueden impactar los resultados de los tests de significancia y las predicciones del modelo.
Valor Atípico (Outliers): Los valores claramente desviados del patrón cuadrático en los extremos sugieren que hay outliers que podrían estar afectando el desempeño del modelo. Se recomienda investigar estos outliers para ver si deben ser tratados (por ejemplo, mediante la eliminación, transformación de variables, o el uso de métodos robustos).
Test de Kolomorov-Smirnov (K-S): esta prueba se utiliza para comparar la distribución de los residuos con una distribución normal teórica Dado que el valor p es extremadamente pequeño, se rechaza la hipótesis nula de que los residuos siguen una distribución normal. Esto es consistente con la observación en el Q-Q plot anterior, donde los residuos no siguen una línea diagonal perfecta y hay desviaciones significativas en los extremos.
La prueba de Durbin-Watson (DW) se utiliza para detectar la presencia de autocorrelación en los residuos de un modelo de regresión
##
## Durbin-Watson test
##
## data: modelo_mod
## DW = 1.7435, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
Rechazo de la Hipótesis Nula: el valor p es extremadamente pequeño y el valor DW de 1.7435 indican que existe una autocorrelación positiva significativa en los residuos.
Los gráficos “Component + Residual” (crPlots) permiten evaluar la linealidad de la relación entre cada predictor y la variable de respuesta, ajustando por el efecto de otras variables en el modelo.
Gráfico “areaconst” Comportamiento General: La relación entre areaconst y los residuos parece ser aproximadamente lineal, lo cual es bueno. La línea magenta (LOESS) sigue una pendiente positiva, sugiriendo que areaconst tiene una relación positiva con preciom. Potenciales Desviaciones: En los extremos (valores muy altos de areaconst), hay algunos puntos que se alejan más de la línea ajustada, lo que puede indicar la presencia de algunos outliers. Sin embargo, la linealidad sigue siendo bastante clara.
Gráfico “estrato3” Muestra una desviación de la linealidad. La línea magenta tiene una forma curva, lo que indica que la relación entre estrato3 y preciom no puede ser bien capturada solo por una relación lineal. La línea azul punteada (la relación lineal ajustada) se desvia significativamente de la curva magenta, lo que sugiere que la linealidad es un mal ajuste para estrato3.
Gráfico “estrato4” Este gráfico muestra una relación casi plana, lo que podría sugerir que estrato4 no tiene un efecto significativo en preciom una vez que se ajustan las otras variables. La línea magenta sugiere una ligera curva, pero dada la amplitud del eje y, no es claro si esto es significativo.
Gráfico “estrato5” Similar a estrato4, la relación parece ser casi plana. La línea magenta y la azul punteada están alineadas indicando una falta de relación significativa no capturable por linealidad.Podría no ser una variable fuertemente predictiva de preciom.
Gráfico “habitaciones” Este gráfico muestra una ligera curva en la línea magenta, lo que sugiere que la relación entre habitaciones y preciom puede no ser perfectamente lineal. La presencia de valores atípicos también afecta la línea. La relación lineal puede mejorar con transformaciones adicionales o términos polinomiales.
Gráfico “banios” Aquí también existe una ligera curvatura en la línea magenta, sugiriendo que la relación puede no ser perfectamente lineal. La línea azul punteada sigue la línea magenta bastante bien, indicando que aunque hay una desviación,
Basado en los resultados y análisis de los diferentes diagnósticos realizados (gráficos diagnósticos, pruebas estadísticas y crPlots), se harán las siguientes sugerencias y recomendaciones para mejorar el modelo de regresión lineal múltiple:
Problema Detectado: La prueba de VIF no pudo ser realizada inicialmente debido a problemas de colinealidad perfecta en el modelo (aliased coefficients). Acción Tomada: Se ajustó el modelo excluyendo estrato6, pero se sugiere:
Problema Detectado: La prueba de Breusch-Pagan y el gráfico “Residuals vs Fitted” mostraron evidencia significativa de heterocedasticidad. Sugerencias: Transformación de la Variable Dependiente: Aplicar una transformación logarítmica a la variable dependiente preciom para estabilizar la varianza.
Normalidad de los Residuos Problema Detectado: El Q-Q plot y la prueba de Kolmogorov-Smirnov indicaron que los residuos no siguen una distribución normal. Sugerencias: Transformación de la Variable Dependiente: Usar transformaciones como el logaritmo natural para mejorar la normalidad de los residuos. Revisar Outliers: Identificar y ajustar los outliers que están afectando la normalidad y los resultados del modelo.
Autocorrelación de los Residuos Problema Detectado: La prueba de Durbin-Watson mostró evidencias de autocorrelación positiva significativa en los residuos. Sugerencias: Modelos con Términos Autorregresivos: Incluye términos autorregresivos en el modelo si los datos son temporales. Modelos ARIMA: Evalúa el ajuste utilizando modelos ARIMA para datos de series temporales.
Evaluación de Linealidad (crPlots) Problema Detectado: Los crPlots sugieren que ciertos predictores tienen relaciones no lineales con la variable dependiente. Sugerencias: Añadir términos polinomiales para areaconst, habitaciones, y banios. Transformaciones: Considerar aplicar otras transformaciones específicas para variables que no presentan relaciones lineales claras.
Realice una partición en los datos de forma aleatoria donde 70% sea un set para entrenar el modelo y 30% para prueba. Estime el modelo con la muestra del 70%. Muestre los resultados.
Partición de los datos 70-30:
set.seed(123)
index <- createDataPartition(vivienda_work$preciom, p = 0.7, list = FALSE)
train_set <- vivienda_work[index, ]
test_set <- vivienda_work[-index, ]Configuración del control de entrenamiento:
## Linear Regression
##
## 3572 samples
## 8 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 3214, 3214, 3215, 3215, 3214, 3215, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 129.7395 0.7956119 77.10735
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
# Predicciones en el conjunto de prueba
predictions <- predict(modelo_caret, newdata = test_set)
# Cálculo del error cuadrático medio (MSE)
MSE <- mean((predictions - test_set$preciom)^2)
print(paste("MSE de los datos de prueba:", MSE))## [1] "MSE de los datos de prueba: 16625.5159487916"
##
## Call:
## lm(formula = .outcome ~ ., data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1694.53 -49.68 -0.08 41.39 1012.53
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 178.86723 12.57508 14.224 <2e-16 ***
## areaconst 2.02645 0.04851 41.770 <2e-16 ***
## estrato3 -186.21993 9.92653 -18.760 <2e-16 ***
## estrato4 -175.45010 7.70756 -22.763 <2e-16 ***
## estrato5 -156.64954 6.53804 -23.960 <2e-16 ***
## estrato6 NA NA NA NA
## habitaciones -32.98737 3.77196 -8.745 <2e-16 ***
## parqueaderos 53.87499 3.42737 15.719 <2e-16 ***
## banios 42.58355 3.50891 12.136 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 129.1 on 3564 degrees of freedom
## Multiple R-squared: 0.7942, Adjusted R-squared: 0.7938
## F-statistic: 1965 on 7 and 3564 DF, p-value: < 2.2e-16
areaconst.estrato3, comparado probablemente con el
estrato base que no se muestra (posiblemente estrato6),
reduce la variable dependiente en promedio 186.22 unidades.estrato3, tienen efectos negativos significativos, que
varían desde -156.64954 a -175.45010.En general, el modelo muestra un buen ajuste con un alto R-cuadrado ajustado y significancia estadística en la mayoría de los predictores, lo que implica que las variables seleccionadas contribuyen significativamente a explicar la variabilidad de la variable dependiente.
Los valores negativos para los coeficientes de estrato3,
estrato4, y estrato5 podrían indicar que los
estratos más bajos están asociados con menores valores en la variable
dependiente, si asumimos que estrato6 actúa como la
referencia en este caso.
El alto RMSE y MSE en comparación con el R-cuadrado puede ser un indicador de que el modelo podría mejorarse, posiblemente explorando transformaciones de las variables, interacciones entre variables o evaluando la adición o eliminación de predictores para obtener un modelo más parsimonioso y efectivo.
Realice predicciones con el modelo anterior usando los datos de prueba (30%).
# Realizar predicciones con el conjunto de prueba
predicciones <- predict(modelo_caret, newdata = test_set)
# Ver las primeras predicciones
head(predicciones)## 2 3 7 8 15 20
## 281.18212 202.74735 324.89672 68.55202 166.18253 59.88201
Las predicciones varían significativamente entre las observaciones (por ejemplo, desde 59.88201 hasta 324.89672). Estas variaciones pueden estar influenciadas por múltiples factores explicativos en el modelo. Para un análisis más detallado, aquí hay los principales puntos a considerar:
Examinar los valores de las variables explicativas (areaconst, estrato3, estrato4, estrato5, estrato6, habitaciones, parqueaderos, banios) para cada una de estas observaciones para entender por qué sus predicciones pueden ser altas o bajas.
Evaluar la Precisión de las Predicciones: esto se hace comparando estos valores predichos con los valores reales de preciom para evaluar la precisión del modelo. Identificar Outliers:
Determinar si alguna de las observaciones (por ejemplo, las que tienen predicciones extremadamente altas o bajas) representa outliers, o si están influenciadas de manera significativa por valores extremos en las variables explicativas.
Asegurarse de que el modelo es consistente en su predicción y no depende excesivamente de valores particulares de variables.
A continuación se hará la predicción del precio de un apartamento de 150 metros cuadrados de dos habitaciones, un parqueadero y 3 baños. Esta predicción se hará variando el estrato, para ver los efectos de los precios al cambiar el estrato.
library(caret)
# Crear conjuntos de datos con los mismos valores excepto por el estrato:
library(caret)
# Crear conjuntos de datos con los valores constantes excepto por el estrato:
nuevo_dato_estrato3 <- data.frame(
areaconst = 150,
estrato3 = 1,
estrato4 = 0,
estrato5 = 0,
estrato6 = 0,
habitaciones = 2,
parqueaderos = 1,
banios = 3
)
nuevo_dato_estrato4 <- data.frame(
areaconst = 150,
estrato3 = 0,
estrato4 = 1,
estrato5 = 0,
estrato6 = 0,
habitaciones = 2,
parqueaderos = 1,
banios = 3
)
nuevo_dato_estrato5 <- data.frame(
areaconst = 150,
estrato3 = 0,
estrato4 = 0,
estrato5 = 1,
estrato6 = 0,
habitaciones = 2,
parqueaderos = 1,
banios = 3
)
nuevo_dato_estrato6 <- data.frame(
areaconst = 150,
estrato3 = 0,
estrato4 = 0,
estrato5 = 0,
estrato6 = 1,
habitaciones = 2,
parqueaderos = 1,
banios = 3
)
# Hacer predicciones para cada conjunto de datos
pred_estrato3 <- predict(modelo_caret, newdata = nuevo_dato_estrato3)
pred_estrato4 <- predict(modelo_caret, newdata = nuevo_dato_estrato4)
pred_estrato5 <- predict(modelo_caret, newdata = nuevo_dato_estrato5)
pred_estrato6 <- predict(modelo_caret, newdata = nuevo_dato_estrato6)
# Mostrar los resultados
resultados <- data.frame(
Estrato = c('Estrato 3', 'Estrato 4', 'Estrato 5', 'Estrato 6'),
Prediccion = c(round(pred_estrato3, 2), round(pred_estrato4, 2), round(pred_estrato5, 2), round(pred_estrato6, 2))
)
print(resultados)## Estrato Prediccion
## 1 Estrato 3 412.27
## 2 Estrato 4 423.04
## 3 Estrato 5 441.84
## 4 Estrato 6 598.49
Los resultados son consistentes con la realidad, a mayor estrato, mayor precio.
Ahora se hará una prueba de cómo varía el valor de los apartamentos estrato 4 al variar el número de habitaciones. Lo demás permanece constante.
library(caret)
# Crear conjuntos de datos con variación en el número de habitaciones
nuevo_dato_h1 <- data.frame(
areaconst = 150,
estrato3 = 0,
estrato4 = 1,
estrato5 = 0,
estrato6 = 0,
habitaciones = 1,
parqueaderos = 1,
banios = 2
)
nuevo_dato_h2 <- data.frame(
areaconst = 150,
estrato3 = 0,
estrato4 = 1,
estrato5 = 0,
estrato6 = 0,
habitaciones = 2,
parqueaderos = 1,
banios = 2
)
nuevo_dato_h3 <- data.frame(
areaconst = 150,
estrato3 = 0,
estrato4 = 1,
estrato5 = 0,
estrato6 = 0,
habitaciones = 3,
parqueaderos = 1,
banios = 2
)
# Hacer predicciones para cada conjunto de datos
pred_h1 <- predict(modelo_caret, newdata = nuevo_dato_h1)
pred_h2 <- predict(modelo_caret, newdata = nuevo_dato_h2)
pred_h3 <- predict(modelo_caret, newdata = nuevo_dato_h3)
# Mostrar los resultados
resultados_habitaciones <- data.frame(
Habitaciones = c(1, 2, 3),
Prediccion = c(round(pred_h1, 2), round(pred_h2, 2), round(pred_h3, 2))
)
print(resultados_habitaciones)## Habitaciones Prediccion
## 1 1 413.44
## 2 2 380.45
## 3 3 347.46
Al aumentar el número de habitaciones manteniendo las demás variables constantes, se observa que al aumentar las habitaciones, el precio disminuye, lo cual no es coherente. Una hipótesis podría ser que en un tamaño más reducido, las habitaciones resultarían mas pequeñas y el comprador prefiere menos habitaciones pero más espaciosas.
Para el cálculo del Error Cuadrático Medio (MSE), el Error Absoluto Medio (MAE), y R^2:
# Error Cuadrático Medio (MSE)
mse <- mean((predictions - test_set$preciom)^2)
# Error Absoluto Medio (MAE)
mae <- mean(abs(predictions - test_set$preciom))
# R^2
r_squared <- cor(test_set$preciom, predictions)^2Ver los resultados:
## MSE: 16625.52
## MAE: 77.77183
## R^2: 0.8171856
Error Cuadrático Medio (MSE): 16,625.52 El MSE es una medida de la calidad de un estimador; es siempre no negativo, y un valor más bajo es mejor. Un MSE de 16,625.52 implica que, en promedio, los cuadrados de los errores entre las predicciones del modelo y los valores reales son 16,625.52. Este valor es relativamente alto, lo que puede indicar que el modelo tiene errores considerables en algunas predicciones, posiblemente debido a variabilidad en los datos que el modelo no ha logrado capturar, o la presencia de valores atípicos influyentes que distorsionan el error cuadrático.
Error Absoluto Medio (MAE): 77.78 El MAE proporciona una idea del error absoluto medio en las predicciones del modelo. Un MAE de 77.78 indica que, en promedio, el modelo se equivoca por aproximadamente 77.78 unidades al predecir la variable dependiente. Comparado con el MSE, el MAE es menos sensible a los valores extremos, y esta cifra proporciona una comprensión más realista de la magnitud típica de los errores de predicción. Teniendo en cuenta que el precio está en millones de pesos, podría considerar que 77.78 es alto. Esto proporciona un punto de referencia para evaluar y mejorar el modelo.
Coeficiente de Determinación (R^2): 0.8172 El R^2 de 0.8172 significa que aproximadamente el 81.72% de la variabilidad en la variable dependiente (preciom) es explicada por el modelo. Este es un valor bastante alto y sugiere que el modelo, en general, hace un buen trabajo al capturar las relaciones entre las características y el precio de mercado en el conjunto de datos. Un R^2 más cercano a 1 indica que el modelo se ajusta muy bien a los datos de prueba, y en este caso, el modelo parece ser bastante efectivo para explicar la variación en los precios.
Los valores de MSE y MAE indican que, aunque el modelo puede estar cometiendo errores considerables en términos absolutos, el alto valor de R^2 muestra que el modelo explica una sustancial cantidad de la variabilidad en los precios, lo que es positivo. Para mejorar el modelo, se considera explorar:
Se debe revisar la presencia de valores atípicos que pueden estar afectando especialmente el MSE.
Añadir más características descriptivas o transformaciones de las existentes para capturar mejor las relaciones no lineales.
Optimizar los hiperparámetros del modelo o probar diferentes algoritmos de regresion que puedan manejar mejor las peculiaridades de los datos.
Estos ajustes podrían ayudar a reducir el MSE y MAE, mientras se mantiene o mejora el ya alto valor de R^2.
Se debe recordar que en el punto 4 no se verificaron los supuestos de normalidad e independencia mientras que sí se verificó que hay linealidad de los residuos.
Asimismo, se identificó que el modeo presenta heterocedasticidad, cuyo efecto puede conducir a estimaciones de coeficientes sesgados, valores p incorrectos y errores estándar, y afectar la evaluación de riesgos y los resultados.