Вступление
Два тесно связанных статистических показателя позволят нам получить представление о разбросе или разбросе наших данных. Первая мера - это дисперсия , которая измеряет, насколько далеки от среднего значения отдельные наблюдения в наших данных. Второе - стандартное отклонение , которое представляет собой квадратный корень из дисперсии и измеряет степень вариации или дисперсии набора данных.
В этом руководстве мы узнаем, как рассчитать дисперсию и стандартное
отклонение в Python. Сначала мы закодируем функцию Python для каждой
меры, а позже мы узнаем, как использовать statistics
Python для
быстрого выполнения той же задачи.
Обладая этими знаниями, мы сможем сначала взглянуть на наши наборы данных и получить быстрое представление об общем разбросе наших данных.
Расчет дисперсии
В статистике дисперсия - это мера того, насколько отдельные (числовые) значения в наборе данных отличаются от среднего или среднего значения . Дисперсия часто используется для количественной оценки разброса или дисперсии. Распространение - это характеристикавыборки или генеральной совокупности, которая описывает степень ее изменчивости.
Высокая дисперсия говорит нам о том, что значения в нашем наборе данных далеки от своего среднего. Таким образом, наши данные будут иметь высокий уровень изменчивости. С другой стороны, низкая дисперсия говорит нам о том, что значения довольно близки к среднему. В этом случае данные будут иметь низкий уровень изменчивости.
Чтобы вычислить дисперсию в наборе данных, нам сначала нужно найти разницу между каждым отдельным значением и средним значением. Дисперсия
- это среднее квадратов этих различий. Мы можем выразить дисперсию с помощью следующего математического выражения:
$$
\ sigma ^ 2 = \ frac {1} {n} {\ sum_ {i = 0} ^ {n-1} {(x_i - \
mu) ^ 2}}
$
В этом уравнении x ~i~ обозначает отдельные значения или наблюдения в наборе данных. μ обозначает среднее или среднее значение этих значений. n - количество значений в наборе данных.
Член x ~i~ - μ называется отклонением от среднего . Итак, дисперсия - это среднее квадратическое отклонение. Поэтому мы обозначили его как ^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
$
Чтобы найти дисперсию, нам просто нужно разделить этот результат на количество наблюдений следующим образом:
$$
23,5 / 6 = 3,916666667
$
Это все. Разница наших данных составляет 3,916666667. Дисперсию сложно понять и интерпретировать, особенно насколько странны ее единицы.
Например, если наблюдения в нашем наборе данных измеряются в фунтах, тогда дисперсия будет измеряться в квадратных фунтах. Итак, мы можем сказать, что наблюдения составляют в среднем 3,916666667 квадратных фунтов, что далеко от среднего значения 3,5. К счастью, стандартное отклонение помогает решить эту проблему, но это тема следующего раздела.
Если мы применим концепцию дисперсии к набору данных, то сможем различить дисперсию выборки и дисперсию генеральной совокупности . Дисперсия генеральной совокупности - это дисперсия, которую мы видели раньше, и мы можем вычислить ее, используя данные из полной ^генеральной\ совокупности\ и\ выражение\ для\ 2^ .
Дисперсия выборки обозначается как S ^2,^ и мы можем вычислить ее, используя выборку из данной генеральной совокупности и следующее выражение:
$$
S ^ 2 = \ frac {1} {n} {\ sum_ {i = 0} ^ {n-1} {(x_i - X) ^ 2}}
$
Это выражение очень похоже на выражение для вычисления ^2,^ но в этом случае x ~i~ представляет отдельные наблюдения в выборке, а X - это среднее значение выборки.
S ^2^ обычно используется для оценки дисперсии генеральной ^совокупности\ (2^ ) с использованием выборки данных. Однако S ^2^ систематически недооценивает дисперсию населения. По этой причине его называют предвзятой оценкой дисперсии совокупности.
Когда у нас есть большая выборка, S ^2^ может быть адекватной оценкой ^2^ . Для небольших образцов он, как правило, слишком низкий. К счастью, есть еще одна простая статистика, которую мы можем использовать для более точной ^оценки\ σ\ 2^ . Вот его уравнение:
$$
S ^ 2_ {n-1} = \ frac {1} {n-1} {\ sum_ {i = 0} ^ {n-1} {(x_i - X)
^ 2}}
$
Это очень похоже на предыдущее выражение. Это похоже на квадрат отклонения от среднего, но в этом случае мы делим на n - 1 вместо n . Это называется поправкой Бесселя . Поправка Бесселя показывает, что S ^2^ ~n-1~ является наилучшей несмещенной оценкой дисперсии генеральной совокупности. Итак, на практике мы будем использовать это уравнение для оценки дисперсии генеральной совокупности с использованием выборки данных. Обратите внимание, что S ^2^ ~n-1~ также известен как дисперсия с n - 1 степенями свободы.
Теперь, когда мы узнали, как вычислить дисперсию с помощью математического выражения, пора приступить к действию и вычислить дисперсию с помощью Python.
Кодирование функции variance () в Python
Чтобы вычислить дисперсию, мы собираемся закодировать функцию Python под
названием variance()
. Эта функция возьмет некоторые данные и вернет
их дисперсию. Внутри variance()
мы собираемся вычислить среднее
значение данных и квадратные отклонения от среднего. Наконец, мы
собираемся вычислить дисперсию, найдя среднее значение отклонений.
Вот возможная реализация variance()
:
>>> def variance(data):
... # Number of observations
... n = len(data)
... # Mean of the data
... mean = sum(data) / n
... # Square deviations
... deviations = [(x - mean) ** 2 for x in data]
... # Variance
... variance = sum(deviations) / n
... return variance
...
>>> variance([4, 8, 6, 5, 3, 2, 8, 9, 2, 5])
5.76
Сначала мы вычисляем количество наблюдений ( n
) в наших данных,
используя встроенную функцию
len()
. Затем
мы вычисляем среднее значение данных, деля общую сумму наблюдений на
количество наблюдений.
Следующий шаг - вычислить квадратные отклонения от среднего. Для этого
мы используем понимание list
которое создает list
квадратных отклонений с использованием выражения
(x - mean) ** 2
где x
обозначает каждое наблюдение в наших данных.
Наконец, мы вычисляем дисперсию, суммируя отклонения и деля их на
количество наблюдений n
.
В этом случае variance()
вычислит дисперсию генеральной совокупности,
потому что мы используем n вместо n - 1 для вычисления среднего
значения отклонений. Если мы работаем с выборкой и хотим оценить
дисперсию генеральной совокупности, то нам нужно обновить выражение
variance = sum(deviations) / n
до
variance = sum(deviations) / (n - 1)
.
Мы можем реорганизовать нашу функцию, чтобы сделать ее более краткой и эффективной. Вот пример:
>>> def variance(data, ddof=0):
... n = len(data)
... mean = sum(data) / n
... return sum((x - mean) ** 2 for x in data) / (n - ddof)
...
>>> variance([4, 8, 6, 5, 3, 2, 8, 9, 2, 5])
5.76
>>> variance([4, 8, 6, 5, 3, 2, 8, 9, 2, 5], ddof=1)
6.4
В этом случае мы удаляем некоторые промежуточные шаги и временные
переменные, такие как deviations
и variance
. Мы также превращаем
понимание list
в выражение генератора , что
намного эффективнее с точки зрения потребления памяти.
Обратите внимание, что эта реализация принимает второй аргумент,
называемый ddof
который по
умолчанию 0
. Этот аргумент
позволяет нам установить степени свободы, которые мы хотим использовать
при вычислении дисперсии. Например, ddof=0
позволит нам вычислить
дисперсию генеральной совокупности. Между тем, ddof=1
позволит нам
оценить дисперсию генеральной совокупности с использованием выборки
данных.
Использование Python pvariance () и variance ()
Python включает стандартный модуль, называемый
statistics
который предоставляет некоторые функции для вычисления базовой
статистики данных. В этом случае
statistics.pvariance()
и
statistics.variance()
- это функции, которые мы можем использовать для вычисления дисперсии генеральной совокупности и выборки соответственно.
Вот как работает Python pvariance()
:
>>> import statistics
>>> statistics.pvariance([4, 8, 6, 5, 3, 2, 8, 9, 2, 5])
5.760000000000001
Нам просто нужно
импортировать statistics
а затем вызвать pvariance()
с нашими данными в качестве аргумента. Это
вернет дисперсию населения.
С другой стороны, мы можем использовать Python variance()
для
вычисления дисперсии выборки и использовать ее для оценки дисперсии всей
генеральной совокупности. Это потому, что variance()
использует n -
1 вместо n для вычисления дисперсии. Вот как это работает:
>>> import statistics
>>> statistics.variance([4, 8, 6, 5, 3, 2, 8, 9, 2, 5])
6.4
Это выборочная дисперсия S ^2^ . Таким образом, результатом
использования Python variance()
должна быть объективная оценка
дисперсии совокупности ^2^ при условии, что наблюдения
репрезентативны для всей совокупности.
Расчет стандартного отклонения
Стандартное отклонение измеряет степень вариации или дисперсии набора числовых значений. Стандартное отклонение представляет собой квадратный корень из дисперсии σ ^2^ и обозначается как σ. Итак, если мы хотим вычислить стандартное отклонение, то все, что нам нужно сделать, это извлечь квадратный корень из дисперсии следующим образом:
$$
\ sigma = \ sqrt {\ sigma ^ 2}
$
Опять же, нам нужно различать стандартное отклонение генеральной совокупности ^,\ которое\ представляет\ собой\ квадратный\ корень\ из\ дисперсии\ генеральной\ совокупности\ (2^ ), и стандартное отклонение выборки, которое является квадратным корнем из выборочной дисперсии ( S ^2^ ). Обозначим стандартное отклонение выборки как S :
$$
S = \ sqrt {S ^ 2}
$
Низкие значения стандартного отклонения говорят нам о том, что отдельные значения ближе к среднему. С другой стороны, высокие значения говорят нам о том, что отдельные наблюдения далеки от среднего значения данных.
Значения, которые находятся в пределах одного стандартного отклонения от среднего, можно рассматривать как довольно типичные, тогда как значения, которые отличаются от среднего на три или более стандартных отклонения, могут считаться гораздо более нетипичными. Их также называют выбросами .
В отличие от дисперсии, стандартное отклонение будет выражаться в тех же единицах, что и исходные наблюдения. Следовательно, стандартное отклонение - более значимая и легкая для понимания статистика. Повторяя наш пример, если наблюдения выражены в фунтах, то стандартное отклонение также будет выражено в фунтах.
Если мы пытаемся оценить стандартное отклонение генеральной совокупности
с использованием выборки данных, тогда нам будет удобнее использовать
n - 1 степень свободы. Вот математическое выражение, которое мы
обычно используем для оценки дисперсии совокупности:
$
\ sigma_x = \ sqrt \ frac {\ sum_ {i = 0} ^ {n-1} {(x_i - \ mu_x)
^ 2}} {n-1}
$
Обратите внимание, что это квадратный корень из дисперсии выборки с **n
- 1** степенями свободы. Это равносильно тому, чтобы сказать:
$
S_ {n-1} = \ sqrt {S ^ 2_ {n-1}}
$
Как только мы узнаем, как рассчитать стандартное отклонение с использованием его математического выражения, мы можем взглянуть на то, как мы можем вычислить эту статистику с помощью Python.
Кодирование функции stdev () на Python
Чтобы вычислить стандартное отклонение набора данных, мы будем
полагаться на нашу функцию variance()
Мы также собираемся использовать
функцию
sqrt()
math
модуля стандартной библиотеки
Python. Вот функция stdev()
которая берет данные из совокупности и
возвращает ее стандартное отклонение:
>>> import math
>>> # We relay on our previous implementation for the variance
>>> def variance(data, ddof=0):
... n = len(data)
... mean = sum(data) / n
... return sum((x - mean) ** 2 for x in data) / (n - ddof)
...
>>> def stdev(data):
... var = variance(data)
... std_dev = math.sqrt(var)
... return std_dev
>>> stdev([4, 8, 6, 5, 3, 2, 8, 9, 2, 5])
2.4
Наша stdev()
принимает некоторые data
и возвращает стандартное
отклонение генеральной совокупности. Для этого мы полагаемся на нашу
предыдущую variance()
для вычисления дисперсии, а затем с помощью
math.sqrt()
извлекаем квадратный корень из дисперсии.
Если мы хотим использовать stdev()
для оценки стандартного отклонения
генеральной совокупности с использованием выборки данных, нам просто
нужно вычислить дисперсию с n - 1 степенями свободы, как мы видели
ранее. Вот более общий stdev()
который также позволяет передавать
степени свободы:
>>> def stdev(data, ddof=0):
... return math.sqrt(variance(data, ddof))
>>> stdev([4, 8, 6, 5, 3, 2, 8, 9, 2, 5])
2.4
>>> stdev([4, 8, 6, 5, 3, 2, 8, 9, 2, 5], ddof=1)
2.5298221281347035
В этой новой реализации мы можем использовать ddof=0
для вычисления
стандартного отклонения генеральной совокупности или мы можем
использовать ddof=1
для оценки стандартного отклонения генеральной
совокупности с использованием выборки данных.
Использование Python pstdev () и stdev ()
Модуль statistics
Python также предоставляет функции для расчета
стандартного отклонения. Мы можем найти
pstdev()
и
stdev()
. Первая функция берет данные о генеральной совокупности и возвращает ее
стандартное отклонение. Вторая функция берет данные из выборки и
возвращает оценку стандартного отклонения генеральной совокупности.
Вот как работают эти функции:
>>> import statistics
>>> statistics.pstdev([4, 8, 6, 5, 3, 2, 8, 9, 2, 5])
2.4000000000000004
>>> statistics.stdev([4, 8, 6, 5, 3, 2, 8, 9, 2, 5])
2.5298221281347035
Сначала нам нужно
импортировать модуль
statistics
Затем мы можем вызвать statistics.pstdev()
с данными по
генеральной совокупности, чтобы получить ее стандартное отклонение.
Если у нас нет данных для всей генеральной совокупности, что является
обычным сценарием, мы можем использовать выборку данных и использовать
statistics.stdev()
для оценки стандартного отклонения генеральной
совокупности.
Заключение
Дисперсия и стандартное отклонение обычно используются для измерения изменчивости или дисперсии набора данных. Эти статистические показатели дополняют использование среднего, медианы и режима при описании наших данных.
В этом руководстве мы узнали, как рассчитать дисперсию и стандартное
отклонение набора данных с помощью Python. Сначала мы шаг за шагом
научились создавать наши собственные функции для их вычисления, а позже
мы узнали, как использовать модуль statistics
Python как быстрый
способ приблизиться к их вычислению.