大数定律与抽样陷阱

《黑天鹅》中多次提到大数定律可能会愚弄我们,作为数理统计和概率论中两个经典的理论(中心极限定理和大数定律)之一,为什么遇到黑天鹅事件时就会失效?或者说大数定律在遇到任何的小概率事件时都有可能“失效”,需要谨慎地认识,以防掉入应用中的陷阱。

大数定律

  大数定律(Law of Large Numbers),指在随机试验中,每次出现的结果不同,但是大量重复试验出现的结果的平均值却几乎总是接近于某个确定的值。典型的例子就是抛硬币的伯努利试验,当抛硬币的次数足够多的时候,正反面出现的概率都接近于1/2。

  常用的大数定律有伯努利大数定律和辛钦大数定律。其中伯努利大数定律指在n次独立试验中,事件A发生的频率为p,当n足够大时,p无限接近事件A真实的发生概率,即频率的稳定性;辛钦大数定律指若n个独立同分布的随机变量存在数学期望,则当n越大时,其算法平均数越接近于这些随机变量的真实数学期望值,即均值的稳定性。

  大数定律为统计推断提供了充分的理论依据,我们可以通过抽样的方法用样本统计量的特征去估计总体的特征,而不需要去研究整个总体。当样本的数量越大时,其对总体的估计就越接近总体的真实特征。但在面对小概率事件时,大数定律对总体的估计会显得无能为力,很多时候结论是失效的。

小概率事件

  假设我们进行重复10000次的伯努利试验,事件A、B、C发生的次数均满足二项分布X~B(n, p),n代表试验次数,p代表事件发生的概率。其中事件A发生的概率为10%、事件B发生的概率为1%、事件C发生的概率为0.1%。我们知道,满足二项分布的随机变量的均值是np,方差为np(1-p),于是就可以用变异系数CV(具体内容参见衡量数据的离散程度这篇文章)来衡量这3个事件发生次数的变异性或者波动情况,可以得到如下的结果:

事件 试验次数 发生概率 均值 方差 变异系数
A 10000 10% 1000 900 3.00%
B 10000 1% 100 99 9.95%
C 10000 0.1% 10 9.99 31.60%

  从上表中可以看出,当试验的次数保持恒定时,事件发生的概率越低,则事件发生的次数会存在越大的波动性或者波动幅度,如果我们继续降低事件发生概率,比如事件D发生概率为0.01%,也就是10000次试验中发生的期望次数是1次,那么事件D的CV就高达99.99%,完全无法预判其是否发生。所以在相同的条件下,小概率事件一定比普遍发生的事件存在更大的变数,概率越小波动的幅度就越大。

抽样误差

  随着网站数据量的不断增大,数据的处理和统计需要更高的成本,于是有些分析就会借助抽样的方法来处理数据,Google Analytics的免费版当数据量达到上限时就会采用抽样的方式显示结果报表。其实很多时候我们都在使用抽样的方法分析数据,我们可能会用最近7天的数据来评估近段时间的流量变化、转化情况等,但7天并不能完全代表近段时间,其实做的也是一种抽样。下面来看看现实的网站数据分析的例子:

  转化率(Conversion Rate)是网站分析中非常重要的一个指标,很多公司会把转化率当做运营产品部门的KPI,但对于很多网站而言,转化率并不大,一般不会超过10%(根据网站业务特征的差异和对目标转化的定义不同,转化率在不同网站间没有一个恒定的标准,也不具备可比性),如果网站的内容质量不高或者用户体验不好,转化率也很可能低于1%。这个时候如果用抽样的方法来预估网站整体的转化情况,就很容易掉入抽样误差的陷阱。

  网站的转化情况其实是一个二项分布,即转化或未转化,满足X~(n, p)。根据中心极限定理,二项分布的极限是正态分布,一般认为当np和n(1-p)同时大于10时,二项分布近似地满足X~N(np, np(1-p))的正态分布,即均值为np,方差为np(1-p)。将二项分布除以n之后可以得到均值,即概率p的分布,当n大于30时,近似服从N(p, p(1-p)/n)的正态分布,即均值为p,方差为p(1-p)/n,当n无限大时,样本概率p与总体概率就不存在误差,也就是满足大数定律。假如我们从网站每天几百万次的访问中抽样1万次访问来预估整体的转化率,当样本的转化率(即概率p)分别为10%、1%、0.1%时,预估的总体转化率的变异系数同上表,分别为3.00%、9.95%、31.60%(可以用均值为p,标准差为sqrt(p(1-p)/n)进行验证),所以样本转化率越低,使用样本转化率去预估总体转化率就会越不准确。

  既然过小的转化率在抽样中可能导致预估的结果存在巨大的误差,那么如何合理地选择样本数量来控制这个误差?上面已经提到,当二项分布的np和n(1-p)同时大于10时,可以认为近似满足正态分布,在正态分布下面,就可以计算在一定置信水平下的置信区间(详细计算方法见参数估计与置信区间中的区间估计),而要让抽样的误差控制在可接受的范围内,可以增加抽样的样本数来提升样本对总体估计的可信度。

  假设我们将置信水平设定在90%(一般认为95%的置信水平是满足统计学意义的,但互联网的数据影响因素较多,普遍波动较大,不需要科研实验那么高的精确度,所以90%的置信水平足够了),即Zα/2取到1.65,我们对转化率的控制一般要求较高,假设在90%的置信水平下,样本的置信区间必须控制在样本转化率的±10%,可以看下在这种条件下各种转化率水平所需的抽样样本数必须满足怎么样的条件:

转化率 10%的转化率 σ需要满足 n需要满足
10% 0.01 <0.00606 >2451
5% 0.005 <0.00303 >5174
1% 0.001 <0.000606 >26958
0.1% 0.0001 <0.0000606 >272032

  上表的样本数条件可以作为我们抽样时的参考,具体的应用可以根据概率的大小和对置信水平、置信区间的需要进行计算得到。

  最后再回到黑天鹅,通过上面对小概率事件和抽样误差的解释,其实已经很明显了。黑天鹅是极小概率事件,可能几十年几百年才遇到一次,而大数定律是一个理想化的状态,也就是n值趋近于无穷,我们很难在人生短短数十年经历很多小概率事件,或者我们的知识阅历的储备无法包含这么多的异常,很多事情在几十年的“抽样样本”中是不存在的;同时因为时代在快速地变化,当前可能发生的事件可能仅限于当前这个环境,我们无法通过历史去预见未来。于是我们完全没法知道黑天鹅事件发生的可能性,甚至不知道它的存在,即黑天鹅事件是未知的,也是无法预测的。

http://webdataanalysis.net/?p=1513

时间: 2024-10-24 10:11:04

大数定律与抽样陷阱的相关文章

统计和数学中常见的定理汇总 | 大数定律 | 中心极限定理

什么是定理,什么是公理? 定理:已证实.对于全部情形都得到了证明.公理:未证伪.无法穷举全部情形,但尚未发现反例. 大数定律 | law of large numbers 随着试验数量的增大,样本中随机变量的均值会无限趋近与理论上的期望. 大数定律是现代统计的基石. 应用:抽样中用样本估计总体的理论依据:频率的稳定性: 中心极限定理 原文地址:https://www.cnblogs.com/leezx/p/10886471.html

java笔记--笔试中极容易出错的表达式的陷阱

我相信每一个学过java的人儿们都被java表达式虐过,各种"肯定是它,我不可能错!",然后各种"尼玛,真假,怎么可能?",虽然在实际开发中很少会真的让你去使用那些知识,但熟悉表达式的陷阱对于理解java数据类型在内存中的存储和运算以及JVM工作的原理有很大的帮助,最主要的,面试题太能考这些玩意了,有些坑当时爬出来了,过几天再做又会义无反顾的跳进去,于是我整理了自己做错过的一些题,也搜集了一些充满恶意的表达式方面的小题目,放在此处,警世: 问题 结果 脱坑必备 Sy

cocos2dx-3 addImageAsync陷阱

addImageAsync异步加载未响应回调前调用unbindImageAsync撤销消息回调void TextureCache::unbindImageAsync(const std::string& filename){    _imageInfoMutex.lock();    if (_imageInfoQueue && !_imageInfoQueue->empty())    {        std::string fullpath = FileUtils::g

当心商业智能的“陷阱”

当谈到有价值的,具有真实见解的评论,我总是可以指望每周五参加我#商业智能讨论#话题的参与者们.我最近开始小组讨论这个问题:“什么是商业智能系统的五大最差实践?” 那么让我们来看看为什么BI项目有时并不完全兑现其承诺.毕竟,失败是非常有益的. 这是我们编译的列表: 组织团体在BI项目中犯的一些最糟糕的错误 技术/工具: “认为BI工具将弥补对业务的不理解” “认为BI工具将代替BI解决业务问题” “为所有类型的用户提供通用的解决方案或工具——商业智能不是一个放之四海而皆准的通用的解决方案” “没有

Linux环境下线程消息同步的陷阱

我们程序中常常会使用到线程间的消息同步处理,比如以下一段伪码 var message = "": void func()  {   1. 启动线程Thread(该线程中填充message的内容):   2. 阻塞,直到等待到完成message填充的事件:   3. 处理message:   .... } void Thread()  {   1. 通过某种处理填充message:   2. 触发func中的阻塞事件: } 我们通常会使用条件变量来完成类似情况的线程同步处理 比如wind

读书笔记--C陷阱与缺陷(七)

第七章 1.null指针并不指向任何对象,所以只用于赋值和比较运算,其他使用目的都是非法的. 误用null指针的后果是未定义的,根据编译器各异. 有的编译器对内存位置0只读,有的可读写. 书中给出了一种判断编译器如何处理内存0的代码: 1 #include <stdio.h> 2 int main() 3 { 4 5 char *p; 6 p=NULL; 7 printf("location 0 contains: %d\n", *p); 8 9 return 0; 10

张书乐:逃离流量陷阱 好想你+百草味魔力联姻竟藏着这样的秘密

2016年7月,好想你以溢价近18倍的高彩礼联姻百草味,完成了"国内零食电商并购第一案".联姻一年的结果颇为令人惊讶,7月14日,好想你发布2017 年半年度业绩预告修正公告,预计实现归属于上市公司股东的净利润6520万元-6920万元,比上年同期增长:347.78%-375.25%. 文/张书乐(人民网.人民邮电报专栏作者) 新著有<微博运营完全自学手册> 于是乎,本来只是借助两家公司的名字凑合的联姻寓意"百年好合",开始变得清晰而真实. 到线下去,这

No.5 表达式中的陷阱

1. 关于字符串的陷阱 JVM对字符串的处理 String java = new String("Java"); 创建了几个对象? 2个."Java"直接量对应的字符串对象:new String()构造器返回的字符串对象 java.intern() 可以字符串池中的直接量对象. 字符串及基本类型的包装类,Java允许通过直接量的方式来创建对应的Java对象:除此之外,简单的算术表达式.连接计算(编译时可以确定具体值)也可以直接创建对应的Java对象 字符串直接量,J

java之表达式陷阱

String str1 = "Hello Java的长度:10"; String str2 = "Hello Java的长度:10"; String str3 = "Hello Java的长度:"+"Hello Java".length; String str4 = "Hello "+"Java的长度:10"; System.out.print(str1 == str2);    输出: