Saltar al contenido

lección 5

Valores extremos: error de dedo o dato clave

El error de teclado y el mejor cliente comparten palabra: los tres criterios que los separan, y por qué la regla de las 3 sigma falla.

⏱ 55 min

Dos filas de la misma tabla. Un pedido de 999.999,99 € y otro de 40.000 €, en una tienda de material de oficina donde el pedido medio son 300 €. Cualquier regla automática que busque valores raros marca los dos, porque una regla mira el número y nada más. Y con los dos delante hay que hacer cosas opuestas: el primero se corrige o se quita, porque nadie ha comprado un millón de euros de folios; el segundo se conserva, porque es el cliente que más factura del año.

Los dos problemas anteriores se descubren contando. Un hueco se ve porque está vacío, y un duplicado aparece al comparar el número de filas con el número de identificadores distintos. El valor extremo no se deja cazar así: sale una sola vez, está en la columna que le toca, tiene todos sus campos rellenos y nadie lo ha copiado. Es un dato perfectamente formado que descoloca la media de la tabla entera.

Y trae un problema de vocabulario que hace daño. Se usa una sola palabra —valor extremo, o su nombre en inglés, outlier— para dos cosas que no tienen nada en común: un error de medida y un caso real poco frecuente. Llamarlas igual invita a tratarlas igual, y de ahí sale la costumbre más cara del oficio: un filtro que borra lo que se sale de un rango, ejecutado antes de mirar. Así que esta lección no enseña a eliminar valores extremos: enseña a saber cuál es cuál.

## Una palabra para dos cosas opuestas

El error es un valor que no ocurrió. Alguien tecleó 999.999,99 porque se quedó apoyado en el nueve, o metió el peso en gramos en una columna que está en kilos, o el sensor se estropeó y empezó a devolver su valor máximo, o un sistema escribió 9999 para decir «no lo sé». Ese número no describe nada del mundo: describe un accidente del camino que siguió el dato hasta tu tabla. Conservarlo envenena cualquier cuenta que lo toque.

El caso real extremo es un valor que sí ocurrió y que es raro. El pedido de 40.000 € del mayorista que surte a veinte oficinas. Las ventas del viernes de descuentos de noviembre, ocho veces las de un viernes normal. El paciente que reaccionó al tratamiento mucho mejor que el resto. Y aquí está lo que más cuesta interiorizar: muy a menudo ese caso raro es el objeto del análisis, no su estorbo. Quien busca fraude busca lo excepcional; quien busca averías, también; y quien quiere saber de dónde sale el dinero busca a los pocos clientes que facturan mucho.

Se pueden confundir en las dos direcciones, y las dos duelen, pero no igual. Si conservas el error, la media sale disparada y alguien lo nota: una cifra imposible llama la atención en una reunión. Si borras el caso real, no pasa nada: la tabla queda más limpia, la media más razonable, y lo que has perdido no aparece en ningún sitio porque un dato borrado no deja hueco. El primer error se ve; el segundo se hereda.

Los nueve puntos de arriba y los nueve de abajo son los mismos. Lo único que cambia es el eje, y el eje lo decide el pedido de 40.000.

Eso es lo primero que hace un valor extremo, antes de tocar ninguna cuenta: decide lo que puedes ver del resto. El histograma sale con una barra gigante a la izquierda y una raya invisible a la derecha, el diagrama de caja sale aplastado, y el máximo de la tabla deja de medir nada, porque el máximo es ese valor, por definición.

## Tres preguntas que separan el error del dato

Ninguna de las tres es estadística, y esa es la mitad de la lección: la estadística te dice qué valores son raros, no cuáles son falsos. Para eso hacen falta preguntas sobre el mundo. Se contestan en cinco minutos y evitan la decisión automática.

  1. 01.¿Es físicamente posible? Una edad de 214 años, un descuento del 300%, un envío que pesa 0 kilos, una velocidad negativa. Si el valor no puede existir, es un error y no hay nada que discutir.
  2. 02.¿Se repite exactamente o es único? Un valor raro que aparece 148 veces con el mismo número hasta el último decimal no es un caso excepcional: es una convención de algún sistema. Un valor raro que aparece una sola vez es un dedo o es un cliente.
  3. 03.¿Lo explica otra columna? El pedido de 40.000 € tiene 400 unidades y un cliente marcado como mayorista. El de 999.999,99 € tiene una unidad de un producto que cuesta 12 €. La misma fila trae la respuesta.

La primera se contesta mejor si la respuesta está escrita antes de mirar los datos. Un rango válido por columna —la edad entre 0 y 120, el descuento entre 0 y 100, el peso mayor que cero— se escribe una vez y vale para siempre: lo que queda fuera es error, sin reunión y sin criterio personal. Y lo que queda dentro pero es raro pasa a las otras dos preguntas, que es donde hace falta alguien pensando.

La segunda caza una familia entera de errores que no parecen errores: los valores centinela. Es un número normal que alguien eligió para decir «aquí no hay dato»: un 0, un -1, un 999, un 9999, una fecha de 1900 o de 1970. Un centinela es un hueco disfrazado de número, y por eso es peor que un hueco: pasa cualquier validación, entra en las sumas y arrastra la media como si fuera un dato.

1import pandas as pd
2
3envios = pd.DataFrame({
4 "envio_id": range(1, 13),
5 "peso_kg": [2.4, 1.8, 0.0, 3.1, 0.0, 2.2, 0.0, 12.5, 0.0, 1.9, 0.0, 2.7],
6})
7
8# Un valor raro REPETIDO EXACTAMENTE es la firma de un centinela.
9print(envios["peso_kg"].value_counts().head(3))
10
11reales = envios.loc[envios["peso_kg"] > 0, "peso_kg"]
12print("Ceros:", int((envios["peso_kg"] == 0).sum()), "de", len(envios))
13print("Media con los ceros:", round(float(envios["peso_kg"].mean()), 2))
14print("Media sin los ceros:", round(float(reales.mean()), 2))

El recuento de valores repetidos delata lo que ninguna regla de rango ve.

La tercera es la que más veces resuelve el caso, y consiste en dejar de mirar la columna sola: un número extremo no se juzga por su tamaño sino por su coherencia con el resto de su fila. Cuarenta mil euros en 400 unidades son 100 € por unidad, un pedido grande y normal. Un millón de euros en una unidad de un producto de 12 € es un imposible aritmético, y para verlo no hace falta saber nada del negocio. Casi siempre hay una relación entre dos columnas que convierte una sospecha en una certeza: importe y unidades, distancia y duración, peso y volumen.

1import pandas as pd
2
3pedidos = pd.DataFrame({
4 "pedido_id": [901, 902, 903, 904, 905],
5 "cliente": ["particular", "mayorista", "particular", "particular", "mayorista"],
6 "unidades": [1, 400, 2, 1, 250],
7 "importe": [999999.99, 18000.0, 640.0, 12.0, 11250.0],
8})
9
10# Las filas mas grandes, ENTERAS: no la columna sola.
11print(pedidos.nlargest(2, "importe").to_string(index=False))
12
13# Y la columna que decide, que no venia en la tabla.
14pedidos["precio_unidad"] = (pedidos["importe"] / pedidos["unidades"]).round(2)
15print(pedidos["precio_unidad"].tolist())

La fila entera y una división. Con eso se cierra casi cualquier caso.

La comprobación de tres minutos para cualquier columna numérica nueva: mirar las diez filas más grandes y las diez más pequeñas, enteras. Las pequeñas se olvidan siempre y ahí viven la mitad de los errores: importes negativos, precios a cero, edades de 0 años. Un valor extremo por abajo hace el mismo daño que uno por arriba y además no llama la atención de nadie.

## Las dos reglas mecánicas, y lo que son en realidad

Ya conoces las dos reglas que se usan para señalar valores extremos, así que aquí toca colocarlas en su sitio. Las dos son detectores, no jueces: producen una lista de candidatos para que alguien la mire, y ninguna sabe si un número ocurrió. Tratar su salida como un veredicto es lo que convierte una herramienta útil en un borrado automático.

La primera se apoya en los cuartiles. La distancia entre el valor que deja por debajo al 25% de los datos (Q1) y el que deja al 75% (Q3) es el rango intercuartílico: el ancho del bloque donde vive la mitad central. Se marca lo que esté más de una vez y media ese ancho por encima de Q3 o por debajo de Q1.

