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

Что такое разброс?

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

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

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

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

Что такое разброс?

Разброс (в контексте статистики и машинного обучения) обычно относится к двум связанным, но различным концепциям: дисперсии (variance) и стандартному отклонению (standard deviation). Это меры, характеризующие, насколько значения в наборе данных разбросаны или рассеяны вокруг среднего значения.

Стандартное отклонение (Standard Deviation)

Это наиболее распространённая мера разброса. Она показывает типичное расстояние значения от среднего:

import numpy as np
import pandas as pd

data = np.array([10, 15, 20, 25, 30])
mean = np.mean(data)  # 20
std = np.std(data)    # 7.07

print(f"Среднее: {mean}")
print(f"Стандартное отклонение: {std}")

# Используя pandas
df = pd.Series([10, 15, 20, 25, 30])
print(df.std())  # выборочное стандартное отклонение
print(df.std(ddof=0))  # население стандартное отклонение

Формула:

σ = √(Σ(xi - μ)² / N)   # для генеральной совокупности
s = √(Σ(xi - x̄)² / (n-1)) # для выборки (Бесселева поправка)

где:

  • σ — стандартное отклонение генеральной совокупности
  • xi — каждое значение
  • μ — среднее (математическое ожидание)
  • N — размер генеральной совокупности
  • s — выборочное стандартное отклонение
  • n — размер выборки

Дисперсия (Variance)

Дисперсия — это квадрат стандартного отклонения. Она показывает среднее квадратичное отклонение от среднего:

variance = np.var(data)  # 50
# или
variance = std ** 2  # 7.07² ≈ 50

print(f"Дисперсия: {variance}")

Связь:

Variance = Std² = σ²

Коэффициент вариации (Coefficient of Variation)

Это относительная мера разброса, полезна для сравнения разброса в данных с разными масштабами:

cv = (std / mean) * 100  # в процентах

print(f"Коэффициент вариации: {cv:.2f}%")

Размах (Range)

Простая, но грубая мера разброса — это разница между максимальным и минимальным значениями:

range_val = data.max() - data.min()
print(f"Размах: {range_val}")

Межквартильный размах (Interquartile Range, IQR)

Более робустная мера, менее чувствительная к выбросам:

Q1 = np.quantile(data, 0.25)
Q3 = np.quantile(data, 0.75)
IQR = Q3 - Q1

print(f"Q1: {Q1}, Q3: {Q3}, IQR: {IQR}")

Практические примеры разброса

1. Сравнение разброса в разных наборах данных

# Две группы студентов с одинаковым средним баллом (70)
group_a = np.array([65, 68, 70, 72, 75])  # более однородная
group_b = np.array([40, 60, 70, 80, 100]) # более разнородная

print(f"Группа A: среднее={np.mean(group_a)}, std={np.std(group_a):.2f}")
print(f"Группа B: среднее={np.mean(group_b)}, std={np.std(group_b):.2f}")

# Группа B имеет больший разброс баллов, хотя среднее одинаковое

2. Разброс в доходах сотрудников

salaries = pd.DataFrame({
    "department": ["IT", "IT", "IT", "HR", "HR", "HR"],
    "salary": [80000, 85000, 90000, 40000, 42000, 45000]
})

# Разброс по отделам
grouped = salaries.groupby("department")["salary"].agg(["mean", "std"])
print(grouped)
# IT имеет больший разброс зарплат, чем HR

3. Оценка стабильности процесса (контрольные карты)

# Производство с высокой и низкой вариативностью
production_a = np.random.normal(100, 2, 100)  # среднее=100, std=2
production_b = np.random.normal(100, 10, 100) # среднее=100, std=10

print(f"Процесс A стабильнее (меньший разброс)")

Разброс в машинном обучении

В контексте bias-variance:

# Высокая variance (разброс предсказаний)
predictions_var = np.array([10.1, 10.5, 9.8, 10.2, 10.6])
actual = 10.0

# Высокий bias (смещение), низкая variance
predictions_bias = np.array([15, 15, 15, 15, 15])

print(f"Variance разброса: {np.var(predictions_var):.2f}")
print(f"Bias (смещение): {np.mean(predictions_bias) - actual}")

Регуляризация для контроля разброса:

from sklearn.linear_model import Ridge, Lasso

# Ridge регрессия контролирует (уменьшает) variance
ridge = Ridge(alpha=1.0)  # Высокий alpha → низкий variance, высокий bias

# Lasso может обнулять коэффициенты
lasso = Lasso(alpha=0.1)

Визуализация разброса

import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# Низкий разброс
data1 = np.random.normal(100, 5, 1000)
ax1.hist(data1, bins=30, alpha=0.7)
ax1.axvline(np.mean(data1), color="r", label=f"mean={np.mean(data1):.1f}")
ax1.axvline(np.mean(data1) + np.std(data1), color="g", linestyle="--", 
           label=f"std={np.std(data1):.1f}")
ax1.set_title("Низкий разброс (std=5)")
ax1.legend()

# Высокий разброс
data2 = np.random.normal(100, 20, 1000)
ax2.hist(data2, bins=30, alpha=0.7)
ax2.axvline(np.mean(data2), color="r", label=f"mean={np.mean(data2):.1f}")
ax2.axvline(np.mean(data2) + np.std(data2), color="g", linestyle="--",
           label=f"std={np.std(data2):.1f}")
ax2.set_title("Высокий разброс (std=20)")
ax2.legend()

plt.show()

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

  1. Разброс важен — одно только среднее значение может быть заблуждающим
  2. Стандартное отклонение — самая частая мера разброса
  3. Интерпретация: примерно 68% данных находятся в диапазоне ±1σ от среднего
  4. Робустные меры — IQR менее чувствителен к выбросам, чем std
  5. Контекст важен — в разных полях используются разные меры разброса

Разброс — это фундаментальное свойство данных, которое помогает понять их характер и качество.