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:
- https://baike.baidu.com/item/KMO%E6%A3%80%E9%AA%8C/5544189?fr=aladdin
- 【Comparative Approaches to Using R and Python for Statistical Data Analysis】
- scipy官方文档