Что такое закон больших чисел?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Закон больших чисел
Закон больших чисел (Law of Large Numbers, LLN) — это фундаментальный принцип теории вероятностей, который утверждает, что по мере увеличения количества испытаний среднее значение результатов приближается к математическому ожиданию (истинному среднему). Это один из самых важных принципов для статистического анализа и аналитики данных.
Простое объяснение
Представьте, что вы бросаете монету:
- При 10 бросаниях вы можете получить 7 орлов и 3 решки (70% орлов)
- При 100 бросаниях результат ближе к 50/50
- При 10,000 бросаниях результат очень близок к 50/50 (математическому ожиданию)
Чем больше данных — тем точнее среднее значение представляет истинное распределение.
Математическое определение
Слабый закон больших чисел (Weak LLN):
Для последовательности независимых случайных величин X₁, X₂, ..., Xₙ с одинаковым ожиданием μ:
lim(n→∞) P(|X̄ₙ - μ| > ε) = 0 для любого ε > 0
Где X̄ₙ = (X₁ + X₂ + ... + Xₙ) / n — выборочное среднее.
Сильный закон больших чисел (Strong LLN):
P(lim(n→∞) X̄ₙ = μ) = 1
С вероятностью 1, выборочное среднее сходится к математическому ожиданию.
Практический Python пример
import numpy as np
import matplotlib.pyplot as plt
# Демонстрация закона больших чисел
np.random.seed(42)
# Вероятность события = 0.3 (истинное значение)
p_true = 0.3
n_trials = 10000
# Генерируем случайные события (1 если успех, 0 если нет)
events = np.random.binomial(1, p_true, n_trials)
# Вычисляем cumulative average
cumulative_mean = np.cumsum(events) / (np.arange(1, n_trials + 1))
# Визуализация
plt.figure(figsize=(14, 6))
plt.plot(cumulative_mean, label='Выборочное среднее', alpha=0.7)
plt.axhline(y=p_true, color='r', linestyle='--', linewidth=2, label=f'Истинное значение ({p_true})')
plt.xlabel('Количество испытаний (n)')
plt.ylabel('Вероятность события')
plt.title('Закон больших чисел: сходимость выборочного среднего к истинному')
plt.xscale('log') # Логарифмическая шкала для лучшей видимости
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
print(f"Истинная вероятность: {p_true}")
print(f"Выборочное среднее (n=100): {cumulative_mean[99]:.4f}")
print(f"Выборочное среднее (n=1000): {cumulative_mean[999]:.4f}")
print(f"Выборочное среднее (n=10000): {cumulative_mean[9999]:.4f}")
Вывод:
Истинная вероятность: 0.3
Выборочное среднее (n=100): 0.3400
Выборочное среднее (n=1000): 0.2950
Выборочное среднее (n=10000): 0.3021
Приложение в бизнес-аналитике
1. Конверсия в A/B тестировании
-- День 1: 2 конверсии из 10 (20%)
SELECT
DATE(created_at) as day,
COUNT(DISTINCT user_id) as users,
COUNT(CASE WHEN converted = true THEN 1 END) as conversions,
ROUND(100.0 * COUNT(CASE WHEN converted THEN 1 END) / COUNT(*), 2) as conversion_rate
FROM user_events
GROUP BY DATE(created_at)
ORDER BY day;
-- День 1: 2/10 = 20% (может быть шум)
-- День 30: 1000/3000 = 33.3% (близко к истинному значению)
-- День 365: 10000/30000 = 33.33% (очень близко к истинному)
2. Оценка среднего чека (Average Order Value)
import pandas as pd
# Загрузить данные о заказах
orders = pd.read_csv('orders.csv')
# Вычислить cumulative average order value
orders = orders.sort_values('order_date')
orders['cumulative_aov'] = orders['amount'].expanding().mean()
# Визуализация
plt.figure(figsize=(12, 6))
plt.plot(orders['order_date'], orders['cumulative_aov'], label='Cumulative AOV')
plt.ylabel('Average Order Value ($)')
plt.xlabel('Дата')
plt.title('Сходимость AOV к истинному значению')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
# Ранние данные: большая волатильность
# Поздние данные: стабилизируется
print(f"AOV (первые 10 заказов): ${orders['cumulative_aov'].iloc[9]:.2f}")
print(f"AOV (первые 100 заказов): ${orders['cumulative_aov'].iloc[99]:.2f}")
print(f"AOV (все заказы): ${orders['cumulative_aov'].iloc[-1]:.2f}")
3. Надёжность выборочных метрик
# Проверить надёжность результатов с малой выборкой
def simulate_conversion_rate(true_rate, sample_size, num_simulations=1000):
"""
Симулировать множество A/B тестов с малым sample size
и посмотреть, как часто результаты ошибочны
"""
results = []
for _ in range(num_simulations):
# Генерировать случайный результат
successes = np.random.binomial(sample_size, true_rate)
observed_rate = successes / sample_size
results.append(observed_rate)
return results
# Истинная конверсия = 5%
true_conversion = 0.05
# Малая выборка (100 пользователей)
small_sample_results = simulate_conversion_rate(true_conversion, 100)
# Большая выборка (10000 пользователей)
large_sample_results = simulate_conversion_rate(true_conversion, 10000)
print(f"Истинная конверсия: {true_conversion * 100}%")
print(f"\nСредняя конверсия при n=100: {np.mean(small_sample_results) * 100:.2f}%")
print(f"Std Dev при n=100: {np.std(small_sample_results) * 100:.2f}%")
print(f"Диапазон (95%): {np.percentile(small_sample_results, 2.5) * 100:.2f}% - {np.percentile(small_sample_results, 97.5) * 100:.2f}%")
print(f"\nСредняя конверсия при n=10000: {np.mean(large_sample_results) * 100:.2f}%")
print(f"Std Dev при n=10000: {np.std(large_sample_results) * 100:.2f}%")
print(f"Диапазон (95%): {np.percentile(large_sample_results, 2.5) * 100:.2f}% - {np.percentile(large_sample_results, 97.5) * 100:.2f}%")
# Результат:
# При n=100: диапазон может быть 1% - 9% (много шума)
# При n=10000: диапазон будет 4.5% - 5.5% (стабильнее)
Важные следствия закона больших чисел
1. Волатильность уменьшается с размером выборки
Средняя ошибка ≈ σ / √n
Где σ — стандартное отклонение, n — размер выборки
Примеры:
- n=100: ошибка ≈ σ / 10
- n=400: ошибка ≈ σ / 20 (в 2 раза меньше)
- n=10000: ошибка ≈ σ / 100 (в 10 раз меньше)
2. Доверительные интервалы сужаются
from scipy import stats
# Доверительный интервал для пропорции
def ci_proportion(success, total, confidence=0.95):
p = success / total
z = stats.norm.ppf((1 + confidence) / 2)
se = np.sqrt(p * (1 - p) / total)
return p - z * se, p + z * se
p = 0.5 # Истинная пропорция
for n in [100, 1000, 10000]:
successes = np.random.binomial(n, p)
lower, upper = ci_proportion(successes, n)
width = upper - lower
print(f"n={n:5d}: 95% CI = [{lower:.4f}, {upper:.4f}], ширина = {width:.4f}")
# Результат:
# n= 100: 95% CI = [0.3894, 0.6106], ширина = 0.2212
# n= 1000: 95% CI = [0.4693, 0.5307], ширина = 0.0614
# n=10000: 95% CI = [0.4906, 0.5094], ширина = 0.0188
3. Критический размер выборки (Sample Size)
from statsmodels.stats.proportion import proportions_ztest
# Для A/B теста нужен минимальный размер
# Чтобы обнаружить эффект с вероятностью 80%
# Базовая конверсия = 5%, хотим обнаружить лифт 20% (5% → 6%)
baseline = 0.05
lift = 1.20
expected = baseline * lift
# Расчёт необходимого размера выборки
alpha = 0.05 # 5% significance level
beta = 0.20 # 20% Type II error (80% power)
from scipy.stats import norm
z_alpha = norm.ppf(1 - alpha/2)
z_beta = norm.ppf(1 - beta)
p1 = baseline
p2 = expected
n = 2 * (z_alpha + z_beta)**2 * (p1*(1-p1) + p2*(1-p2)) / (p2 - p1)**2
print(f"Необходимый размер выборки: {int(n)} на группу")
print(f"Общий: {int(2*n)}")
# С ростом n достигаем точность детектирования эффекта
Практический чеклист
Для анализа метрик:
- Достаточно ли данных? (проверить размер выборки)
- Волатильна ли метрика? (проверить std dev)
- Тренд или шум? (смотреть cumulative average)
- Когда метрика стабилизируется? (когда LLN начинает работать)
Для A/B тестирования:
- Рассчитан ли необходимый sample size?
- Достигнут ли требуемый sample size перед анализом?
- Не останавливаемся ли раньше плана (Peeking Problem)?
- Достаточно ли времени для сходимости?
Ограничения закона больших чисел
- Требуется независимость: если события коррелированы, LLN не применяется
- Требуется одинаковое распределение: если параметры меняются, LLN не работает
- Требуется конечное ожидание: для некоторых распределений (например, Парето) LLN может не применяться
- Сходимость медленная: может потребоваться очень большой размер выборки
Вывод
Закон больших чисел — это математическая гарантия того, что с ростом данных наши оценки становятся точнее. Это фундамент для:
- A/B тестирования
- Выборочного обследования
- Оценки метрик в аналитике
- Машинного обучения (обобщаемость модели)
Практически, это означает: если вы видите странный результат на малой выборке, соберите больше данных перед принятием решения.