zoukankan      html  css  js  c++  java
  • 因子分析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()
    作者:zhangshuai
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    springboot配置tomcat大全
    python 列表推导式
    python中yield的用法详解——最简单,最清晰的解释
    正则表达式
    python 装饰器
    python 接口类、抽象类、多态
    python split和os.path.split()
    pyhton 多继承的执行顺序
    python unittest 加载测试用例的方法
    python unittest中的四个概念
  • 原文地址:https://www.cnblogs.com/zhangshaui/p/15795977.html
Copyright © 2011-2022 走看看