Автор|Дэвис Чжан Компилировать|ВКонтакте Источник | К науке о данных
Цель этой статьи — проанализировать покупательское поведение клиентов в Power-BI с помощью DAX и получить представление о потенциале продукта.
Несколько лет назад Марко Руссо и Альберто Феррари опубликовали блог под названием «Анализ корзины».
Woohoo Университет Patterns.com/basket-anal…
В этой интересной статье подробно описывается, как использовать DAX для расчета очень полезных показателей, таких как количество заказов и количество клиентов по любой комбинации продуктов. Эту статью можно рассматривать как продолжение «анализа корзины», в котором учитывается хронологический порядок, в котором клиенты покупают разные продукты.
По сравнению с исходным «анализом корзины»
Предполагая, что A и B представляют два разных продукта, тогда «анализ корзины» вычисляет P(AB), в то время как в этой статье вычисляются P(A|B) и P(B|A). Вы можете сравнить два числа ниже:
Диаграмма выше представляет собой показатель «Покупатели обоих продуктов» в анализе корзины, показывающий, что 72 клиента имеют записи о покупках как «флягодержателей», так и «велосипедных стоек».
Однако данные, представленные на диаграмме ниже, учитывают хронологический порядок, в котором покупатели приобретали товары. Вы можете обнаружить, что есть 8 клиентов, которые сначала купили велосипедную раму, а затем бутылку и клетку, и 14 клиентов, которые сначала купили бутылку и клетку, а затем велосипедную раму (Примечание: случай покупки A и B одновременно пока не рассматривается)
Почему этот анализ имеет смысл
Записи о заказах клиентов отражают некоторые очень полезные факты, указывающие направление для корреляции между продуктами. Другими словами, «анализ покупательской корзины» очень полезен при анализе данных супермаркета, потому что покупатели обычно выбирают несколько продуктов во время совершения покупок, а затем идут к кассе, чтобы оформить заказ вместе.
В этом случае все товары считаются заказанными одновременно. Но на самом деле в процессе покупок в супермаркете записи о различных продуктах, выбранных покупателями, невозможно отследить.
Но если это в других случаях, таких как клиенты, размещающие заказы на платформах электронной коммерции или на официальных веб-сайтах, если вы являетесь менеджером магазина, вы можете знать, какие модели A и B являются самыми продаваемыми моделями, какая из них может принести больше постоянных клиентов, какой из них с большей вероятностью потеряет клиентов.
Поэтому нам нужно знать процент выкупа для каждого товара. Например, сколько людей из всех клиентов, которые сначала купили продукт А, вернутся, чтобы купить этот продукт в будущем, и при дальнейшем анализе среди этих людей все еще покупают продукт А или другие продукты? Это вопрос, достойный изучения.
процесс расчета
После процесса расчета мы получим результаты расчета, показанные на следующем рисунке (примечание: я использую тот же набор данных, что и «анализ корзины»):
Как упоминалось ранее, он показывает, какие клиенты купили продукт А первым и совершают последующие покупки, сколько из них купили продукт В или продукт С и т. д.
Итак, чтобы выполнить этот расчет, вот пять шагов:
1. Сначала отсортируем все заказы в таблице продаж, среди всех заказов клиента один или несколько заказов с самой ранней датой заказа классифицируются как первый заказ, а остальные являются «не первыми»:
IsFirstOrder =
VAR
E_Date = 'Sales'[OrderDateKey]
VAR
CUST = 'Sales'[CustomerKey]
RETURN
IF(
SUMX(
FILTER('Sales',
CUST = 'Sales'[CustomerKey]&&
E_Date > 'Sales'[OrderDateKey]),
COUNTROWS('Sales'))>0,FALSE,TRUE)
2. Отфильтруйте данные заказа для всего продукта А в продаже, а затем отфильтруйте еще, какие заказы отмечены как первый заказ клиента. Мы извлекаем список клиентов из этой таблицы фильтров и добавляем к нему фиктивный столбец с именем «ROWS», в результате чего получается фиктивная таблица VT1.
3. Используйте Sales в качестве основной таблицы и используйте NATURALLEFTOUTERJOIN() для связи с виртуальной таблицей "VT1", затем используйте filter() для исключения строк, значение [ROWS] которых не равно 1, остальные данные (VT2 ) - это все клиенты, возвращенные "VT1" из всех заказов. Наконец, данные дополнительно фильтруются для всех заказов, кроме «первого заказа», и результат называется «CustDistinctValue»:
CustDistinctValue =
VAR
FIRSTORDERPROD =
IF(HASONEVALUE('Product'[Subcategory]),
VALUES('Product'[Subcategory]),0)
VAR
VT1 =
SUMMARIZE(
FILTER(Sales,
AND(related('Product'[Subcategory]) = FIRSTORDERPROD,
'Sales'[IsFirstOrder]=TRUE)),
'Sales'[CustomerKey],
"ROWS",
DISTINCTCOUNT(Sales[CustomerKey]))
VAR
VT2 =
FILTER(
NATURALLEFTOUTERJOIN(ALL(Sales),VT1),
[ROWS] = 1)
RETURN
CALCULATE(
DISTINCTCOUNT('Sales'[CustomerKey]),
FILTER(VT2,'Sales'[IsFirstOrder] = FALSE)
)
4. После этого нам нужно убедиться, что эти данные можно фильтровать по товарам (в данном случае мы используем только подкатегории). Здесь в основном тот же расчет, что и в макросе, с использованием таблицы продуктов (Фильтровать продукт) и копии основной таблицы для установления неактивной связи, затем создается мера, чтобы ее контекст игнорировал все поля таблицы продуктов и начинался с копия таблицы продуктов (фильтр продуктов) Примите контекст.
CustPurchaseOthersSubcategoryAfter =
VAR CustPurchaseOthersSubcategoryAfter =
CALCULATE (
'Sales'[CustDistinctValue],
CALCULATETABLE (
SUMMARIZE ( Sales, Sales[CustomerKey] ),
'Sales'[IsFirstOrder] = FALSE,
ALLSELECTED ('Product'),
USERELATIONSHIP ( Sales[ProductCode],
'Filter Product'[Filter ProductCode] )
)
)
RETURN
IF(NOT([SameSubCategorySelection]),
CustPurchaseOthersSubcategoryAfter)
Примечание. «SameSubCategorySelection» используется для исключения данных с той же выбранной подкатегорией. Эта формула также делается с помощью метода макросов:
SameSubCategorySelection =
IF (
HASONEVALUE ( 'Product'[Subcategory] )
&& HASONEVALUE ( 'Filter Product'[Filter Subcategory] ),
IF (
VALUES ( 'Product'[Subcategory])
= VALUES ( 'Filter Product'[Filter Subcategory] ),
TRUE
)
)
5. Теперь, когда мы подсчитали, сколько клиентов, купивших продукт А, сначала купили другие продукты, теперь нам нужно рассчитать долю этих клиентов в общем количестве клиентов, купивших продукт А, а затем есть записи о покупках. Ниже приведен код для вычисления знаменателя этой шкалы.
AsFirstOrderCust =
VAR
FIRSTORDERPROD =
IF(
HASONEVALUE('Product'[Subcategory]),
VALUES('Product'[Subcategory]),0)
VAR
VT1 =
SUMMARIZE(
FILTER(Sales,
AND(
RELATED('Product'[Subcategory]) = FIRSTORDERPROD,
'Sales'[IsFirstOrder]=TRUE)),
'Sales'[CustomerKey]
)
return
CALCULATE(
DISTINCTCOUNT('Sales'[CustomerKey]),
VT1)
-------------------------------------------------------------------------------
IsLastOrder =
VAR
E_Date = 'Sales'[OrderDateKey]
VAR
CUST = 'Sales'[CustomerKey]
RETURN
IF(
SUMX(
FILTER('Sales',
CUST = 'Sales'[CustomerKey]&&
E_Date < 'Sales'[OrderDateKey]),
COUNTROWS('Sales'))>0,"F","T")
-------------------------------------------------------------------------------
AsFirstOrderCustRepurchase =
CALCULATE(
'Sales'[AsFirstOrderCust],
'Sales'[IsLastOrder] = "F")
Теперь у нас есть окончательный результат: CustPurchaseOthersSubCategoryAfter %, эта метрика имеет длинное имя, потому что ее логика сложна, как и процесс расчета выше.
CustPurchaseOthersSubCategoryAfter % =
DIVIDE ( 'Sales'[CustPurchaseOthersSubcategoryAfter],
'Sales'[AsFirstOrderCustRepurchase])
Конечный результат
В конце концов, мы успешно достигнем окончательного результата, как показано ниже, и решим визуализировать его с помощью пользовательского визуального элемента под названием «CHORD».
Как видите, 1853 покупателя, купивших шоссейный велосипед, сначала купили горный велосипед, а затем, что интересно, только 200 покупателей купили шоссейный велосипед после покупки горного велосипеда.
Файл PBIX прилагается и может быть загружен здесь, если вы заинтересованы.
1DRV.Сразу /U/Да!Пленка уровня А QA2...
Оригинальная ссылка:к data science.com/explore - он и…
Добро пожаловать на сайт блога Panchuang AI:panchuang.net/
sklearn машинное обучение китайские официальные документы:sklearn123.com/
Добро пожаловать на станцию сводки ресурсов блога Panchuang:docs.panchuang.net/