DIAGRAMA DE CAJA Y BIGOTES

Consiste en un gráfico que permite observar algunas propiedades de una variable, como su centralidad (media, moda), su dispersión y su grado de simetría, así como definir valores atípicos. Aunque puede utilizarse sólo representando variables cuantitativas, su uso habitual combina variables cuantitativas y cualitativas.

Figura 6: gráfico de caja y bigotes apiladas`
Figura 6: gráfico de caja y bigotes apiladas`

Consiste en un rectángulo, alineado horizontal o verticalmente, en el que aparecen los tres cuartiles (1º, 2º y 3º), al igual que los valores mínimo y máximo de los datos, a partir de los cuales también se pueden definir el intervalo intercuartílico (ancho de la caja) así como los valores atípicos. Un valor atípico se define como aquel en el que un valor es mayor que Q3 + 1,5 IQR o menor que < Q1 - 1.5 * IQR, siendo Q1 primer cuartil, Q3 tercer cuartil.

Para esta activadad también se utilizará el dataframe alumnos_UC.RData.

Representación de una única variable.

par(mfrow=c(1,2))                                                               # Fraccionamos la ventana grafica en 2x2.

boxplot(alumnos_uc$peso, 
        main = "Vertical")
boxplot(alumnos_uc$peso,
        main = "Horizontal",
        horizontal = TRUE)                                                      # Disposición horizontal

par(mfrow=c(1,1))                                                               # Vuelta al gráfico inicial

Suele ser conveniente añadir una línea con el valor medio de la variable. Para ello, primero se imprime el gráfico y luego se representan una línea (función segments()) y, en ocasiones, un punto (función points()).

boxplot(alumnos_uc$peso)
segments(x0 = 0.8, 
         y0 = mean(alumnos_uc$peso),              # Los puntos de inicio y de final de la línea se especifican con los argumentos x0, x1, y0 e y1
         x1 = 1.2, 
         y1 = mean(alumnos_uc$peso),
         col = "red", 
         lwd = 2,)
points(mean(alumnos_uc$peso),                     # Adición de un punto con la media
       col = 3,                                   # Color verde
       pch = 19)                                  # Tipo de símbolo

Creando un objeto a partir de la función boxplot(), se puede acceder a una lista con los diferentes componentes que proporciona la función. Para ello, primero se crea el diagrama de caja y bigotes y luego se almacena como objeto. Con el argumento statsse obtienen:

  • Límite inferior casos atípicos.

  • Cuartil inferior.

  • Mediana (2º cuartil).

  • Cuartil superior

  • Límite superior de casos atípicos.

objeto <- boxplot(alumnos_uc$peso)

objeto$stats              # Estadísticos
##          [,1]
## [1,] 59.02050
## [2,] 71.61213
## [3,] 81.45998
## [4,] 89.25927
## [5,] 95.95121
objeto$n                  # Número de observaciones de cada grupo.
## [1] 100
objeto$conf               # Extremos inferior y superior del intervalo de confianza de la mediana.
##          [,1]
## [1,] 78.67173
## [2,] 84.24823
objeto$out                # Valores atípicos.
## numeric(0)

Una limitación de los gráficos de caja y bigotes es que no están diseñados para detectar variables con más de una moda (multimodalidad). Por ello, en ocasiones es recomendable combinar un diagrama de caja con un histograma o una curva de densidad.

# Histograma
hist(alumnos_uc$peso, 
     probability = TRUE, 
     ylab = "",                                                                 # Sin etiquetas en el eje y
     col = "grey",                                                              # Color de las barras del histograma
     axes = FALSE,                                                              # Sin ejes
     main = "")                                                                 # Sin tí­tulo
axis(1)                                                                         # AÁ±adimos eje X

# Curva
lines(density(alumnos_uc$peso), col = "red", lwd = 2)

# Diagrama de caja y bigotes
par(new = TRUE)
boxplot(alumnos_uc$peso, horizontal = TRUE, axes = FALSE,
        lwd = 2, col = rgb(0, 1, 1, alpha = 0.15))

Representando una variable cuantitativa (eje Y) según los valores de una variable cualitativa (eje X).

Este tipo de gráfico permite analizar y comparar las características de una misma variable según dos o más grupos (factores).

boxplot(alumnos_uc$peso ~ alumnos_uc$genero)
abline(h = mean(alumnos_uc$peso), 
       col = 2, 
       lwd = 2)                                            # Añade el valor medio

La sintaxis anterior es equivalente a ésta:

boxplot(peso ~ genero,                                    
        data = alumnos_uc,
        notch = TRUE)           # Intervalos de confianza al 95% para la mediana. Si no se superponen las medianas son diferentes estadísticamente.

Por defecto, los diagramas de caja se dibujan con el orden con el que aparecen los factores en los datos originales. En ocasiones, puede ser conveniente modificar dicho orden aplicando la función reorder() tomando como referencia la posición de cada grupo respecto a un estadístico como la mediana o la media de los datos.

  • De más bajo a más alto utilizando la mediana
mediana <- with(alumnos_uc, reorder(procedencia, peso, median)) 
boxplot(alumnos_uc$peso ~ mediana, 
        las = 2)
abline(h = mean(alumnos_uc$peso), 
       col = 2, 
       lwd = 2) 

  • De más alto a más bajo.
mediana <- with(alumnos_uc, reorder(procedencia, -peso, median)) 
boxplot(alumnos_uc$peso ~ mediana, 
        las = 2)
abline(h = mean(alumnos_uc$peso), 
       col = 2, 
       lwd = 2) 

📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: DIAGRAMA DE CAJA Y BIGOTES::

Representa con un diagrama de caja y bigotes la variabilidad de la variable Temp según los meses del año. Rellena el gráfico con las etiquetas correspondientes. Añade una línea con el valor medio de la variable Temp.

boxplot(airquality$Temp ~ airquality$Month)
abline(h = mean(airquality$Temp), 
       col = 2, 
       lwd = 2)                                            # Añade el valor medio

DIAGRAMA DE VIOLÍN

Son una alternativa a los diagramas de caja que resuelven algunos de los problemas relacionados con la visualización de la distribución de los datos. Por ejemplo, a diferencia del diagrama de caja, que fundamentalmente muestra estadísticos básicos, los gráficos de violín también muestran la curva de densidad de cada variable.

Figura 7: gráfico de violín`
Figura 7: gráfico de violín`

Para dibujar este tipo de gráfico se necesita cargar el paquete vioplot y su función homónima.

# install.packages("vioplot")

library(vioplot)

Función básica del paquete:

vioplot(alumnos_uc$peso,
        horizontal = FALSE,             # Horizontal = TRUE lo dibuja en posición horizontal
        col = 2,                        # Color del área
        rectCol = "red",                # Color del rectángulo
        lineCol = "white",              # Color de la línea
        colMed = "green",               # Color del símmbolo pch
        border = "black",               # Color del borde del violín
        pchMed = 16,                    # Símbolo pch para la mediana
        plotCentre = "points")          # Si "line", dibuja una línea en la mediana

Es posible dibujar un violin plot sin tener en cuenta los datos atípicos. Para ese propósito, se puede asignar a una variable la salida de la función boxplot() y luego devolver los valores del vector original que no son valores atípicos.

box <- boxplot(alumnos_uc$peso)

z <- alumnos_uc$peso[!(alumnos_uc$peso %in% box$out)]                    # Nos quedamos con los datos no atípicos

vioplot(z)

Por último, ten en cuenta que puedes dibujar un violin plot sobre un histograma. Considera, por ejemplo, que la distribución subyacente de tus datos presenta multimodalidad. En este caso, un diagrama de caja y bigotes no representa esta condición, mientras que un gráfico de violín sí lo hará.

set.seed(1)

# Creación de un conjunto de datos multimodal.
n <- 10000
ii <- rbinom(n, 1, 0.5)
datos <- rnorm(n, mean = 130, sd = 10) * ii +
  rnorm(n, mean = 80, sd = 5) * (1 - ii)

# Histograma
hist(datos, probability = TRUE, col = "grey", axes = FALSE,
     main = "", xlab = "",  ylab = "")

