Spec-Zone.ru › Python 3.13

статистики — Функции математической статистики

Добавлен в версии 3.4.

Исходный код: Lib/statistics.py

Этот модуль предоставляет функции для вычисления математических статистик числовых (Real-значных) данных.

Модуль не предназначен для конкуренции с сторонними библиотеками, такими как NumPy, SciPy, или специализированными статистическими пакетами, предназначенными для профессиональных статистиков, таких как Minitab, SAS и Matlab. Он ориентирован на уровень графиков и научных калькуляторов.

Если не указано иное, эти функции поддерживают int, float, Decimal и Fraction. Поведение с другими типами (как в числовом ряду, так и нет) в настоящее время не поддерживается. Коллекции со смешанными типами также не определены и зависят от реализации. Если ваши входные данные содержат смешанные типы, вы можете использовать map() для обеспечения согласованного результата, например: map(float, input_data).

В некоторых наборах данных используются значения NaN (не число) для представления отсутствующих данных. Поскольку NaN имеют необычную семантику сравнения, они вызывают неожиданное или неопределенное поведение в статистических функциях, которые сортируют данные или подсчитывают вхождения. Затронутые функции — median(), median_low(), median_high(), median_grouped(), mode(), multimode(), и quantiles(). Значения NaN следует удалить перед вызовом этих функций:

>>> from statistics import median
>>> from math import isnan
>>> from itertools import filterfalse

>>> data = [20.7, float('NaN'),19.2, 18.3, float('NaN'), 14.4]
>>> sorted(data)  # This has surprising behavior
[20.7, nan, 14.4, 18.3, 19.2, nan]
>>> median(data)  # This result is unexpected
16.35

>>> sum(map(isnan, data))    # Number of missing values
2
>>> clean = list(filterfalse(isnan, data))  # Strip NaN values
>>> clean
[20.7, 19.2, 18.3, 14.4]
>>> sorted(clean)  # Sorting now works as expected
[14.4, 18.3, 19.2, 20.7]
>>> median(clean)       # This result is now well defined
18.75

Средние значения и меры центральной тенденции

Эти функции вычисляют среднее значение или типичное значение из генеральной совокупности или выборки.

mean()

Среднее арифметическое («среднее») данных.

fmean()

Быстрое среднее арифметическое с плавающей точкой с необязательным весом.

geometric_mean()

Геометрическое среднее данных.

harmonic_mean()

Гармоническое среднее данных.

kde()

Оцените распределение вероятностной плотности данных.

kde_random()

Случайная выборка из PDF, сгенерированного функцией kde().

median()

Медиана (среднее значение) данных.

median_low()

Нижняя медиана данных.

median_high()

Верхняя медиана данных.

median_grouped()

Медиана (50-й процентиль) сгруппированных данных.

mode()

Единственный модальный показатель (наиболее часто встречающееся значение) дискретных или номинальных данных.

multimode()

Список модовых показателей (наиболее часто встречающихся значений) дискретных или номинальных данных.

quantiles()

Разделение данных на интервалы с равной вероятностью.

Меры разброса

Эти функции вычисляют меру того, насколько генеральная совокупность или выборка стремятся отклоняться от типичных или средних значений.

pstdev()

Стандартное отклонение генеральной совокупности данных.

pvariance()

Дисперсия генеральной совокупности данных.

stdev()

Стандартное отклонение выборки данных.

variance()

Дисперсия выборки данных.

Статистики для отношений между двумя входами

Эти функции вычисляют статистику, касающуюся отношений между двумя входами.

covariance()

Выборочная ковариация для двух переменных.

correlation()

Коэффициенты корреляции Пирсона и Спирмена.

linear_regression()

Угол и пересечение для линейной регрессии.

END_OF_DOCUMENT_MARKER

Подробности функций

Примечание: Функции не требуют, чтобы данные, которые им передаются, были отсортированы. Однако для удобства чтения в большинстве примеров показаны отсортированные последовательности.

statistics.mean(data)

Возвращает выборочное среднее арифметическое данных, которые могут быть последовательностью или итерируемым объектом.

Среднее арифметическое — это сумма данных, деленная на количество точек данных. Оно обычно называется «средним значением», хотя это всего лишь одно из многих математических средних значений. Это мера центральной тенденции данных.

Если данные пусты, будет поднято исключение StatisticsError.

Некоторые примеры использования:

>>> mean([1, 2, 3, 4, 4])
2.8
>>> mean([-1.0, 2.5, 3.25, 5.75])
2.625

>>> from fractions import Fraction as F
>>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)])
Fraction(13, 21)

>>> from decimal import Decimal as D
>>> mean([D("0.5"), D("0.75"), D("0.625"), D("0.375")])
Decimal('0.5625')

Примечание

