快捷搜索:  汽车  科技

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)开始/运行:cmd有关因子分析的数学模型推导,在此就不做推导了,感兴趣的可以自己在网上查阅有关因子分析的数据模型推导过程。(2)验证性因子分析(confirmatory factoranalysis)。探索性因子分析是不确定一堆自变量背后有几个因子,我们通过这种方法试图寻找到因子。而验证性因子分析是已经假设自变量背后有几个因子,试图通过这种方法去验证一下这种假设是否正确。验证性因子分析又和结构方程模型有很大关系。说明:

因子分析

Factor Analysis,因子分析最早由心理学家提出,是多元统计的重要分析方法之一,其基本思想是根据相关性大小对变量进行分组,使得同组内的变量之间相关性较高,不同组的变量之间相关性较低,每组变量代表了一个基本结构,因子分析中将之称为公共因子。

因子分析(Factor Analysis)基本作用?

(1)降维;

(2)发现变量间潜在关系(因子)。

因子分析分类(方向)?

(1)探索性因子分析(exploratory factor analysis)。

(2)验证性因子分析(confirmatory factoranalysis)。

探索性因子分析是不确定一堆自变量背后有几个因子,我们通过这种方法试图寻找到因子。而验证性因子分析是已经假设自变量背后有几个因子,试图通过这种方法去验证一下这种假设是否正确。验证性因子分析又和结构方程模型有很大关系。

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(1)

说明:

有关因子分析的数学模型推导,在此就不做推导了,感兴趣的可以自己在网上查阅有关因子分析的数据模型推导过程。

安装factor_analyzer

开始/运行:cmd

pip install factor_analyzer

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(2)

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(3)

引入库读入数据

import pandas as pd

import numpy as np

import numpy.linalg as nlg

from pandas import DataFrame

from factor_analyzer import FactorAnalyzer Rotator calculate_kmo calculate_bartlett_sphericity

df_features = pd.read_csv('test11.csv')

rows*columns:1000*8

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(4)

数据集说明:

V1~V8:表示8个指标变量名称,每一行为一个样本。每个值为对应样本在该指标下的值。

该数据包括:1000行,每行8列数据。即构成1000*8数据矩阵。

数据相关性

因子分析的前提条件是观测变量间有较强的相关性。因为如果变量之间无相关性或相关性较小的话,它们不会有共享因子。相关系数矩阵描述了原始变量之间的相关关系。可以帮助判断原始变量之间是否存在相关关系。如果所选变量之间无关系,做因子分析 是不恰当的。

相关性大小的度量:相关系数(矩阵)

import matplotlib.pyplot as plt

import seaborn as sns

#计算原始数据集变量间的相关系数

df_corr = df_features.corr()

# 用来正常显示中文标签

plt.rcParams['font.sans-serif']=['FangSong']

# 用来正常显示符号

plt.rcParams['axes.unicode_minus']=False

plt.subplots(figsize=(6 6))

sns.heatmap(df_corr annot=True vmax=1 square=True cmap="Blues")

plt.show()

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(5)

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(6)

从上图很容易看出,变量V1~V4之间,变量V5~V8之间有相对较强的相关系。很显然,形成比较明显的两个变量聚合体。

因子分析适应性检验

因子分析的前提是具有一定的相关性,因此在做因子分析之前 我们需要先做充分性检验 就是数据集中是否能找到这些factor 我们可以使用下面的方式进行寻找:

(1)Bartlett’s test of sphericity(巴特利特球形检测) 是用来检测观察到的变量之间是否关联 如果检测结果在统计学上不显著 就不能采用因子分析,巴特利球形检验的值范围在0-1,越接近1,使用因子分析效果越好。

(2)Kaiser-Meyer-Olkin Test(KMO检测)

KMO值:0.9以上非常好;0.8以上好;0.7一般; KMO < 0.6 则认为不充分。

#kmo值

kmo = calculate_kmo(df_features)

# bartlett球形度检验p值

bartlett = calculate_bartlett_sphericity(df_features)

print("\n因子分析适用性检验:")

print('KMO:{}\nBartlett test of Sphericity :{}\nSig.:{}'.format(kmo[1] bartlett[0] bartlett[1]))

pd.DataFrame([kmo[1].round(3) bartlett[1].round(3) bartlett[0].round(3)]

index={'KMO' 'Bartlett test fo sphericity' 'Sig'}

columns=['KMO and Bartlett Test'])

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(7)

因子方差分析表

fa = FactorAnalyzer(rotation=None n_factors=8 method='principal')

fa.fit(df_features)

fa_15_sd = fa.get_factor_variance()

fa_15_df = pd.DataFrame({'特征值': fa_15_sd[0] '方差贡献率': fa_15_sd[1] '方差累计贡献率': fa_15_sd[2]})

#各个因子的特征值以及方差贡献率

print('Total Variance Explained')

#画图

plt.plot(fa_15_df.特征值 'bo-.')

plt.xlabel('Factor Num')

plt.ylabel('EigenValue')

