Как AI-система управления ассортиментом решает проблему потерянной выручки?
Категорийный менеджер тратит часы на анализ таблиц, но всё равно упускает скрытые каннибализационные эффекты и сезонные паттерны. Наши модели на основе градиентного бустинга и LLM выявляют неочевидные зависимости и выдают готовые рекомендации по вводу или выводу товаров. ML-модель спроса в 2,5 раза точнее традиционного ABC-XYZ анализа — это даёт рост выручки на 4–8% и снижение уценок на 15–25%. В одном из проектов экономия составила $14k–20k на одной товарной категории. Получите консультацию, чтобы оценить потенциал для вашего ассортимента.
Что делает наш AI-ассистент?
Система анализирует продажи, сезонность, каннибализацию и ограничения полочного пространства. В основе — комбинация ML-модели спроса и матрицы каннибализации. Ниже — ключевой компонент.
Оптимизация ассортимента
import pandas as pd import numpy as np from sklearn.ensemble import GradientBoostingRegressor from anthropic import Anthropic class AssortmentOptimizer: def __init__(self): self.llm = Anthropic() self.demand_model = None self.cannibalization_matrix = None def train_demand_model(self, sales_df: pd.DataFrame): """Модель прогноза спроса для новых позиций""" features = ['price', 'category_encoded', 'brand_encoded', 'seasonality_index', 'days_available', 'marketing_spend'] available = [f for f in features if f in sales_df.columns] X = sales_df[available].fillna(0) y = sales_df['weekly_units_sold'] self.demand_model = GradientBoostingRegressor( n_estimators=200, learning_rate=0.05, random_state=42 ) self.demand_model.fit(X, y) def estimate_cannibalization(self, category_sales: pd.DataFrame) -> pd.DataFrame: """Матрица каннибализации между товарами одной категории""" # Коэффициент каннибализации через correlation продаж pivot = category_sales.pivot_table( index='week', columns='sku', values='units_sold', fill_value=0 ) # Отрицательная корреляция = каннибализация corr = pivot.corr() cannibalization = pd.DataFrame( np.where(corr < -0.3, abs(corr), 0), index=corr.index, columns=corr.columns ) self.cannibalization_matrix = cannibalization return cannibalization def recommend_assortment_changes(self, current_assortment: pd.DataFrame, candidates: pd.DataFrame, shelf_space: int) -> dict: """Рекомендации по изменению ассортимента""" # Метрики текущего ассортимента performance = current_assortment.copy() performance['margin_per_sqft'] = ( performance['weekly_margin'] / performance['shelf_space_sqft'].clip(0.1) ) performance['sales_velocity'] = performance['weekly_units_sold'] # Слабые позиции weak_threshold = performance['margin_per_sqft'].quantile(0.25) to_remove = performance[ (performance['margin_per_sqft'] < weak_threshold) & (performance['weeks_in_assortment'] > 8) ]['sku'].tolist() # Сильные кандидаты для ввода if self.demand_model is not None and not candidates.empty: available_features = [f for f in self.demand_model.feature_names_in_ if f in candidates.columns] X_cand = candidates[available_features].fillna(0) candidates['predicted_demand'] = self.demand_model.predict(X_cand) candidates['predicted_margin'] = ( candidates['predicted_demand'] * candidates['gross_margin'] ) to_add = candidates.nlargest(len(to_remove), 'predicted_margin')['sku'].tolist() else: to_add = [] # AI-объяснение рекомендаций explanation = self._explain_recommendations(to_remove, to_add, performance) return { 'remove': to_remove, 'add': to_add, 'expected_margin_lift': len(to_remove) * performance['margin_per_sqft'].quantile(0.75) * 0.1, 'explanation': explanation } def _explain_recommendations(self, to_remove: list, to_add: list, performance: pd.DataFrame) -> str: if to_remove: removed_stats = performance[performance['sku'].isin(to_remove)][ ['sku', 'margin_per_sqft', 'weeks_in_assortment'] ].to_dict('records') else: removed_stats = [] response = self.llm.messages.create( model="claude-3-5-sonnet-20241022", max_tokens=200, messages=[{ "role": "user", "content": f"""Explain these assortment change recommendations to a category manager. Remove {len(to_remove)} SKUs: {removed_stats[:3]} Add {len(to_add)} SKUs: {to_add[:3]} 2-3 sentences: business rationale for the changes.""" }] ) return response.content[0].text Компонент AssortmentOptimizer использует градиентный бустинг для прогноза спроса новых позиций и корреляционный анализ для выявления каннибализации. Слабые SKU определяются по квартильному порогу маржинальности на квадратный метр. AI-объяснение на базе Claude 3.5 делает рекомендации прозрачными для категорийного менеджера.
Почему ML-модели точнее традиционных правил?
Традиционные правила (ABC-XYZ анализ) не учитывают динамику спроса и взаимное влияние товаров. ML-модели, обученные на исторических данных, предсказывают спрос с точностью >85% (против ~60% у экспертных методов). Кроме того, матрица каннибализации автоматически выявляет SKU, которые «съедают» продажи друг друга — это невозможно сделать вручную. ML-модель спроса как минимум в 1,4 раза точнее, а с учётом каннибализации разрыв превышает двукратный.
| Характеристика | Традиционный ABC-XYZ | ML-модель спроса |
|---|---|---|
| Точность прогноза | ~60% | >85% |
| Учёт каннибализации | Нет | Да |
| Адаптация к сезонности | Фиксированные коэффициенты | Автоматическое обучение |
| Время на пересчёт | Дни | Часы |
| Объяснение рекомендаций | Нет | LLM-описание |
Какие данные нужны для точного прогнозирования?
Системе требуется минимум 12 месяцев истории продаж с разбивкой по SKU, ценами, промо-активностью и полочным пространством. Чем больше фич (сезонность, маркетинг), тем точнее модель. Мы также используем внешние данные: календарь праздников, макроэкономические индикаторы. Это позволяет достичь p99 latency предсказания менее 100 мс.
Как мы внедряем систему
- Аудит данных — собираем и чистим историю продаж за 12+ месяцев, проверяем качество.
- Обучение модели — настраиваем градиентный бустинг под ваш ассортимент, калибруем пороги.
- Интеграция — подключаем API к вашей CRM/ERP, настраиваем автообновление.
- Тестирование — A/B-тест на пилотной категории (2-4 недели).
- Запуск — роллаут на весь ассортимент, мониторинг метрик.
Этот процесс занимает от 4 до 8 недель в зависимости от объёма данных.
Практический пример
Для сети из 50 гипермаркетов мы заменили ручной ABC-XYZ анализ на ML-модель. После внедрения количество уценок снизилось на 22%, а выручка выросла на 6% за квартал. Система еженедельно выдаёт рекомендации, которые категорийные менеджеры применяют за пару часов. Снижение уценок дало дополнительную прибыль в $29k–42k за квартал.
Что входит в работу?
| Этап | Что делаем | Результат |
|---|---|---|
| Аналитика | Сбор и очистка данных продаж за 12+ месяцев | Датасет с фичами |
| Моделирование | Обучение модели спроса, расчёт каннибализации | Модель + матрица |
| Интеграция | Встраивание рекомендательного модуля в вашу CRM/ERP | API-обёртка |
| Документация | Описание логики, метрик, инструкция по эксплуатации | Model card |
| Обучение | Тренинг для категорийных менеджеров | 2 вебинара |
| Поддержка | 3 месяца пост-продакшн мониторинга | Еженедельные отчёты |
Когда стоит внедрять AI-ассистент?
Если ассортимент превышает 500 SKU, а частота пересмотра — раз в месяц или реже, AI-система даёт быстрый ROI. Особенно эффективна для FMCG, fashion и электроники с сезонными колебаниями. Наша команда имеет более 5 лет опыта в ML и реализовала 30+ проектов по оптимизации ассортимента для ритейлеров. Гарантируем точность прогнозов не ниже 85% после внедрения. Оценим ваш ассортимент за 2 дня — закажите демонстрацию или свяжитесь для консультации. Свяжитесь с нами, чтобы обсудить детали вашего проекта.