Среднее значение сильно зависит от выбросов и не обязательно является типичным примером точек данных. Для более устойчивой, хотя и менее эффективной, меры центральной тенденции см. median().

Выборочное среднее значение дает несмещенную оценку истинного среднего значения генеральной совокупности, так что при усреднении по всем возможным выборкам mean(sample) приближается к истинному среднему значению всей генеральной совокупности. Если данные представляют собой всю генеральную совокупность, а не выборку, то mean(data) эквивалентно вычислению истинного среднего значения генеральной совокупности μ.

statistics.fmean(data, weights=None)

Преобразует данные в числа с плавающей точкой и вычисляет среднее арифметическое.

Это выполняется быстрее, чем функция mean(), и она всегда возвращает float. Данные могут быть последовательностью или итерируемым объектом. Если входной набор данных пустой, возникает исключение StatisticsError.

>>> fmean([3.5, 4.0, 5.25])
4.25

Поддерживается необязательное взвешивание. Например, профессор выставляет оценку за курс, взвешивая тесты на 20%, домашние задания на 20%, контрольную работу на 30% и итоговый экзамен на 30%:

>>> grades = [85, 92, 83, 91]
>>> weights = [0.20, 0.20, 0.30, 0.30]
>>> fmean(grades, weights)
87.6

Если веса заданы, они должны иметь такую же длину, что и данные, иначе возникнет исключение ValueError.

Добавлена в версии 3.8.

Изменено в версии 3.11: Добавлена поддержка весов.

statistics.geometric_mean(data)

Преобразует данные в числа с плавающей точкой и вычисляет геометрическое среднее.

Геометрическое среднее показывает центральную тенденцию или типичное значение данных, используя произведение значений (в отличие от арифметического среднего, которое использует их сумму).

Возникает исключение StatisticsError, если входной набор данных пуст, содержит ноль или отрицательное значение. Данные могут быть последовательностью или итерируемым объектом.

Не предпринимаются специальные усилия для достижения точных результатов. (Однако это может измениться в будущем.)

>>> round(geometric_mean([54, 24, 36]), 1)
36.0

Добавлена в версии 3.8.

statistics.harmonic_mean(data, weights=None)

Возвращает гармоническое среднее значение данных, последовательности или итерируемого объекта вещественных чисел. Если веса опущено или None, предполагается равное взвешивание.

Гармоническое среднее — это обратное среднему арифметическому mean() обратных значений данных. Например, гармоническое среднее трёх значений a, b и c будет эквивалентно 3/(1/a + 1/b + 1/c). Если одно из значений равно нулю, результат будет равен нулю.

Гармоническое среднее — это тип среднего значения, мера центральной тенденции данных. Оно часто подходит для усреднения отношений или показателей, например, скоростей.

Предположим, автомобиль проехал 10 км со скоростью 40 км/ч, затем ещё 10 км со скоростью 60 км/ч. Какова средняя скорость?

>>> harmonic_mean([40, 60])
48.0

Предположим, автомобиль ехал со скоростью 40 км/ч в течение 5 км, а когда пробки рассеялись, он ускорился до 60 км/ч на оставшиеся 30 км пути. Какова средняя скорость?

>>> harmonic_mean([40, 60], weights=[5, 30])
56.0

Исключение StatisticsError возникает, если данные пусты, любое значение меньше нуля или взвешенная сумма не положительна.

Текущий алгоритм имеет выходное значение при обнаружении нуля во входных данных. Это означает, что последующие входные данные не проверяются на корректность. (Это поведение может измениться в будущем.)

Добавлена в версии 3.6.

Изменено в версии 3.10: Добавлена поддержка весов.

statistics.kde(data, h, kernel='normal', *, cumulative=False)

Оценка плотности ядра (KDE): создание непрерывной функции плотности вероятности или функции кумулятивного распределения по дискретным выборкам.

Основная идея заключается в сглаживании данных с использованием ядерной функции, чтобы помочь сделать выводы о генеральной совокупности по выборке.

Степень сглаживания контролируется параметром масштабирования h, который называется шириной полосы пропускания. Меньшие значения подчеркивают локальные особенности, а большие значения дают более гладкие результаты.

Ядро определяет относительные веса точек выборки данных. Как правило, выбор формы ядра не так важен, как более влиятельный параметр сглаживания полосы пропускания.

Ядра, которые придают некоторый вес каждой точке выборки, включают нормальное (gauss), логистическое и сигмоидное.

Ядра, которые придают вес только точкам выборки внутри полосы пропускания, включают прямоугольное (uniform), треугольное, параболическое (epanechnikov), квадратичное (biweight), трехвесовое и косинусное.

Если cumulative имеет значение true, будет возвращена функция кумулятивного распределения.

