12.4 Gráficas de barras

Este es quizás el tipo de gráfico mejor conocido de todos. Una gráfica de este tipo nos muestra la frecuencia con la que se han observado los datos de una variable discreta, con una barra para cada categoría de esta variable.

La función plot() puede generar gráficos de barra si damos como argumento x un vector de factor o cadena de texto, sin dar un argumento y.

Por ejemplo, creamos una gráfica de barras de la variable educación (“education”) de banco

plot(x = banco$education)

Al igual que con los histogramas, obtenemos un resultado aceptable no obstante el esfuerzo mínimo que hemos hecho para generar nuestra gráfica de barras.

Podemos ajustar los parámetros gráficos con los argumentos main, xlab, ylab y col. En este caso, podemos darle a col un vector de colores, uno por barra, para que cada una sea distinta.

plot(x = banco$education, main = "Gráfica de Educacíón",
     xlab = "Nivel educativo", ylab = "Frecuencia", 
     col = c("royalblue", "seagreen", "purple", "grey"))

La combinación de colores puede mejorar, pero ya tenemos una gráfica de barras presentable.

Sin embargo, hay ocasiones en las que deseamos usar gráficas de barras para presentar proporciones, que deseamos barras apiladas. Para esos casos, usamos la función barplot().

12.4.1 La función barplot()

Además de usar plot(), podemos crear gráficas de barra con la función barplot().

barplot pide como argumento una matriz, que represente una tabla de contingencia con los datos a graficar. Este tipo de tablas pueden ser generadas con la función table().

table() pide como argumento uno o más vectores, de preferencia variables discretas. Si damos sólo un vector como argumento, devuelve un conteo, si damos dos o más variables, devuelve tablas de contingencia.

Por ejemplo, el conteo de la variable education,

table(banco$education)
## 
##   primary secondary  tertiary   unknown 
##       678      2306      1350       187

Si damos como argumentos la variable education y la variable loan (préstamo), obtenemos una tabla de contingencia, que asignaremos al objeto tab_banco.

tab_banco <- table(banco$loan, banco$education)

# Resultado
tab_banco
##      
##       primary secondary tertiary unknown
##   no      584      1890     1176     180
##   yes      94       416      174       7

Damos como argumento tab_banco a barplot() y nos devuelve una gráfica de barras apiladas.

barplot(tab_banco)

Si deseamos graficar proporciones en lugar de conteos, usamos la función prop.table().

Esta función nos pide como argumento una tabla de contingencia generada por table(). y un número para margin. El argumento margin es similar a MARGIN de apply() (como vimos en el capítulo 10).

  • Si damos como argumento 1, las proporciones se calcularán agrupadas por renglón. La suma de proporciones por renglón será igual a 1.
  • Si damos como argumento 2, las proporciones se calcularán agrupadas por columna. La suma de proporciones por columna será igual a 1
  • Si no damos ningún argumento, las proporciones se calcularán usando toda la tabla como grupo. La suma de proporciones de todas las celdas en la tabla será igual a 1.

Para ilustrar esto, veamos los tres casos para margin usando como argumento nuestro objeto tab_banco.

# Proporción por renglón
prop.table(tab_banco, margin = 1)
##      
##          primary  secondary   tertiary    unknown
##   no  0.15248042 0.49347258 0.30704961 0.04699739
##   yes 0.13603473 0.60202605 0.25180897 0.01013025
# Porporción por columna
prop.table(tab_banco, margin = 2)
##      
##          primary  secondary   tertiary    unknown
##   no  0.86135693 0.81960104 0.87111111 0.96256684
##   yes 0.13864307 0.18039896 0.12888889 0.03743316
# Porporción por tabla
prop.table(tab_banco)
##      
##          primary  secondary   tertiary    unknown
##   no  0.12917496 0.41804910 0.26011944 0.03981420
##   yes 0.02079186 0.09201504 0.03848706 0.00154833

Nosotros queremos obtener las proporciones por columna, así que usaremos margin = 2.

ptab_banco <- prop.table(tab_banco, margin = 2)

Damos el resultado de la operación anterior a barplot().

barplot(ptab_banco)

Hemos obtenido el resultado esperado, pero podemos mejorar la presentación. Nota que con barras apiladas el argumento col se puede usar para colorear las categorias al interior de las barras.

barplot(ptab_banco,  main = "Préstamos por nivel educativo",
     xlab = "Nivel educativo", ylab = "Proporción", 
     col = c("royalblue", "grey"))

Luce bien, pero tenemos un problema: no sabemos qué representan las categorías en nuestras barras apiladas viendo sólamente nuestra gráfica.

Nosotros podemos consultar directamente con los datos, pero una persona que vea por primera vez esta gráfica no tendrá esa opción, reduciendo con ello su utiidad.

Para solucionar este problema, usamos leyendas.