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

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

一、前言

  本文将主要结合自动售货机的实际情况,对销售的历史数据进行处理,利用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', encoding='gbk')
data5 = pd.read_csv('../data/订单表2018-5.csv', encoding='gbk')
data6 = pd.read_csv('../data/订单表2018-6.csv', encoding='gbk')
data7 = pd.read_csv('../data/订单表2018-7.csv', encoding='gbk')
data8 = pd.read_csv('../data/订单表2018-8.csv', encoding='gbk')
data9 = pd.read_csv('../data/订单表2018-9.csv', encoding='gbk')
# 合并数据
data = pd.concat([data4, data5, data6, data7, data8, data9], ignore_index=True)
print('订单表合并后的形状为', data.shape)
# 缺失值检测
print('订单表各属性的缺失值数目为:\n', data.isnull().sum())
data = data.dropna(how='any')  # 删除缺失值
1.2 增加“市”属性

为了满足后续的数据可视化需求,需要在订单表中增加“市”属性,操作结果如图2所示。

                                                               图2 增加“市”属性

增加“市”属性如代码清单2所示。

代码清单2 增加“市”属性

# 从省市区属性中提取市的信息,并创建新属性
data['市'] = data['省市区'].str[3: 6]
print('经过处理后的数据前5行为:\n', data.head())
1.3 处理订单表中的“商品详情”属性

  通过浏览订单表数据发现,在“商品详情”属性中存在有异名同义的情况,即两个名称不同的值所代表的实际意义是一致的,如“脉动青柠X1;”“脉动青柠x1;”等。因为此情况会对后面的分析结果造成一定的影响,所以需要对订单表中的“商品详情”属性进行处理,增加“商品名称”属性,如代码清单3所示。


代码清单3 处理订单表中的“商品详情”属性

# 定义一个需剔除字符的列表error_str
error_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(['手续费(元)', '收款方', '软件版本', '省市区', '商品详情', '退款金额(元)'], axis=1)
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'  # 新增“下单时间段”属性,并将其初始化为time
exp1 = data['小时'] <= 5  # 判断小时是否小于等于5
# 若条件为真,则时间段为凌晨
data.loc[exp1, '下单时间段'] = '凌晨'
# 判断小时是否大于5且小于等于8
exp2 = (5 < data['小时']) & (data['小时'] <= 8)
# 若条件为真,则时间段为早晨
data.loc[exp2, '下单时间段'] = '早晨'
# 判断小时是否大于8且小于等于11
exp3 = (8 < data['小时']) & (data['小时'] <= 11)
# 若条件为真,则时间段为上午
data.loc[exp3, '下单时间段'] = '上午'
# 判断小时是否小大于11且小于等于13
exp4 = (11 < data['小时']) & (data['小时'] <= 13)
# 若条件为真,则时间段为中午
data.loc[exp4, '下单时间段'] = '中午'
# 判断小时是否大于13且小于等于16
exp5 = (13 < data['小时']) & (data['小时'] <= 16)
# 若条件为真,则时间段为下午
data.loc[exp5, '下单时间段'] = '下午'
# 判断小时是否大于16且小于等于19
exp6 = (16 < data['小时']) & (data['小时'] <= 19)
# 若条件为真,则时间段为傍晚
data.loc[exp6, '下单时间段'] = '傍晚'
# 判断小时是否大于19且小于等于24
exp7 = (19 < data['小时']) & (data['小时'] <= 24)
# 若条件为真,则时间段为晚上
data.loc[exp7, '下单时间段'] = '晚上'
data.to_csv('../tmp/order.csv', index=False, encoding = 'gbk')

六、销售数据可视化分析

  在销售数据中含有的数据量较多,作为企业管理人员以及决策制定者,无法直观了解目前自动售货机的销售状况。因此需要利用处理好的数据进行可视化分析,直观地展示销售走势以及各区销售情况等,为决策者提供参考。

1.销售额和自动售货机数量的关系

探索6个月销售额和自动售货机数量之间的关系,并按时间走势进行可视化分析,结果如图5所示。

                               图5 销售额和自动售货机数量之间的关系/center>

  由图5可知,4月至7月,自动售货机的数量在增加,销售额也随着自动售货机的数量增加而增加;8月,虽然自动售货机数量减少了4台,但是销售额还在增加;9月相比8月的自动售货机数量减少了6台,销售额也随着减少。可以推断出销售额与自动售货机的数量存在一定的相关性,增加自动售货机的数量将会带来销售额的增长。出现该情况可能是因为广东处于亚热带,气候相对炎热,而7、8、9月的气温也相对较高,人们使用自动售货机的频率也相对较高。

探索销售额和自动售货机数量之间的关系如代码清单7所示。\

