GRÁFICO DE TALLO Y HOJAS

Es una de las representaciones clásicas de datos cuantitativos, similar a un diagrama de barras pero en forma de texto. Para construirlo basta separar de cada dato el último dígito de la derecha (que constituye la hoja) del bloque de cifras restantes (que formará el tallo).

Figura 1: gráfico de tallo y hojas
Figura 1: gráfico de tallo y hojas

Fue una de las herramientas propuestas por Tukey (1977) y muestra:

Es un gráfico simple, fácil de realizar (incluso a mano) pero su uso no es habitual, en parte porque no es muy útil cuando el número de observaciones es elevado.

Figura 2: sintaxis de la función stem()
Figura 2: sintaxis de la función stem()

Ejemplo

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

Por defecto, los datos aparecen agrupados. El argumento scale = 2 sirve para desagruparlos:

stem(datos, 
     scale = 2)
## 
##   The decimal point is 1 digit(s) to the right of the |
## 
##   1 | 256
##   2 | 149
##   3 | 0123
##   4 | 569
##   5 | 028
##   6 | 0345

De acuerdo con este gráfico, la mayor frecuencia de valores corresponde a la decena de 30 y la distribución no es totalmente simétrica, ya que la cola se desplaza hacia la derecha.

rm(datos)

DIAGRAMA DE BARRAS

Se utiliza para representar las frecuencias absolutas o relativas de una variable cualitativa (a veces, una cuantitativa discreta con un número reducido de categorías).

Se elabora a partir de una tabla de frecuencias. Constituye un gráfico cartesiano; habitualmente en el eje horizontal se ubican las categorías o niveles de la variable, mientras que en el vertical se representa la cantidad (frecuencia absoluta) o la frecuencia relativa de cada categoría. Las categorías pueden ordenarse alfabéticamente, facilitando la comparación de los datos.

Figura 3: gráfico de barras`
Figura 3: gráfico de barras`

El diagrama de barras también puede adoptar una orientación horizontal: en este caso las categorías se sitúan en el eje vertical y las barras crecen horizontalmente. Suelen usarse cuando hay muchas categorías o sus nombres son largos.

Tipos de gráficos de barras:

Figura 4: gráfico de barras apiladas`
Figura 4: gráfico de barras apiladas`
Figura 5: gráfico de barras apiladas`
Figura 5: gráfico de barras apiladas`

El diagrama de barras básico.

La función de R que genera gráficos de barras es barplot() seguido de una serie de argumentos, tomando como fuente una tabla de frecuencias. La tabla de frecuencias pueden proporcionar tanto la frecuencia absoluta o como la relativa. Por defecto, R crea el diagrama de barras con frecuencias absolutas.

El primer paso es cargar los datos del dataframe alumnos_UC.RData

Dos opciones:

  • Opción 1: creación de la tabla + impresión del gráfico.
tabla_sang <- table(alumnos_uc$grupo_sanguineo)                     # Creación de un objeto tabla

barplot(tabla_sang,                                                 # Tabla a partir de la que dibujamos el gráfico
        main = "Grupos sanguíneo de los estudiantes de la UC",      # Título del gráfico.
        cex.main = 1.5,                                             # Tamaño del título
        ylim = c(0, 50),                                            # Rango de valores del eje vertical.
        xlab = "Grupo",                                             # Etiqueta del eje vertical.
        ylab = "Frecuencia absoluta",                               # Etiqueta del eje horizontal.
        font.lab = 3,                                               # 1: normal, 2: bold, 3: italic, 4: bold italic
        col.lab = "darkblue",                                       # Color de las etiquetas
        font.axis = 2,                                              # 1: normal, 2: bold, 3: italic, 4: bold italic
        col.axis = "black",                                         # Color de los ejes
        cex.axis = 1.5,                                             # Grosor de los ejes
        col = rainbow(8))                                           # Cada barra con un color diferente (arcoiris)

  • OPCIÓN 2: anidar la función table() en barplot
barplot(table(alumnos_uc$grupo_sanguineo), 
        main = "Grupos sanguíneo de los estudiantes de la UC",     # Título del gráfico.
        ylim = c(0, 50),                                            # Rango de valores del eje vertical.
        xlab = "Grupo sanguíneo",                                   # Etiqueta del eje vertical.
        ylab = "Frecuencia absoluta",                               # Etiqueta del eje horizontal.
        col = rainbow(8))                                           # Cada barra con un color diferente (arcoiris)

Argumentos opcionales para la configuración del diagrama de barras

Figura 6: argumentos de la función barplot()
Figura 6: argumentos de la función barplot()

Frecuencias relativas.

Para elaborar un gráfico de barras que incluya las frecuencias relativas la función barplot() se aplica a una tabla creada con la función prop.table(), multiplicada por 100.

barplot(prop.table(tabla_sang) * 100,          
        main = "Grupos sanguíneo de los estudiantes de la UC",      # Título del gráfico.
        ylim = c(0, 50),                                            # Rango de valores del eje vertical.
        xlab = "Grupo sanguíneo",                                   # Etiqueta del eje vertical.
        ylab = "Frecuencia relativa (%)",                           # Etiqueta del eje horizontal.
        col = rainbow(8))                                           # Cada barra con un color diferente (arcoiris)

Dos posibles mejoras consisten en la inclusión de los valores correspondientes a la altura de las barras (frecuencia absoluta o relativa) y dibujar una línea de rejilla por debajo de las barras del gráfico. Para ello, debe recurrirse a un pequeño truco, dibujando primero el gráfico de barras lo más simple posible e ir superponiendo el resto de mejoras visuales.

