數據預處理+數據清理

1、概述

實際的數據庫極易受噪聲、缺失值和不一致數據的侵擾,因爲數據庫太大,並且多半來自多個異種數據源。低質量的數據將會導致低質量的挖掘結果。有大量的數據預處理技術:
- - 數據清理:可以用來清楚數據中的噪聲,糾正不一致。
- - 數據集成:將數據由多個數據源合併成一個一致的數據存儲,如數據倉庫。
- - 數據歸約:可以通過如聚集、刪除冗餘特徵或聚類來降低數據的規模。
- - 數據變換:(例如,規範化)可以用來把數據壓縮到較小的區間,如0.0到1.0。

這可以提高設計距離度量的挖掘算法的準確率和效率。這些技術不是排斥的,可以一起使用。

1.1、數據質量 數據如果能滿足其應用的要求,那麼它是高質量的。數據質量涉及許多因素,包括:準確率、完整性、一致性、時效性、可信性和可解釋性。

2、數據清理

現實世界的數據一般是不完整的、有噪聲的和不一致的。數據清理例程試圖填充缺失的值、光滑噪聲並識別離羣點、糾正數據中的不一致。

2.1、缺失值

如何處理缺失的屬性?我們來看看下面的方法:
1- - - 忽略元組:當缺少類標號時通常這樣做(假設挖掘任務設計分類)。除非元組有多個屬性缺少值,否則更改方法不是很有效。當每個屬性缺失值的百分比變化很大時,他的性能特別差。採用忽略元組,你不能使用該元組的剩餘屬性值。這些數據可能對手頭的任務是有用的。
2- - - 人工填寫缺失值:一般來說,該方法很費事,並且當數據集很大、缺失很多值時該方法可能行不通。
3- - - 使用一個全局填充缺失值:將缺失的屬性值用同一個常量(如:“Unknow”或-∞)替換。如果確實的值都如“Unknow”替換,則挖掘程序可能誤認爲他們形成了一個有趣的概念,因爲他們都具有相同的值 – “Unknow”。因此,儘管該方法簡單,但是並不十分可靠。
4- - - 使用屬性的中心度量(如均值或中位數)填充缺失值:對於正常的(對稱的)數據分佈而言,可以使用均值,而傾斜數據分佈應該使用中位數。
5- - - 使用與給定元組屬同一類的所有樣本的屬性均值或中位數:
6- - - 使用最可靠的值填充缺失值:可以用迴歸、貝葉斯形式化方法的基於推理的工具或決策樹歸納確定。

方法3~方法6使數據有偏,可能填入的數據不準確。然而,方法6是最流行的策略。與其他方法(可能方法2除外)相比,它使用已有數據的大部分信息來預測缺失值。

需要注意的是,在某些情況下,缺失值並不意味着數據有錯誤。理想情況下,每個屬性都應當有一個或多個空值條件的規則。這些規則可以說明是否允許空值,並且/或者說明這樣的空值應該如何處理或轉換。如果在業務處理的稍後步驟提供值,字段也可能故意留下空白。因此,儘管在得到數據後,我們可以盡我們所能來清理數據,但好的數據庫和數據輸入設計將有助於在第一現場把缺失值或者錯誤的數量降至最低。

2.2、噪聲數據
噪聲(noise)是被測量的變量的隨機誤差或方差。我們可以使用基本的數據統計描述技術(例如,盒圖或者散點圖)和數據可視化方法來識別可能代表噪聲的離羣點。

1- - - 分箱(bining):分箱方法通過考察數據的“近鄰”(即周圍的值)來光滑有序的數據值。這些有序的值被分佈到一些“捅”或箱中。由於分箱方法考察近鄰的值,因此它進行局部的光滑。
這裏寫圖片描述

如上圖所示,數據首先排序並被劃分到大小爲3的等頻的箱中。對於用箱均值光滑,箱中每一個值都被替換爲箱中的均值。類似的,可以使用用箱中位數光滑或者用箱邊界光滑等等。

2- - - 迴歸(regression):可以用一個函數擬合數據來光滑數據。這種技術稱之爲迴歸。線性迴歸涉及找出擬合兩個屬性(或變量)的“最佳”直線,使得一個屬性可以用來預測另一個。多元線性迴歸是線性迴歸的擴充,其中涉及的屬性多餘兩個,並且數據擬合到一個多維曲面。

3- - - 離羣點分析(outlier analysis):可以通過如聚類來檢測離羣點。聚類將類似的值組織成羣或“簇”。直觀地,落在簇集合之外的值被視爲離羣點。
這裏寫圖片描述

2.3、數據清理作爲一個過程

數據清理過程第一步是偏差檢測(discrepancy detection)。導致偏差的因素可能有多種,包括具有很多可選字段的設計糟糕的輸入表單、人爲的輸入錯誤、有意的錯誤(例如,不願意泄露個人隱私),以及數據退化(例如,過時的地址)。偏差也可能源於不一致的數據表示和編碼的不一致使用。記錄數據的設備的錯誤和系統錯誤是另一種偏差源。當數據(不適當地)用於不同於當初的目的時,也可能出現錯誤。數據集成也可能導致不一致(例如,當給定的屬性在不同的數據庫中具有不同的名稱時)。

那麼,如何進行偏差檢測呢?首先,我們明確一個概念,”關於數據的數據“稱作元數據。例如,每個屬性的數據類型是定義域是什麼?每個屬性可接受的值是什麼?對於把握數據趨勢和識別異常,數據的基本統計描述是有用的。例如,找出均值、中位數和衆數。數據是對稱的還是傾斜的?值域是什麼?所有的值都在期望的區間內嗎?每個屬性的標準差是多少?遠離給定屬性均值超過兩個標準差的值可能標記爲可能的離羣點。屬性之間存在已知的依賴嗎?在這一步,可以編寫程序或使用稍後我們討論到的工具。由此,你可能發現噪聲、離羣點和需要考察的不尋常的值。

1- - - 編碼格式:警惕編碼使用的不一致和數據表示的不一致問題(例如,日期“2015/12/08”和”08/12/2015”);
2- - - 字段過載:開發者將新屬性的定義擠進已經定義的屬性的未使用(位)部分(例如,使用一個屬性未使用的位,該屬性取值已經使用了32位中的31位)。

1- - - :唯一性規則:給定屬性的每個值都必須不同於該屬性的其他值。
2- - - :連續性規則:屬性的最低值和最高值之間沒有缺失的值,並且所有的值還必須是唯一的(例如,檢驗數).
3- - - :空值規則:說明空白、問號、特殊符號或指示空值條件的其他串的使用(例如,一個給定屬性的值何處不能用),以及如何處理這樣的值。

1- - - 數據清洗工具(data scrubbing tools):使用簡單的領域知識(郵政地址知識和拼寫檢查),檢查並糾正數據中的錯誤。在清理多個數據源的數據時,這些工具依賴分析和模糊匹配技術。
2- - - 數據審計工具(data auditing tools):通過分析數據發現規則和聯繫,並檢測違反這些條件的數據來發現偏差。
3- - - 數據遷移工具(data migration tools):允許說明簡單的變換,如將串”gender”用“sex”替換。
4- - -ETL(extraction/transformation/loading,提取/變換/裝入)工具:允許用戶通過圖形用戶界面說明變換。
通常,這些工具只支持有限的變換,因此我們可能需要爲數據清理過程的這一步編寫定製的程序。

偏差檢測和數據變換(糾正偏差) 迭代執行這兩步過程。通常,需要多次迭代才能使用戶滿意。

新的數據清理方法強調加強交互性。例如,Potter’s Wheel是一種公開的數據清理工具,它集成了偏差檢測和數據變換。

 

 

 

預處理階段

預處理階段主要做兩件事情:

一是將數據導入處理工具。通常來說,建議使用數據庫,單機跑數搭建MySQL環境即可。如果數據量大(千萬級以上),可以使用文本文件存儲+Python操作的方式。

二是看數據。這裏包含兩個部分:一是看元數據,包括字段解釋、數據來源、代碼表等等一切描述數據的信息;二是抽取一部分數據,使用人工查看方式,對數據本身有一個直觀的瞭解,並且初步發現一些問題,爲之後的處理做準備。

第一步:缺失值清洗

缺失值是最常見的數據問題,處理缺失值也有很多方法,我建議按照以下四個步驟進行:

1、確定缺失值範圍:對每個字段都計算其缺失值比例,然後按照缺失比例和字段重要性,分別制定策略,可用下圖表示:

