因子分析的主要目的是用来描述隐藏在一组测量到的变量中的一些更基本的,但又无法直接测量到的隐性变量 。与主成分分析相似,因子分析也具有降维的功能,但与主成分分析不同之处在于,因子分析是对主成分分析的扩展,提取出的公因子不仅考虑变量之间的相关性,还考虑了变量之间相关性的强弱,因此更容易解释其代表的含义。
本文从网络上搜集了三个案例,对这些案例进行了整理,主要目的是为了说明因子分析的步骤,更容易看懂。数据下载在此(一个工作表是一份数据)
因子分析步骤:
(1)数据导入,进行KMO和Bartlett球形检验,判断是否适合做因子分析
(2)若数据适合做因子分析,若未知因子数目,首先做探索性因子分析,做碎石图,判断提取因子个数;若已知问卷测量的变量数目,则可以先做探索性因子分析,再做验证性因子分析,利用热力图判断变量测量是否准确
(3)若需要利用因子分析计算排序结果,则先计算因子得分,再根据因子得分与样本数据在各因子上的表现,综合计算得出排序结果。

案例1:问卷数据的探索性因子分析和验证性因子分析
这是一份已知有25个测量题目的问卷,测量的变量是5个,认同性agree;勤奋的, 责任感conscientious;外向的extraversion;神经质, 不稳定性neuroticism;开放性openness。
现在我们假设不知道是5个变量,验证其问卷的有效性。
首先导入数据:

import pandas as pd
dt=pd.read_excel(r'因子分析数据.xlsx',sheet_name='问卷数据')
dt.head(2)

数据如下图:

可以看到,在这个数据中,有一些列是我们不需要的,要把它去除:

dt1=dt.drop(['Unnamed: 0','gender','education','age'],axis=1)
dt1.head(2)

去除后的数据如下:

接着,查看数据是否存在缺失值,对缺失数据进行删除:

dt1.isnull().sum()

发现数据是有缺失值的,于是删除存在缺失值的数据,再查看数据量:

dt1.dropna(inplace=True)
dt1.shape

(2436, 25)
还剩余2436条数据,样本量足够大。
下面首先做KMO和Bartlett检验:
引入所需要的包,这个factor_analyzer包得提前去安装

from factor_analyzer import FactorAnalyzer
from factor_analyzer.factor_analyzer import calculate_kmo
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity

计算出相应的KMO和Bartlett检验结果:

kmo_all,kmo_model=calculate_kmo(dt1)
chi_square_value,p_value=calculate_bartlett_sphericity(dt1)
print('kmo_all:',kmo_all)
print('kmo_model',kmo_model)
print('chi_square_value',chi_square_value)
print('p_value',p_value)

结果为:
可以看到,每个问题的KMO统计量都大于0.75,算是不错的结果了,一般最差大于0.5就可以用,而总的KMO达到了0.8485,同时p值为0,表明问卷的基本数据效度不错。
在假定不知道是5个变量的情况下,先做探索性因子分析,看看提取几个公因子比较合适,并计算出特征值

fa=FactorAnalyzer(10,rotation=None)
fa.fit(dt1)
ev,v=fa.get_eigenvalues()

然后绘制碎石图:

按取特征值大于1的要求来看,确实5个公因子更为合适,但实际操作时并不完全根据图形判断,还需要借助累计方差贡献率,一般达到85%左右即可,但这份数据确实有些问题,累计方差贡献率较低,后面在热力图上也有表现。
输出特征值,方差贡献率和累计方差贡献率:

fa_v = fa.get_factor_variance()
fa_dt = pd.DataFrame({'特征值': fa_v[0], '方差贡献率': fa_v[1], '方差累计贡献率': fa_v[2]})#各个因子的方差以及方差贡献率
print("\n",fa_dt)


只有5个特征值大于1的,于是按5个公因子,做因子旋转,再次拟合

fa = FactorAnalyzer(rotation='varimax', n_factors=5, method='principal')
fa.fit(dt1)

再次输出结果:

fa_v = fa.get_factor_variance()
fa_dt = pd.DataFrame({'特征值': fa_v[0], '方差贡献率': fa_v[1], '方差累计贡献率': fa_v[2]})#各个因子的特征值以及方差贡献率
print("\n",fa_dt)


可以看出,这个方差累计贡献率确实不高。再来进行验证性因子分析,绘制热力图:

import seaborn as sns
dt2=pd.DataFrame(np.abs(fa.loadings_),index=dt1.columns)
plt.figure(figsize=(10,8))
ax=sns.heatmap(dt2,annot=True,cmap='BuPu')#这个cmap是指颜色区间,BuPu是一种颜色的范围,大致是由灰变紫
plt.show()


可以看到,基本上所有的载荷较高的在同一编码下(如C1,C2,C3)的基本都在一个因子下(如第3列),表明问卷的效度较好。但这里的数据也可以看到,有的项值并没有大于0.5,按要求至少应该超过0.5的。
至此,我们对该数据探索性因子分析认为应该是5个因子,同时进行验证性因子分析也确定是5个因子,问卷效度基本达标。

案例2:成绩数据的文理偏科情况分析
这是一份包含近600条记录的学生成绩(看上去好像是初中的),对该数据进行因子分析,判断是否存在文理偏科的情况?
还是一样,先导入数据,去除多余列:

dt=pd.read_excel(r'因子分析数据.xlsx',sheet_name='成绩数据')
dt.head(2)


学号,班级和体育(一般没人拿它来分科)是多余列,删去:

dt1=dt.drop(['学号','班级','体育'],axis=1)

经过判断没有缺失值,可以继续下一步了,先进行KMO和Bartlett检验:
代码和上面的例子一样:

from factor_analyzer import FactorAnalyzer
from factor_analyzer.factor_analyzer import calculate_kmo
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
kmo_all,kmo_model=calculate_kmo(dt1)
chi_square_value,p_value=calculate_bartlett_sphericity(dt1)
print('kmo_all:',kmo_all)
print('kmo_model',kmo_model)
print('chi_square_value',chi_square_value)
print('p_value',p_value)


同样,数据的KMO和Bartlett检验均通过,适合做因子分析。
还是先做探索性因子分析,绘制碎石图,并输出特征值等数据:

fa=FactorAnalyzer(9,method='principal',rotation=None)
fa.fit(dt1)
ev,v=fa.get_eigenvalues()
from matplotlib import pyplot as plt
plt.figure(figsize=(10,8))
plt.scatter(range(1,dt1.shape[1]+1),ev)
plt.plot(range(1,dt1.shape[1]+1),ev)
plt.grid(True)
plt.show()
fa_v = fa.get_factor_variance()
fa_dt = pd.DataFrame({'特征值': fa_v[0], '方差贡献率': fa_v[1], '方差累计贡献率': fa_v[2]})#各个因子的方差以及方差贡献率
print("\n",fa_dt)

碎石图如下:

特征值、方差贡献率、累计方差贡献率如下:

看上去1个公因子就差不多了,不过在这个环境下,既然是否偏科,我们就还是按文理科的思路去折腾吧,还是提取2个公因子。
和上面的步骤相同,再次进行因子旋转拟合:

#取方差解释率接近0.85时共2个因子,因子旋转后再次拟合
fa = FactorAnalyzer(rotation='varimax', n_factors=2, method='principal')
fa.fit(dt1)

绘制热力图:

import seaborn as sns
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
dt2=pd.DataFrame(np.abs(fa.loadings_),index=dt1.columns)
plt.figure(figsize=(10,8))
ax=sns.heatmap(dt2,annot=True,cmap='BuPu')
plt.show()


可以看到,只有语文和政治在第2个因子(F2)上较大,而其他科目则在第1个因子(F1)上较大,暂且把第2个因子称为文科因子,第1个因子称为理科因子。语文就可以表示为0.35F1+0.87F2。
根据我的理解,在初中阶段,基本也看不出什么文理科差距,不过有些语文和政治相关,数学和物理、化学相关,这些大家还是能理解的。在英语上,好像理科学得好的,英语也很不错。
然后对所有的学生做热力图:

dt2=fa.transform(dt1)
ax=sns.heatmap(dt2,annot=True,cmap='BuPu')
plt.show()


可以看到几乎都是紫色的,也差不多可以认为,大多数的同学都偏理科了。
假设有个学生的分数是[130,108,120,67.2,48.25,50,48.5,47.5,47]
我们将其代入,计算因子系数:

fa.transform(pd.DataFrame([[130,108,120,67.2,48.25,50,48.5,47.5,47]]))

结果为:array([[-0.98165912, 4.00093525]])
可以看出,这个同学在第2个因子上表现更为突出,严重偏文科???

案例3:应聘者选择的因子分析
数据是一个单位对48名应聘者的问卷数据的收集,现在该单位想通过这份数据录取其中6名最优者,该如何进行?

依旧是先导入数据,去除多余列:

dt=pd.read_excel(r'因子分析数据.xlsx',sheet_name='应聘者数据')
dt1=dt.drop('ID',axis=1)
dt1.head(2)

数据如下:

老规矩,先做KMO和Bartlett检验:

#做KMO和Bartlett检验
from factor_analyzer.factor_analyzer import calculate_kmo
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
kmo_all,kmo_model=calculate_kmo(dt1)
chi_square_value,p_value=calculate_bartlett_sphericity(dt1)
print(kmo_all)
print(kmo_model)
print(chi_square_value)
print(p_value)


貌似总体还行,有个别的不太好。
做探索性因子分析:
绘制碎石图及计算特征值等:

#做探索性因子分析
fa = FactorAnalyzer(rotation=None, n_factors=15, method='principal')
fa.fit(dt)
ev,v=fa.get_eigenvalues()
plt.figure(figsize=(10,8))
plt.scatter(range(1,dt.shape[1]+1),ev)
plt.plot(range(1,dt.shape[1]+1),ev)
plt.show()

fa_v = fa.get_factor_variance()
fa_dt = pd.DataFrame({'特征值': fa_v[0], '方差贡献率': fa_v[1], '方差累计贡献率': fa_v[2]})#各个因子的特征值以及方差贡献率
fa_dt


看上去4个公因子就行,但我们还是按累计贡献率85%以上,选择5个公因子再次做拟合。

#取方差解释率大于0.85时共5个因子,因子旋转后再次拟合
fa = FactorAnalyzer(rotation='varimax', n_factors=5, method='principal')
fa.fit(dt1)

对每位应聘者按因子得分进行计算分值:

#计算得分
def F(factors):  return sum(factors*fa.get_factor_variance()[1])
scores = []
for i in range(len(fa.transform(dt1))):  #这个fa.transform(dt1)就是各应聘者的因子得分,再乘以对应的因子贡献率所占的权重,计算出总得分new = F(fa.transform(dt1)[i])  scores.append(new)
print(scores)

对所有应聘者按得分进行排序:

dt['scores']=scores
dt.scores.sort_values(ascending=False)


可以看到,39、38、7、9、6和22号应聘者是该单位要录取的人。
做个图看看:

不过这个题我做的结果和网上的不太一样,不知道是数据的问题,还是哪里出了问题,还请大家指出。
好了,3个案例全部说完,收工。

因子分析——附数据下载相关推荐

  1. arcgis两点之间连线_使用ArcGIS制作城市关系强度图(附数据下载)

    规划或地理等相关专业的同学可能会遇到城市关系强度图的制作.我们主要介绍制图部分,至于城市间关系强度如何计算,请左转自行查文献或相关资料学习. ArcMap中有个XY转线(XY to Line)的GP工 ...

  2. 2019年中国森林冠层高度(树高)数据30m分辨率(附数据下载链接)

    本数据均来源于期刊文献:Liu X, Su Y, Hu T, et al. Neural network guided interpolation for mapping canopy height ...

  3. ArcGIS影像分类并构建生态廊道 |第八届GIS技能大赛解题(附数据下载)

    动物需要在不同的森林公园之间迁徙交流,在经过不同的地表时,动物迁徙的困难程度是不一样的,如经过草地林地比较容易,而经过水域和道路时则比较困难.在不同的公园之间构建生态廊道,保护动物的迁徙. 01 数据 ...

  4. df python 增加数据_美国确诊超100万!教你用Python画出全球疫情动态图(附数据下载)...

     CDA数据分析师 出品   [导语]:今天我们教你用Python绘制全球疫情动态图,技术部分请看第二部分. 获取数据:扫描下方公众号回复关键字"全球疫情" 目前,全球新冠疫情还十 ...

  5. 一张图看懂世界石油分布?用Python轻松搞定!(附数据下载)

     CDA数据分析师 出品   [导语]:今天我们教你用Python画出世界石油分布桑基图,Python技术部分可以直接看第四部分. 获取数据: 扫描下方公众号 回复关键字"石油" ...

  6. 效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)...

     本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较    (三)SSIS的简介    (四)数据库中存储过程示例(SSIS应用需要) (五)Excel模板的制作(这步这么简单,稍微介 ...

  7. Ionic+Angular+Express实现前后端交互使用HttpClient发送get请求数据并加载显示(附代码下载)

    场景 Ionic介绍以及搭建环境.新建和运行项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/106308166 在上面搭建起 ...

  8. 神策数据成林松:数据智能在业务场景下的应用(附 PPT 下载)

     在神策 2020 数据驱动用户大会「上海站」现场,神策数据业务咨询师成林松分享了<数据智能在业务场景下的应用>的演讲.(文末附 PPT 下载地址) 本文根据其演讲内容整理,数据均为虚拟. ...

  9. ArcGIS山脊线、山谷线和山顶点的提取(附练习数据下载)

    特征地形要素,主要是指对地形在地表的空间分布特征具有控制作用的点.线或面状要素.特征地形要素构成地表地形与起伏变化的基本框架.与地形指标的提取主要采用小范围的邻域分析不同的是,特征地形要素的提取更多地 ...

最新文章

  1. 全球及中国生物仿制药淋巴细胞调节剂行业需求潜力分析及及投资规划研究报告2021-2027年
  2. poj 2079(旋转卡壳)
  3. C语言面向对象编程(三):虚函数与多态
  4. 西安电子科技大学计算机录取分数,2021年西安电子科技大学投档线及各省最低录取分数线统计表...
  5. 精选的一些《编程之美》相关资料
  6. hive插件 ranger_Apache Ranger及Hive权限控制
  7. 云时代企业如何保护共享文档数据安全?
  8. ZUST蓝桥杯校内选拔赛(java,c)安吉校区
  9. python中astr是啥_python 基础 之 字符串
  10. 三种方法进行分水岭分割
  11. 21. Django进阶:内建用户系统
  12. Qt C++调用Python,解决线程问题,以及GIL锁的处理
  13. python 拼音输入法_用Python从0开始实现一个中文拼音输入法的思路详解
  14. Linux入门基础命令教程
  15. java星号心形代码_用符号拼一个完整的大爱心 它起源于中国的甲骨文的心字
  16. android系统apk文件,如何安装apk文件 安卓手机apk文件安装方法
  17. echarts甘特图
  18. Ubuntu服务器入门指南
  19. React-fiber架构的解释
  20. 英语学习者的十句经典名言

热门文章

  1. python视频识别_视频人员行为识别(Action Recognition)
  2. 投资人读一份BP只用3分44秒,你还敢不认真准备吗?
  3. python调用百度OCR识别证件+操作excel表格
  4. CIC梳妆滤波器matlab仿真
  5. 苹果证书的申请、unityoc交互基础
  6. 人脸视频跟踪与检索系统
  7. Win10启动windows audio服务失败解决方案
  8. python抢票web端_python+Splinter实现12306抢票功能
  9. R语言中的apply函数用法
  10. 随机显示句子 php,php万能随机显示词条