# Eje X
axis(1)

# Densidad
lines(density(datos), lwd = 2, col = "red")

# Violin plot
par(new = TRUE)
vioplot(datos, horizontal = TRUE, yaxt = "n", axes = FALSE,
        col = rgb(0, 1, 1, alpha = 0.15))

También se puede realizar un gráfico de violín con datos de dos grupos en lados diferentes

hombres <- alumnos_uc[alumnos_uc$genero == "Masculino", ]
mujeres <- alumnos_uc[alumnos_uc$genero == "Femenino", ]
vioplot(hombres$peso,
        plotCentre = "line", # Mediana con una línea
        side = "right",   # Lado derecho
        col = "#5773CC",
        xlab = "Peso según sexo",  
        ylim = c(50, 110))  # Color del lado derecho
vioplot(mujeres$peso,
        plotCentre = "line", # Mediana con una línea
        side = "left",     # Lado izquierdo
        col = "#FFB900",   # Color del lado izquierdo
        add = TRUE)        # Sobre el gráfico anterior

legend("topleft",
       legend = c("Hombres", "Mujeres"),
       fill = c("#5773CC", "#FFB900"))

📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: DIAGRAMA DE VIOLÍN:

  1. Representa la variable Ozone del dataframe airquality:
vioplot(airquality$Ozone,
        horizontal = FALSE,             # Horizontal = TRUE lo dibuja en posición horizontal
        col = 2,                        # Color del área
        rectCol = "red",                # Color del rectángulo
        lineCol = "white",              # Color de la línea
        colMed = "green",               # Color del símmbolo pch
        border = "black",               # Color del borde del violín
        pchMed = 16,                    # Símbolo pch para la mediana
        plotCentre = "points")          # Si "line", dibuja una línea en la mediana
  1. Extrae del dataframe airquality los valores de la variable Ozone correspondientes a los meses de mayo y agosto. A continuación, elabora un gráfico o diagrama de violín con estos datos. Cambia las etiquetas y los colores con respecto al modelo comentado en clase. Coméntalo posteriormente.
mayo <- airquality[airquality$Month == 5, ]
agosto <- airquality[airquality$Month == 8, ]

vioplot(mayo$Ozone,
        plotCentre = "line",                     # Mediana con una línea
        side = "right",                          # Lado derecho
        col = "#5773CC",
        xlab = "Concentración de ozono",  
        ylim = c(0, 200))                       # Color del lado derecho
vioplot(agosto$Ozone,
        plotCentre = "line",                     # Mediana con una línea
        side = "left",                           # Lado izquierdo
        col = "#FFB900",                         # Color del lado izquierdo
        add = TRUE)                              # Sobre el gráfico anterior

legend("topleft",
       legend = c("Mayo", "Agosto"),
       fill = c("#5773CC", "#FFB900"))

GRÁFICO “STRIPCHART”.

Debido a que los diagramas de caja suelen dificultar la observación de la distribución subyacente de los datos, este problema se puede resolver agregando puntos representando a los datos con la función stripchart().

boxplot(peso ~ procedencia,                                          # Variables a representar
        data = alumnos_uc,                                           # Dataframe de origen
        col = "white")                                               # Color del fondo de las cajas

stripchart(peso ~ procedencia, 
           data = alumnos_uc,
           vertical = TRUE,                                         # Diagrama vertical
           method = "jitter",                                       # Evita dibujar sobre los datos atÁ­picos. Distribuye aleatoriamente los puntos
           pch = 19,                                                # Tipo de símmbolo
           add = TRUE,                                              # Superpone el stripchart al diagrama de caja y bigotes
           col = "red")                                             # Color del símbbolo

📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: GRÁFICO STRIPCHART:

Representa con un gráfico stripschar la variabilidad mensual de la variable Ozone en el dataframe airquality. Cambia el color de los puntos a azul oscuro y el tipo de símbolo (puedes consultar las posibilidades en https://r-coder.com/plot-en-r/)

boxplot(Ozone ~ Month,                                           # Variables a representar
        data = airquality,                                       # Dataframe de origen
        col = "white")                                           # Color del fondo de las cajas

stripchart(Ozone ~ Month,                                        # Variables a representar
           data = airquality,
           vertical = TRUE,                                      # Diagrama vertical
           method = "jitter",                                    # Evita dibujar sobre los datos atÁ­picos. Distribuye aleatoriamente los puntos
           pch = 19,                                             # Tipo de símmbolo
           add = TRUE,                                           # Superpone el stripchart al diagrama de caja y bigotes
           col = "red")                                          # Color del símbbolo

GRÁFICO DE ENJAMBRE.

Los diagramas de enjambre (“bee swarm”) son similares a los strip charts. Su objetivo es mostrar la distribución subyacente de los datos, pero los datos se agrupan de tal manera que se evita que se solapen.

# install.packages("beeswarm")
library(beeswarm)
beeswarm(alumnos_uc$peso,
         col = 2,                                                               # Color
         pch = 18,                                                              # Símbolo
         cex = 1.5,                                                             # Tamaño
         method = "swarm")

Hay varios métodos disponibles para ordenar los puntos de datos. Cada método usa un algoritmo diferente que asegura que los puntos de datos no se solapan. El método “swarm” (por defecto) coloca los puntos en orden creciente. Otros métodos son:

beeswarm( alumnos_uc$peso ~ alumnos_uc$procedencia,
         col = 4,                                                               # Color
         pch = 18,                                                              # SÁ­mbolo
         cex = 1.5,                                                             # TamaÁ±o
         vertical = FALSE)                                                      # Disposición vertical

Cuando las observaciones se extienden por todo el gráfico, se pueden ajustar usando como argumento corral().

beeswarm(alumnos_uc$peso ~ alumnos_uc$procedencia,
         pch = 18, 
         cex = 1.5,
         col = c("#800080", "#3FA0FF", "#FFE099", "#F76D5E"),
         corral = "wrap")                                                       # Otros métodos: "wrap", "random", "omit"

Es posible mostrar solo uno de los lados de un beeswarm.

beeswarm(alumnos_uc$peso ~ alumnos_uc$procedencia, 
         pch = 19, 
         col = c("#800080","#3FA0FF", "#FFE099", "#F76D5E"),
         side = 1)                                                              # Si lado izquierdo = -1

Se puede modificar el orden de la varible categórica (eje X). El método por defecto es “ascending”.

beeswarm(alumnos_uc$peso ~ alumnos_uc$procedencia, 
         pch = 19, 
         col = c("#800080","#3FA0FF", "#FFE099", "#F76D5E"),
         priority = "descending")                                               # Otros valores: "random", "density", "non"

CÓMO EXPORTAR UN GRÁFICO DESDE R

R soporta varios formatos populares, tales como jpg, png, tiff, palumnos_uc. En todos los casos, el procedimiento para exportar consiste en tres pasos:

jpeg("mi_plot.jpeg",                                     # PASO 1: abrimos dispositivo (ejemplo JPEG)
     quality = 75)                           
plot(rnorm(20))                                          # PASO 2: creamos el gráfico
dev.off()                                                # PASO 3: cerramos el dispositivo

Como alternativa, es posible:

savePlot(filename = "Rplot",                                         # Nombre del archivo a ser guadado
         type = c("wmf", "emf", "png",                               # Tipo de archivo
                  "jpg", "jpeg", "bmp", 
                  "tif", "tiff", "ps",
                  "eps", "palumnos_uc"),
         device = dev.cur(),                                         # Número de dispositivo gráfico a ser exportado
         restoreConsole = TRUE)

📝 ACTIVIDAD DE EVALUACIÓN CONTINUA GRAFICOS ESTADÍSTICOS

Una vez concluida la explicación teórica, el alumnado procederá a elaborar los siguientes ejercicios:

  • Ejercicio de elaboración de gráficos a partir de la información proporcionada por el fichero barrios.

  • Ejercicio de elaboración de gráficos a partir de la información proporcionada por el fichero valle_cantabrico.

  • Ejercicio de elaboración de gráficos a partir de la información proporcionada por los ficheros creados a partir de los países elegidos.