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

时间:2024-03-05 08:28:23

一、数据描述

1、数据字段及解释

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

2、导入数据

1 import pandas as pd
2 data = pd.read_csv(r\'Drug.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元以内。