Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое разброс?
Разброс (в контексте статистики и машинного обучения) обычно относится к двум связанным, но различным концепциям: дисперсии (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()
Ключевые выводы
- Разброс важен — одно только среднее значение может быть заблуждающим
- Стандартное отклонение — самая частая мера разброса
- Интерпретация: примерно 68% данных находятся в диапазоне ±1σ от среднего
- Робустные меры — IQR менее чувствителен к выбросам, чем std
- Контекст важен — в разных полях используются разные меры разброса
Разброс — это фундаментальное свойство данных, которое помогает понять их характер и качество.