商务智能与数据分析 教案 第七章实验 时间序列数据的分解与可视化_第1页
商务智能与数据分析 教案 第七章实验 时间序列数据的分解与可视化_第2页
商务智能与数据分析 教案 第七章实验 时间序列数据的分解与可视化_第3页
商务智能与数据分析 教案 第七章实验 时间序列数据的分解与可视化_第4页
商务智能与数据分析 教案 第七章实验 时间序列数据的分解与可视化_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验7-1:时间序列数据的分解与可视化1.实验描述在进行任何预测之前,首先要“看懂”时间序列。很多商业数据(如月度销售额、季度财报)都包含明显的趋势(Trend)和季节性(Seasonality)。本实验将使用Python的statsmodels库,将一个混合了多种成分的时间序列分解为趋势项、季节项和残差项,帮助我们直观理解时间序列的构成。2.实验目的理解时间序列的加法模型与乘法模型。掌握seasonal_decompose的使用。学会通过可视化识别数据的长期趋势和周期性波动。3.实验步骤与代码Pythonimportpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltfromstatsmodels.tsa.seasonalimportseasonal_decompose#步骤1:构造模拟时间序列数据(月度销售数据)#模拟5年的数据(60个月)dates=pd.date_range(start='2020-01-01',periods=60,freq='M')#构造成分:#1.趋势:线性增长trend=np.linspace(100,200,60)#2.季节性:每年年底大卖,年初低迷(正弦波模拟)seasonality=20*np.sin(np.linspace(0,5*2*np.pi,60))#3.噪声:随机波动noise=np.random.normal(0,5,60)#合成总销量(加法模型)sales=trend+seasonality+noisedf=pd.DataFrame({'Date':dates,'Sales':sales})df.set_index('Date',inplace=True)#步骤2:原始数据可视化plt.figure(figsize=(10,4))plt.plot(df['Sales'],label='OriginalSales')plt.title('MonthlySalesTimeSeries')plt.legend()plt.show()#步骤3:序列分解(Decomposition)#model='additive'表示加法模型(Trend+Seasonality+Resid)decomposition=seasonal_decompose(df['Sales'],model='additive')#步骤4:分解结果可视化fig=decomposition.plot()fig.set_size_inches(10,8)plt.show()4.实验总结我们应能从分解图中清晰地看到:Trend子图显示了持续增长的趋势,Seasonal子图显示了每年固定的波峰波谷,Resid子图则是去除了规律后的随机噪声。思考:如果seasonal子图的波动幅度随着时间越来越大(例如每年的销售旺季爆发力越来越强),应该使用加法模型还是乘法模型?(答案:乘法模型)。

实验7-2:平滑预测法(移动平均与指数平滑)1.实验描述对于短期预测或没有明显趋势的数据,平滑法是最简单有效的手段。本实验对比简单移动平均(SMA)和指数平滑(ExponentialSmoothing)的效果。我们将体会“滞后性”问题,并观察平滑系数$\alpha$如何影响模型对新数据的敏感度。2.实验目的掌握rolling().mean()计算移动平均。掌握SimpleExpSmoothing的使用。理解参数$\alpha$(平滑系数)的含义:$\alpha$越大,越看重当前数据;$\alpha$越小,越看重历史均值。3.实验步骤与代码Pythonfromstatsmodels.tsa.apiimportSimpleExpSmoothing#继续使用实验7-1的df数据#步骤1:简单移动平均(SMA)-窗口为3个月df['SMA_3']=df['Sales'].rolling(window=3).mean()#步骤2:简单指数平滑(SES)#alpha=0.2(平滑,反应慢),alpha=0.8(灵敏,反应快)model_ses_02=SimpleExpSmoothing(df['Sales']).fit(smoothing_level=0.2,optimized=False)model_ses_08=SimpleExpSmoothing(df['Sales']).fit(smoothing_level=0.8,optimized=False)df['SES_0.2']=model_ses_02.fittedvaluesdf['SES_0.8']=model_ses_08.fittedvalues#步骤3:对比可视化(取最后24个月以便观察细节)plt.figure(figsize=(12,6))plt.plot(df.index[-24:],df['Sales'][-24:],label='ActualSales',color='black',marker='o')plt.plot(df.index[-24:],df['SMA_3'][-24:],label='SMA(window=3)',linestyle='--')plt.plot(df.index[-24:],df['SES_0.2'][-24:],label='SES(alpha=0.2)',linestyle='-')plt.plot(df.index[-24:],df['SES_0.8'][-24:],label='SES(alpha=0.8)',linestyle='-')plt.title('SmoothingMethodsComparison')plt.legend()plt.show()4.实验总结滞后性:观察SMA曲线,你会发现它的转折点总是比真实数据的转折点慢一拍(滞后)。敏感度:的曲线紧跟真实数据跳动,甚至拟合了噪声;的曲线非常平滑,但也忽略了部分真实的波动。在商务预测中,需要根据业务稳定性权衡这一参数。