El 1,5 no sale de ninguna ley de la naturaleza. Lo eligió John Tukey en 1977, en el libro donde presentó el diagrama de caja, porque le daba un número redondo de avisos: en datos con forma de campana, esos límites dejan fuera alrededor del 0,7% de las observaciones, un 0,35% por cada lado. Suficiente para que la lista sea corta y se pueda mirar a mano. Es una convención práctica escrita por alguien en un libro hace medio siglo, y saberlo cambia cuánta autoridad se le da.

1import pandas as pd
2
3importes = pd.Series([280, 310, 295, 340, 260, 305, 330, 275, 320, 40000])
4
5q1 = importes.quantile(0.25)
6q3 = importes.quantile(0.75)
7iqr = q3 - q1
8
9print("Q1:", float(q1), "Q3:", float(q3), "IQR:", float(iqr))
10print("Limite alto:", float(q3 + 1.5 * iqr))
11print("Marcados:", int((importes > q3 + 1.5 * iqr).sum()))

Diez pedidos, uno de ellos de 40.000. El rango intercuartílico lo ve sin esfuerzo.

La segunda regla se apoya en la media y en la desviación típica: se marca lo que esté a más de tres desviaciones típicas de la media. Es la que más se usa porque es la que se explica en una frase, y es la que tiene un defecto de diseño que conviene ver una vez en la vida para no olvidarlo.

## La regla de las tres desviaciones se esconde a sí misma

El defecto está en que la media y la desviación típica se calculan con el valor sospechoso dentro. El extremo empuja la media hacia sí mismo y, sobre todo, infla la desviación típica. Y como el umbral es «media más tres desviaciones», el propio valor que queremos cazar mueve el umbral hacia arriba: cuanto más bruto es, más lo mueve y mejor se esconde.

En los diez pedidos de antes, con uno de 40.000 €, la media sale 4.271,5 y la desviación típica 12.553,7. El umbral queda en 41.932,7, y el pedido de 40.000 se queda dentro por dos mil euros. La regla de las tres desviaciones marca cero valores extremos en una tabla donde nueve pedidos rondan los 300 € y uno vale 40.000.

Cada fila tiene su propia escala, porque el valor cambia de tamaño. Mira la línea verde: multiplicas el valor extremo por cien y el umbral sigue estando por delante. El límite del rango intercuartílico, mientras, vale 393 € en las tres filas.

Y la persecución tiene un final que es peor de lo que parece. Cuando el valor extremo crece, su distancia a la media medida en desviaciones típicas no crece sin límite: se acerca a un techo que solo depende del número de filas, y ese techo vale el número de filas menos uno dividido entre su raíz cuadrada. Con 10 filas son 2,85. Así que con 10 filas ningún valor puede superar las tres desviaciones nunca: ni 40.000, ni un millón, ni mil millones. No es que la regla sea poco sensible con pocos datos: es que no puede marcar nada, por construcción.

El rango intercuartílico no tiene ese problema porque no se apoya en la media ni en la desviación típica, sino en dos percentiles, y un percentil solo cuenta cuántas filas hay a cada lado. Es la misma diferencia que ya conoces entre la media y la mediana, aplicada a otra decisión: un valor enorme mueve la media y no mueve la mediana, infla la desviación típica y no toca los cuartiles.

Todo esto se puede resumir en una comprobación que cuesta dos segundos: comparar la media con la mediana. Si la media está muy por encima, hay cola por arriba, un valor extremo o los dos. En los diez pedidos, la media vale 4.271,5 y la mediana 307,5: una diferencia de catorce veces. Eso ya es el diagnóstico, y no ha hecho falta ningún umbral.

Y una advertencia que vale para las dos reglas: en una columna muy sesgada marcan cola real. Los importes, los sueldos y las duraciones casi nunca tienen forma de campana: tienen una masa a la izquierda y una cola larga a la derecha que es legítima. El rango intercuartílico puede marcar ahí el 5% o el 10% de las filas, y no es que haya un 10% de errores: es que la columna no tiene la forma que la regla supone. Cuando el detector marca mucho, la conclusión no es «hay que borrar mucho», es «este detector no sirve para esta columna».