代码清单7 销售额和自动售货机数量之间的关系

import pandas as pd
import numpy as np
from pyecharts.charts import Line
from pyecharts import options as opts
import matplotlib.pyplot as plt
from pyecharts.charts import Bar
from pyecharts.charts import Pie

Python数据挖掘实用案例——自动售货机销售数据分析与应用(二)+https://developer.aliyun.com/article/1384980

相关文章
|
5天前
|
开发框架 JSON API
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
【7月更文挑战第22天】在Python Web开发中,设计高效的RESTful API涉及选择框架(如Flask或Django)、明确资源及使用HTTP方法(GET, POST, PUT, DELETE)来操作数据。响应格式通常是JSON,错误处理也很重要。示例展示了使用Flask创建图书管理API,包括版本控制、文档化、安全性和性能优化是最佳实践。这样的API使数据交互更顺畅。
26 2
|
6天前
|
SQL 存储 数据库
数据聚合大揭秘!Python如何一键整合海量信息,洞察数据背后的秘密?
【7月更文挑战第21天】在数据驱动时代,Python以强大库支持,如Pandas与SQLAlchemy,轻松聚合分析海量信息。Pandas简化数据整合,从CSV文件加载数据,利用`pd.concat()`合并,`groupby()`进行聚合分析,揭示销售趋势。SQLAlchemy则无缝链接数据库,执行SQL查询,汇总复杂数据。Python一键操作,开启数据洞察之旅,无论源数据格式,均能深入挖掘价值。
15 0
|
6天前
|
机器学习/深度学习 数据采集 数据挖掘
数据界的整容大师!Python如何让你的数据‘洗心革面’,焕然一新?
【7月更文挑战第21天】在数据科学领域,Python扮演着数据“整容大师”的角色,通过清洗、重塑与特征工程,将原始数据美化成分析佳品。首先,利用Pandas清洗数据,删除或填充缺失值,清除异常值,如同洁面般净化数据。其次,通过数据重塑与格式化,如按年龄分组统计薪资并优雅展示,赋予数据直观可读性,好比化妆塑形。最后,特征工程创造新维度,如年龄分组,提升数据分析价值,这全过程是对数据价值的深度挖掘和精细打磨。
|
1天前
|
机器学习/深度学习 数据可视化 vr&ar
|
2天前
|
数据可视化 数据挖掘 Python
数据界的颜值担当!Python数据分析遇上Matplotlib、Seaborn,可视化美出新高度!
【7月更文挑战第24天】在数据科学领域,Python的Matplotlib与Seaborn将数据可视化升华为艺术,提升报告魅力。Matplotlib作为基石,灵活性强,新手友好;代码示例展示正弦波图的绘制与美化技巧。Seaborn针对统计图表,提供直观且美观的图形,如小提琴图,增强数据表达力。两者结合,创造视觉盛宴,如分析电商平台销售数据时,Matplotlib描绘趋势,Seaborn揭示类别差异,共塑洞察力强的作品,使数据可视化成为触动人心的艺术。
22 7
|
4天前
|
数据采集 Web App开发 存储
Python-数据爬取(爬虫)
【7月更文挑战第24天】
31 7
|
1天前
|
机器学习/深度学习 数据采集 算法
数据海洋中的导航者:Scikit-learn库引领Python数据分析与机器学习新航向!
【7月更文挑战第26天】在数据的海洋里,Python以强大的生态成为探索者的首选,尤其Scikit-learn库(简称sklearn),作为一颗璀璨明珠,以高效、灵活、易用的特性引领数据科学家们破浪前行。无论新手还是专家,sklearn提供的广泛算法与工具支持从数据预处理到模型评估的全流程。秉承“简单有效”的设计哲学,它简化了复杂模型的操作,如线性回归等,使用户能轻松比较并选择最优方案。示例代码展示了如何简洁地实现线性回归分析,彰显了sklearn的强大能力。总之,sklearn不仅是数据科学家的利器,也是推动行业进步的关键力量。
|
4天前
|
数据可视化 数据挖掘 开发者
数据可视化新纪元!Python + Matplotlib + Seaborn,让你的数据故事生动起来!
【7月更文挑战第23天】在数据驱动时代,Python通过Matplotlib与Seaborn引领数据可视化新纪元。Matplotlib基础强大,提供广泛绘图选项;Seaborn则简化流程,图表更美观,适合快速可视化。两者结合,轻松应对复杂定制需求,将数据转化为生动故事,支持决策与交流。
18 6
|
4天前
|
数据采集 机器学习/深度学习 算法
Python-数据爬取(爬虫)
【7月更文挑战第23天】
26 5
|
2天前
|
数据可视化 数据挖掘 Python