python對醫院2018年銷售數據進行數據分析


一、數據描述

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元以內。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM