• 7.4 寻找异常值">7.4 寻找异常值

    7.4 寻找异常值

    一方面,我们要探究数据对象为什么属于某个群组,另一方面,也应该探究它们为什么会不属于某个群组。也就是说,总会有一些数据点从同类中凸显出来,正如你所猜到的,它们被称作为“异常值”(outlier)。这些数据点和全体中的其他数据显得格格不入。有时候它们正是你的故事中最值得人注意的亮点,有时候它们可能只是无聊的笔误,比如少输了一个零。不管怎样,我们都需要对它们进行检查,以便了解到底发生了些什么。谁都不希望在绘制了一幅巨大的图表后,被细心的读者指出某个异常值有问题,导致之前的辛苦工作付诸东流。

    有很多人设计了专门的图表类型,方便强调显示异常值。不过以我的经验来看,什么都比不上基础图表和常识来得有效。深入理解数据的上下文背景,做好功课,如果对某些问题不太确定,不妨询问该方面的专家。找到异常值后,我们完全可以用之前所掌握的图表绘制技巧对它们进行强调:添加不同的颜色、使用箭头或者更粗的边框等。

    现在来看一个简单的例子。图7-32是一个时间序列图,显示了从Weather Underground网站上抓取的1980—2005年的天气数据(和我们在第2章中所做的一样)。图表中按季节的循环是在我们预料之中的,不过中间那一段是什么情况?看上去不寻常的平滑,而其他地方都有很多噪点。这没有什么大不了的,但如果你碰巧需要依靠这些数据建立天气模型,就需要了解哪些是真实数据,哪些又是估算出来的。

    7.4 寻找异常值 - 图1

    图7-32 Weather Underground网站估算的天气数据

    与之类似,我们再看看之前显示犯罪率的星图,很明显哥伦比亚特区过于突出。用基本的柱形图也能轻易发现这一问题,如图7-33所示。拿这些州与更像一座城市的哥伦比亚特区进行比较,是否有失公平?你可以自己来判断。

    7.4 寻找异常值 - 图2

    图7-33 美国的枪支凶杀案图

    而在第4章中谈到的订阅者数量问题又是怎么回事?在图7-34中,中间有一个明显的波谷,似乎FlowingData网站有一半以上的读者都蒸发了。

    7.4 寻找异常值 - 图3

    图7-34 FlowingData一段时期内的订阅者数量

    我们也可以通过直方图来看看整体的分布情况,如图7-35所示。大部分订阅者都在右边,有一小部分在最左边,而中间什么都没有。

    7.4 寻找异常值 - 图4

    图7-35 显示订阅者数量分布的直方图

    要想更具体一些,我们还可以用到箱型图(boxplot),它能显示分布中的四分位数。箱型图在R里面可以通过boxplot( )函数生成,它会自动高亮显示比上四分位数、下四分位数多或少1.5倍以上的数据点(见图7-36)。

    7.4 寻找异常值 - 图5

    图7-36 显示订阅者数量分布的箱型图

    ►一个数据集中有3个四分店(quartile),这3个四分点将图表4等分。中间的四分点也就是中位点(median),上四分点以上是所有数据中最大的25%,而下四分点以下则是所有数据中最小的25%。

    如果我网站的订阅者数量不多,比如只有个位数,那么这么高百分比的降低还是可能的。但如果说我在网站里说了什么直接导致上万名读者变节(而且在几天后又都回来了),这似乎过于牵强。更合理的解释应该是Feedburner(我使用的feed发送服务商)给我的报告中出现了错误。

    这些数据集中的异常值之所以如此显而易见,是因为我们对这些数据还算熟悉。要是我们用到了不太熟悉的数据集,那么它们可能就不会这么明显。如果发生了这种情况,不妨直接寻访数据的源头,问问是谁在负责此事。创建、存储这些数据的个人或团体通常都会很高兴有人在使用他们的数据,也会乐于提供建议。如果你确实无法找出更多细节,起码你也尽力了,那么就在图表的里面对问题给出一点说明吧。