
Автоматичне порівняння з попереднім періодом в Power BI
… але почну я з Looker Studio (LS)
Тому що в прадавні часи, коли я тільки починала знайомство з Power BI (PBI), будучи знайомою з, на той момент ще, Data Studio, мені дуже не вистачало знання того, як таке порівняння можна реалізувати в РВІ. Саме такий розрахунок ми й реалізуємо в цій статті.

Якщо заглиблюватись, то можна знайти аргументи проти такого порівняння й що краще задавати кастомний попередній період, враховуючи, наприклад, свята, період акцій тощо, але цей спосіб теж має свої плюси й може бути корисним залежно від питань, на які має відповідати дашборд:
- цей спосіб швидко показує загальну картину – вам треба вибрати період один раз, і ви одразу бачите різницю з таким же за кількістю днів попереднім періодом, тобто ви бачите загальну тенденцію всього за пару секунд.
- якщо ви оберете період, кратний тижням (7, 14, 28 днів, наприклад), то порівняння залежно від коливань будні/вихідні буде коректним, оскільки попередній період буде включати ту ж кількість будніх та вихідних.
Ось так дані будуть виглядати в Power BI, якщо реалізувати принцип автопорівняння. Доволі схоже на перший скрін, чи не так :)

Отже, на сьогодні план у нас такий:
Модель даних
Тепер давайте послідовно розглянемо як це реалізувати. Щоб не розпиляти увагу, виведемо дуже просту таблицю з:
- датою сесії;
user_pseudo_id(ідентифікатор користувача, який автоматично призначається Гугл Аналітикою кожному девайсу);session_id(поєднанняuser_pseudo_idта параметраga_session_id);- джерелом і каналом трафіку;

Також в моїй невеличкій моделі даних є ще довідник дат, т.я. це – must-have, особливо для розрахунків, які пов'язані з часом. І ці 2 таблиці поєднані за полем дати.

Пишемо міри для розрахунків
Спочатку, як і в LS, нам треба написати формулу розрахунку потрібного показника. У мене це будуть юзери, і формула тут така ж, як в LS - кількість унікальних user_pseudo_id.
Users = DISTINCTCOUNT(ga_sessions[user_pseudo_id])Тепер рахуємо кількість користувачів за попередній період. Для цього нам потрібно задати в мірі PBI період, за який треба порахувати користувачів.
Users Prev =
VAR maxDate = MAX(DimDate[Date]) // остання дата в обраному періоді
VAR minDate = MIN(DimDate[Date]) // перша дата в обраному періоді
VAR delta = DATEDIFF(minDate, maxDate, day) // кількість днів між першою і останньою датою
VAR prevMax = minDate - 1 // кінцева дата попереднього періоду
VAR prevMin = prevMax - delta // початкова дата попереднього періоду
VAR prevValue =
CALCULATE(
[Users], // міра, яка рахує потрібне значення
DATESBETWEEN(DimDate[Date], prevMin, prevMax) // дати попереднього періоду, для якого треба порахувати значення
)
RETURN prevValueРозберемо міру покроково:
- В змінну
maxDateми зберігаємо останню дату, обрану у фільтрі. В нашому випадку – 30 червня. - В змінну
minDateми зберігаємо першу дату, обрану у фільтрі. В нашому випадку – 1 червня. - В змінній
deltaз допомогою функції DATEDIFF ми рахуємо кількість днів (3й аргумент - day) між 1 червня (minDate) і 30 червня (maxDate) і отримуємо значення 29. - Змінна
prevMaxрозраховує кінець попереднього періоду, віднімаючи від 1 червня (minDate) один день – тобто будемо рахувати юзерів по 31 травня. - Змінна
prevMinрозраховує початок попереднього періоду, віднімаючи від 31 травня (prevMax)29 (значення змінноїdelta) – тобто будемо рахувати юзерів з 2 травня. - Остання змінна
prevValueвикористовує функцію CALCULATE, в яку першим аргументом ми додаємо міру створену на попередньому кроці (унікальна кількість юзерів). В другому аргументі ми використовуємо функцію DATESBETWEEN, яка повертає список дат з довідника DimDate в діапазоні між 2 травня (prevMin) та 31 травня (prevMax), тим самим задаючи формулі конкретний часовий проміжок, за який треба взяти юзерів та порахувати їхню унікальну кількість.
Вітаю! Ви прочитали найскладніше, що є в цій статті :)
Дельта користувачів рахується вже дуже просто: в чисельнику ми рахуємо різницю між кількістю юзерів за поточний та попередній період ([Users] - [Users Prev]) та ділимо це на кількість юзерів за попередній період ([Users Prev]).
Users Δ = DIVIDE([Users] - [Users Prev], [Users Prev])Після того, як ми написали міру, обираємо тип Відсоток та кількість знаків після коми = 1.

Форматуємо значення по умовах
Додаємо цю міру в таблицю з кількістю юзерів ([Users]) і параметром source_medium. А для картки я використаю віжуал під назвою “Card (new)”. Додаю в значення створену міру [Users], а для відображення дельти робимо наступне: переходимо на вкладку Format visual -> розкриваємо пункт Reference labels -> обираємо зі списку додану міру [Users] -> для неї додаємо в label міру [Users Δ] -> нижче вибираємо доданий label з попереднього кроку.

Далі відкриваємо налаштування значення лейбла (Value) -> натискаємо на значок fx в пункті кольору (Color).

