[Tableau] LOD 표현식

김소정·2022년 4월 5일
0

Tableau

목록 보기
2/4
post-thumbnail
post-custom-banner

본 포스팅은 인프런의 태블로 레벨UP 강의를 바탕으로 작성되었습니다.

VLOD(View Level of Detail)

화면의 구체화된 수준

more granular
우측으로 갈수록 복잡해지고, 구체화되며, 디테일해지며, 잘게 잘리고, 작은 단위로 표현되고 있음

more aggregated
좌측으로 갈수록 간단해지고, 단순회되며, 통합되고, 굵은 묶이고, 큰 단위로 표현되고 있음

모든 측정값은 VLOD에서 집계되고 표현된다.

집계되는 기준이 VLOD이고, VLOD에서 화면에 표시된다는 의미이다. 추상적인 개념이기에, 예시를 보며 확실히 이해해보도록 하자.

Example: Category / Sales

  • 사용자가 특별한 명령을 주지 않으면 태블로의 집계 방식의 디폴트 값은 합계
  • VLOD를 sub-category 레벨까지 내리면, 기존의 카테고리 레벨에서 집계하는 대신에 서브 카테고리 레벨에서 새롭게 집계함 → 이것이 모든 측정값은 VLOD에서 집계된다는 의미
  • VLOD에서 표현된다는 것은, 위와 같이 VLOD 수준에서 집계된 결과가 눈에 그대로 보인다는 의미

측정값이 아닌, 오직 차원만이 VLOD를 결정할 수 있다.

VLOD를 변화시킬 수 있는 위치

, , 페이지, 필터, 색상, 크기, 레이블, 세부정보, 도구설명

Example

Category를 열이나 행에 넣으면 막대 세개로 분기되며, Level of Detail이 변했음을 알 수 있다.
마크 카드 안에서도 LOD를 변화시킬 수 있다.
다만 도구 설명, 필터 등은 VLOD에 영향을 미치지 않는다.
페이지 같은 경우에는 VLOD에 변화를 줄 수 있냐에 대해 다양한 관점이 존재하는데, 사실상 자주 사용하지 않는 부분이기에 중요하지 않다.

Tableau Version 9

LOD 표현식이 태블로 안으로 들어오게 되면서, 데이터가 집계되는 레벨이 반드시 VLOD일 필요가 없어졌다. 모든 측정값이 VLOD에서 표현되는 것은 변함 없는 사실이다.

버전이 업데이트 된 것은 다음과 같은 질문들을 태블로 내에서 해결하기 위함이다.

  • 회사 연봉이 업계 평균 대비 어느 정도인가요?
  • 용인에서는 경기도 평균 대비 얼마나 더 팔렸나요?
  • 17개의 광역지자체의 GDP에 대한 소속 기초지자체의 기여도는 얼마인가요?

Level of Detail Expressions

Include, Exclude, and Fixed

Syntax for LOD

{Include [차원1], [차원2] : SUM([측정값])}
  1. VLOD에 포함되지 않은 특정 차원을 포함하고 싶을 때 : Include
  2. VLOD에 포함된 특정 차원을 제외하고 싶을 때 : Exclude
  3. VLOD에 상관 없이 특정 차원을 고정하고 싶을 때 : Fixed

여러 개의 차원을 사용할 경우 쉼표(,)로 구분

반드시 집계값이 사용되어야 하며, ATTR 또는 테이블 계산식은 사용 불가


Include

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 표현식: 서브 카테고리 레벨에서 먼저 평균값을 구한 뒤, 두 번째 계산으로 카테고리 레벨에서 평균값을 구하는 것

핵심

Include LOD에 명시된 차원을 포함하여 집계가 이루어짐 (첫번째 단계)
VLOD에 맞추어 표현하기 위해 첫번째 계산 결과를 재집계함 (두번째 단계)

예시

각 도시(City)별 평균 매출(Sales)을 기준으로 최대-최소 편차가 다섯번째로 큰 주(State)는 어디인가요?

# Sales - Avg by City - Include
{ INCLUDE [City] : AVG([Sales]) }

  1. LOD 표현식을 최대값과 최소값으로 집계해준 뒤에, 최소값을 최대값 축에 넣어줌으로써 한 그래프로 표현한다.
  2. 측정값을 복제해서 라인 차트로 변경해준 뒤에, 측정값 이름으로 경로를 지정해주면 편차를 나타내는 그래프를 확인할 수 있다.
  3. 이중축을 설정해주고 축을 동기화하면 편차 그래프가 완성된다.
  4. 편차대로 정렬하기 위해 Diff라는 계산된 필드를 만들어준다.
    MAX([Sales - Avg by City - Include]) - MIN([Sales - Avg by City - Include])
  5. State 우클릭 - 정렬 - 필드 - Diff - 내림차순으로 설정해주면 편차가 큰 도시부터 차례대로 확인할 수 있다.

활용

