12.5 计算同比和环比
## 了解同比和环比
同比和环比是考察数据变化的两项常用的指标,它们都是基于时间周期的对比,得到的结果都是百分比,区别在于各自对标的周期(基期)不同。### 何为同比
与历史同时期的比较,例如将 2019 年 11 月的数据与 2018 年 11 月的数据相比,叫同比。同比一般情况下是今年与去年的比较。同比可以用来观察今年和去年相对发展水平的变化。
- 同比增长(下降)率=(本期数-去年同期数)/去年同期数×100%
何为环比
与上一个统计周期的比较,例如将 2019 年 11 月的数据和 2019 年 10 月的数据相比,叫环比。环比使用的统计周期是连续的,一般情况下使用周、月或者自定义的一段日期。环比反应的是本期与上期相比的变化情况。 - 环比增长(下降)率=(本期数-上期数)/上期数×100% 同比和环比 图片:百度百科### 同比和环比的区别 同比和环比都是反映变化速度的指标,由于两者采用的基期不同,因此指标的含义也不同。两者不能拿来直接比较,例如环比不能与同比比较,但是环比可以与环比比较。同比和环比是两种不同的比较方式,同比针对同一时期进行对比,观察每一个时期是否有变化,而环比则是连续性的,可以反映出季节性的变化,同时进行调整。我们在制作报告的时候,尤其是经济报告,都会使用同比和环比的数据进行分析。## 计算同比和环比 DAX 通过时间智能函数快速计算标准日期区间(比如年、季度、月、日)的同比和环比,我们将指标拆解开,会发现它们的本质都是对日期区间的计算,同比需要计算去年同期值,环比计算的是平移后的日期区间。### 计算标准周期 从上一年(Previous Year 简称 PY)中获得数据对于比较今年和去年同期的趋势很有用,使用以下 DAX 表达式可以快速计算:
- [PY Sales] := CALCULATE ( [Sales Amount], SAMEPERIODLASTYEAR ( ‘Date’[Date] ) ) SAMEPERIODLASTYEAR 返回一年前的同一组日期。它是更通用的 DATEADD 函数的一个专用版本,DATEADD 可以定义需要移动的周期的数量和类型。支持的期间类型是年、季度、月和日。例如,你可以使用以下等价表达式定义相同的 PY Sales:
- [PY Sales] := CALCULATE( [Sales Amount], DATEADD( ‘Date’[Date], -1, YEAR ) ) 以类似的方式,你可以计算前一个季度(PQ)、月份(PM)或日(PD)的值,如下面的示例所示:
- [PQ Sales] := CALCULATE ( [Sales Amount], DATEADD ( ‘Date’[Date], -1, QUARTER ) )
- [PM Sales] := CALCULATE ( [Sales Amount], DATEADD ( ‘Date’[Date], -1, MONTH ) )
- [PD Sales] := CALCULATE ( [Sales Amount], DATEADD ( ‘Date’[Date], -1, DAY ) )
始终计算完整周期
有时,你需要查看上一年度的总金额,并将其与年初至今的总金额进行比较。为此,你可以使用 PARALLELPERIOD,它与 DATEADD 类似,但会返回第三个参数中指定的完整周期,而不是 DATEADD 返回的部分周期。你可以定义这样一个 PY Sales,它计算的是上一年的销售总额: - [PY Total Sales] := CALCULATE ( [Sales Amount],
- PARALLELPERIOD ( ‘Date’[Date], -1, YEAR ) ) 在图 7-18 中,可以看到 PY Sales 和 PY Total Sales 的结果。报告的 PY Sales 列 2009 年各季度的结果显示了对应的 2008 年各季度的销售额数据。PY Total Sales 列每期计算了上一年的销售总额图 7-18 对上一年数据的计算将当前周期的结果平移了一年PY Total Sales 可以用来计算当前年度至今与上年度总计的比率,它提供了一个简单的关键绩效指标(KPI)来检测当前年度YTD销售额是否达到上年度的总销售额。如图 7-18 所示,YTDOPYT Sales%度量值使用以下公式计算了年初至今的销售额占前一年总销售额的比率:
- [YTDOPYT Sales %] := DIVIDE ( [YTD Sales], [PY Total Sales] )
计算上一年的 YTD
你还可以将当前年度的YTD数据与前一年同期的YTD结果做对比,当需要计算前一年 YTD 时,可以混合使用目前学到的两种技术。这时你不能将 Date[Date]参数(它对应于当前筛选下文中活动的日期列表)直接传递给 SAMEPERIODLASTYEAR,而是需要使用 DATESYTD 函数对日期列表进行转换,先定义出当前年度下 YTD 使用的日期列表。但是,你也可以在不影响结果的情况下反转这些调用的顺序。以下两种关于 PY YTD Sales 的定义是等价的,即使第二种可能会稍微快一些(但几乎不可检测)。
- [PY YTD Sales] := CALCULATE ( [Sales Amount],
- SAMEPERIODLASTYEAR ( DATESYTD ( ‘Date’[Date] ) ) )
- [PY YTD Sales] := CALCULATE ( [Sales Amount],
- DATESYTD ( SAMEPERIODLASTYEAR ( ‘Date’[Date] ) ) ) 你可以使用返回上一年日期列表的公式作为计算 YTD 度量值的筛选器参数,或者将返回 YTD 时间列表的公式作为计算去年同期度量值的筛选器参数,你可以使用这两种方式定义 PY YTD Sales,它们与之前的两个公式等价。
- [PY YTD Sales] := CALCULATE ( [YTD Sales], SAMEPERIODLASTYEAR ( ‘Date’[Date] ) )
- [PY YTD Sales] := CALCULATE ( [PY Sales], DATESYTD ( ‘Date’[Date] ) ) 你可以在图 7-19 中看到 PY YTD Sales 的结果,YTD Sales 的值是前者平移一年的结果,在相同的报告中,你还可以看到在上一节末尾使用的 Fiscal YTD Sales 指标。请注意,财年 YTD 的计算在每年的第三季度重新开始图 7-19 上一年的 YTD 数据和财年数据可以出现在同一张报告中你在本节中看到的所有示例都可以在年、季度、月和日级别上运行,但不能在周级别上运行。时间智能函数不适用于周级别的计算,因为对周的定义多种多样。因此,你必须自己操作 DAX 表达式来处理基于周的计算。你可以在本章后面的文章中找到这种方法的更多细节和示例### 计算周期差值 当需要计算同比或环比的变化率时,我们要计算度量值的基期数据与当前结果的差异,你可以用绝对值或百分比来表示这种差异,上一节我们已经学习了如何通过 PY Sales 获得上一年度的值:
- [PY Sales] := CALCULATE ( [Sales Amount], SAMEPERIODLASTYEAR ( ‘Date’[Date] ) ) 计算当前销售金额与去年同期的绝对差异(年同比,简写 YOY)可以使用简单的减法。你可以用下面的表达式来定义 YOY Sales 指标:
- [YOY Sales] := [Sales Amount] - [PY Sales] 将年初至今的数据与上一年的相应结果进行比较也可以采用类似方法,即直接把两项指标,YTD Sales 和 PY YTD Sales 相减,你在上一节中已经知晓它们的公式写法,这里再重复一遍,作为提醒:
- [YTD Sales] := TOTALYTD ( [Sales Amount], ‘Date’[Date] )
- [PY YTD Sales] := CALCULATE ([Sales Amount],
- DATESYTD ( SAMEPERIODLASTYEAR ( ‘Date’[Date] ) ) )
- [YOY YTD Sales] := [YTD Sales] - [PY YTD Sales] 多数情况下,在报告中展示年同比差异最好使用百分比形式,比如用 YOY Sales 除以 PY Sales。通过这种方式,差异使用上一期的值作为百分比的基准线(100%对应一年内翻倍)。在定义 YOY Sales% 的下列表达式中,如果上一年数据为空,DIVIDE 函数可以避免除数为零的错误出现: