最近做基于时间序列的销量预测模型,整理下思路,分享下。大致分为数据预处理、频谱分析、模型构建并预测、模型整合、结果修正等五个步骤。
一、数据预处理:
考虑到越平稳越有规律的数据预测效果越好,而大中小型等各种促销活动一般不具有规律性,因此,首先需要将部分促销数据进行检测并替换。我采用的是基于统计的和聚类的方法。
1.1 基于统计的方法
p80、p90、turkey、td['75%']+0.5*(td['75%']-td['25%'])等


1.2 基于聚类的方法
kmeans等

1.3 机器学习方法
IForest等
由于时间序列要求时间连续,因此异常点检测之后,需要替换,我尝试过的替换方法有:p80、线性插值、拉格朗日插值、预测值替换等方法。
二、频谱分析
2.1 生命周期分析
数据清洗完后,可以对时序波做一个简单的分析。比如生命周期检测,因为像手机、电脑这类的产品一般都会经历进入期、稳定期、衰退期等阶段。具体的生命周期检测我将在后边专门介绍。
2.2 趋势分解
一般的产品销售都有自己的周期,比如每个月有一次促销,每周之内也分工作日和周末,所以最好先提取下循环趋势。这里的趋势分解有乘法、加法、伪乘法,但是乘法和伪乘法都要求时序数据中不能有0,所以我暂时采用了加法分解方式。
decomposition = seasonal_decompose(data, model='additive', two_sided=False,
freq=(7 if len(data) <60 else 30))
trend = decomposition.trend.dropna()
seasonal = decomposition.seasonal.dropna()
residual = decomposition.resid.dropna()
X = np.arange(0, len(trend)).reshape(len(trend), 1)
model = LinearRegression()
model.fit(X, trend)
trend_line = pd.Series(model.predict(X))
trend_line.index = trend.index
de_trend = trend - trend_line
return de_trend, seasonal, residual, trend_line

趋势分解后,需要对trend、seasonal、residual分别做预测,再叠加。 trend其实是短期趋势,主要用来预测今期趋势的延伸。一般情况下,这条线还需要再提取一个线性的趋势,分析总体走势。

三、模型构建并预测
上节的趋势分解后,得到de_trend,line_trend,seasonla和residual四条线,需要分别做预测。其中有的不拆解line_trend这条线,直接用trend做arima预测,这里用trend为例做说明。
在做时序预测时,可以用trend预测,也可以用trend+residual做预测。预测模型我们采用arima。季节趋势是循环趋势,如果用的用加法做的趋势分解,这条趋势多数是规律的循环周期,如果是用乘法做的趋势分解,这条线的周期一般是不一样的。seasonal加法分解出来的大多是一样的周期,所以只需要直接循环预测即可。
网友评论