因子分析——python

目录

一、起源

二、基本思想

三、算法用途

四、因子分析步骤

五、factor_analyzer库

四、实例详解

1.导入库

2.读取数据

3.充分性检测

3.1 Bartlett's球状检验

 3.2 KMO检验

4.选择因子个数

4.1 特征值和特征向量

4.2 可视化展示

4.3 可视化中显示中文不报错

5.因子旋转

5.1 建立因子分析模型

5.2 查看因子方差-get_communalities()

5.3 查看旋转后的特征值

 5.4 查看成分矩阵

 5.5 查看因子贡献率

 6.隐藏变量可视化

7.转成新变量

五·、参考资料


一、起源

        因子分析的起源是这样的:1904年英国的一个心理学家发现学生的英语、法语和古典语成绩非常有相关性,他认为这三门课程背后有一个共同的因素驱动,最后将这个因素定义为“语言能力”。

        基于这个想法,发现很多相关性很高的因素背后有共同的因子驱动,从而定义了因子分析,这便是因子分析的由来。

二、基本思想

        我们再通过一个更加实际的例子来理解因子分析的基本思想:

        现在假设一个同学的数学、物理、化学、生物都考了满分,那么我们可以认为这个学生的理性思维比较强,在这里理性思维就是我们所说的一个因子。在这个因子的作用下,偏理科的成绩才会那么高。

        到底什么是因子分析?就是假设现有全部自变量x的出现是因为某个潜在变量的作用,这个潜在的变量就是我们说的因子。在这个因子的作用下,x能够被观察到。

        因子分析就是将存在某些相关性的变量提炼为较少的几个因子,用这几个因子去表示原本的变量,也可以根据因子对变量进行分类

        因子分子本质上也是降维的过程,和主成分分析(PCA)算法比较类似。

三、算法用途

        因子分析法和主成分分析法有很多类似之处。因子分析的主要目的是用来描述隐藏在一组测量到的变量中的一些更基本的,但又无法直接测量到的隐性变量。因子分析法也可以用来综合评价。

        其主要思路是利用研究指标的之间存在一定的相关性,从而推想是否存在某些潜在的共性因子,而这些不同的潜在的共性因子不同程度地共同影响着研究指标。因子分析可以在许多变量中找出隐藏的具有代表性的因子,将共同本质的变量归入一个因子,可以减少变量的数目。

四、因子分析步骤

应用因子分析法的主要步骤如下:

  • 对所给的数据样本进行标准化处理

  • 计算样本的相关矩阵R

  • 求相关矩阵R的特征值、特征向量

  • 根据系统要求的累积贡献度确定主因子的个数

  • 计算因子载荷矩阵A

  • 最终确定因子模型

五、factor_analyzer库

利用Python进行因子分析的核心库是:factor_analyzer

pip install factor_analyzer

这个库主要有两个主要的模块需要学习:

  • factor_analyzer.analyze(重点)

  • factor_analyzer.factor_analyzer

官网学习地址:factor_analyzer package — factor_analyzer 0.3.1 documentation

四、实例详解

 数据来源于中国统计年鉴。

1.导入库

# 数据处理
import pandas as pd
import numpy as np# 绘图
import seaborn as sns
import matplotlib.pyplot as plt
# 因子分析
from factor_analyzer import FactorAnalyzer

2.读取数据

df = pd.read_csv("D:\桌面\demo.csv",encoding='gbk')
df

输出:

 如果不想要城市那一列的话,可以在读取的时候就删除,也可以后面再删

比如,读取时删除

df = pd.read_csv("D:\桌面\demo.csv", index_col=0,encoding='gbk').reset_index(drop=True)
df

返回:

 然后我们查询一下,数据的缺失值情况:

df.isnull().sum()

返回:

 然后,我们可以针对的,对数据进行一次处理:

比如删除无效字段的那一列

#  去掉无效字段
df.drop(["变量名1","变量名2","变量名3"],axis=1,inplace=True)

或者,删除空值

# 去掉空值
df.dropna(inplace=True)

3.充分性检测

        在进行因子分析之前,需要先进行充分性检测,主要是检验相关特征阵中各个变量间的相关性,是否为单位矩阵,也就是检验各个变量是否各自独立。

