Problema

Se tiene una base de datos “vivienda” que contiene 8 variables: zona, piso, esterato, preciom, areaconst, parqueaderos, banios, habitaciones. Se requiere construir un modelo de predicción de variable preciom en función de las otras variables y se requiere verificar efectividad de la predicción del modelo, identificar si las variables existen son suficiente para explicar la variable preciom y listar posibles mejoras.


Solución

Etapa 1

Realizar un filtro a la base de datos para incluir solo las ofertas de casas de la zona norte de la ciudad. presentar los primeros 3 registros de las bases.

#Carga de datos
suppressWarnings(library(paqueteMODELOS))
suppressWarnings(library(plotly))
library(ggplot2)
library(reshape2)
library(car)
library(lmtest) 
data("vivienda")

# Filtrar solo ofertas de casas en la zona norte
base1 <- subset(vivienda, tipo == "Casa" & zona == "Zona Norte")

# Mostrar los primeros 3 registros de la base de datos filtrada
head(base1, 3)
## # A tibble: 3 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1209 Zona N… 02          5     320       150            2      4            6
## 2  1592 Zona N… 02          5     780       380            2      3            3
## 3  4057 Zona N… 02          6     750       445           NA      7            6
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
# Mostar los unicos de tipo y zona de la base de datos 1

unique(base1$tipo)
unique(base1$zona)
## [1] "Casa"
## [1] "Zona Norte"


Etapa 2

Realizar 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. Usar gráficos e interprete los resultados.

# Gráfico de dispersión entre precio y área construida
scatter_area_precio <- ggplot(base1, aes(x = areaconst, y = preciom, color = preciom)) +
  geom_point() +
  labs(title = "Precio vs Área Construida") +
  theme_minimal()

# Gráfico de dispersión entre precio y estrato
scatter_estrato_precio <- ggplot(base1, aes(x = estrato, y = preciom, color = preciom)) +
  geom_point() +
  labs(title = "Precio vs Estrato") +
  theme_minimal()

# Gráfico de dispersión entre precio y número de baños
scatter_baños_precio <- ggplot(base1, aes(x = banios, y = preciom, color = preciom)) +
  geom_point() +
  labs(title = "Precio vs Número de Baños") +
  theme_minimal()

# Gráfico de dispersión entre precio y número de habitaciones
scatter_habitaciones_precio <- ggplot(base1, aes(x = habitaciones, y = preciom, color = preciom)) +
  geom_point() +
  labs(title = "Precio evs Número de Habitaciones") +
  theme_minimal()

# Organizar gráficos en una cuadrícula con facet_wrap
grid.arrange(scatter_area_precio, scatter_estrato_precio, scatter_baños_precio, scatter_habitaciones_precio, ncol = 2)

# Calcular la matriz de correlación
variables_interes <- base1[, c("preciom", "areaconst", "estrato", "banios", "habitaciones")]

matriz_correlacion <- cor(variables_interes)

# Convertir la matriz a formato largo para ggplot2
matriz_correlacion_long <- melt(matriz_correlacion)

# Crear el gráfico de la matriz de correlación
ggplot(matriz_correlacion_long, aes(x = Var1, y = Var2, fill = value)) +
  geom_tile() +
  scale_fill_gradient2(low = "red", high = "blue",limit = c(0, 1),
                       breaks = seq(0, 1, by = 0.2), labels = scales::number_format(accuracy = 0.1)) +
  theme_minimal() +
  labs(title = "Matriz de Correlación")

# Mostrar resultados numéricos de la matriz de correlación
print(matriz_correlacion)
##                preciom areaconst   estrato    banios habitaciones
## preciom      1.0000000 0.7313480 0.6123503 0.5233357    0.3227096
## areaconst    0.7313480 1.0000000 0.4573818 0.4628152    0.3753323
## estrato      0.6123503 0.4573818 1.0000000 0.4083039    0.1073141
## banios       0.5233357 0.4628152 0.4083039 1.0000000    0.5755314
## habitaciones 0.3227096 0.3753323 0.1073141 0.5755314    1.0000000

Comentarios:

Fuertes correlaciones positivas: la variable “preciom” (precio de la vivienda) muestra fuertes correlaciones positivas con “areaconst” y “estrato”. Esto sugiere que a medida que aumenta el área construida y el nivel socio económico, el precio de la vivienda también aumenta.

Moderada correlación positiva: hay una correlación moderada y positiva entre “preciom” y “banios”. Esto indica que las viviendas con más baños tienden a tener un precio más alto.

Correlación débil: la variable “habitaciones” muestra una correlación débil con “preciom”. Esto sugiere que el número de habitaciones no tiene una relación significativa con el precio de la vivienda en comparación con otras variables.

Correlaciones bajas o nulas: las correlaciones entre “estrato” y “habitaciones” así como entre “estrato” y “banios” son bajas, lo que sugiere que el nivel socioeconómico no está relacionado con la cantidad de habitaciones o baños.


Etapa 3

Estimar 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 ). Interpretar los coeficientes si son estadísticamente significativos. Interpretar el coeficiente R2. Discutir el ajuste del modelo e indicar que se podría hacer para mejorarlo).

# Seleccionar las variables para el modelo
variables_modelo <- base1[, c("areaconst", "estrato", "habitaciones", "parqueaderos", "banios", "preciom")]

# Ajustar el modelo de regresión lineal múltiple
modelo <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = variables_modelo)

# Mostrar resumen del modelo
summary(modelo)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = variables_modelo)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -784.29  -77.56  -16.03   47.67  978.61 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -238.17090   44.40551  -5.364 1.34e-07 ***
## areaconst       0.67673    0.05281  12.814  < 2e-16 ***
## estrato        80.63495    9.82632   8.206 2.70e-15 ***
## habitaciones    7.64511    5.65873   1.351    0.177    
## parqueaderos   24.00598    5.86889   4.090 5.14e-05 ***
## banios         18.89938    7.48800   2.524    0.012 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 155.1 on 429 degrees of freedom
##   (287 observations deleted due to missingness)
## Multiple R-squared:  0.6041, Adjusted R-squared:  0.5995 
## F-statistic: 130.9 on 5 and 429 DF,  p-value: < 2.2e-16

Interpretación de coeficientes

  • Intercepto:el precio promedio de la casa sea de -238.17 unidades cuando todas las variables predictoras son cero (el área construida, estrato, número de habitaciones, número de parqueaderos y número de baños son cero) . Esta interpretación no tiene un significado práctico y puede inferir que el modelo no es completamente apropiado para explicar el precio.

  • Área Construida (areaconst):un aumento de una unidad de área construida se asocia con un aumento de 0.67673 unidades en el precio de la casa. p-value < 0.05 sugiere que el área construida tiene un impacto significativo en el precio, a mayor área mayor precio.

  • Estrato: un aumento de una unidad en el estrato se asocia con un aumento de 80.63495 unidades en el precio de la casa. p-value < 0.05 sugiere que el estrato tiene un impacto significativo en el precio, a mayor nivel socioeconomico mayor precio.

  • Número de Habitaciones (habitaciones):un aumento de una unidad en el número de habitaciones se asocia con un aumento de 7.64511 unidades en el precio de la casa. Por otro lado el p-value > 0.05 indicando que el coeficiente no es estadisticamente significativo, esto sugiere que el número de habitaciones no es un predictor significativo del precio.

  • Número de Parqueaderos (parqueaderos): un aumento de una unidad en el número de parqueaderos se asocia con un aumento de 24.00598 unidades en el precio de la casa. p-value < 0.05 que sugiere que el número de parqueaderos tiene un impacto significativo en el precio.

  • Número de Baños (banios):un aumento de una unidad en el número de baños se asocia, en promedio, con un aumento de 18.89938 unidades en el precio de la casa. p-value < 0.05 que sugiere que el número de baños tiene un impacto significativo en el precio.

Resumen de coeficientes:

  • Los coeficientes de las variables de área construida, estrato, número de parqueaderos y número de baños son estadísticamente significativos, lo que sugiere que estas variables tienen un impacto significativo en el precio.

  • El número de habitaciones no es estadísticamente significativo, lo que indica que podría no ser un predictor fuerte del precio en este modelo.

Interpretación del Coeficiente R ^ 2:

R ^ 2 = 0.6041 indica que aproximadamente el 60.41% de la variabilidad en el precio de la casa es explicada por las variables incluidas en el modelo. Esto sugiere un ajuste moderado y que se debe revisar oportunidades para mejorar el modelo.

Posibles mejoras del modelo:

  • Manejo de valores atípicos: identificar y trabajar sobre valores atípicos que pueden afectar el ajuste del modelo.

  • Transformaciones de variables: explorar la posibilidad de aplicar transformaciones a las variables para abordar posibles no linealidades.

  • Inclusión de interacciones: considerar la inclusión de términos de interacción entre variables para capturar efectos conjuntos.

  • Inclusión de variables adicionales: considerar la inclusión de variables adicionales que ayuden al modelo a predecir mejor el precio como si hay cerca zonas comerciales, centros de mercado, parques antigüedad de la vivienda etc.


Etapa 4

