Ejemplo n.º 1
0
def factor_analysis(data, num_keep):  # data为只做因子分析的特征列数据
    from fa_kit import FactorAnalysis
    from fa_kit import plotting as fa_plotting

    # 一、计算特征向量矩阵P:(因子旋转前 主成分); 通过主成分在每个变量上的权重的绝对值大小,确定每个主成分的代表性
    pca = PCA(n_components=num_keep).fit(data)  # PCA确定保留主成分个数
    e_matrix = pd.DataFrame(pca.components_).T  # 以 列 的方式呈现 (默认是以 特征向量 行 的方式呈现)
    print("因子旋转前的 特征向量矩阵P:(因子旋转前 主成分):(P已降维)")
    print(e_matrix)
    print("-" * 30)

    # 另1: 如果是两个主成分: 可以做 因子旋转前的 两个主成分作散点图

    # 二、因子分析:
    # 1、数据导入和转换
    fa = FactorAnalysis.load_data_samples(
        data,  # 数据必须经过 标准化(Z分数)
        preproc_demean=True,
        preproc_scale=True)

    # 2、抽取主成分
    fa.extract_components()

    # 3、使用top_n法保,留2个主成分,上面PCA已算出
    fa.find_comps_to_retain(method='top_n',
                            num_keep=num_keep)  # num_keep 保留主成分个数

    # 4、varimax: 使用 最大方差法 进行 因子旋转
    fa.rotate_components(method='varimax')

    # 5、因子旋转后的 因子权重(因子载荷矩阵A) 相当于 特征矩阵P
    fas = pd.DataFrame(fa.comps["rot"])  # rot: 使用因子旋转法; 默认以 因子权重 列 的方式呈现
    print("因子旋转后的 因子权重(因子载荷矩阵A):(A已降维)")
    print(fas)
    print("-" * 30)

    # 6、第一图为主成分保留个数; 第二、三图为 因子旋转 前、后 的因子权重 可视化
    fa_plotting.graph_summary(fa)
    plt.show()
    # - 说明:可以通过第三张图观看 因子旋转后 每个因子在每个变量上的权重,权重越高,代表性越强

    # 另2: 如果是两个主成分: 可以做 因子旋转后的 因子权重(因子载荷矩阵A) 两个因子权重作散点图

    # 7、因子得分:
    # 到目前还没有与PCA中fit_transform类似的函数,因此只能手工计算因子得分
    # 以下是矩阵相乘的方式计算因子得分: 因子得分 = 原始数据(n*k) · 权重矩阵(k*num_keep)
    fa_score = pd.DataFrame(np.dot(data, fas))  # 注意data数据需要标准化
    print("因子得分:(结果已降维)")
    print(fa_score)
    print("-" * 30)

    # 另3: 如果是两个主成分: 可以做 因子得分的散点图

    return fa_score
Ejemplo n.º 2
0
# - 2、设定提取主成分的方式。默认为“broken_stick”方法,建议使用“top_n”法

# In[7]:


fa.find_comps_to_retain(method='top_n',num_keep=3)


# - 3、通过最大方差法进行因子旋转

# In[8]:


fa.rotate_components(method='varimax')
fa_plotting.graph_summary(fa)


# - 说明:可以通过第三张图观看每个因子在每个变量上的权重,权重越高,代表性越强

# - 4、获取因子得分

# In[12]:


pd.DataFrame(fa.comps["rot"])


# In[13]: