Validación y Análisis · Tema 11

Comparación entre datos reales y simulados

El cara a cara definitivo: gráficos que revelan sesgos, desfases y varianzas, más números que los confirman sin dejarse engañar.

01 · Punto de partida

Un número sin gráfico es ciego; un gráfico sin número es sordo

Ya tenés datos con linaje (Tema 10) y tolerancia declarada (Tema 5). Ahora hay que mirarlos de frente: la serie real contra la simulada, punto a punto y distribución contra distribución. Cada vista caza un defecto distinto.

  • ¿El modelo sigue la forma, aunque falle el nivel?
  • ¿Erra parejo o solo en los picos?
  • ¿El error crece con el valor (heterocedasticidad)?
  • ¿Qué número resume sin ocultar lo importante?

02 · Definición

Tres niveles de contraste

〜

Punto a punto

Serie temporal superpuesta: caza desfases, sesgos sostenidos y picos no modelados.

⤢

Conjunta

Dispersión sim vs. real contra la diagonal: caza compresión de varianza y no linealidades.

▭

De error

Bland-Altman (error vs. promedio): caza sesgo que crece con el nivel y límites de acuerdo.

Qué defecto caza cada vista.
VistaEje x / yDelata
Seriet / valorDesfase temporal, deriva, picos
Dispersiónreal / simSesgo global, varianza aplanada
Bland-Altmanpromedio / errorError que crece con el nivel

03 · Gráficos

Leer los tres como un detective

  1. 1
    Serie: ¿persigue o calca?

    Si la simulada persigue a la real con 1–2 pasos de retraso, hay desfase (orden de eventos o retardo no modelado), no ruido.

  2. 2
    Dispersión: ¿diagonal o nube chata?

    Puntos sobre la diagonal = acuerdo. Nube horizontal = modelo que devuelve casi siempre lo mismo (varianza aplanada).

  3. 3
    Bland-Altman: ¿banda horizontal o embudo?

    Errores centrados en cero y parejos = acuerdo estable. Embudo que se abre = el modelo erra más en valores altos.

serie (desfase)→dispersión (sesgo)→Bland-Altman (escala)

04 · Números

Sesgo, MAE y correlación (el trío inseparable)

Nivel y magnitud

Sesgo + MAE

Sesgo dice hacia dónde tira; MAE dice cuánto erra en promedio. Un MAE bajo con sesgo alto es compensación (Tema 5).

Forma

Correlación r

Mide si suben y bajan juntos (−1…1). r ≈ 1 con sesgo +2 = forma perfecta, nivel corrido: se recalibra, no se tira.

Correlación alta + MAE alto
Buena forma, mal nivel: desfase o sesgo constante. Reversible con recalibración.
Correlación baja + MAE bajo
Raro pero posible: errores que se cancelan. Pedir dispersión y Bland-Altman antes de festejar.
Límites de acuerdo
Sesgo ± 2·DE del error: el 95% de los errores cae ahí si son normales. Ancho = incerteza del acuerdo.

05 · Representación en Python

El trío en 15 líneas

Python en tu navegador. Cambiá el desfase y observá qué número lo delata primero.

real = [11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19]
sim  = [11, 12, 13, 13, 14, 15, 16, 16, 17, 17, 18, 18]

err = [s - r for s, r in zip(sim, real)]
sesgo = sum(err) / len(err)
mae = sum(abs(e) for e in err) / len(err)
mr, ms = sum(real)/len(real), sum(sim)/len(sim)
cov = sum((r-mr)*(s-ms) for r, s in zip(real, sim)) / len(real)
import math
vr = sum((r-mr)**2 for r in real) / len(real)
vs = sum((s-ms)**2 for s in sim) / len(sim)
r = cov / math.sqrt(vr*vs)
print(f"sesgo {sesgo:+.2f} | MAE {mae:.2f} | r {r:.2f}")

Sesgo +0,08, MAE 0,42, r ≈ 0,99: forma excelente y nivel correcto. El modelo persigue bien.

Bland-Altman mínimo

prom = [(s+r)/2 for s, r in zip(sim, real)]
import math
de = math.sqrt(sum((e-sesgo)**2 for e in err) / len(err))
print(f"límites de acuerdo: {sesgo-2*de:.2f} a {sesgo+2*de:.2f}")
for p, e in zip(prom, err):
    print(f"prom {p:.1f} error {e:+.0f}")

06 · Exploración

Laboratorio: tres vistas, tres defectos

Inyectá sesgo (nivel corrido), desfase (persigue con retraso) y ruido. Arriba ves la serie; abajo la dispersión contra la diagonal. Observá qué número (sesgo, MAE, r) delata cada defecto.

