воскресенье, 13 июля 2008 г.

Для шарящих в матстатистике :)

Всем привет. У одного эккиба (если интересно - Саша Волков, год выпуска тот же, что и у меня - 1998) возникла интересная статистическая задача. Вот как он ее описывает:

Мне нужно разработать методику расчета списка покупок (shopping list) на неделю вперед основываясь на исторических данных. Дело в том, что крупнейший швейцарский grocery retailer публикует в инете для своих покупателей (под логином и паролем) информацию об их покупках. Вот мне и не дает покоя идея создания web-service, который будет автоматически генерировать индивидуальный shopping list основываясь на этих данных :). Для примера прикладываю массив данных наших собственных покупок за последние 2,5 года. (Кому интересно - вышлю отдельно)

Исходные данные
В приложении Excel файл с двумя взаимосвязанными табличками:
HEAD – содержит следующие поля:
TRNS – номер трансакции (кассового чека)
SITE – место покупки, на данном этапе можно игнорировать
CUST – номер клиентской карточки, он везде один, т.к. данные это только наши с Мариной, пока можно игнорировать
RWRD – бонусные очки, пока можно игнорировать
BNUS – специальные бонусные очки, пока можно игнорировать
DATE – дата и время покупки
TOTL – общая сумма покупки, пока можно игнорировать
ITEM – содержит:
ITEM – номер позиции в счете, пока можно игнорировать
TRNS – номертрансакции (кассового чека), связующее поле для таблицы HEAD
ATCL – описание товара
AMNT – количество товара
REBT – скидка на позицию, пока можно игнорировать
PRIC – стоимость позиции, пока можно игнорировать

В итоге, для начала достаточно сконцентрироваться на полях:
TRNS
DATE
ATCL
AMNT

Задача

На основе этих полей нужно составить рекомендуемый список покупок на следующую неделю. При этом простого прогноза, например расчитанного по методу наименьших квадратов, будет недостаточно, потому что данные нельзя считать полными (например, были периоды когда мы уезжали из Швейцарии и за покупками, естественно, не ходили), кроме того, имеется ряд ограничений. Таким образом, нужно учитывать как минимум еще следующие дополнительные требования:
- прогноз должен быть откорректирован на неравномерность и неполноту данных;
- учитывать сезонность (например, вишни обычно покупаются только в течение мая-июля);
- учитывать покупки ближайших прошлых недель (например, если на прошлой неделе было уже приобретено аномально много какого-то товара, таким образом покупать его и на этой неделе нет смысла);
- учитывать единицы продаж (упаковки или на вес)

Методика расчета должна быть прилагаема к большим массивам, содержащим данные большого количества покупателей. Она должна сключать описание вспомогательных таблиц в банке данных.

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



Оставляйте свои предложения прямо здесь, заинтересованным лицам я дам контакты Саши, они будут уже списываться с ним напрямую.

Спасибо за внимание.

2 комментария:

xeops комментирует...

Собственно, поставить правильно задачу - это уже 50% её решения. Задача поставлена правильно, поэтому каких-то сложностей я не вижу. В основном, техническая работа.

По каждой товарной позиции прогноз нужно считать отдельно. "Вес" предыдущей недели в прогнозе должен быть выше, чем у позапрошлой и т.д..

Товарные остатки в холодильнике я бы учитывать не стал, т.к. если было куплено нетипично много, то велика вероятность, что так было надо (покупали много маргарина, т.к. два дня рождения и надо было делать торты). Если нетипично мало - значит, товар "надоел".

Единицы продаж "подгоняются" после того, как рассчитан прогноз по товарной позиции.

Нетривиально будет учитывать разве что сезонность, если нет данных о сезонности в самой информации о товаре.

xeops комментирует...

Логическую схему начертить можно за день. Запрограммировать - дня 2. Оттестировать и исправлять баги можно бесконечно, лишь бы коэффициенты и формулы были выведены в конфиг :-)

Взяться не возьмусь, а советы давать - пожалуйста!