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.
Í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.
Converge a F
Glivenko-Cantelli: Fₙ → F uniforme. Con n grande el sintético hereda la forma real; con n chico, sus grumos.
| Modo | Soporte sintético | Hueco [3,8; 7,0) |
|---|---|---|
| Índice discreto | Solo los 20 datos | 0 %: el hueco se respeta |
| Interpolado | Continuo [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
- 1Gemelos de demanda.
Ventas o tiempos históricos sin modelo: escenarios con la misma forma observada.
- 2Bootstrap generativo.
El Tema 30 como fábrica de material, no solo de intervalos.
- 3Datos sintéticos privados.
Compartir forma sin compartir filas (con n grande y discretización).
- 4Puente 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.
Gemelo de 20 datos
X = x_(⌈nU⌉) o interpola
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
- En discreto, ¿la media generada ≈ 5,69? ¿El hueco = 0?
- Activá interpolación. ¿El hueco sube a ≈ 0,05? ¿La media se mueve un poco?
- Bajá N a 500. ¿Los bines de cada moda se vuelven ruidosos?
Ver respuestas sugeridas
- Sí: reproduce Fₙ con error Monte Carlo ≈ s/√N.
- Sí: el segmento 3,8→7,0 pesa 1/20 = 5 %. La media interpolada sube un poco (≈ 5,88) por ese relleno.
- 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.