Исключение StatisticsError возникнет, если последовательность данных пуста.

В Википедии есть пример, где мы можем использовать kde(), чтобы сгенерировать и построить функцию плотности вероятности, вычисленную по небольшой выборке:

>>> sample = [-2.1, -1.3, -0.4, 1.9, 5.1, 6.2]
>>> f_hat = kde(sample, h=1.5)
>>> xarr = [i/100 for i in range(-750, 1100)]
>>> yarr = [f_hat(x) for x in xarr]

Точки в xarr и yarr могут быть использованы для построения графика PDF:

Scatter plot of the estimated probability density function.

Добавлена в версии 3.13.

statistics.kde_random(data, h, kernel='normal', *, seed=None)

Возвращает функцию, которая делает случайный выбор из оценочной функции плотности вероятности, созданной kde(data, h, kernel).

Предоставление seed позволяет воспроизводить выборки. В будущем значения могут немного изменяться, поскольку реализуются более точные оценки обратной функции кумулятивного распределения ядра. Seed может быть целым числом, числом с плавающей точкой, строкой или байтами.

Исключение StatisticsError возникнет, если последовательность данных пуста.

Продолжая пример для kde(), мы можем использовать kde_random(), чтобы генерировать новые случайные выборки из оценочной функции плотности вероятности:

>>> data = [-2.1, -1.3, -0.4, 1.9, 5.1, 6.2]
>>> rand = kde_random(data, h=1.5, seed=8675309)
>>> new_selections = [rand() for i in range(10)]
>>> [round(x, 1) for x in new_selections]
[0.7, 6.2, 1.2, 6.9, 7.0, 1.8, 2.5, -0.5, -1.8, 5.6]

Добавлена в версии 3.13.

statistics.median(data)

Возвращает медиану (значение посередине) числовых данных, используя общий метод «среднее из двух средних». Если данные пусты, возникает исключение StatisticsError. Данные могут быть последовательностью или итерируемым объектом.

Медиана — это устойчивая мера центральной тенденции и менее чувствительна к присутствию выбросов. Когда количество точек данных нечётное, возвращается средняя точка данных:

>>> median([1, 3, 5])
3

Когда количество точек данных чётное, медиана интерполируется путём усреднения двух средних значений:

>>> median([1, 3, 5, 7])
4.0

Это подходит для случая, когда ваши данные дискретны, и вас не смущает, что медиана может не являться фактической точкой данных.

Если данные являются порядковыми (поддерживают операции упорядочения), но не числовыми (не поддерживают сложение), рассмотрите использование median_low() или median_high() вместо этого.

statistics.median_low(data)

Возвращает низкую медиану числовых данных. Если данные пусты, возникает исключение StatisticsError. Данные могут быть последовательностью или итерируемым объектом.

Низкая медиана всегда является элементом набора данных. Когда количество точек данных нечётное, возвращается среднее значение. Когда оно чётное, возвращается меньшее из двух средних значений.

>>> median_low([1, 3, 5])
3
>>> median_low([1, 3, 5, 7])
3

Используйте низкую медиану, когда ваши данные дискретны, и вы предпочитаете, чтобы медиана была фактической точкой данных, а не интерполированным значением.

statistics.median_high(data)

Возвращает верхнюю медиану данных. Если data пустое, генерируется исключение StatisticsError. data может быть последовательностью или итерируемым объектом.

Верхняя медиана всегда является элементом набора данных. Когда количество точек данных нечетное, возвращается среднее значение. Когда оно четное, возвращается большее из двух средних значений.

>>> median_high([1, 3, 5])
3
>>> median_high([1, 3, 5, 7])
5

Используйте верхнюю медиану, когда ваши данные дискретны, и вы предпочитаете, чтобы медиана была фактической точкой данных, а не интерполированной.

statistics.median_grouped(data, interval=1.0)

Оценивает медиану для числовых данных, которые были сгруппированы или распределены вокруг середин последовательных интервалов с фиксированной шириной.

data может быть любым итерируемым числовым данными, где каждое значение точно соответствует середине интервала. Должно быть представлено как минимум одно значение.

interval — ширина каждого интервала.

Например, демографическая информация может быть сведена в последовательные десятилетние возрастные группы, каждая из которых представлена средними значениями 5-летних интервалов:

>>> from collections import Counter
>>> demographics = Counter({
...    25: 172,   # 20 to 30 years old
...    35: 484,   # 30 to 40 years old
...    45: 387,   # 40 to 50 years old
...    55:  22,   # 50 to 60 years old
...    65:   6,   # 60 to 70 years old
... })
...

50-й процентиль (медиану) составляет 536-й человек из 1071 участника когорты. Этот человек принадлежит к возрастной группе от 30 до 40 лет.

