You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

18 KiB

Візуалізація розподілів

 Скетчнот від (@sketchthedocs)
Візуалізація розподілів - Скетчнот від @nitya

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

Тест перед лекцією

Дослідження набору даних про птахів

Ще один спосіб дослідити дані — це подивитися на їх розподіл, тобто як дані організовані вздовж осі. Наприклад, можливо, ви хочете дізнатися про загальний розподіл максимального розмаху крил або максимальної маси тіла птахів Міннесоти для цього набору даних.

Давайте відкриємо кілька фактів про розподіли даних у цьому наборі. У файлі notebook.ipynb у кореневій папці цього уроку імпортуйте Pandas, Matplotlib і ваші дані:

import pandas as pd
import matplotlib.pyplot as plt
birds = pd.read_csv('../../data/birds.csv')
birds.head()
Назва Наукова назва Категорія Ряд Родина Рід Статус збереження Мін. довжина Макс. довжина Мін. маса тіла Макс. маса тіла Мін. розмах крил Макс. розмах крил
0 Чорночеревий свистячий качур Dendrocygna autumnalis Качки/Гуси/Водоплавні Anseriformes Anatidae Dendrocygna LC 47 56 652 1020 76 94
1 Рудий свистячий качур Dendrocygna bicolor Качки/Гуси/Водоплавні Anseriformes Anatidae Dendrocygna LC 45 53 712 1050 85 93
2 Біла гуска Anser caerulescens Качки/Гуси/Водоплавні Anseriformes Anatidae Anser LC 64 79 2050 4050 135 165
3 Гуска Росса Anser rossii Качки/Гуси/Водоплавні Anseriformes Anatidae Anser LC 57.3 64 1066 1567 113 116
4 Велика білолоба гуска Anser albifrons Качки/Гуси/Водоплавні Anseriformes Anatidae Anser LC 64 81 1930 3310 130 165

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

birds.plot(kind='scatter',x='MaxLength',y='Order',figsize=(12,8))

plt.title('Max Length per Order')
plt.ylabel('Order')
plt.xlabel('Max Length')

plt.show()

максимальна довжина за рядом

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

Робота з гістограмами

Matplotlib пропонує дуже хороші способи візуалізації розподілу даних за допомогою гістограм. Цей тип графіка схожий на стовпчастий графік, де розподіл можна побачити через підйом і спад стовпців. Для створення гістограми потрібні числові дані. Щоб створити гістограму, ви можете побудувати графік, визначивши тип як 'hist' для гістограми. Цей графік показує розподіл MaxBodyMass для всього діапазону числових даних набору. Розділяючи масив даних на менші бінарні групи, він може відобразити розподіл значень даних:

birds['MaxBodyMass'].plot(kind = 'hist', bins = 10, figsize = (12,12))
plt.show()

розподіл по всьому набору даних

Як видно, більшість із 400+ птахів у цьому наборі даних мають масу тіла менше 2000. Отримайте більше інформації про дані, змінивши параметр bins на більше значення, наприклад, 30:

birds['MaxBodyMass'].plot(kind = 'hist', bins = 30, figsize = (12,12))
plt.show()

розподіл по всьому набору даних із більшим параметром bins

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

Відфільтруйте дані, щоб отримати лише тих птахів, чия маса тіла менше 60, і покажіть 40 bins:

filteredBirds = birds[(birds['MaxBodyMass'] > 1) & (birds['MaxBodyMass'] < 60)]      
filteredBirds['MaxBodyMass'].plot(kind = 'hist',bins = 40,figsize = (12,12))
plt.show()     

відфільтрована гістограма

Спробуйте інші фільтри та точки даних. Щоб побачити повний розподіл даних, видаліть фільтр ['MaxBodyMass'], щоб показати розподіли з мітками.

Гістограма також пропонує цікаві покращення кольору та міток:

Створіть 2D-гістограму, щоб порівняти взаємозв’язок між двома розподілами. Давайте порівняємо MaxBodyMass і MaxLength. Matplotlib пропонує вбудований спосіб показати збіг за допомогою яскравіших кольорів:

x = filteredBirds['MaxBodyMass']
y = filteredBirds['MaxLength']

fig, ax = plt.subplots(tight_layout=True)
hist = ax.hist2d(x, y)

Здається, є очікуваний кореляційний зв’язок між цими двома елементами вздовж очікуваної осі, з одним особливо сильним точковим збігом:

2D графік

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

Дослідження набору даних для розподілів за текстовими даними

Цей набір даних також містить хорошу інформацію про категорію птахів, їх рід, вид, родину, а також статус збереження. Давайте дослідимо цю інформацію про статус збереження. Який розподіл птахів за їх статусом збереження?

У наборі даних використовуються кілька абревіатур для опису статусу збереження. Ці абревіатури походять із Категорій Червоного списку МСОП, організації, яка каталогізує статус видів.

  • CR: Критично зникаючий
  • EN: Зникаючий
  • EX: Вимерлий
  • LC: Найменша загроза
  • NT: Близький до загрози
  • VU: Уразливий

Це текстові значення, тому вам потрібно буде виконати трансформацію, щоб створити гістограму. Використовуючи фрейм даних filteredBirds, відобразіть його статус збереження разом із мінімальним розмахом крил. Що ви бачите?

x1 = filteredBirds.loc[filteredBirds.ConservationStatus=='EX', 'MinWingspan']
x2 = filteredBirds.loc[filteredBirds.ConservationStatus=='CR', 'MinWingspan']
x3 = filteredBirds.loc[filteredBirds.ConservationStatus=='EN', 'MinWingspan']
x4 = filteredBirds.loc[filteredBirds.ConservationStatus=='NT', 'MinWingspan']
x5 = filteredBirds.loc[filteredBirds.ConservationStatus=='VU', 'MinWingspan']
x6 = filteredBirds.loc[filteredBirds.ConservationStatus=='LC', 'MinWingspan']

kwargs = dict(alpha=0.5, bins=20)

plt.hist(x1, **kwargs, color='red', label='Extinct')
plt.hist(x2, **kwargs, color='orange', label='Critically Endangered')
plt.hist(x3, **kwargs, color='yellow', label='Endangered')
plt.hist(x4, **kwargs, color='green', label='Near Threatened')
plt.hist(x5, **kwargs, color='blue', label='Vulnerable')
plt.hist(x6, **kwargs, color='gray', label='Least Concern')

plt.gca().set(title='Conservation Status', ylabel='Min Wingspan')
plt.legend();

розмах крил і статус збереження

Не здається, що є хороша кореляція між мінімальним розмахом крил і статусом збереження. Перевірте інші елементи набору даних, використовуючи цей метод. Ви можете спробувати різні фільтри. Чи знаходите ви якусь кореляцію?

Графіки щільності

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

Щоб працювати з графіками щільності, ознайомтеся з новою бібліотекою для побудови графіків, Seaborn.

Завантаживши Seaborn, спробуйте базовий графік щільності:

import seaborn as sns
import matplotlib.pyplot as plt
sns.kdeplot(filteredBirds['MinWingspan'])
plt.show()

Графік щільності

Ви можете побачити, як графік повторює попередній для даних про мінімальний розмах крил; він просто трохи плавніший. Згідно з документацією Seaborn, "Порівняно з гістограмою, KDE може створити графік, який є менш захаращеним і більш зрозумілим, особливо при побудові кількох розподілів. Але він має потенціал для введення спотворень, якщо основний розподіл обмежений або не плавний. Як і гістограма, якість представлення також залежить від вибору хороших параметрів згладжування." джерело Іншими словами, аномалії, як завжди, можуть негативно вплинути на ваші графіки.

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

sns.kdeplot(filteredBirds['MaxBodyMass'])
plt.show()

гладка лінія маси тіла

Якщо ви хочете гладку, але не надто гладку лінію, змініть параметр bw_adjust:

sns.kdeplot(filteredBirds['MaxBodyMass'], bw_adjust=.2)
plt.show()

менш гладка лінія маси тіла

Прочитайте про доступні параметри для цього типу графіка та експериментуйте!

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

sns.kdeplot(
   data=filteredBirds, x="MaxBodyMass", hue="Order",
   fill=True, common_norm=False, palette="crest",
   alpha=.5, linewidth=0,
)

маса тіла за рядом

Ви також можете відобразити щільність кількох змінних на одному графіку. Перевірте MaxLength і MinLength птаха порівняно з їх статусом збереження:

sns.kdeplot(data=filteredBirds, x="MinLength", y="MaxLength", hue="ConservationStatus")

кілька щільностей, накладених одна на одну

Можливо, варто дослідити, чи є кластер "Уразливих" птахів за їх довжиною значущим чи ні.

🚀 Виклик

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

Тест після лекції

Огляд і самостійне навчання

У цьому уроці ви використовували Matplotlib і почали працювати з Seaborn, щоб створювати більш складні графіки. Проведіть дослідження про kdeplot у Seaborn, "неперервну криву щільності ймовірності в одному або кількох вимірах". Прочитайте документацію, щоб зрозуміти, як це працює.

Завдання

Застосуйте свої навички


Відмова від відповідальності:
Цей документ був перекладений за допомогою сервісу автоматичного перекладу Co-op Translator. Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу.