Нашли ошибку?
среднийNumPy 2.5.3

Статистика

Среднее, медиана, стандартное отклонение, перцентили, взвешенное среднее и корреляция.

Нужно знать:Базовые агрегацииОси: axis и keepdims

Содержание статьи

Коротко

  • mean — среднее, median — медиана (устойчива к выбросам).
  • std и var по умолчанию делят на n (ddof=0). Выборочная оценка — ddof=1; так по умолчанию считает pandas.
  • percentile(a, q) — перцентили в процентах (0–100), quantile(a, q) — то же в долях (0–1). Способ интерполяции задаёт method.
  • average(a, weights=w) — взвешенное среднее.
  • corrcoef(x, y) возвращает матрицу 2 × 2; сам коэффициент — элемент [0, 1]. Ковариация — cov.
  • Все функции принимают axis; с пропусками — nanmean, nanmedian, nanpercentile…

Синтаксис

np.mean(a, axis=None), np.median(a, axis=None)
np.std(a, axis=None, ddof=0), np.var(a, ddof=0)
np.percentile(a, q, axis=None, method="linear")   # q в 0–100
np.quantile(a, q, method="linear")                # q в 0–1
np.average(a, weights=None)
np.corrcoef(x, y)[0, 1]

Параметры

ПараметрЧто делаетПо умолчанию
ddofпоправка в знаменателе: делится на n − ddof0
qуровень: число или список; 0–100 в percentile, 0–1 в quantileобязательный
methodспособ взять значение между точками: 'linear', 'lower', 'higher', 'nearest', 'midpoint'…'linear'
weightsвеса для average той же формы, что данныеNone

Примеры

Данные для примеровиспользуются во всех примерах ниже
salaries = np.array([52, 48, 61, 55, 300, 58, 50])   # тыс. руб.; один руководитель
Среднее и медиана
print(np.mean(salaries))       # выброс сильно тянет среднее
np.median(salaries)            # медиана устойчива к выбросам
Вывод
89.14285714285714
np.float64(55.0)
Перцентили и квантили
print(np.percentile(salaries, [25, 50, 75]))
np.quantile(salaries, 0.9)     # то же, но в долях
Вывод
[51.  55.  59.5]
np.float64(156.60000000000008)
Способ интерполяции
data = np.array([1, 2, 3, 4])
print(np.percentile(data, 50))                    # linear: между 2 и 3
np.percentile(data, 50, method="lower")           # ближайшее снизу из данных
Вывод
2.5
np.int64(2)
Взвешенное среднее
grades = np.array([5, 4, 3])
weights = np.array([2, 1, 1])  # вес оценки
np.average(grades, weights=weights)
Вывод
np.float64(4.25)
Корреляция и ковариация
hours = np.array([1, 2, 3, 4, 5])
score = np.array([52, 55, 61, 70, 74])
print(np.corrcoef(hours, score).round(3))         # матрица 2 × 2
np.cov(hours, score)
Вывод
[[1.    0.987]
 [0.987 1.   ]]
array([[ 2.5 , 14.75],
       [14.75, 89.3 ]])

Подводные камни

std в NumPy и pandas отличается

np.std по умолчанию ddof=0, а Series.std() в pandas — ddof=1. На маленьких выборках разница заметна.

ddof=0 и ddof=1
print(np.std(salaries))        # ddof=0 — по генеральной совокупности
np.std(salaries, ddof=1)       # ddof=1 — выборочное, как в pandas
Вывод
86.18324094862159
np.float64(93.08853952273712)

Параметр interpolation удалён

Старый параметр interpolationошибка: TypeError
np.percentile(salaries, 50, interpolation="lower")
Ошибка
TypeError: percentile() got an unexpected keyword argument 'interpolation'