Clustering et ré-arrangement de classes

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Raphaël Chopin
Messages : 9
Enregistré le : 26 Avr 2019, 13:34

Clustering et ré-arrangement de classes

Messagepar Raphaël Chopin » 29 Avr 2019, 07:24

Bonjour,

J'effectue actuellement un clustering de certaines données sur différentes données dans le but d'obtenir des scores. Voilà mon code :

Code : Tout sélectionner

donnée<-s2013$Derniere_commande
dist<-dist(donnée)
arbre<-hclust(dist, method = "ward.D2")
best.cutree(arbre, graph=TRUE, xlab="Nombre de classes",ylab="Inertie relative",ylim=c(0,1))
R<-cutree(arbre, 4)
freq(R)
A2Rplot(arbre, k=4, col.up="gray", col.down = brewer.pal(4,"Dark2"), show.labels = FALSE)
s2013<-cbind(s2013,R)


Le problème est le suivant, si ma division de classe me semble pertinent et efficace, les numéros ne correspondent pas a l'ordre croissant ou décroissant d'un scoring, je m'explique :

Code : Tout sélectionner

> mean(s2013$Derniere_commande[R==1])
[1] 25.15104
> mean(s2013$Derniere_commande[R==2])
[1] 92.19408
> mean(s2013$Derniere_commande[R==3])
[1] 297.2384
> mean(s2013$Derniere_commande[R==4])
[1] 186.7556


Comme vous pouvez le voir, ma classe 3 est la plus forte, je voudrai donc qu'elle soit ma classe N°4, c'est un exemple et j'ai le même problème pour mes autres tables, il me faut donc quelque chose de robuste et qui peut s'appliquer a n'importe quel jeu de donnée pour reclasser les classes dans le bon ordre.

Après quelques recherches et essais j'ai trouvé ça :

Code : Tout sélectionner

> reclassement<-aggregate(x=s2013$Derniere_commande, by=list(s2013$R),mean)
> reclassement<-order(reclassement$x, decreasing=TRUE)
> reclassement
[1] 3 4 2 1


Mais ça ne m'avance pas a grand chose puisque je ne vois pas comment le remettre dans la table.

Merci d'avance et bonne journée.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Clustering et ré-arrangement de classes

Messagepar Logez Maxime » 29 Avr 2019, 07:36

Bonjour,

une possibilité :

Code : Tout sélectionner

reclassement <- with(s2013, tapply(Derniere_commande, R, mean))
s2013$R2 <- order(reclassement, decreasing = T)[s2013$R]
Cordialement,
Maxime

Raphaël Chopin
Messages : 9
Enregistré le : 26 Avr 2019, 13:34

Re: Clustering et ré-arrangement de classes

Messagepar Raphaël Chopin » 29 Avr 2019, 07:49

C'est vrai que ça aurait pu marcher mais pour une raison que j'ignore voilà ce qui se passe :

Le score que j'ai au début

Code : Tout sélectionner

        1         2         3         4
 25.15104  92.19408 297.23837 186.75556


Donc je voudrai que
1 -> 4
2 -> 3
3 -> 1
4 -> 2

Mais ce que j'obtiens c'est
1 -> 3
2 -> 4
3 -> 2
4 -> 1

Et impossible de savoir pourquoi :/

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Clustering et ré-arrangement de classes

Messagepar Logez Maxime » 29 Avr 2019, 08:37

re,

plus safe :

Code : Tout sélectionner

x <- rnorm(100)
y <- gl(4, 25)
classement <- names(sort(tapply(x, y, mean), decreasing = T))
y2 <- match(y, classement)
tapply(x, y2, mean)
         1          2          3          4
 0.1529931  0.1358594  0.0240477 -0.2300252
Cordialement,
Maxime

Raphaël Chopin
Messages : 9
Enregistré le : 26 Avr 2019, 13:34

Re: Clustering et ré-arrangement de classes

Messagepar Raphaël Chopin » 29 Avr 2019, 09:04

Re,

Cette fois ci on y était presque puisque ça a donné :

1 -> 4
2 -> 3
3 -> 2
4 -> 1

Cordialement,

Raphaël

Raphaël Chopin
Messages : 9
Enregistré le : 26 Avr 2019, 13:34

Re: Clustering et ré-arrangement de classes

Messagepar Raphaël Chopin » 29 Avr 2019, 09:49

C'est bon ! J'avais mal compris ton code mais j'ai réussi à tout régler, voici mon code si jamais certains rencontrent le même problème :

Code : Tout sélectionner

reclassement<-names(sort(tapply(x,y,mean),decreasing=TRUE))
y2<-match(y,reclassement)
reclassement<-tapply(x,y2,mean)
s2013$R<-order(reclassement)[s2013$R]


Merci beaucoup Maxime !

Cordialement,

Raphaël

Raphaël Chopin
Messages : 9
Enregistré le : 26 Avr 2019, 13:34

Re: Clustering et ré-arrangement de classes

