本站的「CP 值(划算度)」並非人工主觀評定,而是透過數學模型從真實的優惠券資料中推導而出。以下是我們計算 CP 值的核心方法論。
1. 隱含單價如何由券庫迴歸得出
每張優惠券可以視為一條方程式(例如:2 塊炸雞 + 1 杯可樂 = 120 元)。當我們收集了數百張優惠券後,這些方程式會形成一個「超定方程組(Overdetermined system)」。
我們使用「非負最小平方法(NNLS)」配合 Ridge 正則化(目前正則化參數 λ 取 1e-3)來解這個方程組,得出每個品項的「隱含單價」。
為什麼必須是「非負」?因為如果使用無約束的最小平方法,為了數學上的完美擬合,系統可能會解出「負數」的單價(例如推導出可樂是 -10 元),這在現實生活中是不合理的。非負約束確保了所有推導出來的單價都大於或等於零。
2. 擬合集為何納入過期券
您可能會發現,用來計算單價的「擬合集」與畫面上顯示的「顯示集」並不相同。我們的擬合集不僅包含當前有效的優惠券,還納入了過去的過期券。
這是因為每一張過期券都代表著「當時這個組合賣這個價」的一筆真實觀測資料。多一張券,就多一條方程式,能讓推導出來的隱含單價更加穩定與準確。為了確保價格符合近期水準,我們目前將擬合集的截止線設定為「12 個月內」的過期券。
3. 各排序維度的定義
我們提供多種排序方式,滿足不同的評估需求:
- 划算度優先(Value):比較「隱含總價值 - 優惠券售價」的差額。差額越大,代表省下的絕對金額越多。
- 折扣率優先(Ratio):比較「隱含總價值 / 優惠券售價」的比例。比例越高,代表每一元能換到的價值越高。
- 每人均價優先(Per Person):將優惠券售價除以「建議食用人數」(由系統依份量估算),由低到高排序。
- 單品均價優先(Per Item):若您特別想吃某樣單品(如蛋撻),此排序會計算「優惠券售價 / 該單品數量」,找出獲得該單品成本最低的券。
- 總價由低到高(Price):單純依照優惠券的售價由低到高排序,適合預算有限的情境。
4. 權重如何作用
每個人的喜好不同,有時候您可能特別不想喝飲料。透過畫面上的「權重」滑桿,您可以調整各品項類別的價值。當您降低某個類別的權重時,系統在計算整張券的「隱含總價值」時,就會把該類別品項的隱含單價乘上這個權重比例,進而影響該張券的划算度排名。
5. 誠實揭露與限制
為了建立可靠的參考,我們必須誠實說明本引擎的兩項限制:
- 樣本數不足的品項不由迴歸定價:當某個品項在券庫中出現次數過少(
n < 3)時,由於方程式不夠,迴歸算出的價格會極度失真。此時我們會改用「官方菜單單點價」當作基準(Anchor price)。若連官方基準價都沒有,包含該品項的優惠券會被「降級」:它仍然會正常顯示,但不參與 CP 值排名。目前系統內有 5 個品項待補基準、7 張券因此降級。 - 名次會在券本身沒變的情況下移動:因為每個品項的隱含單價是相對於「整個在架券庫」解出來的。當市場上推出了新的優惠券,或是舊的優惠券大量過期,方程組改變了,解出來的單價也會跟著微調,這可能導致某些券的排名發生變動,這是系統隨時反映最新市場定價的正常現象。