statistics.md
1> **Источник:** https://python-all.ru/3.12/library/statistics.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `statistics` – Функции математической статистики89Добавлено в версии 3.4.1011**Исходный код:** [Lib/statistics.py](https://python-all.ru/src/3.12/Lib/statistics.py)1213---1415Этот модуль предоставляет функции для вычисления математической статистики числовых данных (со значениями [`Real`](https://python-all.ru/3.12/library/numbers.html#numbers.Real)).1617Модуль не предназначен для конкуренции со сторонними библиотеками, такими как [NumPy](https://python-all.ru/3.12/library/statistics.html), [SciPy](https://python-all.ru/3.12/library/statistics.html), или проприетарными полнофункциональными пакетами статистики, ориентированными на профессиональных статистиков, такими как Minitab, SAS и Matlab. Он рассчитан на уровень графических и научных калькуляторов.1819Если не указано иное, эти функции поддерживают [`int`](https://python-all.ru/3.12/library/functions.html#int), [`float`](https://python-all.ru/3.12/library/functions.html#float), [`Decimal`](https://python-all.ru/3.12/library/decimal.html#decimal.Decimal) и [`Fraction`](https://python-all.ru/3.12/library/fractions.html#fractions.Fraction). Поведение с другими типами (будь то в числовой иерархии или нет) в настоящее время не поддерживается. Коллекции со смешанными типами также не определены и зависят от реализации. Если входные данные состоят из смешанных типов, можно использовать [`map()`](https://python-all.ru/3.12/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.12/library/statistics.html#statistics.mean) | Среднее арифметическое (среднее) данных. |50| --- | --- |51| [`fmean()`](https://python-all.ru/3.12/library/statistics.html#statistics.fmean) | Быстрое среднее арифметическое с плавающей запятой, с возможностью взвешивания. |52| [`geometric_mean()`](https://python-all.ru/3.12/library/statistics.html#statistics.geometric_mean) | Среднее геометрическое данных. |53| [`harmonic_mean()`](https://python-all.ru/3.12/library/statistics.html#statistics.harmonic_mean) | Среднее гармоническое данных. |54| [`median()`](https://python-all.ru/3.12/library/statistics.html#statistics.median) | Медиана (среднее значение) данных. |55| [`median_low()`](https://python-all.ru/3.12/library/statistics.html#statistics.median_low) | Нижняя медиана данных. |56| [`median_high()`](https://python-all.ru/3.12/library/statistics.html#statistics.median_high) | Верхняя медиана данных. |57| [`median_grouped()`](https://python-all.ru/3.12/library/statistics.html#statistics.median_grouped) | Медиана (50-й процентиль) сгруппированных данных. |58| [`mode()`](https://python-all.ru/3.12/library/statistics.html#statistics.mode) | Единственная мода (наиболее часто встречающееся значение) дискретных или номинальных данных. |59| [`multimode()`](https://python-all.ru/3.12/library/statistics.html#statistics.multimode) | Список мод (наиболее часто встречающихся значений) дискретных или номинальных данных. |60| [`quantiles()`](https://python-all.ru/3.12/library/statistics.html#statistics.quantiles) | Разделение данных на интервалы с равной вероятностью. |6162## Меры разброса6364Эти функции вычисляют меру того, насколько генеральная совокупность или выборка склонны отклоняться от типичных или средних значений.6566| [`pstdev()`](https://python-all.ru/3.12/library/statistics.html#statistics.pstdev) | Стандартное отклонение генеральной совокупности данных. |67| --- | --- |68| [`pvariance()`](https://python-all.ru/3.12/library/statistics.html#statistics.pvariance) | Дисперсия генеральной совокупности данных. |69| [`stdev()`](https://python-all.ru/3.12/library/statistics.html#statistics.stdev) | Стандартное отклонение выборки данных. |70| [`variance()`](https://python-all.ru/3.12/library/statistics.html#statistics.variance) | Дисперсия выборки данных. |7172## Статистика взаимосвязей между двумя входными данными7374Эти функции вычисляют статистики, касающиеся взаимосвязей между двумя наборами данных.7576| [`covariance()`](https://python-all.ru/3.12/library/statistics.html#statistics.covariance) | Выборочная ковариация двух переменных. |77| --- | --- |78| [`correlation()`](https://python-all.ru/3.12/library/statistics.html#statistics.correlation) | Коэффициенты корреляции Пирсона и Спирмена. |79| [`linear_regression()`](https://python-all.ru/3.12/library/statistics.html#statistics.linear_regression) | Наклон и пересечение для простой линейной регрессии. |8081## Подробности функции8283Примечание: функции не требуют, чтобы переданные им данные были отсортированы. Однако для удобства чтения в большинстве примеров показаны отсортированные последовательности.8485#### `statistics.mean(data)`8687Возвращает выборочное среднее арифметическое *data*, который может быть последовательностью или итерируемым объектом.8889Среднее арифметическое – это сумма данных, делённая на количество точек данных. Его часто называют «средним значением», хотя это лишь одна из многих различных математических средних. Это мера центрального положения данных.9091Если *data* пуст, будет возбуждено [`StatisticsError`](https://python-all.ru/3.12/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.12/library/statistics.html) и не обязательно является типичным примером точек данных. Для более устойчивой, хотя и менее эффективной, меры [центральной тенденции](https://python-all.ru/3.12/library/statistics.html) см. [`median()`](https://python-all.ru/3.12/library/statistics.html#statistics.median).113>114> Выборочное среднее даёт несмещённую оценку истинного среднего генеральной совокупности, так что при усреднении по всем возможным выборкам `mean(sample)` сходится к истинному среднему всей совокупности. Если *data* представляет всю совокупность, а не выборку, то `mean(data)` эквивалентно вычислению истинного среднего генеральной совокупности μ.115116#### `statistics.fmean(data, weights=None)`117118Преобразует *data* в числа с плавающей запятой и вычисляет среднее арифметическое.119120Эта функция работает быстрее, чем [`mean()`](https://python-all.ru/3.12/library/statistics.html#statistics.mean), и всегда возвращает [`float`](https://python-all.ru/3.12/library/functions.html#float). *data* может быть последовательностью или итерируемым объектом. Если входной набор данных пуст, возбуждает [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError).121122```pycon123>>> fmean([3.5, 4.0, 5.25])1244.25125```126127Поддерживается необязательное взвешивание. Например, преподаватель выставляет оценку за курс, взвешивая контрольные работы на 20%, домашние задания на 20%, промежуточный экзамен на 30% и итоговый экзамен на 30%:128129```pycon130>>> grades = [85, 92, 83, 91]131>>> weights = [0.20, 0.20, 0.30, 0.30]132>>> fmean(grades, weights)13387.6134```135136Если указаны *weights*, их длина должна совпадать с длиной *data*, иначе будет возбуждено [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError).137138Добавлено в версии 3.8.139140Изменено в версии 3.11: Добавлена поддержка *weights*.141142#### `statistics.geometric_mean(data)`143144Преобразует *data* в числа с плавающей запятой и вычисляет среднее геометрическое.145146Среднее геометрическое указывает центральную тенденцию или типичное значение *data*, используя произведение значений (в отличие от среднего арифметического, которое использует их сумму).147148Возбуждает [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError), если входной набор данных пуст, содержит ноль или отрицательное значение. *data* может быть последовательностью или итерируемым объектом.149150Не предпринимается особых усилий для достижения точных результатов. (Однако в будущем это может измениться.)151152```pycon153>>> round(geometric_mean([54, 24, 36]), 1)15436.0155```156157Добавлено в версии 3.8.158159#### `statistics.harmonic_mean(data, weights=None)`160161Возвращает среднее гармоническое *data*, последовательности или итерируемого объекта вещественных чисел. Если *weights* опущен или `None`, то предполагается равное взвешивание.162163Среднее гармоническое – это обратная величина среднего арифметического [`mean()`](https://python-all.ru/3.12/library/statistics.html#statistics.mean) обратных величин данных. Например, среднее гармоническое трёх значений *a*, *b* и *c* будет эквивалентно `3/(1/a + 1/b + 1/c)`. Если одно из значений равно нулю, результат будет равен нулю.164165Среднее гармоническое – это разновидность среднего, мера центрального положения данных. Его часто применяют при усреднении отношений или скоростей, например, скоростей.166167Предположим, автомобиль проезжает 10 км со скоростью 40 км/ч, а затем ещё 10 км со скоростью 60 км/ч. Какова средняя скорость?168169```pycon170>>> harmonic_mean([40, 60])17148.0172```173174Предположим, автомобиль движется со скоростью 40 км/ч в течение 5 км, а когда трасса освобождается, ускоряется до 60 км/ч на оставшихся 30 км пути. Какова средняя скорость?175176```pycon177>>> harmonic_mean([40, 60], weights=[5, 30])17856.0179```180181[`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError) возбуждается, если *data* пуст, любой элемент меньше нуля или если взвешенная сумма не является положительной.182183Текущий алгоритм выполняет досрочный выход при обнаружении нуля во входных данных. Это означает, что последующие входные данные не проверяются на корректность. (Такое поведение может измениться в будущем.)184185Добавлено в версии 3.6.186187Изменено в версии 3.10: Добавлена поддержка *weights*.188189#### `statistics.median(data)`190191Возвращает медиану (среднее значение) числовых данных, используя стандартный метод «среднее двух средних». Если *data* пусто, вызывается [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError). *data* может быть последовательностью или итератором.192193Медиана – это устойчивая мера центральной тенденции, менее подверженная влиянию выбросов. Если количество точек данных нечётное, возвращается средняя точка:194195```pycon196>>> median([1, 3, 5])1973198```199200Если количество точек данных чётное, медиана интерполируется как среднее двух средних значений:201202```pycon203>>> median([1, 3, 5, 7])2044.0205```206207Это подходит для дискретных данных, когда допустимо, что медиана может не быть фактической точкой данных.208209Если данные порядковые (поддерживают операции сравнения), но не числовые (не поддерживают сложение), рассмотрите возможность использования [`median_low()`](https://python-all.ru/3.12/library/statistics.html#statistics.median_low) или [`median_high()`](https://python-all.ru/3.12/library/statistics.html#statistics.median_high) вместо этого.210211#### `statistics.median_low(data)`212213Возвращает нижнюю медиану числовых данных. Если *data* пусто, вызывается [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError). *data* может быть последовательностью или итератором.214215Нижняя медиана всегда является элементом набора данных. При нечётном количестве точек возвращается среднее значение. При чётном – возвращается меньшее из двух средних значений.216217```pycon218>>> median_low([1, 3, 5])2193220>>> median_low([1, 3, 5, 7])2213222```223224Используйте нижнюю медиану, когда данные дискретны и вы предпочитаете, чтобы медиана была фактической точкой данных, а не интерполированной.225226#### `statistics.median_high(data)`227228Возвращает верхнюю медиану данных. Если *data* пусто, вызывается [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError). *data* может быть последовательностью или итератором.229230Верхняя медиана всегда является элементом набора данных. При нечётном количестве точек возвращается среднее значение. При чётном – возвращается большее из двух средних значений.231232```pycon233>>> median_high([1, 3, 5])2343235>>> median_high([1, 3, 5, 7])2365237```238239Используйте верхнюю медиану, когда данные дискретны и вы предпочитаете, чтобы медиана была фактической точкой данных, а не интерполированной.240241#### `statistics.median_grouped(data, interval=1.0)`242243Оценивает медиану для числовых данных, [сгруппированных или разбитых на интервалы](https://python-all.ru/3.12/library/statistics.html) вокруг середин последовательных интервалов фиксированной ширины.244245*data* может быть любым итератором числовых данных, где каждое значение является в точности серединой интервала. Должно присутствовать хотя бы одно значение.246247*interval* – это ширина каждого интервала.248249Например, демографические данные могут быть сведены в последовательные десятилетние возрастные группы, каждая из которых представлена пятилетними средними точками интервалов:250251```pycon252>>> from collections import Counter253>>> demographics = Counter({254... 25: 172, # От 20 до 30 лет255... 35: 484, # От 30 до 40 лет256... 45: 387, # От 40 до 50 лет257... 55: 22, # От 50 до 60 лет258... 65: 6, # От 60 до 70 лет259... })260...261```26226350-й процентиль (медиана) – это 536-й человек из когорты из 1071 участника. Этот человек находится в возрастной группе от 30 до 40 лет.264265Обычная функция [`median()`](https://python-all.ru/3.12/library/statistics.html#statistics.median) предполагала бы, что всем в возрастной группе 30–40 лет ровно 35 лет. Более обоснованное предположение – что 484 члена этой группы равномерно распределены между 30 и 40. Для этого используется [`median_grouped()`](https://python-all.ru/3.12/library/statistics.html#statistics.median_grouped):266267```pycon268>>> data = list(demographics.elements())269>>> median(data)27035271>>> round(median_grouped(data, interval=10), 1)27237.5273```274275Вызывающий код отвечает за то, чтобы точки данных были разделены точными кратными *интервала*. Это необходимо для получения правильного результата. Функция не проверяет это предусловие.276277Входные данные могут быть любым числовым типом, который можно привести к float на этапе интерполяции.278279#### `statistics.mode(data)`280281Возвращает единственное наиболее часто встречающееся значение из дискретных или номинальных *данных*. Мода (когда существует) – это наиболее типичное значение и служит мерой центрального положения.282283Если есть несколько мод с одинаковой частотой, возвращается первая, встреченная в *данных*. Если требуется наименьшая или наибольшая из них, используйте `min(multimode(data))` или `max(multimode(data))`. Если входные *данные* пусты, возбуждается [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError).284285`mode` предполагает дискретные данные и возвращает одно значение. Это стандартный подход к моде, как обычно учат в школах:286287```pycon288>>> mode([1, 1, 2, 3, 3, 3, 3, 4])2893290```291292Мода уникальна тем, что это единственная статистика в этом пакете, которая также применима к номинальным (нечисловым) данным:293294```pycon295>>> mode(["red", "blue", "blue", "red", "green", "red", "red"])296'red'297```298299Поддерживаются только хешируемые входные данные. Для обработки типа [`set`](https://python-all.ru/3.12/library/stdtypes.html#set) рассмотрите приведение к [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset). Для обработки типа [`list`](https://python-all.ru/3.12/library/stdtypes.html#list) рассмотрите приведение к [`tuple`](https://python-all.ru/3.12/library/stdtypes.html#tuple). Для смешанных или вложенных входных данных рассмотрите использование этого более медленного квадратичного алгоритма, который зависит только от проверок на равенство: `max(data, key=data.count)`.300301Изменено в версии 3.8: Теперь обрабатывает мультимодальные наборы данных, возвращая первую встреченную моду. Ранее возбуждалось [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError), когда находилось более одной моды.302303#### `statistics.multimode(data)`304305Возвращает список наиболее часто встречающихся значений в порядке их первого появления в *данных*. Вернёт более одного результата, если есть несколько мод, или пустой список, если *данные* пусты:306307```pycon308>>> multimode('aabbbbccddddeeffffgg')309['b', 'd', 'f']310>>> multimode('')311[]312```313314Добавлено в версии 3.8.315316#### `statistics.pstdev(data, mu=None)`317318Возвращает стандартное отклонение генеральной совокупности (квадратный корень из дисперсии генеральной совокупности). См. [`pvariance()`](https://python-all.ru/3.12/library/statistics.html#statistics.pvariance) для получения аргументов и других подробностей.319320```pycon321>>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])3220.986893273527251323```324325#### `statistics.pvariance(data, mu=None)`326327Возвращает дисперсию генеральной совокупности для *данных* – непустой последовательности или итерации вещественных чисел. Дисперсия (второй центральный момент) – это мера изменчивости (разброса или рассеяния) данных. Большая дисперсия указывает на то, что данные разбросаны; малая – что они сгруппированы близко к среднему.328329Если указан необязательный второй аргумент *mu*, он должен быть *средним генеральной совокупности* для *данных*. Его также можно использовать для вычисления второго момента относительно точки, не являющейся средним. Если он отсутствует или равен `None` (по умолчанию), среднее арифметическое вычисляется автоматически.330331Используйте эту функцию для расчёта дисперсии по всей генеральной совокупности. Для оценки дисперсии по выборке обычно лучше подходит функция [`variance()`](https://python-all.ru/3.12/library/statistics.html#statistics.variance).332333Возбуждает [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError), если *данные* пусты.334335Примеры:336337```pycon338>>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]339>>> pvariance(data)3401.25341```342343Если вы уже вычислили среднее своих данных, вы можете передать его в качестве необязательного второго аргумента *mu*, чтобы избежать повторного вычисления:344345```pycon346>>> mu = mean(data)347>>> pvariance(data, mu)3481.25349```350351Поддерживаются типы Decimal и Fraction:352353```pycon354>>> from decimal import Decimal as D355>>> pvariance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])356Decimal('24.815')357358>>> from fractions import Fraction as F359>>> pvariance([F(1, 4), F(5, 4), F(1, 2)])360Fraction(13, 72)361```362363> **Примечание**364>365> При вызове для всей генеральной совокупности получается дисперсия генеральной совокупности σ². При вызове для выборки получается смещённая выборочная дисперсия s², также известная как дисперсия с N степенями свободы.366>367> Если вам каким-либо образом известно истинное среднее генеральной совокупности μ, вы можете использовать эту функцию для расчёта дисперсии выборки, передав известное среднее генеральной совокупности в качестве второго аргумента. При условии, что точки данных являются случайной выборкой из совокупности, результат будет несмещённой оценкой дисперсии генеральной совокупности.368369#### `statistics.stdev(data, xbar=None)`370371Возвращает выборочное стандартное отклонение (квадратный корень из выборочной дисперсии). См. [`variance()`](https://python-all.ru/3.12/library/statistics.html#statistics.variance) для получения аргументов и других подробностей.372373```pycon374>>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])3751.0810874155219827376```377378#### `statistics.variance(data, xbar=None)`379380Возвращает выборочную дисперсию для *данных* – итерации, содержащей не менее двух вещественных чисел. Дисперсия (второй центральный момент) – это мера изменчивости (разброса или рассеяния) данных. Большая дисперсия указывает на то, что данные разбросаны; малая – что они сгруппированы близко к среднему.381382Если указан необязательный второй аргумент *xbar*, он должен быть *выборочным средним* для *данных*. Если он отсутствует или равен `None` (по умолчанию), среднее вычисляется автоматически.383384Используйте эту функцию, когда ваши данные являются выборкой из генеральной совокупности. Для расчёта дисперсии по всей совокупности см. [`pvariance()`](https://python-all.ru/3.12/library/statistics.html#statistics.pvariance).385386Возбуждает [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError), если в *данных* меньше двух значений.387388Примеры:389390```pycon391>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]392>>> variance(data)3931.3720238095238095394```395396Если выборочное среднее данных уже вычислено, его можно передать в качестве необязательного второго аргумента *xbar*, чтобы избежать повторного вычисления:397398```pycon399>>> m = mean(data)400>>> variance(data, m)4011.3720238095238095402```403404Эта функция не проверяет, было ли передано истинное среднее в качестве *xbar*. Использование произвольных значений для *xbar* может привести к неверным или невозможным результатам.405406Поддерживаются значения Decimal и Fraction:407408```pycon409>>> from decimal import Decimal as D410>>> variance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])411Decimal('31.01875')412413>>> from fractions import Fraction as F414>>> variance([F(1, 6), F(1, 2), F(5, 3)])415Fraction(67, 108)416```417418> **Примечание**419>420> Это выборочная дисперсия s² с поправкой Бесселя, также известная как дисперсия с N-1 степенями свободы. При условии, что точки данных репрезентативны (например, независимы и одинаково распределены), результат должен быть несмещенной оценкой истинной дисперсии генеральной совокупности.421>422> Если каким-либо образом известно истинное среднее генеральной совокупности μ, его следует передать в функцию [`pvariance()`](https://python-all.ru/3.12/library/statistics.html#statistics.pvariance) в качестве параметра *mu*, чтобы получить дисперсию выборки.423424#### `statistics.quantiles(data, *, n=4, method='exclusive')`425426Разделяет *data* на *n* непрерывных интервалов равной вероятности. Возвращает список из `n - 1` точек разделения, отделяющих интервалы.427428Задайте *n* равным 4 для квартилей (по умолчанию). Задайте *n* равным 10 для децилей. Задайте *n* равным 100 для процентилей, что даёт 99 точек разделения, которые делят *data* на 100 групп одинакового размера. Возбуждается [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError), если *n* меньше 1.429430*data* – любой итерируемый объект, содержащий выборочные данные. Для получения осмысленных результатов количество точек данных в *data* должно быть больше *n*. Возбуждает [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError), если имеется менее двух точек данных.431432Точки разделения линейно интерполируются между двумя ближайшими точками данных. Например, если точка разделения находится на расстоянии одной трети между двумя выборочными значениями, `100` и `112`, точка разделения будет равна `104`.433434Метод *method* вычисления квантилей может изменяться в зависимости от того, включает ли *data* наименьшие и наибольшие возможные значения из генеральной совокупности или исключает их.435436Метод *method* по умолчанию – «exclusive», и используется для данных, взятых из генеральной совокупности, которая может содержать более экстремальные значения, чем в выборке. Доля совокупности, попадающая ниже *i-го* из *m* отсортированных точек данных, вычисляется как `i / (m + 1)`. Для девяти выборочных значений метод сортирует их и присваивает следующие процентили: 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%.437438Установка *method* в «inclusive» используется для описания данных генеральной совокупности или для выборок, которые, как известно, содержат наиболее экстремальные значения из совокупности. Минимальное значение в *data* рассматривается как 0-й процентиль, а максимальное – как 100-й процентиль. Доля совокупности, попадающая ниже *i-го* из *m* отсортированных точек данных, вычисляется как `(i - 1) / (m - 1)`. Для 11 выборочных значений метод сортирует их и присваивает следующие процентили: 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100%.439440```pycon441# Decile cut points for empirically sampled data442>>> data = [105, 129, 87, 86, 111, 111, 89, 81, 108, 92, 110,443... 100, 75, 105, 103, 109, 76, 119, 99, 91, 103, 129,444... 106, 101, 84, 111, 74, 87, 86, 103, 103, 106, 86,445... 111, 75, 87, 102, 121, 111, 88, 89, 101, 106, 95,446... 103, 107, 101, 81, 109, 104]447>>> [round(q, 1) for q in quantiles(data, n=10)]448[81.0, 86.2, 89.0, 99.4, 102.5, 103.6, 106.0, 109.8, 111.0]449```450451Добавлено в версии 3.8.452453#### `statistics.covariance(x, y, /)`454455Возвращает выборочную ковариацию двух входных последовательностей *x* и *y*. Ковариация – это мера совместной изменчивости двух входов.456457Оба входных параметра должны быть одной длины (не менее двух), в противном случае возбуждается [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError).458459Примеры:460461```pycon462>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9]463>>> y = [1, 2, 3, 1, 2, 3, 1, 2, 3]464>>> covariance(x, y)4650.75466>>> z = [9, 8, 7, 6, 5, 4, 3, 2, 1]467>>> covariance(x, z)468-7.5469>>> covariance(z, x)470-7.5471```472473Добавлено в версии 3.10.474475#### `statistics.correlation(x, y, /, *, method='linear')`476477Возвращает [коэффициент корреляции Пирсона](https://python-all.ru/3.12/library/statistics.html) для двух входных последовательностей. Коэффициент корреляции Пирсона *r* принимает значения от -1 до +1. Он измеряет силу и направление линейной зависимости.478479Если *method* равен «ranked», вычисляется [ранговый коэффициент корреляции Спирмена](https://python-all.ru/3.12/library/statistics.html) для двух входов. Данные заменяются рангами. Связи усредняются, чтобы одинаковые значения получали одинаковый ранг. Полученный коэффициент измеряет силу монотонной зависимости.480481Коэффициент корреляции Спирмена подходит для порядковых данных или для непрерывных данных, которые не удовлетворяют требованию линейной пропорциональности для коэффициента корреляции Пирсона.482483Оба входных параметра должны быть одной длины (не менее двух) и не должны быть константными, иначе возбуждается [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError).484485Пример с [законами Кеплера движения планет](https://python-all.ru/3.12/library/statistics.html):486487```pycon488>>> # Меркурий, Венера, Земля, Марс, Юпитер, Сатурн, Уран и Нептун489>>> orbital_period = [88, 225, 365, 687, 4331, 10_756, 30_687, 60_190] # дни490>>> dist_from_sun = [58, 108, 150, 228, 778, 1_400, 2_900, 4_500] # млн км491492>>> # Показывает, что существует идеальная монотонная зависимость493>>> correlation(orbital_period, dist_from_sun, method='ranked')4941.0495496>>> # Заметим, что линейная связь несовершенна497>>> round(correlation(orbital_period, dist_from_sun), 4)4980.9882499500>>> # Демонстрация третьего закона Кеплера: существует линейная корреляция501>>> # между квадратом орбитального периода и кубом502>>> # расстояние от Солнца.503>>> period_squared = [p * p for p in orbital_period]504>>> dist_cubed = [d * d * d for d in dist_from_sun]505>>> round(correlation(period_squared, dist_cubed), 4)5061.0507```508509Добавлено в версии 3.10.510511Изменено в версии 3.12: Добавлена поддержка рангового коэффициента корреляции Спирмена.512513#### `statistics.linear_regression(x, y, /, *, proportional=False)`514515Возвращает угловой коэффициент и свободный член [простой линейной регрессии](https://python-all.ru/3.12/library/statistics.html), оцененные методом наименьших квадратов. Простая линейная регрессия описывает связь между независимой переменной *x* и зависимой переменной *y* с помощью следующей линейной функции:516517> *y = slope \* x + intercept + noise*518519где `slope` и `intercept` – оцениваемые параметры регрессии, а `noise` представляет изменчивость данных, не объяснённую линейной регрессией (она равна разности между предсказанными и фактическими значениями зависимой переменной).520521Оба входных параметра должны быть одной длины (не менее двух), а независимая переменная *x* не может быть константой; в противном случае возбуждается [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError).522523Например, можно использовать [даты выхода фильмов Монти Пайтона](https://python-all.ru/3.12/library/statistics.html), чтобы предсказать общее количество фильмов Монти Пайтона, которые были бы сняты к 2019 году, если бы темп сохранялся.524525```pycon526>>> year = [1971, 1975, 1979, 1982, 1983]527>>> films_total = [1, 2, 3, 4, 5]528>>> slope, intercept = linear_regression(year, films_total)529>>> round(slope * 2019 + intercept)53016531```532533Если *proportional* равен true, предполагается, что независимая переменная *x* и зависимая переменная *y* прямо пропорциональны. Данные аппроксимируются прямой, проходящей через начало координат. Поскольку *intercept* всегда будет равен 0.0, базовая линейная функция упрощается до:534535> *y = slope \* x + noise*536537Продолжая пример из [`correlation()`](https://python-all.ru/3.12/library/statistics.html#statistics.correlation), рассмотрим, насколько хорошо модель, основанная на крупных планетах, может предсказать орбитальные расстояния для карликовых планет:538539```pycon540>>> model = linear_regression(period_squared, dist_cubed, proportional=True)541>>> slope = model.slope542543>>> # Карликовые планеты: Плутон, Эрида, Макемаке, Хаумеа, Церера544>>> orbital_periods = [90_560, 204_199, 111_845, 103_410, 1_680] # дни545>>> predicted_dist = [math.cbrt(slope * (p * p)) for p in orbital_periods]546>>> list(map(round, predicted_dist))547[5912, 10166, 6806, 6459, 414]548549>>> [5_906, 10_152, 6_796, 6_450, 414] # фактическое расстояние в миллионах км550[5906, 10152, 6796, 6450, 414]551```552553Добавлено в версии 3.10.554555Изменено в версии 3.11: Добавлена поддержка для *пропорционального*.556557## Исключения558559Определено одно исключение:560561#### `exception statistics.StatisticsError`562563Подкласс [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError) для исключений, связанных со статистикой.564565## [`NormalDist`](https://python-all.ru/3.12/library/statistics.html#statistics.NormalDist) объекты566567[`NormalDist`](https://python-all.ru/3.12/library/statistics.html#statistics.NormalDist) – это инструмент для создания и работы с нормальными распределениями [случайной величины](https://python-all.ru/3.12/library/statistics.html). Это класс, который рассматривает среднее и стандартное отклонение измерений данных как единую сущность.568569Нормальные распределения возникают из [Центральной предельной теоремы](https://python-all.ru/3.12/library/statistics.html) и имеют широкий спектр применений в статистике.570571#### `class statistics.NormalDist(mu=0.0, sigma=1.0)`572573Возвращает новый объект *NormalDist*, где *mu* представляет [среднее арифметическое](https://python-all.ru/3.12/library/statistics.html), а *sigma* представляет [стандартное отклонение](https://python-all.ru/3.12/library/statistics.html).574575Если *sigma* отрицательно, возбуждает [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError).576577#### `mean`578579Свойство только для чтения для [среднего арифметического](https://python-all.ru/3.12/library/statistics.html) нормального распределения.580581#### `median`582583Свойство только для чтения для [медианы](https://python-all.ru/3.12/library/statistics.html) нормального распределения.584585#### `mode`586587Свойство только для чтения для [моды](https://python-all.ru/3.12/library/statistics.html) нормального распределения.588589#### `stdev`590591Свойство только для чтения для [стандартного отклонения](https://python-all.ru/3.12/library/statistics.html) нормального распределения.592593#### `variance`594595Свойство только для чтения для [дисперсии](https://python-all.ru/3.12/library/statistics.html) нормального распределения. Равна квадрату стандартного отклонения.596597#### `classmethod from_samples(data)`598599Создаёт экземпляр нормального распределения с параметрами *mu* и *sigma*, оценёнными по *data* с использованием [`fmean()`](https://python-all.ru/3.12/library/statistics.html#statistics.fmean) и [`stdev()`](https://python-all.ru/3.12/library/statistics.html#statistics.stdev).600601*data* может быть любой [итерируемой](https://python-all.ru/3.12/glossary.html#term-iterable) последовательностью и должна состоять из значений, которые можно преобразовать в тип [`float`](https://python-all.ru/3.12/library/functions.html#float). Если *data* не содержит хотя бы два элемента, возбуждается [`StatisticsError`](https://python-all.ru/3.12/library/statistics.html#statistics.StatisticsError), поскольку для оценки центрального значения требуется хотя бы одна точка, а для оценки разброса – хотя бы две.602603#### `samples(n, *, seed=None)`604605Генерирует *n* случайных выборок для заданных среднего и стандартного отклонения. Возвращает [`list`](https://python-all.ru/3.12/library/stdtypes.html#list) из [`float`](https://python-all.ru/3.12/library/functions.html#float) значений.606607Если указан *seed*, создаётся новый экземпляр базового генератора случайных чисел. Это полезно для получения воспроизводимых результатов, даже в контексте многопоточности.608609#### `pdf(x)`610611Используя [функцию плотности вероятности (pdf)](https://python-all.ru/3.12/library/statistics.html), вычисляет относительную вероятность того, что случайная величина *X* будет около заданного значения *x*. Математически это предел отношения `P(x <= X < x+dx) / dx` при *dx*, стремящемся к нулю.612613Относительная вероятность вычисляется как вероятность попадания выборки в узкий диапазон, делённая на ширину диапазона (отсюда слово «плотность»). Поскольку вероятность относительна по отношению к другим точкам, её значение может быть больше `1.0`.614615#### `cdf(x)`616617Используя [функцию кумулятивного распределения (cdf)](https://python-all.ru/3.12/library/statistics.html), вычислить вероятность того, что случайная величина *X* будет меньше или равна *x*. Математически это записывается как `P(X <= x)`.618619#### `inv_cdf(p)`620621Вычисляет обратную функцию кумулятивного распределения, также известную как [квантильная функция](https://python-all.ru/3.12/library/statistics.html) или [процентная точка](https://python-all.ru/3.12/library/statistics.html). Математически это записывается как `x : P(X <= x) = p`.622623Находит значение *x* случайной величины *X*, такое что вероятность того, что переменная будет меньше или равна этому значению, равна заданной вероятности *p*.624625#### `overlap(other)`626627Измеряет согласие между двумя нормальными распределениями вероятностей. Возвращает значение от 0.0 до 1.0, представляющее [площадь перекрытия для двух функций плотности вероятности](https://python-all.ru/3.12/library/statistics.html).628629#### `quantiles(n=4)`630631Делит нормальное распределение на *n* непрерывных интервалов с равной вероятностью. Возвращает список из (n - 1) точек разделения, отделяющих интервалы.632633Установите *n* равным 4 для квартилей (по умолчанию). Установите *n* равным 10 для децилей. Установите *n* равным 100 для процентилей, что дает 99 точек разделения, которые делят нормальное распределение на 100 групп равного размера.634635#### `zscore(x)`636637Вычисляет [стандартный балл](https://python-all.ru/3.12/library/statistics.html) описывающий *x* через количество стандартных отклонений выше или ниже среднего нормального распределения: `(x - mean) / stdev`.638639Добавлено в версии 3.9.640641Экземпляры [`NormalDist`](https://python-all.ru/3.12/library/statistics.html#statistics.NormalDist) поддерживают сложение, вычитание, умножение и деление на константу. Эти операции используются для смещения и масштабирования. Например:642643```pycon644>>> temperature_february = NormalDist(5, 2.5) # Цельсий645>>> temperature_february * (9/5) + 32 # Фаренгейт646NormalDist(mu=41.0, sigma=4.5)647```648649Деление константы на экземпляр [`NormalDist`](https://python-all.ru/3.12/library/statistics.html#statistics.NormalDist) не поддерживается, поскольку результат не был бы нормально распределен.650651Поскольку нормальные распределения возникают из аддитивных эффектов независимых переменных, можно [складывать и вычитать две независимые нормально распределенные случайные величины](https://python-all.ru/3.12/library/statistics.html), представленные в виде экземпляров [`NormalDist`](https://python-all.ru/3.12/library/statistics.html#statistics.NormalDist). Например:652653```pycon654>>> birth_weights = NormalDist.from_samples([2.5, 3.1, 2.1, 2.4, 2.7, 3.5])655>>> drug_effects = NormalDist(0.4, 0.15)656>>> combined = birth_weights + drug_effects657>>> round(combined.mean, 1)6583.1659>>> round(combined.stdev, 1)6600.5661```662663Добавлено в версии 3.8.664665## Примеры и рецепты666667### Классические задачи теории вероятностей668669[`NormalDist`](https://python-all.ru/3.12/library/statistics.html#statistics.NormalDist) легко решает классические задачи теории вероятностей.670671Например, имея [исторические данные по экзаменам SAT](https://python-all.ru/3.12/library/statistics.html), показывающие, что баллы распределены нормально со средним 1060 и стандартным отклонением 195, определите процент студентов с баллами между 1100 и 1200, округлив до ближайшего целого числа:672673```pycon674>>> sat = NormalDist(1060, 195)675>>> fraction = sat.cdf(1200 + 0.5) - sat.cdf(1100 - 0.5)676>>> round(fraction * 100.0, 1)67718.4678```679680Найдите [квартили](https://python-all.ru/3.12/library/statistics.html) и [децили](https://python-all.ru/3.12/library/statistics.html) для баллов SAT:681682```pycon683>>> list(map(round, sat.quantiles()))684[928, 1060, 1192]685>>> list(map(round, sat.quantiles(n=10)))686[810, 896, 958, 1011, 1060, 1109, 1162, 1224, 1310]687```688689### Входные данные Монте-Карло для симуляций690691Чтобы оценить распределение для модели, которую сложно решить аналитически, [`NormalDist`](https://python-all.ru/3.12/library/statistics.html#statistics.NormalDist) может генерировать входные выборки для [симуляции Монте-Карло](https://python-all.ru/3.12/library/statistics.html):692693```pycon694>>> def model(x, y, z):695... return (3*x + 7*x*y - 5*y) / (11 * z)696...697>>> n = 100_000698>>> X = NormalDist(10, 2.5).samples(n, seed=3652260728)699>>> Y = NormalDist(15, 1.75).samples(n, seed=4582495471)700>>> Z = NormalDist(50, 1.25).samples(n, seed=6582483453)701>>> quantiles(map(model, X, Y, Z))702[1.4591308524824727, 1.8035946855390597, 2.175091447274739]703```704705### Аппроксимация биномиальных распределений706707Нормальные распределения можно использовать для аппроксимации [биномиальных распределений](https://python-all.ru/3.12/library/statistics.html), когда размер выборки велик и вероятность успешного испытания близка к 50%.708709Например, на конференции с открытым исходным кодом 750 участников и два зала вместимостью 500 человек каждый. Есть доклад о Python и другой о Ruby. На предыдущих конференциях 65% участников предпочитали слушать доклады о Python. Предполагая, что предпочтения аудитории не изменились, какова вероятность того, что зал для Python не превысит свою вместимость?710711```pycon712>>> n = 750 # Размер выборки713>>> p = 0.65 # Предпочтение Python714>>> q = 1.0 - p # Предпочтение Ruby715>>> k = 500 # Вместимость комнаты716717>>> # Аппроксимация с помощью кумулятивного нормального распределения718>>> from math import sqrt719>>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4)7200.8402721722>>> # Точное решение с помощью кумулятивного биномиального распределения723>>> from math import comb, fsum724>>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4)7250.8402726727>>> # Аппроксимация с помощью симуляции728>>> from random import seed, binomialvariate729>>> seed(8675309)730>>> mean(binomialvariate(n, p) <= k for i in range(10_000))7310.8406732```733734### Наивный байесовский классификатор735736Нормальные распределения часто встречаются в задачах машинного обучения.737738В Wikipedia есть [хороший пример наивного байесовского классификатора](https://python-all.ru/3.12/library/statistics.html). Задача – предсказать пол человека по измерениям нормально распределенных признаков, включая рост, вес и размер ноги.739740Дан обучающий набор данных с измерениями для восьми человек. Предполагается, что измерения нормально распределены, поэтому мы обобщаем данные с помощью [`NormalDist`](https://python-all.ru/3.12/library/statistics.html#statistics.NormalDist):741742```pycon743>>> height_male = NormalDist.from_samples([6, 5.92, 5.58, 5.92])744>>> height_female = NormalDist.from_samples([5, 5.5, 5.42, 5.75])745>>> weight_male = NormalDist.from_samples([180, 190, 170, 165])746>>> weight_female = NormalDist.from_samples([100, 150, 130, 150])747>>> foot_size_male = NormalDist.from_samples([12, 11, 12, 10])748>>> foot_size_female = NormalDist.from_samples([6, 8, 7, 9])749```750751Далее мы встречаем нового человека, чьи измерения признаков известны, но чей пол неизвестен:752753```pycon754>>> ht = 6.0 # рост755>>> wt = 130 # вес756>>> fs = 8 # размер ноги757```758759Начиная с 50% [априорной вероятности](https://python-all.ru/3.12/library/statistics.html) быть мужчиной или женщиной, мы вычисляем апостериорную как априорную, умноженную на произведение правдоподобий для измерений признаков при данном поле:760761```pycon762>>> prior_male = 0.5763>>> prior_female = 0.5764>>> posterior_male = (prior_male * height_male.pdf(ht) *765... weight_male.pdf(wt) * foot_size_male.pdf(fs))766767>>> posterior_female = (prior_female * height_female.pdf(ht) *768... weight_female.pdf(wt) * foot_size_female.pdf(fs))769```770771Окончательный прогноз отдается наибольшей апостериорной вероятности. Это известно как [максимум апостериорной вероятности](https://python-all.ru/3.12/library/statistics.html) или MAP:772773```pycon774>>> 'male' if posterior_male > posterior_female else 'female'775'female'776```777778### Оценка плотности ядра779780Можно оценить непрерывное распределение вероятностей по фиксированному числу дискретных выборок.781782Основная идея – сгладить данные с помощью [ядерной функции, такой как нормальное, треугольное или равномерное распределение](https://python-all.ru/3.12/library/statistics.html). Степень сглаживания регулируется параметром масштаба, `h`, который называется *шириной окна*.783784```python785from random import choice, random786787def kde_normal(data, h):788 "Create a continuous probability distribution from discrete samples."789790 # Сглаживает данные с помощью ядра нормального распределения, масштабированного на h.791 K_h = NormalDist(0.0, h)792793 def pdf(x):794 'Probability density function. P(x <= X < x+dx) / dx'795 return sum(K_h.pdf(x - x_i) for x_i in data) / len(data)796797 def cdf(x):798 'Cumulative distribution function. P(X <= x)'799 return sum(K_h.cdf(x - x_i) for x_i in data) / len(data)800801 def rand():802 'Random selection from the probability distribution.'803 return choice(data) + K_h.inv_cdf(random())804805 return pdf, cdf, rand806```807808[На Википедии есть пример](https://python-all.ru/3.12/library/statistics.html), где можно использовать рецепт `kde_normal()` для генерации и построения функции плотности вероятности, оценённой по небольшой выборке:809810```pycon811>>> sample = [-2.1, -1.3, -0.4, 1.9, 5.1, 6.2]812>>> pdf, cdf, rand = kde_normal(sample, h=1.5)813>>> xarr = [i/100 for i in range(-750, 1100)]814>>> yarr = [pdf(x) for x in xarr]815```816817Точки из `xarr` и `yarr` можно использовать для построения графика PDF:818819820821[Перевыборка](https://python-all.ru/3.12/library/statistics.html) данных для получения 100 новых выборок:822823```pycon824>>> new_selections = [rand() for i in range(100)]825```826827Определите вероятность того, что новое значение окажется ниже `2.0`:828829```pycon830>>> round(cdf(2.0), 4)8310.5794832```833834Добавьте новую точку данных и найдите новую ФРП в `2.0`:835836```pycon837>>> sample.append(4.9)838>>> round(cdf(2.0), 4)8390.5005840```841