MADlib——基于SQL的数据挖掘解决方案(9)——数据探索之概率统计

2019-05-25 19:35:20 浏览数 (1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1433058

代码语言:txt复制
    样本是随机变量,统计量作为样本的函数自然也是随机变量。当用它们去推断总体时,有多大的可靠性与统计量的概率分布有关。本篇学习概率统计的基本知识,以及在此基础上的统计推论。MADlib提供了概率函数和统计推论两个模块,分别用于实现概率和假设检验相关的函数。

一、概率

1. 概率的定义

代码语言:txt复制
    我们从随机试验开始讨论。随机试验(random experiment)是测量其结果不确定的过程的试验,所有可能结果的集合称为样本空间(sample space)Ω。例如,对于掷一个色子,Ω={1,2,3,4,5,6}是样本空间。事件(event)_E_对应于这些结果的一个子集,即
代码语言:txt复制
                          。例如,_E_={2,4,6}是掷一个色子时观察到偶数点的事件。
代码语言:txt复制
    概率_P_是定义在样本空间Ω上的实数值的函数,满足如下性质:
  1. 对于任意事件

  1. 对于任意不相交的事件集

代码语言:txt复制
    事件_E_的概率记作_P_(_E_),是在可能无穷多次试验中观测到_E_的次数所占的比例。

2. 概率质量函数与概率密度函数

代码语言:txt复制
    在随机试验中,通常有一个我们想测量的量。例如,统计掷50次硬币背面朝上的次数。因为这种量值依赖于随机试验的结果,所以这种感兴趣的量称为随机变量(random variable)。随机变量的值可能是离散的或连续的。
代码语言:txt复制
    对于离散随机变量_X_,_X_取特定值_x_的概率是_X_(_e_)=_x_的所有结果_e_的总概率。

P(X=x)=P(E={e|e∈Ω,X(e)=x})

代码语言:txt复制
    离散随机变量_X_的概率分布也称作它的概率质量函数(probability mass function,pmf)。
代码语言:txt复制
    例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

代码语言:txt复制
    如果_X_是连续随机变量,则_X_的值在_a_和_b_之间的概率为:
代码语言:txt复制
    函数

称为累积分布函数(CumulativeDistribution Function,CDF),函数f(x)称为概率密度函数(probability density function,pdf)。因为f是连续分布,所以X取特定值x的概率总是为0。

代码语言:txt复制
    表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. 条件概率

代码语言:txt复制
    对于理解随机变量之间的依赖性,条件概率(conditional probability)是另一个有用的概念。给定_X_,变量_Y_的条件概率记作_P_(_Y_|_X_),定义为:

如果XY是独立的,则P(Y|X)=P(Y)。使用称作Bayes定理的公式,条件概率P(Y|X)和P(X|Y)都可以用另一个表示。Bayes定理由下式给出:

如果

是随机变量X的所有可能的结果集,则上式的分母可以用下式表示:

上式称作全概率律(law of total probability)。

4. 期望值

代码语言:txt复制
    随机变量_X_的函数_g_的期望值(expected value)记作_E_[_g_(_X_)],是_g_(_X_)的加权平均值,其中权重由_X_的概率函数给出。如果_X_是离散随机变量,则它的期望值可以用下式计算:

如果X是连续随机变量,则:

其中f(X)是X的概率密度函数。本节的其余部分只考虑离散随机变量的期望值,对应连续随机变量的期望值可以通过用积分取代求和得到。

代码语言:txt复制
    在概率论中,有一些特别有用的期望值。首先,如果_g_(_X_)=_X_,则

这个期望值对应于随机变量X的均值(mean)。另一个有用的期望值是

时的期望值。这个函数的期望值是

这个期望值对应于随机变量X的方差(variance)。方差的平方根对应于随机变量X的标准差(standard deviation)。

代码语言:txt复制
    例2,考虑例1中的随机试验。掷4次均匀的硬币,期望看到背面朝上的平均次数为:

期望看到背面朝上次数的方差为:

代码语言:txt复制
    对于一对随机变量,要计算的一个有用的期望是协方差(covariance)函数_Cov_,它定义如下:

注意,随机变量X的方差等于Cov(X,X)。函数的期望值还具有如下性质:

  • 如果α是常量,则=α
  • EαX=αEX
  • EαX bY=αEX bEY

根据这些性质,方差和协方差公式可以写成如下形式:

二、MADlib的概率相关函数

代码语言:txt复制
    MADlib的概率函数(prob)模块提供了丰富的概率累积分布、密度/质量和分位函数。为了便于使用,所有累积分布和密度/质量函数(简写分别为CDF和PDF/PMF)定义为处理包括无穷大在内的所有浮点数范围内的数据。若输入数据为NULL或者不是数字,函数产生的结果也是NULL或非数字。无穷大输入的运算结果将受限于浮点数的表示范围。
代码语言:txt复制
    分位函数(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。
代码语言:txt复制
    很明显,上面的公式包括以下特殊情况。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. 函数语法

代码语言:javascript复制
-- 累积分布函数
distribution_cdf(random variate[, parameter1 [, parameter2 [, parameter3] ] ])

-- 概率密度/质量函数
distribution_{pdf|pmf}(random variate[, parameter1 [, parameter2 [, parameter3] ] ])

-- 分位函数:
distribution_quantile(probability[, parameter1 [, parameter2 [, parameter3] ] ])
代码语言:txt复制
    其中distribution指的是某种具体的分布,分布不同,参数也有所不同。MADlib 1.10.0中提供的概率函数有91个,可按不同概率分布可分成以下类别。
  • 伯努利分布
代码语言:javascript复制
float8 bernoulli_cdf (float8 x, float8 sp) 
float8 bernoulli_pmf (int4 x, float8 sp) 
float8 bernoulli_quantile (float8 p, float8 sp) 
  • 贝塔分布
代码语言:javascript复制
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) 
  • 二项分布
代码语言:javascript复制
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)
  • 柯西分布
