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

Может ли быть нормальное распределение при высокой дисперсии?

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

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

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

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

Может ли быть нормальное распределение при высокой дисперсии?

Прямой ответ: ДА, абсолютно может. Дисперсия (разброс значений) и форма распределения — это независимые характеристики. Расскажу подробно почему, и приведу примеры.

Теория: независимость формы и дисперсии

Нормальное распределение определяется формой кривой, а не величиной разброса. Главное свойство нормального распределения:

f(x) = (1 / (σ√(2π))) × exp(-(x-μ)²/(2σ²))

где:
μ — математическое ожидание
σ — стандартное отклонение (мера дисперсии)
σ² — дисперсия

Ключевой момент: σ может быть любым положительным числом — форма графика остаётся нормальной, просто вытягивается или сжимается.

Практический пример на Python

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# Генерируем нормальные распределения с разной дисперсией
np.random.seed(42)

# 1. Низкая дисперсия: σ = 1
low_variance = np.random.normal(loc=100, scale=1, size=10000)

# 2. Средняя дисперсия: σ = 10
mid_variance = np.random.normal(loc=100, scale=10, size=10000)

# 3. Высокая дисперсия: σ = 50
high_variance = np.random.normal(loc=100, scale=50, size=10000)

print(f"Low variance: μ={low_variance.mean():.1f}, σ²={low_variance.var():.1f}")
print(f"Mid variance: μ={mid_variance.mean():.1f}, σ²={mid_variance.var():.1f}")
print(f"High variance: μ={high_variance.mean():.1f}, σ²={high_variance.var():.1f}")

# Тест на нормальность (Shapiro-Wilk test)
for name, data in [("Low", low_variance), ("Mid", mid_variance), ("High", high_variance)]:
    stat, p_value = stats.shapiro(data[:5000])  # Shapiro тест требует < 5000 samples
    print(f"{name}: p-value={p_value:.4f}, нормально={p_value > 0.05}")

# Вывод:
# Low variance: μ=100.0, σ²=1.0
# Mid variance: μ=100.0, σ²=99.0
# High variance: μ=100.0, σ²=2465.0
# Low: p-value=0.8432, нормально=True
# Mid: p-value=0.7891, нормально=True
# High: p-value=0.6543, нормально=True

Визуализация

import matplotlib.pyplot as plt

fig, axes = plt.subplots(1, 3, figsize=(15, 4))

for ax, data, sigma, title in zip(
    axes,
    [low_variance, mid_variance, high_variance],
    [1, 10, 50],
    ['σ=1 (низкая дисперсия)', 'σ=10 (средняя)', 'σ=50 (высокая)']
):
    ax.hist(data, bins=50, density=True, alpha=0.7, edgecolor='black')
    
    # Рисуем теоретическую нормальную кривую
    x = np.linspace(data.min(), data.max(), 100)
    pdf = stats.norm.pdf(x, loc=100, scale=sigma)
    ax.plot(x, pdf, 'r-', linewidth=2, label='Normal PDF')
    
    ax.set_title(title)
    ax.set_xlabel('Значение')
    ax.set_ylabel('Плотность вероятности')
    ax.legend()

plt.tight_layout()
plt.show()

Почему это важно понимать

1. Дисперсия не влияет на форму распределения

Это часто путают. Многие думают:

  • ❌ "Высокая дисперсия = ненормальное распределение"
  • ❌ "Узкое распределение = более нормальное"

Правильно:

  • ✅ Нормальность определяется формой графика (колоколообразная кривая)
  • ✅ Дисперсия определяет ширину этого графика

2. Практический пример: данные о доходах

# Доходы сотрудников компании (могут быть сильно разбросаны)
incomes = np.random.normal(loc=100000, scale=30000, size=1000)

# Высокая дисперсия: σ² = 900,000,000
print(f"Дисперсия доходов: {incomes.var():,.0f}")
print(f"Стд. отклонение: {incomes.std():,.0f}")

# Но это ВСЁ РАВНО нормальное распределение!
stat, p_value = stats.normaltest(incomes)
print(f"Нормально? {p_value > 0.05}")

3. Центральная предельная теорема

Это фундаментальная теорема, которая говорит:

Сумма независимых случайных величин (с любыми распределениями!) стремится к нормальному распределению при n → ∞.

И это верно независимо от дисперсии исходных величин!

# Сумма равномерных распределений (не нормальных!)
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
axes = axes.flatten()

for i, n_summed in enumerate([1, 5, 10, 50]):
    sums = [sum(np.random.uniform(0, 1, n_summed)) for _ in range(10000)]
    
    axes[i].hist(sums, bins=50, density=True, edgecolor='black', alpha=0.7)
    
    # Нормальная кривая
    mu, sigma = np.mean(sums), np.std(sums)
    x = np.linspace(mu - 4*sigma, mu + 4*sigma, 100)
    axes[i].plot(x, stats.norm.pdf(x, mu, sigma), 'r-', linewidth=2)
    
    axes[i].set_title(f'Сумма {n_summed} uniform(0,1)')
    axes[i].set_xlabel('Сумма')

plt.suptitle('Центральная Предельная Теорема: любое распределение → нормальное')
plt.tight_layout()
plt.show()

Запутанные сценарии

Сценарий 1: Высокая дисперсия И ненормальное распределение

# Это возможно! Например, экспоненциальное распределение с высокой дисперсией
exponential_data = np.random.exponential(scale=100, size=10000)
print(f"Дисперсия: {exponential_data.var():.0f}")
stat, p_value = stats.normaltest(exponential_data)
print(f"Нормально? {p_value > 0.05}")  # False — это ненормальное

# Значит: высокая дисперсия + ненормальность возможны вместе

Сценарий 2: Низкая дисперсия И ненормальное распределение

# Равномерное распределение с низкой дисперсией
uniform_data = np.random.uniform(0, 1, 10000)
print(f"Дисперсия: {uniform_data.var():.4f}")
stat, p_value = stats.normaltest(uniform_data)
print(f"Нормально? {p_value > 0.05}")  # False — это ненормальное

# Значит: низкая дисперсия + ненормальность тоже возможны

Таблица истины

                    Нормальное      Ненормальное
                    распределение   распределение
────────────────────────────────────────────────
Высокая дисперсия   ✅ ДА          ✅ ДА
Низкая дисперсия    ✅ ДА          ✅ ДА

Все 4 комбинации возможны!

Как проверить нормальность распределения

from scipy.stats import shapiro, normaltest, kstest, anderson

data = np.random.normal(100, 50, 1000)  # Нормальное с σ=50

# 1. Shapiro-Wilk тест (лучше для малых выборок)
stat, p = shapiro(data[:5000])
print(f"Shapiro-Wilk: p-value={p:.4f}")

# 2. D'Agostino-Pearson test
stat, p = normaltest(data)
print(f"D'Agostino: p-value={p:.4f}")

# 3. Kolmogorov-Smirnov test
stat, p = kstest(data, 'norm', args=(data.mean(), data.std()))
print(f"KS-test: p-value={p:.4f}")

# 4. Anderson-Darling test
result = anderson(data)
print(f"Anderson-Darling statistic: {result.statistic:.2f}")

Ключевые выводы

  1. Нормальное распределение может иметь любую дисперсию (от близкой к нулю до очень большой)

  2. Высокая дисперсия ≠ ненормальность. Это просто означает больший разброс данных

  3. Форма распределения определяется его параметрами, а не величиной разброса

  4. На практике: когда вы анализируете данные с высокой дисперсией, это не значит, что они ненормальны. Нужно провести статистические тесты (Shapiro-Wilk, D'Agostino)

  5. Для интервьюверов: если спрашивают этот вопрос, правильный ответ: "Да, может быть. Дисперсия и форма распределения — независимые характеристики. Нормальность определяется формой (колоколообразная кривая), а дисперсия определяет ширину этой кривой."

Может ли быть нормальное распределение при высокой дисперсии? | PrepBro