Generación de Variables Aleatorias · Tema 27

Otras continuas

Beta, Weibull, lognormal y triangular: cuatro recetas —cociente, inversión y exponencial— para el resto del catálogo.

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.

1/k

Inversión Weibull

Despejar 1 − e^(−(x/λ)^k) = u. Con k = 1 recupera Exp(λ); con k = 2, Rayleigh; con k ≈ 3,5, casi campana.

e^Z

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.

Receta, costo y firma de cada una.
VariableGeneradorMedia
Weibull(k,λ)λ(−ln U)^(1/k), 1 UλΓ(1+1/k)
Lognormal(μ,σ)e^(μ+σZ), 1 Ze^(μ+σ²/2)
Beta(a,b)G_a/(G_a+G_b), 2 gammasa/(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) pide pow estable; 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

U / Z / gammas→receta→β·W·LN·△
  1. 1
    Weibull: desgaste.

    Vida útil con tasa creciente (k > 1) o infantil (k < 1): eólica, materiales, supervivencia.

  2. 2
    Lognormal: multiplicación.

    Ingresos, precios, tamaños: productos de muchos factores positivos pequeños.

  3. 3
    Beta: proporciones.

    Tasas, probabilidades y priors conjugados de binomiales en [0,1].

  4. 4
    Triangular: 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.

EXPERIMENTO 27

Weibull por inversión

X = λ·(−ln(1 − U))^(1/k)

Los resultados numéricos aparecen debajo.
Media muestral1,806
Teórica λΓ(1+1/k)1,806
Var. muestral1,503
P(X≤λ) muestral0,632

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

  1. Con k = 1,5 y λ = 2, ¿media teórica? ¿P(X ≤ λ)?
  2. Llevá k a 1. ¿Recuperás Exp(0,5)? ¿Media 2 y cola e^(−1)?
  3. Subí k a 3,5. ¿La forma se simetriza? ¿La varianza cae?
Ver respuestas sugeridas
  1. Media 2·Γ(5/3) ≈ 1,806 y P(X≤λ) = 1−e^(−1) ≈ 0,632 para todo k.
  2. Sí: Weibull(1,λ) = Exp(1/λ) con media λ = 2.
  3. 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.