# Gráfico de barras inicial
barplot(tabla_sang, 
        ylim = c(0,50), 
        xlab = "Grupo sanguíneo", 
        ylab = "Frecuencia aabsoluta") 

# Líneas de rejilla superpuestas
grid(nx = NA, 
     ny = NULL,
     lty = 2, 
     col = "black", lwd = 1)

# Gráfico de barras sobreimpuesto en forma de objeto
barp <- barplot(tabla_sang,        
                col = rainbow(8), 
                ylim = c(0,50),
                add = TRUE)

# Valores de la altura de las variables
text(barp, 
     tabla_sang + 3.5,                                                  # Distancia de las etiquetas al techo de las barras
     labels = tabla_sang)                                               # Etiquetas de los números sobre las barras.

Uno de los problemas más comunes con los gráficos de barras es la superposición de la leyenda al gráfico, como en el siguiente ejemplo.

barplot(tabla_sang, 
        main = "Grupos sanguíneo de los estudiantes de la UC",      # Título del gráfico.
        ylim = c(0, 50),                                            # Rango de valores del eje vertical.
        xlab = "Grupo sanguíneo",                                   # Etiqueta del eje vertical.
        ylab = "Frecuencia relativa (%)",                           # Etiqueta del eje horizontal.
        col = rainbow(8))                                           # Cada barra con un color diferente (arcoiris).
legend("top",                                                       # Posición de la leyenda.
       legend = rownames(tabla_sang),                               # Nombre de las etiquetas en la leyenda
       fill = rainbow(8),
       bty = "n")                                                   # Eliminar el marco de la leyenda   

Una opción alternativa es modificar el eje X, de modo que quede sitio a la izquierda para colocar la leyenda. Pero esta solución choca con la circunstancia que este eje no muestra valores numéricos, sino categorías. Pero es posible pedir a barplot las coordenadas de las posiciones de la base. La manera de obtener dichas coordenadas es asignar el gráfico a una variable y mostrar los valores de ésta (si además indicamos plot=FALSE nos ahorramos que R nos repita el gráfico, aunque tampoco tiene mayor importancia):

xCoords <- barplot(tabla_sang, 
        main = "Grupos sanguíneo de los estudiantes de la UC",      # Título del gráfico.
        ylim = c(0, 50),                                            # Rango de valores del eje vertical.
        xlab = "Grupo sanguíneo",                                   # Etiqueta del eje vertical.
        ylab = "Frecuencia relativa (%)",                           # Etiqueta del eje horizontal.
        col = rainbow(8),                                           # Cada barra con un color diferente (arcoiris).
        plot=FALSE)
xCoords
##      [,1]
## [1,]  0.7
## [2,]  1.9
## [3,]  3.1
## [4,]  4.3
## [5,]  5.5
## [6,]  6.7
## [7,]  7.9
## [8,]  9.1

De acuerdo con este resultado, la última barra alcanza la posición 9.1. Se puede reducir esta anchura fijando la extensión del eje X como xlim=c(0,9) (conviene probar unos cuantos valores) y modificando tanto el espacio entre las barras (argumento space) como la anchura de las barras (argumento width).

barplot(tabla_sang, 
        main = "Grupos sanguíneo de los estudiantes de la UC",      # Título del gráfico.
        ylim = c(0, 50),                                            # Rango de valores del eje vertical.
        xlab = "Grupo sanguíneo",                                   # Etiqueta del eje vertical.
        ylab = "Frecuencia relativa (%)",                           # Etiqueta del eje horizontal.
        col = rainbow(8),                                           # Cada barra con un color diferente (arcoiris)
        xlim = c(0,9),
        space = c(0.05,0.05, 0.05, 0.05, 0.05, 0.05, 0.05,0.05),    # Espacio entre las barras
        width = c(0.85,0.85, 0.85, 0.85, 0.85, 0.85, 0.85,0.85))    # Ancho de las barras

legend("right",                                                     # Posición de la leyenda.
       legend = rownames(tabla_sang),                               # Nombre de las etiquetas en la leyenda
       fill = rainbow(8), 
       bty = "n")                                                  # Eliminar el marco de la leyenda   

Otra posible solucion es dibujar el gráfico sin leyenda y crear a continuación una leyenda ex-profeso. Podemos mover la leyenda a la derecha, fuera del gráfico de barras utilizando el argumento inset dentro de una lista pasada como parámetro al argumento args.legend de la siguiente manera.

par(mar = c(5, 5, 4, 11))         # márgenes del lienzo según líneas. Por defecto mar = c(5, 4, 4, 2) abajo, izda, arriba, dcha.

barplot(tabla_sang,                                                 # Tabla con los datos
        main = "Grupos sanguíneo de los estudiantes de la UC",      # Título del gráfico
        ylim = c(0, 50),                                            # Rango de valores del eje vertical.
        xlab = "Grupo sanguíneo",                                   # Etiqueta del eje vertical
        ylab = "Frecuencia relativa (%)",                           # Etiqueta del eje horizontal
        col = rainbow(8),                                           # Cada barra con un color diferente (arcoiris).
        legend.text = rownames(tabla_sang),                         # Valores de la leyenda
        args.legend = list(x = "right", 
                           inset = c(-0.30, 0)),                   # Argumentos de la leyenda
        bty = "n")                                                  # Eliminar el marco de la leyenda   

