ARIMA 模型 Python statsmodels 实战:3步完成销售数据预测与残差检验
ARIMA 模型 Python statsmodels 实战3步完成销售数据预测与残差检验时间序列分析在商业决策中扮演着关键角色而ARIMA模型作为经典预测工具能有效捕捉销售数据的动态变化规律。本文将带您用Python的statsmodels库快速构建ARIMA模型从数据预处理到模型诊断提供可直接复用的代码模板。1. 环境准备与数据加载首先确保已安装必要库pip install statsmodels pandas matplotlib。我们使用某电商平台24个月的洗发水销售数据作为示例import pandas as pd import matplotlib.pyplot as plt from statsmodels.tsa.statespace.sarimax import SARIMAX from statsmodels.tsa.stattools import adfuller from statsmodels.graphics.tsaplots import plot_acf, plot_pacf # 加载数据 sales_data pd.read_csv(shampoo_sales.csv, parse_dates[Month], index_colMonth) print(sales_data.head()) # 可视化原始数据 plt.figure(figsize(12,6)) plt.plot(sales_data, labelOriginal Sales) plt.title(Shampoo Sales Trend) plt.xlabel(Date) plt.ylabel(Sales Volume) plt.grid(True) plt.legend() plt.show()关键检查点确认时间索引已正确设置为DateTime格式观察数据是否存在明显季节性本例为月度数据检查缺失值sales_data.isnull().sum()提示当数据量少于50个观测点时ARIMA预测效果可能不稳定建议收集更多数据或考虑其他简化模型。2. 平稳性检验与参数确定ARIMA建模的核心前提是时间序列的平稳性。我们通过ADF检验和自相关图确定差分阶数d# ADF单位根检验 def adf_test(timeseries): result adfuller(timeseries) print(ADF Statistic:, result[0]) print(p-value:, result[1]) print(Critical Values:) for k, v in result[4].items(): print(f {k}: {v}) adf_test(sales_data) # 初始p值通常0.05需差分 # 一阶差分处理 sales_diff sales_data.diff().dropna() adf_test(sales_diff) # 检查p值是否0.05 # 自相关图分析 fig, (ax1, ax2) plt.subplots(2,1, figsize(12,8)) plot_acf(sales_diff, lags20, axax1) plot_pacf(sales_diff, lags20, axax2) plt.tight_layout() plt.show()参数确定方法图形特征可能参数判断依据ACF拖尾q0无显著截断点PACF截尾p2滞后2阶后快速衰减ADF检验d1一阶差分后平稳3. 模型训练与诊断结合前步分析我们构建ARIMA(2,1,0)模型并进行残差检验# 模型训练 model SARIMAX(sales_data, order(2,1,0), seasonal_order(0,0,0,0)) results model.fit(dispFalse) print(results.summary()) # 残差诊断 residuals results.resid fig, (ax1, ax2) plt.subplots(2,1, figsize(12,8)) residuals.plot(axax1, titleResiduals Plot) residuals.plot(kindkde, axax2, titleResiduals Distribution) plt.tight_layout() plt.show() # 残差自相关检验 plot_acf(residuals, lags20) plt.show()诊断标准正态性残差Q-Q图应近似直线独立性D-W值接近2本例1.98同方差性残差波动无规律性变化若发现以下问题需调整模型残差自相关增加q参数残差偏态考虑对数变换季节性未消除引入SARIMA4. 预测实现与效果评估最后进行12期销售预测并可视化结果# 生成预测 forecast results.get_forecast(steps12) forecast_mean forecast.predicted_mean conf_int forecast.conf_int() # 可视化 plt.figure(figsize(12,6)) plt.plot(sales_data, labelHistorical) plt.plot(forecast_mean, labelForecast, colorred) plt.fill_between(conf_int.index, conf_int.iloc[:,0], conf_int.iloc[:,1], colorpink, alpha0.3) plt.title(12-Month Sales Forecast with Confidence Interval) plt.legend() plt.grid(True) plt.show() # 评估指标 from sklearn.metrics import mean_absolute_error train_pred results.predict(start1, endlen(sales_data)) mae mean_absolute_error(sales_data, train_pred) print(fMAE: {mae:.2f})提升预测精度的实用技巧使用滚动预测验证Rolling Forecast Validation尝试自动参数搜索auto_arima函数对非负数据使用Box-Cox变换结合外部变量构建ARIMAX模型实际项目中建议保存模型对象以便后续调用import joblib joblib.dump(results, arima_model.pkl) # 加载模型loaded_model joblib.load(arima_model.pkl)