1. 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.
apartamento = subset(vivienda, tipo == "Apartamento")
head(apartamento, 3)
  1. 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.
numerico = subset(apartamento, select = c(preciom, areaconst, estrato, banios, habitaciones, zona))
numerico$ZCen = ifelse(numerico$zona == "Zona Centro", 1, 0)
numerico$ZNor = ifelse(numerico$zona == "Zona Norte", 1, 0)
numerico$ZOes = ifelse(numerico$zona == "Zona Oeste", 1, 0)
numerico$ZOri = ifelse(numerico$zona == "Zona Oriente", 1, 0)
numerico$ZSur = ifelse(numerico$zona == "Zona Sur", 1, 0)

numerico$est3 = ifelse(numerico$estrato == "3", 1, 0)
numerico$est4 = ifelse(numerico$estrato == "4", 1, 0)
numerico$est5 = ifelse(numerico$estrato == "5", 1, 0)
numerico$est6 = ifelse(numerico$estrato == "6", 1, 0)

analisisCorrelacion = ggpairs(numerico, 
                        columns = c("preciom", "areaconst", "estrato", "banios", "habitaciones"),
                        upper = list(continuous = wrap("cor", size = 4)),  # Ajusta el tamaño de la correlación
                        lower = list(continuous = wrap("points", alpha = 0.5, size = 1.5)),  # Ajusta la transparencia y el tamaño de los puntos
                        diag = list(continuous = wrap("densityDiag", alpha = 0.5))  # Usar densidad en la diagonal
                        ) + 
  theme_bw() +  # Usar tema blanco y negro para mejorar la visibilidad
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Girar las etiquetas del eje x para mejor legibilidad

analisisCorrelacion

# Gráfico de dispersión Precio vs Área Construida
fig_area = plot_ly(numerico, x = ~areaconst, y = ~preciom, color = ~zona, type = 'scatter', mode = 'markers') %>%
  layout(title = 'Precio de la Vivienda vs Área Construida',
         xaxis = list(title = 'Área Construida (m²)'),
         yaxis = list(title = 'Precio (millones)'))

fig_area

Existe una correlación positiva entre las variables área construida y precio, se observa también que existe una variación significativa de acuerdo a la zona.

# Gráfico de caja Precio vs Estrato
fig_estrato = plot_ly(numerico, x = ~factor(estrato), y = ~preciom, color = ~zona, type = 'box') %>%
  layout(title = 'Precio de la Vivienda vs Estrato',
         xaxis = list(title = 'Estrato'),
         yaxis = list(title = 'Precio (millones)'))

fig_estrato

En el gráfico de cajas se puede observar que a medida que el estrato aumenta el precio de las viviendas aumenta significativamente.

# Gráfico de caja Precio vs Número de Baños
fig_banios <- plot_ly(numerico, x = ~factor(banios), y = ~preciom, color = ~zona, type = 'box') %>%
  layout(title = 'Precio de la Vivienda vs Número de Baños',
         xaxis = list(title = 'Número de Baños'),
         yaxis = list(title = 'Precio (millones)'))

fig_banios
# Gráfico de caja Precio vs Número de Habitaciones
fig_habitaciones <- plot_ly(numerico, x = ~factor(habitaciones), y = ~preciom, color = ~zona, type = 'box') %>%
  layout(title = 'Precio de la Vivienda vs Número de Habitaciones',
         xaxis = list(title = 'Número de Habitaciones'),
         yaxis = list(title = 'Precio (millones)'))

fig_habitaciones

Para las gráficas de numero de baños y número de habitaciones hay datos que presentan registros en 0 para estas 2 variables, se procede a tomar estos valores como anómalos y no ser tenidos en cuenta para el entrenamiento del modelo.

# Calcular la matriz de correlación
cor_matrix <- cor(numerico[, c("preciom", "areaconst", "estrato", "banios", "habitaciones")], use = "complete.obs")

# Gráfico de Heatmap de la Correlación
fig_cor <- plot_ly(x = colnames(cor_matrix), y = rownames(cor_matrix), z = cor_matrix, type = 'heatmap', colorscale = "Viridis") %>%
  layout(title = 'Mapa de Calor de la Correlación entre Variables')

fig_cor
  1. 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).
numerico=subset(numerico, banios != 0 | habitaciones != 0)
modelo1 = lm(preciom ~ areaconst +  banios + habitaciones + est3 + est4 + est5 + est6 + ZCen + ZNor + ZOes + ZOri + ZSur, data = numerico)
summary(modelo1)

Call:
lm(formula = preciom ~ areaconst + banios + habitaciones + est3 + 
    est4 + est5 + est6 + ZCen + ZNor + ZOes + ZOri + ZSur, data = numerico)

Residuals:
     Min       1Q   Median       3Q      Max 
-1824.00   -48.11     1.84    44.19   956.64 

Coefficients: (2 not defined because of singularities)
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)   166.62435   11.00837  15.136   <2e-16 ***
areaconst       2.16361    0.04177  51.801   <2e-16 ***
banios         57.50015    2.95924  19.431   <2e-16 ***
habitaciones  -30.96532    3.31560  -9.339   <2e-16 ***
est3         -189.53633    8.72367 -21.727   <2e-16 ***
est4         -168.89616    6.68417 -25.268   <2e-16 ***
est5         -139.71464    5.81108 -24.043   <2e-16 ***
est6                 NA         NA      NA       NA    
ZCen          -37.74601   27.06861  -1.394   0.1632    
ZNor            7.99955    4.77426   1.676   0.0939 .  
ZOes           74.93235    5.65621  13.248   <2e-16 ***
ZOri          -31.98815   17.80014  -1.797   0.0724 .  
ZSur                 NA         NA      NA       NA    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 131.1 on 5080 degrees of freedom
Multiple R-squared:  0.795, Adjusted R-squared:  0.7946 
F-statistic:  1970 on 10 and 5080 DF,  p-value: < 2.2e-16

El modelo utilizado tuvo en cuenta las variables areaconst, habitaciones, banios y las variables dummies correspondientes a estrato y zona.

El modelo obtenido presenta un intercepto en 166.62 Millones lo que indica que es el precio mínimo que podría estimar el modelo si todas las variables fueran igual a 0.

Área construida tiene un coeficiente de 2.16 altamente significativo el cual indica que por cada metro adicional de área construida el precio de la vivienda aumenta en esa proporción.

El número de baños presenta un coeficiente de 57.5 con una alta significancia y es lógico al tener un mayor número de baños el valor de la vivienda debería ser mayor.

Número de habitaciones presenta un coeficiente negativo de -30.96 significativo, se podría asociar este coeficiente que al tener un mayor número de habitaciones el precio de la vivienda disminuirá debido a que al tener un mayor número de habitaciones con un área constante los espacios serán más pequeños y menos cómodos.

Estratos: Los coeficientes de los estratos todos son negativos ya que se toma como referencia las viviendas de estrato 6 que serían las viviendas con mayor precio dentro del mercado. Las viviendas de estrato 5 tendrán un precio inferior de 139.71 millones en comparación con las viviendas de estrato 6, las viviendas de estrato 4 tendrán un precio menor de 168.89 millones con respecto al estrato de referencia y las viviendas de estrato 3 tendrán un precio inferior de 189.53 millones.

Zona: Los coeficientes de la variable Zona varían con respecto a la Zona Sur que es utilizada como referencia, la zona centro tendrá un valor inferior a -37.74 millones, la zona norte tendrá un valor de 7.99 millones, la zona Oeste presenta un coeficiente de 74.93 millones siendo este el coeficiente mas alto el cual coincide con la zona catalogada como exclusiva dentro de la ciudad de Cali y la zona Oriente presenta un coeficiente de -31.98 millones.

El modelo presenta un R2 ajustado de 0.7946, lo que indica que el modelo explica cerca del 79.5% de la variabilidad de la variabilidad en el precio de las viviendas.

  1. 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).
#Analizando los supuestos
plot(modelo1)

En la gráfica de Residuos vs Valores Ajustados (Residuals vs Fitted) se puede observar cierta acumulación de errores en una parte del grafico pudiendo sugerir que existe problemas de linealidad y alguna variable se deba transformar.

En el grafico Q-Q de los residuos se observa que hay una normalidad enel centro de los datos pero en las colas se evidencia desviaciones significativas con respectó a la diagonal principal del grafico sugerido que lo residuos no son normales.

