Как найти среднее значение, медиану и моду в Python?

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

Эти три меры являются основными Главная тенденция. Центральная тенденция позволяет нам узнать «нормальные» или «средние» значения набора данных. Если вы только начинаете заниматься наукой о данных, это руководство для вас.

К концу этого урока вы:

  • Понимание понятия среднего, медианы и моды
  • Уметь создавать свои собственные функции среднего, медианы и режима в Python.
  • Используйте модуль статистики Python, чтобы быстро начать использовать эти измерения.

Если вам нужна загружаемая версия следующих упражнений, не стесняйтесь проверить Репозиторий GitHub.

Давайте рассмотрим различные способы вычисления среднего значения, медианы и моды.

Вычисление среднего значения в Python

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

Помните, что центральная тенденция является типичным значением набора данных.

Набор данных — это набор данных, поэтому набор данных в Python может быть любой из следующих встроенных структур данных:

  • Списки, кортежи и наборы: коллекция объектов
  • Строки: набор символов
  • Словарь: набор пар ключ-значение

Примечание. Хотя в Python есть и другие структуры данных, такие как очереди или стеки, мы будем использовать только встроенные.

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

[1, 2, 3, 4, 5, 6]

Среднее значение будет 3,5, потому что сумма списка равна 21, а его длина равна 6. Двадцать один разделить на шесть равно 3,5. Вы можете выполнить этот расчет с помощью следующего расчета:

(1 + 2 + 3 + 4 + 5 + 6) / 6 = 21

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

Создание пользовательской функции среднего

Начнем с расчета среднего (среднего) возраста игроков баскетбольной команды. Название команды будет «Pythonic Machines».

pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24]

def mean(dataset):
    return sum(dataset) / len(dataset)

print(mean(pythonic_machine_ages))

Разбираем этот код:

  • «pythonic_machine_ages» — это список возрастов баскетболистов.
  • Мы определяем функцию mean(), которая возвращает сумму данного набора данных, деленную на его длину.
    • Функция sum() возвращает общую сумму (по иронии судьбы) значений итерируемого объекта, в данном случае списка. Попробуйте передать набор данных в качестве аргумента, он вернет 211
    • Функция len() возвращает длину итерации, если вы передадите ей набор данных, вы получите 8
  • Мы передаем возраст баскетбольной команды в функцию mean() и печатаем результат.

Если вы проверите вывод, вы получите:

26.375
# Because 211 / 8 = 26.375

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

Использование mean() из статистического модуля Python

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

Поскольку это часть Стандартная библиотека Python вам не нужно будет устанавливать какой-либо внешний пакет с PIP.

Вот как вы используете этот модуль:

from statistics import mean

pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24]

print(mean(pythonic_machine_ages))

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

26.375

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

Нахождение медианы в Python

медиана является средним значением отсортированного набора данных. Он используется — опять же — для предоставления «типичного» значения определенного Население.

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

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

  • Нечетный: медиана — это среднее значение набора данных.
  • Четное: медиана представляет собой сумму двух средних значений, деленную на два.

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

[181, 187, 196, 196, 198,  203, 207, 211, 215]
# Since the dataset is odd, we select the middle value
median = 198

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

Нам нужно будет вычислить медиану, взяв два средних значения набора данных.

[181, 187, 196, 198, 203, 207, 211, 215] 
# We select the two middle values, and divide them by 2
median = (198 + 203) / 2
median = 200.5

Создание пользовательской медианной функции

Давайте реализуем описанную выше концепцию в функции Python.

Помните три шага, которые нам нужно выполнить, чтобы получить медиану набора данных:

  • Сортировка набора данных: мы можем сделать это с помощью функции sorted()
  • Определите, является ли он нечетным или четным: мы можем сделать это, получив длину набора данных и используя оператор по модулю (%)
  • Верните медиану на основе каждого случая:
    • Нечетный: вернуть среднее значение
    • Даже: возвращает среднее значение двух средних значений.

Это приведет к следующей функции:

pythonic_machines_heights = [181, 187, 196, 196, 198, 203, 207, 211, 215]
after_retirement = [181, 187, 196, 198, 203, 207, 211, 215]

def median(dataset):
    data = sorted(dataset)
    index = len(data) // 2
    
    # If the dataset is odd  
    if len(dataset) % 2 != 0:
        return data[index]
    
    # If the dataset is even
    return (data[index - 1] + data[index]) / 2

Печать результата наших наборов данных:

print(median(pythonic_machines_heights))
print(median(after_retirement))

Выход:

198
200.5

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

Индекс сохраняет среднее значение — или верхне-среднее значение — набора данных с помощью оператора целочисленного деления. Например, если бы мы передавали список «pythonic_machine_heights», он имел бы значение 4.

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

Затем мы проверяем, является ли длина набора данных нечетной, сравнивая результат операции по модулю с любым значением, отличным от нуля. Если условие истинно, мы возвращаем средний элемент, например, со списком «pythonic_machine_heights»:

