← Назад к вопросам

Какие знаешь распределения?

1.0 Junior🔥 241 комментариев
#Машинное обучение#Статистика и A/B тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Распределения вероятностей

Понимание распределений — основа статистики и ML. Разные распределения используются для различных типов данных и моделирования.

1. Normal Distribution (Гауссово распределение)

Самое важное распределение. Симметричное, колоколообразное.

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

# Параметры: mean (μ) и standard deviation (σ)
mu = 0
sigma = 1

# Генерация случайных чисел
data = np.random.normal(mu, sigma, 10000)

# PDF и CDF
x = np.linspace(-4, 4, 1000)
pdf = norm.pdf(x, mu, sigma)
cdf = norm.cdf(x, mu, sigma)

# Визуализация
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
axes[0].plot(x, pdf, 'b-')
axes[0].fill_between(x, pdf, alpha=0.3)
axes[0].set_title('PDF')
axes[1].plot(x, cdf, 'b-')
axes[1].set_title('CDF')
plt.show()

# Практическое применение
# - Тесты гипотез (t-tests, z-tests)
# - Confidence intervals
# - Много природных явлений

Параметры: μ (mean), σ (std dev) Свойства:

  • Симметричное: Mean = Median = Mode
  • 68% данных в ±1σ, 95% в ±2σ
  • Determined by 2 параметра

2. Uniform Distribution

Все значения в диапазоне [a, b] равновероятны.

from scipy.stats import uniform

# Параметры: loc (начало), scale (длина интервала)
a, b = 0, 10
data = np.random.uniform(a, b, 10000)

# PDF
x = np.linspace(a, b, 100)
pdf = uniform.pdf(x, a, b-a)

# Практическое применение
# - Default prior в Bayesian анализе
# - Случайная выборка
# - Генерация случайных чисел

3. Exponential Distribution

Для времени между событиями (waiting times).

from scipy.stats import expon

# Параметр: lambda (rate)
lambda_param = 0.5
data = np.random.exponential(1/lambda_param, 10000)

x = np.linspace(0, 10, 1000)
pdf = expon.pdf(x, scale=1/lambda_param)

# Практическое применение
# - Время между событиями (customer arrivals)
# - Lifetime данных
# - Queuing theory
# - Reliability engineering

Свойство: Memoryless (без памяти)

4. Binomial Distribution

Для дискретных результатов n испытаний Bernoulli.

from scipy.stats import binom

# Параметры: n (number of trials), p (probability of success)
n, p = 10, 0.5
data = np.random.binomial(n, p, 10000)

k = np.arange(0, n+1)
pdf = binom.pmf(k, n, p)  # PMF не PDF (дискретное)

plt.bar(k, pdf)
plt.xlabel('Number of successes')
plt.ylabel('Probability')
plt.show()

# Примеры
# - Coin flips (n=1, p=0.5)
# - Click-through rate (n=impressions, p=CTR)
# - A/B test results

5. Poisson Distribution

Для подсчета событий в фиксированный период.

from scipy.stats import poisson

# Параметр: lambda (среднее количество событий)
lambda_param = 3
data = np.random.poisson(lambda_param, 10000)

k = np.arange(0, 15)
pdf = poisson.pmf(k, lambda_param)

plt.bar(k, pdf)
plt.xlabel('Number of events')
plt.ylabel('Probability')
plt.show()

# Практическое применение
# - Количество customers в час
# - Количество errors в коде
# - Редкие события
# - Аппроксимация binomial когда n большое, p маленькое

6. Beta Distribution

Для вероятностей и пропорций (между 0 и 1).

from scipy.stats import beta

# Параметры: alpha, beta
alpha, beta_param = 2, 5
data = np.random.beta(alpha, beta_param, 10000)

x = np.linspace(0, 1, 1000)
pdf = beta.pdf(x, alpha, beta_param)

plt.plot(x, pdf)
plt.fill_between(x, pdf, alpha=0.3)
plt.show()

# Практическое применение
# - Prior для Bayesian анализа пропорций
# - Click-through rates (CTR)
# - Conversion rates
# - Probability estimation

7. Gamma Distribution

Обобщение exponential, для времени нескольких событий.

from scipy.stats import gamma

# Параметры: shape (alpha), scale (beta)
shape, scale = 2, 2
data = np.random.gamma(shape, scale, 10000)

x = np.linspace(0, 20, 1000)
pdf = gamma.pdf(x, shape, scale=scale)

