Я люблю работать в кофейнях. Я люблю кофе, шум, музыку… быть вместе, но в то же время в одиночестве. Мне больше всего нравится 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, я хотел бы услышать о вашем опыте!