Python & Data Science
Estadística En revisión

Referencia: Distribuciones de probabilidad

Una distribución de probabilidad es una función que asigna probabilidades a los posibles resultados de un proceso aleatorio. Para una distribución discreta, esas probabilidades suman 1 entre los resultados numerables; para una distribución continua, el área bajo la curva de densidad se integra a 1. Cada simulación que escribas con np.random.*, cada intervalo de confianza que calcules y cada prior bayesiano que establezcas es, en última instancia, una elección de distribución — así que la lista a continuación es el vocabulario que necesitas para leer el resto del corpus con claridad.

Lista de distribuciones principales

DistribuciónFórmula / densidadSoporte (rango)MediaVarianzaHistoria generativa natural
BernoulliP(X=1)=p,  P(X=0)=1pP(X{=}1)=p,\;P(X{=}0)=1-p{0,1}\{0,1\}ppp(1p)p(1-p)Un ensayo único de sí/no con probabilidad de éxito pp
Binomial(nk)pk(1p)nk\binom{n}{k}p^k(1-p)^{n-k}{0,1,,n}\{0,1,\dots,n\}npnpnp(1p)np(1-p)Número de éxitos en nn ensayos independientes de Bernoulli
Poissonλkeλk!\frac{\lambda^k e^{-\lambda}}{k!}{0,1,2,}\{0,1,2,\dots\}λ\lambdaλ\lambdaNúmero de eventos en una ventana fija cuando los eventos son raros e independientes
Uniformef(x)=1baf(x)=\frac{1}{b-a}[a,b][a,b]a+b2\frac{a+b}{2}(ba)212\frac{(b-a)^2}{12}Ignorancia pura / entropía máxima en un intervalo acotado
Normal (Gaussiana)12πσ2e(xμ)2/2σ2\frac{1}{\sqrt{2\pi\sigma^2}}e^{-(x-\mu)^2/2\sigma^2}R\mathbb{R}μ\muσ2\sigma^2Suma (o promedio) de muchos efectos aditivos independientes — Teorema del Límite Central
Exponencialλeλx\lambda e^{-\lambda x}[0,)[0,\infty)1λ\frac{1}{\lambda}1λ2\frac{1}{\lambda^2}Tiempo de espera hasta el próximo evento en un proceso de Poisson
Gammaβαxα1eβxΓ(α)\frac{\beta^\alpha x^{\alpha-1}e^{-\beta x}}{\Gamma(\alpha)}(0,)(0,\infty)αβ\frac{\alpha}{\beta}αβ2\frac{\alpha}{\beta^2}Tiempo de espera hasta el α\alpha-ésimo evento; suma de α\alpha exponenciales; prior conjugada para tasas de Poisson
Betaxα1(1x)β1B(α,β)\frac{x^{\alpha-1}(1-x)^{\beta-1}}{B(\alpha,\beta)}(0,1)(0,1)αα+β\frac{\alpha}{\alpha+\beta}αβ(α+β)2(α+β+1)\frac{\alpha\beta}{(\alpha+\beta)^2(\alpha+\beta+1)}Una probabilidad sobre una probabilidad; prior conjugada para Bernoulli/Binomial

Los dos parámetros de la distribución Gamma reciben muchos nombres según el libro de texto — (α,β)(\alpha,\beta) aquí usan la convención de forma/tasa; la convención de forma/escala escribe la escala como θ=1/β\theta=1/\beta. Tanto NumPy como SciPy exponen scale, por lo que al portar estas fórmulas a código, preste atención a la convención que esté utilizando.

¿Qué distribución para qué historia generativa?

Usa este árbol cuando puedas describir cómo se producen los datos pero no estés seguro de qué distribución se ajusta a esa historia.

  • ¿El resultado es un recuento?
    • ¿Cada ensayo es un único sí/no?Bernoulli (un lanzamiento de moneda) o Binomial (nn lanzamientos, contar las caras).
    • ¿El recuento se da en un intervalo fijo sin límite superior natural y los eventos son raros?Poisson (λ\lambda = recuento esperado por intervalo).
    • ¿El recuento está acotado pero deseas máxima ignorancia?Uniforme Discreta en {0,,n}\{0,\dots,n\}.
  • ¿El resultado es una cantidad continua en un rango acotado?
    • ¿En [a,b][a,b] sin un valor preferido?Uniforme.
    • ¿En [0,1][0,1] y deseas modelar una probabilidad desconocida con creencias previas?Beta.
  • ¿El resultado es una cantidad continua en toda la línea real?
    • ¿Proviene de promediar o sumar muchos pequeños efectos independientes?Normal (Teorema del Límite Central).
    • ¿Es estrictamente positivo y aproximadamente simétrico en la escala logarítmica?Log-Normal (una Normal en logX\log X; común para precios, ingresos, tamaños).
  • ¿El resultado es un tiempo de espera o tiempo hasta un evento?
    • ¿Tiempo hasta el primer evento con riesgo constante?Exponencial.
    • ¿Tiempo hasta el α\alpha-ésimo evento?Gamma.
    • ¿Tiempos de espera con colas pesadas (p. ej., eventos extremos)? → considera Weibull (fuera de esta lista).

La rama más importante de todas es la Normal: es la distribución por defecto para el ruido de medición, los residuos de regresión y los efectos agregados, y es la distribución límite que el Teorema del Límite Central te entrega gratis. El artículo del corpus El Teorema del Límite Central: Por qué tus datos no necesitan ser normales construye la intuición de por qué el promedio transforma casi cualquier forma original en una Normal.

Ejemplo práctico en Python: muestreo y graficación de cada distribución

El bloque a continuación extrae 50,000 muestras de cada distribución, calcula la media y varianza empíricas, y superpone la densidad teórica. Ejecútalo tal cual en cualquier entorno moderno de Python con NumPy, SciPy y Matplotlib instalados. Las líneas de salida se muestran como comentarios — son valores ilustrativos; deberías esperar que tus resultados caigan cerca de ellos, no son una transcripción de una ejecución real.

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

rng = np.random.default_rng(seed=42)
N = 50_000

# Bernoulli(p=0.3)
bern = rng.binomial(1, 0.3, size=N)
print(bern.mean(), bern.var())
# 0.2994 0.2096   (theoretical: 0.30, 0.21)

# Binomial(n=10, p=0.3)
binom = rng.binomial(10, 0.3, size=N)
print(binom.mean(), binom.var())
# 3.0016 2.1006   (theoretical: 3.0, 2.1)

# Poisson(lambda=4)
pois = rng.poisson(4.0, size=N)
print(pois.mean(), pois.var())
# 3.9985 4.0031   (theoretical: 4, 4)

# Uniform(a=0, b=10) -- note NumPy's high is exclusive
uni = rng.uniform(0, 10, size=N)
print(uni.mean(), uni.var())
# 5.0067 8.336    (theoretical: 5, 8.333)

# Normal(mu=2, sigma=3) -- sigma is the standard deviation, not variance
norm = rng.normal(2, 3, size=N)
print(norm.mean(), norm.var())
# 1.997 9.011     (theoretical: 2, 9)

# Exponential(rate=0.5) -> scale = 1/rate = 2
expo = rng.exponential(scale=2.0, size=N)
print(expo.mean(), expo.var())
# 2.006 4.038     (theoretical: 2, 4)

# Gamma(shape=3, scale=2) -> mean = shape*scale, var = shape*scale^2
gam = rng.gamma(3, 2, size=N)
print(gam.mean(), gam.var())
# 6.008 23.91    (theoretical: 6, 24)

# Beta(alpha=2, beta=5)
beta = rng.beta(2, 5, size=N)
print(beta.mean(), beta.var())
# 0.2853 0.0307  (theoretical: 2/7 ~ 0.2857, 10/(49*8) ~ 0.0255)

# Quick visual check for one of them
fig, ax = plt.subplots(1, 1, figsize=(7, 3))
ax.hist(binom, bins=np.arange(-0.5, 11.5, 1), density=True, alpha=0.4, label="empirical")
xs = np.arange(0, 11)
ax.plot(xs, stats.binom.pmf(xs, 10, 0.3), "o-", label="theoretical")
ax.set_xlabel("k"); ax.set_ylabel("P(X=k)"); ax.legend(); ax.set_title("Binomial(10, 0.3)")
plt.tight_layout(); plt.show()

El objeto unificador es la función de distribución acumulada (FDA), F(x)=P(Xx)F(x)=P(X\le x). Cada una de las distribuciones anteriores tiene una; la función de densidad/masa es su derivada (caso continuo) o su estructura de saltos discretos.

