##1.- BIBLIOTECAS

library(rpart)
library(rpart.plot)
## Warning: package 'rpart.plot' was built under R version 4.2.3
library(caret)
## Warning: package 'caret' was built under R version 4.2.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.2.3
## Loading required package: lattice
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.2.3
## 
## Attaching package: 'DescTools'
## The following objects are masked from 'package:caret':
## 
##     MAE, RMSE
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'tidyr' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'purrr' was built under R version 4.2.3
## Warning: package 'dplyr' was built under R version 4.2.3
## Warning: package 'stringr' was built under R version 4.2.3
## Warning: package 'forcats' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.3     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ✖ purrr::lift()   masks caret::lift()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

#2.- INTRODUCCIÓN

Los árboles de decisión son un método usado en distintas disciplinas como modelo de predicción. Estos son similares a diagramas de flujo, en los que llegamos a puntos en los que se toman decisiones de acuerdo a una regla.

En el campo del aprendizaje automático, hay distintas maneras de obtener árboles de decisión, la que usaremos en esta ocasión es conocida como CART: Classification And Regression Trees. Esta es una técnica de aprendizaje supervisado. Tenemos una variable objetivo (dependiente) y nuestra meta es obtener una función que nos permita predecir, a partir de variables predictoras (independientes), el valor de la variable objetivo para casos desconocidos.

Como el nombre indica, CART es una técnica con la que se pueden obtener árboles de clasificación y de regresión. Usamos clasificación cuando nuestra variable objetivo es discreta, mientras que usamos regresión cuando es continua. Nosotros tendremos una variable discreta, así que haremos clasificación.

La implementación particular de CART que usaremos es conocida como Recursive Partitioning and Regression Trees o RPART. De allí el nombre del paquete que utilizaremos en nuestro ejemplo.

De manera general, lo que hace este algoritmo es encontrar la variable independiente que mejor separa nuestros datos en grupos, que corresponden con las categorías de la variable objetivo. Esta mejor separación es expresada con una regla. A cada regla corresponde un nodo.

Por ejemplo, supongamos que nuestra variable objetivo tiene dos niveles, deudor y no deudor. Encontramos que la variable que mejor separa nuestros datos es ingreso mensual, y la regla resultante es que ingreso mensual > X pesos. Esto quiere decir que los datos para los que esta regla es verdadera, tienen más probabilidad de pertenecer a un grupo, que al otro. En este ejemplo, digamos que si la regla es verdadera, un caso tiene más probabilidad de formar parte del grupo no deudor.

Una vez hecho esto, los datos son separados (particionados) en grupos a partir de la regla obtenida. Después, para cada uno de los grupos resultantes, se repite el mismo proceso. Se busca la variable que mejor separa los datos en grupos, se obtiene una regla, y se separan los datos. Hacemos esto de manera recursiva hasta que nos es imposible obtener una mejor separación. Cuando esto ocurre, el algoritmo se detiene. Cuando un grupo no puede ser partido mejor, se le llama nodo terminal u hoja.

Una característica muy importante en este algoritmo es que una vez que alguna variable ha sido elegida para separar los datos, ya no es usada de nuevo en los grupos que ha creado. Se buscan variables distintas que mejoren la separación de los datos.

Además, supongamos después de una partición que hemos creado dos grupos, A y B. Es posible que para el grupo A, la variable que mejor separa estos datos sea diferente a la que mejor separa los datos en el grupo B. Una vez que los grupos se han separado, al algoritmo “no ve” lo que ocurre entre grupos, estos son independientes entre sí y las reglas que aplican para ellos no afectan en nada a los demás.

El resultado de todo el proceso anterior es una serie de bifurcaciones que tiene la apariencia de un árbol que va creciendo ramas, de allí el nombre del procedimiento (aunque a mí en realidad me parece más parecido a la raíz del árbol que a las ramas).

Las principales ventajas de este método son su interpretabilidad, pues nos da un conjunto de reglas a partir de las cuales se pueden tomar decisiones. Este es un algoritmo que no es demandante en poder de cómputo comparado con procedimientos más sofisticados y, a pesar de ello, que tiende a dar buenos resultados de predicción para muchos tipos de datos.

Sus principales desventajas son que este en tipo de clasificación “débil”, pues sus resultados pueden variar mucho dependiendo de la muestra de datos usados para entrenar un modelo. Además es fácil sobre ajustar los modelos, esto es, hacerlos excelentes para clasificar datos que conocemos, pero deficientes para datos conocidos.

# Datos
download.file("https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data", "wine.data")

# Información
download.file("https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.names", "wine.names")
readLines("wine.data", n = 10)
##  [1] "1,14.23,1.71,2.43,15.6,127,2.8,3.06,.28,2.29,5.64,1.04,3.92,1065"
##  [2] "1,13.2,1.78,2.14,11.2,100,2.65,2.76,.26,1.28,4.38,1.05,3.4,1050" 
##  [3] "1,13.16,2.36,2.67,18.6,101,2.8,3.24,.3,2.81,5.68,1.03,3.17,1185" 
##  [4] "1,14.37,1.95,2.5,16.8,113,3.85,3.49,.24,2.18,7.8,.86,3.45,1480"  
##  [5] "1,13.24,2.59,2.87,21,118,2.8,2.69,.39,1.82,4.32,1.04,2.93,735"   
##  [6] "1,14.2,1.76,2.45,15.2,112,3.27,3.39,.34,1.97,6.75,1.05,2.85,1450"
##  [7] "1,14.39,1.87,2.45,14.6,96,2.5,2.52,.3,1.98,5.25,1.02,3.58,1290"  
##  [8] "1,14.06,2.15,2.61,17.6,121,2.6,2.51,.31,1.25,5.05,1.06,3.58,1295"
##  [9] "1,14.83,1.64,2.17,14,97,2.8,2.98,.29,1.98,5.2,1.08,2.85,1045"    
## [10] "1,13.86,1.35,2.27,16,98,2.98,3.15,.22,1.85,7.22,1.01,3.55,1045"

El archivo de datos parece ser una tabla de datos rectangular, con columnas separadas por comas. Entonces leer este archivo es fácil. El único inconveniente que tenemos es que nos faltan los nombres de cada columna.

Podemos usar read_table() para leer este archivo. Esta función está diseñada para leer tablas de datos, es decir, con estructura rectangular (renglones y columnas).

Para asegurarnos que los datos serán leídos de manera correcta, especificamos que el separador de las columnas es una coma (sep = “,”) y que no tenemos nombres de columna en nuestro archivo (header = FALSE). Asignamos el resultado al objeto vino.

