Números Pseudoaleatorios · Tema 31

Pruebas gráficas

Ver patrones a simple vista: scatter de pares, lag plot e histograma antes de contar un solo χ².

01 · Punto de partida

Graficar primero, contar después

Los Temas 27–30 convierten la calidad en números. Pero el gráfico llega antes y a veces condena solo: los pares de RANDU dibujan diagonales, el juguete m = 16 dibuja 16 puntos, y un % viciado dibuja bandas. Un scatter de 30 segundos ahorra una tarde de estadística —y cuando el gráfico se ve bien, los tests confirman; cuando se ve mal, ni hace falta contar.

Este tema entrena ese ojo: tres gráficos, qué buscar en cada uno y cuándo desconfiar del propio ojo.

  • ¿Qué gráfico revela diagonales, grillas y huecos?
  • ¿Qué diferencia hay entre scatter de pares y lag plot?
  • ¿Cuántos puntos N hacen falta para “ver”?
  • ¿Cuándo el ojo engaña y manda el χ²?

02 · Definición

Tres gráficos, tres preguntas

◈

Scatter pares

Puntos (u₂ₖ₋₁, u₂ₖ) en el cuadrado: ¿nube o diagonales? Es el Tema 30 sin contar.

⇄

Lag plot

Puntos (uₙ, uₙ₊₁) solapados en serie temporal: ¿el siguiente depende del actual? Gemelo del correlograma (Tema 28).

▣

Histograma

Barras por décimos (Tema 29) a ojo: ¿parejas o con pico, pendiente, sierra? La forma diagnostica la causa.

Qué mirar en cada uno.
GráficoSanoEnfermo típico
Scatter paresNube parejaDiagonales, retícula gruesa, 16 puntos
Lag plotNube parejaCurva o recta (dependencia funcional)
HistogramaBarras ≈ EPico, pendiente, sierra, huecos

03 · Técnica visual

N, escala y trampa del ojo

Con N = 100 todo parece nube (poca tinta) y con N = 100000 hasta el sano muestra “rayas” por saturación: la zona útil es P = 300–2000 puntos en ejes [0,1]×[0,1] sin deformar (cuadrado real, no estirado).

Ejes cuadrados
Un scatter estirado fabrica diagonales falsas o esconde las reales. Relación 1:1 siempre; el laboratorio la garantiza.
Transparencia
Con P grande los puntos se apilan: alfa ~0,5 deja ver densidad (núcleos oscuros = acumulación real, no tinta).
Ojo + cuenta
El ojo propone (“veo 5 diagonales”) y el χ² dispone (Tema 30): ver sin contar es opinar; contar sin ver es ciego a la causa.

Bien graficado

Cuadrado, alfa, P medio

Estructura real salta; nube real se ve nube. El gráfico orienta qué test correr.

Mal graficado

Ejes deformados, P extremo

Falsas alarmas o falsa calma: el gráfico miente por construcción, no por datos.

04 · Ejemplos

Tres firmas visuales

Graficar→Buscar estructura→Confirmar con test
  1. 1
    Sano.

    Nube sin direcciones: ni diagonales ni grilla ni bordes vacíos. Pasa series y frecuencia.

  2. 2
    Diagonal LCG y = (5x+c) mod 1.

    5 rectas paralelas: dependencia lineal a simple vista. χ² de series ≈ cientos.

  3. 3
    Juguete m = 16.

    Solo 16 posiciones posibles: el cuadrado es un tablero de puntos aislados, no una nube.

05 · Coordenadas en Python

Preparar los tres gráficos sin librerías

Generamos pares no solapados, pares lag y el histograma en décimos con puro estándar: la salida alimenta cualquier graficador (o el laboratorio de abajo).

Python en tu navegador. Contá cuántos pares caen bajo la diagonal: en un sano ≈ la mitad.

import random

rng = random.Random(31)
us = [rng.random() for _ in range(2000)]
pares = [(us[i], us[i + 1]) for i in range(0, len(us) - 1, 2)]
lag = [(us[i], us[i + 1]) for i in range(len(us) - 1)]
bajo = sum(1 for x, y in pares if y < x)
print("pares:", len(pares), "bajo diagonal:", bajo)
print("primeros 5:", [(round(x, 4), round(y, 4)) for x, y in pares[:5]])

~1000 pares, ~500 bajo la diagonal: simetría de nube sana.

Histograma a ojo

import random

rng = random.Random(31)
us = [rng.random() for _ in range(2000)]
obs = [0] * 10
for u in us:
    obs[min(9, int(u * 10))] += 1
for i, o in enumerate(obs):
    print(f"{i / 10:.1f}-{(i + 1) / 10:.1f}: {'#' * (o // 10)} ({o})")

06 · Exploración

Laboratorio: tres vistas, tres fuentes

Elegí vista (scatter, lag, histograma) y fuente (nube, diagonal, juguete). La diagonal se revela en scatter/lag y se esconde en histograma: la lección del Tema 26 en vivo.

EXPERIMENTO 31

Mirar antes de contar

nube vs estructura

Los resultados numéricos aparecen debajo.
Vista—
Puntos—
Estructura—
Test que confirma—

Nube sana en scatter: sin direcciones.

La diagonal es invisible en el histograma 1D: pasa frecuencia y cae en series. Por eso la batería es multidimensional.

Preguntas para explorar

  1. Con diagonal en histograma: ¿se ve sana? ¿Y en scatter?
  2. Con juguete en scatter: ¿nube o tablero? ¿Cuántos puntos distintos hay como máximo?
  3. Con sano y 1500 puntos: ¿aparecen “rayas” por saturación? ¿Cómo las distinguís de diagonales reales?
Ver respuestas sugeridas
  1. Histograma sano (marginal intacta), scatter con 5 diagonales: la dependencia vive en el orden, no en la media.
  2. Tablero de 16 posiciones: con P grande se repiten los mismos puntos, más oscuros por apilamiento.
  3. Las de saturación son difusas y cambian con la semilla; las reales son rectas nítidas y estables. La duda la resuelve series (Tema 30).

07 · Comprensión

Confusiones frecuentes

«El histograma bien = generador bien»

La diagonal LCG da histograma perfecto y scatter desastroso: lo marginal no ve el orden. Hacen falta pares.

«Veo un hueco, está roto»

Con 600 puntos en 100 celdas lo esperado es ~6 huecos de azar. Hueco sistemático (siempre la misma zona) sí condena.

«Más puntos siempre se ve mejor»

Pasados ~2000 la saturación tapa: todo parece banda sólida. Para ver estructura, P = 300–1500 con alfa.

«Si se ve mal, lo descarto sin test»

Casi: lo descartás, pero el test documenta por qué (χ², celdas, lags). El informe necesita el número, no solo la captura.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: simetría de nube

Con 2000 de random, contá pares bajo la diagonal: debe dar ≈ 50 %.

import random

rng = random.Random(12)
us = [rng.random() for _ in range(2000)]
pares = [(us[i], us[i + 1]) for i in range(0, len(us) - 1, 2)]
print(len(pares), sum(1 for x, y in pares if y < x))
Ver solución razonada

≈ 1000 pares con ≈ 500 bajo la diagonal (±30): simetría de nube. Una diagonal y = x daría 0 o 1000.

Ejercicio 2: la diagonal en números

Generá la diagonal y = (5x + 0,1) mod 1 y contá cuántos pares caen en la franja |y − x| < 0,05 frente al 10 % esperado.

import random

rng = random.Random(12)
xs = [rng.random() for _ in range(1000)]
pares = [(x, (5 * x + 0.1) % 1.0) for x in xs]
print(sum(1 for x, y in pares if abs(y - x) < 0.05))
Ver solución

≈ 100 (10 %) también: la franja diagonal no es la de la dependencia. La estructura se ve en el scatter completo, no en una franja ingenua: por eso el test es la grilla k×k (Tema 30).

Ejercicio 3: tablero del juguete

Mostrá que el juguete m = 16 solo ocupa 16 posiciones del cuadrado.

Ver una posible respuesta
x = 7
seq = []
for _ in range(2000):
    x = (5 * x + 3) % 16
    seq.append(x / 16)
pares = [(seq[i], seq[i + 1]) for i in range(0, len(seq) - 1, 2)]
print(len(set(pares)))

16 posiciones distintas como máximo: el “scatter” es un tablero fijo. Series lo condena con χ² ≈ miles.

09 · Síntesis

Ideas para recordar

  • Tríptico: scatter pares, lag plot, histograma; P = 300–1500, ejes 1:1.
  • Sano = nube; diagonales/retículas/bandas = dependencia o resolución.
  • El histograma no ve el orden: la diagonal pasa 1D y cae en 2D.
  • El ojo orienta, el χ² decide; saturación y ejes mienten.
  • Rutina de 1 minuto ante secuencia nueva: graficar, luego testear.

En el próximo tema medimos dependencias con un número: correlación entre valores generados.