Messagepar Raphaël Chopin » 29 Avr 2019, 10:11

Et non, j'ai parlé trop vite

Selon le tirage de x, ça fonctionne des fois, et ça ne fonctionne pas d'autres fois.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Clustering et ré-arrangement de classes

Messagepar Logez Maxime » 29 Avr 2019, 10:22

re,

normalement le code avec la fonction match devrait toujours te renvoyer le résultat souhaité :

Code : Tout sélectionner

sims <- replicate(1000, {
 x <- rnorm(100)
 y <- gl(4, 25)
 classement <- names(sort(tapply(x, y, mean), decreasing = T))
 y2 <- match(y, classement)
 tapply(x, y2, mean)
 })
 
 all(apply(sims, 2, order)==(4:1))
[1] TRUE
Les 1000 tirages ont été reclassés correctement ici. La variable reclassée est directement le y2, il n'y a pas d'autres manipulations à faire.

Code : Tout sélectionner

tapply(x, y, mean)
          1           2           3           4
-0.01749984 -0.05486652 -0.20988528  0.09165352
table(y, y2)
   y2
y    1  2  3  4
  1  0 25  0  0
  2  0  0 25  0
  3  0  0  0 25
  4 25  0  0  0
 
tapply(x, y2, mean)
           1           2           3           4
 0.09165352 -0.01749984 -0.05486652 -0.20988528
Ici selon ta logique :
4 -> 1
1 -> 2
2 -> 3
3 -> 4
c'est ce qu'ont voit avec le résultat de table et ensuite avec le nouveau tapply.

Après pour plus de sûreté tu peux transformer y en chaîne de caractères dans la fonction match.
Cordialement,
Maxime

Raphaël Chopin
Messages : 9
Enregistré le : 26 Avr 2019, 13:34

Re: Clustering et ré-arrangement de classes

Messagepar Raphaël Chopin » 29 Avr 2019, 11:47

Je suis désolé mais je ne comprend pas.

Je pense que le problème vient de là, je n'arrive pas à comprendre comment tu veux que j'applique ce code a mes données, je ne vois pas ce que je dois faire ou modifier

Cordialement,
Raphaël

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Clustering et ré-arrangement de classes

Messagepar Logez Maxime » 29 Avr 2019, 11:52

re,

Essaie :

Code : Tout sélectionner

reclassement <- names(sort(with(s2013, tapply(Derniere_commande, R, mean)), decreasing = T))
s2013$R2 <- match(s2013$R, reclassement)
Cordialement,
Maxime

Raphaël Chopin
Messages : 9
Enregistré le : 26 Avr 2019, 13:34

Re: Clustering et ré-arrangement de classes

Messagepar Raphaël Chopin » 29 Avr 2019, 12:04

Super, merci beaucoup, ça marche partout et parfaitement bien

Voici mon code sur plusieurs clustering et ça marche sur chacun d'entre eux, si quelqu'un en a besoin

Code : Tout sélectionner

donnée<-s2013$Derniere_commande
dist<-dist(donnée)
arbre<-hclust(dist, method = "ward.D2")
best.cutree(arbre, graph=TRUE, xlab="Nombre de classes",ylab="Inertie relative",ylim=c(0,1))
R<-cutree(arbre, 4)
freq(R)
A2Rplot(arbre, k=4, col.up="gray", col.down = brewer.pal(4,"Dark2"), show.labels = FALSE)
s2013<-cbind(s2013,R)
reclassement<-names(sort(with(s2013, tapply(donnée, R, mean)), decreasing = TRUE))
s2013$R<-match(s2013$R, reclassement)

donnée<-s2013$Nombre_commande
dist<-dist(donnée)
arbre<-hclust(dist, method = "ward.D2")
best.cutree(arbre, graph=TRUE, xlab="Nombre de classes",ylab="Inertie relative",ylim=c(0,1))
Fr<-cutree(arbre, 4)
freq(Fr)
A2Rplot(arbre, k=4, col.up="gray", col.down = brewer.pal(4,"Dark2"), show.labels = FALSE)
s2013<-cbind(s2013,Fr)
reclassement<-names(sort(with(s2013, tapply(donnée, Fr, mean)), decreasing = FALSE))
s2013$Fr<-match(s2013$Fr, reclassement)

donnée<-s2013$Total
dist<-dist(donnée)
arbre<-hclust(dist, method = "ward.D2")
best.cutree(arbre, graph=TRUE, xlab="Nombre de classes",ylab="Inertie relative",ylim=c(0,1))
M<-cutree(arbre, 4)
freq(M)
A2Rplot(arbre, k=4, col.up="gray", col.down = brewer.pal(4,"Dark2"), show.labels = FALSE)
s2013<-cbind(s2013,M)
reclassement<-names(sort(with(s2013, tapply(donnée, M, mean)), decreasing = FALSE))
s2013$M<-match(s2013$M, reclassement)


Merci à toi Maxime pour ta patience et ton aide

Cordialement,
Raphaël


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité

cron