Python數據分析的基本過程

Python數據分析的基本過程

來自專欄大數據轉行學習筆記

一般來說,數據分析的基本過程包括以下幾個步驟:

1.提出問題——即我們所想要知道的指標(平均消費額、客戶的年齡分布、營業額變化趨勢等等)

2.導入數據——把原始數據源導入Jupyter Notebook中(網路爬蟲、數據讀取等)

3.數據清洗——數據清洗是指發現並糾正數據文件中可識別的錯誤(檢查數據一致性,處理無效值和缺失值等)

4.構建模型(高級的模型構建會使用機器學習的演算法)

5.數據可視化——matplotib庫等

具體的numpy庫等基礎知識之前的文章已經介紹了:

Numy基礎知識分享

Pandas入門基本知識

我們現在來看一個實例——醫院藥店銷售數據分析

原始數據連接:

https://pan.baidu.com/s/1zklAFKSCQOi_xxTGNgeRXQ?

pan.baidu.com

原始數據預覽(部分):

提出問題

我們想知道的信息有——月均消費額、月均消費次數、客單價、消費趨勢

理解數據

1.讀取Excel數據(路徑中最好不要有中文,或者特殊符號啥的,不然路徑會提示錯誤找不到。

最好將文件放到一個簡單的英文路徑下)

import pandas as pdfileNameStr=D:朝陽醫院2018年銷售數據.xlsx #讀取Ecxcel數據xls = pd.ExcelFile(fileNameStr, dtype=object) salesDf = xls.parse(Sheet1,dtype=object)

我們可以先查看下數據的基本信息:

salesDf.head() #列印出前5行,以確保數據運行正常

salesDf.shape #有多少行,多少列

salesDf.dtypes #查看每列的數據類型

數據清洗

1.選擇子集(本案例不用):

使用loc方法選擇子集

#subSalesDf=salesDf.loc[0:4,購葯時間:銷售數量]

2.列名重命名:

colNameDict = {購葯時間:銷售時間} #將『購葯時間』改為『銷售時間』salesDf.rename(columns = colNameDict,inplace=True)salesDf.head() #查看前五行

inplace=False,數據框本身不會變,而會創建一個改動後新的數據框,默認的inplace是False,inplace=True,數據框本身會改動

3.缺失數據處理:

python缺失值有3種:None,NA,NaN

1)Python內置的None值

2)在pandas中,將缺失值表示為NA,表示不可用not available。

3)對於數值數據,pandas使用浮點值NaN(Not a Number)表示缺失數據。

後面出來數據,如果遇到錯誤:......foloat錯誤,那就是有缺失值,需要處理掉

print(刪除缺失值前大小,salesDf.shape)salesDf=salesDf.dropna(subset=[銷售時間,社保卡號],how=any) #刪除列(銷售時間,社保卡號)中為空的行print(刪除缺失後大小,salesDf.shape)

how=any意為在給定的任何一列中有缺失值就刪除

如果缺失數據太多,我們可以建立模型,使用插入值的方法來補充數據(以後機器學習的文章中介紹)

4.數據類型轉換

一開始導入時我們將所有數據都按字元串類型導入的,現在需要將銷售數量、應收金額、實收金額的數據類型改為數值類型。

salesDf[銷售數量] = salesDf[銷售數量].astype(float)salesDf[應收金額] = salesDf[應收金額].astype(float)salesDf[實收金額] = salesDf[實收金額].astype(float)print(轉換後的數據類型:
,salesDf.dtypes)

使用astype()方法進行類型轉換

我們再來修改日期的格式

用split()方法,用『 』分割字元串。返回列表的第一個元素,統一改成年-月-日格式,去掉星期幾。

接下來我們分割銷售時間,先定義一個分割字元串的函數:

def splitSaletime(timeColSer): timeList=[] for value in timeColSer: #例如2018-01-01 星期五,分割後為:2018-01-01 dateStr=value.split( )[0] timeList.append(dateStr) timeSer=pd.Series(timeList) #將列錶轉行為一維數據Series類型 return timeSer

輸入:timeColSer——銷售時間這一列,是個Series數據類型

輸出:分割後的時間,返回也是個Series數據類型

timeSer=salesDf.loc[:,銷售時間] #獲取「銷售時間」這一列dateSer=splitSaletime(timeSer) #對字元串進行分割,獲取銷售日期salesDf.loc[:,銷售時間]=dateSer #修改銷售時間這一列的值salesDf.head()

(注意:如果運行後報錯:AttributeError: float object has no attribute split是因為Excel中的空的cell讀入pandas中是空值(NaN),這個NaN是個浮點類型,一般當作空值處理。所以要先去除NaN在進行分隔字元串)

5.字元串轉換日期

我們使用pd.to_datetime方法來將字元串轉換為日期格式。傳入的格式是原始數據的日期格式——format=%Y-%m-%d固定寫法:Y表示年、m表示月、d表示日。

salesDf.loc[:,銷售時間]=pd.to_datetime(salesDf.loc[:,銷售時間], format=%Y-%m-%d, errors=coerce)salesDf.dtypes

errors=coerce: 如果原始數據不符合日期的格式,轉換後的值為空值NaT

所以轉換之後我們還要運行一次刪除空值的代碼,因為不符合格式的日期被轉變為了空值需要刪除。

salesDf=salesDf.dropna(subset=[銷售時間,社保卡號],how=any)

6.數據排序

使用pd.sort_values方法對數據進行排序,by表示按那幾列進行排序,ascending=True 表示升序排列,ascending=False表示降序排列

print(排序前的數據集)salesDf.head()salesDf=salesDf.sort_values(by=銷售時間, #按銷售日期進行升序排列 ascending=True)print(排序後的數據集)salesDf.head(3)

接下來我們重命名行號:reset_index方法生成從0到N按順序的索引值

salesDf=salesDf.reset_index(drop=True)salesDf.head()

7.異常值處理

首先我們用describe()方法查看數據框中所有數據每列的描述統計信息:

salesDf.describe()

(count:總數,mean:平均數,std:標準差,min:最小值,25%:下四分位數,50%:中位數,75%:上四分位數,max:最大值)

我們發現最小值出現了小於0的情況,分析應該是記錄過程中出現錯誤所致。

我們接下來刪除異常值:通過條件判斷篩選出銷售數量大於0的數據

#設置查詢條件querySer=salesDf.loc[:,銷售數量]>0#應用查詢條件print(刪除異常值前:,salesDf.shape)salesDf=salesDf.loc[querySer,:]print(刪除異常值後:,salesDf.shape)

這樣,我們就算基本完成數據清洗的步驟了。

構建模型:

第一個指標:月均消費次數=總消費次數/月數

注意:同一天內,同一個人發生的所有消費算作一次消費,根據列名(銷售時間,社區卡號),如果這兩個列值同時相同,只保留1條,使用drop_duplicates將重複的數據刪除

kpi1_Df=salesDf.drop_duplicates( subset=[銷售時間, 社保卡號])totalI=kpi1_Df.shape[0] #總消費次數————有多少行print(總消費次數=,totalI)

計算月份數我們要知道最早一筆消費的時間和最晚一筆消費的時間:

#第1步:按銷售時間升序排序kpi1_Df=kpi1_Df.sort_values(by=銷售時間, ascending=True)kpi1_Df=kpi1_Df.reset_index(drop=True) #重命名行名(index)#第2步:獲取時間範圍startTime=kpi1_Df.loc[0,銷售時間] #最小時間值endTime=kpi1_Df.loc[totalI-1,銷售時間] #最大時間值#第3步:計算月份數daysI=(endTime-startTime).days #天數monthsI=daysI//30 #月份數: 運算符「//」表示取整除,返回商的整數部分,例如9//2 輸出結果是4print(月份數:,monthsI)

用天數/30計算月份數(捨棄餘數)

最終計算月均消費次數=總消費次數 / 月份數

kpi1_I=totalI // monthsIprint(業務指標1:月均消費次數=,kpi1_I)

第二個指標:月均消費金額=總消費金額/月份數

總消費金額等於實收金額取和,用sum函數很快就能得出

totalMoneyF=salesDf.loc[:,實收金額].sum() #總消費金額monthMoneyF=totalMoneyF / monthsI #月均消費金額print(業務指標2:月均消費金額=,monthMoneyF)

第三個指標:客單價=平均交易金額=總消費金額/總消費次數

totalMoneyF:總消費金額totalI:總消費次數pct=totalMoneyF / totalIprint(客單價:,pct)

第四個指標:消費趨勢

#在進行操作之前,先把數據複製到另一個數據框中,防止對之前清洗後的數據框造成影響groupDf=salesDf#第1步:重命名行名(index)為銷售時間所在列的值groupDf.index=groupDf[銷售時間]#第2步:分組gb=groupDf.groupby(groupDf.index.month)#第3步:應用函數,計算每個月的消費總額mounthDf=gb.sum()mounthDf

加下來的部分將用到一些pandas的高級應用知識,連同後面的數據可視化的內容將在接下來的文章中介紹。

推薦閱讀:

1.2 數據化運營所需的Python相關工具和組件
一個運營數據分析的案例
Kaggle機器學習之泰坦尼克號生還預測
用特徵選擇方法優化模型|python數據挖掘思考筆記(1)
0基礎包教會 | 數據分析環境搭建:jupyter配置python & r kernel

TAG:數據分析 | 數據挖掘 | 數據分析師 |