或掃描下方二維碼獲取:python
在本次博客中,我將利用Python數據分析工具來作一個某醫院某年度的銷售狀況彙總。網絡
項目運行環境:函數
操做系統 | Windows 10 64位 |
Python | 3.7.0 |
開發工具 | Pycharm(ipython) |
數據分析的基本過程主要分爲兩方面:
1、數據分析的目的
一方面是發現問題,而且找到問題的根源,最終經過切實可行的辦法解決存在的問題;另外一方面,提取有用信息和造成結論而對數據加以詳細研究和歸納,對以往的數據分析,總結髮展趨勢,爲網絡營銷決策提供支持。
二 、數據分析基本過程
數據分析基本過程包括:獲取數據、數據清洗、構建模型、數據可視化、得出結論。工具
注:本次項目使用的數據請在前面連接自行下載
導包開發工具
import os import pandas as pd import matplotlib.pyplot as plt |
os.chdir(r'填寫你的數據所在路徑') #好比:os.chdir(r'F:\360Downloads\朝陽醫院') |
dataDF=pd.read_ecxel('文件名(記得帶文件後綴名)') #好比:dataDF=pd.read_excel('朝陽醫院2018年銷售數據.xlsx') |
dataDF.head() #默認查看前5行 |
接下來查看數據的下列信息:shape(形狀)、index(索引)、columns(列名)、count(總數)字體
dataDF.shape #查看數據的結構(行、列數) |
dataDF.index #查看數據的索引 |
dataDF.columns #查看數據的列名 |
dataDF.count() #查看數據的總數 |
dataDF.describe() #查看數據的數值詳細信息 |
經過以上的數據能夠看出: 總共有6578行7列數據,可是「購藥時間」和「社保卡號」這兩列只有6576個數據,而「商品編碼」一直到「實收金額」這些列都是隻有6577個數據。這就意味着數據中存在缺失值,能夠推斷出數據中存在一行缺失值。 此外「購藥時間」和「社保卡號」這兩列都各自存在一個缺失數據,這些缺失數據在後面步驟中須要進一步處理。 並且數據中存在負數,這將在後面也須要進一步處理。 |
數據清洗一般包括:選擇子集、修改列名稱、處理缺失值、處理異常值、轉換數據類型、數據排序(爲可視化作準備),在這裏咱們根據實驗數據自己特徵進行處理,過程以下:
選擇子集:編碼
在進行數據分析時,一般會遇到很是龐大的數據包,而且其中不免會有一些‘無用’的數據,以及和本次項目不相關的信息,這時就須要將其分開並按照需求選擇,獲得有價值的數據集來進行進一步分析,從而挖掘出咱們須要的潛在信息。因爲本次案例使用的數據集量小且簡單,所以能夠忽略這一步。 |
修改列名稱:spa
在拿到的原始數據中,列名稱和數據和其餘列名之間可能會類似或者不可以‘見名知意’,致使給後續分析帶來困難,爲了不此現象,咱們能夠根據需求調用rename()函數將列名重命名,好比中文名稱(這裏純屬我的習慣) |
dataDF=dataDF.rename(columns={'購藥時間':'銷售時間'}) dataDF.head() |
處理缺失值:操作系統
經過上面的dataDF.count()能夠看出,數據的「購藥時間」和「社保卡號」行數和其餘數據不相等,證實確定存在空值,爲了避免對後續的操做形成干擾,在這裏須要進一步處理,一般處理方式有兩種:第一,刪除;第二,填充。在本次案例中,因爲數據簡單,咱們採用第一種方式將含有空值的行刪除,獲得‘乾淨’數據,使用到的函數有dropna() |
dataDF=dataDF.dropna(subset=['銷售時間','社保卡號'],how='any') dataDF.count() |
處理異常值:
咱們先來查看一下數據的當前信息:
excel
dataDF.describe() |
能夠看出數據當中存在異常值(負值)。
如今咱們刪除負值所在的行
pop=dataDF.loc[:,'銷售數量']>0 |
dataDF=dataDF.loc[pop,:] dataDF.describe() |
接下來再查看一下數據信息(行數)
轉換數據類型:
咱們先來查看一下數據的當前類型:
發現銷售時間這一列並非咱們想要的datetime格式,所以須要轉換,爲後續分析作準備。這裏使用到的函數有:astype()函數
在處理以前,原始數據以下圖(發現‘銷售時間’這一列存在星期*,顯然這並非咱們須要的,接下來咱們編寫(分割)函數將其去除,具體操做以下):
下圖是我編寫的一個(分割)函數以及具體操做(此處方法不少,遠遠不止這一種)
本案例操做方法以下:
調用函數,處理數據(具體過程見上圖的‘函數調用方法’部分)
time=dataDF.loc[:,'銷售時間'] data=SplitSaletime(time) dataDF.loc[:,'銷售時間']=data |
處理後的數據(銷售時間)以下:
查看當前數據類型(以下圖,發現銷售時間列格式已經修改爲功,接下來將其轉換爲datetime類型便可):
dataDF.loc[:,'銷售時間']=pd.to_datetime(dataDF.loc[:,'銷售時間'],format='%Y-%m-%d',errors='coerce') |
此時咱們再來看數據(銷售時間)類型,發現已經轉換成功:
數據排序(重置索引):
接下來咱們按照時間列進行升序排序
dataDF=dataDF.sort_values(by=['銷售時間'],ascending=True) #by='填寫須要按照那一列來排序',ascending=True表示升序(False表示降序) |
而後重置索引
dataDF=dataDF.reset_index(drop=True) |
數據準備就緒後,根據相關業務利用可視化工具實現圖標製做,從而挖掘出數據背後的信息。 |
dataDF_qc=dataDF.drop_duplicates(subset=['銷售時間','社保卡號']) |
接着查看數據形狀,看是否有變化:
再看一下原始數據形狀:
打印重複的行數:
print(f'原始數據與去重後的數據行數相差:{dataDF.shape[0]-dataDF_qc.shape[0]}行。') |
計算總消費次數:
Total_time=dataDF_qc.shape[0] |
結果以下:
按照銷售時間升序排序,而後重置索引
升序排序 | dataDF_shengxu=dataDF_qc.sort_values(by=['銷售時間'],ascending=True) |
重置索引 | dataDF_qc_resrt_index=dataDF_qc.reset_index(drop=True) |
計算銷售時間範圍:
StartTime=dataDF_qc_resrt_index.loc[0,'銷售時間'] |
EndTime=dataDF_qc_resrt_index.loc[Total_time-1,'銷售時間'] |
此時發現銷售時間出現空值,所以這裏咱們刪除空值所在行數據:
dataDF_qc_resrt_index.dropna(subset=['銷售時間'],inplace=True) |
如今咱們重複上述步驟獲取開始和結束時間:
StartTime=dataDF_qc_resrt_index.loc[0,'銷售時間'] |
EndTime=dataDF_qc_resrt_index.loc[Total_time-1,'銷售時間'] |
計算總天數:
Day_time=(EndTime-StartTime).days |
計算月份數:
Month_time=Day_time//30 #其中//爲整除運算,每個月按30天計 |
月均消費次數 = 總消費次數/月份數:
Ave_time=Total_time//Month_time |
Total_Money=data_new.loc[:,'實收金額'].sum() |
print(f'每個月平均消費{(Total_Money//Month_time)}元。') |
print(f'每次購藥平均消費金額爲:{(Total_Money/Total_time)}元。') |
準備工做:
導入可視化包: import matplotlib.pyplot as plt 遇到數據中有中文的時候,必定要先設置中文字體 plt.rcParams['font.sans-serif']=['SimHei'] # 用黑體顯示中文 |
首先將數據複製到一個新的變量,專門用做數據可視化
Data_KSH=dataDF_qc_resrt_index |
重置索引爲‘銷售時間’列:
Data_KSH.index=Data_KSH['銷售時間'] |
繪製圖形:
數據聚合(按照月份):
Mon=Data_KSH.groupby(Data_KSH.index.month) |
利用sum()求和,計算每個月銷售金額:
Mon_Money=Mon.sum() |
繪製圖形:
按照銷售數量排序:
Data_XSSL=Data_KSH.sort_values(by='銷售數量') |
按照銷售數量去重:
Data_XSSL=Data_XSSL.drop_duplicates(subset=['銷售數量']) |
提取前十行數據:
Top_10=Data_XSSL.iloc[:10,:] |
查看前十行數據:
繪製圖形:
本案例數據集地址(百度網盤):連接:https://pan.baidu.com/s/1mStg3VcubipPx3EzQwMLEQ 提取碼:5ua5 (此連接永久有效)
或者掃描下方二維碼獲取源代碼: