连接品硕网线做怎么弹网站,德州核酸检测最新公告,西安网站seo推广厂家,$post wordpress摘要#xff1a;本案例将主要结合自动售货机的实际情况#xff0c;对销售的历史数据进行处理#xff0c;利用pyecharts库、Matplotlib库进行可视化分析#xff0c;并对未来4周商品的销售额进行预测#xff0c;从而为企业制定相应的自动售货机市场需求分析及销售建议提供参… 摘要本案例将主要结合自动售货机的实际情况对销售的历史数据进行处理利用pyecharts库、Matplotlib库进行可视化分析并对未来4周商品的销售额进行预测从而为企业制定相应的自动售货机市场需求分析及销售建议提供参考依据。更多详细内容请参考《Python数据挖掘入门进阶与实用案例分析》一书。 01 案例背景
近年来随着我国经济技术的不断提升自动化机械在人们日常生活中扮演着越来越重要的角色更多的被应用在不同的领域。而作为新的一种自动化零售业态自动售货机在日常生活中应用越来越广泛。自动售货机销售产业在走向信息化、合理化同时也面临着高度同质化、成本上升、毛利下降等诸多困难与问题这也是大多数企业所会面临到的问题。
为了提高市场占有率和企业的竞争力某企业在广东省某8个市部署了376台自动售货机但经过一段时间后发现其经营状况并不理想。而如何了解销售额、订单数量与自动售货机数量之间的关系畅销或滞销的商品又有哪些自动售货机的销售情况等已成为该企业亟待解决的问题。
02 分析目标
获取了该企业某6个月的自动售货机销售数据结合销售背景进行分析并可视化展现销售现状同时预测未来一段时间内的销售额从而为企业制定营销策略提供一定的参考依据。
03 分析过程 04 数据预处理
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 增加“市”属性 # 从省市区属性中提取市的信息并创建新属性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的记录进行删除处理 由操作结果可知删除前的数据行列数目为(350617, 17)删除后的数据行列数目为(350450, 17)。
删除“总金额元”属性中订单的金额较少的记录如代码清单4所示。
代码清单4 删除“总金额元”属性中订单的金额较少的记录 # 删除金额较少的订单前的数据行列数目print(data.shape)# 删除金额较少的订单后的数据行列数目data data[data[总金额元] 0.5]print(data.shape)属性选择
因为订单表中的“手续费元”“收款方”“软件版本”“省市区”“商品详情”“退款金额元”等属性对本案例的分析没有意义所以需要对其进行删除处理选择合适的属性操作的结果如图4所示。 属性选择如代码清单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)05 销售数据可视化分析
在销售数据中含有的数据量较多作为企业管理人员以及决策制定者无法直观了解目前自动售货机的销售状况。因此需要利用处理好的数据进行可视化分析直观地展示销售走势以及各区销售情况等为决策者提供参考。
1.销售额和自动售货机数量的关系
探索6个月销售额和自动售货机数量之间的关系并按时间走势进行可视化分析结果如图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可知4月至7月自动售货机数量呈上升趋势订单数量也随着自动售货机数量增加而增加而8月至9月自动售货机数量在减少订单数量也在减少。这说明了订单数量与自动售货机的数量是严格相关的增加自动售货机会给用户带来便利从而提高订单数量。同时结合图5可知订单数量和销售额的变化趋势基本保持一样的变化趋势这也说明了订单数量和销售额存在一定的相关性。
由于各市的设备数量并不一致所以探索各市自动售货机的平均销售总额并进行对比分析结果如图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所示。 探索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的设备及其所在的城市并进行可视化分析 销售额靠前的设备所在城市主要集中在中山市、广州市、东莞市和深圳市其中销售额前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的设备数量并进行可视化分析
只展示部分内容后续更多精彩就在书中探索吧
推荐阅读 正版链接https://item.jd.com/13814157.html 文末精彩福利
购买链接https://item.jd.com/14141114.html 本次送书1~3本【取决于阅读量阅读量越多送的越多】⌛️活动时间截止到2023-10月18号✳️参与方式关注博主三连点赞、收藏、评论 私信我进送书互三群有更多福利哦可以在文章末尾或主页添加微信