ACTIVIDAD 2

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.

Limpieza de dataset

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")

PUNTO 1:

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.

PUNTO 2:

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:

  • Hay una relacion fuerte entre el precio y el area construida ya que entre mas grande sea el area, probablemente mayor sera el precio
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)"))
  • 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.
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)"))
  • hay una relacion muy debil entre el precio y las habitaciones, ya que solo es de 0.096
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)"))
  • 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.

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

PUNTO 3:

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.

PUNTO 4:

#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.

PUNTO 5:

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.

PUNTO 6:

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)

PUNTO 7:

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.