因子分析python实操

参考文章:https://blog.csdn.net/qq_41081716/article/details/103332472

1.kmo检验和bartlett球形检验

#因子分析
df2 = data.iloc[:,[364,365,366,367,368,369,370,371]]
df2 = df2.astype(float)  #df2的dtype是object,如果不转成float,相关系数矩阵是出不来的
df2_corr = df2.corr()
print("\n相关系数:\n",df2_corr)
kmo = calculate_kmo(df2)  # kmo值要大于0.7
bartlett = calculate_bartlett_sphericity(df2)  # bartlett球形度检验p值要小于0.05
print("\n因子分析适用性检验:")
print('kmo:{},bartlett:{}'.format(kmo[1], bartlett[1]))    #不知道为什么是kmo[1]和bartlett[1],但查了好多人都是这么做的,姑且就当他是对的吧  实验:print(kmo[0])和print(kmo)的效果是一样的,出来一个数组,我不太明白里面的含义;而print(kmo[2])则out of range了
print(bartlett[1]<0.05)   #输出为True则通过球形检验。

2.获取因子载荷矩阵

fa = FactorAnalyzer(rotation=None, n_factors=8, method='principal')
fa.fit(df2)
fa_8_sd = fa.get_factor_variance()   #fa_8_sd是一个array嵌套三个array,这三个小array中分别就是下面的特征值、方差贡献率、方差累计贡献率,感兴趣可以自己print看看
fa_8_df = pd.DataFrame(
    {'特征值': fa_8_sd[0], '方差贡献率': fa_8_sd[1], '方差累计贡献率': fa_8_sd[2]})
 
#各个因子的特征值以及方差贡献率
print("\n",fa_8_df)

解释一下Factoranalyzer,可以结合help来食用。
rotation:因子旋转的方法,=None就是不进行因子旋转,'varimax’为方差最大旋转法,此外还有’quartimax’及’equamax’等多种方法,在另一篇文章中略有介绍。
n_factors : int, optional
The number of factors to select.
Defaults to 3.
n_factors参数是公共因子的数量,默认为3。

method : {‘minres’, ‘ml’, ‘principal’}, optional
The fitting method to use, either MINRES or
Maximum Likelihood.
Defaults to ‘minres’.
method参数大概影响的是拟合的方式?也就是我们另一篇文章中提到过的
在这里插入图片描述
一般选择’principal’,即上图所述的主成分分解。

| impute : {‘drop’, ‘mean’, ‘median’}, optional
| If missing values are present in the data, either use
| list-wise deletion (‘drop’) or impute the column median
| (‘median’) or column mean (‘mean’).
impute参数如英文所示,影响缺失值的处理方法。
差不多就是这样了,其他参数一般用不上,需要了再自己help看看。

以上代码输出结果:
在这里插入图片描述
可以看到kmo值和bartlett球形检验是通过的,并且0~4一共五个因子的方差累计贡献率在0.85以上,所以等等设定公共因子数量为5个。


#公因子数设为5个,重新拟合
fa_5 = FactorAnalyzer(rotation=None, n_factors=5, method='principal')
fa_5.fit(df2)
 
#查看公因子提取度
print("\n公因子提取度:\n",fa_5.get_communalities())
 
#查看因子载荷
print("\n因子载荷矩阵:\n",fa_5.loadings_)
 
#使用最大方差法旋转因子载荷矩阵
fa_5_rotate = FactorAnalyzer(rotation='varimax', n_factors=5, method='principal')
fa_5_rotate.fit(df2)
 
#查看旋转后的因子载荷
print("\n旋转后的因子载荷矩阵:\n",fa_5_rotate.loadings_)
print(data.columns[364:372])

输出结果:
在这里插入图片描述

查看公因子的提取度,发现当使用5个公因子时,5个公因子对8个维度的解释率都超过0.6,说明提取的5个公因子对原始维度有一定的解释力。
而旋转之后得到的因子载荷矩阵,据说是系数>0.5才能取?

因子得分的部分很简单,参考开头那篇文献即可,并配合自己的代码中的注释。但要注意的是我的代码是先对各个得分进行标准化后,再加权计算得到综合得分,因此是魔改版本。所以总的来说还是参考开头文献。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值