Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs
Продолжаем
рассматривать наиболее используемые функции модуля statistics и следующая
секция посвящена измерению меры разброса случайных величин.
|
Функция
|
Описание
|
|
mean(data)
|
среднее
арифметическое значений data
|
|
fmean(data,
weights=None)
|
быстрое
выполнение вычислений среднего арифметическое вещественных чисел с
возможностью указания весов weights
|
|
median(data)
|
возвращает
медианное значение последовательности data
|
|
median_low(data), median_high(data)
|
возвращают
наименьшее и наибольшее медианные значения (актуально для последовательностей
data с четным
числом элементов)
|
|
mode(data)
|
мода
последовательности чисел data
|
|
multimode(data)
|
возвращает
несколько модальных значений (наиболее часто встречающихся)
|
|
geometric_mean(data)
|
геометрическое
среднее значений data
|
|
harmonic_mean(data, weights=None)
|
гармоническое
среднее значений data с возможностью указания весов weights
|
|
kde(data,
h, kernel)
|
формирование
непрерывной ПРВ по дискретным данным data
|
|
kde_random(data,
h, kernel, seed=None)
|
формирование
случайных данных, по распределению, сформированному с помощью функции kde()
|
|
Функции измерения разброса значений
|
|
pstdev(data,
mu=None)
|
вычисление
стандартного отклонения значений data, как корень
квадратный из pvariance(data)
|
|
pvariance(data,
mu=None)
|
вычисление
дисперсии значений data с усреднением всех величин
|
|
stdev(data,
xbar=None)
|
вычисление
стандартного отклонения значений data, как корень
квадратный из variance(data)
|
|
variance(data,
xbar=None)
|
вычисление
дисперсии значений data с усреднением N-1 величин,
где N – общее число
элементов
|
|
Функции вычисления корреляции и
ковариации
|
|
covariance(x,
y)
|
ковариация
двух случайных величин x, y
|
|
correlation(x,
y, method='linear')
|
корреляция
двух случайных величин x, y
|
|
linear_regression(x,
y, proportional=False)
|
вычисляет
параметры a, b линейной
регрессии вида:
y
= a * x + b + noise
|
По сути, здесь
две группы функций, которые немного различаются в способах оценки величины
дисперсии. Давайте разберем их работу на конкретных примерах.
Пусть имеется
последовательность вещественных чисел:
x = [1.5, 2.5, 2.5, 2.75, 3.25, 4.75]
Тогда меру
разброса этих величин относительно среднего значения (математического ожидания)
можно вычислить по формуле:
,
где N – число
элементов последовательности;
-
среднее значение величин последовательности.
Именно это
делает функция:
var = st.pvariance(x) # 0.9739583333333334
Обратите
внимание, чтобы вычислить дисперсию по указанной формуле нужно вначале
вычислить математическое ожидание (среднее значение). Однако не редко бывают
ситуации, когда МО уже вычислено:
и пересчитывать
его в функции pvariance() особого
смысла нет. Поэтому для сокращения объема вычислений вторым аргументом функции pvariance() можно
передать значение МО:
var = st.pvariance(x, mx) # 0.9739583333333334
Получим то же
самое значение дисперсии, но без пересчета среднего значения элементов
последовательности x.
Дисперсия имеет
квадратическую размерность. Например, измеряя отклонения расстояний в метрах,
дисперсия будет описывать разброс в квадратных метрах. Очевидно, для получения
меры разброса в исходных единицах, метрах, нужно извлечь квадратный корень из
дисперсии:
Такая
характеристика называется стандартным отклонением и вычисляется с помощью
функции pstdev():
sigma = st.pstdev(x) # 0.986893273527251
Аналог вычисления:
st.pvariance(x, mx) ** 0.5 # 0.986893273527251
В функцию pstdev() также вторым
аргументом можно передавать ранее вычисленное среднее значение
последовательности чисел:
sigma = st.pstdev(x, mx) # 0.986893273527251
Функции stdev() и variance()
Кажется, что
этих двух функций pvariance() и pstdev() достаточно
для вычисления дисперсий и стандартных отклонений различных последовательностей
чисел. Однако используемая формула для дисперсии:
дает, так
называемую, смещенную (немного неточную) оценку истинной дисперсии
распределения СВ. Теоретически, для более точного значения оценки дисперсии следует
использовать формулу:
Именно она
реализуется функцией:
var = st.variance(x) # 1.16875
Она особенно
полезна, когда количество элементов в последовательности невелико и значения
и
заметно
различаются. Именно поэтому в наших примерах видим такую разницу дисперсий: 1.16875
против 0.973958. Конечно, если взять 100, а еще лучше 1000 элементов, то обе
формулы будут давать примерно равные результаты. Но при длинах меньше 100 они
имеют заметные отличия.
Но раз функция variance()
в теории дает более точные результаты оценки дисперсии, то почему бы ее везде и
всегда не использовать? По идее, так и следует поступать. Однако в практике
инженерных расчетов не редко приходится вычислять дисперсию и по первой
формуле. Поэтому в модуле statistics есть такая возможность.
Вернемся к
функциям variance() и stdev(). Вторая также вычисляет стандартное
отклонение, как корень квадратный из дисперсии, полученной с помощью функции variance():
sigma = st.stdev(x) # 1.0810874155219827
И им также можно
вторым аргументом передавать ранее вычисленное среднее значение для ускорения
вычислений:
var = st.variance(x, mx) # 1.16875
sigma = st.stdev(x, mx) # 1.0810874155219827
Функции вычисления корреляции и ковариации
Последний блок
функций посвящен вычислению ковариации и корреляции между двумя случайными
величинами. В двух словах, ковариация (и то же самое корреляция) показывают
степень линейной зависимости между двумя СВ. Давайте посмотрим, как вычисляются
эти показатели.
Пусть реализации
случайных величин X, Y заданы в виде следующих
последовательностей чисел:
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [1, 2, 3, 1, 2, 3, 1, 2, 3]
Тогда
коэффициент ковариации между ними можно вычислить по формуле:
Именно это
делает функция covariance():
cov = st.covariance(x, y) # 0.75
Формально,
коэффициент ковариации может меняться в диапазоне:
что не очень
удобно для некоторых практических приложений. Поэтому не редко его нормируют,
приводя к диапазону [-1; 1]. Такая нормировка превращает ковариацию в
корреляцию:
Вычислить этот
коэффициент можно с помощью функции correlation():
corr = st.correlation(x, y) # 0.31622776601683794
В версии Python 3.12 в эту
функцию добавили параметр method, определяющий способ вычисления коэффициента
корреляции. По умолчанию он принимает значение 'linear', что означает
определение степени линейной зависимости между СВ (коэффициент Пирсона). Это
соответствует приведенной выше формуле. Если же указать значение 'ranked':
corr = st.correlation(x, y, method= 'ranked')
то будет
вычисляться коэффициент ранговой корреляции Спирмена. Мы не будем здесь вдаваться
в подробности рассмотрения коэффициентов корреляции. Если вам это понадобилось,
то, по-хорошему, должны знать, что это такое.
Вот основные
функции модуля statistics. Конечно, мы рассмотрели не все. Полный
их список с примерами можно посмотреть на странице официальной документации:
https://docs.python.org/3/library/statistics.html
Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs