Разработка AI-системы прогнозирования спроса для ресторанов
Управление запасами и персоналом ресторана напрямую зависит от прогноза гостепотока и заказов. Лишние заготовки → списания и убытки. Нехватка персонала → долгое ожидание → негативные отзывы. ML-система прогнозирует покрытие (cover count) и состав заказов с точностью 85-90% для большинства дней.
Задачи прогнозирования
Cover count forecast: Сколько гостей посетит ресторан в каждый временной слот (завтрак/обед/ужин, или каждые 30 минут).
Revenue per cover: Средний чек зависит от: дня недели, сезона, специальных меню, состава аудитории.
Dish demand forecast: Какие блюда и в каком количестве будут заказаны. Основа для mise en place — подготовки ингредиентов.
Staffing requirement: Cover count → количество официантов, поваров, хостес на каждый slot.
Факторы, определяющие спрос
| Фактор | Влияние | Как учесть |
|---|---|---|
| День недели | Пт-Сб в 2-3× выше ср | Dummy variables |
| Праздники | +30-80% в нерабочие | Праздничный calendar |
| Погода | Дождь: -15-25% для веранды | NWP API |
| Специальные меню | Рыбная пятница +20% | Флаги промо |
| Мероприятия | Концерт рядом +40% | Event API |
| Сезон | Лето: веранда +50%, зима -20% | Месяц/сезон |
| Отзывы | Вирусный TikTok → аномальный пик | NLP мониторинг |
Модель прогнозирования
features = {
# Лаги
'covers_lag_7d_same_slot': covers_7d_ago_same_time,
'covers_lag_14d_same_slot': covers_14d_ago_same_time,
# Время
'day_of_week': dow,
'time_slot': slot_30min,
'month': month,
'is_holiday': holiday_flag,
'days_since_holiday': days_to_nearest_holiday,
# Резервации (forward-looking)
'reservations_for_slot': reservations_made_for_this_slot,
'reservations_trend': reservations_vs_7d_ago,
'walk_in_forecast': estimated_walk_in, # covers - reservations
# Внешние
'temperature': temperature,
'rain_probability': precipitation_probability,
'nearby_events_score': event_impact_score,
# Меню
'special_menu_flag': has_special_menu,
'promotional_campaign': active_promo
}
model = lgb.LGBMRegressor(n_estimators=300, learning_rate=0.05)
Прогноз по блюдам
Иерархия: Cover Forecast → Category Mix → Dish Demand
Category Mix:
# Исторически: в обед заказывают 60% основных блюд, 20% закусок, 20% десертов
# В ужин: 50%/25%/25%
# В праздник: +10% к десертам, +5% к алкогольным напиткам
def dish_category_mix(meal_type, day_type):
base_mix = historical_category_mix[(meal_type, day_type)]
return apply_seasonal_adjustment(base_mix, current_season)
Top-N блюд прогноз: Для каждого популярного блюда (топ-40, >80% выручки):
- Доля в своей категории: XGBoost
- Фичи: день недели, сезон, позиция в меню, цена
Long-tail блюда: не прогнозируем индивидуально — групповой прогноз по категории.
Waste Reduction
Лишние заготовки → food waste. ML-система минимизирует:
Safe Order Quantity:
SOQ = quantile(forecast_distribution, p=90) # не медиана, а 90-й процентиль
# Лучше слегка переготовить (можно использовать завтра)
# чем 86'd dish (завершилось блюдо в меню)
Shelf life management:
- Ингредиенты с коротким сроком → в блюда дня, акции
- Pre-emptive 86: при низком прогнозе и малом количестве → убрать из меню заранее
Food waste tracker: IoT весы на мусоре → обратная связь: если постоянно выбрасываем конкретный ингредиент → снизить заказ.
Staffing Optimization
def staff_needed(covers_forecast, slot_minutes=30):
"""
Covers → официанты через labor productivity norm
"""
tables_needed = covers_forecast / avg_covers_per_table
servers_needed = ceil(tables_needed / covers_per_server)
# Кухня: covers × avg_dish_per_cover / production_capacity_per_cook
kitchen_needed = ceil(covers_forecast * avg_dishes / cook_hourly_capacity)
return {
'servers': servers_needed,
'kitchen': kitchen_needed,
'host': 1 if covers_forecast > 20 else 0
}
Интеграция с системой расписания: R&D Rotamaster, BambooHR, или Jowi — API для формирования смен на основе staffing forecast.
POS-интеграция
- iiko, r_keeper, Tillypad: российские POS — API или SQL для исторических данных и обращений
- Square, Toast, Lightspeed: западные POS — REST API
- Reservation systems: Ресторанные возможности яндекс/2гис, OpenTable, Resy — API для reservations
Pipeline:
- Ежедневно 07:00: импорт вчерашних данных из POS
- Пересчёт прогноза на 14 дней вперёд
- Уведомление шеф-повара: mise en place plan на завтра
- Уведомление управляющего: staffing plan на 3 дня
Метрики:
- Cover count MAPE: < 10% для следующего дня
- Dish demand MAPE: < 15% для топ-10 блюд
- Food waste reduction: 15-30%
- Labor cost savings: 5-10% на оптимизации расписания
Сроки: базовая cover forecast + staffing — 4-5 недель. Полноценная система с dish-level прогнозом, waste tracker и POS-интеграцией — 3-4 месяца.