3.1 Bartlett's球状检验

        检验总体变量的相关矩阵是否是单位阵(相关系数矩阵对角线的所有元素均为1,所有非对角线上的元素均为零);即检验各个变量是否各自独立。

        如果不是单位矩阵,说明原变量之间存在相关性,可以进行因子分子;反之,原变量之间不存在相关性,数据不适合进行主成分分析

from factor_analyzer.factor_analyzer import calculate_bartlett_sphericitychi_square_value, p_value = calculate_bartlett_sphericity(df)
chi_square_value, p_value

返回:

 3.2 KMO检验

        检查变量间的相关性和偏相关性,取值在0-1之间;KOM统计量越接近1,变量间的相关性越强,偏相关性越弱,因子分析的效果越好。

通常取值从0.6开始进行因子分析

#KMO检验
from factor_analyzer.factor_analyzer import calculate_kmo
kmo_all,kmo_model=calculate_kmo(df)
kmo_model

返回:

 通过结果可以看到KMO大于0.6,也说明变量之间存在相关性,可以进行分析。

4.选择因子个数

方法:计算相关矩阵的特征值,进行降序排列

4.1 特征值和特征向量

faa = FactorAnalyzer(25,rotation=None)
faa.fit(df)# 得到特征值ev、特征向量v
ev,v=faa.get_eigenvalues()
print(ev,v)

返回:

4.2 可视化展示

将特征值和因子个数的变化绘制成图形:

 # 同样的数据绘制散点图和折线图
plt.scatter(range(1, df.shape[1] + 1), ev)
plt.plot(range(1, df.shape[1] + 1), ev)# 显示图的标题和xy轴的名字
# 最好使用英文,中文可能乱码
plt.title("Scree Plot")  
plt.xlabel("Factors")
plt.ylabel("Eigenvalue")plt.grid()  # 显示网格
plt.show()  # 显示图形

返回:

 从上面的图形中,我们明确地看到:选择2或3个因子就可以了

4.3 可视化中显示中文不报错

只需要在画图前,再导入一个库即可,见代码

import matplotlib as mplmpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

5.因子旋转

5.1 建立因子分析模型

在这里选择,最大方差化因子旋转

# 选择方式: varimax 方差最大化
# 选择固定因子为 2 个
faa_two = FactorAnalyzer(2,rotation='varimax')
faa_two.fit(df)

返回:

ratation参数的其他取值情况:

  • varimax (orthogonal rotation)

  • promax (oblique rotation)

  • oblimin (oblique rotation)

  • oblimax (orthogonal rotation)

  • quartimin (oblique rotation)

  • quartimax (orthogonal rotation)

  • equamax (orthogonal rotation)

5.2 查看因子方差-get_communalities()

查看公因子方差

# 公因子方差
faa_two.get_communalities()

返回:

 查看每个变量的公因子方差数据

pd.DataFrame(faa_two.get_communalities(),index=df.columns)

返回:

5.3 查看旋转后的特征值

faa_two.get_eigenvalues()

返回:

pd.DataFrame(faa_two.get_eigenvalues())

返回:

 5.4 查看成分矩阵

查看它们构成的成分矩阵:

# 变量个数*因子个数
faa_two.loadings_

返回:

 

如果转成DataFrame格式,index就是我们的变量,columns就是指定的因子factor。转DataFrame格式后的数据:

pd.DataFrame(faa_two.loadings_,index=df.columns)

返回:

 5.5 查看因子贡献率

通过理论部分的解释,我们发现每个因子都对变量有一定的贡献,存在某个贡献度的值,在这里查看3个和贡献度相关的指标:

  • 总方差贡献:variance (numpy array) – The factor variances

  • 方差贡献率:proportional_variance (numpy array) – The proportional factor variances

  • 累积方差贡献率:cumulative_variances (numpy array) – The cumulative factor variances

 我们来看一下总方差贡献吧

faa_two.get_factor_variance()

返回:

 

 6.隐藏变量可视化

为了更直观地观察每个隐藏变量和哪些特征的关系比较大,进行可视化展示,为了方便取上面相关系数的绝对值:

df1 = pd.DataFrame(np.abs(faa_two.loadings_),index=df.columns)
print(df1)

返回:

然后我们通过热力图将系数矩阵绘制出来:

# 绘图plt.figure(figsize = (14,14))
ax = sns.heatmap(df1, annot=True, cmap="BuPu")# 设置y轴字体大小
ax.yaxis.set_tick_params(labelsize=15)
plt.title("Factor Analysis", fontsize="xx-large")# 设置y轴标签
plt.ylabel("Sepal Width", fontsize="xx-large")
# 显示图片
plt.show()# 保存图片
# plt.savefig("factorAnalysis", dpi=500)

返回:

7.转成新变量

上面我们已经知道了2个因子比较合适,可以将原始数据转成2个新的特征,具体转换方式为:

faa_two.transform(df)

返回:

 转成DataFrame格式后数据展示效果更好:

df2 = pd.DataFrame(faa_two.transform(df))
print(df2)

返回:

五·、参考资料

1、Factor Analysis:Factor Analysis with Python — DataSklr

2、多因子分析:因子分析(factor analysis)例子–Python | 文艺数学君

3、factor_analyzer package的官网使用手册:factor_analyzer package — factor_analyzer 0.3.1 documentation

4、浅谈主成分分析和因子分析:浅谈主成分分析与因子分析 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯每日一练】 三色旗

目录 1.说明 2.解法 3.python实现 第一种 第二种 第三种 1.说明 三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来称之。 假设有一条绳子,上面有红…

熵权法 —— matlab

目录 一、熵权法介绍 二、熵权法赋权步骤 1.指标正向化 mapminmax介绍 2.数据标准化 3.计算信息熵 4.计算权重以及得分 三、实例分析 1.读取数据 2.指标正向化 2.1 越小越优型处理 2.2 某点最优型指标处理 3.数据标准化 4.计算信息熵 5.计算权重 6.计算得分 总…

熵权法 —— python

目录 一、熵权法介绍 二、熵权法赋权步骤 1.指标正向化 mapminmax介绍 2.数据标准化 3.计算信息熵 4.计算权重以及得分 四、实例分析 1.导入相关库 2.读取数据 2.指标正向化 2.1 越小越优型处理 2.2 某点最优型指标处理 3.数据标准化 4.计算信息熵 5.计算权重 6.…

R语言基础入门(3)之数据类型与相应运算1

目录 一、常量与变量 1.常量 2.变量 二、数据类型 三、数值型向量 3.1 c() 函数 3.2 length(x) 3.3 numeric() 四、向量运算 1.标量和标量运算 2.向量与标量运算 3.等长向量运算 4.不等长向量的运算 五、向量函数 1.向量化的函数 2.排序函数 3.统计函数…

C语言位运算详解

C语言位运算包括:按位与运算、或运算、异或运算、左移运算、右移运算。 位运算,就是对一个比特(Bit)位进行操作。比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte)…

R语言基础入门(4)之数据类型与相应运算2

目录 一、逻辑型向量与比较运算 二、 逻辑运算 三、逻辑运算函数 一、逻辑型向量与比较运算 逻辑型是 R 的基本数据类型之一&#xff0c;只有两个值 TRUE 和 FALSE, 缺失时为 NA。逻辑值一般产生自比较&#xff0c;如sele <- (log10(15) < 2); print(sele) 返回&…

R语言基入门(5)之字符型数据及其处理

目录 1.字符型向量 2. paste() 函数 3.转换大小写 4.字符串长度 5.取子串 6. 类型转换 7. 字符串拆分 8.字符串替换功能 9.正则表达式 1.字符型向量 字符型向量是元素为字符串的向量。如s <- c(abc, , a cat, NA, 李明) s 返回&#xff1a; 2. paste() 函数 针对…

R语言基础入门(6)之向量下标和子集

目录 1.正整数下标 2.负整数下标 3.空下标与零下标 4.下标超界 5.逻辑下标 6. which()、which.min()、which.max() 函数 7. 元素名 8.用 R 向量下标作映射 9.集合运算 练习 1.正整数下标 首先定义一个x&#xff0c;然后对向量 x, 在后面加方括号和下标可以访问向量…

C语言随机数的生成

在编程中&#xff0c;我们经常需要生成随机数&#xff0c;例如&#xff0c;贪吃蛇游戏中在随机的位置出现食物&#xff0c;扑克牌游戏中随机发牌等。 在C语言中&#xff0c;我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随机数&#xff0c;它的用法为&#xff…

