数据分析学习体验——特征变量相关系数和主成分分析

如何处理数据集中高度相关的特征变量


作者: 江俊
时间: “2018/03/25”

以下所有代码均使用R语言

数据集下载地址:https://download.youkuaiyun.com/download/smallernovice/10307411
问题描述
聚类分析以及回归分析中经常会遇到特征变量之间高度相关的问题,常规做法是计算变量之间的相关关系矩阵,从中发现相关性高于某个值(比如0.8)的两个变量,然后将其中一个删除(一般做法),问题是当面对数量很多的特征变量时,相关系数矩阵很大,在R语言中观察很容易遗漏并且相当麻烦,因此开始思考能不能建立一个函数自动完成这些变量的筛选以及删除操作,于是有了如下的代码,注释中包含了思考过程。

  • 为什么会有这段代码:
    关于回归分析和聚类分析中,挑选自变量相关性比较低的问题,每次都需要从关系矩阵中肉眼查看,感觉很累而且容易漏,所以自己写了个代码,虽然还是要自己进行挑选,不过已经少了很多工作量,下面是代码,最后是输出结果:
  • 代码:
rm(list=ls())
setwd("G:\\第20期\\案例分析\\客户分群")
#读取数据
data<-read.csv("practice_sample.csv")
sum(is.na(data))
#包含缺失值的变量
var_na<-data[,colSums(is.na(data))>0]
#不包含缺失值的变量
var_na_no<-data[,colSums(is.na(data))==0]
#对含缺失值变量按缺失值的数量排序显示
sort(colSums(is.na(var_na)),decreasing = T)
  • 输出结果:
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
  input string 1 is invalid in this locale
[1] 222723
 VW263  VW166  VW043  XB851  XB843  DS907  AU002  DS776 
122377  35201  21271  17389  17389   7278    976    842 
  • 自定义函数筛选相关系数高的特征变量
#代码演示,此处只使用不含缺失值的变量
x<-data.frame(scale(var_na_no))
#计算相关系数矩阵
c<-cor(x)
#自定函数:筛选出相关性高于0.5的变量(数值可选)
select_x<-function(c,m){                 # x:相关系数矩阵, m:相关系数
  #将相关性高于m的系数取1,即目标变量
  c<-ifelse(c>m,1,0)
  c<-as.data.frame(c)
  n<-nrow(c)
  #避免重复选取组合,将上三角矩阵全部设置成0(非目标变量)
  for(i in 1:n){
    for(j in 1:n){
      c[i,j]<-ifelse(i>j,c[i,j],0)
    }
  }
  #求出符合条件的索引
  index<-which(c==1)[!(which(c==1) %in% c((1:n)^2))]
  #列号
  index_c<-ifelse(index %% n==0,n,index %% n)
  #行号
  index_r<-(index-index_c) %/% n
  #名称
  c$name<-row.names(c)
  #第二个变量名
  name_index_c<-c$name[index_c]
  #第一个变量名
  name_index_r<-c$name[index_r]
  #输出结果
  cat("\n自变量中相关系数大于",m,"的所有组合如下所示:\n")
  for(i in 1:length(name_index_r)){
    cat("     ",i,":",name_index_r[i],"---",name_index_c[i],"\n")
  }
  #返回需要删除的变量名
  return(unique(name_index_c))
}
#需要删除的变量名
delete_varname<-select_x(c,0.8)
#显示需要删除的变量的名字
cat("需要删除的变量名是:\n")
delete_varname
#在原始数据中删除高度相关的变量
x_n<-x[,!(colnames(x) %in% delete_varname)]
  • 输出结果:
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
  input string 1 is invalid in this locale

自变量中相关系数大于 0.8 的所有组合如下所示:
      1 : AU004 --- R1_AU004 
      2 : AU009 --- R1_AU009 
      3 : AU010 --- R1_AU010 
      4 : AU023 
### 斯皮尔曼相关性主成分分析区别联系 #### 区别 斯皮尔曼相关系数是一种衡量两个变量之间单调关系的方法,它基于秩次而非实际数值计算得出。这种方法适用于非线性数据以及存在异常值的情况[^4]。 主成分分析则是一种用于降维的技术,旨在通过转换原有特征空间到新的正交坐标系下,使得新坐标的轴向能够最大程度上代表原数据集中的方差分布情况。这一过程不仅考虑到了各维度之间的协方差矩阵结构,还试图找到一组相互独立的新特征来简化描述对象所需的信息量[^1]。 因此,在应用场景方面两者有着明显的差异: - **斯皮尔曼相关性**主要用于评估两组或多组样本间是否存在某种形式的相关趋势; - 而**主成分分析**更多地应用于多维数据分析场景下的特征提取、压缩表示等领域。 #### 联系 尽管表面上看这两种方法似乎并无太多关联之处,但实际上二者都涉及到对于变量间依赖程度的理解。具体来说: 当执行PCA之前可以先利用斯皮尔曼等级相关性检验去除掉那些几乎不存在任何有意义关联性的属性对儿;这样做有助于提高后续处理效率并减少噪声干扰的影响。此外,在某些情况下也可以借助于Spearman's rho作为输入参数之一参到模型构建过程中去——比如当我们希望确保最终获得的结果具备一定的稳健特性时就可以采取这种方式[^2]。 值得注意的是,虽然理论上讲我们可以将任意类型的相似度测度引入到PCA框架之内来进行优化求解操作,但在实践中人们更倾向于采用Pearson积矩相关系数因为其具有更好的解析性质便于理论推导及实现算法加速等功能特点[^3]。 ```python import numpy as np from scipy.stats import spearmanr from sklearn.decomposition import PCA # 假设X是我们要分析的数据集 X = ... # 计算斯皮尔曼相关性矩阵 rho, pval = spearmanr(X) # 使用该矩阵指导PCA的选择或预处理工作 pca = PCA() principal_components = pca.fit_transform(rho) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值