创建预测
将历史数据扩展到未来。

开始你的预测
你现在已将数据从 Metabase 指标存储导入到电子表格中。这构成了你的历史数据(在财务术语中称为“实际数据”)。
在大多数模型中,下一步是创建你的预测(也称为预报)。请注意,预报基于预期的行动方案,而预测基于各种假设情况(但这两个术语经常互换使用)。
什么是预测?为什么要进行预测?
当你进行预测时,你是在尝试预测某个系统未来将如何发展。常见示例如下:
- 天气预报:对未来几天特定地理区域天气的预测。
- 通过建模随时间变化的感染患者数量来预测流行病的传播。
- 建模业务的客户增长。
通常有两个原因需要进行预测:
- 决定如何应对结果。 掌握准确的天气预报,我可以决定明天是否去徒步旅行。或者在更极端的情况下,我可以决定是否在飓风来临前撤离。
- 决定如何影响结果。 很难影响明天的天气,但有些结果你可以影响。如果你正在考虑今天是否额外花费10万美元用于营销活动,了解它未来对客户数量可能产生的影响,可以帮助你决定该活动是否值得投资。
预测通常基于两个要素:
- 历史观测。
- 理解系统如何运作。
预测与猜测有着根本的区别。你可以猜测明天是否会有飓风,但这种猜测并不是决定是否撤离家园的好理由。
相反,你更愿意依赖天气预报,气象学家根据对过去和当前天气状况的详细观测,结合对天气模式如何演变的(复杂)理解来制作预报。当然,预报可能会出错,但预报越准确,出错的可能性就越低。
示例:预测水库水位
在接下来的两个关于预测和场景的模块中,我们将通过一个示例来阐述概念:管理水库水位。
想象一下你是你所在地区水库的管理者。当地居民使用水库中的水进行饮用、洗涤、水球大战等等。河流和运河会随着时间补充水库。
作为一名负责任的水库管理者,你需要监测水位。你还希望预测水位如何随时间变化。
预测水库水位可能看起来是一个随机的例子,但请耐心听我们解释。水流入和流出水库的情况,恰好很好地类比了订阅业务中客户的流入和流出。
月末水库水量的基本计算方法是:
期末水位 = 期初水位 + 雨水流入量(来自河流)- 居民用水流出量
假设你对每月平均流入的水量有很好的掌握。你感兴趣的是预测流出部分。
你的基本计算方法是:
水流出量 = 当地人口 * 每位居民用水量
在电子表格模型中,你会这样设置:
月份 | 一月 | 二月 | 三月 |
---|---|---|---|
当地人口 | 100,000 | 100,000 | 100,000 |
每位居民每月用水量,立方米 | 10 | 10 | 10 |
每月总水流出量,立方米 | 1m | 1m | 1m |
如何创建预报
通常,你会从一个单一的预报开始,这是你对未来的核心看法。
回到我们的电子表格模型,我们已经从 Metabase 导入了大量实际数据。以水库为例,我们的电子表格看起来是这样的:
月份 | 一月 | 二月 | 三月 |
---|---|---|---|
实际数据 (A) 或预测数据 (P) | (A) | (A) | (A) |
当地人口 | 100,000 | 100,000 | 100,000 |
每位居民每月用水量,立方米 | 10 | 10 | 10 |
每月总水流出量,立方米 | 1m | 1m | 1m |
我们有3个时间序列(人口、用水量和总水流出量)。为了创建我们的预报,我们需要将这些时间序列向前预测。
识别并建模你的驱动时间序列
你如何将这些时间序列向前预测?回到你最初创建预报的原因,你想要知道的数字是每月的用水流出量。但孤立地预测流出量是困难的。通常你会将流出量分解成其组成部分,直到你得到可以预测的东西。
在我们的案例中,我们将指标分解为:
水流出量 = 当地人口 * 每位居民用水量
我们可以合理准确地预测这个方程中的最后两个变量:
- 你查看了当地研究,历史上当地人口每年增长6%,预计将继续如此(每月大约0.5%,不考虑复利)。
- 当你回顾过去的数据并将用水量与人口进行比较时,你发现每位居民的用水量每年基本保持在10立方米。
凭借这些知识,你可以预测这两个驱动时间序列。
月份 | 三月 | 四月 | 五月 |
---|---|---|---|
实际数据 (A) 或预测数据 (P) | (A) | (P) | (P) |
当地人口 | 100,000 | 100,500 | 101,000 |
每位居民每月用水量,立方米 | 10 | 10 | 10 |
每月总水流出量,立方米 | 1m | ? | ? |
从这里,你可以使用以下公式(参见公式列)预测你的因变量时间序列,即每月总水流出量:
月份 | 三月 | 四月 | 五月 | 公式 |
---|---|---|---|---|
实际数据 (A) 或预测数据 (P) | (A) | (P) | (P) | |
当地人口 | 100,000 | 100,500 | 101,000 | A |
每位居民每月用水量,立方米 | 10 | 10 | 10 | B |
每月总水流出量,立方米 | 1m | 1.005m | 1.01m | A * B |
总结一下,我们从我们想知道的因变量时间序列(每月水流出量)开始,然后将其分解为可以独立预测的组成部分,这些组成部分就是我们的驱动时间序列。
什么是好的驱动时间序列?
从根本上说,驱动时间序列需要是可以独立预测的。这里面有判断的成分。对于当地人口,我们假设你有所谓的每年6%增长率的可靠来源。这样一来似乎是合理的。
但是,如果你无法直接预测你选择的驱动因素,你需要将它们分解成各自的驱动时间序列。例如,你可能想将每位居民的用水量分解成其自身的驱动因素:
每位居民用水量 = 每位居民饮用水量 + 每位居民后院平均面积 * 每单位后院面积用水量
请注意,你可以在这里不断深入,将驱动因素进一步分解。分解的深度将决定你模型的复杂程度。但这里存在一个权衡。通常,你的模型越复杂,你花在构建、更新和调试上的时间就越多——而这些工作可能并不会带来更好的预测。
选择你可以影响的驱动因素也很有帮助。例如,在财务模型中,产品成本是一个很好的驱动因素,因为你决定了产品的成本。此外,你很可能希望看到价格变化的影响,因此将产品成本用作驱动因素是个好主意。
预测驱动时间序列的方法
让我们来了解如何为基线模型创建预测。也就是说,你正在尝试根据驱动因素过去的行为,尽可能忠实地预测它们。在下一个模块中,我们将讨论如果你想偏离此基线(例如,如果你正在考虑使用场景来创建对未来的替代视图)该怎么做。
电子表格模型中用于预测驱动因素的常见预测方法有几种。
常数法
常数法假设你的驱动因素不随时间变化。
实现常数法的一种方法是假设该数字在时间上具有相同、单一的绝对值:
月份 | 三月 | 四月 | 五月 |
---|---|---|---|
实际数据 (A) 或预测数据 (P) | (A) | (P) | (P) |
驱动指标 | 10 | 10 | 10 |
在电子表格模型中使用常数法:
- 将你的指标的绝对值写入工作表顶部的输入单元格(本例中为单元格 B2)
- 将驱动预测单元格链接回该输入单元格
A | B | C | D | |
---|---|---|---|---|
1 | 假设 | |||
2 | 指标 1 值 | 10 | ||
3 | ||||
4 | 预报 | |||
5 | 月份 | 三月 | 四月 | 五月 |
6 | 实际数据 (A) 或预测数据 (P) | (A) | (P) | (P) |
7 | 驱动指标 | 10 | =$B$2 | =$B$2 |
另外,你可以通过取最近期间的平均值来使用常数法。常见的范围是最近的12、6或3个月。
月份 | 一月 | 二月 | 三月 | 四月 | 五月 |
---|---|---|---|---|---|
实际数据 (A) 或预测数据 (P) | (A) | (A) | (A) | (P) | (P) |
驱动指标 | 9 | 11 | 10 | 10 | 10 |
在电子表格模型中执行此操作:
- 在预测单元格中使用平均公式,引用前面的单元格
- 在公式中使用 $ 符号锁定引用(如下所示),然后将其填充到其他单元格
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
1 | 假设 | |||||
2 | 指标 1 值 | 10 | ||||
3 | ||||||
4 | 预报 | |||||
5 | 月份 | 一月 | 二月 | 三月 | 四月 | 五月 |
6 | 实际数据 (A) 或预测数据 (P) | (A) | (A) | (A) | (P) | (P) |
7 | 驱动指标 | 9 | 11 | 10 | =AVERAGE($B2:$D2) | =AVERAGE($B2:$D2) |
移动窗口法
移动窗口法假设你未来的指标变化率与最近的指标变化率相同。
实际数据和预测数据混合使用以进行下一次预测。例如,你可以取前三个月的移动平均值
月份 | 一月 | 二月 | 三月 | 四月 | 五月 |
---|---|---|---|---|---|
实际数据 (A) 或预测数据 (P) | (A) | (A) | (A) | (P) | (P) |
驱动指标 | 10 | 15 | 20 | 15 | 16.6 |
三个月移动平均预测将取最近三个实际数据的平均值(如果存在)(例如,四月预测)。但如果这些月份尚未发生,预测将取实际数据和预测的平均值(例如,五月预测)。
在电子表格模型中使用移动窗口法:
- 在预测单元格中使用平均公式,引用前面的单元格。
- 将其填充到其他单元格,无需使用 $ 锁定单元格引用。
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
1 | 假设 | |||||
2 | 指标 1 值 | 10 | ||||
3 | ||||||
4 | 预报 | |||||
5 | 月份 | 一月 | 二月 | 三月 | 四月 | 五月 |
6 | 实际数据 (A) 或预测数据 (P) | (A) | (A) | (A) | (P) | (P) |
7 | 驱动指标 | 9 | 11 | 10 | =AVERAGE(B2:D2) | =AVERAGE(C2:E2) |
线性增长法
使用线性增长法,你可以按固定速率预测数字增长。对于我们的用水需求模型,你可能需要考虑你所在地区的洗车业务数量。平均每四个月会开设一家新洗车店,即每月0.25家洗车店。
你的驱动时间序列可能看起来像这样:
月份 | 一月 | 二月 | 三月 | 四月 | 五月 |
---|---|---|---|---|---|
实际数据 (A) 或预测数据 (P) | (A) | (A) | (A) | (P) | (P) |
洗车店业务 | 35 | 35 | 35 | 35.25 | 35.5 |
是否应该四舍五入小数是一个个人风格问题。如果你建议存在四分之一的洗车店这种说法,一些建模师可能会抓狂,但通常不四舍五入数字不会影响模型结果。
在电子表格模型中执行此操作:
- 在顶部创建一个输入单元格,其中包含你的指标每月增加的量。如果你的模型按季度或年度运行,则使用你的指标每季度或每年增加的量。
- 在你的时间序列预测单元格中,你将构建如下所示的公式:
=$D7$
:这里你引用的是我们实际数据的最后一个数字,也就是你预测的起点。+COUNTA($E6:E6) * $B$2
:这里你将每月新增洗车店的数量乘以你预测的月数。请注意,你正在使用$
锁定范围$E6:E6
的第一部分的引用,这样当你的范围扩大时,计算的月数也会增加。
- 将公式向右填充。
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
1 | 假设 | |||||
2 | 每月新增洗车店数量 | 0.25 | ||||
3 | ||||||
4 | 预报 | |||||
5 | 月份 | 一月 | 二月 | 三月 | 四月 | 五月 |
6 | 实际数据 (A) 或预测数据 (P) | (A) | (A) | (A) | (P) | (P) |
7 | 驱动指标 | 35 | 36 | 36 | =$D$7 + COUNTA($E6:E6) * $B$2 | =$D$7 + COUNTA($E6:F6) * $B$2 |
指数增长法
一些指标自然会以指数方式增长。也就是说,每个月你都会在前一个月的数值基础上增加一个固定百分比。为了说明我们用水量示例中的指数增长效应,我们假设当地人口每月增长5%。
月份 | 三月 | 四月 | 五月 |
---|---|---|---|
实际数据 (A) 或预测数据 (P) | (A) | (P) | (P) |
人口 | 100,000 | 105,000 | 110,250 |
在此示例中,四月的值表示比五月的值增加5%,依此类推。
在电子表格中建模指数增长:
- 在顶部创建一个输入单元格,其中包含你的指标的月增长率。如果你的模型按季度或年度运行,此金额将是季度或年度增长率。
- 在你的时间序列预测单元格中,你需要将前一个单元格的值乘以 1 +
月增长率
。你需要加上 1,这样你就是将前一个单元格的值乘以 105%,而不是 5%。 - 将公式向右填充。
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
1 | 假设 | |||||
2 | 人口月增长率 | 5% | ||||
3 | ||||||
4 | 预报 | |||||
5 | 月份 | 一月 | 二月 | 三月 | 四月 | 五月 |
6 | 实际数据 (A) 或预测数据 (P) | (A) | (A) | (A) | (P) | (P) |
7 | 驱动指标 | 100,000 | 105,000 | 110,250 | =D7 * (1+$B$2) | =E7 * (1+$B$2) |
提取你的假设
这些方法中大多数都包含假设。例如,每月新增洗车店的数量或当地人口增长率。一个好的建模实践是在模型顶部创建一个假设(或输入)部分,并将公式链接回这些单元格。
该部分为你提供了一个集中更新假设的位置,而无需逐个编辑每个公式。将数值输入直接写入公式被称为“硬编码”,这被视为一种不良做法,因为它会使模型难以更新。
想象一下,你将一个数字硬编码到一个公式中,然后将该值填充到一行中的50个单元格。然后你对模型中的所有100行都这样做,其中每行都有自己的输入。如果你想更改一个输入数字,你必须逐行检查,更新数字,然后确保没有遗漏任何旧数字的实例。将其与只更新一个输入单元格进行比较。
将所有假设集中在一处,在查看下一个模块中的场景时会派上用场。