一、數據描述
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元以內。