Какие виды распределений вы знаете? Приведите примеры.?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Виды распределений и примеры
Распределение — это описание того, как часто встречаются разные значения переменной. Знание видов распределений критично для правильного анализа данных, выбора статистических тестов и понимания природы явлений. Разберу основные распределения и их применение.
1. Нормальное (Гауссово) распределение
Описание: Симметричное распределение с одним пиком в центре. Характеризуется средним (μ) и стандартным отклонением (σ).
Формула:
f(x) = (1 / (σ√(2π))) × e^(-(x-μ)²/(2σ²))
Код визуализации:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
x = np.linspace(-4, 4, 1000)
y = norm.pdf(x)
plt.plot(x, y)
plt.title('Нормальное распределение')
plt.xlabel('Значение')
plt.ylabel('Плотность вероятности')
plt.show()
# Генерация данных из нормального распределения
data = np.random.normal(loc=100, scale=15, size=10000) # IQ
Свойства:
- Симметричное
- Среднее = Медиана = Мода
- ~68% данных в диапазоне μ ± σ
- ~95% в диапазоне μ ± 2σ
- ~99.7% в диапазоне μ ± 3σ
Реальные примеры:
- IQ в популяции
- Рост людей
- Ошибки измерений
- Оценки на экзамене при хорошем обучении
Важность: Многие статистические методы предполагают нормальность (t-тесты, ANOVA, регрессия).
2. Биномиальное распределение
Описание: Распределение количества успехов в серии независимых испытаний с двумя исходами (да/нет, успех/неудача).
Параметры:
- n — количество испытаний
- p — вероятность успеха в каждом испытании
Код:
from scipy.stats import binom
n = 100 # Количество пользователей
p = 0.1 # Вероятность клика (10%)
# Вероятность ровно 15 кликов
prob = binom.pmf(15, n, p)
print(f"P(X=15) = {prob:.4f}")
# Вероятность не более 15 кликов
cum_prob = binom.cdf(15, n, p)
print(f"P(X≤15) = {cum_prob:.4f}")
# Генерация данных
data = np.random.binomial(n=100, p=0.1, size=10000) # 10000 экспериментов
Реальные примеры:
- Количество успешных конверсий из 1000 кликов
- Количество дефектов в партии из 50 товаров
- Количество положительных ответов на опрос
- A/B тестирование (success/no success)
3. Пуассоновское распределение
Описание: Распределение количества событий, происходящих в фиксированном интервале времени или пространства, когда события происходят независимо с фиксированной интенсивностью.
Параметр:
- λ (lambda) — интенсивность (среднее количество событий)
Код:
from scipy.stats import poisson
lambda_val = 5 # В среднем 5 событий в час
# Вероятность ровно 3 событий
prob = poisson.pmf(3, lambda_val)
print(f"P(X=3) = {prob:.4f}")
# Генерация данных
data = np.random.poisson(lam=5, size=10000) # 10000 часов наблюдения
Реальные примеры:
- Количество запросов к серверу в минуту
- Количество звонков в call-центр в час
- Количество опечаток на странице
- Количество отказов оборудования в день
4. Экспоненциальное распределение
Описание: Распределение времени между двумя последовательными событиями. Изучает интервалы, а не количество событий (в отличие от Пуассона).
Параметр:
- λ — интенсивность
Код:
from scipy.stats import expon
lambda_val = 1/5 # В среднем 5 минут между событиями
# Вероятность того, что время <= 3 минут
prob = expon.cdf(3, scale=1/lambda_val)
print(f"P(T≤3) = {prob:.4f}")
# Генерация данных
data = np.random.exponential(scale=5, size=10000) # Время между событиями
Реальные примеры:
- Время до отказа оборудования
- Время между поступлениями клиентов
- Время ответа сервера
- Время жизни радиоактивного атома
5. Равномерное (Uniform) распределение
Описание: Все значения в диапазоне [a, b] имеют одинаковую вероятность.
Код:
from scipy.stats import uniform
a, b = 0, 100 # Диапазон
# Плотность вероятности
pdf = uniform.pdf(50, loc=a, scale=b-a) # Одинакова для всех
print(f"f(50) = {pdf:.4f}")
# Генерация данных
data = np.random.uniform(0, 100, size=10000)
Реальные примеры:
- Случайные числа в компьютере
- Время прибытия клиента в интервал [8:00, 9:00]
- Случайный выбор элемента из списка
6. Log-normal распределение
Описание: Если логарифм переменной нормально распределён, то сама переменная имеет log-normal распределение. Асимметричное, часто встречается в реальных данных.
Код:
from scipy.stats import lognorm
# Параметр sigma логарифма нормального распределения
sigma = 0.5
mu = 0
# Генерация данных
data = np.random.lognormal(mean=mu, sigma=sigma, size=10000)
Реальные примеры:
- Доходы и заработные платы (небольшой доход много людей, большой доход мало)
- Размеры файлов в интернете
- Продолжительность сеансов на веб-сайте
- Цены на имущество
7. Гамма-распределение
Описание: Обобщение экспоненциального распределения. Используется для моделирования времени ожидания сумм независимых событий.
Параметры:
- α (shape) — форма
- β (scale) — масштаб
Код:
from scipy.stats import gamma
alpha = 2
beta = 2
# Генерация данных
data = np.random.gamma(shape=alpha, scale=beta, size=10000)
Реальные примеры:
- Время ремонта оборудования
- Размер убытков в страховании
8. Распределение Вейбулла
Описание: Часто используется для моделирования времени жизни и надёжности.
Код:
from scipy.stats import weibull_min
c = 1.5 # Shape parameter
# Генерация данных
data = np.random.weibull(a=c, size=10000)
Реальные примеры:
- Надёжность компонентов
- Время до отказа оборудования
- Прогноз скорости ветра
9. Beta-распределение
Описание: Распределение для переменных в диапазоне [0, 1]. Очень гибкое, может принимать разные формы.
Код:
from scipy.stats import beta
alpha, beta_param = 2, 5
# Генерация данных для вероятности
data = np.random.beta(a=alpha, b=beta_param, size=10000)
Реальные примеры:
- Доля дефектных товаров в партии
- Вероятность клика на объявление
- Конверсионные коэффициенты
Тесты на нормальность
Важно проверить, нормально ли распределены данные перед использованием параметрических тестов:
from scipy.stats import shapiro, normaltest, kstest, anderson
data = np.random.normal(loc=100, scale=15, size=1000)
# Shapiro-Wilk тест (лучший для малых выборок)
stat, p_value = shapiro(data)
print(f"Shapiro-Wilk: p-value = {p_value:.4f}")
if p_value > 0.05:
print("Данные нормально распределены")
else:
print("Данные НЕ нормально распределены")
# Kolmogorov-Smirnov тест
stat, p_value = kstest(data, 'norm', args=(np.mean(data), np.std(data)))
# Anderson-Darling тест
result = anderson(data)
print(f"Anderson-Darling: statistic = {result.statistic}")
Как выбрать правильное распределение?
import matplotlib.pyplot as plt
from scipy import stats
def analyze_distribution(data):
"""Анализирует распределение данных"""
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
# Гистограмма
axes[0].hist(data, bins=50, density=True, alpha=0.7)
axes[0].set_title('Гистограмма')
# Q-Q plot (сравнение с нормальным распределением)
stats.probplot(data, dist="norm", plot=axes[1])
axes[1].set_title('Q-Q Plot')
plt.tight_layout()
plt.show()
# Статистика
skewness = stats.skew(data)
kurtosis = stats.kurtosis(data)
print(f"Асимметрия (skewness): {skewness:.3f}")
print(f"Эксцесс (kurtosis): {kurtosis:.3f}")
data = np.random.normal(loc=100, scale=15, size=10000)
analyze_distribution(data)
Таблица применения распределений
| Распределение | Тип данных | Когда использовать |
|---|---|---|
| Нормальное | Непрерывное | Большинство непрерывных величин |
| Биномиальное | Дискретное | Успех/неудача в n испытаниях |
| Пуассон | Дискретное | Количество событий в интервале |
| Экспоненциальное | Непрерывное | Время между событиями |
| Uniform | Непрерывное | Случайный выбор в диапазоне |
| Log-normal | Непрерывное | Доходы, цены, размеры |
| Гамма | Непрерывное | Время ожидания |
| Beta | Непрерывное [0,1] | Доли, вероятности |
Ключевые выводы
✅ Не все данные нормально распределены
✅ Выбор теста зависит от распределения
✅ Всегда визуализируй и проверяй распределение
✅ Log-normal часто встречается в реальности больше, чем нормальное
✅ Параметрические тесты требуют проверки предположений