验证性因子分子是什么?
验证性因子分析
验证性因子分析是对社会调查数据进行的一种统计分析。它测试一个因子与相对应的测度项之间的关系是否符合研究者所设计的理论关系。验证性因子分析往往通过结构方程建模来测试。在实际科研中,验证性因子分析的过程也就是测度模型的检验过程。
验证性因子分析样本要求?
根据学者的相关研究,做因子分析样本容量最好不小于100人,题目与被试比例最好是1:5,最起码样本量不可以小于指标数量(以上内容请参考吴明隆统计实务),否则因子分析难以得到稳定可靠的结果,虽然操作还是可以操作。
拓展资料
因子分析
Factor Analysis,因子分析最早由心理学家提出,是多元统计的重要分析方法之一,其基本思想是根据相关性大小对变量进行分组,使得同组内的变量之间相关性较高,不同组的变量之间相关性较低,每组变量代表了一个基本结构,因子分析中将之称为公共因子。
因子分析(Factor Analysis)基本作用?
(1)降维;
(2)发现变量间潜在关系(因子)。
因子分析分类(方向)?
(1)探索性因子分析(exploratory factor analysis)。
(2)验证性因子分析(confirmatory factoranalysis)。
探索性因子分析是不确定一堆自变量背后有几个因子,我们通过这种方法试图寻找到因子。而验证性因子分析是已经假设自变量背后有几个因子,试图通过这种方法去验证一下这种假设是否正确。验证性因子分析又和结构方程模型有很大关系。
说明:
有关因子分析的数学模型推导,在此就不做推导了,感兴趣的可以自己在网上查阅有关因子分析的数据模型推导过程。
安装factor_analyzer
开始/运行:cmd
pip install factor_analyzer
引入库读入数据
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
数据集说明:
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()
从上图很容易看出,变量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’])
因子方差分析表
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()
不旋转提取因子
#公因子数设为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旋转后的因子载荷矩阵(有旋转):nn”,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,其他变量同理。
求解因子得分系数阵
# 因子得分系数阵(等于相关系数矩阵的逆乘以因子载荷矩阵)
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
在此系数阵的每一行中找出绝对值最大的值。显然能形成两大类。
求因子分值
F_score = np.dot(np.mat(df_features), np.mat(factor_score))
print(“n2个因子得分:n”,pd.DataFrame(F_score))
计算综合分数合并数据
#取方差值,作为计算综合分的权重
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])
做了如此计算过程,有何用途?
(1)降维。把原数据集8个变量V1~V8表示的信息降维到F1,F2两个变量表出。如果是100个变量呢?同样可以降低维度,降低分析问题的复杂度。
(2)发现潜在因素。该案例中找出了两个因素,factor1和factor2,可以用于概括数据集所隐含的本源涵义。为结构方程模型分析做基础。
(3)zh可以用来量化评价每个样本。把本由多指标度量的问题化简为用一个综合指标来代替。便于排序(排名次)。
(4)本案例原数据集变量用字母V1~V8表示,并没给出每个变量的明确的经济意义或者具体的指标名称。可能是“每股收益”,也可能是“存货周转率”,亦可能是“考试成绩”等。(财务管理中所讲到的:净资产收益率 总资产报酬率 速动比率 流动比率 存货周转率 应收账款周转率 总资产增长率 销售利润率 资产负债率),大家可以据此思路再做扩展。