前言:各位這幾天可能都看到了一則關於紅包公式的新聞。新聞因為針對的是一般大眾、又有時間篇幅限制,因此只能講很簡單的一道式子。比起那樣,我更想分享整個推導的過程和思考方式,包括在「複雜但精準」與「實用但有誤差」這兩者間的取捨,所以才又寫了這篇文章。
※
事情發生在上周五晚上,學長在我臉書上貼了張表格,詳細記錄不同情況下,參加朋友婚禮該包多少禮金。
我回想起數次去婚禮前,在LINE上面和朋友討論「你包多少?」、「五星級飯店哎,2600夠嗎?」更尷尬一點的,還得在距離禮金台不到10公尺之處掏皮包補錢。這張表格提供了一份公定價,真是太實用了。
它唯一的缺點是–也大了點。
業者根據經驗,依照台灣的5個地區、5種餐廳等級、3種參與人數(不出席、1人、2人)、4種交情關係,設計出來的表格共計有5×5×3×4=300個欄位。要是每次都得對照,省下來的紅包錢配眼鏡都不夠。反過來說,既然它是根據各種狀況所統計出來的數據,表示300種紅包金額並非各自獨立,而是彼此間有所關聯。比方說,交情越好就該包越多。這是常識,表格反映出來的價碼也是如此。
身為一位數學科普作家,前陣子出書後,我整天像擔心兒子娶不到老婆的爹,煩惱著書都賣不好,數學沒人愛。絞盡腦汁想介紹數學、推銷新書。
愛子心切的我決定犧牲周末晚上快樂時光,用數學將表格化繁為簡。
※
能做到這件事的數學工具有很多種,我選了統計學常用的「迴歸分析」:
了解兩個或多個變數間是否相關、相關方向與強度,並建立數學模型以便觀察特定變數來預測研究者感興趣的變數。
-wiki
先考慮稍微簡單的狀況:獨自參加台北的婚禮。固定「地區」跟「參與人數」後,要考慮的變數剩「交情」、「餐廳等級」,共有4×5=20種狀況。將交情由點頭之交到摯友用數字1~4表示,餐廳等級從辦桌到五星級飯店用數字1~5表示,再把這20組兩個輸入、一個輸出的數據放進去跑迴歸分析(嚴格來說應該稱之為多重迴歸分析),得到的迴歸方程式為
紅包金額= 975+372×交情+215×餐廳等級。
四捨五入進位到百位得到
紅包金額= 1000+400×交情+200×餐廳等級。
飯店等級 | 交情 | 表格金額 | 公式金額 | 差距 |
1 | 1 | 1600 | 1600 | 0 |
1 | 2 | 1800 | 2000 | 200 |
1 | 3 | 2200 | 2400 | 200 |
1 | 4 | 2600 | 2800 | 200 |
2 | 1 | 1800 | 1800 | 0 |
2 | 2 | 2200 | 2200 | 0 |
2 | 3 | 2600 | 2600 | 0 |
2 | 4 | 2800 | 3000 | 200 |
3 | 1 | 2200 | 2000 | -200 |
3 | 2 | 2600 | 2400 | -200 |
3 | 3 | 2800 | 2800 | 0 |
3 | 4 | 3200 | 3200 | 0 |
4 | 1 | 2200 | 2200 | 0 |
4 | 2 | 2600 | 2600 | 0 |
4 | 3 | 2800 | 3000 | 200 |
4 | 4 | 3200 | 3400 | 200 |
5 | 1 | 2200 | 2400 | 200 |
5 | 2 | 2600 | 2800 | 200 |
5 | 3 | 3200 | 3200 | 0 |
5 | 4 | 3800 | 3600 | 0 |
結果還不錯,20個數據裡有一半完全吻合,剩餘的一半也只有200元的差距。唯一的困擾是–跑出了幾2400、3400,這是絕對不會(除非參加舊情人)包的紅包數目。算了,先不管這個。我喜孜孜地跑去先發臉書動態,再回頭過來分析更複雜的狀況,將「區域」和「參與人數」一併考慮。
然後問題就來了。
我本身是在學術界做研究,做研究時永遠該注意的準則是:絕對不要以為問題很小就裝作沒看到,那樣的問題之後一定會變得很大,讓你很頭疼。
沒想到寫科普數學文章也一樣。
※
挑戰迴歸分析整個表格時,我遇到了兩個問題
- 上述例子(獨自在台北出席婚禮)只有2個變數和20種組合,迴歸分析能提供一道精準簡潔的公式。當變成4個變數和300種組合,就很難用一道數學公式來捕捉禮金的變化。
- 上述例子的禮金落在1800到3800之間,每次增加200或400,相對規律。300種組合時,禮金變化從800到10,000,中間跳過了4000、5000、7000~9999,非常不規律。
這兩個問題增加了迴歸分析的誤差。為此,我做了兩件事:
- 重新檢查表格,剔除「不出席」的狀況。因為不出席時,禮金只根據交情等級調整,其他變數都不會影響。這樣的特例會降低迴歸分析對於其他出席狀況的計算,變得更不準。也因此,接下來的分析僅針對「出席1人」與「出席2人」的狀況。
- 將輸出從「禮金金額」改成「禮金等級」,分級制度如下
等級 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
金額(千) | 1.6 | 1.8 | 2.2 | 2.6 | 2.8 | 3.2 | 3.6 | 3.8 | 6.2 | 6.8 | 10 |
換句話說,迴歸分析不再分析各種狀況與「禮金金額」的關係,而是分析各種狀況與「禮金等級」的關係。如此一來就可解決不同禮金等級,金額變化不一的問題。經過這兩個處理後,得到的迴歸分析公式為
紅包等級=-5.375+0.465×地區+2.66×人數+1.08×交情+0.6575×餐廳等級
再將式子改成分數表示,整理可得到考慮更完整的紅包(等級)公式
其中[.]是高斯符號,意思是將括號裡面的職四捨五入取到整數位。此公式算出來的結果與表格比對,只有2%的狀況出現紅包等級2的差距,其他都在1級以下,還算不錯。
搭配禮金等級表格,這才是最完整的紅包公式。不只賓客可以使用,新人也可以參考,評估自己會來的賓客大概屬於那些類型,該請怎樣的飯店,才能最大化收益(是把婚禮當成創業嗎?),或至少不虧本。
※數學的威力
接下來是我的一些觀察。首先是「簡潔」與「完整」的取捨:從兩道婚禮公式可以看到,想考慮的狀況越完整,公式便會越複雜,直觀性、實用性就會降低。以我自己來說,恐怕也不會真的去用有高斯符號的紅包等級公式。
但儘管是那麼複雜的公式,比起表格還是簡單許多。這是一個充分展現數學化繁為簡、以簡御繁的例子:可以將龐大的表格表示成一道式子跟幾個較小的表格;之後,只要用一道式子,就可以算出不同狀況的紅包禮金。
我本身是做無線通訊研究,晶片設計中我們偶爾也會遇到這樣的問題,有些數字可以用表格(look-up table: LUT)存起來,也可以即時運算,前者的成本是記憶體空間,後者的成本是運算的能量消耗。各自有適合的狀況,也不一定都是要像這次一樣,把可以存的都改成用算的。
好像扯太遠了。
第二個重點,也是最重要的,就是透過迴歸分析,可以看到不同因素在決定禮金數目的比重。以禮金等級式子來說,地區、餐廳等級最不重要,光交情跳一級,就是地區跟餐廳同時加一級的分量。攜伴參加對禮金的影響是最大的。
「這些不用算啊,還蠻直觀的,是稍微想一下就可以下的結論。」
嗯啊,這麼說也沒錯,但地區、餐廳、交情、人數的比重是3:4:7:17,這就不是稍微想一下才能得到的,甚至,很認真地想也想不到,是唯有透過數學分析才能得到的。
「數學不僅是一門御簡為繁的知識,更是一門能量化直觀概念的學問。」
這是受訪時我最想講的一句話。我的小孩書是《超展開數學教室》,還請各位支持了。