>>> pythonic_machine_heights[4]
# 198

С другой стороны, если набор данных четный, мы возвращаем сумму средних значений, деленную на два. Обратите внимание, что данные[index -1] дает нам нижнюю среднюю точку набора данных, а данные[index] дает нам верхнюю среднюю точку.

Использование median() из статистического модуля Python

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

Лично для меня, если бы что-то уже было определено, я бы использовал это из-за принципа DRY — Don’t Repeat Yourself (в данном случае — не повторять чужой код).

Вы можете вычислить медиану предыдущих наборов данных с помощью следующего кода:

from statistics import median

pythonic_machines_heights = [181, 187, 196, 196, 198, 203, 207, 211, 215]
after_retirement = [181, 187, 196, 198, 203, 207, 211, 215]

print(median(pythonic_machines_heights))
print(median(after_retirement))

Выход:

198
200.5

Вычисление режима в Python

Режим является наиболее часто встречающимся значением в наборе данных. Мы можем думать об этом как о «популярной» группе школы, которая может представлять собой стандарт для всех учащихся.

Примером режима могут быть ежедневные продажи в магазине техники. Режим этого набора данных будет самым продаваемым продуктом за определенный день.

['laptop', 'desktop', 'smartphone', 'laptop', 'laptop', 'headphones']

Как вы понимаете, режим приведенного выше набора данных — «ноутбук», потому что это наиболее часто встречающееся значение в списке.

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

Проанализируем продажи другого дня:

['mouse', 'camera', 'headphones', 'usb', 'headphones', 'mouse']

Приведенный выше набор данных имеет два режима: «мышь» и «наушники», потому что оба имеют частоту, равную двум. Это означает, что это мультимодальный набор данных.

Что, если мы не сможем найти моду в наборе данных, как показано ниже?

['usb', 'camera', 'smartphone', 'laptop', 'TV']

Это называется равномерное распределениепо сути, это означает, что в наборе данных нет моды.

Теперь, когда вы быстро разобрались с концепцией режима, давайте посчитаем его в Python.

Создание функции пользовательского режима

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

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

Чтобы сначала найти моду, нам нужно создать словарь частот с каждым из значений, присутствующих в наборе данных, затем получить максимальную частоту и вернуть все элементы с этой частотой.

Переведем это в код:

points_per_game = [3, 15, 23, 42, 30, 10, 10, 12]
sponsorship = ['nike', 'adidas', 'nike', 'jordan',
               'jordan', 'rebook', 'under-armour', 'adidas']

def mode(dataset):
    frequency = {}

    for value in dataset:
        frequency[value] = frequency.get(value, 0) + 1

    most_frequent = max(frequency.values())

    modes = [key for key, value in frequency.items()
                      if value == most_frequent]

    return modes

Проверка результата с передачей двух списков в качестве аргументов:

print(mode(points_per_game))
print(mode(sponsorship))

Выход:

[10]
['nike', 'adidas', 'jordan']

Как видите, первый оператор печати дал нам один режим, а второй вернул несколько режимов.

Объяснение более глубокого кода выше:

  • Объявляем частотный словарь
  • Мы перебираем набор данных, чтобы создать гистограмма — статистический термин для набора счетчиков (или частот) —
    • Если ключ найден в словаре, то он добавляет единицу к значению
    • Если он не найден, мы создаем пару ключ-значение со значением один
  • Переменная most_frequent хранит, по иронии судьбы, самое большое значение (не ключ) частотного словаря.
  • Мы возвращаем переменную режимов, которая состоит из всех ключей в частотном словаре с наибольшей частотой.

Обратите внимание, как важно именовать переменные для написания читаемого кода.

Использование режима() и мультимода() из статистического модуля Python

И снова модуль статистики предоставляет нам быстрый способ выполнения основных операций со статистикой.

Мы можем использовать две функции: Режим() а также многомодовый().

from statistics import mode, multimode

points_per_game = [3, 15, 23, 42, 30, 10, 10, 12]
sponsorship = ['nike', 'adidas', 'nike', 'jordan',
               'jordan', 'rebook', 'under-armour', 'adidas']

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

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

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

print(mode(points_per_game))
print(mode(sponsorship))

Выход:

10
nike

Примечание. В Python 3.8 и более поздних версиях функция mode() возвращает первый найденный режим. Если у вас более старая версия, вы получите СтатистикаОшибка.

Использование функции multimode():

print(multimode(points_per_game))
print(multimode(sponsorship))

Выход:

[10]
['nike', 'adidas', 'jordan']

Подводить итоги

Поздравляем! Если вы дочитали до этого момента, вы научились вычислять среднее значение, медиану и моду, основные измерения центральной тенденции.

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

Затем прочитайте дружественное введение в анализ данных в Python.