statistics — Функции математической статистики

Добавлено в версии 3.4.

Исходный код: Lib/statistics.py.


Этот модуль предоставляет функции для вычисления математической статистики числовых (Real-значных) данных.

Модуль не предназначен для конкуренции со сторонними библиотеками, такими как NumPy, SciPy, или собственными полнофункциональными статистическими пакетами, предназначенными для профессиональных статистиков, такими как Minitab, SAS и Matlab. Она ориентирована на уровень графических и научных калькуляторов.

Если не указано явно, эти функции поддерживают int, float, Decimal и Fraction. Поведение с другими типами (как в числовой башне, так и без нее) в настоящее время не поддерживается. Коллекции со смешанными типами также не определены и зависят от реализации. Если ваши входные данные состоят из смешанных типов, вы можете использовать map() для обеспечения согласованного результата, например: map(float, input_data).

Некоторые наборы данных используют значения NaN (не число) для представления отсутствующих данных. Поскольку NaN имеют необычную семантику сравнения, они вызывают неожиданное или неопределенное поведение в статистических функциях, сортирующих данные или подсчитывающих вхождения. Затронутыми функциями являются median(), median_low(), median_high(), median_grouped(), mode(), multimode() и quantiles(). Значения NaN должны быть удалены перед вызовом этих функций:

>>> from statistics import median
>>> from math import isnan
>>> from itertools import filterfalse

>>> data = [20.7, float('NaN'),19.2, 18.3, float('NaN'), 14.4]
>>> sorted(data)  # This has surprising behavior
[20.7, nan, 14.4, 18.3, 19.2, nan]
>>> median(data)  # This result is unexpected
16.35

>>> sum(map(isnan, data))    # Number of missing values
2
>>> clean = list(filterfalse(isnan, data))  # Strip NaN values
>>> clean
[20.7, 19.2, 18.3, 14.4]
>>> sorted(clean)  # Sorting now works as expected
[14.4, 18.3, 19.2, 20.7]
>>> median(clean)       # This result is now well defined
18.75

Средние значения и меры центрального расположения

Эти функции вычисляют среднее или типичное значение из популяции или выборки.

mean()

Среднее арифметическое («среднее») данных.

fmean()

Быстрое среднее арифметическое с плавающей запятой.

geometric_mean()

Среднее геометрическое значение данных.

harmonic_mean()

Среднее гармоническое значение данных.

median()

Медиана (среднее значение) данных.

median_low()

Низкая медиана данных.

median_high()

Высокая медиана данных.

median_grouped()

Медиана, или 50-й процентиль, сгруппированных данных.

mode()

Одиночный режим (наиболее распространенное значение) дискретных или номинальных данных.

multimode()

Список режимов (наиболее распространенных значений) дискретных или номинальных данных.

quantiles()

Разделите данные на интервалы с равной вероятностью.

Меры распространения

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

pstdev()

Популяционное стандартное отклонение данных.

pvariance()

Популяционная дисперсия данных.

stdev()

Выборочное стандартное отклонение данных.

variance()

Выборочная дисперсия данных.

Статистика для отношений между двумя входами

Эти функции вычисляют статистику отношений между двумя входами.

covariance()

Выборочная ковариация для двух переменных.

correlation()

Коэффициент корреляции Пирсона для двух переменных.

linear_regression()

Наклон и перехват для простой линейной регрессии.

Детали функции

Примечание: Функции не требуют, чтобы передаваемые им данные были отсортированы. Однако для удобства чтения в большинстве примеров показаны отсортированные последовательности.

statistics.mean(data)

Возвращает выборочное среднее арифметическое из данных, которые могут быть последовательностью или итерабельными.

Среднее арифметическое - это сумма данных, деленная на количество точек данных. Его обычно называют «средним», хотя это лишь одно из многих различных математических средних. Это мера центрального положения данных.

Если data пуста, будет выдано сообщение StatisticsError.

Некоторые примеры использования:

>>> mean([1, 2, 3, 4, 4])
2.8
>>> mean([-1.0, 2.5, 3.25, 5.75])
2.625

>>> from fractions import Fraction as F
>>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)])
Fraction(13, 21)

>>> from decimal import Decimal as D
>>> mean([D("0.5"), D("0.75"), D("0.625"), D("0.375")])
Decimal('0.5625')

Примечание

Среднее значение сильно зависит от outliers и не обязательно является типичным примером точек данных. Для более надежной, хотя и менее эффективной, меры central tendency см. median().

Среднее значение выборки дает несмещенную оценку истинного среднего значения популяции, так что при усреднении по всем возможным выборкам mean(sample) сходится к истинному среднему значению всей популяции. Если данные представляют всю популяцию, а не выборку, то mean(data) эквивалентно вычислению истинного среднего значения популяции μ.

statistics.fmean(data)

Преобразуйте данные в плавающие значения и вычислите среднее арифметическое.

Она работает быстрее, чем функция mean(), и всегда возвращает float. Данными data может быть последовательность или итерабельность. Если входной набор данных пуст, возвращается StatisticsError.

>>> fmean([3.5, 4.0, 5.25])
4.25

Добавлено в версии 3.8.

statistics.geometric_mean(data)

Преобразуйте данные в плавающие значения и вычислите среднее геометрическое.

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

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

Никаких специальных усилий для достижения точных результатов не прилагается. (Однако в будущем это может измениться).

>>> round(geometric_mean([54, 24, 36]), 1)
36.0

Добавлено в версии 3.8.

statistics.harmonic_mean(data, weights=None)

Возвращает среднее гармоническое значение data, последовательность или итерабельность вещественных чисел. Если weights опущено или None, то предполагается равное взвешивание.

Среднее гармоническое - это обратное арифметическое mean() из взаимно обратных значений данных. Например, среднее гармоническое трех значений a, b и c будет равно 3/(1/a + 1/b + 1/c). Если одно из значений равно нулю, результат будет равен нулю.

Среднее гармоническое - это тип среднего, мера центрального положения данных. Оно часто подходит для усреднения соотношений или показателей, например, скорости.

Предположим, автомобиль проезжает 10 км со скоростью 40 км/час, затем еще 10 км со скоростью 60 км/час. Какова средняя скорость?

>>> harmonic_mean([40, 60])
48.0

Предположим, что автомобиль движется со скоростью 40 км/час на протяжении 5 км, а когда движение рассосется, разгоняется до 60 км/час на оставшиеся 30 км пути. Какова средняя скорость?

>>> harmonic_mean([40, 60], weights=[5, 30])
56.0

StatisticsError возникает, если data пуста, любой элемент меньше нуля, или если взвешенная сумма не положительна.

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

Добавлено в версии 3.6.

Изменено в версии 3.10: Добавлена поддержка весов.

statistics.median(data)

Возвращает медиану (среднее значение) числовых данных, используя обычный метод «среднее из двух средних». Если data пуста, то выдается StatisticsError. data может быть последовательностью или итерабельной переменной.

Медиана является надежной мерой центрального расположения, и на нее меньше влияет наличие выбросов. Если количество точек данных нечетное, возвращается средняя точка данных:

>>> median([1, 3, 5])
3

Если количество точек данных четное, медиана интерполируется путем взятия среднего из двух средних значений:

>>> median([1, 3, 5, 7])
4.0

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

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

statistics.median_low(data)

Возвращает низшую медиану числовых данных. Если data пуста, то выдается StatisticsError. data может быть последовательностью или итерабельной переменной.

Низшая медиана всегда входит в набор данных. Если количество точек данных нечетное, возвращается среднее значение. При четном числе возвращается меньшее из двух средних значений.

>>> median_low([1, 3, 5])
3
>>> median_low([1, 3, 5, 7])
3

Используйте низкую медиану, если ваши данные дискретны и вы предпочитаете, чтобы медиана была фактической точкой данных, а не интерполированной.

statistics.median_high(data)

