kmo值太小,kmo值代表效度吗

因子分析用Python做的一个典型例子

http://www.Sina.com/http://www.Sina.com /

运用适当的数据分析方法求解下一个问题

一、

运用因子分析法,根据48名申请人的15项指标得分,选出6名最优秀的申请人。

实验目的

importpandasaspdimportnumpyasnpimportmathasmathimportnumpyasnpfromnumpyimport * from scipy.statsimportbartlettfromfactor _ aator import numpy.linalgasnlgfromsklearn.clusterimportkmeansfrommatplotlibimportcmimportmatplotlib.pyplotaspltdefmain (数据/print(df ) df2=df.copy ) print(‘\n原始数据:\n ‘,df2 ) deldf2[‘id’]#print )。 n ‘, df2_corr(#热企图cmap=cm.blues # cmap=cm.hot _ rfig=PLT.figure (ax=fig.add _ subplot ) 111 ) map=cmap=cmap=RFT vmax=1) PLT.title (correlation coefficient– head map ‘ ) ax.set _ y ticks (范围(len ) df2_corr.columns ) ) 3360 corr _ inv=NP.Lina LG.inv (dataset _ corr ) nrow_inv_corr,ncol _ inv _ corr=dataset _ corr.shapea ncorr 1 ) : for j in range(i ) I,ncol_inv_corr,1 ) 3360a () ) ncol_inv_corr,1 ) j )/) math.sqrt (corr j ) dataset_corr=NP.as array (dataset _ corr ) kmo_num=NP.sum(NP.square ) dataset _ corr ) (-NP.sum ) NP.diagonal ) ) ) kmo_value=kmo KMO(df2_corr ) ) # cxdxmy球形检验df2 _ corr1=df2 _ corr.value sprint ((ncxdxy df2_corr1[5]、df2_corr1[6]、df2_corr1[7]、df2_corr1[8]、df2_corr1[9]、df2_corr1[14] )

求矩阵R的全部特征值,构成向量 eig = pd.DataFrame() eig[‘names’] = df2_corr.columns eig[‘eig_value’] = eig_value eig.sort_values(‘eig_value’, ascending=False, inplace=True) print(“\n特征值\n:”,eig) eig1=pd.DataFrame(eigvector) eig1.columns = df2_corr.columns eig1.index = df2_corr.columns print(“\n特征向量\n”,eig1) # 求公因子个数m,使用前m个特征值的比重大于85%的标准,选出了公共因子是五个 for m in range(1, 15): if eig[‘eig快三技巧准确率100tnumpyasnpfromnumpyimport * from scipy.statsimportbartlettfromfactor _ aator import numpy.linalgasnlgfromsklearn.clusterimportkmeansfrommatplotlibimportcmimportmatplotlib.pyplotaspltdefmain (数据/print(df ) df2=df.copy ) print(‘\n原始数据:\n ‘,df2 ) deldf2[‘id’]#print )。 n ‘, df2_corr(#热企图cmap=cm.blues # cmap=cm.hot _ rfig=PLT.figure (ax=fig.add _ subplot ) 111 ) map=cmap=cmap=RFT vmax=1) PLT.title (correlation coefficient– head map ‘ ) ax.set _ y ticks (范围(len ) df2_corr.columns ) ) 3360 corr _ inv=NP.Lina LG.inv (dataset _ corr ) nrow_inv_corr,ncol _ inv _ corr=dataset _ corr.shapea ncorr 1 ) : for j in range(i ) I,ncol_inv_corr,1 ) 3360a () ) ncol_inv_corr,1 ) j )/) math.sqrt (corr j ) dataset_corr=NP.as array (dataset _ corr ) kmo_num=NP.sum(NP.square ) dataset _ corr ) (-NP.sum ) NP.diagonal ) ) ) kmo_value=kmo KMO(df2_corr ) ) # cxdxmy球形检验df2 _ corr1=df2 _ corr.value sprint ((ncxdxy df2_corr1[5]、df2_corr1[6]、df2_corr1[7]、df2_corr1[8]、df2_corr1[9]、df2_corr1[14] )

