Objetivo

Construir un modelo basado en árboles de regresión y realizar predicciones

Descripción

Con los datos de precios de casas aplicar un modelo de árboles de regresión y realizar predicciones

Proceso

1. Cargar librerías

library(rpart)      
library(rpart.plot) 
## Warning: package 'rpart.plot' was built under R version 4.0.3
library(caret)      
## Loading required package: lattice
## Loading required package: ggplot2
library(dplyr)      
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(readr)    
library(ggplot2)    
library(reshape2)    
library(knitr)

2. Cargar los datos

datos <- read.csv("https://raw.githubusercontent.com/rpizarrog/FundamentosMachineLearning/master/datos/datos%20precios%20de%20casas.csv", encoding = "UTF-8")

3. Limpiar datos

  • Quitar columnas que no se necesitan
  • Poner banio al nombre de la variable
  • Poner 0 los NA en todas las variables porque no tiene estacionamiento
datos <- datos[,c(1,2,3,4,7,8)]
names(datos)[4] <- c("banio")

datos <- mutate(datos, estacionamientos = ifelse(is.na(estacionamientos) ,0,estacionamientos ))

datos <- mutate(datos, construccion = ifelse(is.na(construccion),mean(construccion, na.rm = TRUE),construccion ))

kable(head(datos), caption = "Los datos")
Los datos
precio estacionamientos recamaras banio construccion terreno
1780000 2 3 2 169 126
650000 1 3 1 90 90
590000 2 2 2 63 90
1300000 2 3 2 130 120
1000000 2 2 1 110 160
465000 2 3 1 53 89

4. Datos de entrenamiento y datos de validación

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

# Datos entrenamiento
datos.entrenamiento <- datos[entrena, ]  # [renglones, columna]

# Datos validación
datos.validacion <- datos[-entrena, ]

kable(head(datos.entrenamiento, 10), caption = "Datos de entrenamiento  (primeros diez)", row.names = 1:nrow(datos.entrenamiento))
Datos de entrenamiento (primeros diez)
precio estacionamientos recamaras banio construccion terreno
2 650000 1 3 1 90.0000 90
3 590000 2 2 2 63.0000 90
4 1300000 2 3 2 130.0000 120
5 1000000 2 2 1 110.0000 160
7 780000 2 1 1 84.0000 90
8 464520 0 2 1 47.0000 98
10 580000 0 3 1 65.0000 103
11 1550000 2 3 2 155.0000 126
12 640000 0 2 1 151.1156 90
14 480000 0 2 1 53.0000 90
kable(head(datos.validacion, 10), caption = "Datos de validación  (primeros diez)", row.names = 1:nrow(datos.entrenamiento))
Datos de validación (primeros diez)
precio estacionamientos recamaras banio construccion terreno
1 1780000 2 3 2.0 169.00 126
6 465000 2 3 1.0 53.00 89
9 660000 0 3 1.0 73.00 112
13 2350000 2 3 2.5 194.56 203
16 1000000 2 3 2.0 110.00 120
23 660000 0 3 1.0 73.00 112
25 1750000 1 3 2.0 154.00 130
32 2100000 0 4 2.0 151.00 151
34 640000 1 2 1.0 60.00 90
35 462000 1 2 1.0 47.00 90

5. Generar el modelo de árbol de regresión

  • El comando para generar un modelo de árbol de decisión, usando la librería rpart
  • La función lleva el mismo nombre
set.seed(2020) # Semilla

modelo <- rpart(formula = precio  ~ ., data = datos.entrenamiento)

modelo
## n= 38 
## 
## node), split, n, deviance, yval
##       * denotes terminal node
## 
## 1) root 38 8.193071e+13 1572540.0  
##   2) construccion< 205.5 30 6.480123e+12  991950.7  
##     4) construccion< 152.5578 23 1.930233e+12  807892.2  
##       8) construccion< 96.5 12 1.162377e+11  603043.3 *
##       9) construccion>=96.5 11 7.611045e+11 1031364.0 *
##     5) construccion>=152.5578 7 1.210533e+12 1596714.0 *
##   3) construccion>=205.5 8 2.741612e+13 3749750.0 *

