подписка
Подписаться
Дмитрий Шевцов
Руководитель отдела электронной коммерции, ООО "Постнофф и Ко"
14:25

Прогнозирование продаж с использованием искусственного интеллекта: опыт селлера с примером кода

Прогнозирование продаж с использованием искусственного интеллекта: опыт селлера с примером кода Фото: Татьяна Т / Фотобанк Лори

Искусственный интеллект стремительно внедряется во все сферы нашей жизни.  Непосредственно в электронной коммерции ИИ открывает широкие возможности для оптимизации бизнес-процессов.

В этой статье хочу рассказать о своем успешном опыте использования искусственного интеллекта для прогнозирования продаж.

Многие современные пользователи, услышав об искусственном интеллекте, в первую очередь представляют себе языковые модели вроде ChatGPT, YandexGPT или Gigachat. Однако эта технология гораздо глубже и разнообразнее, чем кажется на первый взгляд, и открывает перед нами поистине безграничные возможности.

Маркетплейсы уже активно применяют ИИ в своих сервисах:

  • OZON предлагает создавать видеообложки с помощью AI

Screenshot_17

Интерфейс в личном кабинете создания видеообложки для товара при помощи искусственного интеллекта

  • Яндекс Маркет помогает с автоматическим описанием товаров при помощи собственной языковой модели YandexGPT

Screenshot_18

Интерфейс создания описания при помощи YandexGPTв кабинете продавца на Яндекс Маркет

  • Wildberries использует поиск по изображениям, а также помогает создать описание к продукции

Screenshot_21

Генерация описания при помощи искусственного интеллекта на Wildberries

Screenshot_25

Кнопка поиска по фото при помощи ИИ на Wildberries

Также ИИ позволяет предлагать покупателям релевантные товары на основе их интересов, что активно используют все вышеперечисленные игроки. Сторонние сервисы предоставляют возможность автоматически отвечать на отзывы, создавая ощущение индивидуального подхода к каждому клиенту.

Как использовать ИИ для прогнозирования продаж

В этой статье при помощи методов машинного обучения рассчитаем прогноз продаж ранее не продававшейся в магазине туши для ресниц. Возьмем информацию с MPstats ближайшего конкурента в аналогичном ценовом сегменте и дополним таблицу индексом популярности запроса с Яндекс Вордстат.

Возникает вопрос: чем данный подход отличается от прогнозов, которые предлагают сервисы вроде MPStats? Главное отличие в том, что мы можем учитывать любые факторы, важные для нашего бизнеса, такие как сезонность, внешние факторы и текущие тренды.

В своей модели я буду учитывать:

  • Сезонность
  • Динамику поисковых запросов
  • Тренды рынка

1. Подготовка к работе

Для построения прогноза мы будем использовать язык программирования Python. Если у вас его еще нет, скачайте версию 3.11 с официального сайта. Также нам понадобится удобная среда разработки. Я предпочитаю PyCharm, которую можно бесплатно скачать и установить с официального сайта.

2. Выбор метода прогнозирования

Существует множество методов прогнозирования временных рядов, но в этой статье мы сосредоточимся на модели ARIMA/SARIMA. Также популярны методы XGBoostLightGBMProphet и CatBoost (разработанный Яндексом). Каждый из них имеет свои преимущества и области применения, но для небольшого объема данных ARIMA наиболее подходящая.

3. Переменные для модели

В нашем прогнозе мы будем использовать следующие переменные:

  • date: дата продажи
  • product_id: идентификатор продукта (название, артикул и т.д.)
  • category: категория товара (например, тушь для ресниц)
  • units_sold: количество проданных SKU (наш главный показатель)
  • price: цена товара на дату продажи
  • rating: средний рейтинг товара по отзывам на момент продажи
  • marketing_campaign: индикатор (0 или 1), показывающий, была ли маркетинговая акция (реклама, скидки, email-рассылка)
  • competitor_price: средняя цена основного конкурента или в категории
  • holiday: праздничный или особый день (например, "NewYearHoliday"), "None" — если праздника нет
  • wordstat: индекс популярности поискового запроса
  • month: месяц
  • day_of_week: день недели