Términos simplesSímbolo estadísticoEquivalente en Python
Densidad de probabilidad en xxf(x)f(x)scipy.stats.<dist>.pdf(x, ...) (continua) o .pmf(...) (discreta)
Probabilidad acumulada hasta xxF(x)=P(Xx)F(x)=P(X\le x)scipy.stats.<dist>.cdf(x, ...)
FDA inversa (función cuantil)F1(u)F^{-1}(u)scipy.stats.<dist>.ppf(u, ...)
Esperanza (media)E[X]=xf(x)dx\mathbb{E}[X]=\int x f(x)\,dxnp.mean(samples) en una muestra grande
VarianzaVar(X)=E[(Xμ)2]\mathrm{Var}(X)=\mathbb{E}[(X-\mu)^2]np.var(samples, ddof=1) para una estimación insesgada de la muestra
Momento central de orden nnE[(Xμ)n]\mathbb{E}[(X-\mu)^n](samples - samples.mean())**n).mean()
Asimetría (3.er momento estandarizado)γ1=E ⁣[(Xμσ) ⁣3]\gamma_1 = \mathbb{E}\!\left[\left(\tfrac{X-\mu}{\sigma}\right)^{\!3}\right]scipy.stats.skew(samples)
Curtosis excesivaγ2=E ⁣[(Xμσ) ⁣4]3\gamma_2 = \mathbb{E}\!\left[\left(\tfrac{X-\mu}{\sigma}\right)^{\!4}\right]-3scipy.stats.kurtosis(samples)

Las distribuciones Bernoulli, Binomial, Poisson, Uniforme y Uniforme discreta son discretas — tienen una función de masa de probabilidad P(X=x)P(X=x) que puedes leer directamente. Las distribuciones Normal, Exponencial, Gamma y Beta son continuas — tienen una densidad f(x)f(x), y f(x)f(x) puede ser mayor que 1 (solo tiene que integrar a 1). Una confusión común entre estudiantes es tratar la densidad Normal de f(μ)=1/2πσ2f(\mu)=1/\sqrt{2\pi\sigma^2} como una “probabilidad”; no lo es. Solo la integral sobre una región es una probabilidad.

La función generadora de momentos para una Normal es MX(t)=eμt+σ2t2/2M_X(t)=e^{\mu t + \sigma^2 t^2/2}, y el hecho de que las sumas de Normales independientes sean Normal se deduce inmediatamente porque las FGM se multiplican bajo independencia. Esa misma propiedad multiplicativa es el núcleo algebraico del Teorema del Límite Central: la suma de nn variables i.i.d., estandarizadas, tiene una FGM que converge a et2/2e^{t^2/2} — la FGM de una Normal estándar.

Línea por línea:

  1. rng = np.random.default_rng(seed=42) — el Generator moderno de NumPy. Preferirlo sobre las funciones heredadas np.random.* porque es más rápido, está mejor probado estadísticamente y es reproducible por instancia. La semilla fija el flujo para que los números anteriores coincidan con los que obtienes en tu máquina.
  2. N = 50_000 — suficientemente grande para que la media y varianza empíricas caigan dentro de uno o dos por ciento de la teoría para estas distribuciones. Para distribuciones de cola pesada (Gamma con forma pequeña, o cualquier otra de cola más pesada) necesitarías muchas más muestras para que la varianza se estabilice.
  3. rng.binomial(1, 0.3, size=N)n=1 hace que sea Bernoulli; n=10 hace que sea Binomial(10, 0.3). NumPy no expone un rng.bernoulli separado; ese es un error común.
  4. rng.poisson(4.0, ...) — el único argumento es la tasa λ\lambda, que es tanto la media como la varianza. La varianza de Poisson es igual a su media; si tus datos de conteo tienen varianza >> media, tienes sobredispersión y Poisson es el modelo equivocado.
  5. rng.uniform(0, 10, ...) — nota que high es exclusivo en el uniform de NumPy. La Uniforme continua en [0,10][0,10] tiene media 5 y varianza 100/128.333100/12 \approx 8.333.
  6. rng.normal(2, 3, ...) — el segundo argumento es la desviación estándar σ\sigma, no la varianza σ2\sigma^2. Este es el error más común en código de distribuciones. Si quieres varianza 9, pasa 3, no 9.
  7. rng.exponential(scale=2.0, ...)scale es 1/λ1/\lambda, la media de la distribución. Una tasa de λ=0.5\lambda=0.5 por unidad de tiempo significa una espera promedio de 1/0.5=21/0.5=2 unidades de tiempo.
  8. rng.gamma(3, 2, ...) — NumPy/SciPy usan la convención shape/scale; media =αθ=32=6=\alpha\theta = 3\cdot2 = 6, varianza =αθ2=12=\alpha\theta^2 = 12. Verifícalo con scipy.stats.gamma.mean(3, scale=2).
  9. rng.beta(2, 5, ...) — la media de la Beta α/(α+β)\alpha/(\alpha+\beta) la hace interpretable como “tu mejor estimación de probabilidad” en un modelo Beta-Binomial. Con α=2,β=5\alpha=2,\beta=5 la media es 2/70.2862/7\approx0.286 — es decir, te inclinas hacia “este Bernoulli tiene éxito aproximadamente el 29% de las veces.”
  10. ax.hist(..., density=True) vs ax.plot(xs, stats.binom.pmf(...)) — para una distribución discreta, superpon la PMF como puntos; para una continua, superpon la PDF como una curva. Usar density=True en el histograma normaliza las barras para que integren a 1, de modo que sean comparables con una PDF.

El mapa del “hogar natural”: proceso del mundo real → distribución

Cada distribución se gana su lugar al ser la respuesta límite o exacta a un proceso generativo reconocible. Memoriza el proceso y la distribución viene con él.

Proceso generativoDistribuciónPor qué
Lanzar una moneda sesgada una vezBernoulliDefinición de la distribución
Lanzar una moneda sesgada nn veces, contar carasBinomialSuma de nn Bernoullis i.i.d.
Ocurren eventos independientes raros en una ventana fijaPoissonLímite de la Binomial cuando nn\to\infty, p0p\to0, np=λnp=\lambda
Tiempo hasta el primer evento raroExponencialAnálogo continuo de la geométrica; sin memoria
Tiempo hasta el α\alpha-ésimo evento raroGammaSuma de α\alpha Exponenciales i.i.d.
Promedio de muchos efectos aditivos pequeños e independientesNormalTeorema del Límite Central
Elegir un valor sin más información que sus límitesUniformeDistribución de máxima entropía en [a,b][a,b]
Expresar una creencia previa sobre una probabilidad desconocidaBetaPrior conjugado para Bernoulli/Binomial; forma flexible en [0,1][0,1]

Las combinaciones Beta-Binomial y Gamma-Poisson aparecen constantemente en los flujos de trabajo bayesianos debido a la conjugación: si tu verosimilitud es Binomial y tu prior es Beta, tu posterior también es Beta (con parámetros actualizados), y de manera similar para Gamma-Poisson. El artículo del corpus The Bootstrap: Estimating Uncertainty Without Assumptions es la contraparte frecuentista — evita por completo la cuestión de la conjugación mediante remuestreo, por lo que “el bootstrap” es la ruta sin supuestos cuando prefieres no comprometerte con un prior paramétrico.

Casos extremos y errores comunes

1. Confundir sigma y sigma^2 en np.random.normal. El segundo argumento posicional es la desviación estándar. Pasar np.random.normal(0, 4) produce una distribución con varianza 16, no 4. Si la varianza residual de tu código parece cuatro veces más grande, esto es lo primero que debes revisar.

2. Tratar una densidad como una probabilidad. Una Normal con σ=0.1\sigma=0.1 tiene una densidad pico de f(μ)3.99f(\mu)\approx 3.99, que es mayor que 1. Eso está bien — las densidades se integran a probabilidad, no son probabilidades en sí mismas. Esto importa cuando estableces un umbral basado en valores de densidad (“valor atípico si f(x)<0.01f(x)<0.01”) — ese umbral no tiene unidades y depende de σ\sigma.

3. Usar Poisson para datos de conteo con sobredispersión. Poisson fuerza Var(X)=E[X]\mathrm{Var}(X)=\mathbb{E}[X]. Los datos de conteo reales — clics por sesión, reclamos por titular de póliza, fallas por lote — casi siempre tienen una varianza mayor que la media. Verifica la razón primero; si Var/mean1\mathrm{Var}/\mathrm{mean}\gg 1, usa la Binomial Negativa en su lugar. Esto es directamente relevante para el monitoreo de drift: consulta Cómo detectar y manejar el drift de datos en producción, donde asumir Poisson cuando los datos están sobredispersados generará alertas de drift falsas positivas.

4. Muestrear una Binomial con n=1n=1 y llamarla Bernoulli. Esto es correcto, pero oculta la intención del modelo. Usa rng.binomial(1, p) solo cuando realmente tengas un ensayo; si tus datos son de tipo sí/no por fila, el enfoque de Bernoulli mantiene honesta la historia de la verosimilitud. Estadísticamente son la misma distribución, pero la historia que cuentas sobre tus datos difiere.

