目标:用python实现数据的快捷处理,并输出预测值
在我的工作中,有一部分内容要涉及到年销售的预测并制定相应的订铺补计划
当然,相信很多涉及到销售行业的都会有这方面的需要,根据预测值制定分解任务指标
简单的归纳下:
- 对数据进行处理回正:数据并不是拿到手就能使用的,因为人为的误差,或者可能是节假日、气象灾害的影响,或者商品交付上出现延期、返单,或者其他的意外原因,需要对数据进行修正才能使用(当然,不同的数据出现的误差也不一样,不在这里赘述)
- 按照分析目标对数据进行处理:在这里我的目标是,用前三年的历史销售数据,来预测第四年的销售情况,并按照第四年可能的销售情况,结合自身的经营情况制定一整年并分割到月的部署
所以这里反馈的内容,就是利用Python来跑数据预测的公式,如果只是短期预测,那么Excel能简单做到,但是如果数据颗粒度达到每天,时间长度拉长到三五十年,那么处理和查漏也要花一点点小时间来完成。
步骤分解:
1.解析需要涉及到的公式:#基于周期性变化的分析:因为商品具有季节性,所以并不能简单直接用几年的数据进行回归,得到的公式用起来不实际,所以考虑数据的周期性变化,因为365天、或者52个星期、或者12个月会包含全年的销售情况,所以按照周期T的滚动合计值,应该是符合简单线性变化的 → → →参数T
那么这里需要两个函数段:一个实现数据的滚动合计,一个实现数据的回归预测
#自定义滚动合计函数
def SUM_T_yidong(Y,T): #Y为需要处理的数据列表,T为数据周期
SUM_T = [] #定义一个空列表用来装载计算出来的滚动合计值
for num_1 in list(range(1, len(Y) + 1 - T)): #从Y的第2个数据开始,到合计范围涵盖最后一个数据即第一个倒数第T个为之
Sum_1 = sum(Y[num_1:num_1 + T]) #进行滚动求和
SUM_T.append(Sum_1) #把求和值放入列表
return SUM_T #返回装有求和值的列表
#单数据回归预测返回函数(一元线性回归方程的程序表示)
def oneline_huigui_only_Y_yuce(Y,yuce_after_num): #根据Y列表输出后面几位的预测值
X=list(range(1,len(Y)+1)) #单列表只有Y数据,自动生成一个对应的序数列表
X_pingjun = sum(X) / len(Y) #求X平均
Y_pingjun = sum(Y) / len(Y) #求Y平均
Sum_1 = [] # 放Xi*Yi
Sum_2 = [] # 放Xi*Xi
for n in list(range(0, len(Y))): #计算Xn*Yn和Xn*Xn,并求b,a系数
sum_1 = X[n] * Y[n]
Sum_1.append(sum_1)
sum_2 = X[n] * X[n]
Sum_2.append(sum_2)
b = (sum(Sum_1) - len(Y) * X_pingjun * Y_pingjun) / (sum(Sum_2) - len(Y) * X_pingjun * X_pingjun)
a = Y_pingjun - b * X_pingjun
print('一元线性回归公式:Y='+str(b)+'X+'+str(a))#显示一下回归公式方便自查
Yuce = list(range(len(Y)+1,len(Y)+yuce_after_num+1))
Yucezhi = []
for yuce_X_num in Yuce: #根据回归公式和需要预测的时间段返回预测值
Y_yuce = b*yuce_X_num+a
Yucezhi.append(Y_yuce)
return Yucezhi
根据移动求和和求和项的回归预测,可以得到预测年的移动求和回归预测值
即求和的最后一项为预测年全年,求和的倒数第二项为全年少最后一个期数据多去年最后一个期数据……
也就是说,按照求和的预测值对前面的各期数据进行递减即可得到预测年的各期预测值
这里产生了第三个程序段:
#4.根据未来一年的移动求和值反向递减出未来一年每个周期的值
meiyue = []
for a in weilai_one_year: #这里不能用=号,会改变原先列表的数据,试错之后,用遍历复制一个列表单独使用
meiyue.append(a)
for i in range(1,T): #先减去去年
meiyue[i-1] = meiyue[i-1]-sum(sannian[-T+i:])
#print(meiyue)
for i in list(range(1,T)): #再减去预测年每月累加值
meiyue[i] = meiyue[i]- sum(meiyue[:i])
那么,一套下来,我们就由原先的数据得到了未来的简单线性预测值,因为还没学python直接制图,所以这里导出后用Excel制表
一般来说,数据颗粒度越小越准确,但是图表上由于颗粒度对比全年的比例变小了,反而看不出明显的波动差异
最后,把整个程序用 pyinstaller -F 打包成.exe小应用,就可以方便使用了,不论数据量有多大,在回正好数据之后,导入应用就能快捷的输出预测值,节省了大量机械重复的工作时间。
由于工作操守,不对数据进行展示,但是预测值对数据的误差在可接受范围
效果:
`那么再来看下按照52周和12个月的预测情况
#变成月数据之后就能很明显的看到全年的季节性变化了