由于感觉因子分析不是很懂,因此又通过python把
因子分析(factor analysis)案例(matlab实现)
这题又给打了一遍。
这里加上了碎石图,用来选择辅助选择因子个数,但是我感觉这里没啥用吧。

这里可能由于数据标准化的方式有些不同,因此计算出来的数值和之前那个不太一样,但是综合评分的排名还是一样的。
数据的话我上传到资源里了,因为有一次聚类数据太大了,博客里放不了,因此就想着试试上传资源了。
数据链接:https://download.csdn.net/download/qq_52785473/78168754
设置的是0积分,放心大胆用

import pandas as pd
import numpy as np
import numpy.linalg as nlg
import matplotlib.pyplot as plt
from factor_analyzer import FactorAnalyzer, calculate_kmo, calculate_bartlett_sphericity
from sklearn.preprocessing import StandardScaler
import matplotlibdef main():contribution_rate = 0.8auto_choose_N = True  # 设置为True的时候就自动根据贡献率来选择因子个数,为False则要自己设置NN = 2file = "test.csv"f = pd.read_csv(file, sep=" ", header=None)f = StandardScaler().fit_transform(f)  # 数据标准化f = pd.DataFrame(f)# 皮尔逊相关系数f_corr = f.corr()kmo = calculate_kmo(f)bartlett = calculate_bartlett_sphericity(f)if kmo[1] >= 0.7 and bartlett[1] <= 0.05:  # bartlett球形度检验p值要小于0.05 kmo值要大于0.7print("\n因子分析适用性检验通过\n")else:print("\n因子分析适用性检验未通过\n")print('kmo:{},bartlett:{}'.format(kmo[1], bartlett[1]))#  计算旋转前的载荷矩阵的方差贡献率,可以用来看有几个因子时总共先率到达多少Load_Matrix = FactorAnalyzer(rotation=None, n_factors=len(f.T), method='principal')Load_Matrix.fit(f)f_contribution_var = Load_Matrix.get_factor_variance()matrices_var = pd.DataFrame()matrices_var["旋转前特征值"] = f_contribution_var[0]matrices_var["旋转前方差贡献率"] = f_contribution_var[1]matrices_var["旋转前方差累计贡献率"] = f_contribution_var[2]print(matrices_var)if auto_choose_N:sum_con = 0N = 0for c in matrices_var["旋转前方差贡献率"]:sum_con += cN += 1if sum_con >= contribution_rate:print("\n选择了" + str(N) + "个因子累计贡献率为"+str(sum_con)+"\n")breakmatplotlib.rcParams["font.family"] = "SimHei"  # 碎石图主要用来看取多少因子合适,一般是取到平滑处左右,当然还要需要结合贡献率ev, v = Load_Matrix.get_eigenvalues()print('\n相关矩阵特征值:', ev)plt.figure(figsize=(8, 6.5))plt.scatter(range(1, f.shape[1]+1), ev)plt.plot(range(1, f.shape[1]+1), ev)plt.title('碎石图', fontdict={'weight': 'normal', 'size': 25})plt.xlabel('因子', fontdict={'weight': 'normal', 'size': 15})plt.ylabel('特征值', fontdict={'weight': 'normal', 'size': 15})plt.grid()plt.show()# 使用主成分分析的方法来计算出因子载荷矩阵,使用最大方差法旋转因子载荷矩阵Load_Matrix_rotated = FactorAnalyzer(rotation='varimax', n_factors=N, method='principal')Load_Matrix_rotated.fit(f)#  计算旋转后的载荷矩阵的贡献率f_contribution_var_rotated = Load_Matrix_rotated.get_factor_variance()matrices_var_rotated = pd.DataFrame()matrices_var_rotated["特征值"] = f_contribution_var_rotated[0]matrices_var_rotated["方差贡献率"] = f_contribution_var_rotated[1]matrices_var_rotated["方差累计贡献率"] = f_contribution_var_rotated[2]print(matrices_var_rotated)# 计算因子得分(回归方法)(系数矩阵的逆乘以因子载荷矩阵)X1 = np.mat(f_corr)X1 = nlg.inv(X1)factor_score_weight = np.dot(X1, Load_Matrix_rotated.loadings_)factor_score_weight = pd.DataFrame(factor_score_weight)col = []for i in range(N):col.append("factor" + str(i+1))factor_score_weight.columns = colfactor_score_weight.index = f_corr.columnsprint("\n第一列为第一个因子得分函数的对应系数")print("因子得分:\n", factor_score_weight)factor_score = pd.DataFrame(np.dot(np.mat(f), np.mat(factor_score_weight)))  # 指标 * 对应权重,计算出因子的分数i = 0factor_score["综合得分"] = 0for factor_score_weight in matrices_var_rotated["方差贡献率"]:factor_score["综合得分"] += factor_score_weight * factor_score[i]  # 因子贡献率 * 因子的分数 用于计算综合得分i += 1if i == N:breakfactor_score["综合得分"] = factor_score["综合得分"] / matrices_var_rotated["方差贡献率"].sum()  # 计算综合得分factor_score.index = ["歌", "五", "用", "太", "浙", "烟", "方", "红河", "贵", "中", "红星", "伊", "青", "湖", "雅", "福"]  # 更改索引print(factor_score.sort_values(by=["综合得分"], ascending=False))  # 排序if __name__ == '__main__':main()


运行结果上图所示,我看了一下,由于matlab和python数据预处理的函数输出的结果有些出入,因此分数可能和原题有点出入,但是综合得分的排名是一样的顺序,应该没啥大问题。

python实现因子分析及用于综合评分且配上碎石图(实例分析)相关推荐

  1. python定义一个整数变量_python循环定义多个变量的实例分析

    python循环定义多个变量方法 我们可能会时长碰到这样一个场景,计算得到一个非固定值,需要根据这个值定义相同数量个变量. 实现方式的核心是exec函数,exec函数可以执行我们输入的代码字符串. e ...

  2. python中event的用法_Python编程之event对象的用法实例分析

    本文实例讲述了Python编程中event对象的用法.分享给大家供大家参考,具体如下: Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位为假,则线程等待直到信号 ...

  3. python pathname_Python模块的定义,模块的导入,__name__用法实例分析

    模块导入: import 模块名 ```python import 模块名 import math print(math.sqrt(9)) from-import 语句:从模块中导入一个指定的部分,如 ...

  4. python 小游戏500行以内_[宜配屋]听图阁

    在讲述有关list的时候,提到做游戏的事情,后来这个事情一直没有接续.不是忘记了,是在想在哪个阶段做最合适.经过一段时间学习,看官已经不是纯粹小白了,已经属于python初级者了.现在就是开始做那个游 ...

  5. python中的super用法详解_Python中super函数用法实例分析

    本文实例讲述了python中super函数用法.分享给大家供大家参考,具体如下: 这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简 ...

  6. python turtle画房子详细解释_[宜配屋]听图阁

    我就废话不多说了,直接上代码吧! import turtle t=turtle.Turtle() turtle.Turtle().screen.delay(0) tleft=turtle.Turtle ...

  7. python的pygame库使用方法_[宜配屋]听图阁

    使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截失败的一方输掉游戏,规则类似于简化版的乒乓球. 因为是第一次用pygam ...

  8. python和c++情侣网名_[宜配屋]听图阁

    混编的含义有两种, 一种是在python里面写C 一种是C里面写python 本文主要是进行简化,方便使用. ############################################# ...

  9. python读取mat文件并画图_[宜配屋]听图阁

    先给大家介绍下python读取并写入mat文件的方法 用matlab生成一个示例mat文件: clear;clc matrix1 = magic(5); matrix2 = magic(6); sav ...

最新文章

  1. 现在的教育:感慨之一
  2. tomcat线程释放时间_详解tomcat的连接数与线程池
  3. ATF里面都有什么?
  4. html嵌套html解决办法(object/object)
  5. mysql 拼音首字母排序
  6. EXPLAIN mysql性能调优
  7. java中怎么实现大小写转换(利用阿斯克码)
  8. bilibili笔试题
  9. Linux文件管理器默认不显示隐藏文件
  10. 管理咨询公司全球前22排名
  11. java frame 显示图片_java怎么在JFrame中显示动态图片?
  12. Raft 算法 详细版介绍
  13. 憨批的语义分割重制版2——语义分割评价指标mIOU的计算
  14. 【红帽入门指南】第二期:Linux的基本使用
  15. Multiple PDN Connectivity
  16. Android-NFC模块学习(1)
  17. Debug究竟是什么意思?
  18. 前端Bootstrap框架
  19. VR画面渲染性能是这样提升的
  20. 哇!這就是青春痘(下)

热门文章

  1. OpenMAX编程初识
  2. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  3. 使用matplotlib绘图时出现数据重复重叠问题
  4. 全球及中国润喉糖行业消费需求与品牌竞争动态研究报告2022-2028年
  5. java wmf 转 svg_java wmf转svg图片格式最好的方法wmfToSvg
  6. postgres-----pgrouting
  7. TC Games问题解答:连接、卡顿、控制视角解决方法,无需安卓模拟器玩手机游戏
  8. 偏函数(Partial Function)
  9. matlab仿真加入反冲模块,saturation模块作用
  10. Three.js加载简单纹理贴图并应用到网格(凹凸贴图、法向贴图、移位贴图)