Python LEVEL4:數據分析標準步驟

Index:數據分析思維框架(5步)

1.提出問題 (定義問題,明確需求/計算公式)

2.理解數據

1.採集數據(根據問題採集相關數據)

2.導入數據 excel/api介面/web鏈接

3.查看數據集信息(描述統計信息)從整體上理解數據

3.數據清洗( 6步數據預處理)

1)選擇子集(暫未用到)

2)列名重命名

3)缺失數據處理

4)數據類型轉換***重點***

5)排序

6)異常值處理

4.構建模型,對清洗後的數據進行分析(kpi指標)

1.簡單分析--得到業務指標

2.複雜分析--機器學習演算法訓練模型(後文詳述)

5.數據可視化(後文詳述)


操作案例:

1.提出問題:已知醫院藥品銷售數據,求

月均消費次數# 月均消費次數=總消費次數 / 月份數

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

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

消費趨勢# 可視化作圖(後文詳述)

2.理解數據

#導入數據分析包import pandas as pd#讀取Excel數據,統一先按照字元串讀入,之後轉換fileNameStr=A:/BaiduNetdiskDownload/第4關數據分析的基本過程(1)/朝陽醫院2018年銷售數據.xlsxxls = pd.ExcelFile(fileNameStr, dtype=object)#(賦值名,類型)salesDf = xls.parse(Sheet1,dtype=object)查看數據基本信息#默認列印前5行,確保數據運行正常salesDf.head()#有多少行,多少列salesDf.shape#查看每一列的數據類型salesDf.dtypes #這裡的類型統一是對象

3.數據清洗(6個清洗方向)

1)選擇子集

本案例不需要選擇子集,如果需要選擇前5列數據,使用如下代碼

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

2)列名重命名

#定義字典:舊列名和新列名對應colNameDict = {購葯時間:銷售時間}#inplace=False,原數據框不變,創建新數據框,默認inplace是False#inplace=True,改變原數據框salesDf.rename(columns = colNameDict,inplace=True)salesDf.head()#重新查看列名變化

3)缺失數據處理

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

#dropna函數詳細使用地址:pandas.DataFrame.dropna - pandas 0.22.0 documentation

4)數據類型轉換

#字元串轉換為數值(浮點型) astype函數salesDf[銷售數量] = salesDf[銷售數量].astype(float)salesDf[應收金額] = salesDf[應收金額].astype(float)salesDf[實收金額] = salesDf[實收金額].astype(float)print(轉換後的數據類型:
,salesDf.dtypes)運行後,會報警告SettingWithCopyWarning一般信息有兩類,一類是Warning警告信息,一類是Error錯誤信息。警告信息不用管,只關注錯誤類型信息

字元串轉換為日期數據類型(百度關鍵詞:python 分割字元串 string)

5步

***第1步***定義函數:分割函數

#split函數(對單個字元串分割):遇到空格把數據分開,返回兩個列對象,然後按序號提取列數據#需要重新定義分割整列字元串的函數分割銷售日期,獲取其中一部分輸入:timeColSer 銷售時間這一列,是Series數據類型輸出:分割後的時間,返回也是Series數據類型def splitSaletime(timeColSer): timeList=[] for value in timeColSer: #for 循環遍歷 分割 #例如2018-01-01 星期五,分割後為:2018-01-01 dateStr=value.split( )[0] timeList.append(dateStr) #將列錶轉行為一維數據Series類型 timeSer=pd.Series(timeList) #重新賦值 return timeSer #返回值series類型 列表

***第2步***使用函數

#獲取「銷售時間」這一列 timeSer=salesDf.loc[:,銷售時間]#對字元串進行分割,獲取銷售日期dateSer=splitSaletime(timeSer) #使用函數處理 所選中的列注意:如果運行後報錯:AttributeError: float object has no attribute split是因為Excel中的空的cell讀入pandas中是空值(NaN),這個NaN是個浮點類型,一般當作空值處理。所以要先去除NaN 再進行分隔字元串

***第3步***重新賦值

#修改銷售時間這一列的值 salesDf.loc[:,銷售時間]=dateSer #新數據列對原始數據列賦值salesDf.head() #check

***第4步***數據類型轉換:字元串轉換為日期

#errors=coerce 如果原始數據不符合日期的格式,轉換後的值為空值NaT#format 是你原始數據中日期的格式salesDf.loc[:,銷售時間]=pd.to_datetime(salesDf.loc[:,銷售時間], format=%Y-%m-%d, errors=coerce)salesDf.dtypes #check

***第5步***刪除空值

#轉換日期時,不符合日期格式的數值被轉換為空值,這裡刪除列(銷售時間,社保卡號)中為空的行#如果數據比較珍貴/或缺失值較多,不能直接刪除,就需要把缺失數據分離、賦值,進行二次清洗salesDf=salesDf.dropna(subset=[銷售時間,社保卡號],how=any)salesDf.head() #check

5)排序

print(排序前的數據集)salesDf.head() #checkby=參照該列排序ascending=True 表示降序排列,ascending=False表示升序排列#按銷售日期升序排列salesDf=salesDf.sort_values(by=銷售時間, ascending=True)print(排序後的數據集)salesDf.head(3)

6)異常值處理

#描述指標:查看出「銷售數量」值不能小於0salesDf.describe()#刪除異常值:通過條件判斷篩選出數據#查詢條件querySer=salesDf.loc[:,銷售數量]>0#應用查詢條件print(刪除異常值前:,salesDf.shape)salesDf=salesDf.loc[querySer,:]print(刪除異常值後:,salesDf.shape)

4.構建模型(簡單數據分析)

  • 業務指標1: 月均消費次數=總消費次數 / 月份數
  • 業務指標2: 月均消費金額 = 總消費金額 / 月份數
  • 業務指標3: 客單價=總消費金額 / 總消費次數

當日去重總消費次數:一天內同一人發生所有消費算作一次消費根據列名(銷售時間,社區卡號),如果這兩列值相同,只保留1條,將重複的數據刪除kpi1_Df=salesDf.drop_duplicates( subset=[銷售時間, 社保卡號])#去重後,總消費次數:有多少行totalI=kpi1_Df.shape[0]print(總消費次數=,totalI)

總消費次數= 5342

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

月份數: 6

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

業務指標1:月均消費次數= 890

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

業務指標2:月均消費金額= 50771.710000000145

#業務指標3:客單價=總消費金額 / 總消費次數#客單價(per customer transaction):商場每個顧客平均購買商品金額。注意,客單價是平均交易金額。#totalMoneyF:總消費金額(不用去重)#totalI:總消費次數(要當日去重)pct=totalMoneyF / totalIprint(業務指標3:客單價=,pct)

業務指標3:客單價= 56.909417821


Sum up:

1.數據清洗佔用60%時間,[數據類型轉換]是重點,需要多次操作;

2.對於[時間類型轉換]理解不夠透徹,需要反覆研究;

3.選擇子集複雜數據分析數據可視化 後文繼續學習;

4.文章的功能:便於回顧,結構要精簡清晰。

推薦閱讀:

厲害了word哥,互動式實時監控調整python程序執行!
草根學Python(十三)線程和進程
做python爬蟲需要會web後端嗎,不會的話能做嗎?
自學php或python到什麼程度才能找到工作?
公司里是怎麼做數據抓取的? --- 搜狗詞庫抓取&解析

TAG:數據分析 | 數據分析師 | Python |