boxplot() en R: Cómo hacer BoxGráficos en RStudio

⚡ Resumen inteligente

BoxLa función `plot` en R resume una distribución numérica mediante su mediana, cuartiles, bigotes y valores atípicos, utilizando `geom_boxplot()` de `ggplot2`. Este tutorial crea un diagrama de caja a partir del conjunto de datos de calidad del aire y añade capas de color, puntos, fluctuación, muescas y comparaciones entre grupos.

  • 📐 Resumen de cinco números: La caja abarca desde el primer hasta el tercer cuartil, la línea marca la mediana y los bigotes alcanzan 1.5 veces el rango intercuartil.
  • 🧱 Sintaxis básica: ggplot(df, aes(x = grupo, y = valor)) + geom_boxplot() produce una caja por nivel del grupo.ping factor.
  • 🔴 Estilo Outlier: outlier.colour, outlier.shape y outlier.size controlan cómo se dibujan los puntos que se encuentran más allá de los bigotes.
  • 💠 Mostrando observaciones: geom_jitter() desplaza la superposiciónping Señala hacia los lados, revelando el tamaño de la muestra detrás de cada recuadro.
  • 📉 Mellado Boxpor ejemplo: notch = TRUE dibuja el intervalo de confianza de la mediana y no se superpone.ping Las muescas indican una diferencia real.
  • ???? Grouping: Mapearping fill inside geom_boxplot() divide cada categoría en varias cajas una al lado de la otra.

BoxGráfico en R

diagrama de caja() en R

diagrama de caja() en R Ayuda a visualizar la distribución de los datos por cuartil y a detectar la presencia de valores atípicos. Puedes utilizar el objeto geométrico geom_boxplot() de la biblioteca ggplot2 para dibujar un boxplot() en R.

Usaremos el conjunto de datos de calidad del aire para introducir la función boxplot() en R con ggplot. El conjunto de datos registra mediciones diarias de la calidad del aire en Nueva York desde mayo hasta septiembre de 1973 y contiene 153 observaciones. Usaremos las siguientes variables:

  • Ozono: Variable numérica
  • Viento: Variable numérica
  • Mes: mayo a septiembre. variable numérica

Antes de dibujar uno, conviene saber exactamente qué representa cada parte de la caja.

Cómo leer un Box Gráfico: Cuartiles, rango intercuartílico y valores atípicos

Cada elemento de un diagrama de caja codifica un número del resumen de cinco números. Saber cuál es cuál convierte el gráfico de mera decoración en análisis.

  • Bisagra inferior: El primer cuartil, Q1. El veinticinco por ciento de las observaciones se sitúan por debajo de él.
  • Línea media: El segundo cuartil. Su posición dentro del recuadro revela asimetría: una línea desplazada hacia abajo significa que los datos están sesgados hacia la derecha.
  • Bisagra superior: El tercer cuartil, Q3. El setenta y cinco por ciento de las observaciones se sitúan por debajo de él.
  • Box altura: El rango intercuartil, IQR = Q3 – Q1, que contiene la mitad central de los datos y es la medida estándar robusta de dispersión.
  • Bigotes: Se extienden hasta la observación más extrema, aún dentro de 1.5 veces el rango intercuartílico (RIC) de la bisagra más cercana. No son el mínimo ni el máximo.
  • Puntos que van más allá de los bigotes: observaciones marcadas como valores atípicos según esa regla del rango intercuartílico de 1.5.

Dos advertencias. Primero, un valor atípico en este caso es una señal estadística, no un error: en una distribución asimétrica como la de la concentración de ozono, se esperan valores altos que no deben eliminarse. Segundo, un diagrama de caja oculta la forma de la distribución, por lo que dos grupos con cajas idénticas pueden tener datos subyacentes muy diferentes. Agregar puntos aleatorios, como se muestra a continuación, evita este problema.

Box Gráfico vs. Histograma vs. Gráfico de violín en R

Los tres gráficos describen una distribución numérica, pero cada uno revela algo que los otros ocultan.

Criterios Box Parcela Histograma Trama de violín
Shows Mediana, cuartiles, valores atípicos Frecuencia en cada intervalo Curva de densidad completa
Revmúltiples picos No Sí: Sí:
Marcar valores atípicos Sí, explícitamente Solo visualmente No directamente
Comparando muchos grupos Excelente Torpe Bueno
Necesita una opción de ajuste No Sí, recuento de contenedores Sí, ancho de banda
objeto ggplot2 geom_boxplot() histograma geométrico() geom_violín()