求矩阵R的全部特征值,构成向量 eig = pd.DataFrame() eig[‘names’] = df2_corr.columns eig[‘eig_value’] = eig_value eig.sort_values(‘eig_value’, ascending=False, inplace=True) print(“\n特征值\n:”,eig) eig1=pd.DataFrame(eigvector) eig1.columns = df2_corr.columns eig1.index = df2_corr.columns print(“\n特征向量\n”,eig1) # 求公因子个数m,使用前m个特征值的比重大于85%的标准,选出了公共因子是五个 for m in range(1, 15): if eig[‘eig_value’][:m].sum() / eig[‘eig_value’].sum() >= 0.85: print(“\n公因子个数:”, m) break # 因子载荷阵 A = np.mat(np.zeros((15, 5))) i = 0 j = 0 while i < 5: j = 0 while j < 15: A[j:, i] = sqrt(eig_value[i]) * eigvector[j, i] j = j + 1 i = i + 1 a = pd.DataFrame(A) a.columns = [‘factor1’, ‘factor2’, ‘factor3’, ‘factor4’, ‘factor5’] a.index = df2_corr.columns print(“\n因子载荷阵\n”, a) fa = FactorAnalyzer(n_factors=5) fa.loadings_ = a # print(fa.loadings_) print(“\n特殊因子方差:\n”, fa.get_communalities()) # 特殊因子方差,因子的方差贡献度 ,反映公共因子对变量的贡献 var = fa.get_factor_variance() # 给出贡献率 print(“\n解释的总方差(即贡献率):\n”, var) # 因子旋转 rotator = Rotator() b = pd.DataFrame(rotator.fit_transform(fa.loadings_)) b.columns = [‘factor1’, ‘factor2’, ‘factor3’, ‘factor4’, ‘factor5’] b.index = df2_corr.columns print(“\n因子旋转:\n”, b) # 因子得分 X1 = np.mat(df2_corr) X1 = nlg.inv(X1) b = np.mat(b) factor_score = np.dot(X1, b) factor_score = pd.DataFrame(factor_score) factor_score.columns = [‘factor1’, ‘factor2’, ‘factor3’, ‘factor4’, ‘factor5’] factor_score.index = df2_corr.columns print(“\n因子得分:\n”, factor_score) fa_t_score = np.dot(np.mat(df2), np.mat(factor_score)) print(“\n应试者的五个因子得分:\n”,pd.DataFrame(fa_t_score)) # 综合得分 wei = [[0.50092], [0.137087], [0.097055], [0.079860], [0.049277]] fa_t_score = np.dot(fa_t_score, wei) / 0.864198 fa_t_score = pd.DataFrame(fa_t_score) fa_t_score.columns = [‘综合得分’] fa_t_score.insert(0, ‘ID’, range(1, 49)) print(“\n综合得分:\n”, fa_t_score) print(“\n综合得分:\n”, fa_t_score.sort_values(by=’综合得分’, ascending=False).head(6)) plt.figure() ax1=plt.subplot(111) X=fa_t_score[‘ID’] Y=fa_t_score[‘综合得分’] plt.bar(X,Y,color=”#87CEFA”) # plt.bar(X, Y, color=”red”) plt.title(‘result00′) ax1.set_xticks(range(len(fa_t_score))) ax1.set_xticklabels(fa_t_score.index) plt.show() fa_t_score1=pd.DataFrame() fa_t_score1=fa_t_score.sort_values(by=’综合得分’,ascending=False).head() ax2 = plt.subplot(111) X1 = fa_t_score1[‘ID’] Y1 = fa_t_score1[‘综合得分’] plt.bar(X1, Y1, color=”#87CEFA”) # plt.bar(X1, Y1, color=’red’) plt.title(‘result01’) plt.show()if __name__ == ‘__main__’: main()

 

四、实验步骤

(1)引入数据,数据标准化

因为数据是面试中的得分,量纲相同,并且数据的分布无异常值,所以数据可以不进行标准化。

(2)建立相关系数矩阵

计算皮尔森相关系数,从热图中可以明显看出变量间存在的相关性。

 

进行相关系数矩阵检验——KMO测度和cxdxmy球体检验:

KMO值:0.9以上非常好;0.8以上好;0.7一般;0.6差;0.5很差;0.5以下不能接受;巴特利球形检验的值范围在0-1,越接近1,使用因子分析效果越好。

通过观察上面的计算结果,可以知道,KMO值为0.783775605643526,在较好的范围内,并且巴特利球形检验的值接近1,所有可以使用因子分析。

(3)求解特征值及相应特征向量 

 

求公因子个数m,使用前m个特征值的比重大于85%的标准,选出了公共因子是五个。

(4)因子载荷阵

  

由上可以看出,选择5个公共因子,从方差贡献率可以看出,其中第一个公因子解释了总体方差的50.092%,四个公共因子的方差贡献率为86.42%,可以较好的解释总体方差。

(5)因子旋转

 

(6)因子得分

 

(7)根据应聘者的五个因子得分,按照贡献率进行加权,得到最终各应试者的综合得分,然后选出前六个得分最高的应聘者。

 

所以我们用因子分析产生的前六名分别是:40,39,22,2,10,23

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注