search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

常和數據打交道,一定知道做好「數據清洗」有多重要

Yiqin Fu,小說和數據都可以看一天

國小的時候我統計過同學里有多少要訂課間牛奶:每人分別需要什麼口味和什麼大小,應收多少錢。最後這份按照座位排序的表格要和一張學號表格按照同學姓名對應起來,並計算每種口味訂購數量和每人應收款。過程中我遇到了很多困難,例如有同學訂了多種口味,有同學的信息被登記到了別的同學那一行——這應該是我最早的數據清洗經歷。那時候遇到的問題現在也不斷遇到,只是手動複製粘貼一個 40 行 4 列的 Excel 表格比現在做的簡單很多。

下面是我在犯了很多錯誤后總結的教訓,寫下來做筆記提醒自己,或許也可以給大家啟發。

時間計劃

數據收集、整理通常占整個研究 70% - 90% 的時間。一定在計劃的時候要給足時間,安排好整理數據同時可以做的其他事項(寫出文章基本框架、閱讀文獻等)。

準備工作

把原始數據單獨保存在一個文件夾里,永遠不要改動,標記它們的來源(開源網站?自己抓取?自己收集?資料庫購買?)。在處理數據前,一定要想好你處理后的數據如何能和原始數據對應起來,例如通過變數名或者標識符(identifier)。 這個步驟很重要,因為如果你發現最終數據有誤,還能通過變數名或標識符找到錯誤的源頭。

在開始處理數據前,把數據結構了解清楚。最好把下列問題的答案寫在一個文檔里:你有哪幾個數據集,分別叫什麼名字、長什麼樣(幾行幾列,單位是什麼:是個人 - 每年層面的數據,還是國家 - 每月的數據);你的目標是什麼(合併?算每個子集的中位數?統一單位?合併或統一單位的目的又是什麼?為什麼我的研究要求我這麼做?);要用的變數叫什麼名字,輸出的變數叫什麼名字、長什麼樣,怎樣應用到接下來的分析中。

以上步驟聽起來很簡單,甚至沒有做的必要。但是數據集多了、處理內容複雜了以後,很容易弄混變數名,忘記最終目的(即「這個清洗過的數據集到底和我最終研究目的有什麼關係」)。如果你的項目牽扯到第三方(例如公司或政府數據提供方),研究戰線會拖得很長,可能你一月處理好數據集 A,三月調查公司才把數據集 B 給你,你看了一眼 B 發現又需要數據集 C。等你五月開始合併 A、B、C 的時候,你已經忘記 A 到底是用來做什麼的了。

寫清楚變數與步驟在個人項目中已經非常重要,在合作項目中當然必不可少。多人合作中弄錯變數含義、弄混文件版本是常見且頭疼的問題。

過程中

不管是多小的數據集,千萬不要手動在 Excel 或者 TXT 編輯器裡面手動修改數據,因為這些軟體不會自動記錄你做過的編輯,時間久了你可能會忘記自己做過什麼。如果非要手動修改,建議在一個文檔里完整寫下你改動的內容。通常只有批量手動錄入數據才會需要 Excel。

確認觀測值名稱(即第一列內容)是獨特的。通常觀測值名稱都沒有重複(比如國家名、個人證件號碼等),但有些情況下觀測值可能會重名(比如城市名、人名)。這時候你需要加上自己的標識符,以免後期做聚合、合併的時候出錯。

經常檢查數據類(data types,例如 numeric/character/logical/factor)。數據類如果不對,通常你的命令無法執行,軟體會報錯。但有時候恰好可以執行,軟體也不會報錯。這時候如果你沒有檢查數據類,很可能就帶著錯誤的數據進入下一行運算。類似的情況在 Excel 里很常見,例如 Excel 會自動把一些數據變成日期格式,你不在意的話最後輸出就錯了。當然,數據分析軟體比 Excel 好的地方是你隨時都可以撤銷命令。

小心處理「無數據」(NA)。一定要搞清楚你的軟體如何對待「無數據」(NA)——有的軟體在運算、合併的時候會自動忽略 NA 且不給你提醒,這個做法在很多科學研究里是錯的,所以你得手動檢查數據集里是否有 NA,並告訴軟體應該怎樣處理它們。另外,NA 在很多軟體里都是邏輯(logical)而不是字元(character)類數據。如果你要鍵入或者判斷 NA,一定要用邏輯 NA 而不是字元 NA。

合併數據集前,一定要了解清楚不同種「合併」(merge)命令的區別,且要想一個方法來檢查合併是否成功。合併是非常容易出錯的步驟,即使你用的命令是正確的,也會因為數據本身的小問題而失敗。舉個簡單的例子,一個沒有標題行的數據集,它的第一行在某些軟體中會默認被當做標題行,在合併的時候會被忽略,這樣你的結果可能就少一行。再或者你用來合併的那一列,原始數據有拼寫錯誤或不同寫法(英式美式拼寫、繁體簡體),合併后的結果就不會是你想要的。總之,在合併前一定要想一個方法來檢測合併成功與否,例如檢查行數列數,看看數據集里哪裡有 NA 等等。數據分析軟體輸出了結果,並不代表你的合併就是正確的。

不要只看了數據集前幾行,就以為每一行的數據都長這樣。舉個例子,如果數據的第一列是地名(「某某區」),你運行了「查看數據前幾行」這個命令,發現這幾行第一列的長度都是 3(「朝陽區」、「靜安區」),就以為每一行第一列的長度都是 3。接下來,你用到一些關於變數長度的命令——如果第一列有的長度不是 3,輸出結果就會有錯。正確方法應該是先檢查待處理的數據是否都遵循你假設的規則,不管是通過運行命令檢驗(「第一列有哪些值的長度不等於 3」)還是通過從常識思考(「有沒有超過三個字的地名」)。

處理后

查找異常數據!收工前,一定要通過做圖或者寫命令來檢查異常數據,例如比中位值高出很多的、比前一年的值低很多的。發現異常數據后首先要看原始數據,通常是你在合併等複雜步驟中出了錯。但我也遇到過原始數據出錯的情況,所以即使你的異常數據符合原始數據,也一定要再想一想——如果異常數據違背常識(例如人口一年內翻倍、收入是其他地區幾分之一),那要求證數據來源。

客官,這篇文章有意思嗎?

好玩!下載 App 接著看 (๑•ㅂ•) ✧

再逛逛吧 ˊ_>ˋ



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