案例学习|Python实现某医院药品销售分析
数据分析的基本过程一般分为以下几个部分:
- 提出问题
- 获取并理解数据
- 数据清洗
- 构建模型
- 数据可视化
1.提出问题
在数据分析之前,我们先要明确分析目标,可以帮助我们更高效的选取数据,进行分析研究。
本次的分析目标是从销售数据中分析出以下业务指标:
1)月均消费次数
2)月均消费金额
3)客单价
4)消费趋势
有了分析目标,我们再来关注一下数据情况。
2.获取并理解数据
这里的数据集来源于微信公众号【数据分析1480】
我们先导入数据集,看看数据基本情况
1)导入数据处理相关库
import pandas as pd
2)导入数据,并理解数据
df=pd.read_excel('某医院2018年销售数据.xlsx')
df.head(5)
读取时默认将第一行作为标题行,打印前5行观察数据,发现数据表的基本信息包括"购药时间",“社保卡号”,“商品编码”,“商品名称”,“销售数量”,“应收金额”,“实收金额”。
#检查数据基本情况(缺失值、数据类型、行列情况等)
df.info()
行列:6578行x7列
缺失值:明显发现各项均小于6578,都存在缺失值
数据类型:各列数据类型object、float64…
#进行描述性统计
df.describe()
这里社保卡号和商品编号无实际意义,不考虑。
只看后三列,结果中最小值出现负数,需要关注
3.数据清洗
从上面的数据来看,我们明显发现存在缺失值,异常值,并不能马上就开始进行数据分析。这些数据都会使我们的分析结果产生偏差。
在分析之前,需要进行子集选择、缺失数据补充、异常值处理、数据类型转换等多个步骤。这些都属于数据清理的范畴。 在数据分析中,通常有多达60%的时间是花在数据清洗中的。通常的清洗步骤有以下几步:
• 选择子集
• 列名重命名
• 缺失数据处理
• 数据类型转换
• 数据排序
• 异常值处理
这些步骤有些不是一步就能完成的,可能需要重复操作。
现在开始对药店销售数据进行数据清洗。
1)选择子集
药店销售数据中,项目较少,选择子集可以忽略,我们从列名重命名开始。
2)列名重命名
销售数据集,购药时间显示为销售时间更为合理,我们先把这个项目名称做一下变更。
nameChangeDict = {'购药时间':'销售时间'}
#参数inplace=True表示覆盖元数据集
df.rename(columns = nameChangeDict,inplace=True)
df.head(5)
3)缺失值处理
对于缺失数据,我们可以有几种处理方法:
▪ 删除
当缺失数据占总数据量的比例很小的时候,我们通常采用删除的处理方法。
▪ 合理值填充
在某些不适合删除的场合,我们有时候也会对缺失数据进行合理值填充,如平均值,中位数,相邻数据等等。
#查看缺失值
df.isnull().any()
我们前面已经分析发现每列数据都有缺失值。
因为,缺失值数据占总数据量比例较小,并且销售时间和社保卡号为必须数据,且无法通过填充进去清理,所以在这里我们选择先删除社保卡号为空的数据,
查看缺失值数据:
#序号6574因为销售时间和社保卡号都缺失,所以会出现两次。
可以看到缺失值数据量仅为3条,我们对其进行删除
这里我们再次查看缺失值
发现已经不存在缺失值了,说明其他列的缺失值是由销售时间和社保卡号缺失造成。
我们重新查看一下数据集规模:
在数据删除后要及时更新一下最新的序号,不然可能会产生问题。同时打印后5行检验序号是否正确
4)数据类型转换
比如金额项目需要从字符串类型转换为数值(浮点型)类型。
这里先查看数据类型是否符合要求
可以看出,符合要求
如果需要更改数据类型,比如销售数量更改为整数int,则可以按下列代码进行更改并查看数据类型:
日期类型:从字符串类型转换为日期类型
这里的销售日期中包含了日期和星期,我们先提取星期建立新列。这里用一个自定义的函数dateadd来实现这个功能。
#新建星期列
def dateadd(dateSer):dateList = []for i in dateSer:#例如2018-01-01 星期五,提取“星期五”str = i.split(' ')[1]dateList.append(str)dateaddSer = pd.Series(dateList)return dateaddSerdateaddSer = dateadd(df['销售时间'])
df.insert(1, '星期',dateaddSer)
然后删去销售日期中的星期信息
#日期转换
def dateChange(dateSer):dateList = []for i in dateSer:#例如2018-01-01 星期五,分割后为:2018-01-01str = i.split(' ')[0]dateList.append(str)dateChangeSer = pd.Series(dateList)return dateChangeSer
dateChangeSer = dateChange(df['销售时间'])
dateChangeSer
df['销售时间'] = dateChangeSer
df.head()
我们继把销售时间的数据类型转为日期型。
因为改变了数据类型,未来确保数据转换成有效数据,这里我们查看是否出现了空值,发现出现了空值
这里判断可能是原始日期出现了问题,在实际应用中,需要分析产生的原因以及需不需要将这样的数据进行一下必要的修正。
这里我们就简单的把数据进行删除。由于条数不太多,我们暂时将其删去,再次检查发现不存在空值了
**5)数据排序 **
这里非常重要,不排序会影响建模过程
销售记录一般是以销售时间为顺序排列的,所以我们对数据进行一下排序
6)异常值处理
通过前面df.describe()的描述指标中可以看出,存在销售数量为负的数据,这明显是不合理的,我们把这部分数据也进行删除
重新进行描述统计,发现负值不存在了
及时更新一下最新的序号,不然可能会产生问题。同时打印后5行检验序号是否正确
5.构建模型
1)业务指标1:
月均消费次数=总消费次数 / 月份数
总消费次数:同一天内,同一个人发生的所有消费算作一次消费。这里我们根据列名(销售时间,社区卡号)结合,如果这两个列值同时相同,只保留1条,将重复的数据删除
月份数:数据已经按照销售时间进行排序,只需将最后的数据与第一条数据相减就可换算出月份数
#总消费次数计算
kpdf = df.drop_duplicates(subset=['销售时间','社保卡号'])
total = kpdf.shape[0]
print('总消费次数为:',total)
#月份数计算
startDay = df.loc[0,'销售时间']
print('开始日期:',startDay)
endDay = df.loc[df.shape[0]-1,'销售时间']
print('结束日期:',endDay)
monthCount = (endDay - startDay).days//30
print('月份数:',monthCount)
#业务指标1:月均消费次数=总消费次数 / 月份数
kpi1 = total / monthCount
print('业务指标1:月均消费次数=',kpi1)
2)指标2:月均消费金额 = 总消费金额 / 月份数
3)指标3:客单价=总消费金额 / 总消费次数
4)指标4:消费趋势
#在进行操作之前,先把数据复制到另一个数据框中,防止对之前清洗后的数据框造成影响
groupDf=df
#第1步:重命名行名(index)为销售时间所在列的值
groupDf.index=groupDf['销售时间']
#第2步:分组
gb=groupDf.groupby(groupDf.index.month)
#第3步:应用函数,计算每个月的消费总额
mounthDf=gb.sum()
导入可视化库
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['font.serif'] = ['SimHei']
sns.set_style("darkgrid",{"font.sans-serif":['simhei', 'Arial']})
import matplotlib.pyplot as plt
%matplotlib inline
#绘制销售数量图
plt.plot(mounthDf['销售数量'],color = 'b')
案例学习|Python实现某医院药品销售分析相关推荐
- python数值运算实例_“每天进步一点点”案例学习python数值操作
这是树哥讲python系列的第四篇文章. 本质上计算机熟悉的是二进制,也就是我们常说的"0,1"代码,所以无论是执行的命令还是数据本身,都必须转化为0和1他们才会认知.而我们熟悉的 ...
- 在我的新书里,尝试着用股票案例讲述Python爬虫大数据可视化等知识
我的新书,<基于股票大数据分析的Python入门实战>,预计将于2019年底在清华出版社出版. 如果大家对大数据分析有兴趣,又想学习Python,这本书是一本不错的选择.从知识体系上来看, ...
- 数据分析案例1.0——药品销售分析
药品销售分析 前言 数据获取 数据清洗 选择子集 列名重命名 缺失数据处理 数据类型转换 数据排序 异常值处理 构建模型 业务指标1:月均消费次数 业务指标2:月均消费金额 业务指标3:客单价 数据可 ...
- python全案例学习_Python全案例学习与实践
第一篇 营造环境 第1章 Python及其安装 1.1 我为什么要学习Python 1.1.1 它的广泛性 1.1.2 它的新颖性 1.1.3 它的生态性 1.1.4 Python的应用领域举例 1. ...
- 计算机毕业设计(附源码)python医院药品进销存系统
项目运行 环境配置: Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+Navicat11+Django+nodejs. 项目技术: dj ...
- python中continue用法案例_记录今天学习python中for与while循环针对break和continue的用法...
python中有两个主要的循环for与while,其中针对这两个循环有两种不同的中断用法break与continue. 首先先看下面的循环代码: 1: for i in range(10):#变量i带 ...
- 计算机毕设Python+Vue医院药品进销存系统(程序+LW+部署)
项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...
- 最详细的python案例学习与实践(含详细教程)
为了学习Python,使用Python开发应用程序,手头必须有得力的工具.在笔者看来,Python和PyCharm是最基本的学习和开发工具.如果要成为教育家或作家型的Python程序员,那么还必须准备 ...
- python如何编程-编程零基础应当如何开始学习 Python?
这个问题下面这么多人推荐了这么多 Python 资源,估计零基础新手看到了会眼花缭乱吧. 作为非计算机专业出身.自学编程的过来人,我知道想找到一份适合自己的入门教程不容易.不如就在这里分享一下,如何鉴 ...
最新文章
- ICML 2021杰出论文奖“临时更换”,上海交大校友田渊栋陆昱成等获提名
- 客户机系统已禁用cpu_Metricbeat System process metricset系统进程监控参数详情
- 新安装和已安装nginx如何添加未编译安装模块/补丁
- log4j 2.x --LogManager
- 在Akka中实现主从/网格计算模式
- 2pin接口耳机_拆解报告:雷柏首款真无线耳机XS200
- 计算机语言恢复,win10系统找回消失不见语言栏的恢复方法
- php mysql_fetch_array($result)_PHP mysqli_free_result()与mysqli_fetch_array()函数
- jQuery实现的简单文字提示效果模拟title
- 计算机硬盘扇区修复,一文教你搞定硬盘上的坏扇区要怎么修复,如果从坏扇区修复数据!...
- 弱监督学习总结(1)
- 裁剪好的视频如何去除黑边?
- linux 删除用户 currently logged in,userdel删除用户失败提示:userdel: user * is currently logged in 解决方法...
- 判断文本框输入中文超过10个英文数字超过20个
- Spring Boot 3.x 系列【23】集成Spring WebFlux开发响应式应用程序
- 利用普普通通的游戏引擎实现普普通通的电梯调度算法
- 用计算机解决问题听课笔记,《用计算机解决问题的一般步骤》说课稿
- MOS管基本驱动电路
- 按了锁定计算机怎么办,笔记本电脑键盘锁定了怎么办有什么方法解锁
- Windows上安装MySQL数据库(完整版)
热门文章
- 发生系统错误 5。拒绝访问。
- iOS公司开发者账号申请详细教程
- Android版火狐无法同步,Firefox 同步 故障解决
- 文档服务器sos,Cliosoft SOS 使用手册
- Python4班平均成绩统计_2021小升初必看!成都各个初中成绩如何?师资咋样?不同成绩的孩子该怎么准备?...
- 科技公司的域名大战!
- 动态规划之买瓜子—C说算法系列
- 设备管理器里“SM总线控制器”、“其他PCI桥设备”驱动有问题
- 基于matlab语音增强,基于MATLAB的语音增强系统的设计
- springBoot整合mybatis-plus 报错 No qualifying bean of type