1, 问题引入
在进行业务开发时,可能经常需要根据累计的样本数据,进行判断;并根据判断的结果进行相关的处理。
考虑下面的例子:
用户A通过发送ping包到服务器B,来检测网络质量情况;比如:发送了N个包,丢了M个报;阀值为T(比如:10%);也就是:如果M/N > T,则认为用户A到服务器B的网络质量差。
上面的判断存在一个问题:如果样本量N比较小,我们的判断会不准确;随机噪声导致等偶然因素导致的丢包,会影响我们的判断。
比如N为5,网络质量并没有问题,但是因为偶然因素导致丢了一个包,我们计算出来的丢包率为1/5=20%,大于阈值10%,判断因为是网络质量有问题。
那如何解决小样本量问题呢?
下面介绍的方法是一种通用的解决小样本量的方法。只是为了方便阐述,以丢包率为例。
2,引入置信区间
首先我们考虑下面这样一个问题:
1)N为10,M为1,丢包率:M/N =10 %;
2)N为100,M为10,丢包率:M/N =10 %;
3)N为1000,M为100,丢包率:M/N =10 %;
上面三种情况,计算出来的丢包率都是10%;但是它们的可信度是一样的吗?那种最可信?
直觉告诉我们:它们的可信度是不一样的,样本量越多的情况越可信。
那可信度跟样本量具体是一个什么样的关系呢?是不是有公式可以计算可信度跟样本量之间的关系。
答案是有的。这是一个统计学的问题,置信度和置信区间可以很大的解决该问题。
什么是置信度和置信区间?
95 %[5%,50%]:可以理解为我们有95%的信心(Confidence)可以说根据样本量计算出来的丢包率介于5%到50%之间;
这里95%就是置信度;[5%,5%]就是置信区间;
很显然置信度越大,置信区间就越宽;比如如果:95%置信度的置信区间为:[5%,50%];99%置信度的置信区间可能就是[2%,70%];
3,如何计算丢包率的置信区间
1)对于每一个样本量,只有两种结果:要么丢包要不不丢包;其实这就是一次伯努利试验;
2)N个样本量就是n次伯努利实验;而n次伯努利实验符合二项式分布;
3)当N比较大时,二项式分布趋近于正态分布:
对于上面的正态分布,68%、95%和99%就是置信度,表示该区域的面积占比;
置信区间就是对应置信度下面的上下边界值;
4)正太分布下的置信区间适用于样本量N比较大的情况;如果N不是很大,有没有针对正太分布置信区间的优化方法呢?
答案是:有;威尔逊置信区间就是为了解决该问题的。
5)威尔逊置信区间计算方法:
w-表示置信区间下限;
w 表示置信区间上限;
n为样本量
p表示最大似然估计;也就是M/N
z跟置信度有关,一个置信度对于一个具体的值;比如:置信度为95%,z的值就是1.96;
4,如何使用置信区间
1)使用置信区间的下限判断网络质量差
先根据上面的公式计算出来置信度为95%的置信区间[a,b];a为置信区间下限,b为置信区间上限;
如果a > T ,则认为网络质量比较差;
这样判断,根据前面的分析,我们至少有大于95%的概率确定丢包率确实大于阀值;所以说我们的判定有95%以上的准确性。
说明:T为丢包率阀值,人为设定;
2)使用置信区间的上限判断网络质量恢复
先根据上面的公式计算出来置信度为95%的置信区间[a,b];a为置信区间下限,b为置信区间上限;
如果b < T ,则认为网络质量不差;
这样判断,根据前面的分析,我们至少有大于95%的概率确定丢包率确实小于阀值;所以说我们的判定有95%以上的准确性。
说明:T为丢包率阀值,人为设定;
3)如果 T处于a,b之间怎么办?(a < T <b)
这种情况下,我们不能准确判定网络质量情况是差的还是不差。我们是模糊不定的。怎么办呢?
出现这种情况的根本原因是:样本量N比较小,导致置信区间的范围比较大;从而使得T落在置信区间的上下限之间;
解决办法:通过不断加大统计时间范围,从而加大样本量;减少置信区间;直到可以进行准确判断。
比如:过去1分钟的样本量不能准确判断,那我就使用过去2分钟的样本量;2分钟不足,我就使用3分钟的样本量。。。以此类推。
通过上面3种方式进行判断,我们就可以保证我们做的判断是准确有效的。