使用銷售預測 AI 優化零售商收入
已發表: 2022-03-11預測是一種使用歷史數據和事件來建立關於未來趨勢、潛在災難和任何主題的整體行為的估計的技術。 預測可用作決策分析的概率支持,以估計費用、收入和預算計劃。
商業中的預測可以分為兩個不同的類別:定性預測和定量預測。
- 定性預測。 定性預測與市場研究和市場策略有關,因此它更受專家驅動和人為因素的影響。 它通常旨在製定短期戰略。
- 定量預測。 定量預測不包括任何人為因素。 它僅取決於實體擁有的歷史數據,旨在預測銷售、價格和其他財務方面等一些因素在長期內的表現。
有關更多信息,您可以查看 Investopedia 的財務預測入門。
兩種類型的預測都顯示出很大的前景,並成功地為許多實體創造了業務增強功能。
如果您想了解更多關於預測如何影響市場決策的信息,可以從 Stefan Luckner 等人的《預測市場:基本原理、設計和應用》開始。
我們可以使用定量預測解決的一個問題是需求預測或銷售預測。
需求預測和銷售預測方法
假設您是一家經營許多商店的零售商,並且每家商店都有一個靜態的產品庫存補貨系統,該系統基於人類決策,這些決策基於季節和市場趨勢等特定事件。
有時,您會遇到可能導致兩個主要問題的這些問題之一:
- 積壓的產品。 計劃在特定時間範圍內出售大量產品但未售出。
- 缺貨的產品。 有機會銷售產品,但由於產品不可用而無法銷售。
根據國際人道法集團對 600 家家庭和零售商的調查,由於缺貨問題,零售商每年損失近 1 萬億美元的銷售額。
“根據通過電子郵件發送給 Retail Dive 的報告,購物者在三分之一的購物行程中遇到缺貨的情況。 在食品、藥品和大眾零售商,他們在五分之一的行程中遇到缺貨的情況,在百貨商店和專賣店有四分之一,在電子商店有三分之一,” IHL Group 發現。
看起來,這兩個問題都會導致收入下降,因為我們要么失去了銷售機會,要么在未售出的產品上投入了更多資金,這意味著擁有不會很快產生收入的資產來補償其成本。
這顯然不利於實體的現金流,為了應對這種風險,我們需要做兩件事:
- 更多的輸入來幫助我們做出決定
- 可以對庫存補貨系統進行長期戰略規劃的預測團隊
所以,問題是:有哪些跡象表明您需要在公司中採用人工智能來幫助您進行預測?
要做出此決定,您需要專家回答以下問題:
- 預測您的銷售渠道是否困難?
- 您的銷售預測是否不准確或不夠準確(即使您有歷史數據)?
- 您是否有缺貨或庫存過多的問題?
- 您是否無法從您擁有的數據中提取描述性和推理性見解來推動您的決策和計劃?
這些問題的答案應該是一個明確的信號,可以幫助您決定是否開始將 AI 應用到您的預測策略中。
人工智能如何使銷售預測過程受益?
人工智能在許多公司中顯示出超越人類預測的巨大成果,能夠更快地做出決策和規劃,以及更可靠的風險管理策略。 這就是為什麼頂級公司在他們的計劃中採用人工智能。
在處理需求預測問題時,可以使用時間序列預測方法來預測每個產品的銷售量,從而使企業能夠優化庫存補充,最大限度地減少上述問題的發生。 但是,由於缺乏必要的功能,許多模型難以在單個產品級別或產品類別級別進行預測。 所以,問題是:我們如何讓它發揮作用並充分利用我們的數據?
對於現實生活中的零售商來說,這些問題絕非微不足道。 您要么擁有 1,000 多種產品,這些產品在數據集中引入了大量非線性和多變量依賴關係,要么您需要被告知預計的庫存補充量並提前大量通知才能生產或購買,或者做任何你需要在需求實現時獲得它的東西。
在這種情況下,像 ARIMA 和 ETS 這樣的經典模型將無法執行,我們將需要像 RNN 和 XGBoost 這樣更健壯的方法,這就是為什麼我們需要大量的特徵創建來解決這個問題。
為此,我們需要:
- 獲得解釋產品多樣性和多樣性所需的必要輸入特徵。
- 對我們的數據進行分類,因此每個類別都具有相同的時間序列行為,並且每個類別都將使用獨立模型進行處理。
- 在獲得的分類輸入特徵上訓練我們的模型。
為了本文的方便,我們將以 XGBoost 作為此類模型的示例。
銷售預測模型中的必需功能
此問題所需的一組特徵分為四個主要組:
- 與時間相關的功能
- 銷售相關功能
- 價格相關功能
- 股票相關功能
時間相關特徵
與深度學習(循環神經網絡)不同,機器學習模型無法在時間序列內獲得長期或短期依賴關係,而無需為日期時間特徵創建手動特徵提取層。
可以從日期中提取許多特徵,例如:
- 年
- 日
- 小時
- 週末或工作日(無論當天是工作日還是周末)
- 星期幾
許多方法只是提取這些時間特徵並將它們用作輸入和訓練模型,但可以進行進一步的工程設計。 正如我們所看到的,特徵(天、小時、星期幾)是周期性的,這意味著它們具有一系列重複值。 模型如何處理這個問題?
簡短的回答是,它不能,因為模型看到的是 00:00 小時與 23:00 相距 23 小時,但實際上,距 23:00 僅 1 小時。 解決這個問題的一種方法是將這些特徵轉換為循環變換。
使用正餘弦或向量表示的概念,可以將每小時(24小時)轉換為角度,使用它們的正餘弦將使模型更容易檢測小時之間的真實比例,無論的周期性。
這將消除週期性時間特徵或任何週期性特徵中發生的不連續性。
對於我們的文章,我們將使用公開的 Sample Superstore 數據集,並嘗試預測某個產品類別的目標月銷售額。
此外,我們將使用 Python 3.7 環境和以下庫:
- 數字貨幣
- 熊貓
- XGBoost
- 學習
現在,我將向您展示如何構建週期特徵轉換功能並測試它是否有用。
def convert_periodic(val,period): theta = 2*np.pi*val/period sin_period = np.sin(theta) cos_period = np.cos(theta) return sin_period,cos_period def convert_month(x): return convert_periodic(x,12) df['sin_month'], df['cos_month'] = zip(*df['month'].map(convert_month))
有了這個,我們準備測試添加的功能是否會提高性能。
X = df.drop(['Order Date','Sales','sin_month', 'cos_month'],axis = 1) y = np.log1p(df['Sales']) X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2, shuffle=False)
正如我們所見,我們對目標銷售特徵進行了 log 1p 變換,因為它是一個傾斜的特徵(不是正態分佈的)。