代码语言:javascript复制
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)
  • 卡方分布
代码语言:javascript复制
float8 chi_squared_cdf (float8 x, float8 df) 
float8 chi_squared_pdf (float8 x, float8 df) 
float8 chi_squared_quantile (float8 p, float8 df)
  • 指数分布
代码语言:javascript复制
float8 exponential_cdf (float8 x, float8 lambda)
float8 exponential_pdf (float8 x, float8 lambda)
float8 exponential_quantile (float8 p, float8 lambda)
  • 极值分布
代码语言:javascript复制
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)
  • 费舌尔分布
代码语言:javascript复制
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)
  • 伽玛分布
代码语言:javascript复制
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)
  • 几何分布
代码语言:javascript复制
float8 geometric_cdf (float8 x, float8 sp) 
float8 geometric_pmf (int4 x, float8 sp) 
float8 geometric_quantile (float8 p, float8 sp)
  • 超几何分布
代码语言:javascript复制
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)
  • 逆伽玛分布
代码语言:javascript复制
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分布
代码语言:javascript复制
float8 kolmogorov_cdf (float8 x)
  • 拉普拉斯分布
代码语言:javascript复制
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)
  • 逻辑斯谛分布
代码语言:javascript复制
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)
  • 对数正态分布
代码语言:javascript复制
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)
  • 负二项分布
代码语言:javascript复制
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)
  • 非中心贝塔分布
代码语言:javascript复制
float8 non_central_beta_cdf (float8 x, float8 alpha, float8 beta, float8ncp) 
float8 non_central_beta_pdf (float8 x, float8 alpha, float8 beta, float8ncp) 
float8 non_central_beta_quantile (float8 p, float8 alpha, float8 beta, float8ncp)
  • 非中心卡方分布
代码语言:javascript复制
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分布
代码语言:javascript复制
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, float8ncp)
  • 非中心T分布
代码语言:javascript复制
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)
  • 正态分布
代码语言:javascript复制
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)
  • 帕累托分布
代码语言:javascript复制
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)
  • 泊松分布
代码语言:javascript复制
float8 poisson_cdf (float8 x, float8 mean) 
float8 poisson_pmf (int4 x, float8 mean) 
float8 poisson_quantile (float8 p, float8 mean)
  • 瑞利分布
代码语言:javascript复制
float8 rayleigh_cdf (float8 x, float8 scale) 
float8 rayleigh_pdf (float8 x, float8 scale) 
float8 rayleigh_quantile (float8 p, float8 scale)
  • 学生t分布
