陳默回到自己座位,收到了李濤發(fā)來的字段說明文檔。他打開快速看了一下,然后深吸一口氣,關(guān)掉所有不必要的程序,新建了一個(gè)項(xiàng)目文件夾,按照自己的習(xí)慣建立子文件夾:原始數(shù)據(jù)、過程文件、清洗規(guī)則記錄、問題記錄、輸出數(shù)據(jù)。
他先不急著處理,而是花了一個(gè)多小時(shí),把所有u盤里的文件大致瀏覽了一遍,記下每個(gè)文件的大小、大概行數(shù)列數(shù)、可能的關(guān)聯(lián)字段。在筆記本上畫了一個(gè)簡單的關(guān)系圖。然后,他開始嘗試整理那些混亂的字段名。對照著天晟之前給過的零星文檔(在公共盤某個(gè)角落找到的),以及李濤發(fā)來的參考說明,他逐一猜測、標(biāo)注那些意義不明的列名。這個(gè)過程很慢,需要不斷的搜索、比對、推測。遇到實(shí)在不確定的,他在問題記錄文件里標(biāo)紅,記下文件名和列名。
下午快下班時(shí),王海又晃了過來,站在他身后,看著他的屏幕。
“怎么樣了?有頭緒沒?”
“正在梳理字段,原始數(shù)據(jù)比較亂,很多列名需要確認(rèn)?!标惸^也沒回,眼睛盯著屏幕上一行行數(shù)據(jù)。
“嗯,亂是肯定的。抓大放小,先把能確定的、重要的字段理出來。那些邊緣的、實(shí)在搞不清的,可以先放放,或者統(tǒng)一歸到一個(gè)‘其他信息’字段里,別耽誤太多時(shí)間在細(xì)節(jié)上。”王海的聲音從頭頂傳來,“關(guān)鍵是快。趙總那邊等著看方向?!?
“明白。”陳默說。他手指在鍵盤上停頓了一下,然后繼續(xù)敲打。他把一個(gè)標(biāo)注為“可能需要業(yè)務(wù)確認(rèn)”的字段,移到了“待定-低優(yōu)先級”的分類下。
“行,你繼續(xù)。下班前給我個(gè)初步進(jìn)展簡報(bào),幾句話就行,說說目前進(jìn)度和預(yù)計(jì)完成時(shí)間?!蓖鹾Uf完,走了。
陳默看了一眼電腦右下角的時(shí)間。繼續(xù)埋頭在數(shù)據(jù)里。
接下來兩天,陳默幾乎把自己釘在了工位上。除了上廁所和接水,很少離開。他按照清洗規(guī)則,編寫腳本處理批量問題:統(tǒng)一日期格式,將文本型數(shù)字轉(zhuǎn)換為數(shù)值型,處理明顯的異常值(比如年齡為200歲,金額為負(fù)值)。對于缺失值,他根據(jù)字段性質(zhì),謹(jǐn)慎地選擇填充方法,或者標(biāo)記為缺失,并在記錄文件里說明。去重時(shí),他設(shè)定了幾個(gè)關(guān)鍵字段組合作為唯一標(biāo)識,刪除了大量完全重復(fù)的記錄,但對于部分字段相同、部分字段不同的疑似重復(fù)記錄,他單獨(dú)拎出來,做了個(gè)待核查清單。
第三天下午,他遇到了一個(gè)棘手的問題。在核心的交易流水文件里,有一個(gè)關(guān)鍵字段“交易類型編碼”,按照天晟給過的一份老舊編碼表,應(yīng)該是幾位數(shù)字,對應(yīng)不同的業(yè)務(wù)類型。但陳默發(fā)現(xiàn),實(shí)際數(shù)據(jù)中混入了大量字母和特殊字符,甚至有些編碼在給出的碼表里根本不存在。他檢查了數(shù)據(jù)來源,發(fā)現(xiàn)這個(gè)文件似乎是多個(gè)子系統(tǒng)導(dǎo)出的結(jié)果合并的,編碼規(guī)則可能不統(tǒng)一。
他停下腳本,在問題記錄里詳細(xì)描述了這個(gè)問題,并截圖了異常編碼的樣本。這已經(jīng)不是簡單的清洗能解決的,需要業(yè)務(wù)方確認(rèn)編碼規(guī)則,或者至少明確哪些編碼是有效的,哪些是無效的、需要如何處理。
他整理了一下問題,帶著筆記本去找王海。
王海正在小會議室里打電話,門虛掩著。陳默站在門口等了一會兒。聽到王海對著電話說:“……李總您放心,我們這邊全力推進(jìn),初步分析很快就能出來……對,我們很重視,專門抽調(diào)了精干力量……明白,保持溝通……”
又等了幾分鐘,王海掛了電話出來,看到陳默,臉上還帶著講電話時(shí)的笑容:“默默,什么事?數(shù)據(jù)弄好了?”
“還沒有。遇到個(gè)問題,需要確認(rèn)。”陳默把筆記本屏幕轉(zhuǎn)向他,指著那個(gè)編碼混亂的問題,“這個(gè)字段很關(guān)鍵,后續(xù)分類匯總和分析都依賴它。但現(xiàn)在數(shù)據(jù)里編碼很亂,跟給的碼表對不上??赡苄枰?lián)系天晟那邊,確認(rèn)一下準(zhǔn)確的編碼規(guī)則,或者提供一份最新的碼表。不然清洗后的數(shù)據(jù),這個(gè)字段不可用?!?
王海湊近看了看陳默指出的那些異常樣本,眉頭皺了起來。他手指在屏幕上敲了敲:“這么多亂七八糟的?”
“嗯,比例不低。而且分散在不同時(shí)間段,不像是偶然錯(cuò)誤。”陳默說。
王海直起身,摸著下巴,思考了幾秒鐘?!奥?lián)系天晟……他們那邊it對接人你又不是不知道,效率低,問個(gè)問題三天不回。而且這種細(xì)節(jié)問題,去問他們,顯得我們水平不夠,連個(gè)數(shù)據(jù)清洗都搞不定?!彼麚u搖頭,“時(shí)間不等人。這樣,你先按他們給的那個(gè)舊碼表來,能對上的就歸類,對不上的……”他頓了頓,“對不上的,你先統(tǒng)一歸到一個(gè)‘其他’或者‘未知’類別里。標(biāo)注一下比例。我們分析的時(shí)候,可以暫時(shí)把這類‘未知’交易單獨(dú)拿出來看,或者按比例分?jǐn)偟揭阎悇e里做個(gè)估算。先把主干數(shù)據(jù)跑通,出個(gè)初步方向。細(xì)節(jié)問題,等后面深入分析的時(shí)候,有必要再去問?!?
陳默看著王海:“王組,這樣處理的話,如果‘未知’比例很高,或者‘未知’里的交易性質(zhì)特殊,可能會對后續(xù)分析結(jié)論產(chǎn)生比較大的偏差。尤其是風(fēng)險(xiǎn)判斷,可能失準(zhǔn)?!?
“我知道有風(fēng)險(xiǎn)。”王海語氣有些不耐煩了,但很快又調(diào)整回來,拍拍陳默肩膀,“但咱們做項(xiàng)目,不能追求百分百完美,尤其是在時(shí)間緊的情況下。要抓住主要矛盾。你現(xiàn)在卡在這里,后面所有工作都得停。先按我說的辦法處理,出一個(gè)可用的基礎(chǔ)數(shù)據(jù)集。這是當(dāng)前最重要的。有點(diǎn)偏差,我們在后續(xù)建模的時(shí)候,可以通過設(shè)置誤差范圍、做敏感性測試來彌補(bǔ)??烊ヅ?,抓緊時(shí)間。”
陳默沉默了兩秒,說:“行。那我先按現(xiàn)有碼表清洗,無法識別的歸為‘未知’,并記錄比例和樣例。但這個(gè)風(fēng)險(xiǎn)點(diǎn),我會在數(shù)據(jù)說明文檔里重點(diǎn)標(biāo)注?!?
“可以,標(biāo)注清楚。就這樣,快去?!蓖鹾]手。
陳默回到座位,看著屏幕上那一片混亂的編碼。他新建了一個(gè)“編碼映射與問題記錄”的子文件,詳細(xì)寫下了問題描述、王海的處理意見、以及自己將采取的具體步驟。然后,他修改清洗腳本,增加了按照舊碼表映射、無法映射的歸類為“zz_unknown”的步驟。腳本運(yùn)行,看著一行行數(shù)據(jù)被處理,那些千奇百怪的編碼被歸入“未知”類別,他心里那點(diǎn)不安感并沒有消失,反而像石頭一樣沉下去。
他看了一眼初步統(tǒng)計(jì),“未知”編碼的交易記錄,占了總交易筆數(shù)的接近百分之十五。比例不低。
他繼續(xù)工作。第三天晚上,他加班到十點(diǎn)多,終于將幾個(gè)核心文件初步清洗完畢,生成了第一版“干凈”的基礎(chǔ)數(shù)據(jù)集。他按照要求,生成了數(shù)據(jù)概覽報(bào)告,包括數(shù)據(jù)量、字段說明、缺失值比例、異常值處理情況,以及那個(gè)醒目的“‘交易類型編碼’未知比例:14.8%”的紅色警示框。
他把數(shù)據(jù)集、報(bào)告、以及詳細(xì)的清洗過程記錄文檔打包,在第四天上午一上班,就發(fā)給了王海。同時(shí)在郵件正文里寫道:“王組,天晟數(shù)據(jù)初步清洗完成,已發(fā)附件。核心問題已在報(bào)告中標(biāo)紅。請查收?!?
幾分鐘后,王?;貜?fù)了郵件,只有兩個(gè)字:“收到?!盻c