Objetivo:

Determinar la ecuación de regresión lineal múltiple y predecir valores en datos de precios de casa de Durango, México.

Descripción:

En el caso se muestra cómo utilizar una función de regresión lineal múltiple además de determinar sus ecuaciones y ser aplicadas al conjunto de datos de precios en casas de Durango, México.

Proceso

1. Cargar librerías

library(readr)
library(knitr)
library(dplyr)
library(caret)

2. Cargar y leer datos

datos_casas <- read.csv("https://raw.githubusercontent.com/rpizarrog/FundamentosMachineLearning/master/datos/precio.casas.limpio.csv", encoding = "UTF-8")

kable(head(datos_casas))
X precio estacionamientos recamaras banio construccion terreno
1 1780000 2 3 2 169 126
2 650000 1 3 1 90 90
3 590000 2 2 2 63 90
4 1300000 2 3 2 130 120
5 1000000 2 2 1 110 160
6 465000 2 3 1 53 89

3. Describir y explorar los datos

summary(datos_casas)
       X            precio        estacionamientos   recamaras    
 Min.   : 1.0   Min.   : 462000   Min.   :0.000    Min.   :1.000  
 1st Qu.:13.5   1st Qu.: 655000   1st Qu.:0.000    1st Qu.:2.000  
 Median :26.0   Median :1000000   Median :1.000    Median :3.000  
 Mean   :26.0   Mean   :1514383   Mean   :1.059    Mean   :2.824  
 3rd Qu.:38.5   3rd Qu.:1938500   3rd Qu.:2.000    3rd Qu.:3.000  
 Max.   :51.0   Max.   :8200000   Max.   :3.000    Max.   :5.000  
                                                                  
     banio        construccion       terreno     
 Min.   :1.000   Min.   : 47.00   Min.   : 47.0  
 1st Qu.:1.000   1st Qu.: 75.75   1st Qu.: 90.0  
 Median :2.000   Median :131.00   Median :126.0  
 Mean   :1.706   Mean   :151.12   Mean   :148.7  
 3rd Qu.:2.000   3rd Qu.:169.75   3rd Qu.:166.0  
 Max.   :4.000   Max.   :606.00   Max.   :512.0  
                 NA's   :1                       
str(datos_casas)
'data.frame':   51 obs. of  7 variables:
 $ X               : int  1 2 3 4 5 6 7 8 9 10 ...
 $ precio          : int  1780000 650000 590000 1300000 1000000 465000 780000 464520 660000 580000 ...
 $ estacionamientos: int  2 1 2 2 2 2 2 0 0 0 ...
 $ recamaras       : int  3 3 2 3 2 3 1 2 3 3 ...
 $ banio           : num  2 1 2 2 1 1 1 1 1 1 ...
 $ construccion    : num  169 90 63 130 110 53 84 47 73 65 ...
 $ terreno         : num  126 90 90 120 160 89 90 98 112 103 ...

4. Partición de datos (entrenamiento, validación)

set.seed(2020)
particion <- createDataPartition(y = datos_casas$precio, p = 0.7, list = FALSE, times = 1)

conjunto_entrenamiento <- datos_casas[particion, ]
conjunto_validacion <- datos_casas[-particion, ]

kable(head(conjunto_entrenamiento,10), caption = "Datos de entrenamiento (primeros díez registros)", row.names = 1:nrow(conjunto_entrenamiento))
Datos de entrenamiento (primeros díez registros)
X precio estacionamientos recamaras banio construccion terreno
2 2 650000 1 3 1 90 90
3 3 590000 2 2 2 63 90
4 4 1300000 2 3 2 130 120
5 5 1000000 2 2 1 110 160
7 7 780000 2 1 1 84 90
8 8 464520 0 2 1 47 98
10 10 580000 0 3 1 65 103
11 11 1550000 2 3 2 155 126
12 12 640000 0 2 1 NA 90
14 14 480000 0 2 1 53 90
kable(head(conjunto_validacion,10), caption = "Datos de validación (primeros díez registros)", row.names = 1:nrow(conjunto_validacion))
Datos de validación (primeros díez registros)
X precio estacionamientos recamaras banio construccion terreno
1 1 1780000 2 3 2.0 169.00 126
6 6 465000 2 3 1.0 53.00 89
9 9 660000 0 3 1.0 73.00 112
13 13 2350000 2 3 2.5 194.56 203
16 16 1000000 2 3 2.0 110.00 120
23 23 660000 0 3 1.0 73.00 112
25 25 1750000 1 3 2.0 154.00 130
32 32 2100000 0 4 2.0 151.00 151
34 34 640000 1 2 1.0 60.00 90
35 35 462000 1 2 1.0 47.00 90

