Construir un modelo basado en árboles de regresión y realizar predicciones
Con los datos de precios de casas aplicar un modelo de árboles de regresión y realizar predicciones
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)
datos <- read.csv("https://raw.githubusercontent.com/rpizarrog/FundamentosMachineLearning/master/datos/datos%20precios%20de%20casas.csv", encoding = "UTF-8")
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")
| 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 |
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))
| 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))
| 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 |
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 *
Dibujar el árbol mediante la función prp()
prp(modelo, type = 2, nn = TRUE,
fallen.leaves = TRUE, faclen = 4,
varlen = 8, shadow.col = "gray")
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
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 |
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"
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
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.