在我们的日常生活中离散事件无处不在。比如通话记录、网上交易和心跳数据。尽管离散事件的数据比较单一,但是在保留细节信息的前提下,对长时间内的离散事件进行可视化处理还是挺困难的。
下图阐明了这个问题。该图描述了七个月内某一IP地址的网站访问量。它是利用离散事件数据所绘制的。其中每个直方柱的高度代表每个时间点上事件发生的次数。
当此图涵盖了所有事件的信息时,每个时间点上的细节信息则完全被忽略。人们总是可以对条形图进行一定比例的放大后再次绘图,但是问题就来了–我们应该选择多大的缩放比例呢?我们应该考察哪个时间段的信息呢?比如,如果我们想放大到间隔为一天的水平,那么我们大致需要观察210天的信息。而且在不同的缩放级别中寻找匹配值和异常值是非常耗费时间的。
在这篇博客中,我将会介绍如何在一张图中对长时间内离散事件的数据进行可视化处理的方法。不管面对的是毫秒级还是月度数据,它都允许读者从图中快速地识别出关键信息。该方法出自于混沌系统领域,它起先是用于研究滴水时间的问题。这个可视化方法拥有许多不同的名字:延迟映射图、复原时间图和时间-时间图。为了简洁起见,我把它称为“时间图”。尽管人们早就利用时间图对混沌系统进行可视化处理,但它还没被应用到信息科学领域中。我将会展示时间图是如何提供关于推特账号行为和网络机器人程序活动的宝贵信息。
这篇博客虽然篇幅短,但是包含了几个略微不同的案例。这篇文章已经被 2015 年 IEEE 大数据会议所接收。本文结尾部分附带了如何制作时间图的 Python 代码。
制作时间图非常简单。首先,想象时间轴上一系列用点表示的事件。每个事件之间的时间间隔用标签 t1 ,t2 ,t3 ,t4 ,…所表示。
时间图可以简单看成二维散点图,其中事件的坐标分别为(t1, t2),(t2, t3),(t3, t4)等。在时间图上,紫色点事件将被画在图中所示的位置。
换句话说,散点图中的每个点都代表一个事件。其中横坐标表示这个事件和前续事件之间的时间间隔,纵坐标表示与后续事件之间的时间间隔。因此时间图中无法表示第一个事件和最后一个事件。
下图是两个简单的例子:
等间距事件序列(A)的时间图中只有一个有效点,因为所有事件的坐标完全相同。序列 B中除了一个事件略有延迟以外,它与序列 A 是一样的。由此产生的时间图包含四个有效点,这使得读者可以更直观地观察事件的变化。除非选择很小的直方柱,否则这两个序列随时间变化的直方图将是完全相同的。
为了得到更直观的时间图,我们考虑一个分为四个象限的启发式图:
每个象限中是一张沿着时间轴的事件序列图。其中右上角和左下角象限中包含的是等间距事件,因此这两个象限中的事件是“稳定的”。又因为左下角象限中事件之间的时间间隔较小,我们称它为“快而稳”事件,并称右上角象限中的事件为“慢而稳”事件。对于右下角象限而言,一个事件发生之后,需要较长的等待时间然后两个事件再接连发生,因此我们称之为“加速”事件。左上角象限的事件则刚好相反,此象限中的事件为“慢化”事件。查看时间图有点像阅读新城市的地图。即使起初的时候不熟悉,最终你还是会得心应手。
因为时间图只绘制事件之间的时间间隔,所以它解决了长时间维度的问题。为了防止时间间隔的数量级太大,我们以对数刻度绘制坐标轴。这允许读者可以在一张图中看到小至毫秒大至月份的不同时间尺度展示。让我们来看一些真实世界的案例吧!
@白宫 推文
推特的 API 允许人们收集用户最近发送的 3200 条推文。利用 Twython,我下载了 @白宫 (这个账号由总统的员工所管理) 的推文。下图是 2015 年 1 月到 9 月之间 @白宫 推文的时间图:
每条推文都用基于时间的颜色编码,而且时间轴已经经过对数化处理。按照推文结果,图中的两个聚类群对应于工作日的开始和结束。每天的第一条推文通常发生在早上九点和中午之间。而最后一条推文的发生时间则比较广泛。
有趣的是,上图中存在两个代表不同行为模式的聚类群。我将聚类群一命名为“日常事务”,其中人们大约一小时发送一条推特。位于图中左下角区域的推文具有频率高的特点,我们称之为“重要事件”。
由于时间图中很难计算出每个聚类群中包含多少样本点,而“热感时间图”可以用红色来表示密度较高的点。
在热感时间图中,我们可以观测到孤立的样本点。额外的好处是我们还可以看到样本点的聚集情况。从上图可以看出,“日常事务”聚类群中的推文数量最多,这从侧面验证了我们称其为日常事务的合理性。
#p#
个人账户的推文情况
@白宫 是由公关人员管理的推特账号。那么个人推特账号的情况是啥样的呢?尼古拉斯·菲尔顿是一名从事信息可视化的平面设计师。他的工作包括年度报告,该报告利用他生活中的数据绘制平面图形。下图是关于他推文的热感时间图:
该图中没有像 @白宫 所展示出来的明显聚类情况。与公共账号不同,个人账号的推文通常没有一个严格的时间表。然而,时间图仍然捕捉到了总体的趋势情况。大量的样本点落在“慢而稳”事件的区域中,而且这些推文差不多每天发送一次。
网络机器人
网络机器人是在网页上执行自动运行任务的计算机程序。当用户点击特定的链接时,机器人在无意中被安装到数以百万计的个人电脑中。当你读这句话的时候,机器人甚至可以操控你的电脑!我分析了一个来自提供网站监控服务公司的数据。于是,我得到了博客开头所展示的那张图:
这幅图展示了来自一个特定 IP 地址的网站访问量(这里提到的 IP 地址不同于我的论文中说所提到的 IP )。尽管直方图确实包含了整体行为的重要信息,但让我们来看看时间图所展示的信息:
上述的直方图无法展现出这些活动模式的信息。通过绘制时间图,一些重要信息马上显现出来:一大块“快而稳”事件点,两个条形区域点分别代表“加速”和“慢化”事件,而且在这两个区域上面还存在一些稀疏的点。
右下角和左上角区域的稀疏点代表在高频率活动事件之间的长休眠期中所发生的事件。这和直方图中的长间隙结果一致。条形区域中的事件发生在两次高频率活动爆发期之间的八分钟间歇期。高频率爆发期如左下角的大块区域所示,这表示网站被接二连三地访问。爆发期是否存在可以通过检查极度放大的直方图来证实:
正如我们所料,确实存在相隔大约为八分钟的爆发期。尽管放大后的直方图所涵盖的信息与时间图一致,但是谁会想到把直方图放大到这个水平呢?!时间图可以立即显现出机器人定期的高频行为,而且和直方图不同的是,时间图不需要进行放大处理。
利用 Python 绘制时间图
下面是绘制时间图的一个简单 Python 程序。它是基于随机生成的数据来绘图的。
现在让我们来绘制热感时间图吧。它利用上述代码来构建程序。总的来说,我们需要构建一个用来计算时间图中每个网格内所发生事件数的二维直方图。直方图被当成图像来对待,然后我们将高斯模糊方法(Gaussian blur)应用到图像中,这可以对突变事件进行平滑处理。
下载推文和绘制时间图的 Python 文件可以在我的 github 界面中找到。
结论
我上面提到了用来演示时间图勘探价值的三个例子。在所有的例子中,时间图可以立即展现出潜在的信息,而直方图却需要更多的时间来挖掘这些信息。尽管如此,时间图确实无法替代其他的时间可视化工具,它们之间是互补关系。最好的视觉探索工具同时需要时间图和其他图形。例如,时间图和直方图都展现了数据的重要信息,它们应该相互配合使用。
毕加索画图的时候通过将多重视角下的信息综合到同一张图中以获取物品的完全信息。相似地,时间图在一张图中从多个时间角度提取数据集的信息。鉴于其具有容易实现和发现隐藏信息的能力,在我们这个数据驱动的社会中时间图应该成为一个非常宝贵的工具。