Volvemos a continuación a configurar el lienzo con sus valores por defecto.

par(mar = c(5, 4, 4, 2))

También es posible elaborar un gráfico de barras a partir de un dataframe o de una lista. En el ejemplo que aparece a continuación los datos del dataframe no son los datos en bruto, sino que han sido previamente elaborados (en realidad, es una tabla de frecuencias convertida en dataframe)

borrame <- data.frame(ColorCoche = c("rojo", "verde", "blanco", "azul"),
                 num = c(3, 5, 9, 1))

barplot(height = borrame$num, 
        names = borrame$ColorCoche,
        col = c("red", "green", "white", "blue"))

Es posible transformar una variable continua en discreta y representarla por medio de un gráfico de barras. El procedimiento consiste en anidar la función cut() dentro de la función table(), para categorizar los datos, e incluir el argumento breaks indicando los límites inferior y superior de cada categoría.

barplot(table(cut(alumnos_uc$peso, 
                  breaks = seq(40, 100, by = 10))))

Para elaborar un gráfico con las barras horizontales se establece el argumento horiz = TRUE.

barplot(tabla_sang, 
        main="Alumnos de la UCGrupo sanguíneo",
        ylab = "Grupo sanguíneo",
        xlab = "Frecuencia absoluta",
        col=c("red","green","yellow", "pink", "blue", "purple", "magenta", "black"), 
        las = 1,                                                                 #Etiquetas del eje vertical horizontales
        horiz = TRUE)                                                   

De nuevo, en este caso es común que las etiquetas del eje vertical queden fuera del área de trabajo.

par(mar = c(5, 15, 4, 2))         # márgenes del lienzo según líneas. Por defecto mar = c(5, 4, 4, 2) abajo, izda, arriba, dcha.
tabla_rama <- table(alumnos_uc$rama_conocimiento_let)

barplot(tabla_rama, 
        main="Alumnos de la UC",
        xlab = "Frecuencia absoluta",                                   
        col=c("red","green","yellow", "blue", "purple", "magenta"), 
        las = 1,                                                                #Etiquetas del eje vertical horizontales
        horiz = TRUE)

par(mar = c(5, 4, 4, 2))
rm(tabla_sang, tabla_rama, borrame, barp)

📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: DIAGRAMA DE BARRAS :

EJERCICIO 1. A partir del dataframe alumnos_uc crea un diagrama de barras que informe sobre la procedencia geográfica de los alumnos de nuevo ingreso en forma de frecuencia relativa.

  • Incluye las etiquetas en los ejes X e Y. Si las etiquetas del eje X se empastaran, asigna unas nuevas etiquetas al gráfico.

  • Cada ámbito geográfico le corresponderá un color diferente.

barplot(table(alumnos_uc$procedencia), 
        main = "Origen de los alumnos de nuevo ingreso en la UC",
        xlab = "Comarcas", 
        ylab = "Frecuencia de alumnos en (%)",
        ylim = c(0,50),                                       
        las = 1,                                              # Posición horizontal de las etiquetas de ambos ejes.
        cex.lab = 1.2,                                        # Tamaño de las etiquetas de los ejes.
        font.axis = 2,
        col=c("red","green","yellow", "blue", "purple", "magenta"),
        names.arg = c("Bahía", "Besaya", "Campoo", "Foráneos", "Occidental", "Oriental"))                                 

EJERCICIO 2. A partir del dataframe zonas_verdes Crea un diagrama de barras clásico representando la frecuencia absoluta de parques con obras y sin obras.

  • El gráfico deberá tener por título “Parques de Madrid en obras”.

  • El eje X deberá tener la etiqueta “Estado actual”.

  • La etiqueta del eje Y deberá ser “Número de parques”.

  • Ajusta los valores del eje Y para que la altura de las barras no sobresalga por encima del valor máximo de dicho eje.

  • La barra correspondiente a los valor “No” tendrá un color verde y la barra “Si” un color rojo.

load("D:/G2040/TEMA_3_ESDA_Graficos/datos/zonas_verdes.Rdata")
zonas_verdes$obras <- factor(zonas_verdes$obras,
               levels=c(0,1),                   
               labels=c("Sin obras","Con obras"))      
barplot(table(zonas_verdes$obras), 
        main = "Parques de Madrid en obras",
        xlab = "Estado actual", 
        ylab = "Número de parques",
        ylim = c(0,70),                                       #
        las = 1,                                              # Posición horizontal de las etiquetas de ambos ejes.
        cex.lab = 1.2,                                        # Tamaño de las etiquetas de los ejes.
        font.axis = 2,
        col = c("Green", "Red"))                                 

EJERCICIO 3. Crea un diagrama de barras horizontal representando la frecuencia relativa de la variable barrio que se encuentra en el dataframe zonas_verdes.

  • El gráfico deberá tener por título “Número de Parques según barrios de Madrid”.

  • El eje X deberá tener la etiqueta “Porcentaje sobre el total”.

  • Ajusta los valores del eje X para que la longitud de las barras no sobresalga por encima del valor máximo de dicho eje.

  • Utiliza la gama de colores del arcoiris para que cada una de las barras tenga un color diferente.

par(mar = c(5, 8, 4, 2))         # márgenes del lienzo según líneas. Por defecto mar = c(5, 4, 4, 2) abajo, izda, arriba, dcha.

barplot(prop.table(table(zonas_verdes$barrio)) * 100,
        main="Parques según barrios de Madrid",                                    
        col= rainbow(7), 
        las = 1,                                                                #Etiquetas del eje vertical horizontales
        horiz = TRUE, 
        xlab = "Porcentaje sobre el total", 
        xlim = c(0,25),                                       
        cex.lab = 1.2,                                        # Tamaño de las etiquetas de los ejes.
        font.axis = 2)

par(mar = c(5, 4, 4, 2))

Gráfico de barras apiladas/superpuestas

Se obtiene cuando se aplica la función barplot() a una tabla con dos variables (bidimensional), con dos posibilidades dependiendo del argumento beside:

  • Si es “FALSE” barras apiladas;

  • Si “TRUE” barras yuxtapuestas.

Primero debe crearse una tabla denominada “de doble entrada”, con dos variables simultáneas:

tabla_procedencia_genero <- table(alumnos_uc$genero, 
                                alumnos_uc$rama_conocimiento_let)
  • OPCION 1: barras apiladas (por defecto)
barplot(tabla_procedencia_genero,
        main = "Gráfico de barras apiladas",
        sub = "Subtítulo",
        col = c("red", "yellow"),
        ylim = c(0, 30),
        xlab = "Etiqueta eje X",
        ylab = "Etiqueta eje Y",
        names.arg = c("AyH", "Cie", "CSYJ", "IyA", "CS"),
        axes = TRUE)

OPCION 2: barras yuxtapuestas

barplot(tabla_procedencia_genero,
      main = "Gráfico de barras yuxtapuestas",
      sub = "Subtítulo",
      xlab = "Etiqueta eje X",
      ylab = "Etiqueta eje Y",
      axes = TRUE,
      col = c("Green", "Blue"),
      names.arg = c("AyH", "Cie", "CSYJ", "IyA", "CS"),
      beside = TRUE)

📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: GRÁFICO DE BARRAS APILADAS:

EJERCICIO 1. A partir de una tabla que combine la frecuencia de valores de las variables rama_conocimiento_let y genero del dataframe alumnos_uc crea un gráfico de barras apiladas con la frecuencia de ambas variables y las siguientes características:

  • El gráfico deberá tener por título “Elección de la rama de conocimiento según género”.

  • La etiqueta del eje X es “Género” y deberá estar acompañada por un subtítulo con la siguiente inscripción “Curso 2022-2023”.

  • Ajusta los valores del eje X para que la longitud de las barras no sobresalga por encima del valor máximo de dicho eje.

  • La etiqueta del eje Y es “Porcentaje de alumnos”.

  • Utiliza la siguiente gama de colores: c(“red”,“green”,“yellow”, “blue”, “purple”, “magenta”, “orange”).

  • Incluye una leyenda a la derecha, que no invada las columnas, en la que aparezcan los nombres de las ramas de conocimiento con sus respectivos colores.

par(mar = c(5, 4, 4, 14))         # márgenes del lienzo según líneas. Por defecto mar = c(5, 4, 4, 2) abajo, izda, arriba, dcha.

barplot(prop.table(table(alumnos_uc$rama_conocimiento_let, alumnos_uc$genero)) * 100,
      main = "Elección de la rama de conocimiento según género",
      sub = "Curso 2022-2023",
      xlab = "Género",
      ylab = "Porcentaje de alumnos",
      ylim=c(0,80),
      las = 1,
      axes = TRUE,
      col = c("red","green","yellow", "blue", "purple", "magenta", "orange"),
      beside = FALSE,
      legend.text=rownames(table(alumnos_uc$rama_conocimiento_let, alumnos_uc$genero)),
      args.legend = list(x = "topright", inset = c(-0.70, 0)))

EJERCICIO 2. A partir de una tabla que combine la frecuencia de valores de las variables barrio y obras del dataframe zonas_verdes crea un gráfico de barras yuxtapuestas con las siguientes características:

  • El gráfico deberá tener por título “Estado de las obras en los parques de Madrid”.

  • La etiqueta del eje X es “Parques” y deberá estar acompañada por un subtítulo con la siguiente inscripción “Año 2023”.

  • Ajusta los valores del eje X para que la longitud de las barras no sobresalga por encima del valor máximo de dicho eje.

  • La etiqueta del eje Y es “Número de parques”.

  • Utiliza la siguiente gama de colores: c(“red”,“green”,“yellow”, “blue”, “purple”, “magenta”, “orange”).

  • Incluye una leyenda a la derecha, que no invada las columnas, en la que aparezcan los nombres de los barrios con sus respectivos colores.

par(mar = c(5, 4, 4, 10))         # márgenes del lienzo según líneas. Por defecto mar = c(5, 4, 4, 2) abajo, izda, arriba, dcha.

barplot(table(zonas_verdes$barrio, zonas_verdes$obras),
      main = "Estado de las obras en los parques de Madrid",
      sub = "Año 2023",
      xlab = "Parques",
      ylab = "Número de parques",
      ylim=c(0,16), 
      axes = TRUE,
      col = c("red","green","yellow", "blue", "purple", "magenta", "orange"),
      beside = TRUE,
            names.arg = c("Sin obra", "Con obra"),
      legend.text=rownames(table(zonas_verdes$barrio, zonas_verdes$obras)),
      args.legend = list(x = "right", inset = c(-0.30, 0)))

Spine plot

Los spineplots son una generalización de los gráficos de barras apilados. Un gráfico de mosaico es un spineplot para dos o más variables. Como en los casos anteriores, se requiere una tabla de frecuencias.

spineplot(tabla_procedencia_genero, 
          col = c("yellow", "orange", "red", "magenta", "green"),
          border = c("darkblue", "black"))                                      # Color del borde de las barras

Un spine plot transpuesto es un gráfico de barras clásico.

spineplot(t(tabla_procedencia_genero))                                            # Trasposición de variables

Por defecto, la función spineplot() crea un spineplot, pero estableciendo off = 0 se creará una variante, denominada “espinograma”, eliminando la distancia entre las barras.

spineplot(tabla_procedencia_genero, 
          off = 0)

rm(tabla_procedencia_genero)

📝 ****ACTIVIDAD DE EVALUACIÓN CONTINUA: SPINE PLOT**::

Crea un gráfico “Spine plot” que represente la relación entre la variable rama_conocimiento_let y la variable uso_movil_let. Este gráfico tendrá como título “Relación entre rama conocimiento y uso de móvil”. Añade las etiquetas según corresponda.

Diagrama de mosaico.

También conocidos como gráfico de Marimekko, o gráfico de barras apiladas porcentuales. Es una extensión multidimensional de los gráficos de barras al permitir la visualización de dos o más variables cualitativas. Permite reconocer relaciones entre diferentes variables; por ejemplo, la independencia se muestra cuando las casillas de las categorías tienen todas las mismas áreas.

Al igual que con los gráficos de barras, en este caso es el área de los mosaicos, también conocida como tamaño del contenedor, el que es proporcional al número de observaciones dentro de esa categoría, es decir, que en la tabla de frecuencias original, cada entrada corresponde a un rectángulo cuyo área es proporcional a ese valor

mosaicplot(procedencia ~ genero, 
           data=alumnos_uc,
           main="Procedencia del alumnado según sexo",
           cex.axis=1,                                                        # TamaÁ±o de las etiquetas ejes X e Y
           las=1,
           xlab = "Localización",
           ylab = "Género",
           col=c("pink","lightblue"))

📝 ****ACTIVIDAD DE EVALUACIÓN CONTINUA: DIAGRAMA DE MOSAICO**::

Repite el gráfico anterior, pero ahora como diagrama de mosaico. ¿Cuál de los dos es más útil para explicar la relación entre la rama de conocimiento y el uso más o menos continuado del teléfono móvil.

Diagrama de Pareto

El diagrama de Pareto, también llamado curva cerrada o Distribución A-B-C, combina barras y líneas.

  • Como en el gráfico de barras clásico, en el eje horizontal se representan las categorías de la variable que queremos estudiar y la altura de las barras es proporcional al valor de cada categoría, pero están ordenadas por frecuencias de forma descendente.

  • En el eje vertical derecho se muestra la escala de porcentajes

  • En el eje vertical izquierdo se representa la escala de frecuencias.

  • La línea representa el porcentaje acumulado de dichas frecuencias respecto el total.

Figura 3: gráfico de barras`
Figura 3: gráfico de barras`

Este gráfico se fundamenta en el principio de Pareto.

PRINCIPIO DE PARETO:

El principio de Pareto, también conocido como la regla del 80-20 y ley de los pocos vitales, describe el fenómeno estadístico por el que, en cualquier población que contribuye a un efecto común, una proporción pequeña de casos (20 % de los casos) contribuye a la mayor parte (el 80%) de los efectos, ya que la distribución de los efectos como sus posibles causas no es un proceso lineal.

Recibe uno de sus nombres en honor a Vilfredo Pareto, que lo enunció por primera vez en su Cours d’économie politique (Curso de economía política) de 1896. Pareto formuló este principio tras un estudio acerca de la distribución de la riqueza con el que estableció que la desigualdad económica es inevitable en cualquier sociedad.

El principal uso de este tipo de gráfico es establecer un orden de prioridades en la toma de decisiones (asignar un orden de prioridades), ya que en el gráfico los “pocos vitales” aparecen a la izquierda y los “muchos triviales” a la derecha.

En R se puede elaborar con la función pareto.chart() del paquete qcc.

library(qcc)

Podemos seguir diferentes opciones:

  • OPCIÓN 1: creación de una tabla con la función table() y posterior activación de la función pareto.chart() sobre esa tabla.
tabla_gs <- table(alumnos_uc$grupo_sanguineo)

pareto.chart(tabla_gs,
             main="Diagrama de Pareto",
             xlab="Grupo sanguíneo",
             ylab="Frecuencia absoluta",
             ylab2="Frecuencia relativa acumulada",
             las = 1,
             col=heat.colors(length(alumnos_uc$procedencia)))

##      
## Pareto chart analysis for tabla_gs
##       Frequency Cum.Freq. Percentage Cum.Percent.
##   A+         42        42         42           42
##   O+         37        79         37           79
##   O-          7        86          7           86
##   A-          6        92          6           92
##   AB+         3        95          3           95
##   AB-         2        97          2           97
##   B-          2        99          2           99
##   B+          1       100          1          100
  • OPCIÓN 2: anidamos la tabla en la función pareto.chart
pareto.chart(table(alumnos_uc$grupo_sanguineo))

