Вычисление дисперсий и ковариаций с помощью модуля statistics

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Смотреть материал на YouTube | RuTube

Продолжаем рассматривать наиболее используемые функции модуля 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

Обратите внимание, чтобы вычислить дисперсию по указанной формуле нужно вначале вычислить математическое ожидание (среднее значение). Однако не редко бывают ситуации, когда МО уже вычислено:

mx = st.mean(x)  # 2.875

и пересчитывать его в функции 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

Видео по теме