python數據分析-數據清洗流程(附腦圖和代碼實例)

無論是做機器學習還是做數據分析,都離不開獲取數據後的第一步-數據清洗工作。據統計,數據清洗工作佔據整個工作時間百分之50左右,有的甚至能達到百分之70。下面我將介紹我進行數據清洗得思路流程。

數據清洗整體流程腦圖(不斷更新中…)

在這裏插入圖片描述

數據準備

本次數據清洗工作我們使用得數據是一個借貸機構開放的用戶數據(僅用於個人練習),由於源數據量有將近30萬,考慮到運行速度,這裏例子從這30萬中隨機抽取1萬條數據。
下載地址:LCIS.csv
提取碼:ag8t
注:此數據僅僅作爲方法演示使用,忽略真實數據分析時的業務邏輯考慮。

導入相應的python工具包和數據
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif']=['SimHei']#這兩句作用爲防止中文亂碼
plt.rcParams['axes.unicode_minus']=False
data = pd.read_csv('data/LCIS.csv')
data = data.sample(10000)#抽取樣例10000個
data.reset_index(inplace=True)#重置索引

數據缺失值判定

一、熱力圖顯示數據的缺失
sns.heatmap(data.isnull(),cmap="YlGnBu")
plt.show()

在這裏插入圖片描述

深顏色的橫線就代表缺失值。因爲數據中我們使用了innull()方法,若判斷爲空,則值爲1,否則值爲0。從上圖中,我們可以看到,最後幾個屬性的缺失值最多,其他的幾乎沒有。
優點:能夠清楚看到哪些地方有缺失,缺失程度。

二、使用info()查看缺失值
print(data.info())

在這裏插入圖片描述
在這裏插入圖片描述
info()這個方法能夠統計每個屬性下非空值的數量,總個數以及數據量的大小。
優點:操作方便,執行更快,能立刻發現哪個屬性存在缺失值。

三、使用apply()統計缺失率
count_missing = data.apply(lambda x:'{}%'.format(round(100*sum(x.isnull())/len(x),2)))
print(count_missing)

在這裏插入圖片描述
通過這樣的方法,可以統計出每一個屬性的缺失率。
優點:百分比顯示缺失率更加直觀,對於缺失率高的屬性,可以考慮刪除。

缺失值處理

一、單行數據刪除
data.dropna(inplace=True)

該方法將存在缺失值的數據全部刪除,這裏省略axis=0,因爲axis默認爲0.

二、整列屬性刪除
data.dropna(inplace=True,axis=1)

該方法將存在缺失值的屬性刪除。

三、均值、衆數、0填充缺失值
#單列填充
data['下次計劃還款利息'].fillna(value=data['下次計劃還款利息'].mean(),inplace=True)
#多列同時填充
data1 = data[['下次計劃還款本金','下次計劃還款利息']].apply(lambda x:x.fillna(value=x.mean()))

上述方法是均值填充,衆數填充只需要將mean()換成mode()[0]
0填充將x.mean()換成0即可。

異常值檢測

一、均值標準差異常值檢測

此方法公式是:均值±2x標準差
數值不在區間【均值-2x標準差的,均值+2x標準差的】判定爲異常值。

datamean = data['下次計劃還款利息'].mean()#均值
datastd = data['下次計劃還款利息'].std()#標準差
topdata = datamean+2*datastd#上限
bottomdata = datamean-2*datastd#下限
countdata = data['下次計劃還款利息'].between(left=bottomdata,right=topdata)
#統計異常值和非異常值數量
print(countdata.value_counts())

在這裏插入圖片描述

二、上下四中位和中位差異常值檢測

此方法公式:上(下)四中位±1.5x中位差
正常值區間位:【下四中位-1.5x中位差,上四中位+1.5x中位差】

mediandata = data['下次計劃還款利息'].quantile(0.75)-data['下次計劃還款利息'].quantile(0.25)
topdata = data['下次計劃還款利息'].quantile(0.75)+1.5*mediandata
bottomdata = data['下次計劃還款利息'].quantile(0.25)-1.5*mediandata
countdata = data['下次計劃還款利息'].between(left=bottomdata,right=topdata)
#統計異常值和非異常值數量
print(countdata.value_counts())

在這裏插入圖片描述
這兩種方法取決於你的數據,大家可以在實踐中嘗試選擇合適的方法進行異常值檢測。

異常值處理

一、異常值刪除

異常值刪除操作需要兩步,第一步是判斷,第二步刪除

mediandata = data['下次計劃還款利息'].quantile(0.75)-data['下次計劃還款利息'].quantile(0.25)
topdata = data['下次計劃還款利息'].quantile(0.75)+1.5*mediandata
bottomdata = data['下次計劃還款利息'].quantile(0.25)-1.5*mediandata
countdata = data['下次計劃還款利息'].between(left=bottomdata,right=topdata)
#取出異常值索引
index_list = data[countdata==False].index.tolist()
data['下次計劃還款利息'].drop(labels=index_list,inplace=True)

當發現某一列異常值特別多的時候,我們會選擇刪除改屬性。

data.drop(columns=['下次計劃還款利息'],axis=1,inplace=True)
二、異常值重寫

檢測完異常值之後,除了刪除數據之外,我們做的最多的就是重寫異常值。

使用數據的最大值重寫:

mediandata = data['下次計劃還款利息'].quantile(0.75)-data['下次計劃還款利息'].quantile(0.25)
topdata = data['下次計劃還款利息'].quantile(0.75)+1.5*mediandata
bottomdata = data['下次計劃還款利息'].quantile(0.25)-1.5*mediandata
countdata = data['下次計劃還款利息'].between(left=bottomdata,right=topdata)
index_list = data[countdata==False].index.tolist()
data.loc[index_list ,'下次計劃還款利息'] = data[countdata]['下次計劃還款利息'].max()#最大值填充
data.loc[index_list ,'下次計劃還款利息'] = data[countdata]['下次計劃還款利息'].min()#最小值填充
data.loc[index_list ,'下次計劃還款利息'] = -1#特殊值填充

之後隨着項目的實戰,會不斷更新,如果有幫到你,點個贊再走嘛!👍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章