# Data Cleaning

![](https://598244296-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTpGJII2kk6lS8bhC04%2Fsync%2F89abfd5cd0300589916aefb0531eaa88754a8315.png?generation=1613653992824128\&alt=media)

Chapter 8

## 資料清理Data Cleaning

By Marit Brademann and Dyanna Gregory

現在你手上有一個資料集(dataset)，你準備好清理它了。但這是什麼意思呢？資料清理(data cleaning)具體而言是什麼，我們又要如何進行呢？

清理資料時，我們要檢查並辦別出不正確的資訊，像是錯誤的數字或是錯字等，然後決定是否要修正它們(如果它們可以被修正)，或是直接刪除它們。如同資料準備的過程，許多[資料清理](https://github.com/g0v/data-design/tree/87ad354a079a9bcef258a5a34c49d7b82be1bab5/book/glossary01.html#cleaning-data) 的任務同時包含電腦計算和人工檢查兩個步驟。人工檢查尤其重要，因為我們需要進一步確認電腦所判斷為可能錯誤的資料是否真的為誤。有些電腦判斷為有問題的資料，可能只是較極端的數據，所以你應該持續參與資料清理的過程，不要讓電腦獨自運作，否則有用的資料可能會被刪除！

### 如何清理資料

讓我們從一些最基本的資料清理開始。接下來將用excel為例，但你也可以使用其它的制表軟體或是資料處理軟體來進行以下步驟。常用的程式列在[附件](https://github.com/g0v/data-design/tree/87ad354a079a9bcef258a5a34c49d7b82be1bab5/book/app01.html)中.

### 範圍檢查Range Checks

[範圍檢查(Range checks)](https://github.com/g0v/data-design/tree/87ad354a079a9bcef258a5a34c49d7b82be1bab5/book/glossary01.html#check-range) 是非常簡單明瞭的步驟，用來檢查數值資料集中的資料是否不超出邊界值，並且在可接受的數值範圍內。以下面的作業成績為例。假想你是一位大學教授，而你的助教輸入了學生們這學期的作業成績。你想要確保成績輸入無誤，因此你打開資料，並把第一個作業的成績(依1-100評分)該欄依大小排列。前幾排顯示如下：

| 學生ID      | 作業一成績 |
| --------- | ----- |
| 679372531 | 980   |
| 673540288 | 99    |
| 674082892 | 97    |
| 673923590 | 96    |

這裡有一個成績顯示為980分，很可能是助教不小心在98分後面誤加了0。你應該標記它並且向你的助教確認正確的成績。

即使所有數值都在正常的範圍內，用檢視的方式進行資料範圍檢查，也可能透露其它可能的問題：

| 學生ID      | 作業一成績 |
| --------- | ----- |
| 674472019 | 78    |
| 679029425 | 75    |
| 671822390 | 74    |
| 671278927 | 9     |

在這組成績裡，有一個成績特別地低，很有可能原本的成績是90。因此，它應該要被標記起來並檢查資料來源。這是一個很好的例子，說明了人工參與資料清理的過程是非常重要的，尤其是那些權重極高的變項，比如學生的成績或是一個研究計畫的主要變項。但是，人工檢查資料集中的所有變項可能曠時費日，尤其當資料集非常巨大時，而且，並不是所有變項都同樣重要。因此，你必須決定哪個變項需要人工特別檢查，哪些又可以交由電腦處理。

範圍檢查可以在任何範圍內執行， 即使小如0和1之間的小數點。比如華氏體溫，正常人的體溫多數位於97.0與99.0之間，有人偏高，有人偏低。透過範圍檢查 你可以檢查出變項裡的數值是否過低或過高。

你也可以使用「篩選(Filter)」指令來辨認一變項中所有超出正常可接受的數值。但是，該指令無法檢查出相對異常但仍在範圍內的數值。以上述作業成績為例，[篩選(filter)](https://github.com/g0v/data-design/tree/87ad354a079a9bcef258a5a34c49d7b82be1bab5/book/glossary01.html#filter) 指令能辨認出980為異常，但無法判斷9為異常。如果你使用篩選進行範圍檢查，你最好同時使用其它方法來對變項進行總體檢查，如此才能過濾出所有可能異常的數值。

### 錯字檢查Spell Check

錯字檢查是另一個針對資料集是否有誤的基本檢查。我們建議你一項一項地檢查，而非一次性地檢查整個資料集。因為在一變項中被視為錯誤的寫法，在另一變項中極可能被視為正確。姓氏是個很好的例子，如果你的資料集有一欄為姓氏，電腦很可能警告許多姓氏是錯誤拼法，即便它們正確無誤。如果你一項一項地檢查，你將可以較快地檢查完整個資料集。在資料準備一章學生調查的案例中，學生們填寫了主修科目。假設有一個學生因為熬夜而誤將「數學」填成「樓學」，電腦只針對主修科目這個欄位進行錯字檢查時，將可很快地辨認出錯字，讓你能夠更正為「數學」或是「數學系」，看你選用哪一個字彙。

### 樣式比對/正規表示法Pattern Matching/Regular Expressions

另一個較為進階的資料檢查是[樣式比對(pattern matching)](https://github.com/g0v/data-design/tree/87ad354a079a9bcef258a5a34c49d7b82be1bab5/book/glossary01.html#matching-pattern)。這種檢查法可以用來檢查諸如email地址的欄位。這種方法涉及正規表示法(regular expressions，又作regex)，這是一種表達方式，能讓電腦知道：「在這欄中我只要符合某種特定樣式的資料，所有不符合的都標示出來。」定義樣式的方法依不同程式而有所差異，如果你從未寫過這樣的程式，你可能會覺得它看起來有些複雜。但是如果你曾經在程式中寫過星號「＊」作為檢索的萬用字元，那正是正規表示法，你已經稍微認識它了。

在Excel中也有樣式比對的選項，和一些十分有用的進階篩選功能。參考[資源](https://github.com/g0v/data-design/tree/87ad354a079a9bcef258a5a34c49d7b82be1bab5/book/app01.html)中關於正規表示法、Excel篩選，以及樣式比對的更多細節。

### 組合檢查Combination of Fields

你也可以綜合幾個欄位進行檢查。有時，這樣的檢查是必須的，因為你需要同時檢查數個欄位才能判斷資料是否有誤。如果你有在使用線上銀行，你已經在不知不覺中進行組合檢查了。你的線上銀行顯示了許多資料，你必須同時檢視才能讀懂它們，如果有讓你感到疑惑的資料，你心裡馬上會有警覺。你的線上銀行會同時顯示交易對象、交易金額、使用貨幣、信用卡或debit card刷帳、交易日期和帳戶餘額。這些所有的資料都是這組資料集的一部分。當你登入你的線上銀行並確認所有資料正確無誤時，你正是在進行組合檢查。如果交易金額與你預期的有所不同，或是與餘額不符，你心裡將會有所警覺，並去電銀行查清問題點。

網路銀行和其它的資料集是一樣的，某些資料需要綜合起來檢視。假想你在針對醫院病患進行醫學研究，你追蹤病患每日服用的藥品並記錄三種資料：藥品種類、藥品劑量和劑量單位。舉例來說，資料「阿斯匹靈、500、毫克」代表該病患每日服用阿斯匹靈500毫克。想像你看到一筆資料是「嗎啡、200、磅」，你會有什麼反應？給病患服用嗎啡並不奇怪，而劑量200毫克也還是合理的用藥，因此數字本身並不會讓人疑惑，但是即使是一磅的嗎啡都有可能致死，顯然問題出在單位上。你應該會檢查病患資料，或是尋問輸入資料的人以確認正確的單位。

如果你的資料都是自由輸入，你將會得到無限多個組合。這時，你應該盡早檢查你的資料集，並判斷哪些資料可以一起進行組合檢查，那麼你便可以定期地檢查資料是否有誤。此外，因為組合檢查是一個費時的工作，你必須先判斷這個資料組合的準確度有多重要，看是要產生一個準確的視覺圖表，或是進行統計分析，或只是一個初略報告。

### 沒有進行資料清理的後果是？

因為許多資料清理的過程非常費時，你經常需要先決定哪些變項值得清理，以及應該使用哪種清理方法。但如果我們跳過資料清理的步驟，讓它仍是「髒資料」，會有什麼後果呢？這個問題很難回答，因為這取決於你的資料集有多「髒」。運氣好的話，你的資料集並不太髒，而你的結果報告所受影響不大。運氣不好的話 你將會因為資料集裡的錯誤沒有在資料清理中被修正，而得到錯誤的結果。

當然，你的資料可能一開始就處於很乾淨的狀態。如果是這樣，你也可以跳過資料清理的過程，並得到影響不大的結果。無論如何，在你對資料進行基本而全面的檢查之前，你並無法得知你的資料是否乾淨或是骯髒。這就是說……

### 承認吧！多數的資料集都不乾淨

清理資料就像是打掃房子，你永遠無法清掃到每個部分。不論你如何努力，你都無法強迫其它人輸入百分之百正確的資料，即使是我們自己也經常在處理資料時犯錯。雖然你希望你的資料能夠愈正確愈好，但角落裡總還是會有細小的灰塵。重要的是，你應該承認沒有一個資料集是完美無瑕的，並且培養出判斷力 ，讓你能判斷什麼樣的乾淨程度足夠服務你的目的。

舉例來說，你從擁有一萬筆聯絡資料的資料庫中取出一千個名單，並且發現這一千個名單中有兩筆資料把姓與名放在同一欄。你會試圖回頭檢查並修正這一萬筆的資料嗎？

不一定。

你應該針對你的目的來判斷資料足夠乾淨或是過於骯髒。這完全取決於分析的變項，以及你的目標結果為何。如果你負責為一個內部報告來檢查學生填寫的主修科目，而且你認為錯誤率只有0.01%，那麼這些錯誤可能並沒有那麼重要。但是，如果你的變項是一個安全報告的關鍵因素，且擁有5%的錯誤，那麼它的重要性便比上述主修科目還高。慢慢的，你將會對資料的乾淨與否培養出較好的判斷力，並且知道不同的變項組合需要花多少勞力在資料清理上。到了這時，你最好諮詢該案成果的主要關係人，以知道對他們來說各個資料變項要多乾淨才是合理的。你應該盡可能追求資料的乾淨，但永遠記得它無法完美無瑕。

資料準備和清理是有代價的。如果你花錢請人做，那麼代價是金錢。如果你自己做，那麼你將花費自己或是組員的時間(也許還有精神)。所以，如果你從未用過電話或是傳真這類的機器，或是你寧願仰賴上帝，你也許可以決定直接刪除資料，停止收集它們，或是乾脆不去煩惱資料清理。

### 資料清理之後：請分類並歸檔！

當我們清理好資料後，我們將會面臨全新的問題：我們(以及其它人)如何確認我們對資料的修正是正確無誤，並且沒有破壞資料呢？畢竟，經過處理的資料可能會與原始資料大為不同。

最簡單的解決方法便是記錄每個步驟，尤其是當你稍後可能與其它統計學家或是研究者分享你的資料。在清理你的資料時，你最好把每一個改變存成分開的檔案，這樣一來，你總是可以回頭比對修改後的資料和原始檔案，看看哪些欄或列已經被刪除等等。這樣也確保當你想要用不同的方式切割和清理資料時，你永遠可以回溯到處理前的檔案。

你應該在清理資料的過程中，小心撰寫參考指南，記錄下每一個辨別壞資料的步驟，以及哪些資料被刪除了。這個關鍵在於一邊清理資料，一邊撰寫紀錄，因為同步進行記錄比事後再透過記憶追溯要容易得多。如果你使用的軟體是像excel一樣，各個指令分開輸入、執行，你應該特別注意記錄的工作，因為你的每個步驟都是手動執行，不像程式語言可以輕鬆地重覆回放。判斷一個紀錄好壞的祕訣是，如果你無法容易地照著你寫的紀錄，重新做出相同的結果，那麼你不該期待其它人也做的到。

不管你決定如何做資料清理的紀錄，寫好它可以合理地說明為何你刪去某些資料，而和保留了其它資料。同樣的，其它人也可以檢查你清理資料的過程是否恰當且正確。除此之外，如果你認為你稍後可能會將你的資料分享給其它統計學者來做進一步的分析，提供原始資料和資料處理紀錄可以讓大家的工作更輕鬆、快速。 \</div>&#x20;
