Patrick Riley是Google Accelerated Science團隊的首席工程師和高級研究員,加入該團隊之前,他在谷歌的網絡搜索部門度過了12年 ,是谷歌搜索功能的重要開發者之一,他也在搜索日志收集和用戶行為分析方面做了大量工作。為了把這十幾年來總結的經驗分享給其他開發者,他特意撰文提出了一些分析大型復雜數據集的實用建議。
多年來,我帶領一個數據科學團隊負責處理谷歌搜索的服務器日志。我們經常會被要求用數據解釋一些奇怪的結果,用日志解釋新現象,測試其他同事的分析結果,或者衡量用戶的各種行為。有些人好像很擅長從事這種高質量的數據分析工作,其他同事也樂于評價他們為“謹慎的”“有條不紊的”。但這些形容詞實際上是什么意思呢?是什么為他們贏得了這些標簽?
為了找出答案,我之前整理了一份名為“優秀的數據分析”(Good Data Analysis)的共享文檔,并把它掛在了谷歌內部。出人意料的是,這份文檔的瀏覽量一路飆升,輕松打破過去11年來我在谷歌做的其他工作的閱讀記錄。即便是距離最后一次更新已過去4年的今天,還是有很多Google員工會經常去查看它。
為什么它會這么受歡迎,而且長盛不衰?我思考了很久,認為其中的主要原因是文檔不僅包含抽象的概念描述,更重要的是它非常具有實踐性。在工作中,我也的確發現許多同事汲取了其中的觀點,并出色地完成了各項任務。因此,我決定在這篇文章中分享其中的部分內容。
本文將分為以下三塊:
技巧:操作、檢查數據的想法和技巧。
處理:關于數據處理方法、檢查思路、檢查方向的建議。
社交:如何和他人合作并傳達自己的數據和見解。
技巧
觀察數據分布
雖然通常情況下我們一般用匯總度量(平均值、中位數、標準差等)來交流數據分布,但我們確實需要看到更豐富的分布表示。例如直方圖、CDF、QQ plot等可以更直觀地展示數據中是否有重要的有趣特征,而這些特征是我們分析多模式行為和總結重要異常值所必需的。
審視異常值
作為一名數據分析師,你應該注意查看數據中的異常值,它們就像過去被放進礦坑檢查毒氣的金絲雀,可以回答分析中的許多基礎問題。雖然把它們從數據中剔除出去,或者分類成一個特殊類別是一個好方法,但你也應該清楚之所以這樣做的理由。
例如我們可以通過查看點擊率(CTR)最低的詞條發現導致系統漏算點擊次數的一些元素,通過查看點擊率最高的詞條發現導致系統多統計點擊次數的設計漏洞。但另一方面,有些異常值是永遠無法解釋的,所以你要注意自己在上面花的時間。
報告噪聲
在開展數據工作前我們首先要明確一點,就是數據中存在隨機性,而且這種隨機性有時會欺騙我們。如果不夠小心,你很可能會把噪聲統計進結果里。因此對于自己得出的每一個估算結果,我們都要在心里掂量一下它的可信程度。有時候我們會要求更精準的分析結果(置信區間、P值、貝葉斯因子等),但有時我們的要求也會比較松。
例如當同事問你星期一公司收到了多少有關青蛙的搜索記錄,你就可以直接看下近幾周來各星期一的數據情況,做一個快速分析,然后跟他說“通常在一千萬到兩千萬之間”(不是實數)。
看示例
無論何時,如果你要生成新的分析代碼,你就肯定需要查看一些基礎數據的示例,以及如何用代碼描述、解釋數據的示例。如果沒有它們,我們幾乎沒法生成任何復雜的工作分析代碼。數據科學家的每一份分析報告其實就是在基礎數據上刪除大量功能后提取的高度凝練的摘要。只有通過查看完整示例,我們才能確信最后的這份總結是合理的。
為了防止分析結果過分側重于最普遍的情況,我們應該進行分層抽樣,以便在整個分布中獲得最好的樣本。例如如果你要計算用戶的點擊時間,你最好把所有可以看的樣本都看一遍,尤其關注其中的極端值。這就引出了另一個問題,如果你沒有處理數據用的合理的可視化工具,你最好先去弄一個來一勞永逸。
數據切片
這里的切片指的是把數據分類成組,然后在各子組中查看具體指標的值。在分析網絡流量時,我們通常會根據電腦端/移動端、瀏覽器、語言環境等把數據分成各個類別。有時同一種用戶現象在不同子組之間表現不同,這時我們就需要分門別類地分析數據。如果你覺得每次都分這么多類很麻煩,你也可以稍微選幾類橫向對比一下,確定不分類對分析結果不存在太大影響。當然,在某種情況下,某些子組也可能會有不良數據,或存在數據表達不完整、根本性質不同等問題。
當你確定要對數據分組后(如experiment/control、A/B),你最好注意一下mix shift帶來的影響。mix shift指的是各子組包含的數據量不同,而這會影響最終的分析結果,如辛普森悖論就認為在分組比較中都占優勢的一方,會在總評中反而是失勢的一方。所以如果要對比的兩個子組數據量相近,它們產生的結果是相對準確的。
考慮實際意義
在有大量數據的情況下,你可以把注意力集中在統計顯著性上,也可以深入研究每點數據的細節。但是你需要問自己:“即使X值只比Y值高0.1%,它也有那么重要嗎?”當你不能理解/分類部分數據時,這一點尤為重要。如果你無法理解我們日志中的某些用戶字符串,那么無論是10%還是0.1%,它都會對你的分析結果產生重大影響。
另一方面,有時你獲得的數據量很少,其中的許多變化看起來并不具有統計意義,但你又不能說它們是尋常現象,那這時你就要問自己:這些數據有多大可能是一個事實上的重大變化?
隨時間檢查一致性
在進行數據分類時,一個需要經常使用的重要指標是時間(我們常以幾天為單位)。這是因為隨著時間推移,許多潛在數據可能會干擾我們的分析結果。通常情況下,我們會仔細檢查功能的初始版本或初始數據收集,但這種情況并不罕見。
有時某一天或某一時刻會出現一個異常值,你要做的不是當即刪掉它,而是把它作為“魚餌”,去釣出導致這種現象出現的“魚”。查看日間數據的另一個好處是可以讓你掌握數據的變化,這也可以被作為驗證置信區間和統計顯著性的一個佐證。當然,它還是不能被用來替代置信空間計算的。
處理
獨立驗證、描述和評估
我認為探索性數據分析有3個相互關聯的階段:
驗證(初始數據分析):在我眼里,這些數據是否是自洽的、是否是被正確收集的,它們是否符合我的分析結果?像這類問題,我們一般會放在數據的完整性檢查中解決。常見的有:如果該功能的手動測試已經完成,我能看相關測試日志嗎?對于那個剛在移動端上線的功能,我的日志還把它歸于PC端嗎?
描述:這些數據客觀解釋了什么?例如“為什么用戶很少用7個單詞的組合進行搜索?”“為什么點擊后頁面加載時間慢了1%?”“為什么網頁的跳轉率會逐漸降低?”等。
評估:根據描述,這些數據是否反映了谷歌對于全球用戶而言所發生的變化?例如“用戶搜索結果更快了”“點擊質量更高了”等。
通過分離這些階段,我們能更輕松地和他人達成合作。對于數據描述,這應該是每個從業人員都能達成一致的事情,但共同評估卻會導致更多的爭論,因為我們每個人都對數據賦予了帶有自身觀點的意義和價值。如果不把描述和評估分離開來,那我們最終只能獲得自己希望得到的分析結果。此外,評估通常是一項更困難的任務,因為通過嚴格比較其他特征和指標來確定指標的規范價值通常需要投入大量資金。
雖然分離了,但這些工作的展開不會是線性的。當你探索數據時,很多時候你需要在各個階段間來回切換,但無論在任何時候,你都應該清楚自己這在做這三步里的哪一步。
確認測試/數據收集設置
在查看任何數據之前,請確保你了解測試的方法和數據收集的設置。測試者和分析師之間的溝通確實是一個很大的挑戰。如果你可以直接查看測試協議或配置,我建議你無論如何都去看看。如果不能看,那就寫下你對它的理解,然后向實驗者請教你的理解是否是正確的。
考慮到我們很可能會受異常/錯誤的配置和數量限制(例如僅針對特定瀏覽器的有效數據),所以這項工作可以為后期工作建立驗證理論,以下是兩個值得關注的點:
如果它是某個產品的功能,你可以自己先測試一下;如果不能,那你至少也要自己研究截圖和描述。
找找測試結束前發生的重大事件(假期、大型發布會等)。
檢查“生命體征”
驗證時,我們中的大多數人都熱衷于得出各類結論(如用戶是否用了我覺得很棒的新功能?),但在那之前,我們需要檢查很多其他可能與這些內容無關的東西,這些東西可以被用在以后的分析中,或者幫助直接指出數據中的問題。
用戶數量改變了嗎?之前導致錯誤點擊量統計的bug修好了嗎?錯誤率變化了嗎?就像醫生在做體檢時會不厭其煩地檢查你的身高、體重和血壓,這些都是衡量數據的重要標志,可以捕捉潛在的大問題。
這也是驗證非常重要的一個部分。
標準第一,自定義第二
這個強調的是工作應樹立一些不變的標桿,在查看新功能和新數據時,你可能會想添加一些相應的特殊指標,但在那之前,即便你期望做一些調整,你也應該先在標準指標的基礎上看一看。例如在向搜索頁面添加全新UI功能是,你應該先了解它對標準指標,如點擊結果的影響,然后再深入研究該為這個新功能設立什么標準、
這樣做是因為標準指標已經經歷過了很好的驗證,并且可能是更準確的。如果你的自定義指標對標準指標沒有意義,那么你的新指標很可能是錯誤的。
多次檢查
當你成功發現一個現象,尤其是發現一個新現象時,請試著用多種方法對同一基礎事物做多次衡量。然后再檢查這些結果是的否具有一致性。通過多次檢查,你可以找出日志代碼中的錯誤,發現基礎數據的意外功能或其他重要的篩選步驟。
如果你能用不同的數據源進行檢查,那樣的結果會更好。
檢查重現性
按時間分類數據和隨時間檢查一致性都是檢查重現性的一些特例。如果一個現象是重要而有意義的,那它應該可以在不同的用戶群和時間中被挖掘出來。但重現性意味著更多。如果我們正在構建數據模型,那我們會希望模型能在基礎數據的小擾動之間保持穩定。
模型能從時間分類數據和隨機子樣本中提取具有可靠性和可重復性的特征。如果它不可重現,那么可能是你并沒有捕獲到產生這些數據的基礎知識。
檢查與過去統計結果的一致性
在工作中,你常常會需要計算一個與過去已經計算的某個度量相似的東西。這時你應該將新的指標與過去報告的指標進行比較,即使這些指標針對的是不同的用戶群體。例如,如果你正在統計特殊人群的搜索量,并且你得到的數字比普遍接受的數字大得多,那么你就需要進行調查。你的人數統計可能針對這個人群是正確的,但現在你必須做更多的工作來驗證這一點。
你統計的是同一個東西嗎?你有什么證據證明前后兩個統計數據的差別?你可以不給出確切的結論,但你得自圓其說。如果你做不到,那你就得假設自己是錯的,然后找出說服自己的理由。這類天差地別的數據更多的時候只是個錯誤,而不會是天方夜譚般的新見解。
同樣的,新的指標應該先應用于舊數據/功能。當你根據新結果提出新指標后,因為你不知道指標正確與否,所以你要把它放到舊數據上重新驗證。
提出假設并尋找證據
通常,針對復雜問題的探索性數據分析是迭代的。當你發現數據中的異常情況、趨勢或其他特征,你會做出假設來解釋這些現象。在這里,最重要的不是做一個假設,然后宣布假設為真,而是找出證據來確認/否定這一理論。例如你認為某地區的搜索量異常是因為谷歌在該地新推出的功能導致的,那你就得證明該功能的目標用戶是唯一導致異常結果的人群。或者,至少證明這個異常值和功能發布的預期值基本一致。
良好的數據分析就像是講故事。為了確保故事的真實性,你要一般講一變從故事中預見未來,在這個過程中,你要反復問自己:我會做什么樣的實驗來驗證這個分析?即使最后你沒有做這些實驗,它們也會給你帶來一些啟發性的思路。
這時你理解的不僅僅是當前的一堆數據,還有各位為未來分析準備好的新的度量和技術。
使分析結果從分析迭代中受益
在進行探索性分析時,你應該盡可能多地進行整個分析的迭代。通常情況下,你需要完成數據收集、處理、建模等多個步驟。如果這些工組花費太長時間,那么你就錯過了在相同時間內獲得更多次迭代的機會。
此外,當你最終看到你的數據時,你可能會有不一樣的發現。因此你的初始關注的不是完美的,而只是合理的。為自己留下筆記,并再次關注過濾步驟和數據記錄等無法解析/理解的內容,你會看到不一樣的世界。
社交
數據分析從問題開始,而不是數據或技術
當你做數據分析時你應該有一個目標。如果你把自己的需求作為問題,那你就要確保自己正在收集目標數據,而且這數據對你的需求會很有幫助。你的問題可以,也應該隨著數據的發展而發展,但缺乏目標的分析是毫無意義的。
此外,千萬不要因為你喜歡某些技術就陷入陷阱,然后只找出有關于這個技術的部分問題。
數據過濾
幾乎每個大數據分析都是從不同階段的過濾數據開始的。無論你想過濾什么,你都應該考慮這兩個因素:
確認并明確你在過濾什么;
計算每次要過濾多少。
對于第二條,通常最好的方法是實際計算包括過濾目標在內的所有指標,然后結合數據來進行排除。此外,查看過濾掉的數據對分析也很有意義,因為你可能會“意外”地在里面找到不少“良好”數據。
比率應該有明確的分子和分母
在數據分析中,基礎指標的比率往往是最有趣的,但很多數據科學家往往會忽視這一點,然后給出一些含糊不清的結論。例如“網站在搜索結果中的點擊率”,它到底是“網站點擊/該網站的點擊結果”,還是“搜索結果頁面點擊/顯示該網站搜索結果頁面的點擊結果”?
如果你要和人交流,你就必須講清楚這一點,不然別人沒法比較以前的指標并給出正確解釋。
解釋你的專業用語
因為工作上的原因,你會經常需要把分析和結果呈現給沒有數據背景的人看,他們中的一部分也許看得懂數據,但也有一部分人是看不懂的,甚至大多數人沒法理解你口中的置信區間是什么意思,也不能理解你的統計方法究竟有多可靠。
這時你被誤解的風險就很大,所以為了工作的順利開展,你有責任提供數據的背景和全貌,并給出盡可能易于理解的表達。
懷疑論&支持者
在處理數據時,你必須既是自己分析結果的支持者,也是一個懷疑論者。每一個數據分析師都希望自己能從數據中找出一些有趣的現象,當你得到這種現象時,你不應該沾沾自喜,而應該問自己“我可以用哪些數據來支持這個結論?”“我可以用哪些方法來推翻這個結論?”。特別是你覺得自己很想得到這個特定結論時,你必須發揮懷疑態度以避免犯錯誤。
和外行人分享結果
熟練的同行評審員可以提供質量不同的反饋和完整性檢查,但外行人不行,外行人更傾向于判斷你的結果是否符合他們的明確標準。理想情況下,你也許有一位不太懂數據的同事,他可以為你提供一些非常有價值的建議。這些建議不僅能讓你對自己的結果進行反思和檢查,還能迫使你把一切做得盡善盡美。
在早期,同行的幫助是很有用的;但越到晚期,他們就越容易產生一些古怪的分歧。
期待并接受無知和錯誤
我們可以從數據中學到很多。Nate Silver在“信號與噪音”中做了一個強有力的例子,只有當我們愿意承認自己能力的極限,我們才能在更好地在分析工作中取得進展。承認無知是一種力量,它通常不會立即得到回報,而且當場感覺很糟糕,但最終會幫助我們贏得同行和領導的尊重。
當你沒能及時發現自己的錯誤時,你會很沮喪,,但你要做的主動接受錯誤并把它作為自己今后信譽的保障,可信度才是數據科學家最關鍵的社會價值。
最后的話
即便我們做到了這24點中的任意一點的,在數據分析這條路上,大家所要面對的困難還有很多。當你把這些想法應用于實際問題時,你會自然在自己的領域生成最重要的習慣和技巧。請分享你的經驗和心得,幫助更多人成為更好的數據科學家!
-
數據分析
+關注
關注
2文章
1427瀏覽量
34015 -
數據集
+關注
關注
4文章
1205瀏覽量
24644
原文標題:谷歌首席工程師:對大型復雜數據進行分析的實用建議
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論