
我花了幾個月的時間分析來自傳感器、調查及日志等相關資料。無論我用多少圖表,設計多麼複雜的算法,結果總是會與預期不同。更糟糕的是,當你向首席執行官展示你的新發現時,他/她總會發現缺陷,你的發現與他們的了解完全不符- 畢竟,他們是比你更了解領域的專家,而你隻是資料工程師或開發人員。
你為你的模型引入了大量髒資料,沒有清理資料,你告訴你的公司用這些結果做事情,結果肯定是錯的。資料不正确或不一緻會導緻錯誤的結論,是以,清理和了解資料對結果的品質都會有很大影響。
垃圾進垃圾出
實際上,簡單算法的作用可能超過複雜的算法,因為它被賦予了足夠高品質的資料。
品質資料優于花哨的算法
出于這些原因,重要的是要有一個分步指南,一個備忘單。首先,我們想要實作的目标是什麼?品質資料是什麼意思?品質資料的衡量标準是什麼?了解你想要完成的任務,在采取任何行動之前,你的最終目标至關重要。
目錄:
·
資料品質(合法性,準确性,完整性,一緻性)
工作流程(檢查,清潔,驗證,報告)
檢查(資料分析,可視化,軟體包)
清理(無關資料,重複資料,類型轉換,文法錯誤)
驗證
總結
資料品質
除了
維基百科上的品質标準之外,我找不到更好的解釋品質标準。是以,我将在這裡總結一下。
合法性
資料符合定義的業務規則或限制的程度。
資料類型限制:特定列中的值必須是特定的資料類型,例如,布爾值,數字,日期等。
範圍限制:通常,數字或日期應在特定範圍内。
強制限制:某些列不能為空。
唯一限制:字段或字段組合在資料集中必須是唯一的。
Set-Membership 限制:列的值來自一組離散值,例如枚舉值。例如,一個人的性别可能是男性或女性。
外鍵限制:在關系資料庫中,外鍵列不能具有引用的主鍵中不存在的值。
正規表達式模式:必須采用特定模式的文本字段。例如,電話号碼可能需要具有模式(999)999-9999。
跨領域驗證:跨越多個領域的某些條件必須成立。例如,患者出院的日期不能早于入院日期。
準确性
資料接近真實值的程度。
雖然定義所有的值允許出現無效值,但這并不意味着它們都是準确的。
一個有效的街道位址可能實際上并不存在,一個人的眼睛顔色,比如藍色,可能是有效的,但不是真的。另一件需要注意的是精度和精度之間的差異。
完整性
所有必需資料的已知程度。由于各種原因,資料可能會丢失。如果可能的話,可以通過質疑原始來源來緩解這個問題,比如重新獲得這個主題的資料。
一緻性
資料在同一資料集内或跨多個資料集的一緻程度。當資料集中的兩個值互相沖突時,就會出現不一緻。
離婚後,有效年齡,例如10歲,可能與婚姻狀況不符。客戶被記錄在具有兩個不同位址的兩個不同表中。哪一個是真的?
工作流程
工作流程一共四個步驟,旨在生成高品質的資料,并考慮到我們所讨論的所有标準。
1.
檢查:檢測不正确和不一緻的資料。
2.
清潔:修複或删除發現的異常。
3.
驗證:清潔後,檢查結果以驗證是否正确。
4.
報告:記錄所做更改和目前存儲資料品質的報告。
實際上,你所看到的順序過程是一個疊代的,無窮無盡的過程。當檢測到新的缺陷時,可以從驗證到檢查。
檢查
檢查資料非常耗時,并且需要使用許多方法來探索用于錯誤檢測的基礎資料。下面是其中的一些:
資料分析
一個彙總統計有關資料的資料分析是真正有用的,它可以提供有關資料品質的總體思路。例如,檢查特定列是否符合特定标準或模式。資料列是記錄為字元串還是數字?丢失了多少個值?列中有多少個唯一值及其分布?此資料集是否與另一個資料集連結或有關系?
可視化
通過使用諸如平均值、标準偏差、範圍或分位數等統計方法分析和可視化資料,可以找到意外且是以錯誤的值。
例如,通過可視化各國的平均收入,可能會看到有一些
異常值。這些異常值值得研究,不一定是不正确的資料。
軟體包
使用你的語言提供的幾個軟體包或庫将允許你指定限制并檢查資料是否違反這些限制。此外,他們不僅可以生成違反哪些規則的報告,還可以建立哪些列與哪些規則相關聯的圖表。
清潔
資料清理涉及基于問題和資料類型的不同技術。可以應用不同的方法,每種方法都有自己的權衡。總的來說,不正确的資料被删除,糾正或估算。
不相關的資料
不相關的資料是那些實際上不需要的資料,并且不适合我們試圖解決的問題。例如,如果我們分析有關人口總體健康狀況的資料,則不需要電話号碼。同樣,如果你隻對某個特定國家/地區感興趣,則不希望包含所有其他國家/地區。隻有當你确定某個資料不重要時,你才可以放棄它。否則,你就需要探索特征變量之間的相關矩陣。
即使你注意到沒有相關性,你應該問一個域專家。你永遠不會知道,一個似乎無關緊要的特征,從實際經驗來看,可能非常重要。
重複項
重複項是資料集中重複的資料點。
例如:
資料來自不同來源;
使用者可能會兩次點選送出按鈕,認為表單實際上沒有送出;
送出了兩次線上預訂請求,糾正了第一次意外輸入的錯誤資訊。
類型轉換
確定将數字存儲為數字資料類型,日期應存儲為日期對象,或Unix時間戳(秒數),依此類推。如果需要,可以将分類值轉換為數字和從數字轉換。
需要注意的是,無法轉換為指定類型的值應轉換為NA值(或任何值),并顯示警告。這表示值不正确,必須修複。
文法錯誤
删除空格:應删除字元串開頭或結尾的額外空格。
" hello world " => "hello world
填充字元串:字元串可以用空格或其他字元填充到一定寬度。例如,某些數字代碼通常用字首零表示,以確定它們始終具有相同的位數。
313 => 000313 (6 digits)
拼寫錯誤:字元串可以通過多種不同方式輸入,毫無疑問,可能會出錯。
Genderm
Male
fem.
FemalE
Femle
這個分類變量被認為有5個不同的類,而不是預期的2個:男性和女性。是以,我們的職責是從上述資料中識别出每個值是男性還是女性。我們可以怎麼做呢?
第一種解決方案是手動将每個值映射到“男性”或“女性”。
dataframe['gender'].map({'m': 'male',
fem.': 'female', ...})
第二種解決方案是使用模式比對。例如,我們可以在字元串的開頭查找性别中m或M的出現。
re.sub(r"\
^m\$", '
', '
male',
flags=re.
IGNORECASE)
第三種解決方案是使用模糊比對:一種算法,用于識别預期字元串與給定字元串之間的距離。它的基本實作計算将一個字元串轉換為另一個字元串所需的操作數。
Gender male femalem 3 5
Male 1 3
fem. 5 3
FemalE 3 2
Femle 3 1
此外,如果你有一個像城市名稱這樣的變量,你懷疑拼寫錯誤或類似字元串應該被視為相同。例如,“lisbon”可以輸入為“lisboa”,“lisbona”,“Lisbon”等。
City Distance from "lisbon"lisbon 0
lisboa 1
Lisbon 1
lisbona 2
注意“0”,“NA”,“無”,“空”或“INF”等值,它們可能意味着同樣的事情:缺少價值。
規範
我們的職責是不僅要識别拼寫錯誤,還要将每個值放在同一标準格式中。對于字元串,請確定所有值都是小寫或大寫。
對于數值,請確定所有值都具有特定的測量機關。例如,高度可以是米和厘米。1米的差異被認為與1厘米的差異相同。是以,這裡的任務是将高度轉換為單個機關。
對于日期,美國版本與歐洲版本不同。将日期記錄為時間戳(毫秒數)與将日期記錄為日期對象不同。
縮放/轉換
縮放意味着轉換資料以使其适合特定的比例,例如0-100或0-1。
例如,可以将學生的考試分數重新縮放為百分比(0-100)而不是GPA(0-5)。
它還可以幫助
使某些類型的資料繪圖更容易。例如,我們可能希望減少偏斜以幫助繪圖(當有這麼多異常值時)。最常用的函數是log,square root和inverse。縮放也可以在具有不同測量機關的資料上進行。
規範化
雖然規範化也将值重新調整為0-1的範圍,但目的是轉換資料以使其正常分布。為什麼?
因為在大多數情況下,如果我們要使用依賴于正态分布資料的統計方法,我們會對資料進行标準化。怎樣完成?
可以使用日志功能,也可以
使用其中一種方法。
根據使用的縮放方法,資料分布的形狀可能會發生變化。例如“
标準Z分數”和“
學生t統計量”保留了形狀,而日志功能則沒有。
規範化與縮放(使用
特征縮放)
缺失值
鑒于缺失值是不可避免的,讓我們在遇到它們時該怎麼做。有三種或許更多的方法來處理它們。
一、Drop
如果列中的缺失值很少發生并且随機發生,那麼最簡單和最正确的解決方案是删除具有缺失值的觀察值(行)。如果缺少大多數列的值,并且随機發生,則典型的決定是删除整列。
這在進行統計分析時特别有用。
二、Impute
這意味着根據其他觀察結果計算缺失值。有很多方法可以做到這一點:
1、使用統計值,如均值,中位數。但是,這些都不能保證獲得無偏的資料,特别是在有許多缺失值的情況下。
當原始資料不
偏斜時,平均值最有用,而中
值更穩健,對異常值不敏感。在正态分布的資料中,可以獲得與均值相差2個标準偏差的所有值。接下來,通過生成之間的随機數填寫缺失值
(mean
—
2 * std) & (mean
+ 2 * std)
:
rand = np.random.randint(average_age - 2*std_age, average_age + 2*std_age, size = count_nan_age)
dataframe["age"][np.isnan(dataframe["age"])] = rand
2、使用線性回歸。根據現有資料,可以計算出兩個變量之間的最佳拟合線,比如房價與面積m2。值得一提的是,線性回歸模型對異常值很敏感。
3、Hot-deck:從其他類似記錄中複制值。這僅在你有足夠的可用資料時才有用。并且,它可以應用于數值的且已經分類的資料。
另外我們還可以采用随機方法,用随機值填充缺失值。進一步采用這種方法,可以先将資料集分成兩組,基于某些特征,比如性别,然後随機分别填寫不同性别的缺失值。
三、Flag
一些人認為,無論我們使用何種插補方法,填寫缺失值都會導緻資訊丢失。這是因為說缺少資料本身就是資訊性的,算法知道它。當丢失的資料不是随機發生時,這一點尤為重要。舉一個例子,一個特定種族的大多數人拒絕回答某個問題。
丢失的資料可以用例如0填充,但在計算任何統計值或繪制分布時必須忽略這些零。雖然分類資料可以用“缺失”填寫:一個新的類别,它告訴我們缺少這一資料。
離群(極端)值
它們的值與所有其他觀察值顯著不同。
遠離Q1和Q3四分位數的任何資料值
(1.5 * IQR)都被認為是異常值。
在被證明之前,異常值是無辜的。話雖如此,除非有充分理由,否則不應删除它們。例如,人們可以注意到一些不太可能發生的奇怪的,可疑的值,是以決定将它們删除。雖然,他們值得調查之前删除。
值得一提的是,某些模型,如線性回歸,對異常值非常敏感。換句話說,異常值可能會使模型脫離大多數資料所在的位置。
記錄和交叉資料集錯誤
這些錯誤是由于在同一行中有兩個或多個值,或者是在彼此互相沖突的資料集中。例如,如果我們有一個關于城市生活成本的資料集。總列數必須等于租金,運輸和食物的總和。同樣,孩子不能結婚。員工的工資不能低于計算的稅額。相同的想法适用于不同資料集的相關資料。
完成後,應通過重新檢查資料并確定其規則和限制确實存在來驗證正确性。
例如,在填寫缺失資料後,它們可能違反任何規則和限制。如果不可能,可能會涉及一些手動校正。
報告
報告資料的健康程度對清潔同樣重要。如前所述,軟體包或庫可以生成所做更改的報告,違反了哪些規則以及多少次。
除了記錄違規外,還應考慮這些錯誤的原因。為什麼他們發生?
我很高興你能堅持到最後。但是,如果不接受品質文化,所提到的内容都沒有價值。
無論驗證和清理過程多麼強大和強大,随着新資料的進入,我們必須将繼續受苦。最好是保護自己免受疾病的侵害,而不是花時間和精力去補救它。
本文由
阿裡雲雲栖社群組織翻譯。
文章原标題《the-ultimate-guide-to-data-cleaning》作者:OMAR ELGABRY
譯者:烏拉烏拉,審校:袁虎。
文章為簡譯,更為詳細的内容,請檢視
原文