5. Determinar el modelo

modelo <- lm(formula = precio ~ ., conjunto_entrenamiento)
summary(modelo)

Call:
lm(formula = precio ~ ., data = conjunto_entrenamiento)

Residuals:
    Min      1Q  Median      3Q     Max 
-944762 -158789   44034  211527 1257760 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)       -990941     302842  -3.272  0.00269 ** 
X                     678       5193   0.131  0.89699    
estacionamientos   -75450      86700  -0.870  0.39107    
recamaras          -74367     112515  -0.661  0.51368    
banio              597370     148899   4.012  0.00037 ***
construccion         1794       1691   1.061  0.29727    
terreno              9708       1762   5.509 5.54e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 424500 on 30 degrees of freedom
  (1 observation deleted due to missingness)
Multiple R-squared:  0.9333,    Adjusted R-squared:  0.9199 
F-statistic: 69.94 on 6 and 30 DF,  p-value: 2.76e-16

6. Realizar predicciones con el conjunto de datos de validación

prediccion <- predict(object = modelo, newdata = conjunto_validacion)
prediccion
        1         6         9        13        16        23        25        32 
1356803.5  195566.1  607656.7 2456982.9 1202900.9  617149.3 1460453.8 1664769.2 
       34        35        45        49        51 
 386632.2  363992.7 1100045.8  933346.4 2941333.3 

Ver los datos en una tabla

df_prediccion <- data.frame(conjunto_validacion, prediccion)

kable(df_prediccion)
X precio estacionamientos recamaras banio construccion terreno prediccion
1 1 1780000 2 3 2.0 169.00 126 1356803.5
6 6 465000 2 3 1.0 53.00 89 195566.1
9 9 660000 0 3 1.0 73.00 112 607656.7
13 13 2350000 2 3 2.5 194.56 203 2456982.9
16 16 1000000 2 3 2.0 110.00 120 1202900.9
23 23 660000 0 3 1.0 73.00 112 617149.3
25 25 1750000 1 3 2.0 154.00 130 1460453.8
32 32 2100000 0 4 2.0 151.00 151 1664769.2
34 34 640000 1 2 1.0 60.00 90 386632.2
35 35 462000 1 2 1.0 47.00 90 363992.7
45 45 960000 1 3 2.0 162.00 90 1100045.8
49 49 1200000 1 3 1.5 115.00 112 933346.4
51 51 3450000 2 3 2.0 200.00 280 2941333.3

7. Realizar predicciones con datos nuevos

df_nuevos_datos <- data.frame(X = 52, estacionamientos = 1, recamaras = 4, banio = 2, construccion = 200, terreno = 250)

prediccion <- predict(object = modelo, newdata = df_nuevos_datos)

paste("El precio predicho es de: ", round(prediccion,2))
[1] "El precio predicho es de:  2651855.93"

8. Interpretación del caso

De todas las variables en el conjunto de datos se tomaron las siguientes: número de estacionamientos, recamaras, baños y los metros de construcción y terreno, siendo las más significativas estadísticamente el número de baños y los metros de terreno. Las predicciones realizadas se acercan a los precios reales de las casas, algunas en valores más bajos pero cerca del precio encontrado en los datos, sus valores Multiple R-Squared y Adjusted R-Squared son de 0.93 y 0.91 respectivamente, lo que nos dice que dichas variables en el modelo explican el 90% del precio de las casas en el estado de Durango.