##      
## Pareto chart analysis for table(alumnos_uc$grupo_sanguineo)
##       Frequency Cum.Freq. Percentage Cum.Percent.
##   A+         42        42         42           42
##   O+         37        79         37           79
##   O-          7        86          7           86
##   A-          6        92          6           92
##   AB+         3        95          3           95
##   AB-         2        97          2           97
##   B-          2        99          2           99
##   B+          1       100          1          100
  • OPCIÓN 3: es posible obtener la tabla de frecuencias, no el gráfico
pareto.chart(table(alumnos_uc$grupo_sanguineo),
             plot=FALSE)
##      
## Pareto chart analysis for table(alumnos_uc$grupo_sanguineo)
##       Frequency Cum.Freq. Percentage Cum.Percent.
##   A+         42        42         42           42
##   O+         37        79         37           79
##   O-          7        86          7           86
##   A-          6        92          6           92
##   AB+         3        95          3           95
##   AB-         2        97          2           97
##   B-          2        99          2           99
##   B+          1       100          1          100
rm(tabla_gs)

DIAGRAMA CIRCULAR (sectores).

Un gráfico de sectores es una representación circular de las frecuencias de una variable cualitativa o discreta. El círculo representa todos los valores analizados y cada porción, también llamada sector, representan la proporción de cada categoría de la variable. Aunque las frecuencias pueden aparecer en forma absoluta, el gráfico circular suele expresarse en porcentajes. Sólo es útil cuando el número de categorías es pequeño.

Diagrama circular básico.

En R este tipo de gráfico también se realiza a partir de una tabla; esta puede haber sido creada previamente o se pueden crear también anidando, como en el caso del gráfico de barras

tabla_movil <- table(alumnos_uc$uso_movil)                                                     

Ejemplo desarrollado con argumentos opcionales

pie(tabla_movil, 
    main="Uso del móvil por el alumnado de la UC",
    radius = 1.05,                              # Tamaño del gráfico entre -1 y 1 (por defecto 0.8): etiquetas grandes necesitan radios pequeños.
    edges = 200,                                # Aproxima la linea exterior mediante un polígono (número de lados especificado).
    init.angle = 95,                            # Ángulo inicial de las porciones
    clockwise = TRUE,                           # TRUE el orden de las porciones se dibuja según las agujas del reloj. 
    labels = c("Escaso","Moderado","Intenso"),  # Etiquetas de cada porción. En caso de querer que aparezca el número labels = count
    cex = 1.5,                                    # Tamaño de las etiquetas.
    col = c("Green", "Yellow","red"),           # Colores de relleno.
    density = 50,                               # Densidad de las líneas de sombreado
    angle = 45,                                 # Ángulo de las líneas del sombreado.
    border = "black",                           # Color del borde de cada porción. Para que el color sea igual al color del área border = color.
    lty = 2)                                    # Tipo de línea de los bordes del gráfico

Es muy habitual que el gráfico de sectores incluya las frecuencias relativas (porcentajes) en el gráfico. Dos opciones.

  • OPCIÓN 1. La tabla sólo incluye frecuencas absolutas. Hay que convertirlas en relativas y escribirlas en el gráfico
tabla_movil2 <- round(prop.table(tabla_movil) * 100, 2)

pie(tabla_movil2, 
    labels = paste0(tabla_movil2, "%"))

  • OPCIÓN 2.
pct <- round(tabla_movil/sum(tabla_movil)*100)                                    # Cálculo de los porcentajes
etiquetas <- paste(names(tabla_movil), pct, "%")                                  # Añadimos los porcentajes a las etiquetas

pie(tabla_movil,
    col=gray(seq(0.2, 1.0, length = 3)),
    labels=etiquetas)

Para mostrar a la vez números y etiquetas

etiq <- paste0(tabla_movil, " = ", round(100 * tabla_movil/sum(tabla_movil), 2), "%")
pie(tabla_movil, labels = etiq)

📝 ****ACTIVIDAD DE EVALUACIÓN CONTINUA: DIAGRAMA CIRCULAR**::

Representa mediante diagramas circulares las variables rama_conocimiento y procedencia.

Para crear el gráfico de sectores de la variable rama_conocimiento incluye en el gráfico

  • Etiquetas con porcentaje.

  • Colores diferentes en cada sector.

  • Un tamaño de las etiquetas de 1.25.

Acompaña el gráfico con una leyenda situada a la izquierda y arriba en la que aparezcan las diferentes ramas de conocimiento, cada una con el mismo color del sector, sin marco y con el título Rama de conocimiento:

tabla_rama_conocimiento <- round(prop.table(table(alumnos_uc$rama_conocimiento_let)) * 100, 2)      # Conversión en porcentaje

pie(tabla_rama_conocimiento, 
    labels = paste0(tabla_rama_conocimiento, "%"),           # Etiquetas con porcentaje
    col = topo.colors(5),                                    # Colores
    cex = 1.25)                                              # Tamaño de las etiquetas

legend("topleft", 
       legend = c("Arte y Humanidades", "Ciencias", "Ciencias Sociales y Jurídicas", "Ingeniería y Arquitectura", "Ciencias de la Salud"),
       fill =  topo.colors(5),                               # Colores
       bty = "n",                                            # Sin marco alrededor de la leyenda.
       cex = 0.75,                                           # Tamaño de las etiquetas de la leyenda.
       title = "Rama de conocimiento")

Para crear el gráfico correspondiente a la procedencia, actúa con total libertad.

Diagrama circular en 3D.

Es una variante del gráfico de sectores. Para ello es necesario cargar el paquete plotrix, que contiene la función pie3D().

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

library("RColorBrewer")
display.brewer.all()