Include LOD를 사용하기 위해서는 Data set의 depth가 상대적으로 깊어야 한다. 최소한 2 depth 이상이어야 활용할 수 있다.

  • 집계를 두 번 해야 할 경우(평균의 최대값, 최소값의 평균, 평균의 평균 등)
  • 재집계(두번째 계산)가 SUM이 아닌 다른 집계값일 때

Exclude

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단계에 복제할 수밖에 없다.

예시 1

각 도시(City)의 소속 주(State)에 대한 수익(Profit) 기여도를 지도에 표현해보세요.

  • 원 - 각 도시
  • 색상 - 수익 기여도 (파란색은 수익, 빨강색은 손실)
  • 크기: 수익 또는 손실 규모
# 각 도시의 수익 / 도시가 포함된 주의 수익

# Profit Contribution
SUM([Profit]) / ATTR({ EXCLUDE [City] : SUM([Profit]) })

✅ LOD 표현식은 항상 그 결과가 집계된 값이 아니라, Raw Level의 값이기 때문에 한 번 더 집계해주어야 한다.

Profit Contribution 필드를 색상으로 넣어주게 되면, 위와 같이 수익 기여도를 한 눈에 알아볼 수 있다. 음수 값이 있는 것을 보아 손실을 내고 있는 도시도 있다는 사실을 알 수 있다.

그리고 다음과 같이 ABS(SUM([Profit]))을 크기로 넣어주면, 원의 크기를 통해 각 도시의 기여 규모를 알 수 있다. 수익과 손실에 관계 없이 규모가 크면 크게, 규모가 작으면 작게 표현하기 위해 절댓값을 취해주었다.

예시 2

서브 카테고리에 대한 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보다 매출 금액이 낮은 항목들과, 높은 항목을들을 알아보기 쉽게 표현할 수 있다.

활용

  • 차원 A에 대한 하부 차원 B의 기여도를 정규화할 때
    ex. 차원 State에 대한 하부 차원 City의 기여도를 정규화
  • 특정 차원에 대한 하나의 값을 동일한 차원의 다른 값과 상대 비교할 때
    ex. Paper와 다른 서브 카테고리 항목들의 매출 비교

Utilization

대부분의 Include와 Exclude는 Fixed로 대체 가능한데, Fixed가 훨씬 사용하기 편리하다. 따라서 앞의 두가지 LOD 표현식은 상대적으로 활용도가 낮다.

Flexibility

  • 화면의 구성
    • Include & Exclude 항상 VLOD를 두고, 거기에서 더할 것이냐 뺄 것이냐를 고려한다.
    • Fixed 내가 원하는 특정 차원으로 화면을 고정시키는 것으로, 특별히 화면 안에 어떤 View가 만들어지고 있는지를 고려할 필요가 없다. 내가 선언하고 싶은 차원을 선언한 이후에, 선언한 차원에 대해서 데이터를 집계하는 것이다.
  • 결과의 종류
    • Include & Exclude 항상 결과값이 측정값만 나온다.
    • Fixed 측정값뿐만 아니라 차원도 결과값으로 나올 수 있다. 날짜 데이터가 대표적으로, 최근 한달 달, 최근 한 주와 같은 표현이 가능하다.
  • 작동의 순서
    • Include & Exclude 차원 필터(dimension filters)가 적용된 이후에 계산이 일어난다. 즉, 항상 차원 필터의 영향을 받게 된다.
    • Fixed 차원 필터 적용 이전에 작동되어서 차원 필터의 영향을 전혀 받지 않는다. 또한, 차원 필터를 컨텍스트 필터(context filters)로 만들어주게 되면 Fixed LOD 표현식 또한 필터로 제어가 가능하다.

Fixed

1️⃣ Fixed LOD에서 선언한 차원이 VLOD에 포함되어 있을 때
2️⃣ Fixed LOD에서 선언한 차원이 VLOD에 포함되어 있지 않을 때

Case 1

SAME DEPTH

# 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의 평균과 같은 그래프가 도출된다.

VLOD, deeper than Fixed LOD

태블로 뒷단에서 일어난 (1차 집계) 결과는 아까 본 Fixed-2 그래프와 같다. 서브 카테고리 레벨로 평균 Sales를 집계한다. 하지만, 아까와 달리 VLOD가 현재 Fixed LOD 안에서 선언된 레벨보다 더 깊은 수준이다. 따라서 제조사 레벨과 관계 없이, 서브 카테고리 레벨에서 계산된 평균 매출 금액에 복제되어 나온다.

핵심

  • VLOD와 Fixed LOD의 DEPTH가 같을 때: 1차 집계 결과가 그대로 표현
    (굳이 LOD 표현식을 사용할 필요가 없음)
  • VLOD가 Fixed LOD보다 더 깊을 때: 1차 집계 결과를 VLOD에 맞추기 위해 복제
    (마치 Exclude처럼)

Case 2

예시 1

왼쪽은 단순히 매출 합계를 카테고리별로 올린 것이고, 오른쪽은 서브 카테고리 레벨에서 집계된 매출 합계를 Fixed LOD로 만들어서 화면 안에 집어넣은 것이다. 놀랍게도 둘의 결과는 동일하다.

# Sales - Sum by Sub-Category - Fixed
{ FIXED [Sub-Category] : SUM([Sales]) }

위 Fixed LOD 표현식에서 태블로 뒷단에서는 다음과 같은 계산을 수행한다.

Fixed LOD 안에서 정의된 레벨은 서브 카테고리 레벨이고, 현재 VLOD에서 정의된 레벨은 보다 한 단계 높은 카테고리 레벨이기 때문에 VLOD에서 표현하기 위해 재집계가 이루어지고, 이것이 합계였기 때문에 동일한 그래프가 도출된 것이다.

예시 2

왼쪽은 Sales를 카테고리 레벨에서 평균으로 단순히 집계한 금액이고, 오른쪽은 서브 카테고리 레벨에서 평균 매출을 집계한 이후에 화면으로 Fixed LOD를 집어넣은 것이다.

지금 태블로가 작동하는 방식은 Include가 작동하는 방식과 동일하다. 일차적으로 Fixed 안에서 선언한 차원에 대해서 평균으로 집계가 이루어지고, 거기서 만들어진 레벨이 지금 화면에서 보이는 VLOD보다 더 깊기 때문에, depth가 더 얕은 VLOD로 표현되기 위해서 다시 한 번 재집계가 이루어진다.

예시 3

Fixed LOD 안에서 선언된 차원(서브 카테고리)가 포함된 화면에서, 태블로는 측정값의 존재 유무를 확인한다. 그리고 존재하는 측정값에 대해서만 2차 계산이 이루어진다.

예를 들어, Alabama 주의 Auburn이라는 도시에서는 17개의 서브 카테고리 항목 중에서 Art, Chairs, Envelopes, Labels, Paper, Storage 이렇게 여섯가지 항목에 측정값을 갖는다. 따라서 이 6개 항목의 1차 계산 결과에 대해서만 2차 계산(평균)을 수행하게 된다.

따라서 총 6가지의 항목들의 평균의 합계가 987이고, 이를 6으로 나누면 위에서 본 165라는 결괏값이 도출된다.

핵심

  • Fixed LOD 표현식에 따라 1차 집계가 이루어짐
  • Fixed LOD 표현식에서 선언되니 차원을 포함하는 레벨에서 1차 집계값이 있는지 스캔
  • VLOD에서는 존재하는 1차 집계값에 대해서만 재집계하여 화면에 표현

예시

각 지역(Region)별로 수익을 낸 주문과 손실을 낸 주문의 매출 비중을 구해보세요.

  1. 열은 합계(Sales), 행은 Region

  2. 합계(Sales) → 퀵 테이블 계산 → 구성 비율

  3. 합계(Sales) → 다음을 사용하여 계산 → 테이블(옆으로)
    (각 지역마다 100%로 만들어줌)

  4. 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
  • 필터의 영향을 받지 않는 값을 만들어야 할 때

이 외에도 수도 없이 많다!


LOD 표현식 vs 테이블 계산식

평균 라인

분석 탭의 평균 라인 집어넣기를 통해서 Include LOD 또는 Exclude LOD와 같은 결과물들을 만들어낼 수 있다.

  1. 평균 라인 - 패널 - (평균)


    Include LOD가 작동하는 방식과 동일하다.

    1차적으로 서브 카테고리 레벨에서 평균 Sales가 계산되고, 화면에서 표현되기 위해 패널별로 평균이 다시 한 번 계산된다. 즉, 서브 카테고리 레벨이 고려된 가중 평균이다.

  2. 평균 라인 - 패널 - 총계

    Exclude LOD가 작동하는 방식과 동일하다.

    서브 카테고리 레벨과 관계없이 카테고리 레벨에서 모든 매출의 합계를 더하고, 그 카테고리 레벨에 있는 데이터 행의 개수로 나눠준다.

예시

각 서브 카테고리의 평균 매출이 자기 자신이 속한 카테고리의 평균 매출과 얼마만큼 차이가 나고 있는지 표현해보세요.

VLOD에 없는 Category의 평균 매출을 구해야 되기 때문에, Fixed LOD 표현식을 이용해야 한다.

# Sales - by Category - Fixed
{ FIXED [Category] : AVG([Sales]) }
# Difference
AVG([Sales]) - AVG([Sales - by Category - Fixed])

위 그래프와 같이 각 서브 카테고리의 평균 매출과 자신이 속한 카테고리의 평균 매출의 차이를 표현할 수 있다.

테이블 계산식은 화면의 특정한 조건에 따라서 계산이 되는 것이기 때문에, 화면 안에 없는 필드에 대해서는 계산이 불가능하다.

핵심

테이블 계산식 대비 LOD 표현식의 강점은 유연성이다. 참조선(테이블 계산식)은 VLOD에 없는 차원에 대한 계산 결과를 절대로 만들어 낼 수 없다.

profile
Yonsei University, Applied Statistics
post-custom-banner

0개의 댓글