數(shù)據(jù)清洗(data cleaning)的重要性
轉(zhuǎn)自公眾號(hào):ArisQ

之前經(jīng)常和臨床試驗(yàn)數(shù)據(jù)打交道,無(wú)論是來(lái)自手動(dòng)錄入的數(shù)據(jù)還是取自數(shù)據(jù)庫(kù)的數(shù)據(jù),在完成數(shù)據(jù)獲取這一步后,感覺(jué)有80%甚至90%的時(shí)間和精力會(huì)用在做數(shù)據(jù)清洗(data cleaning)這一環(huán)節(jié),即“增”“刪”“查”“改”,通過(guò)data cleaning要讓我們的數(shù)據(jù)成為可以進(jìn)入模型的狀態(tài),也是就是清潔的數(shù)據(jù)(tidy data/clean data),過(guò)不了這一關(guān),后面的建模就無(wú)法實(shí)現(xiàn)。
隨著網(wǎng)絡(luò)資源的豐富,很多時(shí)候即使沒(méi)有精通的數(shù)據(jù)分析或者統(tǒng)計(jì)學(xué)基礎(chǔ),通過(guò)很多網(wǎng)上的step by step的教程或幫助手冊(cè)文檔,使得即使是新手也可以通過(guò)編程軟件如SAS、R來(lái)實(shí)現(xiàn)很多高級(jí)模型的構(gòu)建,我也經(jīng)常會(huì)在國(guó)內(nèi)外論壇或者微信公眾號(hào)上學(xué)習(xí)這些教程。但是你要知道“幾行代碼實(shí)現(xiàn)XXX”的前提,也就是把一個(gè)“臟”數(shù)據(jù)變成能夠在“幾行代碼”中直接跑出結(jié)果的過(guò)程可能需要幾十行幾百行代碼進(jìn)行清洗。通常情況這些教程是不會(huì)說(shuō)明所用的“干凈數(shù)據(jù)”是如何獲取的,而且我們并不是FDA,收到的數(shù)據(jù)也不會(huì)像藥企提交給FDA的SDTM (Study Data Tabulation Model) & ADaM (Analysis Data Model)那樣規(guī)范[1],沒(méi)有清潔的數(shù)據(jù),盲目套用別人的code只會(huì)得到各種errors。
俗話(huà)說(shuō)心急吃不了熱豆腐,如果真的希望能夠在數(shù)據(jù)分析上進(jìn)一步提高水平,data cleaning是一項(xiàng)基本功并且無(wú)論怎樣強(qiáng)調(diào)也不為過(guò)。數(shù)據(jù)清洗有很多專(zhuān)著(比如后面提到的Cody's book)[2],不同的軟件也有不同的語(yǔ)法規(guī)則,這篇文章并不探討具體的方法,旨在引起大家包括提醒我自己對(duì)這項(xiàng)基本功的重視。
先了解一下什么是數(shù)據(jù)清洗。根據(jù)Ron Cody在他的《Cody's Data Cleaning Techniques Using SAS》中的定義是:
確保原始數(shù)據(jù)的準(zhǔn)確輸入
檢查字符型變量?jī)H包含有效值
檢查數(shù)值型變量在預(yù)定范圍內(nèi)
檢查是否存在缺失數(shù)據(jù)
檢查并刪除重復(fù)數(shù)據(jù)
檢查特殊值是否唯一,如患者編號(hào)
檢查是否存在無(wú)效數(shù)據(jù)
檢查每一個(gè)文件內(nèi)的ID編號(hào)
確保是否遵循復(fù)雜多文件規(guī)則
舉個(gè)例子,當(dāng)我獲得一個(gè)包含幾百名臨床患者的數(shù)據(jù)集時(shí),一眼看過(guò)去,我的電腦屏幕應(yīng)該是既看不見(jiàn)屏幕的右邊還有什么(因?yàn)樽兞刻?,或者說(shuō)列太多),又看不見(jiàn)屏幕下面還有什么(因?yàn)橛^測(cè)太多,或者說(shuō)行太多),比如下面這個(gè)樣子的:
圖1這個(gè)時(shí)候,我應(yīng)該做什么?拉一拉屏幕看看屏幕有什么,屏幕下面有什么嗎?可以,但如果你是個(gè)數(shù)據(jù)分析老手,你會(huì)知道這并不重要,而且也沒(méi)有什么用。如果數(shù)據(jù)量很大的時(shí)候,拖動(dòng)屏幕去看看下面的幾萬(wàn)行觀測(cè)除了讓你覺(jué)得卡頓之外,也不太可能一眼就看出什么有效的信息,所以沒(méi)有任何意義。
粗略的來(lái)劃分變量類(lèi)型,通常可以分成字符型和數(shù)值型組成。還是拿上面的這個(gè)例子來(lái)說(shuō),這個(gè)數(shù)據(jù)集里的group(組別),gender(性別)都是典型的字符型變量,像age(年齡)就是典型的數(shù)值型了。那么數(shù)據(jù)清洗的可以檢查字符型和數(shù)值型變量的值,是否在合理的區(qū)間(比如年齡的范圍),是否存在缺失,是否存在異常(比如性別、年齡),患者編號(hào)是否存在重復(fù)。這一步有的人可能會(huì)說(shuō)這難道不就是統(tǒng)計(jì)描述么?沒(méi)錯(cuò),這一步本質(zhì)就是統(tǒng)計(jì)描述,這一步可以得到頻數(shù)表、最大值、最小值、均數(shù)、中位數(shù)等信息。但數(shù)據(jù)清洗并沒(méi)有這么簡(jiǎn)單,到這里我們通過(guò)統(tǒng)計(jì)描述只能說(shuō)看看數(shù)據(jù)“臟不臟”,如果“臟”,那后面還有的是工作需要去做。但如果“干凈”,也不要高興太早,干凈的數(shù)據(jù)也不見(jiàn)得直接就能拿來(lái)用。
還是用上面這個(gè)例子,這樣的一個(gè)數(shù)據(jù)集,可能需要拆分,可能需要合并(比如雙錄,即兩個(gè)研究人員同時(shí)錄入一批數(shù)據(jù),減少單人錄入出現(xiàn)的失誤),才能夠滿(mǎn)足后面的數(shù)據(jù)分析要求?,F(xiàn)在我要基線(xiàn)(baseline)的數(shù)據(jù),那么需要從剛才的數(shù)據(jù)集中提取visit=0的觀測(cè)。這樣的話(huà),后面我所有與基線(xiàn)有關(guān)的數(shù)據(jù)分析都在這個(gè)新的數(shù)據(jù)集中操作即可,可以減少對(duì)原始數(shù)據(jù)集的影響,以免一些誤操作而引起的麻煩。
圖2
另外有時(shí)需要對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)置(transpose),因?yàn)橛行r(shí)候需要特定的數(shù)據(jù)格式才能進(jìn)行下一步的數(shù)據(jù)分析,比如寬數(shù)據(jù)轉(zhuǎn)長(zhǎng)數(shù)據(jù),或者長(zhǎng)數(shù)據(jù)轉(zhuǎn)寬數(shù)據(jù)。比如圖1就是一個(gè)典型的長(zhǎng)數(shù)據(jù)格式,因?yàn)椤皏isit”這個(gè)變量被壓縮到了一個(gè)變量之中,所以每一個(gè)ID不僅只有一行觀測(cè),而是有9行之多。圖3就是對(duì)圖1中的變量“RMDQ”進(jìn)行轉(zhuǎn)置之后的結(jié)果??赡苣銜?huì)問(wèn),為什么要轉(zhuǎn)置RMDQ的這一列數(shù)據(jù)呢?因?yàn)椤癛MDQ”中存在缺失值(missing data),后面會(huì)通過(guò)多重填補(bǔ)(multiple imputation)方法進(jìn)行缺失值的處理,需將數(shù)據(jù)變換為寬數(shù)據(jù)格式時(shí)才可以。
圖3
總結(jié)一下數(shù)據(jù)清洗具體包含的操作除了檢查變量是否有效、是否在合理范圍內(nèi),還包括拼接、抽提、拆分、觀測(cè)和變量的篩選、變量類(lèi)型轉(zhuǎn)換、行列轉(zhuǎn)置、新變量生成、賦值、缺失數(shù)據(jù)填補(bǔ)等等只要是為進(jìn)一步數(shù)據(jù)分析做準(zhǔn)備的工作都可以看做是數(shù)據(jù)清洗。
數(shù)據(jù)清洗是數(shù)據(jù)分析的前提,也會(huì)花費(fèi)較多的時(shí)間和精力。希望這篇小文章能讓有興趣在數(shù)據(jù)分析領(lǐng)域進(jìn)一步學(xué)習(xí)了解的朋友們重視數(shù)據(jù)清洗的過(guò)程,夯實(shí)基礎(chǔ)。
參考資料
Ron Cody, Cody's Data Cleaning Techniques Using SAS, Second edition(有第三版最新版本哦!鏈接請(qǐng)查收:https://pan.baidu.com/s/1fygwaWWIPuq_iG9dik4i4g 提取碼: 2it2 )
FDA,美國(guó)食品藥物管理局;SDTM,研究數(shù)據(jù)制表模型;ADaM,分析數(shù)據(jù)模型
