學(xué)建模國(guó)賽C題解析:基于預(yù)測(cè)與優(yōu)化的蔬菜定價(jià)補(bǔ)貨決策模型)
1. 項(xiàng)目概述從賽題到實(shí)戰(zhàn)的完整拆解去年國(guó)賽C題“蔬菜類商品的自動(dòng)定價(jià)與補(bǔ)貨決策”可以說(shuō)是近年來(lái)數(shù)學(xué)建模賽題中將理論模型與商業(yè)實(shí)踐結(jié)合得相當(dāng)緊密的一道題。它不像一些純理論推導(dǎo)題那樣飄在空中而是直接把我們拉進(jìn)了一個(gè)生鮮零售的日常運(yùn)營(yíng)場(chǎng)景里每天面對(duì)波動(dòng)劇烈的銷量和損耗到底該怎么定菜價(jià)、該進(jìn)多少貨這幾乎是所有超市、菜場(chǎng)經(jīng)理每天睜開(kāi)眼就要頭疼的問(wèn)題。題目給出的數(shù)據(jù)比如過(guò)去四個(gè)月的銷量、損耗和批發(fā)價(jià)格就是現(xiàn)實(shí)世界里最真實(shí)、也最“臟”的數(shù)據(jù)集。處理它需要的不僅是套用幾個(gè)現(xiàn)成的模型更需要理解零售業(yè)務(wù)的內(nèi)在邏輯。這道題的核心目標(biāo)很明確第一建立一個(gè)自動(dòng)定價(jià)模型讓系統(tǒng)能根據(jù)歷史數(shù)據(jù)和市場(chǎng)情況動(dòng)態(tài)給出每種蔬菜的每日售價(jià)第二設(shè)計(jì)一個(gè)智能補(bǔ)貨決策模型告訴采購(gòu)員明天該訂多少貨才能在滿足需求的同時(shí)把損耗和成本壓到最低。這背后其實(shí)是對(duì)“預(yù)測(cè)”和“優(yōu)化”兩大建模核心能力的綜合考察。預(yù)測(cè)不準(zhǔn)定價(jià)和補(bǔ)貨就是瞎搞優(yōu)化不好就算預(yù)測(cè)準(zhǔn)了利潤(rùn)也可能被高庫(kù)存或高損耗吃掉。我注意到很多同學(xué)一看到“定價(jià)”和“補(bǔ)貨”腦子里立刻蹦出“線性回歸”和“ARIMA”。沒(méi)錯(cuò)這些是基礎(chǔ)工具但直接往上套往往拿不到高分。關(guān)鍵在于你要理解蔬菜銷售的特殊性強(qiáng)季節(jié)性、極短的保質(zhì)期、價(jià)格彈性復(fù)雜、且受天氣、節(jié)假日等外部因素影響巨大。你的模型必須能刻畫(huà)這些特性。所以這篇“參考論文”的分享我會(huì)重點(diǎn)拆解如何超越基礎(chǔ)模型構(gòu)建一個(gè)更有業(yè)務(wù)解釋力、也更穩(wěn)健的解決方案。無(wú)論是準(zhǔn)備國(guó)賽、美賽的同學(xué)還是對(duì)數(shù)據(jù)驅(qū)動(dòng)決策感興趣的朋友相信都能從中獲得可以直接“抄作業(yè)”的靈感和避坑指南。2. 解題核心思路與模型框架設(shè)計(jì)面對(duì)這樣一個(gè)綜合性的決策問(wèn)題最忌諱的就是一上來(lái)就埋頭調(diào)參跑代碼。我的思路是先搭建一個(gè)清晰的**“預(yù)測(cè)-決策”雙層框架**把大問(wèn)題分解成幾個(gè)可攻克的小模塊。2.1 問(wèn)題分解與整體流程整個(gè)系統(tǒng)可以看作一個(gè)數(shù)據(jù)驅(qū)動(dòng)的決策閉環(huán)我將其設(shè)計(jì)為四個(gè)核心階段數(shù)據(jù)理解與預(yù)處理階段這是所有工作的地基。題目給的數(shù)據(jù)通常包含缺失值、異常值比如某天銷量為0但損耗巨大或者價(jià)格突變。首先需要進(jìn)行數(shù)據(jù)清洗并對(duì)銷量、價(jià)格序列進(jìn)行可視化觀察其趨勢(shì)性、季節(jié)性和周期性。對(duì)于蔬菜數(shù)據(jù)周末效應(yīng)、節(jié)假日前后的爆發(fā)式增長(zhǎng)和節(jié)后的驟降都是必須識(shí)別的模式。需求預(yù)測(cè)模塊這是定價(jià)和補(bǔ)貨的前置輸入。我們需要預(yù)測(cè)未來(lái)一天或幾天每種蔬菜的需求量。注意這里預(yù)測(cè)的是“潛在需求”而不是歷史銷量因?yàn)闅v史銷量可能受缺貨、定價(jià)不合理等因素抑制。一個(gè)穩(wěn)健的做法是結(jié)合時(shí)間序列模型如ARIMA、Prophet捕捉歷史規(guī)律再引入外部特征如是否為周末、節(jié)假日、前一天的批發(fā)價(jià)波動(dòng)進(jìn)行增強(qiáng)。定價(jià)決策模塊基于預(yù)測(cè)的需求、當(dāng)前庫(kù)存、進(jìn)貨成本以及損耗率建立定價(jià)模型。定價(jià)不是孤立的它直接影響需求。因此這里需要引入價(jià)格彈性的概念。我們可以通過(guò)歷史數(shù)據(jù)擬合出每種蔬菜的需求-價(jià)格關(guān)系曲線未必是簡(jiǎn)單的線性。定價(jià)的目標(biāo)是最大化單品的預(yù)期毛利潤(rùn)即(售價(jià) - 成本) * 預(yù)測(cè)銷量 - 預(yù)期損耗成本。補(bǔ)貨決策模塊在給定定價(jià)決策后補(bǔ)貨模型需要決定訂購(gòu)量。這是一個(gè)典型的報(bào)童模型的變體。核心權(quán)衡是多進(jìn)貨缺貨損失小但滯銷損耗風(fēng)險(xiǎn)大少進(jìn)貨損耗小但可能錯(cuò)過(guò)銷售機(jī)會(huì)造成缺貨損失。我們需要找到一個(gè)最優(yōu)訂購(gòu)量使得期望總成本進(jìn)貨成本 損耗成本 缺貨機(jī)會(huì)成本最低。這四個(gè)模塊環(huán)環(huán)相扣預(yù)測(cè)的準(zhǔn)確性直接決定后續(xù)決策的質(zhì)量。在論文中必須清晰地畫(huà)出這個(gè)邏輯框架圖并闡述模塊間的數(shù)據(jù)流向。2.2 模型選型的深層考量為什么不能直接用線性回歸預(yù)測(cè)銷量然后定價(jià)因?yàn)楹雎粤藙?dòng)態(tài)博弈和不確定性。對(duì)于需求預(yù)測(cè)單純用ARIMA模型可能不夠。蔬菜銷售序列常有突變點(diǎn)如促銷、天氣突變。我推薦采用融合模型例如“ARIMA 特征工程 LightGBM/XGBoost”。ARIMA負(fù)責(zé)捕捉線性時(shí)間依賴樹(shù)模型則能更好地處理非線性關(guān)系并吸納節(jié)假日、星期幾等類別型特征。這樣既能利用經(jīng)典時(shí)序模型的穩(wěn)定性又能發(fā)揮機(jī)器學(xué)習(xí)模型的強(qiáng)大擬合能力。對(duì)于定價(jià)模型這是體現(xiàn)建模深度的關(guān)鍵。簡(jiǎn)單成本加成法成本×1利潤(rùn)率太初級(jí)。我采用的方法是基于價(jià)格彈性的收益管理模型。首先利用歷史數(shù)據(jù)對(duì)不同蔬菜分段擬合需求函數(shù)例如對(duì)數(shù)線性模型log(Q) a - b*log(P) c*X其中X是其他特征。得到價(jià)格彈性系數(shù)b后對(duì)于預(yù)測(cè)的需求可以通過(guò)求解邊際收益 邊際成本的一階條件來(lái)計(jì)算出理論上的最優(yōu)價(jià)格。這個(gè)價(jià)格還需要考慮市場(chǎng)接受度價(jià)格上限和競(jìng)爭(zhēng)對(duì)手價(jià)格進(jìn)行校準(zhǔn)。對(duì)于補(bǔ)貨模型標(biāo)準(zhǔn)的報(bào)童模型假設(shè)需求分布已知。在實(shí)際中我們可以用預(yù)測(cè)模塊輸出的不是單一值而是一個(gè)需求概率分布例如通過(guò)分位數(shù)回歸或預(yù)測(cè)區(qū)間的上下界來(lái)構(gòu)建。假設(shè)需求服從正態(tài)分布或經(jīng)驗(yàn)分布然后根據(jù)蔬菜的單位利潤(rùn)售價(jià)-成本和單位損耗成本成本處理費(fèi)計(jì)算關(guān)鍵比率。最優(yōu)訂購(gòu)量就是這個(gè)關(guān)鍵比率對(duì)應(yīng)的需求分布分位數(shù)點(diǎn)。這個(gè)計(jì)算過(guò)程必須在論文中詳細(xì)展示。實(shí)操心得在有限的時(shí)間內(nèi)模型復(fù)雜度需要權(quán)衡。對(duì)于新手隊(duì)可以重點(diǎn)打磨需求預(yù)測(cè)模塊使用相對(duì)穩(wěn)健的融合模型并對(duì)定價(jià)和補(bǔ)貨采用簡(jiǎn)化版模型如考慮價(jià)格彈性的定價(jià)和經(jīng)典報(bào)童模型把邏輯講透同樣能獲得不錯(cuò)評(píng)價(jià)。對(duì)于沖獎(jiǎng)隊(duì)則需要在需求分布估計(jì)、多商品聯(lián)合補(bǔ)貨考慮資金和倉(cāng)儲(chǔ)約束等細(xì)節(jié)上做更深度的優(yōu)化。3. 核心模塊的詳細(xì)實(shí)現(xiàn)與數(shù)據(jù)處理這一部分我們深入到每個(gè)模塊的代碼和計(jì)算細(xì)節(jié)我會(huì)用偽代碼和關(guān)鍵公式來(lái)說(shuō)明你可以很容易地用PythonPandas, Statsmodels, Scikit-learn或MATLAB實(shí)現(xiàn)。3.1 數(shù)據(jù)預(yù)處理與特征工程數(shù)據(jù)質(zhì)量決定模型天花板。我們拿到的是sales_data.csv每日銷量、損耗、售價(jià)和cost_data.csv每日批發(fā)價(jià)。import pandas as pd import numpy as np # 1. 數(shù)據(jù)加載與合并 sales_df pd.read_csv(sales_data.csv, parse_dates[date]) cost_df pd.read_csv(cost_data.csv, parse_dates[date]) df pd.merge(sales_df, cost_df, on[date, vegetable_id], howleft) # 2. 異常值處理 # 假設(shè)銷量為0但損耗大于閾值可能是數(shù)據(jù)記錄錯(cuò)誤用前后均值填充 def fix_abnormal_sales(group): mask (group[sales] 0) (group[waste] group[waste].quantile(0.75)) group.loc[mask, sales] group[sales].replace(0, np.nan).ffill().bfill() return group df df.groupby(vegetable_id).apply(fix_abnormal_sales) # 3. 特征工程 df[day_of_week] df[date].dt.dayofweek df[is_weekend] df[day_of_week].isin([5,6]).astype(int) df[month] df[date].dt.month df[price_cost_ratio] df[selling_price] / df[cost_price] # 價(jià)成本比重要特征 # 滯后特征前1天前7天的銷量和價(jià)格對(duì)預(yù)測(cè)至關(guān)重要 for lag in [1, 7]: df[fsales_lag_{lag}] df.groupby(vegetable_id)[sales].shift(lag) df[fprice_lag_{lag}] df.groupby(vegetable_id)[selling_price].shift(lag) # 4. 處理缺失值由滯后特征產(chǎn)生 df df.dropna()關(guān)鍵點(diǎn)price_cost_ratio售價(jià)成本比是一個(gè)強(qiáng)力特征它能間接反映市場(chǎng)的供需緊張程度。滯后特征lag features是時(shí)間序列預(yù)測(cè)的標(biāo)配。3.2 需求預(yù)測(cè)模型的構(gòu)建與訓(xùn)練我們?yōu)槊糠N蔬菜單獨(dú)訓(xùn)練一個(gè)預(yù)測(cè)模型如果商品太多可以考慮聚類后對(duì)類目建模。from statsmodels.tsa.arima.model import ARIMA import lightgbm as lgb from sklearn.model_selection import TimeSeriesSplit def train_demand_model(veg_df, veg_id): # veg_df 是單個(gè)蔬菜的數(shù)據(jù)框 # 劃分訓(xùn)練集和測(cè)試集時(shí)間序列不能隨機(jī)劃分 train_size int(len(veg_df) * 0.8) train, test veg_df.iloc[:train_size], veg_df.iloc[train_size:] # 方法一ARIMA模型作為基線 arima_model ARIMA(train[sales], order(2,1,2)) # (p,d,q)參數(shù)需通過(guò)AIC/BIC準(zhǔn)則網(wǎng)格搜索確定 arima_result arima_model.fit() arima_forecast arima_result.forecast(stepslen(test)) # 方法二LightGBM融合模型 features [day_of_week, is_weekend, month, price_cost_ratio, sales_lag_1, sales_lag_7, price_lag_1, cost_price] target sales lgb_train lgb.Dataset(train[features], labeltrain[target]) lgb_test lgb.Dataset(test[features], labeltest[target], referencelgb_train) params { objective: regression, metric: rmse, boosting_type: gbdt, num_leaves: 31, learning_rate: 0.05, feature_fraction: 0.9 } gbm_model lgb.train(params, lgb_train, valid_sets[lgb_test], callbacks[lgb.early_stopping(50)]) lgb_forecast gbm_model.predict(test[features]) # 融合預(yù)測(cè)簡(jiǎn)單加權(quán)平均 final_forecast 0.3 * arima_forecast 0.7 * lgb_forecast return final_forecast, gbm_model # 返回預(yù)測(cè)值和模型用于后續(xù)新數(shù)據(jù)預(yù)測(cè)注意事項(xiàng)ARIMA的(p,d,q)參數(shù)選擇至關(guān)重要。通常使用auto_arima函數(shù)來(lái)自pmdarima庫(kù)進(jìn)行自動(dòng)定階但手動(dòng)分析ACF自相關(guān)和PACF偏自相關(guān)圖是理解數(shù)據(jù)特性的好習(xí)慣。對(duì)于LightGBM要防止過(guò)擬合特別是數(shù)據(jù)量不大時(shí)需嚴(yán)格控制num_leaves和min_data_in_leaf等參數(shù)。3.3 定價(jià)模型從價(jià)格彈性到最優(yōu)價(jià)格這是整個(gè)項(xiàng)目的精華。我們以小白菜為例演示如何計(jì)算最優(yōu)價(jià)格。估計(jì)價(jià)格彈性 使用歷史數(shù)據(jù)擬合需求模型。為了更穩(wěn)健我建議使用對(duì)數(shù)-對(duì)數(shù)形式常彈性模型log(Q) β0 β1 * log(P) β2 * X ε其中Q是銷量P是售價(jià)X是控制變量如星期幾、成本價(jià)。β1就是價(jià)格彈性系數(shù)通常為負(fù)數(shù)。其絕對(duì)值越大說(shuō)明需求對(duì)價(jià)格越敏感。import statsmodels.api as sm # 假設(shè) df_veg 是小白菜的歷史數(shù)據(jù) df_veg[log_sales] np.log(df_veg[sales] 1) # 加1防止對(duì)0取對(duì)數(shù) df_veg[log_price] np.log(df_veg[selling_price]) X df_veg[[log_price, day_of_week, cost_price]] X sm.add_constant(X) # 添加常數(shù)項(xiàng) y df_veg[log_sales] model sm.OLS(y, X).fit() price_elasticity model.params[log_price] # 這就是我們需要的價(jià)格彈性系數(shù) β1 print(f小白菜的價(jià)格彈性估計(jì)值為: {price_elasticity:.3f})計(jì)算最優(yōu)價(jià)格 在已知成本價(jià)C、預(yù)測(cè)的基礎(chǔ)需求量Q0在某個(gè)參考價(jià)格P0下和價(jià)格彈性e的情況下最大化利潤(rùn)π (P - C) * Q。 其中需求函數(shù)為Q Q0 * (P / P0)^e。 通過(guò)求導(dǎo)dπ/dP 0可以得到理論最優(yōu)價(jià)格P*的公式P* (e / (1 e)) * C這是一個(gè)非常重要的結(jié)論最優(yōu)價(jià)格與成本價(jià)成正比與價(jià)格彈性系數(shù)有關(guān)。彈性越大越負(fù)最優(yōu)價(jià)格越接近成本價(jià)彈性越小越缺乏彈性可以定更高的溢價(jià)。# 假設(shè)從預(yù)測(cè)模塊得到在參考價(jià)格 P05.0元時(shí)預(yù)測(cè)需求 Q0100公斤 C 3.5 # 當(dāng)日進(jìn)貨成本 e -2.0 # 估計(jì)出的價(jià)格彈性例如-2.0 P0 5.0 Q0 100 if e -1: # 確保需求有彈性 P_optimal (e / (1 e)) * C # 注意e是負(fù)數(shù)所以 (e/(1e)) 是一個(gè)大于1的因子 print(f理論最優(yōu)價(jià)格為: {P_optimal:.2f} 元) # 需要檢查 P_optimal 是否在合理市場(chǎng)區(qū)間內(nèi)否則取邊界值 P_final min(max(P_optimal, C * 1.1), C * 2.0) # 例如限制在1.1倍到2倍成本之間 print(f經(jīng)市場(chǎng)校準(zhǔn)后的最終定價(jià)為: {P_final:.2f} 元)3.4 補(bǔ)貨決策報(bào)童模型的具體應(yīng)用定價(jià)完成后我們知道了最終售價(jià)P和成本C。假設(shè)當(dāng)日未售出的蔬菜殘值為S可能為0或極低的處理價(jià)缺貨造成的商譽(yù)損失或機(jī)會(huì)成本折算為G。計(jì)算關(guān)鍵比率Cu P - C G代表單位欠貨成本少進(jìn)一件的損失。Co C - S代表單位超儲(chǔ)成本多進(jìn)一件的損失。關(guān)鍵比率Critical RatioCu / (Cu Co)。 這個(gè)比率衡量了“容忍缺貨”的相對(duì)成本。比率越高說(shuō)明缺貨損失越大就應(yīng)該多進(jìn)貨。確定最優(yōu)訂購(gòu)量 從需求預(yù)測(cè)模塊中我們不僅得到了一個(gè)點(diǎn)預(yù)測(cè)μ還應(yīng)該得到一個(gè)預(yù)測(cè)分布例如假設(shè)需求服從均值為μ標(biāo)準(zhǔn)差為σ的正態(tài)分布。最優(yōu)訂購(gòu)量Q*就是這個(gè)分布上累積概率等于關(guān)鍵比率的分位數(shù)。Q* F^(-1)(Critical Ratio)其中F是需求分布的累積分布函數(shù)。from scipy.stats import norm # 假設(shè)參數(shù) P 6.0 # 最終售價(jià) C 3.5 # 成本 S 0.5 # 殘值元/公斤 G 1.0 # 單位缺貨機(jī)會(huì)成本元 Cu P - C G # 6.0 - 3.5 1.0 3.5 Co C - S # 3.5 - 0.5 3.0 critical_ratio Cu / (Cu Co) # 3.5 / (3.53.0) ≈ 0.538 # 假設(shè)預(yù)測(cè)需求服從 N(μ100, σ20) mu 100 sigma 20 Q_optimal norm.ppf(critical_ratio, locmu, scalesigma) # 求正態(tài)分布的分位數(shù) Q_optimal int(np.round(Q_optimal)) # 取整 print(f關(guān)鍵比率為: {critical_ratio:.3f}) print(f最優(yōu)補(bǔ)貨量為: {Q_optimal} 公斤)實(shí)操心得G缺貨成本最難估計(jì)它包含了顧客流失、口碑下降等隱性損失。在比賽中可以將其設(shè)定為k * (P - C)即單位利潤(rùn)的k倍例如k0.5并進(jìn)行敏感性分析說(shuō)明不同k值對(duì)訂購(gòu)量的影響。這能體現(xiàn)你思考的全面性。4. 模型集成、驗(yàn)證與策略分析單個(gè)模型跑通只是第一步要讓方案有說(shuō)服力必須進(jìn)行系統(tǒng)的驗(yàn)證和策略分析。4.1 模型集成與滾動(dòng)預(yù)測(cè)在實(shí)際應(yīng)用中我們每天都要運(yùn)行一次這個(gè)決策流程。這就需要建立一個(gè)滾動(dòng)預(yù)測(cè)與決策系統(tǒng)。滾動(dòng)訓(xùn)練每天用截至到前一天的所有歷史數(shù)據(jù)重新訓(xùn)練預(yù)測(cè)模型或每周重訓(xùn)。這能讓模型持續(xù)學(xué)習(xí)到最新的趨勢(shì)。多步預(yù)測(cè)對(duì)于補(bǔ)貨可能需要預(yù)測(cè)未來(lái)幾天的需求如果供貨周期長(zhǎng)。可以使用多步時(shí)間序列預(yù)測(cè)方法或?qū)尾筋A(yù)測(cè)模型迭代使用。集成決策將定價(jià)模塊和補(bǔ)貨模塊串聯(lián)。流程是輸入最新數(shù)據(jù) → 更新需求預(yù)測(cè)模型 → 運(yùn)行定價(jià)模型得到明日售價(jià) → 將此售價(jià)代入補(bǔ)貨模型計(jì)算最優(yōu)訂購(gòu)量。在論文中你應(yīng)該用一張清晰的流程圖可以用Visio或PPT畫(huà)然后截圖插入來(lái)展示這個(gè)自動(dòng)化決策流程并附上一段偽代碼說(shuō)明每日的自動(dòng)化腳本如何運(yùn)行。4.2 模型驗(yàn)證與效果評(píng)估不能只說(shuō)自己模型好要用數(shù)據(jù)證明。我們需要設(shè)計(jì)合理的驗(yàn)證方式。歷史數(shù)據(jù)回測(cè)將最后一個(gè)月的數(shù)據(jù)作為“測(cè)試集”模擬每天根據(jù)過(guò)去的數(shù)據(jù)做決策將決策結(jié)果定價(jià)、補(bǔ)貨量與當(dāng)天的實(shí)際最優(yōu)決策事后諸葛亮進(jìn)行對(duì)比。評(píng)估指標(biāo)包括利潤(rùn)提升你的模型策略下的累計(jì)模擬利潤(rùn) vs. 實(shí)際歷史利潤(rùn)或 vs. 簡(jiǎn)單策略如“均價(jià)策略”、“成本加成策略”的利潤(rùn)。損耗率模型策略下的平均損耗率 vs. 歷史實(shí)際損耗率。缺貨率模型策略下發(fā)生缺貨的天數(shù)比例。敏感性分析這是拿高分的亮點(diǎn)。分析關(guān)鍵參數(shù)變動(dòng)對(duì)整體利潤(rùn)的影響。價(jià)格彈性估計(jì)誤差的影響如果彈性系數(shù)估計(jì)有±10%的偏差利潤(rùn)會(huì)變化多少需求預(yù)測(cè)誤差的影響假設(shè)預(yù)測(cè)誤差RMSE增大20%對(duì)補(bǔ)貨決策和最終利潤(rùn)的沖擊有多大成本波動(dòng)的魯棒性批發(fā)價(jià)格突然上漲10%你的定價(jià)和補(bǔ)貨模型能否快速適應(yīng)利潤(rùn)能否保持穩(wěn)定通過(guò)敏感性分析你可以指出模型的強(qiáng)項(xiàng)和脆弱點(diǎn)并提出改進(jìn)方向例如引入更頻繁的彈性系數(shù)估計(jì)、建立更穩(wěn)健的預(yù)測(cè)區(qū)間這體現(xiàn)了建模的深度和批判性思維。4.3 策略擴(kuò)展與商業(yè)洞見(jiàn)一個(gè)優(yōu)秀的解決方案不應(yīng)止步于模型本身還應(yīng)能提煉出對(duì)管理有指導(dǎo)意義的策略。商品分類管理根據(jù)計(jì)算出的價(jià)格彈性和銷售特征如銷量、利潤(rùn)貢獻(xiàn)可以將蔬菜分為四類高彈性高銷量敏感商品應(yīng)保持低價(jià)競(jìng)爭(zhēng)定價(jià)接近成本追求薄利多銷和流量。低彈性高利潤(rùn)明星商品需求穩(wěn)定對(duì)價(jià)格不敏感可以定較高價(jià)格獲取高毛利。高彈性低銷量問(wèn)題商品考慮促銷清倉(cāng)或減少進(jìn)貨。低彈性低銷量淘汰商品考慮下架。 在論文中做一個(gè)矩陣圖將幾種主要蔬菜歸類并給出差異化的定價(jià)和補(bǔ)貨策略建議。聯(lián)合補(bǔ)貨與約束優(yōu)化原題是單品決策。現(xiàn)實(shí)中倉(cāng)庫(kù)容量、采購(gòu)資金、物流車次是有限的。可以提出一個(gè)擴(kuò)展模型在總預(yù)算和總倉(cāng)容的約束下如何分配不同蔬菜的訂購(gòu)量使得總期望利潤(rùn)最大。這引出了一個(gè)線性/整數(shù)規(guī)劃問(wèn)題。即使由于時(shí)間關(guān)系無(wú)法完全實(shí)現(xiàn)在論文的“展望”部分提出這個(gè)想法并簡(jiǎn)述建模思路決策變量、目標(biāo)函數(shù)、約束條件能極大提升方案的完整性和深度。動(dòng)態(tài)調(diào)價(jià)機(jī)制模型可以不止每天運(yùn)行一次。對(duì)于保質(zhì)期極短的商品如葉菜可以考慮在當(dāng)天傍晚進(jìn)行二次調(diào)價(jià)打折促銷以進(jìn)一步減少損耗。這可以建模為一個(gè)兩階段決策問(wèn)題。5. 論文寫(xiě)作要點(diǎn)與常見(jiàn)問(wèn)題排查模型建得好還要論文寫(xiě)得好。國(guó)賽評(píng)閱時(shí)間緊清晰的表達(dá)和邏輯至關(guān)重要。5.1 論文結(jié)構(gòu)與寫(xiě)作技巧摘要這是門面。用一段話精煉概括問(wèn)題、你的核心方法例如“本文構(gòu)建了融合ARIMA與LightGBM的需求預(yù)測(cè)模型結(jié)合價(jià)格彈性理論建立了非線性定價(jià)模型并利用報(bào)童模型框架進(jìn)行補(bǔ)貨決策”、以及主要結(jié)論/指標(biāo)例如“通過(guò)歷史回測(cè)本模型使綜合利潤(rùn)提升了15.2%平均損耗率降低了5%”。避免在摘要中出現(xiàn)公式和細(xì)節(jié)。問(wèn)題重述與分析不要照抄題目。用自己的話梳理問(wèn)題的背景、目標(biāo)和難點(diǎn)并畫(huà)出你的整體技術(shù)路線圖。模型假設(shè)與符號(hào)說(shuō)明列出關(guān)鍵、合理的假設(shè)如“短期內(nèi)價(jià)格彈性穩(wěn)定”、“需求預(yù)測(cè)誤差服從正態(tài)分布”。制作一個(gè)清晰的符號(hào)說(shuō)明表讓評(píng)委隨時(shí)查閱。模型建立與求解這是核心章節(jié)。對(duì)應(yīng)我們前面的模塊分小節(jié)撰寫(xiě)。每個(gè)模型都要講清“為什么用這個(gè)模型”再給出公式和求解步驟。關(guān)鍵公式必須編號(hào)。求解過(guò)程可以簡(jiǎn)述但重要的計(jì)算步驟如關(guān)鍵比率的推導(dǎo)、最優(yōu)價(jià)格公式必須呈現(xiàn)。模型檢驗(yàn)與結(jié)果分析展示回測(cè)結(jié)果用圖表說(shuō)話。比如繪制“模型策略 vs. 實(shí)際歷史”的利潤(rùn)對(duì)比折線圖、損耗率對(duì)比柱狀圖。展示敏感性分析的表格或趨勢(shì)圖。對(duì)結(jié)果進(jìn)行深入分析解釋為什么模型有效以及結(jié)果說(shuō)明了什么。模型評(píng)價(jià)與推廣客觀評(píng)價(jià)模型的優(yōu)點(diǎn)數(shù)據(jù)驅(qū)動(dòng)、自動(dòng)化、考慮全面和缺點(diǎn)對(duì)數(shù)據(jù)質(zhì)量依賴高、參數(shù)需要定期校準(zhǔn)。提出可行的改進(jìn)方向如引入天氣數(shù)據(jù)、考慮競(jìng)爭(zhēng)對(duì)手價(jià)格和商業(yè)推廣建議。5.2 常見(jiàn)問(wèn)題與解決方案速查表在備賽和實(shí)際建模中你肯定會(huì)遇到以下問(wèn)題這里是我的解決方案實(shí)錄問(wèn)題現(xiàn)象可能原因排查與解決思路需求預(yù)測(cè)模型在測(cè)試集上誤差巨大1. 過(guò)擬合。2. 存在未考慮的外部突變?nèi)缤蝗坏膼毫犹鞖狻?. 歷史數(shù)據(jù)本身波動(dòng)太大無(wú)規(guī)律。1.檢查過(guò)擬合對(duì)比訓(xùn)練集和驗(yàn)證集誤差。如果訓(xùn)練集誤差遠(yuǎn)小于驗(yàn)證集說(shuō)明過(guò)擬合。需增加正則化L1/L2、減少模型復(fù)雜度如減少樹(shù)模型的深度、或使用更簡(jiǎn)單的模型。2.引入外部變量檢查預(yù)測(cè)誤差大的日期是否為特殊日期節(jié)日、極端天氣。考慮加入“節(jié)假日虛擬變量”或嘗試獲取天氣數(shù)據(jù)作為特征。3.換用更穩(wěn)健的模型對(duì)于波動(dòng)極大的序列可以嘗試使用指數(shù)平滑ETS或 Prophet 模型它們對(duì)異常值相對(duì)不敏感。或者不預(yù)測(cè)具體值轉(zhuǎn)而預(yù)測(cè)銷量區(qū)間分位數(shù)回歸。價(jià)格彈性系數(shù)估計(jì)出來(lái)是正數(shù)不符合常識(shí)1. 存在嚴(yán)重的多重共線性。2. 遺漏重要變量導(dǎo)致價(jià)格變量與誤差項(xiàng)相關(guān)。3. 數(shù)據(jù)中存在“價(jià)格越低銷量越低”的特殊促銷期清倉(cāng)。1.檢查共線性計(jì)算特征間的方差膨脹因子VIF。如果價(jià)格變量與其他變量如成本高度相關(guān)需要剔除或合并變量。2.使用工具變量法如果懷疑價(jià)格是內(nèi)生的例如銷量高時(shí)商家也可能主動(dòng)降價(jià)嘗試尋找一個(gè)只影響價(jià)格但不直接影響銷量的“工具變量”如上一期的批發(fā)市場(chǎng)價(jià)格進(jìn)行兩階段最小二乘法2SLS估計(jì)。這在高級(jí)計(jì)量經(jīng)濟(jì)學(xué)中常用在論文中提及能顯著提升檔次。3.數(shù)據(jù)分段處理將正常銷售期和清倉(cāng)促銷期的數(shù)據(jù)分開(kāi)建模。報(bào)童模型計(jì)算出的訂購(gòu)量總是遠(yuǎn)高于或低于歷史銷量1. 關(guān)鍵比率計(jì)算有誤特別是缺貨成本G估計(jì)不合理。2. 需求分布假設(shè)錯(cuò)誤如實(shí)際為長(zhǎng)尾分布卻用了正態(tài)分布。3. 預(yù)測(cè)的需求均值μ存在系統(tǒng)性偏差。1.校準(zhǔn)缺貨成本G是調(diào)節(jié)訂購(gòu)量最重要的杠桿。通過(guò)模擬不同G值下的歷史利潤(rùn)反向找出使歷史總利潤(rùn)最大化的G值范圍。2.檢驗(yàn)需求分布繪制歷史需求量的直方圖和Q-Q圖檢驗(yàn)其是否接近正態(tài)分布。如果不符可以使用經(jīng)驗(yàn)分布或更靈活的分布如負(fù)二項(xiàng)分布適用于計(jì)數(shù)數(shù)據(jù)。3.修正預(yù)測(cè)偏差如果模型持續(xù)高估或低估在最終預(yù)測(cè)值上加一個(gè)修正項(xiàng)偏差 歷史預(yù)測(cè)誤差的均值。模型在回測(cè)中利潤(rùn)提升不明顯甚至為負(fù)1. 模型各部分預(yù)測(cè)、定價(jià)、補(bǔ)貨誤差疊加導(dǎo)致整體效果差。2. 模型過(guò)于復(fù)雜在樣本外不穩(wěn)定。3. 評(píng)估基準(zhǔn)選擇不合理。1.模塊化診斷單獨(dú)測(cè)試每個(gè)模塊的準(zhǔn)確性。例如固定使用歷史實(shí)際價(jià)格只測(cè)試補(bǔ)貨模型的效果或固定使用簡(jiǎn)單補(bǔ)貨規(guī)則只測(cè)試定價(jià)模型的效果。找出最薄弱的環(huán)節(jié)進(jìn)行改進(jìn)。2.簡(jiǎn)化模型回歸基礎(chǔ)。嘗試使用移動(dòng)平均法預(yù)測(cè)需求用成本加成法定價(jià)用簡(jiǎn)單的s, S策略補(bǔ)貨看是否比復(fù)雜模型更穩(wěn)定。有時(shí)簡(jiǎn)單規(guī)則的魯棒性更好。3.設(shè)定合理基準(zhǔn)對(duì)比基準(zhǔn)應(yīng)該是現(xiàn)實(shí)中可能采用的簡(jiǎn)單策略如“昨日銷量即為今日訂貨量”、“售價(jià)恒定”。確保你的模型確實(shí)超越了這些“樸素策略”。5.3 代碼實(shí)現(xiàn)與工具選擇建議語(yǔ)言選擇Python是首選。Pandas進(jìn)行數(shù)據(jù)處理Statsmodels/Sktime做傳統(tǒng)時(shí)間序列Scikit-learn/LightGBM/XGBoost做機(jī)器學(xué)習(xí)SciPy進(jìn)行優(yōu)化和統(tǒng)計(jì)計(jì)算Matplotlib/Seaborn/Plotly畫(huà)圖。生態(tài)完整代碼簡(jiǎn)潔。MATLAB在時(shí)間序列分析和優(yōu)化求解上有工具箱優(yōu)勢(shì)但數(shù)據(jù)處理和機(jī)器學(xué)習(xí)庫(kù)的豐富性不如Python。如果隊(duì)伍特別熟悉MATLAB也可以使用。必須避免的坑不要在論文里貼大段代碼只展示最關(guān)鍵的一小段如關(guān)鍵比率計(jì)算、模型訓(xùn)練的核心參數(shù)設(shè)置其余放在附錄。確保代碼可復(fù)現(xiàn)在代碼開(kāi)頭設(shè)置隨機(jī)種子如np.random.seed(42)并注明所有依賴庫(kù)的版本。注重效率如果商品種類多如50種為每種蔬菜單獨(dú)訓(xùn)練模型可能耗時(shí)。可以考慮使用scikit-learn的MultiOutputRegressor或深度學(xué)習(xí)模型進(jìn)行多任務(wù)學(xué)習(xí)一次性預(yù)測(cè)所有商品的需求。最后想說(shuō)的是數(shù)學(xué)建模比賽和解決真實(shí)業(yè)務(wù)問(wèn)題一脈相承核心都是“用合理的模型刻畫(huà)復(fù)雜的現(xiàn)實(shí)”。國(guó)賽C題提供了一個(gè)絕佳的練兵場(chǎng)。從理解業(yè)務(wù)開(kāi)始到數(shù)據(jù)清洗、特征工程、模型構(gòu)建、驗(yàn)證分析最后形成決策建議這個(gè)完整流程走一遍收獲的絕不僅僅是一個(gè)獎(jiǎng)項(xiàng)更是一套解決實(shí)際問(wèn)題的數(shù)據(jù)思維框架。在實(shí)際操作中我最大的體會(huì)是沒(méi)有完美的模型只有最適合當(dāng)前數(shù)據(jù)和業(yè)務(wù)場(chǎng)景的模型。大膽假設(shè)小心求證不斷用結(jié)果反饋來(lái)修正你的模型這才是數(shù)據(jù)工作的常態(tài)。希望這份超詳細(xì)的拆解能幫你不僅做出這道題更能吃透這一類題。