vino <- read.table("wine.data", sep = ",", header = FALSE)  
vino
##     V1    V2   V3   V4   V5  V6   V7   V8   V9  V10       V11   V12  V13  V14
## 1    1 14.23 1.71 2.43 15.6 127 2.80 3.06 0.28 2.29  5.640000 1.040 3.92 1065
## 2    1 13.20 1.78 2.14 11.2 100 2.65 2.76 0.26 1.28  4.380000 1.050 3.40 1050
## 3    1 13.16 2.36 2.67 18.6 101 2.80 3.24 0.30 2.81  5.680000 1.030 3.17 1185
## 4    1 14.37 1.95 2.50 16.8 113 3.85 3.49 0.24 2.18  7.800000 0.860 3.45 1480
## 5    1 13.24 2.59 2.87 21.0 118 2.80 2.69 0.39 1.82  4.320000 1.040 2.93  735
## 6    1 14.20 1.76 2.45 15.2 112 3.27 3.39 0.34 1.97  6.750000 1.050 2.85 1450
## 7    1 14.39 1.87 2.45 14.6  96 2.50 2.52 0.30 1.98  5.250000 1.020 3.58 1290
## 8    1 14.06 2.15 2.61 17.6 121 2.60 2.51 0.31 1.25  5.050000 1.060 3.58 1295
## 9    1 14.83 1.64 2.17 14.0  97 2.80 2.98 0.29 1.98  5.200000 1.080 2.85 1045
## 10   1 13.86 1.35 2.27 16.0  98 2.98 3.15 0.22 1.85  7.220000 1.010 3.55 1045
## 11   1 14.10 2.16 2.30 18.0 105 2.95 3.32 0.22 2.38  5.750000 1.250 3.17 1510
## 12   1 14.12 1.48 2.32 16.8  95 2.20 2.43 0.26 1.57  5.000000 1.170 2.82 1280
## 13   1 13.75 1.73 2.41 16.0  89 2.60 2.76 0.29 1.81  5.600000 1.150 2.90 1320
## 14   1 14.75 1.73 2.39 11.4  91 3.10 3.69 0.43 2.81  5.400000 1.250 2.73 1150
## 15   1 14.38 1.87 2.38 12.0 102 3.30 3.64 0.29 2.96  7.500000 1.200 3.00 1547
## 16   1 13.63 1.81 2.70 17.2 112 2.85 2.91 0.30 1.46  7.300000 1.280 2.88 1310
## 17   1 14.30 1.92 2.72 20.0 120 2.80 3.14 0.33 1.97  6.200000 1.070 2.65 1280
## 18   1 13.83 1.57 2.62 20.0 115 2.95 3.40 0.40 1.72  6.600000 1.130 2.57 1130
## 19   1 14.19 1.59 2.48 16.5 108 3.30 3.93 0.32 1.86  8.700000 1.230 2.82 1680
## 20   1 13.64 3.10 2.56 15.2 116 2.70 3.03 0.17 1.66  5.100000 0.960 3.36  845
## 21   1 14.06 1.63 2.28 16.0 126 3.00 3.17 0.24 2.10  5.650000 1.090 3.71  780
## 22   1 12.93 3.80 2.65 18.6 102 2.41 2.41 0.25 1.98  4.500000 1.030 3.52  770
## 23   1 13.71 1.86 2.36 16.6 101 2.61 2.88 0.27 1.69  3.800000 1.110 4.00 1035
## 24   1 12.85 1.60 2.52 17.8  95 2.48 2.37 0.26 1.46  3.930000 1.090 3.63 1015
## 25   1 13.50 1.81 2.61 20.0  96 2.53 2.61 0.28 1.66  3.520000 1.120 3.82  845
## 26   1 13.05 2.05 3.22 25.0 124 2.63 2.68 0.47 1.92  3.580000 1.130 3.20  830
## 27   1 13.39 1.77 2.62 16.1  93 2.85 2.94 0.34 1.45  4.800000 0.920 3.22 1195
## 28   1 13.30 1.72 2.14 17.0  94 2.40 2.19 0.27 1.35  3.950000 1.020 2.77 1285
## 29   1 13.87 1.90 2.80 19.4 107 2.95 2.97 0.37 1.76  4.500000 1.250 3.40  915
## 30   1 14.02 1.68 2.21 16.0  96 2.65 2.33 0.26 1.98  4.700000 1.040 3.59 1035
## 31   1 13.73 1.50 2.70 22.5 101 3.00 3.25 0.29 2.38  5.700000 1.190 2.71 1285
## 32   1 13.58 1.66 2.36 19.1 106 2.86 3.19 0.22 1.95  6.900000 1.090 2.88 1515
## 33   1 13.68 1.83 2.36 17.2 104 2.42 2.69 0.42 1.97  3.840000 1.230 2.87  990
## 34   1 13.76 1.53 2.70 19.5 132 2.95 2.74 0.50 1.35  5.400000 1.250 3.00 1235
## 35   1 13.51 1.80 2.65 19.0 110 2.35 2.53 0.29 1.54  4.200000 1.100 2.87 1095
## 36   1 13.48 1.81 2.41 20.5 100 2.70 2.98 0.26 1.86  5.100000 1.040 3.47  920
## 37   1 13.28 1.64 2.84 15.5 110 2.60 2.68 0.34 1.36  4.600000 1.090 2.78  880
## 38   1 13.05 1.65 2.55 18.0  98 2.45 2.43 0.29 1.44  4.250000 1.120 2.51 1105
## 39   1 13.07 1.50 2.10 15.5  98 2.40 2.64 0.28 1.37  3.700000 1.180 2.69 1020
## 40   1 14.22 3.99 2.51 13.2 128 3.00 3.04 0.20 2.08  5.100000 0.890 3.53  760
## 41   1 13.56 1.71 2.31 16.2 117 3.15 3.29 0.34 2.34  6.130000 0.950 3.38  795
## 42   1 13.41 3.84 2.12 18.8  90 2.45 2.68 0.27 1.48  4.280000 0.910 3.00 1035
## 43   1 13.88 1.89 2.59 15.0 101 3.25 3.56 0.17 1.70  5.430000 0.880 3.56 1095
## 44   1 13.24 3.98 2.29 17.5 103 2.64 2.63 0.32 1.66  4.360000 0.820 3.00  680
## 45   1 13.05 1.77 2.10 17.0 107 3.00 3.00 0.28 2.03  5.040000 0.880 3.35  885
## 46   1 14.21 4.04 2.44 18.9 111 2.85 2.65 0.30 1.25  5.240000 0.870 3.33 1080
## 47   1 14.38 3.59 2.28 16.0 102 3.25 3.17 0.27 2.19  4.900000 1.040 3.44 1065
## 48   1 13.90 1.68 2.12 16.0 101 3.10 3.39 0.21 2.14  6.100000 0.910 3.33  985
## 49   1 14.10 2.02 2.40 18.8 103 2.75 2.92 0.32 2.38  6.200000 1.070 2.75 1060
## 50   1 13.94 1.73 2.27 17.4 108 2.88 3.54 0.32 2.08  8.900000 1.120 3.10 1260
## 51   1 13.05 1.73 2.04 12.4  92 2.72 3.27 0.17 2.91  7.200000 1.120 2.91 1150
## 52   1 13.83 1.65 2.60 17.2  94 2.45 2.99 0.22 2.29  5.600000 1.240 3.37 1265
## 53   1 13.82 1.75 2.42 14.0 111 3.88 3.74 0.32 1.87  7.050000 1.010 3.26 1190
## 54   1 13.77 1.90 2.68 17.1 115 3.00 2.79 0.39 1.68  6.300000 1.130 2.93 1375
## 55   1 13.74 1.67 2.25 16.4 118 2.60 2.90 0.21 1.62  5.850000 0.920 3.20 1060
## 56   1 13.56 1.73 2.46 20.5 116 2.96 2.78 0.20 2.45  6.250000 0.980 3.03 1120
## 57   1 14.22 1.70 2.30 16.3 118 3.20 3.00 0.26 2.03  6.380000 0.940 3.31  970
## 58   1 13.29 1.97 2.68 16.8 102 3.00 3.23 0.31 1.66  6.000000 1.070 2.84 1270
## 59   1 13.72 1.43 2.50 16.7 108 3.40 3.67 0.19 2.04  6.800000 0.890 2.87 1285
## 60   2 12.37 0.94 1.36 10.6  88 1.98 0.57 0.28 0.42  1.950000 1.050 1.82  520
## 61   2 12.33 1.10 2.28 16.0 101 2.05 1.09 0.63 0.41  3.270000 1.250 1.67  680
## 62   2 12.64 1.36 2.02 16.8 100 2.02 1.41 0.53 0.62  5.750000 0.980 1.59  450
## 63   2 13.67 1.25 1.92 18.0  94 2.10 1.79 0.32 0.73  3.800000 1.230 2.46  630
## 64   2 12.37 1.13 2.16 19.0  87 3.50 3.10 0.19 1.87  4.450000 1.220 2.87  420
## 65   2 12.17 1.45 2.53 19.0 104 1.89 1.75 0.45 1.03  2.950000 1.450 2.23  355
## 66   2 12.37 1.21 2.56 18.1  98 2.42 2.65 0.37 2.08  4.600000 1.190 2.30  678
## 67   2 13.11 1.01 1.70 15.0  78 2.98 3.18 0.26 2.28  5.300000 1.120 3.18  502
## 68   2 12.37 1.17 1.92 19.6  78 2.11 2.00 0.27 1.04  4.680000 1.120 3.48  510
## 69   2 13.34 0.94 2.36 17.0 110 2.53 1.30 0.55 0.42  3.170000 1.020 1.93  750
## 70   2 12.21 1.19 1.75 16.8 151 1.85 1.28 0.14 2.50  2.850000 1.280 3.07  718
## 71   2 12.29 1.61 2.21 20.4 103 1.10 1.02 0.37 1.46  3.050000 0.906 1.82  870
## 72   2 13.86 1.51 2.67 25.0  86 2.95 2.86 0.21 1.87  3.380000 1.360 3.16  410
## 73   2 13.49 1.66 2.24 24.0  87 1.88 1.84 0.27 1.03  3.740000 0.980 2.78  472
## 74   2 12.99 1.67 2.60 30.0 139 3.30 2.89 0.21 1.96  3.350000 1.310 3.50  985
## 75   2 11.96 1.09 2.30 21.0 101 3.38 2.14 0.13 1.65  3.210000 0.990 3.13  886
## 76   2 11.66 1.88 1.92 16.0  97 1.61 1.57 0.34 1.15  3.800000 1.230 2.14  428
## 77   2 13.03 0.90 1.71 16.0  86 1.95 2.03 0.24 1.46  4.600000 1.190 2.48  392
## 78   2 11.84 2.89 2.23 18.0 112 1.72 1.32 0.43 0.95  2.650000 0.960 2.52  500
## 79   2 12.33 0.99 1.95 14.8 136 1.90 1.85 0.35 2.76  3.400000 1.060 2.31  750
## 80   2 12.70 3.87 2.40 23.0 101 2.83 2.55 0.43 1.95  2.570000 1.190 3.13  463
## 81   2 12.00 0.92 2.00 19.0  86 2.42 2.26 0.30 1.43  2.500000 1.380 3.12  278
## 82   2 12.72 1.81 2.20 18.8  86 2.20 2.53 0.26 1.77  3.900000 1.160 3.14  714
## 83   2 12.08 1.13 2.51 24.0  78 2.00 1.58 0.40 1.40  2.200000 1.310 2.72  630
## 84   2 13.05 3.86 2.32 22.5  85 1.65 1.59 0.61 1.62  4.800000 0.840 2.01  515
## 85   2 11.84 0.89 2.58 18.0  94 2.20 2.21 0.22 2.35  3.050000 0.790 3.08  520
## 86   2 12.67 0.98 2.24 18.0  99 2.20 1.94 0.30 1.46  2.620000 1.230 3.16  450
## 87   2 12.16 1.61 2.31 22.8  90 1.78 1.69 0.43 1.56  2.450000 1.330 2.26  495
## 88   2 11.65 1.67 2.62 26.0  88 1.92 1.61 0.40 1.34  2.600000 1.360 3.21  562
## 89   2 11.64 2.06 2.46 21.6  84 1.95 1.69 0.48 1.35  2.800000 1.000 2.75  680
## 90   2 12.08 1.33 2.30 23.6  70 2.20 1.59 0.42 1.38  1.740000 1.070 3.21  625
## 91   2 12.08 1.83 2.32 18.5  81 1.60 1.50 0.52 1.64  2.400000 1.080 2.27  480
## 92   2 12.00 1.51 2.42 22.0  86 1.45 1.25 0.50 1.63  3.600000 1.050 2.65  450
## 93   2 12.69 1.53 2.26 20.7  80 1.38 1.46 0.58 1.62  3.050000 0.960 2.06  495
## 94   2 12.29 2.83 2.22 18.0  88 2.45 2.25 0.25 1.99  2.150000 1.150 3.30  290
## 95   2 11.62 1.99 2.28 18.0  98 3.02 2.26 0.17 1.35  3.250000 1.160 2.96  345
## 96   2 12.47 1.52 2.20 19.0 162 2.50 2.27 0.32 3.28  2.600000 1.160 2.63  937
## 97   2 11.81 2.12 2.74 21.5 134 1.60 0.99 0.14 1.56  2.500000 0.950 2.26  625
## 98   2 12.29 1.41 1.98 16.0  85 2.55 2.50 0.29 1.77  2.900000 1.230 2.74  428
## 99   2 12.37 1.07 2.10 18.5  88 3.52 3.75 0.24 1.95  4.500000 1.040 2.77  660
## 100  2 12.29 3.17 2.21 18.0  88 2.85 2.99 0.45 2.81  2.300000 1.420 2.83  406
## 101  2 12.08 2.08 1.70 17.5  97 2.23 2.17 0.26 1.40  3.300000 1.270 2.96  710
## 102  2 12.60 1.34 1.90 18.5  88 1.45 1.36 0.29 1.35  2.450000 1.040 2.77  562
## 103  2 12.34 2.45 2.46 21.0  98 2.56 2.11 0.34 1.31  2.800000 0.800 3.38  438
## 104  2 11.82 1.72 1.88 19.5  86 2.50 1.64 0.37 1.42  2.060000 0.940 2.44  415
## 105  2 12.51 1.73 1.98 20.5  85 2.20 1.92 0.32 1.48  2.940000 1.040 3.57  672
## 106  2 12.42 2.55 2.27 22.0  90 1.68 1.84 0.66 1.42  2.700000 0.860 3.30  315
## 107  2 12.25 1.73 2.12 19.0  80 1.65 2.03 0.37 1.63  3.400000 1.000 3.17  510
## 108  2 12.72 1.75 2.28 22.5  84 1.38 1.76 0.48 1.63  3.300000 0.880 2.42  488
## 109  2 12.22 1.29 1.94 19.0  92 2.36 2.04 0.39 2.08  2.700000 0.860 3.02  312
## 110  2 11.61 1.35 2.70 20.0  94 2.74 2.92 0.29 2.49  2.650000 0.960 3.26  680
## 111  2 11.46 3.74 1.82 19.5 107 3.18 2.58 0.24 3.58  2.900000 0.750 2.81  562
## 112  2 12.52 2.43 2.17 21.0  88 2.55 2.27 0.26 1.22  2.000000 0.900 2.78  325
## 113  2 11.76 2.68 2.92 20.0 103 1.75 2.03 0.60 1.05  3.800000 1.230 2.50  607
## 114  2 11.41 0.74 2.50 21.0  88 2.48 2.01 0.42 1.44  3.080000 1.100 2.31  434
## 115  2 12.08 1.39 2.50 22.5  84 2.56 2.29 0.43 1.04  2.900000 0.930 3.19  385
## 116  2 11.03 1.51 2.20 21.5  85 2.46 2.17 0.52 2.01  1.900000 1.710 2.87  407
## 117  2 11.82 1.47 1.99 20.8  86 1.98 1.60 0.30 1.53  1.950000 0.950 3.33  495
## 118  2 12.42 1.61 2.19 22.5 108 2.00 2.09 0.34 1.61  2.060000 1.060 2.96  345
## 119  2 12.77 3.43 1.98 16.0  80 1.63 1.25 0.43 0.83  3.400000 0.700 2.12  372
## 120  2 12.00 3.43 2.00 19.0  87 2.00 1.64 0.37 1.87  1.280000 0.930 3.05  564
## 121  2 11.45 2.40 2.42 20.0  96 2.90 2.79 0.32 1.83  3.250000 0.800 3.39  625
## 122  2 11.56 2.05 3.23 28.5 119 3.18 5.08 0.47 1.87  6.000000 0.930 3.69  465
## 123  2 12.42 4.43 2.73 26.5 102 2.20 2.13 0.43 1.71  2.080000 0.920 3.12  365
## 124  2 13.05 5.80 2.13 21.5  86 2.62 2.65 0.30 2.01  2.600000 0.730 3.10  380
## 125  2 11.87 4.31 2.39 21.0  82 2.86 3.03 0.21 2.91  2.800000 0.750 3.64  380
## 126  2 12.07 2.16 2.17 21.0  85 2.60 2.65 0.37 1.35  2.760000 0.860 3.28  378
## 127  2 12.43 1.53 2.29 21.5  86 2.74 3.15 0.39 1.77  3.940000 0.690 2.84  352
## 128  2 11.79 2.13 2.78 28.5  92 2.13 2.24 0.58 1.76  3.000000 0.970 2.44  466
## 129  2 12.37 1.63 2.30 24.5  88 2.22 2.45 0.40 1.90  2.120000 0.890 2.78  342
## 130  2 12.04 4.30 2.38 22.0  80 2.10 1.75 0.42 1.35  2.600000 0.790 2.57  580
## 131  3 12.86 1.35 2.32 18.0 122 1.51 1.25 0.21 0.94  4.100000 0.760 1.29  630
## 132  3 12.88 2.99 2.40 20.0 104 1.30 1.22 0.24 0.83  5.400000 0.740 1.42  530
## 133  3 12.81 2.31 2.40 24.0  98 1.15 1.09 0.27 0.83  5.700000 0.660 1.36  560
## 134  3 12.70 3.55 2.36 21.5 106 1.70 1.20 0.17 0.84  5.000000 0.780 1.29  600
## 135  3 12.51 1.24 2.25 17.5  85 2.00 0.58 0.60 1.25  5.450000 0.750 1.51  650
## 136  3 12.60 2.46 2.20 18.5  94 1.62 0.66 0.63 0.94  7.100000 0.730 1.58  695
## 137  3 12.25 4.72 2.54 21.0  89 1.38 0.47 0.53 0.80  3.850000 0.750 1.27  720
## 138  3 12.53 5.51 2.64 25.0  96 1.79 0.60 0.63 1.10  5.000000 0.820 1.69  515
## 139  3 13.49 3.59 2.19 19.5  88 1.62 0.48 0.58 0.88  5.700000 0.810 1.82  580
## 140  3 12.84 2.96 2.61 24.0 101 2.32 0.60 0.53 0.81  4.920000 0.890 2.15  590
## 141  3 12.93 2.81 2.70 21.0  96 1.54 0.50 0.53 0.75  4.600000 0.770 2.31  600
## 142  3 13.36 2.56 2.35 20.0  89 1.40 0.50 0.37 0.64  5.600000 0.700 2.47  780
## 143  3 13.52 3.17 2.72 23.5  97 1.55 0.52 0.50 0.55  4.350000 0.890 2.06  520
## 144  3 13.62 4.95 2.35 20.0  92 2.00 0.80 0.47 1.02  4.400000 0.910 2.05  550
## 145  3 12.25 3.88 2.20 18.5 112 1.38 0.78 0.29 1.14  8.210000 0.650 2.00  855
## 146  3 13.16 3.57 2.15 21.0 102 1.50 0.55 0.43 1.30  4.000000 0.600 1.68  830
## 147  3 13.88 5.04 2.23 20.0  80 0.98 0.34 0.40 0.68  4.900000 0.580 1.33  415
## 148  3 12.87 4.61 2.48 21.5  86 1.70 0.65 0.47 0.86  7.650000 0.540 1.86  625
## 149  3 13.32 3.24 2.38 21.5  92 1.93 0.76 0.45 1.25  8.420000 0.550 1.62  650
## 150  3 13.08 3.90 2.36 21.5 113 1.41 1.39 0.34 1.14  9.400000 0.570 1.33  550
## 151  3 13.50 3.12 2.62 24.0 123 1.40 1.57 0.22 1.25  8.600000 0.590 1.30  500
## 152  3 12.79 2.67 2.48 22.0 112 1.48 1.36 0.24 1.26 10.800000 0.480 1.47  480
## 153  3 13.11 1.90 2.75 25.5 116 2.20 1.28 0.26 1.56  7.100000 0.610 1.33  425
## 154  3 13.23 3.30 2.28 18.5  98 1.80 0.83 0.61 1.87 10.520000 0.560 1.51  675
## 155  3 12.58 1.29 2.10 20.0 103 1.48 0.58 0.53 1.40  7.600000 0.580 1.55  640
## 156  3 13.17 5.19 2.32 22.0  93 1.74 0.63 0.61 1.55  7.900000 0.600 1.48  725
## 157  3 13.84 4.12 2.38 19.5  89 1.80 0.83 0.48 1.56  9.010000 0.570 1.64  480
## 158  3 12.45 3.03 2.64 27.0  97 1.90 0.58 0.63 1.14  7.500000 0.670 1.73  880
## 159  3 14.34 1.68 2.70 25.0  98 2.80 1.31 0.53 2.70 13.000000 0.570 1.96  660
## 160  3 13.48 1.67 2.64 22.5  89 2.60 1.10 0.52 2.29 11.750000 0.570 1.78  620
## 161  3 12.36 3.83 2.38 21.0  88 2.30 0.92 0.50 1.04  7.650000 0.560 1.58  520
## 162  3 13.69 3.26 2.54 20.0 107 1.83 0.56 0.50 0.80  5.880000 0.960 1.82  680
## 163  3 12.85 3.27 2.58 22.0 106 1.65 0.60 0.60 0.96  5.580000 0.870 2.11  570
## 164  3 12.96 3.45 2.35 18.5 106 1.39 0.70 0.40 0.94  5.280000 0.680 1.75  675
## 165  3 13.78 2.76 2.30 22.0  90 1.35 0.68 0.41 1.03  9.580000 0.700 1.68  615
## 166  3 13.73 4.36 2.26 22.5  88 1.28 0.47 0.52 1.15  6.620000 0.780 1.75  520
## 167  3 13.45 3.70 2.60 23.0 111 1.70 0.92 0.43 1.46 10.680000 0.850 1.56  695
## 168  3 12.82 3.37 2.30 19.5  88 1.48 0.66 0.40 0.97 10.260000 0.720 1.75  685
## 169  3 13.58 2.58 2.69 24.5 105 1.55 0.84 0.39 1.54  8.660000 0.740 1.80  750
## 170  3 13.40 4.60 2.86 25.0 112 1.98 0.96 0.27 1.11  8.500000 0.670 1.92  630
## 171  3 12.20 3.03 2.32 19.0  96 1.25 0.49 0.40 0.73  5.500000 0.660 1.83  510
## 172  3 12.77 2.39 2.28 19.5  86 1.39 0.51 0.48 0.64  9.899999 0.570 1.63  470
## 173  3 14.16 2.51 2.48 20.0  91 1.68 0.70 0.44 1.24  9.700000 0.620 1.71  660
## 174  3 13.71 5.65 2.45 20.5  95 1.68 0.61 0.52 1.06  7.700000 0.640 1.74  740
## 175  3 13.40 3.91 2.48 23.0 102 1.80 0.75 0.43 1.41  7.300000 0.700 1.56  750
## 176  3 13.27 4.28 2.26 20.0 120 1.59 0.69 0.43 1.35 10.200000 0.590 1.56  835
## 177  3 13.17 2.59 2.37 20.0 120 1.65 0.68 0.53 1.46  9.300000 0.600 1.62  840
## 178  3 14.13 4.10 2.74 24.5  96 2.05 0.76 0.56 1.35  9.200000 0.610 1.60  560

