首页 > 编程语言 > 详细

python对医院2018年销售数据进行数据分析

时间:2021-06-18 23:50:20      阅读:31      评论:0      收藏:0      [点我收藏+]

一、数据描述

1、数据字段及解释

  • 购药时间:朝阳医院药物卖出时间
  • 社保卡号:每个人的社保卡号
  • 商品编码
  • 商品名称:各商品的名称
  • 销售数量
  • 应收金额
  • 实收金额

2、导入数据

1 import pandas as pd
2 data = pd.read_csv(rDrug.csv)
3 data
4 data.describe()

 

技术分享图片技术分享图片
  

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

1 pop = data.loc[:,‘销售数量‘] > 0
2 data = data.loc[pop,:]
3 data.describe()

技术分享图片

从数据输出结果可知,一共统计了6577份销售记录。其中,有2367钟商品,销售数量最大达到一次50份。 

 

二、提出问题

1、药品的销售量是否与商品价格有关;

2、药品的销售量是否与药品的种类有关;

3、药品的销售数量是否与社保卡减少的价格有关;

三、数据清洗和预处理

1、查找缺失值

 1 pd.isnull(data).sum() 

技术分享图片
2
、处理缺失值 

删除文件中的缺失值

1 data = data.dropna(subset=[销售时间,社保卡号], how=any)
2 data

技术分享图片

与初始表相比,明显6574行的数据被删除了。

3、进行数据清洗,将数据按时间排序

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

 1  def splitSaletime(timeColSer):
 2       timeList=[]
 3       for value in timeColSer:
 4           dateStr=value.split( )[0] #用空格进行分割
 5          timeList.append(dateStr)
 6      timeSer=pd.Series(timeList)    #将列表转行为一维数据Series类型
 7      return timeSer
 8  #获取“销售时间”这一列
 9  timeSer = data.loc[:,销售时间]
10  #对字符串进行分割,提取销售日期
11  dateSer = splitSaletime(timeSer)
12  #修改销售时间这一列的值
13  data.loc[:,销售时间] = dateSer
14  data.head()
15  data.loc[:,销售时间]=pd.to_datetime(data.loc[:,销售时间],format=%Y-%m-%d, errors=coerce)
16  print(data.dtypes)

技术分享图片

  

1 data.isnull().sum()

  技术分享图片

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

 1 data = data.sort_values(by=‘销售时间‘, ascending=True)
 2 data = data.reset_index(drop=True)
 3 data

技术分享图片
 
四、数据可视化 

1、分析每天的消费金额

 1   import matplotlib.pyplot as plt
 2   import matplotlib
 3   #画图时用于显示中文字符
 4   from pylab import mpl
 5   mpl.rcParams[font.sans-serif] = [SimHei] # SimHei是黑体的意思
 6   #在操作之前先复制一份
 7   #在操作之前先复制一份数据,防止影响清洗后的数据
 8   groupDF = data  
 9   #将‘销售时间‘设置为index
10   groupDF.index = groupDF[销售时间]
11   print(groupDF.head())
12   gb = groupDF.groupby(groupDF.index)
13   print(gb)
14   dayDF = gb.sum()
15   print(dayDF)
16   #画图
17   plt.plot(dayDF[实收金额])
18   plt.title(按天消费金额)
19   plt.xlabel(时间)
20   plt.ylabel(实收金额)
21   plt.show()

技术分享图片

2、分析每月的消费金额

 1   #将销售时间聚合按月分组
 2   gb = groupDF.groupby(groupDF.index.month)
 3   print(gb)
 4   monthDF = gb.sum()
 5   print(monthDF)
 6   plt.plot(monthDF[实收金额])
 7   plt.title(按月消费金额)
 8   plt.xlabel(时间)
 9   plt.ylabel(实收金额)
10   plt.show()

技术分享图片


结果显示,7月消费金额最少,这是因为7月份的数据不完整,所以不具参考价值。 

1月、4月、5月和6月的月消费金额差异不大.
2月和3月的消费金额迅速降低,这可能是2月和3月处于春节期间,大部分人都回家过年的原因。

3、分析药品销售情况

1   #聚合统计各种药品数量
2   medicine = groupDF[[商品名称,销售数量]]
3   bk = medicine.groupby(商品名称)[[销售数量]]
4   re_medicine = bk.sum()
5   #对销售药品数量按将序排序
6   re_medicine = re_medicine.sort_values(by=销售数量, ascending=False)
7   re_medicine.head()

技术分享图片

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

1   top_medicine = re_medicine.iloc[:10,:]
2   top_medicine
3   # 数据可视化,用条形图展示前十的药品
4   top_medicine.plot(kind = bar)
5   plt.title(销售前十的药品)
6   plt.xlabel(药品)
7   plt.ylabel(数量)
8   plt.show()

技术分享图片

4、每天的消费金额分布情况

每天的消费金额分布情况:一横轴为时间,纵轴为实收金额画散点图。

1  plt.scatter(data[销售时间],data[实收金额])
2  plt.title(每天销售金额)
3  plt.xlabel(时间)
4  plt.ylabel(实收金额)
5  plt.show()

技术分享图片

结论:从散点图可以看出,每天消费金额在500以下的占绝大多数,个别天存在消费金额很大的情况。 

五、总结

对于销售量排在前几位的药品,医院应该时刻关注,保证药品不会短缺而影响患者。得到销售数量最多的前十种药品的信息,这些信息也会有助于加强医院对药房的管理。

从结果可以看出,每天消费总额差异较大,除了个别天出现比较大笔的消费,大部分人消费情况维持在1000-2000元以内。

python对医院2018年销售数据进行数据分析

原文:https://www.cnblogs.com/1762806175asd/p/14900996.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!