Як знайти середнє значення, медіану та моду в Python?

Основні статистичні поняття: середнє, медіана та мода в Python

Середнє значення, медіана та мода – це фундаментальні концепції в статистиці. Їх можна легко обчислити за допомогою Python, як із використанням зовнішніх бібліотек, так і без них.

Ці три показники є основними мірами центральної тенденції. Центральна тенденція допомагає визначити “типові” або “середні” значення в наборі даних. Якщо ви тільки починаєте свій шлях у науці про дані, цей посібник саме для вас.

Після ознайомлення з цим посібником ви:

  • Зрозумієте сутність середнього значення, медіани та моди.
  • Зможете створювати власні функції для обчислення середнього значення, медіани та моди у Python.
  • Навчитеся використовувати модуль статистики Python для швидкого застосування цих мір.

Якщо вам потрібна версія вправ для завантаження, можете переглянути репозиторій на GitHub.

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

Обчислення середнього значення у Python

Середнє значення, або середнє арифметичне, є найчастіше використовуваною мірою центральної тенденції.

Пам’ятайте, що центральна тенденція – це типове значення для набору даних.

Набір даних — це колекція значень. У Python набір даних може бути представлений будь-якою з вбудованих структур даних:

  • Списки, кортежі та множини: колекції об’єктів.
  • Рядки: послідовності символів.
  • Словники: набори пар ключ-значення.

Примітка: Хоча в Python існують інші структури даних, такі як черги чи стеки, ми будемо використовувати лише вбудовані.

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

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

Середнє або середнє арифметичне буде 3,5, оскільки сума списку дорівнює 21, а його довжина дорівнює 6. 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
# Тому що 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]
# Оскільки набір даних має непарну довжину, ми обираємо середнє значення
median = 198

Як бачите, оскільки довжина набору даних є непарною, ми можемо взяти середнє значення як медіану. Але що станеться, якщо гравець щойно завершив кар’єру?

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

[181, 187, 196, 198, 203, 207, 211, 215]
# Обираємо два середніх значення і ділимо їх на 2
median = (198 + 203) / 2
median = 200.5

Створення власної функції для обчислення медіани

Реалізуємо наведену вище концепцію у вигляді функції Python.

Згадайте три кроки, які потрібно виконати, щоб знайти медіану набору даних:

  • Сортування набору даних: це можна зробити за допомогою функції `sorted()`.
  • Визначення, чи є довжина набору даних парною чи непарною: можна скористатися функцією `len()` і оператором модуля (%).
  • Повернення медіани на основі кожного випадку:
    • Непарна довжина: повертаємо середнє значення.
    • Парна довжина: повертаємо середнє значення двох середніх значень.

Ось як виглядає функція:

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 len(dataset) % 2 != 0:
        return data[index]
    
    # Якщо довжина набору даних парна
    return (data[index - 1] + data[index]) / 2

Виводимо результати для наших наборів даних:

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

Результат:

198
200.5

Зверніть увагу, що ми створюємо змінну `data`, яка вказує на відсортований набір даних на початку функції. Хоча наведені вище списки вже відсортовані, ми хочемо створити функцію, яку можна використовувати повторно, тому сортуємо набір даних кожного разу, коли викликається функція.

`index` зберігає індекс середнього значення — або верхнього середнього значення — у наборі даних за допомогою оператора цілочисельного ділення. Наприклад, якби ми передали список `pythonic_machine_heights`, він би мав значення 4.

Пам’ятайте, що індекси в Python починаються з нуля. Саме тому ми можемо повернути середній індекс списку за допомогою цілочисельного ділення.

Далі ми перевіряємо, чи є довжина набору даних непарною, порівнюючи результат операції за модулем з будь-яким значенням, відмінним від нуля. Якщо умова виконується, ми повертаємо середній елемент, як, наприклад, зі списком `pythonic_machine_heights`:

>>> pythonic_machine_heights[4]
# 198

З іншого боку, якщо набір даних має парну довжину, ми повертаємо суму середніх значень, поділену на два. Зауважте, що `data[index -1]` повертає нижню середину набору даних, а `data[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']

Як ви розумієте, мода для наведеного вище набору даних — це “laptop”, оскільки це значення найчастіше з’являється в списку.

Цікава особливість моди полягає в тому, що набір даних не обов’язково повинен бути числовим. Наприклад, ми можемо працювати з рядками.

Розглянемо продажі іншого дня:

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

Наведений вище набір даних має дві моди: “mouse” і “headphones”, оскільки обидва значення зустрічаються по два рази. Це означає, що це мультимодальний набір даних.

Що робити, якщо ми не можемо знайти моду в наборі даних, як показано нижче?

['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']

Як бачите, перший оператор `print` повернув одну моду, а другий – декілька.

Пояснення коду:

  • Оголошуємо словник `frequency`.
  • Ми ітеруємо набір даних для створення гістограми — статистичного терміна для набору лічильників (або частот) —
    • Якщо ключ знайдено у словнику, ми додаємо одиницю до його значення.
    • Якщо ключ не знайдено, ми створюємо пару ключ-значення зі значенням 1.
  • Змінна `most_frequent` зберігає — як не дивно — найбільше значення (не ключ) зі словника частот.
  • Ми повертаємо змінну `modes`, яка складається з усіх ключів у словнику частот з найбільшою частотою.

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

Використання `mode()` і `multimode()` з модуля статистики Python

Знову ж таки, модуль статистики пропонує швидкий спосіб виконання основних статистичних операцій.

Ми можемо використовувати дві функції: `mode()` і `multimode()`.

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()` повертає першу знайдену моду. Якщо у вас старіша версія, ви отримаєте помилку StatisticsError.

Використання функції `multimode()`:

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

Результат:

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

Підсумок

Вітаю! Якщо ви пройшли через цей посібник, ви навчилися обчислювати середнє значення, медіану та моду — основні міри центральної тенденції.

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

Далі рекомендуємо ознайомитися зі вступом до аналізу даних за допомогою Python.