# Практическое применение
# - Lifetime распределения
# - Waiting times для нескольких events
# - Response times в системах

8. Log-Normal Distribution

Если log(X) ~ Normal, то X ~ Lognormal.

from scipy.stats import lognorm

# Для переменных которые положительны и right-skewed
data = np.random.lognormal(mean=0, sigma=0.5, size=10000)

# Практическое применение
# - Income distribution
# - File sizes
# - Web traffic (page views)
# - Реакция на лекарства

9. Chi-Square Distribution

Для тестов goodness-of-fit и independence.

from scipy.stats import chi2

# Параметр: df (degrees of freedom)
df = 5
data = np.random.chisquare(df, 10000)

x = np.linspace(0, 20, 1000)
pdf = chi2.pdf(x, df)

# Практическое применение
# - Chi-square test для independence
# - Goodness-of-fit tests
# - Дисперсия нормального распределения

10. T Distribution

Для малых выборок из нормального распределения.

from scipy.stats import t

# Параметр: df (degrees of freedom)
df_list = [1, 5, 30]
x = np.linspace(-5, 5, 1000)

for df in df_list:
    pdf = t.pdf(x, df)
    plt.plot(x, pdf, label=f'df={df}')

plt.legend()
plt.show()

# Практическое применение
# - t-tests для малых выборок
# - Confidence intervals when σ unknown
# - Более robust к выбросам чем normal

11. F Distribution

Для ANOVA и тестов равенства дисперсий.

from scipy.stats import f

# Параметры: df1, df2 (degrees of freedom)
df1, df2 = 5, 20
data = np.random.f(df1, df2, 10000)

# Практическое применение
# - ANOVA
# - Homogeneity of variance tests

12. Negative Binomial Distribution

Для подсчета испытаний до r-го успеха.

from scipy.stats import nbinom

# Параметры: n (success), p (probability)
n, p = 5, 0.3
data = np.random.negative_binomial(n, p, 10000)

# Практическое применение
# - Overdispersed count data
# - Time to specified number of events

13. Weibull Distribution

Обобщение exponential для reliability анализа.

from scipy.stats import weibull_min

# Параметр: c (shape)
c = 1.5
data = np.random.weibull(c, 10000)

# Практическое применение
# - Failure times
# - Reliability engineering
# - Wind speed distributions

Практический пример: определение распределения

from scipy import stats
import scipy.stats as sp

def identify_distribution(data):
    """
    Проверяет какому распределению соответствуют данные
    """
    
    # Normality test
    stat, p_normal = stats.shapiro(data)
    print(f"Shapiro-Wilk test (normality): p={p_normal:.4f}")
    
    # Fit различных распределений
    distributions = ['norm', 'expon', 'gamma', 'lognorm', 'weibull_min']
    results = {}
    
    for dist_name in distributions:
        try:
            dist = getattr(sp, dist_name)
            # Fit parameters
            params = dist.fit(data)
            
            # Kolmogorov-Smirnov test
            ks_stat, ks_p = stats.kstest(data, dist.cdf, args=params)
            
            # Anderson-Darling test
            ad_stat, crit_vals, sig_level = stats.anderson(data, dist_name)
            
            results[dist_name] = {
                'params': params,
                'ks_p': ks_p,
                'ad_statistic': ad_stat
            }
        except:
            pass
    
    return results

# Применение
data = np.random.gamma(2, 2, 1000)
results = identify_distribution(data)

for dist_name, metrics in results.items():
    print(f"{dist_name}: KS p-value = {metrics['ks_p']:.4f}")

Выбор распределения для моделирования

Тип данныхРаспределениеКогда использовать
Continuous, symmetricNormalDefault выбор, center limit theorem
Continuous, right-skewedExponential, GammaWaiting times, lifetimes
Continuous, left/right skewedBetaProportions, probabilities
Discrete, countsPoissonEvents в period
Discrete, binaryBinomialYes/no outcomes
Positive valuesLognormalIncome, file sizes
Small samplest-distributiont-tests
CategoricalMultinomialMultiple categories

Best Practices

  1. Always visualize - histogram, Q-Q plot
  2. Perform goodness-of-fit tests - Shapiro, Kolmogorov-Smirnov
  3. Fit multiple distributions - compare AIC/BIC
  4. Consider transformations - log, sqrt, Box-Cox
  5. Use robust methods - если есть выбросы
  6. Check assumptions - перед использованием parametric tests
  7. Document distribution - в reports и documentation