Розробка AI-системи прогнозування попиту для ресторанів
Управління запасами та персоналом ресторану безпосередньо залежить від прогнозу гостепотоку та замовлень. Зайві заготовки → списання та збитки. Нестача персоналу → довге очікування → негативні відгуки. ML-система прогнозує покриття (cover count) та склад замовлень з точністю 85-90% для більшості днів.
Завдання прогнозування
Прогноз кількості обкладинок: Скільки гостей відвідає ресторан у кожний часовий слот (сніданок/обід/вечеря або кожні 30 хвилин).
Дохід від одного обкладинки: Середній чек залежить від: дня тижня, сезону, спеціальних меню, складу аудиторії.
Прогноз попиту на страви: Які страви та в якій кількості будуть замовлені. Основа для mise en place – підготовки інгредієнтів.
Вимоги до персоналу: Cover count → кількість офіціантів, кухарів, хостес на кожен slot.
Фактори, що визначають попит
| Чинник | Вплив | Як врахувати |
|---|---|---|
| День тижня Пт-Сб в 2-3× вище пор | Dummy variables | |
| Свята | +30-80% у неробочі | Святковий календар |
| Погода | Дощ: -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
Мікс категорій:
# Исторически: в обед заказывают 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 страви: не прогнозуємо індивідуально - груповий прогноз за категорією.
Зменшення відходів
Зайві заготовки → food waste. ML-система мінімізує:
Безпечна кількість замовлення:
SOQ = quantile(forecast_distribution, p=90) # не медиана, а 90-й процентиль
# Лучше слегка переготовить (можно использовать завтра)
# чем 86'd dish (завершилось блюдо в меню)
Управління терміном придатності:
- Інгредієнти з коротким терміном → у страви дня, акції
- Pre-emptive 86: за низького прогнозу та малої кількості → прибрати з меню заздалегідь
Слідник харчових відходів: IoT ваги на смітті → зворотний зв'язок: якщо викидаємо конкретний інгредієнт → знизити замовлення.
Оптимізація персоналу
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
Трубопровід:
- Щодня 07:00: імпорт вчорашніх даних із POS
- Перерахунок прогнозу на 14 днів уперед
- Повідомлення шеф-кухаря: mise en place plan на завтра
- Повідомлення управляючого: staffing plan на 3 дні
Метрики:
- Кількість покриття MAPE: < 10% для наступного дня
- Попит на страву MAPE: < 15% для топ-10 блюд
- Зменшення харчових відходів: 15-30%
- Labor cost savings: 5-10% на оптимізації розкладу
Терміни: базова cover forecast + staffing - 4-5 тижнів. Повноцінна система з dish-level прогнозом, waste tracker та POS-інтеграцією – 3-4 місяці.