代码语言:javascript复制
float8 students_t_cdf (float8 x, float8 df) 
float8 students_t_pdf (float8 x, float8 df) 
float8 students_t_quantile (float8 p, float8 df) 
  • 三角分布
代码语言:javascript复制
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, float8upper)
  • 均匀分布
代码语言:javascript复制
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)
  • 韦布尔分布
代码语言:javascript复制
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的概率密度函数

代码语言:javascript复制
select madlib.normal_pdf(1,0,1),exp(-0.5)/sqrt(2*pi());
代码语言:txt复制
    结果:
代码语言:javascript复制
    normal_pdf     |     ?column?      
------------------- -------------------
 0.241970724519143 | 0.241970724519143
(1 row)

(2)求标准正态分布下,1的累积分布函数

代码语言:javascript复制
select madlib.normal_cdf(1,0,1);
代码语言:txt复制
    结果:
代码语言:javascript复制
    normal_cdf     
-------------------
 0.841344746068543
(1 row)
代码语言:txt复制
    正态分布的累积分布函数为: 

,上面的查询是将x=1,μ=0,σ=1代入函数所求得的值。

(3)求标准正态分布下,概率为0、0.25、0.5、0.75、1的分位数值。

代码语言:javascript复制
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);
代码语言:txt复制
    结果:
代码语言:javascript复制
-[ RECORD 1 ]--- -------------------
normal_quantile | -Infinity
normal_quantile | -0.674489750196082
normal_quantile | 0
normal_quantile | 0.674489750196082
normal_quantile | Infinity

三、统计推论

代码语言:txt复制
    为了获取关于总体的结论,从整个总体收集数据通常是不可行的。相反,我们必须基于从样本数据收集的证据得到合理的结论。这种基于样本数据获取关于总体的可靠结论的过程称作统计推论(statistical inference)。概括地说,统计推论是在对样本数据进行描述的基础上,对统计总体的未知数量特征做出以概率形式表述的推论。

1. 点估计

代码语言:txt复制
    在统计学中,术语统计量(statistic)是指从样本数据推导出的数值量。两个最有用的统计量是样本均值

和样本方差

:

代码语言:txt复制
    使用样本统计量估计总体参数的过程称为点估计(point estimation)。
代码语言:txt复制
    例3,假设

是从均值

、方差

的总体抽取的N个独立同分布观测的随机样本。令

为样本均值,则

其中,

,因为所有观测都来自均值为

的相同分布。这一结果表明样本的均值

逼近总体均值

,特别是当N充分大时。用统计学的术语来说,样本均值称作总体均值的无偏(unbiased)估计。可以证明样本均值的方差为

代码语言:txt复制
    由于总体的方差通常是未知的,因此通常用样本方差

替换

来近似总体均值的方差。量

称为均值的标准误差(standard error)。

2. 中心极限定理

代码语言:txt复制
    正态分布是最常用的概率分布,因为很多随机现象都可以用这种分布建模。这是称作中心极限定理(central limit theorem)的统计学原理的推论。
代码语言:txt复制
    中心极限定理:考虑从均值为

、方差为

的概率分布抽取的、大小为N的随机样本。如果

是样本均值,则当样本的规模增大时,

的分布逼近均值为

、方差为

的正态分布。

代码语言:txt复制
    无论随机变量从何种分布提取,中心极限定理都成立。例如,假设我们从具有某个未知分布的数据集随机地抽取_N_个独立实例。令

是一个随机变量,它指示第i个实例是否被给定的分类器正确预测,即如果该实例被正确分类则

,否则

。样本均值

表示分类器的期望准确率。中心极限定理表明,尽管抽取实例的分布可能不是正态的,但是期望准确率(即样本均值)往往是正态分布。

3. 区间估计

代码语言:txt复制
    在估计总体的参数时,指出估计的可靠性是有用的。例如,假设我们对由随机抽取的观测估计总体均值

感兴趣。使用诸如样本均值

这样的点估计可能并不充分,特别是当样本的规模比较小时尤其如此。作为替代,给出一个以高概率包含总体均值的区间可能更有用。这种找到总体参数的区间的估计任务称为区间估计(interval estimation)。令θ是需要估计的总体参数。如果

θ在置信水平(confidence level)1-α上的置信区间(confidenceinterval)。图1显示了由均值为0、方差为1的正态分布导出的参数的95%置信区间。正态分布下的阴影面积为0.95。换言之,如果我们从该分布产生一个样本,则被估计的参数落在-2和 2之间的可能性为95%。

图1 参数的置信区间

代码语言:txt复制
    考虑一个随机抽取的观测序列

。我们想根据样本均值

,在68%置信区间估计总体均值

。根据中心极限定理,当N充分大时,

逼近均值为

、方差为

的正态分布。可以用如下方法把这种分布变换为标准正态分布(即均值为0、方差为1的正态分布):

其中总体的标准差用样本均值的标准误差近似。查标准正态分布概率表得到P(-1<Z<1)=0.68。该概率可以写成

或等价地改成

因此, 的68%置信区间为

4. 假设检验

代码语言:txt复制
    假设检验是数理统计中按照一定的假设条件由样本推断总体的一种方法,假设检验有时也称为“显著性检验(Test of statistical significant)”,是研究样本与样本之间、样本与总体之间的误差是由抽样误差引起还是本质误差引起的统计推论方法。它的基本思想是在假设成立的条件下,根据某个统计方法(如T检验、卡方检验等)估计输入数据的统计特性,根据统计特性和输入数据的分布估计假设成立的概率大小,如果小于某一个预先设定的“显著性水平(significant level)”则说明假设不成立,反之则说明假设成立。
代码语言:txt复制
    假设检验所定义的假设称为零假设,数学上一般写成H0。与H0对立的假设,即对立假设,也叫备择假设。由于我们对于假设的判断是基于概率统计所作出的,那么我们就很有可能(一定的概率)做出错误的判断。错误分两种,第一类错误为H0假设成立,但是我们却认为它不成立,第二类错误是说H0不成立,但是我们却认为它成立。一般而言,第一类错误更难为人所忍受,所以在判断时,允许犯这种错误的可能性必须要极低——即犯第一类错的事件应该是一个小概率事件。假设检验就是基于这种小概率原理,事先确定作为判断的标准,即允许犯错的小概率标准,这种小概率标准就是统计学上定义的“显著性水平α”,如果根据假设计算出来的概率小于这个显著性水平,则拒绝原假设,反之,如果大于这个标准,则承认原假设。因此,一般把1-α称为“置信区间”或者“接收区间”,小于α的区间称为“拒绝区间”。
代码语言:txt复制
    举个例子来说明,一个人被控诉犯罪,陪审团根据现有的条件做出对这个人有罪还是无罪的判断。事实上,陪审团就是进行一个假设检验。假设H0:被告无罪;假设H1:被告有罪。当然,陪审团现在还不知道哪个假设是成立的,他们必须根据控辩双方的证词做出判断,判断的结果只有两种,一种是被告无罪释放,一种是被告罪名成立。在判断的过程中,陪审团可能犯的错有两种,一种是被告本来无罪被判成有罪,一种是被告有罪却无罪释放。从司法的角度来看,第一类的错误更严重,因此我们的司法系统要求构建的第一类错误的概率尽可能小。
代码语言:txt复制
    假设检验的基本步骤如下:
  1. 提出检验假设又称无效假设,符号是H0;备择假设的符号是H1。H0是样本与总体或样本与样本间的差异是由抽样误差引起的,H1是样本与总体或样本与样本间存在本质差异。
  2. 选定可以允许的小概率标准,即假设H0成立却错误判断的可允许范围α;当检验假设为真,但被错误地拒绝的概率,记作α,通常取α=0.05或α=0.01。
  3. 选定统计方法,由样本观察值按相应的公式计算出统计量的大小,如Z值、T值等。根据数据的类型和特点,可分别选用F检验,T检验,秩和检验、卡方检验等。
  4. 根据统计量的大小及其分布确定检验假设成立的可能性P的大小并判断结果。若P>α,结论为按α所取水准不显著,不拒绝H0,即认为差别很可能是由于抽样误差造成的,在统计上不成立;如果P≤α,结论为按所取α水准显著,拒绝H0,接受H1,则认为此差别不大可能仅由抽样误差所致,很可能是实验因素不同造成的,故在统计上成立。P值的大小一般可通过查阅相应的界值表得到。
