做者:Mochoupython
來源:恆生LIGHT雲社區數據庫
在當前大數據的背景下,數據處理佔了極大的份額,就像一個西紅柿作成西紅柿炒雞蛋,須要通過調料整合,菜料清洗,飯菜加工等等才能發佈到生產,不,發送到餐桌。app
這裏簡單分享一下我對數據清洗的理解,其具備很重要的地位,否則面對着髒亂差的西紅柿炒雞蛋,沒人願意下口。函數
一份未經清洗過的數據通常會存在這些不符合分析要求的問題:好比重複,錯誤,空值,異常數據等,對於錯誤數據,由於是業務源頭問題,好比性別明明是男卻成了女,這些咱們沒法處理,只能從源端進行規範,就像顧客想吃河南的西紅柿,廚房裏進的只有山東的,這個廚師沒辦法解決,只能通知進貨商更改。故咱們只對另外三個問題進行清洗修改,必須申明一點,全部的清洗都要基於實際業務來作,好比重複,可能業務要的就是重複,你給人家洗掉了,就產生了問題大數據
一 . 重複
若是實際業務不要重複值,重複值能夠直接刪除,好比數據庫裏能夠在整合合併時用union而不是union all ,不支持union的能夠用主鍵分組排序取第一個url
row_number() over (partition by .. order by..desc) as..
若是也不支持row_number,,,那好好活着吧。.net
其餘語言也都有相似的去重函數,如python能夠直接用drop_duplicates()code
二 . 缺失
缺失也就是空值,須要明確一點,‘空’有兩種狀況,一種是真正的對象爲空,即null,一種是空值,即xxx='',因此咱們處理這些空值時須要分兩種狀況,一種是xxx is null, 一種是length(trim(xxx))=0。對象
空值處理通常是填補,這個根據實際業務須要來作,通常來說,blog
- 空值數量比較小時能夠填補上連續值的某一個,好比平均數,中位數等;
- 空值較多時,佔了五成以上,能夠考慮使用衆數來填補;
- 空值佔了絕大部分,這個時候就不必再用原有的數據,能夠本身造數據,生成一個指示啞變量,參與後續的建模須要。
前面已經說過在數據庫裏怎麼處理,這裏說下在python裏如何處理
# 列出空值在每一個列所佔的比重 # df是數據集,col.size是當前數據的行數 df.apply(lambda col:sum(col.isnull())/col.size) # 用均值填補,使用pandas包裏的fillna df.col1.fillna(df.col1.mean())
三 . 噪聲值
噪聲值是指數據中與其餘數值相比差別比較大的值,也有的叫離羣點等,好比年齡裏出來幾個150以上的。噪聲值會嚴重干擾模型結果,使結論不真實或偏頗。因此必需要清除這些噪聲值,經常使用的方法:對於單變量的有蓋帽法,分箱法,多變量的有聚類法。
- 蓋帽法
咱們都學過正態分佈,對於均值上下三倍標準差範圍外的記錄值加一塊的機率才爲0.01%,故咱們能夠把這些外圍數據替換爲各自的均值上下三倍標準差值,即爲蓋帽法
數據庫裏能夠用case when來替換,python能夠寫一個函數
def cap(x,quantile=[0.01,0.99]): '''蓋帽法處理異常值 Args: x:是series列,連續變量 quantile:上下分位數範圍,這裏寫爲0.01和0.99 ''' # 生成分位數,Q01,Q99分別是百分之一分位點和百分之99分位點 Q01,Q99=x.quantile(quantile).values.tolist() # 替換異常值爲制定的分位數 if Q01 > x.min(): x = x.copy() x.loc[x < Q01] = Q01 if Q99 < x.max(): x = x.copy() x.loc[x > Q99] = Q99 return(x)
- 分箱法
分箱法經過考察數據的「近鄰」來光滑有序數據的值,有序值分佈到一些箱中,經過取各個箱子的特定值如最值,均值,中位數等,這個值就是這個箱子的值,而後置定標準評判這些箱子的值好壞,從而判斷各個箱子是好的仍是壞的,壞的箱子須要特殊處理。分箱法分爲等深分箱:每一個分箱樣本量一致,等寬分箱:每一個分箱取值範圍一致。
好比一組數 1 2 66 8 9 2 1 4 6,先排序 1 1 2 2 4 6 8 9 66,再分爲三個箱子 箱子A:1 1 2 箱子B:2 4 6 箱子C:8 9 66
咱們這裏取箱子的平均數,則A爲1.3 B爲4 C爲27.3 很明顯這個C值遠遠大於這組數據的均值和中位數,因此C箱子是壞箱子,則能夠集中處理C裏的數據
- 聚類法
前面介紹的都是單變量,多變量的異常值處理須要用到聚類法。
它的思想是正常值都擁有類似的標籤,好比前面好的西紅柿顏色都是紅潤的,口感都是酸甜的,表皮都是完整的等等,而壞的西紅柿則擁有異於「他人」的特徵,好比味道怪異。故咱們能夠把數據對象分爲多個集合,在同一個集合裏的對象有較高的類似度,而不一樣的集合之間的對象差異較大。聚類分析能夠經過這些不一樣的集合挖掘出孤立點,這些孤立點每每就是異常數據。