R 语言之数据分析高级方法「主成分分析」和「因子分析」

article/2025/9/21 18:21:01

‍‍‍‍‍‍‍‍‍

640?

作者:姚某某

博客:https://zhuanlan.zhihu.com/mydata

往期回顾:

R语言之数据分析高级方法「时间序列」

R语言之高级数据分析「聚类分析」

640?wx_fmt=gif

本节主要总结「数据分析」的「主成分分析」和「因子分析」的思想。

通过学习《 R 语言实战 》关于这两种方法的解释,我们很容易理解这两种方法其存在的意义。——降维。

我们将要面对的数据实在是太大,变量实在太多,因此计算机所承受的压力也会越来越大。信息过度复杂是多变量数据最大的挑战之一,特别是在还要考虑变量间交互关系的时候,变量增加时交互关系的量是按阶乘关系在往上涨的,所以降维在很多时候能够起到减少大量工作量的作用,是数据分析很重要的一个思想。

以上是「主成分分析」与「因子分析」联系,有共同的目的。但是,两者的区别也很大,在实现目标时,两者采用了两种不同的思路,下面我逐一讨论。


1. 主成分分析与因子分析的不同

  • 主成分分析 ( PCA ) 是指,用一组较少的不相关变量代替大量相关变量,同时尽可能保留初始变量的信息。值得注意的是,主成分是初始变量的线性组合。

  • 因子分析 ( EFA ) 是指, 通过发掘隐藏在数据下的一组较少的、更为基本的无法观测的变量,来解释一组可观测变量的相关性。

  • 区别:从定义上其实就很好理解,但是更简单的理解方式:把「因子分析」看作是求得「元素」,这些元素是组成初始变量的因子;而把「主成分分析」看作是求得一种「组合」,这些组合是初始变量配给不同系数组成的「组合」,且每个组合之间不相关。


2.主成分分析

2.1. 主成分

主成分是初始变量的线性组合,用于替代初始变量并尽可能保留初始信息。如第一主成分:

640?wx_fmt=png

它是 k 个观测变量的加权组合,对初始变量集的方差解释性最大。

至于主成分是如何推导得到的,请看这篇PCA (主成分分析)详解 (写给初学者)(https://my.oschina.net/gujianhan/blog/225241#OSC_h2_1),建议跟着思索一遍,对其底层算法有一点理解,在学习的时候更开心。


2.2. 判断主成分的个数

之前讲到,主成分分析的目的是为了降维,因此对于主成分的个数,我们必须有所取舍。

一般的方法是,基于特征值来判断主成分的个数:

每一个主成分都有其对应的特征值,这个特征值来自于与主成分相关联的相关系数矩阵。且按顺序分配,第一主成分与最大的特征值相关联,第二主成分与第二大的特征值相关联,判断主成分的方法通常有以下 3 种:
1. Kaiser-Harris 准则,建议保留特征值大于 1 的主成分,特征值小于 1 的成分所解释的方差比包含子单个变量中的方差更少
2. Cattell 碎石检验,通过绘制特征值与主成分数的图形,通过图形的弯曲情况,保留图形变化最大处之上的主成分
3. 通过模拟,依据与初始矩阵相同打下的随机数据矩阵来判断要提取的特征值,若基于真实数据的某个特征值大于随机数据矩阵相应的平均特征值,则保留该主成分

使用 psych 包中的 fa.parallel ( ) 函数即可得到图形,通过以上三种方法综合判断主成分的个数。


2.3. 提取主成分

通过 R 中已经包装好的算法来计算即可:

principal(r, nfactors=, rotate=, scores)
# r 是相关系数矩阵或原始数据矩阵
# nfactors 设定主成分数
# rotate 指定旋转的方法
# scores 设定是否计算主成分得分(默认为不需要)

  • 通过以上函数,我们可以得如下的结果

Principal Components Analysis
Call: principal(r = USJudgeRatings[, -1], nfactors = 1)
Standardized loadings (pattern matrix) based upon correlation matrix
     PC1   h2     u2 com
INTG 0.92 0.84 0.1565   1
DMNR 0.91 0.83 0.1663   1
DILG 0.97 0.94 0.0613   1
CFMG 0.96 0.93 0.0720   1
DECI 0.96 0.92 0.0763   1
PREP 0.98 0.97 0.0299   1
FAMI 0.98 0.95 0.0469   1
ORAL 1.00 0.99 0.0091   1
WRIT 0.99 0.98 0.0196   1
PHYS 0.89 0.80 0.2013   1
RTEN 0.99 0.97 0.0275   1

                PC1
SS loadings    10.13
Proportion Var  0.92

  • PC 1 栏包含了成分载荷,即观测变量与主成分的相关系数,如果主成分不止一个,还会有 PC 2 、PC 3。h 2 栏指成分公因子方差,集主成分对每个变量的方差解释度。u 2 栏指成分的唯一性,即方差无法被主成分解释的比例( 1 - h 2 ) 。

  • 这里的旋转指的是,一系列将成分载荷阵变得更容隐解释的数学方法。旋转的方法有两种:使选择的成分保持不相关的正交旋转,和让主成分变得相关的斜交旋转。最流行的正交旋转是方差极大旋转。使用方差极大旋转,可以得到如下结果:

Principal Components Analysis
Call: principal(r = Harman23.cor$cov, nfactors = 2, rotate = "varimax")
Standardized loadings (pattern matrix) based upon correlation matrix
               RC1  RC2   h2    u2 com
height         0.90 0.25 0.88 0.123 1.2
arm.span       0.93 0.19 0.90 0.097 1.1
forearm        0.92 0.16 0.87 0.128 1.1
lower.leg      0.90 0.22 0.86 0.139 1.1
weight         0.26 0.88 0.85 0.150 1.2
bitro.diameter 0.19 0.84 0.74 0.261 1.1
chest.girth    0.11 0.84 0.72 0.283 1.0
chest.width    0.26 0.75 0.62 0.375 1.2

                      RC1  RC2
SS loadings           3.52 2.92
Proportion Var        0.44 0.37
Cumulative Var        0.44 0.81

    • 列名由 PC 变成 RC,表示成分被旋转。通过观察可以看出,主成分对初始变量的关联程度得到了分化,第一主成分主要由前四个变量来解释(长度变量),第二主成分主要由后四个变量来解释(容量变量)

  • 主成分得分,是用于评价不同观测之间优劣的分数。

    • 1. 如果用于主成分分析的初始数据矩阵我们知道(可能不知道,直接用相关系数矩阵来进行主成分分析),则可以直接添加 score参数来计算每个观测的主成分得分了。

    • 2. 如果初始数据矩阵未知,我们就没办法直接通过参数调节来得到原来观测的主成分得分了,要通过计算得分系数之后,得到主成分得分的求得公式。例:

> rc <- principal(Harman23.cor$cov , nfactors = 2,rotate = "varimax")

> round(unclass(rc$weights),2)
                RC1   RC2
height          0.28 -0.05
arm.span        0.30 -0.08
forearm         0.30 -0.09
lower.leg       0.28 -0.06
weight         -0.06  0.33
bitro.diameter -0.08  0.32
chest.girth    -0.10  0.34
chest.width    -0.04  0.27

主成分得分:

PC1 = 0.28*height + 0.30*arm.span + 0.30*forearm + 0.28* lower.leg - 0.06*weight   - 0.08*bitro.diameter - 0.10* chest.girth - 0.04*chest.width

PC2 = - 0.05*height - 0.08*arm.span - 0.09*forearm - 0.06* lower.leg + 0.33*weight   + 0.32*bitro.diameter + 0.34* chest.girth + 0.27*chest.width



2.4. 评价

主成分得分就可看着是各观测的主成分取值,它是初始变量的线性组合。通过得分的排名来得到观测的优劣排名。



3. 因子分析

3.1. 因子

所谓因子,指的是隐藏在数据下的一组较少、更为基本的无法观测的变量,它被认为可以解释观测变量间共有的方差。直观意义上讲,可以将观测变量视为是因子的线性组合(注意:主成分是观测变量的线性组合,容易弄混淆)。如第 i个观测变量可表示为:

640?wx_fmt=png

这里的Fj(j=1,2,....p) 就是我们说的因子,Ui 则指的是第i个观测变量独有的部分(无法被因子解释)。

3.2. 判断需提取的公共因子数

这里的方法和判断主成分个数相同,同样采用 fa.parallel ( ) 函数来得到图形,使用三种方法来综合判断。唯一一点不同在于,采用 Kaiser-Harris 准则来判断时,主成分分析保留特征值大于 1 的成分,而因子分析保留特征值大于 0 的因子。

3.3. 提取公共因子

这里采用 R 语言中包装好的算法来计算即可:

fa(r, nfactors=, n.obs=, rotate=, scores=, fm=)
# 相比主成分分析的 principle 函数,这里多出了两个参数
# n.obs 指的是观测数,在使用相关系数矩阵时需要填写
# fm 则用于设定因子化方法

  • 有提取因子的方法有很多,我其实也并太了解如何选择,先知道有哪些方法,有具体项目的时候在作深究:

    • 最大似然法( ml )

    • 主轴迭代法( pa )

    • 加权最小二乘法( wls )

    • 广义加权最小二乘法( gls )

    • 最小残差法( minres )

3.4. 因子旋转

因子旋转的选择有三种:1. 不旋转 2. 正交旋转 3. 斜交旋转

不旋转时得到各因子与各初始变量之间的相关程度,旋转之后能够使因子变得更好解释。

  • 正交旋转

令参数 rotate="varimax" 即可,这时的因子之间强制为不相关

在提取因子后,可得到因子结构矩阵,即变量与因子的相关系数,且较不旋转的结果而言更好解释,可将不同变量重点归于某一因子。

  • 斜交旋转

令参数 rotate="promax" 即可,这时的因子之间有可能是相关的。

在提取因子后,可得到两个矩阵:因子模式矩阵(标准化的回归系数矩阵)、因子关联矩阵(因子相关系数矩阵)。同时还需要考虑因子结构矩阵(变量与因子的相关系数矩阵),但是要通过自编函数 fsm ( ) 求得,自编函数的具体代码参考《 R 语言实战 》一书。

通过考虑以上三个矩阵,我们除了可以向不同变量重点归于某一因子外,还可以得到不同因子之间的相关系数,如果现实不同因子间的关联性很低,可能需要重新使用正交旋转来简化问题。但通常斜交旋转方法更加符合真实数据,虽然这种方法更为复杂。

  • 通过图形显示

可通过 factor.plot ( ) 函数来得到两因子图形,可从图中观测出不同初始变量在哪个因子上载荷更大。

640?wx_fmt=jpeg 还可通过 fa.diagram ( ) 函数得到每个因子下的最大载荷,已经因子间的相关系数。 640?wx_fmt=jpeg



3.5. 因子得分

与主成分分析相比,因子分析并那么关注因子得分,相要得到因子得分,在提取时采用 score=TRUE 函数即可。还可以得到得分系数(标准化的回归权重),在提取因子时得分系数将会体现在返回对象 weights 元素中。

而且,这里与主成分分析不同,因子得分无法精确计算,只能估计得到。原因在于,我们的因子数总比初始变量要少,通常因子得分的估计方法有:回归估计法,Bartlett估计法,Thomson估计法。


3.6. 评价

以各因子的方差贡献率为权,由各因子的线性组合得到综合评价指标函数。

F = (w1F1+w2F2+…+wmFm)/(w1+w2+…+wm )

此处wi为旋转前或旋转后因子的方差贡献率。

利用综合得分可以得到得分名次。


4. 总结

主成分分析和因子分析的步骤可归纳为:

1. 数据预处理
2. 选择模型,是主成分分析还是因子分析
3. 判断要选择的主成分/因子数目
4. 选择主成分/因子
5. 旋转主成分/因子
6. 解释结果
7. 计算主成分/因子得分



 往期精彩内容整理合集 

2017年R语言发展报告(国内)

R语言中文社区历史文章整理(作者篇)

R语言中文社区历史文章整理(类型篇)

640?wx_fmt=jpeg

公众号后台回复关键字即可学习

回复 R                  R语言快速入门及数据挖掘 
回复 Kaggle案例  Kaggle十大案例精讲(连载中)
回复 文本挖掘      手把手教你做文本挖掘
回复 可视化          R语言可视化在商务场景中的应用 
回复 大数据         大数据系列免费视频教程 
回复 量化投资      张丹教你如何用R语言量化投资 
回复 用户画像      京东大数据,揭秘用户画像
回复 数据挖掘     常用数据挖掘算法原理解释与应用
回复 机器学习     人工智能系列之机器学习与实践
回复 爬虫            R语言爬虫实战案例分享


http://chatgpt.dhexx.cn/article/dsTIe5Im.shtml

相关文章

转:Android 中Makefile的详细分析

http://blog.chinaunix.net/uid-25838286-id-3204120.html 随着移动互联网的发展&#xff0c;移动开发也越来越吃香了&#xff0c;目前最火的莫过于android&#xff0c;android是什么就不用说了&#xff0c;android自从开源以来&#xff0c;就受到很多人的追捧。当然&#xff0…

Python数据分析理论与实战完整版本

Python数据分析基础 一、Python数据分析初探二、数据获取2.1 数据获取的手段2.2 数据仓库2.3 检测与抓取2.4 填写、埋点、日志2.5 计算2.6 数据学习网站 三、单因子探索分析与可视化3.1 理论铺垫3.2 数据分类3.3 单属性分析3.4 单因子分析实战3.5 可视化小节 四、多因子探索分析…

223.主成分分析PCA

主成分分析 PCA 本节作者&#xff1a;刘华&#xff0c;中国科学技术大学 版本1.0.3&#xff0c;更新日期&#xff1a;2020年6月18日 什么是PCA(Principal Component Analysis) 相关背景 在许多领域的研究与应用中&#xff0c;通常需要对含有多个变量的数据进行观测&#xff0c;…

探索性数据分析EDA(二)—— 缺失值处理

接上一篇 《探索性数据分析&#xff08;1&#xff09;—— 变量识别和分析》&#xff0c; 这篇笔记主要内容为缺失值处理方法介绍&#xff0c;以及相关python工具包sklearn.impute的使用介绍。 目录 1. 为什么需要处理缺失值2. 为什么数据有缺失值a) 完全随机缺失&#xff08;…

数据分析汇总

一、本文说明&#xff1a; 本文为自己学习的笔记&#xff0c;用来记录数分的相关知识&#xff0c;方便记录查阅。 二、指标体系建设与数据分析&#xff1a; 1、指标体系概念&#xff1a; ①&#xff1a;什么是指标体系&#xff1a; 企业指标的集合 ②&#xff1a;好…

5whys分析法在美团工程师中的实践

2019独角兽企业重金招聘Python工程师标准>>> 前言 网站的质量和稳定性对于用户和公司来说至关重要&#xff0c;但是在网站的快速发展过程中&#xff0c;由于各种原因导致事故不可避免的发生&#xff0c;这些大大小小的事故对公司难免会造成一些负面的影响&#xff0…

单因素方差分析的计算过程详解

统计分析之单因素方差分析计算过程详解 Excel方差分析 用Excel计算方差分析&#xff0c;三种方法&#xff1a; 一步步手推法 用Excel的数据分析→单因素方差分析自动生成 在1的基础上通过SUMX2MY2优化法 Excel版操作步骤可参见 Excel单因素方差分析操作详解 P…

哈佛大学——差异表达分析(九)DESeq2步骤描述

文章目录 学习目标DESeq2差异基因表达分析流程第一步&#xff1a;估计大小因子第二步&#xff1a;估计基因离散&#xff08;gene-wise dispersion&#xff09;第三步&#xff1a;拟合曲线到基因的分散估计第四步:将基因离散估计值向曲线预测值收缩MOV10 DE分析:探讨离散估计和评…

数学建模之层次分析法(AHP)

层次分析法&#xff08;Analytic Hierarchy Process&#xff09; AHP是对一些较为复杂的&#xff0c;较为模糊的问题作出决策的简易方法&#xff0c;它特别适用于那些难以完全定量分析的问题。由美国运筹学家T.L.Saaty教授于上世纪70年代初期提出。 目录 层次分析法&#xff0…

时序分析-季节因素

目录 1时序分析的基础 1.1 简介 1.2 分类 2 分析套路 3 主流时序分析模型 3.1移动平均 3.2 指数平滑法 3.3 组合模型 3.4 ARIMA 4 研究细分领域 4.1 异常值检测 4.2 季节序列分析 4.1 同期平均法 4.1.1 简单季节指数法 4.1.2 趋势季节指数法 4.2 长期趋势剔除法…

html5播放器的示例代码

本次的分享是一个基于HTML5标签实现的一个自定义视频播放器。其中实现了播放暂停、进度拖拽、音量控制及全屏等功能。 效果预览 核心思路 我相信一定会有些没有接触过制作自定义播放器的童鞋对于 标签的认识会停留在此。 <video controls"controls" autoplay"…

HTML5音乐播放器

明月浩空-HTML5浮窗音乐播放器研发于2014年&#xff0c;并持续更新至今 是基于QQ音乐、酷狗音乐、网易云音乐等歌曲ID全自动解析的网页音乐播放器 依靠服务器强大的接口功能&#xff0c;只需要一个ID既可获取全部信息 同时播放器主体会跟随专辑图片主色值自动变色&#xff0c;歌…

h5的开源播放器组件

哈喽&#xff0c;大家好&#xff0c;今天我要给大家推荐一个非常棒的看片神器&#xff0c;那就是【moovie】.它是一款专注于电影的HTML5 播放器。 先展示一下效果&#xff0c;测试了一下&#xff0c;支持倍速播放、快捷键操作、字幕偏移即时调整&#xff0c;还有一些参数展示&a…

H5播放器使用方法。

1.使用webkit-playsinline playsinline 在iOS微信webview中视频不会弹出来&#xff0c;直接播放。 <video id"test_video" class"test_video" webkit-playsinline playsinlinesrc"http://res.imtt.qq.com/qqbrowser/js/advideo.mp4"control…

H5,Audio音乐播放器(移动版)

有些时候&#xff0c;总是感觉自己进步的没有以前快了。于是就怀疑自己是不是也被时间磨灭了&#xff0c;这可真是一件不幸的事儿。可能是自己会的东西太少了&#xff0c;总是有种莫名的危机感。 前一段时间&#xff0c;想写一个移动版音乐播放器&#xff0c;于是就开始利用下班…

H5 video 播放器demo

H5 video 播放器demo 前言 最近在做一个wap端的项目&#xff0c;需要视频播放功能。大家也知道wap对flash支持很差&#xff0c;所以优先考虑使用h5播放器video,在这里我介绍用video实现视频播放方法。之后在介绍几个插件和第三方视频实现方法。 H5 video 因为video样式是原…

SkeyeWebPlayer.js H5播放器开发之播放器video动态创建(三)

SkeyeWebPlayer.js H5播放器是由成都视开信息科技开发和维护的一个完善的RTSP、FLV、HLS等多种流媒体协议播放&#xff0c;视频编码支持H.264&#xff0c;H.265&#xff0c;音频支持AAC&#xff0c;支持TCP/UDP协议&#xff0c;是一套极佳的且适合用于综合安防视频云服务播放组…

H5音乐播放器(包含源码与示例)

H5音乐播放器&#xff08;包含源码与示例&#xff09; 基于Angularionic的H5音乐播放器&#xff0c;源码&#xff1a;https://gitee.com/CrimsonHu/h5-music-player 示例地址 建议使用原版chrome或edge访问&#xff1a;http://intelyes.club:5300/ 功能 实时歌词显示支持歌…

基于H5+js开发一款音乐播放器

前言&#xff1a;当下音乐播放器不胜其数&#xff0c;为了更好的掌握一些东西&#xff0c;我们来自己制作一个音乐播放器。 文章目录&#xff1a; 一.开发环境&#xff1a;二.页面视图&#xff1a;1.主文件入口&#xff08;首页&#xff09;&#xff1a;2.音乐播放界面&#…

H5纯原生播放器 【学习video】

这是一个纯原生的H5播放器&#xff0c;尽管网上有很多第三方库&#xff0c;但是基础打的牢固&#xff0c;一定会帮你走的更远。 大厂也非常重视基础&#xff0c;再说了那些第三方库也是基础一点点搭起来的&#xff0c;所以有兴趣学习的同学可以下载来学习。 代码中的细节我都…