В чем разница в подготовке данных для BI-аналитики и для машинного обучения (ML)?

«В чем разница в подготовке данных для BI-аналитики и для машинного обучения (ML)?» — вопрос из категории Аналитика и метрики, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Подготовка данных для BI и ML преследует разные цели, что определяет ключевые различия в подходах.

Подготовка данных для BI (Business Intelligence):

  • Цель: Создание структурированных, агрегированных и «чистых» данных для построения отчетов, дашбордов и оперативного анализа.
  • Фокус:
    1. Агрегация: Данные группируются по бизнес-сущностям и временным периодам (день, неделя, месяц).
    2. Читаемость и производительность: Схема данных должна быть интуитивно понятной для аналитиков. Используются денормализованные витрины для быстрых JOIN.
    3. Консистентность: Жесткий контроль за точностью KPI (например, сумма продаж должна совпадать во всех отчетах).
  • Пример SQL-запроса для BI-витрины:
    -- Витрина ежемесячных продаж по менеджерам
    SELECT
    DATE_TRUNC('month', o.order_date) AS report_month,
    e.manager_name,
    e.department,
    COUNT(DISTINCT o.order_id) AS total_orders,
    SUM(o.amount) AS total_revenue,
    AVG(o.amount) AS avg_order_value
    FROM orders o
    JOIN employees e ON o.manager_id = e.id
    WHERE o.status = 'completed'
    GROUP BY 1, 2, 3
    ORDER BY 1 DESC, 4 DESC;

Подготовка данных для ML (Machine Learning):

  • Цель: Сформировать набор признаков (features), который максимально информативно описывает объект для предсказания целевой переменной (target).
  • Фокус:
    1. Сохранение распределения и вариативности: Важны не только агрегаты, но и распределения, выбросы, временные лаги. Данные часто остаются на уровне отдельных событий.
    2. Избегание data leakage: Критически важно, чтобы в признаки для обучения не попала информация из «будущего». Разделение на train/val/test должно быть временным.
    3. Инжиниринг признаков: Создание новых признаков (например, извлечение дня недели из даты, подсчет количества событий за последние N дней).
  • Пример подготовки данных для ML (прогноз оттока):
    
    # Pandas: Создание признаков на основе истории пользователя
    import pandas as pd
    # Исходные данные на уровне сессий
    sessions_df = pd.read_parquet('user_sessions.parquet')

Агрегация для ML (сохраняем вариативность, создаем много признаков)

user_features = sessions_df.groupby('user_id').agg({ 'session_duration': ['mean', 'std', 'max'], # Статистики по длительности 'page_views': 'sum', 'event_timestamp': ['min', 'max', 'count'] # Первая/последняя активность, частота }).reset_index() userfeatures.columns = [''.join(col).strip() for col in user_features.columns]

Создание целевой переменной: ушел ли пользователь в следующем месяце?

user_features['churn_next_month'] = (user_features['event_timestamp_max'] < churn_threshold_date).astype(int)



**Итоговое сравнение:**
| Аспект | BI-аналитика | Машинное обучение |
| :--- | :--- | :--- |
| **Уровень детализации** | Агрегированный | Детализированный (на уровне события/объекта) |
| **Структура данных** | Широкая, денормализованная таблица | «Длинная» таблица с множеством столбцов-признаков |
| **Ключевая задача** | Корректность и скорость отчетов | Максимальная предсказательная сила модели |
| **Основной риск** | Несогласованность метрик | Data leakage, переобучение на артефактах данных |