随着我国消费市场的不断发展,市场上的消费模式已经逐步由“以物为主”转变为“以客为主”。在新零售行业,性价比不再是顾客衡量是否购买物品的唯一标准,人们的需求也不仅仅是单一的追求实用性,而是更多的考虑时尚性,把注意力放在“个性化、时尚、美观”等方面。在这类特殊需求的推动下,新零售企业的生产模式逐步向多品种、小批量迈进,这让商场内零售店铺里的饰品和玩具等种类变得更加琳琅满目,同时也给零售行业的库存管理增加了很大的难度。如何根据层级复杂,品类繁多的历史销售数据,以区域层级,小类层级乃至门店 skc(单款单色)层级给出精准的需求预测,是当前大多数新零售企业需要重点关注并思考的问题。你们的团队将从 3 个方向为新零售企业解决“精准需求预测”问题贡献一份力量。请基于附件的数据,思考并解决以下 4 个问题:
问题 1:试分析 2018 年国庆节,双十一,双十二和元旦这四个节假日内各种相关因素对目标 skc 的销售量的影响,可考虑产品销售特征,库存信息,节假日折扣等因素。其中,目标 skc 为销售时间处于 2018 年 7 月 1日至 2018 年 10 月 1 日内且累计销售额排名前 50 的 skc。
问题 2:试结合上述分析结果,预测给定区域内目标小类在 2019 年 10月 1 日后 3 个月中每个月的销售量,给出每个月预测值的 MAPE。其中,目标小类为历史销售时间处于 2019 年 6 月 1 日至 2019 年 10 月 1 日内且累计销售额排名前 10 的小类。
问题 3:为了满足企业更加精准的营销需求,试着建立相关数学模型,在考虑小类预测结果的同时,预测目标小类内所有 skc 在 2019 年 10 月 1日后 12 周内每周的周销量,并给出每周预测值的 MAPE(可以考虑 skc 销售曲线与小类销售曲线之间的差异)。
问题 4:请给企业写一份推荐信,向企业推荐你的预测结果和方法,并说明你们的方案的合理性以及后续的优化方向。
数据准备:
筛选目标 skc:
特征工程:
多元回归分析:
层次分析法:
结果分析和解释:
import pandas as pd
import numpy as np
import statsmodels.api as sm
from pyanp import AHP
# 加载销售数据
sale_data = pd.read_csv('sale_info.csv')
# 筛选目标 skc(根据销售时间和累计销售额排名)
target_skc = sale_data[(sale_data['销售时间'] >= '2018-07-01') & (sale_data['销售时间'] <= '2018-10-01')]
target_skc = target_skc.sort_values(by='累计销售额', ascending=False).head(50)
# 加载产品信息数据和库存信息数据
prod_info = pd.read_csv('prod_info.csv')
inv_info = pd.read_csv('inv_info.csv')
# 合并数据集
merged_data = target_skc.merge(prod_info, on='产品编号').merge(inv_info, on='产品编号')
# 构建多元回归模型
X = merged_data[['产品属性1', '产品属性2', '库存信息', '折扣信息']]
X = sm.add_constant(X) # 添加常数项
y = merged_data['销售量']
model = sm.OLS(y, X).fit()
# 打印回归结果
print(model.summary())
# 层次分析法(AHP)来评估不同因素的相对重要性
ahp = AHP()
ahp.set_matrix([
[1, 2, 3, 4], # 产品属性1对其他因素的相对重要性
[0.5, 1, 2, 3], # 产品属性2对其他因素的相对重要性
[0.33, 0.5, 1, 2], # 库存信息对其他因素的相对重要性
[0.25, 0.33, 0.5, 1] # 折扣信息对其他因素的相对重要性
])
# 计算权重
weights = ahp.get_eigen()
# 打印权重
print("各因素的相对重要性权重:", weights)
数据准备:
GM(1,1)灰色预测模型:
预测:
MAPE计算:
计算每个月的MAPE,以评估模型的准确性。MAPE可以通过以下公式计算:
MAPE = (Σ(|实际销售量 - 预测销售量|) / Σ(实际销售量)) * 100%
对于每个月,使用实际销售数据和预测销售数据进行计算。
结果分析和报告:
敏感性分析:
import numpy as np
# 历史销售数据
sales_data = [10, 12, 15, 20, 22]
# 累积量计算
cumulative_sales = np.cumsum(sales_data)
# 灰色预测模型 GM(1,1)
def gray_forecast(data):
n = len(data)
# 构建累积生成序列
cumulative_sequence = np.zeros(n)
for i in range(1, n):
cumulative_sequence[i] = 0.5 * (cumulative_sales[i] + cumulative_sales[i - 1])
# 构建累积生成数据
data_predict = np.zeros(n)
for i in range(1, n):
data_predict[i] = cumulative_sequence[i] - cumulative_sequence[i - 1]
# 计算模型参数
X = -cumulative_sequence[:-1].reshape(-1, 1)
Y = data_predict[1:]
B = np.dot(np.linalg.inv(np.dot(X.T, X)), np.dot(X.T, Y))
a, b = B[0], B[1]
# 预测未来销售量
predicted_sales = [(data[0] - b/a) * (1 - np.exp(a)) * np.exp(-a*(n+i)) for i in range(3)]
return predicted_sales
# 预测未来3个月的销售量
forecasted_sales = gray_forecast(sales_data)
# 打印预测结果
for i, sales in enumerate(forecasted_sales):
print(f"预测第 {i+1} 个月销售量: {sales}")
数据准备:
BP神经网络模型:
数据预处理:
模型训练:
模型预测:
MAPE计算:
计算每周的MAPE,以评估模型的准确性。MAPE可以通过以下公式计算:
MAPE = (Σ(|实际销售量 - 预测销售量|) / Σ(实际销售量)) * 100%
对于每周,使用实际销售数据和模型预测数据进行计算。
结果分析和报告:
不确定性分析:
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from tensorflow import keras
from tensorflow.keras import layers
# 加载历史销售数据
sales_data = pd.read_csv('sales_data.csv')
# 选择目标小类,其历史销售时间在2019年10月1日后12周内
target_category = '目标小类名称'
target_data = sales_data[sales_data['小类名称'] == target_category]
# 提取特征和目标
X = target_data[['特征1', '特征2', '特征3']]
y = target_data['销售量']
# 数据归一化
scaler = MinMaxScaler()
X = scaler.fit_transform(X)
y = scaler.fit_transform(y.values.reshape(-1, 1))
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 构建BP神经网络模型
model = keras.Sequential()
model.add(layers.Input(shape=(X_train.shape[1],)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(1, activation='linear'))
# 编译模型
model.compile(optimizer='adam', loss='mean_squared_error')
# 训练模型
model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_test, y_test))
# 使用模型进行销售量预测
predicted_sales = model.predict(X_test)
# 计算每周的MAPE
mape = np.mean(np.abs(y_test - predicted_sales) / y_test) * 100
print(f"每周的MAPE: {mape:.2f}%")