6. Visualizar el modelo

Dibujar el árbol mediante la función prp()

prp(modelo, type = 2, nn = TRUE, 
    fallen.leaves = TRUE, faclen = 4,
    varlen = 8,  shadow.col = "gray")

7. Predecir con datos de validación

prediccion <- predict(object = modelo, newdata =  datos.validacion)

prediccion
##         1         6         9        13        16        23        25        32 
## 1596714.3  603043.3  603043.3 1596714.3 1031363.6  603043.3 1596714.3 1031363.6 
##        34        35        45        49        51 
##  603043.3  603043.3 1596714.3 1031363.6 1596714.3
  • Ver los datos de la predicción en un tabla
predicciones <- data.frame(datos.validacion, prediccion)

kable(predicciones)
precio estacionamientos recamaras banio construccion terreno prediccion
1 1780000 2 3 2.0 169.00 126 1596714.3
6 465000 2 3 1.0 53.00 89 603043.3
9 660000 0 3 1.0 73.00 112 603043.3
13 2350000 2 3 2.5 194.56 203 1596714.3
16 1000000 2 3 2.0 110.00 120 1031363.6
23 660000 0 3 1.0 73.00 112 603043.3
25 1750000 1 3 2.0 154.00 130 1596714.3
32 2100000 0 4 2.0 151.00 151 1031363.6
34 640000 1 2 1.0 60.00 90 603043.3
35 462000 1 2 1.0 47.00 90 603043.3
45 960000 1 3 2.0 162.00 90 1596714.3
49 1200000 1 3 1.5 115.00 112 1031363.6
51 3450000 2 3 2.0 200.00 280 1596714.3

8. Predecir con nuevo registro y nuevos valores

estacionamientos <- 1
recamaras <- 4
banio <- 2
construccion <- 300
terreno <- 215

nuevos.datos <- data.frame(estacionamientos=estacionamientos,recamaras=recamaras, banio=banio, construccion=construccion,terreno=terreno)

prediccion <- predict(object = modelo, 
                      newdata = nuevos.datos)
                      
                      

paste("El valor del precio predicho es: ", round(prediccion, 2))
## [1] "El valor del precio predicho es:  3749750"

9. Comparar el modelo con el modelo de regresión múltiple

Toamndo en cuenta el modelo de regresión multiple para este conjunto de datos que se realizo en el caso 10 obtenido en esta liga: https://rpubs.com/BernardoSJ/685702

Se realizarón predicciones para el registro con los mismos valores presentados en este caso, y la diferencia principal es que el modelo de regresión multiple toma los todos los atributos incluso los que no tienen un significado estadistico relevante (Son casí todos) y además evalua uno de los atributos como un atributo no relevante para el modelo

En cambio el modelo de arboles de regresión solo toma como relevante uno de los atributos para realizar su analisis (el de construcción) y este en la vida real es muy significativo lo que puede significar que el modelo se apega más a la realidad. Y como lo podemos ver el modelo predice en el nuevo registro un precio más alto que el modelo de regresión multiple

10. Interpretación

Este conjunto de datos fue retomado de otro caso en el cual se hizo un análisis en el que se aplicó regresión lineal múltiple, igual que en ese caso la variable dependiente es el precio y las demás variables estacionamiento, recamaras, banio, construcción, terreno. Para este modelo como podemos ver solo se tomo como variable significativa la construcción, me atrevo a decir que quizás este modelo se podría apegar un poco más a la vida real ya que muchas agencias de bienes raíces toman mucho en cuenta el espacio construido, el modelo evalúa ese valor y de ahí va haciendo comparaciones y se determina el costo total, no es como el caso de regresión múltiple con este conjunto de datos ya que ese toma muchos de los valores que no son estadísticamente significativos. Sin embargo, para que el modelo pudiera ser mas completo en sus predicciones se debió de haber usado una mayor cantidad de registros ya que este conjunto de datos es muy pequeño comparado con otros. Y de esa manera quizás el modelo tome en cuenta las demás variables y de esa manera las predicciones puedan mejorar bastante.