Saltar al contenido
Plazoleta
· Raúl López

Una idea que suena bien puede medir peor: por qué la mediana perdió contra la media

En Isobaria, cambiar la media ponderada por la mediana parecía la mejora obvia para el índice de confianza. Medido contra 151.000 horas de ERA5, era peor. La historia de por qué, y de qué se hizo en su lugar.

Isobaria enseña un consenso entre tres modelos meteorológicos: ECMWF, ICON y GFS. Con 35 °C, 36 °C y 30 °C, la media ponderada daba 33,9 °C. Una cifra que no defiende ninguno de los tres modelos, y que además queda un grado por debajo de lo que dicen dos de ellos. El disidente —el modelo que se aleja— arrastraba el resultado hacia sí, aunque fuera minoría.

La corrección que se nos ocurrió primero es la que se le ocurriría a cualquiera: usar la mediana. Es el remedio de manual contra los atípicos, y en este caso concreto habría dado 35 °C, que es justo lo que dos de los tres modelos sostienen. Así que se implementó, se documentó en un ADR, y se llamó "mediana ponderada, siempre".

Medida contra la realidad, era peor que lo que sustituía.

Cómo se mide algo así

Isobaria calibra sus pesos comparando lo que predijo cada modelo, uno a siete días antes, contra lo que de verdad ocurrió. Eso existe gracias a la Previous Runs API de Open-Meteo, que guarda qué decía cada modelo en cada instante pasado, y se contrasta contra ERA5, el reanálisis del ECMWF. No hubo que esperar meses acumulando predicciones propias: el histórico ya estaba ahí, así que la comparación se corrió sobre 151.000 horas.

El resultado, con la mediana aplicada a todas las horas frente al algoritmo anterior:

Variante Temperatura Viento Separación (viento)
Antes del cambio 1,257 °C 2,781 km/h ×2,31
Mediana siempre (1.ª versión) 1,269 °C 2,831 km/h ×2,41

Peor en temperatura (−0,9 %) y peor en viento (−1,9 %). La intuición que motivó el cambio era razonable —proteger el consenso de un disidente— y la medición la desmintió igualmente.

Por qué pierde, en concreto

El motivo, una vez que lo ves, es obvio y por eso mismo fácil de pasar por alto: con tres modelos, la mediana siempre devuelve el valor de uno de ellos. No es un promedio de tres opiniones, es elegir a la del medio y tirar las otras dos a la papelera.

Eso es exactamente lo que quieres cuando hay un disidente de verdad. El problema es que un disidente de verdad no es la situación normal. El caso de 35 · 36 · 30 es la excepción; el caso típico es que los tres modelos estén razonablemente de acuerdo, con pequeñas diferencias de fracciones de grado. Ahí la mediana sigue descartando dos tercios de la información —el 86 % de las horas, según la comparación— para quedarse con un único modelo que, esa hora en concreto, no tiene ningún motivo para ser más de fiar que los otros dos.

La media ponderada, cuando los tres están de acuerdo, sí usa la información de los tres. Cambiar de mediana a "siempre" no arreglaba el caso raro sin romper el caso normal; lo arreglaba a costa de romperlo.

El híbrido, y lo que costó no fabricar consenso

La solución que se quedó no es "mediana o media", es una condición:

centro = media ponderada     si < 3 modelos, o si ningún modelo se sale de tolerancia
       = mediana ponderada   si algún modelo está fuera de tolerancia

Se paga la mediana solo cuando hay algo que pagar. El resultado, en la misma comparación:

Variante Temperatura Viento Separación (viento)
Antes del cambio 1,257 °C 2,781 km/h ×2,31
Mediana siempre (1.ª versión) 1,269 °C 2,831 km/h ×2,41
Híbrido (vigente) 1,259 °C 2,770 km/h ×2,42

Gana al algoritmo anterior en viento (+0,40 %), empata en temperatura (dos milésimas de grado) y conserva la propiedad que motivó todo esto desde el principio: la pantalla nunca enseña una cifra que ningún modelo defiende.

Hay una restricción más estricta debajo de esta decisión, y es la que de verdad la gobierna: al modelo que se sale de tolerancia se le quita el mando del valor, pero no el voto en si hay acuerdo o no. Si además de no contar para el centro se le borrase también del cálculo de cuánto coinciden los modelos, el índice de acuerdo podría marcar "los modelos coinciden" justo en el caso en que uno de los tres está viendo otro día. Por eso un modelo fuera de tolerancia sigue puntuando cero en su parte del acuerdo y sigue generando un aviso explícito de qué modelo discrepa y en cuánto, aunque el número global no baje de ningún umbral. Optimizar solo el valor mostrado, sin esa segunda pieza, habría sido fabricar consenso donde no lo hay.

Lo que esto no arregla, dicho sin adornos

Ninguna de las dos versiones cubre la probabilidad de precipitación. Su tolerancia son 25 puntos porcentuales, así que un 26 % contra un centro de 3 % no cuenta como disidente, y manda la media —que el modelo más alto tira hacia arriba—. La mediana ahí sí habría dado el 3 %. Es un umbral elegido a criterio, no medido, porque la calibración de Isobaria cubre hoy precipitación, temperatura y viento, pero no la probabilidad de que llueva. Y la referencia contra la que se mide todo esto, ERA5, la produce el ECMWF: el mismo informe de verificación lo señala cuando ese modelo gana todas las filas en la comparación, en vez de callarlo.

La ganancia de precisión del híbrido, además, es pequeña: décimas de porcentaje en temperatura, menos de medio punto en viento. Lo que cambia de verdad no es cuánto se acierta, sino que ahora hay un número para saber cuánto se acierta, y ese número permite rechazar una idea que suena razonable pero mide peor — que es exactamente lo que le pasó a la primera versión de este mismo cambio.

Lo que nos llevamos

Una intuición correcta sobre el problema no garantiza el arreglo correcto. Que la mediana ignore atípicos es cierto y es justo lo que se necesitaba para el caso del disidente. Aplicarla siempre resolvía el 14 % de las horas a costa del 86 % restante, y esa proporción solo aparece si la mides.

Medir contra algo real, no contra la propia hipótesis, es lo que expone el error. El histórico de Previous Runs frente a ERA5 ya existía; no hizo falta esperar meses para descubrir que la primera versión era peor, solo hizo falta comparar contra datos que no se habían generado para confirmarla.

Quitarle el mando a un valor y quitarle el voto son dos decisiones distintas, y confundirlas fabrica la apariencia de acuerdo. Un modelo que discrepa deja de fijar la cifra mostrada, pero tiene que seguir contando en si el sistema dice "los modelos coinciden" — si no, el índice de confianza podría subir precisamente cuando debería bajar.


Si estás diseñando un índice que combina varias fuentes que no siempre están de acuerdo entre sí, escríbeme: la parte cara casi nunca es la fórmula, es medirla contra la verdad antes de confiar en la intuición.

¿Tienes un problema parecido?

Cuéntanoslo. Hablas directamente con quien escribe el código.