2023 mathorcup B题 大数据竞赛建模解析 小鹿学长带你建模!

在这里插入图片描述

问题重述:

在电商零售领域,为了满足上千个商家的需求并有效管理库存,需求预测和库存优化是关键问题。电商平台必须提前了解各种商品在不同仓库中的需求,以便合理分配库存和确保及时交付。此问题分为三部分:

问题一:使用历史需求数据,预测2023年5月16日至5月30日各商家在各仓库的商品需求量,以便优化库存。同时,讨论如何对商家、仓库和商品的时间序列进行分类以使预测更准确。

问题二:考虑新出现的商家+仓库+商品维度,解释这些新维度如何与历史数据相似,以便完成这些新维度的需求量预测。

问题三:电商平台在每年6月举行大型促销活动,这会影响需求量的精准预测。通过去年双十一期间的数据,预测2023年6月1日至6月20日的需求量。

问题一:

步骤:

  1. 数据预处理

    • 整理附件1-4中的数据,确保数据包括日期、商家、仓库、商品以及相应的出货量。
    • 对数据进行时间序列分析前的处理,包括去除缺失值和异常值,确保数据质量。
  2. 时间序列分解

    • 时间序列通常包括趋势(Trend)、季节性(Seasonal)、噪声(Noise)等成分。可以使用时间序列分解方法将其拆分。
  3. 建立模型

    • 选择适当的时间序列模型,如ARIMA(Autoregressive Integrated Moving Average)模型,其中包括自回归(AR)、差分(I)、移动平均(MA)成分。
      当进行时间序列分析时,通常会使用ARIMA(AutoRegressive Integrated Moving Average)模型,这是一种常见的时间序列预测模型。下面提供与ARIMA模型相关的公式:

ARIMA模型的一般形式

ARIMA模型分为三个主要部分,分别是AR(自回归)、I(积分,用于处理非平稳性)、MA(滑动平均)。

  1. AR(自回归)部分

    AR部分表示当前时间点的值与过去时间点的值之间的线性关系。

    一般形式:
    X t = c + ϕ 1 X t − 1 + ϕ 2 X t − 2 + … + ϕ p X t − p + ε t X_t = c + \phi_1 X_{t-1} + \phi_2 X_{t-2} + \ldots + \phi_p X_{t-p} + \varepsilon_t Xt=c+ϕ1Xt1+ϕ2Xt2++ϕpXtp+εt

    • X t X_t Xt:时间序列在时刻 (t) 的值。
    • c c c:常数项。
    • ϕ 1 , ϕ 2 , … , ϕ p \phi_1, \phi_2, \ldots, \phi_p ϕ1,ϕ2,,ϕp:自回归系数,通常需要通过拟合来估计。
    • ε t \varepsilon_t εt:噪声,代表未被模型解释的随机误差。
  2. I(积分)部分

    I部分用于处理时间序列的非平稳性,通常需要进行差分操作,表示当前时刻的值与前一时刻的差值。

    一般形式:
    Y t = X t − X t − 1 Y_t = X_t - X_{t-1} Yt=XtXt1

    其中, Y t Y_t Yt是差分后的时间序列。

  3. MA(滑动平均)部分

    MA部分表示当前时刻的值与噪声项的线性组合。

    一般形式:
    X t = c + ε t − θ 1 ε t − 1 − θ 2 ε t − 2 − … − θ q ε t − q X_t = c + \varepsilon_t - \theta_1 \varepsilon_{t-1} - \theta_2 \varepsilon_{t-2} - \ldots - \theta_q \varepsilon_{t-q} Xt=c+εtθ1εt1θ2εt2θqεtq

    • c c c:常数项。
    • ε t \varepsilon_t εt:噪声项。
    • θ 1 , θ 2 , … , θ q \theta_1, \theta_2, \ldots, \theta_q θ1,θ2,,θq:滑动平均系数,需要通过拟合来估计。

这些公式代表了ARIMA模型的一般形式。在实际应用中,模型参数(如 (p)、 (d) 和 (q))需要通过拟合和调整来确定。通常使用时间序列分析工具(如Python中的statsmodels库)来执行这些操作。
4. 模型拟合

  • 使用历史数据拟合ARIMA模型,估计模型参数 ϕ \phi ϕ θ \theta θ
  1. 预测

    • 使用已拟合的ARIMA模型对未来时间点的需求量进行预测。
    • 预测的数学表达式为:
      X t + 1 = c + ϕ 1 X t + ϕ 2 X t − 1 + … + ϕ p X t − p + 1 − θ 1 ε t − θ 2 ε t − 1 − … − θ q ε t − q + 1 + ε t + 1 X_{t+1} = c + \phi_1 X_{t} + \phi_2 X_{t-1} + \ldots + \phi_p X_{t-p+1} - \theta_1 \varepsilon_{t} - \theta_2 \varepsilon_{t-1} - \ldots - \theta_q \varepsilon_{t-q+1} + \varepsilon_{t+1} Xt+1=c+ϕ1Xt+ϕ2Xt1++ϕpXtp+1θ1εtθ2εt1θqεtq+1+εt+1
  2. 模型评价

    • 使用适当的评价指标来评估模型的性能,如均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)等。
  3. 分类

    • 可以将不同商家、仓库、商品的需求时间序列分为不同的类别,并对每个类别使用相应的ARIMA模型。

