Como extrair informações de uma matriz de dispersão quando você tem N grandes, dados discretos e muitas variáveis?

10

Estou brincando com o conjunto de dados de câncer de mama e criei um gráfico de dispersão de todos os atributos para ter uma idéia de quais têm mais efeito na previsão da classe malignant(azul) de benign(vermelho).

Entendo que a linha representa o eixo x e a coluna representa o eixo y, mas não consigo ver quais observações posso fazer sobre os dados ou os atributos desse gráfico de dispersão.

Estou procurando ajuda para interpretar / fazer observações sobre os dados deste gráfico de dispersão ou se devo usar outra visualização para visualizar esses dados.

insira a descrição da imagem aqui

Código R que usei

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)
birdy
fonte
Você está certo: é difícil ver muito disso. Como todas as suas variáveis ​​parecem discretas, com um número relativamente pequeno de categorias, é impossível determinar quantos símbolos são empilhados para formar cada símbolo distintamente visível. Isso torna essa imagem específica de pouco valor na avaliação de qualquer coisa.
whuber
11
Isso é o que eu pensava. Tentei plotar um gráfico de barras em caixa, mas isso não seria útil para ver qual atributo tem mais efeito na classe, certo ...? Procurando ajuda sobre que tipo de visualização daria algumas informações significativas.
birdy
2
Suas dispersões de duas cores podem fazer muito sentido se você tremer (adicionar ruído) às pilhas de pontos.
precisa
@ttnphns Eu não entendo o que você quer dizer com "jitter suas pilhas de pontos"
birdy
11
jitter significa editar sua plotagem, para que pontos sobrepostos sejam colocados um ao lado do outro para não obscurecer a exibição de um ponto de dados sobre o outro. é frequentemente usado em funções de plotagem de R.
OFish

Respostas:

3

Não tenho certeza se isso é de alguma ajuda para você, mas para a EDA principal eu realmente gosto do tabplotpacote. Dá a você uma boa noção de quais possíveis correlações podem existir em seus dados.

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

enredo não ordenado enredo ordenado

OFish
fonte
como alguém interpretaria esse tabplot? No segundo tabplot, parece que as colunas 2, 3, 4 e 7 se comportam de maneira muito semelhante uma à outra?
birdy
Isso é para algum trabalho / tarefa de algum tipo? Nesse caso, consulte as metas para as regras, etc, sobre como obter ajuda com as atribuições. Minha breve resposta: a) não faço ideia do que significam todos os diferentes valores nas colunas porque não estudei a descrição do conjunto de dados; b) se eu simplesmente descrevesse o que vejo, diria: a classe 4 parece ser associado a valores mais altos de cada coluna / variável e vice-versa.
OFish
6

Existem vários problemas que tornam difícil ou impossível extrair qualquer informação utilizável da sua matriz de gráficos de dispersão.

Você tem muitas variáveis ​​exibidas juntas. Quando você tem muitas variáveis ​​em uma matriz de gráficos de dispersão, cada gráfico se torna pequeno demais para ser útil. O importante a ser observado é que muitas parcelas são duplicadas, o que desperdiça espaço. Além disso, embora você queira ver todas as combinações, não precisa plotá-las todas juntas. Observe que você pode quebrar uma matriz de gráficos de dispersão em blocos menores de quatro ou cinco (um número que é útil para visualização). Você só precisa fazer vários gráficos, um para cada bloco.

insira a descrição da imagem aqui

Como você tem muitos dados em pontos discretos no espaço , eles acabam se acumulando. Assim, você não pode ver quantos pontos existem em cada local. Existem vários truques para ajudá-lo a lidar com isso.

  1. O primeiro é tremer . Tremulação significa adicionar uma pequena quantidade de ruído aos valores do seu conjunto de dados. O ruído é retirado de uma distribuição uniforme centrada no seu valor, mais ou menos, uma pequena quantidade. Existem algoritmos para determinar uma quantidade ideal, mas como seus dados vêm em unidades inteiras de um a dez, parece ser uma boa escolha. .5
  2. Com tantos dados, mesmo tremores dificultam o discernimento. Você pode usar cores altamente saturadas, mas amplamente transparentes para explicar isso. Onde houver muitos dados empilhados uns sobre os outros, a cor ficará mais escura e onde houver pouca densidade, a cor será mais clara.
  3. Para que a transparência funcione, você precisará de símbolos sólidos para exibir seus dados, enquanto R usa círculos vazios por padrão.

Usando essas estratégias, aqui está um exemplo de código R e os gráficos feitos:

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

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

- Reinstate Monica
fonte
5

É difícil visualizar mais de 3-4 dimensões em um único gráfico. Uma opção seria usar a análise de componentes principais (PCA) para compactar os dados e depois visualizá-los nas principais dimensões. Existem vários pacotes diferentes no R (assim como a prcompfunção base ) que tornam isso sintaticamente fácil ( consulte CRAN ); interpretar as plotagens, loadings, é outra história, mas acho mais fácil do que uma matriz ordinal de 10 dispersões.

insira a descrição da imagem aqui

Minnow
fonte
Obrigado pela sugestão no PCA. Eu não sabia disso. Como eu interpretaria a imagem que você postou? Isso significa que todos os atributos reunidos em um grupo teriam alguma importância?
birdy