Python——因子分析(KMO检验和Bartlett's球形检验)_蔡军帅的博客-程序员信息网

技术标签: python学习  

因子分析用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():
    df=pd.read_csv("./data/applicant.csv")
    # print(df)
    df2=df.copy()
    print("\n原始数据:\n",df2)
    del df2['ID']
    # print(df2)

    # 皮尔森相关系数
    df2_corr=df2.corr()
    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(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测度
    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'] = 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测度和巴特利特球体检验:

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40875849/article/details/104688526

智能推荐

Qt 之 show,hide,setVisible,setHidden,close 等小结_dbzhang800的博客-程序员信息网_qt setvisible

QWidget和QDialog中让人极易混淆的几个函数。有些负责控制界面的显示与隐藏,有些负责对象的删除。比如:show,hide,setVisible,setHidden,close,done, accept, reject

Xilinx FPGA引脚txt文件导入excel中_小翁同学的博客-程序员信息网

需求为了把xilinx FPGA的官方引脚文件txt转成excel文件(实际官网中有对应的csv文件就是excel文件了。。。)xilinx FPGA引脚地址:https://china.xilinx.com/support/package-pinout-files.html流程(1)把下载好的txt引脚文件导入excel中:(2)选择下载的txt引脚文件经过文本...

FW150U构建无线局域网【模拟AP功能设置指南】_三少GG的博客-程序员信息网_fw150us密码

迅捷网络: FW150U 驱动http://www.fastcom.com.cn/Download/detail?pd=8软件名称:FW150U_3.0/5.0_驱动程序运行环境:WinXP/XP64/Vista/Vista64/Win7/Win7 64软件大小:29.98MB上传时间:2011-08-03

java批量导入数据到es中出现数据重复问题解决方案_叶不二的博客-程序员信息网_es数据重复问题

今天在网上找了一个批量数据导入到es中的java代码,代码主要逻辑如下:// 读取要导入数据的文件BufferedReader br = new BufferedReader(new FileReader( "D:\\test\\test.txt"));String json = null;int count = 0;// 开启批量插入BulkRequestBuilder bulkR

电脑键盘部分按键失灵_win10键盘个别按键失灵的原因及解决方法_weixin_39694016的博客-程序员信息网

相信许多小伙伴都遇到过win10键盘个别按键失灵的情况,其他按键都能使用,造成正在进行的工作和游戏无法再继续进行下去。如果台式机键盘坏了,重新换键盘就可以了,但是笔记本换键盘恐怕就没那么容易了。其实键盘个别按键失灵可能和电源设置有关系,大家可以参考下文教程修复一下。具体方法如下:win8.1 - 14 、由于在另一个系统中键盘没有问题,所以考虑到可能是软硬件冲突导致的,所以从设置入手。window...

MySQL - 当LIMIT 进行分页时,为什么出现了重复数据_Soinice的博客-程序员信息网

哦,这时写的一个破SQL,遗留了个问题,没有去注意,所以造成了,有重复数据。因为引用了 PageHelper 插件,期初还以为是 插件有问题。后来想想,毕竟整个框架都是用的这个插件,就算有问题早应该会出现了。所以,第一时间想到了SQL,的确,去了排序就没有问题。说在前面数据库分页是后台经常要使用的技术手段,有时候进行数据库查询会根据业务需要对某一字段排序,那么当待排序字段值相同时,我们...

随便推点

MacOs python from mpi4py import MPI 报错_呆博士实验室的博客-程序员信息网

今天在读其他人的程序时遇到了from mpi4py import MPI报错Reason: image not found搜索了以后发现了问题所在refer1但是在sudo rm -r ./mpi4py后使用pip(更新前后)和conda均不能安装,错误为error: Cannot compile MPI programs. Check your configuration!!!...

A quick message queue benchmark: ActiveMQ, RabbitMQ, HornetQ, QPID, Apollo_hanruikai的博客-程序员信息网_rabbitmq benchmark

Lately I performed a message queue benchmark, comparing several queuing frameworks (RabbitMQ, ActiveMQ…).Those benchmarks are part of a complete study conducted by Adina Mihailescu, and everything

【数论】POJ1845 Sumdiv_aizhiyan2320的博客-程序员信息网

最近本渣渣做了一道快搞死我的题,就是这个!下面隆重给出题目以及链接:SumdivTime Limit:1000MSMemory Limit:30000KTotal Submissions:29696Accepted:7312DescriptionConsider two natural numbe...

Replication_Error:Relay log write failure:could not queue event from master_Mr_HanSong的博客-程序员信息网

刚刚突然发现DB Master1(当前读写)磁盘满了,DB Master2(当前不对外提供写)replication 抛出异常:Relay log write failure:could not queue event from master,并且Slave_IO_Running: No。_1671465600

J2ME安全应用——Bouncy Castle Crypto API _zypsg的博客-程序员信息网_bouncy castle api接口文档

http://blog.csdn.net/raorq/archive/2010/03/29/5427260.aspx 1、前言随着移动商业的不断发展,对于移动用户和无线应用程序开发人员而言,安全性正在成为一个重要方面。无线通信是无线电波拦截容易获取的目标,而无线设备几乎没有任何计算能力来支持所有通信数据的强加密

Alibaba之Nacos详解_子非鱼yy的博客-程序员信息网_alibaba nacos

本文为转载文章,原文作者:Wind Mt原文链接:https://windmt.com/2018/11/09/intro-to-spring-cloud-alibaba-nacos/上个月最后一天的凌晨,Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器,并在 maven 中央库发布了第一个版本。目前 Spring Cloud Alibaba 还只能算是预览版吧,里边的坑肯定不少,不过我还是决定试试,看看 Alibaba 到底靠谱不靠谱。一、Sp.

推荐文章

热门文章

相关标签