网站建设公司海南海南城乡与建设厅网站
web/
2025/9/30 13:22:39/
文章来源:
网站建设公司海南,海南城乡与建设厅网站,怎么做网站的自然排名,自驾游网站模板#x1f680;欢迎来到本文#x1f680; #x1f349;个人简介#xff1a;陈童学哦#xff0c;目前学习C/C、算法、Python、Java等方向#xff0c;一个正在慢慢前行的普通人。 #x1f3c0;系列专栏#xff1a;陈童学的日记 #x1f4a1;其他专栏#xff1a;CSTL… 欢迎来到本文 个人简介陈童学哦目前学习C/C、算法、Python、Java等方向一个正在慢慢前行的普通人。 系列专栏陈童学的日记 其他专栏CSTL感兴趣的小伙伴可以看看。 希望各位→点赞 收藏⭐️ 留言 ⛱️万物从心起心动则万物动♂️ 自动售货机销售数据分析与应用 一、摘要二、案例背景三、分析目标四、分析过程五、数据预处理1.清洗数据1.1 合并订单表并处理缺失值1.2 增加“市”属性1.3 处理订单表中的“商品详情”属性1.4 处理“总金额元”属性 2.属性选择3.属性规约 六、销售数据可视化分析1.销售额和自动售货机数量的关系2.订单数量和自动售货机数量的关系3.畅销和滞销商品4.自动售货机的销售情况5.订单支付方式占比6.各消费时段的订单用户占比 七、销售额预测1.统计周销售额2.平稳性检验3.差分处理4.模型定阶5.模型预测 八、推荐阅读九、本文福利 一、摘要 本文将主要结合自动售货机的实际情况对销售的历史数据进行处理利用pyecharts库、Matplotlib库进行可视化分析并对未来4周商品的销售额进行预测从而为企业制定相应的自动售货机市场需求分析及销售建议提供参考依据。更多详细内容请参考《Python数据挖掘入门进阶与实用案例分析》一书。 二、案例背景 近年来随着我国经济技术的不断提升自动化机械在人们日常生活中扮演着越来越重要的角色更多的被应用在不同的领域。而作为新的一种自动化零售业态自动售货机在日常生活中应用越来越广泛。自动售货机销售产业在走向信息化、合理化同时也面临着高度同质化、成本上升、毛利下降等诸多困难与问题这也是大多数企业所会面临到的问题。 为了提高市场占有率和企业的竞争力某企业在广东省某8个市部署了376台自动售货机但经过一段时间后发现其经营状况并不理想。而如何了解销售额、订单数量与自动售货机数量之间的关系畅销或滞销的商品又有哪些自动售货机的销售情况等已成为该企业亟待解决的问题。
三、分析目标 获取了该企业某6个月的自动售货机销售数据结合销售背景进行分析并可视化展现销售现状同时预测未来一段时间内的销售额从而为企业制定营销策略提供一定的参考依据。
四、分析过程 五、数据预处理
1.清洗数据
1.1 合并订单表并处理缺失值 由于订单表的数据是按月份分开存放的为了方便后续对数据进行处理和可视化所以需要对订单数据进行合并处理。同时在合并订单表的数据后为了了解订单表的缺失数据的基本情况需要进行缺失值检测。合并订单表并进行缺失值检测操作结果如图1所示。 图1 合并订单表并进行缺失值检测的结果 由操作结果可知合并后的订单数据有350867条记录且订单表中含有缺失值的记录总共有279条其数量相对较少可直接使用删除法对其中的缺失值进行处理。
合并订单表、查看缺失值并处理缺失值如代码清单1所示。
代码清单1 合并订单表、查看缺失值并处理缺失值 import pandas as pd# 读取数据data4 pd.read_csv(../data/订单表2018-4.csv, encodinggbk)data5 pd.read_csv(../data/订单表2018-5.csv, encodinggbk)data6 pd.read_csv(../data/订单表2018-6.csv, encodinggbk)data7 pd.read_csv(../data/订单表2018-7.csv, encodinggbk)data8 pd.read_csv(../data/订单表2018-8.csv, encodinggbk)data9 pd.read_csv(../data/订单表2018-9.csv, encodinggbk)# 合并数据data pd.concat([data4, data5, data6, data7, data8, data9], ignore_indexTrue)print(订单表合并后的形状为, data.shape)# 缺失值检测print(订单表各属性的缺失值数目为\n, data.isnull().sum())data data.dropna(howany) # 删除缺失值1.2 增加“市”属性
为了满足后续的数据可视化需求需要在订单表中增加“市”属性操作结果如图2所示。 图2 增加“市”属性 增加“市”属性如代码清单2所示。
代码清单2 增加“市”属性 # 从省市区属性中提取市的信息并创建新属性data[市] data[省市区].str[3: 6]print(经过处理后的数据前5行为\n, data.head())1.3 处理订单表中的“商品详情”属性 通过浏览订单表数据发现在“商品详情”属性中存在有异名同义的情况即两个名称不同的值所代表的实际意义是一致的如“脉动青柠X1;”“脉动青柠x1;”等。因为此情况会对后面的分析结果造成一定的影响所以需要对订单表中的“商品详情”属性进行处理增加“商品名称”属性如代码清单3所示。
代码清单3 处理订单表中的“商品详情”属性
# 定义一个需剔除字符的列表error_strerror_str [ , (, ), , , 0, 1, 2, 3, 4, 5, 6,7, 8, 9, g, l, m, M, L, 听, 特, 饮, 罐,瓶, 只, 装, 欧, 式, , %, X, x, ;]# 使用循环剔除指定字符for i in error_str:data[商品详情] data[商品详情].str.replace(i, )# 新建“商品名称”属性用于新数据的存放data[商品名称] data[商品详情]1.4 处理“总金额元”属性 此外当浏览订单表数据时发现在“总金额元”属性中存在极少订单的金额很小如0、0.01等。在现实生活中这种记录存在的情况极少且这部分数据不具有分析意义。因此在本案例中对订单的金额小于0.5的记录进行删除处理操作结果如图3所示。 图3删除后的数据量 由操作结果可知删除前的数据行列数目为(350617, 17)删除后的数据行列数目为(350450, 17)。
删除“总金额元”属性中订单的金额较少的记录如代码清单4所示。
代码清单4 删除“总金额元”属性中订单的金额较少的记录
# 删除金额较少的订单前的数据行列数目print(data.shape)# 删除金额较少的订单后的数据行列数目data data[data[总金额元] 0.5]print(data.shape)2.属性选择 因为订单表中的“手续费元”“收款方”“软件版本”“省市区”“商品详情”“退款金额元”等属性对本案例的分析没有意义所以需要对其进行删除处理选择合适的属性操作的结果如图4所示。 图4属性选择/center 属性选择如代码清单5所示。
代码清单5 属性选择
# 对于订单表数据选择合适的属性data data.drop([手续费元, 收款方, 软件版本, 省市区, 商品详情, 退款金额元], axis1)print(选择后数据属性为\n, data.columns.values)
3.属性规约 在订单表“下单时间”属性中含有的信息量较多并且存在概念分层的情况需要对属性进行数据规约提取需要的信息。提取相应的“小时”属性和“月份”属性进一步泛化“小时”属性为“下单时间段”属性规则如下
Ø当小时≤5时为“凌晨”
Ø当5小时≤8时为“早晨”
Ø当8小时≤11时为“上午”
Ø当11小时≤13时为“中午”
Ø当13小时≤16时为“下午”
Ø当16小时≤19时为“傍晚”
Ø当19小时≤24为“晚上”。
在Python中规约订单表的属性如代码清单6所示。
代码清单6 规约订单表的属性
# 将时间格式的字符串转换为标准的时间格式data[下单时间] pd.to_datetime(data[下单时间])data[小时] data[下单时间].dt.hour # 提取时间中的小时data[月份] data[下单时间].dt.month # 提取时间中的月份data[下单时间段] time # 新增“下单时间段”属性并将其初始化为timeexp1 data[小时] 5 # 判断小时是否小于等于5# 若条件为真则时间段为凌晨data.loc[exp1, 下单时间段] 凌晨# 判断小时是否大于5且小于等于8exp2 (5 data[小时]) (data[小时] 8)# 若条件为真则时间段为早晨data.loc[exp2, 下单时间段] 早晨# 判断小时是否大于8且小于等于11exp3 (8 data[小时]) (data[小时] 11)# 若条件为真则时间段为上午data.loc[exp3, 下单时间段] 上午# 判断小时是否小大于11且小于等于13exp4 (11 data[小时]) (data[小时] 13)# 若条件为真则时间段为中午data.loc[exp4, 下单时间段] 中午# 判断小时是否大于13且小于等于16exp5 (13 data[小时]) (data[小时] 16)# 若条件为真则时间段为下午data.loc[exp5, 下单时间段] 下午# 判断小时是否大于16且小于等于19exp6 (16 data[小时]) (data[小时] 19)# 若条件为真则时间段为傍晚data.loc[exp6, 下单时间段] 傍晚# 判断小时是否大于19且小于等于24exp7 (19 data[小时]) (data[小时] 24)# 若条件为真则时间段为晚上data.loc[exp7, 下单时间段] 晚上data.to_csv(../tmp/order.csv, indexFalse, encoding gbk)六、销售数据可视化分析 在销售数据中含有的数据量较多作为企业管理人员以及决策制定者无法直观了解目前自动售货机的销售状况。因此需要利用处理好的数据进行可视化分析直观地展示销售走势以及各区销售情况等为决策者提供参考。
1.销售额和自动售货机数量的关系
探索6个月销售额和自动售货机数量之间的关系并按时间走势进行可视化分析结果如图5所示。 图5 销售额和自动售货机数量之间的关系/center 由图5可知4月至7月自动售货机的数量在增加销售额也随着自动售货机的数量增加而增加8月虽然自动售货机数量减少了4台但是销售额还在增加9月相比8月的自动售货机数量减少了6台销售额也随着减少。可以推断出销售额与自动售货机的数量存在一定的相关性增加自动售货机的数量将会带来销售额的增长。出现该情况可能是因为广东处于亚热带气候相对炎热而7、8、9月的气温也相对较高人们使用自动售货机的频率也相对较高。
探索销售额和自动售货机数量之间的关系如代码清单7所示。\
代码清单7 销售额和自动售货机数量之间的关系 import pandas as pdimport numpy as npfrom pyecharts.charts import Linefrom pyecharts import options as optsimport matplotlib.pyplot as pltfrom pyecharts.charts import Barfrom pyecharts.charts import Piefrom pyecharts.charts import Griddata pd.read_csv(../tmp/order.csv, encodinggbk)def f(x):return len(list(set((x.values))))# 绘制销售额和自动售货机数量之间的关系图groupby1 data.groupby(by月份, as_indexFalse).agg({设备编号: f, 总金额元: np.sum})groupby1.columns [月份, 设备数量, 销售额]line (Line().add_xaxis([str(i) for i in groupby1[月份].values.tolist()]).add_yaxis(销售额, np.round(groupby1[销售额].values.tolist(), 2)).add_yaxis(设备数量, groupby1[设备数量].values.tolist(), yaxis_index1,symboltriangle).set_series_opts(label_optsopts.LabelOpts(is_showTrue, positiontop, font_size10)).set_global_opts(xaxis_optsopts.AxisOpts(name月份, name_locationcenter, name_gap25),title_optsopts.TitleOpts(title销售额和自动售货机数量之间的关系),yaxis_optsopts.AxisOpts( name销售额元, name_locationcenter, name_gap60,axislabel_optsopts.LabelOpts(formatter{value}))).extend_axis(yaxisopts.AxisOpts( name设备数量台, name_locationcenter, name_gap40,axislabel_optsopts.LabelOpts(formatter{value}), interval50)))line.render_notebook()2.订单数量和自动售货机数量的关系
探索6个月订单数量和自动售货机数量之间的关系并按时间走势进行可视化分析结果如图6所示。 图6 订单数量和自动售货机数量之间的关系 由图6可知4月至7月自动售货机数量呈上升趋势订单数量也随着自动售货机数量增加而增加而8月至9月自动售货机数量在减少订单数量也在减少。这说明了订单数量与自动售货机的数量是严格相关的增加自动售货机会给用户带来便利从而提高订单数量。同时结合图5可知订单数量和销售额的变化趋势基本保持一样的变化趋势这也说明了订单数量和销售额存在一定的相关性。
由于各市的设备数量并不一致所以探索各市自动售货机的平均销售总额并进行对比分析结果如图7所示。 图7 各市自动售货机平均销售总额 由图7可知深圳市自动售货机平均销售总额最高达到了6538.28元排在其后的是珠海市和中山市。而最少的是清远市其平均销售总额只有414.27元。出现此情况可能是因为不同区域的人流量不同而深圳市相对于其他区域的人流量相对较大清远市相对于其他区域的人流量相对较小。此外广州市的人流量也相对较大但其平均销售总额却相对较少可能是因为自动售货机放置不合理导致的。
探索订单数量和自动售货机数量之间的关系以及各市自动售货机的平均销售总额如代码清单8所示。
代码清单8 订单数量和自动售货机数量之间的关系
groupby2 data.groupby(by月份, as_indexFalse).agg({设备编号: f, 订单编号: f})groupby2.columns [月份, 设备数量, 订单数量]# 绘制图形plt.figure(figsize(10, 4))plt.rcParams[font.sans-serif] [SimHei]plt.rcParams[axes.unicode_minus] Falsefig, ax1 plt.subplots() # 使用subplots函数创建窗口ax1.plot(groupby2[月份], groupby2[设备数量], --)ax1.set_yticks(range(0, 350, 50)) # 设置y1轴的刻度范围ax1.legend((设备数量,), locupper left, fontsize10)ax2 ax1.twinx() # 创建第二个坐标轴ax2.plot(groupby2[月份], groupby2[订单数量])ax2.set_yticks(range(0, 100000, 10000)) # 设置y2轴的刻度范围ax2.legend((订单数量,), locupper right, fontsize10)ax1.set_xlabel(月份)ax1.set_ylabel(设备数量台)ax2.set_ylabel(订单数量单)plt.title(订单数量和自动售货机数量之间的关系)plt.show()gruop3 data.groupby(by市, as_indexFalse).agg({总金额元:sum, 设备编号:f})gruop3[销售总额] np.round(gruop3[总金额元], 2)gruop3[平均销售总额] np.round(gruop3[销售总额] / gruop3[设备编号], 2)plt.bar(gruop3[市].values.tolist(), gruop3[平均销售总额].values.tolist(), color#483D8B)# 添加数据标注for x, y in enumerate(gruop3[平均销售总额].values):plt.text(x - 0.4, y 100, %s %y, fontsize8)plt.xlabel(城市)plt.ylabel(平均销售总额元)plt.title(各市自动售货机平均销售总额)plt.show()3.畅销和滞销商品
查找6个月销售额排名前10和后10的商品从而找出畅销商品和滞销商品并对其销售额进行可视化分析结果如图8、图9所示。 图8 销售额前10的商品 图9 销售额后10的商品 由图8可知销售额排在第一的是商品0015达到了56230.2元其次是商品0013和商品0004等商品。由图9可知销售额排在最后的商品是商品0104、商品0687和商品0540其销售金额只有1元。
探索6个月销售额排名前10和后10的商品如代码清单9所示。
代码清单9 10种畅销商品、10种滞销商品
# 销售额前10的商品group4 data.groupby(by商品ID, as_indexFalse)[总金额元].sum()group4.sort_values(by总金额元, ascendingFalse, inplaceTrue)d group4.iloc[: 10]x_data d[商品ID].values.tolist()y_data np.round(d[总金额元].values, 2).tolist()bar (Bar(init_optsopts.InitOpts(width800px,height600px)).add_xaxis(x_data).add_yaxis(, y_data, label_optsopts.LabelOpts(font_size15)).set_global_opts(title_optsopts.TitleOpts(title畅销前10的商品),yaxis_optsopts.AxisOpts(axislabel_optsopts.LabelOpts(formatter{value},font_size15)),xaxis_optsopts.AxisOpts(type_category,axislabel_optsopts.LabelOpts({interval: 0}, font_size15, rotate30))))bar.render_notebook()h group4.iloc[-10: ]x_data h[商品ID].values.tolist()y_data np.round(h[总金额元].values, 2).tolist()bar (Bar().add_xaxis(x_data).add_yaxis(, y_data, label_optsopts.LabelOpts(positionright)).set_global_opts(title_optsopts.TitleOpts(title滞销前10的商品),xaxis_optsopts.AxisOpts(axislabel_opts{interval: 0})).reversal_axis())grid Grid(init_optsopts.InitOpts(width600px, height400px))grid.add(bar, grid_optsopts.GridOpts(pos_left18%))grid.render_notebook()4.自动售货机的销售情况
探索6个月销售额前10以及销售额后10的设备及其所在的城市并进行可视化分析结果如图10、图11所示。 图10 销售额前10的设备及其所在市 图11 销售额后10的设备及其所在市 由图10可知销售额靠前的设备所在城市主要集中在中山市、广州市、东莞市和深圳市其中销售额前3的设备都集中在中山市。由图11可知广州市的设备113024、112719、112748的销售额只有1元而销售额后10的设备全部在广州市和中山市。
探索6个月销售额前10以及销售额后10的设备及其所在的城市如代码清单10所示。
代码清单10 销售额前10、后10的设备及其所在市
group5 data.groupby(by[市, 设备编号], as_indexFalse)[总金额元].sum()group5.sort_values(by总金额元, ascendingFalse, inplaceTrue)b group5[: 10]label []# 销售额前10的设备及其所在市for i in range(len(b)):a b.iloc[i, 0] str(b.iloc[i, 1])label.append(a)x np.round(b[总金额元], 2).values.tolist()y range(10)plt.bar(x0, bottomy, height0.4, widthx, orientationhorizontal)plt.xticks(range(0, 80000, 10000)) # 设置x轴的刻度范围plt.yticks(range(10), label)for y, x in enumerate(np.round(b[总金额元], 2).values):plt.text(x 500, y - 0.2, %s %x)plt.xlabel(总金额元)plt.title(销售额前10的设备及其所在市)plt.show()l group5[-10: ]label1 []for i in range(len(l)):a l.iloc[i, 0] str(l.iloc[i, 1])label1.append(a)x np.round(l[总金额元], 2).values.tolist()y range(10)plt.bar(x0, bottomy, height0.4, widthx, orientationhorizontal)plt.xticks(range(0, 4, 1)) # 设置x轴的刻度范围plt.yticks(range(10), label1)for y, x in enumerate(np.round(l[总金额元], 2).values):plt.text(x, y, %s %x)plt.xlabel(总金额元)plt.title(销售额后10的设备及其所在市)plt.show()统计各城市销售额小于100的设备数量并进行可视化分析结果如图12所示。 图12 各市销售额小于100的设备数量 由图12可知销售额小于100的设备在广州市有52台中山市有20台佛山市有10台。出现这种情况的原因可能是设备放置位置的不合理或设备放置过多造成的因此可以适当调整自动售货机放置的位置和数量减少设备和人员的浪费。
探索各城市销售额小于100元的设备数量如代码清单11所示。
代码清单11 各城市销售额小于100元的设备数量
l_b group5[group5[总金额元] 100]lb l_b.groupby(by市, as_indexFalse)[设备编号].count()x_data lb[市].values.tolist()y_data lb[设备编号].values.tolist()bar (Bar(init_optsopts.InitOpts(width500px, height400px)).add_xaxis(x_data).add_yaxis(, y_data).set_global_opts(title_optsopts.TitleOpts(title各市销售额小于100的设备数量)))bar.render_notebook()5.订单支付方式占比
对自动售货机上各商品订单的支付方式进行统计并进行可视化分析结果如图13所示。 图13 订单支付方式占比 由图13可知订单的主要支付方式有4种即微信、支付宝、会员余额和现金其中支付方式最多的是微信支付在所有支付方式中占到了89.05%。其次是支付宝支付其占比为9.87%而现金支付和会员余额支付的占比不到1%。
分析订单支付方式占比如代码清单12所示。
代码清单12 分析订单支付方式占比
group6 data.groupby(by支付状态)[支付状态].count()method group6.index.tolist()num group6.values.tolist()pie_data [(i, j) for i, j in zip(method, num)]pie (Pie().add(, pie_data, label_optsopts.LabelOpts(formatter{b}:{c}({d}%))).set_global_opts(title_optsopts.TitleOpts(title订单支付方式占比)))pie.render_notebook()6.各消费时段的订单用户占比
在自动售货机的商品下单时间段上统计各消费时段的订单用户数量并进行可视化分析结果如图14所示。 图14 各消费时段的订单用户占比 由图14可知当消费时间段在下午时其订单用户最多占比达到了21.44%其次是晚上占比是17.36%上午的占比也有17.08%其余时间段的占比相对较少。
分析各消费时段的订单用户如代码清单13所示。
代码清单13 分析各消费时段的订单用户
group7 data.groupby(by下单时间段)[购买用户].count()times group7.index.tolist()num group7.values.tolist()pie_data_2 [(i, j) for i, j in zip(times, num)]pie (Pie().add(, pie_data_2, label_optsopts.LabelOpts(formatter{b}:{c}({d}%)),radius[60, 200], rosetyperadius, is_clockwiseFalse).set_global_opts(title_optsopts.TitleOpts(title各消费时段的订单用户占比)))pie.render_notebook()七、销售额预测 精准的销售额预测对于企业运营有着非常重要的指导意义可以指导运营后台提前进行合理的资源配置帮助企业管理人员制定合理的目标。同时还可以更好地帮助企业采取更为针对性的促销手段更加明确市场的需求可以根据不同区域、不同时间划分等制定更加有效、合理的配货方案和商品价格从而增加企业经营收益。
自动售货机的销售额预测指的是从售货机已有销售额的订单数据资料中总结出商品销售额的变化规律并根据该规律构建ARIMA模型动态预测未来4周内商品的销售额。
ARIMA模型的建模步骤如图15所示。 图15 ARIMA模型的建模步骤 1.统计周销售额 通过观察订单数据发现该数据集记录的是当前日期时间下售货机所售卖商品的订单状况其出货状态有出货成功、出货失败、未出货等多种情况。然而为预测未来4周的销售额其所需样本数据应为实际的周销售额数据因此需要筛选状态为出货成功的数据并统计各周销售额如代码清单14所示。
代码清单14 筛选出货成功数据并统计各周销售额
import pandas as pdimport matplotlib.pyplot as pltfrom statsmodels.tsa.stattools import adfuller as ADFfrom statsmodels.graphics.tsaplots import plot_acffrom statsmodels.stats.diagnostic import acorr_ljungboxfrom statsmodels.tsa.arima_model import ARIMAdata pd.read_csv(../tmp/order.csv, encodinggbk)# 提取出货状态为“出货成功”的下单时间和总金额元数据data_info data.loc[data[出货状态] 出货成功, [下单时间, 总金额元]]data_info data_info.set_index(下单时间) # 将下单时间设为索引# 将索引修改为日期时间格式data_info.index pd.to_datetime(data_info.index)# 按周对总金额进行汇总即求和data_w data_info.resample(W).sum()2.平稳性检验 在使用ARIMA模型进行销售额预测之前需要查看时间序列是否平稳若数据非平稳在数据分析挖掘的时候则可能会产生“伪回归”等问题从而影响分析结果。通过时间序列的时序图、自相关图及其单位根查看时间序列平稳性时序图如图16所示自相关图如图17所示单位根检验结果如图18所示。 图16 原始序列的时序图 图17 原始序列的自相关图 图18 原始序列的单位根检验结果 由图16可知时序图显示该序列具有明显的递增趋势可以判断为原始序列数据是非平稳序列图17的自相关图显示的自相关系数大部分均大于零说明序列间具有一定的长期相关性。由图18可知在单位根检验统计量中p值为0.251134其值显著大于0.05可以推断出该序列为非平稳序列非平稳序列一定不是白噪声序列。
绘制时序图、自相关图并进行单位根检验如代码清单15所示。
代码清单15 绘制时序图、自相关图并进行单位根检验
# 平稳性检验# 判断是否为时间序列plt.rcParams[font.sans-serif] [SimHei] # 显示中文标签plt.rcParams[axes.unicode_minus] False # 显示负号plt.figure(figsize(8, 5))plt.plot(data_w)plt.tick_params(labelsize14) # 设置坐标轴字体大小plt.show()# 定义绘制自相关图函数def draw_acf(ts):plt.figure(facecolorwhite, figsize(10, 8))plot_acf(ts)plt.show()# 定义单位根检验函数def testStationarity(ts):dftest ADF(ts)# 对ADF求得的值进行语义描述dfoutput pd.Series(dftest[0:4], index [Test Statistic,p-value,#Lags Used,Number of Observations Used])for key, value in dftest[4].items():dfoutput[Critical Value (%s)%key] valuereturn dfoutput# 自相关draw_acf(data_w)# 单位根检验print(单位根检验结果为\n, testStationarity(data_w))3.差分处理 在进行平稳性检验后发现原始序列数据属于非平稳序列而在使用ARIMA模型进行销售额预测时需要序列数据是平稳序列以避免序列中的随机游走形势影响预测结果。在Python中可以通过二阶差分处理对数据进行平稳化操作并查看二阶差分之后序列的平稳性和白噪声其中二阶差分后序列的时序图如图19所示二阶差分后序列的自相关图如图20所示二阶差分后序列的单位根检验结果如图21所示二阶差分后序列的白噪声检验结果如图22所示。 图19 二阶差分后序列的时序图 图20 二阶差分后序列的自相关图 图21 二阶差分后序列的单位根检验结果 图22 二阶差分后序列的白噪声检验结果 由图19可知该序列无明显趋势较为稳定图20的自相关图显示自相关系数较为均匀且较为接近于0有较强的短期相关性。由图21可知二阶差分后序列的单位根检验p值远小于0.05可以判断出差分处理后的序列是平稳序列。由图22可知在白噪声检验结果中输出的p值小于0.05同时结合单位根检验结果可以判断二阶差分之后的序列是平稳非白噪声序列。
差分处理并查看序列平稳性和白噪声如代码清单16所示。
代码清单16 差分处理并查看序列平稳性和白噪声 # 二阶差分处理data_w_T1 data_w.diff().dropna()data_w_T2 data_w_T1.diff().dropna()# 差分后的时间序列图plt.figure(figsize(8, 5))plt.plot(data_w_T2)plt.tick_params(labelsize14)plt.show()# 差分自相关draw_acf(data_w_T2)# 差分单位根检验print(差分单位根检验结果为\n, testStationarity(data_w_T2))# 白噪声检验print(差分白噪声检验结果为\n, acorr_ljungbox(data_w_T2, lags1))4.模型定阶 通常情况下在进行模型预测前需要寻找最优模型以提高预测结果的准确性。针对ARIMA模型可以通过BIC矩阵进行模型定阶。由于4.4.3小节进行了二阶差分处理所以d2。通过计算ARIMA(p,2,q)中所有组合的BIC信息量取最小BIC信息量所对应的模型阶数进而确定p值和q值结果如图23所示。 图23 模型定阶 由操作结果可知当p值为0、q值为1时BIC值最小到此p、q定阶完成。
模型定阶如代码清单17所示。
代码清单17 模型定阶
# 通过BIC矩阵进行模型定阶data_w data_w.astype(float)pmax 3qmax 3bic_matrix [] # 初始化BIC矩阵for p in range(pmax1):tmp []for q in range(qmax1):try:tmp.append(ARIMA(data_w, (p, 2, q)).fit().bic)except:tmp.append(None)bic_matrix.append(tmp)bic_matrix pd.DataFrame(bic_matrix)# 找出最小值位置p, q bic_matrix.stack().idxmin()print(当BIC最小时p值和q值分别为: , p, q)5.模型预测
应用ARIMA(0, 2, 1)模型对未来4周内商品的销售额进行预测结果如图24所示。 图24预测未来4周的销售额 预测未来4周内商品的销售额如代码清单18所示。
代码清单18 预测未来4周内商品的销售额
# 构建ARIMA(0, 2, 1)模型model ARIMA(data_w, (p, 2, q)).fit()# 预测未来4周的销售额print(预测未来4周的销售额其预测结果、标准误差、置信区间如下。\n, model.forecast(4))注利用ARIMA模型向前预测的周期越长其误差越大。
八、推荐阅读 正版链接https://item.jd.com/13814157.html 《Python数据挖掘入门、进阶与实用案例分析》是一本以项目实战案例为驱动的数据挖掘著作它能帮助完全没有Python编程基础和数据挖掘基础的读者快速掌握Python数据挖掘的技术、流程与方法。在写作方式上与传统的“理论与实践结合”的入门书不同它以数据挖掘领域的知名赛事“泰迪杯”数据挖掘挑战赛已举办10届和“泰迪杯”数据分析技能赛已举办5届累计1500余所高校的10余万师生参赛为依托精选了11个经典赛题将Python编程知识、数据挖掘知识和行业知识三者融合让读者在实践中快速掌握电商、教育、交通、传媒、电力、旅游、制造等7大行业的数据挖掘方法。 本书不仅适用于零基础的读者自学还适用于教师教学为了帮助读者更加高效地掌握本书的内容本书提供了以下10项附加价值 1建模平台提供一站式大数据挖掘建模平台免配置包含大量案例工程边练边学告别纸上谈兵 2视频讲解提供不少于600分钟Python编程和数据挖掘相关教学视频边看边学快速收获经验值 3精选习题精心挑选不少于60道数据挖掘练习题并提供详细解答边学边练检查知识盲区 4作者答疑学习过程中有任何问题通过“树洞”小程序纸书拍照一键发给作者边问边学事半功倍 5数据文件提供各个案例配套的数据文件与工程实践结合开箱即用增强实操性 6程序代码提供书中代码的电子文件及相关工具的安装包代码导入平台即可运行学习效果立竿见影 7教学课件提供配套的PPT课件使用本书作为教材的老师可以申请节省备课时间 8模型服务提供不少于10个数据挖掘模型模型提供完整的案例实现过程助力提升数据挖掘实践能力 9教学平台泰迪科技为本书提供的附加资源提供一站式数据化教学平台附有详细操作指南边看边学边练节省时间 10就业推荐提供大量就业推荐机会与1500企业合作包含华为、京东、美的等知名企业
通过学习本书读者可以理解数据挖掘的原理迅速掌握大数据技术的相关操作为后续数据分析、数据挖掘、深度学习的实践及竞赛打下良好的技术基础。
九、本文福利 福利介绍本书将在评论区抽取五位小伙伴免费送出为防止小伙伴错过中奖信息请在文末或博主主页添加博主Vx哦 参与方式关注博主、点赞、收藏本文评论区评论“超过15字数评论折叠评论不参与哦”一定要点赞收藏哦否则无法参与每个人最多评论三次 截止时间2023-10-13 20:00:00
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84474.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!