## Qué le hace un valor extremo a cada medida

Las medidas de resumen no reaccionan igual, y saber cómo reacciona cada una sirve para dos cosas: para detectar el valor extremo sin buscarlo y para saber qué cifras puedes seguir dando mientras decides qué hacer con él.

La mediana se mueve dos euros y medio y sigue estando entre los datos. La media se sale del dibujo: 4.271,5 € no se parece a ningún pedido de esta tabla.

Los cuatro efectos, con las cifras de estos diez pedidos. La media pasa de 301,7 a 4.271,5: se multiplica por catorce y deja de parecerse a ningún pedido real, aunque se siga llamando «el pedido medio». La mediana pasa de 305 a 307,5, lo que le toca moverse por tener una fila más. La desviación típica pasa de 26,6 a 12.553,7, cuatrocientas setenta y dos veces más, porque mide distancias al cuadrado. Y el máximo pasa de 340 a 40.000: deja de describir la tabla y describe ese valor.

La desviación típica es la que hace más daño río abajo, porque aparece dentro de otras cuentas sin que se la vea: todo lo que divida por ella, todo lo que ponga dos columnas en la misma escala. Con la desviación inflada cuatrocientas veces, el resultado es tranquilizador y falso: todo parece cerca de la media porque la unidad de medida se ha vuelto enorme.

## La trampa del segmento

Y ahora el error que convierte una limpieza en una pérdida de datos. Un valor puede ser extremo en el conjunto y normal dentro de su grupo. Cuarenta mil euros es extremo entre particulares y aburrido entre mayoristas. Una temperatura de -22 grados es extrema en un almacén y normal en un congelador. Cuando buscas valores extremos sin separar los grupos, el detector no marca casos raros: marca un tipo entero de cliente.

Cada panel tiene su escala. El límite global vale lo mismo en los dos, 434 €: en la escala del mayorista eso está pegado al cero, y su zona de borrado se come el grupo entero.

Las cifras de esa tabla: 24 pedidos, veinte de particulares alrededor de 300 €, tres de mayoristas entre 12.000 y 18.000 €, y un error de teclado de 999.999 €. El límite global sale en 434,5 €, porque lo calculan los veinte particulares que son mayoría. Filtrar con él deja 20 pedidos y la facturación en 6.002 €. Calculando el límite dentro de cada grupo quedan 23 pedidos y 51.002 €: se ha ido solo el error. El filtro global se lleva el 88% del dinero real sin dar ningún aviso, con un criterio que suena respetable.

El mecanismo es el que ya viste con los huecos, con otro disfraz: un criterio que parece estadístico se lleva un grupo completo. Allí se borraban filas por faltarles una columna que precisamente les falta a los clientes nuevos; aquí se borran por ser grandes cuando comprar en grande es lo que define a un tipo de cliente. Y con un agravante: quien hace pedidos extremos suele ser quien más factura, así que el sesgo no está solo en las filas, está en el dinero.

Y el problema simétrico, que aparece en cuanto se aprende a segmentar: con grupos pequeños, los cuartiles no significan nada. El grupo de mayoristas del ejemplo tiene tres filas, y un rango intercuartílico de tres filas es aritmética, no estadística. Con grupos así lo que toca es mirar las filas a mano, que además es fácil porque son tres. La regla práctica: si un grupo no llega a unas cuantas decenas de filas, el detector automático no se aplica dentro de él, se lee la lista.

## Cuatro salidas antes de borrar

En 1985, tres investigadores del British Antarctic Survey publicaron que sobre la Antártida faltaba una parte enorme de la capa de ozono. Lo habían medido desde el suelo, con un instrumento cuyo diseño era de los años veinte. Mientras tanto un satélite de la NASA llevaba años sobrevolando el mismo sitio con mucha más precisión, y no había avisado de nada: el programa que procesaba sus datos marcaba como sospechosos los valores por debajo de un umbral —nunca se había observado una concentración tan baja— y los apartaba para revisarlos a mano. No los borraba: los apartaba. Y la pila fue creciendo sin que nadie la mirara.

