Construir y evaluar un modelo de árbol de regresión para realizar predicciones y comparar resultados con el modelo de regresión lineal múltiple.
Se cargan las librerías necesarias
Se cargan los datos Se exploran los datos
Se crean los datos de entrenamiento y validación 70% y 30% respectivamente
Las métricas a valorar serán:
Que los coeficientes sean estadísticamente significativos por encima del 95%.
R Squared Ajustado el modelo se acepta si sobrepasa en el 80%
rmse comparado con otro modelo mismos datos se acepta o se establece que un modelo es mejor que otro.
Comparaciones con el modelo de regresión lineal múltiple
Los árboles de regresión/clasificación tienen como objetivo predecir la variable respuesta Y en función de covariables. 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.
library(readr) # Para importar datos
library(dplyr) # Para filtrar
library(knitr) # Para datos tabulares
library(ggplot2) # Para visualizar
library(plotly)
library(caret) # Para particionar
library(Metrics) # Para determinar rmse
library(rpart) # Para árbol
library(rpart.plot) # Para árbol
datos <- read.csv("https://raw.githubusercontent.com/rpizarrog/Analisis-Inteligente-de-datos/main/datos/Advertising.csv")
## X TV Radio Newspaper
## Min. : 1.00 Min. : 0.70 Min. : 0.000 Min. : 0.30
## 1st Qu.: 50.75 1st Qu.: 74.38 1st Qu.: 9.975 1st Qu.: 12.75
## Median :100.50 Median :149.75 Median :22.900 Median : 25.75
## Mean :100.50 Mean :147.04 Mean :23.264 Mean : 30.55
## 3rd Qu.:150.25 3rd Qu.:218.82 3rd Qu.:36.525 3rd Qu.: 45.10
## Max. :200.00 Max. :296.40 Max. :49.600 Max. :114.00
## Sales
## Min. : 1.60
## 1st Qu.:10.38
## Median :12.90
## Mean :14.02
## 3rd Qu.:17.40
## Max. :27.00
str(datos)
## 'data.frame': 200 obs. of 5 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ TV : num 230.1 44.5 17.2 151.5 180.8 ...
## $ Radio : num 37.8 39.3 45.9 41.3 10.8 48.9 32.8 19.6 2.1 2.6 ...
## $ Newspaper: num 69.2 45.1 69.3 58.5 58.4 75 23.5 11.6 1 21.2 ...
## $ Sales : num 22.1 10.4 9.3 18.5 12.9 7.2 11.8 13.2 4.8 10.6 ...
Son 200 registros tres variables independientes y una variable dependiente.
La variable dependiente o variable objetivo es Sales que deberá estar en función de la inversión que se hace en TV, Radio o Newspaper.
Quitar la variable x que no es de interés
datos <- datos %>%
select (TV, Radio, Newspaper, Sales)
kable(head(datos, 20), caption = "Primeros 20 registros")
| TV | Radio | Newspaper | Sales |
|---|---|---|---|
| 230.1 | 37.8 | 69.2 | 22.1 |
| 44.5 | 39.3 | 45.1 | 10.4 |
| 17.2 | 45.9 | 69.3 | 9.3 |
| 151.5 | 41.3 | 58.5 | 18.5 |
| 180.8 | 10.8 | 58.4 | 12.9 |
| 8.7 | 48.9 | 75.0 | 7.2 |
| 57.5 | 32.8 | 23.5 | 11.8 |
| 120.2 | 19.6 | 11.6 | 13.2 |
| 8.6 | 2.1 | 1.0 | 4.8 |
| 199.8 | 2.6 | 21.2 | 10.6 |
| 66.1 | 5.8 | 24.2 | 8.6 |
| 214.7 | 24.0 | 4.0 | 17.4 |
| 23.8 | 35.1 | 65.9 | 9.2 |
| 97.5 | 7.6 | 7.2 | 9.7 |
| 204.1 | 32.9 | 46.0 | 19.0 |
| 195.4 | 47.7 | 52.9 | 22.4 |
| 67.8 | 36.6 | 114.0 | 12.5 |
| 281.4 | 39.6 | 55.8 | 24.4 |
| 69.2 | 20.5 | 18.3 | 11.3 |
| 147.3 | 23.9 | 19.1 | 14.6 |
kable(tail(datos, 20), caption = "Últimos 20 registros")
| TV | Radio | Newspaper | Sales | |
|---|---|---|---|---|
| 181 | 156.6 | 2.6 | 8.3 | 10.5 |
| 182 | 218.5 | 5.4 | 27.4 | 12.2 |
| 183 | 56.2 | 5.7 | 29.7 | 8.7 |
| 184 | 287.6 | 43.0 | 71.8 | 26.2 |
| 185 | 253.8 | 21.3 | 30.0 | 17.6 |
| 186 | 205.0 | 45.1 | 19.6 | 22.6 |
| 187 | 139.5 | 2.1 | 26.6 | 10.3 |
| 188 | 191.1 | 28.7 | 18.2 | 17.3 |
| 189 | 286.0 | 13.9 | 3.7 | 15.9 |
| 190 | 18.7 | 12.1 | 23.4 | 6.7 |
| 191 | 39.5 | 41.1 | 5.8 | 10.8 |
| 192 | 75.5 | 10.8 | 6.0 | 9.9 |
| 193 | 17.2 | 4.1 | 31.6 | 5.9 |
| 194 | 166.8 | 42.0 | 3.6 | 19.6 |
| 195 | 149.7 | 35.6 | 6.0 | 17.3 |
| 196 | 38.2 | 3.7 | 13.8 | 7.6 |
| 197 | 94.2 | 4.9 | 8.1 | 9.7 |
| 198 | 177.0 | 9.3 | 6.4 | 12.8 |
| 199 | 283.6 | 42.0 | 66.2 | 25.5 |
| 200 | 232.1 | 8.6 | 8.7 | 13.4 |
n <- nrow(datos)
# Modificar la semilla estableciendo como parámetro los útimos cuatro dígitos de su no de control.
# Ej. set.seed(0732), o set.seed(1023)
# set.seed(2022)
set.seed(0421)
De manera aleatoria se construyen los datos de entrenamiento y los datos de validación.
En la variable entrena se generan los registros que van a ser los datos de entrenamiento, de tal forma que los datos de validación serán los que no sena de entrenamiento [-entrena].
entrena <- createDataPartition(y = datos$Sales, p = 0.70, list = FALSE, times = 1)
# Datos entrenamiento
datos.entrenamiento <- datos[entrena, ] # [renglones, columna]
# Datos validación
datos.validacion <- datos[-entrena, ]
kable(head(datos.entrenamiento, 20), caption = "Datos de Entrenamiento. Primeros 20 registros")
| TV | Radio | Newspaper | Sales | |
|---|---|---|---|---|
| 1 | 230.1 | 37.8 | 69.2 | 22.1 |
| 2 | 44.5 | 39.3 | 45.1 | 10.4 |
| 3 | 17.2 | 45.9 | 69.3 | 9.3 |
| 5 | 180.8 | 10.8 | 58.4 | 12.9 |
| 6 | 8.7 | 48.9 | 75.0 | 7.2 |
| 7 | 57.5 | 32.8 | 23.5 | 11.8 |
| 12 | 214.7 | 24.0 | 4.0 | 17.4 |
| 13 | 23.8 | 35.1 | 65.9 | 9.2 |
| 14 | 97.5 | 7.6 | 7.2 | 9.7 |
| 15 | 204.1 | 32.9 | 46.0 | 19.0 |
| 16 | 195.4 | 47.7 | 52.9 | 22.4 |
| 17 | 67.8 | 36.6 | 114.0 | 12.5 |
| 18 | 281.4 | 39.6 | 55.8 | 24.4 |
| 19 | 69.2 | 20.5 | 18.3 | 11.3 |
| 20 | 147.3 | 23.9 | 19.1 | 14.6 |
| 21 | 218.4 | 27.7 | 53.4 | 18.0 |
| 22 | 237.4 | 5.1 | 23.5 | 12.5 |
| 23 | 13.2 | 15.9 | 49.6 | 5.6 |
| 24 | 228.3 | 16.9 | 26.2 | 15.5 |
| 25 | 62.3 | 12.6 | 18.3 | 9.7 |
kable(tail(datos.entrenamiento, 20), caption = "Datos de entrenamiento ültimos 20 registros")
| TV | Radio | Newspaper | Sales | |
|---|---|---|---|---|
| 172 | 164.5 | 20.9 | 47.4 | 14.5 |
| 174 | 168.4 | 7.1 | 12.8 | 11.7 |
| 175 | 222.4 | 3.4 | 13.1 | 11.5 |
| 176 | 276.9 | 48.9 | 41.8 | 27.0 |
| 177 | 248.4 | 30.2 | 20.3 | 20.2 |
| 179 | 276.7 | 2.3 | 23.7 | 11.8 |
| 180 | 165.6 | 10.0 | 17.6 | 12.6 |
| 181 | 156.6 | 2.6 | 8.3 | 10.5 |
| 182 | 218.5 | 5.4 | 27.4 | 12.2 |
| 183 | 56.2 | 5.7 | 29.7 | 8.7 |
| 186 | 205.0 | 45.1 | 19.6 | 22.6 |
| 190 | 18.7 | 12.1 | 23.4 | 6.7 |
| 191 | 39.5 | 41.1 | 5.8 | 10.8 |
| 193 | 17.2 | 4.1 | 31.6 | 5.9 |
| 194 | 166.8 | 42.0 | 3.6 | 19.6 |
| 196 | 38.2 | 3.7 | 13.8 | 7.6 |
| 197 | 94.2 | 4.9 | 8.1 | 9.7 |
| 198 | 177.0 | 9.3 | 6.4 | 12.8 |
| 199 | 283.6 | 42.0 | 66.2 | 25.5 |
| 200 | 232.1 | 8.6 | 8.7 | 13.4 |
Los datos de validación deben ser diferentes a los datos den entrenamiento.
kable(head(datos.validacion, 20), caption = "Datos de Validación Primeros 20 registros")
| TV | Radio | Newspaper | Sales | |
|---|---|---|---|---|
| 4 | 151.5 | 41.3 | 58.5 | 18.5 |
| 8 | 120.2 | 19.6 | 11.6 | 13.2 |
| 9 | 8.6 | 2.1 | 1.0 | 4.8 |
| 10 | 199.8 | 2.6 | 21.2 | 10.6 |
| 11 | 66.1 | 5.8 | 24.2 | 8.6 |
| 30 | 70.6 | 16.0 | 40.8 | 10.5 |
| 31 | 292.9 | 28.3 | 43.2 | 21.4 |
| 32 | 112.9 | 17.4 | 38.6 | 11.9 |
| 36 | 290.7 | 4.1 | 8.5 | 12.8 |
| 39 | 43.1 | 26.7 | 35.1 | 10.1 |
| 40 | 228.0 | 37.7 | 32.0 | 21.5 |
| 41 | 202.5 | 22.3 | 31.6 | 16.6 |
| 42 | 177.0 | 33.4 | 38.7 | 17.1 |
| 45 | 25.1 | 25.7 | 43.3 | 8.5 |
| 53 | 216.4 | 41.7 | 39.6 | 22.6 |
| 54 | 182.6 | 46.2 | 58.7 | 21.2 |
| 56 | 198.9 | 49.4 | 60.0 | 23.7 |
| 57 | 7.3 | 28.1 | 41.4 | 5.5 |
| 58 | 136.2 | 19.2 | 16.6 | 13.2 |
| 61 | 53.5 | 2.0 | 21.4 | 8.1 |
kable(tail(datos.validacion, 20), caption = "Datos de validació últimos 20 registros")
| TV | Radio | Newspaper | Sales | |
|---|---|---|---|---|
| 120 | 19.4 | 16.0 | 22.3 | 6.6 |
| 134 | 219.8 | 33.5 | 45.1 | 19.6 |
| 137 | 25.6 | 39.0 | 9.3 | 9.5 |
| 143 | 220.5 | 33.2 | 37.9 | 20.1 |
| 144 | 104.6 | 5.7 | 34.4 | 10.4 |
| 158 | 149.8 | 1.3 | 24.3 | 10.1 |
| 161 | 172.5 | 18.1 | 30.7 | 14.4 |
| 165 | 117.2 | 14.7 | 5.4 | 11.9 |
| 166 | 234.5 | 3.4 | 84.8 | 11.9 |
| 170 | 284.3 | 10.6 | 6.4 | 15.0 |
| 171 | 50.0 | 11.6 | 18.4 | 8.4 |
| 173 | 19.6 | 20.1 | 17.0 | 7.6 |
| 178 | 170.2 | 7.8 | 35.2 | 11.7 |
| 184 | 287.6 | 43.0 | 71.8 | 26.2 |
| 185 | 253.8 | 21.3 | 30.0 | 17.6 |
| 187 | 139.5 | 2.1 | 26.6 | 10.3 |
| 188 | 191.1 | 28.7 | 18.2 | 17.3 |
| 189 | 286.0 | 13.9 | 3.7 | 15.9 |
| 192 | 75.5 | 10.8 | 6.0 | 9.9 |
| 195 | 149.7 | 35.6 | 6.0 | 17.3 |
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(0421) # Semilla
modelo <- rpart(formula = TV ~ ., data = datos.entrenamiento)
modelo
## n= 142
##
## node), split, n, deviance, yval
## * denotes terminal node
##
## 1) root 142 1065492.000 146.55920
## 2) Sales< 11.35 48 72953.810 53.62500
## 4) Sales< 9.35 24 13002.730 26.67083 *
## 5) Sales>=9.35 24 25077.780 80.57917
## 10) Radio>=10.8 13 3372.371 56.96154 *
## 11) Radio< 10.8 11 5884.389 108.49090 *
## 3) Sales>=11.35 94 366281.700 194.01490
## 6) Sales< 19.65 69 244046.700 174.50290
## 12) Radio>=28.1 23 50613.840 123.72610
## 24) Sales< 16.8 14 10703.900 92.80000 *
## 25) Sales>=16.8 9 5691.260 171.83330 *
## 13) Radio< 28.1 46 104482.100 199.89130
## 26) Radio>=5.15 38 83410.040 191.23160
## 52) Sales< 14.7 19 32808.010 164.64740 *
## 53) Sales>=14.7 19 23746.670 217.81580 *
## 27) Radio< 5.15 8 4686.535 241.02500 *
## 7) Sales>=19.65 25 23461.490 247.86800 *
## 4 8 9 10 11 30 31 32
## 171.83333 164.64737 26.67083 108.49091 26.67083 56.96154 247.86800 164.64737
## 36 39 40 41 42 45 53 54
## 241.02500 56.96154 247.86800 217.81579 171.83333 26.67083 247.86800 247.86800
## 56 57 58 61 63 65 67 71
## 247.86800 26.67083 164.64737 26.67083 217.81579 171.83333 56.96154 171.83333
## 79 81 85 87 88 89 91 93
## 26.67083 164.64737 247.86800 164.64737 92.80000 164.64737 108.49091 171.83333
## 97 101 104 111 114 116 120 134
## 241.02500 241.02500 217.81579 164.64737 217.81579 92.80000 26.67083 171.83333
## 137 143 144 158 161 165 166 170
## 56.96154 247.86800 108.49091 108.49091 164.64737 164.64737 241.02500 217.81579
## 171 173 178 184 185 187 188 189
## 26.67083 26.67083 164.64737 247.86800 217.81579 108.49091 171.83333 217.81579
## 192 195
## 56.96154 171.83333
predicciones <- data.frame(datos.validacion, prediccion)
kable(tail(predicciones, 20), caption = "Ultimos 20 registros")
| TV | Radio | Newspaper | Sales | prediccion | |
|---|---|---|---|---|---|
| 120 | 19.4 | 16.0 | 22.3 | 6.6 | 26.67083 |
| 134 | 219.8 | 33.5 | 45.1 | 19.6 | 171.83333 |
| 137 | 25.6 | 39.0 | 9.3 | 9.5 | 56.96154 |
| 143 | 220.5 | 33.2 | 37.9 | 20.1 | 247.86800 |
| 144 | 104.6 | 5.7 | 34.4 | 10.4 | 108.49091 |
| 158 | 149.8 | 1.3 | 24.3 | 10.1 | 108.49091 |
| 161 | 172.5 | 18.1 | 30.7 | 14.4 | 164.64737 |
| 165 | 117.2 | 14.7 | 5.4 | 11.9 | 164.64737 |
| 166 | 234.5 | 3.4 | 84.8 | 11.9 | 241.02500 |
| 170 | 284.3 | 10.6 | 6.4 | 15.0 | 217.81579 |
| 171 | 50.0 | 11.6 | 18.4 | 8.4 | 26.67083 |
| 173 | 19.6 | 20.1 | 17.0 | 7.6 | 26.67083 |
| 178 | 170.2 | 7.8 | 35.2 | 11.7 | 164.64737 |
| 184 | 287.6 | 43.0 | 71.8 | 26.2 | 247.86800 |
| 185 | 253.8 | 21.3 | 30.0 | 17.6 | 217.81579 |
| 187 | 139.5 | 2.1 | 26.6 | 10.3 | 108.49091 |
| 188 | 191.1 | 28.7 | 18.2 | 17.3 | 171.83333 |
| 189 | 286.0 | 13.9 | 3.7 | 15.9 | 217.81579 |
| 192 | 75.5 | 10.8 | 6.0 | 9.9 | 56.96154 |
| 195 | 149.7 | 35.6 | 6.0 | 17.3 | 171.83333 |
En este análisis de datos usamos un conjunto de datos que es del conjunto de datos que abarca(TV, Sales, Newspaper, Radio). Para este análisis usamos los árboles de regresión y clasificación que tienen como objetivo predecir la variable respuesta Y en función de covariables, se uso como variable dependiente els “Sales” en este data.frame contamos con 200 observaciones y 4 variables, pero dentro de este se distribuye en datos.entrenamiento con 142 observaciones y 4 variables, y en datos.validación con 58 observaciones y 4 variables cabe mencionar que las variables independientes de inversión son en TV, Radio o Newspaper. La variable que es estadisticamente significativa es “Sales” al realizar la evaluación del modelo podemos notar que esta por encima del 90% lo que esto nos indica que es un buen modelo y y una buena predicción que esta en 94% con una evaluación por encima de 95% .Dependiendo de la variable el modelo del arbol va evaluando la construcción para calcular el valor.
Tenemos la comparación del modelo de regresión lineal que es el método mas usado en estadística para predecir valores de variables continuas debido a su facil interpretación, pero en muchas situaciones los estandares de el modelo no se cumplen y por consiguiente se tiende a forzar el modelo, llevando a conclusiones erroneas. Los arboles de regresión son una alternativa que no requiere realizar una predicción al azar sobre los datos a analizar y es un metodo de facil interpretación de los resultados. Como en este caso al visualizar el arbol de regresión.