当您有大 N、离散数据和许多变量时,如何从散点图矩阵中提取信息?

机器算法验证 r 数据可视化 解释 散点图
2022-03-29 18:36:29

我正在研究乳腺癌数据集并创建了所有属性的散点图,以了解哪些属性对预测(红色)的类别malignant(蓝色)影响最大benign

我知道行代表 x 轴,列代表 y 轴,但我看不到我可以对此散点图中的数据或属性进行哪些观察。

我正在寻找一些帮助来解释/观察这个散点图中的数据,或者我是否应该使用其他可视化来可视化这些数据。

在此处输入图像描述

我使用的 R 代码

link   <- "http://www.cs.iastate.edu/~cs573x/labs/lab1/breast-cancer-wisconsin.arff"
breast <- read.arff(link)
cols   <- character(nrow(breast))
cols[] <- "black"
cols[breast$class == 2] <- "red"
cols[breast$class == 4] <- "blue"
pairs(breast, col=cols)
3个回答

有许多问题使得从散点图矩阵中提取任何可用信息变得困难或不可能。

一起显示的变量太多。 当散点图矩阵中有很多变量时,每个图都变得太小而无用。需要注意的是,许多地块是重复的,这浪费了空间。此外,尽管您确实希望查看每个组合,但您不必将它们全部绘制在一起。请注意,您可以将散点图矩阵分解为四个或五个较小的块(一个有用的可视化数字)。您只需要制作多个图,每个块一个。

在此处输入图像描述

由于您在空间中的离散点有大量数据,因此它们最终会堆叠在一起。因此,您无法看到每个位置有多少点。有几个技巧可以帮助您处理这个问题。

  1. 首先是抖动抖动意味着向数据集中的值添加少量噪声。噪声取自以您的值加或减一些少量为中心的均匀分布。有确定最佳数量的算法,但由于您的数据是从 1 到 10 的整数单位,.5似乎是个不错的选择。
  2. 有了如此多的数据,即使是抖动也会使模式难以辨别。您可以使用高度饱和但基本上透明的颜色来解决此问题。有很多数据堆叠在一起的地方,颜色会变深,而密度小的地方,颜色会变浅。
  3. 为了使透明度起作用,您将需要实心符号来显示您的数据,而 R 默认使用空心圆。

使用这些策略,这里是一些示例 R 代码和绘制的图:

# the alpha argument in rgb() lets you set the transparency
cols2 = c(rgb(red=255, green=0, blue=0,   alpha=50, maxColorValue=255),
          rgb(red=0,   green=0, blue=255, alpha=50, maxColorValue=255) )
cols2 = ifelse(breast$class==2, cols2[1], cols2[2])
# here we jitter the data
set.seed(6141)  # this makes the example exactly reproducible
jbreast = apply(breast[,1:9], 2, FUN=function(x){ jitter(x, amount=.5) })
jbreast = cbind(jbreast, class=breast[,10])  # the class variable is not jittered

windows()  # the 1st 5 variables, using pch=16
  pairs(jbreast[,1:5], col=cols2, pch=16)

在此处输入图像描述

windows()  # the 2nd 5 variables
  pairs(jbreast[,6:10], col=cols2, pch=16)

在此处输入图像描述

windows()  # to match up the 1st & 2nd sets requires more coding
  layout(matrix(1:25, nrow=5, byrow=T))
  par(mar=c(.5,.5,.5,.5), oma=c(2,2,2,2))
  for(i in 1:5){
    for(j in 6:10){
      plot(jbreast[,j], jbreast[,i], col=cols2, pch=16, 
           axes=F, main="", xlab="", ylab="")
      box()
      if(j==6 ){ mtext(colnames(jbreast)[i], side=2, cex=.7, line=1) }
      if(i==5 ){ mtext(colnames(jbreast)[j], side=1, cex=.7, line=1) }
      if(j==10){ axis(side=4, seq(2,10,2), cex.axis=.8) }
      if(i==1 ){ axis(side=3, seq(2,10,2), cex.axis=.8) }
    }
  }

在此处输入图像描述

在单个图中很难可视化超过 3-4 个维度。一种选择是使用主成分分析 (PCA) 来压缩数据,然后在主要维度上对其进行可视化。R 中有几个不同的包(以及基本prcomp函数),这在语法上很容易(参见 CRAN);解释图、载荷是另一回事,但我认为比 10 变量序数散点图矩阵更容易。

在此处输入图像描述

我不确定这是否对您有任何帮助,但对于初级 EDA,我真的很喜欢这个tabplot包。让您很好地了解数据中可能存在的相关性。

install.packages("tabplot")
tableplot(breast) # gives you the unsorted image below
tableplot(breast, sortCol="class") # gives you a sorted image according to class

无序图 有序图