代码语言:txt复制
    假设检验一般是参数、非参数检验都可以,但对于能使用参数检验的,首选参数检验,对不能满足条件的才选用非参数检验。参数检验是在总体分布形式已知的情况下,对总体分布的参数如均值、方差等进行推断的方法。但是,在数据分析过程中,由于种种原因,人们往往无法对总体分布形态作简单假定,此时参数检验的方法就不再适用了。非参数检验正是一类基于这种考虑,在总体方差未知或知道甚少的情况下,利用样本数据对总体分布形态等进行推断的方法。由于非参数检验方法在推断过程中不涉及有关总体分布的参数,因而得名“非参数检验”。

四、MADlib的假设检验

1. 输入的数据

代码语言:txt复制
    输入的数据被假定为所有行存储的都是规范化值。一般来说,期望如下形式的输入数据。
  • 单样本检验输入数据
代码语言:javascript复制
{TABLE|VIEW} source (  
    ...  
    value DOUBLE PRECISION  
    ...  
)  
  • 两样本检验输入数据
代码语言:javascript复制
{TABLE|VIEW} source (  
    ...  
    first BOOLEAN,  
    value DOUBLE PRECISION  
    ...  
)  
代码语言:txt复制
    first为真,表示数据来自第一个样本,否则来自第二个样本。
  • 多样本检验输入数据
代码语言:javascript复制
{TABLE|VIEW} source (  
    ...  
    group INTEGER,  
    value DOUBLE PRECISION  
    ...  
)
代码语言:txt复制
    group标识数据所属的样本。

2. 使用方法

代码语言:txt复制
    无论哪种输入数据形式,所有的检验都是作为聚合函数实现的。非参数检验实现为有序聚合函数,因此需要包含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 byvalue) from source,其中test可以是下面函数之一:

  • ks_test(Kolmogorov-Smirnov检验)
  • mw_test(Mann-Whitney检验)
  • wsr_test (多样本Wilcoxon符号秩检验)

五、MADlib假设检验示例

1. 单样本T检验

代码语言:txt复制
    问题1:
代码语言:txt复制
    正常人的脉搏平均数为72次/分。现测得15名患者的脉搏:71,55,76,68,72,69,56,70,79,67,58,77,63,66,78。试问这15名患者的脉搏与正常人的脉搏是否有差异?假设脉搏数据符合正态分布。
代码语言:txt复制
    该问题中只提供了一组样本,因此采用单样本T检验。

(1)建立检验假设,确定检验标准

代码语言:txt复制
    H0:这15名患者的脉搏与正常人的脉搏无显著差异
代码语言:txt复制
    H1:这15名患者的脉搏与正常人的脉搏有显著差异
代码语言:txt复制
    ɑ=0.05
代码语言:txt复制
    一般来说,我们将一个假设放在H0上,是因为1、我们对这个论述“感兴趣”;2、方便构建检验统计量及确定相应的分布。选择H0、H1的思考逻辑是:为了检验H0是否正确,先假定它正确。如果样本的观测值得出一个与H0应有的结果完全矛盾的结果,我们就“不能接受(拒绝)H0”,转而接受H1的假设。出于以上的情况。H0,H1是不对等的,不能随意交换。通常情况下H0要取那个在实践中受到保护、不证自明、要有足够的证据才能否定它的等等诸如此类的命题。实际应用中我们常把相等的、无差别的、等号成立的结论作为H0,将待证明的、不相等的、有差别的命题作为H1。所以在具体统计中的参数检验,H0表示相等,H1则是大于、小于或者不相等。

(2)执行单样本T检验

代码语言:javascript复制
-- 建立输入表,生成数据  
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;
代码语言:txt复制
    结果:
代码语言:javascript复制
     statistic     | df | p_value_one_sided | p_value_two_sided  
------------------- ---- ------------------- --------------------
 -1.83625033332174 | 14 | 0.956177748242533 | 0.0876445035149334
