Generación de Variables Aleatorias · Tema 38

Validación estadística

Chi-cuadrado, KS y rachas con valores críticos: la sentencia con α = 0,05.

01 · Punto de partida

Del “se ve bien” al “pasa”

Los Temas 36 y 37 miran; este decide: con nivel α = 0,05, el chi-cuadrado juzga bines, el KS juzga la CDF completa y el test de rachas juzga el orden temporal. Un generador entra a la biblioteca (Tema 41) solo si pasa los tres.

Cada test compara un estadístico contra su valor crítico: pasarlo no prueba perfección, apenas que la muestra es compatible con F.

  • ¿Qué mide cada test y qué se le escapa?
  • ¿Cuáles son los umbrales con α = 0,05?
  • ¿Por qué un μ = 0,2 escondido falla con N = 2000?
  • ¿Qué significa realmente “no rechazar”?

02 · Definición

Tres estadísticos, tres umbrales

χ² = Σ(obs−esp)²/esp con gl = k−1 (F fija) exige esperados ≥ 5. D = máx|Fₙ−F| con D√N → Kolmogorov (crítico 1,36). Rachas sobre/bajo la mediana: R con media 2n₁n₂/N+1; z = (R−E)/DE ~ N(0,1).

χ²

Bines que acusan

Sensible a deformaciones locales (hombros, picos). Pierde potencia con k chico y cobra ruido con bines ralos.

D√N

La peor brecha

Sin bines ni parámetros: pesa toda la CDF por igual. Ideal para detectar corrimientos globales como μ ≠ 0.

R±z

El orden importa

Los dos anteriores ignoran el orden temporal: una secuencia alternada perfecta pasa forma y falla rachas. El azar también es secuencia.

Umbrales α = 0,05: memorizar estos tres.
TestEstadísticoRechaza si
Chi (gl = 9)Σ(obs−esp)²/esp> 16,92
KS (N = 2000)D√N> 1,36 (D > 0,030)
Rachas|z|> 1,96

03 · Anatomía

Grados, esperados y potencia

Grados del chi
gl = k−1 con F totalmente especificada; −1 más por cada parámetro estimado de los datos. Estimar μ y σ “barato” sin restar gl infla falsos negativos.
Esperados ≥ 5
Agrupar colas hasta que cada bin espere ≥ 5: con N = 2000 y k = 10 sobra; con N = 200 hay que ensanchar o el chi miente.
Potencia y N
Con N = 200, un sesgo μ = 0,2 pasa inadvertido (potencia baja); con N = 2000 el mismo sesgo falla los tres. N grande absuelve menos, no más.
No rechazar ≠ aceptar
Pasar los tests dice “compatible con F”, no “es F”. La validación es un filtro de errores, no un certificado de verdad.

Tres tests + visual

Cobertura total

Forma local (chi), global (KS) y secuencia (rachas) más QQ e histograma: lo que pase todo esto merece producción.

Un solo número

Punto ciego

Chi solo no ve alternancia; rachas solas no ven forma. Cada test es ciego a lo que otro ve.

04 · Dónde se sentencia

Del test a la biblioteca

muestra→χ² · D · z→pasa/falla
  1. 1
    Aceptar generadores.

    Cada método de los Temas 16–27 entra a la biblioteca solo con los tres en verde.

  2. 2
    Regresión de librerías.

    Re-correr la batería ante cada cambio de código o de semilla por defecto.

  3. 3
    Auditar datos.

    Residuos, llegadas, demandas: ¿siguen la F que el modelo supone?

  4. 4
    Puente a eficiencia.

    Validado el correcto, elegir el más rápido entre los que pasan. (Tema 39)

05 · Representación en Python

Batería completa: sano vs sesgado

N(0,1) genuina contra N(0,2; 1): los tres tests en fila, con veredicto explícito.

Python en tu navegador. Bajá el sesgo a 0,05: el culpable pasa de incógnito.

import random
import math

random.seed(340)
N, k, LO, HI = 2000, 10, -4.0, 4.0
sano = [random.gauss(0, 1) for _ in range(N)]
random.seed(340)
mal = [random.gauss(0.2, 1) for _ in range(N)]
Phi = lambda t: 0.5*(1+math.erf(t/math.sqrt(2)))

def bateria(m):
    w = (HI-LO)/k
    c = [0]*k
    for x in m:
        c[min(k-1, max(0, int((x-LO)/w)))] += 1
    e = [N*(Phi(LO+(j+1)*w)-Phi(LO+j*w)) for j in range(k)]
    chi = sum((a-b)**2/b for a, b in zip(c, e))
    D = max(abs((i+1)/N - Phi(x)) for i, x in enumerate(sorted(m)))
    n1 = sum(1 for x in m if x > 0)
    n2 = N - n1
    R = 1 + sum(1 for i in range(1, N) if (m[i] > 0) != (m[i-1] > 0))
    Er = 2*n1*n2/N + 1
    Vr = 2*n1*n2*(2*n1*n2-N)/(N*N*(N-1))
    return chi, D*math.sqrt(N), (R-Er)/math.sqrt(Vr)

