Generación de Variables Aleatorias · Tema 12

Distribuciones mezcla

Qué son, qué momentos tienen y cuándo se ven bimodales: heterogeneidad modelada como Σ wᵢ·Fᵢ y generada por composición.

01 · Punto de partida

Una población, varios perfiles

El Tema 11 dio el algoritmo (elegir componente y muestrear). Este tema describe el objeto: la distribución mezcla. Tiempos de atención día/noche, demanda con días cero, retornos con régimen calmo/turbulento: un solo pico no alcanza, hacen falta pesos + componentes.

Entender sus momentos y su forma evita dos errores caros: confundir mezcla con suma de variables y pedirle a una normal única que ajuste dos picos.

  • ¿Cómo se escribe f, F, media y varianza de una mezcla?
  • ¿Cuándo se ve bimodal y cuándo con un solo hombro?
  • ¿Mezcla vs. convolución (suma)?
  • ¿Cómo se valida una mezcla simulada?

02 · Definición

Densidad, media y varianza de la mezcla

Con pesos wᵢ ≥ 0, Σwᵢ = 1 y componentes Fᵢ con media μᵢ y varianza σᵢ²:

∑

Pondera densidades

f mezcla es promedio pesado de fᵢ punto a punto. Con soportes disjuntos se ven bloques; solapados, hombros o dos picos.

◐

Varianza total

Ley total: promedio de varianzas + varianza de medias. Mezclar grupos distintos siempre infla la varianza respecto al promedio interno.

≋

No es suma

Mezcla = elegir UNA rama (o esto o lo otro). Convolución = sumar valores (esto más lo otro). Símbolos distintos, histogramas distintos.

Tres mezclas canónicas y sus momentos.
MezclaMediaForma típica
0,5·N(−2,07²)+0,5·N(2,07²)0Bimodal simétrica
0,4·Exp(1)+0,6·Exp(0,2)3,4Decreciente con cola pesada
0,3·δ₀+0,7·Poisson(2)1,4Pico en 0 + joroba en 2

03 · Anatomía

Pesos, separación y bimodalidad

Pesos w
Fracción de cada subpoblación. Se estiman por conteo o por EM; en simulación se fijan por escenario (“30 % nocturno”).
Separación vs. dispersión
Dos normales se ven bimodales si |μ₁−μ₂| > ~2σ. Cerca, se fusionan en un pico ancho: sigue siendo mezcla aunque “parezca” una sola.
Variable latente I
Etiqueta no observada del componente. Guardarla en la simulación permite auditar ramas (¿la cola vino de la Exp lenta?).
Ceros y truncamientos
δ₀ (masa en 0) + conteo/densidad: demanda intermitente, siniestros. Caso límite de mezcla discreta-continua.

Mezcla

Elegir una rama

Histograma con picos/hombros de cada fᵢ. Media entre medias, varianza inflada por la distancia entre grupos.

Suma (convolución)

Sumar valores

Binomial = suma de Bernoulli; gamma entera = suma de exponenciales. Un solo pico que se corre y angosta (relativamente).

04 · Catálogo de mezclas útiles

Del mostrador al riesgo

heterogeneidad→w + Fᵢ→composición
  1. 1
    Bimodales día/noche.

    Dos normales/uniformes por turno. El peso es la fracción horaria. (Laboratorio)

  2. 2
    Hiperexponencial.

    Mezcla de exponenciales: más flexible que una sola para tiempos con cola. Riesgo y fiabilidad.

  3. 3
    Cero-inflados.

    Masa en 0 + Poisson/binomial/exponencial. Demanda esporádica, lluvias, siniestros.

  4. 4
    Jerárquicas continuas.

    θ ~ H luego X|θ. Puente a Gamma-Poisson (binomial negativa) y a Bayes. (Temas 26–29)

05 · Representación en Python

Mezcla normal con momentos exactos

Guía: 0,5·N(−2, 0,7²) + 0,5·N(2, 0,7²). Media 0, varianza 0,49 + 4 = 4,49. Se muestrea por composición con gauss por rama.

Python en tu navegador. Cambiá w a 0,8 y verificá que la media se mueve a −1,2.

import random

random.seed(90)
w, mu1, mu2, sd, N = 0.5, -2.0, 2.0, 0.7, 8000

m = [(random.gauss(mu1, sd) if random.random() < w
      else random.gauss(mu2, sd)) for _ in range(N)]

media = sum(m) / N
var = sum((x - media) ** 2 for x in m) / N
print("media:", round(media, 3), "teórica:", w * mu1 + (1 - w) * mu2)
print("var:", round(var, 3), "teórica:",
      round(w * (sd**2 + mu1**2) + (1-w) * (sd**2 + mu2**2), 3))
print("P(X>3):", round(sum(1 for x in m if x > 3) / N, 3))

Media ≈ 0 y var ≈ 4,49. Con w = 0,8 la media ≈ −1,2 y el pico izquierdo domina.

06 · Exploración

Laboratorio: balancear dos campanas

