前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >当数据遇上代码:程序员的假设检验

当数据遇上代码:程序员的假设检验

原创
作者头像
用户6879030
发布2024-06-05 11:25:46
1120
发布2024-06-05 11:25:46

前言

有没有质疑过云服务的SLA?或在评估新厂商云服务时,对其SLI进行过测试?

在降本增效的大背景下,我们会尝试去使用价格更加合理的云服务,那么我们该如何测试服务SLI是否如其宣称一样?

曾被要求测试一家新厂商的服务,由于是金融领域,所以对延迟要求非常高,而云厂商宣称的平均延迟是10ms,由于接口特殊性,只能进行非常小规模的测试,以检验其延迟是否达标。

我们对接口进行了100次测试,发现其平均响应时间为12ms,那么是否就可以判定其不合格?如果单从平均值来看,很可能不满足需求,那么多大的可能性是很可能?由于我们测试的100次,样本较小,样本本身存在随机性,所以,使用样本均值来定性是不合理的,对于这种以样本来评估总体均值的场景,我们可以使用假设检验。

什么是假设检验

简而言之就是先提出假设,再来通过数据统计定量检验假设是否成立。

先来看看几个概念

标准差、均值与中心极限理论

标准差

标准差是用来衡量数据的离散性。有总体标准差和样本标准差。

对于离散数据,总体方差的计算公式如下:

µ是总体均值

离散数据的样本方差计算公式:

表示样本均值

标准误差

标准误差(standard error)用来衡量样本平均值的离散性,是所有样本平均值的标准差,等于标准差除以样本量的平方根,计算公式如下:

中心极限理论

多次独立地从总体中抽样样本,每次计算样本的平均值,不管总体数据服从何种分布,样本均值都近似于正态分布。

白话说就是:样本均值是围绕总体均值呈现正态分布的。

设 X1, · · · , Xn 是独立同分布的随机变量,则这n个随机变量的平均值近似服从正态分布:

其中µ为总体均值。

而将样本均值的"标准差"

定义为标准误。

引用维基百科的图,可以看出虽然总体不是正态分布,但每次采样的样本均值是围绕总体均值呈现正态分布的。

原假设与备择假设

原假设(零假设),我们往往试图通过数据统计来推翻(拒绝)原假设。

备择假设,这通常是我们想要证明的结论。

例如,我们认为云服务的响应时间超过10ms,那么原假设就是:云服务响应时间小于等于10ms,备择假设就是超过10ms,我们试图用采样的数据来证明响应时间超过10ms。

显著性水平、置信区间

显著性水平

显著性水平α 表示小概率事件发生的可能性大小,通常取 0.1 或 0.05。 样本在1.96个标准差σ内的概率是 95%,超过了1.96个标准差,我们则认为这个样本是一个异常值(或者说是一个小概率事件的数据)。所以,如果α值是0.05,意味着在原假设成立的前提下, 如果从总体中采样到的结果出现的概率小于 5%, 就拒绝原假设。

置信水平

1 – α 为置信水平 (confidence level),表示数据在置信区间内的可信程度。所以,对于样本数据必须在置信水平内,否则,我们认为其是一个小概率事件,来拒绝原假设。

置信区间

样本估计总体平均值的误差范围的区间。

通俗解释就是:如果置信水平是95%,那么我做100次抽样,会有95个样本会在置信区间内。

如下图,95%置信水平的置信区间在双侧1.96个标准差内

如下图,95%置信水平的置信区间分别在右尾和左尾1.645个标准差内

检验统计量

检验统计量是从数据中得到的测量结果,常见的参数检验统计量有 z统计量和t统计量。

z分数

z分数z-score,也称标准分数,是一种以标准差为单位的度量值,

,代表数据点 x 和均值 µ 之间的距离为 z 倍标准差 σ。在正态分布中,我可以通过概率累积分布函数来得到z分数对应的概率。

z统计量

由中心极限理论可知,样本均值的标准差为

所以z分数为

z统计量是样本均值服从正态分布的z分数,当 n → ∞ 时, Zn 的分布会收敛于标准正态分布。

图片
图片

z统计量的95%置信区间为

用z统计量来推断假设叫做z检验。

t 统计量

由于我们无法得知总体方差,所以使用t统计量来分析。

t统计量是从采样数据中计算出总体方差的估计值,来代替z统计量中的总体方差。