Realizar validación de supuestos del modelo e interpretar los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer).

4.1 Normalidad de residuos

Mediante test de Shapiro-Wilk y gráfico cuantil-cuantil (Q-Q plot).

# Obtener residuos 
residuos <- residuals(modelo)
predicciones <- fitted(modelo)
# Normalidad de Residuos
qqPlot(residuos)

## 513 405 
## 309 239
shapiro.test(residuos)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos
## W = 0.85246, p-value < 2.2e-16

Comentarios:

En la preuba shapiro el valor p es esencialmente cero, lo que sugiere que hay evidencia para rechazar la hipótesis nula de normalidad.

En el grafio Q-Q se evidencia normalidad en los residuos en el centro, pero en las colas se presenta una alta desviación de los residuos respecto a la línea, es decir no tienen distribución normal en estas áreas, esto puede indicar que el modelo no predice con gran precisión y puede cometer errores más a menudo de lo esperado.


4.2 Homocedasticidad y lineanidad

Mediante un gráfico de dispersión de residuos vs. predicciones y un gráfico de dispersión de residuos estandarizados vs. predicciones.

# Homocedasticidad (Varianza Constante)
plot(residuos ~ predicciones, main = "Residuos vs. Predicciones", xlab = "Predicciones", ylab = "Residuos")

#linealidad
spreadLevelPlot(modelo)

## 
## Suggested power transformation:  -0.1095132

Comentarios:

El análisis mostró que los errores en el modelo no tienen una variabilidad constante, y puede no dar predicciones precisas.

El resultado de spreadLevelPlot(modelo) sugiere una transformación de potencia de -0.1095132 para abordar la heterocedasticidad en los residuos del modelo. El valor negativo indica una transformación inversa (como la raíz cuadrada) para estabilizar la varianza.


4.3 Independencia

Mediante pruebas de Durbin-Watson y Breusch-Godfrey

# Independencia de Residuos
durbinWatsonTest(modelo)
##  lag Autocorrelation D-W Statistic p-value
##    1       0.1173407      1.761505   0.012
##  Alternative hypothesis: rho != 0
bgtest(modelo) 
## 
##  Breusch-Godfrey test for serial correlation of order up to 1
## 
## data:  modelo
## LM test = 6.068, df = 1, p-value = 0.01376

Comentarios:

El valor del estadístico D-W es 1.761505 un valor cercano a 2 que sugiere independencia de los residuos, una menor evidencia de autocorrelación positiva (relacionada con errores que se parecen entre sí).

El P-valor asociado a la prueba es 0.01, lo cual es menor que el nivel de significancia común de 0.05. Esto sugiere evidencia estadística para rechazar la hipótesis nula de independencia de los residuos.

Ambos resultados sugieren la presencia de autocorrelación en los residuos del modelo. Esto significa que los errores pueden tener patrones sistemáticos y que podría ser necesario realizar ajustes adicionales.


4.4 Evaluación de la colinealidad

Mediante la obtención del índice de variación de inflación de la varianza (VIF) para cada predictor.

# No Colinealidad
vif(modelo)
##    areaconst      estrato habitaciones parqueaderos       banios 
##     1.460998     1.307757     1.721015     1.226334     1.967421

Comentario:

Los resultados del VIF para cada predictor (areaconst, estrato, habitaciones, parqueaderos, banios), están todos por debajo de 2.0, lo que indica que no hay colinealidad significativa entre las variables predictoras. La colinealidad entre variables predictoras en un modelo de regresión puede hacer que sea difícil distinguir el impacto individual de cada variable, en este caso los bajos valores de VIF sugieren que cada variable contribuye de manera única a la predicción del modelo, sin interferencias significativas entre ellas.


Etapa 5

Realizar una partición en los datos de forma aleatoria donde 70% sea un set para entrenar el modelo y 30% para prueba. Estimar el modelo con la muestra del 70%. Mostrar los resultados.

# Establecer una semilla para reproducibilidad
set.seed(123)

# Crear una variable de índice para la partición aleatoria
indice_particion <- sample(1:nrow(base1), nrow(base1)*0.7)

# Crear conjuntos de entrenamiento y prueba
conjunto_entrenamiento <- variables_modelo[indice_particion, ]
conjunto_prueba <- variables_modelo[-indice_particion, ]

# Ajustar el modelo de regresión lineal múltiple con el conjunto de entrenamiento
modelo <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = conjunto_entrenamiento)

# Mostrar resumen del modelo
summary(modelo)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = conjunto_entrenamiento)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -533.37  -73.07  -14.82   36.94  984.05 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -218.48193   47.71741  -4.579 6.92e-06 ***
## areaconst       0.64607    0.06077  10.631  < 2e-16 ***
## estrato        77.45542   10.62920   7.287 2.93e-12 ***
## habitaciones   11.53632    6.34711   1.818  0.07015 .  
## parqueaderos   16.94000    6.14121   2.758  0.00617 ** 
## banios         18.34499    8.00014   2.293  0.02255 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 138 on 294 degrees of freedom
##   (205 observations deleted due to missingness)
## Multiple R-squared:  0.6235, Adjusted R-squared:  0.6171 
## F-statistic: 97.37 on 5 and 294 DF,  p-value: < 2.2e-16

Comentarios:

El modelo de partición aleatoria muestra un rendimiento ligeramente mejor en términos de ajuste y manejo de datos faltantes en comparación con el modelo inicial:

El R-cuadrado ajustado en el modelo inicial es 0.5995, mientras que en la partición aleatoria es 0.6171, el modelo de partición aleatoria parece tener un ajuste ligeramente mejor.

  • Errores Residuales: Los errores residuales son menores en el modelo de partición aleatoria (138) en comparación con el modelo inicial (155.1). Esto sugiere que el modelo de partición aleatoria tiene un mejor ajuste a los datos de entrenamiento.

  • Observaciones eliminadas: Ambos modelos han eliminado algunas observaciones debido a valores faltantes, pero el modelo de partición aleatoria tiene menos observaciones eliminadas.

  • Pérdida de datos: El modelo de partición aleatoria parece haber perdido menos datos durante el proceso, ya que tiene menos observaciones eliminadas.


Etapa 6

Realizar predicciones con el modelo anterior usando los datos de prueba (30%).

# Eliminar filas con valores faltantes en el conjunto de prueba
conjunto_prueba_completo <- na.omit(conjunto_prueba)

# Realizar predicciones con el conjunto de prueba sin valores faltantes
predicciones_prueba <- predict(modelo, newdata = conjunto_prueba_completo)

# Mostrar las primeras filas de las predicciones en el conjunto de prueba
head(predicciones_prueba)
##        1        2        3        4        5        6 
## 442.1831 537.8245 520.9200 496.8301 262.9075 263.5236


Etapa 7

Calcular el error cuadrático medio, el error absoluto medioe el R2 e interpretar.

# Calcular el Error Absoluto Medio (MAE)
mae <- mean(abs(predicciones_prueba - conjunto_prueba_completo$preciom))
cat("Error Absoluto Medio (MAE):", mae, "\n")
## Error Absoluto Medio (MAE): 113.457
# Calcular el Error Cuadrático Medio (MSE)
mse <- mean((predicciones_prueba - conjunto_prueba_completo$preciom)^2)
cat("Error Cuadrático Medio (MSE):", mse, "\n")
## Error Cuadrático Medio (MSE): 35594.54
# Calcular el coeficiente de determinación (R ^ 2)
r_cuadrado <- 1 - (sum((conjunto_prueba_completo$preciom - predicciones_prueba)^2) / sum((conjunto_prueba_completo$preciom - mean(conjunto_prueba_completo$preciom))^2))
cat("R cuadrado (R²):", r_cuadrado, "\n")
## R cuadrado (R²): 0.570118

Comentarios:

Error Absoluto Medio = 113.457 indica que en promedio, las predicciones del modelo difieren en aproximadamente $113.457 de los valores reales.

Error Cuadrático Medio = 35594.54 indica que los errores cuadráticos promedio entre las predicciones y los valores reales son relativamente grandes.

R ^ 2 = 0.570118 significa que aproximadamente el 57.01% de la variabilidad en los precios es explicada por las características del modelo. En general se busca tener un R ^ 2 más cercano a 1 que indique mejor ajuste del modelo a los datos, en este caso el modelo requiere revisión para ver posibilidad de mejora.


Conclusión General

Las variables área construida, estrato, número de parqueaderos y número de baños son estadísticamente significativas para la predicción del precio de viviendas tipo casa de la zona norte.

El número de habitaciones no es estadísticamente significativo o predictor fuerte del precio para viviendas tipo casa de la zona norte.

Todos los R ^ 2 calculados estuvieron alrededor del 60%, esto que indica que, aunque el modelo explica la variabilidad del precio en función de las otras variables aún tiene todavía oportunidad de mejora en el que se aumente el % de explicación. Alguno de los puntos sugeridos para mejorar el ajuste son: manejo de valores atípicos, realizar transformaciones de variables, considerar inclusión de interacciones o inclusión de variables adicionales que ayuden al modelo a predecir mejor el precio.