Обычная функция median() предполагала бы, что все люди в тридцатилетнем возрасте были ровно 35 лет. Более правдоподобное предположение заключается в том, что 484 члена этой возрастной группы равномерно распределены между 30 и 40 годами. Для этого мы используем median_grouped():

>>> data = list(demographics.elements())
>>> median(data)
35
>>> round(median_grouped(data, interval=10), 1)
37.5

Ответственный за обеспечение того, что точки данных разделены точными кратными значений interval. Это важно для получения правильного результата. Функция не проверяет это предположение.

Входные данные могут быть любого числового типа, который может быть преобразован в float во время шага интерполяции.

statistics.mode(data)

Возвращает единственную наиболее часто встречающуюся точку данных из дискретных или номинальных data. Мода (если она существует) — это наиболее типичное значение и служит мерой центрального местоположения.

Если существует несколько мод с одинаковой частотой, возвращается первая встреченная в data. Если вместо этого нужно получить наименьшее или наибольшее значение, используйте min(multimode(data)) или max(multimode(data)). Если входные данные data пустые, генерируется исключение StatisticsError.

mode предполагает дискретные данные и возвращает одно значение. Это стандартное обращение с модой, как обычно преподают в школах:

>>> mode([1, 1, 2, 3, 3, 3, 3, 4])
3

Мода уникальна тем, что это единственная статистика в этом пакете, которая также применима к номинальным (нечисловым) данным:

>>> mode(["red", "blue", "blue", "red", "green", "red", "red"])
'red'

Поддерживаются только хешируемые входные данные. Для обработки типа set рассмотрите возможность преобразования в frozenset. Для обработки типа list рассмотрите возможность преобразования в tuple. Для смешанных или вложенных входных данных рассмотрите использование этого медленного квадратичного алгоритма, который зависит только от тестов равенства: max(data, key=data.count).

Изменено в версии 3.8: Теперь обрабатывает многомодальные наборы данных, возвращая первую встреченную моду. Раньше при обнаружении более одной моды генерировалось исключение StatisticsError.

statistics.multimode(data)

Возвращает список наиболее часто встречающихся значений в порядке их первого появления в data. Вернёт более одного результата, если есть несколько мод, или пустой список, если data пусто:

>>> multimode('aabbbbccddddeeffffgg')
['b', 'd', 'f']
>>> multimode('')
[]

Добавлена в версии 3.8.

statistics.pstdev(data, mu=None)

Возвращает стандартное отклонение генеральной совокупности (корень из дисперсии генеральной совокупности). См. pvariance() для аргументов и других деталей.

>>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])
0.986893273527251
statistics.pvariance(data, mu=None)

Возвращает дисперсию генеральной совокупности data, непустой последовательности или итерируемого объекта действительных чисел. Дисперсия, или второй момент относительно среднего значения, является мерой изменчивости (разброса или рассеивания) данных. Большая дисперсия указывает на то, что данные разбросаны; малая дисперсия указывает на то, что они сгруппированы близко вокруг среднего значения.

Если указан необязательный второй аргумент mu, он должен быть средним значением генеральной совокупности data. Он также может быть использован для вычисления второго момента вокруг точки, которая не является средним значением. Если он отсутствует или None (по умолчанию), среднее арифметическое вычисляется автоматически.

Используйте эту функцию для вычисления дисперсии по всей генеральной совокупности. Для оценки дисперсии по выборке обычно лучше использовать функцию variance().

Вызывает исключение StatisticsError, если data пусто.

Примеры:

>>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]
>>> pvariance(data)
1.25

Если вы уже вычислили среднее значение своих данных, вы можете передать его как необязательный второй аргумент mu, чтобы избежать повторного вычисления:

>>> mu = mean(data)
>>> pvariance(data, mu)
1.25

Поддерживаются десятичные дроби и дроби:

>>> from decimal import Decimal as D
>>> pvariance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])
Decimal('24.815')

>>> from fractions import Fraction as F
>>> pvariance([F(1, 4), F(5, 4), F(1, 2)])
Fraction(13, 72)

Примечание

При вызове с полной генеральной совокупностью, это даёт дисперсию генеральной совокупности σ². При вызове по выборке вместо этого, это смещённая дисперсия выборки s², также известная как дисперсия с N степенями свободы.

Если вам каким-то образом известно истинное среднее значение генеральной совокупности μ, вы можете использовать эту функцию для вычисления дисперсии выборки, передавая известное среднее значение генеральной совокупности в качестве второго аргумента. При условии, что точки данных представляют собой случайную выборку из генеральной совокупности, результат будет несмещённой оценкой дисперсии генеральной совокупности.

statistics.stdev(data, xbar=None)

Возвращает стандартное отклонение выборки (корень из дисперсии выборки). См. variance() для аргументов и других деталей.

>>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])
1.0810874155219827
statistics.variance(data, xbar=None)

Возвращает дисперсию выборки data, итерируемый объект, содержащий как минимум две действительные числа. Дисперсия, или второй момент относительно среднего значения, является мерой изменчивости (разброса или рассеивания) данных. Большая дисперсия указывает на то, что данные разбросаны; малая дисперсия указывает на то, что они сгруппированы близко вокруг среднего значения.

Если указан необязательный второй аргумент xbar, он должен быть средним значением выборки data. Если он отсутствует или None (по умолчанию), среднее значение вычисляется автоматически.

Используйте эту функцию, когда ваши данные являются выборкой из генеральной совокупности. Для вычисления дисперсии по всей генеральной совокупности, см. pvariance().

Вызывает исключение StatisticsError, если data содержит менее двух значений.

Примеры:

>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> variance(data)
1.3720238095238095

Если вы уже вычислили среднее значение своей выборки, вы можете передать его как необязательный второй аргумент xbar, чтобы избежать повторного вычисления:

>>> m = mean(data)
>>> variance(data, m)
1.3720238095238095

Эта функция не пытается проверить, передали ли вы фактическое среднее значение в качестве xbar. Использование произвольных значений для xbar может привести к недействительным или невозможным результатам.

Поддерживаются десятичные дроби и дроби:

>>> from decimal import Decimal as D
>>> variance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])
Decimal('31.01875')

>>> from fractions import Fraction as F
>>> variance([F(1, 6), F(1, 2), F(5, 3)])
Fraction(67, 108)

Примечание

Это дисперсия выборки s² с поправкой Бесселя, также известная как дисперсия с N-1 степенями свободы. При условии, что точки данных репрезентативны (например, независимые и одинаково распределённые), результат должен быть несмещённой оценкой истинной дисперсии генеральной совокупности.

Если вам каким-то образом известно истинное среднее значение генеральной совокупности μ, вы должны передать его функции pvariance() в качестве параметра mu, чтобы получить дисперсию выборки.

END_OF_DOCUMENT_MARKER
statistics.quantiles(data, *, n=4, method='exclusive')

Разделить данные на n непрерывных интервалов с равной вероятностью. Возвращает список n - 1 точек разбиения, разделяющих интервалы.

Установите n в 4 для квартилей (по умолчанию). Установите n в 10 для децилей. Установите n в 100 для перцентилей, что даёт 99 точек разбиения, которые разделяют данные на 100 равных групп. Вызывает StatisticsError, если n меньше 1.

Данные могут быть любым итерируемым объектом, содержащим образцы данных. Для получения осмысленных результатов количество точек данных в данных должно быть больше, чем n. Вызывает StatisticsError, если нет хотя бы одной точки данных.

Точки разбиения линейно интерполируются из двух ближайших точек данных. Например, если точка разбиения попадает в третью часть расстояния между двумя значениями образца, 100 и 112, точка разбиения будет равна 104.

Метод вычисления квантилей может меняться в зависимости от того, включают ли данные минимальное и максимальное возможные значения из генеральной совокупности или нет.

По умолчанию используется метод «исключающий» и он используется для данных, взятых из генеральной совокупности, которая может иметь более экстремальные значения, чем те, что присутствуют в выборке. Доля генеральной совокупности, попадающая ниже i-й из m отсортированных точек данных, вычисляется как i / (m + 1). При наличии девяти значений выборки метод сортирует их и присваивает следующие перцентили: 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%.

Установка метода на «включающий» используется для описания данных генеральной совокупности или для выборок, которые, как известно, включают самые экстремальные значения из генеральной совокупности. Минимальное значение в данных рассматривается как 0-й перцентиль, а максимальное значение — как 100-й перцентиль. Доля генеральной совокупности, попадающая ниже i-й из m отсортированных точек данных, вычисляется как (i - 1) / (m - 1). При наличии 11 значений выборки метод сортирует их и присваивает следующие перцентили: 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100%.

# Decile cut points for empirically sampled data
>>> data = [105, 129, 87, 86, 111, 111, 89, 81, 108, 92, 110,
...         100, 75, 105, 103, 109, 76, 119, 99, 91, 103, 129,
...         106, 101, 84, 111, 74, 87, 86, 103, 103, 106, 86,
...         111, 75, 87, 102, 121, 111, 88, 89, 101, 106, 95,
...         103, 107, 101, 81, 109, 104]
>>> [round(q, 1) for q in quantiles(data, n=10)]
[81.0, 86.2, 89.0, 99.4, 102.5, 103.6, 106.0, 109.8, 111.0]

Добавлена в версии 3.8.