En primer lugar, se crea la tabla

tabla_movil <- table(alumnos_uc$uso_movil_let)

A continuación se crea el gráfico a partir de la tabla anterior

pie3D(tabla_movil,
      main="Diagrama circular en 3D",                                           # Título del gráfico
      col=brewer.pal(n = 3, name = "RdBu"),                                     # Colores para rellenar o sombrear las porciones
      labels = names(tabla_movil),                                              # Etiquetas de las porciones
      radius = 1.0,                                                             # Radio de la tarta
      labelcex = 1,                                                             # Factor de expansión de las etiquetas
      border = "yellow",                                                        # Color del borde de los sectores
      shade = 0.3,                                                              # Sombreado del borde de los sectores
      explode=0.1,                                                              # Cantidad de apertura de las porciones
      height = 0.2,                                                             # Altura (grosor) del diagrama
      theta = 0.8)                                                              # Ángulo de visión (radianes)

Como en el caso anterior, se pueden añadir los porcentajes, cambiar su color y tamaño etc.

lab <- paste0(round(tabla_movil/sum(tabla_movil) * 100, 2), "%")
pie3D(tabla_movil,
      col = hcl.colors(length(tabla_movil), "Spectral"),
      labels = lab,
      labelcol = "red",
      labelcex = 1.75)

rm(tabla_movil, tabla_movil2, etiquetas, pct)

Gráfico de DONUT

Este gráfico (también conocido como gráfico de rosquilla) es otra variante del gráfico de sectores. Para construirlo se necesita el paquete lessR (https://rdrr.io/cran/lessR/man/PieChart.html; atención, en este caso no es necesario crear una tabla previa).

library(lessR)

La función que crea este gráfico de donut es pieChart().

PieChart(grupo_sanguineo, 
         data = alumnos_uc,
         main = NULL)

## >>> suggestions
## PieChart(grupo_sanguineo, hole=0)  # traditional pie chart
## PieChart(grupo_sanguineo, labels="%")  # display %'s on the chart
## PieChart(grupo_sanguineo)  # bar chart
## Plot(grupo_sanguineo)  # bubble plot
## Plot(grupo_sanguineo, labels="count")  # lollipop plot 
## 
## --- grupo_sanguineo --- 
## 
##                   A-     A+    AB-    AB+     B-     B+     O-     O+     Total 
## Frequencies:       6     42      2      3      2      1      7     37       100 
## Proportions:   0.060  0.420  0.020  0.030  0.020  0.010  0.070  0.370     1.000 
## 
## Chi-squared test of null hypothesis of equal probabilities 
##   Chisq = 158.880, df = 7, p-value = 0.000

La sintaxis anteriores es equivalente a:

pc(grupo_sanguineo, data = alumnos_uc, main = NULL) 

## >>> suggestions
## PieChart(grupo_sanguineo, hole=0)  # traditional pie chart
## PieChart(grupo_sanguineo, labels="%")  # display %'s on the chart
## PieChart(grupo_sanguineo)  # bar chart
## Plot(grupo_sanguineo)  # bubble plot
## Plot(grupo_sanguineo, labels="count")  # lollipop plot 
## 
## --- grupo_sanguineo --- 
## 
##                   A-     A+    AB-    AB+     B-     B+     O-     O+     Total 
## Frequencies:       6     42      2      3      2      1      7     37       100 
## Proportions:   0.060  0.420  0.020  0.030  0.020  0.010  0.070  0.370     1.000 
## 
## Chi-squared test of null hypothesis of equal probabilities 
##   Chisq = 158.880, df = 7, p-value = 0.000

Es posible incluir una serie de argumentos adicionales para personalizar el gráfico

PieChart(grupo_sanguineo, 
         data = alumnos_uc,
         fill = "viridis",                        # Color de los sectores mediante una paleta de colores prespecificadas (cambia a "blues" o "heat")
         hole = 0.5,                              # Tamaño del agujero central: 0, un gráfico de sectores) a 0.99. El valor por defecto es 0.68.
         color = "black",                         # Color de la línea del borde
         lwd = 2,                                 # Ancho de la línea del borde
         lty = 1,                                 # Tipo de línea del borde
         hole_fill = "#B7E3E0",                   # Color del agujero central (blanco por defecto)
         main = "Gráfico de dónut",               # Título
         labels_size = 1.2,                       # Tamaño de las etiquetas con los valores (%).
         labels_color = "black")

## >>> suggestions
## PieChart(grupo_sanguineo, hole=0)  # traditional pie chart
## PieChart(grupo_sanguineo, labels="%")  # display %'s on the chart
## PieChart(grupo_sanguineo)  # bar chart
## Plot(grupo_sanguineo)  # bubble plot
## Plot(grupo_sanguineo, labels="count")  # lollipop plot 
## 
## --- grupo_sanguineo --- 
## 
##                   A-     A+    AB-    AB+     B-     B+     O-     O+     Total 
## Frequencies:       6     42      2      3      2      1      7     37       100 
## Proportions:   0.060  0.420  0.020  0.030  0.020  0.010  0.070  0.370     1.000 
## 
## Chi-squared test of null hypothesis of equal probabilities 
##   Chisq = 158.880, df = 7, p-value = 0.000

También se puede crear una paleta de colores especial. Esta paleta debe ser de la misma longitud que el número de porciones.

col <- hcl.colors(length(unique(alumnos_uc$grupo_sanguineo)), "Zissou 1")

PieChart(grupo_sanguineo, 
         data = alumnos_uc,
         fill = col,
         main = NULL) 

## >>> suggestions
## PieChart(grupo_sanguineo, hole=0)  # traditional pie chart
## PieChart(grupo_sanguineo, labels="%")  # display %'s on the chart
## PieChart(grupo_sanguineo)  # bar chart
## Plot(grupo_sanguineo)  # bubble plot
## Plot(grupo_sanguineo, labels="count")  # lollipop plot 
## 
## --- grupo_sanguineo --- 
## 
##                   A-     A+    AB-    AB+     B-     B+     O-     O+     Total 
## Frequencies:       6     42      2      3      2      1      7     37       100 
## Proportions:   0.060  0.420  0.020  0.030  0.020  0.010  0.070  0.370     1.000 
## 
## Chi-squared test of null hypothesis of equal probabilities 
##   Chisq = 158.880, df = 7, p-value = 0.000

El argumento values se usa para:

  • Mantener los valores originales.

  • Eliminar los valores del gráfico.

  • Transformarlos en proporciones.

  • También puedes usar los argumentos values_size, values_digits, values_color y values_position para personalizarlos.

PieChart(grupo_sanguineo, 
         data = alumnos_uc,
         fill = "viridis",
         main = NULL,
         color = "black",
         lwd = 1.5,
         values_color = c(rep("white", 4), 1),                                  # Personalización de los valores
         values_size = 0.85)

## >>> suggestions
## PieChart(grupo_sanguineo, hole=0)  # traditional pie chart
## PieChart(grupo_sanguineo, labels="%")  # display %'s on the chart
## PieChart(grupo_sanguineo)  # bar chart
## Plot(grupo_sanguineo)  # bubble plot
## Plot(grupo_sanguineo, labels="count")  # lollipop plot 
## 
## --- grupo_sanguineo --- 
## 
##                   A-     A+    AB-    AB+     B-     B+     O-     O+     Total 
## Frequencies:       6     42      2      3      2      1      7     37       100 
## Proportions:   0.060  0.420  0.020  0.030  0.020  0.010  0.070  0.370     1.000 
## 
## Chi-squared test of null hypothesis of equal probabilities 
##   Chisq = 158.880, df = 7, p-value = 0.000

Argumento rows: crea un subconjunto de los datos.

PieChart(grupo_sanguineo, 
         data = alumnos_uc,
         rows = (procedencia == "Bahía" & genero == "Masculino"),
         main = NULL) 
## Rows of data before filtering:  100 
## Rows of data after filtering:   15

## >>> suggestions
## PieChart(grupo_sanguineo, hole=0)  # traditional pie chart
## PieChart(grupo_sanguineo, labels="%")  # display %'s on the chart
## PieChart(grupo_sanguineo)  # bar chart
## Plot(grupo_sanguineo)  # bubble plot
## Plot(grupo_sanguineo, labels="count")  # lollipop plot 
## 
## --- grupo_sanguineo --- 
## 
##                   A-     A+    AB-    AB+     B-     B+     O-     O+    Total 
## Frequencies:       0      6      1      2      0      0      0      6       15 
## Proportions:   0.000  0.400  0.067  0.133  0.000  0.000  0.000  0.400    1.000 
## 
## Chi-squared test of null hypothesis of equal probabilities 
##   Chisq = 26.067, df = 7, p-value = 0.000 
## >>> Low cell expected frequencies, so chi-squared approximation may not be accurate 
## 

📝 ****ACTIVIDAD DE EVALUACIÓN CONTINUA: DIAGRAMA DE DONUT**::

Utiliza las variables uso de móvil y procedencia para crear un diagrama 3D y un diagrama de dónut para. Comp<ra ambos gráficos con el diagrama de sectores clásico. ¿Se gana legilibilidad en los diagramas más complicados?.

  • Diagrama 3D
tabla_movil <- table(alumnos_uc$uso_movil_let)

pie3D(tabla_movil,
      main="Diagrama circular en 3D",                                           # Título del gráfico
      col=brewer.pal(n = 3, name = "RdBu"),                                     # Colores para rellenar o sombrear las porciones
      labels = names(tabla_movil),                                              # Etiquetas de las porciones
      radius = 1.0,                                                             # Radio de la tarta
      labelcex = 1,                                                             # Factor de expansión de las etiquetas
      border = "yellow",                                                        # Color del borde de los sectores
      shade = 0.3,                                                              # Sombreado del borde de los sectores
      explode=0.1,                                                              # Cantidad de apertura de las porciones
      height = 0.2,                                                             # Altura (grosor) del diagrama
      theta = 0.8)                                                              # Ángulo de visión (radianes)
  • Diagrama de dónut
PieChart(grupo_sanguineo, 
         data = alumnos_uc,
         fill = "viridis",                        # Color de los sectores mediante una paleta de colores prespecificadas (cambia a "blues" o "heat")
         hole = 0.5,                              # Tamaño del agujero central: 0, un gráfico de sectores) a 0.99. El valor por defecto es 0.68.
         color = "black",                         # Color de la línea del borde
         lwd = 2,                                 # Ancho de la línea del borde
         lty = 1,                                 # Tipo de línea del borde
         hole_fill = "#B7E3E0",                   # Color del agujero central (blanco por defecto)
         main = "Gráfico de dónut",               # Título
         labels_size = 1.2,                       # Tamaño de las etiquetas con los valores (%).
         labels_color = "black")