Tenemos 178 renglones y 14 columnas. Aunque aún no sabeos qué contienen.

Veamos si el archivo wine.names tiene respuestas

str(vino)
## 'data.frame':    178 obs. of  14 variables:
##  $ V1 : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ V2 : num  14.2 13.2 13.2 14.4 13.2 ...
##  $ V3 : num  1.71 1.78 2.36 1.95 2.59 1.76 1.87 2.15 1.64 1.35 ...
##  $ V4 : num  2.43 2.14 2.67 2.5 2.87 2.45 2.45 2.61 2.17 2.27 ...
##  $ V5 : num  15.6 11.2 18.6 16.8 21 15.2 14.6 17.6 14 16 ...
##  $ V6 : int  127 100 101 113 118 112 96 121 97 98 ...
##  $ V7 : num  2.8 2.65 2.8 3.85 2.8 3.27 2.5 2.6 2.8 2.98 ...
##  $ V8 : num  3.06 2.76 3.24 3.49 2.69 3.39 2.52 2.51 2.98 3.15 ...
##  $ V9 : num  0.28 0.26 0.3 0.24 0.39 0.34 0.3 0.31 0.29 0.22 ...
##  $ V10: num  2.29 1.28 2.81 2.18 1.82 1.97 1.98 1.25 1.98 1.85 ...
##  $ V11: num  5.64 4.38 5.68 7.8 4.32 6.75 5.25 5.05 5.2 7.22 ...
##  $ V12: num  1.04 1.05 1.03 0.86 1.04 1.05 1.02 1.06 1.08 1.01 ...
##  $ V13: num  3.92 3.4 3.17 3.45 2.93 2.85 3.58 3.58 2.85 3.55 ...
##  $ V14: int  1065 1050 1185 1480 735 1450 1290 1295 1045 1045 ...
readLines("wine.names", n=10)
##  [1] "1. Title of Database: Wine recognition data"                                    
##  [2] "\tUpdated Sept 21, 1998 by C.Blake : Added attribute information"               
##  [3] ""                                                                               
##  [4] "2. Sources:"                                                                    
##  [5] "   (a) Forina, M. et al, PARVUS - An Extendible Package for Data"               
##  [6] "       Exploration, Classification and Correlation. Institute of Pharmaceutical"
##  [7] "       and Food Analysis and Technologies, Via Brigata Salerno, "               
##  [8] "       16147 Genoa, Italy."                                                     
##  [9] ""                                                                               
## [10] "   (b) Stefan Aeberhard, email: stefan@coral.cs.jcu.edu.au"
file.copy(from="wine.names", to = "wine_names.txt")
## [1] FALSE
file.show("wine_names.txt")