在Python中,可以使用statsmodels库或其他时间序列分析库来执行上述步骤。

pip install pandas numpy statsmodels

然后,可以使用以下Python代码示例进行时间序列分析和预测:

import pandas as pd
import numpy as np
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.seasonal import seasonal_decompose

# 读取数据
data = pd.read_csv('your_data.csv')  # 替换为数据文件路径

# 将数据转换为时间序列
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)

# 季节性分解
result = seasonal_decompose(data['Demand'], model='additive', period=12)  # 假设季节性周期为12个月

# 差分操作以处理非平稳性
differenced_data = data['Demand'].diff().dropna()

# 确定ARIMA模型的参数 p, d, q
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt

plot_acf(differenced_data, lags=40)
plt.show()
plot_pacf(differenced_data, lags=40)
plt.show()

# 从自相关函数(ACF)和偏自相关函数(PACF)图中确定合适的p和q值

# 拟合ARIMA模型
model = ARIMA(data['Demand'], order=(p, d, q))  # 使用确定的p, d, q值

# 拟合模型
model_fit = model.fit()

# 预测未来需求
forecast = model_fit.forecast(steps=n)  # n为预测的时间步数

print("预测结果:")
print(forecast)

问题二:

现有一些新出现的商家+仓库+商品维度 (附件5) ,导致这种 情况出现的原因可能是新上市的商品,或是改变了某些商品所存放的仓库。 请讨论这些新出现的预测维度如何通过历史附件 1 中的数据进行参考,找 到相似序列并完成这些维度

为了预测新出现的商家+仓库+商品维度,可以利用历史附件1中的数据,并通过以下步骤找到相似序列并完成这些新维度的预测:

  1. 数据准备

    • 首先,将新出现的商家+仓库+商品维度的数据(附件5)整合到历史数据中。
  2. 相似序列查找

    • 对于每个新维度,可以使用以下方法找到相似的历史序列:
      • 相似性度量:使用适当的相似性度量(如相关性、欧氏距离、余弦相似度等)来比较新维度与历史维度的相似性。这将帮助找到最相似的历史序列。
      • 聚类分析:使用聚类分析方法,如K均值聚类或层次聚类,将新维度与历史维度进行聚类,以找到相似的序列。
      • 时间序列特征提取:提取新维度和历史维度的时间序列特征,比如趋势、季节性等,然后使用这些特征来进行相似性比较。
  3. 建模和预测

    • 找到相似的历史序列,可以使用这些历史序列的时间序列分析模型来预测新维度。
    • 对于每个新维度,可以使用与其相似的历史维度的模型,或者使用相似度最高的历史维度的模型。
  4. 模型评价

    • 对预测结果进行评价,使用适当的评价指标来确定模型的性能。
  5. 预测输出

    • 将完成的新维度的预测结果记录下来,并将其用于实际供应链管理。

为了找到相似序列并完成新维度的预测,需要使用相似性度量和时间序列模型。:

相似性度量

  1. 相关系数:用于度量两个时间序列之间的线性关系。
    r = ∑ i = 1 n ( X i − X ˉ ) ( Y i − Y ˉ ) ∑ i = 1 n ( X i − X ˉ ) 2 ∑ i = 1 n ( Y i − Y ˉ ) 2 r = \frac{\sum_{i=1}^{n}(X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum_{i=1}^{n}(X_i - \bar{X})^2} \sqrt{\sum_{i=1}^{n}(Y_i - \bar{Y})^2}} r=i=1n(XiXˉ)2 i=1n(YiYˉ)2 i=1n(XiXˉ)(YiYˉ)
    其中, X i X_i Xi Y i Y_i Yi 是两个时间序列在时刻 i i i 的值, X ˉ \bar{X} Xˉ Y ˉ \bar{Y} Yˉ 分别是它们的均值。

  2. 欧氏距离:用于度量两个时间序列之间的空间距离。
    d = ∑ i = 1 n ( X i − Y i ) 2 d = \sqrt{\sum_{i=1}^{n}(X_i - Y_i)^2} d=i=1n(XiYi)2

  3. 余弦相似度:用于度量两个时间序列之间的夹角余弦。
    c o s ( θ ) = ∑ i = 1 n X i ⋅ Y i ∑ i = 1 n X i 2 ⋅ ∑ i = 1 n Y i 2 cos(\theta) = \frac{\sum_{i=1}^{n}X_i \cdot Y_i}{\sqrt{\sum_{i=1}^{n}X_i^2} \cdot \sqrt{\sum_{i=1}^{n}Y_i^2}} cos(θ)=i=1nXi2 i=1nYi2 i=1nXiYi