2、去除不需要的字段:這一步很簡單,直接刪掉即可……但強烈建議清洗每做一步都備份一下,或者在小規模數據上試驗成功再處理全量數據,不然刪錯了會追悔莫及(多說一句,寫SQL的時候delete一定要配where!)。

3、填充缺失內容:某些缺失值可以進行填充,方法有以下三種:

  • 以業務知識或經驗推測填充缺失值
  • 以同一指標的計算結果(均值、中位數、衆數等)填充缺失值
  • 以不同指標的計算結果填充缺失值

 

前兩種方法比較好理解。關於第三種方法,舉個最簡單的例子:年齡字段缺失,但是有屏蔽後六位的身份證號,so……

4、重新取數:如果某些指標非常重要又缺失率高,那就需要和取數人員或業務人員瞭解,是否有其他渠道可以取到相關數據。

 

以上,簡單的梳理了缺失值清洗的步驟,但其中有一些內容遠比我說的複雜,比如填充缺失值。很多講統計方法或統計工具的書籍會提到相關方法,有興趣的各位可以自行深入瞭解。

第二步:格式內容清洗

如果數據是由系統日誌而來,那麼通常在格式和內容方面,會與元數據的描述一致。而如果數據是由人工收集或用戶填寫而來,則有很大可能性在格式和內容上存在一些問題,簡單來說,格式內容問題有以下幾類:

1、時間、日期、數值、全半角等顯示格式不一致

這種問題通常與輸入端有關,在整合多來源數據時也有可能遇到,將其處理成一致的某種格式即可。

2、內容中有不該存在的字符

某些內容可能只包括一部分字符,比如身份證號是數字+字母,中國人姓名是漢字(趙C這種情況還是少數)。最典型的就是頭、尾、中間的空格,也可能出現姓名中存在數字符號、身份證號中出現漢字等問題。這種情況下,需要以半自動校驗半人工方式來找出可能存在的問題,並去除不需要的字符。

3、內容與該字段應有內容不符

姓名寫了性別,身份證號寫了手機號等等,均屬這種問題。 但該問題特殊性在於:並不能簡單的以刪除來處理,因爲成因有可能是人工填寫錯誤,也有可能是前端沒有校驗,還有可能是導入數據時部分或全部存在列沒有對齊的問題,因此要詳細識別問題類型。

格式內容問題是比較細節的問題,但很多分析失誤都是栽在這個坑上,比如跨表關聯或VLOOKUP失敗(多個空格導致工具認爲“陳丹奕”和“陳 丹奕”不是一個人)、統計值不全(數字裏摻個字母當然求和時結果有問題)、模型輸出失敗或效果不好(數據對錯列了,把日期和年齡混了,so……)。因此,請各位務必注意這部分清洗工作,尤其是在處理的數據是人工收集而來,或者你確定產品前端校驗設計不太好的時候……

第三步:邏輯錯誤清洗

這部分的工作是去掉一些使用簡單邏輯推理就可以直接發現問題的數據,防止分析結果走偏。主要包含以下幾個步驟:

1、去重

有的分析師喜歡把去重放在第一步,但我強烈建議把去重放在格式內容清洗之後,原因已經說過了(多個空格導致工具認爲“陳丹奕”和“陳 丹奕”不是一個人,去重失敗)。而且,並不是所有的重複都能這麼簡單的去掉……

我曾經做過電話銷售相關的數據分析,發現銷售們爲了搶單簡直無所不用其極……舉例,一家公司叫做“ABC管家有限公司“,在銷售A手裏,然後銷售B爲了搶這個客戶,在系統裏錄入一個”ABC官家有限公司“。你看,不仔細看你都看不出兩者的區別,而且就算看出來了,你能保證沒有”ABC官家有限公司“這種東西的存在麼……這種時候,要麼去抱RD大腿要求人家給你寫模糊匹配算法,要麼肉眼看吧。

上邊這個還不是最狠的,請看下圖:

你用的系統裏很有可能兩條路都叫八里莊路,敢直接去重不?(附送去重小tips:兩個八里莊路的門牌號範圍不一樣)

當然,如果數據不是人工錄入的,那麼簡單去重即可。

2、去除不合理值

一句話就能說清楚:有人填表時候瞎填,年齡200歲,年收入100000萬(估計是沒看見”萬“字),這種的就要麼刪掉,要麼按缺失值處理。這種值如何發現?提示:可用但不限於箱形圖(Box-plot).

3、修正矛盾內容

有些字段是可以互相驗證的,舉例:身份證號是1101031980XXXXXXXX,然後年齡填18歲,我們雖然理解人家永遠18歲的想法,但得知真實年齡可以給用戶提供更好的服務啊(又瞎扯……)。在這種時候,需要根據字段的數據來源,來判定哪個字段提供的信息更爲可靠,去除或重構不可靠的字段。

邏輯錯誤除了以上列舉的情況,還有很多未列舉的情況,在實際操作中要酌情處理。另外,這一步驟在之後的數據分析建模過程中有可能重複,因爲即使問題很簡單,也並非所有問題都能夠一次找出,我們能做的是使用工具和方法,儘量減少問題出現的可能性,使分析過程更爲高效。

 

第四步:非需求數據清洗

這一步說起來非常簡單:把不要的字段刪了。

但實際操作起來,有很多問題,例如:

  • 把看上去不需要但實際上對業務很重要的字段刪了;
  • 某個字段覺得有用,但又沒想好怎麼用,不知道是否該刪;
  • 一時看走眼,刪錯字段了。

 

前兩種情況我給的建議是:如果數據量沒有大到不刪字段就沒辦法處理的程度,那麼能不刪的字段儘量不刪。第三種情況,請勤備份數據……

第五步:關聯性驗證

如果你的數據有多個來源,那麼有必要進行關聯性驗證。例如,你有汽車的線下購買信息,也有電話客服問卷信息,兩者通過姓名和手機號關聯,那麼要看一下,同一個人線下登記的車輛信息和線上問卷問出來的車輛信息是不是同一輛,如果不是(別笑,業務流程設計不好是有可能出現這種問題的!),那麼需要調整或去除數據。

嚴格意義上來說,這已經脫離數據清洗的範疇了,而且關聯數據變動在數據庫模型中就應該涉及。但我還是希望提醒大家,多個來源的數據整合是非常複雜的工作,一定要注意數據之間的關聯性,儘量在分析過程中不要出現數據之間互相矛盾,而你卻毫無察覺的情況。

以上,就是我對數據清洗過程的一個簡單梳理。由於能力所限,難免掛一漏萬,請各位不吝賜教,感謝。

 

二、數據分析之前的各項準備工作

數據分析團隊各成員確定之後,將進行下一項工作,就是找到有價值的數據進行分析了。數據是分析的基礎,因此數據的質量、數據的相關度、數據的維度等會影響數據分析的結果影,其中GIGO(垃圾進垃圾出)對於數據分析結果影響最大。

1數據源選擇

數據分析團隊面對大量的數據源,各個數據源之間交叉聯繫,各個數據域之間具有邏輯關係,各個產品統計口徑不同,不同的時間段數值不同等。這一系列問題多會影響數據分析結果,因此確定數據源選擇和數據整理至關重要。

DBA可以基於數據分析需要,找到相關數據,建立一張數據寬表,將數據倉庫的數據引入到這張寬表當中,基於一定的邏輯關係進行彙總計算。這張寬表作爲數據分析的基礎,然後再依據數據分析需要衍生出一些不同的表單,爲數據分析提供乾淨全面的數據源。寬表一方面是用於集中相關分析數據,一方面是提高效率,不需要每次分析時都查詢其他的數據表,影響數據倉庫效率。

2數據抽樣選擇

簡單的數據分析可以調用全體數據進行分析,數據抽樣主要用於建模分析,抽樣需考慮樣本具有代表性,覆蓋各種客戶類型,抽樣的時間也很重要,越近的時間窗口越有利於分析和預測。在進行分層抽樣時,需要保證分成出來的樣本比例同原始數據基本一致。

3數據類型選擇

數據類型分爲連續型和離散型,建模分析時需要確定數據類型。進行業務收入趨勢分析、銷售額預測分析、RFM分析時,一般採用連續型變量。信用評級、分類預測時一般採用離散變量。

4缺失值處理

數據分析過程中會面對很多缺失值,其產生原因不同,有的是由於隱私的原因,故意隱去。有的是變量本身就沒有數值,有的是數據合併時不當操作產生的數據缺失。

缺失值處理可以採用替代法(估值法),利用已知經驗值代替缺失值,維持缺失值不變和刪除缺失值等方法。具體方法將參考變量和自變量的關係以及樣本量的多少來決定。

5異常值檢測和處理

異常值對於某些數據分析結果影響很大,例如聚類分析、線性迴歸(邏輯迴歸)。但是對決策樹、神經網絡、SVM支持向量機影響較小。

一般異常值是指明顯偏離觀測值的平均值,例如年齡爲200歲,平均收入爲10萬元時,有個異常值爲300萬元。第一個異常值爲無效異常值,需要刪掉,但是第二個異常值可能屬於有效異常值,可以根據經驗來決定是否保留或刪掉。

6數據標準化

數據標準化的目的是將不同性質、不同量級的數據進行指數化處理,調整到可以類比的範圍。例如在建立邏輯迴歸模型時,性別的取值是0或以,但是收入取值可能就是0-100萬,跨度較大,需要進行標準化。

一般可以採用最佳/最大標準化(Min-Max標準化法)將數值定在0和1之間,便於計算。Z分數法和小數定標標準化法也可以採用。

7數據粗分類(Categorization)處理

歸類和分類的目的是減少樣本的變量,常有的方法由等間距分類,等頻數分類。可以依據經驗將自變量分成幾類,分類的方法可以不同,建議採用卡方檢驗來決定採用哪種分類方法。連續型變量可以用WOE變化方法來簡化模型,但降低了模型的可解釋性。

8變量選擇

數據分析過程中會面對成百上千的變量,一般情況下只有少數變量同目標變量有關,有助於提高預測精度。通常建模分析時,有意義的變量不會超過10-15個,稱他們爲強相關變量(聰明變量)。可以利用變量過濾器的方法來選擇變量。常見的變量過濾器應用場景如下。

 



三、數據分析過程

1向業務部門進行調研,瞭解業務需要解決的問題,將業務問題映射成數據分析工作和任務

2調研企業內外部數據,找到分析需要的數據,將數據匯聚到一個特定的區域,數據集市或數據倉庫,探索性分析

3數據清洗,包括檢查數據的一致性,處理異常值和缺失值,刪除重複數據等

4數據轉換,例如數據分箱(Binning),將字符型變量轉化爲數字型變量,按照數據所需維度進行彙總

5建立模型,按照業務需求建立不同模型(例如客戶流失預警、欺詐檢測、購物籃分析、營銷響應等)

6模型結果解釋和評估,業務專家進行業務解釋和結果評價

四、大數據分析場景和模型應用

數據分析建模需要先明確業務需求,然後選擇是描述型分析還是預測型分析。如果分析的目的是描述客戶行爲模式,就採用描述型數據分析,描述型分析就考慮關聯規則、序列規則、聚類等模型。

預測型數據分析就是量化未來一段時間內,某個事件的發生概率。有兩大預測分析模型,分類預測和迴歸預測。常見的分類預測模型中,目標變量通常都是二元分類變量例如欺詐與否,流失與否,信用好壞等。迴歸預測模型中,目標變量通常都是連續型變量,常見的有股票價格預測、違約損失率預測(LGD)等。

生存分析聚焦於將事件的結果和出現這一結果所經歷的時間進行分析,源於醫療領域,研究患者治療後的存活時間。生存分析可也可以用於預測客戶流失時間,客戶下次購買時間,客戶違約時間,客戶提前償還貸款時間,客戶下次訪問網站時間等。

常見的數據分析應用場景如下

1市場營銷

營銷響應分析建模(邏輯迴歸,決策樹)

淨提升度分析建模(關聯規則)

客戶保有分析建模(卡普蘭梅爾分析,神經網絡)

購物藍分析(關聯分析Apriori)

自動推薦系統(協同過濾推薦,基於內容推薦,基於人口統計推薦,基於知識推薦,組合推薦,關聯規則)

客戶細分(聚類)

流失預測(邏輯迴歸)

2風險管理

客戶信用風險評分(SVM,決策樹,神經網絡)

市場風險評分建模(邏輯迴歸和決策樹)

運營風險評分建模(SVM)

欺詐檢測(決策樹,聚類,社交網絡)

五、數據模型評價的方法

1AUC值判別法

 



AUC小於0.7識別能力很弱

AUC在0.7-0.8之間識別能力可接受

AUC在0.8-0.9之間識別能力卓越

AUC大於0.9模型出現意外

2KS判別法

KS值大於0.2就表示具有較好的可預測性

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