1. 两件事伴随发生,不代表他们之间有因果关系 - 从一些荒诞相关性案例说起
在日常生活和数据分析中,我们可以得到大量相关性的结论,例如:
- 输入X变量,有98%置信度得到Y变量
- 只要努力,就能成功
- 只要到了下班时间出公司大门,天就一定黑了
- 深圳交警表示,天秤、处女、天蝎座的人更喜欢违章
- 肿瘤发生率随着最近二十年手机的推广逐年上升,证明了手机辐射致癌
- 屁股大容易生儿子
- 世界上不吃猪肉的人群中,人自爆的概率最大
- 据观察统计,消防车数量越多的火灾中,伤亡人数越多
- 工业革命以来,女人穿的裙子越来越短,全球温度越来越高
- 人的受教育程度与脚的大小成正比
- ....
此类结论的依据也似乎有很强的依据,即所谓的历史经验,甚至是大量的真实数据支持,我们通过各种统计模型、机器学习、深度学习模型,通过分析得到以上种种结论。
但是这里面存在一个巨大的疑问就是,”相关性一定等于因果性吗?“让我们来看几个反常识的例子。
1)美国在科学、空间和技术上的开支 && 绞死、勒死和窒息的后果关联性
correlation=99.79%
2)泳池溺水身亡人数 && 尼古拉斯凯奇出演的电影数
correlation=66.66%
3)缅因州的离婚率与人均人造黄油消费量相关
correlation=99.26%
4)深圳交警表示,天秤、处女、天蝎座的人更喜欢违章
“我们发现上周天秤座、处女座、天蝎座携手违法数量居前三名。”吴凯峰告诉记者,通过从8月3日至8月9日行人、非机动车违法人的星座分类对比,发现天秤座、处女座、天蝎座位列违法量前三名(三个星座刚好也相连,从8月23日至11月22日),分别占违法总数的10.5%、9.63%和9.0%。金牛座、白羊座最“乖”,分别以673、661排在最后两位。
来源:深圳交警微门户
显然,深圳交警不会有意去做数据造假这种事情,但是星座决定论又显然违反了我们的常识。我们来分析一下其中的原因。
首先,报道里的数据分析存在错误:没有考虑星座在当地人口中的总体分布,而直接拿观测到的样本绝对数量进行比较。实际上正是因为这三个星座的人口,占当地总人口的比例较高(9-11月为北半球低纬度南部地区生育高峰),造成被抓到违章的人数较多。如果这个调查在北方,估计躺枪的会是双子、巨蟹和狮子座(6-8月)。
北半球国家出生高峰与纬度的关系。来源:Human birth seasonality: latitudinal gradient and interplay with childhood disease dynamics
所以,星座与违章确实有关,源于星座人口比例,而不是星座“乖不乖”。
5)屁股大容易生儿子
人们看到某某生了儿子,然后又发现某某屁股大。经过大量的模糊的统计(很多民间理论都是这种模糊的感受),得出了屁股大生儿子的结论。
然而,这可能一个错误的关联,或者说,错误的因果。女性生儿子,的确是可能屁股大,之所以出现这种情况,主要是因为男婴本身比女婴在体型方面更大。
我们看这个《中国15城市不同胎龄男女新生儿出生体重值修正报告》
可以发现,事实上,在整个发育过程中,男婴都表现出了比女婴体重更高的现象。而我们知道臀部的大小,和骨盆有很大关系(当然不只是骨盆,还有肉肉啊)。而骨盆对于生产的影响很大。
因此,在同样生男生女且没有剖腹产的过程中,在男女怀孕比例基本接近的情况下,较大的骨盆,生育体重更大的男性,相对于较小的骨盆,生育更容易。
或者,更加俗话的说:臀部大,生儿子容易,臀部小,生儿子难。
上述讨论的这种“荒谬的相关性”还有其他大量的例子。显然,对上述讨论的情况,如果使用相关性分析,Peason相关分析等技术,很容易得出一个结论就是:
它们是彼此强烈相关的,看到其中任何一个事物发生,就有很大概率另一个事物也会伴随发生
但显然,这个结论和我们的常识严重地相悖,为什么号称有坚实理论基础的统计算法,在这里似乎产生了一个非常荒谬的结论呢?难道机器学习是伪科学吗?
答案是否定的!真实的情况是统计机器学习没有问题,出问题的是使用它和理解它产生结论的方式,我们接下来的文章来讨论这个话题。
Relevant Link:
http://www.tylervigen.com/spurious-correlations
https://www.ncbi.nlm.nih.gov/pubmed/24695423
https://www.zhihu.com/question/66895407
2. 伪相关性(spurious correlation)
0x1:伪相关性的成因
假设两个事件A和B,最简单的因果性例子就是A导致了B,如下图所示:
因果性(causality)会导致相关性(correlation),反之则不成立。换言之,因果性是一个比相关性更强的概念。因果性是一种特殊的相关性。
统计学上把两个或者多个看起来高度相关,但却不存在因果性的现象叫做伪相关性(spurious correlation)。而伪相关的成因可能有:
-
存在其他变量(common response variables)同时对这两个事件造成(直接或者间接)影响,但我们无法观测到(意识到)它的存在。例如:
- 与冬天相比,夏天游泳的人变多且溺亡人数上升,同时吃冰淇淋的人数也增多,因此是否可以得出结论:"冰淇淋"会导致“溺亡”?
- 这种听起来荒谬的结论就是因为错误地把相关性当成了因果性。我们没有观测到“夏天温度升高”这个因素同时会影响“游泳溺亡人数”和“吃冰淇淋人数”,而错误地认为两者间有直接的因果关系,相关性不是因果性的充要条件,,左图中,C是季节变化因素,A和B分别是“游泳溺亡人数”和“吃冰淇淋人数”。可以直观地看出,A与B之间并不存在因果关系
-
纯属巧合,尤其是处理小样本时,
- Freedman在1989年做过的模拟实验中发现,即使数据全是由噪音构成,在适当的处理后,也能发现数据中显著的相关性:6个特征显著且对回归所做的F-test的p值远小于0.05,即回归存在统计学意义。
- 另一个例子是上个章节谈到的一张图,美国从1999-2009年在科技领域的支出,黑线是通过上吊、窒息等方式自杀的人数。我们发现其线性相关系数( )。r的取值范围为-1到1,越接近1越倾向于强正相关。显然,我们不会认为这两者之间存在因果性。且仔细观察后我们发现样本量仅仅是11个数据点,因此是巧合的可能性更大。
0x2:伪相关性的作用
由以上的讨论可知,对于伪相关不能一概而论,如果因为第三方变量(成因1)而不仅仅是巧合(成因2),那么这种相关性是有用的,即使是“伪”相关。
原因很简单:
大部分情况下我们无法对每一个事件去追根溯源,无法依靠纯粹的“因果推断”,甚至并不知道什么是因什么是果。
在这种情况下,伪相关性就很用。还是拿冰激凌举例,假设我们无法得到任何季节信息,仅靠“冰激凌的销售数”也可以大致推断“溺亡人数的趋势”,因为它们不是独立事件(贝叶斯网络局部独立性原理)。
0x3:如何利用和分析伪相关性
- 要考虑两个事件之间是否同时依赖其他隐变量,如果存在是否可以将其考虑进来。可参考概率图模型更好地解决类似问题。
- 同时也应考虑“线性相关”在当前场景下是否有意义。线性相关一般都不易描述非常复杂的关系,两个复杂事件间的高度线性相关是很值得怀疑的。我们给出的“科技支出 vs. 死亡人数”就体现了线性相关在复杂场景下非常有限的意义和造成巧合的可能性。
- 如果可能,可以加大样本量,收集更多的数据,同时选用合适的统计检测方式和更小的置信区间,以防止纯属巧合的情况出现。
Relevant Link:
https://onlinelibrary.wiley.com/doi/pdf/10.1002/0471998524.app1
http://xueshu.baidu.com/usercenter/paper/show?paperid=839b6eb7023030a53d56411f78a36a8f&site=xueshu_se
3. Yule-Simpson’s Paradox:关于伪相关性的概率原理讨论
0x1:关于相关性理论的一些历史
天才的高斯在研究天文学时,首次引进了最大似然和最小二乘的思想,并且导出了正态分布(或称高斯分布)。
其中最大似然有些争议,比如 Arthur Dempster 教授说,其实高斯那里的似然,有贝叶斯或者信仰推断(fiducial inference)的成分。
高斯那里的 “统计” 是关于 “误差” 的理论,因为他研究的对象是 “物理模型” 加“随机误差”。
大约在 100 多年前,Francis Galton 研究了父母身高和子女身高的 “关系”,提出了“(向均值)回归” 的概念。众所周知,他用的是线性回归模型。此时的模型不再是严格意义的“物理模型”,而是“统计模型” — 用于刻画变量之间的关系,而不一定是物理机制。
之后,Karl Pearson 提出了“相关系数”(correlation coefficient)。
后世研究的统计,大多是关于 “相关关系” 的理论。但是关于 “因果关系” 的统计理论,非常稀少。据 Judea Pearl 说,Karl Pearson 明确的反对用统计研究因果关系。有意思的是,后来因果推断为数不多的重要文章(如 Rosenbaum and Rubin 1983; Pearl 1995)都发表在由 Karl Pearson 创刊的 Biometrika 上。
0x2:Yule-Simpson’s Paradox(尤尔·辛普森悖论)
在高维列联表分析中, 有一个很有名的例子,叫做 Yule-Simpson’s Paradox。
此悖论表明,存在如下的可能性:X 和 Y 在边缘上正相关,但是给定另外一个变量 Z 后,在 Z 的每一个水平上,X 和 Y 都负相关。
下表是一个数值的例子,取自 Pearl (2000),
Yule-Simpson’s Paradox
上表分为了3份,
- 第一个表是整个人群的数据:接受处理和对照的人都是 40 人,处理有较高的存活率,因此处理对整个人群有 “正作用”。
- 第二个表是Male男性的分层结果
- 第三个表是Female女性的分层结果,因为第一个表的四个格子数,分别是下面两个表对应格子数的和:20=18+2,20=12+8,16=7+9,24=3+21.
但奇怪的是,处理对男性有 “负作用”,对女性也有 “负作用”。一个处理对男性和女性都有 “负作用”,但是他对整个人群却有 “正作用”:悖论产生了!
这种悖论现象不是由于随机性或者小样本的误差导致的,从纯数学的角度,上面的悖论可以写成初等数学公式:
在纯数学上,这并无新奇之处。但是在统计上,这具有重要的意义,即变量之间的相关关系可以完全的被第三个变量“扭曲”。
更严重的问题是,我们的收集的数据可能存在局限性,忽略潜在的“第三个变量”可能改变已有的结论,而我们常常却一无所知。
鉴于 Yule-Simpson 悖论的潜在可能,不少人认为,统计不可能用来研究因果关系。
0x3:Yule-Simpson 对数据分析与大数据应用带来的挑战
由于有 Yule-Simpson’s Paradox 的存在,观察性研究中很难得到有关因果的结论,除非加上很强的假定。
比如,一个很经典的问题:吸烟是否导致肺癌?
由于我们不可能对人群是否吸烟做随机化试验,我们得到的数据都是观察性的数据:即吸烟和肺癌之间的相关性 (正如上一节中的的合并表)。此时,即使我们得到了吸烟与肺癌正相关,也不能断言 “吸烟导致肺癌”。
这是因为可能存在一些未观测的因素(内部分层随机变量),他既影响个体是否吸烟,同时影响个体是否得癌症。比如,某些基因可能使得人更容易吸烟,同时容易得肺癌,存在这样基因的人不吸烟,也同样得肺癌。此时,吸烟和肺癌之间相关,却没有因果作用。
相反的,我们知道放射性物质对人体的健康有很大的伤害,但是铀矿的工人平均寿命却不比常人短。这是流行病学中有名的 “健康工人效应”(healthy worker effect)。
这样一来,似乎是说铀矿工作对健康没有影响。但是,事实上,铀矿的工人通常都是身强力壮的人,不在铀矿工作寿命会更长。此时,在铀矿工作与否与寿命不相关,但是放射性物质对人的健康是有因果作用的。
Relevant Link:
https://cosx.org/2012/03/causality1-simpson-paradox/
4. 因果推论的由来
关于世界是否存在真正的因果性问题已经上升到哲学讨论范畴了,因果性是贯穿西方哲学的一个极其重要的核心问题,也是至今西方哲学界所讨论和争论的热点话题。有兴趣的读者可以阅读康德的《纯粹理性批判》,这里不做更深入的讨论。
仅从数据分析算法角度来看,所有模型都没有因果性,只是因为支撑的数据证据多了,相关性就变成了因果性,或者是人们常常将相关性视作等同于因果性来使用。
通过观察数据,我们只能得到两者的相关性,不可能得到因果性。
若AB之间存在线性相关性,那么我们认为AB之间至少存在一条因果通路,即A-B,它表示AB之间存在因果关系,但不确定谁是因,谁是果。
一条AB之间的因果通路即:A-B1,B1-B2,...,B2-Bn,Bn-B。
而建立一个新的因果关系,方法一共有三种:
- 归纳推理法
- 演绎推理(因果性的传递性)
- 相关性的因果通路推导
0x1:归纳推理法
归纳推理有两种方法,分别是“假说演绎”和“先验模型归纳推理”。
1. 假说演绎
1)提出假说(假设)
首先我们看到了一个结果。根据结果,我们会根据目前的知识来给出一个或几个假想的条件。
当这个或这些条件发生的时候,这个结果必定发生。
如果当前的知识无法反驳这个假想的条件,那么我们认为这个条件成立。我们称这个假想的条件为这个结果的原因,也即所谓的假设检验。
2)演绎
把假说当成是已知的知识,设计实验验证。
如果实验中所有数据均满足“原因数据”与“结果数据”呈“线性相关”。那么说我们说数据支持假说。
举个例子:
一次地震灾害,死伤很多。
我们首先想到 “地震是造成死伤的原因”
但是“所有地震都造成死伤了吗?”不是,所以我们的原因不充分
于是变成:“强烈的地震是造成死伤的原因”
但是“所有强烈的地震都造成死伤了吗?”还不是,所以我们的原因还不充分
于是变成:“在人口密度较大的地方发生强烈的地震是造成死伤的原因”
但是“所有在人口密度较大的地方发生强烈的地震都造成死伤了吗?”貌似还不是,所以我们的原因还不充分
于是变成:“在人口密度较大的而且建筑不够结实的地方发生强烈的地震是造成死伤的原因”
再想,所有在人口密度较大的而且建筑不够结实的地方发生强烈的地震都造成死伤了吗?
如果不是继续添加条件直到满足我们知道的所有数据, 如果满足的话,那么我们说“在人口密度较大的而且建筑不够结实的地方发生强烈的地震”是“造成死伤”的原因
导致B的原因A是一个条件的集合{A}。在条件集合{A}下,B发生的概率非常大(目前没有观测到不出现)。
其中集合A中对B相关性较强的几个因素,可以是主要原因,我们生活中,经常以主要原因代替整体说是B的原因。
2. 先验模型归纳推理
现根据数据提出假说,再用数据相关性验证。
我们常用的高斯正态分布就是对生活中由大量随机小概率事件组合成的复杂事件的一种抽象模型概括。
0x2:演绎推理法(因果性的传递性)
琐碎演绎推理法,就是运用逻辑学进行三段论推理,
- 因为A必定出现B,
- 因为B必定出现C,
- 所以A必定出现C
举个例子:
- 人都会死,
- 苏格拉底是人,
- 苏格拉底会死
0x3:相关性的因果通路推导
首先定义相关性通路: X↔Y表示XY之间存在相关性。
一条AB之间的相关性通路即:A↔B1,B1↔B2,...,B2↔Bn,Bn↔B。
那么如果我们确定AB之间有且仅有一条相关性通路,我们认为这条相关性通路是因果通路。
举一个例子,
假设我手滑了跟手机摔坏之间存在相关性。
且只有“手滑了”与“手机掉落”有相关性,手机掉落与手机摔坏有相关性这一条相关性通路。
那么如果手滑与手机摔坏之间确实存在相关性的话。
我们认为:手滑了与手机掉落有相关性,手机掉落与手机摔坏有相关性这一条相关性通路也是因果通路。
即:手滑了与手机掉落之间有因果性,手机掉落与手机摔坏之间有因果性。
Relevant Link:
https://zhuanlan.zhihu.com/p/70159562
5. 从贝叶斯网络理论框架看相关性不等于因果性问题
我们前面讨论到一个问题,即同时影响A和B的第三个因素C,它们三者共同组成了如下的因果逻辑结构,
在贝叶斯网络的概念体系中,这被称之为“tail-to-tail(共同的原因)”,
- 当C已知时,A和B的信息传递被隔断,A和B是相互独立的
- 只有当C未知时,A和B才可能存在相关性
在大多数的数据分析场景中,我们都是未知C变量的,我们只能通过有限的观测手段,观测到起因A和最终结果B,然后基于已有的数据进行相关性挖掘与分析,进而将分析得到的相关性结论作为因果性结论来使用,如下图:
Reichenbach (1956) 明确指出了因果关系和统计相关性之间的联系。他提出共同原因原理(Common Cause Principle):如果两个观测对象 X、Y 具备统计相关性,则存在变量 Z 对二者造成因果作用,且通过使它们基于 Z 互相独立来解释二者之间的相关性。
在特殊情况下,变量 Z 可与 X 或 Y 重叠。假设 X 是鹳鸟的数目,Y 是人类出生率(在一些欧洲国家中,二者具备相关性),
- 如果是鹳鸟带来了人类婴儿,则正确的因果图是 X → Y
- 如果是婴儿吸引来了鹳鸟,则因果图是 X ← Y
- 如果某个其他变量引出了这两者(如经济发展),则因果图为 X ← Z → Y
我们可以从中得出一个重要结论:在没有额外假设的情况下,我们无法利用观测数据区分这三种情况。
在这个案例中,X 和 Y 的观测分布类别(可通过模型得到)是相同的。因此,因果模型所包含的信息超出统计模型。
Relevant Link:
https://mp.weixin.qq.com/s/4ocdPZmNGK2pLRiEHVLImw
6. 关于因果推理在安全数据分析领域应用的一点思考
0x1:专家规则本质的一点思考
专家规则在安全攻防领域有很多不同形式的应用,笔者这里列举一些常见的形式:
- 通过正则表达式对磁盘上的文本进行恶意代码检测,当出现某CVE EXP/POC Shellcode代码,即认为该文本是一个恶意源代码文件
- 通过正则表达式对HTTP Log中的URL/UA/Body部分进行内容匹配,当出现一些和SQL注入有关的字符串,例如“’ union select xxxx”时,即认为该日志是由攻击发出的一条WEB漏洞攻击日志
- 通过正则表达式对Web文件中的出现的敏感函数名进行检测,例如出现“eval”、“$_POST”、“preg_replace”等关键词字眼时,则认为该文件是一个可疑Webshell文件
- 通过正则表达式对系统进程日志出现的敏感字符串进行检测,例如cmdline里出现“wget http:/xxxx | bash; chmod 744 xxx; ./xxxx”这样的字眼,则认为该日志是由攻击者触发的一条入侵攻击行为
- ...
可以看到,这些专家规则的背后其实蕴含了一个最重要的基本假设:安全规则所描述的敏感特征和安全事件之间有强烈的因果性。
因为这个因果性的存在,安全工程师得以从海量的数据中,精确的拣选出“安全事件”,甚至将多个安全事件进行有机的逻辑组合,得到更复杂的安全事件会话还原。
0x2:安全数据分析和安全攻防运营人员的融合
还是回到专家规则这个话题上来,这里最关键的问题是这些具备“精确”因果推理助推力的专家规则是从哪里来的呢?
答案是安全攻防领域知识,安全工程师通过长年的大量攻防实践,会不断总结出各种有效的安全专家规则(安全知识),这些知识的产生就是所谓的行业壁垒,也是安全数据分析这个行业的第一个入门门槛。
那接下来另一个问题就是,如果你是熟悉算法和数据分析的统计学家,能否在短时间内直接进入这个行业并且获得好的结果呢?
笔者认为存在一定的困难度,原因有以下几点:
- 数据分析专家的强项是数据挖掘,他们可以借助已有的打标样本(恶意http body、恶意web文件),通过各种复杂的机器学习模型,进行有监督的训练和学习。但是问题是,机器学习的强项是拟合已有的规则,对发现未知的未知并不擅长,希望通过机器学习来自动发现未知的未知,在很多时候是一种不切实际的想法
- 安全专家规则本质是一种强因果推理规则,安全研究人员和算法工程师的最大区别就在于安全研究员更了解攻防对象的内在呈现机理,安全工程师能够不断挖掘出新的因果性推理链路,而算法工程师更擅长发现的是相关性链路。我们知道,相关性不是100%的因果性,因为可能存在未被观测到的隐藏随机变量,例如管理员自己的突发性异常操作。
- 数据分析的相关性结论总是略微滞后于基于因果推理推理得到的数据
通过以上的讨论,最后的一个问题就是,安全攻防人员和安全数据分析师未来的态势会如何呢?是彼此取代,还是彼此合作呢?
笔者个人的观点认为,它们会走向一个互相融合的形态,具体来说如下:
- 安全攻防专家继续专注在安全攻防原理和知识的研究和实践上,他们是源源不断产生新的因果性推理规则的来源
- 但是新产生的因果推理规则的“推理质量”是良莠不齐的,可能有的单条规则就非常准确,但是有的单条规则就存在模糊性,需要多条规则配合起来共同推理决策
- 安全数据算法分析师的工作就是基于已有的“专家因果推理规则”的基础之上,通过建模和有监督的方式进行复杂性建模和复杂性分析(例如贝叶斯网分析),将专家因果推理规则的效果发挥到极致
以上种种只是笔者的一些浅见,也许过了若干年后某位同学读到这里会哑然失笑。但不妨,毕竟安全数据分析这条路总要有一群人去试一试的,数据经济时代下,笔者相信安全领域也不能独善其身,数据分析的春风也会一点一滴地改变和优化安全攻防领域的信息不对称窘境,就让我们拭目以待。