跳到主要內容跳到頁尾

預測函式整理:FORECAST、TREND、SLOPE、INTERCEPT 與 CORREL

11 分鐘閱讀Lv.5 進階摘要與日期

FORECAST、FORECAST.LINEAR、TREND、SLOPE、INTERCEPT、CORREL 六個線性預測函式的語法與範例,再用同一組營收資料做移動平均、季節指數與回測,看預測準不準。

發布 更新

文章目錄

「下個月大概會賣多少?」被問到這句的時候,我通常不想開統計軟體。Google 試算表有一組線性預測函式,FORECAST、FORECAST.LINEAR、TREND,加上拆開看迴歸線的 SLOPE、INTERCEPT,以及判斷資料有沒有關聯的 CORREL,這篇一次整理。

先說我個人的習慣:單點預測我用 FORECAST.LINEAR,一次要好幾個月就用 TREND,SLOPE 跟 INTERCEPT 多半是想看「每個月平均增加多少」的時候才用。這些函式都假設資料走的是一條直線,所以下面會再接三個情境,資料上下跳動、有淡旺季、想知道預測準不準的時候怎麼辦。

下圖是我選方法的順序,不確定的時候先畫折線圖,看形狀再決定。

決策圖:穩定上升或下降用 FORECAST.LINEAR 或 TREND,上下跳動大先做移動平均,每年同月有高低峰就用趨勢值乘上季節指數← 左右滑動看完整的圖,點圖可放大

圖:先看資料的形狀,再決定用哪個方法。

範例資料

下面這組是 12 個月的營收(單位:千元),後面的函式都用它:

月營收(千元)
1100
2108
3115
4112
5125
6133
7128
8140
9148
10143
11155
12163

貼到試算表,A1 是「月」、B1 是「營收」,月份 1 到 12 在 A2:A13,營收在 B2:B13。

如果要手動預測第 13 個月,可以拿尺在折線圖上畫一條直線再延伸,不過每個人畫的線都不一樣。用最小平方法的話,要先算四個總和:x 的總和 78、y 的總和 1570、x 乘 y 的總和 10971、x 平方的總和 650,然後:

  • 斜率 = (12 × 10971 − 78 × 1570) ÷ (12 × 650 − 78²) = 9192 ÷ 1716 ≈ 5.3566
  • 截距 = (1570 − 5.3566 × 78) ÷ 12 ≈ 96.0152
  • 第 13 個月 = 96.0152 + 5.3566 × 13 ≈ 165.65

手算一次就夠了,之後交給函式。以下函式顯示的小數,我都把儲存格調成 2 位小數。

預測值怎麼算

FORECAST

用已知的 x 和 y 配出一條直線,回傳指定 x 對應的 y。

語法:

  • x:要預測的那個點,這裡是月份。
  • 已知 y 範圍:過去的營收。
  • 已知 x 範圍:過去的月份。

注意 y 在前、x 在後,跟直覺的順序相反,很多人第一次會填反。

預測第 13 個月:

Google 試算表公式
fx

預測第 13 個月

=FORECAST(13, B2:B13, A2:A13)

結果是 165.65,跟前面手算的一樣。

兩個範圍的列數要一樣多。如果寫成 ,會得到 #N/A。

FORECAST.LINEAR

FORECAST.LINEAR 的語法跟 FORECAST 一樣,算出來的結果也一樣。

語法:

預測第 13 個月:

Google 試算表公式
fx

預測第 13 個月

=FORECAST.LINEAR(13, B2:B13, A2:A13)

結果是 165.65。

我自己新寫的算式會用 FORECAST.LINEAR,因為名字比較清楚,知道它是線性的。舊檔案裡看到 FORECAST 就不用特地改。它一次只回傳一個值,要一次預測好幾個月,換 TREND。

TREND

TREND 同樣是用直線預測,差別是可以一次給很多個新的 x,結果直接排成一欄。

語法:

  • 已知 y 範圍:過去的營收。
  • 已知 x 範圍(選填):過去的月份,不填的話會當成 1、2、3……。
  • 新 x 範圍(選填):要預測的 x,不填的話就是算出已知 x 的配適值。
  • 有截距(選填):預設 TRUE,填 FALSE 會強制直線通過原點。

一次預測第 13 到 15 個月,新 x 我用 SEQUENCE 產生 13、14、15:

Google 試算表公式
fx

一次預測第 13 到 15 個月

=TREND(B2:B13, A2:A13, SEQUENCE(3, 1, 13))

結果會從公式所在的儲存格往下溢出三格:

月預測(千元)
13165.65
14171.01
15176.36

在 Google 試算表,TREND 這種本來就回傳陣列的函式,直接按 Enter 就會自動溢出,不需要任何特殊按鍵。Excel 舊版要選好範圍再按 Ctrl+Shift+Enter,Google 試算表不用。在 Chrome 按 Ctrl+Shift+Enter(Mac 為 ⌘+Shift+Enter)會幫公式自動加上 ARRAYFORMULA,用在 TREND 上用不到。溢出的下方儲存格如果已經有資料,會顯示 #REF!,把擋住的內容清掉就好。

第四個參數我只在「確定營收 0 的時候 x 也是 0」才會填 FALSE。這組資料如果填了:

Google 試算表公式
fx

強制直線通過原點的 TREND

=TREND(B2:B13, A2:A13, 13, FALSE)

結果會變成 219.42,比 165.65 高出一大截,因為直線被硬壓過原點,斜率跟著變陡。一般情況放著不填就好。

預測值畫成折線圖,實線是實際、虛線是預測,一眼看得出有沒有接得上:

折線圖:1 到 12 月實際營收從 100 升到 163,13 到 15 月的預測虛線延伸到 176.36

圖:預測虛線沿著實際資料的走向往右延伸,但它不知道之後會不會有突發狀況。

斜率、截距與相關係數

SLOPE

SLOPE 回傳那條直線的斜率,白話就是「x 每增加 1,y 平均增加多少」。

語法:

Google 試算表公式
fx

月份對營收的斜率

=SLOPE(B2:B13, A2:A13)

結果是 5.36,也就是營收平均每個月增加 5.36 千元。

y 在前、x 在後這件事在這裡更要小心。如果填反成 ,Google 試算表不會報錯,只會給你另一個數字 0.18,那是「營收每增加 1 千元,月份增加多少」,完全是另一回事。

INTERCEPT

INTERCEPT 回傳直線和 y 軸交會的位置,也就是 x = 0 時的 y。

語法:

Google 試算表公式
fx

月份對營收的截距

=INTERCEPT(B2:B13, A2:A13)

結果是 96.02。這組資料的月份從 1 開始,沒有 0 月,所以 96.02 比較像「第 0 個月的起跑點」,單看它沒有太多意義。我用它是為了和 SLOPE 一起拼出預測值:

Google 試算表公式
fx

用截距和斜率拼出第 13 個月

=INTERCEPT(B2:B13, A2:A13) + SLOPE(B2:B13, A2:A13) * 13

結果還是 165.65。

把兩個數字對上圖表:在圖表編輯器替系列加上趨勢線並顯示公式,圖上標出來的係數就是 SLOPE 和 INTERCEPT 的結果,5.36 和 96.02。

散佈圖:12 個月營收的點與一條向右上的趨勢線,圖上標示趨勢線公式

圖:趨勢線的公式就是 SLOPE 和 INTERCEPT 的結果。

CORREL

CORREL 回傳兩組數字的相關係數 r,範圍在 −1 到 1 之間,越接近 1 代表兩組數字一起往上升的關係越緊。

語法:

Google 試算表公式
fx

月份和營收的相關係數

=CORREL(B2:B13, A2:A13)

結果是 0.98,月份跟營收幾乎是同步上升的,直線預測在這組資料上合理。如果算出來只有 0.3 之類的低數字,就別拿直線預測了,直線貼不住資料。

兩個要記得的限制。第一,CORREL 只看直線關係,曲線的關係它看不到。第二,r 高只代表兩者一起變動,不代表其中一個造成另一個。

資料上下跳動的時候

上面那組資料其實還算乖。如果每個月忽高忽低,直線預測會被單月的異常拉著跑,這時候我會先做移動平均,把跳動磨平一點再看趨勢。

簡單移動平均是取最近 3 個月的平均,從第 3 個月開始算,C4 放:

Google 試算表公式
fx

3 期移動平均,放在 C4

=AVERAGE(B2:B4)

往下複製。指數移動平均(EMA)給近期資料較高的權重,我用 α = 0.5,D2 先放 =B2,D3 開始放:

Google 試算表公式
fx

EMA(α=0.5),放在 D3

=0.5*B3 + 0.5*D2

往下複製。三組數字放在一起:

月營收3 期移動平均EMA(α=0.5)
1100100
2108104
3115107.67109.50
4112111.67110.75
5125117.33117.88
6133123.33125.44
7128128.67126.72
8140133.67133.36
9148138.67140.68
10143143.67141.84
11155148.67148.42
12163153.67155.71

三條線畫成折線圖,會比較容易看出差別:

折線圖:營收原始資料、3 期移動平均與 EMA 三條線,兩條平均線都比原始資料平滑,且落在原始線的下方

圖:兩條平均線都比原始線平滑,也都慢了半拍。

如果把最後一格當作下個月的預測,移動平均是 153.67,EMA 是 155.71,都比 TREND 的 165.65 低一截。資料一路往上的時候,平均線永遠追不上,這是這類方法的特性。所以這組資料我不會用平均線預測,平均線比較適合用來「看」趨勢有沒有轉向。

α 要多大沒有標準答案,我通常從 0.3 開始試,越大越跟得上最新資料,也越容易跟著雜訊跳。

有淡旺季的資料

換一組有季節性的資料,兩年的月營收(千元):

月第 1 年第 2 年季節指數
182910.76
276850.71
390990.83
41041130.96
51181301.09
61311461.22
71421571.32
81381501.27
91151261.06
10991080.91
1192990.84
121101211.02

月份在 A2:A13,第 1 年在 B 欄,第 2 年在 C 欄。兩年的走勢很像,CORREL(B2:B13, C2:C13) 是 0.9986,旺季都在 7 月,淡季都在 2 月。

折線圖:第 1 年與第 2 年各 12 個月營收疊在一起,兩條線都在 7 月最高、2 月最低,第 2 年整條線較高

圖:兩年的高低峰落在同樣的月份,第 2 年整體墊高。

季節指數是「該月營收除以當年的月平均」,兩年各算一次再平均。D2 放:

Google 試算表公式
fx

兩年平均的季節指數,放在 D2

=AVERAGE(B2/AVERAGE(B$2:B$13), C2/AVERAGE(C$2:C$13))

往下複製到 D13,1 月是 0.76,7 月是 1.32,12 個指數平均起來是 1。

接著預測第 3 年的 1 月,也就是第 25 個月。先把兩年 24 個月接起來配一條趨勢線:

Google 試算表公式
fx

只看趨勢的第 25 個月預測

=FORECAST.LINEAR(25, VSTACK(B2:B13, C2:C13), SEQUENCE(24))

結果是 128.81。這是只看趨勢的答案,可是第 2 年 1 月才 91,淡季突然高出四成多,明顯不對。乘上 1 月的季節指數:

Google 試算表公式
fx

趨勢預測乘上 1 月的季節指數

=FORECAST.LINEAR(25, VSTACK(B2:B13, C2:C13), SEQUENCE(24)) * D2

結果是 98.22,比第 2 年 1 月的 91 多了不到一成,看起來合理多了。

坦白說這個做法比較粗,指數是用每年各自的平均算的,沒有扣掉年與年之間的成長。資料只有兩年的時候我覺得夠用,資料多了再考慮更細的方法。

預測準不準

模型好不好,要拿已知答案的資料試。方法叫回測:只用前面的資料配直線,預測後面已經發生的月份,再比對。

回到第一組 12 個月資料,用前 9 個月預測第 10 到 12 個月。前面的移動平均已經用了 C 欄,回測請把月份與營收複製到新的工作表(同樣放在 A、B 欄),再從 C11 開始放:

Google 試算表公式
fx

回測:用前 9 個月預測第 10 到 12 月,放在 C11

=FORECAST.LINEAR(A11, B$2:B$10, A$2:A$10)

往下複製到 C13,預測值是 151.14、156.72、162.31,實際是 143、155、163。

折線圖:1 到 9 月為訓練期、10 到 12 月為測試期,預測與實際的差為 −8.14、−1.72、+0.69,MAE 3.52,MAPE 2.4%← 左右滑動看完整的圖,點圖可放大

圖:10 月實際比預測低 8.14,是這次回測最大的誤差。

誤差用兩個數字衡量。MAE 是平均絕對誤差,單位跟原始資料一樣:

Google 試算表公式
fx

MAE 平均絕對誤差

=SUMPRODUCT(ABS(B11:B13 - C11:C13)) / COUNT(B11:B13)

結果是 3.52,也就是平均差 3.52 千元。MAPE 是平均絕對百分比誤差,看的是差了幾成:

Google 試算表公式
fx

MAPE 平均絕對百分比誤差

=SUMPRODUCT(ABS((B11:B13 - C11:C13) / B11:B13)) / COUNT(B11:B13)

結果是 0.0241,約 2.4%。這邊用 SUMPRODUCT 是因為它會把裡面的 ABS 當成陣列一起算,直接寫 的話,普通儲存格不一定會對整個範圍運算。

測試期只有 3 個點,這兩個數字參考就好。真正要拿去做決策,我會把測試期拉長,至少抓一整年。

預測也有它的上限。突發的事件模型看不到,一旦市場環境改變,過去的直線就不適用了。我自己做預算的時候,會同時算一個偏樂觀、一個偏保守的版本,讓看的人知道這個數字有多少範圍。

練習

1

不用 FORECAST,算第 15 個月

用範例資料(A2:A13 為月份,B2:B13 為營收),只用 SLOPE 和 INTERCEPT,算出第 15 個月的預測營收。

答案是 176.36,跟 TREND 溢出的第 15 個月一樣。

預測值要畫成圖的話,可以參考 圖表完全指南;想把樂觀和保守兩種版本並排比較,可以看 情境分析。先把資料畫成折線圖,再挑方法,試著用你自己的資料做一次吧!我是喜特先生,Mr. Sheet,我們下個教學見!

分享:
#預測#FORECAST#TREND#線性迴歸#移動平均#季節性調整#回測
喜特先生 Mr. Sheet

喜特先生 Mr. Sheet

數據分析師/商業分析師

八年工作經驗,跨不同業界解決數據需求。做過的案例都整理在作品集。

接下來可以

這篇在技能樹的 Lv.5「系統設計與最佳實踐」,模組「建立預測模型」(第 1/1 篇)。這是技能樹路線上的最後一篇。

回到技能樹

相關文章

查看所有文章

留言討論

共 0 則留言

訂閱電子報,新文章上線就通知你

免費,隨時可取消。

送出即表示同意服務條款與隱私權政策。