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
etcount_green
et les données sont des comptes. Droite? Quelles sont alors les lignes - les articles? Et vous allez regrouper les articles?Réponses:
@ttnphns a fourni une bonne réponse.
Bien faire un clustering, c'est souvent réfléchir très sérieusement à vos données, alors faisons-en une partie. À mon avis, l'aspect le plus fondamental de vos données est qu'elles sont de composition .
D'un autre côté, votre principale préoccupation semble être que vous avez beaucoup de 0 pour les produits verts et vous vous demandez en particulier si vous ne pouvez transformer que les valeurs vertes pour les rendre plus similaires aux autres. Mais comme ce sont des données de composition, vous ne pouvez pas penser à un ensemble de décomptes indépendamment des autres. De plus, il semble que ce qui vous intéresse vraiment, ce sont les probabilités des clients d'acheter des produits de différentes couleurs, mais parce que beaucoup n'en ont pas acheté de verts, vous craignez de ne pas pouvoir estimer ces probabilités. Une façon de résoudre ce problème consiste à utiliser une approche quelque peu bayésienne dans laquelle nous poussons les proportions estimées des clients vers une proportion moyenne, le montant du décalage étant influencé par leur éloignement de la moyenne et la quantité de données dont vous disposez pour estimer leur véritable probabilités.
Ci-dessous, j'utilise votre exemple de jeu de données pour illustrer (en R) une façon d'aborder votre situation. J'ai lu les données et les ai converties en proportions en ligne, puis j'ai calculé les proportions moyennes par colonne. J'ajoute les moyennes à chaque compte pour obtenir des comptes ajustés et de nouvelles proportions en ligne. Cela pousse la proportion estimée de chaque client vers la proportion moyenne de chaque produit. Si vous vouliez un coup de pouce plus fort, vous pouvez utiliser un multiple des moyens (tels que,
15*mean.props
) à la place.Il y a plusieurs résultats à cela. L'une d'elles est que vous avez maintenant des estimations non nulles des probabilités sous-jacentes d'achat de produits verts, même lorsqu'un client n'a pas encore de dossier d'achat de produits verts. Une autre conséquence est que vous avez maintenant des valeurs quelque peu continues, alors que les proportions d'origine étaient plus discrètes; c'est-à-dire que l'ensemble d'estimations possibles est moins restreint, donc une mesure de distance comme la distance euclidienne au carré pourrait avoir plus de sens maintenant.
Nous pouvons visualiser les données pour voir ce qui s'est passé. Parce que ce sont des données de composition, nous n'avons en fait que deux informations, et nous pouvons les tracer dans un seul nuage de points. Avec la plupart des informations dans les catégories rouge et bleu, il est logique de les utiliser comme axes. Vous pouvez voir que les proportions ajustées (les nombres rouges) sont légèrement décalées par rapport à leurs positions d'origine.
À ce stade, vous avez des données et beaucoup de gens commenceraient par les normaliser. Encore une fois, comme ce sont des données de composition, j'exécuterais des analyses de grappe sans faire de normalisation - ces valeurs sont déjà proportionnées et la normalisation détruirait certaines des informations relationnelles. En fait, en regardant l'intrigue, je pense que vous n'avez vraiment qu'une seule dimension d'information ici. (Au moins dans l'échantillon de données; votre véritable ensemble de données peut être différent.) À moins que, d'un point de vue commercial, vous ne pensiez qu'il est important de reconnaître les personnes qui ont une probabilité substantielle d'acheter des produits verts en tant que groupe distinct de clients, je permettrait d'extraire les scores de la première composante principale (qui représente 99,5% de la variance dans cet ensemble de données) et de les regrouper.
la source
Il n'est pas judicieux de transformer les variables individuellement car elles sont liées (comme vous l'avez remarqué) et de faire k-means parce que les données sont des comptes (vous pourriez, mais k-means est préférable de le faire sur des attributs continus tels que la longueur par exemple) .
À votre place, je calculerais la distance chi carré (parfaite pour les comptes) entre chaque paire de clients, en fonction des variables contenant les comptes. Ensuite, effectuez un clustering hiérarchique (par exemple, méthode de liaison moyenne ou méthode de liaison complète - ils ne calculent pas les centroïdes et ne nécessitent donc pas de distance euclidienne) ou un autre cluster fonctionnant avec des matrices de distance arbitraires.
Copie d'exemples de données de la question:
Considérez la paire
c0
etc1
calculez la statistique du chi carré pour leur2x3
table de fréquences. Prenez-en la racine carrée (comme vous la prenez lorsque vous calculez la distance euclidienne habituelle). Telle est votre distance. Si la distance est proche de 0, les deux clients sont similaires.Cela peut vous déranger que les sommes dans les rangées de votre tableau diffèrent et cela affecte donc la distance chi carré lorsque vous comparez
c0
avecc1
vsc0
avecc2
. Calculez ensuite la (racine de) la distance Phi-carré :Phi-sq = Chi-sq/N
oùN
est le nombre total combiné dans les deux lignes (clients) actuellement considérées. C'est donc la distance normalisée par rapport aux dénombrements globaux.Ainsi, la distance entre deux lignes de données est la (racine carrée de) la statistique chi carré ou phi carré de la
2 x p
table de fréquences (p
est le nombre de colonnes dans les données). Si une ou plusieurs colonnes de la2 x p
table en cours sont à zéro, coupez cette colonne et calculez la distance en fonction des colonnes non nulles restantes (c'est OK et c'est ainsi, par exemple, que SPSS fait quand il calcule la distance). La distance khi carré est en fait une distance euclidienne pondérée.la source