상세 컨텐츠

본문 제목

[Tableau 시각화 스터디] 2022 Week2: Can you build a weekly Year-over-year line chart?

심화 스터디/Tableau 시각화 스터디

by williams_3530 2023. 3. 14. 20:58

본문

작성자 : 15기 염윤석

https://workout-wednesday.com/2022w02tab/

 

WOW2022 Week 2: Can you build a weekly Year-over-Year line chart? – Workout Wednesday

I’m excited to join the Workout Wednesday coaching team this year! For my first challenge, I’m pulling from some recent work experience. Our leadership team wanted to see weekly performance for the week ending Sunday, with the current and prior 2 years

workout-wednesday.com

 

 

Data and Purpose

Superstore Sales Growth

  • weekly performance를 시각화(최근 2년 사이 데이터를 통해)
  • YoY% change(year over year)를 관찰, 즉 current, previous, 2 years ago를 구별해서 표현

Requirements를 바탕으로 시각화 시작하기!

1. parameter(매개변수) 형성( 12/1/2021 Today로 형성 ) & Normalized Date 계산

매개변수 만들기> 2021.12.1을 "오늘"로 설정하여 기준 잡기

계산식 필드 만들기 > Norm Date 라는 필드 만들기 > 연속형 변수로 변환

3년치 다른 날짜들을 week 레벨에서 맞춰주기 위함이다.

DATE(
    DATEADD('year',
            DATEDIFF('year', datetrunc('week',[Order Date],'Monday'), [fake today]),
            DATETRUNC('week', [Order Date],'Monday')
            )
)

- DATE: 숫자, 문자열 등을 날짜 형식으로 변환

- DATEADD(date_part, interval, date)
	date_part 레벨에서 date에 interval만큼의 날짜를 더해서 반환
	- date_part : year 레벨
	- interval : "fake today" 기준 각 order date에 상응하는 주의 월요일과 차이나는 년수
	- date : 각 주문 날짜들의 week 레벨에서의 대표 날짜
	즉, 대표날짜에서 기준에서 차이나는 년수만큼 더 해줘서, 3년치 날짜들을 1년 날짜들로 대응시킨다.

- DATEDIFF(date_part, date1, date2, [start_of_week]) : 두 날짜 사이 interval 반환
	- date_part :  year 레벨
	- date1 : 각 order date를 포함하는 week의 월요일 날짜
	- date2 : fake today
	-> date1, date2 사이 년수를 반환
	즉 fake today(기준)에서 각 주문 날짜의 대표날짜들과의 년수 차이

- DATETRUNC(date_part, date, [start_of_week]) : 날짜 반올림 함수
	week 레벨에서 각 order Date를 포함하는 week의 월요일 날짜를 반환
	즉 각 주문날짜들의 week 레벨에서의 대표 날짜

2. Sales-Norm date line 차트만들고 년별로 구분하기

“Sales Filter”라는 계산식 필터를 통해 21.12.1보다 넘어가는 날짜들은 모두 제외한다. >  "필터"로 드레그해서 적용

Sales Filter
[Order Date] <= [fake today]

계산식을 이용하여 fake today를 기준으로 Previous,Current, 2yrs Ago 구별하기→ “Sales Filter”

# 구별하기 위한 filter 계산식 : Periods

if YEAR(DATETRUNC('week', [Order Date],'Monday')) = year([fake today]) then '3'
ELSEIF YEAR(DATETRUNC('week', [Order Date],'Monday')) = year([fake today])-1 then '2'
ELSEIF YEAR(DATETRUNC('week', [Order Date],'Monday')) = year([fake today])-2 then '1'
END

필터 적용 후 -> exlude "NULL" -> 1,2,3만 나타난다.
이후 Period 계산 차원을 색깔에 적용하여 구분하기
별칭 편집으로 label 명을 1,2,3에서 바꿔준다.
	**왜 처음부터 계산식에 별칭명을 쓰면 안되는 이유
	 -> 알파벳 순서대로는 "2yrs Ago"가 맨 처음이기에, 이후, YoY% 구할 때 순서가 바뀌게 된다.
		-> 그래서 맞는 순서를 만들기 위해, 1,2,3을 이용한 것이다.

별칭 편집으로 해야하는 이유가 있다.

 

3. YoY%(year over year) calculation change by week

다음 시트를 만들어서 > YoY%를 계산하기 위한 차트를 만든다.

Norm date + Periods --> 정렬하기

계산된 필드만들기 >  Index Sales, Comparison, Sales Difference, YoY% 필드 만들기 > 차트 표에 추가한다.

# YoY calculation
1. Index Sales : 각 Periods의 sales 합계값
	SUM([Sales])
2. Comparison
	LOOKUP([Index Sales], 1)
	- 1 행에서 Index Sales값 반환  = 정확히는 1행 table down 값들 반환
	- 전년도 Sales 값 반환
	- 한 행씩 down 됐기에 변화정도를 비교할 수 있게 된다.
	- Table down이 아니라, Periods를 기준으로 테이블 계산을 하게 하도록 만든다.
		(각 주차별로 비교를 해야지 같은 주가 아닌 period간의 계산을 피하기 위함이다.)
	

3. Sales Differences
	[Index Sales] - [Comparison]

4. YoY%
	[Sales Difference]/[Comparison]
	-> 이후 기본속성 > 숫자 형식 > 백분율 > 소수 점 자리수 1자리로

Table Down이 아닌 Periods기준으로 만든다. / Sales Difference , YoY%를 계산식으로 구한 모습

이후 다시 라인차트 시트로 돌아간다 > 라인차트 마크들에 YoY% 값 표시하기 >  Tool Tip부분에 드레그해서 적용한다.

특히 차트 상에서도 Current - Previous- 2yrs 순서 유지해야한다. → 우측 상단에서 차트 순서를 바꾼다.

 

4. Match formatting and tooltips

YoY% 필드 > 기본 속성 > 숫자 형식 > 사용자 지정 > ▲0.0%;▼0.0%;0.0%

다음과 같이 숫자 형식이 바뀐 모습

이후 각 라인차트의 색상을 바꿔준다.

  • Current (#9CBE30)
  • Previous(#A0CBE8)
  • 2 Yrs Ago (#BFBFBF)
# YoY title 계산 필드 만들기
IIF([Periods] = {min([Periods])},'','YoY%: ')

	- Periods가 최소(즉, 1, 2yrs ago)일 경우, ''
	- 그 외는 "YoY%: "로 서식 변경
IFF 는 선택지가 두개일 때 사용 가능하다.

이후, 다음과 같이 계산된 필드를 하나 더 만들어서 ToolTip 서식에 적용한다. > 이는 변화율이 없는  2yrs Ago의 경우 YoY%값이 나오지 않게 하기 위함이다.

 

Tool Tip을 더블클릭해서 서식 내용을 변경한다.

Week of <주(Norm Date)>
Period:	<Periods>

Sales: <합계(Sales)>
<특성(YoY Tooltip Title)><집계(YoY%)>

도구설명(Tooltip)이 바뀐 모습이다

5. Create a filter to exclude the incomplete week

마지막으로 2021.12.1은 수요일이므로 아직 한 주가 채워지지 않은 데이터이므로 이와 같은 경우에 대해 필터를 적용하여 제거한다.

계산된 필드 형성 > Exclude filter > 필터 적용

# 계산식을 이용한 filter 형성: Exclude filter
[답안지 제시]
DATETRUNC('week',[Order Date])<>{MAX(DATETRUNC('week',[fake today]))}

<> = not equal(같지 않음)
- DATETRUNC('week', [Order Date]): 각 주문 날짜를 포함하는 주의 첫날
- DATETRUNC('week',[fake today]): fake today(21.12.1 수요일)를 포함하는 주의 첫날
- max(날짜) : 가장 최근 날짜 -> 왜 쓰는가? : 가장 최근이 월요일 21.11.28을 의미?

날짜가 다른 것들만 가져온다. = 같은 것인 21.11.28 내용은 지운다.

 

최종 완성된 대시보드

https://public.tableau.com/app/profile/.45985563/viz/wow2022_week2/1?publish=yes 

 

wow2022_week2

wow2022_week2

public.tableau.com

 

관련글 더보기

댓글 영역