En la gráfica Scale-Location los puntos no se encuentran dispersos uniformemente y presentan una ligera tendencia ascendente lo que indica que la varianza no es constante.

El modelo no cumple los supuestos por lo tanto se sugiere revisar la transformación de variables dependientes y comprobar si los supuestos se cumplen.

  1. 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.
set.seed(123)  # Fijar una semilla para la reproducibilidad

# Crear partición de datos (70% entrenamiento, 30% prueba)
trainIndex <- createDataPartition(numerico$preciom, p = 0.7, list = FALSE)
trainData <- numerico[trainIndex, ]
testData <- numerico[-trainIndex, ]

# Ajustar el modelo de regresión lineal con el conjunto de entrenamiento
modelo_train <- lm(preciom ~ areaconst + est3 + est4 + est5 + est6 + 
                   habitaciones + banios + ZCen + ZNor + ZOes + ZOri + ZSur, 
                   data = trainData)

# Mostrar los resultados del modelo
summary(modelo_train)

Call:
lm(formula = preciom ~ areaconst + est3 + est4 + est5 + est6 + 
    habitaciones + banios + ZCen + ZNor + ZOes + ZOri + ZSur, 
    data = trainData)

Residuals:
     Min       1Q   Median       3Q      Max 
-1828.07   -49.33     1.16    43.82   954.45 

Coefficients: (2 not defined because of singularities)
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)   169.63958   13.22302  12.829  < 2e-16 ***
areaconst       2.16864    0.04953  43.786  < 2e-16 ***
est3         -191.17389   10.29080 -18.577  < 2e-16 ***
est4         -170.73590    7.93629 -21.513  < 2e-16 ***
est5         -139.91891    6.90852 -20.253  < 2e-16 ***
est6                 NA         NA      NA       NA    
habitaciones  -30.30653    3.95687  -7.659  2.4e-14 ***
banios         55.69906    3.57107  15.597  < 2e-16 ***
ZCen          -42.58896   33.23212  -1.282    0.200    
ZNor            8.46744    5.72029   1.480    0.139    
ZOes           78.01586    6.75210  11.554  < 2e-16 ***
ZOri          -30.28792   20.80651  -1.456    0.146    
ZSur                 NA         NA      NA       NA    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 131.3 on 3555 degrees of freedom
Multiple R-squared:  0.7961,    Adjusted R-squared:  0.7956 
F-statistic:  1388 on 10 and 3555 DF,  p-value: < 2.2e-16
  1. Realice predicciones con el modelo anterior usando los datos de prueba (30%).
predicciones <- predict(modelo_train, newdata = testData)
head(data.frame(Predicciones = predicciones, Real = testData$preciom))
  1. Calcule el error cuadrático medio, el error absoluto medio y el R2, interprete.
# Calcular el Error Cuadrático Medio
rmse <- sqrt(mean((predicciones - testData$preciom)^2))

# Calcular el Error Absoluto Medio
mae <- mean(abs(predicciones - testData$preciom))

# Calcular el R^2 para el conjunto de prueba
sst <- sum((testData$preciom - mean(testData$preciom))^2)
sse <- sum((predicciones - testData$preciom)^2)
r_squared <- 1 - (sse/sst)

# Mostrar las métricas de desempeño
cat("Error cuadrático medio:", rmse, "\n")
Error cuadrático medio: 130.4884 
cat("Error absoluto medio:", mae, "\n")
Error absoluto medio: 77.8088 
cat("R-cuadrado (R^2):", r_squared, "\n")
R-cuadrado (R^2): 0.7921351 

Un error cuadrático medio de 130.488 es relativamente alto para este modelo, lo que implica que el modelo tiene errores significativos en algunas predicciones.

El error absoluto medio es menor que el error cuadrático medio, aún sigue siendo alto en comparación con algunos de los valores de los precios de las viviendas. Este valor puede ser aceptable en ciertos contextos, pero indica que hay margen para mejorar el ajuste del modelo.

El R cuadrado es de aproximadamente 0.81, lo cual indica que el modelo captura en gran parte la variabilidad de los datos pero es susceptible a mejoras en el proceso de modelado y estimación como la transformación de variables o la inclusión de otras variables de ser posible.