A partir de lo que este documento explica, descubrimos que nuestros datos corresponden a trece características químicas de tres tipos de vinos. Esto quiere decir que una de las columnas de nuestros datos indica el tipo de vino y las otras trece son sus características.

Aunque es probable que la primera columna de nuestros datos sea la variable con el tipo de vino, usamos summary() para asegurarnos.

summary(vino)
##        V1              V2              V3              V4       
##  Min.   :1.000   Min.   :11.03   Min.   :0.740   Min.   :1.360  
##  1st Qu.:1.000   1st Qu.:12.36   1st Qu.:1.603   1st Qu.:2.210  
##  Median :2.000   Median :13.05   Median :1.865   Median :2.360  
##  Mean   :1.938   Mean   :13.00   Mean   :2.336   Mean   :2.367  
##  3rd Qu.:3.000   3rd Qu.:13.68   3rd Qu.:3.083   3rd Qu.:2.558  
##  Max.   :3.000   Max.   :14.83   Max.   :5.800   Max.   :3.230  
##        V5              V6               V7              V8       
##  Min.   :10.60   Min.   : 70.00   Min.   :0.980   Min.   :0.340  
##  1st Qu.:17.20   1st Qu.: 88.00   1st Qu.:1.742   1st Qu.:1.205  
##  Median :19.50   Median : 98.00   Median :2.355   Median :2.135  
##  Mean   :19.49   Mean   : 99.74   Mean   :2.295   Mean   :2.029  
##  3rd Qu.:21.50   3rd Qu.:107.00   3rd Qu.:2.800   3rd Qu.:2.875  
##  Max.   :30.00   Max.   :162.00   Max.   :3.880   Max.   :5.080  
##        V9              V10             V11              V12        
##  Min.   :0.1300   Min.   :0.410   Min.   : 1.280   Min.   :0.4800  
##  1st Qu.:0.2700   1st Qu.:1.250   1st Qu.: 3.220   1st Qu.:0.7825  
##  Median :0.3400   Median :1.555   Median : 4.690   Median :0.9650  
##  Mean   :0.3619   Mean   :1.591   Mean   : 5.058   Mean   :0.9574  
##  3rd Qu.:0.4375   3rd Qu.:1.950   3rd Qu.: 6.200   3rd Qu.:1.1200  
##  Max.   :0.6600   Max.   :3.580   Max.   :13.000   Max.   :1.7100  
##       V13             V14        
##  Min.   :1.270   Min.   : 278.0  
##  1st Qu.:1.938   1st Qu.: 500.5  
##  Median :2.780   Median : 673.5  
##  Mean   :2.612   Mean   : 746.9  
##  3rd Qu.:3.170   3rd Qu.: 985.0  
##  Max.   :4.000   Max.   :1680.0

Como la V1 es la única con un valor mínimo de 1 y máximo de 3, es seguro que corresponder al tipo ‘vino’, así que podemos renombrarla para facilitar el análisis.

nombres <- 
  readLines("wine_names.txt")[58:70] %>% 
  gsub("[[:cntrl:]].*\\)", "", .) %>% 
  trimws() %>% 
  tolower() %>% 
  gsub(" |/", "_", .) %>% 
  # Agregamos el nombre "tipo", para nuestra primera columna con los tipos de vino
  c("tipo", .)
names(vino) <- nombres

Cambiamos el tipo de dato de la columna de a tipo factor

vino <- vino %>%
  mutate_at("tipo", factor)

Ahora ya estaría todo ok.

str(vino)
## 'data.frame':    178 obs. of  14 variables:
##  $ tipo                        : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
##  $ alcohol                     : num  14.2 13.2 13.2 14.4 13.2 ...
##  $ malic_acid                  : num  1.71 1.78 2.36 1.95 2.59 1.76 1.87 2.15 1.64 1.35 ...
##  $ ash                         : num  2.43 2.14 2.67 2.5 2.87 2.45 2.45 2.61 2.17 2.27 ...
##  $ alcalinity_of_ash           : num  15.6 11.2 18.6 16.8 21 15.2 14.6 17.6 14 16 ...
##  $ magnesium                   : int  127 100 101 113 118 112 96 121 97 98 ...
##  $ total_phenols               : num  2.8 2.65 2.8 3.85 2.8 3.27 2.5 2.6 2.8 2.98 ...
##  $ flavanoids                  : num  3.06 2.76 3.24 3.49 2.69 3.39 2.52 2.51 2.98 3.15 ...
##  $ nonflavanoid_phenols        : num  0.28 0.26 0.3 0.24 0.39 0.34 0.3 0.31 0.29 0.22 ...
##  $ proanthocyanins             : num  2.29 1.28 2.81 2.18 1.82 1.97 1.98 1.25 1.98 1.85 ...
##  $ color_intensity             : num  5.64 4.38 5.68 7.8 4.32 6.75 5.25 5.05 5.2 7.22 ...
##  $ hue                         : num  1.04 1.05 1.03 0.86 1.04 1.05 1.02 1.06 1.08 1.01 ...
##  $ od280_od315_of_diluted_wines: num  3.92 3.4 3.17 3.45 2.93 2.85 3.58 3.58 2.85 3.55 ...
##  $ proline                     : int  1065 1050 1185 1480 735 1450 1290 1295 1045 1045 ...
library(skimr)
## Warning: package 'skimr' was built under R version 4.2.3
skim(vino)
Data summary
Name vino
Number of rows 178
Number of columns 14
_______________________
Column type frequency:
factor 1
numeric 13
________________________
Group variables None

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
tipo 0 1 FALSE 3 2: 71, 1: 59, 3: 48

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
alcohol 0 1 13.00 0.81 11.03 12.36 13.05 13.68 14.83 ▂▇▇▇▃
malic_acid 0 1 2.34 1.12 0.74 1.60 1.87 3.08 5.80 ▇▅▂▂▁
ash 0 1 2.37 0.27 1.36 2.21 2.36 2.56 3.23 ▁▂▇▅▁
alcalinity_of_ash 0 1 19.49 3.34 10.60 17.20 19.50 21.50 30.00 ▁▆▇▃▁
magnesium 0 1 99.74 14.28 70.00 88.00 98.00 107.00 162.00 ▅▇▃▁▁
total_phenols 0 1 2.30 0.63 0.98 1.74 2.36 2.80 3.88 ▅▇▇▇▁
flavanoids 0 1 2.03 1.00 0.34 1.20 2.13 2.88 5.08 ▆▆▇▂▁
nonflavanoid_phenols 0 1 0.36 0.12 0.13 0.27 0.34 0.44 0.66 ▃▇▅▃▂
proanthocyanins 0 1 1.59 0.57 0.41 1.25 1.56 1.95 3.58 ▃▇▆▂▁
color_intensity 0 1 5.06 2.32 1.28 3.22 4.69 6.20 13.00 ▆▇▃▂▁
hue 0 1 0.96 0.23 0.48 0.78 0.96 1.12 1.71 ▅▇▇▃▁
od280_od315_of_diluted_wines 0 1 2.61 0.71 1.27 1.94 2.78 3.17 4.00 ▆▃▆▇▃
proline 0 1 746.89 314.91 278.00 500.50 673.50 985.00 1680.00 ▇▇▅▃▁

#3.- Muestras TRAIN y TEST

Necesitamos un set de entrenamiento para generar un modelo predictivo, y un set de prueba para comprobar la eficacia de este modelo para hacer predicciones correctas.

set.seed(12345)
vino_entrenamiento <- sample_frac(vino, 0.80)
vino_prueba <- setdiff(vino, vino_entrenamiento) 

Debemos comprobar los estadísticos de cada submuestra, deben ser parecidos a la muestra completa.

summary(vino)
##  tipo      alcohol        malic_acid         ash        alcalinity_of_ash
##  1:59   Min.   :11.03   Min.   :0.740   Min.   :1.360   Min.   :10.60    
##  2:71   1st Qu.:12.36   1st Qu.:1.603   1st Qu.:2.210   1st Qu.:17.20    
##  3:48   Median :13.05   Median :1.865   Median :2.360   Median :19.50    
##         Mean   :13.00   Mean   :2.336   Mean   :2.367   Mean   :19.49    
##         3rd Qu.:13.68   3rd Qu.:3.083   3rd Qu.:2.558   3rd Qu.:21.50    
##         Max.   :14.83   Max.   :5.800   Max.   :3.230   Max.   :30.00    
##    magnesium      total_phenols     flavanoids    nonflavanoid_phenols
##  Min.   : 70.00   Min.   :0.980   Min.   :0.340   Min.   :0.1300      
##  1st Qu.: 88.00   1st Qu.:1.742   1st Qu.:1.205   1st Qu.:0.2700      
##  Median : 98.00   Median :2.355   Median :2.135   Median :0.3400      
##  Mean   : 99.74   Mean   :2.295   Mean   :2.029   Mean   :0.3619      
##  3rd Qu.:107.00   3rd Qu.:2.800   3rd Qu.:2.875   3rd Qu.:0.4375      
##  Max.   :162.00   Max.   :3.880   Max.   :5.080   Max.   :0.6600      
##  proanthocyanins color_intensity       hue         od280_od315_of_diluted_wines
##  Min.   :0.410   Min.   : 1.280   Min.   :0.4800   Min.   :1.270               
##  1st Qu.:1.250   1st Qu.: 3.220   1st Qu.:0.7825   1st Qu.:1.938               
##  Median :1.555   Median : 4.690   Median :0.9650   Median :2.780               
##  Mean   :1.591   Mean   : 5.058   Mean   :0.9574   Mean   :2.612               
##  3rd Qu.:1.950   3rd Qu.: 6.200   3rd Qu.:1.1200   3rd Qu.:3.170               
##  Max.   :3.580   Max.   :13.000   Max.   :1.7100   Max.   :4.000               
##     proline      
##  Min.   : 278.0  
##  1st Qu.: 500.5  
##  Median : 673.5  
##  Mean   : 746.9  
##  3rd Qu.: 985.0  
##  Max.   :1680.0
summary(vino_prueba)
##  tipo      alcohol        malic_acid         ash        alcalinity_of_ash
##  1: 9   Min.   :11.46   Min.   :0.920   Min.   :1.820   Min.   :15.00    
##  2:14   1st Qu.:12.32   1st Qu.:1.645   1st Qu.:2.200   1st Qu.:18.00    
##  3:13   Median :12.95   Median :2.245   Median :2.355   Median :19.45    
##         Mean   :12.91   Mean   :2.659   Mean   :2.362   Mean   :20.01    
##         3rd Qu.:13.68   3rd Qu.:3.513   3rd Qu.:2.592   3rd Qu.:22.12    
##         Max.   :14.34   Max.   :5.650   Max.   :2.800   Max.   :25.50    
##    magnesium     total_phenols     flavanoids    nonflavanoid_phenols
##  Min.   : 78.0   Min.   :0.980   Min.   :0.340   Min.   :0.1700      
##  1st Qu.: 88.0   1st Qu.:1.695   1st Qu.:0.865   1st Qu.:0.2875      
##  Median : 97.0   Median :2.125   Median :1.595   Median :0.4000      
##  Mean   : 97.0   Mean   :2.190   Mean   :1.792   Mean   :0.3906      
##  3rd Qu.:106.2   3rd Qu.:2.612   3rd Qu.:2.652   3rd Qu.:0.4850      
##  Max.   :116.0   Max.   :3.500   Max.   :3.930   Max.   :0.6300      
##  proanthocyanins color_intensity       hue         od280_od315_of_diluted_wines
##  Min.   :0.410   Min.   : 1.280   Min.   :0.5700   Min.   :1.330               
##  1st Qu.:1.090   1st Qu.: 2.763   1st Qu.:0.8100   1st Qu.:1.802               
##  Median :1.440   Median : 4.800   Median :0.9100   Median :2.735               
##  Mean   :1.522   Mean   : 4.871   Mean   :0.9489   Mean   :2.477               
##  3rd Qu.:1.870   3rd Qu.: 5.585   3rd Qu.:1.1900   3rd Qu.:2.915               
##  Max.   :3.580   Max.   :13.000   Max.   :1.4200   Max.   :3.560               
##     proline      
##  Min.   : 278.0  
##  1st Qu.: 507.5  
##  Median : 580.0  
##  Mean   : 675.5  
##  3rd Qu.: 747.5  
##  Max.   :1680.0
summary(vino_entrenamiento)
##  tipo      alcohol        malic_acid         ash        alcalinity_of_ash
##  1:50   Min.   :11.03   Min.   :0.740   Min.   :1.360   Min.   :10.60    
##  2:57   1st Qu.:12.37   1st Qu.:1.577   1st Qu.:2.212   1st Qu.:17.00    
##  3:35   Median :13.05   Median :1.810   Median :2.360   Median :19.50    
##         Mean   :13.02   Mean   :2.255   Mean   :2.368   Mean   :19.36    
##         3rd Qu.:13.66   3rd Qu.:2.740   3rd Qu.:2.538   3rd Qu.:21.50    
##         Max.   :14.83   Max.   :5.800   Max.   :3.230   Max.   :30.00    
##    magnesium     total_phenols     flavanoids    nonflavanoid_phenols
##  Min.   : 70.0   Min.   :1.100   Min.   :0.470   Min.   :0.1300      
##  1st Qu.: 89.0   1st Qu.:1.785   1st Qu.:1.250   1st Qu.:0.2600      
##  Median : 98.0   Median :2.435   Median :2.180   Median :0.3200      
##  Mean   :100.4   Mean   :2.322   Mean   :2.089   Mean   :0.3546      
##  3rd Qu.:109.5   3rd Qu.:2.800   3rd Qu.:2.888   3rd Qu.:0.4300      
##  Max.   :162.0   Max.   :3.880   Max.   :5.080   Max.   :0.6600      
##  proanthocyanins color_intensity       hue         od280_od315_of_diluted_wines
##  Min.   :0.420   Min.   : 1.740   Min.   :0.4800   Min.   :1.270               
##  1st Qu.:1.252   1st Qu.: 3.263   1st Qu.:0.7825   1st Qu.:2.053               
##  Median :1.565   Median : 4.640   Median :0.9950   Median :2.840               
##  Mean   :1.608   Mean   : 5.106   Mean   :0.9596   Mean   :2.646               
##  3rd Qu.:1.968   3rd Qu.: 6.287   3rd Qu.:1.1200   3rd Qu.:3.188               
##  Max.   :3.280   Max.   :11.750   Max.   :1.7100   Max.   :4.000               
##     proline      
##  Min.   : 290.0  
##  1st Qu.: 500.5  
##  Median : 680.0  
##  Mean   : 765.0  
##  3rd Qu.:1035.0  
##  Max.   :1547.0

