Cómo hacer un diagrama de caja y bigote en Python

Tutorial para crear y personalizar gráficos de caja y bigotes (boxplot) y cómo interpretarlo.

Diagrama con los elementos de señalados
Diagrama de caja y bigotes

Este post viene código en python para hacer y personalizar uno de los gráficos más potentes y simples que existen. Puedes replicar todo lo que viene aquí en una notebook en

📸
Serie de Ciencia de Datos con Python* Guía para comenzar con python* Guía de estadística con Python* Visualización con Python (Este post)* Guía de regresión lineal con Python (próximamente)

¿Qué son los diagrama de caja y bigote?

Son una forma gráfica y estandarizada de mostrar la distribución de los datos basado en 5 números clave:

  1. Media (Q2). Es el valor medio de nuestra información.
  2. Mínimo y máximo. Estos generan las patitas en los extremos del gráfico.
  3. Primer y Tercer cuartil (Percentil 25 y 75, respectivamente).

En ocasiones el gráfico mostrará algunos puntos adicionales, que se consideran los valores atípicos (outliers). El siguiente gráfico te puede ayudar a identificar estos elementos.

¿Para qué se usan?

Los gráficos de caja y bigotes se usan para

  • Identificar valores atípicos y anomalías en los datos.
  • Encontrar sesgos en los datos
  • Entender de un vistazo los rangos que ocupa la información y cómo se distribuye.

Se pueden crear gráficos con varios diagramas de caja y bigotes. Estos ayudan a realizar una comparación de los datos y su distribución y compararlos por clasificación.

Cómo hacer un gráfico de caja y bigotes en Python

Comencemos por la creación de dos conjuntos de datos. Para tener certeza de antemano de la forma en la que se distribuyen los datos, usaremos una simulación.

El siguiente bloque de código crea dos arreglos de datos distribuidos normalmente alrededor de cero. Para diferenciarlos, les sumamos y restamos una unidad.

import numpy as np
np.random.seed(1)

b1 = np.random.randn(100) - 1
b2 = np.random.randn(100) + 1

Listo. Ahora podemos visualizar los gráficos que generamos. Usaremos el módulo maplotlib.pyplot para esto. Veamos cómo se ve una de las variables.

import matplotlib.pyplot as plt

plt.boxplot(x = b1, vert = False)
Un diagrama de caja y bigotes
El diagrama horizontal

Veamos el gráfico que generó y comparemos con lo que sabemos que hace el diagrama según la definición anterior. Primero, obtengamos la media, representada en la línea roja del centro.

print(np.median(b1))
# -0.9359260884377059

Como definimos la variable b1, esperaríamos que la mediana estaría cercana a -1. Entre más grande sea la simulación, este número se debería acercar aún más.

El siguiente código muestra los cuartiles Q1 y Q3, que representan el rango intercuartílico (la zona de la caja).

q1 = np.quantile(b1, 0.25)
q3 = np.quantile(b1, 0.75)

print(q1, q3)

# -1.6138175212245889 -0.36258965920138087

¿Logras ver cómo estas medidas corresponden a las líneas de la caja? Veamos ahora los mínimos y máximos como los definimos anteriormente en la figura.

iqr = np.quantile(b1, 0.75) - np.quantile(b1, 0.25)

min = q1 - 1.5 * iqr
max = q3 + 1.5 * iqr

print(min, max)
# -3.4906593142594007 1.5142521338334312

Enchúlame la gráfica

Vamos a personalizar el gráfico. Es posible añadir estilo, colores y otras características.

Primero veamos cómo se vería el gráfico con datos atípicos. Incluir datos a tu base no es algo que debieras hacer en la realidad, es sólo con fines ilustrativos.

b1 = np.append(b1, 1.8)

punto_rojo = dict(markerfacecolor='red', marker='o')
plt.boxplot(x = b1, vert = False, flierprops=punto_rojo)
Caja y bigotes con puntito a la derecha
El mismo diagrama con un puntito

La primera línea del código agrega un punto en la posición 1.8, que gracias a la estimación del máximo en la sección pasada sabemos que es mayor.

Nota que al definir el punto rojo le he indicado con 'red' el color que deseo. Puedes seleccionar entre los colores básicos o puedes personalizarlo con códigos hexadecimales.

Es posible modificarla forma de la gráfica para identificar la media. El siguiente gráfico “aprieta” la caja en la media para hacerlo parecer mas a un reloj de arena. También incluimos un rombo verde para identificar la mediana.

mean_shape = dict(markerfacecolor='green', marker='D', markeredgecolor='green')

plt.boxplot(x = b1, vert = False, flierprops=punto_rojo,
	showmeans=True, meanprops=mean_shape, notch=True)
Un relojito
Un relojito

Múltiples diagramas en una figura

Una de las ventajas del diagrama de caja y bigote es poder comparar las distribuciones de múltiples variables. Primero volvemos a crear las variables y las colocamos en un objeto tipo DataFrame de pandas.

import numpy as np
import pandas as pd
np.random.seed(1)

b1 = np.random.randn(100) - 1
b2 = np.random.randn(100) + 1

df = pd.DataFrame({'b1':b1, 'b2':b2})

Pandas tiene su propio método para crear diagramas de caja y bigotes que permite trabajar directamente sobre los datos.

df[['b1', 'b2']].plot(kind = 'box', showmeans = True)
Dos diagramas
El diagrama de caja y bigotes permite hacer comparaciones

¡Genial! Te has registrado exitosamente.

¡Bienvenido de vuelta! Has iniciado sesión correctamente.

Te has suscrito correctamente a Escribe tu primer paper de Economía usando Inteligencia Artificial.

¡Éxito! Revisa tu correo electrónico para obtener el enlace mágico para iniciar sesión.

¡Éxito! Se ha actualizado la información de facturación.

No se actualizó tu información de facturación.