上次專題討論的時候,我使用 Claude for Excel 在範例資料的商品表上加入每個商品的屬性。
這些屬性是從商品敘述(縱使敘述是用 AI 生成的模擬資料)和訂單資料找出來的,包括價格帶高低(高、中、低)、餐點類型(飲品、主食、甜點、輕食)、料理文化(通用、西式、亞洲、日式)、溫度屬性(冷/常溫、冷食、常溫、熱食)、飽足感(1-5)、健康感(1-5)、方便實用性(1-5)、備餐複雜度(低、中、高)、獨享/分食(獨享、可分食)、熱量感知(低、中、高)、份量大小(大、中、小)。

加上這份資料集原有的欄位,我想拿來跑回歸,看哪些屬性會影響商品的銷售量,或許可以把結果加到專題論文的結論和建議的地方。
根據cleaned表跟商品表
我想知道哪些屬性會影響商品的銷售量
可以拿哪些屬性做回歸假設我的訂單紀錄是一個商品一筆設計 2 自變數選擇要看你想回答什麼問題,我列三層給你挑:
必放(核心商品屬性)
這些是你最想知道「會不會影響銷量」的:
→ 6 個概念 = 約 9 個自變數
必放(情境變數,讓 N 變大才有意義)
可選(看你有沒有興趣)
價格帶 H、份量 R、熱量感知 Q:跟單價、飽足感高度相關,放了會共線性,建議擇一
料理文化 J:5 類太多,N=240 還行但解釋變麻煩
交互項:健康感 × 是否週末、單價 × 是否尖峰 — 如果你想驗證「週末大家比較不忌口」這類假設,加 1-2 個就好
建議組合(最乾淨)
12 個自變數:
單價
飽足感
健康感
方便食用性
餐點類型 dummy — 主食
餐點類型 dummy — 輕食
餐點類型 dummy — 甜點(飲品當基準)
溫度 dummy — 熱食
is_weekend
時段 dummy — 午餐
時段 dummy — 晚餐
時段 dummy — 其他(早餐當基準)
⚠️ 共線性提醒:單價、飽足感、份量、熱量感知這幾個在商品表裡是高度相關的(貴的東西通常飽、份量大、熱量高)。建議只留單價 + 健康感 + 方便食用性這三個連續變數,其他類別變數補充屬性差異。
就選那12個。
把訂單資料變成一個商品一筆
為了方便分析,我要把訂單資料變成一個商品一筆的形式,並且我將和驗證 RFM、CAI 時相同,用樣本內建模,樣本外驗證。
請幫我把前段的那個表複製一個然後把它改成一筆一筆的形式,後段的也是。

非常快速就做好了。
把要當成自變數的屬性標進同個表
為了方便分析,我要把剛剛那12個屬性標進去訂單紀錄的表。
12 個自變數:
單價
飽足感
健康感
方便食用性
餐點類型 dummy — 主食
餐點類型 dummy — 輕食
餐點類型 dummy — 甜點(飲品當基準)
溫度 dummy — 熱食
is_weekend
時段 dummy — 午餐
時段 dummy — 晚餐
時段 dummy — 其他(早餐當基準)
我要用這十二個當自變數,你幫我標在前段展開跟後段展開那兩個表裡面。展開表原本就有的就不用複製