(1 row)
代码语言:txt复制
    从执行结果可知,p_value=0.088,按ɑ=0.05显著性水平,p>ɑ,不拒绝H0,差异无统计学意义。说明这15名患者的脉搏与正常人的脉搏差异不显著。
代码语言:txt复制
    madlib.t_test_one函数输出四个字段:statistic是统计量,df表示自由度,p_value_one_sided表示单尾P值,p_value_two_sided表示双尾P值。其中统计量的计算公式为:(样本均值 - 标准值)/(样本标准差/样本数量的平方个)。可以执行以下查询验证函数输出的统计值:
代码语言:javascript复制
dm=# select (avg(a)-72)/(madlib.array_stddev(array_agg(a))/sqrt(count(*))) 
dm-#   from t1;
     ?column?      
-------------------
 -1.83625033332176
(1 row)
代码语言:txt复制
    自由度为:样本数量 - 1 = 15 - 1 = 14

2. 带参数两样本T检样

代码语言:txt复制
    问题2:
代码语言:txt复制
    从问题1的15名患者脉搏数据随机抽样两组假设的样本,判断两个整体数据有无显著性差异。

(1)建立检验假设,确定检验标准

代码语言:txt复制
    H0:无显著差异
代码语言:txt复制
    H1:有显著差异
代码语言:txt复制
    ɑ=0.05

(2)执行带参数两样本T检样

代码语言:javascript复制
-- 建立输入表,生成数据  
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;
代码语言:txt复制
    假设总体方差相等。 
代码语言:javascript复制
select (madlib.t_test_two_pooled(is_sample1, a)).* from t2; 
代码语言:txt复制
    结果:
代码语言:javascript复制
     statistic     | df | p_value_one_sided | p_value_two_sided 
------------------- ---- ------------------- -------------------
 0.267261241912424 | 18 | 0.396153078874935 | 0.792306157749869
(1 row)
代码语言:txt复制
    假设总体方差不等。
代码语言:javascript复制
select (madlib.t_test_two_unpooled(is_sample1, a)).* from t2;
代码语言:txt复制
    结果:
代码语言:javascript复制
     statistic     |        df        | p_value_one_sided | p_value_two_sided 
------------------- ------------------ ------------------- -------------------
 0.267261241912424 | 17.9934717562789 | 0.396153625447375 | 0.792307250894749
(1 row)
代码语言:txt复制
    从执行结果可知,p_value=0.79,按ɑ=0.05显著性水平,p>ɑ,不拒绝H0,差异无统计学意义。说明两组数据无显著差异。

3. F-Test检验

代码语言:txt复制
    F检验又叫方差齐性检验。在两样本T检验中要用到F检验。从两研究总体中随机抽取样本,要对这两个样本进行比较的时候,首先要判断两总体方差是否相同,即方差齐性。若两总体方差相等,则直接用T检验,若不等,可采用T'检验或变量变换或秩和检验等方法。其中要判断两总体方差是否相等,就可以用F检验。
代码语言:txt复制
    问题3:
代码语言:txt复制
    对问题2生成的两组数据执行F-Test检验,判断两组整体数据方差是否相等。
代码语言:javascript复制
select (madlib.f_test(is_sample1, a)).* from t2;
代码语言:txt复制
    结果:
代码语言:javascript复制
     statistic     | df1 | df2 | p_value_one_sided | p_value_two_sided 
------------------- ----- ----- ------------------- -------------------
 0.962616822429907 |   9 |   9 | 0.522164040341636 | 0.955671919316729
(1 row)
代码语言:txt复制
    p_value=0.96,按ɑ=0.05显著性水平,p>ɑ,说明两组数据方差无显著差异。

4. 拟合优度检验

代码语言:txt复制
    拟合优度检验是用卡方统计量进行统计显著性检验的重要内容之一。它依据总体分布状况,计算出分类变量中各类别的期望频数,与分布的观察频数进行对比,判断期望频数与观察频数是否有显著差异,从而达到从分类变量进行分析的目的。
代码语言:txt复制
    问题4:
代码语言:txt复制
    交通部门统计事故与星期的关系得到:
代码语言:javascript复制
星期:一 二 三 四 五 六 日 
次数:36 23 29 31 34 60 25
代码语言:txt复制
    问每天事故发生的可能性是否相同?

