200字
畢業專題小札記15:回歸分析——哪些屬性會影響商品的銷售量
2026-05-03
2026-05-03

上次專題討論的時候,我使用 Claude for Excel 在範例資料的商品表上加入每個商品的屬性。

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

加上這份資料集原有的欄位,我想拿來跑回歸,看哪些屬性會影響商品的銷售量,或許可以把結果加到專題論文的結論和建議的地方。

根據cleaned表跟商品表
我想知道哪些屬性會影響商品的銷售量
可以拿哪些屬性做回歸
假設我的訂單紀錄是一個商品一筆

設計 2 自變數選擇要看你想回答什麼問題,我列三層給你挑:

必放(核心商品屬性)

這些是你最想知道「會不會影響銷量」的:

欄位

類型

處理

單價

連續

直接放,或取 log

飽足感

連續(1-5)

直接放

健康感

連續(1-5)

直接放

方便食用性

連續(1-5)

直接放

餐點類型

類別(4類)

one-hot,留 3 個 dummy

溫度屬性

類別(3類)

one-hot,留 2 個 dummy

→ 6 個概念 = 約 9 個自變數

必放(情境變數,讓 N 變大才有意義)

欄位

處理

小時 hour

建議分段:早餐(6-10)/午餐(11-14)/下午(15-17)/晚餐(18-21)/宵夜(22-5),做 4 個 dummy

is_weekend

直接 0/1

is_peak_hour

直接 0/1(但會跟小時段重疊,擇一)

可選(看你有沒有興趣)

  • 價格帶 H、份量 R、熱量感知 Q:跟單價、飽足感高度相關,放了會共線性,建議擇一

  • 料理文化 J:5 類太多,N=240 還行但解釋變麻煩

  • 交互項:健康感 × 是否週末、單價 × 是否尖峰 — 如果你想驗證「週末大家比較不忌口」這類假設,加 1-2 個就好

建議組合(最乾淨)

12 個自變數:

  1. 單價

  2. 飽足感

  3. 健康感

  4. 方便食用性

  5. 餐點類型 dummy — 主食

  6. 餐點類型 dummy — 輕食

  7. 餐點類型 dummy — 甜點(飲品當基準)

  8. 溫度 dummy — 熱食

  9. is_weekend

  10. 時段 dummy — 午餐

  11. 時段 dummy — 晚餐

  12. 時段 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 自由度極少)

#

變數

來源

1

單價

商品!C

2

飽足感

商品!L

3

健康感

商品!M

4

方便食用性

商品!N

5

主食 dummy

商品!I

6

輕食 dummy

商品!I

7

甜點 dummy

商品!I

8

熱食 dummy

商品!K

回歸 2:商品屬性 + 情境 → 該情境下銷量(N=80,商品×情境格子)

研究問題:在不同時段、週末/平日下,哪些商品屬性會驅動銷量?

樣本:10 商品 × 4 時段(早餐/午餐/晚餐/其他)× 2(週末/平日)= 80 列

應變數 Y(1 個)

  • 該格子內的銷售次數 = COUNTIFS(展開表,商品=X 且 時段=Y 且 週末=Z)

自變數 X(完整 12 個)

#

變數

隨什麼變化

1

單價

商品

2

飽足感

商品

3

健康感

商品

4

方便食用性

商品

5

主食 dummy

商品

6

輕食 dummy

商品

7

甜點 dummy

商品

8

熱食 dummy

商品

9

is_weekend

情境

10

午餐 dummy

情境

11

晚餐 dummy

情境

12

其他時段 dummy

情境

N=80,K=12 → 自由度 67,統計上 OK

回歸 2 是把所有格子當成獨立樣本,讓單一模型同時學:

  • Pizza 在午餐 vs Pizza 在晚餐 → 學出時段效應

  • Pizza 在週末 vs Pizza 在平日 → 學出週末效應

  • Pizza vs Beverage → 學出商品屬性效應(因為兩者單價、餐點類型、熱食 dummy 不同)

最後輸出一組通用係數,代表「在這個資料整體中,單價變動 1 元、平均會讓銷量變動多少」。

兩個回歸的差別

回歸 1

回歸 2

樣本數

10

80

解釋什麼

「先天受歡迎度」

「在什麼情境下受歡迎」

限制

自由度太少,結果僅供參考

同商品的 8 個情境格子不獨立(R² 會虛高,係數仍可解讀)