現在,我們將在數據上擬合 XGBoost 回歸器。
y_pred = model.predict(X_test) print(f'Loss without cyclic conversion on testing set is {sqrt(mean_squared_error(y_pred,y_test))}') Loss without cyclic conversion on testing set is 0.4313676193485837
接下來,我們將嘗試使用我們創建的功能。
X = df.drop(['Order Date','Sales'],axis = 1) y = np.log1p(df['Sales']) X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2, shuffle=False) y_pred = model.predict(X_test) print(f'Loss with cyclic conversion on testing set is {sqrt(mean_squared_error(y_pred,y_test))}') Loss with cyclic conversion on testing set is 0.33868030449130826
正如我們所見,損失從 0.43 RMSE 提高到 0.33 RMSE。
根據您的問題,您可以考慮的其他一些與時間相關的功能是:
- 自商品進入商店以來的月數
- 自上次銷售以來的天數
銷售相關功能
這是預測我們的銷售所需的主要核心輸入特徵,那麼如何充分利用銷售數據呢? 我們可以使用滯後和自相關的概念來實現這一點。
滯後特徵是產品的歷史銷售記錄。 例如,如果我們將每月銷售額的 12 滯後特徵作為模型的輸入來預測 2020 年 5 月的銷售額,這意味著我們將為模型提供 2019 年 5 月至 2020 年 4 月之間的數據記錄。這真的很有幫助。
此外,它可以使用自相關圖來解釋,以檢查目標特徵與其滯後特徵的相關程度。 這也有助於在滯後特徵中僅選擇相關特徵,因此我們減少了內存使用和特徵冗餘。
這就是我們如何將滯後特徵添加到我們的數據框中:
for i in range(3): df[f'lag_{i+1}'] = df['Sales'].shift(i+1) df = df.dropna() df.head()
在這裡,我選擇了一個三滯後特徵的值來包含在我們的訓練集中。 這個特性是一個超參數——你可以根據自相關圖來選擇它,或者通過嘗試許多值並在調整階段選擇最佳值。
X = df.drop(['Order Date','Sales'],axis = 1) y = np.log1p(df['Sales']) X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2, shuffle=False) y_pred = model.predict(X_test) print(f'Loss with lag features on testing set is {sqrt(mean_squared_error(y_pred,y_test))}') Loss with lag and aggregated sales features on testing set is 0.2862175857169188
現在,RMSE 已提高到 0.28,同時使用了滯後特徵和循環轉換。
您可以添加一些額外的與銷售相關的功能:
- 已售商品分數(按商店總銷售額計算的已售商品比例)
- 商品類別的銷售事件頻率
- 增加資歷的概念
資歷是為商店中的新商品分配資歷級別而引入的概念:
- 資歷 0:公司的新項目
- 資歷1:從未在本店銷售但在公司其他店鋪銷售的商品
- 資歷2:之前在這家商店出售過的物品
價格相關功能
一個簡單的論點是,銷售上升和下降的直接原因之一是價格和促銷。 價格是區分不同類別、子類別和超類別產品的最佳方法之一。
例如,假設已經為每個產品分配了一個類別和一個子類別,可以創建以下價格特徵:
- (平均值、最大值、最小值、中值)跨類別的價格
- (平均值、最大值、最小值、中值)子類別的價格
- 這些統計數據之間的比較,例如類別和子類別中每個統計數據之間的差異
這種聚合可以使用按主題進行的許多分組來執行多次(假設我們的目標是預測每月需求),例如:
- 每月、商店、類別
- 每月、商店、子類別
- 每月、商店、項目、類別
- 每月、商店、項目、子類別
此外,除了每月分組之外,還可以添加更多功能來研究整體價格的行為。
股票相關功能
這在零售商和銷售預測員中並不常見,但它對銷售預測模型產生了很大影響。 庫存數據集主要有每個商店每天的每個產品的庫存數據。 由此,我們可以將其與銷售數據相結合,得到每個產品的月周轉率。 這個比率將表明產品庫存完全售出的速度,它有兩個主要好處:
- 它可以幫助模型根據當前的庫存水平預測銷售。
- 它可以幫助我們利用這個價值將產品分為慢速、中速和快速移動的產品。 這種聚類將幫助我們進行決策和建模。
為此,您需要每種產品的每日庫存數據以及銷售數據,然後您可以計算庫存周轉率,如下所示:
提示:這些聚合是基於時間範圍完成的。 例如,如果我們正在預測每月銷售額,那麼 ITO 將被計算為上個月的總銷售額超過同月平均庫存值。
銷售預測可以將數據轉化為機會
總之,銷售預測可以幫助公司增加收入並實現盈利,前提是他們擁有正確的數據管道並使用正確的特徵工程方法。 這篇文章是一個試驗,表明各種數據都可以用來解決這個問題。
每家公司都應該調查是否需要人工智能來解決其預測問題,如果需要,則需要專家人工智能工程師和機器學習工程師的建議來創建自己的銷售預測系統。
如果您是一家願意應用這種銷售預測技術的公司/零售商,請首先收集您可以收集的所有數據,尤其是每日銷售額、每日庫存和每日交易。
一旦掌握了這些數據,您就可以使用它來增加收入並優化庫存補充策略,從而使您的企業能夠利用可用資源獲得盡可能高的利潤,如上面的幾個示例以及領先零售商使用的銷售預測實踐所示.
參考:
數據集
進一步閱讀財務預測