目录
一、概率
1. 概率的定义
2. 概率质量函数与概率密度函数
3. 条件概率
4. 期望值
二、MADlib 的概率相关函数
1. 函数语法
2. 示例
(1)求标准正态分布下,1 的概率密度函数
(2)求标准正态分布下,1 的累积分布函数
(3)求标准正态分布下,概率为 0、0.25、0.5、0.75、1 的分位数值。
三、统计推论
1. 点估计
2. 中心极限定理
3. 区间估计
4. 假设检验
四、MADlib 的假设检验
1. 输入的数据
2. 使用方法
五、MADlib 假设检验示例
1. 单样本 T 检验
(1)建立检验假设,确定检验标准
(2)执行单样本 T 检验
2. 带参数两样本 T 检样
(1)建立检验假设,确定检验标准
(2)执行带参数两样本 T 检样
3. F-Test 检验
4. 拟合优度检验
(1)建立检验假设,确定检验标准
(2)执行拟合优度检验
5. 卡方独立性检验
(1)建立检验假设,确定检验标准
(2)卡方独立性检验
6. 方差分析
7. Kolmogorov-Smirnov 检验
(1)建立检验假设,确定检验标准
(2)执行 K-S 检验
8. Mann-Whitney 检验
9. Wilcoxon 符号秩检验
样本是随机变量,统计量作为样本的函数自然也是随机变量。当用它们去推断总体时,有多大的可靠性与统计量的概率分布有关。本篇学习概率统计的基本知识,以及在此基础上的统计推论。MADlib 提供了概率函数和统计推论两个模块,分别用于实现概率和假设检验相关的函数。
一、概率
1. 概率的定义
我们从随机试验开始讨论。随机试验(random experiment)是测量其结果不确定的过程的试验,所有可能结果的集合称为样本空间(sample space)Ω。例如,对于掷一个色子,Ω={1,2,3,4,5,6} 是样本空间。事件(event)E 对应于这些结果的一个子集,即 E⊆Ω 。例如,E={2,4,6} 是掷一个色子时观察到偶数点的事件。
概率 P 是定义在样本空间 Ω 上的实数值的函数,满足如下性质:
- 对于任意事件 E⊆Ω,0≤P(E)≤1。
- P(Ω)=1。
- 对于任意不相交的事件集
,
事件 E 的概率记作 P(E),是在可能无穷多次试验中观测到 E 的次数所占的比例。
2. 概率质量函数与概率密度函数
在随机试验中,通常有一个我们想测量的量。例如,统计掷 50 次硬币背面朝上的次数。因为这种量值依赖于随机试验的结果,所以这种感兴趣的量称为随机变量(random variable)。随机变量的值可能是离散的或连续的。
对于离散随机变量 X,X 取特定值 x 的概率是 X(e)=x 的所有结果 e 的总概率。
P(X=x)=P(E={e|e∈Ω,X(e)=x})
离散随机变量 X 的概率分布也称作它的概率质量函数(probability mass function,pmf)。
例1,考虑随机投一枚均匀硬币 4 次的随机试验。该试验有 种可能的结果。设 X 是随机变量,度量在试验中观测到背面的次数。X 的 5 个可能值是 0、1、2、3、4。X 的概率质量函数由下表给出。P(X=2)=6/16,因为在 4 次投掷中观测到两次背面的结果有 6 种。
X | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
P(X) | 1/16 | 4/16 | 6/16 | 4/16 | 1/16 |
如果 X 是连续随机变量,则 X 的值在 a 和 b 之间的概率为:
函数 称为累积分布函数(Cumulative Distribution Function,CDF),函数 f(x) 称为概率密度函数(probability density function,pdf)。因为 f 是连续分布,所以 X 取特定值 x 的概率总是为 0。
表1 显示了一些著名的离散和连续概率函数。概率(质量或密度)函数的概念可以推广到多个随机变量。例如,如果 X 和 Y 是随机变量,则 p(X,Y) 表示联合(joint)概率函数。如果P(X,Y)=P(X)×P(Y),表示随机变量 X 和 Y 是相互独立的。两个随机变量是独立的,意味着一个变量的值对另一个的值没有影响。
概率函数 | 参数 | |
---|---|---|
高斯 | | μ,σ |
伯努利 | | n,p |
泊松 | | θ |
指数 | | θ |
Г | | λ,α |
卡方 | | k |
表1 概率函数的例子(Γ(n+1)=nΓ(n) 并且 Γ(1)=1)
3. 条件概率
对于理解随机变量之间的依赖性,条件概率(conditional probability)是另一个有用的概念。给定 X,变量 Y 的条件概率记作 P(Y|X),定义为:
如果 X 和 Y 是独立的,则 P(Y|X)=P(Y)。使用称作 Bayes 定理的公式,条件概率 P(Y|X) 和 P(X|Y) 都可以用另一个表示。Bayes 定理由下式给出:
如果 是随机变量 X 的所有可能的结果集,则上式的分母可以用下式表示:
上式称作全概率律(law of total probability)。
4. 期望值
随机变量 X 的函数 g 的期望值(expected value)记作 E[g(X)],是 g(X) 的加权平均值,其中权重由 X 的概率函数给出。如果 X 是离散随机变量,则它的期望值可以用下式计算:
如果 X 是连续随机变量,则:
其中 f(X) 是 X 的概率密度函数。本节的其余部分只考虑离散随机变量的期望值,对应连续随机变量的期望值可以通过用积分取代求和得到。
在概率论中,有一些特别有用的期望值。首先,如果 g(X)=X,则:
这个期望值对应于随机变量 X 的均值(mean)。另一个有用的期望值是 时的期望值。这个函数的期望值是:
这个期望值对应于随机变量 X 的方差(variance)。方差的平方根对应于随机变量 X 的标准差(standard deviation)。
例2,考虑例1 中的随机试验。掷 4 次均匀的硬币,期望看到背面朝上的平均次数为:
期望看到背面朝上次数的方差为:
对于一对随机变量,要计算的一个有用的期望是协方差(covariance)函数 Cov,它定义如下:
注意,随机变量 X 的方差等于 Cov(X,X)。函数的期望值还具有如下性质:
- 如果 α 是常量,则 E[α]=α。
- E[αX]=αE[X]
- E[αX + bY]=αE[X] + bE[Y]。
根据这些性质,方差和协方差公式可以写成如下形式:
二、MADlib 的概率相关函数
MADlib 的概率函数(prob)模块提供了丰富的概率累积分布、密度/质量和分位函数。为了便于使用,所有累积分布和密度/质量函数(简写分别为 CDF 和 PDF/PMF)定义为处理包括无穷大在内的所有浮点数范围内的数据。若输入数据为 NULL 或者不是数字,函数产生的结果也是 NULL或非数字。无穷大输入的运算结果将受限于浮点数的表示范围。
分位函数(Quantile Function)是这样一个累积概率分布函数 F,它接收概率参数 p∈[0,1],如果存在一个唯一的 x,使得 F(x)=p,则返回 x。如果不存在这样的 x,当 p<0.5,结果返回 sup{x∈D|F(x)<=p},即所有满足 F(x)<=p 的 x 的上界值;当 p>=0.5,结果为 inf{x∈D|F(x)>=p},即所有满足 F(x)>=p 的 x 的下界值。其中 D 表示分布的值域,这里包括连续的实数集 R,以及离散分布的非负整数集 N。
很明显,上面的公式包括以下特殊情况。0 分位数总是数据集合中的最小值,1 分位数总是数据集合中的最大值。对于离散非负整数集合分布上的分位数 p∈[0,1],由于 x∈N,因此公式演变为 F(x)<p<F(x+1),就是说当 p<0.5 时,p 分位数返回满足公式的 x,而当 p>=0.5 时,p 分位数返回满足公式的 x+1。为了确保能得到分位数,作为一种特殊情况,p<F(0) 的 p 分位数为 0。
1. 函数语法
-- 累积分布函数
distribution_cdf(random variate[, parameter1 [, parameter2 [, parameter3] ] ])-- 概率密度/质量函数
distribution_{pdf|pmf}(random variate[, parameter1 [, parameter2 [, parameter3] ] ])-- 分位函数:
distribution_quantile(probability[, parameter1 [, parameter2 [, parameter3] ] ])
其中 distribution 指的是某种具体的分布,分布不同,参数也有所不同。MADlib 1.10.0 中提供的概率函数有 91 个,可按不同概率分布可分成以下类别。
- 伯努利分布
float8 bernoulli_cdf (float8 x, float8 sp)
float8 bernoulli_pmf (int4 x, float8 sp)
float8 bernoulli_quantile (float8 p, float8 sp)
- 贝塔分布
float8 beta_cdf (float8 x, float8 alpha, float8 beta)
float8 beta_pdf (float8 x, float8 alpha, float8 beta)
float8 beta_quantile (float8 p, float8 alpha, float8 beta)
- 二项分布
float8 binomial_cdf (float8 x, int4 n, float8 sp)
float8 binomial_pmf (int4 x, int4 n, float8 sp)
float8 binomial_quantile (float8 p, int4 n, float8 sp)
- 柯西分布
float8 cauchy_cdf (float8 x, float8 location, float8 scale)
float8 cauchy_pdf (float8 x, float8 location, float8 scale)
float8 cauchy_quantile (float8 p, float8 location, float8 scale)
- 卡方分布
float8 chi_squared_cdf (float8 x, float8 df)
float8 chi_squared_pdf (float8 x, float8 df)
float8 chi_squared_quantile (float8 p, float8 df)
- 指数分布
float8 exponential_cdf (float8 x, float8 lambda)
float8 exponential_pdf (float8 x, float8 lambda)
float8 exponential_quantile (float8 p, float8 lambda)
- 极值分布
float8 extreme_value_cdf (float8 x, float8 location, float8 scale)
float8 extreme_value_pdf (float8 x, float8 location, float8 scale)
float8 extreme_value_quantile (float8 p, float8 location, float8 scale)
- 费舌尔分布
float8 fisher_f_cdf (float8 x, float8 df1, float8 df2)
float8 fisher_f_pdf (float8 x, float8 df1, float8 df2)
float8 fisher_f_quantile (float8 p, float8 df1, float8 df2)
- 伽玛分布
float8 gamma_cdf (float8 x, float8 shape, float8 scale)
float8 gamma_pdf (float8 x, float8 shape, float8 scale)
float8 gamma_quantile (float8 p, float8 shape, float8 scale)
- 几何分布
float8 geometric_cdf (float8 x, float8 sp)
float8 geometric_pmf (int4 x, float8 sp)
float8 geometric_quantile (float8 p, float8 sp)
- 超几何分布
float8 hypergeometric_cdf (float8 x, int4 r, int4 n, int4 N)
float8 hypergeometric_pmf (int4 x, int4 r, int4 n, int4 N)
float8 hypergeometric_quantile (float8 p, int4 r, int4 n, int4 N)
- 逆伽玛分布
float8 inverse_gamma_cdf (float8 x, float8 shape, float8 scale)
float8 inverse_gamma_pdf (float8 x, float8 shape, float8 scale)
float8 inverse_gamma_quantile (float8 p, float8 shape, float8 scale)
- Kolmogorov 分布
float8 kolmogorov_cdf (float8 x)
- 拉普拉斯分布
float8 laplace_cdf (float8 x, float8 mean, float8 scale)
float8 laplace_pdf (float8 x, float8 mean, float8 scale)
float8 laplace_quantile (float8 p, float8 mean, float8 scale)
- 逻辑斯谛分布
float8 logistic_cdf (float8 x, float8 mean, float8 scale)
float8 logistic_pdf (float8 x, float8 mean, float8 scale)
float8 logistic_quantile (float8 p, float8 mean, float8 scale)
- 对数正态分布
float8 lognormal_cdf (float8 x, float8 location, float8 scale)
float8 lognormal_pdf (float8 x, float8 location, float8 scale)
float8 lognormal_quantile (float8 p, float8 location, float8 scale)
- 负二项分布
float8 negative_binomial_cdf (float8 x, float8 r, float8 sp)
float8 negative_binomial_pmf (int4 x, float8 r, float8 sp)
float8 negative_binomial_quantile (float8 p, float8 r, float8 sp)
- 非中心贝塔分布
float8 non_central_beta_cdf (float8 x, float8 alpha, float8 beta, float8 ncp)
float8 non_central_beta_pdf (float8 x, float8 alpha, float8 beta, float8 ncp)
float8 non_central_beta_quantile (float8 p, float8 alpha, float8 beta, float8 ncp)
- 非中心卡方分布
float8 non_central_chi_squared_cdf (float8 x, float8 df, float8 ncp)
float8 non_central_chi_squared_pdf (float8 x, float8 df, float8 ncp)
float8 non_central_chi_squared_quantile (float8 p, float8 df, float8 ncp)
- 非中心 F 分布
float8 non_central_f_cdf (float8 x, float8 df1, float8 df2, float8 ncp)
float8 non_central_f_pdf (float8 x, float8 df1, float8 df2, float8 ncp)
float8 non_central_f_quantile (float8 p, float8 df1, float8 df2, float8 ncp)
- 非中心 T 分布
float8 non_central_t_cdf (float8 x, float8 df, float8 ncp)
float8 non_central_t_pdf (float8 x, float8 df, float8 ncp)
float8 non_central_t_quantile (float8 p, float8 df, float8 ncp)
- 正态分布
float8 normal_cdf (float8 x, float8 mean=0, float8 sd=1)
float8 normal_cdf (float8 x, float8 mean)
float8 normal_cdf (float8 x)
float8 normal_pdf (float8 x, float8 mean=0, float8 sd=1)
float8 normal_pdf (float8 x, float8 mean)
float8 normal_pdf (float8 x)
float8 normal_quantile (float8 p, float8 mean=0, float8 sd=1)
float8 normal_quantile (float8 p, float8 mean)
float8 normal_quantile (float8 p)
- 帕累托分布
float8 pareto_cdf (float8 x, float8 scale, float8 shape)
float8 pareto_pdf (float8 x, float8 scale, float8 shape)
float8 pareto_quantile (float8 p, float8 scale, float8 shape)
- 泊松分布
float8 poisson_cdf (float8 x, float8 mean)
float8 poisson_pmf (int4 x, float8 mean)
float8 poisson_quantile (float8 p, float8 mean)
- 瑞利分布
float8 rayleigh_cdf (float8 x, float8 scale)
float8 rayleigh_pdf (float8 x, float8 scale)
float8 rayleigh_quantile (float8 p, float8 scale)
- 学生 t 分布
float8 students_t_cdf (float8 x, float8 df)
float8 students_t_pdf (float8 x, float8 df)
float8 students_t_quantile (float8 p, float8 df)
- 三角分布
float8 triangular_cdf (float8 x, float8 lower, float8 mode, float8 upper)
float8 triangular_pdf (float8 x, float8 lower, float8 mode, float8 upper)
float8 triangular_quantile (float8 p, float8 lower, float8 mode, float8 upper)
- 均匀分布
float8 uniform_cdf (float8 x, float8 lower, float8 upper)
float8 uniform_pdf (float8 x, float8 lower, float8 upper)
float8 uniform_quantile (float8 p, float8 lower, float8 upper)
- 韦布尔分布
float8 weibull_cdf (float8 x, float8 shape, float8 scale)
float8 weibull_pdf (float8 x, float8 shape, float8 scale)
float8 weibull_quantile (float8 p, float8 shape, float8 scale)
2. 示例
(1)求标准正态分布下,1 的概率密度函数
select madlib.normal_pdf(1,0,1), exp(-0.5)/sqrt(2*pi());
结果:
normal_pdf | ?column?
-------------------+-------------------0.241970724519143 | 0.241970724519143
(1 row)
(2)求标准正态分布下,1 的累积分布函数
select madlib.normal_cdf(1,0,1);
结果:
normal_cdf
-------------------0.841344746068543
(1 row)
正态分布的累积分布函数为: ,上面的查询是将 x=1、μ=0、σ=1 代入函数所求得的值。
(3)求标准正态分布下,概率为 0、0.25、0.5、0.75、1 的分位数值。
\x on
select madlib.normal_quantile(0, 0, 1),madlib.normal_quantile(0.25, 0, 1),madlib.normal_quantile(0.5, 0, 1),madlib.normal_quantile(0.75, 0, 1),madlib.normal_quantile(1, 0, 1);
结果:
-[ RECORD 1 ]---+-------------------
normal_quantile | -Infinity
normal_quantile | -0.674489750196082
normal_quantile | 0
normal_quantile | 0.674489750196082
normal_quantile | Infinity
三、统计推论
为了获取关于总体的结论,从整个总体收集数据通常是不可行的。相反,我们必须基于从样本数据收集的证据得到合理的结论。这种基于样本数据获取关于总体的可靠结论的过程称作统计推论(statistical inference)。概括地说,统计推论是在对样本数据进行描述的基础上,对统计总体的未知数量特征做出以概率形式表述的推论。
1. 点估计
在统计学中,术语统计量(statistic)是指从样本数据推导出的数值量。两个最有用的统计量是样本均值 和样本方差
:
使用样本统计量估计总体参数的过程称为点估计(point estimation)。
例3,假设 是从均值
、方差
的总体抽取的 N 个独立同分布观测的随机样本。令
为样本均值,则:
其中,,因为所有观测都来自均值为
的相同分布。这一结果表明样本的均值
逼近总体均值
,特别是当 N 充分大时。用统计学的术语来说,样本均值称作总体均值的无偏(unbiased)估计。可以证明样本均值的方差为:
由于总体的方差通常是未知的,因此通常用样本方差 替换
来近似总体均值的方差。量
称为均值的标准误差(standard error)。
2. 中心极限定理
正态分布是最常用的概率分布,因为很多随机现象都可以用这种分布建模。这是称作中心极限定理(central limit theorem)的统计学原理的推论。
中心极限定理:考虑从均值为 、方差为
的概率分布抽取的、大小为 N 的随机样本。如果
是样本均值,则当样本的规模增大时,
的分布逼近均值为
、方差为
的正态分布。
无论随机变量从何种分布提取,中心极限定理都成立。例如,假设我们从具有某个未知分布的数据集随机地抽取 N 个独立实例。令 是一个随机变量,它指示第 i 个实例是否被给定的分类器正确预测,即如果该实例被正确分类则
,否则
。样本均值
表示分类器的期望准确率。中心极限定理表明,尽管抽取实例的分布可能不是正态的,但是期望准确率(即样本均值)往往是正态分布。
3. 区间估计
在估计总体的参数时,指出估计的可靠性是有用的。例如,假设我们对由随机抽取的观测估计总体均值 感兴趣。使用诸如样本均值
这样的点估计可能并不充分,特别是当样本的规模比较小时尤其如此。作为替代,给出一个以高概率包含总体均值的区间可能更有用。这种找到总体参数的区间的估计任务称为区间估计(interval estimation)。令 θ 是需要估计的总体参数。如果:
则 () 是 θ 在置信水平(confidence level)1-α 上的置信区间(confidence interval)。图1 显示了由均值为 0、方差为 1 的正态分布导出的参数的 95% 置信区间。正态分布下的阴影面积为 0.95。换言之,如果我们从该分布产生一个样本,则被估计的参数落在 -2 和 +2 之间的可能性为 95%。
图1 参数的置信区间
考虑一个随机抽取的观测序列 。我们想根据样本均值
,在 68% 置信区间估计总体均值
。根据中心极限定理,当 N 充分大时,
逼近均值为
、方差为
的正态分布。可以用如下方法把这种分布变换为标准正态分布(即均值为 0、方差为 1 的正态分布):
其中总体的标准差用样本均值的标准误差近似。查标准正态分布概率表得到 P(-1<Z<1)=0.68,该概率可以写成:
或等价地改成:
因此, 的 68% 置信区间为
。
4. 假设检验
假设检验是数理统计中按照一定的假设条件由样本推断总体的一种方法,假设检验有时也称为“显著性检验(Test of statistical significant)”,是研究样本与样本之间、样本与总体之间的误差是由抽样误差引起还是本质误差引起的统计推论方法。它的基本思想是在假设成立的条件下,根据某个统计方法(如T检验、卡方检验等)估计输入数据的统计特性,根据统计特性和输入数据的分布估计假设成立的概率大小,如果小于某一个预先设定的“显著性水平(significant level)”则说明假设不成立,反之则说明假设成立。
假设检验所定义的假设称为零假设,数学上一般写成 H0。与 H0 对立的假设,即对立假设,也叫备择假设。由于我们对于假设的判断是基于概率统计所作出的,那么我们就很有可能(一定的概率)做出错误的判断。错误分两种,第一类错误为 H0 假设成立,但是我们却认为它不成立,第二类错误是说 H0 不成立,但是我们却认为它成立。一般而言,第一类错误更难为人所忍受,所以在判断时,允许犯这种错误的可能性必须要极低——即犯第一类错的事件应该是一个小概率事件。假设检验就是基于这种小概率原理,事先确定作为判断的标准,即允许犯错的小概率标准,这种小概率标准就是统计学上定义的“显著性水平 α”,如果根据假设计算出来的概率小于这个显著性水平,则拒绝原假设,反之,如果大于这个标准,则承认原假设。因此,一般把 1-α 称为“置信区间”或者“接收区间”,小于 α 的区间称为“拒绝区间”。
举个例子来说明,一个人被控诉犯罪,陪审团根据现有的条件做出对这个人有罪还是无罪的判断。事实上,陪审团就是进行一个假设检验。假设 H0:被告无罪;假设 H1:被告有罪。当然,陪审团现在还不知道哪个假设是成立的,他们必须根据控辩双方的证词做出判断,判断的结果只有两种,一种是被告无罪释放,一种是被告罪名成立。在判断的过程中,陪审团可能犯的错有两种,一种是被告本来无罪被判成有罪,一种是被告有罪却无罪释放。从司法的角度来看,第一类的错误更严重,因此我们的司法系统要求构建的第一类错误的概率尽可能小。
假设检验的基本步骤如下:
- 提出检验假设又称无效假设,符号是 H0;备择假设的符号是 H1。H0 是样本与总体或样本与样本间的差异是由抽样误差引起的,H1 是样本与总体或样本与样本间存在本质差异。
- 选定可以允许的小概率标准,即假设 H0 成立却错误判断的可允许范围 α;当检验假设为真,但被错误地拒绝的概率,记作 α,通常取 α=0.05 或 α=0.01。
- 选定统计方法,由样本观察值按相应的公式计算出统计量的大小,如 Z 值、T 值等。根据数据的类型和特点,可分别选用 F 检验,T 检验,秩和检验、卡方检验等。
- 根据统计量的大小及其分布确定检验假设成立的可能性 P 的大小并判断结果。若 P>α,结论为按 α 所取水准不显著,不拒绝 H0,即认为差别很可能是由于抽样误差造成的,在统计上不成立;如果 P≤α,结论为按所取 α 水准显著,拒绝 H0,接受 H1,则认为此差别不大可能仅由抽样误差所致,很可能是实验因素不同造成的,故在统计上成立。P 值的大小一般可通过查阅相应的界值表得到。
假设检验一般是参数、非参数检验都可以,但对于能使用参数检验的,首选参数检验,对不能满足条件的才选用非参数检验。参数检验是在总体分布形式已知的情况下,对总体分布的参数如均值、方差等进行推断的方法。但是,在数据分析过程中,由于种种原因,人们往往无法对总体分布形态作简单假定,此时参数检验的方法就不再适用了。非参数检验正是一类基于这种考虑,在总体方差未知或知道甚少的情况下,利用样本数据对总体分布形态等进行推断的方法。由于非参数检验方法在推断过程中不涉及有关总体分布的参数,因而得名“非参数检验”。
四、MADlib 的假设检验
1. 输入的数据
输入的数据被假定为所有行存储的都是规范化值。一般来说,期望如下形式的输入数据。
- 单样本检验输入数据
{TABLE|VIEW} source ( ... value DOUBLE PRECISION ...
)
- 两样本检验输入数据
{TABLE|VIEW} source ( ... first BOOLEAN, value DOUBLE PRECISION ...
)
first 为真,表示数据来自第一个样本,否则来自第二个样本。
- 多样本检验输入数据
{TABLE|VIEW} source ( ... group INTEGER, value DOUBLE PRECISION ...
)
group 标识数据所属的样本。
2. 使用方法
无论哪种输入数据形式,所有的检验都是作为聚合函数实现的。非参数检验实现为有序聚合函数,因此需要包含 ORDER BY 子句。下面给出了最简单的用法形式。
(1)运行参数单样本检验
select test(value) from source,其中 test 可以是下面两个函数之一:
- t_test_one(单样本 t 检验)
- chi2_gof_test(卡方拟合优度检验)
(2)运行参数两样本/多样本检验
select test(first/group, value) from source,其中 test 可以是下面函数之一:
- f_test(F 检验)
- t_test_two_pooled(等方差两样本 t 检验)
- t_test_two_unpooled(韦尔奇 t 检验)
- one_way_anova(多样本单向方差分析)
(3)运行非参数两样本/多样本检验
select test(first/group, value order by value) from source,其中 test 可以是下面函数之一:
- ks_test(Kolmogorov-Smirnov 检验)
- mw_test(Mann-Whitney 检验)
- wsr_test (多样本 Wilcoxon 符号秩检验)
五、MADlib 假设检验示例
1. 单样本 T 检验
问题1:
正常人的脉搏平均数为 72次/分。现测得 15 名患者的脉搏:71、55、76、68、72、69、56、70、79、67、58、77、63、66、78。试问这 15 名患者的脉搏与正常人的脉搏是否有差异?假设脉搏数据符合正态分布。
该问题中只提供了一组样本,因此采用单样本 T 检验。
(1)建立检验假设,确定检验标准
H0:这 15 名患者的脉搏与正常人的脉搏无显著差异
H1:这 15 名患者的脉搏与正常人的脉搏有显著差异
ɑ=0.05
一般来说,我们将一个假设放在 H0 上,是因为:1、我们对这个论述“感兴趣”;2、方便构建检验统计量及确定相应的分布。选择 H0、H1 的思考逻辑是:为了检验 H0 是否正确,先假定它正确。如果样本的观测值得出一个与 H0 应有的结果完全矛盾的结果,我们就“不能接受(拒绝)H0”,转而接受 H1 的假设。出于以上的情况。H0,H1 是不对等的,不能随意交换。通常情况下 H0 要取那个在实践中受到保护、不证自明、要有足够的证据才能否定它的等等诸如此类的命题。实际应用中我们常把相等的、无差别的、等号成立的结论作为 H0,将待证明的、不相等的、有差别的命题作为 H1。所以在具体统计中的参数检验,H0 表示相等,H1 则是大于、小于或者不相等。
(2)执行单样本 T 检验
-- 建立输入表,生成数据
drop table if exists t1;
create table t1 (a int);
insert into t1 values
(71),(55),(76),(68),(72),(69),(56),
(70),(79),(67),(58),(77),(63),(66),(78); -- 执行单样本T检验
select (madlib.t_test_one(a - 72)).* from t1;
结果:
statistic | df | p_value_one_sided | p_value_two_sided
-------------------+----+-------------------+---------------------1.83625033332174 | 14 | 0.956177748242533 | 0.0876445035149334
(1 row)
从执行结果可知,p_value=0.088,按 ɑ=0.05 显著性水平,p>ɑ,不拒绝 H0,差异无统计学意义。说明这 15 名患者的脉搏与正常人的脉搏差异不显著。
madlib.t_test_one 函数输出四个字段:statistic 是统计量,df 表示自由度,p_value_one_sided 表示单尾 P 值,p_value_two_sided 表示双尾 P 值。其中统计量的计算公式为:(样本均值 - 标准值)/(样本标准差/样本数量的平方个)。可以执行以下查询验证函数输出的统计值:
dm=# select (avg(a)-72)/(madlib.array_stddev(array_agg(a))/sqrt(count(*)))
dm-# from t1;?column?
--------------------1.83625033332176
(1 row)
自由度为:样本数量 - 1 = 15 - 1 = 14
2. 带参数两样本 T 检样
问题2:
从问题1 的 15 名患者脉搏数据随机抽样两组假设的样本,判断两个整体数据有无显著性差异。
(1)建立检验假设,确定检验标准
H0:无显著差异
H1:有显著差异
ɑ=0.05
(2)执行带参数两样本 T 检样
-- 建立输入表,生成数据
drop table if exists t2;
create table t2 as
select * from (select true is_sample1,a from t1 order by random() limit 10) t1
union all
select * from (select false is_sample1,a from t1 order by random() limit 10) t2;
假设总体方差相等。
select (madlib.t_test_two_pooled(is_sample1, a)).* from t2;
结果:
statistic | df | p_value_one_sided | p_value_two_sided
-------------------+----+-------------------+-------------------0.267261241912424 | 18 | 0.396153078874935 | 0.792306157749869
(1 row)
假设总体方差不等。
select (madlib.t_test_two_unpooled(is_sample1, a)).* from t2;
结果:
statistic | df | p_value_one_sided | p_value_two_sided
-------------------+------------------+-------------------+-------------------0.267261241912424 | 17.9934717562789 | 0.396153625447375 | 0.792307250894749
(1 row)
从执行结果可知,p_value=0.79,按 ɑ=0.05 显著性水平,p>ɑ,不拒绝 H0,差异无统计学意义。说明两组数据无显著差异。
3. F-Test 检验
F 检验又叫方差齐性检验。在两样本 T 检验中要用到 F 检验。从两研究总体中随机抽取样本,要对这两个样本进行比较的时候,首先要判断两总体方差是否相同,即方差齐性。若两总体方差相等,则直接用 T 检验,若不等,可采用 T' 检验或变量变换或秩和检验等方法。其中要判断两总体方差是否相等,就可以用 F 检验。
问题3:
对问题2 生成的两组数据执行 F-Test 检验,判断两组整体数据方差是否相等。
select (madlib.f_test(is_sample1, a)).* from t2;
结果:
statistic | df1 | df2 | p_value_one_sided | p_value_two_sided
-------------------+-----+-----+-------------------+-------------------0.962616822429907 | 9 | 9 | 0.522164040341636 | 0.955671919316729
(1 row)
p_value=0.96,按 ɑ=0.05 显著性水平,p>ɑ,说明两组数据方差无显著差异。
4. 拟合优度检验
拟合优度检验是用卡方统计量进行统计显著性检验的重要内容之一。它依据总体分布状况,计算出分类变量中各类别的期望频数,与分布的观察频数进行对比,判断期望频数与观察频数是否有显著差异,从而达到从分类变量进行分析的目的。
问题4:
交通部门统计事故与星期的关系得到:
星期:一 二 三 四 五 六 日
次数:36 23 29 31 34 60 25
问每天事故发生的可能性是否相同?
(1)建立检验假设,确定检验标准
H0:每天事故发生的可能性相同
H1:每天事故发生的可能性不同
ɑ=0.05
(2)执行拟合优度检验
-- 建立表,生成数据
drop table if exists t1;
create table t1 (a int);
insert into t1 values (36),(23),(29),(31),(34),(60),(25); -- 执行拟合优度检验
select (madlib.chi2_gof_test(a, avg_a)).* from t1,(select avg(a) avg_a from t1) t;
结果:
statistic | p_value | df | phi | contingency_coef
------------------+--------------------+----+------------------+-------------------26.9411764705882 | 0.0001485283360829 | 6 | 1.96182045452644 | 0.890932563042277
(1 row)
p_value=0.00015,按 ɑ=0.05 显著性水平,p<ɑ,拒绝 H0,差异具有统计学意义,说明事故发生的可能性不同,的确与星期几有关。
5. 卡方独立性检验
MAdlib 的卡方独立性检验利用拟合优度检验函数实现。对于输入矩阵的的每个元素 (i,j),它的期望值为 sum(第 i 行) * sum(第 j 列)。例如,元素 (2,1) 的期望值为 sum(第 2 行) * sum(第 1 列)。
卡方独立性检验就是统计样本的实际观测值与理论推论值之间的偏离程度,它决定了卡方值的大小。卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合,若两个值完全相等时,卡方值就为 0,表明理论值完全符合。
问题5:
某医疗机构为了解患肺癌与吸烟是否有关,进行了一次抽样调查,共调查了 9965 个成年人,其中吸烟者 2148 人,不吸烟者 7817 人。调查结果是:吸烟的 2148 人中 49 人患肺癌,2099 人不患肺癌;不吸烟的 7817 人中 42 人患肺癌,7775 人不患肺癌。根据这些数据能否断定:患肺癌与吸烟有关?
(1)建立检验假设,确定检验标准
H0:患肺癌与吸烟无关
H1:患肺癌与吸烟有关
ɑ=0.05
(2)卡方独立性检验
-- 建立表,生成数据
drop table if exists t1;
create table t1 (x int, y int, observed int);
insert into t1 values
(1,1,7775),(1,2,42),(2,1,2099),(2,2,49); -- 执行卡方独立性检验
select (madlib.chi2_gof_test(observed, expected, deg_freedom)).* from (-- 计算期望值和自由度 select observed, sum(observed) over (partition by x)::double precision * sum(observed) over (partition by y) as expected from t1) t1, (select (count(distinct x) - 1) * (count(distinct y) - 1) as deg_freedom from t1) t2;
结果:
statistic | p_value | df | phi | contingency_coef
------------------+----------------------+----+------------------+-------------------56.6318791461147 | 5.25529137942519e-14 | 1 | 3.76270777320385 | 0.966451294384498
(1 row)
p_value 比 ɑ 小得多,因此拒绝 H0,患肺癌与吸烟有关。
6. 方差分析
一个复杂的事物,其中往往有许多因素互相制约又互相依存。方差分析的目的是通过数据分析找出对该事物有显著影响的因素,各因素之间的交互作用,以及显著影响因素的最佳水平等。方差分析是在可比较的数组中,把数据间的总的“变差”按各指定的变差来源进行分解的一种技术。对变差的度量,采用离差平方和。方差分析方法就是从总离差平方和分解出可追溯到指定来源的部分离差平方和,这是一个很重要的思想。
问题6:
设有三个车间以不同工艺生产同一种产品,为考察不同工艺对产品产量的影响,现对每个车间记录 5 天的日产量,如下所示,三个车间的日产量是否有显著差异?
序号 A1 A2 A3
1 44 50 47
2 45 51 44
3 47 53 44
4 48 55 50
5 46 51 45
-- 建立表,生成数据
drop table if exists t1;
create table t1 (x int, observed int);
insert into t1 values
(1,44),(2,50),(3,47),
(1,45),(2,51),(3,44),
(1,47),(2,53),(3,44),
(1,48),(2,55),(3,50),
(1,46),(2,51),(3,45); -- 执行方差分析
\x on
select (madlib.one_way_anova(x, observed)).* from t1;
结果:
-[ RECORD 1 ]--------+---------------------
sum_squares_between | 120
sum_squares_within | 52
df_between | 2
df_within | 12
mean_squares_between | 60
mean_squares_within | 4.33333333333333
statistic | 13.8461538461538
p_value | 0.000763570920161526
由输出的结果可以得到如下方差分析表:
差异来源 | 离差平方和 | 自由度 | 平均平方和 | F |
组间 | 120 | 2 | 60 | 13.85 |
组内 | 52 | 12 | 4.33 | |
总计 | 172 | 14 |
p_value 远小于 0.05,故得出结论是三个车间的日产量有显著差异。
7. Kolmogorov-Smirnov 检验
K-S 检验以两位数学家 Kolmogorov 和 Smirnov 的名字命名,它是一个拟合优度检验,研究样本观察值的分布和设定的理论分布是否吻合,通过对两个分布差异的分析确定是否有理由认为样本的观察结果来自所假定的理论分布总体。K-S 检验的基本思路是:先将顺序分类资料数据的理论累积频率分布与观测的经验累积频率分布加以比较,求出它们最大的偏离值,然后在给定的显著性水平上检验这种偏离值是否是偶然出现的。
从 madlib.ks_test 函数的入参定义可以看出,MADlib 的 K-S 检验只支持两样本。
dm=# \df+ madlib.ks_test
List of functions
-[ RECORD 1 ]-------+------------------------------------------
Schema | madlib
Name | ks_test
Result data type | madlib.ks_test_result
Argument data types | boolean, double precision, bigint, bigint
Type | agg
Data access | no sql
Volatility | immutable
Owner | gpadmin
Language | internal
Source code | aggregate_dummy
Description |
————————————————
问题7:
为了研究两家电信运营商套餐在目标市场的年龄维度上的分布是否相同,该电信运营公司开展了一个社会调查活动。两种通信套餐的用户年龄数据如下:
套餐1:18,18,25,22,24,23,26
套餐2:22,48,51,34,42,26,44,31,38
(1)建立检验假设,确定检验标准
H0:两种套餐的目标市场年龄分布不存在显著差异
H1:两种套餐的目标市场年龄分布存在显著差异
ɑ=0.05
(2)执行 K-S 检验
-- 建立表,生成数据
drop table if exists t1;
create table t1 (first boolean, observed int);
insert into t1 values
(true,18),(true,18),(true,25),(true,22),(true,24),(true,23),(true,26),
(false,22),(false,48),(false,51),(false,34),(false,42),(false,26),(false,44),(false,31),(false,38); -- 执行K-S检验
select (madlib.ks_test(first, observed, (select count(observed) from t1 where first), (select count(observed) from t1 where not first) order by observed)).* from t1;
结果:
statistic | k_statistic | p_value
-------------------+-----------------+---------------------0.777777777777778 | 1.6798042120791 | 0.00708102048291268
(1 row)
相应的 P 值为 0.007,在 5% 的显著性水平上,P 值足够小,因此拒绝原假设,表明两种套餐的目标市场年龄分布存在显著差异。
8. Mann-Whitney 检验
Mann-Whitney 检验假设两个样本分别来自除了总体均值以外完全相同的两个总体,目的是检验这两个总体的均值是否有显著的差别。
问题8:
一种产品有两种不同的工艺生产方法,它们的使用寿命数据如下:
工艺甲:661,669,675,679,682,692,693
工艺乙:646,649,650,651,652,662,663,672
它们的使用寿命分布是否相同?
-- 建立表,生成数据
drop table if exists t1;
create table t1 (first boolean, observed int);
insert into t1 values
(true,661),(true,669),(true,675),(true,679),(true,682),(true,692),(true,693),
(false,646),(false,649),(false,650),(false,651),(false,652),(false,662),(false,663),(false,672); -- 执行Mann-Whitney检验
select (madlib.mw_test(first, observed order by observed)).* from t1;
结果:
statistic | u_statistic | p_value_one_sided | p_value_two_sided
-------------------+-------------+-------------------+----------------------2.77746029931765 | 4 | 0.997260723378726 | 0.00547855324254737
(1 row)
P 值小于 0.05,表明两种工艺生产方法的使用寿命分布是不相同的。
9. Wilcoxon 符号秩检验
在 Wilcoxon 符号秩检验中,它把观测值和零假设的中心位置之差的绝对值的秩分别按照不同的符号相加作为其检验统计量。它适用于T检验中的成对比较,但并不要求成对数据之差服从正态分布,只要求对称分布即可。检验成对观测数据之差是否来自均值为0的总体(产生数据的总体是否具有相同的均值)。
问题9:
为了研究某放松方法(如听音乐)对于入睡时间的影响,选择了 10 名志愿者,分别记录未进行放松时的入睡时间及放松后的入睡时间(单位为分钟),得到如下数据:
放松前:21,12,12,23,19,13,20,17,14,19
放松后:12,11, 8, 9,10,15,16,17,10,16
请问该放松方法对入睡时间有无影响?
本例可以采用配对样本 T 检验,但由于样本量少,数据可能不符合正太分布,所以考虑用非参数检验。
-- 建立表,生成数据
drop table if exists t1;
create table t1 (x double precision, y double precision);
insert into t1 values
(21,12),(12,11),(12,8),(23,9),(19,10),(13,15),(20,16),(17,17),(14,10),(19,16); -- 执行Wilcoxon符号秩检验
\x on
select (madlib.wsr_test(x - y order by abs(x - y))).* from t1;
结果:
-[ RECORD 1 ]-----+--------------------
statistic | 2
rank_sum_pos | 43
rank_sum_neg | 2
num | 9
z_statistic | 2.43935288096579
p_value_one_sided | 0.00735679621140208
p_value_two_sided | 0.0147135924228042
P=0.015<0.05,拒绝原假设,认为放松前后有统计学差异。