資料清理的終極指南
摘要: 有資料不知道怎麼清理?看完這篇保你不慌!

我花了幾個月的時間分析來自感測器、調查及日誌等相關資料。無論我用多少圖表,設計多麼複雜的演算法,結果總是會與預期不同。更糟糕的是,當你向執行長展示你的新發現時,他/她總會發現缺陷,你的發現與他們的理解完全不符- 畢竟,他們是比你更瞭解領域的專家,而你只是資料工程師或開發人員。
你為你的模型引入了大量髒資料,沒有清理資料,你告訴你的公司用這些結果做事情,結果肯定是錯的。資料不正確或不一致會導致錯誤的結論,因此,清理和理解資料對結果的質量都會有很大影響。
垃圾進垃圾出
實際上,簡單演算法的作用可能超過複雜的演算法,因為它被賦予了足夠高質量的資料。
質量資料優於花哨的演算法
出於這些原因,重要的是要有一個分步指南,一個備忘單。首先,我們想要實現的目標是什麼?質量資料是什麼意思?質量資料的衡量標準是什麼?瞭解你想要完成的任務,在採取任何行動之前,你的最終目標至關重要。
目錄:
- 資料質量(合法性,準確性,完整性,一致性)
- 工作流程(檢查,清潔,驗證,報告)
- 檢查(資料分析,視覺化,軟體包)
- 清理(無關資料,重複資料,型別轉換,語法錯誤)
- 驗證
- 總結
資料質量
除了維基百科上的質量標準之外,我找不到更好的解釋質量標準。所以,我將在這裡總結一下。
合法性
資料符合定義的業務規則或約束的程度。
- 資料型別約束: 特定列中的值必須是特定的資料型別,例如,布林值,數字,日期等。
- 範圍約束: 通常,數字或日期應在特定範圍內。
- 強制約束: 某些列不能為空。
- 唯一約束: 欄位或欄位組合在資料集中必須是唯一的。
- Set-Membership約束: 列的值來自一組離散值,例如列舉值。例如,一個人的性別可能是男性或女性。
- 外來鍵約束: 在關係資料庫中,外來鍵列不能具有引用的主鍵中不存在的值。
- 正則表示式模式: 必須採用特定模式的文字欄位。例如,電話號碼可能需要具有模式(999)999-9999。
- 跨領域驗證: 跨越多個領域的某些條件必須成立。例如,患者出院的日期不能早於入院日期。
準確性
資料接近真實值的程度。
雖然定義所有的值允許出現無效值,但這並不意味著它們都是準確的。
一個 有效的 街道地址可能實際上並不存在,一個人的眼睛顏色,比如藍色,可能是有效的,但不是真的。另一件需要注意的是精度和精度之間的差異。
完整性
所有必需資料的已知程度。由於各種原因,資料可能會丟失。如果可能的話,可以通過質疑原始來源來緩解這個問題,比如重新獲得這個主題的資料。
一致性
資料在同一資料集內或跨多個數據集的一致程度。當資料集中的兩個值相互矛盾時,就會出現不一致。
離婚後,有效年齡,例如10歲,可能與婚姻狀況不符。客戶被記錄在具有兩個不同地址的兩個不同表中。哪一個是真的?
工作流程
工作流程一共四個步驟,旨在生成高質量的資料,並考慮到我們所討論的所有標準。
1. 檢查: 檢測不正確和不一致的資料。
2. 清潔: 修復或刪除發現的異常。
3. 驗證: 清潔後,檢查結果以驗證是否正確。
4. 報告: 記錄所做更改和當前儲存資料質量的報告。
實際上,你所看到的順序過程是一個迭代的,無窮無盡的過程。當檢測到新的缺陷時,可以從驗證到檢查。
檢查
檢查資料非常耗時,並且需要使用許多方法來探索用於錯誤檢測的基礎資料。下面是其中的一些:
資料分析
一個彙總統計有關資料的資料分析是真正有用的,它可以提供有關資料質量的總體思路。例如,檢查特定列是否符合特定標準或模式。資料列是記錄為字串還是數字?丟失了多少個值?列中有多少個唯一值及其分佈?此資料集是否與另一個數據集連結或有關係?
視覺化
通過使用諸如平均值、標準偏差、範圍或分位數等統計方法分析和視覺化資料,可以找到意外且因此錯誤的值。
例如,通過視覺化各國的平均收入,可能會看到有一些異常值。這些異常值值得研究,不一定是不正確的資料。
軟體包
使用你的語言提供的幾個軟體包或庫將允許你指定約束並檢查資料是否違反這些約束。此外,他們不僅可以生成違反哪些規則的報告,還可以建立哪些列與哪些規則相關聯的圖表。

清潔
資料清理涉及基於問題和資料型別的不同技術。可以應用不同的方法,每種方法都有自己的權衡。總的來說,不正確的資料被刪除,糾正或估算。
不相關的資料
不相關的資料是那些實際上不需要的資料,並且不適合我們試圖解決的問題。例如,如果我們分析有關人口總體健康狀況的資料,則不需要電話號碼。同樣,如果你只對某個特定國家/地區感興趣,則不希望包含所有其他國家/地區。 只有當 你確定某個資料不重要時,你才可以放棄它。否則,你就需要探索特徵變數之間的相關矩陣。
即使你注意到沒有相關性,你應該問一個域專家。你永遠不會知道,一個似乎無關緊要的特徵,從實際經驗來看,可能非常重要。
重複項
重複項是資料集中重複的資料點。
例如:
- 資料來自不同來源;
- 使用者可能會兩次點選提交按鈕,認為表單實際上沒有提交;
- 提交了兩次線上預訂請求,糾正了第一次意外輸入的錯誤資訊。
型別轉換
確保將數字儲存為數字資料型別,日期應儲存為日期物件,或Unix時間戳(秒數),依此類推。如果需要,可以將分類值轉換為數字和從數字轉換。
需要注意的是,無法轉換為指定型別的值應轉換為NA值(或任何值),並顯示警告。這表示值不正確,必須修復。
語法錯誤
刪除空格: 應刪除字串開頭或結尾的額外空格。
"hello world " => "hello world
填充字串: 字串可以用空格或其他字元填充到一定寬度。例如,某些數字程式碼通常用字首零表示,以確保它們始終具有相同的位數。
313 => 000313 (6 digits)
拼寫錯誤: 字串可以通過多種不同方式輸入,毫無疑問,可能會出錯。
Gender
m
Male
fem.
FemalE
Femle
這個分類變數被認為有5個不同的類,而不是預期的2個:男性和女性。因此,我們的職責是從上述資料中識別出每個值是男性還是女性。我們可以怎麼做呢?
第一種解決方案是手動 將 每個值 對映 到“男性”或“女性”。
dataframe['gender'].map({'m': 'male', fem.': 'female', ...})
第二種解決方案是使用 模式匹配 。例如,我們可以在字串的開頭查詢性別中m或M的出現。
re.sub(r"* ^m$", 'Male', 'male', flags=re.IGNORECASE *)
第三種解決方案是使用 模糊匹配 :一種演算法,用於識別預期字串與給定字串之間的距離。它的基本實現計算將一個字串轉換為另一個字串所需的運算元。
Gender male female m 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
譯者:烏拉烏拉,審校:袁虎。
文章為簡譯,更為詳細的內容,請檢視 原文
更多技術乾貨敬請關注雲棲社群知乎機構號: 阿里云云棲社群 - 知乎
本文為雲棲社群原創內容,未經允許不得轉載。