Movete w con N fijo. La curva naranja es la mezcla teórica w·N(−2,07²)+(1−w)·N(2,07²). Con w = 0,5 hay dos picos iguales; en extremos uno absorbe al otro.

EXPERIMENTO 12

Mezcla de normales

f(x) = w·φ₋₂ + (1−w)·φ₊₂

Los resultados numéricos aparecen debajo.
Media muestral0,000
Media teórica0,000
Var. muestral4,490
Var. teórica4,490

Con w 0,5, media 0 y varianza 4,49 bimodal.

Histograma en densidad sobre [−5,5]. Probá w = 0,9 (pico izquierdo) y N = 500 (ruido en el valle).

Preguntas para explorar

  1. Con w = 0,5, ¿media y varianza teóricas? Leelas en el panel.
  2. Pasá a w = 0,9. ¿La media tiende a −1,6? ¿El pico derecho desaparece o queda como hombro?
  3. ¿Por qué la varianza (≈ 4,5) supera tanto a 0,49 de cada campana?
Ver respuestas sugeridas
  1. Media 0, varianza 4,49.
  2. Media −1,6; el pico derecho queda como hombro (10 % de masa).
  3. Por la distancia entre medias (4): el término “varianza entre grupos” domina.

07 · Comprensión

Confusiones frecuentes

«Mezcla de normales es normal»

No: la mezcla es bimodal/asimétrica y su varianza incluye la distancia entre medias. Solo la suma (convolución) de normales independientes es normal.

«Los pesos pueden ser cualesquiera»

Deben ser ≥ 0 y sumar 1. Pesos 2 y 3 sin normalizar inflan f a área 5: ya no es densidad.

«Si no se ven dos picos, no es mezcla»

Componentes cercanas se fusionan visualmente pero la varianza delata la heterogeneidad. Mirá varianza y CDF, no solo picos.

«La etiqueta I no hace falta guardarla»

Sin I no podés validar ramas ni explicar colas. En simulación, I es gratis y vale oro para depurar.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: varianza que delata heterogeneidad

Mezcla 0,5·N(−2,07²)+0,5·N(2,07²): calculá la varianza teórica 4,49 a mano y verificá con 8000 muestras (semilla 91).

import random

random.seed(91)
N = 8000
m = [(random.gauss(-2, 0.7) if random.random() < 0.5
      else random.gauss(2, 0.7)) for _ in range(N)]
media = sum(m) / N
print("media:", round(media, 3))
print("var:", round(sum((x - media) ** 2 for x in m) / N, 3), "vs 4.49")
Ver solución razonada

Var = 0,5·(0,49+4) + 0,5·(0,49+4) − 0² = 4,49. La muestral debe caer 4,3–4,7. Si da ≈ 0,5, generaste una sola rama.

Ejercicio 2: cero-inflado de demanda

0,3·δ₀ + 0,7·Poisson(2) por composición simple. Estimá la media 1,4 y P(X=0) ≈ 0,395.

import random
import math

random.seed(92)
p0, lam, N = 0.3, 2.0, 8000

def poisson(lam):
    L, k, p = math.exp(-lam), 0, 1.0
    while True:
        p *= random.random()
        if p <= L:
            return k
        k += 1

m = [0 if random.random() < p0 else poisson(lam) for _ in range(N)]
print("media:", round(sum(m) / N, 3), "vs 1.4")
print("P0:", round(m.count(0) / N, 3), "vs 0.395")
Ver solución

Ambos deben calzar. El 0 viene de dos fuentes: el inflado estructural y los ceros propios del Poisson.

Ejercicio 3: mezcla vs suma, el duelo

Compará mezcla 0,5·U(0,1)+0,5·U(3,4) (bimodal) contra suma U(0,1)+U(3,4) (triangular en [3,5]). Medias 2,0 vs 4,0: el histograma lo deja clarísimo.

Ver una posible respuesta
import random

random.seed(93)
N = 6000
mezcla = [(random.random() if random.random() < 0.5 else 3 + random.random())
          for _ in range(N)]
suma = [random.random() + (3 + random.random()) for _ in range(N)]
print("mezcla:", round(sum(mezcla) / N, 3), "vs 2.0")
print("suma:", round(sum(suma) / N, 3), "vs 4.0")
print("mezcla en [1,3]:", sum(1 for x in mezcla if 1 < x < 3) / N,
      "| suma en [1,3]:", sum(1 for x in suma if 1 < x < 3) / N)

La mezcla deja el hueco [1,3] vacío; la suma vive en [3,5]. Misma piezas, operaciones opuestas.

09 · Síntesis

Ideas para recordar

  • f mezcla = Σwᵢfᵢ; media Σwᵢμᵢ; varianza con término entre grupos.
  • Bimodal si la separación supera ~2σ; si no, pico ancho con varianza inflada.
  • Mezcla = elegir rama; suma = sumar valores. No confundir.
  • Guardar la etiqueta I permite validar ramas y explicar colas.
  • Se genera por composición: discreta para I + generador por rama.

En el próximo tema aceleraremos la rama discreta: el método del alias en O(1).