资讯动态

ARIMA模型在销售预测中的应用与实践

发布时间:2026/10/27 19:28:11 来源:尧图企业网站定制
1. 为什么选择ARIMA模型做销售预测我刚接触时间序列预测时面对LSTM、Prophet等各种花哨的算法也曾陷入选择困难。直到在电商公司实习期间用ARIMA模型成功预测出洗发水旺季销量才明白这个经典算法的独特价值。ARIMA模型特别适合像洗发水销售这类具有明显季节性和趋势性的商业数据它的数学原理决定了其对平稳化处理后的时间序列具有极强的解释力。传统零售行业的数据往往存在三个典型特征一是销售记录按固定时间间隔采集如每日/每周二是受节假日促销影响呈现周期性波动三是整体可能呈现上升或下降趋势。ARIMA模型恰好由三个核心组件构成自回归(AR)捕捉历史值的影响、差分(I)消除趋势性、移动平均(MA)处理随机噪声这种结构上的契合使其成为销售预测的首选工具。实际业务中我们团队对比过ARIMA与LSTM在日化品销售预测的表现当数据量小于3年时ARIMA的预测准确率平均高出15%且训练时间仅需LSTM的1/20。这也是我推荐本科生在毕业设计中采用ARIMA的重要原因——既能在有限时间内完成又能获得具有说服力的结果。2. 环境准备与数据获取2.1 Python环境配置建议我强烈建议使用Anaconda创建专属的Python3.8环境不要用最新版避免库兼容问题。以下是经多次验证稳定的库版本组合conda create -n arima python3.8 conda activate arima pip install statsmodels0.13.2 pandas1.5.3 matplotlib3.6.2踩坑提醒statsmodels库必须用0.13.2版本新版会出现ADF检验结果异常。我曾因此浪费两天时间排查最终在GitHub的issue中找到答案。2.2 获取洗发水销售数据集毕业设计不宜使用公司敏感数据推荐两个优质替代方案Kaggle上的Shampoo Sales Dataset包含3年36个月的销售记录用以下代码生成模拟数据更贴近真实业务场景import pandas as pd import numpy as np np.random.seed(42) dates pd.date_range(start2020-01-01, periods36, freqM) base np.linspace(100, 300, 36) seasonality 50 * np.sin(np.linspace(0, 4*np.pi, 36)) noise np.random.normal(0, 15, 36) sales np.round(base seasonality noise) df pd.DataFrame({Date: dates, Sales: sales}) df.to_csv(shampoo_sales.csv, indexFalse)3. ARIMA建模全流程详解3.1 数据可视化与平稳性检验先看我的标准分析模板import matplotlib.pyplot as plt from statsmodels.tsa.stattools import adfuller # 数据加载与格式转换 df pd.read_csv(shampoo_sales.csv, parse_dates[Date]) df.set_index(Date, inplaceTrue) # 绘制原始序列 plt.figure(figsize(12,6)) plt.plot(df, labelOriginal) plt.title(Shampoo Sales Trend) plt.legend() plt.show() # ADF检验函数 def adf_test(series): result adfuller(series) print(fADF Statistic: {result[0]}) print(fp-value: {result[1]}) print(Critical Values:) for k, v in result[4].items(): print(f {k}: {v}) adf_test(df[Sales]) # 通常p0.05表示非平稳当p值0.05时我们需要进行差分处理。对于洗发水销售数据一般需要一阶常规差分消除趋势12阶季节性差分月度数据# 差分处理 df[Diff_1] df[Sales].diff(1) df[Diff_12] df[Diff_1].diff(12) # 再次检验 adf_test(df[Diff_12].dropna())3.2 模型阶数确定技巧确定(p,d,q)参数是ARIMA建模的核心难点。我的经验是通过ACF/PACF图初步判断from statsmodels.graphics.tsaplots import plot_acf, plot_pacf plot_acf(df[Diff_12].dropna(), lags20) plot_pacf(df[Diff_12].dropna(), lags20) plt.show()使用网格搜索寻找最优组合注意限制在合理范围import itertools from statsmodels.tsa.arima.model import ARIMA p d q range(0, 3) pdq list(itertools.product(p, d, q)) best_aic float(inf) best_order None for order in pdq: try: model ARIMA(df[Sales], orderorder) results model.fit() if results.aic best_aic: best_aic results.aic best_order order except: continue print(fBest ARIMA{best_order} AIC:{best_aic})3.3 模型训练与诊断获得最优参数后进行完整建模model ARIMA(df[Sales], order(2,1,1)) # 示例参数 results model.fit() print(results.summary()) # 残差诊断 residuals pd.DataFrame(results.resid) residuals.plot(titleResiduals) plt.show() residuals.plot(kindkde, titleDensity) plt.show()关键诊断指标残差应近似白噪声无自相关Q-Q图接近直线JB检验p值0.05。我在第一次建模时忽视了这点导致预测结果出现系统性偏差。4. 预测实现与效果评估4.1 滚动预测技巧真实业务场景需要动态更新模型这是我的实现方案def rolling_forecast(data, train_size, order): predictions [] for i in range(len(data) - train_size): train data[:train_sizei] model ARIMA(train, orderorder) model_fit model.fit() pred model_fit.forecast()[0] predictions.append(pred) return predictions train_size int(len(df) * 0.8) preds rolling_forecast(df[Sales], train_size, best_order)4.2 可视化与指标计算评估预测效果时要同时关注图形和数值指标from sklearn.metrics import mean_absolute_error, mean_squared_error test df[Sales][train_size:] plt.plot(test.index, test, labelActual) plt.plot(test.index, preds, colorred, labelPredicted) plt.legend() plt.show() print(fMAE: {mean_absolute_error(test, preds)}) print(fRMSE: {np.sqrt(mean_squared_error(test, preds))})4.3 业务解读要点当向非技术人员展示结果时建议将预测值转换为业务术语如下季度预计缺货风险高用置信区间替代单点预测forecast results.get_forecast(steps6) conf_int forecast.conf_int() ax df[Sales].plot() forecast.predicted_mean.plot(axax) ax.fill_between(conf_int.index, conf_int.iloc[:,0], conf_int.iloc[:,1], alpha0.2) plt.title(6-Month Forecast with Confidence Interval) plt.show()5. 毕业设计进阶建议5.1 模型优化方向如果想获得更高分数可以考虑引入外部变量如促销活动标记# 添加春节月份作为外生变量 df[Spring_Festival] df.index.month.isin([1,2]).astype(int) model ARIMA(df[Sales], order(2,1,1), exogdf[Spring_Festival])使用SARIMAX处理季节性结合Prophet进行异常值检测5.2 论文写作要点根据我指导学弟学妹的经验评委最关注差分阶数的选择依据必须展示ADF检验结果参数确定过程ACF/PACF图或网格搜索记录模型诊断的完整性至少包含残差图、Q-Q图业务解释的合理性预测结果如何指导库存管理5.3 常见问题解决方案问题预测结果呈直线 原因差分过度导致信息丢失 解决减少d值或检查季节性差分阶数问题报错LU分解失败 原因参数组合不合理 解决限制p/q≤2或改用auto_arima我在首次实现时曾因忽视季节性差分导致预测完全偏离实际值。后来通过记录完整的试错过程反而成为论文的亮点。建议学弟学妹们保留所有尝试记录这既能体现科研严谨性也能展示解决问题的思考过程。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