Изменено в версии 3.13: Больше не генерирует исключение для входных данных, содержащих только одну точку данных. Это позволяет создавать оценки квантилей по одной точке данных за раз, которые постепенно уточняются с каждой новой точкой данных.

statistics.covariance(x, y, /)

Возвращает выборочную ковариацию двух входных данных x и y. Ковариация — это мера совместной изменчивости двух входных данных.

Оба входных значения должны иметь одинаковую длину (не меньше двух), в противном случае возбуждается StatisticsError.

Примеры:

>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> y = [1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> covariance(x, y)
0.75
>>> z = [9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> covariance(x, z)
-7.5
>>> covariance(z, x)
-7.5

Добавлена в версии 3.10.

statistics.correlation(x, y, /, *, method='linear')

Возвращает коэффициент корреляции Пирсона для двух входных данных. Коэффициент корреляции Пирсона r принимает значения между -1 и +1. Он измеряет силу и направление линейной связи.

Если метод равен «ранговый», вычисляет коэффициент ранговой корреляции Спирмена для двух входных данных. Данные заменяются рангами. Связи усредняются, так что равные значения получают одинаковый ранг. Полученный коэффициент измеряет силу монотонной связи.

Коэффициент ранговой корреляции Спирмена подходит для порядковых данных или для непрерывных данных, которые не удовлетворяют требованию линейной пропорциональности для коэффициента корреляции Пирсона.

Оба входных значения должны иметь одинаковую длину (не менее двух) и не должны быть постоянными, в противном случае возбуждается StatisticsError.

Пример с законами Кеплера о движении планет:

>>> # Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and  Neptune
>>> orbital_period = [88, 225, 365, 687, 4331, 10_756, 30_687, 60_190]    # days
>>> dist_from_sun = [58, 108, 150, 228, 778, 1_400, 2_900, 4_500] # million km

>>> # Show that a perfect monotonic relationship exists
>>> correlation(orbital_period, dist_from_sun, method='ranked')
1.0

>>> # Observe that a linear relationship is imperfect
>>> round(correlation(orbital_period, dist_from_sun), 4)
0.9882

>>> # Demonstrate Kepler's third law: There is a linear correlation
>>> # between the square of the orbital period and the cube of the
>>> # distance from the sun.
>>> period_squared = [p * p for p in orbital_period]
>>> dist_cubed = [d * d * d for d in dist_from_sun]
>>> round(correlation(period_squared, dist_cubed), 4)
1.0

Добавлена в версии 3.10.

Изменено в версии 3.12: Добавлена поддержка коэффициента ранговой корреляции Спирмена.

statistics.linear_regression(x, y, /, *, proportional=False)

Возвращает угловой коэффициент и отрезок на оси ординат параметров простой линейной регрессии, оцененных с использованием метода наименьших квадратов. Простая линейная регрессия описывает взаимосвязь между независимой переменной x и зависимой переменной y с помощью следующей линейной функции:

y = угловой коэффициент * x + отрезок на оси ординат + шум

где slope и intercept — параметры регрессии, которые оцениваются, а noise представляет собой изменчивость данных, которая не была объяснена линейной регрессией (она равна разности между предсказанными и фактическими значениями зависимой переменной).

Оба входных значения должны иметь одинаковую длину (не менее двух), и независимая переменная x не должна быть постоянной; в противном случае возбуждается StatisticsError.

Например, мы можем использовать даты выхода фильмов группы Монти Пайтон, чтобы спрогнозировать общее количество фильмов, которые были бы созданы группой к 2019 году, при условии, что они поддерживали темп.

>>> year = [1971, 1975, 1979, 1982, 1983]
>>> films_total = [1, 2, 3, 4, 5]
>>> slope, intercept = linear_regression(year, films_total)
>>> round(slope * 2019 + intercept)
16

Если пропорционально равно True, независимая переменная x и зависимая переменная y предполагаются прямо пропорциональными. Данные подгоняются к прямой, проходящей через начало координат. Поскольку отрезок на оси ординат всегда будет равен 0,0, основная линейная функция упрощается до:

y = угловой коэффициент * x + шум

Продолжая пример из correlation(), мы пытаемся оценить, насколько хорошо модель, основанная на основных планетах, может предсказать орбитальные расстояния для карликовых планет:

>>> model = linear_regression(period_squared, dist_cubed, proportional=True)
>>> slope = model.slope

>>> # Dwarf planets:   Pluto,  Eris,    Makemake, Haumea, Ceres
>>> orbital_periods = [90_560, 204_199, 111_845, 103_410, 1_680]  # days
>>> predicted_dist = [math.cbrt(slope * (p * p)) for p in orbital_periods]
>>> list(map(round, predicted_dist))
[5912, 10166, 6806, 6459, 414]

>>> [5_906, 10_152, 6_796, 6_450, 414]  # actual distance in million km
[5906, 10152, 6796, 6450, 414]

Добавлена в версии 3.10.

Изменено в версии 3.11: Добавлена поддержка пропорционально.

Исключения

Определяется одно исключение:

exception statistics.StatisticsError

Подкласс ValueError для исключений, связанных со статистикой.

Объекты NormalDist

NormalDist — инструмент для создания и обработки нормальных распределений случайной величины. Это класс, который рассматривает среднее значение и стандартное отклонение измерений данных как единое целое.

Нормальные распределения возникают из Центральной предельной теоремы и имеют широкий спектр применений в статистике.

class statistics.NormalDist(mu=0.0, sigma=1.0)

Возвращает новый объект NormalDist, где mu представляет среднее арифметическое, а sigma — стандартное отклонение.

Если sigma отрицательно, генерирует исключение StatisticsError.

mean

Только для чтения свойство для среднего арифметического нормального распределения.

median

Только для чтения свойство для медианы нормального распределения.

mode

Только для чтения свойство для моды нормального распределения.

stdev

Только для чтения свойство для стандартного отклонения нормального распределения.

variance

Только для чтения свойство для дисперсии нормального распределения. Равна квадрату стандартного отклонения.

classmethod from_samples(data)

Создает экземпляр нормального распределения с параметрами mu и sigma, вычисленными из data с использованием fmean() и stdev().

data может быть любым итерируемым объектом и должен содержать значения, которые можно преобразовать в тип float. Если data не содержит по меньшей мере двух элементов, генерирует исключение StatisticsError, поскольку для оценки центрального значения требуется хотя бы одна точка, а для оценки дисперсии — по меньшей мере две точки.

samples(n, *, seed=None)

Генерирует n случайных выборок для заданного среднего и стандартного отклонения. Возвращает list значений типа float.

Если указан seed, создаёт новый экземпляр генератора случайных чисел. Это полезно для создания воспроизводимых результатов, даже в контексте многопоточности.

Изменено в версии 3.13.

Переключено на более быстрый алгоритм. Для воспроизведения выборок из предыдущих версий используйте random.seed() и random.gauss().

pdf(x)

Используя функцию плотности вероятности (pdf), вычисляет относительную вероятность того, что случайная величина X будет близка к заданному значению x. Математически это предел отношения P(x <= X < x+dx) / dx при стремлении dx к нулю.

Относительная вероятность вычисляется как вероятность появления выборки в узком диапазоне, деленная на ширину диапазона (отсюда и слово «плотность»). Поскольку вероятность относительна к другим точкам, её значение может быть больше, чем 1.0.

cdf(x)

Используя кумулятивную функцию распределения (cdf), вычисляет вероятность того, что случайная величина X будет меньше или равна x. Математически это записывается как P(X <= x).

inv_cdf(p)

Вычисляет обратную кумулятивную функцию распределения, также известную как функция квантиля или функция процентиля. Математически это записывается как x : P(X <= x) = p.

Находит значение x случайной величины X такое, что вероятность того, что величина будет меньше или равна этому значению, равна заданной вероятности p.

overlap(other)

Измеряет согласованность между двумя нормальными распределениями вероятностей. Возвращает значение от 0.0 до 1.0, представляющее собой перекрывающуюся площадь для двух функций плотности вероятности.

quantiles(n=4)

Делит нормальное распределение на n непрерывных интервалов с равной вероятностью. Возвращает список (n - 1) точек разрыва, разделяющих интервалы.

Установите n в 4 для квартилей (по умолчанию). Установите n в 10 для децилей. Установите n в 100 для перцентилей, что даёт 99 точек разрыва, которые делят нормальное распределение на 100 равных групп.

zscore(x)

Вычисляет стандартный балл, описывающий x в терминах числа стандартных отклонений выше или ниже среднего нормального распределения: (x - mean) / stdev.

Добавлен в версии 3.9.

Экземпляры NormalDist поддерживают сложение, вычитание, умножение и деление на константу. Эти операции используются для сдвига и масштабирования. Например:

>>> temperature_february = NormalDist(5, 2.5)             # Celsius
>>> temperature_february * (9/5) + 32                     # Fahrenheit
NormalDist(mu=41.0, sigma=4.5)

Деление константы на экземпляр NormalDist не поддерживается, поскольку результат не будет нормально распределён.

Поскольку нормальные распределения возникают из аддитивных эффектов независимых переменных, можно сложить или вычесть две независимые нормально распределённые случайные величины, представленные экземплярами NormalDist. Например:

>>> birth_weights = NormalDist.from_samples([2.5, 3.1, 2.1, 2.4, 2.7, 3.5])
>>> drug_effects = NormalDist(0.4, 0.15)
>>> combined = birth_weights + drug_effects
>>> round(combined.mean, 1)
3.1
>>> round(combined.stdev, 1)
0.5

Добавлен в версии 3.8.

END_OF_DOCUMENT_MARKER

Примеры и рецепты

Классические задачи теории вероятностей

NormalDist легко решает классические задачи теории вероятностей.

Например, учитывая исторические данные по экзамену SAT, показывающие, что баллы распределены нормально со средним значением 1060 и стандартным отклонением 195, определите процент студентов с баллами от 1100 до 1200, округлив до ближайшего целого числа:

>>> sat = NormalDist(1060, 195)
>>> fraction = sat.cdf(1200 + 0.5) - sat.cdf(1100 - 0.5)
>>> round(fraction * 100.0, 1)
18.4

Найдите квартили и децили для баллов SAT:

>>> list(map(round, sat.quantiles()))
[928, 1060, 1192]
>>> list(map(round, sat.quantiles(n=10)))
[810, 896, 958, 1011, 1060, 1109, 1162, 1224, 1310]

Входы Монте-Карло для симуляций

Для оценки распределения для модели, которую сложно решить аналитически, NormalDist может генерировать образцы входных данных для моделирования Монте-Карло:

>>> def model(x, y, z):
...     return (3*x + 7*x*y - 5*y) / (11 * z)
...
>>> n = 100_000
>>> X = NormalDist(10, 2.5).samples(n, seed=3652260728)
>>> Y = NormalDist(15, 1.75).samples(n, seed=4582495471)
>>> Z = NormalDist(50, 1.25).samples(n, seed=6582483453)
>>> quantiles(map(model, X, Y, Z))       
[1.4591308524824727, 1.8035946855390597, 2.175091447274739]

Приближение биномиальных распределений

Нормальные распределения могут быть использованы для приближения биномиальных распределений, когда размер выборки большой, а вероятность успешного испытания близка к 50%.

Например, на конференции с открытым исходным кодом 750 участников и двумя залами вместимостью 500 человек. Одна лекция о Python, другая о Ruby. На предыдущих конференциях 65% участников предпочитали слушать лекции о Python. Принимая во внимание, что предпочтения населения не изменились, какова вероятность того, что зал Python останется в пределах своих лимитов вместимости?

>>> n = 750             # Sample size
>>> p = 0.65            # Preference for Python
>>> q = 1.0 - p         # Preference for Ruby
>>> k = 500             # Room capacity

>>> # Approximation using the cumulative normal distribution
>>> from math import sqrt
>>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4)
0.8402

>>> # Exact solution using the cumulative binomial distribution
>>> from math import comb, fsum
>>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4)
0.8402

