Python数据挖掘实用案例——自动售货机销售数据分析与应用(一)+https://developer.aliyun.com/article/1384979
2.订单数量和自动售货机数量的关系
探索6个月订单数量和自动售货机数量之间的关系,并按时间走势进行可视化分析,结果如图6所示。
图6 订单数量和自动售货机数量之间的关系
由图6可知,4月至7月,自动售货机数量呈上升趋势,订单数量也随着自动售货机数量增加而增加,而8月至9月,自动售货机数量在减少,订单数量也在减少。这说明了订单数量与自动售货机的数量是严格相关的,增加自动售货机会给用户带来便利,从而提高订单数量。同时,结合图5可知,订单数量和销售额的变化趋势基本保持一样的变化趋势,这也说明了订单数量和销售额存在一定的相关性。
由于各市的设备数量并不一致,所以探索各市自动售货机的平均销售总额,并进行对比分析,结果如图7所示。
图7 各市自动售货机平均销售总额
由图7可知,深圳市自动售货机平均销售总额最高,达到了6538.28元,排在其后的是珠海市和中山市。而最少的是清远市,其平均销售总额只有414.27元。出现此情况可能是因为不同区域的人流量不同,而深圳市相对于其他区域的人流量相对较大,清远市相对于其他区域的人流量相对较小。此外,广州市的人流量也相对较大,但其平均销售总额却相对较少,可能是因为自动售货机放置不合理导致的。
探索订单数量和自动售货机数量之间的关系,以及各市自动售货机的平均销售总额如代码清单8所示。
代码清单8 订单数量和自动售货机数量之间的关系
groupby2 = data.groupby(by='月份', as_index=False).agg({'设备编号': f, '订单编号': f}) groupby2.columns = ['月份', '设备数量', '订单数量'] # 绘制图形 plt.figure(figsize=(10, 4)) plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False fig, ax1 = plt.subplots() # 使用subplots函数创建窗口 ax1.plot(groupby2['月份'], groupby2['设备数量'], '--') ax1.set_yticks(range(0, 350, 50)) # 设置y1轴的刻度范围 ax1.legend(('设备数量',), loc='upper left', fontsize=10) ax2 = ax1.twinx() # 创建第二个坐标轴 ax2.plot(groupby2['月份'], groupby2['订单数量']) ax2.set_yticks(range(0, 100000, 10000)) # 设置y2轴的刻度范围 ax2.legend(('订单数量',), loc='upper right', fontsize=10) ax1.set_xlabel('月份') ax1.set_ylabel('设备数量(台)') ax2.set_ylabel('订单数量(单)') plt.title('订单数量和自动售货机数量之间的关系') plt.show() gruop3 = data.groupby(by='市', as_index=False).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, fontsize=8) 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_index=False)['总金额(元)'].sum() group4.sort_values(by='总金额(元)', ascending=False, inplace=True) d = group4.iloc[: 10] x_data = d['商品ID'].values.tolist() y_data = np.round(d['总金额(元)'].values, 2).tolist() bar = (Bar(init_opts=opts.InitOpts(width='800px',height='600px')) .add_xaxis(x_data) .add_yaxis('', y_data, label_opts=opts.LabelOpts(font_size=15)) .set_global_opts(title_opts=opts.TitleOpts(title='畅销前10的商品'), yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts( formatter='{value}',font_size=15)), xaxis_opts=opts.AxisOpts(type_='category', axislabel_opts=opts.LabelOpts({'interval': '0'}, font_size=15, rotate=30)))) 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_opts=opts.LabelOpts(position='right')) .set_global_opts(title_opts=opts.TitleOpts( title='滞销前10的商品'), xaxis_opts=opts.AxisOpts( axislabel_opts={'interval': '0'})) .reversal_axis() ) grid = Grid(init_opts=opts.InitOpts(width='600px', height='400px')) grid.add(bar, grid_opts=opts.GridOpts(pos_left='18%')) 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_index=False)['总金额(元)'].sum() group5.sort_values(by='总金额(元)', ascending=False, inplace=True) 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(x=0, bottom=y, height=0.4, width=x, orientation='horizontal') 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(x=0, bottom=y, height=0.4, width=x, orientation='horizontal') 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_index=False)['设备编号'].count() x_data = lb['市'].values.tolist() y_data = lb['设备编号'].values.tolist() bar = (Bar(init_opts=opts.InitOpts(width='500px', height='400px')) .add_xaxis(x_data) .add_yaxis('', y_data) .set_global_opts(title_opts=opts.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_opts=opts.LabelOpts(formatter='{b}:{c}({d}%)')) .set_global_opts(title_opts=opts.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_opts=opts.LabelOpts(formatter='{b}:{c}({d}%)'), radius=[60, 200], rosetype='radius', is_clockwise=False) .set_global_opts(title_opts=opts.TitleOpts(title='各消费时段的订单用户占比')) ) pie.render_notebook()
七、销售额预测
精准的销售额预测对于企业运营有着非常重要的指导意义,可以指导运营后台提前进行合理的资源配置,帮助企业管理人员制定合理的目标。同时,还可以更好地帮助企业采取更为针对性的促销手段,更加明确市场的需求,可以根据不同区域、不同时间划分等制定更加有效、合理的配货方案和商品价格,从而增加企业经营收益。
自动售货机的销售额预测指的是从售货机已有销售额的订单数据资料中,总结出商品销售额的变化规律,并根据该规律构建ARIMA模型,动态预测未来4周内商品的销售额。
ARIMA模型的建模步骤如图15所示。
图15 ARIMA模型的建模步骤
1.统计周销售额
通过观察订单数据,发现该数据集记录的是当前日期时间下,售货机所售卖商品的订单状况,其出货状态有出货成功、出货失败、未出货等多种情况。然而,为预测未来4周的销售额,其所需样本数据应为实际的周销售额数据,因此,需要筛选状态为出货成功的数据并统计各周销售额,如代码清单14所示。
代码清单14 筛选出货成功数据并统计各周销售额
import pandas as pd import matplotlib.pyplot as plt from statsmodels.tsa.stattools import adfuller as ADF from statsmodels.graphics.tsaplots import plot_acf from statsmodels.stats.diagnostic import acorr_ljungbox from statsmodels.tsa.arima_model import ARIMA data = pd.read_csv('../tmp/order.csv', encoding='gbk')
Python数据挖掘实用案例——自动售货机销售数据分析与应用(三)+https://developer.aliyun.com/article/1384982