用途

看商品本質吸引力

看商品 × 時段策略


開始回歸

幫我開始做這兩個回歸,以前段作為訓練集,以後段作為測試集。

兩個回歸的結果摘要

回歸 1:商品屬性 → 總銷量(N=10)→ 回歸1_商品層級

指標

訓練 R²

0.74

測試 R²

-1.52

測試 RMSE

49.7

結論:模型完全過擬合,不可用。N=10 樣本配 8 個變數,自由度只剩 1。後段預測比直接猜平均值還差。

回歸 2:商品屬性 + 情境 → 該情境下銷量(N=80)→ 回歸2_商品情境

指標

訓練 R²

0.896

測試 R²

0.891

測試 RMSE

43.8

結論:模型穩健,訓練/測試 R² 幾乎一致,沒有過擬合。

回歸 2 主要係數(看絕對值大小判斷影響力)

變數

係數

解讀

其他時段 dummy

+209.2

其他時段(0-5,15-17,22-23 共 12 小時)銷量比早餐多 209

is_weekend

-150.5

週末反而比平日少 150 (⚠️ 異常,值得追查)

主食 dummy

+24.2

主食類比飲品(基準)多賣 24

晚餐

-28.8

晚餐比早餐少 29

午餐

-24.7

午餐比早餐少 25

輕食

+15.4

輕食比飲品多 15

甜點

+12.3

甜點比飲品多 12

熱食

-9.2

熱食略低於非熱食

單價

-0.92

每加 1 美元銷量少 1(微弱)

飽足感

-0.53

幾乎無影響

健康感

-0.20

幾乎無影響

方便食用性

+0.15

幾乎無影響

沒有直接拿展開表(15000 列)進去跑,我做了一步彙總。原因和過程:

為什麼不能直接拿展開表跑?

展開表每列 = 「一筆訂單裡的一個商品」,如果直接拿來跑迴歸:

order_id

商品

單價

健康感

午餐

is_weekend

Y=?

ORD-001

Salad

11.1

5

0

0

1

ORD-001

Pizza

18.94

1

0

0

1

ORD-002

Beverage

3.98

4

1

1

1

...

...

...

...

...

...

1

→ Y 永遠是 1,沒有變異 → 迴歸跑不出東西。

我做的彙總:把展開表壓成 80 列

把 15000 列的展開表,依「商品 × 時段 × 週末」分組計次,變成:

商品

時段

is_weekend

Y=該組的列數

單價

健康感

午餐

...

Beverage

早餐

0

192

3.98

4

0

...

Beverage

早餐

1

96

3.98

4

0

...

Beverage

午餐

0

178

3.98

4

1

...

...

...

...

...

...

...

...

...

Sushi Roll

其他

1

?

19.16

4

0

...

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 列

主要洞察

  1. 「情境」遠比「商品屬性」重要 — 時段、週末的係數比所有商品屬性大一個數量級

  2. 連續屬性(單價/飽足感/健康感/方便)幾乎無解釋力 — 因為商品間差異不夠大,且資料生成時可能本來就接近隨機

  3. week_end 係數為負 反直覺,可能跟前段資料本身分布有關(前段樣本分布可能有週末/平日不平衡)

  4. 餐點類型(主食/輕食/甜點 vs 飲品)有正向效果


結論

兩個迴歸中,只有「商品屬性 + 情境 → 該情境下銷量」(回歸 2)是有用的

回歸 1(僅以商品屬性解釋總銷量)雖然訓練 R² 達 0.74,但用前段係數預測後段時 R² 為 -1.52,代表預測比直接用平均值還差,模型完全過擬合 — 主因是樣本只有 10 個商品而自變數有 8 個,自由度嚴重不足。

回歸 2 將樣本擴展為「商品 × 時段 × 週末平日」共 80 列後,訓練 R² = 0.896、測試 R² = 0.891,訓練與測試表現幾乎一致,模型穩健可用。係數顯示情境變數(時段、週末)的影響力比商品屬性大一個數量級,意味著影響銷量的主要不是商品本身好不好賣,而是它出現在什麼時段。商品屬性中只有「餐點類型」(主食、輕食、甜點 vs 飲品基準)有微幅正向效果,單價、飽足感、健康感、方便食用性幾乎沒有解釋力。

若要分析屬性對銷量的影響,必須把情境一起放進模型;只用商品屬性的迴歸在這份資料上不可行。

評論