기간이 동적으로 변하는 태블로 그래프 만들기

태블로에서 매개변수와 LOD 함수를 활용하여 일별, 주별, 월별 기간 데이터를 하나의 시트에서 동적으로 적용하는 방법
민정수's avatar
Mar 24, 2024
기간이 동적으로 변하는 태블로 그래프 만들기

Intro

아마도 사람들이 태블로에서 가장 많이 활용하는 그래프는 시간 흐름에 따른 트렌드를 보여주는 그래프일 것입니다. 저도 이러한 트렌드 그래프들을 월별, 주별, 일별 그래프를 각각 따로 만들고, 하나의 대시보드에 넣어서 확인하곤 했습니다. 하지만 이와 같이 활용했을 때 제가 경험했던 문제점은 아래와 같았습니다.

  • 대시보드에서 공간을 너무 많이 차지한다.

  • 수정사항이 발생했을 때 여러 시트들을 똑같이 수정해야해서 귀찮다.

하나의 시트 안에서 매개 변수를 활용하여 집계 기간을 동적으로 설정하면 이와 같은 문제를 해결할 수 있습니다. 인터넷 서치 및 강의 등을 통해 습득했던 지식과 제가 추가로 디벨롭한 부분을 반영하여 적용해두었으니, 비슷한 고민을 하셨던 분들에게 이 활용사례가 도움이 되었으면 합니다 :)

예시

데이터는 태블로의 슈퍼스토어 - 샘플 데이터를 활용하였습니다.

날짜 및 시간 관련 필드 만들기

집계 기간을 월별, 주별, 일별로 나누어서 확인하기 위해 각각의 필드를 생성하는 과정입니다. 이미 데이터 셋에 집계 기간이 나뉘어져 있다면 이 과정은 생략하셔도 됩니다.

[주문 날짜 (연도/월)]

샘플 데이터에 포함된 "주문 날짜" 필드를 사용자 지정 날짜 기능을 활용하여 연도/월 필드를 생성하였습니다.

[주문 날짜 (주차)]

str(year([주문 날짜])) + "-" + str(WEEK([주문 날짜]))

위와 같은 함수를 사용하여 연도별로 주차가 구분되는 필드를 생성하였습니다.

매개변수 및 집계 기간 필드 만들기

"기간 선택"이라는 매개 변수를 생성하고 옵션으로 사용할 기간을 목록에 추가합니다. 예시에서는 "일별", "주별", "월별"을 목록으로 사용합니다.

[집계 기간]

case [기간 선택]
when "일별"
then str([주문 날짜])
when "주별"
then str([주문 날짜 (주차)])
when "월별"
then str([주문 날짜 (연도/월)])
end

"집계 기간"이라는 계산된 필드를 생성하고 위와 같이 CASE 문을 활용하여 매개변수에 따라 다른 필드를 참조하도록 함수를 구성합니다. CASE 문을 활용할 때는 THEN으로 반환하는 값의 데이터 유형이 일치하지 않으면 에러가 발생하기 때문에 예시에서는 str로 데이터 타입을 일치시켰습니다.

그래프 만들고 적용하기

위에서 만든 집계 기간 필드를 활용하여, 집계 기간을 열로 두고 매출 값을 행으로 두는 간단한 막대 그래프를 생성하였습니다.

위에서 생성한 "기간 선택" 매개변수를 우클릭하여 "매개 변수 표시"를 선택합니다.

기간 선택에서 옵션을 변경할 때마다 집계 기간이 동적으로 변하는 그래프가 생성되었습니다.

심화 활용 - 집계 기간별로 다른 필터 적용하기

위에서 생성한 동적 그래프는 최초에 고민했던 두 가지 문제를 해결해주었지만 아래와 같은 새로운 문제가 있습니다.

  • 일별, 주별 데이터는 너무 많은 데이터를 보여준다

  • 내가 원하는 기간의 데이터를 한 눈에 파악하기 어렵다.

이 문제를 해결하기 위해 내가 집중해서 보고 싶은 "연도/월"을 설정하고, 이에 따라 집계 기간을 변경할 때 동적으로 적용되는 필터를 생성해보겠습니다.

위와 같이 시트 또는 대시보드에서 집중해서 보고 싶은 연도/월을 선택할 수 있도록 하는 매개변수를 생성합니다.

[Max Date Of Yearmonth]

{FIXED :
MAX(
IF DATETRUNC('month', [주문 날짜]) =
DATE(LEFT(STR([연도/월 선택]), 4) + '-' + RIGHT(STR([연도/월 선택]), 2) + '-01')
THEN [주문 날짜]
END)}

"Max Date Of Yearmonth" 라는 필드를 생성하고, 현재 선택한 연도/월 범위 내에서 Raw Data의 날짜 데이터 중 최대 날짜를 계산하는 LOD 함수를 작성합니다.

함수 설명

  • 이 태블로 함수는 특정 연도와 월을 선택했을 때, 해당 연도와 월에 속하는 주문 날짜 중 가장 큰(최신) 날짜를 반환하는 역할을 합니다. 함수를 부분별로 분석해보겠습니다.

    1. DATETRUNC('month', [주문 날짜]) :

      • [주문 날짜] 필드의 값을 월 단위로 잘라냅니다.

      • 예를 들어, '2023-04-15'라는 값이 있다면 '2023-04-01'로 변환됩니다.

    2. LEFT(STR([연도/월 선택]), 4) :

      • [연도/월 선택] 필드의 값을 문자열로 변환한 후, 왼쪽에서 4글자를 추출합니다.

      • 예를 들어, [연도/월 선택] 값이 202304라면 '2023'이 추출됩니다.

    3. RIGHT(STR([연도/월 선택]), 2) :

      • [연도/월 선택] 필드의 값을 문자열로 변환한 후, 오른쪽에서 2글자를 추출합니다.

      • 예를 들어, [연도/월 선택] 값이 202304라면 '04'가 추출됩니다.

    4. DATE(LEFT(STR([연도/월 선택]), 4) + '-' + RIGHT(STR([연도/월 선택]), 2) + '-01') :

      • 2번과 3번에서 추출한 연도와 월을 이용해 'YYYY-MM-01' 형식의 날짜를 생성합니다.

      • 예를 들어, [연도/월 선택]이 202304라면 '2023-04-01'이라는 날짜가 생성됩니다.

    5. IF DATETRUNC('month', [주문 날짜]) = DATE(...) THEN [주문 날짜] END :

      • [주문 날짜]를 월 단위로 잘라낸 값과 4번에서 생성한 날짜가 같다면 해당 [주문 날짜] 값을 반환합니다.

      • 즉, [연도/월 선택]과 동일한 연도와 월에 해당하는 [주문 날짜] 값들만 필터링됩니다.

    6. MAX(...) :

      • 5번에서 필터링된 [주문 날짜] 값들 중 가장 큰(최신) 값을 반환합니다.

    종합하면, 이 함수는 [연도/월 선택] 필드에서 선택한 연도와 월에 해당하는 [주문 날짜] 중 가장 최신 날짜를 반환하는 역할을 합니다. 이를 통해 선택한 연도와 월의 마지막 주문 날짜를 알 수 있습니다.

[Min Date Of Selected Period]

CASE [기간 선택]
  WHEN "월별" THEN {FIXED : min([주문 날짜])}
  WHEN "주별" THEN {FIXED [연도/월 선택] : MIN(IF [주문 날짜] >= DATEADD('day', -28, [Max Date Of Yearmonth]) THEN [주문 날짜] END)}
  WHEN "일별" THEN {FIXED [연도/월 선택] : MIN(IF [주문 날짜] >= DATEADD('day', -14, [Max Date Of Yearmonth]) THEN [주문 날짜] END)}
END

"Min Date Of Selected Period" 라는 필드를 생성하고, CASE 문을 활용하여 선택한 기간에 대해 시트에서 노출할 최소 날짜를 계산하는 필드를 생성합니다.

함수 설명

  • 이 태블로 함수는 [기간 선택] 필드의 값에 따라 다른 날짜를 반환하는 역할을 합니다. 각 WHEN 절을 분석해보겠습니다.

    1. WHEN "월별" THEN {FIXED : min([주문 날짜])} :

      • [기간 선택]이 "월별"일 때, [주문 날짜] 중 가장 작은(가장 오래된) 날짜를 반환합니다.

      • FIXED 함수를 사용하여 모든 레코드에 대해 동일한 값을 반환합니다.

    2. WHEN "주별" THEN {FIXED [연도/월 선택] : MIN(IF [주문 날짜] >= DATEADD('day', -28, [Max Date Of Yearmonth]) THEN [주문 날짜] END)} :

      • [기간 선택]이 "주별"일 때, [연도/월 선택]에 해당하는 달의 마지막 날짜([Max Date Of Yearmonth])로부터 28일 전 이후의 [주문 날짜] 중 가장 작은(가장 오래된) 날짜를 반환합니다.

      • 즉, [연도/월 선택]으로 선택한 달의 마지막 날짜를 기준으로 4주(28일) 이내의 주문 날짜 중 가장 오래된 날짜를 반환합니다.

      • FIXED 함수를 사용하여 [연도/월 선택]별로 그룹화하여 계산합니다.

    3. WHEN "일별" THEN {FIXED [연도/월 선택] : MIN(IF [주문 날짜] >= DATEADD('day', -14, [Max Date Of Yearmonth]) THEN [주문 날짜] END)} :

      • [기간 선택]이 "일별"일 때, [연도/월 선택]에 해당하는 달의 마지막 날짜([Max Date Of Yearmonth])로부터 14일 전 이후의 [주문 날짜] 중 가장 작은(가장 오래된) 날짜를 반환합니다.

      • 즉, [연도/월 선택]으로 선택한 달의 마지막 날짜를 기준으로 2주(14일) 이내의 주문 날짜 중 가장 오래된 날짜를 반환합니다.

      • FIXED 함수를 사용하여 [연도/월 선택]별로 그룹화하여 계산합니다.

    종합하면, 이 함수는 [기간 선택]에 따라 다음과 같은 날짜를 반환합니다:

    • "월별": 전체 기간 중 가장 오래된 주문 날짜

    • "주별": 선택한 연도/월의 마지막 날짜로부터 4주 이내의 가장 오래된 주문 날짜

    • "일별": 선택한 연도/월의 마지막 날짜로부터 2주 이내의 가장 오래된 주문 날짜

    이를 통해 선택한 기간 범위 내에서 가장 오래된 주문 날짜를 알 수 있습니다.

위의 두 예시에서는 IF 문을 활용하여 조건부 집계 함수(MIX, MAX)를 사용하였는데, 이 부분에 대해서는 추후에 기회가 된다면 따로 글을 작성해보도록 하겠습니다. 우선 이런식으로 활용이 가능하다는 점 정도만 참고해주시면 좋을 것 같습니다.

또한 -14일, -28일과 같은 수치는 현재 사용하고 계시는 대시보드 환경에 맞게 다른 값을 넣어서 사용하시거나, 이 또한 매개변수로 관리하여 사용하시면 됩니다.

[기간별 필터]

[주문 날짜] >= [Min Date Of Selected Period]
and
[주문 날짜] <=[Max Date Of Yearmonth]

마지막으로 "기간별 필터"라는 필드를 생성하고 위에서 만든 최소 날짜와 최대 날짜를 모두 만족하는 경우에 True를 반환하도록 하는 함수를 작성합니다. 이렇게 생성한 필터를 시트에 적용하면 아래와 같이 선택한 연도/월에 맞게 특정 기간의 데이터를 포커스하여 노출시킬 수 있습니다.

작성한 컨텐츠에 대해 궁금하신 부분이 있다면 하단의 Contact 버튼을 클릭하여 링크드인으로 문의주시면 답변드리겠습니다!

Share article

growthwiki