EXPERIMENTO 11

Serie + dispersión en vivo

sesgo · MAE · r de Pearson

Los resultados numéricos aparecen debajo.
Sesgo+0,00
MAE0,00
r1,00
LecturaAcuerdo

Sin sesgo ni desfase: puntos sobre la diagonal y r cercano a 1.

Arriba: puntos reales y línea simulada en el tiempo. Abajo: cada punto es un instante (x=real, y=simulado); la diagonal es acuerdo perfecto.

Preguntas para explorar

  1. Poné sesgo +2 sin desfase: ¿sesgo, MAE y r? ¿Por qué r sigue alta aunque el acuerdo sea malo?
  2. Poné desfase 2 sin sesgo: ¿qué le pasa a la serie y a r? ¿Qué defecto delata la persecución con retraso?
  3. Subí el ruido a 2 con lo demás en cero: ¿MAE y r? ¿El modelo está mal o la medición es ruidosa?
Ver respuestas sugeridas
  1. Sesgo ≈ +2, MAE ≈ 2, r ≈ 1: la forma se conserva, el nivel se corre. r no ve niveles, solo formas: por eso nunca va sola.
  2. La simulada persigue con 2 pasos de retraso; r cae a ~0,8 y el MAE sube. Delata retardo no modelado u orden de eventos erróneo.
  3. MAE ≈ 1,6, r ≈ 0,9: el modelo es correcto pero la medición es ruidosa. Pedir MAE menor que el ruido es pedir imposibles (Tema 10).

07 · Comprensión

Confusiones frecuentes

«r alta = modelo validado»

r mide forma, no nivel. Con sesgo +5 y r = 0,99 el modelo persigue perfecto y erra siempre: se recalibra, no se festeja.

«MAE bajo = sin desfase»

Un desfase de 1 paso en una serie suave da MAE bajo y r alta. Solo la serie temporal lo muestra: hay que mirarla.

«Un gráfico alcanza»

Cada vista es ciega a algo: la serie esconde escala, la dispersión esconde tiempo, Bland-Altman esconde orden. Las tres, siempre.

«Bland-Altman es para medicina»

Es para cualquier acuerdo entre dos métodos que miden lo mismo: real vs. simulado es exactamente ese caso.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: forma perfecta, nivel corrido

Calculá el trío y dictaminá: ¿se tira o se recalibra?

real = [10, 11, 12, 13]
sim = [12, 13, 14, 15]
err = [s-r for s, r in zip(sim, real)]
print("sesgo", sum(err)/len(err), "MAE", sum(abs(e) for e in err)/len(err))
print("r = 1.0 (forma idéntica) -> recalibrar -2, no tirar")
Ver solución razonada

Sesgo +2, MAE 2, r = 1: el modelo es un traductor perfecto corrido. Se resta 2 (recalibración) y queda perfecto. Tirarlo sería desperdiciar estructura buena.

Ejercicio 2: desfase que el MAE disimula

¿Qué muestra la serie que el MAE 0,5 esconde?

real = [10, 12, 14, 16]
sim = [10, 10, 12, 14]  # persigue con 1 paso
mae = sum(abs(s-r) for s, r in zip(sim, real))/len(real)
print("MAE", mae, "pero siempre llega tarde: retardo no modelado")
Ver solución

MAE 1,0 moderado pero patrón sistemático: siempre tarde. El número promedia; la serie revela el retraso. Hay que modelar el retardo, no calibrar el nivel.

Ejercicio 3: límites de acuerdo

Calculá la banda donde cae el 95% de los errores.

Ver una posible respuesta
import math
err = [0, 1, 0, -1, 0, 1, 0, 0]
m = sum(err)/len(err)
de = math.sqrt(sum((e-m)**2 for e in err)/len(err))
print(f"sesgo {m:.2f} ± {2*de:.2f} -> [{m-2*de:.2f}, {m+2*de:.2f}]")

Banda ≈ [−1,42, +1,67]: el acuerdo es ±1,5 litros al 95%. Si el uso pide ±0,5, no valida aunque el sesgo sea chico.

09 · Síntesis

Ideas para recordar

  • Tres vistas: serie (desfase), dispersión (sesgo/varianza), Bland-Altman (escala del error).
  • Tres números: sesgo (hacia dónde), MAE (cuánto), r (forma). Siempre juntos y con n.
  • r alta + MAE alto = recalibrar nivel; r baja = problema de forma o retardo.
  • Misma escala en ambos ejes: el gráfico honesto no achica sesgos.
  • Lo que revelan los gráficos se confirma con tests formales (Temas 12–17).

En el próximo tema formalizaremos el «¿encaja?» con la bondad de ajuste.