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.
La peor brecha
Sin bines ni parámetros: pesa toda la CDF por igual. Ideal para detectar corrimientos globales como μ ≠ 0.
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.
| Test | Estadístico | Rechaza 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
- 1Aceptar generadores.
Cada método de los Temas 16–27 entra a la biblioteca solo con los tres en verde.
- 2Regresión de librerías.
Re-correr la batería ante cada cambio de código o de semilla por defecto.
- 3Auditar datos.
Residuos, llegadas, demandas: ¿siguen la F que el modelo supone?
- 4Puente 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.
Tablero de tres tests
χ²/16,92 · D√N/1,36 · |z|/1,96
μ 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
- Con μ = 0, ¿las tres barras quedan bajo 1?
- Subí μ a 0,3 con N = 2000. ¿Chi y KS en rojo con rachas en verde?
- Mismo μ = 0,3 con N = 200. ¿El culpable pasa? ¿Qué dice eso de la potencia?
Ver respuestas sugeridas
- Sí: ≈ (0,5; 0,7; 0,3) con solo ruido.
- Sí: el corrimiento deforma bines y CDF pero no el orden temporal.
- 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.