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

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

1.0 Junior🔥 131 комментариев
#Статистика и A/B тестирование

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

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

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

Закон больших чисел (Law of Large Numbers)

Закон больших чисел — фундаментальный закон теории вероятности, который утверждает, что при увеличении количества независимых испытаний выборочное среднее сходится к математическому ожиданию (истинному среднему).

Другими словами: если провести достаточно много экспериментов, среднее значение результатов будет очень близко к теоретическому среднему.

Математическое определение

Слабый закон больших чисел (Weak LLN): Для последовательности независимых одинаково распределённых случайных величин X1, X2, ... с математическим ожиданием μ:

lim P(|X̄n - μ| > ε) = 0 при n → ∞

Где X̄n = (X1 + X2 + ... + Xn) / n — выборочное среднее

Сильный закон больших чисел (Strong LLN): Выборочное среднее почти наверняка сходится к μ:

P(lim X̄n = μ) = 1 при n → ∞

Практический пример: Бросание монеты

import numpy as np
import matplotlib.pyplot as plt

# Симулируем броски монеты (1 = орёл, 0 = решка)
np.random.seed(42)
trials = 10000
coin_flips = np.random.binomial(1, 0.5, trials)

# Вычисляем выборочное среднее по мере накопления данных
sample_means = np.cumsum(coin_flips) / np.arange(1, trials + 1)

# Визуализируем сходимость
plt.figure(figsize=(12, 6))
plt.plot(sample_means, linewidth=1, alpha=0.7, label='Sample mean')
plt.axhline(y=0.5, color='r', linestyle='--', linewidth=2, label='True mean (μ=0.5)')
plt.xlabel('Number of trials')
plt.ylabel('Sample mean')
plt.title('Law of Large Numbers: Coin Flip')
plt.legend()
plt.grid(True, alpha=0.3)
plt.xscale('log')
plt.show()

print(f"После 10 бросков: {sample_means[9]:.3f}")
print(f"После 100 бросков: {sample_means[99]:.3f}")
print(f"После 1000 бросков: {sample_means[999]:.3f}")
print(f"После 10000 бросков: {sample_means[-1]:.3f}")
print(f"Истинное значение: 0.500")

Применение в Monte Carlo моделировании

# Оценка числа π с помощью Monte Carlo
def estimate_pi(n_samples):
    """Генерируем случайные точки в единичном квадрате
    и считаем, сколько попадают в четверть круга"""
    
    # Генерируем случайные координаты
    x = np.random.uniform(0, 1, n_samples)
    y = np.random.uniform(0, 1, n_samples)
    
    # Расстояние от начала координат
    distance = np.sqrt(x**2 + y**2)
    
    # Доля точек внутри круга
    inside_circle = np.sum(distance <= 1)
    
    # π ≈ 4 * (площадь круга / площадь квадрата)
    pi_estimate = 4 * inside_circle / n_samples
    return pi_estimate

# Демонстрируем LLN
sample_sizes = [100, 1000, 10000, 100000, 1000000]
pi_estimates = [estimate_pi(n) for n in sample_sizes]

for n, pi_est in zip(sample_sizes, pi_estimates):
    error = abs(pi_est - np.pi)
    print(f"n={n:7d}: π ≈ {pi_est:.6f}, error = {error:.6f}")

print(f"\nПри увеличении количества выборок, ошибка уменьшается!")

Практический пример: Оценка среднего дохода

# Реальный сценарий: оценка среднего дохода в городе
np.random.seed(42)

# Истинное распределение доходов
true_mean = 50000  # рублей
true_std = 15000

# Случайная выборка респондентов
incomes = np.random.normal(true_mean, true_std, 10000)

# Средний доход при разных размерах выборки
sample_sizes = [10, 50, 100, 500, 1000, 5000]
means = []

for size in sample_sizes:
    sample_mean = np.mean(incomes[:size])
    means.append(sample_mean)
    error = abs(sample_mean - true_mean)
    print(f"Выборка {size:4d}: среднее = {sample_mean:8.2f}, ошибка = {error:7.2f}")

# Визуализируем
plt.figure(figsize=(10, 6))
plt.plot(sample_sizes, means, 'o-', linewidth=2, markersize=8)
plt.axhline(y=true_mean, color='r', linestyle='--', linewidth=2, label='True mean')
plt.xlabel('Sample size')
plt.ylabel('Sample mean')
plt.title('Convergence to True Mean')
plt.xscale('log')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

Применение в машинном обучении

1. Оценка ошибки модели

from sklearn.metrics import accuracy_score

# ЗБЧ гарантирует, что при достаточно большой выборке
# оценка на test наборе близка к истинной ошибке

def estimate_generalization_error(model, X_test, y_test, n_iterations=1000):
    """Оцениваем generalization error с помощью LLN"""
    accuracies = []
    
    for _ in range(n_iterations):
        # Случайная выборка из test набора (с заменой)
        indices = np.random.choice(len(X_test), len(X_test), replace=True)
        X_sample = X_test[indices]
        y_sample = y_test[indices]
        
        # Вычисляем accuracy
        y_pred = model.predict(X_sample)
        acc = accuracy_score(y_sample, y_pred)
        accuracies.append(acc)
    
    mean_accuracy = np.mean(accuracies)
    std_accuracy = np.std(accuracies)
    
    return mean_accuracy, std_accuracy

2. Доверительные интервалы

# ЗБЧ и центральная предельная теорема позволяют вычислить доверительные интервалы

def calculate_confidence_interval(data, confidence=0.95):
    """Вычисляем доверительный интервал для среднего"""
    n = len(data)
    mean = np.mean(data)
    std_error = np.std(data, ddof=1) / np.sqrt(n)
    
    # Z-значение для 95% доверительного интервала
    z = 1.96  # для 95%
    
    margin_of_error = z * std_error
    ci_lower = mean - margin_of_error
    ci_upper = mean + margin_of_error
    
    return mean, ci_lower, ci_upper, std_error

# Пример
data = np.random.normal(100, 15, 1000)
mean, ci_lower, ci_upper, se = calculate_confidence_interval(data)

print(f"Mean: {mean:.2f}")
print(f"95% CI: [{ci_lower:.2f}, {ci_upper:.2f}]")
print(f"Standard error: {se:.2f}")

Важные связи

Центральная предельная теорема (CLT): Сумма независимых случайных величин приблизительно нормально распределена, независимо от распределения исходных величин.

Закон итерированного логарифма: Уточняет скорость сходимости в ЗБЧ

Неравенство Чебышёва: Дает верхнюю границу вероятности отклонения от среднего

# Неравенство Чебышёва
def chebyshev_bound(variance, deviation):
    """P(|X - μ| > d) <= σ² / d²"""
    return variance / (deviation ** 2)

variance = 100
deviation = 10
bound = chebyshev_bound(variance, deviation)
print(f"P(|X - μ| > 10) <= {bound:.2f}")  # <= 1.0

Лучшие практики в Data Science

  • Убедись, что выборка достаточно большая для сходимости
  • Проверяй распределение данных перед применением LLN
  • Используй ЗБЧ для обоснования вычисления доверительных интервалов
  • Помни о требовании независимости выборок
  • При наличии смещения выборки, ЗБЧ не гарантирует сходимость к истинному среднему

Закон больших чисел — основа статистического вывода и обоснование использования выборок для оценки параметров популяции.