2020年MathorCup数学建模挑战赛D题新零售目标产品的精准需求预测解题思路与示例代码

一 题目

随着我国消费市场的不断发展,市场上的消费模式已经逐步由“以物为主”转变为“以客为主”。在新零售行业,性价比不再是顾客衡量是否购买物品的唯一标准,人们的需求也不仅仅是单一的追求实用性,而是更多的考虑时尚性,把注意力放在“个性化、时尚、美观”等方面。在这类特殊需求的推动下,新零售企业的生产模式逐步向多品种、小批量迈进,这让商场内零售店铺里的饰品和玩具等种类变得更加琳琅满目,同时也给零售行业的库存管理增加了很大的难度。如何根据层级复杂,品类繁多的历史销售数据,以区域层级,小类层级乃至门店 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:请给企业写一份推荐信,向企业推荐你的预测结果和方法,并说明你们的方案的合理性以及后续的优化方向。
 

二 解题思路与示例代码

问题一

  1. 数据准备

    • 导入并整理销售流水数据 (sale_info.csv)、产品信息表 (prod_info.csv)、库存数据 (inv_info.csv) 和节假日信息表 (holidays_info.csv)。
  2. 筛选目标 skc

    • 从销售流水数据中选择销售时间在2018年7月1日至2018年10月1日内,且累计销售额排名前50的 skc。确保清理和筛选数据以去除异常值和确保数据质量。
  3. 特征工程

    • 从产品信息表、库存信息表中提取与目标 skc 相关的特征,如产品属性、库存情况等。
    • 根据节假日信息表,标识出国庆节、双十一、双十二、元旦等日期,以便后续分析。
  4. 多元回归分析

    • 构建多元线性回归模型,以目标 skc 的销售量作为因变量,各种因素(产品属性、库存情况、折扣等)作为自变量。
    • 使用统计软件(如SPSS或R)进行多元回归分析,得出各因素对销售量的影响程度,同时检验模型的显著性和拟合度。
    • 检查自变量之间的多重共线性,如果存在共线性问题,需要处理或选择适当的自变量。
  5. 层次分析法

    • 使用层次分析法来评估各个因素的相对重要性。这需要将因素分级,然后为每个因素分配权重。
    • 制定判断矩阵,根据专业知识和数据,对不同因素之间的相对权重进行比较和评估。
    • 运用层次分析法的计算步骤,得出不同因素对销售量的相对影响程度。
  6. 结果分析和解释

    • 将多元回归分析和层次分析的结果结合,以解释不同因素对目标 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)

问题二

  1. 数据准备

    • 导入并整理历史销售数据,以及可能的特征数据,如节假日信息和促销活动信息。
    • 从销售数据中选择目标小类,其历史销售时间在2019年6月1日至2019年10月1日内,且累计销售额排名前10的小类。
  2. GM(1,1)灰色预测模型

    • 使用GM(1,1)模型进行销售量的预测。这是一个常用的灰色预测模型,适用于小样本数据。
    • 在建模时,根据历史销售数据,计算累计量,并将其作为模型的输入。
    • 使用Python或其他适当的工具实施GM(1,1)模型。
  3. 预测

    • 利用已建立的GM(1,1)模型,预测目标小类在2019年10月1日后的3个月中每个月的销售量。这将生成一个时间序列的预测结果。
  4. MAPE计算

    • 计算每个月的MAPE,以评估模型的准确性。MAPE可以通过以下公式计算:

      MAPE = (Σ(|实际销售量 - 预测销售量|) / Σ(实际销售量)) * 100%

    • 对于每个月,使用实际销售数据和预测销售数据进行计算。

  5. 结果分析和报告

    • 分析每月的MAPE值,评估模型的性能。
    • 在报告中,详细解释模型的预测结果,包括每个月的销售量和对应的MAPE值。
  6. 敏感性分析

    • 考虑进行敏感性分析,以了解模型的稳健性。可以尝试不同的参数设置或引入随机性,以评估预测结果的不确定性。

问题二示例代码

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}")

问题三

  1. 数据准备

    • 导入并整理历史销售数据,以及可能的特征数据,如节假日信息、促销活动信息等。
    • 选择目标小类,其历史销售时间在2019年10月1日后12周内。
  2. BP神经网络模型

    • 建立基于双隐含层的BP神经网络模型。
    • 定义神经网络的结构,包括输入层、两个隐含层和输出层的节点数,选择适当的激活函数和学习率。
    • 使用Python中的深度学习框架(如TensorFlow、Keras、PyTorch)来实施BP神经网络。
  3. 数据预处理

    • 对历史销售数据进行归一化,确保输入数据在相似的尺度上。
    • 将数据划分为训练集和测试集,通常使用交叉验证来评估模型性能。
  4. 模型训练

    • 使用训练集数据来训练BP神经网络模型。
    • 设置合适的训练轮次(epochs)和批次大小(batch size)。
    • 监控训练过程中的性能指标,如均方误差(MSE)。
  5. 模型预测

    • 使用已建立的BP神经网络模型,预测目标小类在2019年10月1日后的12周内每周的销售量。
  6. MAPE计算

    • 计算每周的MAPE,以评估模型的准确性。MAPE可以通过以下公式计算:

      MAPE = (Σ(|实际销售量 - 预测销售量|) / Σ(实际销售量)) * 100%

    • 对于每周,使用实际销售数据和模型预测数据进行计算。

  7. 结果分析和报告

    • 分析每周的MAPE值,评估模型的性能。
    • 在报告中,详细解释模型的预测结果,包括每周的销售量和对应的MAPE值。
  8. 不确定性分析

    • 考虑对预测结果的不确定性进行敏感性分析,以了解模型的稳健性。这可以通过在模型中引入随机性或调整参数来实现。

问题三示例代码

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}%")

你可能感兴趣的:(数学建模,零售,算法)