Maestría en Ciencia de Datos Modelos Estadísticos para la Toma de Decisiones Caso C&A

Enunciado

Maria comenzó como agente de bienes raíces en Cali hace 10 años. Después de laborar dos años para una empresa nacional, se traslado a Bogotá y trabajó para otra agencia de bienes raíces. Sus amigos y familiares la convencieron de que con su experiencia y conocimientos del negocio debía abrir su propia agencia. Terminó por adquirir la licencia de intermediario y al poco tiempo fundó su propia compañía, C&A (Casas y Apartamentos) en Cali. Santiago y Lina, dos vendedores de la empresa anterior aceptaron trabajar en la nueva compaña. En la actualidad ocho agentes de bienes raíces colaboran con ella en C&A.

Pasos requeridos para la obtención de los resultados

summary(vivienda)
##        id           zona               piso              estrato     
##  Min.   :   1   Length:8322        Length:8322        Min.   :3.000  
##  1st Qu.:2080   Class :character   Class :character   1st Qu.:4.000  
##  Median :4160   Mode  :character   Mode  :character   Median :5.000  
##  Mean   :4160                                         Mean   :4.634  
##  3rd Qu.:6240                                         3rd Qu.:5.000  
##  Max.   :8319                                         Max.   :6.000  
##  NA's   :3                                            NA's   :3      
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 330.0   Median : 123.0   Median : 2.000   Median : 3.000  
##  Mean   : 433.9   Mean   : 174.9   Mean   : 1.835   Mean   : 3.111  
##  3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##  NA's   :2        NA's   :3        NA's   :1605     NA's   :3       
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:8322        Length:8322        Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.54  
##  Median : 3.000   Mode  :character   Mode  :character   Median :-76.53  
##  Mean   : 3.605                                         Mean   :-76.53  
##  3rd Qu.: 4.000                                         3rd Qu.:-76.52  
##  Max.   :10.000                                         Max.   :-76.46  
##  NA's   :3                                              NA's   :3       
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498  
##  NA's   :3

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.

north_houses <- subset(vivienda, zona %in% c("Zona Norte", "Norte 2", "Norte 3") & tipo == "Casa")
head(north_houses, 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>
tabla <-table(north_houses$tipo, north_houses$zona)
t(tabla)
##             
##              Casa
##   Zona Norte  722
library(leaflet)

datos <- data.frame(
  latitud = north_houses$latitud,
  longitud = north_houses$longitud
)

map_north <- leaflet(data = datos) %>%
  addTiles() %>%  
  addMarkers(~longitud, ~latitud, clusterOptions = markerClusterOptions())  

map_north

Se puede concluir que segun el dataset existen 722 casas en el norte de la ciudad, sin embargo se puede evidenciar que segun la ubicacion (lat y long) una buena parte de estas casas estan ubicadas a sur, oriente u occidente de la ciudad.

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.

cor_matrix <- cor(north_houses[, c("preciom",  "areaconst", "banios", "habitaciones", "estrato")])

print(cor_matrix)
##                preciom areaconst    banios habitaciones   estrato
## preciom      1.0000000 0.7313480 0.5233357    0.3227096 0.6123503
## areaconst    0.7313480 1.0000000 0.4628152    0.3753323 0.4573818
## banios       0.5233357 0.4628152 1.0000000    0.5755314 0.4083039
## habitaciones 0.3227096 0.3753323 0.5755314    1.0000000 0.1073141
## estrato      0.6123503 0.4573818 0.4083039    0.1073141 1.0000000
library(corrplot)
library(dplyr)

cor_matrix <- cor(north_houses[, c("preciom", "areaconst", "banios", "habitaciones", "estrato")])
corrplot(cor_matrix,method = "number")

library(GGally)
ggpairs(north_houses[, c("preciom", "areaconst", "banios", "habitaciones", "estrato")],
         title = "Correlación",
         upper = list(continuous = wrap("cor", color = "red")),
         lower = list(continuous = "points"),
         diag = list(continuous = "density"))
## Warning in check_and_set_ggpairs_defaults("diag", diag, continuous =
## "densityDiag", : Changing diag$continuous from 'density' to 'densityDiag'

El coeficiente de correlación entre “preciom” y “areaconst” es 0.731, lo que indica que hay una fuerte correlación positiva. Cuanto mayor es el área construida, mayor es el precio de la vivienda.

El coeficiente de correlación entre “preciom” y “estrato” es 0.612. Cuanto más alto es el nivel socioeconómico, más cara es la vivienda.

El coeficiente de correlación entre “preciom” y “baños” es 0.523. Cuanto más baños tiene una vivienda, más cara es.

El coeficiente de correlación entre “preciom” y “habitaciones” es 0.323, lo que indica que hay una correlación positiva débil. Cuanto más habitaciones tiene una vivienda, más cara es.

Entre “areaconst” y “baños”, el coeficiente de correlación es 0.463, lo que indica una correlación positiva moderada. Cuanto más grande es el área construida, hay una tendencia a que haya más baños.

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

model_rlm <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = north_houses)
summary(model_rlm)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = north_houses)
## 
## 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

