Освоєння мистецтва очищення даних у Python - KDnuggets

Освоєння мистецтва очищення даних у Python – KDnuggets

Вихідний вузол: 2939047

Освоєння мистецтва очищення даних у Python
Зображення автора
 

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

Ця стаття знайомить вас із кількома ключовими методами очищення даних у Python за допомогою потужних бібліотек, таких як pandas, numpy, seaborn і matplotlib.

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

Ми розглянемо наступні завдання очищення даних.
 

Освоєння мистецтва очищення даних у Python
Зображення автора

Перш ніж почати, давайте імпортуємо необхідні бібліотеки. Ми будемо використовувати pandas для обробки даних, а seaborn і matplotlib для візуалізації.

Ми також імпортуємо модуль Python datetime для обробки дат.

import pandas as pd
import seaborn as sns
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

Спочатку нам потрібно буде завантажити наші дані. У цьому прикладі ми збираємося завантажити файл CSV за допомогою pandas. Ми також додаємо аргумент роздільник.

df = pd.read_csv('F:KDNuggetsKDN Mastering the Art of Data Cleaning in Pythonproperty.csv', delimiter= ';')

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

# Look at all the rows of the dataframe
display(df)

Ось як виглядає набір даних.

 

Освоєння мистецтва очищення даних у Python
 

Ви відразу побачите, що деякі значення відсутні. Крім того, формати дати несумісні.

Тепер давайте подивимося на підсумок DataFrame за допомогою методу info().

# Get a concise summary of the dataframe
print(df.info())

Ось вихідний код.

 

Освоєння мистецтва очищення даних у Python
 

Ми бачимо, що лише стовпець square_feet не має жодних значень NULL, тому нам якось доведеться це впоратися. Крім того, стовпці advertisement_date і sale_date є типом даних об’єкта, навіть якщо це має бути дата.

Розташування колонки абсолютно порожнє. Нам це потрібно?

Ми покажемо вам, як вирішити ці проблеми. Ми почнемо з вивчення того, як видалити непотрібні стовпці.

У наборі даних є два стовпці, які нам не потрібні для аналізу даних, тому ми їх видалимо.

Перший стовпець – покупець. Нам це не потрібно, оскільки ім'я покупця не впливає на аналіз.

Ми використовуємо метод drop() із вказаною назвою стовпця. Ми встановлюємо вісь на 1, щоб вказати, що ми хочемо видалити стовпець. Крім того, аргумент inplace має значення True, щоб ми змінювали існуючий DataFrame, а не створювали новий DataFrame без видаленого стовпця.

df.drop('buyer', axis = 1, inplace = True)

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

Ми використовуємо той самий підхід, що і з першою колонкою.

df.drop('location', axis = 1, inplace = True)

Звичайно, ви можете видалити ці два стовпці одночасно.

df = df.drop(['buyer', 'location'], axis=1)

Обидва підходи повертають наступний кадр даних.

 

Освоєння мистецтва очищення даних у Python

Дубльовані дані можуть виникати у вашому наборі даних з різних причин і можуть спотворити ваш аналіз.

Давайте виявимо дублікати в нашому наборі даних. Ось як це зробити.

Наведений нижче код використовує метод дубльований() розглядати дублікати у всьому наборі даних. Його налаштування за замовчуванням — розглядати перше входження значення як унікальне, а наступні входження — як дублікати. Ви можете змінити цю поведінку за допомогою тримати параметр. Наприклад, df.duplicated(keep=False) позначатиме всі дублікати як True, включаючи перше входження.

# Detecting duplicates
duplicates = df[df.duplicated()]
duplicates

Ось результат.

 

Освоєння мистецтва очищення даних у Python
 

Рядок з індексом 3 було позначено як дублікат, оскільки рядок 2 із такими самими значеннями є його першим входженням.

Тепер нам потрібно видалити дублікати, що ми робимо за допомогою наступного коду.

# Detecting duplicates
duplicates = df[df.duplicated()]
duplicates

Команда drop_duplicates() функція розглядає всі стовпці, виявляючи дублікати. Якщо ви хочете розглянути лише певні стовпці, ви можете передати їх як список у цю функцію так: df.drop_duplicates(subset=['column1', 'column2']).

 

