本篇文章想通过历史的销量数据来预测未来几个月的数据,用以定目标和供运营、供应链人员备货需求参考,本文通过SARIMA模型来实现,预测下一个月的销量相对误差在17%,预测结果仅供参考,具体还得结合运营人员经验共同预测得出,后续也会尝试其他模型来提高预测准确性
一、导入需要的包
from __future__ import division
from datetime import datetime, timedelta,date
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
#import statsmodels as sm
#from tqdm import tqdm_notebook
from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.stattools import adfuller
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.tsa.statespace.sarimax import SARIMAX
import warnings
warnings.filterwarnings("ignore")
二、导入历史数据
df = pd.read_excel("C:\\Users\\10237\\Desktop\\F7NP历史销量.xlsx")
plt.figure(figsize=(10,5))
df["sales"].plot()
plt.legend(["sales"])
plt.show()
三、自相关图
df["sales"]=df["sales"].astype("float")
plot_acf(df["sales"]).show()
自相关系数
平稳序列通常具有短期相关性,即随着延迟期数k的增加,平稳序列的自相关系数会很快地衰减向零,而非平稳序列的自相关系数的衰减速度会比较慢,这就是我们利用自相关图判断平稳性的标准。
其横轴表示延迟期数,纵轴表示自相关系数,从图中可以看出自相关系数衰减到零的速度比较缓慢,在很长的延迟期内,自相关系数一直为正,然后为负,呈现出三角对称性,这是具有单调趋势的非平稳序列的一种典型的自相关图形式
四、平稳性检验
adfuller(df["sales"])
(1.8408412567719112,
0.9984266704565955,
8,
16,
{'1%': -3.9240193847656246, '5%': -3.0684982031250003, '10%': -2.67389265625},
283.93234809442)
P值为0.99大于显著性水平0.05,接受原假设(非平稳序列),说明原始序列是非平稳序列
五、一阶差分序列的检验
df1 = df.diff(periods=1,axis=0).dropna()
df1 = df1["sales"]
plt.figure(figsize=(10,5))
df1.plot()
#解读:在均值附近比较平稳波动
#自相关图
plot_acf(df1).show()
#解读:有短期相关性,但趋向于零
#平稳性检验
adfuller(df1)
#解读:P值为0.98大于显著性水平,接受原假设,说明一阶差分非平稳序列
(0.6199434003434391,
0.9880970219599929,
7,
16,
{'1%': -3.9240193847656246, '5%': -3.0684982031250003, '10%': -2.67389265625},
267.98692610966367)
可见原始序列波动太大,直接差分意义不大,所以下面先取对数把数值控制在较小的波动区间内,再进行差分序列容易平稳
六、取对数进行差分
df["npsales"]=np.log(df["sales"])
df["diffsales"]=df["npsales"].diff().dropna()
df2 = df.drop(df.index