按周進行數據分析,在零售業、電商等類型的公司中很常見,但是不少人覺得按周進行分析無從下手,一個主要的原因是找不到對應的函數,因為時間智能函數只對應年、季、月、天這幾個粒度,沒有關於周的時間智能函數。
沒有相應的函數當然也能搞定,本文就介紹幾種常見的周分析的思路,掌握后就可以靈活地進行各種時間分析。
進行周分析之前,我們首先應該構造含有周序列的日期表。
創建日期表
在日期表中,應該包含每個日期是周幾,以及屬於一年中的第幾周的數據,這里直接用DAX生成一個日期表,
日期表 =
ADDCOLUMNS(
ADDCOLUMNS (
CALENDAR (DATE(2016,1,1), DATE(2017,12,31)),
"年度", YEAR ( [Date] ),
"季度", "Q" & FORMAT ( [Date], "Q" ),
"月份", FORMAT ( [Date], "MM" ),
"日",FORMAT ( [Date], "DD" ),
"年度季度", FORMAT ( [Date], "YYYY" ) & "Q" & FORMAT ( [Date], "Q" ),
"年度月份", FORMAT ( [Date], "YYYY/MM" ),
"周幾", WEEKDAY ( [Date],2 ),
"周數",WEEKNUM([Date],2)
),
"年度周數",[年度]*100+[周數]
)
其中主要是兩個有關周的函數,WEEKDAY和WEEKNUM。
WEEKDAY返回當前日期是星期幾,其中第二個參數可以控制每周是從哪一天開始的,
- 參數為1時:周日為第一天,編號為1到7.
- 參數為2時:周一為第一天,編號為1到7.
- 參數為3時:周日為第一天,編號為0到6.
WEEKNUM返回當前日期屬於當年的第幾周,其中第二個參數可以控制每周的第一天是周日還是周一,
- 參數為1時:周日為第一天
- 參數為2時:周一為第一天
每個單位進行周分析的習慣或者考核周期不一樣,就可以通過這兩個函數的參數,來調整周開始的時間。
這里我們使用國內常用的周一作為第一天。
並且為了使每年的周數具有唯一性,添加了年度周數的字段。有了這個日期表,進行各種周分析就很方便了。
上周同期
上周同期,就是上周的今天,比如今天是星期三,上周同期就是計算上個星期三的數據,其實就是向過去移動7天,那么度量值可以這樣寫:
上周同期 銷售額 =
CALCULATE(
[銷售金額],
DATEADD('日期表'[日期],-7,DAY)
)
本周至今
時間智能函數中有本年至今YTD、本季至今QTD和本月至今MTD,但沒有本周至今(可以稱為WTD),那么我們自己來構造一個WTD,實際就是周數相同的,小於等於當天的這幾日的數據;
本周至今WTD =
VAR curyearweek=SELECTEDVALUE('日期表'[年度周數])
RETURN
CALCULATE(
[銷售金額],
FILTER(
ALL('日期表'),
'日期表'[年度周數]=curyearweek
&&'日期表'[日期]<=MAX('日期表'[日期])
)
)
周環比
計算周環比,實際上就是本周數據和上周數據的對比,只要計算出上周累計的數據,周環比也就可以簡單的計算出來了。
上周累計 =
VAR curyear= SELECTEDVALUE('日期表'[年度])
VAR curweeknum=SELECTEDVALUE('日期表'[周數])
RETURN
CALCULATE(
[銷售金額],
FILTER(
ALL('日期表'),
'日期表'[年度]=curyear
&&'日期表'[周數]=curweeknum-1
)
)
周環比 = DIVIDE([銷售金額],[上周累計])-1
你可能注意到了,第一周的數據比較異常,主要是由於第一周沒有上期數據,並且第一周的天數很可能不完整,所以數據會比較異常。關於這個問題並沒有統一的解決方式,主要是根據自己公司的業務分析習慣,或者管理與考核的要求,進行具體的微調。
通過以上幾種常見的周分析思路,你應該感覺到對周進行分析並不難,熟練運用VAR和CALCULATE+FILTER+ALL函數組合,靈活篩選時間段,不僅是對周,對各種不規則的時間序列都可以進行靈活分析,當然,最重要的是,先構建一個滿足分析需要的日期表。