##4.- ENTRENAMIENTO DEL MODELO

arbol_1 <- rpart(formula = tipo ~., data = vino_entrenamiento)
arbol_1
## n= 142 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 142 85 2 (0.35211268 0.40140845 0.24647887)  
##    2) proline>=755 58 10 1 (0.82758621 0.06896552 0.10344828)  
##      4) flavanoids>=2.165 50  2 1 (0.96000000 0.04000000 0.00000000) *
##      5) flavanoids< 2.165 8  2 3 (0.00000000 0.25000000 0.75000000) *
##    3) proline< 755 84 31 2 (0.02380952 0.63095238 0.34523810)  
##      6) od280_od315_of_diluted_wines>=2.09 52  3 2 (0.03846154 0.94230769 0.01923077) *
##      7) od280_od315_of_diluted_wines< 2.09 32  4 3 (0.00000000 0.12500000 0.87500000)  
##       14) malic_acid< 1.6 7  3 2 (0.00000000 0.57142857 0.42857143) *
##       15) malic_acid>=1.6 25  0 3 (0.00000000 0.00000000 1.00000000) *

Lo anterior muestra el esquema de nuestro árbol de clasificación. Cada inciso nos indica un nodo y la regla de clasificación que le corresponde. Siguiendo estos nodos, podemos llegar a las hojas del árbol, que corresponde a la clasificación de nuestros datos.

Todo lo anterior resulta mucho más claro si lo visualizamos.

rpart.plot(arbol_1)

En estos gráficos, cada uno de los rectángulos representa un nodo de nuestro árbol, con su regla de clasificación.

Cada nodo está coloreado de acuerdo a la categoría mayoritaria entre los datos que agrupa. Esta es la categoría que ha predicho el modelo para ese grupo.

Dentro del rectángulo de cada nodo se nos muestra qué proporción de casos pertenecen a cada categoría y la proporción del total de datos que han sido agrupados allí. Por ejemplo, el rectángulo en el extremo inferior izquierdo de la gráfica tiene 94% de casos en el tipo 1, y 4% en los tipos 2 y 3, que representan 39% de todos los datos. Estas proporciones nos dan una idea de la precisión de nuestro modelo al hacer predicciones. De este modo, las reglas que conducen al rectángulo que acabamos de mencionar nos dan un 92% de clasificaciones correctas. En contraste, el tercer rectángulo, de izquierda a derecha, de color gris, tuvo sólo 62% de clasificaciones correctas.

Además, podemos sentirnos contentos de que dos de las hojas de nuestro árbol de clasificación han logrado un 100% de clasificaciones correctas, para los vinos de tipo 2 y 3. Pero, por supuesto, necesitamos ser más sistemáticos para indagar qué tan bien hace predicciones nuestro modelo.

# Predicciones
#--------------------------------
prediccion_1 <- predict(arbol_1, newdata=vino_prueba, type = "class")  #predecimos sólo la categorí)
# Matriz de confusión
#--------------------------
confusionMatrix(prediccion_1, vino_prueba[["tipo"]])
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  1  2  3
##          1  9  0  0
##          2  0 13  2
##          3  0  1 11
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9167          
##                  95% CI : (0.7753, 0.9825)
##     No Information Rate : 0.3889          
##     P-Value [Acc > NIR] : 5.022e-11       
##                                           
##                   Kappa : 0.8728          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3
## Sensitivity              1.00   0.9286   0.8462
## Specificity              1.00   0.9091   0.9565
## Pos Pred Value           1.00   0.8667   0.9167
## Neg Pred Value           1.00   0.9524   0.9167
## Prevalence               0.25   0.3889   0.3611
## Detection Rate           0.25   0.3611   0.3056
## Detection Prevalence     0.25   0.4167   0.3333
## Balanced Accuracy        1.00   0.9188   0.9013

Nada mal. Tenemos una precisión (accuracy), Kappa y otros estadísticos con buenos valores.

Generamos un segundo árbol, usando sets de entrenamiento y prueba diferentes.

set.seed(7439)
vino_entrenamiento2  <- sample_frac(vino, .8)
vino_prueba2 <- setdiff(vino, vino_entrenamiento2)
summary(vino)
##  tipo      alcohol        malic_acid         ash        alcalinity_of_ash
##  1:59   Min.   :11.03   Min.   :0.740   Min.   :1.360   Min.   :10.60    
##  2:71   1st Qu.:12.36   1st Qu.:1.603   1st Qu.:2.210   1st Qu.:17.20    
##  3:48   Median :13.05   Median :1.865   Median :2.360   Median :19.50    
##         Mean   :13.00   Mean   :2.336   Mean   :2.367   Mean   :19.49    
##         3rd Qu.:13.68   3rd Qu.:3.083   3rd Qu.:2.558   3rd Qu.:21.50    
##         Max.   :14.83   Max.   :5.800   Max.   :3.230   Max.   :30.00    
##    magnesium      total_phenols     flavanoids    nonflavanoid_phenols
##  Min.   : 70.00   Min.   :0.980   Min.   :0.340   Min.   :0.1300      
##  1st Qu.: 88.00   1st Qu.:1.742   1st Qu.:1.205   1st Qu.:0.2700      
##  Median : 98.00   Median :2.355   Median :2.135   Median :0.3400      
##  Mean   : 99.74   Mean   :2.295   Mean   :2.029   Mean   :0.3619      
##  3rd Qu.:107.00   3rd Qu.:2.800   3rd Qu.:2.875   3rd Qu.:0.4375      
##  Max.   :162.00   Max.   :3.880   Max.   :5.080   Max.   :0.6600      
##  proanthocyanins color_intensity       hue         od280_od315_of_diluted_wines
##  Min.   :0.410   Min.   : 1.280   Min.   :0.4800   Min.   :1.270               
##  1st Qu.:1.250   1st Qu.: 3.220   1st Qu.:0.7825   1st Qu.:1.938               
##  Median :1.555   Median : 4.690   Median :0.9650   Median :2.780               
##  Mean   :1.591   Mean   : 5.058   Mean   :0.9574   Mean   :2.612               
##  3rd Qu.:1.950   3rd Qu.: 6.200   3rd Qu.:1.1200   3rd Qu.:3.170               
##  Max.   :3.580   Max.   :13.000   Max.   :1.7100   Max.   :4.000               
##     proline      
##  Min.   : 278.0  
##  1st Qu.: 500.5  
##  Median : 673.5  
##  Mean   : 746.9  
##  3rd Qu.: 985.0  
##  Max.   :1680.0
summary(vino_entrenamiento2)
##  tipo      alcohol        malic_acid         ash        alcalinity_of_ash
##  1:49   Min.   :11.41   Min.   :0.740   Min.   :1.360   Min.   :10.60    
##  2:56   1st Qu.:12.35   1st Qu.:1.603   1st Qu.:2.210   1st Qu.:17.02    
##  3:37   Median :13.05   Median :1.830   Median :2.360   Median :19.00    
##         Mean   :12.99   Mean   :2.312   Mean   :2.354   Mean   :19.19    
##         3rd Qu.:13.68   3rd Qu.:3.013   3rd Qu.:2.538   3rd Qu.:21.00    
##         Max.   :14.75   Max.   :5.800   Max.   :3.230   Max.   :28.50    
##    magnesium      total_phenols     flavanoids    nonflavanoid_phenols
##  Min.   : 70.00   Min.   :0.980   Min.   :0.340   Min.   :0.1300      
##  1st Qu.: 88.00   1st Qu.:1.782   1st Qu.:1.125   1st Qu.:0.2625      
##  Median : 98.00   Median :2.420   Median :2.230   Median :0.3250      
##  Mean   : 99.73   Mean   :2.315   Mean   :2.036   Mean   :0.3618      
##  3rd Qu.:106.75   3rd Qu.:2.800   3rd Qu.:2.842   3rd Qu.:0.4500      
##  Max.   :162.00   Max.   :3.880   Max.   :5.080   Max.   :0.6600      
##  proanthocyanins color_intensity       hue         od280_od315_of_diluted_wines
##  Min.   :0.410   Min.   : 1.280   Min.   :0.5400   Min.   :1.270               
##  1st Qu.:1.250   1st Qu.: 3.180   1st Qu.:0.7825   1st Qu.:1.938               
##  Median :1.560   Median : 4.650   Median :0.9700   Median :2.780               
##  Mean   :1.622   Mean   : 5.026   Mean   :0.9522   Mean   :2.628               
##  3rd Qu.:1.978   3rd Qu.: 6.200   3rd Qu.:1.1075   3rd Qu.:3.197               
##  Max.   :3.580   Max.   :13.000   Max.   :1.4500   Max.   :4.000               
##     proline      
##  Min.   : 278.0  
##  1st Qu.: 505.2  
##  Median : 679.0  
##  Mean   : 751.5  
##  3rd Qu.:1008.8  
##  Max.   :1547.0
summary(vino_prueba2)
##  tipo      alcohol        malic_acid         ash        alcalinity_of_ash
##  1:10   Min.   :11.03   Min.   :0.900   Min.   :1.710   Min.   :14.00    
##  2:15   1st Qu.:12.37   1st Qu.:1.627   1st Qu.:2.237   1st Qu.:18.38    
##  3:11   Median :13.05   Median :2.010   Median :2.390   Median :20.00    
##         Mean   :13.04   Mean   :2.433   Mean   :2.417   Mean   :20.71    
##         3rd Qu.:13.64   3rd Qu.:3.155   3rd Qu.:2.620   3rd Qu.:24.00    
##         Max.   :14.83   Max.   :4.950   Max.   :3.220   Max.   :30.00    
##    magnesium      total_phenols     flavanoids    nonflavanoid_phenols
##  Min.   : 78.00   Min.   :1.250   Min.   :0.490   Min.   :0.1900      
##  1st Qu.: 87.75   1st Qu.:1.650   1st Qu.:1.295   1st Qu.:0.2700      
##  Median :100.00   Median :2.075   Median :1.970   Median :0.3700      
##  Mean   : 99.78   Mean   :2.218   Mean   :2.001   Mean   :0.3619      
##  3rd Qu.:108.00   3rd Qu.:2.837   3rd Qu.:2.910   3rd Qu.:0.4300      
##  Max.   :139.00   Max.   :3.500   Max.   :3.930   Max.   :0.6100      
##  proanthocyanins color_intensity       hue         od280_od315_of_diluted_wines
##  Min.   :0.640   Min.   : 1.900   Min.   :0.4800   Min.   :1.300               
##  1st Qu.:1.198   1st Qu.: 3.388   1st Qu.:0.7775   1st Qu.:1.965               
##  Median :1.470   Median : 4.740   Median :0.9650   Median :2.750               
##  Mean   :1.468   Mean   : 5.186   Mean   :0.9783   Mean   :2.547               
##  3rd Qu.:1.785   3rd Qu.: 6.225   3rd Qu.:1.1450   3rd Qu.:3.030               
##  Max.   :2.140   Max.   :10.800   Max.   :1.7100   Max.   :3.500               
##     proline      
##  Min.   : 365.0  
##  1st Qu.: 500.0  
##  Median : 571.0  
##  Mean   : 728.9  
##  3rd Qu.: 932.5  
##  Max.   :1680.0

