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')Примечание
Среднее значение сильно зависит от выбросов и не обязательно является типичным примером точек данных. Для более устойчивой, хотя и менее эффективной, меры центральной тенденции см.
median().Выборочное среднее значение даёт несмещённую оценку истинного среднего значения генеральной совокупности, так что при усреднении по всем возможным выборкам оно сходится к истинному среднему значению всей генеральной совокупности. Если данные представляют собой всю генеральную совокупность, а не выборку, то
mean(sample)эквивалентно вычислению истинного среднего значения генеральной совокупности μ.
-
statistics.fmean(data) -
Преобразует данные в числа с плавающей точкой и вычисляет среднее арифметическое.
Это выполняется быстрее, чем функция
mean(), и всегда возвращаетfloat. Данные могут быть последовательностью или итерируемым объектом. Если входной набор данных пуст, возникает исключениеStatisticsError.>>> fmean([3.5, 4.0, 5.25]) 4.25
Новая в версии 3.8.
-
statistics.geometric_mean(data) -
Преобразует данные в числа с плавающей точкой и вычисляет геометрическое среднее.
Геометрическое среднее указывает на центральную тенденцию или типичное значение данных, используя произведение значений (в отличие от среднеарифметического, которое использует их сумму).
Выбрасывает исключение
StatisticsError, если входной набор данных пуст, содержит ноль или содержит отрицательное значение. Данные могут быть последовательностью или итерируемым объектом.Не предпринимается никаких особых усилий для получения точных результатов. (Однако это может измениться в будущем.)
>>> round(geometric_mean([54, 24, 36]), 1) 36.0
Новая в версии 3.8.
-
statistics.harmonic_mean(data, weights=None) -
Возвращает гармоническое среднее значение данных, последовательности или итерируемого объекта действительных чисел. Если веса пропущены или равны 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возникает, если данные пусты, какое-либо значение меньше нуля или если взвешенная сумма не положительна.Текущий алгоритм прерывается, когда встречается ноль во входных данных. Это означает, что последующие входные данные не проверяются на корректность. (Это поведение может измениться в будущем.)
Новая в версии 3.6.
Изменено в версии 3.10: Добавлена поддержка весов.
-
statistics.median(data) -
Возвращает медиану (среднее значение) числовых данных, используя общий метод «среднее двух средних». Если данные пустые, возникает исключение
StatisticsError. Данные могут быть последовательностью или итерируемым объектом.Медиана — это устойчивая мера центральной тенденции и меньше подвержена влиянию выбросов. Когда количество точек данных нечётное, возвращается средняя точка данных:
>>> median([1, 3, 5]) 3
Когда количество точек данных чётное, медиана интерполируется путём усреднения двух средних значений:
>>> median([1, 3, 5, 7]) 4.0
Это подходит для дискретных данных, и вас не смущает, что медиана может не быть фактической точкой данных.
Если данные упорядоченные (поддерживают операции сравнения), но не числовые (не поддерживают сложение), рассмотрите использование
median_low()илиmedian_high().
-
statistics.median_low(data) -
Возвращает низкую медиану числовых данных. Если данные пустые, возникает исключение
StatisticsError. Данные могут быть последовательностью или итерируемым объектом.Низкая медиана всегда является членом набора данных. Когда количество точек данных нечётное, возвращается среднее значение. Когда оно чётное, возвращается меньшее из двух средних значений.
>>> median_low([1, 3, 5]) 3 >>> median_low([1, 3, 5, 7]) 3
Используйте низкую медиану, когда ваши данные дискретные и вы предпочитаете, чтобы медиана была фактической точкой данных, а не интерполированной.
-
statistics.median_high(data) -
Возвращает высокую медиану данных. Если данные пустые, возникает исключение
StatisticsError. Данные могут быть последовательностью или итерируемым объектом.Высокая медиана всегда является членом набора данных. Когда количество точек данных нечётное, возвращается среднее значение. Когда оно чётное, возвращается большее из двух средних значений.
>>> 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
Функция не проверяет, находятся ли точки данных по крайней мере на расстоянии 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, /) -
Возвращает коэффициент наклона и значение y при x = 0 для параметров линейной регрессии, вычисленных с помощью метода наименьших квадратов. Линейная регрессия описывает взаимосвязь между независимой переменной x и зависимой переменной y в терминах этого линейного уравнения:
y = slope * x + intercept + noise
где
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
Новая в версии 3.10.
Исключения
Определено одно исключение:
-
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) -
Используя плотность вероятности, вычислите относительную вероятность того, что случайная величина X будет близка к заданному значению x. Математически это предел отношения
P(x <= X < x+dx) / dxпри стремлении dx к нулю.Относительная вероятность вычисляется как вероятность появления выборки в узком диапазоне, делённая на ширину диапазона (отсюда и термин «плотность»). Поскольку вероятность относительна к другим точкам, её значение может быть больше, чем
1.0.
-
cdf(x) -
Используя кумулятивную функцию распределения, вычислите вероятность того, что случайная величина 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.Доступно начиная с версии 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
Доступно начиная с версии 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.10/library/statistics.html