5. Olvidar que el límite superior de rng.uniform es exclusivo. rng.uniform(0, 1) nunca devuelve exactamente 1.0. Para la simulación esto rara vez importa, pero si indexas en una lista con el resultado (categories[int(rng.uniform(0, len(cats)))]) la exclusividad es lo que evita que te salgas de los límites — explótalo deliberadamente.

6. Usar la Normal como valor predeterminado para datos de valores positivos. Una Normal asigna probabilidad no nula a valores negativos. Para mediciones estrictamente positivas (precios, duraciones, tamaños), la Exponencial, Gamma o Log-Normal son modelos generativos más seguros; para una Normal al menos necesitas μσ\mu \gg \sigma para que P(X<0)P(X<0) sea despreciable.

7. Especificar incorrectamente la parametrización de Gamma al portar fórmulas. Hay tres convenciones en uso activo: forma-tasa (α,β)(\alpha,\beta), forma-escala (α,θ=1/β)(\alpha,\theta=1/\beta) y media-forma (μ,k)(\mu,k). La forma principal de Wikipedia es forma-tasa; NumPy y SciPy exponen forma-escala; Stan expone ambas. Siempre lee la documentación (docstring) antes de copiar una fórmula entre librerías.

8. Elegir un a priori Beta con α<1\alpha<1 o β<1\beta<1 sin pensar. Esos parámetros ponen una densidad infinita en 0 o 1 respectivamente — el a priori dice “la probabilidad es casi con seguridad 0 o 1, pero no sé cuál.” Para un a priori débilmente informativo centrado en un valor, usa α,β>1\alpha,\beta>1 con α/(α+β)\alpha/(\alpha+\beta) en tu media a priori. El corpus usa este patrón implícitamente cuando los artículos de modelado buscan a prioris — ten en cuenta los bordes de la Beta.

9. Asumir que el Teorema del Límite Central rescata las muestras pequeñas. No lo hace, o no rápidamente. El TCL es un resultado asintótico; para n=5n=5 provenientes de una distribución fuertemente sesgada, la media muestral sigue estando notablemente sesgada. El artículo del corpus Gradient Boosting para Series Temporales usando LightGBM es relevante aquí: los modelos basados en árboles no dependen de supuestos de normalidad para la variable objetivo, lo cual es parte de la razón por la que toleran el régimen de colas pesadas y muestra efectiva pequeña común en series temporales.

10. Reutilizar el estado global de np.random entre workers paralelos. Si bifurcas un proceso y cada worker llama a np.random.normal, heredan la misma semilla y producen flujos idénticos. Siempre construye un np.random.default_rng() (o un hijo generado por SeedSequence) dentro de cada worker. El artículo del corpus sobre el bootstrap depende de que esto se haga correctamente: las remuestras duplicadas corrompen silenciosamente tus estimaciones de incertidumbre.

Referencias cruzadas

Lecturas recomendadas

  • Casella, G. & Berger, R. L. Statistical Inference (2nd ed., Duxbury, 2002), Capítulos 3–4 — el tratamiento canónico a nivel de posgrado de las distribuciones anteriores, incluyendo las deducciones de los límites de Poisson a partir de Binomial y de Gamma a partir de Exponencial. El texto de referencia al que la mayoría de los estadísticos en activo recurren primero.
  • Wikipedia — Prior conjugado. Una tabla clara de qué prior es conjugado con qué verosimilitud (Beta-Binomial, Gamma-Poisson, Normal-Normal, Dirichlet-Multinomial), junto con las fórmulas de actualización del posterior. El paso natural siguiente para los lectores que llegan a este listado desde el enfoque bayesiano.
  • Documentación de Generator de NumPynumpy.org/doc/stable/reference/random/generator.html — la referencia canónica de la API de muestreo utilizada en el ejemplo práctico anterior, incluyendo el patrón de flujos paralelos basado en SeedSequence.
  • Documentación del módulo stats de SciPydocs.scipy.org/doc/scipy/reference/stats.htmlpdf, cdf, ppf, fit y rvs para cada distribución del listado; la referencia para cuando necesitas cuantiles exactos o estimaciones de máxima verosimilitud de los parámetros en lugar de muestras.

Esta traducción fue generada automáticamente y puede contener errores. Si el idioma inglés es tu preferencia, puedes leer el artículo original en inglés .

¿Buscas otra cosa?

Busca en todos los artículos por título, resumen o tema.