Python——因子分析(KMO检验和Bartlett’s球形检验)「建议收藏」(python详细安装教程)
因子分析用Python做的一個(gè)典型例子
一、實(shí)驗(yàn)?zāi)康?/strong>
采用合適的數(shù)據(jù)分析方法對(duì)下面的題進(jìn)行解答
二、實(shí)驗(yàn)要求
采用因子分析方法,根據(jù)48位應(yīng)聘者的15項(xiàng)指標(biāo)得分,選出6名最優(yōu)秀的應(yīng)聘者。
三、代碼
import pandas as pd import numpy as np import math as math import numpy as np from numpy import * from scipy.stats import bartlett from factor_analyzer import * import numpy.linalg as nlg from sklearn.cluster import KMeans from matplotlib import cm import matplotlib.pyplot as plt def main(): df=pd.read_csv("./data/applicant.csv") # print(df) df2=df.copy() print("\n原始數(shù)據(jù):\n",df2) del df2['ID'] # print(df2) # 皮爾森相關(guān)系數(shù) df2_corr=df2.corr() print("\n相關(guān)系數(shù):\n",df2_corr) #熱力圖 cmap = cm.Blues # cmap = cm.hot_r fig=plt.figure() ax=fig.add_subplot(111) map = ax.imshow(df2_corr, interpolation='nearest', cmap=cmap, vmin=0, vmax=1) plt.title('correlation coefficient--headmap') ax.set_yticks(range(len(df2_corr.columns))) ax.set_yticklabels(df2_corr.columns) ax.set_xticks(range(len(df2_corr))) ax.set_xticklabels(df2_corr.columns) plt.colorbar(map) plt.show() # KMO測(cè)度 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 print("\nKMO測(cè)度:", kmo(df2_corr)) # 巴特利特球形檢驗(yàn) df2_corr1 = df2_corr.values print("\n巴特利特球形檢驗(yàn):", bartlett(df2_corr1[0], df2_corr1[1], df2_corr1[2], df2_corr1[3], df2_corr1[4], df2_corr1[5], df2_corr1[6], df2_corr1[7], df2_corr1[8], df2_corr1[9], df2_corr1[10], df2_corr1[11], df2_corr1[12], df2_corr1[13], df2_corr1[14])) # 求特征值和特征向量 eig_value, eigvector = nlg.eig(df2_corr) # 求矩陣R的全部特征值,構(gòu)成向量 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) # 求公因子個(gè)數(shù)m,使用前m個(gè)特征值的比重大于85%的標(biāo)準(zhǔn),選出了公共因子是五個(gè) for m in range(1, 15): if eig['eig_value'][:m].sum() / eig['eig_value'].sum() >= 0.85: print("\n公因子個(gè)數(shù):", 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()) # 特殊因子方差,因子的方差貢獻(xiàn)度 ,反映公共因子對(duì)變量的貢獻(xiàn) var = fa.get_factor_variance() # 給出貢獻(xiàn)率 print("\n解釋的總方差(即貢獻(xiàn)率):\n", var) # 因子旋轉(zhuǎn) rotator = Rotator() b = pd.DataFrame(rotator.fit_transform(fa.loadings_)) b.columns = ['factor1', 'factor2', 'factor3', 'factor4', 'factor5'] b.index = df2_corr.columns print("\n因子旋轉(zhuǎ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應(yīng)試者的五個(gè)因子得分:\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()
四、實(shí)驗(yàn)步驟
(1)引入數(shù)據(jù),數(shù)據(jù)標(biāo)準(zhǔn)化
因?yàn)閿?shù)據(jù)是面試中的得分,量綱相同,并且數(shù)據(jù)的分布無異常值,所以數(shù)據(jù)可以不進(jìn)行標(biāo)準(zhǔn)化。
(2)建立相關(guān)系數(shù)矩陣
計(jì)算皮爾森相關(guān)系數(shù),從熱圖中可以明顯看出變量間存在的相關(guān)性。
進(jìn)行相關(guān)系數(shù)矩陣檢驗(yàn)——KMO測(cè)度和巴特利特球體檢驗(yàn):
KMO值:0.9以上非常好;0.8以上好;0.7一般;0.6差;0.5很差;0.5以下不能接受;巴特利球形檢驗(yàn)的值范圍在0-1,越接近1,使用因子分析效果越好。
通過觀察上面的計(jì)算結(jié)果,可以知道,KMO值為0.783775605643526,在較好的范圍內(nèi),并且巴特利球形檢驗(yàn)的值接近1,所有可以使用因子分析。
(3)求解特征值及相應(yīng)特征向量
求公因子個(gè)數(shù)m,使用前m個(gè)特征值的比重大于85%的標(biāo)準(zhǔn),選出了公共因子是五個(gè)。
(4)因子載荷陣
由上可以看出,選擇5個(gè)公共因子,從方差貢獻(xiàn)率可以看出,其中第一個(gè)公因子解釋了總體方差的50.092%,四個(gè)公共因子的方差貢獻(xiàn)率為86.42%,可以較好的解釋總體方差。
(5)因子旋轉(zhuǎn)
(6)因子得分
(7)根據(jù)應(yīng)聘者的五個(gè)因子得分,按照貢獻(xiàn)率進(jìn)行加權(quán),得到最終各應(yīng)試者的綜合得分,然后選出前六個(gè)得分最高的應(yīng)聘者。
所以我們用因子分析產(chǎn)生的前六名分別是:40,39,22,2,10,23
總結(jié)
以上是生活随笔為你收集整理的Python——因子分析(KMO检验和Bartlett’s球形检验)「建议收藏」(python详细安装教程)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 随记一个C的毫秒级群PING
- 下一篇: 怎么中新股