Важно, чтобы данные были сохранены в формате CSV с разделителем-запятой, чтобы обеспечить корректную обработку нейросетью.

Подготовленные данные будут выглядеть следующим образом:

Screenshot_27

4. Лаговые переменные

Дополнительно можно использовать лаговые переменные:

  • units_sold_lag_1units_sold_lag_7units_sold_lag_30: продажи за предыдущие периоды
  • Лаговые признаки для других переменных (например, прошлые значения wordstat)

5. Начало работы в PyCharm

  1. Откройте PyCharm и создайте новый проект
  2. Создайте новый Python-файл

Screenshot_28

6. Установка необходимых библиотек

В терминале, который вызывается внизу Pycharm, установите следующие библиотеки:

  1. pandas для работы с табличными данными: pip install pandas
  2. matplotlib для визуализации данных: pip install matplotlib
  3. numpy для математических операций: pip install numpy
  4. statsmodels для статистического моделирования: pip install statsmodels
  5. pmdarima для автоматического подбора параметров ARIMA: pip install pmdarima

7. Анализ временного ряда, загрузка и подготовка данных

Начнем с анализа временного ряда.

Распишу подробно каждую строку кода:

  • df = pd.read_csv("sales_data_year.csv") # Загрузка данных из CSV-файла. Обратите внимание, что свой файл я назвал sales_data_year.csv. Если у вас будет другой файл, то, пожалуйста, используйте имя вашего файла
  • df['date'] = pd.to_datetime(df['date']) # Преобразование колонки 'date' в формат даты
  • df = df.set_index('date') # Установка 'date' в качестве индекса DataFrame
  • df = df.sort_index() # Сортировка данных по дате
  • series = df['units_sold'] # Извлечение временного ряда (колонка 'units_sold'). После этого запускаем написанный скрипт и смотрим на визуальный результат. Мы видим, что график прочитан и построен:

Screenshot_25

  • series.plot(figsize=(10, 5)) # Построение графика временного ряда
  • plt.title("Продажи за год") # Добавление заголовка
  • plt.show()

Визуализация помогает понять структуру данных: наличие трендов, сезонности или других паттернов.

Далее нам нужно применить дифференцирование.

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

series_diff = series.diff().dropna().diff().dropna()  # Двойное дифференцирование (первая разность дважды)

Далее необходимо провести тест Дики Фуллера на стационарность. Делаем это при помощи следующего кода:

result = adfuller(series)

print("ADF Statistic:", result[0])

print("p-value:", result[1])

Данный тест мы проводим для получения параметра p-value — если p-value< 0.05, ряд считается стационарным (нет тренда), но если выше, что в нашем случае, значит тренд есть, так как много переменных.

Screenshot_26

Теперь необходимо провести корреляцию временного ряда со своими лагами (ACF). Напомню, что лаговые показатели одна из причин выбора метода ARIMA и PACF показывает прямую (частичную) корреляцию, исключая влияние промежуточных лагов.

Эти графики помогают выбрать параметры p и q для ARIMA. Что такое Pи Q, расскажу далее.

Screenshot_27

Следующий код для Автоматического подбора ARIMA (auto_arima):

stepwise_model = auto_arima(series, start_p=1, start_q=1,

max_p=5, max_q=5, m=7,  #m=7 предполагает недельную сезонность

start_P=0, seasonal=False,

d=1, D=0, trace=True,

error_action='ignore',

suppress_warnings=True,

stepwise=True)

print(stepwise_model.summary())

Расшифровка параметров:

  • start_p=1, start_q=1: Начальные значения для параметров p и q.
  • max_p=5, max_q=5: Максимальные значения для p и q.
  • m=7: Указывает на недельную сезонность (если сезонность включена).
  • seasonal=False: Отключена сезонная составляющая (для несезонных рядов).
  • d=1: Порядок интегрирования (первая разность).
  • trace=True: Показывает процесс подбора модели.
  • suppress_warnings=True: Подавляет предупреждения.

В конце выводится лучшая модель ARIMA с оптимальными параметрами (например, ARIMA(0,1,1)). В нашем случае мы получили следующий результат:

Screenshot_26

Теперь построим модель обучения, используя следующий код:

model = ARIMA(series, order=(0, 1, 1))

ARIMA — это функция из библиотеки statsmodels для создания модели ARIMA (Autoregressive Integrated Moving Average).

order=(0, 1, 1) — это кортеж, который задает параметры модели ARIMA:

  • p=0: Порядок авторегрессии (AR). Указывает, сколько предыдущих значений используются для предсказания. Здесь p=0, что значит отсутствие AR-компоненты.
  • d=1: Порядок интегрирования. Означает, что применяется первая разность данных для сглаживания тренда и достижения стационарности ряда.
  • q=1: Порядок компоненты скользящего среднего (MA). Модель учитывает одну ошибку предыдущего прогноза.

Таким образом, ARIMA(0,1,1) — это модель, которая работает с первой разностью временного ряда и одной компонентой скользящего среднего.

После этого перейдем к обучению модели:

model_fit = model.fit()

Метод fit() выполняет обучение модели на временном ряде series. На выходе получается объект model_fit, который содержит все параметры модели, ее характеристики и обученные коэффициенты. Во время обучения ARIMA подбирает оптимальные значения для коэффициентов MA(1) и других параметров.

И выведем результат нашей модели:

print(model_fit.summary())

model_fit.summary() выводит подробный отчет о модели.

В отчете содержатся следующие важные данные:

  • Параметры модели (например, MA(1)).
  • Стандартные ошибки параметров.
  • Критерии качества модели: AIC (Akaike Information Criterion), BIC и другие метрики.
  • Логарифм правдоподобия (LogLikelihood).
  • Остатки модели и тесты на автокорреляцию остатков

Теперь приступаем к прогнозированию:

forecast = model_fit.forecast(steps=365)

  • forecast(steps=365) выполняет прогноз на 365 шагов вперед.
  • В случае дневных данных это означает прогноз на 365 дней.
  • Возвращаемый объект forecast — это массив прогнозируемых значений.

Что происходит в целом

1. Создается модель ARIMA с параметрами (0, 1, 1), где:

  • Применяется первая разность для сглаживания тренда (d=1)
  • Используется скользящее среднее первого порядка (q=1)

2. Модель обучается на предоставленных данных (series).

3. Выводится сводка параметров модели, включая метрики качества (AIC, BIC и др.).

4. Модель делает прогноз на 365 шагов вперёд (например, на 1 год).

Таким образом итоговый код обучения модели будет выглядеть:

model = ARIMA(series, order=(0, 1, 1))
model_fit = model.fit()
print(model_fit.summary())
forecast = model_fit.forecast(steps=365)

Построим наш график прогноза и сохраним модель для дальнейшего использования:

