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
- Cargar librerías
- Cargar y leer datos
- Describir y explorar los datos
- Partición de datos (entrenamiento, validación)
- Determinar el modelo
- Realizar predicciones con el conjunto de datos de validación
- Realizar predicciones con datos nuevos
- Interpretación del caso
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))
| 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)
| 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)
| 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)
| 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.