Урок 1: Что такое Анализ Множеств (Set Analysis)?


Пара слов о Qlik Set Analysis

Для начала некоторая вводная:

Представьте себе модель данных Qlik Sense – ассоциативная модель, которая реагирует на выборки в фильтрах. SUM(Продажи) – выражение, для расчета суммы всех продаж по текущей активной части модели. Т.е. если, например, в модели текущая выборка пустая, то выражение SUM(Продажи) рассчитается для всей модели. Т.е. сумма продаж за все года, по всем регионам, по всем каналам продаж, по всем филиалам и т.д.

Если в фильтре региона выбрать “Ярославль”, то выражение SUM(Продажи) отобразит продажи только по Ярославлю, но по всем остальным измерениям.
А как написать выражение SUM(), которое вернуло бы всегда продажи по Ярославлю за второй квартал 2017 года по магазинам 50384, 50382 и 38271?
Или сложнее ситуация, написать выражение для определения роста продаж в процентах за текущий год по отношению к аналогичному периоду предыдущего года по всем покупателям, которые делали покупки в прошлом году. При этом продажи нужны только по Ярославлю и Владимиру.

Конечно же можно с помощью фильтров определить сумму продаж, но сколько действий придется осуществить? Есть более простое решение – написать внутри SUM() выражение Set Analysis, которое отфильтрует модель и подаст на вход функции нужные фильтры.

Итак, переходим к определению, что же такое Set Analysis в Qlik Sense?

Set Analysis (Анализ множеств) – это:

  1. специальное выражение, которое прописывается внутри агригирующей функции внутри Expression (визуальной части приложения Qlik Sense). С помощью Set Analysis можно рассчитать различные показатели, сделать калькулятор Like-For-Like, провести сравнительный анализ по регионам, по периодам, по каналам продаж.
  2. Set Analysis – одна из важнейших фишек QlikView и Qlik Sense. С помощью Set Analysis пользователь/разработчик сообщает Qlik Sense какой набор записей должен быть выбран для вычисления выражения, что аналогично выбору на панели Filter или активных объектов. При этом в приоритете для Qlik Sense являются фильтры, указанные в Set Analysis. Т.е. если в модели будет выбран 2017 год, а в Set Analysis задан 2018 год, то выражение будет рассчитано по 2018 году.
  3. Set Analysis задает контекст в выражении, в разрезе которого мы производятся расчеты. Set Analysis очень удобен для выполнения сравнений данных. Например, сравнение продуктов, пользующихся наибольшим спросом с продуктами, пользующимися наименьшим спросом, или сравнение показателей этого года с показателями прошлого года.

Введение в синтаксис Set Analysis

Введение в синтаксис Set Analysis

Введение в синтаксис Set Analysis

Введение в синтаксис Set Analysis

Введение в синтаксис Set Analysis

Введение в синтаксис Set Analysis

Краткий Tutorial на английском по Set Analysis

Данные для вводной лекции “Set Analysis в Qlik Sense”

Демо-пример (данные в Excel) – продажи по контрагентам в разрезе подразделений, менеджеров, номенклатуры. Транзакции сгруппированы по датам.
Данные для вводной лекции "Set Analysis в Qlik Sense"

Скачать файл Excel с примерами продаж, себестоимостью продаж и валовой прибылью в формате xlsx для построения примеров SET ANALYSIS в Qlik Sense

Скачать (XLSX, 158KB)

Скрипт загрузки данных в Qlik Sense

Для загрузки данных в Qlik Sense (не буду вдаваться в подробности каждой функции):

1. Создаем новое приложение Qlik Sense (у меня стоит версия September 2018):

Создаем новое приложение Qlik Sense (у меня стоит версия September 2018)

2. Выбираем файл Excel с данными:

Выбираем файл Excel с данными

3. Открывается предпросмотр данных. Нажимаем кнопку (снизу справа) добавить данные:

4. После загрузки новая функция Qlik Cognitive Engine предлагает выбрать метрики или измерения и система предложит ту или иную визуализацию. Причем, если переключиться несколько раз между различными метриками и измерениями, визуализация будет усложняться. Подробнее о механиках Qlik Cognitive Engine будет написан материал позднее. Подписывайтесь на обновления в блоге  😉

После загрузки новая функция Qlik Cognitive Engine предлагает выбрать метрики или измерения и система предложит ту или иную визуализацию

Интеллектуальный подбор чартов (метрик и измерений). Обычно хорошо работает с простейшими метриками.

После загрузки новая функция Qlik Cognitive Engine предлагает выбрать метрики или измерения и система предложит ту или иную визуализацию

5. Итоговый код загрузки данных, который генерируется автоматически
Что еще удивляет в Qlik Sense – так это автоматически сгенерированный скрипт загрузки данных. Из простого файла делается какой-то монстр!  😀

Set dataManagerTables = '','Data';
//This block renames script tables from non generated section which conflict with the names of managed tables

For each name in $(dataManagerTables) 
    Let index = 0;
    Let currentName = name; 
    Let tableNumber = TableNumber(name); 
    Let matches = 0; 
    Do while not IsNull(tableNumber) or (index > 0 and matches > 0)
        index = index + 1; 
        currentName = name & '-' & index; 
        tableNumber = TableNumber(currentName) 
        matches = Match('$(currentName)', $(dataManagerTables));
    Loop 
    If index > 0 then 
            Rename Table '$(name)' to '$(currentName)'; 
    EndIf; 
Next; 
Set dataManagerTables = ;


Unqualify *;

[Data]:
LOAD
  [Дата],
  [Подразделение],
  [Контрагент],
  [Менеджер],
  [Номенклатура],
  [Продажи],
  [Себестоимость],
  [Валовая прибыль]
 FROM [lib://SET ANALYSIS QS DATA/QlikSense_SampleData_Example_Data_SetAnalysis.xlsx]
(ooxml, embedded labels, table is Data);

[autoCalendar]: 
  DECLARE FIELD DEFINITION Tagged ('$date')
FIELDS
  Dual(Year($1), YearStart($1)) AS [Year] Tagged ('$axis', '$year'),
  Dual('Q'&Num(Ceil(Num(Month($1))/3)),Num(Ceil(NUM(Month($1))/3),00)) AS [Quarter] Tagged ('$quarter', '$cyclic'),
  Dual(Year($1)&'-Q'&Num(Ceil(Num(Month($1))/3)),QuarterStart($1)) AS [YearQuarter] Tagged ('$yearquarter', '$qualified'),
  Dual('Q'&Num(Ceil(Num(Month($1))/3)),QuarterStart($1)) AS [_YearQuarter] Tagged ('$yearquarter', '$hidden', '$simplified'),
  Month($1) AS [Month] Tagged ('$month', '$cyclic'),
  Dual(Year($1)&'-'&Month($1), monthstart($1)) AS [YearMonth] Tagged ('$axis', '$yearmonth', '$qualified'),
  Dual(Month($1), monthstart($1)) AS [_YearMonth] Tagged ('$axis', '$yearmonth', '$simplified', '$hidden'),
  Dual('W'&Num(Week($1),00), Num(Week($1),00)) AS [Week] Tagged ('$weeknumber', '$cyclic'),
  Date(Floor($1)) AS [Date] Tagged ('$axis', '$date', '$qualified'),
  Date(Floor($1), 'D') AS [_Date] Tagged ('$axis', '$date', '$hidden', '$simplified'),
  If (DayNumberOfYear($1) <= DayNumberOfYear(Today()), 1, 0) AS [InYTD] ,
  Year(Today())-Year($1) AS [YearsAgo] ,
  If (DayNumberOfQuarter($1) <= DayNumberOfQuarter(Today()),1,0) AS [InQTD] ,
  4*Year(Today())+Ceil(Month(Today())/3)-4*Year($1)-Ceil(Month($1)/3) AS [QuartersAgo] ,
  Ceil(Month(Today())/3)-Ceil(Month($1)/3) AS [QuarterRelNo] ,
  If(Day($1)<=Day(Today()),1,0) AS [InMTD] ,
  12*Year(Today())+Month(Today())-12*Year($1)-Month($1) AS [MonthsAgo] ,
  Month(Today())-Month($1) AS [MonthRelNo] ,
  If(WeekDay($1)<=WeekDay(Today()),1,0) AS [InWTD] ,
  (WeekStart(Today())-WeekStart($1))/7 AS [WeeksAgo] ,
  Week(Today())-Week($1) AS [WeekRelNo] ;

DERIVE FIELDS FROM FIELDS [Дата] USING [autoCalendar] ;

6. Создаем скрипт вручную

Я не советую использовать автоматическую генерацию скрипта загрузки. Лучше потратить немного времени и разобраться в том “как правильно создавать модели данных” и писать код вручную (опять же не нужно писать код совсем вручную, его нужно правильно компоновать только).

Рассмотрим ручное создание кода – для этого необходимо:

  • В пустом приложении создать подключение к папке на диске, назовем его “Set Analysis Data”

  • Нажмем кнопку выбрать данные, выберем файл

  • Вставим скрипт и добавим еще одно условие if(Продажи<0,dual('Возврат',1),dual('Продажа',2)) As [Флаг ПродажаВозврат]

  • Вставим в модель скрипт для календаря

Получим вот такой скрипт загрузки данных:

//MAIN
SET ThousandSep=' ';
SET DecimalSep=',';
SET MoneyThousandSep=' ';
SET MoneyDecimalSep=',';
SET MoneyFormat='# ##0,00 ₽;-# ##0,00 ₽';
SET TimeFormat='h:mm:ss';
SET DateFormat='DD.MM.YYYY';
SET TimestampFormat='DD.MM.YYYY h:mm:ss[.fff]';
SET FirstWeekDay=0;
SET BrokenWeeks=1;
SET ReferenceDay=0;
SET FirstMonthOfYear=1;
SET CollationLocale='ru-RU';
SET CreateSearchIndexOnReload=1;
SET MonthNames='янв;фев;мар;апр;май;июн;июл;авг;сен;окт;ноя;дек';
SET LongMonthNames='январь;февраль;март;апрель;май;июнь;июль;август;сентябрь;октябрь;ноябрь;декабрь';
SET DayNames='пн;вт;ср;чт;пт;сб;вс';
SET LongDayNames='понедельник;вторник;среда;четверг;пятница;суббота;воскресенье';
SET NumericalAbbreviation='3:тыс.;6:млн.;9:млрд.;12:T;15:P;18:E;21:Z;24:Y;-3:m;-6:μ;-9:n;-12:p;-15:f;-18:a;-21:z;-24:y';

//Загрузка данных
[Факты]:
LOAD
    Дата,
    Подразделение,
    Контрагент,
    Менеджер,
    Номенклатура,
    if(Продажи<0,dual('Возврат',1),dual('Продажа',2)) As [Флаг ПродажаВозврат],
    Продажи,
    Себестоимость,
    "Валовая прибыль"
FROM [lib://Set Analysis Data/QlikSense_SampleData_Example_Data_SetAnalysis.xlsx]
(ooxml, embedded labels, table is Data);

//Календарь
// Получаем из поля Дата минимальное и максимальное значения
[TEMP Максимальная Минимальная Дата]:
LOAD
     Min(FieldValue('Дата',RecNo())) 	As [Минимальная Дата],
     Max(FieldValue('Дата',RecNo())) 	As [Максимальная Дата]
AutoGenerate FieldValueCount('Дата');

// Минимальную и максимальную даты помещаем в переменные, 
// для того, чтобы использовать их в условии While
Let пНачалоКалендаря_Число 	  = Num(Peek('Минимальная Дата', 0, 'TEMP Максимальная Минимальная Дата'));
Let пОкончаниеКалендаря_Число = Num(Peek('Максимальная Дата', 0, 'TEMP Максимальная Минимальная Дата'));

// Удаляем временную таблицу
DROP Table [TEMP Максимальная Минимальная Дата];  

// Создаем набор дат в промежутке от минимальной до максимальной даты
[TEMP Набор дат в интервале MinDate - MaxDate]:  
LOAD 
     Date($(пНачалоКалендаря_Число) + IterNo() - 1) as [TEMP Дата]
AutoGenerate 1
While $(пНачалоКалендаря_Число) + IterNo() -1 <= $(пОкончаниеКалендаря_Число);  

// Формируем таблицу с календарем в моделе Qlik Sense
[Простой календарь QS]:  
Load 
     Date([TEMP Дата]) 													As Дата,
     Date([TEMP Дата],'DD MMMM YYYY')									As [Дата длинный месяц],
     Text(Date([TEMP Дата],'WWWW MMM YYYY'))							As [День недели МесяцГод],
     'Кв'& Ceil(Num(Month([TEMP Дата]))/3)								As Квартал,
     'Кв'& Ceil(Num(Month([TEMP Дата]))/3) & '-' & Year([TEMP Дата]) 	As КварталГод,
     Text(Date([TEMP Дата],'YYYY.MM')) 									As [Год Месяц],
     Text(Date([TEMP Дата],'MMM YYYY')) 								As [Месяц Год],
     Year([TEMP Дата]) 													As Год,
     Year([TEMP Дата])&'.'&Week([TEMP Дата])							As [Год Неделя],
     Week([TEMP Дата])													As Неделя,
     Day([TEMP Дата])													As День
Resident [TEMP Набор дат в интервале MinDate - MaxDate];

Drop Table [TEMP Набор дат в интервале MinDate - MaxDate];

После загрузки данных получится такая вот модель:

Скачать модель QVF, которую мы получили в этом уроке и которую будем использовать в дальнейших уроках: Скачать приложение Qlik Sense – Set Analysis – lesson 1.qvf

 

0 комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *