Gráfico 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))
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)