Предиктивная аналитика на Python: как построить и проверить прогноз

Предиктивная аналитика на Python: как построить и проверить прогноз

Обновлено 2 сентября 2026 года.

Предиктивная аналитика оценивает неизвестный результат по доступным данным. Это может быть числовой прогноз спроса или вероятность оттока клиента. Надёжность определяется проверкой на новых наблюдениях, а не сложностью алгоритма. Случайный лес не всегда точнее регрессии, а нейросеть не является обязательным выбором для большого набора таблиц.

Сначала сформулируйте прогноз

Запишите объект, момент расчёта, горизонт и целевую величину. Например: «каждый понедельник прогнозируем число заказов магазина на следующую неделю». Для оттока уточните, что считается уходом и за какой срок его определяют. Без этого нельзя правильно подготовить выборку или оценить результат.

Признаки должны быть доступны в момент прогноза. Дата оплаты, итоговый статус сделки или фактическая скидка могут содержать информацию из будущего. Высокая точность с такими признаками не воспроизведётся при реальном использовании.

Разделите обучение и оценку

При прогнозировании будущего обучайте модель на более ранних периодах и проверяйте на следующих. Если нужно предсказывать для новых клиентов, учитывайте также разделение по клиентам: случайное перемешивание строк одного человека может дать слишком оптимистичную оценку.

Заполнение пропусков, масштабирование и выбор признаков тоже могут обучаться на данных. Их параметры определяют на обучающей части, затем применяют к проверочной. Эта проблема разобрана в документации scikit-learn об утечке данных. Последний тестовый период сохраните для окончательной оценки, а подбор параметров проводите на предыдущих временных разбиениях.

Пример: линейный тренд против простого прогноза

Ниже — искусственный ряд из 16 недель. Первые 12 используются для обучения, последние четыре — для проверки. Линейная модель обучает свободный член и наклон методом наименьших квадратов. Базовый вариант повторяет последнее известное значение для всех четырёх будущих недель.

Нужны Python и NumPy. Установите библиотеку командой python -m pip install numpy, сохраните код в forecast_demo.py и выполните python forecast_demo.py.

import numpy as np

# Synthetic weekly observations, not a real company's sales.
y = np.array([100, 103, 105, 108, 107, 111, 114, 116,
              117, 122, 120, 125, 127, 130, 128, 134], dtype=float)
week = np.arange(len(y), dtype=float)
split = 12

# Fit intercept and slope using only the first 12 weeks.
x_train = np.column_stack([np.ones(split), week[:split]])
coef, _, _, _ = np.linalg.lstsq(x_train, y[:split], rcond=None)
x_test = np.column_stack([np.ones(len(y) - split), week[split:]])
prediction = x_test @ coef
baseline = np.full(len(y) - split, y[split - 1])

def mae(actual, predicted):
    return float(np.mean(np.abs(actual - predicted)))

print(f"Trend MAE: {mae(y[split:], prediction):.2f}")
print(f"Baseline MAE: {mae(y[split:], baseline):.2f}")

Результат этого примера: Trend MAE: 1.43 и Baseline MAE: 4.75. MAE — средняя абсолютная ошибка в единицах прогнозируемого показателя. Здесь линейный тренд лучше выбранной базы на четырёх учебных наблюдениях. Это не оценка точности для настоящего магазина. Назначение функции расчёта коэффициентов описано в NumPy: linalg.lstsq.

Читай также:  Продуктовые метрики: формулы LTV, CAC, retention, ROMI и NPS

Что проверить на реальных данных

  • Есть ли сезонность, акции, изменение цен и периоды отсутствия товара? Нулевые продажи при пустом складе не равны нулевому спросу.
  • Обгоняет ли модель разумную базу: прошлую неделю, аналогичный день недели или сезонный уровень?
  • Стабилен ли результат на нескольких последовательных периодах и на важных группах объектов?
  • Насколько дороги недопрогноз и перепрогноз? Одинаковый MAE может скрывать разные операционные последствия.
  • Не смешаны ли прогноз для известного объекта и прогноз для нового объекта, о котором нет истории?

Для классификации выбирают другие показатели, например precision и recall при конкретном пороге. Доля правильных ответов может вводить в заблуждение при редком событии: всегда предсказывая «не уйдёт», легко получить высокую долю совпадений и не найти ни одного уходящего клиента.

После запуска

Сохраняйте время прогноза, версию модели, входные признаки и результат. Когда появляется факт, сравнивайте его с прогнозом, рассчитанным заранее. Отдельно контролируйте пропуски и изменение распределения входных данных. На BI-дашборде показывайте фактическое значение, прогноз и ошибку, чтобы пользователь мог оценить границы применимости модели.