实验7-3:ARIMA模型构建与平稳性检验1.实验描述ARIMA(自回归差分移动平均模型)是统计学中最经典的时间序列预测方法。ARIMA要求数据是平稳的(均值和方差不随时间变化)。本实验将引导我们完成ARIMA建模的标准流程:ADF平稳性检验->差分处理->ACF/PACF定阶->模型预测。2.实验目的掌握ADF检验(AugmentedDickey-FullerTest)判断数据平稳性。理解差分(Differencing)的作用。学会使用ARIMA模型进行短期预测。3.实验步骤与代码Pythonfromstatsmodels.tsa.stattoolsimportadfullerfromstatsmodels.graphics.tsaplotsimportplot_acf,plot_pacffromstatsmodels.tsa.arima.modelimportARIMA#步骤1:平稳性检验(ADFTest)defadf_test(timeseries):print("---ADFTestResults---")result=adfuller(timeseries)print(f'ADFStatistic:{result[0]:.4f}')print(f'p-value:{result[1]:.4f}')ifresult[1]<=0.05:print("结论:p<0.05,数据是平稳的")else:print("结论:p>0.05,数据是不平稳的(需要差分)")#对原始销量进行检验(由于有趋势,预期不平稳)adf_test(df['Sales'])#步骤2:一阶差分(Differencing)去除趋势df['Sales_Diff']=df['Sales'].diff()df.dropna(inplace=True)#差分会产生NaNprint("\n[一阶差分后]")adf_test(df['Sales_Diff'])#步骤3:绘制ACF和PACF图(辅助定阶p和q)fig,(ax1,ax2)=plt.subplots(2,1,figsize=(10,8))plot_acf(df['Sales_Diff'],ax=ax1)#决定q(MA项)plot_pacf(df['Sales_Diff'],ax=ax2)#决定p(AR项)plt.show()#步骤4:构建ARIMA模型(假设p=1,d=1,q=1)#注意:这里直接使用原始数据'Sales',在order中设置d=1让模型自动差分model_arima=ARIMA(df['Sales'],order=(1,1,1))model_fit=model_arima.fit()#步骤5:预测未来5个月forecast=model_fit.forecast(steps=5)print("\n未来5个月销量预测:")print(forecast)4.实验总结平稳性:原始数据通常因为有增长趋势,ADF检验不通过(p值大)。一阶差分(即“今天减昨天”)通常能消除线性趋势,使数据变平稳。定阶:虽然可以通过ACF/PACF图看截尾/拖尾来定阶,但在实际商务应用中,也可以使用网格搜索(GridSearch)或auto_arima库来自动寻找最优参数。

实验7-4:【综合实验】销量预测与多维指标评估(sMAPE&DA)1.实验描述时间序列预测的评估不能仅看“误差大小”,有时“方向是否正确”更重要。本实验模拟一个真实的商品销量预测场景,对比Holt-Winters(适合季节性数据)和ARIMA模型,并使用sMAPE(对称平均绝对百分比误差)和DA(方向准确率)等指标进行全面评估。2.实验目的综合运用多种预测方法。核心目标:实现并计算sMAPE和DA指标,理解其在商务场景下的独特价值。学会划分训练集和测试集(时间序列不能随机划分,必须按时间截断)。3.实验步骤与代码Pythonfromstatsmodels.tsa.holtwintersimportExponentialSmoothingfromsklearn.metricsimportmean_squared_error,mean_absolute_error#步骤1:划分数据集(最后12个月作为测试集)train_size=len(df)-12train,test=df['Sales'][:train_size],df['Sales'][train_size:]#步骤2:训练模型#模型A:Holt-Winters(适合有趋势和季节性的数据)model_hw=ExponentialSmoothing(train,trend='add',seasonal='add',seasonal_periods=12).fit()pred_hw=model_hw.forecast(12)#模型B:简单ARIMA(1,1,1)model_arima=ARIMA(train,order=(1,1,1)).fit()pred_arima=model_arima.forecast(12)#步骤3:定义评估指标函数defcalculate_metrics(y_true,y_pred):y_true,y_pred=np.array(y_true),np.array(y_pred)#1.RMSE(均方根误差)rmse=np.sqrt(mean_squared_error(y_true,y_pred))#2.MAPE(平均绝对百分比误差)mape=np.mean(np.abs((y_true-y_pred)/y_true))*100#3.sMAPE(对称平均绝对百分比误差)#公式:2*|y-y_hat|/(|y|+|y_hat|)smape=np.mean(2*np.abs(y_pred-y_true)/(np.abs(y_true)+np.abs(y_pred)))*100#4.DA(方向准确率)#衡量预测的涨跌方向是否与实际一致#实际变化方向diff_true=np.sign(np.diff(y_true))#预测变化方向(注意:这里比较的是预测序列内部的趋势,或者预测值相对于上一时刻实际值的变化)#简单起见,我们比较预测序列每一步的涨跌是否与实际序列一致#这里的实现方式:比较t时刻相对于t-1时刻的变化#实际应用中需注意对齐,这里简化计算序列内部的差分符号一致性diff_pred=np.sign(np.diff(y_pred))#修正维度(diff后少一个数)da=np.mean(diff_true==diff_pred)*100return{'RMSE':rmse,'MAPE':f"{mape:.2f}%",'sMAPE':f"{smape:.2f}%",'DA':f"{da:.2f}%"}#步骤4:评估与对比print("---Holt-Winters模型评估---")print(calculate_metrics(test,pred_hw))print("\n---ARIMA模型评估---")print(calculate_metrics(test,pred_arima))#步骤5:可视化结果plt.figure(figsize=(12,6))plt.plot(train.index,train,label='Train(History)')plt.plot(test.ind

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论