Generación de Variables Aleatorias · Tema 34

Distribuciones empíricas

Invertir la CDF de la muestra: índice iid para lo discreto, interpolación para lo continuo.

01 · Punto de partida

Generar sin modelo paramétrico

¿Y si los tiempos medidos no son exponenciales ni Weibull? Cuando hay datos pero no fórmula, la distribución empírica hace de modelo: su CDF escalonada Fₙ se invierte como cualquier CDF (Temas 2 y 5), sorteando un dato o interpolando entre vecinos.

Es el remuestreo del Tema 30 mirado como generador: ya no se estima un estadístico, se produce material sintético con la misma forma de los datos.

  • ¿Por qué x_(⌈nU⌉) invierte exactamente la escalera Fₙ?
  • ¿Cuándo conviene interpolar y cuándo sortear el dato tal cual?
  • ¿Qué reproduce el sintético y qué jamás inventa?
  • ¿Cómo se audita contra Fₙ?

02 · Definición

Escalera, cuantil e interpolación

Fₙ(x) = (1/n)·#{xᵢ ≤ x}: salta 1/n en cada dato. Su cuantil es constante por tramos: Fₙ⁻¹(u) = x_(k) con k = ⌈nu⌉. La interpolada une (k/n, x_(k)) con rectas: continua y estrictamente creciente donde hay datos.

x_(k)

Índice exacto

datos[int(n·U)] sobre ordenados: O(1), reproduce Fₙ bit a bit, incluidos huecos y empates.

∕∕

Recta entre vecinos

k = nU, i = ⌊k⌋: x_(i) + (k−i)·(x_(i+1)−x_(i)). Rellena huecos con densidad pareja: inventa donde no hubo datos.

n→∞

Converge a F

Glivenko-Cantelli: Fₙ → F uniforme. Con n grande el sintético hereda la forma real; con n chico, sus grumos.

Dos inversiones, dos filosofías.
ModoSoporte sintéticoHueco [3,8; 7,0)
Índice discretoSolo los 20 datos0 %: el hueco se respeta
InterpoladoContinuo [mín, máx]≈ 5 %: el hueco se rellena

03 · Anatomía

Orden, bordes y grumos

Ordenar una sola vez
El cuantil exige ordenados: se ordena al inicio O(n log n) y cada muestra sale O(1). No reordenar por muestra.
Bordes U = 0 / U → 1
U = 0 da el mínimo; U → 1⁻ da el máximo. El sintético jamás sale de [mín, máx]: la cola real más allá no existe para Fₙ.
Grumos heredados
Con n = 20, cada dato pesa 5 %: el histograma sintético repite picos y huecos muestrales. No es sesgo del generador, es fidelidad a Fₙ.
Interpolación con memoria
Rellenar el hueco supone densidad pareja entre vecinos: hipótesis fuerte si el hueco es estructural (dos poblaciones). Documentar el supuesto.

Índice discreto

Fiel a Fₙ

La opción por defecto: exacta, simple y honesta sobre lo que no se vio.

Interpolada / suavizada

Continua pero opinada

Mejor si el fenómeno es continuo y n alcanza; inventa densidad donde faltan datos.

04 · Dónde mandan los datos

De la muestra al gemelo sintético

datos n→Fₙ⁻¹(U)→sintético
  1. 1
    Gemelos de demanda.

    Ventas o tiempos históricos sin modelo: escenarios con la misma forma observada.

  2. 2
    Bootstrap generativo.

    El Tema 30 como fábrica de material, no solo de intervalos.

  3. 3
    Datos sintéticos privados.

    Compartir forma sin compartir filas (con n grande y discretización).

  4. 4
    Puente a histogramas.

    De la escalera Fₙ al histograma como modelo generativo. (Tema 35)

05 · Representación en Python

Discreta fiel frente a interpolada

Datos bimodales fijos (hueco real entre 3,8 y 7,0): ambas inversiones con auditoría de media y de hueco.

Python en tu navegador. Contá el hueco: discreta 0 %, interpolada ≈ 14 %.

import random

random.seed(300)
datos = sorted([2.2,2.5,2.7,2.9,3.0,3.1,3.3,3.5,3.6,3.8,
                7.0,7.3,7.6,7.9,8.1,8.4,8.7,9.0,9.4,9.8])
n = len(datos)
N = 8000

def empirica_discreta():
    return datos[int(n * random.random())]

def empirica_interp():
    k = n * random.random()
    i = min(int(k), n - 2)
    f = min(k - i, 1.0)
    return datos[i] + f * (datos[i+1] - datos[i])

m1 = [empirica_discreta() for _ in range(N)]
random.seed(300)
m2 = [empirica_interp() for _ in range(N)]
hueco = lambda m: sum(1 for x in m if 3.8 < x < 7.0) / N
print("media datos:", round(sum(datos)/n, 3), "disc:", round(sum(m1)/N, 3))
print("hueco disc:", round(hueco(m1), 3), "interp:", round(hueco(m2), 3))

Media datos ≈ 5,69 (discreta ≈ 5,69; interpolada ≈ 5,88 por el relleno); hueco 0 % vs ≈ 5 %. La interpolada paga continuidad con invención.