R语言基础入门(7)之数据类型的性质

目录 1.存储模式与基本类型 2.类属 3.类型转换 4.属性 5.str() 函数 6.关于赋值 1.存储模式与基本类型 R语言中根据类型可以将数据划分为&#xff1a; 数值型&#xff08;numeric&#xff09;整数型&#xff08;integer&#xff09;字符型&#xff08;character&#xff09…

C++班级通讯录

C实现班级通讯录管理系统 设计流程 本系统基于C实现班级通讯录管理系统。功能包括增、删、查、改等。通讯录包括的个人信息有姓名、学号、性别、籍贯、政治面貌、手机号、QQ号、宿舍等。主要用到了指针、结构体、遍历链表、文件读取等知识点。 优点 1 . 此系统含有欢迎使用的…

两万字教会你解析库之Beautiful Soup

目录 1.简介 2.准备工作 3.解析器 4.基本用法 5.节点选择器 5.1选择元素 5.2提取信息 5.3嵌套选择 5.4关联选择 6.方法选择器 7. css 选择器 7.1 嵌套选择 7.2 获取属性 7.3 获取文本 总结 1.简介 简单来说&#xff0c;Beautiful Soup就是Python的一个HTML或XM…

C语言实现随机抽取纸牌

程序设计要求 本程序负责发一副标准纸牌&#xff0c;每张标准纸牌都有一种花色&#xff08;梅花、方块、黑桃、红桃&#xff09;和一个等级&#xff08;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6…K,A&#xff09;。程序需要用户指明手机有几张牌。 程序设计流…

R语言基础入门(8)之日期时间

目录 1.日期和日期时间类型 2.从字符串生成日期数据 3.日期显示格式 4.访问日期时间的组成值 5.日期舍入计算 6.日期计算 6.1 时间长度 6.2 时间周期 6.3 时间区间 7.基本 R 软件的日期功能 7.1 生成日期和日期时间型数据 7.2 取出日期时间的组成值 7.3 日期计算 练…

C语言点名器

设计流程 1 . 使用求模符号“%”求模数控制随机数产生范围。 2 . 使用rand&#xff08;&#xff09;计算出一个随机数。 3 . 使用函数time()来获取时间。 4 . 用二维字符数组储存名字&#xff0c;产生范围类的随机数在用下标调用数组里面的名字。 效果展示 完整代码 #inclu…

R语言基础入门(9)之因子类型

目录 1.因子 2.table() 函数 3.tapply() 函数 4.forcats 包的因子函数 练习 1.因子 R 中用因子代表数据中分类变量, 如性别、省份、职业。有序因子代表有序量度&#xff0c;如打分结果&#xff0c;疾病严重程度等。用 factor() 函数把字符型向量转换成因子&#xff0c;如x…

2万字带你攻略掉Selenium

目录 1. 准备工作 1.1 安装selenium库 1.2 安装浏览器驱动 2. 基本用法 2.1 初始化浏览器对象 2.2 访问页面 2.3 设置浏览器大小 2.4 刷新页面 2.5 前进后退 3. 获取页面基础属性 4. 定位页面元素 4.1 id定位 4.2 name定位 4.3 class定位 4.4 tag定位 4.5 lin…

IDEA里的web.xml页面的Servlet名称报错下方出现红色下划线

错误显示 对于上述错误是因为只有新建的Servlet名称但是并没为为这个Servlet指定访问地址的路径和映射&#xff0c;我们只需要添加访问地址的路径和映射就可以解决这个问题了。 修改之后的代码 <?xml version"1.0" encoding"UTF-8"?> <web-ap…

Python之Hello World

python实现Hello World项目 在项目上点击右键New–>File,然后输入文件名Hello World 一个Hello World文件创建完成 编写相应的代码 在空白的地方右击选择Run"Hello World" 程序运行成功&#xff0c;输出Hello World

knn(k近邻算法)——python

目录 1. 基本定义 2. 算法原理 2.1 算法优缺点 2.2 算法参数 2.3 变种 3.算法中的距离公式 4.案例实现 4.1 导入相关库 4.2 读取数据 4.3 读取变量名 4.4 定义X,Y数据 4.5 分离训练集和测试集 4.6 计算欧式距离 4.7 可视化距离矩阵 4.8 预测样本 4.9 查看正确…