R语言主成分分析可视化(颜值高,很详细)
文章目录
- PCA
- 特征值可视化
- 提取变量结果
- 变量结果可视化
- 变量和主成分的cos2可视化
- 变量对主成分的贡献可视化
- Dimension description
- 提取样本结果
- 样本结果可视化
- 样本的cos2可视化
- 样本对主成分的贡献可视化
- biplot
- 参考资料
网络上很多R语言教程都是基于R语言实战进行修改,今天为大家介绍更好用的R包,在之前聚类分析中也经常用到:factoextra
和factoMineR
,关于主成分分析的可视化,大家比较常见的可能是ggbiplot
,这几个R包都挺不错,大家可以比较下。
之前已经多次用到了这两个R包:
- PCA
- 聚类
这两个R包的函数可以直接使用prcomp()
函数的结果,也可以使用FactoMineR
的PCA()
函数进行,结果更加详细。
PCA
使用R语言自带的iris
鸢尾花数据进行演示。
rm(list = ls())
library(factoextra)
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(FactoMineR)pca.res <- PCA(iris[,-5], graph = F, scale.unit = T) # 简简单单1行代码实现主成分分析
pca.res
## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 150 individuals, described by 4 variables
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$var" "results for the variables"
## 3 "$var$coord" "coord. for the variables"
## 4 "$var$cor" "correlations variables - dimensions"
## 5 "$var$cos2" "cos2 for the variables"
## 6 "$var$contrib" "contributions of the variables"
## 7 "$ind" "results for the individuals"
## 8 "$ind$coord" "coord. for the individuals"
## 9 "$ind$cos2" "cos2 for the individuals"
## 10 "$ind$contrib" "contributions of the individuals"
## 11 "$call" "summary statistics"
## 12 "$call$centre" "mean of the variables"
## 13 "$call$ecart.type" "standard error of the variables"
## 14 "$call$row.w" "weights for the individuals"
## 15 "$call$col.w" "weights for the variables"
结果信息丰富,可以通过不断的$
获取,也可以通过特定函数提取,下面介绍。
特征值可视化
获取特征值、方差贡献率和累积方差贡献率,可以看到和上一篇的结果是一样的:
get_eigenvalue(pca.res)
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 2.91849782 72.9624454 72.96245
## Dim.2 0.91403047 22.8507618 95.81321
## Dim.3 0.14675688 3.6689219 99.48213
## Dim.4 0.02071484 0.5178709 100.00000
结果中的这几个概念在上一篇已经解释过了
通过这几个值,可以确定主成分个数,当然也可以通过碎石图(就是方差解释度的可视化)直观的观察:
fviz_eig(pca.res,addlabels = T,ylim=c(0,100))
提取变量结果
通过get_pca_var()`函数实现:
res.var <- get_pca_var(pca.res)
res.var$cor
## Dim.1 Dim.2 Dim.3 Dim.4
## Sepal.Length 0.8901688 0.36082989 -0.27565767 -0.03760602
## Sepal.Width -0.4601427 0.88271627 0.09361987 0.01777631
## Petal.Length 0.9915552 0.02341519 0.05444699 0.11534978
## Petal.Width 0.9649790 0.06399985 0.24298265 -0.07535950
res.var$coord
## Dim.1 Dim.2 Dim.3 Dim.4
## Sepal.Length 0.8901688 0.36082989 -0.27565767 -0.03760602
## Sepal.Width -0.4601427 0.88271627 0.09361987 0.01777631
## Petal.Length 0.9915552 0.02341519 0.05444699 0.11534978
## Petal.Width 0.9649790 0.06399985 0.24298265 -0.07535950
res.var$contrib
## Dim.1 Dim.2 Dim.3 Dim.4
## Sepal.Length 27.150969 14.24440565 51.777574 6.827052
## Sepal.Width 7.254804 85.24748749 5.972245 1.525463
## Petal.Length 33.687936 0.05998389 2.019990 64.232089
## Petal.Width 31.906291 0.44812296 40.230191 27.415396
res.var$cos2
## Dim.1 Dim.2 Dim.3 Dim.4
## Sepal.Length 0.7924004 0.130198208 0.075987149 0.0014142127
## Sepal.Width 0.2117313 0.779188012 0.008764681 0.0003159971
## Petal.Length 0.9831817 0.000548271 0.002964475 0.0133055723
## Petal.Width 0.9311844 0.004095980 0.059040571 0.0056790544
res.var$cor
:变量和主成分的相关系数res.var$coord
: 变量在主成分投影上的坐标,下面会结合图说明,因为进行了标准化,所以和相关系数结果一样,其数值代表了主成分和变量之间的相关性res.var$cos2
: 是coord的平方,也是表示主成分和变量间的相关性,同一个变量所有cos2的总和是1res.var$contrib
: 变量对主成分的贡献
这几个结果都可以进行可视化。
变量结果可视化
使用fviz_pca_var()
对变量结果进行可视化:
fviz_pca_var(pca.res)
res.var$coord
是变量在主成分投影上的坐标,Sepal.Width
在Dim.1
的坐标是-0.4601427,在Dim.2
的坐标是0.88271627,根据这两个坐标就画出来Sepal.Width
那根线了,以此类推~
变量和主成分的cos2可视化
cos2
是coord的平方,也是表示主成分和变量间的相关性,所以首先可以画相关图:
library("corrplot")
## corrplot 0.92 loaded
corrplot(res.var$cos2, is.corr = F)
可以看到Petal.Length
、Petal.Width
和Dim1
的相关性比较强,Sepal.Width
和Dim2
的相关性比较强。
通过fviz_cos2()
查看变量在不同主成分的总和,以下是不同变量在第1和第2主成分的加和,如果把axes = 1:2
改成axes = 1:4
,就会变成都是1(这个数据最多4个主成分,同一变量的cos2在所有主成分的总和是1)。
fviz_cos2(pca.res, choice = "var", axes = 1:2)
可以通过col.var = "cos2"
参数给不同变量按照cos2的数值大小上色:
fviz_pca_var(pca.res, col.var = "cos2",gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE )
# 黑白版本
fviz_pca_var(pca.res, alpha.var = "cos2")
变量对主成分的贡献可视化
res.var$contrib
## Dim.1 Dim.2 Dim.3 Dim.4
## Sepal.Length 27.150969 14.24440565 51.777574 6.827052
## Sepal.Width 7.254804 85.24748749 5.972245 1.525463
## Petal.Length 33.687936 0.05998389 2.019990 64.232089
## Petal.Width 31.906291 0.44812296 40.230191 27.415396
首先也是可以通过画相关性图进行可视化:
library("corrplot")
corrplot(res.var$contrib, is.corr=FALSE)
通过fviz_contrib()
可视化变量对不同主成分的贡献:
# 对第1主成分的贡献
fviz_contrib(pca.res, choice = "var", axes = 1)
# 对第1和第2主成分的贡献
fviz_contrib(pca.res, choice = "var", axes = 1:2)
通过col.var = "contrib"
参数给不同变量按照contrib的数值大小上色:
fviz_pca_var(pca.res, col.var = "contrib",gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"))
Dimension description
res.desc <- dimdesc(pca.res, axes = c(1,2), proba = 0.05)
# Description of dimension 1
res.desc$Dim.1
## $quanti
## correlation p.value
## Petal.Length 0.9915552 3.369916e-133
## Petal.Width 0.9649790 6.609632e-88
## Sepal.Length 0.8901688 2.190813e-52
## Sepal.Width -0.4601427 3.139724e-09
##
## attr(,"class")
## [1] "condes" "list"
提取样本结果
使用get_pca_ind()
提取样本结果,和变量结果类似:
res.ind <- get_pca_ind(pca.res)head(res.ind$coord)
## Dim.1 Dim.2 Dim.3 Dim.4
## 1 -2.264703 0.4800266 -0.12770602 -0.02416820
## 2 -2.080961 -0.6741336 -0.23460885 -0.10300677
## 3 -2.364229 -0.3419080 0.04420148 -0.02837705
## 4 -2.299384 -0.5973945 0.09129011 0.06595556
## 5 -2.389842 0.6468354 0.01573820 0.03592281
## 6 -2.075631 1.4891775 0.02696829 -0.00660818
head(res.ind$contrib)
## Dim.1 Dim.2 Dim.3 Dim.4
## 1 1.1715796 0.16806554 0.074085470 0.018798188
## 2 0.9891845 0.33146674 0.250034006 0.341474919
## 3 1.2768164 0.08526419 0.008875320 0.025915633
## 4 1.2077372 0.26029781 0.037858004 0.140000650
## 5 1.3046313 0.30516562 0.001125175 0.041530572
## 6 0.9841236 1.61748779 0.003303827 0.001405371
head(res.ind$cos2)
## Dim.1 Dim.2 Dim.3 Dim.4
## 1 0.9539975 0.04286032 0.0030335249 1.086460e-04
## 2 0.8927725 0.09369248 0.0113475382 2.187482e-03
## 3 0.9790410 0.02047578 0.0003422122 1.410446e-04
## 4 0.9346682 0.06308947 0.0014732682 7.690193e-04
## 5 0.9315095 0.06823959 0.0000403979 2.104697e-04
## 6 0.6600989 0.33978301 0.0001114335 6.690714e-06
3个概念和变量的解释也是类似的,只不过上面是变量(列)和主成分的关系,现在是样本(观测,行)和主成分的关系。
样本结果可视化
样本的结果可视化可能是更常见的PCA图形,通过fviz_pca_ind()
实现:
fviz_pca_ind(pca.res)
这个图是通过res.ind$coord
里面的坐标实现的,其实就是不同样本在不同主成分的上面的得分score。
默认的可视化比较简陋,但是可以通过超多参数实现各种精细化的控制,比如把不同的属性映射给点的大小和颜色,实现各种花里胡哨的效果。
比如通过组别上色,就是大家最常见的PCA可视化图形:
# 经典图形,是不是很熟悉?
fviz_pca_ind(pca.res,geom.ind = "point", # 只显示点,不要文字col.ind = iris$Species, # 按照组别上色palette = c("#00AFBB", "#E7B800", "#FC4E07"), # 自己提供颜色,或者使用主题addEllipses = TRUE, # 添加置信椭圆legend.title = "Groups")
样本的cos2可视化
使用方法和变量的cos2可视化基本一样,通过更改参数值即可实现:
fviz_pca_ind(pca.res,col.ind = "cos2", # 按照cos2上色gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),repel = TRUE )
可以更改点的大小、颜色等,只要设置合适的参数即可:
fviz_pca_ind(pca.res, pointsize = "cos2", # 把cos2的大小映射给点的大小pointshape = 21, fill = "#E7B800",repel = TRUE )
同时更改点的大小和颜色当然也是支持的:
fviz_pca_ind(pca.res, col.ind = "cos2", # 控制颜色pointsize = "contrib", # 控制大小gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),repel = TRUE )
使用参数choice = "ind"
可视化样本对不同主成分的cos2:
# axes选择主成分
fviz_cos2(pca.res, choice = "ind", axes = 1:2)
样本对主成分的贡献可视化
和变量对主成分的贡献可视化非常类似,简单演示下:
fviz_contrib(pca.res, choice = "ind", axes = 1:2)
biplot
双标图…
同时展示变量和样本和主成分的关系,超级多的自定义可视化细节。
# 同时有箭头和椭圆
fviz_pca_biplot(pca.res, col.ind = iris$Species, palette = "jco", addEllipses = TRUE, label = "var",col.var = "black", repel = TRUE,legend.title = "Species")
fviz_pca_biplot(pca.res, # 组别映射给点的填充色geom.ind = "point",pointshape = 21,pointsize = 2.5,fill.ind = iris$Species,col.ind = "black",# 通过自定义分组给变量上色col.var = factor(c("sepal", "sepal", "petal", "petal")),# 自定义图例标题legend.title = list(fill = "Species", color = "Clusters"),repel = TRUE )+ggpubr::fill_palette("jco")+ # 选择点的填充色的配色ggpubr::color_palette("npg") # 选择变量颜色的配色
fviz_pca_biplot(pca.res, # 自定义样本部分geom.ind = "point",fill.ind = iris$Species, # 填充色col.ind = "black", # 边框色pointshape = 21, # 点的形状pointsize = 2, palette = "jco",addEllipses = TRUE,# 自定义变量部分alpha.var ="contrib", col.var = "contrib",gradient.cols = "RdYlBu",# 自定义图例标题legend.title = list(fill = "Species", color = "Contrib",alpha = "Contrib"))
fviz_xxx
系列可视化函数底层是ggscatter
的封装,这个函数来自ggpubr
包,所有ggpubr
支持的特性都可以给fviz_xxx
函数使用,这也是这几个函数功能强大的原因,毕竟底层都是ggplot2
!
下载会继续给大家介绍如何提取PCA的数据,并使用ggplot2
可视化,以及三维PCA图的实现。
factoextra
和factoMineR
在聚类分析、主成分分析、因子分析等方面都可以使用。
在前几篇推文中也有很多介绍了
参考资料
http://www.sthda.com/
R语言主成分分析可视化(颜值高,很详细)相关推荐
- 推荐:一本“高颜值”的R语言数据可视化图书(包邮送3本)
文章留言点赞前3名的朋友,每人送1本<R语言数据化可视化之美增强版>,名单揭晓日期为:本周日 (2020年7月12日晚7点).到时,获奖的朋友可以直接添加微信:meta-genomics, ...
- R语言ggplot2可视化:ggplot2可视化密度图(显示数据密集区域)、ggplot2可视化密度图(对数坐标):log10比例的收入密度图突出了在常规密度图中很难看到的收入分布细节
R语言ggplot2可视化:ggplot2可视化密度图(显示数据密集区域).ggplot2可视化密度图(对数坐标):log10比例的收入密度图突出了在常规密度图中很难看到的收入分布细节 目录
- R语言ggplot2可视化创建堆叠的柱状图(stacked barplot)并且每个堆叠的柱状图都缩放到总和为100%实战:最后所有的堆叠的柱子都一样高、Y轴以百分比的形式来显示
R语言ggplot2可视化创建堆叠的柱状图(stacked barplot)并且每个堆叠的柱状图都缩放到总和为100%实战:最后所有的堆叠的柱子都一样高.Y轴以百分比的形式来显示 目录
- R语言ggplot2可视化使用不连续的y轴、中断的Y轴来可视化数值分布差异很大的数据实战:把数据轴分为两个区间或者多个区间来匹配不同区间数据的可视化(因为有的数据可能10附近,有的数值可能1W附近)
R语言ggplot2可视化使用不连续的y轴.中断的Y轴来可视化数值分布差异很大的数据实战:把数据轴分为两个区间或者多个区间来匹配不同区间数据的可视化(因为有的数据可能10附近,有的数值可能1W附近) ...
- 【R语言】可视化:ggplot代码的自动生成
[R语言]可视化:ggplot代码的自动生成 前言: 准备 1. 设置 Settings 2. 面板和背景 Panel & Backgroud 3. 坐标轴 Axis 4. 标题与标签 Tit ...
- R语言天气可视化应用
R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数据的爆发,R语言变成了一门炙手可 ...
- r语言liftchart_最棒的7种R语言数据可视化
随着数据量不断增加,抛开可视化技术讲故事是不可能的.数据可视化是一门将数字转化为有用知识的艺术. R语言编程提供一套建立可视化和展现数据的内置函数和库,让你学习这门艺术.在可视化的技术实现之前,让我们 ...
- r 语言ylim = c(0 1),小白R语言数据可视化进阶练习一
原标题:小白R语言数据可视化进阶练习一 作者:路遥马亡R语言中文社区专栏作者 知乎ID: https://zhuanlan.zhihu.com/c_135409797 00 布局参数 先介绍一个布局参 ...
- R语言主成分分析法笔记
01.什么是主成分分析法 简要概括主成分分析法的作用:把能反映某种特征的很多指标汇总成一个指标. 举例而言,一家银行的流动性可以体现在它的现金资产占比和定期存款占比上-- 银行A的现金资产占比是0.1 ...
最新文章
- 陶大程院士:深度学习“泛化”理论的回顾与前沿
- linux 拆分文件 多个,linux把一个文件拆分
- Qt Creator预览版
- PhotoSwipe 图片浏览插件使用方法
- 为什么任何对象都可以实现锁
- MySQL笔记汇总---狂神说
- 可扩展的Web架构和分布式系统
- 第 20 章 观察者模式
- mysql安装时1045错误_MySql 安装时的1045错误
- c51单片机音乐盒c语言,毕业论文-基于AT89C51单片机的音乐盒设计(C程序).doc
- 【jiasuba】巧妙运用win键
- 对 PL/SQL开发调试的想法
- 开源的仓库管理软件——Sonatype Nexus
- 视频教程-手把手教你掌握区块链技术视频教程-区块链
- WinForm自定义ListBox显示样式
- 【浏览器】【vue】修改网页上的页签图标
- 2021年江苏省高考数据统计:江苏省普通类报名人数30.9万人,本土167所高校(2所985大学)
- 一.全局定位--开源定位框架LIO-SAM_based_relocalization实录数据集测试
- 七尺男惨遭毒手变侏儒 痴情女真情不变仍同居
- 打乱魔方软件_魔方 打乱步骤生成 算法
热门文章
- 利用爬虫、SMTP和树莓派3B发送邮件续集(爬取墨迹天气预报信息)
- 区块链是如何升级的?
- SSL证书背后的加密技术--非对称加密和对称加密
- JMeter实用案例讲解:生成Mockup/Dummy JSON压测REST API
- html输出doc,Word转PDF,PNG,HTML神器XDOC
- 为什么电源纹波那么大?
- QQ群排名优化:“小百度”大蓝海有搞头
- 解决brew下载慢的问题
- linux 两块硬盘做r0,本文是emp3r0r:Linux用户打造的Linux后渗透框架的后续。
- Jenkins+Jmeter+Ant 生成接口测试报告并发送邮件