Gráfico de tallo y hojas en R

Aprende a crear un diagrama de tallo y hojas en R

Un gráfico de tallo y hojas, también conocido como diagrama de tallo y hojas es una representación clásica de la distribución de datos cuantitativos, similar a un histograma pero en texto, donde los datos se dividen en tallo (generalmente el primer o primeros dígitos del número) y hoja (el último dígito). El gráfico de tallo y hojas en R puede ser útil cuando se trabaja con pocas observaciones (15-150 puntos de datos). En este tutorial aprenderás qué es un diagrama de tallo y hojas y cómo hacerlo en R.

¿Cómo interpretar un diagrama de tallo y hojas?

Supón que tienes el siguiente vector:

\(\textbf{x} = (12, 15, 16, 21, 24, 29, 30, 31, 32, 33, \\ \phantom{\textbf{x} = (} 45, 46, 49, 50, 52, 58, 60, 63, 64, 65)\).

Para crear manualmente un diagrama de tallo y hojas, debes dividir los datos en tallos (en este caso, el primer dígito del número) y hojas (el segundo dígito). Por tanto, el gráfico resultante será el siguiente:

Tallo Hojas
1 | 256
2 | 149
3 | 0123
4 | 569
5 | 058
6 | 0345

En consecuencia, en este ejemplo se puede leer \(1|256\) como 12, 15 y 16; \(2|149\) como 21, 24 y 29 y así con los demás.

El tallo no siempre es un solo dígito o el primer dígito del número. Como ejemplo, si estás trabajando con un número con 4 dígitos decimales, el tallo podría estar formado por los primeros tres dígitos decimales y la correspondiente hoja por el cuarto, siempre que indiques qué tan lejos está el punto decimal a la derecha del separador.

La función stem en R

La función stem permite crear gráficos de tallo y hojas en R, cuya sintaxis es la siguiente:

stem(x,            # Vector numérico
     scale = 1,    # Altura del gráfico
     width = 80,   # Ancho del gráfico
     atom = 1e-08) # Parámetro de tolerancia

Cabe señalar que si el argumento de entrada contiene valores no finitos o faltantes, no se tienen en cuenta. Considera, por ejemplo, el siguiente vector:

datos <- c(12, 15, 16, 21, 24, 29, 30, 31, 32, 33, 
           45, 46, 49, 50, 52, 58, 60, 63, 64, 65)

Puedes crear el gráfico simplemente escribiendo:

stem(datos)

La salida es el texto que se muestra en el siguiente bloque de código. Ten en cuenta que, a modo aclaratorio, en los comentarios se especifican los valores correspondientes a cada tallo.

 The decimal point is 1 digit(s) to the right of the |

  0 | 256                 # <-- 12, 15, 16
  2 | 1490123             # <-- 21, 24, 29, 30, 31, 32, 33
  4 | 569028              # <-- 45, 46, 49, 50, 52, 58
  6 | 0345                # <-- 60, 63, 64, 65

Sin embargo, es posible que hayas notado que la salida no es igual al ejemplo que revisamos en la primera sección. Esto se debe a que los tallos están agrupados (el primer tallo es para 0 y 1, el segundo para 2 y 3, etc.). Para resolver este problema, puedes cambiar la altura del diagrama con el argumento scale de la siguiente manera:

stem(datos, scale = 2)
The decimal point is 1 digit(s) to the right of the |

  1 | 256                 # <-- 12, 15, 16
  2 | 149                 # <-- 21, 24, 29
  3 | 0123                # <-- 30, 31, 32, 33
  4 | 569                 # <-- 45, 46, 49
  5 | 028                 # <-- 50, 52, 58
  6 | 0345                # <-- 60, 63, 64, 65

Ten en cuenta que si estableces scale = 3, cada tallo se duplicará. En este ejemplo, el primero de los tallos duplicados muestra las hojas correspondientes a valores inferiores a 5 y el segundo las hojas correspondientes a valores iguales o superiores a 5.

stem(datos, scale = 3)
 The decimal point is 1 digit(s) to the right of the |

  1 | 2                   # <-- 12
  1 | 56                  # <-- 15, 16
  2 | 14
  2 | 9
  3 | 0123
  3 | 
  4 | 
  4 | 569
  5 | 02
  5 | 8
  6 | 034
  6 | 5

La función stem.leaf

La función stem.leaf del paquete aplpack es una alternativa a la función stem de R base, que permite configuraciones adicionales. Hay varios argumentos que se pueden personalizar, por lo tanto, recuerda consultar la documentación de la función con help(stem.leaf) o ?stem.leaf para obtener más detalles. Para crear el diagrama de tallo y hoja con argumentos predeterminados, puedes escribir:

# install.packages("aplpack")
library(aplpack)

stem.leaf(datos)
1 | 2: represents 12
 leaf unit: 1
            n: 20
   1    1* | 2
   3    1. | 56
   5    2* | 14
   6    2. | 9
  (4)   3* | 0123
        3. | 
        4* | 
  (3)   4. | 569
   7    5* | 02
   5    5. | 8
   4    6* | 034
   1    6. | 5

Es posible que hayas notado que la salida es similar a la de stem(datos, scale = 3). En este caso, si quieres personalizar el número de partes en las que se divide el tallo, puedes usar el argumento m.

stem.leaf(datos, m = 1)
1 | 2: represents 12
 leaf unit: 1
            n: 20
   3    1 | 256
   6    2 | 149
  (4)   3 | 0123
  (3)   4 | 569
   7    5 | 028
   4    6 | 0345

Diagrama de tallo y hoja comparativo (back to back) en R

Otra función interesante del paquete aplpack es que permite comparar dos gráficos de tallo y hoja con la función stem.leaf.backback, que por defecto dibuja un gráfico back to back:

# install.packages("aplpack")
library(aplpack)

set.seed(1)
datos2 <- sample(datos, replace = TRUE)

stem.leaf.backback(datos, datos2)
________________________________
  1 | 2: represents 12, leaf unit: 1 
         datos      datos2    
________________________________
   1        2| 1* |22       2   
   3       65| 1. |5        3   
   5       41| 2* |1444     7   
   6        9| 2. |             
  (4)    3210| 3* |002233  (6)  
             | 3. |             
             | 4* |             
  (3)     965| 4. |5        7   
   7       20| 5* |0002     6   
   5        8| 5. |             
   4      430| 6* |34       2   
   1        5| 6. |             
             | 7* |             
________________________________
n:         20      20       
________________________________

Además, si configuras el argumento back.to.back como FALSE, los gráficos se mostrarán uno al lado del otro, en la forma habitual de representación.

stem.leaf.backback(datos, datos2, back.to.back = FALSE)
________________________________
  1 | 2: represents 12, leaf unit: 1 
      datos         datos        
________________________________
  1* |2        1  |22       2   
  1. |56       3  |5        3   
  2* |14       5  |1444     7   
  2. |9        6  |             
  3* |0123    (4) |002233  (6)  
  3. |            |             
  4* |            |             
  4. |569     (3) |5        7   
  5* |02       7  |0002     6   
  5. |8        5  |             
  6* |034      4  |34       2   
  6. |5        1  |             
  7* |            |             
________________________________
n:    20           20           
________________________________

Guardar gráfico de tallo y hojas en R como imagen

Los gráficos de tallo son gráficos de texto, por lo que se imprimen en la consola. Sin embargo, en algunas situaciones es interesante guardar el gráfico como cualquier otro. En lugar de crear una captura de pantalla de baja calidad, puedes utilizar la función capture.output para guardar la salida como carácter y pegarla en un gráfico vacío con la función text:

# El alto y ancho puede depender de tus datos
windows(width = 4, height = 5)

plot.new()

out <- capture.output(stem(datos, scale = 2))
text(0, 1, paste(out, collapse = "n"), adj = c(0, 1))

Guardar gráfico de tallo y hojas en R como imagen

Una alternativa es usar la función slider.stem.leaf, provista por los paquetes tcltk y aplpack. Esta función abrirá una ventana para personalizar en tiempo real el diagrama de tallo y hoja resultante y guardarlo:

# install.packages("tcltk")
library(tcltk)

# install.packages("aplpack")
library(aplpack)

slider.stem.leaf(datos)

Slider para configurar diagrama de tallo y hojas

Diagrama de tallo y hojas como imagen con el paquete aplpack