plt.title('Scree Plot')

plt.grid()

#画图

plt.plot(fa_15_df.方差累计贡献率 'bo-.')

plt.xlabel('Factor Num')

plt.ylabel('CumVar')

plt.title('CumVar Plot')

plt.grid()

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(8)

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(9)

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(10)

不旋转提取因子

#公因子数设为2个,拟合

fa_5 = FactorAnalyzer(rotation=None n_factors=2 method='principal')

fa_5.fit(df_features)

#查看公因子提取度

print("\n公因子提取度:\n" fa_5.get_communalities())

#查看因子载荷

print("\n因子载荷矩阵(未旋转):\n" fa_5.loadings_)

公因子提取度:

[0.5615 0.4024 0.2833 0.4777 0.6124 0.5424 0.2845 0.3844]

因子载荷矩阵(未旋转):

[[ 0.5277 0.532 ] [ 0.3946 0.4966]

[ 0.3625 0.3898] [ 0.4562 0.5192]

[ 0.5995 -0.5031] [ 0.6017 -0.4246]

[ 0.4426 -0.2977] [ 0.5376 -0.3088]]

旋转提取因子

很多时候我们从因子载荷矩阵中很难去解释主成分所蕴含的逻辑关系,因此就需要将因子载荷矩阵进行旋转。

旋转的目的是通过改变坐标轴位置,重新分配各个因子所解释方差比例,使其载荷系数更接近1或0,能更好地解释和命名变量。旋转后的因子不改变模型对数据的拟合程度,也不改变各个变量的公因子方差,使因子结构变得更简单。

假如我们使用varimax方法旋转后,还是不能很好地解释主成分所蕴含的逻辑,那么我们就需要用其它旋转方法进行探索,这里以promax进行展示。

#使用最大方差法旋转因子载荷矩阵

fa_5_rotate = FactorAnalyzer(rotation='varimax' n_factors=2 method='principal')

fa_5_rotate.fit(df_features)

#查看旋转后的因子载荷

print("\n旋转后的因子载荷矩阵(有旋转):\n\n" fa_5_rotate.loadings_)

print("因子载荷矩阵(有旋转):\n")

loadings = pd.DataFrame(data= fa_5_rotate.loadings_.round(3) columns=['F1' 'F2'] index=df_features.columns)

loadings:因子载荷矩阵

V1~V8:可以用因子载荷矩阵对应值线性表出。

如:V1=0.091*F1 0.744*F2,其他变量同理。

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(11)

求解因子得分系数阵

# 因子得分系数阵(等于相关系数矩阵的逆乘以因子载荷矩阵)

X1 = np.mat(df_corr)

X1 = nlg.inv(X1)

factor_score = np.dot(X1 fa_5_rotate.ladings_)

factor_score = pd.DataFrame(factor_score)

factor_score.columns = ['factor1' 'factor2']

factor_score.index = df_corr.columns

print("\n因子得分系数阵:\n" factor_score)

*因子系数阵的因子可以被变量线性表出。

如:factor=-0.028069*V1-0.063343*V2-0.029759*V3-0.049737*V4 0.442872*V5 0.410131*V6 0.295427*V7 0.336172*V8

在此系数阵的每一行中找出绝对值最大的值。显然能形成两大类。

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(12)

求因子分值

F_score = np.dot(np.mat(df_features) np.mat(factor_score))

print("\n2个因子得分:\n" pd.DataFrame(F_score))

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(13)

计算综合分数合并数据

#取方差值,作为计算综合分的权重

weight_var = fa_15_sd[1][0:2]

weight_var2 = np.mat(weight_var).T

#计算综合分zh

total_score = np.dot(F_score weight_var2)

zh = pd.DataFrame(total_score index=df_features.index)

zh.columns=['zh']

F = pd.DataFrame(F_score index=df_features.index)

F.columns={'F1' 'F2'}

#连接数据集

totall_zh = df_features.join([F zh])

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(14)

做了如此计算过程,有何用途?

(1)降维。把原数据集8个变量V1~V8表示的信息降维到F1 F2两个变量表出。如果是100个变量呢?同样可以降低维度,降低分析问题的复杂度。

(2)发现潜在因素。该案例中找出了两个因素,factor1和factor2,可以用于概括数据集所隐含的本源涵义。为结构方程模型分析做基础。

(3)zh可以用来量化评价每个样本。把本由多指标度量的问题化简为用一个综合指标来代替。便于排序(排名次)。

(4)本案例原数据集变量用字母V1~V8表示,并没给出每个变量的明确的经济意义或者具体的指标名称。可能是“每股收益”,也可能是“存货周转率”,亦可能是“考试成绩”等。(财务管理中所讲到的:净资产收益率 总资产报酬率 速动比率 流动比率 存货周转率 应收账款周转率 总资产增长率 销售利润率 资产负债率),大家可以据此思路再做扩展。

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(15)

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(16)

因子分析之前怎么把数据标准化(如何使用factoranalyzer进行因子分析)(17)

猜您喜欢: