HOWTO · Seaborn

Diagrama de caja de Seaborn sin valores atípicos

Cree un diagrama de caja de Seaborn sin marcadores de valores atípicos usando showfliers=False, comprenda la regla de 1,5 x IQR que Seaborn utiliza para marcar los fliers y vea cuándo está justificado eliminar o limitar los valores atípicos.

En esta página

Este artículo pretende demostrar qué son los diagramas de caja y los valores atípicos y cómo crear un diagrama de caja de Seaborn sin los marcadores de valores atípicos. En la mayoría de los casos, la respuesta correcta es ocultar los marcadores, no eliminar datos — las secciones siguientes muestran ambas cosas y explican cuándo está justificado eliminar o limitar valores en realidad.

Crear un diagrama de caja de Seaborn sin marcadores de valores atípicos

Un diagrama de caja resume una distribución con sus cuartiles: la caja abarca desde el primer cuartil (Q1) hasta el tercer cuartil (Q3) con la mediana en su interior, y los bigotes se extienden hasta los valores más extremos que no se consideran atípicos. Los puntos más allá de los bigotes se dibujan individualmente como marcadores de valores atípicos (fliers).

Trabajaremos con el conjunto de datos tips, que ya está precargado en nuestra biblioteca Seaborn. Importemos los paquetes necesarios y veamos los datos; este conjunto de datos trata de un restaurante con varias columnas.

import seaborn as sb
import matplotlib.pyplot as plt
import pandas as pd

TIPS = sb.load_dataset("tips")
TIPS.head()

Tips data set

Trazar la columna total_bill con los valores predeterminados muestra varios fliers a la derecha:

sb.boxplot(x=TIPS["total_bill"])
plt.show()

Salida:

Boxplot with outlier markers

Para crear el mismo gráfico sin los marcadores de valores atípicos, pase showfliers=False:

sb.boxplot(x=TIPS["total_bill"], showfliers=False)
plt.show()

Salida:

Boxplot without outlier markers

Entender qué muestra Seaborn como valor atípico

Seaborn (a través de Matplotlib) marca un punto como valor atípico cuando se encuentra a más de 1,5 × IQR más allá de los cuartiles, donde el IQR es Q3 − Q1. Los bigotes llegan hasta los puntos de datos más extremos que aún están dentro de esas vallas; todo lo que está fuera de ellas se dibuja como un flier.

Puede reproducir la regla para total_bill con la función describe(), que informa Q1 = 13,35, la mediana = 17,80 y Q3 = 24,13 para esta columna. El IQR es por tanto 10,78, por lo que las vallas son 13,35 − 1,5 × 10,78 = −2,82 y 24,13 + 1,5 × 10,78 = 40,30. Nueve de las 244 facturas se encuentran por encima de la valla superior (el máximo es 50,81), y esos nueve puntos son exactamente los fliers del primer gráfico. Tenga en cuenta que no son errores de datos, sino simplemente las facturas más grandes en los registros del restaurante.

Ocultar los marcadores de valores atípicos con showfliers=False

showfliers=False cambia solamente lo que se dibuja. La caja, la mediana y los bigotes se calculan a partir de los datos completos, incluidos los valores atípicos, exactamente igual que antes; los marcadores de fliers simplemente no se renderizan. El gráfico tampoco se estira ya para acomodar los puntos lejanos, por lo que la caja y los bigotes se vuelven más fáciles de leer.

Elija esta opción cuando los valores atípicos sean datos válidos y su objetivo sea la presentación — por ejemplo, cuando unos pocos valores extremos comprimen el resto del gráfico. Nada en su conjunto de datos o en sus estadísticas cambia, por lo que no hay nada extra que justificar o revelar.

Eliminar o limitar valores atípicos solo cuando el análisis lo requiera

A veces es el propio análisis — no solo la imagen — el que tiene que cambiar: un fallo del sensor, un error de introducción de datos o un modelo que se ve distorsionado por un puñado de valores extremos. Solo entonces debe alterar los valores, y las estadísticas que informe después deben calcularse sobre los datos alterados y describirse como tales.

Para eliminar los valores atípicos, filtre con las mismas vallas que utiliza Seaborn (no con los valores de los cuartiles en sí — filtrar al rango entre Q1 y Q3 descartaría una cuarta parte de sus datos válidos en cada lado):

q1 = TIPS["total_bill"].quantile(0.25)
q3 = TIPS["total_bill"].quantile(0.75)
iqr = q3 - q1

filtered = TIPS[(TIPS["total_bill"] >= q1 - 1.5 * iqr) & (TIPS["total_bill"] <= q3 + 1.5 * iqr)]
sb.boxplot(x=filtered["total_bill"])
plt.show()

Para limitar (winsorizar) los valores atípicos en su lugar — conservando cada fila, pero atrayendo los valores extremos hasta las vallas — utilice clip:

capped = TIPS["total_bill"].clip(lower=q1 - 1.5 * iqr, upper=q3 + 1.5 * iqr)
sb.boxplot(x=capped)
plt.show()

Salida:

Boxplot of capped values

Ambas operaciones cambian los datos: la eliminación descarta las 9 facturas más grandes por completo, y la limitación las reescribe a 40,30. Utilícelas cuando tenga una razón para desconfiar de esos valores o acotarlos — y si todo lo que quería era un gráfico más limpio, vuelva a showfliers=False y deje los datos en paz.