Spec-Zone.ru › Python 3.11

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

Новая в версии 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()

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

END_OF_DOCUMENT_MARKER

Подробности функций

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

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

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

statistics.fmean(data, weights=None)

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

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

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

Поддерживается необязательное взвешивание. Например, преподаватель выставляет оценки за курс, присваивая весовые коэффициенты: 20% за викторины, 20% за домашние задания, 30% за промежуточный экзамен и 30% за итоговый экзамен:

>>> grades = [85, 92, 83, 91]
>>> weights = [0.20, 0.20, 0.30, 0.30]
>>> fmean(grades, weights)
87.6

Если заданы weights, они должны иметь такую же длину, как и data, иначе будет поднято исключение ValueError.

Новое в версии 3.8.

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

statistics.geometric_mean(data)

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

Геометрическое среднее указывает центральную тенденцию или типичное значение 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: Добавлена поддержка weights.

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

См. также

  • «Статистика для поведенческих наук», Фредерик Дж. Граветтер и Ларри Б. Уоллнау (8-е издание).
  • Функция SSMEDIAN в электронных таблицах Gnome Gnumeric, включая это обсуждение.
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)

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

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

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

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

Примеры:

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

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

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

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

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

Примеры:

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

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

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

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

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

Установка метода в «включительно» используется для описания данных генеральной совокупности или для выборок, которые, как известно, включают самые крайние значения из генеральной совокупности. Наименьшее значение в данных рассматривается как 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, /)

Возвращает коэффициент корреляции Пирсона для двух входов. Коэффициент корреляции Пирсона 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, /, *, proportional=False)

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

y = наклон * x + точка_пересечения + шум

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

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

Например, мы можем использовать даты выхода фильмов Монти Пайтона, чтобы спрогнозировать суммарное количество фильмов Монти Пайтона, которые были бы произведены к 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

Если proportional равно true, то независимая переменная x и зависимая переменная y предполагаются прямо пропорциональными. Данные подгоняются к прямой, проходящей через начало координат. Поскольку точка_пересечения всегда будет равна 0,0, лежащая в основе линейная функция упрощается до:

y = наклон * x + шум

New in version 3.10.

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

Исключения

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

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, оцененными из данных с использованием fmean() и stdev().

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

zscore(x)

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

New in version 3.9.

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

>>> temperature_february = NormalDist(5, 2.5)             # Celsius
>>> temperature_february * (9/5) + 32                     # Fahrenheit
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

New in version 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             # 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

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

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

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

© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/statistics.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API