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
Средние значения и показатели центрального расположения¶
Эти функции вычисляют среднее или типичное значение по совокупности или выборке.
Среднее арифметическое («усредненный показатель») данных. |
|
Быстрое среднее арифметическое с плавающей запятой и дополнительным взвешиванием. |
|
Среднее геометрическое значение данных. |
|
Среднее гармоническое значение данных. |
|
Медиана (среднее значение) данных. |
|
Низкая медиана данных. |
|
Высокая медиана данных. |
|
Медиана, или 50-й процентиль, сгруппированных данных. |
|
Одиночный режим (наиболее распространенное значение) дискретных или номинальных данных. |
|
Список режимов (наиболее распространенных значений) дискретных или номинальных данных. |
|
Разделите данные на интервалы с равной вероятностью. |
Меры распространения¶
Эти функции вычисляют меру того, насколько совокупность или выборка имеет тенденцию отклоняться от типичных или средних значений.
Стандартное отклонение данных по популяции. |
|
Дисперсия данных по популяции. |
|
Выборочное стандартное отклонение данных. |
|
Выборочная дисперсия данных. |
Статистика взаимосвязей между двумя входными данными¶
Эти функции вычисляют статистические данные, касающиеся связей между двумя входными данными.
Пример ковариации для двух переменных. |
|
Коэффициент корреляции Пирсона для двух переменных. |
|
Наклон и перехват для простой линейной регрессии. |
Детали функций¶
Примечание: Функции не требуют сортировки переданных им данных. Однако для удобства чтения в большинстве примеров приведены отсортированные последовательности.
- statistics.mean(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, weights=None)¶
Преобразуйте * данные* в значения с плавающей запятой и вычислите среднее арифметическое.
Эта функция выполняется быстрее, чем функция
mean()
, и всегда возвращает значениеfloat
. Данные могут быть последовательными или повторяемыми. Если входной набор данных пуст, генерируется значение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: Добавлена поддержка весов.
- statistics.geometric_mean(data)¶
Преобразуйте * данные* в значения с плавающей точкой и вычислите среднее геометрическое значение.
Среднее геометрическое указывает на основную тенденцию или типичное значение данных, используя произведение значений (в отличие от среднего арифметического, которое использует их сумму).
Выдает значение
StatisticsError
, если входной набор данных пуст, содержит ноль или отрицательное значение. Данные могут быть последовательными или итерационными.Мы не прилагаем особых усилий для достижения точных результатов. (Однако в будущем это может измениться).
>>> round(geometric_mean([54, 24, 36]), 1) 36.0
Добавлено в версии 3.8.
- statistics.harmonic_mean(data, weights=None)¶
Возвращает среднее гармоническое значение данных, последовательность или итерацию вещественных чисел. Если параметр weights опущен или None Отсутствует, то предполагается равный вес.
Среднее гармоническое значение является величиной, обратной арифметическому
mean()
значений, соответствующих данным. Например, среднее гармоническое значение трех значений a, b и c будет эквивалентно3/(1/a + 1/b + 1/c)
. Если одно из значений равно нулю, то результат будет нулевым.Среднее гармоническое значение - это тип среднего значения, отражающий центральное расположение данных. Оно часто используется при усреднении соотношений или показателей, например скоростей.
Предположим, автомобиль проезжает 10 км со скоростью 40 км/ч, затем еще 10 км со скоростью 60 км/ч. Какова средняя скорость?
>>> harmonic_mean([40, 60]) 48.0
Предположим, что автомобиль проезжает 5 км со скоростью 40 км/ч, а когда движение на дороге расступается, развивает скорость до 60 км/ч на оставшихся 30 км пути. Какова средняя скорость?
>>> harmonic_mean([40, 60], weights=[5, 30]) 56.0
StatisticsError
вызывается, если данные пусты, любой элемент меньше нуля или если взвешенная сумма не положительна.Текущий алгоритм завершает работу, когда обнаруживает ноль во входных данных. Это означает, что последующие входные данные не проверяются на достоверность. (В будущем это поведение может измениться).
Добавлено в версии 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-й процентиль, с использованием интерполяции. Если данные пусты, то значение
StatisticsError
увеличивается. данные могут быть последовательными или итерационными.>>> 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: При некоторых обстоятельствах
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)¶
Возвращает дисперсию совокупности данных, непустую последовательность или повторяемость вещественных чисел. Дисперсия, или второй момент относительно среднего значения, является мерой изменчивости (разброса или дисперсии рассеяния) данных. Большая дисперсия указывает на то, что данные разбросаны; небольшая дисперсия указывает на то, что они сгруппированы близко к среднему значению.
Если указан необязательный второй аргумент 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)
Примечание
При вызове для всей совокупности это дает дисперсию σ2 для совокупности. При вызове для выборки вместо этого это смещенная выборочная дисперсия s2, также известная как дисперсия с 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, то это должно быть среднее значение 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)
Примечание
Это выборочная дисперсия s2 с поправкой Бесселя, также известная как дисперсия с 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 должно быть больше, чем n. Значение
StatisticsError
увеличивается, если нет хотя бы двух точек данных.Точки разреза линейно интерполируются из двух ближайших точек данных. Например, если точка отсечения находится на расстоянии одной трети расстояния между двумя выборочными значениями
100
и112
, значение точки отсечения будет равно104
.Метод вычисления квантилей может варьироваться в зависимости от того, включают ли данные самые низкие и самые высокие возможные значения из совокупности или исключают их.
Метод * по умолчанию* является «эксклюзивным» и используется для данных, отобранных из совокупности, которые могут иметь более экстремальные значения, чем те, которые были найдены в выборках. Часть совокупности, находящаяся ниже i-й из m отсортированных точек данных, вычисляется как
i / (m + 1)
. Учитывая девять выборочных значений, метод сортирует их и присваивает следующие процентили: 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%.Установка для параметра method значения «inclusive» используется для описания данных о популяции или для выборок, которые, как известно, включают наиболее экстремальные значения из совокупности. Минимальное значение в data обрабатывается как 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, /, *, proportional=False)¶
Возвращает наклон и пересечение 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
Если значение пропорционально равно true, то независимая переменная x и зависимая переменная y считаются прямо пропорциональными. Данные соответствуют прямой, проходящей через начало координат. Поскольку точка пересечения всегда будет равна 0,0, базовая линейная функция упрощается до:
y = наклон * x + шум
Добавлено в версии 3.10.
Изменено в версии 3.11: Добавлена поддержка функции пропорциональный.
Исключения¶
Определено единственное исключение:
- 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.
Если сигма отрицательна, то выводится значение
StatisticsError
.- mean¶
Свойство, доступное только для чтения, для arithmetic mean нормального распределения.
- stdev¶
Свойство, доступное только для чтения, для standard deviation нормального распределения.
- variance¶
Свойство, доступное только для чтения, для variance нормального распределения. Равно квадрату стандартного отклонения.
- classmethod from_samples(data)¶
Создает экземпляр нормального распределения с параметрами mu и sigma, вычисленными на основе данных с использованием
fmean()
иstdev()
.Данные могут быть любыми iterable и должны состоять из значений, которые могут быть преобразованы в тип
float
. Если данные не содержат по крайней мере двух элементов, увеличивается значение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. Предполагая, что предпочтения населения не изменились, какова вероятность того, что комната Питона останется в пределах своих возможностей?
>>> 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 или КАРТОЙ:
>>> 'male' if posterior_male > posterior_female else 'female'
'female'