Tenemos un intercepto de -238.17

El coeficiente de “areaconst” es 0.677 muestra que por cada unidad adicional de área construida, se espera que el precio de la vivienda aumente en 0.677.

El coeficiente de “estrato” es 80.63 Se espera que el precio de la vivienda aumente en 80.63 a medida que sube el estrato.

El R2 del modelo es de 0.6041 o 60.41%. Esto significa que el 60.41% de la variabilidad en los precios de las viviendas se puede explicar por este modelo.

El R2 ajustado de 0.5995, muestra que es una buena aproximación a los datos, pero que se puede mejorar.

Para mejorar el modelo se podria:

4.

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

library(ggfortify)
plot(model_rlm)

shapiro_test <- shapiro.test(residuals(model_rlm))
print(shapiro_test)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(model_rlm)
## W = 0.85246, p-value < 2.2e-16

El el valor de W

El valor tan bajo muestra que los datos no siguen una distribución normal, para mejorar esto se podria hacer una transformacion a los mismos antes de correr el modelo.

library(lmtest)
dw_test <- dwtest(model_rlm)
print(dw_test)
## 
##  Durbin-Watson test
## 
## data:  model_rlm
## DW = 1.7615, p-value = 0.005472
## alternative hypothesis: true autocorrelation is greater than 0

En este caso, el p-valor del test de Durbin-Watson es menor a 0.005472, lo que es menor que el nivel de significancia de 0.05. Por lo tanto, se rechaza la hipótesis nula de no autocorrelación.

vif_model <- vif(model_rlm)
vif_model
##    areaconst      estrato habitaciones parqueaderos       banios 
##     1.460998     1.307757     1.721015     1.226334     1.967421

Los valores de VIF son bajos lo que indica que la multicolinealidad no es un problema en este modelo.

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.

library(caret)

set.seed(56)
train_idx <- createDataPartition(north_houses$preciom, p = 0.7, list = FALSE)
train_set <- north_houses[train_idx, ]
test_set <- north_houses[-train_idx, ]
model_rlm_70 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = train_set)
summary(model_rlm_70)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = train_set)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -764.78  -87.15  -16.69   45.69  965.41 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -278.40547   55.90711  -4.980 1.07e-06 ***
## areaconst       0.64011    0.06388  10.021  < 2e-16 ***
## estrato        87.31794   12.36540   7.061 1.11e-11 ***
## habitaciones   13.38427    7.39504   1.810  0.07129 .  
## parqueaderos   21.47457    7.31538   2.936  0.00358 ** 
## banios         18.53737    9.50230   1.951  0.05199 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 167.1 on 306 degrees of freedom
##   (195 observations deleted due to missingness)
## Multiple R-squared:  0.5769, Adjusted R-squared:   0.57 
## F-statistic: 83.45 on 5 and 306 DF,  p-value: < 2.2e-16

6.

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

test_set_no_na <- na.omit(test_set)
pred_values <- predict(model_rlm_70, newdata = test_set_no_na)

head(pred_values,5)
##        1        2        3        4        5 
## 451.6052 522.1377 544.3696 335.8295 165.4649
head(test_set_no_na$preciom,5)
## [1] 320 625 750 600 140
print((sum(pred_values)))
## [1] 35147.65
print((sum(test_set_no_na$preciom)))
## [1] 34841

7.

Calcule el error cuadrático medio, el error absoluto medio y el R2, interprete.

mse <- mean((test_set_no_na$preciom - pred_values)^2)
print(mse)
## [1] 18325.62

el error cuadrado es de 18325 lo que indica que este modelo no es tan preciso

mae <- mean(abs(test_set_no_na$preciom - pred_values))
print(mae)
## [1] 102.3109
rsq <- summary(model_rlm_70)$r.squared
print(rsq)
## [1] 0.5768952

este valor del R2 Ajustado indica que el modelo no es tan preciso, puesto que explica aproximadamente el 57% de la variabilidad en los precios de las viviendas en el conjunto de pruebas.