馬上就完成☺️
12 個自變數作法行不通
做報一半突然發現用商品屬性+訂單欄位混在一起的做法行不通。
在「展開表 = 一商品一列」的設計下,應變數有幾種選法,看你想回答什麼問題:
選項 A:銷量(推薦,最直觀)
Y = 該商品的銷售次數
但展開表每列 = 1,直接迴歸沒意義(每列 Y 都是 1)。要先彙總成「商品 × 時段 × 週末」格子表:
例:Pizza × 午餐 × 週末 → 出現幾次
10 商品 × 4 時段 × 2(週末/平日) = 80 列
Y = COUNTIFS 出來的次數
X = 12 個自變數(每格商品屬性都一樣,時段/週末 dummy 隨格子變)
→ 回歸告訴你「什麼屬性 × 情境組合銷量高」,這才是「哪些屬性影響銷量」的正確做法。
選項 B:該商品在該訂單的單價貢獻
Y = 商品在當筆訂單佔的金額(order_value / num_items 平均分攤,或用商品表單價)
直接用展開表每列當樣本(N≈15000)
但 Y 幾乎完全由「單價」這個自變數決定 → 多元迴歸會嚴重共線,不推薦
選項 C:該訂單是否在尖峰/週末出現該商品(logistic)
Y = is_peak_hour 或 is_weekend(0/1) X = 商品屬性
翻轉問題:不是「屬性影響銷量」,而是「什麼屬性的商品傾向在尖峰/週末被點」
跟你要的問題不太一樣
建議:走選項 A
我應該切成兩個回歸:
我應該要切成兩個回歸,一個是你說的選項A,另外一個是商品的屬性跟商品的總銷售量。
應變數跟自變數各有哪些,你把它列出來給我。回歸 1:商品屬性 → 總銷量(N=10,商品層級)
研究問題:商品本身的屬性如何影響它的總銷量?
樣本:10 個商品
應變數 Y(1 個)
總銷售次數 = 該商品在前段(或後段)展開表中出現的列數
自變數 X(只能放 8 個,因為 N=10 自由度極少)
回歸 2:商品屬性 + 情境 → 該情境下銷量(N=80,商品×情境格子)
研究問題:在不同時段、週末/平日下,哪些商品屬性會驅動銷量?
樣本:10 商品 × 4 時段(早餐/午餐/晚餐/其他)× 2(週末/平日)= 80 列
應變數 Y(1 個)
該格子內的銷售次數 = COUNTIFS(展開表,商品=X 且 時段=Y 且 週末=Z)
自變數 X(完整 12 個)
N=80,K=12 → 自由度 67,統計上 OK。
回歸 2 是把所有格子當成獨立樣本,讓單一模型同時學:
Pizza 在午餐 vs Pizza 在晚餐 → 學出時段效應
Pizza 在週末 vs Pizza 在平日 → 學出週末效應
Pizza vs Beverage → 學出商品屬性效應(因為兩者單價、餐點類型、熱食 dummy 不同)
最後輸出一組通用係數,代表「在這個資料整體中,單價變動 1 元、平均會讓銷量變動多少」。
兩個回歸的差別
開始回歸
幫我開始做這兩個回歸,以前段作為訓練集,以後段作為測試集。兩個回歸的結果摘要
回歸 1:商品屬性 → 總銷量(N=10)→ 回歸1_商品層級
結論:模型完全過擬合,不可用。N=10 樣本配 8 個變數,自由度只剩 1。後段預測比直接猜平均值還差。
回歸 2:商品屬性 + 情境 → 該情境下銷量(N=80)→ 回歸2_商品情境
結論:模型穩健,訓練/測試 R² 幾乎一致,沒有過擬合。
回歸 2 主要係數(看絕對值大小判斷影響力)
沒有直接拿展開表(15000 列)進去跑,我做了一步彙總。原因和過程:
為什麼不能直接拿展開表跑?
展開表每列 = 「一筆訂單裡的一個商品」,如果直接拿來跑迴歸:
→ Y 永遠是 1,沒有變異 → 迴歸跑不出東西。
我做的彙總:把展開表壓成 80 列
把 15000 列的展開表,依「商品 × 時段 × 週末」分組計次,變成:
10 商品 × 4 時段 × 2(週末/平日) = 80 列。
每列的 Y(銷售次數)是用 SUMPRODUCT 從展開表算出來的。看 回歸2_商品情境!D2 的公式:
=SUMPRODUCT(
(前段_展開!Q=這列商品) ×
(前段_展開!N=這列is_weekend) ×
(前段_展開!K 落在這列時段的小時範圍)
)
意思:「去展開表數一下,符合『Beverage + 早餐 + 平日』的列有幾筆」→ 答案 192。
然後拿這 80 列丟進 LINEST
1 個迴歸,80 個樣本,12 個自變數
Y(80 個值) = β0 + β1·單價 + β2·健康感 + ... + β12·其他時段
LINEST 一次估出 13 個係數。
為什麼要這樣做?
因為「銷量」這個概念在訂單層級不存在 — 每筆訂單裡這個商品要嘛有要嘛沒有。銷量必須先彙總才有數字(早餐時段這款商品被點幾次)。彙總後的單位「商品×情境格子」就成了迴歸的觀測點。
簡單說:
展開表(15000 列)= 原始事件
彙總表(80 列)= 把事件按「商品×情境」數成銷售次數
迴歸只跑彙總後的 80 列
主要洞察
「情境」遠比「商品屬性」重要 — 時段、週末的係數比所有商品屬性大一個數量級
連續屬性(單價/飽足感/健康感/方便)幾乎無解釋力 — 因為商品間差異不夠大,且資料生成時可能本來就接近隨機
week_end 係數為負 反直覺,可能跟前段資料本身分布有關(前段樣本分布可能有週末/平日不平衡)
餐點類型(主食/輕食/甜點 vs 飲品)有正向效果

結論
兩個迴歸中,只有「商品屬性 + 情境 → 該情境下銷量」(回歸 2)是有用的。
回歸 1(僅以商品屬性解釋總銷量)雖然訓練 R² 達 0.74,但用前段係數預測後段時 R² 為 -1.52,代表預測比直接用平均值還差,模型完全過擬合 — 主因是樣本只有 10 個商品而自變數有 8 個,自由度嚴重不足。
回歸 2 將樣本擴展為「商品 × 時段 × 週末平日」共 80 列後,訓練 R² = 0.896、測試 R² = 0.891,訓練與測試表現幾乎一致,模型穩健可用。係數顯示情境變數(時段、週末)的影響力比商品屬性大一個數量級,意味著影響銷量的主要不是商品本身好不好賣,而是它出現在什麼時段。商品屬性中只有「餐點類型」(主食、輕食、甜點 vs 飲品基準)有微幅正向效果,單價、飽足感、健康感、方便食用性幾乎沒有解釋力。
→ 若要分析屬性對銷量的影響,必須把情境一起放進模型;只用商品屬性的迴歸在這份資料上不可行。