本篇摘要
老喬談資料在能用之前要過的那道工,並指出多數人誤會了敵人是誰:髒的資料看得出來,對不齊的資料每一筆都對、合起來卻是錯的。三種問題依發現難度遞增。第一種是同一篇文章被機器認成好幾筆:網站換過站台、網址格式改過、有些連結帶標題有些不帶、有些還掛著錨點,對讀者是同一頁、對機器是不同紀錄,結果這篇文章的成績被切成好幾份,在任何排行榜上都排不進去,不是表現差而是被拆開了;處理方式不是清一次,而是在中間加一層翻譯把所有寫法換算成同一個身分。第二種是比率不能相加:兩天的點擊率直接平均,在兩天曝光量懸殊時會嚴重偏掉,正確做法是回到分子分母各自加總,所以資料層只存分子與分母、所有比率現算;理由是比率一旦被存起來,遲早有人拿兩列去平均,而且算出來的數字看起來很合理、沒有任何地方會報錯。延伸規則是不同切面的數字不能疊,同一天按國家分與按裝置分各自都是一份完整的量。第三種也是最難的一種是時間粒度不對齊:搜尋只到週且保留十六個月、另一家只給週且不分國家、流量存的是月、AI 爬蟲每日但只留七天、廣告收益的逐篇維度只留約二十天,於是有三個問題在結構上就問不出來——單篇三年的真實軌跡、這禮拜發生了什麼、這個月的變化是真變化還是季節性。結論是清洗的本質是判斷不是計算:三個來源都乾淨,問題出在它們要被放進同一句話,而程式不會報錯、報表照樣長出數字,唯一的守門是有人知道這兩個數字的出身不同。
- 資料真正的敵人不是髒而是對不齊:髒的資料看得出來,對不齊的資料每一筆都對、合起來卻是錯的
- 同一篇文章因換站台、網址格式、錨點等原因被機器認成多筆,成績被切成好幾份,排不進排行榜不是因為表現差而是被拆開
- 比率不能相加:兩天點擊率直接平均,在曝光量懸殊時會嚴重偏掉;正確做法是分子與分母各自加總後再除
- 資料層只存分子與分母、不存比率,因為比率一旦存起來遲早被拿去平均,而錯誤不會報錯、只會安靜躺在報表裡
- 不同切面的數字不能疊加:同一天按國家分與按裝置分各自都是一份完整的量,放進同一張表加總等於把那天算了兩次
- 各資料源的時間粒度與保留期不一致:搜尋到週且留十六個月、流量存月、AI 爬蟲每日但只留七天、廣告的逐篇維度只留約二十天
- 三個在結構上問不出來的問題:單篇三年的真實軌跡、這禮拜發生了什麼、這個月是真變化還是季節性
本篇目錄(7 節)
上一篇講了六路資料接起來會看到什麼。這一篇講的是接之前的那道工:為什麼原始數字不能直接拿來用。
先講結論:多數人以為資料的敵人是「髒」,其實真正的敵人是「對不齊」。髒的資料看得出來,對不齊的資料每一筆都對,合起來卻是錯的。
我遇到的問題分三種,一種比一種難發現。
第一種:同一篇文章,機器認得出三個不同的它
我這個網站換過站台,網址格式改過;有些連結帶標題,有些不帶;有些連結後面還掛著跳到某個小標的錨點。
對讀者來說這些全部是同一頁。對機器來說,那是三筆不同的紀錄。
EX:
原本文章網址是
domain.com?p=987
後來改為
domain.com/p/987
這種時候就必須要做資料清洗與合併,不然~~~
後果很直接:這篇文章的成績被切成三份。
單獨看每一份都不起眼,於是它在任何排行榜上都排不進去——不是因為它表現差,是因為它被拆開了。
這種髒是最容易發現的一種,因為只要有人手動去查一篇自己熟悉的文章,就會發現數字對不上。麻煩的是它會一直長出新的變體:每一次改網址、每一次搬家、每一次有人用不同方式連進來,就多一種寫法。
所以處理方式不是「清一次」,是在中間加一層翻譯:不管進來的是哪一種寫法,都先換算成同一個身分,再開始算。
這一層要是沒有,後面所有數字都在對不同的東西加總。
第二種:比率不能相加,所以我不把比率存起來
這一種開始反直覺了。
假設我想知道兩天平均的點擊率。
直覺做法是把第一天的點擊率和第二天的點擊率加起來除以二。這個算法在兩天的曝光量差不多時勉強可用,但只要一天曝光一萬次、另一天曝光十次,答案就會嚴重偏掉——那十次曝光的日子,在平均裡被當成和一萬次一樣重要。
正確做法是回到原始的分子和分母:兩天的點擊數加起來,除以兩天的曝光數加起來。
所以我在資料層只留兩種東西:分子(點擊、收益、次數)和分母(曝光、人數)。所有比率都不存,要看的時候現算。
這條規則寫下來的理由很現實:只要那個比率被存進某張表,遲早會有人(包括我自己,包括 AI)把兩列比率拿去平均,而且算出來的數字看起來很合理,沒有任何地方會報錯。錯誤不會跳出來,它會安靜地躺在報表裡。
同樣的道理延伸出另一條:不同切面的數字不能疊。同一天按國家分的數字是一份完整的量,同一天按裝置分的也是一份完整的量。把它們放進同一張表加總,等於把那天算了兩次。這種錯最難抓,因為總數看起來只是「比預期大一點」。
第三種:三個來源都很乾淨,但一個給你週、一個給你月、一個只留七天
這是最難的一種,也是我花最多時間的地方。
我手上的資料來源,時間刻度全都不一樣,而且不是我能決定的:
- 搜尋那一路,關鍵字層級最細只到週,而且只保留十六個月。
- 另一家搜尋引擎只給週,連國家都不分。
- 流量分析我存的是月。
- AI 爬蟲的紀錄是每日,但只保留七天,掉了就永遠補不回來。
- 廣告收益是每日,但「逐篇文章」那個維度只留大約二十天。
這幾行加起來的意思是:這些資料沒有一個共同的時間單位。
於是有些問題在結構上就問不出來。
第一個問不出來的是「這一篇三年來的真實軌跡」。它跨過網址改版,又撞上搜尋那邊十六個月的保留上限——網址可以靠翻譯層合併,但更早的那段資料根本不存在,任何工具都變不出來。
第二個是「這禮拜發生了什麼」。週資料最快也要等一週結算完才看得到;真正即時的只有 AI 爬蟲那一路,而它回答的是機器來過,不是人怎麼想。
第三個是「這個月的變化是真的變化,還是每年這時候都這樣」。要回答它得跟去年同月比,而那需要至少兩年的同源資料,我手上只有一路真的滿足。
所以清洗的本質是判斷,不是計算
如果清洗只是「把髒的洗掉」,那它是純技術工作,寫好程式就結束了。
但第三種問題不是髒。三個來源各自都完全正確、都很乾淨,問題出在它們要被放進同一句話裡。而「要不要放進同一句話、放進去之後這句話還能不能算數」,這件事沒有標準答案,是判斷。
舉個具體的:我想說「這篇文章這個月變差了」。搜尋那邊給我的是四個星期的資料,流量那邊給我的是一個完整日曆月,兩者的區間不一樣。要不要就這樣比?可以比,但結論只能說到「方向一致」,不能說到「掉了幾成」。
這個分寸沒有人會幫你把關。程式不會報錯,報表也會照樣長出一個數字。唯一的守門是有人知道這兩個數字的出身不同。
下一篇講另一件也常被誤會是純技術的事:電腦怎麼知道兩個寫法完全不同的詞,其實在問同一件事。
本文關鍵字:資料清洗、資料對齊、比率不可加、資料粒度、內容數據分析