使用销售预测 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 将被计算为上个月的总销售额超过同月平均库存值。
销售预测可以将数据转化为机会
总之,销售预测可以帮助公司增加收入并实现盈利,前提是他们拥有正确的数据管道并使用正确的特征工程方法。 这篇文章是一个试验,表明各种数据都可以用来解决这个问题。
每家公司都应该调查是否需要人工智能来解决其预测问题,如果需要,则需要专家人工智能工程师和机器学习工程师的建议来创建自己的销售预测系统。
如果您是一家愿意应用这种销售预测技术的公司/零售商,请首先收集您可以收集的所有数据,尤其是每日销售额、每日库存和每日交易。
一旦掌握了这些数据,您就可以使用它来增加收入并优化库存补充策略,从而使您的企业能够利用可用资源获得尽可能高的利润,如上面的几个示例以及领先零售商使用的销售预测实践所示.
参考:
数据集
进一步阅读财务预测