如何检验离散变量是否相关样例和代码(Chi-square Test 切比雪夫检验)

在做实验设计(研究变量对实验结果的影响)和机器学习领域的研究中都会遇到一个普遍的问题,如何确定两个变量之间是否存在关联,关于连续变量的相关性[1],大家应该都比较熟悉,这里将介绍如何通过统计学的方法中的切比雪夫检验(Chi-square Test)来验证两个离散变量是否相互独立(independent) 并附上简单例子和样例代码

切比雪夫校验

切比雪夫检验的基本思想[2],通过假设检验的方式对两个离散变量进行相关性验证(通常我们会将置信值p-value 设置成5%),普遍的验证过程分以下四步,

Step One: 给出假设(null-test),如假设两个变量a, b互相独立,那么我们就可以通过统计实验数据得出两个变量的分布

Step Two: 根据假设所得的变量分布,计算期望(Expected)与实际的偏差,并且我们知道这个偏差服从切比雪夫分布

Step Three: 根据算得的偏差和置信值(p-value),确定是否接受假设(accept null-test) 或者拒绝(reject null-test)(拒绝的原因基本上是因为实际观测值与预期值偏差过大,这种小概率事件发生,所以我们不接受假设)

Step Four: 得出结论,给出相关报告

简单的例子

这里我们假设想了解变量w(土壤含水量, 假设只有两个分类干和湿 - dry or wet) 和不同气候条件下(气候条件分A, B, C, D)对大豆淀粉量的影响,假设我们的实验观测数据如下:

category/type Dry Wet sum
A a_dry a_wet a
B b_dry b_wet b
C c_dry c_wet c
D d_dry d_wet d
sum dry wet total


现在让我们用按上面描述的切比雪夫校验过程,来验证土壤湿度W(dry or wet)对大豆
在不同气候环境下淀粉含量是否相关进行校验,

  1. 首先,我们假设两者不相关,那么根据假设我们可以得 p(A, dry) = p(A) * p(dry) = (a / total) * (dry / total);
  2. 其次,基于假设,我们计算各个cell的期望值 E(A, dry) = P(A, dry) * total
  3. 第三,我们来计算期望和方差偏离度
    X2=celli,jexpectedi,jexpectedi,j
    这里i是指A,B,C,D 各种天气分类,j是指Dry, Wet土壤湿度
  4. 第四,基于计算出来的value 对比置信值(p-value)下的切比雪夫值,从而得出结论

例子数据

category/type Dry Wet sum
A 200 250 450
B 150 300 450
C 50 50 100
D 150 50 200
sum 550 650 1200

计算期望表

category/type Dry Wet sum
A 206.25 243.75 450
B 206.25 243.75 450
C 45.83 54.17 100
D 91.66 108.33 200
sum 550 650 1200


X2=celli,jexpectedi,jexpectedi,j=97.90
自由度为 DF = (r - 1) * (c - 1) = (2 - 1) * ( 4 - 1) = 3, 这里r是土壤湿度分类数,c是气候分类数目, 然后我们基于网上的切比雪夫计算器(Chi-Square Calculator [3]),计算得

p(X297.90)=1

在假设下,我们计算得 p-value = 1p(X297.90) =0, 小于我们的置信区间0.05, 与我们的假设相驳,我们拒绝null-hypothesis, 所以我们得出结论土壤湿度变量和气候条件变量是相关的, 证明完毕;

代码部分

import sys
import re

def chi_square_value(obser, expect):
    """
    """
    value = 0
    for i in range(len(obser)):
        for j in range(len(obser[0])):
            value += ((obser[i][j] - expect[i][j]) ** 2 / expect[i][j])
    return value

def main():
    """
    """
    T = [[200, 250],
        [150, 300],
        [50, 50],
        [150, 50]]

    x = []
    y = [0] * len(T[0])
    for ele in T:
        x.append(sum(ele))
        for i in range(len(ele)):
            y[i] += ele[i]
    # print x, y

    total = sum(y)
    expect = []
    for i in range(len(T)):
        inner = []
        for j in range(len(T[0])):
            inner.append((x[i] * y[j] * 1.0) / total)
        print sum(inner)
        expect.append(inner)
    # print expect
    value = chi_square_value(T, expect)
    print value

if __name__ == "__main__":
    reload(sys)
    sys.setdefaultencoding("utf-8")
    main()

你可能感兴趣的:(数据分析相关代码)