摘要: 有數據不知道怎么清理?看完這篇保你不慌!
我花了幾個月的時間分析來自傳感器、調查及日志等相關數據。無論我用多少圖表,設計多么復雜的算法,結果總是會與預期不同。更糟糕的是,當你向首席執行官展示你的新發現時,他/她總會發現缺陷,你的發現與他們的理解完全不符-?畢竟,他們是比你更了解領域的專家,而你只是數據工程師或開發人員。
你為你的模型引入了大量臟數據,沒有清理數據,你告訴你的公司用這些結果做事情,結果肯定是錯的。數據不正確或不一致會導致錯誤的結論,因此,清理和理解數據對結果的質量都會有很大影響。
垃圾進垃圾出
實際上,簡單算法的作用可能超過復雜的算法,因為它被賦予了足夠高質量的數據。
質量數據優于花哨的算法
出于這些原因,重要的是要有一個分步指南,一個備忘單。首先,我們想要實現的目標是什么?質量數據是什么意思?質量數據的衡量標準是什么?了解你想要完成的任務,在采取任何行動之前,你的最終目標至關重要。
目錄:
· 數據質量(合法性,準確性,完整性,一致性)
· 工作流程(檢查,清潔,驗證,報告)
· 檢查(數據分析,可視化,軟件包)
· 清理(??無關數據,重復數據,類型轉換,語法錯誤)
· 驗證
· 總結
數據質量
除了維基百科上的質量標準之外,我找不到更好的解釋質量標準。所以,我將在這里總結一下。
合法性
數據符合定義的業務規則或約束的程度。
· 數據類型約束:特定列中的值必須是特定的數據類型,例如,布爾值,數字,日期等。
· 范圍約束:通常,數字或日期應在特定范圍內。
· 強制約束:某些列不能為空。
· 唯一約束:字段或字段組合在數據集中必須是唯一的。
· 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
譯者:烏拉烏拉,審校:袁虎。