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_areaExiste 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_estratoEn 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_habitacionesPara 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_cornumerico=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.
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.
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
predicciones <- predict(modelo_train, newdata = testData)
head(data.frame(Predicciones = predicciones, Real = testData$preciom))# 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
Error absoluto medio: 77.8088
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.