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

Что такое закон больших чисел?

2.0 Middle🔥 121 комментариев
#Статистика и теория вероятностей

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

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

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

Закон больших чисел

Закон больших чисел (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)?
  • Достаточно ли времени для сходимости?

Ограничения закона больших чисел

  1. Требуется независимость: если события коррелированы, LLN не применяется
  2. Требуется одинаковое распределение: если параметры меняются, LLN не работает
  3. Требуется конечное ожидание: для некоторых распределений (например, Парето) LLN может не применяться
  4. Сходимость медленная: может потребоваться очень большой размер выборки

Вывод

Закон больших чисел — это математическая гарантия того, что с ростом данных наши оценки становятся точнее. Это фундамент для:

  • A/B тестирования
  • Выборочного обследования
  • Оценки метрик в аналитике
  • Машинного обучения (обобщаемость модели)

Практически, это означает: если вы видите странный результат на малой выборке, соберите больше данных перед принятием решения.

Что такое закон больших чисел? | PrepBro