數據分析基本流程的實例展示

本文將根據一個真實的藥品銷售數據集,對數據分析的基本過程進行實例化講解,包含了筆者掉過的坑和經驗的總結,拳拳到肉,直擊細節,不容錯過!

做任何事情都講求科學,要有科學的方法論,這樣你才能沿著正確的路線前進,先上流程圖:


一、提出問題

數據分析的目標是解決實際業務問題,數據驅動決策,如果沒有目標,那麼將變成無頭蒼蠅,亂飛亂撞。

問題從業務中來,經過數據分析,又將結果返回到業務中去,一切圍繞業務,一切服務業務。

第1步:提出問題

二、理解數據

所謂理解數據,就是根據業務問題,採集各個相關指標的數據,將數據表導入Python之後,初步查看涉及到哪些變數、數據有幾行幾列、描述性統計信息等,對數據集的整體情況初步掌握,理解每個變數是什麼,有什麼作用。

在導入數據時,為了能夠兼容所有的列數據類型且不出錯,可增加dtype=O選項,將每一列數據導入為object類型:

接下來查看數據類型、數據框大小、描述統計信息。由於剛剛導入的數據框的數據類型是object,所以df.describe()描述統計只能顯示計數類的信息。


三、數據清洗

數據清洗在整個數據分析過程中佔據了大部分的工作量,這裡面包含的操作基本功也要求最高,同時邏輯思維一定要清晰,否則很容易搞錯。

1.選取子集

一般在數據分析之前,由於數據集較大,而實際分析只需要其中的一部分即可,因而選取子集在某些時候變得必要。本案例數據集不大,不需要截取子集,這裡只介紹一下方法:使用資料庫的loc屬性,根據行列索引來選取:

2.列名重命名

有時候導入的數據是沒有header的,或者列名稱容易產生歧義,此時需要對列名稱進行重命名,便於後續的分析。可定義一個舊名稱為key,新名稱為value的字典,傳入重命名函數df.rename(),函數中添加:inplace=True,即可直接在原始數據框上原地修改。

inplace翻譯為原地,原地修改就是不創建新的數據框,直接變換原始數據框。

如果inplace=False,那麼將執行非原地修改,即原始數據框不變,新創建一個數據框。

3.缺失值處理

原始數據由於種種原因可能會存在缺失值,在缺失數據量較少的情況下,可採用行刪除法;如果缺失數據量較大,則要用到專門的插補法(這裡暫不做討論)。

首先查看一下每列數據都有多少缺失值,df.isnull()生成布爾型數據框,再用其sum屬性即可統計出每列有多少個缺失值:

統計每列缺失數據數量

從上圖發現:缺失數據量很少,可採用行刪除法。

df.dropna可通過subset參數指定從哪幾列判斷缺失值;

how=any表示指定列中,任意一列有缺失值,就刪除行;

how=all表示指定列中,所有列同時有缺失值,就刪除行;

inplace=True直接原地修改。

套路:刪除行數據後,立即查看數據框大小是否改變。

4.數據類型轉換

在最開始導入數據的時候,顯式指定了以object的類型導入數據,而實際中,數據框需要具有多種合理的數據類型:日期型、整數型、浮點型等。

這裡先將銷售數量列修改為整形,將與錢有關的列修改為浮點型。

然後將第一列的字元串型「日期+星期」的格式轉換成日期型數據,這裡便涉及到了字元串的分割。舉個栗子:

"2018-01-01 星期五"在經過string.split(sep=空格)之後,返回值為列表類型[2018-01-01, 星期五],我們只需要第一個元素,所以選擇list[0]即可。

套路:這裡可以用for循環,遍歷每一個日期值,並將每一個結果列表的list[0]裝入一個新列表,再將新列表賦值給原始數據的日期列Series中即可。

此刻,剛剛完成了第一步,即分割字元串。接下來便是更改為日期型數據。

可使用pd.to_datetime。第一個參數傳入銷售時間Series,第二個參數format為原始日期數據的格式化形式,此處用"%Y-%m-%d",第三個參數errors=coerce用於控制非日期型數據轉換後為空值。

轉換後,及時查看數據框的數據類型是否符合標準。

套路:在日期型數據完成轉換之後,可能會產生一些不合規的空值,需要刪除行。立刻再執行一次df.dropna(),指定subset,指定how。然後馬上查看刪除了多少行df.shape。

5.數據排序

對數據進行排序可以方便我們完成某些任務,同時發現一些潛在的信息。

此處我們根據數據值排序,使用df.sort_values()。

參數by指定按哪幾列排序;ascending=True升序,False降序;inplace原地修改。

套路:排序後的數據框,其行索引index已經錯亂,立刻需要重置順序df.reset_index()。其參數drop=True用於丟棄原始索引,inplace原地修改。

排序後立刻重置索引順序

6.異常值處理

套路:通過df.describe(),有時候可以對不符合邏輯的數據一眼識破,這些行同樣需要刪除。

是不是很神奇,銷售數量竟然有負值,果斷刪之。

這裡可以用Series條件篩選銷售數量大於0的行,間接刪除了不合理數據行。

套路:行刪除後,立刻重置索引順序df.reste_index(drop=True,inplace=True).

通過查詢條件Series,間接刪除不合規數據行

至此,數據清洗步驟完成。


四、建立模型

這一步根據對業務指標的理解,計算出相應公式,完成指標的處理。

1.指標一:月均消費次數

月均消費次數=總消費次數/月份數(同一卡號,同一天,消費多次,算一次)

所以,這裡涉及到數據去重的操作,銷售日期和社保卡號的組合不能重複。

套路:去重相當於刪除了行數據,日期的間隔需要先按日期排序,然後立刻重置索引順序df.reset_index;再使用loc屬性找到起始日期和結束日期。

坑:這裡的「去重」和「重置索引"不能再繼續原地修改了,因為一旦原地修改,則會刪除一些金額數據,導致後續的錢數少算。要新定義一個數據框!!!

去重後,計算總消費次數

業務指標一:

2.指標二:月均消費金額money per month

月均消費金額=總消費金額/月份數

坑:計算總消費金額時,要用「去重」之前的數據框,否則會將錢數少算。

3.業務指標三:客單價PCT

客單價=總消費金額/總消費次數

4.業務指標四:消費趨勢

消費趨勢屬於預測分析範疇,這部分後續補充。

五、數據可視化

可視化後續單獨講解。


在數據分析過程中,頭腦一定要清晰,該新建數據框的時候就新建,免得計算錯誤,這些步驟需要在實際應用中不斷熟練,熟能生巧,踏實下來練習吧。

推薦閱讀:

【技術人快報】歷史上首個針對ARC CPU的Linux惡意軟體+海淀一公司管理員盜竊公司比特幣被刑拘
這或許是對小白最友好的python入門了吧——11,if語句初體驗
如何提高爬蟲效率?Python下簡單的進程、線程效率對比
Python · 樸素貝葉斯(四)· MergedNB

TAG:數據分析 | Python |