为什么?
SPSS 那么简单还免费,为什么还要用 Python 做因子分析(factor analysis)呢?工作狗表示,建模的目的是要卖钱的,也就是要嵌入到公司开发的产品上去,用 Python 写因子分析(factor analysis),总比找SPSS的接口更容易让大家接受。
算法核心
因子分析法(factor analysis)的核心是对若干综合指标进行因子分析并提取公共因子,再以每个因子的方差贡献率作为权数与该因子的得分乘数之和构造得分函数。
Python代码
先把该装上的模块都装上哈,比如:factor_analyzer
安装方法:
- 系统解释器: pip install factor_analyzer;
- conda-jupyter:conda install -c desilinguist factor_analyzer;
第一步:看原数据
总觉得看到原数据是个什么样子,心里才有点谱,所以基本每一篇博客都要先展示一下原数据。
import pandas as pd
import numpy as np
from pandas import DataFrame,Series
from factor_analyzer import FactorAnalyzerdatafile = u'D:\\pythondata\\textdata.xlsx'
data = pd.read_excel(datafile)
data.head()
指标1 指标2 指标3 指标4 指标5 指标6 指标7 指标8 指标9 指标10 0 0.003790 0.003790 0.004935 0.0076 0.40 0.0060 0.4000 0.0060 1.1538 NaN 1 NaN NaN 0.465854 NaN NaN NaN 0.0909 0.1427 1.1579 NaN 2 0.294889 0.124683 0.144793 0.0735 0.25 0.0735 0.2000 0.0631 1.0800 0.4444 3 0.668122 0.668122 0.668122 0.8010 0.50 0.8010 0.5000 0.8010 1.0313 0.3636 4 0.304509 0.188622 0.188622 0.2026 0.40 0.2026 0.4000 0.2026 1.0600 0.5556
有一些空值,用0填充
data = data.fillna(0)#用0填充空值
这一步对应到 SPSS ,就是导入数据了,放一张 SPSS 的页面,下面每一步都会这样一一对应的讲解,希望熟悉 SPSS 的可以对上号,更快的学习用 Python 做因子分析。
第二步:数据清洗
这里的原数据是用 mysql 清洗好的数据输出的指标值,所以这里不用清洗。清洗数据是一件繁重复杂的事情,有兴趣的可以单独去搜相关的文章学习。
第三步:建模
fa = FactorAnalyzer()
fa.analyze(data, 5, rotation=None)#固定公共因子个数为5个
print("公因子方差:\n", fa.get_communalities())#公因子方差
print("\n成分矩阵:\n", fa.loadings)#成分矩阵
var = fa.get_factor_variance()#给出贡献率
print("\n解释的总方差(即贡献率):\n", var)
输出结果:
有人要问了,怎么python输出的结果和SPSS不一样呢?原因有二:
- SPSS默认用的提取方法是主成分分析,即PCA中的principal 函数,而模块factor_analyzer中用的提取方法是fa函数,具体是个什么区别我还没开始研究,等有时间研究研究再跟大家共享吧,懂的大神也欢迎指教;
- 第二个原因就是,SPSS选择了最大平衡法旋转,而python的代码中,了解的人会发现 rotation=None,没有旋转;
第四步:输出因子得分
因子分析关键的地方就是要输出公共因子的得分,这样才能计算综合得分。在SPSS中,只要勾选了【得分】中的【显示因子得分系数矩阵】,就会自动输出公共因子的得分,如下图所示。
在python的factor_analyzer模块中也有这样的函数可以实现这样的功能
fa_score = fa.get_scores(data)#因子得分
fa_score.head()
第五步:输出综合得分
因子分析法综合得分的计算方式:
score=( fac1 * fac1贡献率 + fac2 * fac2贡献率 + ...... + fac5 * fac5贡献率) / 所有因子的累计贡献率
#将各因子乘上他们的贡献率除以总的贡献率,得到因子得分中间值
a = (fa.get_scores(data)*var.values[1])/var.values[-1][-1]#将各因子得分中间值相加,得到综合得分
a['score'] = a.apply(lambda x: x.sum(), axis=1)
a.head()
计算逻辑类似SPSS中的:
结果:
文章里也提到了python运行因子分析和SPSS的不同之处,待我研究清楚了再更新哈,想了解的伙伴可以关注一下。
链接:下载永久免费版SPSS的链接--欢迎一起学习
链接:因子分析法原理的链接 -- 欢迎一起学习
链接:factor-analyzer因子分析模块的官方文档