Какие знаешь распределения?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Распределения вероятностей
Понимание распределений — основа статистики и 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, symmetric | Normal | Default выбор, center limit theorem |
| Continuous, right-skewed | Exponential, Gamma | Waiting times, lifetimes |
| Continuous, left/right skewed | Beta | Proportions, probabilities |
| Discrete, counts | Poisson | Events в period |
| Discrete, binary | Binomial | Yes/no outcomes |
| Positive values | Lognormal | Income, file sizes |
| Small samples | t-distribution | t-tests |
| Categorical | Multinomial | Multiple categories |
Best Practices
- Always visualize - histogram, Q-Q plot
- Perform goodness-of-fit tests - Shapiro, Kolmogorov-Smirnov
- Fit multiple distributions - compare AIC/BIC
- Consider transformations - log, sqrt, Box-Cox
- Use robust methods - если есть выбросы
- Check assumptions - перед использованием parametric tests
- Document distribution - в reports и documentation