用R可以做數據清洗嗎?或者有更好的數據清洗工具?

在有的資料庫里的數據質量非常的差,有些欄位什麼符號都有,有些應該是數字的也有好多的的漢字,有沒有比較好的數據清洗工具?R可以完成這項工作嗎


我司有款產品,叫做QKB,QualityKnowledgeBase,google出來第一個就是。這東西最新版的編輯器是我做的,整三年。

QKB定義了11種清洗流程,比如gender guess, standardization, parse definition, locale guess.具體的不說了,因為個人意見,這個實在太業務相關。

每種清洗流程,包括若干不等的處理演算法,比如tokenlize,mapping,scheme,regex,matchcode等等,大概有90種演算法,當然大部分都很簡單,比如UPPERCASE.

對於每種清洗流程,再定義一種數據類型,每種類型有若干個Token。

然後就是重點了,針對每個業務領域,每種語言,每個國家,每半年,我司都要推出一個新的QKB。Brian,產品經理,說自己的中文只夠旅遊用,討論還是英文,我問你會幾種語言,他說常見的都會,都會...因為全球有20多個辦公室生成這套資料庫。14年的時間啊,只有3個業務領域,Contract Information, Product Data, Health Information. 這東西基本是知識密集型的產出。

使用上呢,內嵌到SAS FederationServer上了,直接以SQL 函數提供,比如 select DM.DEF(address_standlization, "ADDR") from contract; 或者直接創建FedView。SAS PROC應該也有,這個不熟。

具體一個例子呢,比如地址的standardlization,大概也是以下流程:

首先你要知道這批數據的大概情況,比如是中文數據還是英文數據,是中國的數據還是新加坡的數據(其實我司還可以不區分的來處理,比如LocaleGuss,LanguageGuess以及要用的組成一個大的ETL Job,有些跨國公司的ETL必須這麼處理)。簡單點,中國大陸吧,zhcn。

然後要定義data type,也即是裡面的token,對於我國,大概是 省,市,區/縣,街道,號碼,後綴。

具體的清洗演算法呢,我們假設輸入的地址是「魔都南京路4號5層」

1. Tokenlize,把輸入的地址進行拆分,這東西要讀取一個相應locale和domain的分詞表,並應用參數進行分詞,輸出結果應該為 省: Missing, 市:魔都, 區: Missing, 街道:南京路,號碼: 4號,後綴:Missing。分詞表那是純手工敲出來的,比如常見的分隔符,帶「京」,「都」的會是城市,帶「路」,「街」,「大街」,「道」的是街道什麼的,非常的知識密集。

2. Scheme,對每個token進行standardization,基本還是手工一個一個輸入,然後程序調用scheme進行比對,有很多抓取工具來填充scheme,似乎一般一個正確值對應幾十個錯誤值?此時輸出 省: Missing, 市:上海市, 區: Missing, 街道:南京路,號碼: 4號,後綴:Missing

3. 填充數據,大概是grammar?根據具體的省/市/區/縣的關聯關係,以及具體的參數來填充缺失值,這個依然依賴Grammar數據。輸出 省: 上海直轄市, 市:上海市區, 區: 徐匯區, 街道:南京路,號碼: 4號,後綴:Missing

4. 比較結果,以上的每個結果都是可以有多個solution的,需要根據額外的參數來打分,選擇最高的那個,比如上面舉的那個匹配度最好。但是有時候所有方案匹配度低的時候,要選最低的那個。

5. mapping,輸出最終結果:上海市徐匯區南京路4號

6. Checking,美帝那邊有個叫NCOA(National_Change_Of_Address)的服務,貌似要花錢,還有很多其他的,locote?時間太久記不清了。天朝似乎聽說也有,但是沒調查過。輸出的地址要校驗一番的,比如和zip code,phone是否對應等等,可選。

以上每布都是一個大的處理節點,每部分都可能涵蓋幾個小節點。

好吧無圖無真相, 我去截了個圖, 不過手頭只有前幾年的版本, 看了下功能還是很弱啊, 此外沒法演示魔都-上海了, 這個還沒加到scheme里...另外這個是editor, 是給業務專家研究參數用的,比如那個比對界面, 要看下不同參數下不同solution的分析差異.

一個QKB大概60M不到,每Domain,每Language,每Locale,每half year。有些語言特別大,比如英語,那個地名的Scheme就特別巨大,基本涵蓋所有錯誤的英文拼寫;阿拉伯文的就特別小。不過一想到這些都是純文本數據,還是壓縮過的,那還是真TM大...

運行時都是預載入到內存以提高性能。

數據清洗本身就是一個勞動密集和智力密集的產業,不僅需要有好的演算法,更重要的是需要有大量的數據支持和優秀的業務專家來提取信息,我相信一個簡簡單單的演算法不可能處理所有問題。而且數據的模型漂移是個很嚴重的問題,你處理下10年前的地址和現在的就不一樣,你需要的輸出是10年前的還是現在的也不一樣。這個問題在PD那個產品特別突出,每年的品牌名稱都得重新搞。

所以自己一個搞,在我看來可以玩一玩,真正工業級別的,還是花錢吧。

ps:這東西是按照Locale收年費的!據說不便宜。而且買了之後可能還要進行修改以適應具體的業務場景。

pps:似乎國產的也有,但是功能相當單一

ppps:有沒有人搞一個針對大陸便宜點的啊,藍海啊。


R清洗數據還是不錯了,畢竟向量化操作,對於常用的data.frame進行清洗的話,plyr,dplyr,tidyr包不錯;對於文本類數據吧,那必須推崇stringr包了,專門處理字元串的,然而你必須會正則了,不要用grep家族!不要用grep家族!不要用grep家族!重要的事情說三遍。對於時間類型的數據必然是lubridate包了。包你滿意。


r的plyr dplyr tidyr三個包專門用來做數據清洗


數據清洗範圍太廣了,什麼熟練就用什麼,數據處理過程就像一個鏈條,數據清洗是其中一環,跟上游和下游都可以各自選用不同的編程語言


R(以及其他語言)能做得事情非常非常多。問R可不可以完成描述的數據清理任務,答案是當然可以。

如果要問R是不是最好的選擇,那就未必了,要看你對R與其他工具的熟悉程度對比和具體數據特性。根據你的描述,我覺得無論採用什麼工具,一定會用到正則表達(如果你還不太熟悉的話)。


我用Java和C++自己寫程序清洗和聚集數據。積累了一些自己的工具庫和演算法庫後,開發效率和執行效率都很高。


推薦閱讀:

R語言里做時間序列分析有哪些包?
Microsoft R open和Microsoft R server和普通的R語言有什麼區別和聯繫?

TAG:數據 | R編程語言 |