我花了幾個月的時間分析來自傳感器、調查及日誌等相關數據。不管我用多少圖表,設計多麼複雜的算法,結果老是會與預期不一樣。更糟糕的是,當你向首席執行官展現你的新發現時,他/她總會發現缺陷,你的發現與他們的理解徹底不符- 畢竟,他們是比你更瞭解領域的專家,而你只是數據工程師或開發人員。git
你爲你的模型引入了大量髒數據,沒有清理數據,你告訴你的公司用這些結果作事情,結果確定是錯的。數據不正確或不一致會致使錯誤的結論,所以,清理和理解數據對結果的質量都會有很大影響。正則表達式
垃圾進垃圾出算法
實際上,簡單算法的做用可能超過複雜的算法,由於它被賦予了足夠高質量的數據。數據庫
質量數據優於花哨的算法dom
出於這些緣由,重要的是要有一個分步指南,一個備忘單。首先,咱們想要實現的目標是什麼?質量數據是什麼意思?質量數據的衡量標準是什麼?瞭解你想要完成的任務,在採起任何行動以前,你的最終目標相當重要。函數
· 數據質量(合法性,準確性,完整性,一致性)spa
· 工做流程(檢查,清潔,驗證,報告)設計
· 檢查(數據分析,可視化,軟件包)3d
· 清理(無關數據,重複數據,類型轉換,語法錯誤)日誌
· 驗證
· 總結
除了維基百科上的質量標準以外,我找不到更好的解釋質量標準。因此,我將在這裏總結一下。
數據符合定義的業務規則或約束的程度。
· 數據類型約束:特定列中的值必須是特定的數據類型,例如,布爾值,數字,日期等。
· 範圍約束:一般,數字或日期應在特定範圍內。
· 強制約束:某些列不能爲空。
· 惟一約束:字段或字段組合在數據集中必須是惟一的。
· 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統計量」保留了形狀,而日誌功能則沒有。
規範化與縮放(使用特徵縮放)
鑑於缺失值是不可避免的,讓咱們在遇到它們時該怎麼作。有三種或許更多的方法來處理它們。
若是列中的缺失值不多發生而且隨機發生,那麼最簡單和最正確的解決方案是刪除具備缺失值的觀察值(行)。若是缺乏大多數列的值,而且隨機發生,則典型的決定是刪除整列。
這在進行統計分析時特別有用。
這意味着根據其餘觀察結果計算缺失值。有不少方法能夠作到這一點:
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:從其餘相似記錄中複製值。這僅在你有足夠的可用數據時纔有用。而且,它能夠應用於數值的且已經分類的數據。
另外咱們還能夠採用隨機方法,用隨機值填充缺失值。進一步採用這種方法,能夠先將數據集分紅兩組,基於某些特徵,好比性別,而後隨機分別填寫不一樣性別的缺失值。
一些人認爲,不管咱們使用何種插補方法,填寫缺失值都會致使信息丟失。這是由於說缺乏數據自己就是信息性的,算法知道它。當丟失的數據不是隨機發生時,這一點尤其重要。舉一個例子,一個特定種族的大多數人拒絕回答某個問題。
丟失的數據能夠用例如0填充,但在計算任何統計值或繪製分佈時必須忽略這些零。雖然分類數據能夠用「缺失」填寫:一個新的類別,它告訴咱們缺乏這一數據。
它們的值與全部其餘觀察值顯著不一樣。遠離Q1和Q3四分位數的任何數據值(1.5 * IQR)都被認爲是異常值。
在被證實以前,異常值是無辜的。話雖如此,除非有充分理由,不然不該刪除它們。例如,人們能夠注意到一些不太可能發生的奇怪的,可疑的值,所以決定將它們刪除。雖然,他們值得調查以前刪除。
值得一提的是,某些模型,如線性迴歸,對異常值很是敏感。換句話說,異常值可能會使模型脫離大多數數據所在的位置。
這些錯誤是因爲在同一行中有兩個或多個值,或者是在彼此相互矛盾的數據集中。例如,若是咱們有一個關於城市生活成本的數據集。總列數必須等於租金,運輸和食物的總和。一樣,孩子不能結婚。員工的工資不能低於計算的稅額。相同的想法適用於不一樣數據集的相關數據。
完成後,應經過從新檢查數據並確保其規則和約束確實存在來驗證正確性。
例如,在填寫缺失數據後,它們可能違反任何規則和約束。若是不可能,可能會涉及一些手動校訂。
報告數據的健康程度對清潔一樣重要。如前所述,軟件包或庫能夠生成所作更改的報告,違反了哪些規則以及多少次。
除了記錄違規外,還應考慮這些錯誤的緣由。爲何他們發生?
我很高興你能堅持到最後。可是,若是不接受質量文化,所提到的內容都沒有價值。
不管驗證和清理過程多麼強大和強大,隨着新數據的進入,咱們必須將繼續受苦。最好是保護本身免受疾病的侵害,而不是花時間和精力去補救它。