Как посчитать дисперсию в python
Перейти к содержимому

Как посчитать дисперсию в python

Расчет дисперсии и стандартного отклонения в Python

Два тесно связанных статистических показателя позволят нам получить представление о разбросе или разбросе наших данных. Первая мера — это дисперсия , которая измеряет, насколько далеки от среднего значения отдельные наблюдения в наших данных. Второе — стандартное отклонение , которое представляет собой квадратный корень из дисперсии и измеряет степень вариации или дисперсии набора данных.

В этом руководстве мы узнаем, как рассчитать дисперсию и стандартное отклонение в Python. Сначала мы закодируем функцию Python для каждой меры, а позже мы узнаем, как использовать statistics Python для быстрого выполнения той же задачи.

Обладая этими знаниями, мы сможем сначала взглянуть на наши наборы данных и получить быстрое представление об общем разбросе наших данных.

Расчет дисперсии

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

Высокая дисперсия говорит нам о том, что значения в нашем наборе данных далеки от своего среднего. Таким образом, наши данные будут иметь высокий уровень изменчивости. С другой стороны, низкая дисперсия говорит нам о том, что значения довольно близки к среднему. В этом случае данные будут иметь низкий уровень изменчивости.

Чтобы вычислить дисперсию в наборе данных, нам сначала нужно найти разницу между каждым отдельным значением и средним значением. Дисперсия

  • это среднее квадратов этих различий. Мы можем выразить дисперсию с помощью следующего математического выражения:

В этом уравнении x

обозначает отдельные значения или наблюдения в наборе данных. μ обозначает среднее или среднее значение этих значений. n — количество значений в наборе данных.

— μ называется отклонением от среднего . Итак, дисперсия — это среднее квадратическое отклонение. Поэтому мы обозначили его как ^2^ .

Скажем, у нас есть набор данных [3, 5, 2, 7, 1, 3]. Чтобы найти его дисперсию, нам нужно вычислить среднее значение:

$$
(3 + 5 + 2 + 7 + 1 + 3) / 6 = 3,5
$

Затем нам нужно вычислить сумму квадратного отклонения от среднего значения всех наблюдений. Вот как:

$$
(3 — 3,5) ^ 2 + (5 — 3,5) ^ 2 + (2 — 3,5) ^ 2 + (7 — 3,5) ^ 2 + (1 — 3,5) ^ 2 + (3 — 3,5) ^ 2 = 23,5
$

Чтобы найти дисперсию, нам просто нужно разделить этот результат на количество наблюдений следующим образом:

Это все. Разница наших данных составляет 3,916666667. Дисперсию сложно понять и интерпретировать, особенно насколько странны ее единицы.

Например, если наблюдения в нашем наборе данных измеряются в фунтах, тогда дисперсия будет измеряться в квадратных фунтах. Итак, мы можем сказать, что наблюдения составляют в среднем 3,916666667 квадратных фунтов, что далеко от среднего значения 3,5. К счастью, стандартное отклонение помогает решить эту проблему, но это тема следующего раздела.

Если мы применим концепцию дисперсии к набору данных, то сможем различить дисперсию выборки и дисперсию генеральной совокупности . Дисперсия генеральной совокупности — это дисперсия, которую мы видели раньше, и мы можем вычислить ее, используя данные из полной ^генеральной\ совокупности\ и\ выражение\ для\ 2^ .

Дисперсия выборки обозначается как S ^2,^ и мы можем вычислить ее, используя выборку из данной генеральной совокупности и следующее выражение:

Это выражение очень похоже на выражение для вычисления ^2,^ но в этом случае x

представляет отдельные наблюдения в выборке, а X — это среднее значение выборки.

S ^2^ обычно используется для оценки дисперсии генеральной ^совокупности\ (2^ ) с использованием выборки данных. Однако S ^2^ систематически недооценивает дисперсию населения. По этой причине его называют предвзятой оценкой дисперсии совокупности.

Когда у нас есть большая выборка, S ^2^ может быть адекватной оценкой ^2^ . Для небольших образцов он, как правило, слишком низкий. К счастью, есть еще одна простая статистика, которую мы можем использовать для более точной ^оценки\ σ\ 2^ . Вот его уравнение:

Это очень похоже на предыдущее выражение. Это похоже на квадрат отклонения от среднего, но в этом случае мы делим на n — 1 вместо n . Это называется поправкой Бесселя . Поправка Бесселя показывает, что S ^2^

является наилучшей несмещенной оценкой дисперсии генеральной совокупности. Итак, на практике мы будем использовать это уравнение для оценки дисперсии генеральной совокупности с использованием выборки данных. Обратите внимание, что S ^2^

также известен как дисперсия с n — 1 степенями свободы.

Теперь, когда мы узнали, как вычислить дисперсию с помощью математического выражения, пора приступить к действию и вычислить дисперсию с помощью Python.

Кодирование функции variance () в Python

Чтобы вычислить дисперсию, мы собираемся закодировать функцию Python под названием variance() . Эта функция возьмет некоторые данные и вернет их дисперсию. Внутри variance() мы собираемся вычислить среднее значение данных и квадратные отклонения от среднего. Наконец, мы собираемся вычислить дисперсию, найдя среднее значение отклонений.

Вот возможная реализация variance() :

Сначала мы вычисляем количество наблюдений ( n ) в наших данных, используя встроенную функцию len() . Затем мы вычисляем среднее значение данных, деля общую сумму наблюдений на количество наблюдений.

Следующий шаг — вычислить квадратные отклонения от среднего. Для этого мы используем понимание list которое создает list квадратных отклонений с использованием выражения (x — mean) ** 2 где x обозначает каждое наблюдение в наших данных.

Наконец, мы вычисляем дисперсию, суммируя отклонения и деля их на количество наблюдений n .

В этом случае variance() вычислит дисперсию генеральной совокупности, потому что мы используем n вместо n — 1 для вычисления среднего значения отклонений. Если мы работаем с выборкой и хотим оценить дисперсию генеральной совокупности, то нам нужно обновить выражение variance = sum(deviations) / n до variance = sum(deviations) / (n — 1) .

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

В этом случае мы удаляем некоторые промежуточные шаги и временные переменные, такие как deviations и variance . Мы также превращаем понимание list в выражение генератора , что намного эффективнее с точки зрения потребления памяти.

Обратите внимание, что эта реализация принимает второй аргумент, называемый ddof который по умолчанию 0 . Этот аргумент позволяет нам установить степени свободы, которые мы хотим использовать при вычислении дисперсии. Например, ddof=0 позволит нам вычислить дисперсию генеральной совокупности. Между тем, ddof=1 позволит нам оценить дисперсию генеральной совокупности с использованием выборки данных.

Использование Python pvariance () и variance ()

Python включает стандартный модуль, называемый statistics который предоставляет некоторые функции для вычисления базовой статистики данных. В этом случае statistics.pvariance() и statistics.variance()

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

Вот как работает Python pvariance() :

Нам просто нужно импортировать statistics а затем вызвать pvariance() с нашими данными в качестве аргумента. Это вернет дисперсию населения.

С другой стороны, мы можем использовать Python variance() для вычисления дисперсии выборки и использовать ее для оценки дисперсии всей генеральной совокупности. Это потому, что variance() использует n — 1 вместо n для вычисления дисперсии. Вот как это работает:

Это выборочная дисперсия S ^2^ . Таким образом, результатом использования Python variance() должна быть объективная оценка дисперсии совокупности ^2^ при условии, что наблюдения репрезентативны для всей совокупности.

Расчет стандартного отклонения

Стандартное отклонение измеряет степень вариации или дисперсии набора числовых значений. Стандартное отклонение представляет собой квадратный корень из дисперсии σ ^2^ и обозначается как σ. Итак, если мы хотим вычислить стандартное отклонение, то все, что нам нужно сделать, это извлечь квадратный корень из дисперсии следующим образом:

Опять же, нам нужно различать стандартное отклонение генеральной совокупности ^,\ которое\ представляет\ собой\ квадратный\ корень\ из\ дисперсии\ генеральной\ совокупности\ (2^ ), и стандартное отклонение выборки, которое является квадратным корнем из выборочной дисперсии ( S ^2^ ). Обозначим стандартное отклонение выборки как S :

Низкие значения стандартного отклонения говорят нам о том, что отдельные значения ближе к среднему. С другой стороны, высокие значения говорят нам о том, что отдельные наблюдения далеки от среднего значения данных.

Значения, которые находятся в пределах одного стандартного отклонения от среднего, можно рассматривать как довольно типичные, тогда как значения, которые отличаются от среднего на три или более стандартных отклонения, могут считаться гораздо более нетипичными. Их также называют выбросами .

В отличие от дисперсии, стандартное отклонение будет выражаться в тех же единицах, что и исходные наблюдения. Следовательно, стандартное отклонение — более значимая и легкая для понимания статистика. Повторяя наш пример, если наблюдения выражены в фунтах, то стандартное отклонение также будет выражено в фунтах.

Если мы пытаемся оценить стандартное отклонение генеральной совокупности с использованием выборки данных, тогда нам будет удобнее использовать n — 1 степень свободы. Вот математическое выражение, которое мы обычно используем для оценки дисперсии совокупности:
$
\ sigma_x = \ sqrt \ frac <\ sum_ ^ <(x_i - \ mu_x) ^ 2>>
$
Обратите внимание, что это квадратный корень из дисперсии выборки с **n

  • 1** степенями свободы. Это равносильно тому, чтобы сказать:
    $
    S_ = \ sqrt >
    $
    Как только мы узнаем, как рассчитать стандартное отклонение с использованием его математического выражения, мы можем взглянуть на то, как мы можем вычислить эту статистику с помощью Python.
Кодирование функции stdev () на Python

Чтобы вычислить стандартное отклонение набора данных, мы будем полагаться на нашу функцию variance() Мы также собираемся использовать функцию sqrt() math модуля стандартной библиотеки Python. Вот функция stdev() которая берет данные из совокупности и возвращает ее стандартное отклонение:

Наша stdev() принимает некоторые data и возвращает стандартное отклонение генеральной совокупности. Для этого мы полагаемся на нашу предыдущую variance() для вычисления дисперсии, а затем с помощью math.sqrt() извлекаем квадратный корень из дисперсии.

Если мы хотим использовать stdev() для оценки стандартного отклонения генеральной совокупности с использованием выборки данных, нам просто нужно вычислить дисперсию с n — 1 степенями свободы, как мы видели ранее. Вот более общий stdev() который также позволяет передавать степени свободы:

В этой новой реализации мы можем использовать ddof=0 для вычисления стандартного отклонения генеральной совокупности или мы можем использовать ddof=1 для оценки стандартного отклонения генеральной совокупности с использованием выборки данных.

Использование Python pstdev () и stdev ()

Модуль statistics Python также предоставляет функции для расчета стандартного отклонения. Мы можем найти pstdev() и stdev() . Первая функция берет данные о генеральной совокупности и возвращает ее стандартное отклонение. Вторая функция берет данные из выборки и возвращает оценку стандартного отклонения генеральной совокупности.

Вот как работают эти функции:

Сначала нам нужно импортировать модуль statistics Затем мы можем вызвать statistics.pstdev() с данными по генеральной совокупности, чтобы получить ее стандартное отклонение.

Если у нас нет данных для всей генеральной совокупности, что является обычным сценарием, мы можем использовать выборку данных и использовать statistics.stdev() для оценки стандартного отклонения генеральной совокупности.

Заключение

Дисперсия и стандартное отклонение обычно используются для измерения изменчивости или дисперсии набора данных. Эти статистические показатели дополняют использование среднего, медианы и режима при описании наших данных.

В этом руководстве мы узнали, как рассчитать дисперсию и стандартное отклонение набора данных с помощью Python. Сначала мы шаг за шагом научились создавать наши собственные функции для их вычисления, а позже мы узнали, как использовать модуль statistics Python как быстрый способ приблизиться к их вычислению.

Как я могу рассчитать дисперсию списка в Python?

Я хочу вычислить дисперсию этого списка в Python, которая является средним квадратом различий от среднего.

Как я могу пойти по этому поводу? Доступ к элементам в списке для выполнения вычислений сбивает меня с толку для получения квадратичных различий.

7 ответов

Вы можете использовать встроенную функцию numpy <> :

Это дает вам 28.822364260579157

Если — по какой-либо причине — вы не можете использовать numpy и / или вы не хотите использовать для него встроенную функцию, вы также можете рассчитать ее «вручную», используя, например, понимание списка:

Который дает вам идентичный результат.

Если вас интересует стандартное отклонение , вы можете использовать numpy.std:

@Serge Ballesta очень хорошо объяснил разницу между n и n-1 . В numpy вы можете легко установить этот параметр, используя опцию ddof ; по умолчанию используется 0 , поэтому для случая n-1 вы можете просто сделать:

Решение «от руки» приведено в ответе @Serge Ballesta.

Оба подхода дают 32.024849178421285 .

Вы можете установить параметр также для std :

Правильный ответ — использовать один из пакетов, таких как NumPy, но если вы хотите свернуть свой собственный и делать это постепенно, есть хороший алгоритм, который имеет более высокую точность. Смотрите эту ссылку https://www.johndcook.com/blog/standard_deviation/

Я перенес свою реализацию Perl на Python. Пожалуйста, укажите проблемы в комментариях.

Без импорта я бы использовал следующий скрипт python3:

Здесь вы получаете распечатку исходных данных, их среднее значение и дисперсию. Я знаю, что этот подход охватывает список из нескольких наборов данных, но я думаю, что вы можете быстро адаптировать его для своих целей;)

Ну, есть два способа определения дисперсии. У вас есть дисперсия n , которую вы используете, когда у вас есть полный набор, и дисперсия n-1 , которую вы используете, когда у вас есть образец.

Разница между двумя состоит в том, является ли значение m = sum(xi) / n реальным средним значением или оно является лишь приблизительным значением того, каким должно быть среднее значение.

Пример 1: вы хотите знать средний рост учеников в классе и его дисперсию: хорошо, значение m = sum(xi) / n является реальным средним, а формулы, заданные Клебом, в порядке (дисперсия n ) .

Пример 2: вы хотите узнать средний час, в который автобус проезжает на автобусной остановке, и его дисперсию. Вы отмечаете час за месяц и получаете 30 значений. Здесь значение m = sum(xi) / n является лишь приближением реального среднего, и это приближение будет более точным при большем количестве значений. В этом случае наилучшим приближением для фактической дисперсии является дисперсия n-1

Хорошо, это не имеет ничего общего с Python, но влияет на статистический анализ, и вопрос помечен статистика и дисперсии

Примечание: обычно статистические библиотеки, такие как numpy, используют дисперсию n для того, что они называют var или variance , и дисперсию n-1 для функция, которая дает стандартное отклонение.

Начиная Python 3.4 , стандартная библиотека поставляется с <> функция ( пример дисперсии или дисперсия n-1 ) как часть statistics :

p дисперсию опуляции (или дисперсию n ) можно получить с помощью pvariance функция:

Также обратите внимание, что если вы уже знаете среднее значение вашего списка, функции variance и pvariance принимают второй аргумент (соответственно xbar и mu ), чтобы сэкономить повторную обработку среднее значение выборки (которая является частью вычисления дисперсии).

Numpy действительно самый элегантный и быстрый способ сделать это.

Я думаю, что реальный вопрос был о том, как получить доступ к отдельным элементам списка, чтобы сделать такой расчет самостоятельно, поэтому ниже приведен пример:

numpy.var

Функция var() вычисляет дисперсию значений элементов массива.

Дисперсия случайной величины A записывается как:

Где M — математическое ожидание.

Параметры: a — массив NumPy или подобный массиву объект. Входные данные. axis — число, кортеж целых чисел или None (необязательный параметр). Позволяет задать ось или несколько осей вдоль которых вычисляется дисперсия. По умолчанию установлено значение None, что соответствует вычислению дисперсии всех элементов массива, так словно он сжат до одной оси. dtype — тип данных NumPy (необязательный параметр). По умолчанию равен None, что означает использование для вычисления дисперсии целых чисел типа float64, а для чисел с плавающей точкой тип данных будет совпадать с типом данных входного массива. out — массив NumPy (необязательный параметр). Массив в который можно поместить результат функции. Данный массив должен соответствовать форме и типу данных результирующего массива функции (зачастую, тип данных может быть преобразован автоматически). Указание данного параметра, позволяет избежать лишней операции присваивания тем самым немного ускоряя работу вашего кода. Полезный параметр если вы очень часто обращаетесь к функции в цикле. ddof — вещественное число (необязательный параметр). Параметр ddof — дельта степени свободы. Обычно, принято (и по умолчанию установлено) считать ddof = 0 , но в разных источниках (например ГОСТ) требуется что бы параметр ddof имел значение отличное от 0 , например 1 или 1,5 . keepdims — True или False (необязательный параметр). Если данный параметр указан как True, то результат работы функции по указанным осям будет способен к транслированию по исходному массиву, т.е. результат функции оформляется в массив с количеством осей исходного массива. Если параметр установлен в значение False, то результатом работы функции будет либо число, либо одномерный массив чисел. Доступно в NumPy с версии 1.9.0. Возвращает: результат — массив NumPy или число Дисперсию значений элементов массива в виде числа для одномерного массива, или многомерного если параметр axis = None . Для многомерного массива возвращает массив NumPy если в параметре axis оси указаны.

Примеры

Если у массива больше одной оси (больше одного измерения), то мы можем найти среднеквадратичное отклонение элементов массива вдоль каждой из них:

Параметр keepdims позволяет сохранить форму исходного массива, что позволяет в дальнейшем использовать механизм транслирования:

Параметр out позволяет указать массив в который необходимо поместить результат расчетов:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *