Перейти к содержанию
Innovialabs

Очистка данных: как подготовить данные к анализу

Практика3 мин

Коротко

Очистка данных — это последовательность шагов: найти и убрать дубли, решить, что делать с пропусками, привести форматы к единому виду, пометить выбросы и задокументировать все правила, чтобы их можно было повторить.

Короткий ответ

Аналитика на грязных данных даёт уверенные, но неверные выводы. Перед анализом пройдите пять шагов:

  1. Дубликаты — найти и решить, какую запись оставить.
  2. Пропуски — понять причину и выбрать стратегию.
  3. Форматы — привести даты, телефоны, суммы и справочники к одному виду.
  4. Выбросы — найти и пометить, а не удалять вслепую.
  5. Проверка и документация — зафиксировать правила, чтобы очистку можно было повторить.

Главный принцип: исходные данные не трогаем. Очистка идёт в новую таблицу или новый датафрейм, а каждое правило записано в коде.

Шаг 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, — тогда её можно повторить на новых данных.

Частые вопросы

SQL удобен, когда данные уже лежат в базе и их много. pandas удобнее для разовых файлов, сложных преобразований и исследования. Часто сочетают: грубая очистка в SQL, детальная — в Python.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.