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
Los árboles de regresión/clasificación tienen como objetivo predecir la variable respuesta Y en función de covariables. (Hernández, 2020)
Los árboles de regresión permiten al igual que otros modelos de regresión predecir una variable dependiente Y en relación varias variables independentes Xs.
Se recomienda apoyare del caso del enlace: (Pizarro, 2020)
library(rpart) # Arboles
library(rpart.plot) # Visualizar y represenar árboles
library(caret) # Para llevar a cabo particiones de conjuntos de datos en caso de...
library(dplyr) # Para select, filter, mutate, arange ....
library(readr) # Para leer datos
library(ggplot2) # Para grafica mas vistosas
library(reshape) # Para renombrar columnas
library(knitr)
options(scipen = 999) # Notación normal para que no salga notación científica
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 81930710000000 1572540.0
## 2) construccion< 205.5 30 6480123000000 991950.7
## 4) construccion< 152.5578 23 1930233000000 807892.2
## 8) construccion< 96.5 12 116237700000 603043.3 *
## 9) construccion>=96.5 11 761104500000 1031364.0 *
## 5) construccion>=152.5578 7 1210533000000 1596714.0 *
## 3) construccion>=205.5 8 27416120000000 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 <- 2
recamaras <- 3
banio <- 2
construccion <- 250
terreno = 201
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"
Hernández, F. (2020). Modelos predictivos. https://fhernanb.github.io/libro_mod_pred/
Pizarro, R. (2020). Arboles de regresion para predecir el precio de casas en melbourne. https://rpubs.com/rpizarro/581253