Los resultados de los estadísticos son similares.

arbol_2 <- rpart(formula = tipo ~., data = vino_entrenamiento2)
arbol_2
## n= 142 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 142 86 2 (0.34507042 0.39436620 0.26056338)  
##    2) proline>=755 54  7 1 (0.87037037 0.05555556 0.07407407)  
##      4) flavanoids>=2.3 46  0 1 (1.00000000 0.00000000 0.00000000) *
##      5) flavanoids< 2.3 8  4 3 (0.12500000 0.37500000 0.50000000) *
##    3) proline< 755 88 35 2 (0.02272727 0.60227273 0.37500000)  
##      6) color_intensity< 4.02 49  1 2 (0.00000000 0.97959184 0.02040816) *
##      7) color_intensity>=4.02 39  7 3 (0.05128205 0.12820513 0.82051282)  
##       14) flavanoids>=1.4 7  2 2 (0.28571429 0.71428571 0.00000000) *
##       15) flavanoids< 1.4 32  0 3 (0.00000000 0.00000000 1.00000000) *
rpart.plot(arbol_2)

prediccion_2 <- predict(arbol_2, newdata = vino_prueba2, type = "class")
confusionMatrix(prediccion_2, vino_prueba2[["tipo"]])
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  1  2  3
##          1 10  1  0
##          2  0 14  1
##          3  0  0 10
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9444          
##                  95% CI : (0.8134, 0.9932)
##     No Information Rate : 0.4167          
##     P-Value [Acc > NIR] : 2.641e-11       
##                                           
##                   Kappa : 0.9154          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3
## Sensitivity            1.0000   0.9333   0.9091
## Specificity            0.9615   0.9524   1.0000
## Pos Pred Value         0.9091   0.9333   1.0000
## Neg Pred Value         1.0000   0.9524   0.9615
## Prevalence             0.2778   0.4167   0.3056
## Detection Rate         0.2778   0.3889   0.2778
## Detection Prevalence   0.3056   0.4167   0.2778
## Balanced Accuracy      0.9808   0.9429   0.9545

¡Oh! Esta vez hemos obtenido una precisión casi perfecta en nuestras predicciones. Con este modelo hemos mejorado la predicción con respecto al anterior.

Se puede observar que el árbol es diferente, pues la muestra de entrenamiento y prueba son diferentes, aunque las particiones obtenidas son idénticas. La idea es que, dependiendo de la muestra extraída en el Train & Test sample, los resultados pueden cambiar y obtendremos modelos más precisos que otros.

Hacemos un tercer modelo.

set.seed(8476)
vino_entrenamiento3 <- sample_frac(vino, 0.8)
vino_prueba3 <- setdiff(vino, vino_entrenamiento3)
arbol_3 <- rpart(formula = tipo ~., data = vino_entrenamiento3)
arbol_3
## n= 142 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 142 89 2 (0.33802817 0.37323944 0.28873239)  
##    2) proline>=755 54  8 1 (0.85185185 0.05555556 0.09259259)  
##      4) flavanoids>=2.3 47  1 1 (0.97872340 0.02127660 0.00000000) *
##      5) flavanoids< 2.3 7  2 3 (0.00000000 0.28571429 0.71428571) *
##    3) proline< 755 88 38 2 (0.02272727 0.56818182 0.40909091)  
##      6) flavanoids>=1.4 48  3 2 (0.04166667 0.93750000 0.02083333) *
##      7) flavanoids< 1.4 40  5 3 (0.00000000 0.12500000 0.87500000)  
##       14) color_intensity< 4.375 7  2 2 (0.00000000 0.71428571 0.28571429) *
##       15) color_intensity>=4.375 33  0 3 (0.00000000 0.00000000 1.00000000) *
rpart.plot(arbol_3)

prediccion_3 <- predict(arbol_3, newdata = vino_prueba3, type = "class")
confusionMatrix(prediccion_3, vino_prueba3[["tipo"]])
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  1  2  3
##          1 10  0  0
##          2  0 17  1
##          3  1  1  6
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9167          
##                  95% CI : (0.7753, 0.9825)
##     No Information Rate : 0.5             
##     P-Value [Acc > NIR] : 1.136e-07       
##                                           
##                   Kappa : 0.866           
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3
## Sensitivity            0.9091   0.9444   0.8571
## Specificity            1.0000   0.9444   0.9310
## Pos Pred Value         1.0000   0.9444   0.7500
## Neg Pred Value         0.9615   0.9444   0.9643
## Prevalence             0.3056   0.5000   0.1944
## Detection Rate         0.2778   0.4722   0.1667
## Detection Prevalence   0.2778   0.5000   0.2222
## Balanced Accuracy      0.9545   0.9444   0.8941

Esta ocasión hemos obtenido una precisión en nuestras predicciones similar al primer modelo que generamos, pero ahora una de las variables usadas en la partición es diferente.

##5.- SELECCIÓN DEL MEJOR MODELO

En estos gráficos, cada uno de los rectángulos representa un nodo de nuestro árbol, con su regla de clasificación.

Cada nodo está coloreado de acuerdo a la categoría mayoritaria entre los datos que agrupa. Esta es la categoría que ha predicho el modelo para ese grupo.

Dentro del rectángulo de cada nodo se nos muestra qué proporción de casos pertenecen a cada categoría y la proporción del total de datos que han sido agrupados allí. Por ejemplo, el rectángulo en el extremo inferior izquierdo de la gráfica tiene 94% de casos en el tipo 1, y 4% en los tipos 2 y 3, que representan 39% de todos los datos. Estas proporciones nos dan una idea de la precisión de nuestro modelo al hacer predicciones. De este modo, las reglas que conducen al rectángulo que acabamos de mencionar nos dan un 92% de clasificaciones correctas. En contraste, el tercer rectángulo, de izquierda a derecha, de color gris, tuvo sólo 62% de clasificaciones correctas. Además, podemos sentirnos contentos de que dos de las hojas de nuestro árbol de clasificación han logrado un 100% de clasificaciones correctas, para los vinos de tipo 2 y 3. Pero, por supuesto, necesitamos ser más sistemáticos para indagar qué tan bien hace predicciones nuestro modelo.

Se puede observar que el árbol es diferente pues la muestra de entrenamiento y prueba son diferentes aunque las partificines obtenidas son idénticas. La idea es que dependiendo de la muestra extraida en el Train y Test sample los resultados pueden cambiar y obtendremos modelos más precisos que otros.

La respuesta depende de nuestros objetivos y qué tanta precisión nos interese en nuestras predicciones.

