Punto 1 Realice un filtro a la base de datos e incluya solo las ofertas de : base1: casas, de la zona norte de la ciudad. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta.
Punto 2 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.
Punto 3 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).
Punto4 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).
Punto 5 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.
Punto 6 Realice predicciones con el modelo anterior usando los datos de prueba (30%).
Punto 7 Calcule el error cuadrático medio, el error absoluto medio y el R2, interprete.
head(vivienda)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona O… <NA> 3 250 70 1 3 6
## 2 1169 Zona O… <NA> 3 320 120 1 2 3
## 3 1350 Zona O… <NA> 3 350 220 2 2 4
## 4 5992 Zona S… 02 4 400 280 3 5 3
## 5 1212 Zona N… 01 5 260 90 1 2 3
## 6 1724 Zona N… 01 5 240 87 1 3 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
## ----Limpieza de datos----------------
# Primero se realiza la limpieza y preparacion de los datos
#valores nulos en las columnas
valores_nulos = colSums(is.na(vivienda)) %>% as.data.frame()
print(valores_nulos)
## .
## id 3
## zona 3
## piso 2638
## estrato 3
## preciom 2
## areaconst 3
## parqueaderos 1605
## banios 3
## habitaciones 3
## tipo 3
## barrio 3
## longitud 3
## latitud 3
vivienda$zona = toupper(vivienda$zona)
vivienda$tipo = toupper(vivienda$tipo)
grafico = md.pattern(vivienda, rotate.names = TRUE)
# Al ser una variable categorica la reemplazamos por la moda
moda = as.numeric(names(sort(table(vivienda$piso), decreasing = TRUE)[1]))
vivienda$piso[is.na(vivienda$piso)] = moda
#Al ser una variable numerica se reemplaza por la media
promedio = mean(vivienda$parqueaderos, na.rm = TRUE)
vivienda$parqueaderos[is.na(vivienda$parqueaderos)] = promedio
vivienda= na.omit(vivienda)
grafico = md.pattern(vivienda, rotate.names = TRUE)
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
VariablesIndependientes = c("areaconst" , "estrato" , "habitaciones" , "parqueaderos" ,
"banios")
base1 = subset(vivienda, vivienda$zona == "ZONA NORTE" & vivienda$tipo == "CASA")
print(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 1.84 7 6
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
oferta <- data.frame(
lat = base1$latitud,
long = base1$longitud
)
map <- leaflet(oferta) %>%
addTiles() %>%
addMarkers(
lng = ~long,
lat = ~lat,
popup = ~as.character(lat)
)
map
Se realiza filtrado de dataset de acuerdo con las especificaciones del ejercicio, por casas y que esten ubicadas en la zona norte de la ciudad, igualmente, se realiza su respectivo grafico con la ubicacion en el mapa.
base1 = subset(vivienda,vivienda$tipo == "CASA")
#DataPunto2 = DataPunto2[,c()]
zona_map = c("ZONA ORIENTE" = 1, "ZONA SUR" = 2, "ZONA OESTE" = 3, "ZONA NORTE" = 4, "ZONA CENTRO" = 5)
base1$zona = zona_map[as.character(base1$zona)]
base1$zona = as.numeric(base1$zona)
correlacion = cor(base1[, c("zona","preciom", "areaconst", "estrato", "banios", "habitaciones")])
correlation_with_dependent_var = correlacion["preciom", c("zona", "areaconst", "estrato", "banios", "habitaciones")]
datosPlotly = as.data.frame(as.table(correlacion))
grafico3D = plot_ly(datosPlotly, x = ~Var1, y = ~Var2, z = ~Freq, type = 'scatter3d', mode = 'markers')
grafico3D
print(correlation_with_dependent_var)
## zona areaconst estrato banios habitaciones
## -0.06523697 0.65294983 0.66580209 0.55810021 0.09683573
De acuerdo con los datos obtenidos podemos concluir lo siguiente:
plot_ly(data = base1, y = ~preciom, x = ~as.factor(estrato),
type = "box", marker=list(size = 10, opacity = 0.5,
color="green")) %>%
layout(title = "Distribucion entre Precio y estrato",
plot_bgcolor='white',
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio(pesos)"))
plot_ly(data = base1, y = ~preciom, x = ~as.factor(habitaciones),
type = "box", marker=list(size = 10, opacity = 0.5,
color="green")) %>%
layout(title = "Distribucion entre Precio y area construida",
plot_bgcolor='white',
xaxis = list(title = "area construida"),
yaxis = list(title = "Precio(pesos)"))
plot_ly(data = base1, y = ~preciom, x = ~as.factor(zona),
type = "box", marker=list(size = 10, opacity = 0.5,
color="green")) %>%
layout(title = "Distribucion entre Precio y estrato",
plot_bgcolor='white',
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio(pesos)"))
zona: Esto sugiere una correlación negativa muy débil entre la variable “zona” y el precio. Un valor negativo indica que a medida que el valor de “zona” aumenta, el precio tiende a disminuir muy ligeramente.
areaconst: Esto indica una correlación positiva moderadamente fuerte entre la variable “areaconst” y el precio. Un valor positivo sugiere que a medida que el valor de “areaconst” aumenta, el precio tiende a aumentar.
estrato: Similar al caso anterior, esto indica una correlación positiva moderadamente fuerte entre la variable “estrato” y el precio. Un valor positivo sugiere que a medida que el valor de “estrato” aumenta, el precio tiende a aumentar.
banios: Esto sugiere una correlación positiva moderadamente fuerte entre el número de baños y el precio. Un valor positivo indica que a medida que el número de baños aumenta, el precio tiende a aumentar.
habitaciones: Esto sugiere una correlación positiva débil entre el número de habitaciones y el precio. Aunque el valor es positivo, es menor en comparación con los otros coeficientes, lo que indica una relación más débil entre el número
base1
## # A tibble: 3,219 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 1 2 3 250 70 1 3 6
## 2 1169 1 2 3 320 120 1 2 3
## 3 1350 1 2 3 350 220 2 2 4
## 4 5992 2 02 4 400 280 3 5 3
## 5 1209 4 02 5 320 150 2 4 6
## 6 1592 4 02 5 780 380 2 3 3
## 7 4057 4 02 6 750 445 1.84 7 6
## 8 4460 4 02 4 625 355 3 5 5
## 9 6081 4 02 5 750 237 2 6 6
## 10 7824 4 02 4 600 160 1 4 5
## # ℹ 3,209 more rows
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
modeloLinealMultiple = lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = base1)
# Resumen del modelo
summary(modeloLinealMultiple)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = base1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1209.58 -106.88 -20.79 66.69 1129.82
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -412.65191 19.20613 -21.485 < 2e-16 ***
## areaconst 0.75425 0.02509 30.057 < 2e-16 ***
## estrato 116.28843 4.18238 27.804 < 2e-16 ***
## habitaciones -12.29667 2.51434 -4.891 1.05e-06 ***
## parqueaderos 63.15036 3.18943 19.800 < 2e-16 ***
## banios 36.83185 3.22819 11.409 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 198.7 on 3213 degrees of freedom
## Multiple R-squared: 0.6929, Adjusted R-squared: 0.6924
## F-statistic: 1450 on 5 and 3213 DF, p-value: < 2.2e-16
#COEFICIENTES
coeficientesModelo = coef(modeloLinealMultiple)
print(coeficientesModelo)
## (Intercept) areaconst estrato habitaciones parqueaderos banios
## -412.651914 0.754249 116.288435 -12.296674 63.150364 36.831854
#R2
print(summary(modeloLinealMultiple)$r.squared)
## [1] 0.6928975
Intercept: Este es el valor estimado de la variable dependiente cuando todas las variables independientes son cero. En este caso, sería el precio esperado de una propiedad cuando todas las otras características son cero. El coeficiente es -412.65191.
areaconst : El coeficiente para esta variable es 0.75425. Esto indica que, manteniendo todas las demás variables constantes, un aumento de una unidad en el área construida se asocia, en promedio, con un aumento de 0.75425 unidades en el precio de la propiedad.
estrato: El coeficiente para esta variable es 116.28843. Esto sugiere que, manteniendo todas las demás variables constantes, un aumento de una unidad en el estrato socioeconómico se asocia, en promedio, con un aumento de $116.28843 en el precio de la propiedad.
habitaciones: El coeficiente para esta variable es -12.29667. Esto indica que, manteniendo todas las demás variables constantes, un aumento de una unidad en el número de habitaciones se asocia, en promedio, con una disminución de $12.29667 en el precio de la propiedad.
parqueaderos: El coeficiente para esta variable es 63.15036. Esto sugiere que, manteniendo todas las demás variables constantes, un aumento de una unidad en el número de parqueaderos se asocia, en promedio, con un aumento de $63.15036 en el precio de la propiedad.
banios: El coeficiente para esta variable es 36.83185. Esto indica que, manteniendo todas las demás variables constantes, un aumento de una unidad en el número de baños se asocia, en promedio, con un aumento de $36.83185 en el precio de la propiedad.
Std. Error: Estos son los errores estándar de los coeficientes estimados. Cuanto más pequeño sea el error estándar, más precisas serán las estimaciones de los coeficientes.
t value: Estos son los valores de la estadística t para probar si el coeficiente es significativamente diferente de cero. Cuanto mayor sea el valor t (en valor absoluto), más significativo es el coeficiente.
Error Estándar Residual (Residual standard error): Este valor, 198.7, indica la desviación estándar de los residuos del modelo, es decir, cuánto varían las respuestas observadas alrededor de la línea de regresión. En este caso, el error estándar residual es 198.7 unidades monetarias.
R-cuadrado:En este caso, el R-cuadrado es 0.6929, lo que significa que aproximadamente el 69.29% de la variabilidad en los precios de las propiedades puede ser explicada por las variables independientes incluidas en el modelo.
Estadística F:se utiliza para probar la significancia global del modelo. En este caso, la estadística F es 1450, con 5 y 3213 grados de libertad. Un valor alto de la estadística F, junto con un valor p (p-value) muy pequeño, indica que al menos una de las variables independientes es significativa para predecir el precio de la propiedad.
Valor p (p-value): El valor p asociado con la estadística F es < 2.2e-16, lo que indica que el modelo en su conjunto es significativo. En otras palabras, al menos una de las variables independientes tiene un efecto significativo en el precio de la propiedad.
#supuesto de normalidad
shapiro.test(modeloLinealMultiple$residuals)
##
## Shapiro-Wilk normality test
##
## data: modeloLinealMultiple$residuals
## W = 0.88127, p-value < 2.2e-16
plot(modeloLinealMultiple, which = 1)
#independencia en los errores:
dwtest(modeloLinealMultiple)
##
## Durbin-Watson test
##
## data: modeloLinealMultiple
## DW = 1.5661, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
par(mfrow = c(2, 2))
plot(modeloLinealMultiple)
DW = 1.5661: Este estaditico toma valores entre 0 y 4. Un valor de DW cercano a 2 sugiere que no hay autocorrelación de primer orden en los residuos. En este caso, DW es mayor que 1 pero menor que 2, lo que sugiere que hay alguna autocorrelación positiva en los residuos, pero no muy fuerte.
p-value < 2.2e-16: Un valor p muy pequeño (en este caso, prácticamente cero) sugiere que hay evidencia significativa para rechazar la hipótesis nula de que no hay autocorrelación de primer orden en los residuos. Por lo tanto, hay evidencia estadística para sugerir que los residuos están autocorrelacionados.
porcentaje70 = createDataPartition(y = base1$preciom, p = 0.7, list = FALSE)
entrenamiento = base1[porcentaje70, ]
prueba = base1[-porcentaje70, ]
ModeloPunto5 = lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos +
banios, data = entrenamiento)
print(ModeloPunto5)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = entrenamiento)
##
## Coefficients:
## (Intercept) areaconst estrato habitaciones parqueaderos
## -416.2302 0.7642 114.3239 -11.5354 63.8757
## banios
## 37.8255
Se puede concluir lo siguiente:
parqueaderos: Un incremento de un parqueadero está asociado con un incremento de $68.0907 en el precio de la propiedad.
banios: Un aumento de un baño está asociado con un aumento de $32.7074 en el precio de la propiedad, manteniendo constantes todas las demás variables.
habitaciones:un aumento de una unidad en el número de habitaciones se asocia con una disminución de $10.2957 en el precio de la propiedad.
estrato: Para una unidad adicional en el estrato, el precio de la propiedad aumenta en promedio en $115.5587.
areaconst:un aumento de una unidad en el área construida está asociado con un aumento de $0.7697 en el precio de la propiedad.
prediccionPunto6 = predict(ModeloPunto5, newdata = prueba)
resultados = data.frame(Real = prueba$preciom, Prediccion = prediccionPunto6)
print(head(resultados,5))
## Real Prediccion
## 1 320 123.3638
## 2 350 252.1223
## 3 625 635.4277
## 4 600 320.8352
## 5 490 478.4745
Para la primera observación, el precio real de la propiedad fue 350 y el modelo predijo un precio de aproximadamente 256.55.
Para la segunda observación, el precio real fue 750 y el modelo predijo un precio de aproximadamente 610.99.
Este patrón se repite para cada fila en tus datos, donde el modelo hace una predicción para el precio de la propiedad y lo compara con el precio real.
A continuacion evaluaremos la precision del modelo usando métricas de evaluación de modelos como el error absoluto medio (MAE), el error cuadrático medio (MSE) o el coeficiente de determinación (R-cuadrado)
metricas = postResample(pred = resultados$Prediccion, obs = resultados$Real)
print(metricas)
## RMSE Rsquared MAE
## 198.2017879 0.6906984 129.7073483
RMSE:El RMSE es aproximadamente 208.29. Cuanto menor sea el valor del RMSE, mejor será el ajuste del modelo a los datos.
R-cuadrado:Es aproximadamente 0.6701, lo que significa que alrededor del 67.01% de la variabilidad en los precios de las propiedades es explicada por el modelo.
MAE: El MAE es una medida de cuánto difieren las predicciones del modelo de los valores reales en promedio, ignorando la dirección de las diferencias. En este caso, el MAE es aproximadamente 135.97. Cuanto menor sea el valor del MAE, mejor será el ajuste del modelo a los datos.