許多年來,我一直領導谷歌搜索日志的數據科學團隊。經常需要我們對一些亂七八糟的結果來賦予意義,對日志記錄的操作來挖掘新現象,驗證別人的分析,以及用于解釋用戶行為的度量指標。有些人似乎天生就擅長做這種高質量的數據分析。這些工程師和分析師常常被描述為“謹慎”、“有技術”。但實際上這些形容詞是什么意思?您怎么做才能贏得這些標志?
為了回答這些問題,我將Google公司的經驗整理進一篇文檔,并得意地將他簡單命名為“好的數據分析”。令我驚奇的是,這篇文檔比我在谷歌過去十一年做的其他任何文檔的閱讀量都高。在上次大改版之后的四年時間里,每次檢查的時候,我甚至發現有許多Goolge員工翻看它。
為什么經過這段時間,這個文檔使那么多人產生共鳴?我認為最主要的原因是全文都是關于具體的可以實施的方案,不只是抽象的理想。我見過許多工程師和分析師養成了這些(文中涉及的)習慣,并進行高質量的工作。我將在這個博客中分享那篇文檔的內容。
建議總結起來,分為三大類:
技術:如何操作和檢測數據的思想和技術。 過程:一些建議,關于怎樣處理您的數據,應提出怎樣的問題,還有一些需要檢查的事情。 溝通:如何與他人合作及交流,關于您的數據和見解。
技術
看看你的數據分布
雖然我們一般會使用總體度量(均值、中值、標準差,等等)和人交流數據分布,但是您應該常常關注分布的更豐富的表示形式。直方圖、累積分布函數(CDFs)、Q-Q圖,諸如此類給予您了解是否存在重要有趣的數據特征,如多模態行為或是一個明顯的異常類,您需要決定如何總結它們。
考量異常值
您應當關注您數據中的異常值。它們會成為煤堆中的金絲雀,是您的分析所暴露的更基本的問題。從您的數據中將他們排除,或把它們放在一起形成一個“異常”類別,這樣做可以,但您應該確保您知道為什么一些數據最后被放在這一類。例如,點擊率(CTR)最低的查詢,可能顯示了在用戶界面中有一些點擊元素是您無法統計的。點擊率最高的查詢,可能又會反映了您不應統計的點擊。另一方面,一些異常值是您永遠無法解釋的,所以這里投入多少時間您需要特別留意。
報告噪音或者置信度
首要的是,我們必須意識到存在隨機性,這很坑。如果您不小心,您發現的模式就混著噪聲。每個您生成的估計量,您應當附上估計的置信度。有時這可以相當正式和精確(采取一些測量方法,如估計量的置信區間或可信區間,以及結論的p值或貝葉斯因子),有時也沒那么嚴格。例如,假如一個同事問您,多少查詢關于周一我們獲得的青蛙數量,您可能會做一個快速分析,看了兩個星期一就報告“通常介于1000萬到1200萬”(而不是真實數字)。
看實例(這里的實例指數據的實際情況)
當您在編寫新的分析代碼,您需要看下這些底層數據的實例,您寫的代碼是如何解釋這些實例的。不這樣做,要用的分析代碼復雜一些您基本上就寫不出來了。您的分析能從底層數據挖出許多特征,并梳理成有用的總結。通過查看個體實例的全部復雜情況,您會得到合理的總結,從而信心百倍。
您應該做分層抽樣,在整個分布中都得到采樣,這樣就不會只集中在最普遍的例子上。
舉例來說,如果您要計算“點擊時間”(TimetoClick),確保您能看到整個分布的實例,特別是極端情況。如果您沒有合適的工具或者可視化方式來查看您的數據,您需要先完成這個。
劃分數據
這里的劃分意味著將數據劃分為不同的子集,分別看下在這些子集中您測到的值。在網站流量分析中,我們一般按照一些維度來劃分,如“移動端還是桌面端”、“瀏覽器種類”、“所在地”等等。如果底層現象可能在子集之間以不同的方式工作,您必須劃分數據看看是否是這樣。即使您不期望一段數據能有什么用,看下幾個段之間的內部一致性(譯者注:原本是一列數據,但是被劃分到不同子集中),如果您測量的是正確的東西,那也帶給您更大的信心。在某些情況下,個別子集可能存在壞數據、損毀的記錄,或者在某種程度上是完全不同的東西。
每次您劃分數據來比較兩組(比如實驗組/控制組,但即使是時間A與時間B的比較),您都需要注意混淆的遷移(mixshift,譯者注:按照下文辛普森悖論的推論,這里指原本存在某種特征的兩個組,分別討論時存在這種特征,但是兩組混在一起時這種特征卻消失)。混淆的遷移出現在當每段的數據量在各比較組之間不同的時候。這可能是辛普森悖論和其他混淆導致的。一般來說,如果在您的兩組中,一段的數據量是大致相同的,您可以放心進行比較。
考慮實際意義
有大量數據的話,只關注統計學意義,或處理每一小組數據的細節,都是十分誘人的。但是您需要反問您自己,“如果X的值確實比Y的值多0.1%,這有影響么?”這可能特別重要,如果您不能很好理解或是歸類您的部分數據。如果您不能理解我們的日志中的一些用戶代理字段,不管它是0.1%還是10%有很大的差異,取決于多大程度上您要研究這些案例。
另一方面,您有時會有一個較小的數據集。許多變化達不到統計學顯著意義,可是又不同于說這是“中性”。您必須問自己“實際上仍然具有顯著性變化的可能性有多大”?
檢查經過時間后的一致性
您應該總是使用的一種特定劃分方法,就是以時間為單位劃分(我們經常使用的是日期,但其他單位可能也行)。這是因為許多基礎背后的干擾因素系統隨時間演進而產生的。通常一個特征或初始數據集的初始版本將會受到仔細的檢查,但是依這種方法繼續,出現例外并不罕見。
僅僅因為某一天或某些天出現異常,并不意味著您應該舍棄它。在您丟棄之前,使用這個異常數據作為一個鉤子,找到為什么這天出現異常的原因。
看這種“一天又一天”的數據的另一個好處是,它給您數據不斷變化的感覺,最終將形成一個置信區間或聲明其統計學顯著性。這通常不能取代嚴格的置信區間計算,但僅從“一天又一天”圖表中您往往可以看到統計顯著的大致變化。
過程
分開驗證、描述、評估
我認為探索性數據分析有三個相互關聯的階段:
驗證或初步數據分析:我是否相信數據是自我一致的(self-consistent),是否采用正確的數據收集方法,我認為這些數據代表什么?這通常叫做“健康檢查”。例如,如果完成了手動測試某種特征,那么我可以看看手動測試的日志嗎?移動設備功能推出的特性,日志是否記錄了臺式機也存在這種特性?
描述:這個數據的客觀解釋是什么?例如,“用戶很少用7字查詢這些數據嗎?”,“點擊頁面加載的時間(這里經過點擊后)超過1%”,還有“進入下一個結果的頁面的用戶比例更小。”
評估:鑒于描述,數據告訴我們,對于用戶、對于谷歌、對于世界一些好事將會發生嗎?例如,“用戶可以更快找到結果”或“點擊質量更高了”。
分成這些階段,您可以更容易地與他人達成共識。描述應該是每個人都能從數據達成一致的事情。評估可能會存在更多的爭議,因為您對數據灌輸了一些意義和價值。如果您不把描述和評價分開,您更有可能只看到您希望看到的數據解釋。此外,因為要建立規范的測度值,通常是通過與其他特征和測量進行嚴格的比較,需要大量的投入,評估往往會更加困難。
這些階段不是按順序遞進的。當您要探索數據,您可能在這些階段之間反復,但在任何時候您應該清楚您處于什么階段。
確認實驗及數據收集的建立
看任何數據之前,確保您了解實驗和數據收集的設置。實驗者和分析師之間交流融洽,是一個巨大的挑戰。如果您能直接看到實驗協議或配置,那您就應當這樣做。否則,寫下您自己理解的設置,確保負責采數據的人能明白它的正確性。
您可能會發現不正常或不好的配置,或樣本集的限制(如僅在一個特定的瀏覽器下能得到有效數據)。這里提到的可能會幫助您構建并驗證理論。下面一些方面需要考慮:
如果它是一個產品的特征,那么就要試著找出它。如果不能,至少要看行為的截圖或是描述;
尋找任何實驗運行時間內的不尋常事件(假期、大新聞的發布,等等)。
檢查關鍵標記
在真正回答您感興趣的問題之前(例如,“用戶使用我厲害的新功能了嗎?”),您需要檢查大量的相關事宜,這些可能不是您感興趣的,但這可能對以后的分析或指出數據的問題是很有用的。用戶數量變化了嗎?受影響查詢數量是否正確得顯示在我所有的子組當中?出錯率變了嗎?就像您的醫生每次總是檢查您的身高、體重、和血壓,檢查您的生命體征數據是否潛在大問題。這是一個“驗證”階段的重要組成部分。
標準化第一,個性化第二
這是一個不容改變的檢查規則。特別是當看到新特性和新數據的時候,那么用新的或特別的測量這個新特征的方法往往很誘人。但是您應該先看看標準測量方法,即使您希望改變他們。例如,當添加一個全新的UI特征來搜索頁面,您應該確保您先理解標準測量,比如結果的點擊數的影響,然后對這個新的UI功能采用特別的測量方法。您這樣做是因為標準測量更加有效,更可能是正確的。如果您的新、自定義的測量與標準的測量不一致,那這個測量很可能是錯的。
測兩遍,甚至更多
尤其是如果您想要捕捉一個新現象,試圖用多種方式測量同樣的底層數據。然后,檢查這多個測量結果是否一致。通過使用多種測量,您可以鑒別測量或日志記錄代碼中的錯誤,底層數據的意外特征,或過濾出一些重要的步驟。如果您用這些測量方法測量不同的數據源,那將更好。
檢查再現性
分割和一致性隨著時間的推移是檢查再現性的特定例子。如果一個現象是重要的和有意義的,你應該看到它穿過不同的用戶群體和時間。但再現性意味著比這更好。如果您正在構建數據模型,則希望這些模型在基礎數據中的小擾動上保持穩定。使用不同的時間范圍或隨機的子樣本的數據將告訴你這個模型如何可靠/可重復。如果它是不可重復的,你可能沒有捕捉到一些產生了這個數據基本的過程。
檢查與過去測量的一致性
通常你會計算一個與過去被用來計數相似的指標。你應該比較你的指標和在過去報告中的指標,即使這些測量是在不同的用戶群。例如,如果你正在測量特殊人群的搜索量,并且測量值比普遍接受的數字要大得多,那么你需要調查。你的數字可能是正確的,但現在你必須做更多的工作來驗證這一點。你在測量同樣的東西嗎?是否有一個合理的理由相信這些人群是不同的?你不需要完全一致,但你應該在同一個變動范圍。如果你不是,假設你是錯誤的,直到你可以充分說服自己。最令人驚訝的數據將變成一個錯誤,而不是一個極好的新的洞察。
新的指標應該首先適用于舊的數據/特征。
如果你收集了全新的數據,并嘗試學習新的東西,你不會知道你是否回答正確。當你收集一種新型數據時,您應該首先將此數據應用到已知的特征或數據。例如,如果你有一個對用戶滿意度的新標準,你應該確保它告訴你幫助滿意的最好特征。這樣做對你后面學習新的東西提供了驗證。
提出假設和尋找證據
通常情況下,一個復雜問題的探索性數據分析是迭代的。您將發現數據的異常、趨勢或其他特征。很自然地,你會提出假設來解釋這個數據。這是必要的,你不只是做一個假設,并宣布它是真實的。尋找證據(內部或外部的數據)來證實/否定這一理論。例如,如果你相信一個異常是由于一些其他特征的推出或在加德滿都(尼泊爾首都)度假,確保人口特征的推出是唯一一個被異常影響地。另外,確保更改的大小與推出的預期一致。
良好的數據分析將會告訴你一個故事。為了確保這是一個正確的故事,你需要告訴自己這個故事,還預測了什么你應該在數據中能看到的,如果假設是真的,然后尋找證據表明它是錯誤的。這樣做就是問自己,“什么實驗會讓我講的故事變得有效/無效嗎?“即使你不做這些實驗,它也許可能會給你如何驗證你已有的數據的想法。
好消息是,這些假設和可能的實驗可能會引導超越試圖了解任何特定的特征或數據的新查詢線。然后,您進入理解的領域,不只是這個數據,而產生能夠用于未來各種分析的新指標和技術。
從端到端迭代獲益的探索性分析
在做探索性分析時,你應該努力得到盡可能多的對于整體分析的迭代。通常情況下,你會有多個步驟的信號采集,處理,建模等。如果你在獲得初始信號完美的第一階段花太長時間,你將錯過在相同時間里獲取更多迭代的機會。此外,當你最后觀察你結束時的數據,你可能會發現改變了你的方向。因此,你最初的重點不應該是完美,而是一路得到合理的東西。給自己留筆記,并承認像過濾步驟和數據記錄這樣你不能分析/理解的東西,但所有在探索性分析開始時試圖擺脫這些就是在浪費時間。
溝通
數據分析從問題開始,而不是數據或技術
總是有一個你要做一些分析的理由。如果你花時間來把你的需求化為問題或假設,它會是一個很長的路來確保你收集你應該收集的數據,并且你正在思考數據中可能存在的空白。當然,你問的問題可以和應該演變因為你在觀察數據。但不帶問題的分析會終止地毫無目的。
此外,你必須避免找到一些最喜歡技術的陷阱,并隨后只發現這些技術工作部分的問題。再次,確保你是明確問題是什么將幫助你避免這個問題。
注意到并計數你的過濾
幾乎每一個大的數據分析通過過濾在不同階段的數據開始。也許你只想考慮美國用戶,或網絡搜索,或結果點擊的搜索。不管是什么情況,你必須:
承認并明確指定你在做什么樣的過濾 計數在你的每一個步驟中有多少是被過濾
通常最好的方法來做后者實際上是計算所有你的指標,即使對你不包括的人口。然后你可以看看這些數據回答了像“查詢中哪部分被我的過濾刪除了?“的問題。
此外,尋找哪些被過濾了的例子對過濾步驟是必不可少的并且對您的分析是新穎的。當你制定一個簡單數據排除規則的時候,很容易不小心包括了一些“好”的數據。
比率應該有明確的分子和分母
許多有趣的指標是潛在測量們的比值。不幸的是,你的比值是什么往往是模糊的。例如,如果說一個網站上搜索的結果的點擊率,它是:
“點擊網站的次數/那個網站結果的數量 “點擊該網站的搜索結果頁面的數量“/”網站顯示的搜索頁面數量
當你交流結果時,你必須清楚這一點。否則你的觀眾(和你!)將有與過去結果進行比較和正確解釋一個指標的麻煩。
教育你的消費者
你經常會向那些不是數據專家的人展示你的分析和結果。你工作的一部分是教育他們如何解釋和從你的數據中得出結論。這可以達到各種目的,從確保他們理解置信區間到為什么某些測量在你的定義域里是不可靠的,到什么樣的典型影響大小是“好”和“壞”的變化,到了解樣本偏差效應。
當你的數據具有較高的被曲解或選擇性地列舉的風險時這一點尤其重要。您負責提供上下文和一個完整的數據圖片,而不僅僅是消費者要求的數字。
同時做懷疑者和擁護者
當你處理數據時,你必須做一個獲得見解的擁護者以及一個懷疑論者。你會希望在你觀察的數據中發現一些有趣現象。當你發現一個有趣現象,你應該問:“我能收集到什么其他數據顯示這有多么了不起?”和“我能找到什么來使它無效?“。尤其是你為真的想要一個特定回答的某人做分析的情況下,(例如“我的特征是了不起的”)你要扮演懷疑者來避免犯錯誤。
與同行分享第一,外部消費者第二
一個熟練的同行評審可以比你數據的消費者提供更有質量不同的反饋和健全的檢查,特別是因為消費者通常有一個他們想得到的結果。理想的情況下,你會有一個知道你正在尋找的數據的同行,但即使是一個有這樣觀察數據經驗的同行,大體上是非常有價值的。以前的觀點提出了一些方法來讓自己做正確類型的健全檢查和驗證。但與同行分享是迫使自己做所有這些事情的最好方法之一。同行在多維分析是有用的。在初期你能找到你的同伴所知道的事情,得到建議測量什么東西,和過去有哪些在這方面的研究。臨近結束時,同行很善于指出古怪、不一致,或者其他的困惑。
預期和接受無知和錯誤
我們能從數據中學到的東西有十分有限。NateSilver在信號和噪聲中指出,只有承認我們對于確定的限制,我們才可以取得更好的預測。承認無知是一種力量,但它通常不會立即得到回報。在當時會感覺很糟糕,但最終你會贏得你有數據頭腦的同事和領導人的尊重。當你犯了一個錯誤,并很晚發現(或太晚了!)會感覺更糟糕,但積極地承認你的錯誤將轉化為信譽。信譽是任何數據科學家的關鍵社會價值。
最后的想法
沒有什么縮減的建議列表可以是完整的,即使當我們突破了前10名列表格式的障礙(對沒有計算的你們,這里有24個)。當你將這些想法應用于實際問題時,你會發現在你的領域中最重要的習慣和技術,幫助你快速而正確地做這些分析的工具,以及你放在這個列表上的建議。確保你分享你所學到的東西,所以我們都可以成為更好的數據科學家。