11 votos

¿Cómo extraer información de una matriz de dispersión cuando se tienen N grandes, datos discretos y muchas variables?

Estoy jugando con el conjunto de datos del cáncer de mama y he creado un gráfico de dispersión de todos los atributos para hacerme una idea de cuáles son los que más influyen en la predicción de la clase malignant (azul) de benign (rojo).

Entiendo que la fila representa el eje x y la columna el eje y, pero no veo qué observaciones puedo hacer sobre los datos o los atributos a partir de este diagrama de dispersión.

Estoy buscando ayuda para interpretar/realizar observaciones sobre los datos de este gráfico de dispersión o si debería utilizar alguna otra visualización para visualizar estos datos.

enter image description here

Código R que he utilizado

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)

6voto

Sean Hanley Puntos 2428

Hay una serie de problemas que dificultan o impiden extraer información útil de la matriz de dispersión.

Tienes demasiadas variables mostradas juntas. Cuando hay muchas variables en una matriz de dispersión, cada gráfico se vuelve demasiado pequeño para ser útil. Hay que tener en cuenta que muchos gráficos están duplicados, lo que desperdicia espacio. Además, aunque quiera ver todas las combinaciones, no tiene por qué representarlas todas juntas. Observe que puede dividir una matriz de dispersión en bloques más pequeños de cuatro o cinco (un número que se puede visualizar de forma útil). Sólo tienes que hacer varios gráficos, uno para cada bloque.

enter image description here

Desde tienes muchos datos en puntos discretos del espacio acaban apilándose unas sobre otras. Así, no puedes ver cuántos puntos hay en cada lugar. Existen varios trucos para solucionar este problema.

  1. La primera es fluctuación de fase . Jittering significa añadir una pequeña cantidad de ruido a los valores del conjunto de datos. El ruido se toma de una distribución uniforme centrada en su valor más o menos una pequeña cantidad. Existen algoritmos para determinar una cantidad óptima, pero como sus datos vienen en unidades enteras de uno a diez, $.5$ parece una buena elección.
  2. Con tantos datos, incluso las fluctuaciones harán que los patrones sean difíciles de discernir. Puedes utilizar colores muy saturados, pero muy transparentes para tenerlo en cuenta. Donde haya muchos datos apilados, el color será más oscuro, y donde haya poca densidad, el color será más claro.
  3. Para que la transparencia funcione, necesitarás símbolos sólidos para mostrar sus datos, mientras que R utiliza círculos huecos por defecto.

Utilizando estas estrategias, he aquí algunos ejemplos de código R y los gráficos realizados:

# 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)

enter image description here

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

enter image description here

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) }
    }
  }

enter image description here

5voto

gogasca Puntos 177

Es difícil visualizar más de 3-4 dimensiones en un solo gráfico. Una opción sería utilizar el análisis de componentes principales (ACP) para comprimir los datos y luego visualizarlos en las dimensiones principales. Hay varios paquetes diferentes en R (así como la base prcomp ) que facilitan esta tarea desde el punto de vista sintáctico ( ver CRAN ); la interpretación de los gráficos, las cargas, es otra historia, pero creo que más fácil que una matriz de dispersión ordinal de 10 variables.

enter image description here

4voto

Pete Puntos 3535

No estoy seguro de si esto es de alguna ayuda para usted, pero para EDA primaria me gusta mucho la tabplot paquete. Le da una buena idea de las posibles correlaciones que pueden existir en sus datos.

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

unordered plot ordered plot

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X