当前位置: 首页 > 后端技术 > Python

统计预测模型——通过Python代码分析时间序列数据

时间:2023-03-25 20:03:08 Python

在本文中,我们将展示使用Python统计模型进行时间序列数据分析。问题描述目标:根据两年多的每日广告支出历史数据,提前两个月预测广告支出金额。原始数据:从2017-01-01到2019-09-23的每日广告支出。数据准备:划分训练集和测试集。df1=数据[['Date','Spend']].set_index('Date')train=df1.iloc[:933,:]test=df1.iloc[933:,:]test.shape,train.shape测试集大小:(63,1);训练集大小:(933,1)。1.总结时间序列分析中常用的统计模型单变量时间序列统计模型,如:平均法、平滑法、有/无季节条件的ARIMA模型。多元时间序列统计模型,如:外生回归变量、VAR。附加组件或组件模型,例如:FacebookProphet、ETS。结构化时间序列模型,如:贝叶斯结构化时间序列模型、层次化时间序列模型。在本文中,我们主要关注SARIMA和Holt-winters方法。单变量时间序列统计模型的关键要素如果我们要对时间序列数据进行上面的统计模型分析,需要进行一系列的处理:(1)数据均值(2)数据方差(3)数据自协方差三个指标做不依赖于时间期限。即时间序列数据是平稳的。如何判断时间序列数据是否平稳?可以从两个特征来判断:(1)趋势,即均值随时间变化;(2)季节性,即方差随时间变化,自协方差随时间变化。如果满足以上两个条件,则时间序列数据不满足平稳性要求。以上问题可通过以下方法消除:变换,如:取对数、取平方等平滑,如:移动平均等求差。分解。多项式拟合,如:拟合回归。2.ARIMAAutoregressiveIntegratedMovingAveragemodel(ARIMA),差分积分移动平均自回归模型。ARIMA(p,d,q)主要包括三项:p:AR项,即自回归,将时间序列的下一阶段描述为上一阶段数据的线性映射。d项,即积分项(integration),时间序列的差异预处理步骤,使其满足平稳性要求q:MA项,即移动平均项(movingaverage),描述下一阶段时间序列作为前一阶段数据平均过程中残差的线性图。该模型需要指定三个参数pdq并按顺序执行。ARIMA模型也可用于开发AR、MA和ARMA模型。ACF和PACF图形自相关函数,autocorrelationfunction(ACF),描述时间序列数据与其后续版本的相关性(如:Y(t)和Y(t-1)之间的相关性)。偏自相关函数,partialautocorrelationfunction(PACF),描述了每个序列的相关性。通过PACF图,可以通过ACF图确定p。qSARIMA季节性差分自回归移动平均模型,即季节性自回归综合移动平均(SARIMA),是在ARIMA模型的基础上进行季节性调整的。其形式为:SARIMA(p,d,q)(P,D,Q)s,其中P,D,Q为季节参数,s为时间序列周期。案例:通过SARIMA预测广告支出首先,我们构建test_stationarity来检查时间序列数据的平稳性。从statsmodels.tsa.stattools导入adfullerdf1=df.resample('D',how=np.mean)deftest_stationarity(timeseries):rolmean=timeseries.rolling(window=30).meanrolstd=timeseries.rolling(window=30).stdplt.figure(figsize=(14,5))sns.despine(left=True)orig=plt.plot(timeseries,color='blue',label='Original')mean=plt.plot(rolmean,color='red',label='RollingMean')std=plt.plot(rolstd,color='black',label='RollingStd')plt.legend(loc='best');plt.title('滚动均值和标准偏差')plt.showprint('')dftest=adfuller(timeseries,autolag='AIC')dfoutput=pd.Series(dftest[0:4],index=['TestStatistic','p-value','#LagsUsed','NumberofObservationsUsed'])forkey,valueindftest[4].items:dfoutput['临界值(%s)'%key]=valueprint(dfoutput)test_stationarity(df1.Spend.dropna)通过test_stationarity函数可以得出移动平均和标准差,通过AugmentedDickey-Fuller检验可以输出P值。对比临界值(criticalvalue),可以看出时间序列数据是非平稳的。首先我们试一下对数变换,看看数据是否能满足平稳性要求。可以看出,使用对数变换df1['log_Spend']=np.log(df1['Spend']),时间序列在阈值为5%时满足平稳性要求。接下来,让我们尝试差异操作:test_stationarity(df1['Spend'].diff(1).dropna)。显然,经过差分运算后效果更好,时间序列在阈值为1%时满足平稳性要求。然后,我们可以建立SARIMA模型,预测2019-07-23到2019-09-23这两个月的每日广告点数。将statsmodels.api导入为smfit1=sm.tsa.statespace.SARIMAX(train.Spend,order=(7,1,2),seasonal_order=(0,1,2,7)).fit(use_boxcox=True)test['SARIMA']=fit1.predict(start="2019-07-23",end="2019-09-23",dynamic=True)plt.figure(figsize=(16,8))plt.plot(train['Spend'],label='Train')plt.plot(test['Spend'],label='Test')plt.plot(test['SARIMA'],label='SARIMA')plt.legend(loc='best')plt.show现在,让我们通过从sklearn.metrics包中导入mean_squared_error、mean_absolute_error函数来计算mse和mae来检查该模型的性能。结果如下:数据可视化:从mse、mae和forecast曲线可以看出,SARIMA模型成功预测了时间序列变化趋势和季节特征。不过,巅峰时期的表现还有待提高。3.ETSETS,指数平滑由于时间序列数据随时间变化但具有一定的随机性,所以我们通常希望对数据进行平滑处理。为此,我们将使用ETS技术通过指数方法为过去的数据分配较少的权重。还将时间序列数据分解为趋势(T)、季节(S)和误差(E)成分。常用的三种ETS方法如下:线性:双指数平滑;加法:三次指数平滑;乘法:三次指数平滑。Holt-Winter季节性预测算法Holt-winter季节性预测算法是一种三次指数平滑方法。它包含三个主要部分:水平、趋势、季节成分。案例:通过Holt-Winter季节预测算法预测广告支出通过Holt-winter季节预测算法预测2019-07-23到2019-09-23的每日广告支出,代码如下:fromstatsmodels.tsa.apiimport指数平滑fit1=ExponentialSmoothing(np.asarray(train['Spend']),seasonal_periods=7,trend='add',seasonal='add').fit(use_boxcox=True)test['Holt_Winter']=fit1.forecast(len(test))plt.figure(figsize=(16,8))plt.plot(train['Spend'],label='Train')plt.plot(test['Spend'],label='Test')plt.plot(test['Holt_Winter'],label='Holt_Winter')plt.legend(loc='best')plt.show同样,我们通过mean_squared_error和mean_absolute_error函数检查mse和mae。可以看出,H-W模型还可以预测时间序列趋势和季节特征。4.算法比较通过比较两种算法的预测结果,可以评价哪种方法具有更好的预测能力。从图中可以看出,在MSE和MAE都较低的情况下,SARIMA模型的表现略优于Holt-Winter模型。尽管这两个模型都没有完美地捕捉高峰和低谷,但它们对企业仍然有用。数据显示,平均每月广告支出超过200万美元。这两种算法的MAE约为6000。换句话说,对于一个平均每月广告支出为200万美元的企业,预测两个月的广告支出的误差仅为6000美元左右,这是相当可观的。结论在本文中,单变量预测方法对广告支出数据表现良好。但是这些方法很难组合/合并新信号(例如事件、天气)。同时,这些方法对缺失数据也非常敏感,通常不能很好地预测很长一段时间。在以后的文章中,我们将展示如何使用深度学习技术来预测同一数据集上的时间序列!更多行业干货持续为您分享,您可以随时关注我们!(1)获取更多优质内容,可以前往:当前疫情有所缓和,也是提升自我、为未来蓄力的好时机——蓄势待发!(2)搜索CDA小程序,手机端随时随地浏览最新资讯和优质课程: