01 · Punto de partida
Cuando la exponencial no alcanza
¿Una proporción entre 0 y 1? ¿Vida útil con desgaste creciente? ¿Ingresos con cola pesada? ¿Un plazo del que solo sabés mínimo, moda y máximo? Ninguno es exponencial: son beta, Weibull, lognormal y triangular, las cuatro continuas que completan la caja de herramientas.
Todas se generan con lo ya aprendido: inversión (Weibull, triangular), transformación de una normal (lognormal) y cociente de gammas (beta). Este tema las fija con receta, media y trampa numérica.
- ¿Qué receta genera cada una con qué uniformes?
- ¿Qué media y varianza auditan cada generador?
- ¿Qué forma delata cada parámetro?
- ¿Qué borde rompe cada fórmula en flotante?
02 · Definición
Cuatro recetas, cuatro firmas
Weibull(k,λ): F(x) = 1 − e^(−(x/λ)^k), media λΓ(1+1/k). Lognormal(μ,σ): media e^(μ+σ²/2), varianza (e^(σ²)−1)e^(2μ+σ²). Beta(a,b): soporte [0,1], media a/(a+b). Triangular(a,c,b): media (a+b+c)/3.
Inversión Weibull
Despejar 1 − e^(−(x/λ)^k) = u. Con k = 1 recupera Exp(λ); con k = 2, Rayleigh; con k ≈ 3,5, casi campana.
Exponencial de normal
Lognormal = e^(μ+σZ) con Z ~ N(0,1) (Box-Muller/polar). Positiva y asimétrica: la normal en escala logarítmica.
Cociente beta
Dos gammas independientes G_a, G_b (Tema 26): X = G_a/(G_a+G_b) ~ Beta(a,b). Exacta para todo a,b > 0.
| Variable | Generador | Media |
|---|---|---|
| Weibull(k,λ) | λ(−ln U)^(1/k), 1 U | λΓ(1+1/k) |
| Lognormal(μ,σ) | e^(μ+σZ), 1 Z | e^(μ+σ²/2) |
| Beta(a,b) | G_a/(G_a+G_b), 2 gammas | a/(a+b) |
| Triangular(a,c,b) | Inversión por ramas, 1 U | (a+b+c)/3 |
03 · Anatomía
Ramas, potencias y cocientes
- Weibull: potencia 1/k
- Con k < 1 la densidad explota en 0 y
(−ln U)^(1/k)pidepowestable; con U = 1 exacto, −ln 0 = ∞. k = 1 debe dar la exponencial del Tema 22 bit a bit. - Triangular: punto de corte
- Fc = (c−a)/(b−a): si U < Fc, X = a + √[U(b−a)(c−a)]; si no, X = b − √[(1−U)(b−a)(b−c)]. El borde U = Fc cae en la moda c por ambas ramas.
- Lognormal: overflow
- e^(μ+σZ) desborda en doble desde μ+σZ ≈ 709. Con σ grande la media teórica existe pero la muestral fluctúa salvaje: validar en escala log (media μ, desvío σ).
- Beta: ceros simultáneos
- Con a,b < 1 ambas gammas pueden dar ~0 y el cociente 0/0 es NaN. Generar con Marsaglia-Tsang + boost (Tema 26) y proteger la suma nula.
Inversión y transformación
Weibull, triangular, lognormal
Un uniforme (o una normal) por muestra, O(1), sin rechazo. La vía rápida del catálogo.
Cociente de gammas
Beta exacta
Cuesta dos gammas por muestra pero vale todo a,b > 0 sin tablas ni rechazo.
04 · Dónde vive cada una
Del modelo al generador
- 1Weibull: desgaste.
Vida útil con tasa creciente (k > 1) o infantil (k < 1): eólica, materiales, supervivencia.
- 2Lognormal: multiplicación.
Ingresos, precios, tamaños: productos de muchos factores positivos pequeños.
- 3Beta: proporciones.
Tasas, probabilidades y priors conjugados de binomiales en [0,1].
- 4Triangular: opinión experta.
Cuando solo hay mínimo, moda y máximo: PERT y estimaciones de plazo.
05 · Representación en Python
Las cuatro en un solo bloque
Un generador por familia con su auditoría de media: Weibull, lognormal, beta y triangular lado a lado.
Python en tu navegador. Llevá k a 1: Weibull debe dar media ≈ λ como exponencial.
import random
import math
random.seed(230)
N = 8000
def weibull(k, lam):
return lam * (-math.log(1 - random.random())) ** (1 / k)
def lognormal(mu, sigma):
return math.exp(random.gauss(mu, sigma))
def beta(a, b):
ga = random.gammavariate(a, 1.0)
gb = random.gammavariate(b, 1.0)
return ga / (ga + gb)
def triangular(a, c, b):
u = random.random()
fc = (c - a) / (b - a)
if u < fc:
return a + math.sqrt(u * (b - a) * (c - a))
return b - math.sqrt((1 - u) * (b - a) * (b - c))
mw = [weibull(1.5, 2.0) for _ in range(N)]
ml = [lognormal(0.0, 0.5) for _ in range(N)]
mb = [beta(2, 5) for _ in range(N)]
mt = [triangular(0, 3, 10) for _ in range(N)]
print("weibull:", round(sum(mw)/N, 3), "vs", round(2*math.gamma(1+1/1.5), 3))
print("lognormal:", round(sum(ml)/N, 3), "vs", round(math.exp(0.125), 3))
print("beta:", round(sum(mb)/N, 3), "vs", round(2/7, 3))
print("triangular:", round(sum(mt)/N, 3), "vs", round(13/3, 3))
Weibull ≈ 1,806, lognormal ≈ 1,133, beta ≈ 0,286 y triangular ≈ 4,333. Cuatro recetas, cuatro firmas.
06 · Exploración
Laboratorio: k esculpe la Weibull
Movete k con λ y N fijos. El histograma usa 20 bines hasta el cuantil 99,5 % (cola aparte); los rombos son la probabilidad teórica por bin. Con k = 1 ves exponencial; con k = 2, Rayleigh; con k = 3,5, casi campana.
Weibull por inversión
X = λ·(−ln(1 − U))^(1/k)
Con k 1,5 y λ 2, media ≈ 1,806.
20 bines hasta el cuantil 99,5 % más cola. Probá k = 1 (exponencial) y k = 3,5 (campana asimétrica).
Preguntas para explorar
- Con k = 1,5 y λ = 2, ¿media teórica? ¿P(X ≤ λ)?
- Llevá k a 1. ¿Recuperás Exp(0,5)? ¿Media 2 y cola e^(−1)?
- Subí k a 3,5. ¿La forma se simetriza? ¿La varianza cae?
Ver respuestas sugeridas
- Media 2·Γ(5/3) ≈ 1,806 y P(X≤λ) = 1−e^(−1) ≈ 0,632 para todo k.
- Sí: Weibull(1,λ) = Exp(1/λ) con media λ = 2.
- Sí: con k grande la Weibull se concentra y simetriza; la varianza cae como λ²[Γ(1+2/k)−Γ(1+1/k)²].
07 · Comprensión
Confusiones frecuentes
«Weibull(k,λ) tiene media λ»
Solo con k = 1. En general es λΓ(1+1/k): con k = 1,5 y λ = 2 la media es 1,806, no 2.
«Lognormal es normal con e»
Es e^(normal): positiva y asimétrica, media e^(μ+σ²/2) ≠ e^μ. Generar la normal y exponenciar, nunca al revés.
«Beta(a,b) sale de dos uniformes»
Sale de dos gammas (Tema 26), no de uniformes directos. El cociente pone el soporte [0,1] con la forma correcta.
«Triangular es promedio de dos uniformes»
El promedio de dos U(0,1) solo da Triangular(0; 0,5; 1) simétrica. La general exige inversión por ramas con (a,c,b).
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: rodamiento Weibull
k = 2, λ = 1000 horas, N = 8000 (semilla 231): estimá vida media (≈ 886) y P(X ≤ 1000) (≈ 0,632).
import random
import math
random.seed(231)
k, lam, N = 2.0, 1000.0, 8000
m = [lam * (-math.log(1 - random.random())) ** (1/k) for _ in range(N)]
print(round(sum(m)/N, 1), "vs", round(lam*math.gamma(1+1/k), 1))
print(round(sum(1 for x in m if x <= lam)/N, 3), "vs 0.632")
Ver solución razonada
≈ 886 y ≈ 0,632 (Rayleigh: media λ√π/2). Si la media da ≈ 1000, usaste k = 1 sin querer.
Ejercicio 2: precios lognormales
μ = 3, σ = 0,4, N = 8000: verificá media ≈ e^(3,08) ≈ 21,76 y mediana ≈ e³ ≈ 20,09.
import random
import math
random.seed(232)
mu, sigma, N = 3.0, 0.4, 8000
m = [math.exp(random.gauss(mu, sigma)) for _ in range(N)]
s = sorted(m)
print(round(sum(m)/N, 2), "vs", round(math.exp(mu+sigma**2/2), 2))
print(round(s[N//2], 2), "vs", round(math.exp(mu), 2))
Ver solución
Media ≈ 21,8 (fluctúa más que la mediana) y mediana ≈ 20,1. La cola derecha infla la media: firma lognormal.
Ejercicio 3: plazo PERT triangular
Triangular(5, 10, 30) días, N = 8000: verificá media ≈ 15 y P(X ≤ 10) = Fc = 1/5 = 0,2.
Ver una posible respuesta
import random
import math
random.seed(233)
a, c, b, N = 5.0, 10.0, 30.0, 8000
fc = (c - a) / (b - a)
m = []
for _ in range(N):
u = random.random()
if u < fc:
m.append(a + math.sqrt(u * (b - a) * (c - a)))
else:
m.append(b - math.sqrt((1 - u) * (b - a) * (b - c)))
print(round(sum(m)/N, 2), "vs", round((a+b+c)/3, 2))
print(round(sum(1 for x in m if x <= c)/N, 3), "vs", round(fc, 3))
Media ≈ 15 y ≈ 0,2 bajo la moda. El triángulo asimétrico carga la cola derecha.
09 · Síntesis
Ideas para recordar
- Weibull = λ(−ln U)^(1/k): k = 1 ⇒ exponencial, k = 2 ⇒ Rayleigh.
- Lognormal = e^(μ+σZ): validar en escala log.
- Beta = G_a/(G_a+G_b): exacta con dos gammas.
- Triangular: inversión por ramas con corte Fc.
- Cierra el catálogo continuo antes del muestreo correlacionado.
En el próximo tema mezclamos campanas: variables correlacionadas.