Por ejemplo, con los datos sobre vinos podría ser que no nos interesan tanto las reglas específicas para clasificar vinos, sino las variables que son más importantes para distinguirlos. Lo que nos han pedido es reduzcamos el número de variables usadas para catalogar vinos para fines de control de calidad, de las trece originales a un número menor. Pero también puede ser que el propósito del análisis sea clasificar vinos por riesgo de toxicidad. En este caso sí es importante tener reglas precisas para hacer predicciones.

En todo caso, una manera de elegir un modelo es, en realidad, crear múltiples modelos y compararlos. Por ejemplo: creamos cien árboles con los mismos datos y después analizaos los modelos que tienen más éxito para clasificar para determinar cuáles variables son las que mejor separan los datos y en qué rangos se encuentran los valores de las reglas. De hecho, este es el principio del método Random Forest, pero ese es tema para otro día.

En nuestro ejemplo, hay algunas variables que aparecen frecuentemente, pero la regla asociada a ellas ha cambiado. color_intensity ha aparecido en los tres modelos generados, con tres valores distintos: 4, 3.5 y 4.9. Algo similar ha ocurrido con proline y flavanoids. Lo que ha sido consistente es la presencia de estas variables, en la mayoría de nuestros modelos. Es muy probable que si repetimos este ejercicio suficientes veces, encontraremos más regularidades como esta.

crear_sets <- function(datos, proporcion = .7) {
  sets <- list()
  
  sets[["entrenamiento"]] <- sample_frac(datos, proporcion)
  sets[["prueba"]] <- setdiff(datos, sets[["entrenamiento"]])
  
  sets
}

entrenar_arbol <- function(sets, objetivo, predictores = ".", mi_cp = .01) {
  if(length(predictores > 1)) {
    predictores <- paste0(predictores, collapse = "+")
  }
  mi_formula <- paste0(objetivo, " ~ ", predictores) %>% as.formula()
  
  arbol <- list()
  arbol[["modelo"]] <- 
    rpart(data = sets[["entrenamiento"]], formula = mi_formula, 
          control = rpart.control(cp = mi_cp, xval = 35, minsplit = 5))
  arbol[["prediccion"]] <- predict(arbol[["modelo"]], sets[["prueba"]], type = "class")
  arbol[["referencia"]] <- sets[["prueba"]][[objetivo]]
  
  arbol
}

obtener_diagnostico <- function(arbol, objetivo, mi_cp = 0.01) {
  diagnostico <- list()
  diagnostico[["matriz"]] <- confusionMatrix(data = arbol[["prediccion"]], 
                                             reference = arbol[["referencia"]])
  
  cp <- with(arbol[["modelo"]], cptable[which.min(cptable[, "xerror"]), "CP"])
  cp_original <- mi_cp
  podar <- if(cp < mi_cp) "SI" else "NO"
  diagnostico[["mincp"]] <- data.frame("CP mínimo" = cp, "CP original" = cp_original, "Podar" = podar)
  
  diagnostico
} 

crear_arbol <- function(datos, objetivo, predictores = ".", mi_cp = 0.01) {
  resultado <- list()
  resultado[["sets"]] <- crear_sets(datos)
  resultado[["arbol"]] <- entrenar_arbol(resultado[["sets"]], objetivo, predictores, mi_cp)
  resultado[["diagnostico"]] <- obtener_diagnostico(resultado[["arbol"]], objetivo, mi_cp)
  
  resultado
}
set.seed(1986)
unarbol <- crear_arbol(vino, "tipo", mi_cp = 0.10)

unarbol[["diagnostico"]]
## $matriz
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  1  2  3
##          1 15  1  2
##          2  1 18  3
##          3  0  2 11
## 
## Overall Statistics
##                                          
##                Accuracy : 0.8302         
##                  95% CI : (0.702, 0.9193)
##     No Information Rate : 0.3962         
##     P-Value [Acc > NIR] : 1.106e-10      
##                                          
##                   Kappa : 0.7423         
##                                          
##  Mcnemar's Test P-Value : 0.5319         
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3
## Sensitivity            0.9375   0.8571   0.6875
## Specificity            0.9189   0.8750   0.9459
## Pos Pred Value         0.8333   0.8182   0.8462
## Neg Pred Value         0.9714   0.9032   0.8750
## Prevalence             0.3019   0.3962   0.3019
## Detection Rate         0.2830   0.3396   0.2075
## Detection Prevalence   0.3396   0.4151   0.2453
## Balanced Accuracy      0.9282   0.8661   0.8167
## 
## $mincp
##   CP.mínimo CP.original Podar
## 1       0.1         0.1    NO
set.seed(1986)
unarbol <- crear_arbol(vino, "tipo", mi_cp = 0.05)

unarbol[["diagnostico"]]
## $matriz
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  1  2  3
##          1 15  1  0
##          2  1 18  3
##          3  0  2 13
## 
## Overall Statistics
##                                           
##                Accuracy : 0.8679          
##                  95% CI : (0.7466, 0.9452)
##     No Information Rate : 0.3962          
##     P-Value [Acc > NIR] : 1.597e-12       
##                                           
##                   Kappa : 0.7996          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3
## Sensitivity            0.9375   0.8571   0.8125
## Specificity            0.9730   0.8750   0.9459
## Pos Pred Value         0.9375   0.8182   0.8667
## Neg Pred Value         0.9730   0.9032   0.9211
## Prevalence             0.3019   0.3962   0.3019
## Detection Rate         0.2830   0.3396   0.2453
## Detection Prevalence   0.3019   0.4151   0.2830
## Balanced Accuracy      0.9552   0.8661   0.8792
## 
## $mincp
##    CP.mínimo CP.original Podar
## 1 0.05333333        0.05    NO
set.seed(1986)
unarbol <- crear_arbol(vino, "tipo", mi_cp = 0.01)

unarbol[["diagnostico"]]
## $matriz
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  1  2  3
##          1 15  1  0
##          2  1 18  2
##          3  0  2 14
## 
## Overall Statistics
##                                           
##                Accuracy : 0.8868          
##                  95% CI : (0.7697, 0.9573)
##     No Information Rate : 0.3962          
##     P-Value [Acc > NIR] : 1.535e-13       
##                                           
##                   Kappa : 0.8287          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3
## Sensitivity            0.9375   0.8571   0.8750
## Specificity            0.9730   0.9062   0.9459
## Pos Pred Value         0.9375   0.8571   0.8750
## Neg Pred Value         0.9730   0.9062   0.9459
## Prevalence             0.3019   0.3962   0.3019
## Detection Rate         0.2830   0.3396   0.2642
## Detection Prevalence   0.3019   0.3962   0.3019
## Balanced Accuracy      0.9552   0.8817   0.9105
## 
## $mincp
##   CP.mínimo CP.original Podar
## 1      0.01        0.01    NO
set.seed(1986)
unarbol <- crear_arbol(vino, "tipo", mi_cp = 0.005)

unarbol[["diagnostico"]]
## $matriz
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  1  2  3
##          1 15  1  0
##          2  1 18  2
##          3  0  2 14
## 
## Overall Statistics
##                                           
##                Accuracy : 0.8868          
##                  95% CI : (0.7697, 0.9573)
##     No Information Rate : 0.3962          
##     P-Value [Acc > NIR] : 1.535e-13       
##                                           
##                   Kappa : 0.8287          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3
## Sensitivity            0.9375   0.8571   0.8750
## Specificity            0.9730   0.9062   0.9459
## Pos Pred Value         0.9375   0.8571   0.8750
## Neg Pred Value         0.9730   0.9062   0.9459
## Prevalence             0.3019   0.3962   0.3019
## Detection Rate         0.2830   0.3396   0.2642
## Detection Prevalence   0.3019   0.3962   0.3019
## Balanced Accuracy      0.9552   0.8817   0.9105
## 
## $mincp
##   CP.mínimo CP.original Podar
## 1     0.005       0.005    NO
set.seed(1986)
unarbol <- crear_arbol(vino, "tipo", mi_cp = 0.001)

unarbol[["diagnostico"]]
## $matriz
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  1  2  3
##          1 15  1  0
##          2  1 18  2
##          3  0  2 14
## 
## Overall Statistics
##                                           
##                Accuracy : 0.8868          
##                  95% CI : (0.7697, 0.9573)
##     No Information Rate : 0.3962          
##     P-Value [Acc > NIR] : 1.535e-13       
##                                           
##                   Kappa : 0.8287          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3
## Sensitivity            0.9375   0.8571   0.8750
## Specificity            0.9730   0.9062   0.9459
## Pos Pred Value         0.9375   0.8571   0.8750
## Neg Pred Value         0.9730   0.9062   0.9459
## Prevalence             0.3019   0.3962   0.3019
## Detection Rate         0.2830   0.3396   0.2642
## Detection Prevalence   0.3019   0.3962   0.3019
## Balanced Accuracy      0.9552   0.8817   0.9105
## 
## $mincp
##   CP.mínimo CP.original Podar
## 1     0.001       0.001    NO

##7.- CONCLUSIÓN

Podemos observar que las funciones anteriores incluyen ajustes de parámetros que no hemos discutido y que nos ayudan a perfeccionar nuestros modelos de predicción con árboles de clasificación.

Por lo pronto, en este documento ya revisamos qué son los árboles de decisión, sus ventajas y desventajas, cómo implementarlos para hacer clasificación usando el paquete rpart de R y, de paso, cómo resolver algunos problemas comunes al importar datos guardados en archivos de formato no convencional.

Con esto tenemos los elementos básicos para crear e interpretar tus propios árboles de clasificación con distintos tipos de datos.