(1)建立检验假设,确定检验标准

代码语言:txt复制
    H0:每天事故发生的可能性相同
代码语言:txt复制
    H1:每天事故发生的可能性不同
代码语言:txt复制
    ɑ=0.05

(2)执行拟合优度检验

代码语言:javascript复制
-- 建立表,生成数据  
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;   
代码语言:txt复制
    结果:
代码语言:javascript复制
    statistic     |      p_value       | df |       phi        | contingency_coef  
------------------ -------------------- ---- ------------------ -------------------
 26.9411764705882 | 0.0001485283360829 |  6 | 1.96182045452644 | 0.890932563042277
(1 row)
代码语言:txt复制
    p_value=0.00015,按ɑ=0.05显著性水平,p<ɑ,拒绝H0,差异具有统计学意义,说明事故发生的可能性不同,的确与星期几有关。

5. 卡方独立性检验

代码语言:txt复制
    MAdlib的卡方独立性检验利用拟合优度检验函数实现。对于输入矩阵的的每个元素(i,j),它的期望值为sum(第i行) * sum(第j列)。例如,元素(2,1)的期望值为sum(第2行) * sum(第1列)。
代码语言:txt复制
    卡方独立性检验就是统计样本的实际观测值与理论推论值之间的偏离程度,它决定了卡方值的大小。卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合,若两个值完全相等时,卡方值就为0,表明理论值完全符合。
代码语言:txt复制
    问题5:
代码语言:txt复制
    某医疗机构为了解患肺癌与吸烟是否有关,进行了一次抽样调查,共调查了9965个成年人,其中吸烟者2148人,不吸烟者7817人。调查结果是:吸烟的2148人中49人患肺癌,2099人不患肺癌;不吸烟的7817人中42人患肺癌,7775人不患肺癌。根据这些数据能否断定:患肺癌与吸烟有关?

(1)建立检验假设,确定检验标准

代码语言:txt复制
    H0:患肺癌与吸烟无关
代码语言:txt复制
    H1:患肺癌与吸烟有关
代码语言:txt复制
    ɑ=0.05

(2)卡方独立性检验

代码语言:javascript复制
-- 建立表,生成数据  
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; 
代码语言:txt复制
    结果:
代码语言:javascript复制
    statistic     |       p_value        | df |       phi        | contingency_coef  
------------------ ---------------------- ---- ------------------ -------------------
 56.6318791461147 | 5.25529137942519e-14 |  1 | 3.76270777320385 | 0.966451294384498
(1 row)
代码语言:txt复制
    p_value比ɑ小得多,因此拒绝H0,患肺癌与吸烟有关。

6. 方差分析

代码语言:txt复制
    一个复杂的事物,其中往往有许多因素互相制约又互相依存。方差分析的目的是通过数据分析找出对该事物有显著影响的因素,各因素之间的交互作用,以及显著影响因素的最佳水平等。方差分析是在可比较的数组中,把数据间的总的“变差”按各指定的变差来源进行分解的一种技术。对变差的度量,采用离差平方和。方差分析方法就是从总离差平方和分解出可追溯到指定来源的部分离差平方和,这是一个很重要的思想。
代码语言:txt复制
    问题6:
代码语言:txt复制
    设有三个车间以不同工艺生产同一种产品,为考察不同工艺对产品产量的影响,现对每个车间记录5天的日产量,如下所示,三个车间的日产量是否有显著差异?
代码语言:javascript复制
序号 A1 A2 A3  
1   44 50 47 
2   45 51 44 
3   47 53 44 
4   48 55 50 
5   46 51 45 
代码语言:javascript复制
-- 建立表,生成数据  
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; 
代码语言:txt复制
    结果:
代码语言:javascript复制
-[ 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
代码语言:txt复制
    由输出的结果可以得到如下方差分析表:

差异来源

离差平方和

自由度

平均平方和

F

组间

120

2

60

13.85

组内

52

12

4.33

总计

172

14

代码语言:txt复制
     p_value远小于0.05,故得出结论是三个车间的日产量有显著差异。

7. Kolmogorov-Smirnov检验

代码语言:txt复制
    K-S检验以两位数学家Kolmogorov和Smirnov的名字命名,它是一个拟合优度检验,研究样本观察值的分布和设定的理论分布是否吻合,通过对两个分布差异的分析确定是否有理由认为样本的观察结果来自所假定的理论分布总体。K-S检验的基本思路是:先将顺序分类资料数据的理论累积频率分布与观测的经验累积频率分布加以比较,求出它们最大的偏离值,然后在给定的显著性水平上检验这种偏离值是否是偶然出现的。
代码语言:txt复制
    从madlib.ks_test函数的入参定义可以看出,MADlib的K-S检验只支持两样本。
代码语言:javascript复制
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         |   
代码语言:txt复制
    问题7:
代码语言:txt复制
    为了研究两家电信运营商套餐在目标市场的年龄维度上的分布是否相同,该电信运营公司开展了一个社会调查活动。两种通信套餐的用户年龄数据如下:
代码语言:javascript复制
套餐1:18,18,25,22,24,23,26 
套餐2:22,48,51,34,42,26,44,31,38 

(1)建立检验假设,确定检验标准

代码语言:txt复制
   H0:两种套餐的目标市场年龄分布不存在显著差异
代码语言:txt复制
   H1:两种套餐的目标市场年龄分布存在显著差异
代码语言:txt复制
   ɑ=0.05

(2)执行K-S检验

代码语言:javascript复制
-- 建立表,生成数据  
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;  
代码语言:txt复制
    结果:
代码语言:javascript复制
     statistic     |   k_statistic   |       p_value       
------------------- ----------------- ---------------------
 0.777777777777778 | 1.6798042120791 | 0.00708102048291268
(1 row)
代码语言:txt复制
    相应的P值为0.007,在5%的显著性水平上,P值足够小,因此拒绝原假设,表明两种套餐的目标市场年龄分布存在显著差异。

8. Mann-Whitney检验

代码语言:txt复制
    Mann-Whitney检验假设两个样本分别来自除了总体均值以外完全相同的两个总体,目的是检验这两个总体的均值是否有显著的差别。
代码语言:txt复制
    问题8:
代码语言:txt复制
    一种产品有两种不同的工艺生产方法,它们的使用寿命数据如下:
代码语言:javascript复制
工艺甲:661,669,675,679,682,692,693 
工艺乙:646,649,650,651,652,662,663,672 
代码语言:txt复制
    它们的使用寿命分布是否相同?
代码语言:javascript复制
-- 建立表,生成数据  
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; 
代码语言:txt复制
    结果:
代码语言:javascript复制
     statistic     | u_statistic | p_value_one_sided |  p_value_two_sided  
------------------- ------------- ------------------- ---------------------
 -2.77746029931765 |           4 | 0.997260723378726 | 0.00547855324254737
(1 row)
代码语言:txt复制
    P值小于0.05,表明两种工艺生产方法的使用寿命分布是不相同的。

9. Wilcoxon符号秩检验

代码语言:txt复制
    在Wilcoxon符号秩检验中,它把观测值和零假设的中心位置之差的绝对值的秩分别按照不同的符号相加作为其检验统计量。它适用于T检验中的成对比较,但并不要求成对数据之差服从正态分布,只要求对称分布即可。检验成对观测数据之差是否来自均值为0的总体(产生数据的总体是否具有相同的均值)。
代码语言:txt复制
    问题9:
代码语言:txt复制
    为了研究某放松方法(如听音乐)对于入睡时间的影响,选择了10名志愿者,分别记录未进行放松时的入睡时间及放松后的入睡时间(单位为分钟),得到如下数据:
代码语言:javascript复制
放松前:21,12,12,23,19,13,20,17,14,19 
放松后:12,11, 8, 9,10,15,16,17,10,16
代码语言:txt复制
    请问该放松方法对入睡时间有无影响。
代码语言:txt复制
    本例可以采用配对样本T检验,但由于样本量少,数据可能不符合正太分布,所以考虑用非参数检验。
代码语言:javascript复制
-- 建立表,生成数据  
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;
代码语言:txt复制
    结果:
代码语言:javascript复制
-[ 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 
代码语言:txt复制
    P=0.015<0.05,拒绝原假设,认为放松前后有统计学差异。

0 人点赞