La moraleja no es que el umbral estuviera mal puesto: marcar lo que nunca se ha visto es lo que hace un buen control de calidad, y el dato se conservó. Lo que falló fue lo de después, que los valores marcados no volvieron a la conversación. Así que la regla de este tema no es «no pongas límites», es lo que marques tiene que acabar delante de alguien. Para eso hay cuatro salidas que no son borrar.

  • Marcar y seguir. Una columna booleana que diga que la fila es sospechosa, y la tabla intacta. Permite dar las dos cifras y que quien conoce el negocio mire la lista. Es la salida por defecto.
  • Recortar al percentil. El valor se queda en la tabla pero con un tope, por ejemplo el percentil 95. Se llama winsorizar, por Charles Winsor. No pierdes la fila, pero has cambiado un dato, y eso se dice.
  • Cambiar la lente, no el dato. Mirar la columna en escala logarítmica: las distancias grandes se comprimen y la forma del resto vuelve a verse. Es lo primero que conviene probar con dinero y duraciones.
  • Analizar el segmento extremo aparte. Si los pedidos grandes son de mayoristas, eso no es un problema estadístico: es un tipo de cliente, y merece su propia cuenta. Muchas veces ese análisis es el que más valor tiene.
1import pandas as pd
2
3# Veintiun pedidos de particular: veinte normales y un error de teclado.
4importes = pd.Series([240, 268, 295, 312, 333, 358, 251, 287, 304, 326,
5 349, 262, 279, 298, 317, 341, 255, 283, 308, 336,
6 999999])
7
8print("Media:", round(float(importes.mean()), 1))
9print("Mediana:", float(importes.median()))
10
11for p in [0.95, 0.99]:
12 tope = importes.quantile(p)
13 recortado = importes.clip(upper=tope)
14 print("percentil", p, "-> tope", round(float(tope), 1),
15 "media", round(float(recortado.mean()), 1))

El percentil que eliges no es un detalle: es la decisión entera.

De las cuatro, la escala logarítmica es la única que no toca el dato, así que es la que se puede usar sin pedir permiso. Tiene dos límites: el logaritmo de cero no existe y el de un negativo tampoco. Y el eje ya no se lee igual —la distancia entre 100 y 1.000 es la misma que entre 1.000 y 10.000—, así que hay que decírselo a quien mire el gráfico.

Queda decir cuándo sí se borra, porque a veces se borra: cuando el valor es imposible y no se puede reconstruir, como una edad de 214 años sin fecha de nacimiento con la que recalcularla. Y ahí casi siempre lo correcto es poner un hueco en esa celda en lugar de tirar la fila entera, que probablemente tenga bien el resto. Lo que no es opcional es contarlo: cuántas celdas, con qué criterio y qué efecto tuvo en la cifra final.

## Cómo se cuenta esto

  • Escribe el criterio antes de ver el resultado. Si eliges el umbral después de mirar cuál te deja la cifra más bonita, no estás limpiando: estás eligiendo el resultado. Es el error más difícil de detectar, porque cada paso suelto parece razonable.
  • Di cuántos valores has tocado y qué pasa con la cifra. «He apartado un pedido imposible; la facturación baja de 1.051.001 a 51.002» es una frase que cualquiera puede rebatir. «He limpiado los outliers» no se puede rebatir, y por eso no vale.
  • Si no sabes si es un error, da las dos cifras. Con el pedido dentro y sin él, con su motivo. Dos cifras y una duda explicada son información; una cifra con una suposición dentro es una apuesta hecha en nombre de otro.
  • Nunca borres en silencio lo que no puedes explicar. Un valor extremo que no entiendes no es basura: es la parte de la tabla que todavía no has entendido, y a veces es el hallazgo.

Con esto quedan cerrados los tres problemas del valor de una celda: el que falta, el que sobra por repetido y el que se sale. Los tres se han tratado dando por hecho algo que nadie ha comprobado todavía: que la columna de importes contiene números, que la de fechas contiene fechas y que la de sí o no contiene verdadero o falso. Cuando eso no es verdad, las cuentas no fallan. Y ahí empieza el último problema.

Regístrate para guardar tu progreso.