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_blue
e 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.)
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) = 1
ao 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"?
count_red
,count_blue
ecount_green
e os dados são contagens. Direita? Quais são as linhas então - itens? E você vai agrupar os itens?Respostas:
@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
).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.
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.
fonte
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:
Considere o par
c0
ec1
calcule a estatística do qui-quadrado para a2x3
tabela 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
c0
comc1
vsc0
comc2
. Em seguida, calcule a (raiz da) distância Phi-quadrado :Phi-sq = Chi-sq/N
ondeN
é a contagem total combinada nas duas linhas (clientes) consideradas atualmente. Portanto, é uma distância normalizada em relação às contagens gerais.Portanto, a distância entre duas linhas dos dados é a (sq. Root of) da estatística qui-quadrado ou phi-quadrado da
2 x p
tabela de frequências (p
é o número de colunas nos dados). Se alguma coluna na2 x p
tabela 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.fonte