Una solución de compromiso común es dibujar un diagrama de violín con un diagrama de caja estrecho en su interior, lo que mantiene la forma de densidad y el resumen de cuartiles en un solo gráfico. Véase el Tutorial sobre histogramas para la parte de agrupamiento de la comparación.

Crear Box Parcela

Antes de comenzar a crear su primer boxplot() en R, debe manipular los datos de la siguiente manera:

  • Paso 1: importar los datos
  • Paso 2: elimine las variables innecesarias
  • Paso 3: Convertir el mes en un factor ordenado
  • Paso 4: Crea una nueva variable categórica dividiendo cada mes en tres partes: Inicio, Medio y Fin.
  • Paso 5: eliminar las observaciones faltantes

Todos estos pasos se realizan con dplyr y el operador de canalización %>%.

library(dplyr)
library(ggplot2)
# Step 1
data_air <- airquality %>%

#Step 2
select(-c(Solar.R, Temp)) %>%

#Step 3
mutate(Month = factor(Month, order = TRUE, labels = c("May", "June", "July", "August", "September")), 
       
#Step 4 
day_cat = factor(ifelse(Day < 10, "Begin", ifelse(Day < 20, "Middle", "End"))))

Una buena práctica es comprobar la estructura de los datos con la función vislumbrar().

glimpse(data_air)

Salida:

## Observations: 153
## Variables: 5
## $ Ozone   <int> 41, 36, 12, 18, NA, 28, 23, 19, 8, NA, 7, 16, 11, 14, ...
## $ Wind    <dbl> 7.4, 8.0, 12.6, 11.5, 14.3, 14.9, 8.6, 13.8, 20.1, 8.6...
## $ Month   <ord> May, May, May, May, May, May, May, May, May, May, May,...
## $ Day     <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,...
## $ day_cat <fctr> Begin, Begin, Begin, Begin, Begin, Begin, Begin, Begi...

Tanto Ozone como Solar.R contienen valores NA. Dado que geom_boxplot() los descartaría silenciosamente y mostraría una advertencia, es más conveniente eliminarlos explícitamente.

# Step 5
data_air_nona <-data_air %>% na.omit()	

Diagrama de caja básico

Ahora, represente gráficamente la distribución del ozono por mes.

# Store the graph
box_plot <- ggplot(data_air_nona, aes(x = Month, y = Ozone))
# Add the geometric object box plot
box_plot +
    geom_boxplot()

Code Explicación

  • Guarde el gráfico para su uso posterior.
    • box_plot: el gráfico base se almacena en el objeto box_plot, lo que permite agregar capas posteriormente sin repetir toda la llamada.
  • Añade el objeto geométrico
    • Pasa el conjunto de datos data_air_nona a ggplot boxplot.
    • Dentro del argumento aes(), agrega el eje x y el eje y.
    • El signo + significa que quieres que R siga leyendo el código. Hace que el código sea más legible al dividirlo.
    • Utilice geom_boxplot() para crear un diagrama de caja

Salida:

Básico Box Parcela

Cambiar de lado del gráfico

Puedes voltear el lado del gráfico.

box_plot +
  geom_boxplot()+
  coord_flip()

Code Explicación

  • box_plot: utiliza el gráfico que ha almacenado. Evita tener que reescribir todos los códigos cada vez que agrega nueva información al gráfico.
  • geom_boxplot(): dibuja las cajas y los bigotes
  • coord_flip(): Voltear el lado del gráfico

Salida:

Cambiar lado del gráfico

Cambiar el color del valor atípico

Puede cambiar el color, la forma y el tamaño de los valores atípicos.

box_plot +
    geom_boxplot(outlier.colour = "red",
        outlier.shape = 2,
        outlier.size = 3) +
    theme_classic()

Code Explicación

  • outlier.color=”red”: controla el color de los valores atípicos
  • outlier.shape=2: cambia la forma del valor atípico. 2 se refiere al triángulo
  • outlier.size=3: Cambia el tamaño del triángulo. Los números más grandes dibujan marcadores más grandes.

Salida:

Cambiar el color del valor atípico

Agregar una estadística resumida

Puedes superponer una estadística descriptiva, como la media del grupo, que el diagrama de caja en sí no muestra.

box_plot +
    geom_boxplot() +
    stat_summary(fun.y = mean,
        geom = "point",
        size = 3,
        color = "steelblue") +
    theme_classic()

Code Explicación

  • La función stat_summary() agrega una estadística calculada encima del diagrama de caja.
  • El argumento `fun` controla qué estadística se devuelve. En este caso, es la media. Cabe destacar que el código antiguo utiliza `fun.y`, que ggplot2 dejó de usar en la versión 3.3.0.
  • Nota: Hay otras estadísticas disponibles, como mínima y máxima. Se puede exhibir más de una estadística en un mismo gráfico.
  • geom = “punto”: Traza el promedio con un punto
  • size=3: Tamaño del punto
  • color =”steelblue”: Color de los puntos

Salida:

Agregar una estadística resumida

Box Trazar con puntos

A continuación, añade una capa de diagrama de puntos sobre las cajas. Cada punto representa una observación individual, lo que permite visualizar el tamaño de la muestra detrás de cada caja.

box_plot +
    geom_boxplot() +
    geom_dotplot(binaxis = 'y',
        dotsize = 1,
        stackdir = 'center') +
    theme_classic()

Code Explicación

  • geom_dotplot() dibuja un punto por observación, apilados dentro de cada intervalo.
  • binaxis='y': cambia la posición de los puntos a lo largo del eje y. Por defecto, eje x
  • dotsize=1: Tamaño de los puntos
  • stackdir=’center’: Forma de apilar los puntos: Cuatro valores:
    • “arriba” (predeterminado),
    • "abajo"
    • "centro"
    • “centrotodo”

Salida:

Box Trazar con puntos

Control Estético de la Box Parcela

Cambiar el color de la caja

Puedes cambiar los colores del grupo.

ggplot(data_air_nona, aes(x = Month, y = Ozone, color = Month)) +
    geom_boxplot() +
    theme_classic()

Code Explicación

  • Los colores de los grupos se controlan en el mapa aes().pingPuedes usar color= Mes para cambiar el color del diagrama de caja y bigotes según los meses.

Salida:

Cambiar el color del Box

Box trama con múltiples grupos

También es posible agregar varios grupos. Podrás visualizar la diferencia en la calidad del aire según el día de la medida.

ggplot(data_air_nona, aes(Month, Ozone)) +
    geom_boxplot(aes(fill = day_cat)) +
    theme_classic()

Code Explicación

  • El mapa aes()ping del objeto geométrico controla los grupos a mostrar (esta variable tiene que ser un factor)
  • aes(fill= day_cat) permite crear tres casillas para cada mes en el eje x

Salida:

Box Trazar con múltiples grupos

Box Trazar con puntos nerviosos

Otra forma de mostrar observaciones individuales es mediante puntos aleatorios. El uso de puntos aleatorios es la opción habitual cuando un eje x categórico provoca que muchos puntos se sitúen en la misma posición.

Este método evita la superposiciónping de los datos discretos.

box_plot +
    geom_boxplot() +
    geom_jitter(shape = 15,
        color = "steelblue",
        position = position_jitter(width = 0.21)) +
    theme_classic()

Code Explicación

  • geom_jitter() agrega un pequeño desplazamiento aleatorio a cada punto para que se superpongan.ping Los valores se hacen visibles.
  • forma=15 cambia la forma de los puntos. 15 representa los cuadrados
  • color = “steelblue”: Cambia el color del punto
  • position = position_jitter(width = 0.21): controla cuánto se desplazan los puntos lateralmente, medido en unidades del eje x. El valor predeterminado es el 40 por ciento del espacio entre categorías.

Salida:

Box Trazar con puntos nerviosos

Puedes ver la diferencia entre el primer gráfico con el método de jitter y el segundo con el método de puntos.

box_plot +
    geom_boxplot() +
    geom_point(shape = 5,
        color = "steelblue") +
    theme_classic()

Box Trazar con puntos nerviosos

Mellado Box Parcela

Una característica interesante de geom_boxplot() es la función de diagrama de caja con muescas de R. El diagrama de caja con muescas estrecha el cuadro alrededor de la mediana. El objetivo principal de un diagrama de caja con muescas es comparar la significancia de la mediana entre grupos. Hay pruebas sólidas de que dos grupos tienen medianas diferentes cuando las muescas no se superponen. Una muesca se calcula de la siguiente manera:

Mellado Box Parcela

Aquí, IQR representa el rango intercuartil y n es el número de observaciones en el grupo. La muesca abarca aproximadamente el intervalo de confianza del 95 % de la mediana.

