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.
Data-Science-For-Beginners/translations/uk/2-Working-With-Data/08-data-preparation/README.md

27 KiB

Робота з даними: Підготовка даних

 Скетчноут від (@sketchthedocs)
Підготовка даних - Скетчноут від @nitya

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

Залежно від джерела, необроблені дані можуть містити певні невідповідності, які створюють труднощі для аналізу та моделювання. Іншими словами, ці дані можна класифікувати як "брудні", і їх потрібно очистити. У цьому уроці розглядаються техніки очищення та трансформації даних для вирішення проблем із відсутніми, неточними або неповними даними. Теми, які розглядаються в цьому уроці, використовують Python і бібліотеку Pandas і будуть демонструватися у зошиті у цій директорії.

Важливість очищення даних

  • Зручність використання та повторного використання: Коли дані правильно організовані та нормалізовані, їх легше шукати, використовувати та ділитися з іншими.

  • Послідовність: У науці про дані часто доводиться працювати з кількома наборами даних, які потрібно об’єднувати. Забезпечення спільної стандартизації кожного окремого набору даних гарантує, що дані залишатимуться корисними після їх об’єднання в один набір.

  • Точність моделі: Очищені дані підвищують точність моделей, які на них базуються.

Поширені цілі та стратегії очищення

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

  • Форматування: Залежно від джерела, дані можуть мати невідповідності у представленні. Це може спричинити проблеми з пошуком і відображенням значень, коли вони є в наборі даних, але неправильно представлені у візуалізаціях або результатах запитів. Поширені проблеми форматування включають усунення пробілів, дат і типів даних. Вирішення питань форматування зазвичай залежить від користувачів даних. Наприклад, стандарти представлення дат і чисел можуть відрізнятися залежно від країни.

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

  • Відсутні дані: Відсутні дані можуть спричиняти неточності, а також слабкі або упереджені результати. Іноді це можна вирішити шляхом "перезавантаження" даних, заповнення відсутніх значень за допомогою обчислень і коду, наприклад Python, або просто видалення значення та відповідних даних. Причини відсутності даних можуть бути різними, і дії, які вживаються для вирішення цієї проблеми, залежать від того, як і чому дані зникли.

Дослідження інформації про DataFrame

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

Після завантаження даних у pandas вони, швидше за все, будуть у вигляді DataFrame (зверніться до попереднього уроку для детального огляду). Але якщо набір даних у вашому DataFrame має 60 000 рядків і 400 стовпців, як почати розуміти, з чим ви працюєте? На щастя, pandas надає зручні інструменти для швидкого перегляду загальної інформації про DataFrame, а також перших і останніх кількох рядків.

Щоб дослідити цю функціональність, ми імпортуємо бібліотеку Python scikit-learn і використаємо знаковий набір даних: Iris data set.

import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
iris_df = pd.DataFrame(data=iris['data'], columns=iris['feature_names'])
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
  • DataFrame.info: Для початку метод info() використовується для виведення зведення про вміст, що міститься в DataFrame. Давайте подивимося на цей набір даних:
iris_df.info()
RangeIndex: 150 entries, 0 to 149
Data columns (total 4 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   sepal length (cm)  150 non-null    float64
 1   sepal width (cm)   150 non-null    float64
 2   petal length (cm)  150 non-null    float64
 3   petal width (cm)   150 non-null    float64
dtypes: float64(4)
memory usage: 4.8 KB

З цього ми знаємо, що набір даних Iris має 150 записів у чотирьох стовпцях без відсутніх значень. Усі дані зберігаються як 64-бітні числа з плаваючою комою.

  • DataFrame.head(): Далі, щоб перевірити фактичний вміст DataFrame, ми використовуємо метод head(). Давайте подивимося, як виглядають перші кілька рядків нашого iris_df:
iris_df.head()
   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
0                5.1               3.5                1.4               0.2
1                4.9               3.0                1.4               0.2
2                4.7               3.2                1.3               0.2
3                4.6               3.1                1.5               0.2
4                5.0               3.6                1.4               0.2
  • DataFrame.tail(): І навпаки, щоб перевірити останні кілька рядків DataFrame, ми використовуємо метод tail():
iris_df.tail()
     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
145                6.7               3.0                5.2               2.3
146                6.3               2.5                5.0               1.9
147                6.5               3.0                5.2               2.0
148                6.2               3.4                5.4               2.3
149                5.9               3.0                5.1               1.8

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

Робота з відсутніми даними

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

У більшості випадків набори даних, які ви хочете використовувати (або змушені використовувати), містять відсутні значення. Те, як обробляються відсутні дані, має тонкі компроміси, які можуть вплинути на ваш остаточний аналіз і реальні результати.

Pandas обробляє відсутні значення двома способами. Перший ви вже бачили в попередніх розділах: NaN, або Not a Number. Це спеціальне значення, яке є частиною специфікації IEEE для чисел з плаваючою комою, і воно використовується лише для позначення відсутніх значень з плаваючою комою.

Для відсутніх значень, окрім чисел з плаваючою комою, pandas використовує об’єкт Python None. Хоча може здатися заплутаним, що ви зіткнетеся з двома різними типами значень, які по суті означають одне й те саме, існують обґрунтовані програмні причини для такого вибору дизайну, і на практиці це дозволяє pandas забезпечити хороший компроміс для більшості випадків. Незважаючи на це, і None, і NaN мають обмеження, які потрібно враховувати щодо їх використання.

Дізнайтеся більше про NaN і None у зошиті!

  • Виявлення відсутніх значень: У pandas методи isnull() і notnull() є основними для виявлення відсутніх даних. Обидва повертають булеві маски для ваших даних. Ми будемо використовувати numpy для значень NaN:
import numpy as np

example1 = pd.Series([0, np.nan, '', None])
example1.isnull()
0    False
1     True
2    False
3     True
dtype: bool

Уважно подивіться на результат. Чи щось вас здивувало? Хоча 0 є арифметичним нулем, це все ж таки цілком допустиме ціле число, і pandas розглядає його як таке. '' трохи складніше. Хоча ми використовували його в Розділі 1 для представлення порожнього рядка, це все ж таки об’єкт рядка, а не представлення нуля з точки зору pandas.

Тепер давайте перевернемо це й використаємо ці методи так, як ви будете використовувати їх на практиці. Ви можете використовувати булеві маски безпосередньо як індекс Series або DataFrame, що може бути корисним під час роботи з окремими відсутніми (або наявними) значеннями.

Висновок: Методи isnull() і notnull() дають схожі результати, коли ви використовуєте їх у DataFrame: вони показують результати та індекс цих результатів, що буде надзвичайно корисним під час роботи з вашими даними.

  • Видалення відсутніх значень: Окрім ідентифікації відсутніх значень, pandas надає зручний спосіб видалення відсутніх значень із Series і DataFrame. (Особливо для великих наборів даних часто доцільніше просто видалити відсутні [NA] значення з аналізу, ніж обробляти їх іншими способами.) Щоб побачити це в дії, повернемося до example1:
example1 = example1.dropna()
example1
0    0
2     
dtype: object

Зверніть увагу, що це має виглядати як ваш результат із example3[example3.notnull()]. Різниця тут у тому, що замість індексації за маскованими значеннями dropna видалив ці відсутні значення з Series example1.

Оскільки DataFrame має два виміри, він надає більше варіантів для видалення даних.

example2 = pd.DataFrame([[1,      np.nan, 7], 
                         [2,      5,      8], 
                         [np.nan, 6,      9]])
example2
0 1 2
0 1.0 NaN 7
1 2.0 5.0 8
2 NaN 6.0 9

(Чи помітили ви, що pandas перетворив два стовпці на числа з плаваючою комою, щоб врахувати NaN?)

Ви не можете видалити одне значення з DataFrame, тому вам доведеться видаляти цілі рядки або стовпці. Залежно від того, що ви робите, вам може знадобитися зробити одне або інше, і pandas надає вам варіанти для обох. Оскільки в науці про дані стовпці зазвичай представляють змінні, а рядки — спостереження, ви частіше видаляєте рядки даних; налаштування за замовчуванням для dropna() — видаляти всі рядки, які містять будь-які відсутні значення:

example2.dropna()
	0	1	2
1	2.0	5.0	8

Якщо потрібно, ви можете видалити значення NA зі стовпців. Використовуйте axis=1, щоб зробити це:

example2.dropna(axis='columns')
	2
0	7
1	8
2	9

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

За замовчуванням how='any' (якщо ви хочете перевірити самостійно або побачити, які інші параметри має метод, запустіть example4.dropna? у кодовій комірці). Ви можете вказати how='all', щоб видаляти лише ті рядки або стовпці, які містять усі відсутні значення. Давайте розширимо наш приклад DataFrame, щоб побачити це в дії.

example2[3] = np.nan
example2
0 1 2 3
0 1.0 NaN 7 NaN
1 2.0 5.0 8 NaN
2 NaN 6.0 9 NaN

Параметр thresh дає вам більш точний контроль: ви встановлюєте кількість ненульових значень, які рядок або стовпець повинен мати, щоб залишитися:

example2.dropna(axis='rows', thresh=3)
	0	1	2	3
1	2.0	5.0	8	NaN

Тут перший і останній рядки були видалені, оскільки вони містять лише два ненульові значення.

  • Заповнення відсутніх значень: Залежно від вашого набору даних, іноді має більше сенсу заповнити відсутні значення дійсними, ніж видаляти їх. Ви можете використовувати isnull, щоб зробити це на місці, але це може бути трудомістким, особливо якщо у вас багато значень для заповнення. Оскільки це дуже поширене завдання в науці про дані, pandas надає fillna, який повертає копію Series або DataFrame із заміненими відсутніми значеннями на ваш вибір. Давайте створимо ще один приклад Series, щоб побачити, як це працює на практиці.
example3 = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'))
example3
a    1.0
b    NaN
c    2.0
d    NaN
e    3.0
dtype: float64

Ви можете заповнити всі відсутні значення одним значенням, наприклад 0:

example3.fillna(0)
a    1.0
b    0.0
c    2.0
d    0.0
e    3.0
dtype: float64

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

example3.fillna(method='ffill')
a    1.0
b    1.0
c    2.0
d    2.0
e    3.0
dtype: float64

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

example3.fillna(method='bfill')
a    1.0
b    2.0
c    2.0
d    3.0
e    3.0
dtype: float64

Як ви могли здогадатися, це працює так само з DataFrame, але ви також можете вказати axis, уздовж якого потрібно заповнити відсутні значення. Використовуючи раніше використаний example2 знову:

example2.fillna(method='ffill', axis=1)
	0	1	2	3
0	1.0	1.0	7.0	7.0
1	2.0	5.0	8.0	8.0
2	NaN	6.0	9.0	9.0

Зверніть увагу, що коли попереднє значення недоступне для заповнення вперед, відсутнє значення залишається.

Основна думка: Існує багато способів впоратися з відсутніми значеннями у ваших наборах даних. Конкретна стратегія, яку ви обираєте (видалення, заміна або навіть спосіб заміни), повинна залежати від особливостей даних. Ви краще зрозумієте, як працювати з відсутніми значеннями, чим більше ви будете взаємодіяти з наборами даних.

Видалення дубльованих даних

Ціль навчання: До кінця цього підрозділу ви повинні впевнено визначати та видаляти дубльовані значення з DataFrame.

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

  • Визначення дубльованих значень: duplicated: Ви можете легко знайти дубльовані значення за допомогою методу duplicated у pandas, який повертає булеву маску, що вказує, чи є запис у DataFrame дубльованим попереднім. Давайте створимо ще один приклад DataFrame, щоб побачити це в дії.
example4 = pd.DataFrame({'letters': ['A','B'] * 2 + ['B'],
                         'numbers': [1, 2, 1, 3, 3]})
example4
letters numbers
0 A 1
1 B 2
2 A 1
3 B 3
4 B 3
example4.duplicated()
0    False
1    False
2     True
3    False
4     True
dtype: bool
  • Видалення дубльованих значень: drop_duplicates: просто повертає копію даних, для яких всі значення duplicated є False:
example4.drop_duplicates()
	letters	numbers
0	A	1
1	B	2
3	B	3

Методи duplicated і drop_duplicates за замовчуванням враховують всі стовпці, але ви можете вказати, щоб вони перевіряли лише підмножину стовпців у вашому DataFrame:

example4.drop_duplicates(['letters'])
letters	numbers
0	A	1
1	B	2

Основна думка: Видалення дубльованих даних є важливою частиною майже кожного проєкту з аналізу даних. Дубльовані дані можуть змінити результати ваших аналізів і надати вам неточні результати!

🚀 Виклик

Всі обговорені матеріали доступні у Jupyter Notebook. Крім того, після кожного розділу є вправи — спробуйте їх виконати!

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

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

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

Завдання

Оцінка даних з форми


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