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、進行資料清洗,將資料按時間排序
在“銷售時間
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元以內。