← Назад к вопросам

В чём важность очистки данных?

1.0 Junior🔥 231 комментариев
#Pandas и обработка данных#Опыт работы и проекты

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Важность очистки данных: фундамент качественной аналитики

Очистка данных (Data Cleaning) — это один из самых критичных и трудозатратных этапов аналитического проекта. Её значение часто недооценивают, хотя она определяет качество всех последующих выводов. Я посвящаю 30-40% своего времени именно этому процессу.

Определение

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

Классический парадокс данных:

80% времени аналитика: Очистка и подготовка данных
20% времени аналитика: Реальный анализ и моделирование

Почему очистка данных критична?

1. "Garbage In, Garbage Out" (GIGO) принцип

Если на входе грязные данные:

Грязные входные данные
          ↓
Любой анализ (правильный или нет)
          ↓
Грязные результаты и выводы

Пример:

Данные о доходах: [10000, 5000, 999999, 7500, -1000, NULL, 12000]

Без очистки:
- Средний доход = (10000+5000+999999+7500-1000+12000)/6 ≈ 170416
- Это очень неправдоподобно!

Сле очистки (удаление аномалий):
- Средний доход = (10000+5000+7500+12000)/4 = 8625
- Это реалистичное значение

2. Неправильные решения на основе неправильных данных

Если данные грязные, то и бизнес-решения будут неправильными:

Грязные данные о customer churn
            ↓
Неправильный прогноз (слишком высокий или низкий)
            ↓
Плохо распределены ресурсы на retention
            ↓
Реальный churn больше/меньше планов
            ↓
Бизнес-убытки

3. Статистическая валидность

Данные должны отвечать предположениям статистических тестов:

Если данные грязные:
- Нарушается нормальность распределения
- Растёт дисперсия
- t-тесты теряют статистическую мощь
- A/B тесты требуют в 2-3x больше трафика

Итог: Статистически значимые результаты становятся менее надёжными

Типы проблем с данными

1. Пропущенные значения (Missing Data)

-- Найти пропуски
SELECT 
    COUNT(*) as total_rows,
    SUM(CASE WHEN user_id IS NULL THEN 1 ELSE 0 END) as missing_user_id,
    SUM(CASE WHEN email IS NULL THEN 1 ELSE 0 END) as missing_email,
    SUM(CASE WHEN signup_date IS NULL THEN 1 ELSE 0 END) as missing_date
FROM users;

Варианты решения:

  • Удалить строки с пропусками (если < 5%)
  • Заполнить средним/медианой
  • Заполнить последним известным значением
  • Использовать KNN imputation

2. Дублирующиеся записи (Duplicates)

-- Найти дубликаты
SELECT 
    user_id, 
    COUNT(*) as count
FROM users
GROUP BY user_id
HAVING COUNT(*) > 1;

-- Удалить дубликаты (оставить первый)
DELETE FROM users
WHERE id NOT IN (
    SELECT MIN(id) FROM users GROUP BY user_id
);

3. Выбросы (Outliers)

import numpy as np
from scipy import stats

# Метод z-score
z_scores = np.abs(stats.zscore(data['revenue']))
outliers = data[z_scores > 3]  # Стандартно: |z| > 3

print(f'Найдено выбросов: {len(outliers)}')

# Метод IQR
Q1 = data['revenue'].quantile(0.25)
Q3 = data['revenue'].quantile(0.75)
IQR = Q3 - Q1

outliers_iqr = data[(data['revenue'] < Q1 - 1.5*IQR) | 
                     (data['revenue'] > Q3 + 1.5*IQR)]

4. Неправильные типы данных

# Проблема: дата загруженка как строка
data['signup_date'] = pd.to_datetime(data['signup_date'])  # Исправить

# Проблема: число загруженно как строка
data['revenue'] = pd.to_numeric(data['revenue'], errors='coerce')

5. Несоответствия и логические ошибки

# Неправильно: дата выхода раньше даты входа
data[data['logout_date'] < data['login_date']]

# Неправильно: возраст < 0 или > 150
data[(data['age'] < 0) | (data['age'] > 150)]

# Неправильно: процент > 100%
data[data['conversion_rate'] > 100]

Практический процесс очистки

Шаг 1: Исследование качества данных

import pandas as pd

df = pd.read_csv('raw_data.csv')

# Базовая информация
print(df.info())           # Типы данных, пропуски
print(df.describe())       # Статистика
print(df.isnull().sum())   # Количество пропусков по колонкам
print(df.duplicated().sum()) # Количество дубликатов

Шаг 2: Обработка пропусков

# Стратегия зависит от колонки
df['age'].fillna(df['age'].median(), inplace=True)  # Числовые: медиана
df['category'].fillna('Unknown', inplace=True)       # Категориальные: Unknown
df = df.dropna(subset=['email'])  # Критичные: удалить

