Agrupamento de dados muito distorcidos e contados: alguma sugestão a ser feita (transformar etc)?

11

Problema básico

Aqui está o meu problema básico: estou tentando agrupar um conjunto de dados que contém algumas variáveis ​​muito assimétricas com contagens. As variáveis ​​contêm muitos zeros e, portanto, não são muito informativas para o meu procedimento de agrupamento - o que provavelmente é um algoritmo k-means.

Tudo bem, você diz, apenas transforme as variáveis ​​usando raiz quadrada, box cox ou logaritmo. Porém, como minhas variáveis ​​são baseadas em variáveis ​​categóricas, receio poder introduzir um viés manipulando uma variável (com base em um valor da variável categórica), enquanto deixo outras (com base em outros valores da variável categórica) do jeito que são. .

Vamos entrar em mais alguns detalhes.

O conjunto de dados

Meu conjunto de dados representa compras de itens. Os itens têm categorias diferentes, por exemplo, cor: azul, vermelho e verde. As compras são então agrupadas, por exemplo, pelos clientes. Cada um desses clientes é representado por uma linha do meu conjunto de dados, então, de alguma forma, tenho que agregar compras aos clientes.

A maneira como faço isso é contando o número de compras, onde o item é de uma determinada cor. Então, ao invés de uma única variável color, eu acabar com três variáveis count_red, count_bluee count_green.

Aqui está um exemplo para ilustração:

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    12      |        5        |       0         |
-----------------------------------------------------------
c1       |     3      |        4        |       0         |
-----------------------------------------------------------
c2       |     2      |       21        |       0         |
-----------------------------------------------------------
c3       |     4      |        8        |       1         |
-----------------------------------------------------------

Na verdade, não uso contagens absolutas no final, uso proporções (fração de itens verdes de todos os itens comprados por cliente).

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    0.71    |        0.29     |       0.00      |
-----------------------------------------------------------
c1       |    0.43    |        0.57     |       0.00      |
-----------------------------------------------------------
c2       |    0.09    |        0.91     |       0.00      |
-----------------------------------------------------------
c3       |    0.31    |        0.62     |       0.08      |
-----------------------------------------------------------

O resultado é o mesmo: para uma das minhas cores, por exemplo, verde (ninguém gosta de verde), recebo uma variável inclinada para a esquerda contendo muitos zeros. Consequentemente, o k-means falha ao encontrar um bom particionamento para essa variável.

Por outro lado, se eu padronizar minhas variáveis ​​(subtrair média, dividir por desvio padrão), a variável verde "explode" devido à sua pequena variação e assume valores de uma faixa muito maior que as outras variáveis, o que faz com que pareça mais importante para k-means do que realmente é.

A próxima idéia é transformar a variável verde sk (r) ewed.

Transformando a variável inclinada

Se eu transformar a variável verde aplicando a raiz quadrada, ela parecerá um pouco menos distorcida. (Aqui a variável verde é plotada em vermelho e verde para garantir confusão.)

insira a descrição da imagem aqui

Vermelho: variável original; azul: transformado por raiz quadrada.

Digamos que estou satisfeito com o resultado dessa transformação (o que não estou, pois os zeros ainda distorcem fortemente a distribuição). Devo agora também dimensionar as variáveis ​​vermelha e azul, embora suas distribuições pareçam bem?

Bottom line

Em outras palavras, distorço os resultados do agrupamento manipulando a cor verde de uma maneira, mas sem manipular vermelho e azul? No final, todas as três variáveis ​​pertencem uma à outra, então elas não devem ser tratadas da mesma maneira?

EDITAR

Para esclarecer: estou ciente de que o k-means provavelmente não é o caminho a seguir para dados baseados em contagem . Minha pergunta, porém, é realmente sobre o tratamento de variáveis ​​dependentes. A escolha do método correto é uma questão separada.

A restrição inerente em minhas variáveis ​​é que

count_red(i) + count_blue(i) + count_green(i) = n(i), onde n(i)é o número total de compras do cliente i.

(Ou, equivalentemente, count_red(i) + count_blue(i) + count_green(i) = 1ao usar contagens relativas.)

Se eu transformar minhas variáveis ​​de maneira diferente, isso corresponderá a atribuir pesos diferentes aos três termos da restrição. Se meu objetivo é separar grupos de clientes da melhor maneira, preciso me preocupar em violar essa restrição? Ou "o fim justifica os meios"?

pederpansen
fonte
Bem-vindo ao CV! Obrigado por fazer sua primeira pergunta tão clara e bem escrita.
Silverfish 22/09
Não entendi muito bem o seu conjunto de dados. As variáveis (atributos) são count_red, count_bluee count_greene os dados são contagens. Direita? Quais são as linhas então - itens? E você vai agrupar os itens?
ttnphns
As linhas geralmente representam grupos de compras agregadas. Você pode pensar neles como clientes que compraram vários itens. Atualizei minha pergunta com um exemplo de conjunto de dados para deixar isso mais claro.
pederpansen 22/09/2015
Deseja agrupar "clientes"?
ttnphns
Sim. Pretendo agrupar as compras por intervalos de tempo e, consequentemente, agrupar intervalos de tempo, mas por enquanto: clientes.
pederpansen

Respostas:

7

@ttnphns forneceu uma boa resposta.

Fazer um cluster bem é muitas vezes pensar muito sobre seus dados, então vamos fazer um pouco disso. Na minha opinião, o aspecto mais fundamental dos seus dados é que eles são de composição .

Por outro lado, sua principal preocupação parece ser que você tem muitos 0s para produtos ecológicos e se pergunta especificamente se é possível transformar apenas os valores ecológicos para torná-lo mais semelhante ao restante. Mas, como se trata de dados composicionais, você não pode pensar em um conjunto de contagens independentemente do resto. Além disso, parece que o que realmente interessa são as probabilidades dos clientes de comprar produtos coloridos diferentes, mas como muitos não compraram produtos verdes, você se preocupa por não poder estimar essas probabilidades. Uma maneira de resolver isso é usar uma abordagem um tanto bayesiana na qual direcionamos as proporções estimadas dos clientes para uma proporção média, com a quantidade da mudança influenciada pela distância entre elas e a quantidade de dados necessários para estimar a verdadeira probabilidades.

Abaixo, uso seu exemplo de conjunto de dados para ilustrar (em R) uma maneira de abordar sua situação. Eu li os dados e os converti em proporções em linhas e depois calculei as proporções médias por coluna. Eu adiciono as médias de volta a cada contagem para obter contagens ajustadas e novas proporções em linhas. Isso leva a proporção estimada de cada cliente para a proporção média de cada produto. Se você quisesse dar uma cutucada mais forte, poderia usar vários meios (como, 15*mean.props).

