Problème de base
Voici mon problème de base: j'essaie de regrouper un ensemble de données contenant des variables très asymétriques avec des nombres. Les variables contiennent de nombreux zéros et ne sont donc pas très informatives pour ma procédure de clustering - qui est probablement l'algorithme k-means.
Très bien, dites-vous, transformez simplement les variables en utilisant la racine carrée, le cox carré ou le logarithme. Mais comme mes variables sont basées sur des variables catégorielles, je crains de pouvoir introduire un biais en manipulant une variable (basée sur une valeur de la variable catégorielle), tout en laissant les autres (basées sur d'autres valeurs de la variable catégorielle) telles qu'elles sont .
Allons plus en détail.
L'ensemble de données
Mon jeu de données représente les achats d'articles. Les articles ont différentes catégories, par exemple la couleur: bleu, rouge et vert. Les achats sont ensuite regroupés, par exemple par les clients. Chacun de ces clients est représenté par une ligne de mon ensemble de données, donc je dois en quelque sorte agréger les achats sur les clients.
Pour ce faire, je compte le nombre d'achats, où l'article est d'une certaine couleur. Ainsi , au lieu d'une seule variable color
, je me retrouve avec trois variables count_red
, count_blue
et count_green
.
Voici un exemple d'illustration:
-----------------------------------------------------------
customer | count_red | count_blue | count_green |
-----------------------------------------------------------
c0 | 12 | 5 | 0 |
-----------------------------------------------------------
c1 | 3 | 4 | 0 |
-----------------------------------------------------------
c2 | 2 | 21 | 0 |
-----------------------------------------------------------
c3 | 4 | 8 | 1 |
-----------------------------------------------------------
En fait, je n'utilise pas de comptes absolus au final, j'utilise des ratios (fraction des articles verts de tous les articles achetés par client).
-----------------------------------------------------------
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 |
-----------------------------------------------------------
Le résultat est le même: pour une de mes couleurs, par exemple le vert (personne n'aime le vert), j'obtiens une variable de gauche contenant de nombreux zéros. Par conséquent, k-means ne parvient pas à trouver un bon partitionnement pour cette variable.
D'un autre côté, si je standardise mes variables (soustraire la moyenne, diviser par l'écart-type), la variable verte "explose" en raison de sa petite variance et prend des valeurs dans une plage beaucoup plus grande que les autres variables, ce qui la fait paraître plus important pour k-means qu'il ne l'est réellement.
L'idée suivante est de transformer la variable verte sk (r) ewed.
Transformer la variable asymétrique
Si je transforme la variable verte en appliquant la racine carrée, elle semble un peu moins asymétrique. (Ici, la variable verte est tracée en rouge et vert pour éviter toute confusion.)
Rouge: variable d'origine; bleu: transformé par racine carrée.
Disons que je suis satisfait du résultat de cette transformation (ce que je ne suis pas, car les zéros faussent encore fortement la distribution). Dois-je maintenant aussi mettre à l'échelle les variables rouges et bleues, bien que leurs distributions semblent bonnes?
Conclusion
En d'autres termes, est-ce que je déforme les résultats du clustering en gérant la couleur verte dans un sens, mais pas du tout le rouge et le bleu? En fin de compte, les trois variables appartiennent ensemble, alors ne devraient-elles pas être gérées de la même manière?
ÉDITER
Pour clarifier: je suis conscient que k-means n'est probablement pas la voie à suivre pour les données basées sur le nombre. Ma question est cependant vraiment sur le traitement des variables dépendantes. Le choix de la bonne méthode est une question distincte.
La contrainte inhérente à mes variables est que
count_red(i) + count_blue(i) + count_green(i) = n(i)
, où n(i)
est le nombre total d'achats du client i
.
(Ou, de manière équivalente, count_red(i) + count_blue(i) + count_green(i) = 1
lors de l'utilisation de nombres relatifs.)
Si je transforme mes variables différemment, cela correspond à donner des poids différents aux trois termes de la contrainte. Si mon objectif est de séparer de manière optimale des groupes de clients, dois-je me soucier de ne pas respecter cette contrainte? Ou "la fin justifie-t-elle les moyens"?
count_red
, count_blue
et count_green
et les données sont des comptes. Droite? Quelles sont alors les lignes - les articles? Et vous allez regrouper les articles?