1. 程式人生 > 其它 >python對醫院2018年銷售資料進行資料分析

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