본 포스팅은 인프런의 태블로 레벨UP 강의를 바탕으로 작성되었습니다.
화면의 구체화된 수준
more granular
우측으로 갈수록 복잡해지고, 구체화되며, 디테일해지며, 잘게 잘리고, 작은 단위로 표현되고 있음
more aggregated
좌측으로 갈수록 간단해지고, 단순회되며, 통합되고, 굵은 묶이고, 큰 단위로 표현되고 있음
모든 측정값은 VLOD에서 집계되고 표현된다.
집계되는 기준이 VLOD이고, VLOD에서 화면에 표시된다는 의미이다. 추상적인 개념이기에, 예시를 보며 확실히 이해해보도록 하자.
측정값이 아닌, 오직 차원만이 VLOD를 결정할 수 있다.
행, 열, 페이지, 필터, 색상, 크기, 레이블, 세부정보, 도구설명
Category를 열이나 행에 넣으면 막대 세개로 분기되며, Level of Detail이 변했음을 알 수 있다.
마크 카드 안에서도 LOD를 변화시킬 수 있다.
다만 도구 설명, 필터 등은 VLOD에 영향을 미치지 않는다.
페이지 같은 경우에는 VLOD에 변화를 줄 수 있냐에 대해 다양한 관점이 존재하는데, 사실상 자주 사용하지 않는 부분이기에 중요하지 않다.
LOD 표현식이 태블로 안으로 들어오게 되면서, 데이터가 집계되는 레벨이 반드시 VLOD일 필요가 없어졌다. 모든 측정값이 VLOD에서 표현되는 것은 변함 없는 사실이다.
버전이 업데이트 된 것은 다음과 같은 질문들을 태블로 내에서 해결하기 위함이다.
Include
, Exclude
, and Fixed
{Include [차원1], [차원2] : SUM([측정값])}
Include
Exclude
Fixed
여러 개의 차원을 사용할 경우 쉼표(,)로 구분
반드시 집계값이 사용되어야 하며, ATTR 또는 테이블 계산식은 사용 불가
VLOD에 포함되지 않은 특정 차원을 포함하고 싶을 때
위 그래프에 Include LOD 표현식을 넣으면 어떻게 될까?
# Sales by Sub-Category - Include
{ INCLUDE [Sub-Category] : AVG([Sales]) }
눈에 보이지는 않지만 태블로 뒷단에서 다음과 같은 계산이 먼저 이루어진다.
즉, Sub Category를 포함하는 레벨에서 비가시적으로 평균 Sales 계산이 먼저 이루어진다. 그 뒤에, 그 결과를 가지고 현재의 VLOD(카테고리)로 기준으로 재집계가 이루어진다. 방식은 일반적으로 SUM(디폴트 세팅)이다.
첫 번째 계산에서는 표현식에 작성한대로 평균을 도출하고, LOD 표현식을 화면에 올릴 때 합계로 올렸기에 두 번째 계산에서는 합이 도출된다.
Include LOD는 태생적으로 새로운 차원을 포함하고 있기 때문에, Include LOD에서 만든 결과는 VLOD보다 Depth가 깊을 수밖에 없다. 깊은 레벨에서 계산된 결과를, 얕은 레벨인 VLOD에서 표현해야 하기 때문에 두 번째 계산이 이루어지는 것이다.
Include LOD에 명시된 차원을 포함하여 집계가 이루어짐 (첫번째 단계)
VLOD에 맞추어 표현하기 위해 첫번째 계산 결과를 재집계함 (두번째 단계)
각 도시(City)별 평균 매출(Sales)을 기준으로 최대-최소 편차가 다섯번째로 큰 주(State)는 어디인가요?
# Sales - Avg by City - Include
{ INCLUDE [City] : AVG([Sales]) }
MAX([Sales - Avg by City - Include]) - MIN([Sales - Avg by City - Include])
Include LOD를 사용하기 위해서는 Data set의 depth가 상대적으로 깊어야 한다. 최소한 2 depth 이상이어야 활용할 수 있다.
VLOD에 포함된 특정 차원을 제외하고 싶을 때
위 그래프에 Exclude LOD 표현식을 넣어보자
# Sales by Category - Exclude
{ EXCLUDE [Sub-Category] : AVG([Sales]) }
서브 카테고리를 제외한 Exclude LOD 표현식을 화면 안으로 집어 넣으면, 서브 카테고리 레벨을 제외한 수준에서 평균 Sales가 계산된다. 그리고 그 결과값은 현재의 VLOD(서브 카테고리 레벨)에서 표현하기 위해 각 카테고리별로 동일한 숫자들로 복제된다.
Exclude LOD에 명시된 차원을 제외한 후 집계가 이루어짐 (첫번째 단계)
VLOD에 맞추어 표현하기 위해 첫번째 단계 결과를 복제함 (두번째 단계)
Exclude LOD가 효과적으로 작동하기 위해서는 Exclude LOD 안에서 선언된 그 차원이 반드시 VLOD에 포함되어 있어야 한다. 그래야만 VLOD에서 그 차원을 제외시키고 계산이 이루어진다.
즉, Exclude LOD에서 만들어진 그 계산 결과는 VLOD의 수준보다 항상 얕을 수밖에 없다. 따라서 더 얕은 수준에서 만들어진 그 결과를, 더 깊은 수준인 VLOD에 맞추어 표현하기 위해서는 1단계의 계산 결과를 2단계에 복제할 수밖에 없다.
각 도시(City)의 소속 주(State)에 대한 수익(Profit) 기여도를 지도에 표현해보세요.
# 각 도시의 수익 / 도시가 포함된 주의 수익
# Profit Contribution
SUM([Profit]) / ATTR({ EXCLUDE [City] : SUM([Profit]) })
✅ LOD 표현식은 항상 그 결과가 집계된 값이 아니라, Raw Level의 값이기 때문에 한 번 더 집계해주어야 한다.
Profit Contribution 필드를 색상으로 넣어주게 되면, 위와 같이 수익 기여도를 한 눈에 알아볼 수 있다. 음수 값이 있는 것을 보아 손실을 내고 있는 도시도 있다는 사실을 알 수 있다.
그리고 다음과 같이 ABS(SUM([Profit]))
을 크기로 넣어주면, 원의 크기를 통해 각 도시의 기여 규모를 알 수 있다. 수익과 손실에 관계 없이 규모가 크면 크게, 규모가 작으면 작게 표현하기 위해 절댓값을 취해주었다.
서브 카테고리에 대한 Sales의 합계에서, Paper의 값을 기준으로 상대적으로 다른 서브 카테고리 항목이 얼마만큼 더 팔았는지 혹은 덜 팔았는지를 표현해보세요.
# Sales - Paper
IIF([Sub-Category] = 'Paper', [Sales], NULL)
서브 카테고리가 Paper
이면 Sales
를 반환하고, 그렇지 않으면 NULL
값을 반환한다.
# Sales - Paper - Exclude
{ EXCLUDE [Sub-Category] : SUM([Sales - Paper]) }
현재 VLOD가 Sub-Category
인데, 이를 제외하라고 했으므로 전체 레벨이 제외되고 Paper
의 합이 더해진다. 그 상태에서 VLOD에 맞춰서 표현해주기 위해 복제된다.
우리가 원하는 값을 얻기 위해서는, 각 서브 카테고리의 Sales
의 합에서 Sales - Paper - Exclude
를 빼주면 된다.
# Sales - Relative to Paper
SUM([Sales]) - ATTR([Sales - Paper - Exclude])
결론적으로 위 그래프와 같이 Paper보다 매출 금액이 낮은 항목들과, 높은 항목을들을 알아보기 쉽게 표현할 수 있다.
State
에 대한 하부 차원 City
의 기여도를 정규화Paper
와 다른 서브 카테고리 항목들의 매출 비교대부분의 Include와 Exclude는 Fixed로 대체 가능한데, Fixed가 훨씬 사용하기 편리하다. 따라서 앞의 두가지 LOD 표현식은 상대적으로 활용도가 낮다.
Include & Exclude
항상 VLOD를 두고, 거기에서 더할 것이냐 뺄 것이냐를 고려한다.Fixed
내가 원하는 특정 차원으로 화면을 고정시키는 것으로, 특별히 화면 안에 어떤 View가 만들어지고 있는지를 고려할 필요가 없다. 내가 선언하고 싶은 차원을 선언한 이후에, 선언한 차원에 대해서 데이터를 집계하는 것이다. Include & Exclude
항상 결과값이 측정값만 나온다.Fixed
측정값뿐만 아니라 차원도 결과값으로 나올 수 있다. 날짜 데이터가 대표적으로, 최근 한달 달, 최근 한 주와 같은 표현이 가능하다. Include & Exclude
차원 필터(dimension filters)가 적용된 이후에 계산이 일어난다. 즉, 항상 차원 필터의 영향을 받게 된다.Fixed
차원 필터 적용 이전에 작동되어서 차원 필터의 영향을 전혀 받지 않는다. 또한, 차원 필터를 컨텍스트 필터(context filters)로 만들어주게 되면 Fixed LOD 표현식 또한 필터로 제어가 가능하다.1️⃣ Fixed LOD에서 선언한 차원이 VLOD에 포함되어 있을 때
2️⃣ Fixed LOD에서 선언한 차원이 VLOD에 포함되어 있지 않을 때
# Sales - Avg.by Sub-Category - Fixed
{ Fixed [Sub-Category] : AVG([Sales]) }
Fixed LOD 안에 서브 카테고리 레벨에서 집계가 선언이 되고 있고, VLOD 안에 서브 카테고리가 포함되어 있다. Fixed LOD 표현식은 Include 방식으로 작동하거나, Exclude 방식으로 작동하게 된다.
위 그래프에 Sales - Avg.by Sub-Category - Fixed
LOD를 집어넣게 되면 어떻게 될까?
뒷단에서는 위와 같이 1차 집계가 일어난다.
하지만 결론적으로, 아무런 변화가 일어나지 않는다. 그 이유는 VLOD가 현재 서브 카테고리 레벨이고, Fixed LOD에서 만들어진 레벨도 서브 카테고리 레벨이기 때문이다. 따라서 Include 방식으로 재집계할 필요도, Exclude 방식으로 복제할 필요도 없다.
두번째 집계를 합계로 하든, 평균으로 하든, 최댓값으로 하든, 최솟값으로 하든 상관 없이 1차로 Fixed LOD 안에서 집계된 레벨이 지금 화면의 VLOD와 같기 때문에, 2차 집계는 어떤 방식으로 하든 관계 없이 VLOD, 그리고 Fixed LOD 안에서 선언되었던 레벨로 나오게 된다.
따라서 Sales - Avg.by Sub-Category - Fixed
의 두번째 집계를 합계로 설정했음에도 불구하고 Sales의 평균과 같은 그래프가 도출된다.
태블로 뒷단에서 일어난 (1차 집계) 결과는 아까 본 Fixed-2 그래프와 같다. 서브 카테고리 레벨로 평균 Sales를 집계한다. 하지만, 아까와 달리 VLOD가 현재 Fixed LOD 안에서 선언된 레벨보다 더 깊은 수준이다. 따라서 제조사 레벨과 관계 없이, 서브 카테고리 레벨에서 계산된 평균 매출 금액에 복제되어 나온다.
왼쪽은 단순히 매출 합계를 카테고리별로 올린 것이고, 오른쪽은 서브 카테고리 레벨에서 집계된 매출 합계를 Fixed LOD로 만들어서 화면 안에 집어넣은 것이다. 놀랍게도 둘의 결과는 동일하다.
# Sales - Sum by Sub-Category - Fixed
{ FIXED [Sub-Category] : SUM([Sales]) }
위 Fixed LOD 표현식에서 태블로 뒷단에서는 다음과 같은 계산을 수행한다.
Fixed LOD 안에서 정의된 레벨은 서브 카테고리 레벨이고, 현재 VLOD에서 정의된 레벨은 보다 한 단계 높은 카테고리 레벨이기 때문에 VLOD에서 표현하기 위해 재집계가 이루어지고, 이것이 합계였기 때문에 동일한 그래프가 도출된 것이다.
왼쪽은 Sales를 카테고리 레벨에서 평균으로 단순히 집계한 금액이고, 오른쪽은 서브 카테고리 레벨에서 평균 매출을 집계한 이후에 화면으로 Fixed LOD를 집어넣은 것이다.
지금 태블로가 작동하는 방식은 Include가 작동하는 방식과 동일하다. 일차적으로 Fixed 안에서 선언한 차원에 대해서 평균으로 집계가 이루어지고, 거기서 만들어진 레벨이 지금 화면에서 보이는 VLOD보다 더 깊기 때문에, depth가 더 얕은 VLOD로 표현되기 위해서 다시 한 번 재집계가 이루어진다.
Fixed LOD 안에서 선언된 차원(서브 카테고리)가 포함된 화면에서, 태블로는 측정값의 존재 유무를 확인한다. 그리고 존재하는 측정값에 대해서만 2차 계산이 이루어진다.
예를 들어, Alabama 주의 Auburn이라는 도시에서는 17개의 서브 카테고리 항목 중에서 Art, Chairs, Envelopes, Labels, Paper, Storage 이렇게 여섯가지 항목에 측정값을 갖는다. 따라서 이 6개 항목의 1차 계산 결과에 대해서만 2차 계산(평균)을 수행하게 된다.
따라서 총 6가지의 항목들의 평균의 합계가 987이고, 이를 6으로 나누면 위에서 본 165라는 결괏값이 도출된다.
각 지역(Region)별로 수익을 낸 주문과 손실을 낸 주문의 매출 비중을 구해보세요.
열은 합계(Sales)
, 행은 Region
합계(Sales)
→ 퀵 테이블 계산 → 구성 비율
합계(Sales)
→ 다음을 사용하여 계산 → 테이블(옆으로)
(각 지역마다 100%로 만들어줌)
Fixed LOD를 만들어서 색상
으로 넣어주면, 수익을 발생시킨 주문과 손실을 난 주문이 주황색과 푸른색으로 나누어져 표현된다.
# Profitable Order
{ FIXED [Order ID] : SUM([Profit]) > 0 }
전체 데이터셋 범위에서 집계값을 잡을 때
# Sales - Total
{ SUM([Sales]) }
데이터셋 전체의 범위에서 Sales의 합계가 잡혀있고, 어떠한 차원에 의해서도 쪼개질 수 없다.
날짜 필드를 활용할 때
ex. 최근 3개월, 올해, 지난 주 등
# Recent Year
{ MAX(YEAR([Order Date])) }
# Last Year
[Recent Year] - 1
필터의 영향을 받지 않는 값을 만들어야 할 때
이 외에도 수도 없이 많다!
분석 탭의 평균 라인 집어넣기를 통해서 Include LOD 또는 Exclude LOD와 같은 결과물들을 만들어낼 수 있다.
평균 라인 - 패널 - (평균)
Include LOD가 작동하는 방식과 동일하다.
1차적으로 서브 카테고리 레벨에서 평균 Sales가 계산되고, 화면에서 표현되기 위해 패널별로 평균이 다시 한 번 계산된다. 즉, 서브 카테고리 레벨이 고려된 가중 평균이다.
평균 라인 - 패널 - 총계
Exclude LOD가 작동하는 방식과 동일하다.
서브 카테고리 레벨과 관계없이 카테고리 레벨에서 모든 매출의 합계를 더하고, 그 카테고리 레벨에 있는 데이터 행의 개수로 나눠준다.
각 서브 카테고리의 평균 매출이 자기 자신이 속한 카테고리의 평균 매출과 얼마만큼 차이가 나고 있는지 표현해보세요.
VLOD에 없는 Category
의 평균 매출을 구해야 되기 때문에, Fixed LOD 표현식을 이용해야 한다.
# Sales - by Category - Fixed
{ FIXED [Category] : AVG([Sales]) }
# Difference
AVG([Sales]) - AVG([Sales - by Category - Fixed])
위 그래프와 같이 각 서브 카테고리의 평균 매출과 자신이 속한 카테고리의 평균 매출의 차이를 표현할 수 있다.
테이블 계산식은 화면의 특정한 조건에 따라서 계산이 되는 것이기 때문에, 화면 안에 없는 필드에 대해서는 계산이 불가능하다.
테이블 계산식 대비 LOD 표현식의 강점은 유연성이다. 참조선(테이블 계산식)은 VLOD에 없는 차원에 대한 계산 결과를 절대로 만들어 낼 수 없다.