Освоєння мистецтва очищення даних у Python
 

Як бачите, повторюваний рядок видалено. Однак індексація залишилася незмінною, індекс 3 відсутній. Ми виправимо це, скинувши індекси.

df = df.reset_index(drop=True)

Це завдання виконується за допомогою reset_index() функція. Аргумент drop=True використовується для відхилення вихідного індексу. Якщо ви не включите цей аргумент, старий індекс буде додано як новий стовпець у вашому DataFrame. Встановлюючи drop=True, ви повідомляєте pandas забути старий індекс і скинути його до стандартного цілого індексу.

Для практики спробуйте видалити дублікати з цього набору даних Microsoft.

Іноді типи даних можуть бути встановлені неправильно. Наприклад, стовпець дати може інтерпретуватися як рядки. Вам потрібно перетворити їх на відповідні типи.

У нашому наборі даних ми зробимо це для стовпців advertisement_date і sale_date, оскільки вони показані як тип даних об’єкта. Крім того, дати дати мають різний формат у рядках. Нам потрібно зробити його узгодженим разом із перетворенням на дату.

Найпростіший спосіб - використовувати to_datetime() метод. Знову ж таки, ви можете робити це стовпець за стовпцем, як показано нижче.

При цьому ми встановлюємо для аргументу dayfirst значення True, оскільки деякі дати починаються з першого дня.

# Converting advertisement_date column to datetime
df['advertisement_date'] = pd.to_datetime(df['advertisement_date'], dayfirst = True) # Converting sale_date column to datetime
df['sale_date'] = pd.to_datetime(df['sale_date'], dayfirst = True)

Ви також можете конвертувати обидва стовпці одночасно за допомогою застосовувати () метод с to_datetime().

# Converting advertisement_date and sale_date columns to datetime
df[['advertisement_date', 'sale_date']] = df[['advertisement_date', 'sale_date']].apply(pd.to_datetime, dayfirst = True)

Обидва підходи дають однаковий результат.

 

Освоєння мистецтва очищення даних у Python
 

Тепер дати представлені в узгодженому форматі. Ми бачимо, що не всі дані були перетворені. Є одне значення NaT в advertisement_date і два в sale_date. Це означає, що дата відсутня.

Давайте перевіримо, чи стовпці перетворюються на дати за допомогою інформація () метод.

# Get a concise summary of the dataframe
print(df.info())

 

Освоєння мистецтва очищення даних у Python
 

Як бачите, обидва стовпці не мають формат datetime64[ns].

Тепер спробуйте перетворити дані з TEXT на NUMERIC Набір даних Airbnb.

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

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

Видалення рядків із відсутніми значеннями

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

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

Ось код, де ми вказуємо індекс рядка.

df = df.drop(8)

DataFrame тепер виглядає так.

 

Освоєння мистецтва очищення даних у Python
 

Останній рядок було видалено, і наш DataFrame тепер виглядає краще. Проте все ще є деякі відсутні дані, які ми обробимо за допомогою іншого підходу.

Врахування відсутніх значень

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

У нашому вже зміненому DataFrame ми маємо значення NaT (Not a Time) у стовпцях advertisement_date і sale_date. Ми приписуємо ці відсутні значення за допомогою середній() метод.

Код використовує fillna() метод пошуку та заповнення нульових значень середнім значенням.

# Imputing values for numerical columns
df['advertisement_date'] = df['advertisement_date'].fillna(df['advertisement_date'].mean())
df['sale_date'] = df['sale_date'].fillna(df['sale_date'].mean())

Ви також можете зробити те саме в одному рядку коду. Ми використовуємо застосовувати () щоб застосувати функцію, визначену за допомогою лямбда. Як і вище, ця функція використовує fillna() та середній() методи заповнення пропущених значень.

# Imputing values for multiple numerical columns
df[['advertisement_date', 'sale_date']] = df[['advertisement_date', 'sale_date']].apply(lambda x: x.fillna(x.mean()))

Результат в обох випадках виглядає так.

 

Освоєння мистецтва очищення даних у Python
 

У нашому стовпці sale_date тепер є час, який нам не потрібен. Давайте приберемо їх.

Ми будемо використовувати strftime () метод, який перетворює дати в їх рядкове подання та певний формат.

df['sale_date'] = df['sale_date'].dt.strftime('%Y-%m-%d')

 

Освоєння мистецтва очищення даних у Python
 

Тепер дати виглядають акуратно.

Якщо вам потрібно використовувати strftime () на кількох стовпцях, ви можете знову використати лямбда наступним чином.

df[['date1_formatted', 'date2_formatted']] = df[['date1', 'date2']].apply(lambda x: x.dt.strftime('%Y-%m-%d'))

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

Категориальні дані – це тип даних, який використовується для групування інформації зі схожими характеристиками. Кожна з цих груп є категорією. Категориальні дані можуть приймати числові значення (наприклад, «1» означає «чоловічий» і «2» означає «жіночий»), але ці числа не мають математичного значення. Ви не можете скласти їх разом, наприклад.

Категориальні дані зазвичай поділяються на дві категорії:

  1. Номінальні дані: Це коли категорії лише позначені і не можуть бути розташовані в певному порядку. Приклади включають стать (чоловіча, жіноча), групу крові (A, B, AB, O) або колір (червоний, зелений, синій).
  1. Порядкові дані: Це коли категорії можна впорядкувати або ранжувати. Хоча інтервали між категоріями не однакові, порядок категорій має значення. Приклади включають шкали оцінок (оцінка фільму від 1 до 5), рівень освіти (середня школа, бакалаврат, магістратура) або стадії раку (стадія I, стадія II, стадія III).

Для імпутації відсутніх категоріальних даних зазвичай використовується режим. У нашому прикладі стовпець property_category — це категоричні (номінальні) дані, а в двох рядках відсутні дані.

Замінимо пропущені значення на режим.

# For categorical columns
df['property_category'] = df['property_category'].fillna(df['property_category'].mode()[0])

Цей код використовує fillna() замінює всі значення NaN у стовпці property_category. Він замінює його режимом.

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

Ось результат.

 

Освоєння мистецтва очищення даних у Python
 

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

Ви можете практикувати роботу з нулями на цьому Питання для метаінтерв'ю, де вам доведеться замінити NULL на нулі.

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

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

  • Помилки вимірювань або введення
  • Корупція даних
  • Справжні статистичні аномалії

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

Деякі з найпоширеніших методів виявлення викидів: Z-показник, IQR (міжквартильний діапазон), прямокутні діаграми, діаграми розсіювання та методи візуалізації даних. У деяких складних випадках також використовуються методи машинного навчання.

Візуалізація даних може допомогти виявити викиди. Boxplot Seaborn дуже зручний для цього.

plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['advertised_price', 'sale_price']])

Ми використовуємо plt.figure(), щоб встановити ширину та висоту фігури в дюймах.

Потім ми створюємо коробковий графік для стовпців advertised_price і sale_price, який виглядає так.

 

Освоєння мистецтва очищення даних у Python
 

Сюжет можна покращити для полегшення використання, додавши це до наведеного вище коду.

plt.xlabel('Prices')
plt.ylabel('USD')
plt.ticklabel_format(style='plain', axis='y')
formatter = ticker.FuncFormatter(lambda x, p: format(x, ',.2f'))
plt.gca().yaxis.set_major_formatter(formatter)

Ми використовуємо наведений вище код, щоб встановити мітки для обох осей. Ми також помітили, що значення на осі ординат є науковими позначеннями, і ми не можемо використовувати це для значень ціни. Тому ми змінюємо це на простий стиль за допомогою функції plt.ticklabel_format().

Потім ми створюємо засіб форматування, який відображатиме значення на осі y з комами як роздільниками тисяч і десятковими крапками. Останній рядок коду застосовує це до осі.

Результат тепер виглядає так.

 

Освоєння мистецтва очищення даних у Python
 

Тепер, як ми ідентифікуємо та видаляємо викид?

Одним із способів є використання методу IQR.

IQR, або міжквартильний діапазон, — це статистичний метод, який використовується для вимірювання мінливості шляхом поділу набору даних на квартилі. Квартилі ділять упорядкований за рангом набір даних на чотири рівні частини, а значення в діапазоні першого квартиля (25-й процентиль) і третього квартиля (75-й процентиль) складають інтерквартильний діапазон.

Міжквартильний діапазон використовується для виявлення викидів у даних. Ось як це працює:

  1. Спочатку обчисліть перший квартиль (Q1), третій квартиль (Q3), а потім визначте IQR. IQR обчислюється як Q3 – Q1.
  2. Будь-яке значення нижче Q1 – 1.5IQR або вище Q3 + 1.5IQR вважається викидом.

На нашому прямокутному графіку квадрат насправді представляє IQR. Лінія всередині рамки є медіаною (або другим квартилем). «Вуса» коробкового графіка представляють діапазон у межах 1.5*IQR від Q1 і Q3.

Будь-які точки даних поза цими вусами можна вважати викидами. У нашому випадку це вартість 12,000,000 XNUMX XNUMX доларів США. Якщо ви подивіться на коробковий графік, ви побачите, наскільки чітко це представлено, що показує, чому візуалізація даних важлива для виявлення викидів.

Тепер давайте видалимо викиди за допомогою методу IQR у коді Python. По-перше, ми видалимо рекламовані цінові відхилення.

Q1 = df['advertised_price'].quantile(0.25)
Q3 = df['advertised_price'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['advertised_price'] (Q1 - 1.5 * IQR)) |(df['advertised_price'] > (Q3 + 1.5 * IQR)))]

Спочатку ми обчислюємо перший квартиль (або 25-й процентиль) за допомогою квантиль() функція. Ми робимо те саме для третього квартиля або 75-го процентиля.

Вони показують значення, нижче яких опускаються 25% і 75% даних відповідно.

Потім ми обчислюємо різницю між квартилями. Поки що все це лише переклад кроків IQR у код Python.

Як останній крок, ми видаляємо викиди. Іншими словами, усі дані менше Q1 – 1.5 * IQR або більше Q3 + 1.5 * IQR.

Оператор '~' заперечує умову, тому ми залишаємо лише дані, які не є викидами.

Тоді ми можемо зробити те саме з ціною продажу.

Q1 = df['sale_price'].quantile(0.25)
Q3 = df['sale_price'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['sale_price'] (Q1 - 1.5 * IQR)) |(df['sale_price'] > (Q3 + 1.5 * IQR)))]

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

for column in ['advertised_price', 'sale_price']: Q1 = df[column].quantile(0.25) Q3 = df[column].quantile(0.75) IQR = Q3 - Q1 df = df[~((df[column] (Q1 - 1.5 * IQR)) |(df[column] > (Q3 + 1.5 * IQR)))]

Цикл повторює два стовпці. Для кожного стовпця він обчислює IQR, а потім видаляє рядки в DataFrame.

Зверніть увагу, що ця операція виконується послідовно, спочатку для advertised_price, а потім для sale_price. Як наслідок, DataFrame змінюється на місці для кожного стовпця, а рядки можуть бути видалені через те, що вони є викидом у будь-якому стовпці. Таким чином, ця операція може призвести до меншої кількості рядків, ніж якби викиди для advertised_price і sale_price були видалені незалежно, а результати об’єднані пізніше.

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

plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['advertised_price', 'sale_price']])
plt.xlabel('Prices')
plt.ylabel('USD')
plt.ticklabel_format(style='plain', axis='y')
formatter = ticker.FuncFormatter(lambda x, p: format(x, ',.2f'))
plt.gca().yaxis.set_major_formatter(formatter)

Ось результат.

 

Освоєння мистецтва очищення даних у Python
 

Ви можете попрактикуватися в обчисленні процентилів у Python, розв’язавши Питання для співбесіди на Генеральній Асамблеї.

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

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

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

Якщо ви не бачите задоволення від цього результату, а чисті дані не викликають у вас дивного захоплення, що ж ви робите в галузі даних!?
 

Нейт Розіді є фахівцем із даних та стратегією продукту. Він також є ад’юнкт-професором, який викладає аналітику, і є засновником StrataScratch, платформа, яка допомагає науковцям з даних готуватися до інтерв’ю з реальними запитаннями для інтерв’ю від провідних компаній. Зв'яжіться з ним Twitter: StrataScratch or LinkedIn.

Часова мітка:

Більше від KDnuggets