時(shí)間圖:長時(shí)間內(nèi)離散事件的可視化
在我們的日常生活中離散事件無處不在。比如通話記錄、網(wǎng)上交易和心跳數(shù)據(jù)。盡管離散事件的數(shù)據(jù)比較單一,但是在保留細(xì)節(jié)信息的前提下,對長時(shí)間內(nèi)的離散事件進(jìn)行可視化處理還是挺困難的。
下圖闡明了這個(gè)問題。該圖描述了七個(gè)月內(nèi)某一IP地址的網(wǎng)站訪問量。它是利用離散事件數(shù)據(jù)所繪制的。其中每個(gè)直方柱的高度代表每個(gè)時(shí)間點(diǎn)上事件發(fā)生的次數(shù)。
當(dāng)此圖涵蓋了所有事件的信息時(shí),每個(gè)時(shí)間點(diǎn)上的細(xì)節(jié)信息則完全被忽略。人們總是可以對條形圖進(jìn)行一定比例的放大后再次繪圖,但是問題就來了–我們應(yīng)該選擇多大的縮放比例呢?我們應(yīng)該考察哪個(gè)時(shí)間段的信息呢?比如,如果我們想放大到間隔為一天的水平,那么我們大致需要觀察210天的信息。而且在不同的縮放級別中尋找匹配值和異常值是非常耗費(fèi)時(shí)間的。
在這篇博客中,我將會介紹如何在一張圖中對長時(shí)間內(nèi)離散事件的數(shù)據(jù)進(jìn)行可視化處理的方法。不管面對的是毫秒級還是月度數(shù)據(jù),它都允許讀者從圖中快速地識別出關(guān)鍵信息。該方法出自于混沌系統(tǒng)領(lǐng)域,它起先是用于研究滴水時(shí)間的問題。這個(gè)可視化方法擁有許多不同的名字:延遲映射圖、復(fù)原時(shí)間圖和時(shí)間-時(shí)間圖。為了簡潔起見,我把它稱為“時(shí)間圖”。盡管人們早就利用時(shí)間圖對混沌系統(tǒng)進(jìn)行可視化處理,但它還沒被應(yīng)用到信息科學(xué)領(lǐng)域中。我將會展示時(shí)間圖是如何提供關(guān)于推特賬號行為和網(wǎng)絡(luò)機(jī)器人程序活動的寶貴信息。
這篇博客雖然篇幅短,但是包含了幾個(gè)略微不同的案例。這篇文章已經(jīng)被 2015 年 IEEE 大數(shù)據(jù)會議所接收。本文結(jié)尾部分附帶了如何制作時(shí)間圖的 Python 代碼。
制作時(shí)間圖非常簡單。首先,想象時(shí)間軸上一系列用點(diǎn)表示的事件。每個(gè)事件之間的時(shí)間間隔用標(biāo)簽 t1 ,t2 ,t3 ,t4 ,…所表示。
時(shí)間圖可以簡單看成二維散點(diǎn)圖,其中事件的坐標(biāo)分別為(t1, t2),(t2, t3),(t3, t4)等。在時(shí)間圖上,紫色點(diǎn)事件將被畫在圖中所示的位置。
換句話說,散點(diǎn)圖中的每個(gè)點(diǎn)都代表一個(gè)事件。其中橫坐標(biāo)表示這個(gè)事件和前續(xù)事件之間的時(shí)間間隔,縱坐標(biāo)表示與后續(xù)事件之間的時(shí)間間隔。因此時(shí)間圖中無法表示第一個(gè)事件和最后一個(gè)事件。
下圖是兩個(gè)簡單的例子:
等間距事件序列(A)的時(shí)間圖中只有一個(gè)有效點(diǎn),因?yàn)樗惺录淖鴺?biāo)完全相同。序列 B中除了一個(gè)事件略有延遲以外,它與序列 A 是一樣的。由此產(chǎn)生的時(shí)間圖包含四個(gè)有效點(diǎn),這使得讀者可以更直觀地觀察事件的變化。除非選擇很小的直方柱,否則這兩個(gè)序列隨時(shí)間變化的直方圖將是完全相同的。
為了得到更直觀的時(shí)間圖,我們考慮一個(gè)分為四個(gè)象限的啟發(fā)式圖:
每個(gè)象限中是一張沿著時(shí)間軸的事件序列圖。其中右上角和左下角象限中包含的是等間距事件,因此這兩個(gè)象限中的事件是“穩(wěn)定的”。又因?yàn)樽笙陆窍笙拗惺录g的時(shí)間間隔較小,我們稱它為“快而穩(wěn)”事件,并稱右上角象限中的事件為“慢而穩(wěn)”事件。對于右下角象限而言,一個(gè)事件發(fā)生之后,需要較長的等待時(shí)間然后兩個(gè)事件再接連發(fā)生,因此我們稱之為“加速”事件。左上角象限的事件則剛好相反,此象限中的事件為“慢化”事件。查看時(shí)間圖有點(diǎn)像閱讀新城市的地圖。即使起初的時(shí)候不熟悉,最終你還是會得心應(yīng)手。
因?yàn)闀r(shí)間圖只繪制事件之間的時(shí)間間隔,所以它解決了長時(shí)間維度的問題。為了防止時(shí)間間隔的數(shù)量級太大,我們以對數(shù)刻度繪制坐標(biāo)軸。這允許讀者可以在一張圖中看到小至毫秒大至月份的不同時(shí)間尺度展示。讓我們來看一些真實(shí)世界的案例吧!
@白宮 推文
推特的 API 允許人們收集用戶最近發(fā)送的 3200 條推文。利用 Twython,我下載了 @白宮 (這個(gè)賬號由總統(tǒng)的員工所管理) 的推文。下圖是 2015 年 1 月到 9 月之間 @白宮 推文的時(shí)間圖:
每條推文都用基于時(shí)間的顏色編碼,而且時(shí)間軸已經(jīng)經(jīng)過對數(shù)化處理。按照推文結(jié)果,圖中的兩個(gè)聚類群對應(yīng)于工作日的開始和結(jié)束。每天的第一條推文通常發(fā)生在早上九點(diǎn)和中午之間。而最后一條推文的發(fā)生時(shí)間則比較廣泛。
有趣的是,上圖中存在兩個(gè)代表不同行為模式的聚類群。我將聚類群一命名為“日常事務(wù)”,其中人們大約一小時(shí)發(fā)送一條推特。位于圖中左下角區(qū)域的推文具有頻率高的特點(diǎn),我們稱之為“重要事件”。
由于時(shí)間圖中很難計(jì)算出每個(gè)聚類群中包含多少樣本點(diǎn),而“熱感時(shí)間圖”可以用紅色來表示密度較高的點(diǎn)。
在熱感時(shí)間圖中,我們可以觀測到孤立的樣本點(diǎn)。額外的好處是我們還可以看到樣本點(diǎn)的聚集情況。從上圖可以看出,“日常事務(wù)”聚類群中的推文數(shù)量最多,這從側(cè)面驗(yàn)證了我們稱其為日常事務(wù)的合理性。
#p#
個(gè)人賬戶的推文情況
@白宮 是由公關(guān)人員管理的推特賬號。那么個(gè)人推特賬號的情況是啥樣的呢?尼古拉斯·菲爾頓是一名從事信息可視化的平面設(shè)計(jì)師。他的工作包括年度報(bào)告,該報(bào)告利用他生活中的數(shù)據(jù)繪制平面圖形。下圖是關(guān)于他推文的熱感時(shí)間圖:
該圖中沒有像 @白宮 所展示出來的明顯聚類情況。與公共賬號不同,個(gè)人賬號的推文通常沒有一個(gè)嚴(yán)格的時(shí)間表。然而,時(shí)間圖仍然捕捉到了總體的趨勢情況。大量的樣本點(diǎn)落在“慢而穩(wěn)”事件的區(qū)域中,而且這些推文差不多每天發(fā)送一次。
網(wǎng)絡(luò)機(jī)器人
網(wǎng)絡(luò)機(jī)器人是在網(wǎng)頁上執(zhí)行自動運(yùn)行任務(wù)的計(jì)算機(jī)程序。當(dāng)用戶點(diǎn)擊特定的鏈接時(shí),機(jī)器人在無意中被安裝到數(shù)以百萬計(jì)的個(gè)人電腦中。當(dāng)你讀這句話的時(shí)候,機(jī)器人甚至可以操控你的電腦!我分析了一個(gè)來自提供網(wǎng)站監(jiān)控服務(wù)公司的數(shù)據(jù)。于是,我得到了博客開頭所展示的那張圖:
這幅圖展示了來自一個(gè)特定 IP 地址的網(wǎng)站訪問量(這里提到的 IP 地址不同于我的論文中說所提到的 IP )。盡管直方圖確實(shí)包含了整體行為的重要信息,但讓我們來看看時(shí)間圖所展示的信息:
上述的直方圖無法展現(xiàn)出這些活動模式的信息。通過繪制時(shí)間圖,一些重要信息馬上顯現(xiàn)出來:一大塊“快而穩(wěn)”事件點(diǎn),兩個(gè)條形區(qū)域點(diǎn)分別代表“加速”和“慢化”事件,而且在這兩個(gè)區(qū)域上面還存在一些稀疏的點(diǎn)。
右下角和左上角區(qū)域的稀疏點(diǎn)代表在高頻率活動事件之間的長休眠期中所發(fā)生的事件。這和直方圖中的長間隙結(jié)果一致。條形區(qū)域中的事件發(fā)生在兩次高頻率活動爆發(fā)期之間的八分鐘間歇期。高頻率爆發(fā)期如左下角的大塊區(qū)域所示,這表示網(wǎng)站被接二連三地訪問。爆發(fā)期是否存在可以通過檢查極度放大的直方圖來證實(shí):
正如我們所料,確實(shí)存在相隔大約為八分鐘的爆發(fā)期。盡管放大后的直方圖所涵蓋的信息與時(shí)間圖一致,但是誰會想到把直方圖放大到這個(gè)水平呢?!時(shí)間圖可以立即顯現(xiàn)出機(jī)器人定期的高頻行為,而且和直方圖不同的是,時(shí)間圖不需要進(jìn)行放大處理。
利用 Python 繪制時(shí)間圖
下面是繪制時(shí)間圖的一個(gè)簡單 Python 程序。它是基于隨機(jī)生成的數(shù)據(jù)來繪圖的。
現(xiàn)在讓我們來繪制熱感時(shí)間圖吧。它利用上述代碼來構(gòu)建程序??偟膩碚f,我們需要構(gòu)建一個(gè)用來計(jì)算時(shí)間圖中每個(gè)網(wǎng)格內(nèi)所發(fā)生事件數(shù)的二維直方圖。直方圖被當(dāng)成圖像來對待,然后我們將高斯模糊方法(Gaussian blur)應(yīng)用到圖像中,這可以對突變事件進(jìn)行平滑處理。
下載推文和繪制時(shí)間圖的 Python 文件可以在我的 github 界面中找到。
結(jié)論
我上面提到了用來演示時(shí)間圖勘探價(jià)值的三個(gè)例子。在所有的例子中,時(shí)間圖可以立即展現(xiàn)出潛在的信息,而直方圖卻需要更多的時(shí)間來挖掘這些信息。盡管如此,時(shí)間圖確實(shí)無法替代其他的時(shí)間可視化工具,它們之間是互補(bǔ)關(guān)系。最好的視覺探索工具同時(shí)需要時(shí)間圖和其他圖形。例如,時(shí)間圖和直方圖都展現(xiàn)了數(shù)據(jù)的重要信息,它們應(yīng)該相互配合使用。
畢加索畫圖的時(shí)候通過將多重視角下的信息綜合到同一張圖中以獲取物品的完全信息。相似地,時(shí)間圖在一張圖中從多個(gè)時(shí)間角度提取數(shù)據(jù)集的信息。鑒于其具有容易實(shí)現(xiàn)和發(fā)現(xiàn)隱藏信息的能力,在我們這個(gè)數(shù)據(jù)驅(qū)動的社會中時(shí)間圖應(yīng)該成為一個(gè)非常寶貴的工具。