일주일전에 "상위 몇개의 reseller가 전체매울 80%에 기여하는가?" 대한 분석을, 나는 WINDOW DAX 함수를 어떻게 사용하여 분석하는가에 대한 짧은 블로그를 작성했다.
링크드인링크: Post | Feed | LinkedIn
Reseller가 약 700개 정도 되는 샘플데이터인데, 나름 잘 설명되었다고 생각했다.
그런데, 어떤분이 700개보다 훨씬 많은 10,000개의 카테고리를 분석할 경우에는 결과값이 나오는데 상당히 오래 걸린다고 했다. Performance issue가 있다는 것이다.
나의 샘플데이터에는 고객숫자가 18,000개 정도 있었으나, 약 9,000개 정도로 줄여서, 이것을 가지고 적용해 보았는데, 실제로 내가 작성한 그대로의 DAX measure를 9,000개 정도의 데이터를 분석하는데 적용해보니, 약 30초 시간이 걸렸다. DAX measure performance를optimize를 해야하는 상황이 발생한 것이다.
그래서, 9,000여명의 고객 중에서 상위 몇펴센트의 고객이 전체매출 80%를 구성하는가?에 대한 문제를 풀기 위해서, 나는 아래와 같이 세가지의 방법으로 문제로의 접근을 진행하였다.
WINDOW DAX 함수를 사용하는 경우와, WINDOW DAX 함수가 세상에 나오기 전에는 나는 어떻게 했는지에 대한 경우, 그리고 마지막으로 나는 optimize를 어떻게 했는지를 써볼까 한다.
결론부터 말하지면, 나의 optimize방식이 상당히 마음에 들지 않지만, 내 실력이 여기까지인걸 어찌하리... 혹시 읽으시는 분들 중에서 다른 방법으로 진행하는 분들이 있으시다면 꼭 알려주시길... 샘플데이터는 맨 아래에 첨부하였으니, 필요하시다면 그것을 사용하시길...
그런데, 9,000여개의 카테고리를 가지고 Pareto analysis를 하는 실제 회사나 실제 경우가 있기는 있나?하는 의문이 들기 한다. 하지만, 일단은 시도는 해봐야하지 않을까 싶다.
샘플파일의 Datamodel은 다음과 같다.
이 중에서, 나는 customer, internet sales, territory, date 정보만을 사용할 것이다.
Date 와 Territory를 slicer에 적용할 경우, 9,000여개의 고객 중에서 active 고객이 필터링이 되기 때문에, 여기서는 Date와 Territory를 slicer에서 선택을 하지 않고 진행하겠다.
1. WINDOW DAX 함수 사용하는 경우
Internet sales: = SUMX ( FactInternetSales, FactInternetSales[OrderQuantity] * FactInternetSales[UnitPrice] )
Internet sales rank: = RANKX ( ALL ( DimCustomer[CustomerKey] ), [Internet sales:],, DESC )
Customers top rank ratio: =
DIVIDE (
[Internet sales rank:],
CALCULATE ( [Active customers count:], ALL ( DimCustomer[CustomerKey] ) )
)
Cumulative internet sales ratio: = VAR _rank = [Internet sales rank:] VAR _cumulative = CALCULATE ( [Internet sales:], WINDOW ( 1, ABS, _rank, ABS, ADDCOLUMNS ( ALLSELECTED ( DimCustomer[CustomerKey] ), "@sales", [Internet sales:] ), ORDERBY ( [@sales], DESC ) ) ) VAR _allsales = CALCULATE ( [Internet sales:], ALL(DimCustomer[CustomerKey] ) ) RETURN DIVIDE ( _cumulative, _allsales )
➡️ 왜 위와같이 작성하는지에 대한 설명은 이전 블로그에서 나름 상세히 설명했다. 이전 블로그 링크는 Link: WINDOW DAX Function in Pareto Analysis (jihwankimcscp.wixsite.com)
Top customers % that create 80% of sales: =
VAR _infotable =
ADDCOLUMNS (
DISTINCT ( DimCustomer[CustomerKey] ),
"@ranking ratio", [Customers top rank ratio:],
"@cumulate sales ratio", [Cumulative internet sales ratio:]
)
VAR _salestop =
FILTER ( _infotable, [@cumulate sales ratio] < 0.8 )
RETURN
MAXX ( _salestop, [@ranking ratio] )
이 중에서 card visualization을 DAX Studio에서 분석해보면 아래와 같은 분석값을 볼 수 있다.
2. WINDOW DAX 함수 사용안하는 경우
WINDOW DAX 함수를 사용해서 9,000여개의 정보를 가지고 Pareto analysis를 하려다보니 card visualization을 refresh하는데 너무 긴 시간이 소요되었다.
그래서, 나머지 DAX measures는 같은 것들을 사용하고, WINDOW DAX 함수가 포함된 하나의 DAX measures 는 아래와 같이 수정했다.
Cumulative internet sales ratio W/O window: = VAR _internetsales = [Internet sales:] VAR _cumulatesales = CALCULATE ( [Internet sales:], FILTER ( ALL ( DimCustomer[CustomerKey] ), [Internet sales:] >= _internetsales ) ) RETURN DIVIDE ( _cumulatesales, CALCULATE ( [Internet sales:], ALL ( DimCustomer[CustomerKey] ) ) )
아래의 그림과 같이, 같은 결과를 보여준다.
하지만, 예상했던 바와 같이 이것또한performance issue가 있으며, Card visualization을 DAX Studio에서 보면 아래와 같다.
3. Optimize
그래서, DAX Measure 하나를 아래와 같이 수정했다.
Cumulative internet sales ratio Optimize: = VAR _allsales = CALCULATE ( [Internet sales:], ALL ( DimCustomer[CustomerKey] ) ) VAR _sales = ADDCOLUMNS ( ALL ( DimCustomer[CustomerKey] ), "@sales", [Internet sales:] ) VAR _cumulatesales = ADDCOLUMNS ( _sales, "@cumulatesales", SUMX ( FILTER ( _sales, [@sales] >= EARLIER ( [@sales] ) ), [@sales] ) ) VAR _cumulatesalespercent = ADDCOLUMNS ( _cumulatesales, "@percentage", DIVIDE ( [@cumulatesales], _allsales ) ) RETURN MAXX ( FILTER ( _cumulatesalespercent, DimCustomer[CustomerKey] = MAX ( DimCustomer[CustomerKey] ) ), [@percentage] )
아래의 그림과 같이, 같은 결과를 보여준다.
DAX Studio에서 card visualization을 분석해보면, 아래의 그림에서 보이듯이, 가장 좋은 performance를 보여준다.
내가 예전에 Pareto analysis를 할때에 사용하던 방법(두번째 방법)도 9,000개의 카테고리를 분석할 때에는 문제가 있는 방법이었다라는것을 알수있다.
하지만, 9,000개의 카테고리가 아닌, 700개 정도의 카테고리 또는 그이하의 카테고리를 가지고 Pareto analysis를 하는 경우가 대부분이기 때문에, WINDOW DAX Function을 꼭 사용해서 "전체매출의 80%는 내가 판매하는 제품 중에서 상위제품 몇 %로 구성되어있는가?"에 대한 답변을 구하는 연습을 하기를 추천한다.
9,000개 정도의 제품에 대한 Pareto analysis를 하시는 분들은 내가 제시한 마지막 방법으로 DAX measure를 작성하시길...
Comments