Python数据挖掘实用案例——自动售货机销售数据分析与应用(二)

简介: Python数据挖掘实用案例——自动售货机销售数据分析与应用(二)

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

相关文章
|
6天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
22 1
|
2天前
|
机器学习/深度学习 人工智能 算法
机械视觉:原理、应用及Python代码示例
机械视觉:原理、应用及Python代码示例
|
2天前
|
安全 前端开发 JavaScript
在Python Web开发过程中:Web框架相关,如何在Web应用中防止CSRF攻击?
在Python Web开发中防范CSRF攻击的关键措施包括:验证HTTP Referer字段、使用CSRF token、自定义HTTP头验证、利用Web框架的防护机制(如Django的`{% csrf_token %}`)、Ajax请求时添加token、设置安全会话cookie及教育用户提高安全意识。定期进行安全审计和测试以应对新威胁。组合运用这些方法能有效提升应用安全性。
7 0
|
3天前
|
缓存 人工智能 API
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
8 0
|
6天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
12 1
Flask框架在Python面试中的应用与实战
|
7天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python构建简单的图像识别应用
本文将介绍如何利用Python语言及其相关库来构建一个简单但功能强大的图像识别应用。通过结合OpenCV和深度学习模型,我们将展示如何实现图像的特征提取和分类,从而实现对图像中物体的自动识别和分类。无需复杂的算法知识,只需一些基本的Python编程技巧,你也可以轻松地创建自己的图像识别应用。
|
9天前
|
数据挖掘 vr&ar Python
Python金融时间序列模型ARIMA 和GARCH 在股票市场预测应用
Python金融时间序列模型ARIMA 和GARCH 在股票市场预测应用
34 10
|
10天前
|
机器学习/深度学习 数据采集 供应链
从数据到决策:scikit-learn在业务分析中的应用
【4月更文挑战第17天】本文探讨了scikit-learn在业务分析中的应用,包括数据预处理、分类、回归和聚类模型的构建,以及模型评估与优化。通过使用scikit-learn,企业能有效处理数据、预测趋势、客户细分并制定决策,从而提升经营效率和市场策略。随着机器学习的发展,scikit-learn在业务分析领域的潜力将持续释放,创造更多价值。
|
10天前
|
机器学习/深度学习 算法
scikit-learn在回归问题中的应用与优化
【4月更文挑战第17天】本文探讨了scikit-learn在回归问题中的应用,介绍了线性回归、岭回归、SVR和决策树回归等算法,并提出优化策略,包括特征选择、超参数调优、交叉验证和集成学习。通过实践案例展示如何处理房价预测问题,强调了根据问题特点选择合适方法的重要性。
|
10天前
|
数据采集 数据可视化 数据挖掘
SciPy在数据分析中的应用:从数据清洗到可视化
【4月更文挑战第17天】# SciPy在数据分析中的应用:从数据清洗到可视化。文章探讨了SciPy在数据清洗(使用NumPy处理缺失值和异常值)、数据分析(描述性统计和模型拟合)以及数据可视化(结合Matplotlib和Seaborn进行图表绘制)中的作用。SciPy与其他Python库结合,为完整的数据分析流程提供了强大支持。