Тепер задаємо умови: якщо дельта більша за 0 - відображати значення зеленим кольором, якщо менша - червоним.

І отримуємо фінальний вигляд:

… але чогось не вистачає…
Додаємо іконки
Щоб їх додати натискаємо меню біля міри з дельтою -> Conditional formatting (Умовне форматування) -> Icons.

Відкривається вже знайоме нам вікно, де обираємо такі налаштування:

В цих налаштуваннях є одна особливість – друга умова. Я не виводжу стрілку, якщо дельта знаходиться в проміжку між -15% та +15%. Це зменшує кількість шуму у віжуалі, оскільки не привертає увагу до незначних коливань. Умови ви, звісно, задаєте самі в залежності від своїх потреб.
Натискаємо ОК і отримуємо такий результат – таблиця привертає нашу увагу тільки до того, що її вартує, а не до всього підряд, як в LS:

Змінюємо колір показника
Якщо вам не подобаються іконки, ви, наприклад, можете вибрати Font color в меню умовного форматування, та прописати умови для кольору значення дельти:

Результат тоді буде таким:

Виводимо додаткові дані
Мені інколи здається, що Power BI має невичерпні можливості для роботи з даними, головне – бажання в них розібратися. Наприклад, LS, наче як, може відображувати або абсолютне значення дельти, або відсоткове.
Я – не гуру LS, тому напишіть нижче в коментарях, якщо LS може показати одночасно обидва значення. В PBI точно немає таких обмежень – виводьте все, що вам треба, в тому вигляді, який потрібен.
Давайте ж покажемо на картці спочатку абсолютну кількість юзерів за попередній період. При цьому задамо кастомну лаконічну назву цьому показнику.
Для цього створюємо нову міру:
Users Prev Viz = "prev " & FORMAT([Users Prev], "#,#")Функція FORMAT може змінювати формат відображення значень. У мене – “#, #” – так відображається ціле число з розділенням тисяч комою. Детальніше про формати – в цьому відео і в цьому.
І використовуємо міру у віжуалі як лейбл, відключивши заголовок:
- Переходимо на вкладку форматування віжуалу;
- Відкриваємо пункт Reference labels;
- Додаємо основну міру Users;
- Додаємо лейбл – міру створену на попередньому кроці – Users Prev Viz;
- Обираємо лейбл зі списку;
- Вимикаємо заголовок, бо ми вже в мірі прописали що хочемо бачити;

Дельту (Users Δ) додаємо в пункті нижче – Detail.

А для font color задаємо вже знайомі нам умови:

Додаємо зображення на картку
Звісно вже виглядає набагато краще за попередній варіант, але можна зробити ще краще. Давайте так і вчинимо
- Міру [Users Prev Viz] трохи змінюємо на:
Users Prev Viz = "prev⠀" & FORMAT([Users Prev], "#,#") & REPT("⠀", 10)- Тут у "prev⠀" вже не пробіл, а невидимий символ, який можна взяти за цим посиланням.
- В частині & REPT("⠀", 10) теж він, доданий у функцію REPT, яка повторює значення з першого аргумента стільки разів, скільки задано у другому (10).
За рахунок цього, значення “prev 21,297” буде завжди у вигляді одного рядка при зміні ширини віжуала.
2. Міру дельти ми теж модифікуємо вже знайомими вам функціями:
Users Δ = REPT("⠀", 4) & FORMAT([Users Δ], "+0.0%;-0.0%;0%")- REPT("⠀", 4) тут використовується для того, щоб змістити значення вправо і розташувати його одразу під абсолютним значенням.
- Оскільки формат всієї міри тут може бути тільки Text, ми використовуємо FORMAT і "+0.0%;-0.0%;0%", що задає правило форматування дельти: відображати її у відсотках з 1 символом після коми, при цьому якщо значення більше 0, додавати “+”, якщо менше - “-”, або залишити 0%.3.
- А ще ми можемо додати картинку для візуалізації значення в пункт Image. Оскільки я рахую юзерів, я знайшла та завантажила на свій ноут векторну іконку, звичну для такої метрики. Брала звідси, але подібних сервісів – необмежена кількість.
В налаштуваннях:
- Обираємо збережену картинку;
- Розміщуємо її зліва та посередині від показника;
- Даємо 9 пікселів “повітря” між картинкою та показником;
- Задаємо розмір картинки в 40 пікселів;

Фінальний результат
В результаті маємо такий вигляд. Праворуч – порівняння з Looker Studio.
Як на мене, в Power BI ми досягли кращого результату – показали більше даних, при цьому акцентуємо увагу на тих змінах, які є суттєвими. Це пришвидшує читання даних, оскільки користувач має витрачати час більше на те, щоб реалізувати інсайти, які породжує віжуал, а не на те, щоб його зрозуміти.

Баг або фіча Looker Studio
Замість висновку: помітила таку особливість LS – якщо задати період за червень не обираючи дати, а вибрати last month, LS порівнює з повним травнем, тобто з 1 по 31 травня, що на 1 день більше, ніж у червні…

Я вважаю, що така поведінка не зовсім очевидна, і таке порівняння в більшості випадків не є коректним.
Але це моя думка. Думаєте інакше – поділіться в коментарях.
Та особливо мені цікаво дізнатись у частих користувачів LS – чи можна там зробити такі ж зрозумілі та лаконічні віжуали?

Завантаження коментарів…