Привет, всем!
Сегодня решил написать несколько соображений на тему разработки модели данных и о том, какой должна быть таблица фактов и измерений для анализа продаж, в чем ее отличие от прочих и поделиться советами по ее оптимизации с учетом моего личного опыта работы. Разбирать будем примеры на основе одной из самых популярных российских учетных систем (1C) и QlikView.
Итак, рассмотрим отдельно объекты модели данных и типы связей между ними.
Поехали!
Что, когда, кому, как и сколько?
По здравому размышлению анализ продаж сводится к определению связи между объектами:
товар — клиент — момент — способ — количество
Таким образом, универсальная таблица фактов продаж содержит упомянутые поля (самый простой способ связи).
Товар (что?)
Все знания, которые касаются товара (номенклатура-характеристика-партия-качество).
Все товарные группировки делаются на этом уровне.
Типичные примеры групп:
- производственные — с конвейера выходят одни и те же конфеты, но поступают в продажу в разной расфасовке (200г, 350г, 12кг) и упаковке (картонная, пластик и т.п.);
- рецептурные — для конфет: шоколадные, глазированные, неглазированные и т.п.;
- транспортные — по требованиям к условиям транспортировки;
- по сроку хранения — долгосрочный и краткосрочный;
- маркетинговые — премиальные, экономичные;
- магловские и обычные.
НА ЗАМЕТКУ! Естественно, услуги и их атрибуты тоже относим к этому объекту.
Клиент (кому?)
Тут все просто: здесь хранится всё, что касается клиента (контрагент-договор-пункт разгрузки).
Пример группировки:
- физики/юрики;
- по географии доставки;
- по размеру клиента — крупный-средний-малый.
НА ЗАМЕТКУ! Я бы зарезервировал возможность, заинтересованным, но не упоминаемым силам, назначать произвольные магические атрибуты: например, наличие маховика времени, обнуляет вероятность повторных закупок.
Момент (когда?)
Здесь фиксируем время и дату сделки в соответствии с политикой учета.
Соображение 1.
Время и дату события в QlikView принято разделять на два поля, чтобы снизить вариативность данных (уменьшить объем, который они занимают и увеличить скорость перебора).
10 лет по 365 дней = 315 млн. секунд или различимых моментов времени. Сравните с 3650 различных дат + 86400 секунд в сутках. 315 и 0.9. Что больше?
Соображение 2.
В большинстве случаев для анализа можно вообще пренебречь секундами и минутами. Графики посещений редко демонстрируются мельче, чем в почасовой нарезке.
Соображение 3.
Есть еще одно соображение: из-за переходов на летнее зимнее время и их отмены следует аккуратно учитывать время в построении отчетов like-4-like. Оно вам надо?
На дату (а иногда и на время) вешается мастер календарь для удобства группировок по месяцам, кварталам и т.п. Еще следует отметить, что в Европе и Америке нумерация недель пару раз в десятилетие может отличаться. В реале в России календарь вообще зависит от того, что напечатает типография. НО действует ГОСТ ИСО 8601-2001.
Способ (как?)
Наверное, самое сложное в описании измерение. Не секрет, что один и тот же товар, один и тот же клиент может купить разными способами: заказать на сайте или по телефону, либо купить в магазине лично, или даже устроить тендер, оплатить наличными (не считая карты), безналичными расчетом и т.п. В нашей типичной информационной системе, это могут быть организация-подразделение-проект-договор. Может быть, понятие канал продаж лучше объясняет это свойство.
Для малого бизнеса этим измерением можно, скорее всего, вообще пренебречь. Вы готовы признать себя малым бизнесом?
Количество (сколько?)
Самое понятное поле, которое напрямую используется в выражениях. Традиционно, в нашей информационной системе это стоимость и её производные: стоимость без скидок, НДС, себестоимости прямая, нормативная, средняя — тут фантазии безграничны. Иногда сюда
добавляют затраты, прямые, транспортные… Особых проблем нет для одновалютной системы. Для мультивалютных систем либо дублируем поля, либо добавляем курсы пересчета.
Другое важное измерение здесь — количество (что бы это не значило). Хороший вопрос руководителю: в чем вы, кроме денег измеряете свой бизнес?
НА ЗАМЕТКУ! Разные субъекты могут использовать разные единицы измерения. Хорошо если это тонны и килограммы. Бывает так, что один цех использует килограммы, другой – штуки, третий – литры. При разработке просто обратите внимание, что Вы идете по одному из путей:
- количество приведено к одной единице (базовой единице отчетов),
- добавлено количество в штуках, в килограммах, в коробах.
Зачем вы спросите вся эта муть? Затем, что при построении практически любого отчета в пределах упомянутой области знаний в QlikView вам достаточно описанных выше понятий.
НА ЗАМЕТКУ! Иногда измерение избыточно, например, канал продаж. Значит, надо завести канал ‘Все’, который отключит детализацию этого измерения. Для времени я использую Век=’C21′, данные прошлого века пришлось использовать всего один раз.
Таким образом, можно построить универсальную таблицу [Детализация], покрывающую на 90% потребности простых пользователей.
Для этого надо создать группы (циклические или дрилл-даун ) 🙂
ГруппировкаТоваров
Товар.Все
Товар.ПроизводственнаяГруппа
…
ГруппировкаКлиентов
Контрагент.Все
Контрагент.Наименование
Контрагент.ГруппаДоставки
…
Календарь
Век
Дата
Год
…
ГруппировкаСпособов (ГруппировкаКаналов)
Все
Организация
Подразделение
…
Аналогом групп для выражений будут KPI: оборот, прибыль, деривативы.
Почему этот подход работает
С одной стороны можно вывести таблицу фактов самого нижнего уровня с детализацией до чека (сделки). С другой стороны, сделав выбор ВинниПух и Все-Все-Все получить агрегированные KPI за отчетный период.
Маловероятно, что производственники (производственная группа), будут интересоваться тем, как делит конфеты отдел маркетинга. Да и отделу маркетинга вряд ли интересна классификация транспортного цеха. Если (о чудо!) они смогут договориться, они (оба из враждебных лагерей) согласуют ТЗ и будет заказан новый отчет.
Как добавить конкретики
Долго и трудно дрессировать смежные отделы, чтобы они, упоминая Василия Пупкина, уточняли, кто он поставщик или покупатель, и который конкретно из десятка заведенных. Нам на помощь приходит условное отображение измерений (Enable Conditionals) и функция GetCurrentField(). Выглядеть это будет примерно так:
If(GetCurrentField(ГруппыКонтрагентов)=’Контрагент.Наименование’,1,0)
то отображать поле Контрагент.Наименование, чего бы это ни значило.
Пусть не смушают вас, сообщения об ошибках синтаксиса (QlikView 11.20SR11) “Error in expression” — это работает. Когда из группы ‘ГруппыКонтрагентов’ будет выбрано ‘Контрагент.Наименование’. Ку два раза желтые штаны. Тогда в принудительном порядке отобразится определенное поле (Я очень надеюсь, что Контрагент.Код, а не Контрагент.Телефон, в крайнем случае, Договор.Номер;)
Выражения
В качестве KPI могут выступать выражения QlikView:
Стоимость | Sum(Стоимость) |
Абстрактная цена за БЕИ | Sum(Стоимость)/Sum(Количество) |
Цена за килограмм | Sum(Стоимость)/Sum(КоличествоВес) |
Маржа | Sum(Стоимость-Себестоимость)/Sum(Стоимость) |
НА ЗАМЕТКУ! Следует обратить внимание на учет НДС. Да простят меня финансисты, иногда в себестоимость некоторые отъявленные управленцы включают НДС. То же касается всех показателей стоимости.
Вывод: минимизируйте неопределенность. Включайте в названия полей: СебестоимостьСНДС, ЗатратыСНДС, как бы оксюморонистично это не звучало. Кому-то это покажется избыточным, но точно сэкономит ваше время, когда вы вернетесь к старому приложению.
О чем это я, Карл? Они намочили порох!
Все вышеизложенное подводит нас к интересной мысли. Есть некий набор групп измерений. В малом бизнесе он немного меньше, для MNC чуть больше. НО! KPI (КПЭ по-нашенскому), для успеха этого самого бизнеса, должны быть определены на любом подмножестве данных. В прикладном смысле, это означает, что если кто-то навязывает вам показатели, не определенные в конкретном разрезе, не стесняйтесь, гоните их мокрой тряпкой. Есть даже магическое слово «обоснуйте». За это я люблю QlikView, прочищает мозги не хуже курса стратегического мышления https://www.coursera.org/learn/competitivestrategy
Альтернатива
Да, QlikView хорош гибким подходом. Можно создать универсальную таблицу отражающую реальность, данную нам в ощущениях. В ней будет много-много измерений и фактиков. Можно даже сделать настройку измерений и выражений. Однако, я сомневаюсь, что из этой таблицы можно будет получить знания (без использования R Project https://www.coursera.org/course/datascitoolbox)
В итоге:
Если за основу мы берем самую распространенную в России информационно-учетную систему 1C, модель данных выглядит примерно так:
Таблица фактов
РегистрНакопления.Продажи
Период->Календарь
Контрагент->Справочники.Контрагенты
Номенклатура->Справочники.Номенклатура
Организация->Справочники.Организация
Подразделение->Справочники.Подразделения
показатели в таблице фактов
Стоимость
Количество
Себестоимость
СтоимостьБезСкидки
НА ЗАМЕТКУ! Обращаю внимание, что ключевые вопросы (что, как, зачем и почему) находятся внутри справочников и, например, на вопрос «Как?» могут отвечать поля Организация.Наименование, Подразделение.Наименование и Контрагент.ОсновнойМенеджерПокупателя, а группировка выполняется между справочниками.
Вот и все на сегодня!
Лицом к лицу, лица не увидать
Большое видится на расстоянии
С.Есенин
Лично я, считаю, имхо, что Zero Hour у Бредбери сильно мощнее и интереснее этого Шепота.
Не могу не согласиться. С другой стороны Горин покруче Киркманов будет. Но кто об этом вспомнит?