时间序列模型

在完成新维度的预测时,可以使用ARIMA模型或其他适当的时间序列模型。ARIMA模型的公式已经在之前的回答中提供过。这里再次提供ARIMA模型的一般形式:

X t = c + ϕ 1 X t − 1 + … + ϕ p X t − p − θ 1 ε t − 1 − … − θ q ε t − q + ε t X_t = c + \phi_1 X_{t-1} + \ldots + \phi_p X_{t-p} - \theta_1 \varepsilon_{t-1} - \ldots - \theta_q \varepsilon_{t-q} + \varepsilon_t Xt=c+ϕ1Xt1++ϕpXtpθ1εt1θqεtq+εt

其中, X t X_t Xt 是时间序列的值, c c c 是常数项, ϕ 1 , … , ϕ p \phi_1, \ldots, \phi_p ϕ1,,ϕp 是自回归系数, θ 1 , … , θ q \theta_1, \ldots, \theta_q θ1,,θq 是滑动平均系数, ε t \varepsilon_t εt 是噪声。

使用这些公式,可以计算相似性度量以找到相似的历史序列,然后使用时间序列模型来进行预测。

pip install pandas numpy statsmodels
import pandas as pd
import numpy as np
from statsmodels.tsa.arima.model import ARIMA
from scipy.spatial.distance import euclidean
from scipy.stats import pearsonr
from sklearn.metrics.pairwise import cosine_similarity

# 读取历史数据
historical_data = pd.read_csv('historical_data.csv')  # 替换为历史数据文件路径

# 读取新维度的数据
new_dimension_data = pd.read_csv('new_dimension_data.csv')  # 替换为新维度数据文件路径

# 定义相似性度量函数
def calculate_similarity(series1, series2, method='cosine'):
    if method == 'cosine':
        similarity = cosine_similarity([series1], [series2])
        return similarity[0][0]
    elif method == 'pearson':
        correlation, _ = pearsonr(series1, series2)
        return correlation
    elif method == 'euclidean':
        distance = euclidean(series1, series2)
        return 1 / (1 + distance)

# 寻找相似的历史维度
similar_dimensions = []
for index, row in new_dimension_data.iterrows():
    new_series = row['Demand']  # 新维度的需求数据
    max_similarity = -1
    most_similar_dimension = None
    for historical_index, historical_row in historical_data.iterrows():
        historical_series = historical_row['Demand']  # 历史维度的需求数据
        similarity = calculate_similarity(new_series, historical_series)
        if similarity > max_similarity:
            max_similarity = similarity
            most_similar_dimension = historical_row
    similar_dimensions.append(most_similar_dimension)

# 使用ARIMA模型进行预测
predictions = []
for similar_dimension in similar_dimensions:
    historical_demand = similar_dimension['Demand']
    model = ARIMA(historical_demand, order=(p, d, q))  # 替换p, d, q为合适的参数
    model_fit = model.fit()
    forecast = model_fit.forecast(steps=n)  # 替换n为想要预测的时间步数
    predictions.append(forecast)

# 打印预测结果
print("预测结果:")
for i, forecast in enumerate(predictions):
    print(f"预测维度 {i+1}: {forecast}")

问题三:每年 6 月会出现规律性的大型促销,为需求量的精准预测以 及履约带来了很大的挑战。

在面对大型促销时,需求量的精准预测可以采用以下方法,其中最常见的方法之一是使用季节性分解。以下是一些相关的公式和步骤:

季节性分解

季节性分解是一种在时间序列分析中常用的技术,用于将时间序列数据拆分为趋势、季节性和残差成分。有助于更好地理解和预测大型促销对需求量的影响。

  1. 季节性分解公式

    时间序列数据 Y t Y_t Yt 可以被分解为以下三个成分的组合:

    • 趋势成分 T t T_t Tt:描述数据中的长期趋势,通常使用移动平均等技术来估计。

    • 季节性成分 S t S_t St:描述数据中的季节性变化,通常通过周期性的模式来估计,例如每年的大型促销。

    • 残差成分 E t E_t Et:包括不被趋势和季节性解释的部分,通常认为是随机噪声。

    具体分解公式如下:

    Y t = T t × S t × E t Y_t = T_t \times S_t \times E_t Yt=Tt×St×Et

  2. 季节性分解的步骤

    a. 使用移动平均或其他方法来估计趋势成分 T t T_t Tt

    b. 估计季节性成分 S t S_t St,通常采用周期性分析方法,例如季节分解或傅里叶分析。

    c. 计算残差成分 E t = Y t T t × S t E_t = \frac{Y_t}{T_t \times S_t} Et=Tt×StYt

预测

一旦进行了季节性分解,可以使用以下公式来预测大型促销期间的需求量:

D e m a n d 预测 = T 预测 × S 大型促销 Demand_{\text{预测}} = T_{\text{预测}} \times S_{\text{大型促销}} Demand预测=T预测×S大型促销

其中:

  • D e m a n d 预测 Demand_{\text{预测}} Demand预测是大型促销期间的需求量预测。
  • T 预测 T_{\text{预测}} T预测 是趋势成分在大型促销期间的预测。
  • S 大型促销 S_{\text{大型促销}} S大型促销 是季节性成分在大型促销期间的季节性模式。

应用中,需要根据具体数据和需求选择适当的趋势估计方法、季节性估计方法和模型来预测大型促销期间的需求量。这些公式和步骤提供了一个基本框架,以帮助更精确地预测需求。

季节性分解和需求量预测通常需要时间序列分析工具,其中Python中的statsmodels库非常有用。以下是一个基本示例代码,演示如何使用季节性分解来进行需求量的精准预测。

pip install pandas numpy statsmodels

然后,可以使用以下示例代码:

import pandas as pd
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt

# 读取历史需求量数据
data = pd.read_csv('demand_data.csv')  
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)

# 季节性分解
decomposition = sm.tsa.seasonal_decompose(data, model='additive')

# 绘制趋势、季节性和残差成分
plt.figure(figsize=(12, 8))
plt.subplot(411)
plt.plot(data, label='原始数据')
plt.legend(loc='upper left')
plt.subplot(412)
plt.plot(decomposition.trend, label='趋势')
plt.legend(loc='upper left')
plt.subplot(413)
plt.plot(decomposition.seasonal, label='季节性')
plt.legend(loc='upper left')
plt.subplot(414)
plt.plot(decomposition.resid, label='残差')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()

# 预测需求量,假设有一个大型促销在6月
# 获取大型促销的季节性模式,这里假设在6月有最大需求
seasonal_pattern = decomposition.seasonal[decomposition.seasonal.index.month == 6]

# 做6月的需求量预测
forecasted_demand = decomposition.trend + seasonal_pattern
forecasted_demand = forecasted_demand['2023-06-01':'2023-06-30']  

# 打印预测结果
print("2023年6月的需求量预测:")
print(forecasted_demand)

# 绘制预测结果
plt.figure(figsize=(12, 6))
plt.plot(data, label='原始数据')
plt.plot(forecasted_demand, label='预测')
plt.legend(loc='upper left')
plt.title('2023年6月需求量预测')
plt.show()

代码将读取历史需求量数据,进行季节性分解,然后使用季节性模式来预测2023年6月的需求量。

通过季节性分解和需求量预测,我们可以得出以下结论:

本研究使用季节性分解技术和时间序列分析来处理电商平台面临的需求预测和库存优化问题。关键发现如下:

  1. 季节性分解的重要性:通过对历史需求数据进行季节性分解,我们能够识别出数据中的趋势、季节性成分和残差。这有助于更好地理解需求的周期性和规律性,尤其是针对电商平台在每年6月期间经常发生的大型促销活动。

  2. 需求量预测:借助季节性分解的结果,我们能够预测未来时间段内的需求量。这些预测将考虑季节性效应,尤其是在大型促销期间,以便更准确地估计需求。这有助于电商平台更好地规划库存和确保及时履约客户订单。

  3. 供应链优化:需求量的精准预测对供应链管理至关重要。它可以帮助电商企业更好地调整库存水平,降低库存成本,并确保产品的及时交付。通过了解需求的季节性和规律性,企业可以更好地应对大型促销和季节性需求波动,从而提高供应链的效率。

  4. 持续改进:为了保持准确性,需要不断监测和改进预测模型。实际结果受多种因素的影响,包括市场变化、新产品推出等。因此,预测模型需要不断优化和调整,以适应变化的情况。

2023年第四届MathorCup大数据挑战赛 B题!建模解析,小鹿学长带队指引全代码文章与思路 - CSDN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值