d = read.table(text="id  red    blue    green
...
c3  4   8   1", header=TRUE)
tab = as.table(as.matrix(d[,-1]))
rownames(tab) = paste0("c", 0:3)
tab
#    red blue green
# c0  12    5     0
# c1   3    4     0
# c2   2   21     0
# c3   4    8     1
props = prop.table(tab, 1)
props
#           red       blue      green
# c0 0.70588235 0.29411765 0.00000000
# c1 0.42857143 0.57142857 0.00000000
# c2 0.08695652 0.91304348 0.00000000
# c3 0.30769231 0.61538462 0.07692308
mean.props = apply(props, 2, FUN=function(x){ weighted.mean(x, rowSums(tab)) })
mean.props
#        red       blue      green 
# 0.35000000 0.63333333 0.01666667 
adj.counts = sweep(tab, 2, mean.props, FUN="+");  adj.counts
#            red        blue       green
# c0 12.35000000  5.63333333  0.01666667
# c1  3.35000000  4.63333333  0.01666667
# c2  2.35000000 21.63333333  0.01666667
# c3  4.35000000  8.63333333  1.01666667
adj.props = prop.table(adj.counts, 1);  adj.props
#             red         blue        green
# c0 0.6861111111 0.3129629630 0.0009259259
# c1 0.4187500000 0.5791666667 0.0020833333
# c2 0.0979166667 0.9013888889 0.0006944444
# c3 0.3107142857 0.6166666667 0.0726190476

Existem vários resultados disso. Uma delas é que agora você tem estimativas diferentes de zero das probabilidades subjacentes de comprar produtos ecológicos, mesmo quando um cliente ainda não possui nenhum registro de ter comprado produtos ecológicos. Outra consequência é que agora você tem valores um tanto contínuos, enquanto as proporções originais eram mais discretas; isto é, o conjunto de estimativas possíveis é menos restrito; portanto, uma medida de distância como a distância euclidiana ao quadrado pode fazer mais sentido agora.

Podemos visualizar os dados para ver o que aconteceu. Como esses são dados composicionais, na verdade só temos duas informações e podemos plotá-las em um único gráfico de dispersão. Com a maioria das informações nas categorias vermelho e azul, faz sentido usá-las como eixos. Você pode ver que as proporções ajustadas (os números vermelhos) mudam um pouco de suas posições originais.

windows()
  plot(props[,1], props[,2], pch=as.character(0:3),
       xlab="Proportion Red", ylab="Proportion Blue", xlim=c(0,1), ylim=c(0,1))
  points(adj.props[,1], adj.props[,2], pch=as.character(0:3), col="red")

insira a descrição da imagem aqui

Nesse ponto, você tem dados e muitas pessoas começariam a padronizá-los. Novamente, como se trata de dados de composição, eu executaria análises de cluster sem fazer nenhuma padronização - esses valores já são proporcionais e a padronização destruiria algumas das informações relacionais. De fato, olhando para o enredo, acho que você realmente tem apenas uma dimensão de informação aqui. (Pelo menos no conjunto de dados de amostra; seu conjunto de dados real pode muito bem ser diferente.) extrairia pontuações no primeiro componente principal (que representa 99,5% da variação neste conjunto de dados) e apenas o agruparia.

pc.a.props = prcomp(adj.props[,1:2], center=T, scale=T)
cumsum(pc.a.props$sdev^2)/sum(pc.a.props$sdev^2)
# [1] 0.9946557 1.000000
pc.a.props$x
#           PC1         PC2
# c0 -1.7398975 -0.03897251
# c1 -0.1853614 -0.04803648
# c2  1.6882400 -0.06707115
# c3  0.2370189  0.15408015
library(mclust)
mc = Mclust(pc.a.props$x[,1])
summary(mc)
# ----------------------------------------------------
# Gaussian finite mixture model fitted by EM algorithm 
# ----------------------------------------------------
# 
# Mclust E (univariate, equal variance) model with 3 components:
# 
#  log.likelihood n df       BIC       ICL
#       -2.228357 4  6 -12.77448 -12.77448
# 
# Clustering table:
# 1 2 3 
# 1 2 1 
- Reinstate Monica
fonte
+1 porque você reconheceu que se trata de dados de composição, mas por que você não usaria apenas técnicas de transformação padrão para composição. dados em vez dessa idéia "contagens ajustadas médias" ímpares? Parece ad-hoc para mim, existe uma referência específica para isso ou algo semelhante? Por que isso é melhor do que uma simples transformação de razão de log centralizada e, em seguida, agrupando a primeira pontuação do PC dos dados transformados? (o que seria o que qualquer revisor razoável de um compos aplicativo de análise de dados pediria.)
usεr11852
Obrigado, @ usεr11852. Contagens de> 2, mas opções finitas, são multinomiais. Esta é (1 forma de uma análise empírica) bayesiana com Dirichlet anterior (o conjugado). Tenho certeza de que outras opções são possíveis. No entanto, não vejo imediatamente como as proporções funcionariam com os 0s.
gung - Restabelece Monica
2
Obrigado pelo link. Se você tiver uma única dimensão de componente diferente de zero, poderá usá-la para uma transformação de razão de log aditiva (excluindo a idéia óbvia de imputação; consulte os comentários aqui ). O CLR estaria desativado porque usa uma média geométrica. Houve trabalhos sobre "dados composicionais inflacionados com zero"; veja por exemplo aqui , aqui e aqui .
precisa saber é o seguinte
11
Parece que você sabe muito mais sobre esse tópico do que eu, @ usεr11852. Minha resposta foi realmente apenas tentar tornar explícitos esses fatos sobre a natureza da situação / levantar a questão e fornecer uma sugestão preliminar. Por que não contribuir com sua própria resposta (melhor informada)?
gung - Restabelece Monica
7

Não é aconselhável transformar as variáveis ​​individualmente porque elas pertencem juntas (como você notou) e executar k-means porque os dados são contados (você pode, mas k-means é melhor fazer em atributos contínuos, como comprimento, por exemplo) .

Em seu lugar, eu calcularia a distância qui-quadrado (perfeita para contagens) entre cada par de clientes, com base nas variáveis ​​que contêm contagens. Em seguida, faça agrupamentos hierárquicos (por exemplo, método de ligação médio ou método completo de vinculação - eles não computam centróides e, portanto, não requerem distância euclidiana) ou algum outro agrupamento trabalhando com matrizes de distância arbitrárias.

Copiando dados de exemplo da pergunta:

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    12      |        5        |       0         |
-----------------------------------------------------------
c1       |     3      |        4        |       0         |
-----------------------------------------------------------
c2       |     2      |       21        |       0         |
-----------------------------------------------------------
c3       |     4      |        8        |       1         |
-----------------------------------------------------------

Considere o par c0e c1calcule a estatística do qui-quadrado para a 2x3tabela de frequências. Pegue a raiz quadrada dele (como você pega quando calcula a distância euclidiana usual). Essa é a sua distância. Se a distância for próxima de 0, os dois clientes são semelhantes.

Pode incomodá-lo que as somas em linhas da sua tabela sejam diferentes e, portanto, afeta a distância do qui-quadrado quando você compara c0com c1vs c0com c2. Em seguida, calcule a (raiz da) distância Phi-quadrado : Phi-sq = Chi-sq/Nonde Né a contagem total combinada nas duas linhas (clientes) consideradas atualmente. Portanto, é uma distância normalizada em relação às contagens gerais.

Here is the matrix of sqrt(Chi-sq) distance between your four customers
 .000   1.275   4.057   2.292
1.275    .000   2.124    .862
4.057   2.124    .000   2.261
2.292    .862   2.261    .000

And here is the matrix of sqrt(Phi-sq) distance 
.000    .260    .641    .418
.260    .000    .388    .193
.641    .388    .000    .377
.418    .193    .377    .000

Portanto, a distância entre duas linhas dos dados é a (sq. Root of) da estatística qui-quadrado ou phi-quadrado da 2 x ptabela de frequências ( pé o número de colunas nos dados). Se alguma coluna na 2 x ptabela atual estiver com zero completo, corte essa coluna e calcule a distância com base nas colunas não nulas restantes (tudo bem e é assim, por exemplo, o SPSS quando calcula a distância). A distância do qui-quadrado é na verdade uma distância euclidiana ponderada.

ttnphns
fonte
Obrigado por esta resposta elaborada. Aprecio que você tenha dado conselhos sobre algo que não era minha pergunta original: K-means (com a distância implícita euclidiana) é a escolha certa para este caso de uso? Eu suspeitava que não, e você confirmou isso. No entanto, ainda não entendo o porquê . Você poderia raciocinar 1) por que a distância do qui-quadrado (ou phi-quadrado) é uma boa opção para os dados de contagem? 2) voltando à minha pergunta original: existe um bom argumento (matemático / empírico) por que todas as variáveis ​​devem ser tratadas da mesma maneira, exceto "pertencem uma à outra"?
pederpansen 22/09/2015
Um cliente escolhe entre as três cores quando faz uma única compra: as três cores não são "variáveis" conceitualmente independentes. Além disso, seus dados são contados. Ficou imediatamente claro para mim que uma medida baseada no qui-quadrado deveria ser ideal. Em relação ao seu último ponto - eu poderia lhe perguntar: por que eles deveriam ser tratados de maneira diferente? A deu a você uma solução para realizar o trabalho de cluster. Existe algo nele que você não gosta ou o que faz você duvidar?
ttnphns
2
Eu também não acho que o k-means (minimização de variância!) É o caminho a seguir: k-means usa meios . Seus dados são inteiros e possuem muitos zeros. Os centros de cluster não serão inteiros e terão poucos zeros. Eles são totalmente diferentes dos seus pontos de dados, como eles podem ser representativos? Conclusão: não lute para transformar seus dados para caber no k-means. Entenda o problema e ajuste os algoritmos ao seu problema, e não o contrário. Se você se encaixa seus dados para o problema k-médias, ele ainda pode ser o problema errado ...
parou - anony-Mousse
11
Quando você padroniza suas variáveis ​​para equilibrar suas variações, é aproximadamente equivalente à equalização dos totais nas colunas da sua tabela de dados. Quando você transforma a inclinação, é aproximadamente equivalente aumentar contagens maiores, mas não menores, na sua tabela. Você pode fazer isso (e mesmo depois dele pode calcular chi ou phi como sugeri), mas saiba que distorceu os dados originais. Foi justificado, você descobriu e não ocultou informações valiosas? Foi uma tortura desnecessária dos dados? No final, você é o único que decide sobre essas reflexões.
ttnphns
2
É fácil destruir propriedades fundamentais por normalização inadequada. Por exemplo, se seus dados somam 1 em cada linha, a normalização de cada coluna destruirá essa propriedade. Nesses dados, você deve considerar, por exemplo, medidas de divergência (distâncias para distribuições). Na contagem de dados, medidas de interseção definidas como Jaccard podem ser mais informativas; mas eles precisam de vetores binários. etc
Tem QUIT - Anony-Mousse