在使用样本方差替换总体方差的时,需要将n改成n-1,这是对总体标准差的无偏估计(参见贝塞尔校正Bessel's correction)。

这个计算量应该接近z分数,但其分布比正态分布更分散一些,因为已知总体方差时,随机性只来源于一个数即样本均值,现在随机性来源于样本均值和估计量s。

t统计量的95%双边置信区间为

用t统计量来推断假设叫做t检验。

当知道总体方差时,使用z检验;如果不知道总体方差,则使用t检验。

单侧检验与双侧检验

单侧检验就是检验样本是否在单边置信区间内(左尾或右尾);而双侧检验是检验样本是否在双鞭置信区间内。

  • 如双侧检验:我们检验延迟是否与10ms相近。
  • 单侧检验:检验延迟大于10ms(右尾),或者小于10ms(左尾)。

p值

原假设成立时,比样本结果更极端结果的概率。

由统计量计算出P值,如下图分别表示为:

当单尾检验统计量为1.645,则P值为0.5,P值小于显著性水平则表示更极端的结果(更小发生的概率)。

当双尾检验统计量为1.96,则P值为0.5,P值小于显著性水平则表示更极端的结果(更小发生的概率)。

假设检验

了解了前面几个概念后,我们来看看如何检验假设

1.先陈述原假设和备择假设;

2.确定 α值(显著性水平);

3.计算检验统计量,对假设进行检验;

4.如果统计量的p值比α值小,就拒绝原假设, 选择备择假设;

检验假设

我们先称述假设

由于我们比较保守,所以对此新厂商持有怀疑态度,则假设是:平均延迟小于等于10ms。

那么备择假设就是平均延迟大于10ms

显著性水平

显著性水平是一个相对主观的值,我们先选0.05,意味着, 在原假设成立的前提下, 如果从数据中观测到的结果出现的概率(P值)小于 5%, 就拒绝原假设。

统计量

测试的样本数据如下,单位是毫秒:

代码语言:javascript
复制
[10.39478909,4.17494807,13.09555557,8.05337425,7.32103789,12.97623792,14.5361939,13.36878164,10.56332761,10.35438636,9.52640083,6.87630627,11.15027812,10.67535094,14.07884493,11.64312715,14.23086219,8.94836826,13.06299289,8.94422704,8.73219625,19.25074306,7.43889442,12.50207256,9.02274529,7.2443367,13.16417061,10.82969507,9.36031577,12.13416141,11.75344359,13.87406495,11.50630708,14.11391422,14.40800048,9.14031398,7.76398681,12.19995022,16.24810605,9.07483655,13.62365208,13.07633972,10.16328244,9.31317711,6.98641791,10.74886204,17.51416605,6.39339203,3.5811689,8.28839675,12.57903621,8.81051744,9.11218871,14.25316259,11.99585676,12.56518834,1.68076395,17.4277941,7.8511385,9.98501998,9.63134405,10.44318637,14.85125648,5.30770478,5.68249298,13.13346328,7.59359024,10.81685547,10.07512649,-2.24286631,11.27310045,10.02540833,12.9748981,12.50723254,16.25598461,7.37000023,15.85257193,8.39639564,13.68004091,8.75053094,5.97867062,10.7295,7.93730343,9.62641393,11.44166657,15.00023509,9.89363741,13.89555544,7.24042319,9.27626212,5.89410678,15.06996074,6.80818148,14.78219662,5.83194109,16.57685235,10.36609232,-0.2987168,12.68177986,13.377535]

数据的分布:

数据均值是10.54175,样本标准差3.69183,根据公式计算t统计量

=1.46742

由概率累积分布可知概率为92.72%,由于是右尾检验,所以P值是0.0728,则大于1.4674的概率是7.28%。

当然,也可以直接用python库计算

代码语言:txt
复制
# t score
var = np.var(data,ddof=1)  
mean = np.mean(data)
df = np.size(data) 
t = (mean - pMean) / np.sqrt(var/df)
p = stats.t.cdf(t, df=df-1)
return t, 1-p


# 或直接通过scipy库计算
tTest, pVal = scipy.stats.ttest_1samp(data, popmean=pMean,alternative='greater')

如图,右尾检验t值概率7.28%大于显著性水平5%,所以无法拒绝原假设。

故我们可以得出结论:假设延迟是10ms,在我们采样的100次请求的平均延迟是10.54ms的概率是7.27%,大于显著性水平5%,所以无法拒绝原假设,我们相信平均延迟小于10ms。

如果定义显著性水平时,我们将其设置为10%,则会拒绝原假设。那到底该如何定义显著性水平呢?其实显著性选择有很大的主观性,如果我们偏向于拒绝原假设,则选择一个稍大的α值,这样就拒绝原假设的概率就大一些。

当然,也可以直接给出p值。给出这样的结论:如果平均延迟是10ms,我们测试的100次请求平均延迟是10.54ms,这种测试数据出现的概率是7.27%。或者:根据测试的100次请求结果来看,在95%的置信水平下,接口延迟没有大于10ms。

写在最后

假设检验还可以用在很多我们熟悉的场景中,例如AB实验,通过双样本检验新算法的点击率比旧算法高。在本文中,我们探讨了假设检验在工作中的重要性和应用。通过理解假设检验的基本原理和步骤,可以将数据驱动的思维融入到日常工作中,以更明智的方式做出决策。假设检验为我们提供了一种科学的方法来评估不同选项之间的差异,并基于数据进行决策。通过收集样本数据、选择适当的假设检验方法,并解释结果,我们可以获得有力的统计证据,支持我们的选择和实践。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 什么是假设检验
    • 先来看看几个概念
      • 标准差、均值与中心极限理论
      • 原假设与备择假设
      • 显著性水平、置信区间
      • 检验统计量
      • 单侧检验与双侧检验
      • p值
    • 假设检验
    • 检验假设
    • 写在最后
    相关产品与服务
    测试服务
    测试服务 WeTest 包括标准兼容测试、专家兼容测试、手游安全测试、远程调试等多款产品,服务于海量腾讯精品游戏,涵盖兼容测试、压力测试、性能测试、安全测试、远程调试等多个方向,立体化安全防护体系,保卫您的信息安全。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档