06 · Exploración

Laboratorio: el hueco se respeta o se rellena

Generá N sintéticos de los 20 datos bimodales. Las barras son el histograma generado; los rombos, la empírica por bin. Activá interpolación y mirá cómo aparece masa donde jamás hubo datos.

EXPERIMENTO 34

Gemelo de 20 datos

X = x_(⌈nU⌉) o interpola

Los resultados numéricos aparecen debajo.
Media gen.5,690
Media datos5,690
Hueco gen.0,000
Hueco datos0,000

Modo discreto con N 6000: hueco intacto.

20 bines en [2,10] vs empírica. Probá interpolar: el hueco (3,8; 7,0) se llena.

Preguntas para explorar

  1. En discreto, ¿la media generada ≈ 5,69? ¿El hueco = 0?
  2. Activá interpolación. ¿El hueco sube a ≈ 0,05? ¿La media se mueve un poco?
  3. Bajá N a 500. ¿Los bines de cada moda se vuelven ruidosos?
Ver respuestas sugeridas
  1. Sí: reproduce Fₙ con error Monte Carlo ≈ s/√N.
  2. Sí: el segmento 3,8→7,0 pesa 1/20 = 5 %. La media interpolada sube un poco (≈ 5,88) por ese relleno.
  3. Sí: con 500 hay ~25 por bin en las modas: el gemelo hereda el ruido muestral más el propio.

07 · Comprensión

Confusiones frecuentes

«Interpolar siempre es mejor»

Solo si el fenómeno es continuo. Con datos discretos (dados, conteos) interpolar inventa valores imposibles como 2,5 en un dado.

«El sintético corrige la muestra»

La reproduce, incluidos sus grumos: con n = 20 cada dato pesa 5 % y el gemelo lo repite. Más N sintético no agrega información.

«Vale para colas extremas»

Fₙ se queda en el máximo observado: P(sintético > máx) = 0. Las colas se modelan paramétricamente (Tema 35).

«Hay que reordenar por muestra»

No: se ordena una vez. El cuantil vive sobre el vector ordenado fijo.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: gemelo fiel

Datos del tema, N = 10000 (semilla 301): la media discreta debe dar ≈ 5,69 ± 0,05.

import random

random.seed(301)
datos = sorted([2.2,2.5,2.7,2.9,3.0,3.1,3.3,3.5,3.6,3.8,
                7.0,7.3,7.6,7.9,8.1,8.4,8.7,9.0,9.4,9.8])
n, N = len(datos), 10000
m = [datos[int(n*random.random())] for _ in range(N)]
print(round(sum(m)/N, 3), "vs", round(sum(datos)/n, 3))
Ver solución razonada

≈ 5,69. El error típico es s/√N con s ≈ 2,7: ±0,027 con N = 10000.

Ejercicio 2: medir el relleno

Compará el hueco (3,8; 7,0) discreto vs interpolado con N = 8000: 0 frente a ≈ 0,05.

import random

random.seed(302)
datos = sorted([2.2,2.5,2.7,2.9,3.0,3.1,3.3,3.5,3.6,3.8,
                7.0,7.3,7.6,7.9,8.1,8.4,8.7,9.0,9.4,9.8])
n, N = len(datos), 8000
d = [datos[int(n*random.random())] for _ in range(N)]
random.seed(302)
c = []
for _ in range(N):
    k = n*random.random()
    i = min(int(k), n-2)
    f = min(k-i, 1.0)
    c.append(datos[i] + f*(datos[i+1]-datos[i]))
h = lambda m: sum(1 for x in m if 3.8 < x < 7.0)/N
print(round(h(d), 3), round(h(c), 3))
Ver solución

0,0 y ≈ 0,05. El relleno equivale al peso 1/20 del segmento que une las modas.

Ejercicio 3: KS del gemelo

Calculá el D de Kolmogorov-Smirnov entre sintético discreto (N = 5000) y Fₙ: debe ser chico (≈ 0,01–0,02).

Ver una posible respuesta
import random

random.seed(303)
datos = sorted([2.2,2.5,2.7,2.9,3.0,3.1,3.3,3.5,3.6,3.8,
                7.0,7.3,7.6,7.9,8.1,8.4,8.7,9.0,9.4,9.8])
n, N = len(datos), 5000
m = [datos[int(n*random.random())] for _ in range(N)]
D = 0.0
for x in sorted(set(datos)):
    fn = sum(1 for v in m if v <= x) / N
    fe = sum(1 for d in datos if d <= x) / n
    D = max(D, abs(fn - fe))
print("D:", round(D, 3))

D ≈ 0,01: el gemelo discreto es Fₙ salvo ruido Monte Carlo. Es el test del Tema 38 en miniatura.

09 · Síntesis

Ideas para recordar

  • Fₙ⁻¹ por índice: exacta, O(1), respeta huecos.
  • Interpolada: continua, rellena huecos con supuesto explícito.
  • Jamás extrapola más allá de [mín, máx].
  • Ordenar una vez; N sintético no crea información.
  • Auditar con media, huecos y KS contra Fₙ.

En el próximo tema construimos el modelo: distribuciones desde histogramas y datos.