statistics.md
1> **Источник:** https://python-all.ru/3.8/library/statistics.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`statistics`](https://python-all.ru/3.8/library/statistics.html#module-statistics) – Функции математической статистики89Новое в версии 3.4.1011**Исходный код:** [Lib/statistics.py](https://python-all.ru/src/3.8/Lib/statistics.py)1213---1415Этот модуль предоставляет функции для вычисления математической статистики числовых данных (со значениями [`Real`](https://python-all.ru/3.8/library/numbers.html#numbers.Real)).1617Модуль не предназначен для конкуренции со сторонними библиотеками, такими как [NumPy](https://python-all.ru/3.8/library/statistics.html), [SciPy](https://python-all.ru/3.8/library/statistics.html), или проприетарными полнофункциональными пакетами статистики, ориентированными на профессиональных статистиков, такими как Minitab, SAS и Matlab. Он рассчитан на уровень графических и научных калькуляторов.1819Если не указано иное, эти функции поддерживают [`int`](https://python-all.ru/3.8/library/functions.html#int), [`float`](https://python-all.ru/3.8/library/functions.html#float), [`Decimal`](https://python-all.ru/3.8/library/decimal.html#decimal.Decimal) и [`Fraction`](https://python-all.ru/3.8/library/fractions.html#fractions.Fraction). Поведение с другими типами (будь то в числовой иерархии или нет) в настоящее время не поддерживается. Коллекции со смешанными типами также не определены и зависят от реализации. Если входные данные состоят из смешанных типов, можно использовать [`map()`](https://python-all.ru/3.8/library/functions.html#map) для обеспечения согласованного результата, например: `map(float, input_data)`.2021## Средние значения и меры центрального положения2223Эти функции вычисляют среднее или типичное значение из генеральной совокупности или выборки.2425| [`mean()`](https://python-all.ru/3.8/library/statistics.html#statistics.mean) | Среднее арифметическое (среднее) данных. |26| --- | --- |27| [`fmean()`](https://python-all.ru/3.8/library/statistics.html#statistics.fmean) | Быстрое среднее арифметическое с плавающей запятой. |28| [`geometric_mean()`](https://python-all.ru/3.8/library/statistics.html#statistics.geometric_mean) | Среднее геометрическое данных. |29| [`harmonic_mean()`](https://python-all.ru/3.8/library/statistics.html#statistics.harmonic_mean) | Среднее гармоническое данных. |30| [`median()`](https://python-all.ru/3.8/library/statistics.html#statistics.median) | Медиана (среднее значение) данных. |31| [`median_low()`](https://python-all.ru/3.8/library/statistics.html#statistics.median_low) | Нижняя медиана данных. |32| [`median_high()`](https://python-all.ru/3.8/library/statistics.html#statistics.median_high) | Верхняя медиана данных. |33| [`median_grouped()`](https://python-all.ru/3.8/library/statistics.html#statistics.median_grouped) | Медиана (или 50-й процентиль) сгруппированных данных. |34| [`mode()`](https://python-all.ru/3.8/library/statistics.html#statistics.mode) | Единственная мода (наиболее часто встречающееся значение) дискретных или номинальных данных. |35| [`multimode()`](https://python-all.ru/3.8/library/statistics.html#statistics.multimode) | Список мод (наиболее часто встречающихся значений) дискретных или номинальных данных. |36| [`quantiles()`](https://python-all.ru/3.8/library/statistics.html#statistics.quantiles) | Разделение данных на интервалы с равной вероятностью. |3738## Меры разброса3940Эти функции вычисляют меру того, насколько генеральная совокупность или выборка склонны отклоняться от типичных или средних значений.4142| [`pstdev()`](https://python-all.ru/3.8/library/statistics.html#statistics.pstdev) | Стандартное отклонение генеральной совокупности данных. |43| --- | --- |44| [`pvariance()`](https://python-all.ru/3.8/library/statistics.html#statistics.pvariance) | Дисперсия генеральной совокупности данных. |45| [`stdev()`](https://python-all.ru/3.8/library/statistics.html#statistics.stdev) | Стандартное отклонение выборки данных. |46| [`variance()`](https://python-all.ru/3.8/library/statistics.html#statistics.variance) | Дисперсия выборки данных. |4748## Подробности функции4950Примечание: функции не требуют, чтобы переданные им данные были отсортированы. Однако для удобства чтения в большинстве примеров показаны отсортированные последовательности.5152#### `statistics.mean(data)`5354Возвращает выборочное среднее арифметическое *data*, который может быть последовательностью или итерируемым объектом.5556Среднее арифметическое – это сумма данных, делённая на количество точек данных. Его часто называют «средним значением», хотя это лишь одна из многих различных математических средних. Это мера центрального положения данных.5758Если *data* пуст, будет возбуждено [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError).5960Некоторые примеры использования:6162```pycon63>>> mean([1, 2, 3, 4, 4])642.865>>> mean([-1.0, 2.5, 3.25, 5.75])662.6256768>>> from fractions import Fraction as F69>>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)])70Fraction(13, 21)7172>>> from decimal import Decimal as D73>>> mean([D("0.5"), D("0.75"), D("0.625"), D("0.375")])74Decimal('0.5625')75```7677> **Примечание**78>79> Среднее сильно зависит от выбросов и не является устойчивой оценкой центрального расположения: среднее не обязательно является типичным примером точек данных. Для более устойчивых мер центрального расположения см. [`median()`](https://python-all.ru/3.8/library/statistics.html#statistics.median) и [`mode()`](https://python-all.ru/3.8/library/statistics.html#statistics.mode).80>81> Выборочное среднее даёт несмещённую оценку истинного среднего генеральной совокупности, так что при усреднении по всем возможным выборкам `mean(sample)` сходится к истинному среднему всей совокупности. Если *data* представляет всю совокупность, а не выборку, то `mean(data)` эквивалентно вычислению истинного среднего генеральной совокупности μ.8283#### `statistics.fmean(data)`8485Преобразует *data* в числа с плавающей запятой и вычисляет среднее арифметическое.8687Эта функция работает быстрее, чем [`mean()`](https://python-all.ru/3.8/library/statistics.html#statistics.mean), и всегда возвращает [`float`](https://python-all.ru/3.8/library/functions.html#float). *data* может быть последовательностью или итерируемым объектом. Если входной набор данных пуст, возбуждает [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError).8889```pycon90>>> fmean([3.5, 4.0, 5.25])914.2592```9394Новое в версии 3.8.9596#### `statistics.geometric_mean(data)`9798Преобразует *data* в числа с плавающей запятой и вычисляет среднее геометрическое.99100Среднее геометрическое указывает центральную тенденцию или типичное значение *data*, используя произведение значений (в отличие от среднего арифметического, которое использует их сумму).101102Возбуждает [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError), если входной набор данных пуст, содержит ноль или отрицательное значение. *data* может быть последовательностью или итерируемым объектом.103104Не предпринимается особых усилий для достижения точных результатов. (Однако в будущем это может измениться.)105106```pycon107>>> round(geometric_mean([54, 24, 36]), 1)10836.0109```110111Новое в версии 3.8.112113#### `statistics.harmonic_mean(data)`114115Возвращает среднее гармоническое *данных* – последовательности или итерируемого объекта, состоящего из вещественных чисел.116117Среднее гармоническое, иногда называемое субконтрарным средним, – это величина, обратная среднему арифметическому [`mean()`](https://python-all.ru/3.8/library/statistics.html#statistics.mean) обратных значений данных. Например, среднее гармоническое трёх значений *a*, *b* и *c* будет равно `3/(1/a + 1/b + 1/c)`. Если одно из значений равно нулю, результат будет нулевым.118119Среднее гармоническое – это разновидность среднего, мера центральной тенденции данных. Оно часто подходит для усреднения скоростей или отношений, например, скоростей.120121Предположим, автомобиль проезжает 10 км со скоростью 40 км/ч, а затем ещё 10 км со скоростью 60 км/ч. Какова средняя скорость?122123```pycon124>>> harmonic_mean([40, 60])12548.0126```127128Предположим, инвестор покупает одинаковую стоимость акций в каждой из трёх компаний с коэффициентами P/E (цена/прибыль) 2.5, 3 и 10. Каково среднее значение P/E для портфеля инвестора?129130```pycon131>>> harmonic_mean([2.5, 3, 10]) # Для портфеля с равным распределением инвестиций.1323.6133```134135[`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError) возникает, если *данные* пусты или любой элемент меньше нуля.136137Текущий алгоритм выполняет досрочный выход при обнаружении нуля во входных данных. Это означает, что последующие входные данные не проверяются на корректность. (Такое поведение может измениться в будущем.)138139Новое в версии 3.6.140141#### `statistics.median(data)`142143Возвращает медиану (среднее значение) числовых данных, используя стандартный метод «среднее двух средних». Если *data* пусто, вызывается [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError). *data* может быть последовательностью или итератором.144145Медиана – это устойчивая мера центральной тенденции, менее подверженная влиянию выбросов. Если количество точек данных нечётное, возвращается средняя точка:146147```pycon148>>> median([1, 3, 5])1493150```151152Если количество точек данных чётное, медиана интерполируется как среднее двух средних значений:153154```pycon155>>> median([1, 3, 5, 7])1564.0157```158159Это подходит для дискретных данных, когда допустимо, что медиана может не быть фактической точкой данных.160161Если данные порядковые (поддерживают операции сравнения), но не числовые (не поддерживают сложение), рассмотрите возможность использования [`median_low()`](https://python-all.ru/3.8/library/statistics.html#statistics.median_low) или [`median_high()`](https://python-all.ru/3.8/library/statistics.html#statistics.median_high) вместо этого.162163#### `statistics.median_low(data)`164165Возвращает нижнюю медиану числовых данных. Если *data* пусто, вызывается [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError). *data* может быть последовательностью или итератором.166167Нижняя медиана всегда является элементом набора данных. При нечётном количестве точек возвращается среднее значение. При чётном – возвращается меньшее из двух средних значений.168169```pycon170>>> median_low([1, 3, 5])1713172>>> median_low([1, 3, 5, 7])1733174```175176Используйте нижнюю медиану, когда данные дискретны и вы предпочитаете, чтобы медиана была фактической точкой данных, а не интерполированной.177178#### `statistics.median_high(data)`179180Возвращает верхнюю медиану данных. Если *data* пусто, вызывается [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError). *data* может быть последовательностью или итератором.181182Верхняя медиана всегда является элементом набора данных. При нечётном количестве точек возвращается среднее значение. При чётном – возвращается большее из двух средних значений.183184```pycon185>>> median_high([1, 3, 5])1863187>>> median_high([1, 3, 5, 7])1885189```190191Используйте верхнюю медиану, когда данные дискретны и вы предпочитаете, чтобы медиана была фактической точкой данных, а не интерполированной.192193#### `statistics.median_grouped(data, interval=1)`194195Возвращает медиану сгруппированных непрерывных данных, вычисляемую как 50-й процентиль с помощью интерполяции. Если *data* пусто, возбуждается [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError). *data* может быть последовательностью или итератором.196197```pycon198>>> median_grouped([52, 52, 53, 54])19952.5200```201202В следующем примере данные округлены, так что каждое значение представляет середину интервала данных: например, 1 – середина интервала 0.5–1.5, 2 – середина 1.5–2.5, 3 – середина 2.5–3.5 и т.д. Для данных, приведённых ниже, медианное значение попадает в интервал 3.5–4.5, и для его оценки используется интерполяция:203204```pycon205>>> median_grouped([1, 2, 2, 3, 4, 4, 4, 4, 4, 5])2063.7207```208209Необязательный аргумент *interval* задаёт ширину интервала; по умолчанию равен 1. Изменение ширины интервала, естественно, повлияет на интерполяцию:210211```pycon212>>> median_grouped([1, 3, 3, 5, 7], interval=1)2133.25214>>> median_grouped([1, 3, 3, 5, 7], interval=2)2153.5216```217218Эта функция не проверяет, что точки данных отстоят друг от друга хотя бы на величину *interval*.219220**Особенность реализации CPython:** В некоторых случаях [`median_grouped()`](https://python-all.ru/3.8/library/statistics.html#statistics.median_grouped) может приводить точки данных к числам с плавающей запятой. Это поведение может измениться в будущем.221222> **См. также**223>224> - «Статистика для поведенческих наук», Фредерик Дж. Граветтер и Ларри Б. Уоллнау (8-е издание).225> - Функция [SSMEDIAN](https://python-all.ru/3.8/library/statistics.html) в электронной таблице Gnome Gnumeric, включая [это обсуждение](https://python-all.ru/3.8/library/statistics.html).226227#### `statistics.mode(data)`228229Возвращает единственное наиболее часто встречающееся значение из дискретных или номинальных *данных*. Мода (когда существует) – это наиболее типичное значение и служит мерой центрального положения.230231Если есть несколько мод с одинаковой частотой, возвращается первая, встреченная в *данных*. Если требуется наименьшая или наибольшая из них, используйте `min(multimode(data))` или `max(multimode(data))`. Если входные *данные* пусты, возбуждается [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError).232233`mode` предполагает дискретные данные и возвращает одно значение. Это стандартный подход к моде, как обычно учат в школах:234235```pycon236>>> mode([1, 1, 2, 3, 3, 3, 3, 4])2373238```239240Мода уникальна тем, что это единственная статистика в этом пакете, которая также применима к номинальным (нечисловым) данным:241242```pycon243>>> mode(["red", "blue", "blue", "red", "green", "red", "red"])244'red'245```246247Изменено в версии 3.8: Теперь обрабатывает мультимодальные наборы данных, возвращая первую встреченную моду. Ранее возбуждалось [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError), когда находилось более одной моды.248249#### `statistics.multimode(data)`250251Возвращает список наиболее часто встречающихся значений в порядке их первого появления в *данных*. Вернёт более одного результата, если есть несколько мод, или пустой список, если *данные* пусты:252253```pycon254>>> multimode('aabbbbccddddeeffffgg')255['b', 'd', 'f']256>>> multimode('')257[]258```259260Новое в версии 3.8.261262#### `statistics.pstdev(data, mu=None)`263264Возвращает стандартное отклонение генеральной совокупности (квадратный корень из дисперсии генеральной совокупности). См. [`pvariance()`](https://python-all.ru/3.8/library/statistics.html#statistics.pvariance) для получения аргументов и других подробностей.265266```pycon267>>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])2680.986893273527251269```270271#### `statistics.pvariance(data, mu=None)`272273Возвращает дисперсию генеральной совокупности для *данных* – непустой последовательности или итерации вещественных чисел. Дисперсия (второй центральный момент) – это мера изменчивости (разброса или рассеяния) данных. Большая дисперсия указывает на то, что данные разбросаны; малая – что они сгруппированы близко к среднему.274275Если указан необязательный второй аргумент *mu*, то он обычно является средним *data*. Его также можно использовать для вычисления второго момента относительно точки, отличной от среднего. Если он отсутствует или равен `None` (по умолчанию), среднее арифметическое вычисляется автоматически.276277Используйте эту функцию для расчёта дисперсии по всей генеральной совокупности. Для оценки дисперсии по выборке обычно лучше подходит функция [`variance()`](https://python-all.ru/3.8/library/statistics.html#statistics.variance).278279Возбуждает [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError), если *данные* пусты.280281Примеры:282283```pycon284>>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]285>>> pvariance(data)2861.25287```288289Если вы уже вычислили среднее своих данных, вы можете передать его в качестве необязательного второго аргумента *mu*, чтобы избежать повторного вычисления:290291```pycon292>>> mu = mean(data)293>>> pvariance(data, mu)2941.25295```296297Поддерживаются типы Decimal и Fraction:298299```pycon300>>> from decimal import Decimal as D301>>> pvariance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])302Decimal('24.815')303304>>> from fractions import Fraction as F305>>> pvariance([F(1, 4), F(5, 4), F(1, 2)])306Fraction(13, 72)307```308309> **Примечание**310>311> При вызове для всей генеральной совокупности получается дисперсия генеральной совокупности σ². При вызове для выборки получается смещённая выборочная дисперсия s², также известная как дисперсия с N степенями свободы.312>313> Если вам каким-либо образом известно истинное среднее генеральной совокупности μ, вы можете использовать эту функцию для расчёта дисперсии выборки, передав известное среднее генеральной совокупности в качестве второго аргумента. При условии, что точки данных являются случайной выборкой из совокупности, результат будет несмещённой оценкой дисперсии генеральной совокупности.314315#### `statistics.stdev(data, xbar=None)`316317Возвращает выборочное стандартное отклонение (квадратный корень из выборочной дисперсии). См. [`variance()`](https://python-all.ru/3.8/library/statistics.html#statistics.variance) для получения аргументов и других подробностей.318319```pycon320>>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])3211.0810874155219827322```323324#### `statistics.variance(data, xbar=None)`325326Возвращает выборочную дисперсию для *данных* – итерации, содержащей не менее двух вещественных чисел. Дисперсия (второй центральный момент) – это мера изменчивости (разброса или рассеяния) данных. Большая дисперсия указывает на то, что данные разбросаны; малая – что они сгруппированы близко к среднему.327328Если указан необязательный второй аргумент *xbar*, он должен быть средним *data*. Если он отсутствует или равен `None` (по умолчанию), среднее вычисляется автоматически.329330Используйте эту функцию, когда ваши данные являются выборкой из генеральной совокупности. Для расчёта дисперсии по всей совокупности см. [`pvariance()`](https://python-all.ru/3.8/library/statistics.html#statistics.pvariance).331332Возбуждает [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError), если в *данных* меньше двух значений.333334Примеры:335336```pycon337>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]338>>> variance(data)3391.3720238095238095340```341342Если среднее данных уже вычислено, его можно передать в качестве необязательного второго аргумента *xbar*, чтобы избежать повторного вычисления:343344```pycon345>>> m = mean(data)346>>> variance(data, m)3471.3720238095238095348```349350Эта функция не проверяет, было ли передано истинное среднее в качестве *xbar*. Использование произвольных значений для *xbar* может привести к неверным или невозможным результатам.351352Поддерживаются значения Decimal и Fraction:353354```pycon355>>> from decimal import Decimal as D356>>> variance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])357Decimal('31.01875')358359>>> from fractions import Fraction as F360>>> variance([F(1, 6), F(1, 2), F(5, 3)])361Fraction(67, 108)362```363364> **Примечание**365>366> Это выборочная дисперсия s² с поправкой Бесселя, также известная как дисперсия с N-1 степенями свободы. При условии, что точки данных репрезентативны (например, независимы и одинаково распределены), результат должен быть несмещенной оценкой истинной дисперсии генеральной совокупности.367>368> Если каким-либо образом известно истинное среднее генеральной совокупности μ, его следует передать в функцию [`pvariance()`](https://python-all.ru/3.8/library/statistics.html#statistics.pvariance) в качестве параметра *mu*, чтобы получить дисперсию выборки.369370#### `statistics.quantiles(data, *, n=4, method='exclusive')`371372Разделяет *data* на *n* непрерывных интервалов равной вероятности. Возвращает список из `n - 1` точек разделения, отделяющих интервалы.373374Задайте *n* равным 4 для квартилей (по умолчанию). Задайте *n* равным 10 для децилей. Задайте *n* равным 100 для процентилей, что даёт 99 точек разделения, которые делят *data* на 100 групп одинакового размера. Возбуждается [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError), если *n* меньше 1.375376*data* – любой итерируемый объект, содержащий выборочные данные. Для получения осмысленных результатов количество точек данных в *data* должно быть больше *n*. Возбуждает [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError), если имеется менее двух точек данных.377378Точки разделения линейно интерполируются между двумя ближайшими точками данных. Например, если точка разделения находится на расстоянии одной трети между двумя выборочными значениями, `100` и `112`, точка разделения будет равна `104`.379380Метод *method* вычисления квантилей может изменяться в зависимости от того, включает ли *data* наименьшие и наибольшие возможные значения из генеральной совокупности или исключает их.381382Метод *method* по умолчанию – «exclusive», и используется для данных, взятых из генеральной совокупности, которая может содержать более экстремальные значения, чем в выборке. Доля совокупности, попадающая ниже *i-го* из *m* отсортированных точек данных, вычисляется как `i / (m + 1)`. Для девяти выборочных значений метод сортирует их и присваивает следующие процентили: 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%.383384Установка *method* в «inclusive» используется для описания данных генеральной совокупности или для выборок, которые, как известно, содержат наиболее экстремальные значения из совокупности. Минимальное значение в *data* рассматривается как 0-й процентиль, а максимальное – как 100-й процентиль. Доля совокупности, попадающая ниже *i-го* из *m* отсортированных точек данных, вычисляется как `(i - 1) / (m - 1)`. Для 11 выборочных значений метод сортирует их и присваивает следующие процентили: 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100%.385386```pycon387# Decile cut points for empirically sampled data388>>> data = [105, 129, 87, 86, 111, 111, 89, 81, 108, 92, 110,389... 100, 75, 105, 103, 109, 76, 119, 99, 91, 103, 129,390... 106, 101, 84, 111, 74, 87, 86, 103, 103, 106, 86,391... 111, 75, 87, 102, 121, 111, 88, 89, 101, 106, 95,392... 103, 107, 101, 81, 109, 104]393>>> [round(q, 1) for q in quantiles(data, n=10)]394[81.0, 86.2, 89.0, 99.4, 102.5, 103.6, 106.0, 109.8, 111.0]395```396397Новое в версии 3.8.398399## Исключения400401Определено одно исключение:402403#### `exception statistics.StatisticsError`404405Подкласс [`ValueError`](https://python-all.ru/3.8/library/exceptions.html#ValueError) для исключений, связанных со статистикой.406407## [`NormalDist`](https://python-all.ru/3.8/library/statistics.html#statistics.NormalDist) объекты408409[`NormalDist`](https://python-all.ru/3.8/library/statistics.html#statistics.NormalDist) – это инструмент для создания и работы с нормальными распределениями [случайной величины](https://python-all.ru/3.8/library/statistics.html). Это класс, который рассматривает среднее и стандартное отклонение измерений данных как единую сущность.410411Нормальные распределения возникают из [Центральной предельной теоремы](https://python-all.ru/3.8/library/statistics.html) и имеют широкий спектр применений в статистике.412413#### `class statistics.NormalDist(mu=0.0, sigma=1.0)`414415Возвращает новый объект *NormalDist*, где *mu* представляет [среднее арифметическое](https://python-all.ru/3.8/library/statistics.html), а *sigma* представляет [стандартное отклонение](https://python-all.ru/3.8/library/statistics.html).416417Если *sigma* отрицательно, возбуждает [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError).418419#### `mean`420421Свойство только для чтения для [среднего арифметического](https://python-all.ru/3.8/library/statistics.html) нормального распределения.422423#### `median`424425Свойство только для чтения для [медианы](https://python-all.ru/3.8/library/statistics.html) нормального распределения.426427#### `mode`428429Свойство только для чтения для [моды](https://python-all.ru/3.8/library/statistics.html) нормального распределения.430431#### `stdev`432433Свойство только для чтения для [стандартного отклонения](https://python-all.ru/3.8/library/statistics.html) нормального распределения.434435#### `variance`436437Свойство только для чтения для [дисперсии](https://python-all.ru/3.8/library/statistics.html) нормального распределения. Равна квадрату стандартного отклонения.438439#### `classmethod from_samples(data)`440441Создаёт экземпляр нормального распределения с параметрами *mu* и *sigma*, оценёнными по *data* с использованием [`fmean()`](https://python-all.ru/3.8/library/statistics.html#statistics.fmean) и [`stdev()`](https://python-all.ru/3.8/library/statistics.html#statistics.stdev).442443*data* может быть любой [итерируемой](https://python-all.ru/3.8/glossary.html#term-iterable) последовательностью и должна состоять из значений, которые можно преобразовать в тип [`float`](https://python-all.ru/3.8/library/functions.html#float). Если *data* не содержит хотя бы два элемента, возбуждается [`StatisticsError`](https://python-all.ru/3.8/library/statistics.html#statistics.StatisticsError), поскольку для оценки центрального значения требуется хотя бы одна точка, а для оценки разброса – хотя бы две.444445#### `samples(n, *, seed=None)`446447Генерирует *n* случайных выборок для заданных среднего и стандартного отклонения. Возвращает [`list`](https://python-all.ru/3.8/library/stdtypes.html#list) из [`float`](https://python-all.ru/3.8/library/functions.html#float) значений.448449Если указан *seed*, создаётся новый экземпляр базового генератора случайных чисел. Это полезно для получения воспроизводимых результатов, даже в контексте многопоточности.450451#### `pdf(x)`452453Используя [функцию плотности вероятности (pdf)](https://python-all.ru/3.8/library/statistics.html), вычисляет относительную вероятность того, что случайная величина *X* будет около заданного значения *x*. Математически это предел отношения `P(x <= X < x+dx) / dx` при *dx*, стремящемся к нулю.454455Относительная вероятность вычисляется как вероятность попадания выборки в узкий диапазон, делённая на ширину диапазона (отсюда слово «плотность»). Поскольку вероятность относительна по отношению к другим точкам, её значение может быть больше *1.0*.456457#### `cdf(x)`458459Используя [функцию кумулятивного распределения (cdf)](https://python-all.ru/3.8/library/statistics.html), вычислить вероятность того, что случайная величина *X* будет меньше или равна *x*. Математически это записывается как `P(X <= x)`.460461#### `inv_cdf(p)`462463Вычисляет обратную функцию кумулятивного распределения, также известную как [квантильная функция](https://python-all.ru/3.8/library/statistics.html) или [процентная точка](https://python-all.ru/3.8/library/statistics.html). Математически это записывается как `x : P(X <= x) = p`.464465Находит значение *x* случайной величины *X*, такое что вероятность того, что переменная будет меньше или равна этому значению, равна заданной вероятности *p*.466467#### `overlap(other)`468469Измеряет согласие между двумя нормальными распределениями вероятностей. Возвращает значение от 0.0 до 1.0, представляющее [площадь перекрытия для двух функций плотности вероятности](https://python-all.ru/3.8/library/statistics.html).470471#### `quantiles(n=4)`472473Делит нормальное распределение на *n* непрерывных интервалов с равной вероятностью. Возвращает список из (n - 1) точек разделения, отделяющих интервалы.474475Установите *n* равным 4 для квартилей (по умолчанию). Установите *n* равным 10 для децилей. Установите *n* равным 100 для процентилей, что дает 99 точек разделения, которые делят нормальное распределение на 100 групп равного размера.476477Экземпляры [`NormalDist`](https://python-all.ru/3.8/library/statistics.html#statistics.NormalDist) поддерживают сложение, вычитание, умножение и деление на константу. Эти операции используются для смещения и масштабирования. Например:478479```pycon480>>> temperature_february = NormalDist(5, 2.5) # Цельсий481>>> temperature_february * (9/5) + 32 # Фаренгейт482NormalDist(mu=41.0, sigma=4.5)483```484485Деление константы на экземпляр [`NormalDist`](https://python-all.ru/3.8/library/statistics.html#statistics.NormalDist) не поддерживается, поскольку результат не был бы нормально распределен.486487Поскольку нормальные распределения возникают из аддитивных эффектов независимых переменных, можно [складывать и вычитать две независимые нормально распределенные случайные величины](https://python-all.ru/3.8/library/statistics.html), представленные в виде экземпляров [`NormalDist`](https://python-all.ru/3.8/library/statistics.html#statistics.NormalDist). Например:488489```pycon490>>> birth_weights = NormalDist.from_samples([2.5, 3.1, 2.1, 2.4, 2.7, 3.5])491>>> drug_effects = NormalDist(0.4, 0.15)492>>> combined = birth_weights + drug_effects493>>> round(combined.mean, 1)4943.1495>>> round(combined.stdev, 1)4960.5497```498499Новое в версии 3.8.500501### [`NormalDist`](https://python-all.ru/3.8/library/statistics.html#statistics.NormalDist) Примеры и рецепты502503[`NormalDist`](https://python-all.ru/3.8/library/statistics.html#statistics.NormalDist) легко решает классические задачи теории вероятностей.504505Например, имея [исторические данные по экзаменам SAT](https://python-all.ru/3.8/library/statistics.html), показывающие, что баллы распределены нормально со средним 1060 и стандартным отклонением 195, определите процент студентов с баллами между 1100 и 1200, округлив до ближайшего целого числа:506507```pycon508>>> sat = NormalDist(1060, 195)509>>> fraction = sat.cdf(1200 + 0.5) - sat.cdf(1100 - 0.5)510>>> round(fraction * 100.0, 1)51118.4512```513514Найдите [квартили](https://python-all.ru/3.8/library/statistics.html) и [децили](https://python-all.ru/3.8/library/statistics.html) для баллов SAT:515516```pycon517>>> list(map(round, sat.quantiles()))518[928, 1060, 1192]519>>> list(map(round, sat.quantiles(n=10)))520[810, 896, 958, 1011, 1060, 1109, 1162, 1224, 1310]521```522523Чтобы оценить распределение для модели, которую сложно решить аналитически, [`NormalDist`](https://python-all.ru/3.8/library/statistics.html#statistics.NormalDist) может генерировать входные выборки для [Монте- Карло моделирования](https://python-all.ru/3.8/library/statistics.html):524525```pycon526>>> def model(x, y, z):527... return (3*x + 7*x*y - 5*y) / (11 * z)528...529>>> n = 100_000530>>> X = NormalDist(10, 2.5).samples(n, seed=3652260728)531>>> Y = NormalDist(15, 1.75).samples(n, seed=4582495471)532>>> Z = NormalDist(50, 1.25).samples(n, seed=6582483453)533>>> quantiles(map(model, X, Y, Z)) 534[1.4591308524824727, 1.8035946855390597, 2.175091447274739]535```536537Нормальные распределения можно использовать для аппроксимации [биномиальных распределений](https://python-all.ru/3.8/library/statistics.html), когда размер выборки велик и вероятность успешного испытания близка к 50%.538539Например, на конференции с открытым исходным кодом 750 участников и два зала вместимостью 500 человек каждый. Есть доклад о Python и другой о Ruby. На предыдущих конференциях 65% участников предпочитали слушать доклады о Python. Предполагая, что предпочтения аудитории не изменились, какова вероятность того, что зал для Python не превысит свою вместимость?540541```pycon542>>> n = 750 # Размер выборки543>>> p = 0.65 # Предпочтение Python544>>> q = 1.0 - p # Предпочтение Ruby545>>> k = 500 # Вместимость комнаты546547>>> # Аппроксимация с помощью кумулятивного нормального распределения548>>> from math import sqrt549>>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4)5500.8402551552>>> # Решение с помощью кумулятивного биномиального распределения553>>> from math import comb, fsum554>>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4)5550.8402556557>>> # Аппроксимация с помощью симуляции558>>> from random import seed, choices559>>> seed(8675309)560>>> def trial():561... return choices(('Python', 'Ruby'), (p, q), k=n).count('Python')562>>> mean(trial() <= k for i in range(10_000))5630.8398564```565566Нормальные распределения часто встречаются в задачах машинного обучения.567568В Wikipedia есть [хороший пример наивного байесовского классификатора](https://python-all.ru/3.8/library/statistics.html). Задача – предсказать пол человека по измерениям нормально распределенных признаков, включая рост, вес и размер ноги.569570Дан обучающий набор данных с измерениями для восьми человек. Предполагается, что измерения нормально распределены, поэтому мы обобщаем данные с помощью [`NormalDist`](https://python-all.ru/3.8/library/statistics.html#statistics.NormalDist):571572```pycon573>>> height_male = NormalDist.from_samples([6, 5.92, 5.58, 5.92])574>>> height_female = NormalDist.from_samples([5, 5.5, 5.42, 5.75])575>>> weight_male = NormalDist.from_samples([180, 190, 170, 165])576>>> weight_female = NormalDist.from_samples([100, 150, 130, 150])577>>> foot_size_male = NormalDist.from_samples([12, 11, 12, 10])578>>> foot_size_female = NormalDist.from_samples([6, 8, 7, 9])579```580581Далее мы встречаем нового человека, чьи измерения признаков известны, но чей пол неизвестен:582583```pycon584>>> ht = 6.0 # рост585>>> wt = 130 # вес586>>> fs = 8 # размер ноги587```588589Начиная с 50% [априорной вероятности](https://python-all.ru/3.8/library/statistics.html) быть мужчиной или женщиной, мы вычисляем апостериорную как априорную, умноженную на произведение правдоподобий для измерений признаков при данном поле:590591```pycon592>>> prior_male = 0.5593>>> prior_female = 0.5594>>> posterior_male = (prior_male * height_male.pdf(ht) *595... weight_male.pdf(wt) * foot_size_male.pdf(fs))596597>>> posterior_female = (prior_female * height_female.pdf(ht) *598... weight_female.pdf(wt) * foot_size_female.pdf(fs))599```600601Окончательный прогноз отдается наибольшей апостериорной вероятности. Это известно как [максимум апостериорной вероятности](https://python-all.ru/3.8/library/statistics.html) или MAP:602603```pycon604>>> 'male' if posterior_male > posterior_female else 'female'605'female'606```607