Документация Python неофициальный перевод

statistics.md

711 строк · 56.0 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.10/library/statistics.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`statistics`](https://python-all.ru/3.10/library/statistics.html#module-statistics) – Функции математической статистики89Новое в версии 3.4.1011**Исходный код:** [Lib/statistics.py](https://python-all.ru/src/3.10/Lib/statistics.py)1213---1415Этот модуль предоставляет функции для вычисления математической статистики числовых данных (со значениями [`Real`](https://python-all.ru/3.10/library/numbers.html#numbers.Real)).1617Модуль не предназначен для конкуренции со сторонними библиотеками, такими как [NumPy](https://python-all.ru/3.10/library/statistics.html), [SciPy](https://python-all.ru/3.10/library/statistics.html), или проприетарными полнофункциональными пакетами статистики, ориентированными на профессиональных статистиков, такими как Minitab, SAS и Matlab. Он рассчитан на уровень графических и научных калькуляторов.1819Если не указано иное, эти функции поддерживают [`int`](https://python-all.ru/3.10/library/functions.html#int), [`float`](https://python-all.ru/3.10/library/functions.html#float), [`Decimal`](https://python-all.ru/3.10/library/decimal.html#decimal.Decimal) и [`Fraction`](https://python-all.ru/3.10/library/fractions.html#fractions.Fraction). Поведение с другими типами (будь то в числовой иерархии или нет) в настоящее время не поддерживается. Коллекции со смешанными типами также не определены и зависят от реализации. Если входные данные состоят из смешанных типов, можно использовать [`map()`](https://python-all.ru/3.10/library/functions.html#map) для обеспечения согласованного результата, например: `map(float, input_data)`.2021В некоторых наборах данных используются значения `NaN` (не число) для обозначения пропущенных данных. Поскольку NaN имеют необычную семантику сравнения, они приводят к неожиданному или неопределенному поведению в функциях статистики, которые сортируют данные или подсчитывают вхождения. Затронутые функции: `median()`, `median_low()`, `median_high()`, `median_grouped()`, `mode()`, `multimode()` и `quantiles()`. Перед вызовом этих функций значения `NaN` следует удалить:2223```python24>>> from statistics import median25>>> from math import isnan26>>> from itertools import filterfalse2728>>> data = [20.7, float('NaN'),19.2, 18.3, float('NaN'), 14.4]29>>> sorted(data)  # Это приводит к неожиданному поведению30[20.7, nan, 14.4, 18.3, 19.2, nan]31>>> median(data)  # Этот результат неожиданный3216.353334>>> sum(map(isnan, data))    # Количество пропущенных значений35236>>> clean = list(filterfalse(isnan, data))  # Удалить NaN-значения37>>> clean38[20.7, 19.2, 18.3, 14.4]39>>> sorted(clean)  # Сортировка теперь работает как ожидается40[14.4, 18.3, 19.2, 20.7]41>>> median(clean)       # Этот результат теперь определён корректно4218.7543```4445## Средние значения и меры центрального положения4647Эти функции вычисляют среднее или типичное значение из генеральной совокупности или выборки.4849| [`mean()`](https://python-all.ru/3.10/library/statistics.html#statistics.mean) | Среднее арифметическое (среднее) данных. |50| --- | --- |51| [`fmean()`](https://python-all.ru/3.10/library/statistics.html#statistics.fmean) | Быстрое среднее арифметическое с плавающей запятой. |52| [`geometric_mean()`](https://python-all.ru/3.10/library/statistics.html#statistics.geometric_mean) | Среднее геометрическое данных. |53| [`harmonic_mean()`](https://python-all.ru/3.10/library/statistics.html#statistics.harmonic_mean) | Среднее гармоническое данных. |54| [`median()`](https://python-all.ru/3.10/library/statistics.html#statistics.median) | Медиана (среднее значение) данных. |55| [`median_low()`](https://python-all.ru/3.10/library/statistics.html#statistics.median_low) | Нижняя медиана данных. |56| [`median_high()`](https://python-all.ru/3.10/library/statistics.html#statistics.median_high) | Верхняя медиана данных. |57| [`median_grouped()`](https://python-all.ru/3.10/library/statistics.html#statistics.median_grouped) | Медиана (или 50-й процентиль) сгруппированных данных. |58| [`mode()`](https://python-all.ru/3.10/library/statistics.html#statistics.mode) | Единственная мода (наиболее часто встречающееся значение) дискретных или номинальных данных. |59| [`multimode()`](https://python-all.ru/3.10/library/statistics.html#statistics.multimode) | Список мод (наиболее часто встречающихся значений) дискретных или номинальных данных. |60| [`quantiles()`](https://python-all.ru/3.10/library/statistics.html#statistics.quantiles) | Разделение данных на интервалы с равной вероятностью. |6162## Меры разброса6364Эти функции вычисляют меру того, насколько генеральная совокупность или выборка склонны отклоняться от типичных или средних значений.6566| [`pstdev()`](https://python-all.ru/3.10/library/statistics.html#statistics.pstdev) | Стандартное отклонение генеральной совокупности данных. |67| --- | --- |68| [`pvariance()`](https://python-all.ru/3.10/library/statistics.html#statistics.pvariance) | Дисперсия генеральной совокупности данных. |69| [`stdev()`](https://python-all.ru/3.10/library/statistics.html#statistics.stdev) | Стандартное отклонение выборки данных. |70| [`variance()`](https://python-all.ru/3.10/library/statistics.html#statistics.variance) | Дисперсия выборки данных. |7172## Статистика взаимосвязей между двумя входными данными7374Эти функции вычисляют статистики, касающиеся взаимосвязей между двумя наборами данных.7576| [`covariance()`](https://python-all.ru/3.10/library/statistics.html#statistics.covariance) | Выборочная ковариация двух переменных. |77| --- | --- |78| [`correlation()`](https://python-all.ru/3.10/library/statistics.html#statistics.correlation) | Коэффициент корреляции Пирсона для двух переменных. |79| [`linear_regression()`](https://python-all.ru/3.10/library/statistics.html#statistics.linear_regression) | Наклон и пересечение для простой линейной регрессии. |8081## Подробности функции8283Примечание: функции не требуют, чтобы переданные им данные были отсортированы. Однако для удобства чтения в большинстве примеров показаны отсортированные последовательности.8485#### `statistics.mean(data)`8687Возвращает выборочное среднее арифметическое *data*, который может быть последовательностью или итерируемым объектом.8889Среднее арифметическое – это сумма данных, делённая на количество точек данных. Его часто называют «средним значением», хотя это лишь одна из многих различных математических средних. Это мера центрального положения данных.9091Если *data* пуст, будет возбуждено [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError).9293Некоторые примеры использования:9495```pycon96>>> mean([1, 2, 3, 4, 4])972.898>>> mean([-1.0, 2.5, 3.25, 5.75])992.625100101>>> from fractions import Fraction as F102>>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)])103Fraction(13, 21)104105>>> from decimal import Decimal as D106>>> mean([D("0.5"), D("0.75"), D("0.625"), D("0.375")])107Decimal('0.5625')108```109110> **Примечание**111>112> Среднее сильно подвержено влиянию [выбросов](https://python-all.ru/3.10/library/statistics.html) и не обязательно является типичным примером точек данных. Для более устойчивой, хотя и менее эффективной, меры [центральной тенденции](https://python-all.ru/3.10/library/statistics.html) см. [`median()`](https://python-all.ru/3.10/library/statistics.html#statistics.median).113>114> Выборочное среднее даёт несмещённую оценку истинного среднего генеральной совокупности, так что при усреднении по всем возможным выборкам `mean(sample)` сходится к истинному среднему всей совокупности. Если *data* представляет всю совокупность, а не выборку, то `mean(data)` эквивалентно вычислению истинного среднего генеральной совокупности μ.115116#### `statistics.fmean(data)`117118Преобразует *data* в числа с плавающей запятой и вычисляет среднее арифметическое.119120Эта функция работает быстрее, чем [`mean()`](https://python-all.ru/3.10/library/statistics.html#statistics.mean), и всегда возвращает [`float`](https://python-all.ru/3.10/library/functions.html#float). *data* может быть последовательностью или итерируемым объектом. Если входной набор данных пуст, возбуждает [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError).121122```pycon123>>> fmean([3.5, 4.0, 5.25])1244.25125```126127Новое в версии 3.8.128129#### `statistics.geometric_mean(data)`130131Преобразует *data* в числа с плавающей запятой и вычисляет среднее геометрическое.132133Среднее геометрическое указывает центральную тенденцию или типичное значение *data*, используя произведение значений (в отличие от среднего арифметического, которое использует их сумму).134135Возбуждает [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError), если входной набор данных пуст, содержит ноль или отрицательное значение. *data* может быть последовательностью или итерируемым объектом.136137Не предпринимается особых усилий для достижения точных результатов. (Однако в будущем это может измениться.)138139```pycon140>>> round(geometric_mean([54, 24, 36]), 1)14136.0142```143144Новое в версии 3.8.145146#### `statistics.harmonic_mean(data, weights=None)`147148Возвращает гармоническое среднее *data* – последовательности или итератора вещественных чисел. Если *weights* опущен или равен *None*, то предполагается равное взвешивание.149150Среднее гармоническое – это обратная величина среднего арифметического [`mean()`](https://python-all.ru/3.10/library/statistics.html#statistics.mean) обратных величин данных. Например, среднее гармоническое трёх значений *a*, *b* и *c* будет эквивалентно `3/(1/a + 1/b + 1/c)`. Если одно из значений равно нулю, результат будет равен нулю.151152Среднее гармоническое – это разновидность среднего, мера центрального положения данных. Его часто применяют при усреднении отношений или скоростей, например, скоростей.153154Предположим, автомобиль проезжает 10 км со скоростью 40 км/ч, а затем ещё 10 км со скоростью 60 км/ч. Какова средняя скорость?155156```pycon157>>> harmonic_mean([40, 60])15848.0159```160161Предположим, автомобиль движется со скоростью 40 км/ч в течение 5 км, а когда трасса освобождается, ускоряется до 60 км/ч на оставшихся 30 км пути. Какова средняя скорость?162163```pycon164>>> harmonic_mean([40, 60], weights=[5, 30])16556.0166```167168[`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError) возбуждается, если *data* пуст, любой элемент меньше нуля или если взвешенная сумма не является положительной.169170Текущий алгоритм выполняет досрочный выход при обнаружении нуля во входных данных. Это означает, что последующие входные данные не проверяются на корректность. (Такое поведение может измениться в будущем.)171172Новое в версии 3.6.173174Изменено в версии 3.10: Добавлена поддержка *weights*.175176#### `statistics.median(data)`177178Возвращает медиану (среднее значение) числовых данных, используя стандартный метод «среднее двух средних». Если *data* пусто, вызывается [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError). *data* может быть последовательностью или итератором.179180Медиана – это устойчивая мера центральной тенденции, менее подверженная влиянию выбросов. Если количество точек данных нечётное, возвращается средняя точка:181182```pycon183>>> median([1, 3, 5])1843185```186187Если количество точек данных чётное, медиана интерполируется как среднее двух средних значений:188189```pycon190>>> median([1, 3, 5, 7])1914.0192```193194Это подходит для дискретных данных, когда допустимо, что медиана может не быть фактической точкой данных.195196Если данные порядковые (поддерживают операции сравнения), но не числовые (не поддерживают сложение), рассмотрите возможность использования [`median_low()`](https://python-all.ru/3.10/library/statistics.html#statistics.median_low) или [`median_high()`](https://python-all.ru/3.10/library/statistics.html#statistics.median_high) вместо этого.197198#### `statistics.median_low(data)`199200Возвращает нижнюю медиану числовых данных. Если *data* пусто, вызывается [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError). *data* может быть последовательностью или итератором.201202Нижняя медиана всегда является элементом набора данных. При нечётном количестве точек возвращается среднее значение. При чётном – возвращается меньшее из двух средних значений.203204```pycon205>>> median_low([1, 3, 5])2063207>>> median_low([1, 3, 5, 7])2083209```210211Используйте нижнюю медиану, когда данные дискретны и вы предпочитаете, чтобы медиана была фактической точкой данных, а не интерполированной.212213#### `statistics.median_high(data)`214215Возвращает верхнюю медиану данных. Если *data* пусто, вызывается [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError). *data* может быть последовательностью или итератором.216217Верхняя медиана всегда является элементом набора данных. При нечётном количестве точек возвращается среднее значение. При чётном – возвращается большее из двух средних значений.218219```pycon220>>> median_high([1, 3, 5])2213222>>> median_high([1, 3, 5, 7])2235224```225226Используйте верхнюю медиану, когда данные дискретны и вы предпочитаете, чтобы медиана была фактической точкой данных, а не интерполированной.227228#### `statistics.median_grouped(data, interval=1)`229230Возвращает медиану сгруппированных непрерывных данных, вычисляемую как 50-й процентиль с помощью интерполяции. Если *data* пусто, возбуждается [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError). *data* может быть последовательностью или итератором.231232```pycon233>>> median_grouped([52, 52, 53, 54])23452.5235```236237В следующем примере данные округлены, так что каждое значение представляет середину интервала данных: например, 1 – середина интервала 0.5–1.5, 2 – середина 1.5–2.5, 3 – середина 2.5–3.5 и т.д. Для данных, приведённых ниже, медианное значение попадает в интервал 3.5–4.5, и для его оценки используется интерполяция:238239```pycon240>>> median_grouped([1, 2, 2, 3, 4, 4, 4, 4, 4, 5])2413.7242```243244Необязательный аргумент *interval* задаёт ширину интервала; по умолчанию равен 1. Изменение ширины интервала, естественно, повлияет на интерполяцию:245246```pycon247>>> median_grouped([1, 3, 3, 5, 7], interval=1)2483.25249>>> median_grouped([1, 3, 3, 5, 7], interval=2)2503.5251```252253Эта функция не проверяет, что точки данных отстоят друг от друга хотя бы на величину *interval*.254255**Особенность реализации CPython:** В некоторых случаях [`median_grouped()`](https://python-all.ru/3.10/library/statistics.html#statistics.median_grouped) может приводить точки данных к числам с плавающей запятой. Это поведение может измениться в будущем.256257> **См. также**258>259> - «Статистика для поведенческих наук», Фредерик Дж. Граветтер и Ларри Б. Уоллнау (8-е издание).260> - Функция [SSMEDIAN](https://python-all.ru/3.10/library/statistics.html) в электронной таблице Gnome Gnumeric, включая [это обсуждение](https://python-all.ru/3.10/library/statistics.html).261262#### `statistics.mode(data)`263264Возвращает единственное наиболее часто встречающееся значение из дискретных или номинальных *данных*. Мода (когда существует) – это наиболее типичное значение и служит мерой центрального положения.265266Если есть несколько мод с одинаковой частотой, возвращается первая, встреченная в *данных*. Если требуется наименьшая или наибольшая из них, используйте `min(multimode(data))` или `max(multimode(data))`. Если входные *данные* пусты, возбуждается [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError).267268`mode` предполагает дискретные данные и возвращает одно значение. Это стандартный подход к моде, как обычно учат в школах:269270```pycon271>>> mode([1, 1, 2, 3, 3, 3, 3, 4])2723273```274275Мода уникальна тем, что это единственная статистика в этом пакете, которая также применима к номинальным (нечисловым) данным:276277```pycon278>>> mode(["red", "blue", "blue", "red", "green", "red", "red"])279'red'280```281282Изменено в версии 3.8: Теперь обрабатывает мультимодальные наборы данных, возвращая первую встреченную моду. Ранее возбуждалось [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError), когда находилось более одной моды.283284#### `statistics.multimode(data)`285286Возвращает список наиболее часто встречающихся значений в порядке их первого появления в *данных*. Вернёт более одного результата, если есть несколько мод, или пустой список, если *данные* пусты:287288```pycon289>>> multimode('aabbbbccddddeeffffgg')290['b', 'd', 'f']291>>> multimode('')292[]293```294295Новое в версии 3.8.296297#### `statistics.pstdev(data, mu=None)`298299Возвращает стандартное отклонение генеральной совокупности (квадратный корень из дисперсии генеральной совокупности). См. [`pvariance()`](https://python-all.ru/3.10/library/statistics.html#statistics.pvariance) для получения аргументов и других подробностей.300301```pycon302>>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])3030.986893273527251304```305306#### `statistics.pvariance(data, mu=None)`307308Возвращает дисперсию генеральной совокупности для *данных* – непустой последовательности или итерации вещественных чисел. Дисперсия (второй центральный момент) – это мера изменчивости (разброса или рассеяния) данных. Большая дисперсия указывает на то, что данные разбросаны; малая – что они сгруппированы близко к среднему.309310Если указан необязательный второй аргумент *mu*, то он обычно является средним *data*. Его также можно использовать для вычисления второго момента относительно точки, отличной от среднего. Если он отсутствует или равен `None` (по умолчанию), среднее арифметическое вычисляется автоматически.311312Используйте эту функцию для расчёта дисперсии по всей генеральной совокупности. Для оценки дисперсии по выборке обычно лучше подходит функция [`variance()`](https://python-all.ru/3.10/library/statistics.html#statistics.variance).313314Возбуждает [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError), если *данные* пусты.315316Примеры:317318```pycon319>>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]320>>> pvariance(data)3211.25322```323324Если вы уже вычислили среднее своих данных, вы можете передать его в качестве необязательного второго аргумента *mu*, чтобы избежать повторного вычисления:325326```pycon327>>> mu = mean(data)328>>> pvariance(data, mu)3291.25330```331332Поддерживаются типы Decimal и Fraction:333334```pycon335>>> from decimal import Decimal as D336>>> pvariance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])337Decimal('24.815')338339>>> from fractions import Fraction as F340>>> pvariance([F(1, 4), F(5, 4), F(1, 2)])341Fraction(13, 72)342```343344> **Примечание**345>346> При вызове для всей генеральной совокупности получается дисперсия генеральной совокупности σ². При вызове для выборки получается смещённая выборочная дисперсия s², также известная как дисперсия с N степенями свободы.347>348> Если вам каким-либо образом известно истинное среднее генеральной совокупности μ, вы можете использовать эту функцию для расчёта дисперсии выборки, передав известное среднее генеральной совокупности в качестве второго аргумента. При условии, что точки данных являются случайной выборкой из совокупности, результат будет несмещённой оценкой дисперсии генеральной совокупности.349350#### `statistics.stdev(data, xbar=None)`351352Возвращает выборочное стандартное отклонение (квадратный корень из выборочной дисперсии). См. [`variance()`](https://python-all.ru/3.10/library/statistics.html#statistics.variance) для получения аргументов и других подробностей.353354```pycon355>>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])3561.0810874155219827357```358359#### `statistics.variance(data, xbar=None)`360361Возвращает выборочную дисперсию для *данных* – итерации, содержащей не менее двух вещественных чисел. Дисперсия (второй центральный момент) – это мера изменчивости (разброса или рассеяния) данных. Большая дисперсия указывает на то, что данные разбросаны; малая – что они сгруппированы близко к среднему.362363Если указан необязательный второй аргумент *xbar*, он должен быть средним *data*. Если он отсутствует или равен `None` (по умолчанию), среднее вычисляется автоматически.364365Используйте эту функцию, когда ваши данные являются выборкой из генеральной совокупности. Для расчёта дисперсии по всей совокупности см. [`pvariance()`](https://python-all.ru/3.10/library/statistics.html#statistics.pvariance).366367Возбуждает [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError), если в *данных* меньше двух значений.368369Примеры:370371```pycon372>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]373>>> variance(data)3741.3720238095238095375```376377Если среднее данных уже вычислено, его можно передать в качестве необязательного второго аргумента *xbar*, чтобы избежать повторного вычисления:378379```pycon380>>> m = mean(data)381>>> variance(data, m)3821.3720238095238095383```384385Эта функция не проверяет, было ли передано истинное среднее в качестве *xbar*. Использование произвольных значений для *xbar* может привести к неверным или невозможным результатам.386387Поддерживаются значения Decimal и Fraction:388389```pycon390>>> from decimal import Decimal as D391>>> variance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])392Decimal('31.01875')393394>>> from fractions import Fraction as F395>>> variance([F(1, 6), F(1, 2), F(5, 3)])396Fraction(67, 108)397```398399> **Примечание**400>401> Это выборочная дисперсия s² с поправкой Бесселя, также известная как дисперсия с N-1 степенями свободы. При условии, что точки данных репрезентативны (например, независимы и одинаково распределены), результат должен быть несмещенной оценкой истинной дисперсии генеральной совокупности.402>403> Если каким-либо образом известно истинное среднее генеральной совокупности μ, его следует передать в функцию [`pvariance()`](https://python-all.ru/3.10/library/statistics.html#statistics.pvariance) в качестве параметра *mu*, чтобы получить дисперсию выборки.404405#### `statistics.quantiles(data, *, n=4, method='exclusive')`406407Разделяет *data* на *n* непрерывных интервалов равной вероятности. Возвращает список из `n - 1` точек разделения, отделяющих интервалы.408409Задайте *n* равным 4 для квартилей (по умолчанию). Задайте *n* равным 10 для децилей. Задайте *n* равным 100 для процентилей, что даёт 99 точек разделения, которые делят *data* на 100 групп одинакового размера. Возбуждается [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError), если *n* меньше 1.410411*data* – любой итерируемый объект, содержащий выборочные данные. Для получения осмысленных результатов количество точек данных в *data* должно быть больше *n*. Возбуждает [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError), если имеется менее двух точек данных.412413Точки разделения линейно интерполируются между двумя ближайшими точками данных. Например, если точка разделения находится на расстоянии одной трети между двумя выборочными значениями, `100` и `112`, точка разделения будет равна `104`.414415Метод *method* вычисления квантилей может изменяться в зависимости от того, включает ли *data* наименьшие и наибольшие возможные значения из генеральной совокупности или исключает их.416417Метод *method* по умолчанию – «exclusive», и используется для данных, взятых из генеральной совокупности, которая может содержать более экстремальные значения, чем в выборке. Доля совокупности, попадающая ниже *i-го* из *m* отсортированных точек данных, вычисляется как `i / (m + 1)`. Для девяти выборочных значений метод сортирует их и присваивает следующие процентили: 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%.418419Установка *method* в «inclusive» используется для описания данных генеральной совокупности или для выборок, которые, как известно, содержат наиболее экстремальные значения из совокупности. Минимальное значение в *data* рассматривается как 0-й процентиль, а максимальное – как 100-й процентиль. Доля совокупности, попадающая ниже *i-го* из *m* отсортированных точек данных, вычисляется как `(i - 1) / (m - 1)`. Для 11 выборочных значений метод сортирует их и присваивает следующие процентили: 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100%.420421```pycon422# Decile cut points for empirically sampled data423>>> data = [105, 129, 87, 86, 111, 111, 89, 81, 108, 92, 110,424...         100, 75, 105, 103, 109, 76, 119, 99, 91, 103, 129,425...         106, 101, 84, 111, 74, 87, 86, 103, 103, 106, 86,426...         111, 75, 87, 102, 121, 111, 88, 89, 101, 106, 95,427...         103, 107, 101, 81, 109, 104]428>>> [round(q, 1) for q in quantiles(data, n=10)]429[81.0, 86.2, 89.0, 99.4, 102.5, 103.6, 106.0, 109.8, 111.0]430```431432Новое в версии 3.8.433434#### `statistics.covariance(x, y, /)`435436Возвращает выборочную ковариацию двух входных последовательностей *x* и *y*. Ковариация – это мера совместной изменчивости двух входов.437438Оба входных параметра должны быть одной длины (не менее двух), в противном случае возбуждается [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError).439440Примеры:441442```pycon443>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9]444>>> y = [1, 2, 3, 1, 2, 3, 1, 2, 3]445>>> covariance(x, y)4460.75447>>> z = [9, 8, 7, 6, 5, 4, 3, 2, 1]448>>> covariance(x, z)449-7.5450>>> covariance(z, x)451-7.5452```453454Новое в версии 3.10.455456#### `statistics.correlation(x, y, /)`457458Возвращает [коэффициент корреляции Пирсона](https://python-all.ru/3.10/library/statistics.html) для двух входных данных. Коэффициент корреляции Пирсона *r* принимает значения от -1 до +1. Он измеряет силу и направление линейной связи: +1 означает очень сильную положительную линейную связь, -1 – очень сильную отрицательную линейную связь, а 0 – отсутствие линейной связи.459460Оба входных параметра должны быть одной длины (не менее двух) и не должны быть константными, иначе возбуждается [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError).461462Примеры:463464```pycon465>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9]466>>> y = [9, 8, 7, 6, 5, 4, 3, 2, 1]467>>> correlation(x, x)4681.0469>>> correlation(x, y)470-1.0471```472473Новое в версии 3.10.474475#### `statistics.linear_regression(x, y, /)`476477Возвращает угловой коэффициент и свободный член [простой линейной регрессии](https://python-all.ru/3.10/library/statistics.html), оцененные методом наименьших квадратов. Простая линейная регрессия описывает связь между независимой переменной *x* и зависимой переменной *y* с помощью следующей линейной функции:478479> *y = slope \* x + intercept + noise*480481где `slope` и `intercept` – оцениваемые параметры регрессии, а `noise` представляет изменчивость данных, не объяснённую линейной регрессией (она равна разности между предсказанными и фактическими значениями зависимой переменной).482483Оба входных параметра должны быть одной длины (не менее двух), а независимая переменная *x* не может быть константой; в противном случае возбуждается [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError).484485Например, можно использовать [даты выхода фильмов Монти Пайтона](https://python-all.ru/3.10/library/statistics.html), чтобы предсказать общее количество фильмов Монти Пайтона, которые были бы сняты к 2019 году, если бы темп сохранялся.486487```pycon488>>> year = [1971, 1975, 1979, 1982, 1983]489>>> films_total = [1, 2, 3, 4, 5]490>>> slope, intercept = linear_regression(year, films_total)491>>> round(slope * 2019 + intercept)49216493```494495Новое в версии 3.10.496497## Исключения498499Определено одно исключение:500501#### `exception statistics.StatisticsError`502503Подкласс [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError) для исключений, связанных со статистикой.504505## [`NormalDist`](https://python-all.ru/3.10/library/statistics.html#statistics.NormalDist) объекты506507[`NormalDist`](https://python-all.ru/3.10/library/statistics.html#statistics.NormalDist) – это инструмент для создания и работы с нормальными распределениями [случайной величины](https://python-all.ru/3.10/library/statistics.html). Это класс, который рассматривает среднее и стандартное отклонение измерений данных как единую сущность.508509Нормальные распределения возникают из [Центральной предельной теоремы](https://python-all.ru/3.10/library/statistics.html) и имеют широкий спектр применений в статистике.510511#### `class statistics.NormalDist(mu=0.0, sigma=1.0)`512513Возвращает новый объект *NormalDist*, где *mu* представляет [среднее арифметическое](https://python-all.ru/3.10/library/statistics.html), а *sigma* представляет [стандартное отклонение](https://python-all.ru/3.10/library/statistics.html).514515Если *sigma* отрицательно, возбуждает [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError).516517#### `mean`518519Свойство только для чтения для [среднего арифметического](https://python-all.ru/3.10/library/statistics.html) нормального распределения.520521#### `median`522523Свойство только для чтения для [медианы](https://python-all.ru/3.10/library/statistics.html) нормального распределения.524525#### `mode`526527Свойство только для чтения для [моды](https://python-all.ru/3.10/library/statistics.html) нормального распределения.528529#### `stdev`530531Свойство только для чтения для [стандартного отклонения](https://python-all.ru/3.10/library/statistics.html) нормального распределения.532533#### `variance`534535Свойство только для чтения для [дисперсии](https://python-all.ru/3.10/library/statistics.html) нормального распределения. Равна квадрату стандартного отклонения.536537#### `classmethod from_samples(data)`538539Создаёт экземпляр нормального распределения с параметрами *mu* и *sigma*, оценёнными по *data* с использованием [`fmean()`](https://python-all.ru/3.10/library/statistics.html#statistics.fmean) и [`stdev()`](https://python-all.ru/3.10/library/statistics.html#statistics.stdev).540541*data* может быть любой [итерируемой](https://python-all.ru/3.10/glossary.html#term-iterable) последовательностью и должна состоять из значений, которые можно преобразовать в тип [`float`](https://python-all.ru/3.10/library/functions.html#float). Если *data* не содержит хотя бы два элемента, возбуждается [`StatisticsError`](https://python-all.ru/3.10/library/statistics.html#statistics.StatisticsError), поскольку для оценки центрального значения требуется хотя бы одна точка, а для оценки разброса – хотя бы две.542543#### `samples(n, *, seed=None)`544545Генерирует *n* случайных выборок для заданных среднего и стандартного отклонения. Возвращает [`list`](https://python-all.ru/3.10/library/stdtypes.html#list) из [`float`](https://python-all.ru/3.10/library/functions.html#float) значений.546547Если указан *seed*, создаётся новый экземпляр базового генератора случайных чисел. Это полезно для получения воспроизводимых результатов, даже в контексте многопоточности.548549#### `pdf(x)`550551Используя [функцию плотности вероятности (pdf)](https://python-all.ru/3.10/library/statistics.html), вычисляет относительную вероятность того, что случайная величина *X* будет около заданного значения *x*. Математически это предел отношения `P(x <= X < x+dx) / dx` при *dx*, стремящемся к нулю.552553Относительная вероятность вычисляется как вероятность попадания выборки в узкий диапазон, делённая на ширину диапазона (отсюда слово «плотность»). Поскольку вероятность относительна по отношению к другим точкам, её значение может быть больше `1.0`.554555#### `cdf(x)`556557Используя [функцию кумулятивного распределения (cdf)](https://python-all.ru/3.10/library/statistics.html), вычислить вероятность того, что случайная величина *X* будет меньше или равна *x*. Математически это записывается как `P(X <= x)`.558559#### `inv_cdf(p)`560561Вычисляет обратную функцию кумулятивного распределения, также известную как [квантильная функция](https://python-all.ru/3.10/library/statistics.html) или [процентная точка](https://python-all.ru/3.10/library/statistics.html). Математически это записывается как `x : P(X <= x) = p`.562563Находит значение *x* случайной величины *X*, такое что вероятность того, что переменная будет меньше или равна этому значению, равна заданной вероятности *p*.564565#### `overlap(other)`566567Измеряет согласие между двумя нормальными распределениями вероятностей. Возвращает значение от 0.0 до 1.0, представляющее [площадь перекрытия для двух функций плотности вероятности](https://python-all.ru/3.10/library/statistics.html).568569#### `quantiles(n=4)`570571Делит нормальное распределение на *n* непрерывных интервалов с равной вероятностью. Возвращает список из (n - 1) точек разделения, отделяющих интервалы.572573Установите *n* равным 4 для квартилей (по умолчанию). Установите *n* равным 10 для децилей. Установите *n* равным 100 для процентилей, что дает 99 точек разделения, которые делят нормальное распределение на 100 групп равного размера.574575#### `zscore(x)`576577Вычисляет [стандартный балл](https://python-all.ru/3.10/library/statistics.html) описывающий *x* через количество стандартных отклонений выше или ниже среднего нормального распределения: `(x - mean) / stdev`.578579Новое в версии 3.9.580581Экземпляры [`NormalDist`](https://python-all.ru/3.10/library/statistics.html#statistics.NormalDist) поддерживают сложение, вычитание, умножение и деление на константу. Эти операции используются для смещения и масштабирования. Например:582583```pycon584>>> temperature_february = NormalDist(5, 2.5)             # Цельсий585>>> temperature_february * (9/5) + 32                     # Фаренгейт586NormalDist(mu=41.0, sigma=4.5)587```588589Деление константы на экземпляр [`NormalDist`](https://python-all.ru/3.10/library/statistics.html#statistics.NormalDist) не поддерживается, поскольку результат не был бы нормально распределен.590591Поскольку нормальные распределения возникают из аддитивных эффектов независимых переменных, можно [складывать и вычитать две независимые нормально распределенные случайные величины](https://python-all.ru/3.10/library/statistics.html), представленные в виде экземпляров [`NormalDist`](https://python-all.ru/3.10/library/statistics.html#statistics.NormalDist). Например:592593```pycon594>>> birth_weights = NormalDist.from_samples([2.5, 3.1, 2.1, 2.4, 2.7, 3.5])595>>> drug_effects = NormalDist(0.4, 0.15)596>>> combined = birth_weights + drug_effects597>>> round(combined.mean, 1)5983.1599>>> round(combined.stdev, 1)6000.5601```602603Новое в версии 3.8.604605### [`NormalDist`](https://python-all.ru/3.10/library/statistics.html#statistics.NormalDist) Примеры и рецепты606607[`NormalDist`](https://python-all.ru/3.10/library/statistics.html#statistics.NormalDist) легко решает классические задачи теории вероятностей.608609Например, имея [исторические данные по экзаменам SAT](https://python-all.ru/3.10/library/statistics.html), показывающие, что баллы распределены нормально со средним 1060 и стандартным отклонением 195, определите процент студентов с баллами между 1100 и 1200, округлив до ближайшего целого числа:610611```pycon612>>> sat = NormalDist(1060, 195)613>>> fraction = sat.cdf(1200 + 0.5) - sat.cdf(1100 - 0.5)614>>> round(fraction * 100.0, 1)61518.4616```617618Найдите [квартили](https://python-all.ru/3.10/library/statistics.html) и [децили](https://python-all.ru/3.10/library/statistics.html) для баллов SAT:619620```pycon621>>> list(map(round, sat.quantiles()))622[928, 1060, 1192]623>>> list(map(round, sat.quantiles(n=10)))624[810, 896, 958, 1011, 1060, 1109, 1162, 1224, 1310]625```626627Чтобы оценить распределение для модели, которую сложно решить аналитически, [`NormalDist`](https://python-all.ru/3.10/library/statistics.html#statistics.NormalDist) может генерировать входные выборки для [Монте- Карло моделирования](https://python-all.ru/3.10/library/statistics.html):628629```pycon630>>> def model(x, y, z):631...     return (3*x + 7*x*y - 5*y) / (11 * z)632...633>>> n = 100_000634>>> X = NormalDist(10, 2.5).samples(n, seed=3652260728)635>>> Y = NormalDist(15, 1.75).samples(n, seed=4582495471)636>>> Z = NormalDist(50, 1.25).samples(n, seed=6582483453)637>>> quantiles(map(model, X, Y, Z))       638[1.4591308524824727, 1.8035946855390597, 2.175091447274739]639```640641Нормальные распределения можно использовать для аппроксимации [биномиальных распределений](https://python-all.ru/3.10/library/statistics.html), когда размер выборки велик и вероятность успешного испытания близка к 50%.642643Например, на конференции с открытым исходным кодом 750 участников и два зала вместимостью 500 человек каждый. Есть доклад о Python и другой о Ruby. На предыдущих конференциях 65% участников предпочитали слушать доклады о Python. Предполагая, что предпочтения аудитории не изменились, какова вероятность того, что зал для Python не превысит свою вместимость?644645```pycon646>>> n = 750             # Размер выборки647>>> p = 0.65            # Предпочтение Python648>>> q = 1.0 - p         # Предпочтение Ruby649>>> k = 500             # Вместимость комнаты650651>>> # Аппроксимация с помощью кумулятивного нормального распределения652>>> from math import sqrt653>>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4)6540.8402655656>>> # Решение с помощью кумулятивного биномиального распределения657>>> from math import comb, fsum658>>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4)6590.8402660661>>> # Аппроксимация с помощью симуляции662>>> from random import seed, choices663>>> seed(8675309)664>>> def trial():665...     return choices(('Python', 'Ruby'), (p, q), k=n).count('Python')666>>> mean(trial() <= k for i in range(10_000))6670.8398668```669670Нормальные распределения часто встречаются в задачах машинного обучения.671672В Wikipedia есть [хороший пример наивного байесовского классификатора](https://python-all.ru/3.10/library/statistics.html). Задача – предсказать пол человека по измерениям нормально распределенных признаков, включая рост, вес и размер ноги.673674Дан обучающий набор данных с измерениями для восьми человек. Предполагается, что измерения нормально распределены, поэтому мы обобщаем данные с помощью [`NormalDist`](https://python-all.ru/3.10/library/statistics.html#statistics.NormalDist):675676```pycon677>>> height_male = NormalDist.from_samples([6, 5.92, 5.58, 5.92])678>>> height_female = NormalDist.from_samples([5, 5.5, 5.42, 5.75])679>>> weight_male = NormalDist.from_samples([180, 190, 170, 165])680>>> weight_female = NormalDist.from_samples([100, 150, 130, 150])681>>> foot_size_male = NormalDist.from_samples([12, 11, 12, 10])682>>> foot_size_female = NormalDist.from_samples([6, 8, 7, 9])683```684685Далее мы встречаем нового человека, чьи измерения признаков известны, но чей пол неизвестен:686687```pycon688>>> ht = 6.0        # рост689>>> wt = 130        # вес690>>> fs = 8          # размер ноги691```692693Начиная с 50% [априорной вероятности](https://python-all.ru/3.10/library/statistics.html) быть мужчиной или женщиной, мы вычисляем апостериорную как априорную, умноженную на произведение правдоподобий для измерений признаков при данном поле:694695```pycon696>>> prior_male = 0.5697>>> prior_female = 0.5698>>> posterior_male = (prior_male * height_male.pdf(ht) *699...                   weight_male.pdf(wt) * foot_size_male.pdf(fs))700701>>> posterior_female = (prior_female * height_female.pdf(ht) *702...                     weight_female.pdf(wt) * foot_size_female.pdf(fs))703```704705Окончательный прогноз отдается наибольшей апостериорной вероятности. Это известно как [максимум апостериорной вероятности](https://python-all.ru/3.10/library/statistics.html) или MAP:706707```pycon708>>> 'male' if posterior_male > posterior_female else 'female'709'female'710```711