Fork me on Github
欢迎来到zhang-shuai的博客
zhangshuai
晓看天色暮看云,行也思君,坐也思君

因子分析AF

一、概述

1.1 什么是因子分析

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

  因子分析在经济学、心理学、语言学和社会学等领域经常被用到,一般会探索出背后的影响因素如:语言能力、智力、理解力等。这些因素都是无法直接计算,而是基于背后的调研数据所推算出的公共因子。

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

1.2 解决什么问题

1. 在多变量场景下,挖掘背后影响因子

2. 用于数学建模前的降维

二、步骤

  因子分析是寻找不线性相关的“变量”的线性组合来表示原始变量,这些“变量”称为因子,如下图中的F就是因子,X是原始变量,eps是原始变量不可被公共因子表示的部分。

 

 

 

 

以上的公式还需要满足:

  1. 要求因子的数据小于原始变量的数量,即m≤p;
  2. 因子F之间是相互独立且方差为1;
  3. 因子F和eps之间的相关性为0,eps之间相关性为0。

因此,因子分析的过程就是实现以下几个目的的过程:

  1. 求解方程中的因子F的系数;
  2. 给予因子F实际的解释;
  3. 展示原始特征和公共因子之间的关系,从而实现降维和特征分类等目的。

1)充分性检验

  • 目的:检验变量之间是否存在相关性,从而判断是否适合做因子分析;
  • 方法:抽样适合性检验(KMO检验)或者 巴特利特检验(Bartlett’s Test)。

 

 

2)选择因子个数

  • 目的:通过数据定义最合适的潜在公共因子个数,这个决定后面的因子分析效果;
  • 方法:Kaiser”s准则 或者 累积贡献率原则。

 

 

3)提取公共因子并做因子旋转

  提取公共因子就是上面提到的求解函数的过程,一般求解方法有:主成分法、最大似然法、残差最小法等等。

  因子旋转的原因是提取公共因子的解有很多,而因子旋转后因子载荷矩阵将得到重新分配,可以使得旋转后的因子更容易解释。常用的方法是方差最大法。

4)对因子做解释和命名

  • 目的:解释和命名其实是对潜在因子理解的过程;这一步非常关键,需要非常了解业务才可。这也是我们使用因子分析的主要原因。
  • 方法:根据因子载荷矩阵发现因子的特点。

5)计算因子得分

  对每一样本数据,得到它们在不同因子上的具体数据值,这些数值就是因子得分。

第一步:数据预处理和分析

###标准化
scaler = StandardScaler().fit(data_9) #声明类,并用fit()方法计算后续标准化的mean与std
print('\n均值:',scaler.mean_)    #类属性:均值
print('方差:',scaler.var_)     #类属性:方差

x_scaler = scaler.transform(data_9)  #转换X
print('\n标准化数据:\n',x_scaler)

第二步:因子分析——充分性检验

  巴特利特P值小于0.01,KMO值大于0.6;说明此数据适合做因子分析。

## 充分性测试
### p值小于0.01,kmo值大于0.6
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
from factor_analyzer.factor_analyzer import calculate_kmo

chi_val,p_val = calculate_bartlett_sphericity(x_scaler)
kmo_all,kmo_val = calculate_kmo(x_scaler)
print(p_val,kmo_val)

第三步:因子个数确定

  特征值大于1的因子数有2个,且两个因子的累计方差有68%;因此确定因子个数为2个。

###因子个数确定
from factor_analyzer import FactorAnalyzer

fa = FactorAnalyzer(x_scaler.shape[1],rotation=None)
fa.fit(x_scaler)
eigen_val,eigen_vector = fa.get_eigenvalues()
var = fa.get_factor_variance
print(eigen_val)
print(eigen_vector)
print(var)

第四步:做因子分析

  调用因子分析函数,并得到因子载荷矩阵;

### 因子分析
fa = FactorAnalyzer(2,rotation='varimax')
fa.fit(x_scaler)

df_loading = pd.DataFrame(fa.loadings_,index=header_name[7:16])
df_loading

第五步:计算因子得分

### 计算因子得分
data_trans = pd.DataFrame(fa.transform(x_scaler))
plt.scatter(data_trans.loc[:,0],data_trans.loc[:,1])
plt.title("因子得分")
plt.xlabel("factor1")
plt.ylabel("factor2")
plt.grid()
plt.show()

 

posted @ 2022-01-12 23:46  咘網鶵釁  阅读(147)  评论(0编辑  收藏  举报