plt.figure(figsize=(12, 6))
future_dates = pd.date_range(start='2024-01-01′, periods=365, freq='D')
plt.plot(future_dates, forecast, label='Улучшенный прогноз', color='blue')
plt.legend()
plt.grid()
plt.title("Прогноз с улучшенными параметрами")
plt.show()
model_fit.save("arima_model.pkl")

plt.figure() создает новый график с указанным размером (ширина 12, высота 6).

pd.date_range() генерирует последовательность дат:

  • start='2024-01-01′ — начало прогноза (с 1 января 2024 года).
  • periods=365 — количество шагов (дней), на которые делается прогноз.
  • freq='D' — частота генерации дат (ежедневно).

plt.plot() строит линию прогноза на графике:

  • future_dates — ось X (даты).
  • forecast — ось Y (прогнозируемые значения).
  • label='Улучшенный прогноз' — название линии на графике.
  • color='blue' — цвет линии прогноза.

plt.legend() добавляет легенду на график, чтобы различать разные линии.

plt.grid() включает сетку на графике для лучшей читаемости.

plt.title("Прогноз с улучшенными параметрами") добавляет заголовок к графику.

plt.show() отображает построенный график.

model_fit.save("arima_model.pkl") save() — встроенный метод statsmodels, который позволяет сохранить обученную модель в файл.

"arima_model.pkl" — имя файла, в который сохраняется модель. Расширение .pkl указывает на использование формата pickle для сериализации.

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

Финальный результат по продажам, ради которого мы и проводили всю процедуру:

Screenshot_29

Хочу обратить внимание, что я брал за основу 2023 году для прогнозирования 2024 года. Прогнозирование вышло точным, с незначительными отклонениями в +- 100 единиц товара.

Итоговый код:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from pmdarima import auto_arima
from statsmodels.tsa.arima.model import ARIMA

# Загрузка данных

df = pd.read_csv("sales_data_year.csv")
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
df = df.sort_index()
series = df['units_sold']
series.plot(figsize=(10, 5))
plt.title("Продажи за год")
plt.show()

#Пример дифференцирования

series_diff = series.diff().dropna().diff().dropna()
result = adfuller(series)
print("ADF Statistic:", result[0])
print("p-value:", result[1])
fig, axes = plt.subplots(1, 2, figsize=(16,4))
plot_acf(series_diff.dropna(), ax=axes[0])
plot_pacf(series_diff.dropna(), ax=axes[1])
plt.show()
stepwise_model = auto_arima(series, start_p=1, start_q=1,
max_p=5, max_q=5, m=7, # m=7 если предполагаем недельную сезонность (для ежедневных данных)
start_P=0, seasonal=False,
d=1, D=0, trace=True,
error_action='ignore',
suppress_warnings=True,
stepwise=True)
print(stepwise_model.summary())

# Предположим, ваш временной ряд это "series"

model = ARIMA(series, order=(0, 1, 1))
model_fit = model.fit()
print(model_fit.summary())
forecast = model_fit.forecast(steps=365)

#Построение графика

plt.figure(figsize=(12, 6))
future_dates = pd.date_range(start='2024-01-01′, periods=365, freq='D')
plt.plot(future_dates, forecast, label='Улучшенный прогноз', color='blue')
plt.legend()
plt.grid()
plt.title("Прогноз с улучшенными параметрами")
plt.show()
model_fit.save("arima_model.pkl")

Вы можете скопировать весь итоговый код и вставить в интерфейсе среды разработки, чтобы сразу запустить модель.

Заключение

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

Прокомментировать
Читайте также
30/01/2025
Готовые стратегии продвижения на Wildberries: на что способна новая версия искусственного интеллекта XWAY AI 3.0
Платформа умеет определять, в каком месте, каким пользователям и по каким запросам нужно показать конкретный товар конкретного продавца. Программа выбирает именно ту аудиторию, которая с максимальной вероятностью совершит покупку... Подробнее
24/01/2025
Минпромторг хочет ввести автоматические штрафы для продавцов на базе "Честного знака" 2
Если система получит сигнал, что продавец допускает нарушение при продаже товаров, она автоматически вынесет ему предупреждение, а потом и выпишет штраф. Что может ждать бизнес в этом случае?... Подробнее
21/01/2025
"Авито" научился правильно подбирать конкретному пользователю одежду и обувь. Странно, что такое простое решение не используют другие площадки
Там появилась возможность указать свои размеры одежды и обуви (а в дальнейшем - и другие параметры), необходимые для подбора себе таких вещей. "Авито" запомнит эти данные, и их можно применять в качестве фильтров при каждом поиске таких вещей. Еще можно указать желаемые бренд, цвет и цену... Подробнее
Владимир Кернер
Директор по развитию, ООО " ДРИВИКС"
21/10/2024
Группа компаний AVO.Business инвестировала 30 млн рублей в новый сервис аналитики и управления бизнесом на маркетплейсах Signals - обсуждение 3
Да, я работаю,  почти каждый день смотрю аналитику.  Система таргетов очень прикольная, сразу понятно, что присходит с карточками.  Нравится, что можно смотреть результаты по категории или группе товаров.  Очень детальные выгрузки, особенно динамика. Были раньше расхождения с кабинетом ОЗОн по комиссиям, сейчас вроде допилили, все сходится.  Свернуть
Да, я работаю,  почти каждый день смотрю аналитику.  Система таргетов очень прикольная, сразу понятно, что присходит с карточками.  Нравится, что можно смотреть результаты по категории ил Еще...
Форум Ведение бизнеса Автоматизация
Ярослав Молодчиков
учредитель, Компания ЛарДо
20/08/2024
Форум Ведение бизнеса Автоматизация