[Tableau] Level of Detail Calculation
2025.05.31 - [프로그래밍/데이터 시각화] - [Tableau] Table of Contents
1. Fixed
현재 view에 관계없이 지정된 특정 차원을 사용하여 계산하는 연산입니다.
1) 원하는 특정 차원으로 화면을 고정, 화면 안에 어떤 View가 만들어지고 있는지를 고려할 필요가 없습니다. 선언하고 싶은 차원을 선언한 이후에 선언한 차원에 대해서 데이터를 집계합니다.
2) 차원 필터 적용 이전에 작동되어서 차원 필터의 영향을 전혀 받지 않습니다.
3) 측정값뿐만 아니라 차원도 결과값으로 나올 수 있습니다. 날짜 데이터가 대표적으로, 최근 한달 달, 최근 한 주와 같은 표현이 가능합니다. (INCLUDE/EXCLUDE는 측정값만 가능)
예시를 한 번 볼까요? 지금 선반에 올라가있는 vlod(view level of detail)의 수준이 [Region] 입니다. 일단 먼저 [Sales]를 올려두면 [Region] 까지 내려온 세부수준에서 [Sales]의 합계를 계산합니다. 그런데, 이 값은 아래와 같은 Fixed를 이용한 계산된 필드([RC_Sales])를 만든 후 선반에 올려둔 것과 값이 다르지 않습니다.
{ FIXED [Region],[Category]: sum([Sales])}
왜 그럴까요? 사실 Fixed 연산을 활용한다는 것은
1) 일차적으로, 현재 vlod가 어떤 수준이건 간에 내가 고정시켜준(지금은 FIXED 뒤에나오는 [Region], [Category]) 차원단위로 중간연산(지금은 :뒤에 나오는 sum)을 하겠다는 것입니다. 여기까지만 생각하면 아래와 같은 중간 계산이 이루어진다고 봐도 됩니다.
2) 그런데 이것을 선반으로 올리게 되면* 설정된 vlod 수준**에 맞추어 [RC_Sales]를 집계합니다. 현재 vlod에서 default 집계방식은 합계(Default)이고요. 그런데, 지금 집계하는 방식(합계:sum)의 특성 상 그냥 처음부터 [Region]별로 집계(합계)하는 방식이나 일단 [RC_Sales]처럼 지역별, 카테고리별로 중간연산(sum)을 수행했다가 다시 이걸 [Region]별로 재집계(합계)하는 방식이나 결과는 동일하기 때문에 같은 값이 나오는 것입니다.
만약 지금 vlod레벨에서 집계하는 방식을 합계가 아닌 평균으로 바꾼다면
이제는 양상이 달라집니다. 처음부터 [Region]별로 집계(평균)하는 방식과 일단 지역별, 카테고리별로 중간연산(sum)을 수행했다가 다시 이걸 [Region]별로 재집계(평균)하는 방식의 값이 다릅니다. 전자는 우리가 일반적으로 생각하는 지역별 평균값이고 후자는 아래와 같은 중간연산 상태로 갔다가 여기서 지역별로 평균값을 구하는 것이죠.
사실 위의 예시에서는 더 세부적인 수준***에서 FIXED시키는 것이었지만 더 높은 레벨****에서 사용할 수도 있습니다. 예를 들어 아래와 같은 [R_sales]를 만들었다고 해봅시다.
{ FIXED [Region]: sum([Sales])}
그리고 [Region], [Category] vlod 수준에서 선반에 [Sales]와 같이 올려두면 어떻게 될까요?
Fixed 수행 시 원리적으로는 아래와 같은 중간계산이 만들어지는 것이라고 했는데..
그걸 이제 [Region], [Category]에 올려두면* 태블로는 어떻게 해야할까요? 이제 이 vlod에 맞추어 집계해야합니다. 그런데 이번에는 [R_sales]라는 중간계산이 이미 상위 level([Region])에서 계산된 상태입니다. 더 하위 수준인 현재 vlod수준( [Region], [Category] )에서는 그래서 [Region]은 같으나 [Category]는 다른 셀에 그냥 공통된 값([Region]에서 중간연산된 값)을 복제해서 표기해줍니다.
Fixed연산의 특징도 한 번 알아봅시다.
1) 차원 필터 적용 이전에 작동되어서 차원 필터의 영향을 받지 않는다:
실제 연구나 업무에서 이렇게 쓰진 않을 것 같지만 아까 예제에서 [Date]라는 날짜 변수를 넣었다고 해봅시다. 왼쪽의 Sales값을 그대로 선반에 올려둔 녀석은 [Date]필터의 영향을 받아서 체크박스를 해제하면 그 날짜에 해당하는 값들은 제외하고 합계를 계산하게 됩니다. 하지만 오른쪽의 FIXED를 이용해서 만든 계산된 필드는 체크박스를 어떻게 하든 요지부동이죠.
2) 측정값뿐만 아니라 차원(특히 날짜)도 결과값으로 나올 수 있다:
선반에 [Category]와 [Date(일)]을 올려두면 아래와 같은 그림을 볼 수 있습니다.
여기서 Category별로 가장 큰 날짜를 구해볼까요? [C|max_date] 라는 변수를 아래와 같이 만들고 선반에 올려보겠습니다
{FIXED [Category]: MAX([Date])}
결과값으로 날짜를 잘 반환하고 있는 것을 확인할 수 있습니다.
지금까지 VLOD연산을 FIXED위주로 설명드렸습니다. FIXED를 먼저 설명드리고 INCLUDE/EXCLUDE를 설명드릴 수도 있고, INCLUDE/EXCLUDE를 먼저 설명드리고 FIXED를 설명드릴 수도 있었는데 저는 전자의 방식을 택했습니다. FIXED를 말씀드렸으니 이제INCLUDE와 EXCLUDE는 FIXED에서 설명드린 기능중 어떤것인지 감만 잡으시면 됩니다.
2. INCLUDE
현재 view에서 특정차원을 추가하여 계산하는 연산입니다. 대표적으로는 아래와 같은 경우에 사용합니다.
집계를 두 번 해야 할 경우(평균의 최대값, 최소값의 평균, 평균의 평균 등)에 재집계(두번째 계산)가 SUM이 아닌 다른 집계값일 때
3. EXCLUDE
현재 veiw에 관계없이 특정 차원을 제외하여 계산하는 연산입니다. 대표적으로는 아래와 같은 경우에 사용합니다.
차원 A에 대한 하부 차원 B의 기여도를 정규화할 때
특정 차원에 대한 하나의 값을 동일한 차원의 다른 값과 상대 비교할 때
예시 데이터 하나를 살펴보겠습니다.
이 데이터를 아주 세부적인 레벨까지 다 펼쳐서 선반에 올려놓으면
이런 모양이 됩니다. 그런데 제가 하고싶은 것은 소분류 레벨까지의 집계(합계) 값을 표시하되, 중분류에서 이 소분류가 차지하는 비율(share)가 얼마나 되는지도 같이 계산하고 싶다고 해봅시다(사실 단순 예시에서는 이런저런 생각 안하고 쉽게 할 수 있는 방법이 "퀵 테이블 계산"입니다만 상황에 따라서는 퀵 테이블 계산이 어려운 경우도 있을수 있습니다 이럴 때는 VLOD 표현식을 활용해서 이렇게 계산해야 합니다).
그럼 우리가 해야할 첫번째 연산은 소분류 단은 무시하고 중분류단에서 집계된 값(중분류단 전체합)이 있어야 합니다. 선반은 소분류 레벨까지 나와있지만 집계는 중분류에서 하고 싶으니 Exclude를 이용해서 '소분류'를 배제한 1차 집계를 해보겠습니다.
[EX-Small_Sales] 라는 변수를 { EXCLUDE [소분류]: sum([판매량]) } 로 정의했습니다. 그러면 이 변수는 아래와 같은 1차 집계후에 선반 level에 맞추어 집계를 하게 됩니다.
만약에 이걸 소분류까지 나와있는 선반에 올리면
이렇게 되는데요 돌아가는 원리 마치 SQL 윈도우 함수에서 집계함수( ) over (partiton by )와 혹은 KEEP 함수의 사용이랑 비슷합니다(SQL에서는 window함수냐, keep함수냐에 따라 최종테이블의 크기가 바뀌는데 Tableau에서는 VLOD가 선반에 따라 맞춰진다는 점은 다르겠죠).
SQL window 함수에서 over 앞의 집계함수( ),
KEEP함수를 사용할 때 서두에서 집계합수( ),
지금 예시에서 { EXCLUDE [소분류]: sum([판매량]) } sum( ) 모두 비슷한 역할을 수행하고 있는 겁니다.
이해가 잘 안가시는 분을 위해 사족을 덧붙이자면, VLOD는 소분류까지 설정된 상태에서 소분류를 연산에서는 'exclude'해버렸기 때문에 소분류만 다른 값을 갖고 나머지는 다 동일한 행이 생기게 됩니다(예: 바나나, 사과). 그럼 이 중복행을 전체 합계를 낼지, 평균을 낼지 '집계'함수를 설정(sum) - Exclude 연산에서의 SUM - 한 후에 선반의 VOLD에 맞추어 보여주게 되는 것입니다.
그러면 비율 계산을 위해 전체 합계가 구해진 것이고
[비율] = sum([판매량])/max([EX_Small_Sales]) 이라는 계산된 필드를 만들어주면 이제 제가 원래 의도한 대로 해당 소분류가 중분류 상에서 차지하는 비율을 알아낼 수 있습니다.
SUMMARY
그런데, FIXED로 다 할 수 있으면 FIXED로 하지 왜 INCLUDE/EXCLUDE가 있는지 궁금할 수도 있습니다.
FIXED vs. INCLUDE/EXCLUDE 차이점을 한번 정리해보고 마치겠습니다.
1) 결과값의 속성 : INCLUDE/EXCLUDE는 무조건 측정값, FIXED는 측정값과 차원 둘 다 가능.
2) View Dependency : INCLUDE/EXCLUDE는 현재의 view에 의존하지만 FIXED는 독립적.
3) 차원필터 활용 : INCLUDE/EXCLUDE는 차원필터로 제어가 가능하지만 FIXED는 고정되어 있기때문에 불가능
* 태블로는 항상 선반에 올려두면 선반에서 설정된 vlod 수준에서 무조건 집계를 수행합니다
** 지금은 선반에 올라가있는 [Region] 1개가 vlod을 규정하고 있습니다
*** INCLUDE의 기능과 비슷하게 작동
**** EXCLUDE의 기능과 비슷하게 작동