Шаг 3: Удаление/исправление дубликатов

# Удалить полные дубликаты
df = df.drop_duplicates()

# Удалить дубликаты по ключевым колонкам
df = df.drop_duplicates(subset=['user_id', 'event_date'])

Шаг 4: Работа с выбросами

# Вариант 1: Удалить
Q1 = df['revenue'].quantile(0.25)
Q3 = df['revenue'].quantile(0.75)
IQR = Q3 - Q1
df_clean = df[(df['revenue'] >= Q1 - 1.5*IQR) & 
              (df['revenue'] <= Q3 + 1.5*IQR)]

# Вариант 2: Заменить на медиану
df['revenue'] = df['revenue'].clip(lower=df['revenue'].quantile(0.05),
                                    upper=df['revenue'].quantile(0.95))

Шаг 5: Стандартизация и валидация

# Правильные типы данных
df['signup_date'] = pd.to_datetime(df['signup_date'])
df['revenue'] = df['revenue'].astype(float)

# Валидация бизнес-логики
df = df[df['revenue'] >= 0]  # Отрицательные доходы невозможны
df = df[df['age'] > 0]       # Возраст должен быть > 0

Реальный примеры проблем

Пример 1: Неправильная агрегация

-- ДО очистки
SELECT user_id, COUNT(*) FROM events GROUP BY user_id
-- Результат содержит дубликаты event_id

-- ПОСЛЕ очистки
SELECT user_id, COUNT(DISTINCT event_id) FROM events GROUP BY user_id
-- Правильный результат

Пример 2: Ошибки в интеграции

Проблема: Данные из CRM дублируются в аналитической БД
Причина: Неправильная логика синхронизации (DELETE не сработал)
Решение: Очистка дубликатов + исправление ETL pipeline

Пример 3: Несоответствие между системами

Проблема: Суммарная выручка в Analytics ≠ выручке в Billing
Причина: Разные методы расчёта налогов, скидок, возвратов
Решение: Стандартизация определений и очистка

Инструменты для очистки

Python:

  • pandas: dropna(), drop_duplicates(), fillna()
  • scikit-learn: StandardScaler, outlier detection
  • great_expectations: автоматическая валидация данных

SQL:

  • WHERE для фильтрации
  • CASE WHEN для условных исправлений
  • DELETE/UPDATE для массовых изменений

Специализированные инструменты:

  • Trifacta: визуальная очистка
  • Talend: ETL с очисткой
  • OpenRefine: быстрое исправление ошибок

Встроенная очистка в ETL

Лучшая практика: очищать данные в pipeline, а не в анализе

# dbt example (data build tool)
WITH source_data AS (
    SELECT * FROM raw.events
),

cleaned_data AS (
    SELECT 
        event_id,
        user_id,
        event_type,
        CAST(event_timestamp AS TIMESTAMP) as event_time,
        CASE 
            WHEN revenue < 0 THEN 0  -- Исправить отрицательные
            WHEN revenue > 999999 THEN NULL  -- Вероятно ошибка
            ELSE revenue 
        END as revenue
    FROM source_data
    WHERE 
        user_id IS NOT NULL AND  -- Удалить пропуски
        event_type IN ('page_view', 'purchase', 'click')  -- Фильтр
        AND event_timestamp >= '2024-01-01'  -- Диапазон дат
)

SELECT * FROM cleaned_data

Практическое значение

Время на очистку в проекте:

Тип проекта          Доля времени на очистку
═════════════════════════════════════════════
Big Data проект      50-60%
Регулярная отчётность  30-40%
A/B тестирование      20-30%
Быстрый анализ        10-20%

ROI очистки:

Неправильное решение = Убытки * Вероятность

Пример:
- Убытки от неправильного решения = $1,000,000
- Вероятность ошибки из-за грязных данных = 20%
- Ожидаемый убыток = $200,000

Время на очистку = 10 часов
Стоимость часа аналитика = $100
Стоимость очистки = $1,000

ROI = ($200,000 - $1,000) / $1,000 = 199x!!!

Ключевые выводы

Очистка данных критична, потому что:

  1. Качество результатов: Грязные данные → неправильные выводы
  2. Бизнес-решения: На основе неправильных данных принимаются неправильные решения
  3. Статистическая валидность: Влияет на мощь и надёжность тестов
  4. Экономия времени: Правильная очистка сберегает время на анализе
  5. Доверие к данным: Хорошо очищенные данные вызывают доверие у stakeholders

Практический совет: Никогда не переходи к анализу, пока не убедишься что:

  • Нет пропусков (или они обоснованно обработаны)
  • Нет дубликатов
  • Типы данных правильные
  • Логические ошибки исправлены
  • Выбросы проанализированы и обработаны

Это базовая дисциплина, которая отличает профессионального аналитика от любителя.

В чём важность очистки данных? | PrepBro