• R语言主成分分析可视化(颜值高,很详细)


    网络上很多R语言教程都是基于R语言实战进行修改,今天为大家介绍更好用的R包,在之前聚类分析中也经常用到:factoextrafactoMineR,关于主成分分析的可视化,大家比较常见的可能是ggbiplot,这几个R包都挺不错,大家可以比较下。

    之前已经多次用到了这两个R包:

    • PCA
    • 聚类

    这两个R包的函数可以直接使用prcomp()函数的结果,也可以使用FactoMineRPCA()函数进行,结果更加详细。

    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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    结果信息丰富,可以通过不断的$获取,也可以通过特定函数提取,下面介绍。

    特征值可视化

    获取特征值、方差贡献率和累积方差贡献率,可以看到和上一篇的结果是一样的:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果中的这几个概念在上一篇已经解释过了

    通过这几个值,可以确定主成分个数,当然也可以通过碎石图(就是方差解释度的可视化)直观的观察:

    fviz_eig(pca.res,addlabels = T,ylim=c(0,100))
    
    • 1

    提取变量结果

    通过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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • res.var$cor:变量和主成分的相关系数
    • res.var$coord: 变量在主成分投影上的坐标,下面会结合图说明,因为进行了标准化,所以和相关系数结果一样,其数值代表了主成分和变量之间的相关性
    • res.var$cos2: 是coord的平方,也是表示主成分和变量间的相关性,同一个变量所有cos2的总和是1
    • res.var$contrib: 变量对主成分的贡献

    这几个结果都可以进行可视化。

    变量结果可视化

    使用fviz_pca_var()对变量结果进行可视化:

    fviz_pca_var(pca.res)
    
    • 1

    res.var$coord是变量在主成分投影上的坐标,Sepal.WidthDim.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)
    
    • 1
    • 2
    • 3

    可以看到Petal.LengthPetal.WidthDim1的相关性比较强,Sepal.WidthDim2的相关性比较强。

    通过fviz_cos2()查看变量在不同主成分的总和,以下是不同变量在第1和第2主成分的加和,如果把axes = 1:2改成axes = 1:4,就会变成都是1(这个数据最多4个主成分,同一变量的cos2在所有主成分的总和是1)。

    fviz_cos2(pca.res, choice = "var", axes = 1:2)
    
    • 1

    可以通过col.var = "cos2"参数给不同变量按照cos2的数值大小上色:

    fviz_pca_var(pca.res, col.var = "cos2",
                 gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), 
                 repel = TRUE 
                 )
    
    • 1
    • 2
    • 3
    • 4

    # 黑白版本
    fviz_pca_var(pca.res, alpha.var = "cos2")
    
    • 1
    • 2

    变量对主成分的贡献可视化

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    首先也是可以通过画相关性图进行可视化:

    library("corrplot")
    corrplot(res.var$contrib, is.corr=FALSE) 
    
    • 1
    • 2

    通过fviz_contrib()可视化变量对不同主成分的贡献:

    # 对第1主成分的贡献
    fviz_contrib(pca.res, choice = "var", axes = 1)
    
    • 1
    • 2

    # 对第1和第2主成分的贡献
    fviz_contrib(pca.res, choice = "var", axes = 1:2)
    
    • 1
    • 2

    通过col.var = "contrib"参数给不同变量按照contrib的数值大小上色:

    fviz_pca_var(pca.res, col.var = "contrib",
                 gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")
                 )
    
    • 1
    • 2
    • 3

    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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    提取样本结果

    使用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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    3个概念和变量的解释也是类似的,只不过上面是变量(列)和主成分的关系,现在是样本(观测,行)和主成分的关系。

    样本结果可视化

    样本的结果可视化可能是更常见的PCA图形,通过fviz_pca_ind()实现:

    fviz_pca_ind(pca.res)
    
    • 1

    这个图是通过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"
                 )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    样本的cos2可视化

    使用方法和变量的cos2可视化基本一样,通过更改参数值即可实现:

    fviz_pca_ind(pca.res,
                 col.ind = "cos2", # 按照cos2上色
                 gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
                 repel = TRUE    
                 )
    
    • 1
    • 2
    • 3
    • 4
    • 5

    可以更改点的大小、颜色等,只要设置合适的参数即可:

    fviz_pca_ind(pca.res, 
                 pointsize = "cos2", # 把cos2的大小映射给点的大小
                 pointshape = 21, 
                 fill = "#E7B800",
                 repel = TRUE 
                 )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    同时更改点的大小和颜色当然也是支持的:

    fviz_pca_ind(pca.res, 
                 col.ind = "cos2", # 控制颜色
                 pointsize = "contrib", # 控制大小
                 gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
                 repel = TRUE 
                 )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用参数choice = "ind"可视化样本对不同主成分的cos2:

    # axes选择主成分
    fviz_cos2(pca.res, choice = "ind", axes = 1:2)
    
    • 1
    • 2

    样本对主成分的贡献可视化

    和变量对主成分的贡献可视化非常类似,简单演示下:

    fviz_contrib(pca.res, choice = "ind", axes = 1:2)
    
    • 1

    biplot

    双标图…

    同时展示变量和样本和主成分的关系,超级多的自定义可视化细节。

    # 同时有箭头和椭圆
    fviz_pca_biplot(pca.res, 
                    col.ind = iris$Species, 
                    palette = "jco", 
                    addEllipses = TRUE, 
                    label = "var",
                    col.var = "black", 
                    repel = TRUE,
                    legend.title = "Species"
                    ) 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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") # 选择变量颜色的配色
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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")
                    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    fviz_xxx系列可视化函数底层是ggscatter的封装,这个函数来自ggpubr包,所有ggpubr支持的特性都可以给fviz_xxx函数使用,这也是这几个函数功能强大的原因,毕竟底层都是ggplot2!

    下载会继续给大家介绍如何提取PCA的数据,并使用ggplot2可视化,以及三维PCA图的实现。

    factoextrafactoMineR聚类分析、主成分分析、因子分析等方面都可以使用。

    在前几篇推文中也有很多介绍了

    参考资料

    http://www.sthda.com/

  • 相关阅读:
    超图WMTS服务的几个关键参数
    day 6
    java8中“::”双冒号的功能简介说明
    java spring cloud 工程企业管理软件-综合型项目管理软件-工程系统源码
    Elasticsearch向量检索的演进与变革:从基础到应用
    igolang学习3,golang 项目中配置gin的web框架
    dns电脑服务器发生故障怎么修复
    【ERROR】ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND No package.json
    计算机毕业论文微信小程序毕业设计开题报告SSM美容预约+后台管理系统|前后分离VUE[包运行成功]
    root权限无法创建文件夹解决
  • 原文地址:https://blog.csdn.net/Ayue0616/article/details/128105900