美文网首页
python实现KMO检验和Bartlett's球形检验

python实现KMO检验和Bartlett's球形检验

作者: wong小尧 | 来源:发表于2018-04-17 17:03 被阅读0次

    1.KMO

    KMO(Kaiser-Meyer-Olkin)检验统计量是用于比较变量间简单相关系数和偏相关系数的指标。主要应用于多元统计的因子分析。KMO统计量是取值在0和1之间。

    使用说明:
    Kaiser给出了常用的kmo度量标准: 0.9以上表示非常适合;0.8表示适合;0.7表示一般;0.6表示不太适合;0.5以下表示极不适合。KMO统计量是取值在0和1之间。当所有变量间的简单相关系数平方和远远大于偏相关系数平方和时,KMO值接近1.KMO值越接近于1,意味着变量间的相关性越强,原有变量越适合作因子分析;当所有变量间的简单相关系数平方和接近0时,KMO值接近0.KMO值越接近于0,意味着变量间的相关性越弱,原有变量越不适合作因子分析。

    当所有变量间的简单相关系数平方和远远大于偏相关系数平方和时,KMO值接近1.KMO值越接近于1,意味着变量间的相关性越强,原有变量越适合作因子分析;当所有变量间的简单相关系数平方和接近0时,KMO值接近0.KMO值越接近于0,意味着变量间的相关性越弱,原有变量越不适合作因子分析。

    Bartlett's球状检验是一种数学术语。用于检验相关阵中各变量间的相关性,是否为单位阵,即检验各个变量是否各自独立。因子分析前,首先进行KMO检验和巴特利球体检验。在因子分析中,若拒绝原假设,则说明可以做因子分析,若不拒绝原假设,则说明这些变量可能独立提供一些信息,不适合做因子分析。
    如果变量间彼此独立,则无法从中提取公因子,也就无法应用因子分析法。Bartlett球形检验判断如果相关阵是单位阵,则各变量独立因子分析法无效。由SPSS检验结果显示Sig.<0.05(即p值<0.05)时,说明各变量间具有相关性,因子分析有效。

    以上部分摘取自百度百科。

    因子分析前需要使用KMO检验和Bartlett's球形检验来看原有变量是否适合做因子分析,这在spss或者R语言中可以很容易的实现。python中虽然sklearn提供了因子分析,但是没有提供KMO检验的工具包。
    下面python代码实现了KMO检验,结果已经用spss做过验证,结果一样。
    scipy中有Bartlett's球形检验的工具包,用法也贴在下方。

    import numpy as np
    import math as math
    
    dataset = np.array([[3,5,1,4,1],  
           [4,4,3,5,3],  
           [3,4,4,4,4],  
           [3,3,5,2,1],  
           [3,4,5,4,3]])
    
    def corr(data):
        return np.corrcoef(dataset)
    
    dataset_corr = corr(dataset)
    
    def kmo(dataset_corr):
        corr_inv = np.linalg.inv(dataset_corr)
        nrow_inv_corr, ncol_inv_corr = dataset_corr.shape
        A = np.ones((nrow_inv_corr,ncol_inv_corr))
        for i in range(0,nrow_inv_corr,1):
            for j in range(i,ncol_inv_corr,1):
                A[i,j] = -(corr_inv[i,j])/(math.sqrt(corr_inv[i,i]*corr_inv[j,j]))
                A[j,i] = A[i,j]
        dataset_corr = np.asarray(dataset_corr)
        kmo_num = np.sum(np.square(dataset_corr)) - np.sum(np.square(np.diagonal(A)))
        kmo_denom = kmo_num + np.sum(np.square(A)) - np.sum(np.square(np.diagonal(A)))
        kmo_value = kmo_num / kmo_denom
        return kmo_value
    
    kmo(dataset_corr)
    
    Result:

    2.scipy.stats.bartlett

    Bartlett的平均方差检验。
    Bartlett的测试检验了零假设,即所有输入样本都来自具有相同方差的人群。对于来自显著非正常人群的样本, Levene’s 检测更加鲁棒.

    scipy.stats.bartlett(*args)
    参数:
    sample1, sample2,... : array_like
    样本数据数组,可以是不同长度。

    Returns:
    statistic : float
    检测统计量。

    pvalue : float
    检验的P值。

    dataset = np.array([[3,5,1,4,1],  
           [4,4,3,5,3],  
           [3,4,4,4,4],  
           [3,3,5,2,1],  
           [3,4,5,4,3]])
    
    def corr(data):
        return np.corrcoef(dataset)
    
    dataset_corr = corr(dataset)
    
    from scipy.stats import bartlett
    bartlett(dataset_corr[0],dataset_corr[1],dataset_corr[2],dataset_corr[3],dataset_corr[4])
    
    

    Result:BartlettResult(statistic=0.2089837271742987, pvalue=0.994906529597606)

    Reference:

    相关文章

      网友评论

          本文标题:python实现KMO检验和Bartlett's球形检验

          本文链接:https://www.haomeiwen.com/subject/eprpkftx.html