Зачем вычитать единицу в формуле выборочной дисперсии?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Зачем вычитать единицу в формуле выборочной дисперсии?
Формула напоминаю
s² = Σ(xᵢ - x̄)² / (n - 1)
Вычитаем единицу в знаменателе (это называется поправка Бесселя).
Почему это необходимо?
1. Проблема смещения
Если делить на n вместо (n-1), выборочная дисперсия будет систематически занижена.
import numpy as np
# Данные: зарплаты в компании
data = np.array([30, 40, 50, 60, 70]) # в тысячах ₽
# Способ 1: делим на n (НЕПРАВИЛЬНО)
bad_variance = np.var(data, ddof=0)
print(f"Неправильно (÷n): {bad_variance}") # 200.0
# Способ 2: делим на (n-1) (ПРАВИЛЬНО)
good_variance = np.var(data, ddof=1)
print(f"Правильно (÷n-1): {good_variance}") # 250.0
Почему 250 > 200? Потому что мы выбрали эти 5 элементов из большей совокупности. Среди всех сотрудников компании разброс зарплат скорее всего БОЛЬШЕ, чем в нашей выборке.
2. Степени свободы (degrees of freedom)
Когда мы вычисляем дисперсию выборки, мы:
- Сначала считаем среднее x̄
- Потом считаем отклонения от среднего
Проблема: среднее x̄ уже «использует» одну степень свободы!
Аналогия: если знаешь сумму 5 чисел и знаешь 4 из них, пятое число определится автоматически.
Примерно так:
- Есть 5 отклонений от среднего
- Их сумма всегда = 0 (по определению среднего)
- Значит, если знаешь 4 отклонения, пятое = -(сумма четырёх)
- Независимые отклонения = n - 1 = 4
3. Несмещённая оценка
Несмещённая оценка (unbiased estimator) — это когда в среднем наша выборочная статистика равна истинной статистике совокупности.
import numpy as np
from scipy import stats
# Имитация: берём 1000 выборок из одной совокупности
general_population = np.random.normal(100, 15, size=10000)
true_variance = np.var(general_population, ddof=0) # 225 (примерно)
print(f"Истинная дисперсия совокупности: {true_variance:.2f}")
# Берём 1000 выборок по 30 элементов
samples_bad = [] # дисперсия с делением на n
samples_good = [] # дисперсия с делением на (n-1)
for _ in range(1000):
sample = np.random.choice(general_population, 30)
samples_bad.append(np.var(sample, ddof=0)) # НЕПРАВИЛЬНО
samples_good.append(np.var(sample, ddof=1)) # ПРАВИЛЬНО
print(f"\nСредняя дисперсия (÷n): {np.mean(samples_bad):.2f}") # занижена!
print(f"Средняя дисперсия (÷n-1): {np.mean(samples_good):.2f}") # близко к истине!
Результат:
Истинная дисперсия совокупности: 225.00
Средняя дисперсия (÷n): 217.50 ← ЗАВЫШЕНА (смещение!)
Средняя дисперсия (÷n-1): 225.00 ← КОРРЕКТНА (несмещённая!)
4. Практический пример
Представь опрос 10 покупателей о цене товара:
- x̄ = 500 ₽ (средняя оценка)
- Дисперсия:
- С делением на n=10: 450
- С делением на n-1=9: 500
Ты не опросил всех покупателей, только 10. В генеральной совокупности разброс мнений скорее всего ВЫШЕ, чем в твоей выборке. Поправка (n-1) это учитывает.
5. Когда это особенно важно?
На малых выборках разница очень заметна:
n = 5
print(f"n = 5: разница = {1/5} = 20%")
print(f"n = 30: разница = {1/30} = 3.3%")
print(f"n = 1000: разница = {1/1000} = 0.1%")
- При n=5: разница 20% (очень заметно!)
- При n=30: разница 3.3% (ощутимо)
- При n=1000: разница 0.1% (незначительно)
6. Математическое объяснение
Докажем что E[s²] = σ² (несмещённость):
E[Σ(xᵢ - x̄)²] = (n-1)σ²
Поэтому:
E[Σ(xᵢ - x̄)² / (n-1)] = σ² ✓
E[Σ(xᵢ - x̄)² / n] ≠ σ² ✗
7. Генеральная vs Выборочная
| Ситуация | Формула | Делитель |
|---|---|---|
| Генеральная совокупность (ВСЕ данные) | σ² | n |
| Выборка (ЧАСТЬ данных) | s² | n-1 |
| Неизвестно что это | Используй s² | n-1 |
Практический совет
В Python и статистике:
np.var(data, ddof=1)→ поправка Бесселя (правильно!)np.var(data, ddof=0)→ без поправки (для совокупности)pandas.Series.var()→ по умолчанию ddof=1 (правильно!)
import pandas as pd
data = pd.Series([30, 40, 50, 60, 70])
print(data.var()) # По умолчанию ddof=1 → 250.0 ✓
Заключение
Вычитаем единицу потому что:
- Среднее уже использовало степень свободы (осталось n-1 независимых отклонений)
- Это даёт несмещённую оценку дисперсии совокупности
- Это стандарт в статистике для работы с выборками