Неофициальный форум пользователей Qlik Sense & Qlikview

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: Marina78 от 29 января 2019, 09:03:03

Название: Выбор новых покупателей с использованием сет анализа
Отправлено: Marina78 от 29 января 2019, 09:03:03
Подскажите, пожалуйста, может кто сталкивался с такой или похожей задачей
Нужно понедельно разложить новых (сделавших хотя б одну покупку в течение последних 4 недель) и потерянных покупателей (не сделавших хотя б одну покупку в течение последних 4 недель).

Добавила календарь в скрипт.
всего покупателей в неделю - count({<dateshift={'now'}>} DISTINCT [Код клиента])
всего покупателей на прошлой неделе count({<dateshift={'Неделя'}>} DISTINCT [Код клиента])

Пыталась через пересечение множеств определить количество новых покупателей на текущей неделе относительно предыдущей count({<dateshift={now}*{Неделя}>} DISTINCT [Код клиента]). Не получается

Название: Re: Выбор новых покупателей с использованием сет анализа
Отправлено: admin от 16 февраля 2019, 09:45:53
Добрый день.
Ваша задача относится к теме сегментации клиентов.

Методологически, как обычно, два варианта - через скрипт и в выражениях объектов визуализации.

Решение через скрипт сводится к построению таблицы с агрегатами. Полями рассчитанными по всему массиву данных по продажам.
Например, min(Дата) - первая покупка, min(Дата,2) - вторая, соответственно с max(). (если надо считать интервалы в первых и крайних продажах, мало ли )))
count() для количества и т.д.
today(1)-max(Дата) = дней с последней продажи, так сказать, на сколько дней "потеряшка".
if(today(1)-max(Дата)>7,'Более 1 недели','Менее 1 недели') As СегментДляПотеряшек
и т.д.

Ключевое поле - ИД Покупателя.

Пример:
t1:
LOAD * INLINE [
    Чек, Покупатель, Товар, Количество, Сумма
    1, А, 100101, 1, 500
    1, А, 100102, 1, 200
    2, Б, 100101, 1, 500
    3, В, 100102, 1, 200
    4, Г, 100101, 1, 500
    4, Г, 100102, 1, 200
    5, Д, 100101, 1, 500
    5, Д, 100102, 1, 200
    5, Д, 100103, 1, 300
    6, А, 100103, 1, 300
    7, Б, 100103, 1, 300
];

CalSegment:
LOAD Покупатель,
Count( DISTINCT Чек) as [Количество Чеков],
Count( DISTINCT Товар) as [Количество SKU]
Resident t1
Group by Покупатель;

[smg id=91 type=preview width=400]
Название: Re: Выбор новых покупателей с использованием сет анализа
Отправлено: admin от 16 февраля 2019, 09:53:33
Через set analyse работа с множествами ведется через выражения P()
Но для расчета числа новых клиентов относительно двух календарных периодов мало информации о факте чека. Покупатель мог прийти повторно, спустя месяц, три полгода, год.
Выражение будет непростым.
Я рекомендую начать с построения контрольного примера через скрипт, сверить результат в Excel и уже затем на этом же контрольном массиве поэтапно формировать нужные выражения.
Такой подход будет эффективным и минимизирует число ошибок .
Название: Re: Выбор новых покупателей с использованием сет анализа
Отправлено: Marina78 от 19 февраля 2019, 03:28:57
Проблема в том, что мне нужно в динамике понедельно и помесячно. Это вообще возможно? и каким путем лучше идти через сет анализ или скрипт?
Название: Re: Выбор новых покупателей с использованием сет анализа
Отправлено: admin от 19 февраля 2019, 05:30:39
То есть вам надо знать состав сегмента на каждую дату, чтобы можно было проследить историю "хождений" клиента по сегменту?
Однозначно скрипт.
Название: Re: Выбор новых покупателей с использованием сет анализа
Отправлено: Marina78 от 05 марта 2019, 04:30:40
temp:
load Date, [Код клиента];//загрузила данные по датам покупок и кодам клиентов

//загрузила календарь
dt_range:
LOAD   
       Min(Date) as MinDate,
       Max(Date) as MaxDate
RESIDENT temp;

LET vMinDate = Num(peek('MinDate', 0, 'dt_range'));
LET vMaxDate = Num(peek('MaxDate', 0, 'dt_range'));


// Формирование последовательности дат в диапазоне
Temp1:
LOAD
       rowno()+$(vMinDate) - 1     as %date
AUTOGENERATE (round(vMaxDate-vMinDate))+356;

// Формирование календаря с иерархией периодов
Календарь:
LOAD        %date as Date,
       Day(%date) as [День],
       Week(%date) as [Неделя],
       WeekName(%date) as [НеделяГод],
       WeekDay(%date) as [День Недели],
       Month(%date) as [Месяц],
       MonthName(%date) as [МесяцГод],
       QuarterName(%date) as [КварталГод],
       Year(%date) as [Год]
Resident Temp1;

client:// нужно посчитать активных клиентов - это клиенты которые покупали товар на текущей и прошлой неделе
load [НеделяГод], [НеделяГод]-1 as O, if(Date>=[НеделяГод] and Date>=O, count(DISTINCT [Код клиента]),0) as act_cl
Resident temp;


Можно ли использовать периоды из календаря в формулах и как возможно посчитать активных клиентов с привязкой к периоду?