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

Средната стойност, медианата и модата са основни теми на статистиката. Можете лесно да ги изчислите в Python, със и без използването на външни библиотеки.

Тези три са основните мерки на Централна тенденция. Централната тенденция ни позволява да знаем „нормалните“ или „средните“ стойности на набор от данни. Ако тепърва започвате с науката за данни, това е правилният урок за вас.

До края на този урок вие ще:

  • Разберете концепцията за средна стойност, медиана и мода
  • Можете да създавате свои собствени функции за средна стойност, медиана и режим в Python
  • Използвайте статистическия модул на Python, за да започнете бързо използването на тези измервания

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

Нека да разгледаме различните начини за изчисляване на средна стойност, медиана и режим.

Изчисляване на средната стойност в Python

The означава или средно аритметично е най-използваната мярка за централна тенденция.

Не забравяйте, че централната тенденция е типична стойност на набор от данни.

Наборът от данни е колекция от данни, следователно набор от данни в 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

The Медиана е средната стойност на сортиран набор от данни. Използва се – отново – за предоставяне на „типична“ стойност на определена население.

В програмирането можем да дефинираме медианата като стойността, която разделя последователност на две части — долната половина и горната половина —.

За да изчислим медианата, първо трябва да сортираме набора от данни. Можем да направим това с алгоритми за сортиране или с помощта на вградената функция 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().
  • Определете дали е нечетно или четно: Можем да направим това, като получим дължината на набора от данни и използваме оператора модул (%)
  • Върнете медианата въз основа на всеки случай:
    • Нечетно: Връща средната стойност
    • Четен: Връща средната стойност на двете средни стойности
  Коригиране на грешка, уловена при необработено изключение на CoD Black Ops 2

Това ще доведе до следната функция:

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

The режим е най-честата стойност в набора от данни. Можем да мислим за това като за „популярната“ група в училище, която може да представлява стандарт за всички ученици.

Пример за режим могат да бъдат ежедневните продажби на магазин за техника. Режимът на този набор от данни ще бъде най-продаваният продукт за определен ден.

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

Както можете да оцените, режимът на горния набор от данни е „лаптоп“, тъй като това беше най-честата стойност в списъка.

Готиното при режима е, че наборът от данни не трябва да е числов. Например, можем да работим с низове.

Нека анализираме продажбите от друг ден:

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

Наборът от данни по-горе има два режима: „мишка“ и „слушалки“, тъй като и двата имат честота две. Това означава, че е а мултимодален набор от данни.

  Мрежата преди мрежата: Поглед назад към Gopher

Ами ако не можем да намерим режима в набор от данни, като този по-долу?

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

Това се нарича a равномерно разпределениеосновно това означава, че няма режим в набора от данни.

След като схванахте бързо концепцията за режим, нека го изчислим в 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']

Както можете да видите, първият оператор за печат ни даде един режим, докато вторият върна множество режими.

Обяснявайки по-задълбочено кода по-горе:

  • Ние декларираме честотен речник
  • Ние итерираме набора от данни, за да създадем a хистограма — статистическият термин за набор от броячи (или честоти) —
    • Ако ключът бъде намерен в речника тогава, той добавя единица към стойността
    • Ако не бъде намерено, създаваме двойка ключ-стойност със стойност едно
  • Променливата most_frequent съхранява — по ирония на съдбата — най-голямата стойност (не ключ) на честотния речник
  • Връщаме променливата modes, която се състои от всички ключове в честотния речник с най-голяма честота.

Обърнете внимание колко важно е именуването на променливи за писане на четим код.

Използване на mode() и multimode() от статистическия модул на 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() връща първия намерен режим. Ако имате по-стара версия, ще получите a StatisticsError.

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

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

Изход:

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

Да обобщим

Честито! Ако сте следвали досега, сте научили как да изчислявате средната стойност, медианата и модата, основните измервания на централната тенденция.

Въпреки че можете да дефинирате вашите персонализирани функции за намиране на средна стойност, медиана и режим, препоръчително е да използвате модула за статистика, тъй като той е част от стандартната библиотека и не трябва да инсталирате нищо, за да започнете да го използвате.

След това прочетете приятелско въведение в анализа на данни в Python.