>>> # Approximation using a simulation
>>> from random import seed, binomialvariate
>>> seed(8675309)
>>> mean(binomialvariate(n, p) <= k for i in range(10_000))
0.8406

Наивный байесовский классификатор

Нормальные распределения часто встречаются в задачах машинного обучения.

В Википедии есть хороший пример наивного байесовского классификатора. Задача состоит в том, чтобы предсказать пол человека по измерениям нормально распределенных признаков, включая рост, вес и размер ноги.

Нам дается обучающая выборка с измерениями для восьми человек. Измерения предполагаются нормально распределенными, поэтому мы сводим данные с помощью NormalDist:

>>> height_male = NormalDist.from_samples([6, 5.92, 5.58, 5.92])
>>> height_female = NormalDist.from_samples([5, 5.5, 5.42, 5.75])
>>> weight_male = NormalDist.from_samples([180, 190, 170, 165])
>>> weight_female = NormalDist.from_samples([100, 150, 130, 150])
>>> foot_size_male = NormalDist.from_samples([12, 11, 12, 10])
>>> foot_size_female = NormalDist.from_samples([6, 8, 7, 9])

Далее мы сталкиваемся с новым человеком, измерения признаков которого известны, но пол неизвестен:

>>> ht = 6.0        # height
>>> wt = 130        # weight
>>> fs = 8          # foot size

Начиная с 50% априорной вероятности быть мужчиной или женщиной, мы вычисляем апостериорную вероятность как произведение априорной вероятности и произведение вероятностей для измерений признаков, данных полу:

>>> prior_male = 0.5
>>> prior_female = 0.5
>>> posterior_male = (prior_male * height_male.pdf(ht) *
...                   weight_male.pdf(wt) * foot_size_male.pdf(fs))

>>> posterior_female = (prior_female * height_female.pdf(ht) *
...                     weight_female.pdf(wt) * foot_size_female.pdf(fs))

Окончательное предсказание соответствует наибольшей апостериорной вероятности. Это известно как максимальное апостериорное или MAP:

>>> 'male' if posterior_male > posterior_female else 'female'
'female'

© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/statistics.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API