Очистка данных: как подготовить данные к анализу
Практика3 минРедакция Innovialabs
Коротко
Очистка данных — это последовательность шагов: найти и убрать дубли, решить, что делать с пропусками, привести форматы к единому виду, пометить выбросы и задокументировать все правила, чтобы их можно было повторить.
Короткий ответ
Аналитика на грязных данных даёт уверенные, но неверные выводы. Перед анализом пройдите пять шагов:
- Дубликаты — найти и решить, какую запись оставить.
- Пропуски — понять причину и выбрать стратегию.
- Форматы — привести даты, телефоны, суммы и справочники к одному виду.
- Выбросы — найти и пометить, а не удалять вслепую.
- Проверка и документация — зафиксировать правила, чтобы очистку можно было повторить.
Главный принцип: исходные данные не трогаем. Очистка идёт в новую таблицу или новый датафрейм, а каждое правило записано в коде.
Шаг 1. Дубликаты
Дубли появляются из повторных импортов, двойных кликов в форме, слияния двух CRM. Сначала определите, что считается одной сущностью: клиент — это один телефон? Один ИНН? Пара «имя + телефон»?
В SQL удобно пометить дубли оконной функцией и оставить самую свежую запись:
SELECT *
FROM (
SELECT *,
row_number() OVER (PARTITION BY phone ORDER BY updated_at DESC) AS rn
FROM customers
) t
WHERE rn = 1;
В pandas то же самое:
df = df.sort_values("updated_at").drop_duplicates(subset=["phone"], keep="last")
Важно: сравнивайте дубли после нормализации форматов, иначе «+998 90 123 45 67» и «901234567» останутся разными клиентами. Поэтому на практике шаги 1 и 3 часто идут в обратном порядке.
Шаг 2. Пропуски
Сначала посчитайте масштаб:
SELECT count(*) - count(email) AS no_email,
count(*) - count(city) AS no_city
FROM customers;
df.isna().sum()
Затем выберите стратегию для каждой колонки:
| Ситуация | Что делать |
|---|---|
| Пустое обязательное поле (id, дата заказа) | Исключить строку из анализа и записать причину |
| Справочное поле (город, источник) | Заполнить значением «Не указано» |
| Числовое поле, где пусто значит ноль | Заполнить нулём, только если это действительно так |
| Числовое поле, где ноль и «нет данных» различаются | Оставить пустым |
Не заполняйте пропуски средним «для красоты»: это искажает распределение и итоговые выводы.
Шаг 3. Единые форматы
Телефоны. Оставьте только цифры и приведите к одному виду, например к международному без плюса:
df["phone"] = df["phone"].str.replace(r"\D", "", regex=True)
short = df["phone"].str.len() == 9
df.loc[short, "phone"] = "998" + df.loc[short, "phone"]
Суммы. Строки вида «1 250 000,50 сум» превращаются в число только после удаления пробелов и валютных подписей:
df["amount"] = pd.to_numeric(
df["amount"].str.replace(r"[^\d,.\-]", "", regex=True).str.replace(",", "."),
errors="coerce",
)
Этот код рассчитан на формат с запятой как десятичным разделителем. Если источники используют разные форматы, обрабатывайте каждый отдельно.
Валюты. Не складывайте сумы и доллары в одной колонке. Храните amount и currency отдельно, а для пересчёта используйте курс на дату операции из таблицы курсов.
Даты. Указывайте формат явно, чтобы 03.04 не превратилось в 4 марта:
df["order_date"] = pd.to_datetime(df["order_date"], format="%d.%m.%Y", errors="coerce")
Текстовые справочники. «Ташкент», «г. Ташкент», «Tashkent» — это один город. Уберите пробелы, приведите регистр и сделайте таблицу соответствий для оставшихся вариантов.
Шаг 4. Выбросы
Выброс — не всегда ошибка. Крупный оптовый заказ реален, а заказ на сумму в тысячу раз больше обычного может быть опечаткой. Поэтому выбросы помечают, а решение принимают вместе с тем, кто знает бизнес.
Простой метод — межквартильный размах:
q1, q3 = df["amount"].quantile([0.25, 0.75])
iqr = q3 - q1
df["is_outlier"] = ~df["amount"].between(q1 - 1.5 * iqr, q3 + 1.5 * iqr)
В SQL границы можно получить через percentile_cont(0.25) WITHIN GROUP (ORDER BY amount).
Также проверьте логические ограничения: даты из будущего, отрицательные количества, возраст больше ста двадцати лет.
Шаг 5. Проверка и документация
- Сравните число строк и ключевые суммы до и после очистки.
- Запишите правила: какие дубли удалены, чем заполнены пропуски, какие выбросы исключены.
- Оформите очистку в скрипт, а не в ручные правки в Excel, — тогда её можно повторить на новых данных.