for nombre, m in [("sano", sano), ("sesgado", mal)]:
    chi, ksn, z = bateria(m)
    print(nombre, "chi:", round(chi,1), "D√N:", round(ksn,2), "z:", round(z,2))

Sano ≈ (8; 0,7; 0,5): pasa todo. Sesgado μ = 0,2: chi y D√N en rojo, rachas en verde (el orden sigue azaroso).

06 · Exploración

Laboratorio: el sesgo enciende las alarmas

Generá N(μ,1) con μ a mando contra la H₀ N(0,1). Las tres barras miden “cuántas veces el umbral”: bajo 1, verde; sobre 1, rojo. Con μ = 0 todo pasa; con μ = 0,3 suenan chi y KS.

EXPERIMENTO 38

Tablero de tres tests

χ²/16,92 · D√N/1,36 · |z|/1,96

Los resultados numéricos aparecen debajo.
Chi / 16,920,50
D√N / 1,360,66
|z| / 1,960,26
Tests pasados3 / 3

μ 0 con N 2000: 3 de 3 en verde.

Tres barras normalizadas al umbral 1. Probá μ = 0,3 y N = 200 (impune) vs N = 8000 (condenado).

Preguntas para explorar

  1. Con μ = 0, ¿las tres barras quedan bajo 1?
  2. Subí μ a 0,3 con N = 2000. ¿Chi y KS en rojo con rachas en verde?
  3. Mismo μ = 0,3 con N = 200. ¿El culpable pasa? ¿Qué dice eso de la potencia?
Ver respuestas sugeridas
  1. Sí: ≈ (0,5; 0,7; 0,3) con solo ruido.
  2. Sí: el corrimiento deforma bines y CDF pero no el orden temporal.
  3. Pasa: con N = 200 la potencia no alcanza para μ = 0,3. N grande condena más, no absuelve.

07 · Comprensión

Confusiones frecuentes

«p > 0,05 prueba que es F»

No rechazar es “compatible”, no “verdadero”. La prueba de verdad sería enumerar el algoritmo, no muestrearlo.

«Repito hasta que pase»

Buscar la semilla que pasa es p-hacking: con α = 0,05 el 5 % pasa por azar. Fijar semilla y N antes de mirar.

«Chi con bines de a 2 vale»

Esperados < 5 invalidan la aproximación χ²: agrupar colas o bajar k antes de calcular.

«Rachas para cualquier serie»

El test pide dicotomía honesta (mediana teórica, no muestral) e independencia bajo H₀: cortar por la media muestral sesga R.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: dado bajo sospecha

6000 tiros (semilla 341) de un dado cargado al 6 (p₆ = 0,25): el chi con gl = 5 debe fallar (> 11,07).

import random

random.seed(341)
N = 6000
pesos = [0.15]*5 + [0.25]
tiros = random.choices(range(6), weights=pesos, k=N)
e = N/6
print("chi:", round(sum((tiros.count(v)-e)**2/e for v in range(6)), 1), "vs 11.07")
Ver solución razonada

≈ cientos (típicamente 300–450): condena categórica. Con dado justo daría ≈ 5 ± 4.

Ejercicio 2: KS de la exponencial trucha

Exp(1) testeada contra Exp(0,8) con N = 2000: D√N debe superar 1,36.

import random
import math

random.seed(342)
N = 2000
m = sorted(-math.log(1-random.random()) for _ in range(N))
D = max(abs((i+1)/N - (1-math.exp(-0.8*x))) for i, x in enumerate(m))
print("D√N:", round(D*math.sqrt(N), 2), "vs 1.36")
Ver solución

≈ 3–4: la tasa equivocada hunde toda la CDF y el KS la cobra completa.

Ejercicio 3: alternancia que engaña a dos

Secuencia +−+−… perfecta de N = 2000: chi y KS pasan (mitades justas), rachas z condena.

Ver una posible respuesta
import math

N = 2000
m = [1 if i % 2 == 0 else -1 for i in range(N)]
n1 = sum(1 for x in m if x > 0)
n2 = N - n1
R = 1 + sum(1 for i in range(1, N) if (m[i] > 0) != (m[i-1] > 0))
Er = 2*n1*n2/N + 1
Vr = 2*n1*n2*(2*n1*n2-N)/(N*N*(N-1))
print("z:", round((R-Er)/math.sqrt(Vr), 1), "vs ±1.96")

z ≈ +44: exceso brutal de rachas. Forma perfecta, secuencia imposible: por eso hacen falta tres tests.

09 · Síntesis

Ideas para recordar

  • Chi (gl = k−1), KS (1,36) y rachas (1,96): umbrales α = 0,05.
  • Esperados ≥ 5; N grande condena, no absuelve.
  • Pasar ≠ probar; fallar 1 de 20 es azar, no sentencia.
  • Rachas ve lo que forma ignora: el orden.
  • Batería fija y semilla fijada antes de mirar.

En el próximo tema el otro criterio: eficiencia computacional.