Python——因子分析(KMO检验和Bartletts球形检验)

Python——因⼦分析(KMO检验和Bartletts球形检验)因⼦分析⽤Python做的⼀个典型例⼦
⼀、实验⽬的
采⽤合适的数据分析⽅法对下⾯的题进⾏解答
⼆、实验要求
采⽤因⼦分析⽅法,根据48位应聘者的15项指标得分,选出6名最优秀的应聘者。
三、代码
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():
ad_csv("./data/applicant.csv")
# print(df)
py()
print("\n原始数据:\n",df2)
del df2['ID']
# print(df2)
# ⽪尔森相关系数
df2_()
print("\n相关系数:\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(lumns)))
ax.set_yticklabels(lumns)
ax.set_xticks(range(len(df2_corr)))
ax.set_xticklabels(lumns)
plt.show()
# KMO测度
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测度:", kmo(df2_corr))
# 巴特利特球形检验
df2_corr1 = df2_corr.values
print("\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的全部特征值,构成向量
eig = pd.DataFrame()
eig['names'] = lumns
eig['eig_value'] = eig_value
eig.sort_values('eig_value', ascending=False, inplace=True)
print("\n特征值\n:",eig)
eig1=pd.DataFrame(eigvector)
eig1.index = lumns
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.s((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.index = lumns
我们的足球场
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.index = lumns
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)
lumns = ['factor1', 'factor2', 'factor3', 'factor4', 'factor5']
factor_score.index = lumns
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_lumns = ['综合得分']
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()
tafe学院
if__name__ == '__main__':
main()
四、实验步骤
(1)引⼊数据,数据标准化
因为数据是⾯试中的得分,量纲相同,并且数据的分布⽆异常值,所以数据可以不进⾏标准化。
(2)建⽴相关系数矩阵
计算⽪尔森相关系数,从热图中可以明显看出变量间存在的相关性。
进⾏相关系数矩阵检验——KMO测度和巴特利特球体检验:
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.0
92%,四个公共因⼦的⽅差贡献率为86.42%,可以较好的解释总体⽅差。
(5)因⼦旋转
(6)因⼦得分
(7)根据应聘者的五个因⼦得分,按照贡献率进⾏加权,得到最终各应试者的综合得分,然后选出前六个得分最⾼的应聘者。所以我们⽤因⼦分析产⽣的前六名分别是:40,39,22,2,10,23

本文发布于:2024-09-20 20:49:19,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/583642.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:检验   得分   球形   巴特利   看出   特征值
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议