发布时间:2023-03-17 05:00:01源自:https://www.it-th.com作者 :it谈话网阅读(248)
数据分析中,主成分分析(PCA)是被大家熟知的数据降维方法。而因子分析和主成分分析是非常相似的两种方法,他们都属于多元统计分析里的降维方法。但因子分析最大的优点就是:因此,因子分析可以作为「需要满足可解释性数据建模」的前期数据降维的方法。下文会介绍因子分析的原理逻辑、用途以及Python代码的实现过程。
因子分析的起源是这样的,1904年英国的一个心理学家发现学生的英语、法语和古典语成绩非常有相关性,他认为这三门课程背后有一个共同的因素驱动,最后将这个因素定义为“语言能力”。基于这个想法,发现很多相关性很高的因素背后有共同的因子驱动,从而定义了因子分析。
因子分析在经济学、心理学、语言学和社会学等领域经常被用到,一般会探索出背后的影响因素如:语言能力、智力、理解力等。这些因素都是无法直接计算,而是基于背后的调研数据所推算出的公共因子。
因此概括下,因子分析就是将。
【举个例子】:学生有语文、英语、历史、数学、物理、化学六门成绩,通过因子分析会发现这六门课由两个公共因子驱动,前三门是由“文科”因子,后三门是“理科”因子从而可以计算每个学生的文科得分和理科得分来评估他在两个方面的表现。
比如在企业和品牌调研中,消费者会调查很多问题来评估企业品牌对这些问题通过因子分析可以刻画出背后少量的潜在影响因素。比如:服务质量、商品质量等等。
因子分析和主成分分析都可用于降维但因子分析的优点是:因子作为新的解释变量去建模,有更好的解释性。
因此对于有些需要业务解释的数据建模,可以在建模前通过因子分析提取关键因子,再用因子得分为解释变量,通过回归或者决策树等分类模型去建模。
首先需要注意的是,和主成分分析一样,两种方法的目的都是降维,所以两种方法的前提假设都是:特征之间不是完全互相交互。
因子分析是寻找不线性相关的“变量”的线性组合来表示原始变量,这些“变量”称为因子,如下图中的F就是因子,X是原始变量,eps是原始变量不可被公共因子表示的部分。
因子F和eps之间的相关性为0,eps之间相关性为0
1)求解方程中的因子F的系数
2)给予因子F实际的解释
3)展示原始特征和公共因子之间的关系,从而实现降维和特征分类等目的
求解方程的过程,就是分析变量的相关系数矩阵,从而找到少数几个随机变量去描述所有变量又因为求解的不唯一性,最后通常会对因子的载荷矩阵做一次正交旋转,目的是为了:方便理解每个因子的意义。
抽样适合性检验(KMO检验)或者 巴特利特检验(Bartlett’s Test)
通过数据定义最合适的潜在公共因子个数,这个决定后面的因子分析效果
提取公共因子就是上面提到的求解函数的过程,一般求解方法有:主成分法、最大似然法、残差最小法等等
因子旋转的原因是提取公共因子的解有很多,而因子旋转后因子载荷矩阵将得到重新分配,可以使得旋转后的因子更容易解释。常用的方法是:方差最大法。
解释和命名其实是对潜在因子理解的过程这一步非常关键,需要非常了解业务才可。这也是我们使用因子分析的主要原因。
根据因子载荷矩阵发现因子的特点。
对每一样本数据,得到它们在不同因子上的具体数据值,这些数值就是因子得分。
数据集介绍:
美国洛杉矶2000年街区普查数据,共有110个街区,15个变量,变量具体情况见下表想分析影响不同街区下人口分布的潜在因子。
import pandas as pd 
import numpy as np
LA_data = pd.read_csv('LA.Nei**orhoods.csv')
# 新增人口密度,去掉人口量、面积、经度和维度
LA_data['density'] = LA_data['Population']/LA_data['Area']
LA_data_final = LA_data.drop(['Population','Area','Longitude','Latitude'],axis=1)
LA_data_final_feat = LA_data_final.drop(['LA_Nbhd'],axis=1)
巴特利特P值小于0.01,KMO值大于0.6说明此数据适合做因子分析。
# 计算巴特利特P值from factor_analyzer.factor_analyzer import calculate_bartlett_sphericitychi_square_value,p_value=calculate_bartlett_sphericity(LA_data_final_feat)chi_square_value, p_value  
# 计算KMO值 
from factor_analyzer.factor_analyzer import calculate_kmokmo_all,kmo_model=calculate_kmo(LA_data_final_feat)print(kmo_model)
特征值大于1的因子数有2个,且两个因子的累计方差有68%因此确定因子个数为2个。
# Create factor analysis object and perform factor analysis
from factor_analyzer import FactorAnalyzer
fa = FactorAnalyzer(LA_data_final_feat.shape[1]+1, rotation=None)
fa.fit(LA_data_final_feat)ev, v = fa.get_eigenvalues() 
# 计算特征值和特征向量
var = fa.get_factor_variance()
#给出方差贡献率
调用因子分析函数,并得到因子载荷矩阵从载荷矩阵可以看到,第一个因子和收入、有房家庭比例、复员军人比例及欧裔比例成正相关第二个因子和非裔比例成正相关,反而和收入及有房比例等成负相关。
fa = FactorAnalyzer(2, rotation="varimax")
fa.fit(LA_data_final_feat)
# 输出载荷矩阵
df_loading = pd.DataFrame(fa.loadings_,index=LA_data_final_feat.columns.tolist())
df_loading
其中因子1得分越大表示:收入、有房家庭比例、复员军人比例及欧裔比例更高因子2得分高表示:非裔人群比例更高。
#计算因子得分
LA_data_trans = pd.DataFrame(fa.transform(LA_data_final_feat),index=LA_data_final['LA_Nbhd'])
plt.figure(figsize=(10,4), dpi= 80)
plt.subplot(1,2,1)
plt.scatter(LA_data_trans.loc[:,0],LA_data_trans.loc[:,1])
plt.title('Scree Plot')
plt.xlabel('Factor1')
plt.ylabel('Factor2')plt.grid()
综上,以上就是本文要介绍的全部内容因子分析在互联网数据分析场景下用到的比较少,主要原因就是很多人不知道怎么用?不知道用到哪里?希望看完文章的你能初步了解因子分析,能知道下面几个问题的答案(不记得就回头看上面的介绍分享哦)。
1、什么是因子分析?
2、因子分析可以解决什么问题?
3、因子分析的算法逻辑和分析流程是什么?
4、Python代码如何实现?
-END-
欢迎分享转载→ 数据分析—因子分析怎么用?
上一篇:一分钟1000单的快闪团玩法