Возвращает высокую медиану данных. Если data пуста, выдается сообщение StatisticsError. data может быть последовательностью или итерабельной переменной.

Высокая медиана всегда входит в набор данных. Если количество точек данных нечетное, возвращается среднее значение. При четном числе возвращается большее из двух средних значений.

>>> median_high([1, 3, 5])
3
>>> median_high([1, 3, 5, 7])
5

Используйте высокую медиану, если ваши данные дискретны и вы предпочитаете, чтобы медиана была фактической точкой данных, а не интерполированной.

statistics.median_grouped(data, interval=1)

Возвращает медиану сгруппированных непрерывных данных, рассчитанную как 50-й процентиль, с использованием интерполяции. Если data пуста, выдается сообщение StatisticsError. data может быть последовательностью или итерабельной переменной.

>>> median_grouped([52, 52, 53, 54])
52.5

В следующем примере данные округлены, так что каждое значение представляет собой среднюю точку классов данных, например, 1 - средняя точка класса 0,5–1,5, 2 - средняя точка класса 1,5–2,5, 3 - средняя точка класса 2,5–3,5 и т.д. В приведенных данных среднее значение находится где-то в классе 3,5-4,5, и для его оценки используется интерполяция:

>>> median_grouped([1, 2, 2, 3, 4, 4, 4, 4, 4, 5])
3.7

Необязательный аргумент interval представляет собой интервал класса и по умолчанию равен 1. Изменение интервала класса естественным образом изменит интерполяцию:

>>> median_grouped([1, 3, 3, 5, 7], interval=1)
3.25
>>> median_grouped([1, 3, 3, 5, 7], interval=2)
3.5

Эта функция не проверяет, находятся ли точки данных на расстоянии не менее интервала друг от друга.

CPython implementation detail: При некоторых обстоятельствах median_grouped() может приводить точки данных к плавающим значениям. Это поведение, вероятно, изменится в будущем.

См.также

  • «Статистика для поведенческих наук», Фредерик Дж. Грейветтер и Ларри Б. Уоллнау (8-е издание).

  • Функция SSMEDIAN в электронной таблице Gnome Gnumeric, включая this discussion.

statistics.mode(data)

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

Если существует несколько режимов с одинаковой частотой, возвращается первый из них, встретившийся в данных. Если вместо этого требуется наименьший или наибольший из них, используйте min(multimode(data)) или max(multimode(data)). Если входные данные пусты, то выдается сообщение StatisticsError.

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

>>> mode([1, 1, 2, 3, 3, 3, 3, 4])
3

Режим уникален тем, что это единственная статистика в этом пакете, которая также применяется к номинальным (нечисловым) данным:

>>> mode(["red", "blue", "blue", "red", "green", "red", "red"])
'red'

Изменено в версии 3.8: Теперь обрабатывает мультимодальные наборы данных, возвращая первый найденный режим. Раньше, когда было найдено более одного режима, возвращалось StatisticsError.

statistics.multimode(data)

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

>>> multimode('aabbbbccddddeeffffgg')
['b', 'd', 'f']
>>> multimode('')
[]

Добавлено в версии 3.8.

statistics.pstdev(data, mu=None)

Возвращает стандартное отклонение популяции (квадратный корень из дисперсии популяции). Аргументы и другие подробности см. в pvariance().

>>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])
0.986893273527251
statistics.pvariance(data, mu=None)

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

Если указан необязательный второй аргумент mu, то обычно это среднее значение данных. Он также может быть использован для вычисления второго момента вокруг точки, которая не является средним значением. Если он отсутствует или None (по умолчанию), автоматически вычисляется среднее арифметическое.

Используйте эту функцию для расчета дисперсии по всей совокупности. Для оценки дисперсии по выборке обычно лучше использовать функцию variance().

Вызывает StatisticsError, если data пуста.

Примеры:

>>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]
>>> pvariance(data)
1.25

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

>>> mu = mean(data)
>>> pvariance(data, mu)
1.25

Поддерживаются десятичные и дробные числа:

>>> from decimal import Decimal as D
>>> pvariance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])
Decimal('24.815')

>>> from fractions import Fraction as F
>>> pvariance([F(1, 4), F(5, 4), F(1, 2)])
Fraction(13, 72)

Примечание

При обращении ко всей популяции это дает дисперсию популяции σ². При вызове на выборке вместо этого получается дисперсия смещенной выборки s², также известная как дисперсия с N степенями свободы.

Если вам каким-то образом известно истинное среднее значение популяции μ, вы можете использовать эту функцию для расчета дисперсии выборки, указав в качестве второго аргумента известное среднее значение популяции. При условии, что точки данных являются случайной выборкой из популяции, результатом будет несмещенная оценка дисперсии популяции.

statistics.stdev(data, xbar=None)

Возвращает стандартное отклонение выборки (квадратный корень из дисперсии выборки). Аргументы и другие подробности см. в variance().

>>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])
1.0810874155219827
statistics.variance(data, xbar=None)

Возвращает выборочную дисперсию data, итерабельную переменную, состоящую как минимум из двух вещественных чисел. Дисперсия, или второй момент относительно среднего, является мерой изменчивости (разброса или дисперсии) данных. Большая дисперсия указывает на то, что данные разбросаны; малая дисперсия указывает на то, что они тесно сгруппированы вокруг среднего значения.

Если указан необязательный второй аргумент xbar, то это должно быть среднее значение data. Если он отсутствует или None (по умолчанию), среднее значение вычисляется автоматически.

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

Вызывает StatisticsError, если data имеет меньше двух значений.

Примеры:

>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> variance(data)
1.3720238095238095

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

>>> m = mean(data)
>>> variance(data, m)
1.3720238095238095

Эта функция не пытается проверить, что вы передали фактическое среднее значение в качестве xbar. Использование произвольных значений для xbar может привести к недостоверным или невозможным результатам.

Поддерживаются десятичные и дробные значения:

>>> from decimal import Decimal as D
>>> variance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])
Decimal('31.01875')

>>> from fractions import Fraction as F
>>> variance([F(1, 6), F(1, 2), F(5, 3)])
Fraction(67, 108)

Примечание

Это выборочная дисперсия s² с поправкой Бесселя, также известная как дисперсия с N-1 степенями свободы. При условии, что точки данных являются репрезентативными (например, независимыми и одинаково распределенными), результат должен быть несмещенной оценкой истинной дисперсии популяции.

Если вы каким-то образом знаете фактическое среднее значение популяции μ, вы должны передать его в функцию pvariance() в качестве параметра mu, чтобы получить дисперсию выборки.

statistics.quantiles(data, *, n=4, method='exclusive')

Разделить данные на n непрерывных интервалов с равной вероятностью. Возвращает список n - 1 точек среза, разделяющих интервалы.

Установите n равным 4 для квартилей (по умолчанию). Установите n на 10 для децилей. Задайте n равным 100 для перцентилей, что дает 99 точек среза, которые разделяют данные на 100 равных по размеру групп. Вызывает ошибку StatisticsError, если n не меньше 1.

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

Точки среза линейно интерполируются от двух ближайших точек данных. Например, если точка среза приходится на одну треть расстояния между двумя значениями выборки, 100 и 112, то точка среза будет оцениваться как 104.

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

По умолчанию метод «эксклюзивный» используется для данных, отобранных из популяции, которая может иметь больше экстремальных значений, чем найдено в выборках. Часть популяции, попадающая под i-ю из m отсортированных точек данных, вычисляется как i / (m + 1). Учитывая девять значений выборки, метод сортирует их и присваивает следующие процентили: 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%.

Установка метода в значение «inclusive» используется для описания данных о населении или для выборок, которые, как известно, включают самые экстремальные значения из населения. Минимальное значение в данных рассматривается как 0-й процентиль, а максимальное значение - как 100-й процентиль. Часть популяции, попадающая ниже i-го из m отсортированных точек данных, вычисляется как (i - 1) / (m - 1). Учитывая 11 значений выборки, метод сортирует их и присваивает следующие процентили: 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100%.

# Decile cut points for empirically sampled data
>>> data = [105, 129, 87, 86, 111, 111, 89, 81, 108, 92, 110,
...         100, 75, 105, 103, 109, 76, 119, 99, 91, 103, 129,
...         106, 101, 84, 111, 74, 87, 86, 103, 103, 106, 86,
...         111, 75, 87, 102, 121, 111, 88, 89, 101, 106, 95,
...         103, 107, 101, 81, 109, 104]
>>> [round(q, 1) for q in quantiles(data, n=10)]
[81.0, 86.2, 89.0, 99.4, 102.5, 103.6, 106.0, 109.8, 111.0]

Добавлено в версии 3.8.

statistics.covariance(x, y, /)

Возвращает выборочную ковариацию двух входов x и y. Ковариация - это мера совместной изменчивости двух входов.

Оба входа должны быть одинаковой длины (не менее двух), иначе выдается сообщение StatisticsError.

Примеры:

>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> y = [1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> covariance(x, y)
0.75
>>> z = [9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> covariance(x, z)
-7.5
>>> covariance(z, x)
-7.5

Добавлено в версии 3.10.

statistics.correlation(x, y, /)

Возвращает значение Pearson’s correlation coefficient для двух входов. Коэффициент корреляции Пирсона r принимает значения от -1 до +1. Он измеряет силу и направление линейной связи, где +1 означает очень сильную, положительную линейную связь, -1 - очень сильную, отрицательную линейную связь, а 0 - отсутствие линейной связи.

Оба входа должны быть одинаковой длины (не менее двух), и не должны быть постоянными, иначе будет выдано сообщение StatisticsError.

Примеры:

>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> y = [9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> correlation(x, x)
1.0
>>> correlation(x, y)
-1.0

Добавлено в версии 3.10.

statistics.linear_regression(x, y, /)

Возвращает наклон и перехват параметров simple linear regression, оцененных с помощью обыкновенных наименьших квадратов. Простая линейная регрессия описывает связь между независимой переменной x и зависимой переменной y в терминах этой линейной функции:

y = наклон * x + перехват + шум.

где slope и intercept - оцениваемые параметры регрессии, а noise представляет собой изменчивость данных, которая не была объяснена линейной регрессией (она равна разнице между предсказанными и фактическими значениями зависимой переменной).

Оба входа должны быть одинаковой длины (не менее двух), а независимая переменная x не может быть постоянной, иначе возникает ошибка StatisticsError.

Например, мы можем использовать release dates of the Monty Python films для прогнозирования совокупного количества фильмов «Монти Пайтон», которые были бы созданы к 2019 году, если предположить, что они сохранили бы прежний темп.

>>> year = [1971, 1975, 1979, 1982, 1983]
>>> films_total = [1, 2, 3, 4, 5]
>>> slope, intercept = linear_regression(year, films_total)
>>> round(slope * 2019 + intercept)
16

Добавлено в версии 3.10.

Исключения

Определено одно исключение:

exception statistics.StatisticsError

Подкласс ValueError для исключений, связанных со статистикой.

NormalDist объекты

NormalDist - это инструмент для создания и манипулирования нормальными распределениями random variable. Это класс, который рассматривает среднее и стандартное отклонение измерений данных как единое целое.

Нормальные распределения возникают из Central Limit Theorem и имеют широкий спектр применения в статистике.

class statistics.NormalDist(mu=0.0, sigma=1.0)

Возвращает новый объект NormalDist, где mu представляет arithmetic mean, а sigma представляет standard deviation.

Если sigma отрицательна, то выдает StatisticsError.

mean

Свойство только для чтения для arithmetic mean нормального распределения.

median

Свойство только для чтения для median нормального распределения.

mode

Свойство только для чтения для mode нормального распределения.

stdev

Свойство только для чтения для standard deviation нормального распределения.

variance

Свойство только для чтения для variance нормального распределения. Равна квадрату стандартного отклонения.

classmethod from_samples(data)

Создает экземпляр нормального распределения с параметрами mu и sigma, оцененными из данных с помощью fmean() и stdev().

Данные data могут быть любыми iterable и должны состоять из значений, которые могут быть преобразованы к типу float. Если data не содержит хотя бы двух элементов, то возникает ошибка StatisticsError, поскольку для оценки центрального значения требуется по крайней мере одна точка, а для оценки дисперсии - по крайней мере две.

samples(n, *, seed=None)

Генерирует n случайных выборок для заданных среднего и стандартного отклонения. Возвращает list из float значений.

Если задано seed, создается новый экземпляр генератора случайных чисел. Это полезно для создания воспроизводимых результатов даже в многопоточном контексте.

pdf(x)

Используя probability density function (pdf), вычислите относительную вероятность того, что случайная величина X будет находиться вблизи заданного значения x. Математически это предел отношения P(x <= X < x+dx) / dx по мере приближения dx к нулю.

Относительная вероятность рассчитывается как вероятность того, что образец попадет в узкий диапазон, деленная на ширину диапазона (отсюда слово «плотность»). Поскольку вероятность относительна по отношению к другим точкам, ее значение может быть больше, чем 1.0.

cdf(x)

Используя cumulative distribution function (cdf), вычислите вероятность того, что случайная величина X будет меньше или равна x. Математически это записывается P(X <= x).

inv_cdf(p)

Вычислите обратную кумулятивную функцию распределения, также известную как quantile function или percent-point. Математически она записывается как x : P(X <= x) = p.

Находит значение x случайной переменной X такое, что вероятность того, что переменная будет меньше или равна этому значению, равна заданной вероятности p.

overlap(other)

Измеряет согласие между двумя нормальными распределениями вероятности. Возвращает значение между 0,0 и 1,0, давая the overlapping area for the two probability density functions.

quantiles(n=4)

Разделить нормальное распределение на n непрерывных интервалов с равной вероятностью. Возвращает список (n - 1) точек среза, разделяющих интервалы.

Установите n равным 4 для квартилей (по умолчанию). Установите n равным 10 для децилей. Установите n на 100 для перцентилей, что дает 99 точек среза, которые разделяют нормальное распределение на 100 равных по размеру групп.

zscore(x)

Вычислите Standard Score, описывающее x в терминах количества стандартных отклонений выше или ниже среднего нормального распределения: (x - mean) / stdev.

Добавлено в версии 3.9.

Экземпляры NormalDist поддерживают сложение, вычитание, умножение и деление на константу. Эти операции используются для перевода и масштабирования. Например:

>>> temperature_february = NormalDist(5, 2.5)             # Celsius
>>> temperature_february * (9/5) + 32                     # Fahrenheit
NormalDist(mu=41.0, sigma=4.5)

Деление константы на экземпляр NormalDist не поддерживается, поскольку результат не будет нормально распределен.

Поскольку нормальные распределения возникают из аддитивных эффектов независимых переменных, можно add and subtract two independent normally distributed random variables представить как экземпляры NormalDist. Например:

>>> birth_weights = NormalDist.from_samples([2.5, 3.1, 2.1, 2.4, 2.7, 3.5])
>>> drug_effects = NormalDist(0.4, 0.15)
>>> combined = birth_weights + drug_effects
>>> round(combined.mean, 1)
3.1
>>> round(combined.stdev, 1)
0.5

Добавлено в версии 3.8.

NormalDist Примеры и рецепты

NormalDist легко решает классические вероятностные задачи.

Например, учитывая historical data for SAT exams, что баллы распределены нормально со средним значением 1060 и стандартным отклонением 195, определите процент студентов с тестовыми баллами между 1100 и 1200 после округления до ближайшего целого числа:

>>> sat = NormalDist(1060, 195)
>>> fraction = sat.cdf(1200 + 0.5) - sat.cdf(1100 - 0.5)
>>> round(fraction * 100.0, 1)
18.4

Найдите quartiles и deciles для баллов SAT:

>>> list(map(round, sat.quantiles()))
[928, 1060, 1192]
>>> list(map(round, sat.quantiles(n=10)))
[810, 896, 958, 1011, 1060, 1109, 1162, 1224, 1310]

Чтобы оценить распределение для модели, которую нелегко решить аналитически, NormalDist может генерировать входные выборки для Monte Carlo simulation:

>>> def model(x, y, z):
...     return (3*x + 7*x*y - 5*y) / (11 * z)
...
>>> n = 100_000
>>> X = NormalDist(10, 2.5).samples(n, seed=3652260728)
>>> Y = NormalDist(15, 1.75).samples(n, seed=4582495471)
>>> Z = NormalDist(50, 1.25).samples(n, seed=6582483453)
>>> quantiles(map(model, X, Y, Z))       
[1.4591308524824727, 1.8035946855390597, 2.175091447274739]

Нормальное распределение может быть использовано для приближения к Binomial distributions, когда размер выборки велик и когда вероятность успешного испытания близка к 50%.

Например, на конференции по открытому коду 750 участников и два зала, рассчитанные на 500 человек. В одном из них выступают с докладами о Python, а в другом - о Ruby. На предыдущих конференциях 65% слушателей предпочитали слушать доклады о Python. Если предположить, что предпочтения аудитории не изменились, какова вероятность того, что зал для Python останется в пределах своей вместимости?

>>> n = 750             # Sample size
>>> p = 0.65            # Preference for Python
>>> q = 1.0 - p         # Preference for Ruby
>>> k = 500             # Room capacity

>>> # Approximation using the cumulative normal distribution
>>> from math import sqrt
>>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4)
0.8402

>>> # Solution using the cumulative binomial distribution
>>> from math import comb, fsum
>>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4)
0.8402

>>> # Approximation using a simulation
>>> from random import seed, choices
>>> seed(8675309)
>>> def trial():
...     return choices(('Python', 'Ruby'), (p, q), k=n).count('Python')
>>> mean(trial() <= k for i in range(10_000))
0.8398

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

В Википедии есть nice example of a Naive Bayesian Classifier. Задача состоит в том, чтобы предсказать пол человека по измерениям нормально распределенных характеристик, включая рост, вес и размер ноги.

Нам дан обучающий набор данных с измерениями восьми человек. Предполагается, что измерения распределены нормально, поэтому мы суммируем данные с помощью NormalDist:

>>> height_male = NormalDist.from_samples([6, 5.92, 5.58, 5.92])
>>> height_female = NormalDist.from_samples([5, 5.5, 5.42, 5.75])
>>> weight_male = NormalDist.from_samples([180, 190, 170, 165])
>>> weight_female = NormalDist.from_samples([100, 150, 130, 150])
>>> foot_size_male = NormalDist.from_samples([12, 11, 12, 10])
>>> foot_size_female = NormalDist.from_samples([6, 8, 7, 9])

Далее мы сталкиваемся с новым человеком, чьи параметры известны, но пол неизвестен:

>>> ht = 6.0        # height
>>> wt = 130        # weight
>>> fs = 8          # foot size

Начиная с 50% вероятности prior probability быть мужчиной или женщиной, мы вычисляем апостериорное значение как предшествующее значение, умноженное на произведение вероятностей для измерений признаков с учетом пола:

>>> prior_male = 0.5
>>> prior_female = 0.5
>>> posterior_male = (prior_male * height_male.pdf(ht) *
...                   weight_male.pdf(wt) * foot_size_male.pdf(fs))

>>> posterior_female = (prior_female * height_female.pdf(ht) *
...                     weight_female.pdf(wt) * foot_size_female.pdf(fs))

Окончательное предсказание получает наибольший апостериор. Это известно как maximum a posteriori или MAP:

>>> 'male' if posterior_male > posterior_female else 'female'
'female'
Вернуться на верх