Я люблю работать в кофейнях. Я люблю кофе, шум, музыку… быть вместе, но в то же время в одиночестве. Мне больше всего нравится La Monarca в Южной Пасадене.

На протяжении многих лет, когда я ел свою раковину, я задавался вопросом: «Как они решают, сколько их сделать?» Латте — это просто, кафе делают его только на заказ, но выпечку нужно делать заранее, поэтому кто-то должен оценить, сколько нужно сделать, исходя из прошлого спроса. По субботам более загружено, чем по понедельникам, а прохладные туманные дни кажутся более загруженными, чем жаркие, но насколько именно? Я начал везде видеть вопрос:

Откуда компания Von’s узнает, сколько цыплят нужно пожарить?

Откуда Top Pot Donuts узнает, сколько яблочных оладий нужно приготовить?

Откуда Starbucks узнает, сколько куриных оберток с чипотле нужно приготовить?

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

Я построил Concha, чтобы оценить оптимальное производство. Concha является бесплатным продуктом с открытым исходным кодом, и его код можно запускать на любом компьютере (Windows, Mac или Linux). Это ссылка на код Concha на Github вместе с инструкциями по установке. Я надеюсь, что кафе, рестораны и бакалейные лавки смогут использовать его для увеличения прибыли.

Как работает Конча

Почти в каждом кафе, панадерии, ресторане есть «точка продажи» (POS), один из тех планшетов со считывателем кредитных карт, который спрашивает, хотите ли вы получить электронное письмо с квитанцией. Они отслеживают каждую продажу. Concha использует эти записи транзакций в качестве входных данных для обучения модели машинного обучения для каждого продукта в зависимости от дня недели и погоды. (POS не записывает погоду, но Concha пропингует API NOAA и добавит его в историю продаж.) Затем Concha прогнозирует оптимальные объемы производства на следующую неделю, используя модели, построенные с использованием библиотек кода Google TensorFlow/Keras.

Моделирование: Необычный магазин кексов

Давайте смоделируем сделки купли-продажи за шесть месяцев, а затем посмотрим на влияние использования модели Конча, обученной максимизировать прибыль.

# Set up a planner with simulated products.
cupcake = Planner(
    planner_name="fancy_cupcake_1",
    batch_size=1,      
    batch_cost=3.0,  # Each cupcake costs $3 to produce
    unit_sale_price=4.75,    #...and sells for $4.75
    demand_estimation_quantiles=24
)
cupcake.simulate_history(
    num_days=180,
    stockout_prob=0.5,
    demand_mean=20,
    demand_std=2,
    num_products=10
)

В этой симуляции изготовление кексов стоит 3 доллара, а их продажа — 4,75 доллара. Мы создаем 180-дневную историю и предполагаем, что запасы закончились примерно за половину дней (stockout_prob = 0,5). Мы предполагаем, что существует 10 видов кексов, а спрос составляет номинально 20 видов кексов в день на продукт. Спрос определяется случайным образом из косого нормального распределения, которое зависит от дня недели и погоды. Чтобы сделать его интересным, у каждого продукта есть «тип», выбранный случайным образом. У одного типа спрос увеличивается нелинейно с температурой, у другого он уменьшается, а у последнего он достигает пика при 70 и уменьшается на обоих концах.

Давайте сравним два подхода к оценке производства на основе прошлых продаж: максимизация прибыли (модель ProfitMaximizer) и использование среднего значения за будние и выходные дни для будущих выходных и будних дней. (модель «MeanWeekPart»).

cupcake.grid_search(param_grid={"model": ["MeanWeekPart", "ProfitMaximizer"]})

Concha анализирует производительность различных моделей прогнозирования, разбивая историю продаж на фрагменты, используя 4/5 фрагментов для обучения модели прогнозирования, а затем оценивая эффективность прогнозов на последнем фрагменте (5-кратная перекрестная проверка). Мы видим, что модель машинного обучения, максимизирующая прибыль, увеличивает прибыль примерно на 9%. И увеличивает отходы примерно на 1,5 %. Это кажется нелогичным, но модель ProfitMaximizer пытается оптимально зафиксировать потенциальные продажи, сопоставив их с потенциальными потерями, и иногда стоит рискнуть заработать слишком много. Давайте подробнее рассмотрим среднюю дневную прибыль от каждой складки перекрестной проверки:

cupcake.plot_profits()

Вот усредненная гистограмма отходов:

cupcake.plot_wastes()

Давайте проведем парный t-тест, чтобы увидеть, значительна ли разница в прибылях и убытках.

cupcake.compare_grid_results()

Разница в средней прибыли и разница в средних потерях значительны. Поля _bounds показывают 95% доверительные границы для среднего значения разницы между двумя совокупностями.

Симуляторы: Панадерия

panaderia = Planner(
    planner_name="panaderia_1",
    batch_size=10,  # Items are always made in trays of 10
    batch_cost=3.0,
    unit_sale_price=1.0
)
panaderia.simulate_history(
    num_days=180,
    stockout_prob=0.5,
    demand_mean=150,
    demand_std=15,
    num_products=10
)

В этой симуляции у нас есть раковины, которые продаются по 1 доллару, производятся партиями по 10 штук, и производство каждой партии стоит 3 доллара. Прибыль на единицу ниже, но объемы продаж выше. Давайте еще раз сравним модели:

panaderia.grid_search(param_grid={"model": ["MeanWeekPart", "ProfitMaximizer"]})

Вот гистограммы прибыли:

Влияние

Эти данные смоделированы, фактическое влияние использования Concha по сравнению с использованием исторических средних на прибыль невозможно предсказать (но можно измерить). Если бы фактическое влияние было вдвое меньше, чем мы видели в этих симуляциях, это означало бы дополнительные сотни долларов. в месяц за кафе/панадерию/продуктовый магазин.

Если вы пробуете Concha, я хотел бы услышать о вашем опыте!