box_plot +
    geom_boxplot(notch = TRUE) +
    theme_classic()

Code Explicación

  • geom_boxplot(notch = TRUE): dibuja el diagrama de caja con muescas alrededor de la mediana.

Salida:

Mellado Box Parcela

Cómo agregar títulos, etiquetas y colores personalizados a un Box Gráfico en R

Los gráficos anteriores utilizan la configuración predeterminada de ggplot2, que toma los nombres de las variables directamente del marco de datos. Un gráfico publicable necesita etiquetas legibles y una paleta de colores bien definida.

Títulos y etiquetas de los ejes. Una llamada a labs() establece cada elemento de texto:

box_plot +
    geom_boxplot(fill = "coral", alpha = 0.7) +
    labs(title = "Ozone concentration by month",
        subtitle = "New York, May to September 1973",
        x = "Month",
        y = "Ozone (parts per billion)",
        caption = "Source: airquality dataset") +
    theme_classic()

Elige tus propios colores. Utilice scale_fill_manual() cuando fill se mapea dentro de aes(), y scale_colour_manual() cuando colour es:

ggplot(data_air_nona, aes(x = Month, y = Ozone, fill = Month)) +
    geom_boxplot() +
    scale_fill_manual(values = c("#0e9cd1", "coral", "#7dc27d", "#c9a227", "grey60")) +
    theme_classic() +
    theme(legend.position = "none")

La leyenda está desactivada aquí porque el eje x ya nombra cada mes, por lo que repetirla desperdiciaría espacio.

Reordenando las cajas. Los niveles de los factores determinan el orden en el eje. Dado que Mes se creó como un factor ordenado, ya se lee cronológicamente. Para un factor no ordenado, ordene por la mediana:

ggplot(data_air_nona, aes(x = reorder(Month, Ozone, FUN = median), y = Ozone)) +
    geom_boxplot() +
    theme_classic()

Guardando el gráfico. ggsave() guarda el último gráfico en el disco con una resolución que usted controla:

ggsave("ozone_boxplot.png", width = 8, height = 5, dpi = 300)

Box Gráfico en R: Code Referencias

La tabla que aparece a continuación enumera la llamada a ggplot2 para cada variante de diagrama de caja que se ha tratado anteriormente:

Objetivo Code
Diagrama de caja básico
ggplot(df, aes(x = x1, y = y)) + geom_boxplot()
Invierte la orientación
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + coord_flip()
Diagrama de caja con muescas
ggplot(df, aes(x = x1, y = y)) + geom_boxplot(notch = TRUE)
Box trama con puntos nerviosos
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + geom_jitter(position = position_jitter(0.21))
Colorea por grupo
ggplot(df, aes(x = x1, y = y, color = x1)) + geom_boxplot()
Varios grupos por categoría
ggplot(df, aes(x = x1, y = y)) + geom_boxplot(aes(fill = x2))
Sumar la media del grupo
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + stat_summary(fun = mean, geom = "point")

También verifique: Tutorial de R para principiantes: aprenda el lenguaje de programación R

Preguntas Frecuentes

Los bigotes alcanzan la observación más extrema que se encuentra dentro de 1.5 veces el rango intercuartil del cuartil más cercano. No representan el mínimo ni el máximo, y cualquier valor que se encuentre fuera de ellos se representa como un punto atípico.

No automáticamente. La regla del rango intercuartílico de 1.5 es una convención, no una prueba de error. Investigue cada punto primero: los datos sesgados, como las lecturas de ozono, producen naturalmente valores altos que son mediciones genuinas.

superposiciónping Las muescas sugieren que no hay evidencia sólida de que las dos medianas difieran. No hay superposición.ping Las muescas indican una probable diferencia real, aproximadamente equivalente a una comparación con un nivel de confianza del 95 por ciento.

Box Los gráficos son un paso exploratorio estándar antes del entrenamiento: revelan asimetría, valores atípicos y diferentes escalas de características entre clases. Los equipos también los utilizan para comparar la precisión del modelo en diferentes conjuntos de validación cruzada.

Sí. Los asistentes de IA pueden explicar errores como que un eje x continuo produzca un solo cuadro, sugerir el mapa aes() correcto.pingy marca los argumentos obsoletos como fun.y. Siempre vuelve a ejecutar el código corregido con tus propios datos.

Resumir este post con: