一、数据分析的目的

本篇文章中以某医院2018年药品销售数据为例,目的是了解该医院在2018年里的销售情况,这就需要知道几个业务指标,例如:月均消费次数,月均消费金额、客单价以及消费趋势。

二、数据分析基本过程

数据分析基本过程包括:获取数据、数据清洗、构建模型、数据可视化以及消费趋势分析。
1、获取数据
部分数据截图

先导入包,然后读取文件。

file_name="/home/ysc/dataFX/案例/朝阳医院2018年销售数据.xlsx"
xls=pd.ExcelFile(file_name)
dataDF=xls.parse('Sheet1',dtype='object')
dataDF.head()


然后查看这些基本信息:

总共有6578行7列数据,但是“购药时间”和“社保卡号”这两列只有6576个数据,而“商品编码”一直到“实收金额”这些列都是只有6577个数据,这就意味着数据中存在缺失值,可以推断出数据中存在一行缺失值,此外“购药时间”和“社保卡号”这两列都各自存在一个缺失数据,这些缺失数据在后面步骤中需要进一步处理。
2、数据清洗
数据清洗过程包括:选择子集、列名重命名、缺失数据处理、数据类型转换、数据排序及异常值处理
(1)选择子集
在我们获取到的数据中,可能数据量非常庞大,并不是每一列都有价值都需要分析,这时候就需要从整个数据中选取合适的子集进行分析,这样能从数据中获取最大价值。在本次案例中不需要选取子集,暂时可以忽略这一步。
(2)列名重命名
在数据分析过程中,有些列名和数据容易混淆或产生歧义,不利于数据分析,这时候需要把列名换成容易理解的名称,可以采用rename函数实现:

dataDF.rename(columns={"购药时间":"销售时间"},inplace=True)
dataDF.head()


(3)缺失数据处理
获取的数据中很有可能存在缺失值,通过查看基本信息可以推测“购药时间”和“社保卡号”这两列存在缺失值,如果不处理这些缺失值会干扰后面的数据分析结果。缺失数据常用的处理方式为删除含有缺失数据的记录或者利用算法去补全缺失数据。在本次案例中为求方便,直接使用dropna函数删除缺失数据,具体如下:

dataDF=dataDF.dropna()

(4)数据类型转换
在导入数据时为了防止导入不进来,会强制所有数据都是object类型,但实际数据分析过程中“销售数量”,“应收金额”,“实收金额”,这些列需要浮点型(float)数据,“销售时间”需要改成时间格式,因此需要对数据类型进行转换。
可以使用astype()函数转为浮点型数据:

dataDF['销售数量']=dataDF['销售数量'].astype('float')
dataDF['应收金额']=dataDF['应收金额'].astype('float')
dataDF['实收金额']=dataDF['实收金额'].astype('float')
dataDF.dtypes


在“销售时间”这一列数据中存在星期这样的数据,但在数据分析过程中不需要用到,因此要把销售时间列中日期和星期使用split函数进行分割,分割后的时间,返回的是Series数据类型:

#定义函数将星期去除
def splitSaletime(timeColser):timelist=[]for val in timeColser:data=val.split(' ')[0]timelist.append(data)timeSer=Series(timelist)return timeSer
#获取销售时间这一列数据
time=dataDF["销售时间"]
data=splitSaletime(time)dataDF["销售时间"]=data
#接着把切割后的日期转为时间格式,方便后面的数据统计
#转换为日期
dataDF["销售时间"]=pd.to_datetime(dataDF["销售时间"],format='%Y-%m-%d',errors='coerce')
dataDF=dataDF.dropna()
dataDF.info()


(5)数据排序
此时时间是没有按顺序排列的,所以还是需要排序一下,排序之后索引会被打乱,所以也需要重置一下索引。其中by:表示按哪一列进行排序,ascending=True表示升序排列,ascending=False表示降序排列:

#按销售时间进行升序排序
dataDF=dataDF.sort_values(by='销售时间',ascending=True)
#重置索引
dataDF=dataDF.reset_index(drop=True)
dataDF.head()


(6)异常值处理
先查看数据的描述统计信息:

通过描述统计信息可以看到,“销售数量”、“应收金额”、“实收金额”这三列数据的最小值出现了负数,这明显不符合常理,数据中存在异常值的干扰,因此要对数据进一步处理,以排除异常值的影响:

#dataDF['销售数量']=dataDF['销售数量'].drop(dataDF['销售数量']<0)
pop=dataDF['销售数量']>0
dataDF=dataDF.loc[pop,:]
dataDF.describe()


3、构建模型及数据可视化
数据清洗完成后,需要利用数据构建模型(就是计算相应的业务指标),并用可视化的方式呈现结果。
(1)业务指标1:月均消费次数
月均消费次数 = 总消费次数 / 月份数
同一天内,同一人发生的所有消费算一次消费
① 计算总消费次数:

#计算总消费次数#删除重复数据
kpi1_Df=dataDF.drop_duplicates(subset=['销售时间','社保卡号'])
totalI=kpi1_Df.shape[0]
print("总消费次数:",totalI)

总消费次数: 5342

② 计算月份数:

#计算月份数
#按销售时间升序排序
kpi1_Df=kpi1_Df.sort_values(by='销售时间',ascending=True)
#重置索引
kpi1_Df=kpi1_Df.reset_index(drop=True)
#获取时间范围
#最小时间段
startTime=kpi1_Df.loc[0,'销售时间']
#最大时间段
endTime=kpi1_Df.loc[totalI-1,'销售时间']#计算月份数
#天数
daysI=(endTime-startTime).days
#月份数
monthsI=daysI // 30
print("月份数",monthsI)

月份数 6

③ 计算月均消费次数:

#计算月均消费次数
kpi1=totalI // monthsI
print("业务指标1:月均消费次数=",kpi1)

业务指标1:月均消费次数= 890

(2)业务指标2:月均消费金额
月均消费金额 = 总消费金额 / 月份数

totalMoneyF=dataDF['实收金额'].sum()
monthMoneyF=totalMoneyF / monthsI
print("业务指标2:月均消费金额",monthMoneyF)

业务指标2:月均消费金额 50668.35166666666

(3)业务指标3:客单价
客单价 = 总消费金额 / 总消费次数

#客单价
pct=totalMoneyF /totalI
print("业务指标3:客单价",pct)

业务指标3:客单价 56.909417821040805

(4)业务指标4:消费趋势
先导入相关的包:

import matplotlib.pyplot as plt
import matplotlib#画图时显示中文字符
from pylab import mpl# SimHei是黑体的意思
mpl.rcParams['font.sans-serif'] = ['SimHei']
#操作前复制一份数据,防止影响清洗后的数据
groupDF=dataDF

① 分析每天的消费金额

#每天的消费金额
#设置销售时间为索引
groupDF.index=groupDF["销售时间"]
#画图
plt.plot(groupDF['实收金额'])
plt.title("按天消费金额图")
plt.xlabel("时间")
plt.ylabel("实收金额")
plt.show()


从结果可以看出,每天消费总额差异较大,除了个别天出现比较大笔的消费,大部分人消费情况维持在500元以内。
② 分析每月的消费金额
接下来,我销售时间先聚合再按月分组进行分析:

#将销售时间聚合按月分组,计算每个月的消费总额
monthDF=groupDF.groupby(groupDF.index.month).sum()
#描绘按月消费金额图
plt.plot(monthDF['实收金额'])
plt.title("按月消费金额图")
plt.xlabel("月份")
plt.ylabel("实收金额")
plt.show()


结果显示,7月消费金额最少,这是因为7月份的数据不完整,所以不具参考价值。
1月、4月、5月和6月的月消费金额差异不大,2月和3月的消费金额迅速降低,这可能是2月和3月处于春节期间,大部分人都回家过年的原因。
③ 分析药品销售情况
对“商品名称”和“销售数量”这两列数据进行聚合为Series形式,方便后面统计,并按降序排序:

#聚合统计各种药品的销量
medicine=groupDF[['商品名称','销售数量']]
re_medicine=medicine.groupby('商品名称')[['销售数量']].sum()
#对药品销售数量按降序排序
re_medicine=re_medicine.sort_values(by="销售数量",ascending=False)
#截取销售量最多的前十种药品,并用条形图可视化
top_medicine=re_medicine.iloc[:10,:]
print(top_medicine

截取销售数量最多的前十种药品,并用条形图展示结果:

top_medicine.plot(kind='bar')
plt.title("药品销售前十")
plt.xlabel("药品种类")
plt.ylabel("销售数量")
plt.legend(loc=0)
plt.show()


得到销售数量最多的前十种药品信息,这些信息将会有助于加强医院对药房的管理。

根据医院药品销售数据分析本年度销售情况相关推荐

  1. 如何做好销售数据分析?

    企业所需要的真正有价值的销售数据需要依赖于企业内外销售环节成员收集/反馈/决定/实施/评估/预测的商品的真实动态销售数据.数据报告和数据分析的目的是使用数据做出业务决策. 一.销售分析常用指标 销售指 ...

  2. python药店销售数据分析_Python数据分析实例一:医院药品销售数据

    前面已经分享过python的基础语法,以及数据分析领域最常用的两个包:Numpy和Pandas(戳下面的链接),下面将用一个实际案例:<朝阳医院2018年销售数据.xlsx>和大家分享一下 ...

  3. python药店销售数据分析_Python:某医院药品销售数据分析

    数据分析步骤: 提出问题-理解数据-数据清洗-构建模型-数据可视化 下面就拿2018年朝阳医院销售数据按上述步骤进行分析. 1.提出问题 根据拿到的销售数据字段信息,我们对以下三个业务指标进行分析 . ...

  4. 重点客户销售数据分析python_药品销售数据分析--python

    一.数据分析的目的 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程. 本篇文章中,假设以朝阳医院2018年销售数据为例,目的是了 ...

  5. 月均数据_药品销售数据分析案例

    今天用python去做一个简单的药品销售数据分析案例 一.数据分析的目的 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程. 本篇 ...

  6. 探索性分析——某医院18年销售数据分析

    针对某医院18年销售记录,做简单的数据分析,熟悉相关语法及分析过程. 一.分析目的 以某医院18年销售数据为例,了解18年的销售情况,分析几个业务指标,例如:月均消费次数,月均消费金额.客单价以及消费 ...

  7. python医药数据分析_药品销售数据分析--python

    一.数据分析的目的 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程. 本篇文章中,假设以朝阳医院2018年销售数据为例,目的是了 ...

  8. 北京市朝阳医院药品销售数据分析

    目录 第1章绪论 1.1研究背景 1.2 研究目的与意义 1.3研究内容 2.1数据采集 2.1.1源数据下载 2.2.2源数据存储 2.2数据预处理 2.2.1数据预处理工具介绍及操作 2.2.2读 ...

  9. python药店销售数据分析_解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时 ...

最新文章

  1. 前端进阶(二)webpack开发服务器环境配置
  2. 研究报告:城市大脑的起源、现状与未来趋势
  3. CSS :hover 伪类
  4. 阿里的财报,释放了什么信号?
  5. Mybatis学习之单表增删改查
  6. [置顶]信息发布系统 Jquery+MVC架构开发(4)Model 层
  7. flask中的信号机制
  8. dev GridControl双击行事件
  9. jconsole 使用_我的Wiki:使用JConsole对WildFly(或JBoss AS7)进行远程JMX访问
  10. 创建线程时,需要创建的内容
  11. Windows Internet Explorer 7 正式发布
  12. hfss和matlab,matlab-hfss联合仿真教程(初学)--第一节(利用MATLAB编写脚本建立HFSS工程)...
  13. STM32初学(笔记二)紧急按键交通灯
  14. javalinux服务器上写文件,java 读取linux服务器上文件
  15. 干支纪年法简便算法_高中化学分类学法指导!附高考化学必记知识点及规律(可下载,打印)...
  16. Cause: java.lang.ArrayIndexOutOfBoundsException: 8
  17. 球球大作战服务器维护时间,2018球球大作战每日解除限制时间是几点 | 手游网游页游攻略大全...
  18. 配置 七牛云cdn 加速
  19. 【前瞻】Nature:2022年7大“颠覆性”技术
  20. 曝 OPPO 给离职员工补发年终奖,此前遭克扣

热门文章

  1. VMware 网络连接设置 解决Ubuntu,Fedora 不能上网的问题
  2. delphi 数组复制利用CopyMemory 最为完美
  3. 内存拷贝CopyMemory与MoveMemory
  4. Angular-cli环境搭建,组件的数据渲染,父子组件传值
  5. chrome被hao123劫持网页
  6. chrome打开就进入hao123.com
  7. PostGreSQL教程_postgis教程
  8. python中reduce函数的运用_Python reduce函数
  9. 摄像机旋转,视距调节,第一/第三人称控制器可切换
  10. vue如何实现弹幕功能