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

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

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


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

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

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

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

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

mean() Среднее арифметическое («среднее») данных.
fmean() Быстрое арифметическое с плавающей точкой.
geometric_mean() Среднее геометрическое данных.
harmonic_mean() Гармоническое среднее данных.
median() Медиана (среднее значение) данных.
median_low() Низкая медиана данных.
median_high() Высокая медиана данных.
median_grouped() Медиана или 50-й процентиль сгруппированных данных.
mode() Одиночный режим (наиболее распространенное значение) дискретных или номинальных данных.
multimode() Список режимов (наиболее распространенных значений) дискретных или номинальных данных.
quantiles() Разделите данные на интервалы с равной вероятностью.

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

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

pstdev() Популяционное стандартное отклонение данных.
pvariance() Популяционная дисперсия данных.
stdev() Образец стандартного отклонения данных.
variance() Выборочная дисперсия данных.

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

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

statistics.mean(data)

Возвращает среднее арифметическое образца 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')

Примечание

Среднее значение сильно зависит от отклонений и не является надежным оценщиком для центрального местоположения: среднее значение не обязательно является типичным примером точек данных. Более надежные измерения центрального местоположения см. в разделах median() и mode().

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

statistics.fmean(data)

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

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

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

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

statistics.geometric_mean(data)

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

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

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

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

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

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

statistics.harmonic_mean(data)

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

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

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

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

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

Предположим, что инвестор приобретает равное значение акций в каждой из трех компаний с коэффициентами P/E (цена/доход) 2,5, 3 и 10. Каков средний коэффициент P/E для портфеля инвестора

>>> harmonic_mean([2.5, 3, 10])  # Для равного инвестиционного портфеля.
3.6

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

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

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

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

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

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

См.также

  • «Статистика поведенческих наук», Frederick J Gravetter и Larry B Wallnau (8-е издание).
  • Функция SSMEDIAN в электронной таблице Gnome Gnumeric, включая это обсуждение.
statistics.mode(data)

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

Если существует несколько режимов с одинаковой частотой, возвращает первый, встречающийся в data. Если требуется наименьший или наибольший из них, используйте min(multimode(data)) или max(multimode(data)). Если входной 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)

Возвращает список наиболее часто встречающихся значения в том порядке, в котором они были впервые обнаружены в data. Будет возвращает несколько результатов при наличии нескольких режимов или пустого списка, если 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, это обычно среднее значение data. Также можно используемый вычислить второй момент вокруг точки, которая не является средней. Если он отсутствует или 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')

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

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

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

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

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

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

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

# Децильные точки для эмпирически выбранных данных
>>> 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.

Исключения

Определяется одна особая ситуация:

exception statistics.StatisticsError

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

Объекты NormalDist

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

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

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

Возвращает новый объект NormalDist, где mu представляет среднее арифметическое, а sigma представляет стандартное отклонение.

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

mean

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

median

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

mode

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

stdev

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

variance

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

classmethod from_samples(data)

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

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

samples(n, *, seed=None)

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

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

pdf(x)

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

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

cdf(x)

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

inv_cdf(p)

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

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

overlap(other)

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

quantiles(n=4)

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

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

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

>>> temperature_february = NormalDist(5, 2.5)             # Цельсий
>>> temperature_february * (9/5) + 32                     # Фаренгейт
NormalDist(mu=41.0, sigma=4.5)

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

Поскольку нормальные распределения возникают из аддитивных эффектов независимых переменных, можно сложить и вычесть две независимые нормально распределенные случайной величины представлено в виде сущности 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 легко решает классические задачи вероятности.

Например, учитывая исторические данные для экзаменов SAT, показывающие, что баллы обычно распределяются со средним значением 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

Найдите квартили и децили для оценок 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 может генерировать входные выборки для Симуляции Монте-Карло:

>>> 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]

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

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

>>> n = 750             # Размер образца
>>> p = 0.65            # Предпочтение Python
>>> q = 1.0 - p         # Предпочтение Ruby
>>> k = 500             # Вместимость комнаты

>>> # Аппроксимация с использованием кумулятивного нормального распределения
>>> from math import sqrt
>>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4)
0.8402

>>> # Решение с использованием кумулятивного биномиального распределения
>>> from math import comb, fsum
>>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4)
0.8402

>>> # Аппроксимация с использованием симуляции
>>> 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

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

У Википедии есть хороший пример наивного Байесовского классификатора. Задача состоит в том, чтобы предсказать пол человека по измерениям нормально распределенных признаков, включая рост, вес и размер стопы.

Мы получили обучающий набор данных с измерениями для восьми человек. Измерения считаются нормально распределенными, поэтому мы суммируем данные с 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        # рост
>>> wt = 130        # вес
>>> fs = 8          # размер ноги

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

>>> 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))

Окончательный прогноз идет до самого большого апостериорного Это называется апостериорный максимум или MAP:

>>> 'male' if posterior_male > posterior_female else 'female'
'female'