Comment extraire des informations d'une matrice de nuage de points lorsque vous avez un grand N, des données discrètes et de nombreuses variables?


10

Je joue avec l'ensemble de données sur le cancer du sein et j'ai créé un nuage de points de tous les attributs pour avoir une idée de ceux qui ont le plus d'effet sur la prédiction de la classe malignant(bleu) de benign(rouge).

Je comprends que la ligne représente l'axe des x et la colonne représente l'axe des y mais je ne peux pas voir quelles observations je peux faire sur les données ou les attributs de ce nuage de points.

Je cherche de l'aide pour interpréter / faire des observations sur les données de ce nuage de points ou si je devrais utiliser une autre visualisation pour visualiser ces données.

entrez la description de l'image ici

Code R que j'ai utilisé

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)

Vous avez raison: il est difficile d'en voir beaucoup. Étant donné que toutes vos variables semblent être discrètes, avec un nombre relativement petit de catégories, il est impossible de déterminer combien de symboles sont empilés pour former chaque symbole distinctement visible. Cela rend cette image particulière de peu de valeur pour évaluer quoi que ce soit.
whuber

1
C'est un peu ce que je pensais. J'ai essayé de tracer un barplot encadré mais cela ne serait pas utile pour voir quel attribut a le plus d'effet sur la classe, n'est-ce pas ...? Vous cherchez de l'aide sur le type de visualisation qui donnerait des informations utiles.
birdy

2
Vos éparpillements bicolores peuvent avoir un sens si vous agitez (ajoutez du bruit) vos tas de points.
ttnphns

@ttnphns Je ne comprends pas ce que vous entendez par "agitez vos tas de points"
birdy

1
la gigue signifie modifier votre tracé, de sorte que les points sus-jacents soient placés les uns à côté des autres pour ne pas obscurcir la vue d'un point de données sur l'autre. il est souvent utilisé dans les fonctions de traçage R.
OFish

Réponses:


3

Je ne sais pas si cela peut vous être utile, mais pour l'EDA primaire, j'aime vraiment le tabplotpackage. Vous donne une bonne idée des corrélations possibles qui peuvent exister dans vos données.

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

parcelle non ordonnée parcelle commandée


comment interpréter ce tabplot? D'après le deuxième tableau à onglets, il semble que les colonnes 2, 3, 4 et 7 se comportent de manière très similaire.
birdy

Est-ce pour une mission / un devoir quelconque? Si c'est le cas, veuillez vous référer aux métas pour les règles, etc. sur l'obtention d'aide avec les affectations. Ma brève réponse: a) je n'ai aucune idée de ce que toutes les différentes valeurs signifient dans les colonnes parce que je n'ai pas étudié la description de l'ensemble de données, b) si je devais simplement décrire ce que je vois, je dirais: la classe 4 semble être associée à des valeurs plus élevées de chaque colonne / variable et vice versa.
OFish

6

Il existe un certain nombre de problèmes qui rendent difficile, voire impossible, l'extraction d'informations utilisables à partir de votre matrice de nuage de points.

Vous avez trop de variables affichées ensemble. Lorsque vous avez beaucoup de variables dans une matrice de nuage de points, chaque tracé devient trop petit pour être utile. La chose à noter est que de nombreux tracés sont dupliqués, ce qui gaspille de l'espace. De plus, bien que vous souhaitiez voir toutes les combinaisons, vous n'avez pas besoin de les représenter toutes ensemble. Notez que vous pouvez diviser une matrice de nuage de points en blocs plus petits de quatre ou cinq (un nombre qui est utilement visualisable). Il vous suffit de créer plusieurs tracés, un pour chaque bloc.

entrez la description de l'image ici

Puisque vous avez beaucoup de données à des points discrets de l'espace , elles finissent par s'empiler les unes sur les autres. Ainsi, vous ne pouvez pas voir le nombre de points à chaque emplacement. Il existe plusieurs astuces pour vous aider à y faire face.

  1. .5
  2. Avec autant de données, même le tremblement rendra les motifs difficiles à discerner. Vous pouvez utiliser des couleurs très saturées, mais largement transparentes pour en tenir compte. Là où il y a beaucoup de données empilées les unes sur les autres, la couleur deviendra plus sombre et là où il y a peu de densité, la couleur sera plus claire.
  3. Pour que la transparence fonctionne, vous aurez besoin de symboles pleins pour afficher vos données, tandis que R utilise des cercles creux par défaut.

En utilisant ces stratégies, voici un exemple de code R et les tracés réalisés:

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

entrez la description de l'image ici

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

entrez la description de l'image ici

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

entrez la description de l'image ici


5

Il est difficile de visualiser plus de 3 à 4 dimensions dans une même parcelle. Une option consisterait à utiliser l'analyse des composants principaux (ACP) pour compresser les données, puis les visualiser dans les dimensions principales. Il existe plusieurs packages différents dans R (ainsi que la prcompfonction de base ) qui facilitent la syntaxe ( voir CRAN ); interpréter les tracés, les chargements, est une autre histoire, mais je pense que c'est plus facile qu'une matrice de nuages ​​de points ordinaux à 10 variables.

entrez la description de l'image ici


Merci pour la suggestion sur PCA. Je n'en savais rien. Comment pourrais-je interpréter l'image que vous avez publiée? Cela signifie-t-il que tous les attributs regroupés dans un groupe auraient une certaine importance?
birdy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.