Classification sur un jeu de données volumineuses

71 views
Skip to first unread message

Pierre Anthony Garraud

unread,
May 7, 2023, 10:54:22 AM5/7/23
to factomin...@googlegroups.com, Abnel
Salut tout le monde,
J'ai de grandes difficultés à faire une classification sur un jeu de données comprenant 477398 enregistrements et 19 variables don't 3 sont quantitatives et je les considere comme variables supplementaires.
Je faire une classification ascendante hiérarchique sur les principaux axes d'une analyse des correspondantes multiples.

Voici l'erreur le programme affiche:  error : cannot allocate vector of size 900 GB.

Comment je pourrais continuer cette erreur ? Est,ce qu'il y a un service en ligne qui pourrait le faire et me returner les resultats?
Ou encore quelqu'un du groupe m'aider à avoir les groupes formés?
Merci
Pierre

Aliette ROUX - PROGEDO-Loire

unread,
May 17, 2023, 6:04:51 AM5/17/23
to FactoMineR users
Bonjour Pierre Anthony, bonjour tout le monde,

Comme l'explique François Husson dans ses excellentes vidéos pédagogiques sur la CAH (encore un grand merci ! - https://www.youtube.com/watch?v=SE_4dLh5vXY), l'algorithme sera trop long, impossible ou fonctionnera mal sur des tableaux avec de nombreux individus. Aussi, dans ces cas-là, François Husson évoque la possibilité de faire une partition (par k-means) en une centaine de classes, puis de réaliser une CAH sur ces classes.
Voilà comment je procèderais dans deux cas (cas 1 : CAH sur un tableau "initial" de variables quantitatives /cas 2 : CAH sur les résultats d'une ACM)

# CAS 1 : CAH sur un tableau "initial" de variables quantitatives ----

Imaginons un dataframe d comprenant des variables de pourcentages (exemple : parts en % des différentes PCS parmi les actifs, dans les communes françaises) :
1/ je réalise une partition en 500 classes sur mon tableau de données
res.kmeans <- kmeans(d,centers=500,nstart=5)
2/ je construis ensuite une table "groupes.kmeans" qui indique, pour chacune des 500 classes, les parts moyennes des PCS :
groupes.kmeans <- d %>%
  mutate(clust.kmeans=res.kmeans$cluster) %>%
  group_by(clust.kmeans) %>% summarise_all(.,mean) %>%
  column_to_rownames(var="clust.kmeans")
3/ je réalise la CAH sur le tableau des classes kmeans
res.cah <- HCPC(groupes.kmeans,nb.clust=-1,graph=F)
4/ et voilà ce que je fais pour associer ces classes CAH au tableau initial :
groupes.kmeans <- groupes.kmeans %>%
  mutate(clust.cah=res.cah$data.clust$clust) %>%
  rownames_to_column(var="clust.kmeans")
d <- d %>%
  mutate(clust.kmeans=as.character(res.kmeans$cluster)) %>%
  left_join(groupes.kmeans %>% select(clust.kmeans,clust.cah),by="clust.kmeans")

# CAS 2 : CAH sur les résultats d'une ACM ----

Je prends le tableau "loisirs" (données d'enquête) extrait des supports pédagogiques de François Husson.
loisirs <- loisirs %>% select(1:18) %>% mutate(TV=as.factor(TV))
res.acm <- MCA(loisirs, graph=F)
C'est la même démarche que précédemment, mais le dataframe "d" est composé des coordonnées des individus sur les plans de l'ACM.
1/ je réalise une partition en N classes (ici 20 - c'est surtout pour des fins "didactiques" !)
d <- as.data.frame(res.acm$ind$coord)
res.kmeans <- kmeans(d,centers=20,nstart=5)
2/ je construis ensuite une table "groupes.kmeans" qui compte les effectifs de chaque modalité pour chacune des classes kmeans :
groupes.kmeans <- loisirs %>%
  mutate(clust.kmeans=res.kmeans$cluster) %>%
  pivot_longer(-clust.kmeans,names_to="variable",values_to="modalite") %>%
  count(clust.kmeans,variable,modalite) %>%
  mutate(var_mod=str_c(variable,modalite)) %>%
  select(-variable,-modalite) %>%
  pivot_wider(names_from=var_mod,values_from=n) %>%
  mutate_if(is.integer,replace_na,0) %>%
  column_to_rownames(var="clust.kmeans")
3/ je réalise la CAH sur le tableau groupes.kmeans
res.cah <- HCPC(groupes.kmeans,nb.clust=-1,graph=F)
4/ et voilà ce que je fais pour associer ces classes CAH au tableau initial (loisirs) :
groupes.kmeans <- groupes.kmeans %>%
  mutate(clust.cah=res.cah$data.clust$clust) %>%
  rownames_to_column(var="clust.kmeans")
loisirs <- loisirs %>%
  mutate(clust.kmeans=as.character(res.kmeans$cluster)) %>%
  left_join(groupes.kmeans %>% select(clust.kmeans,clust.cah),by="clust.kmeans")

En espérant ne pas faire d'erreurs, et que ça puisse vous aider !

Aliette Roux, ingénieure PROGEDO-Loire, MSH Ange-Guépin

Pierre Anthony Garraud

unread,
May 25, 2023, 10:35:00 AM5/25/23
to factomin...@googlegroups.com
Bonjour Aliette Roux,
 j'apprecie beaucoup votre réponse détaillée et les lignes de codes que vous y avez insérés. je vais aussi essayer cette stratégie qui me parait tres efficace pour contourner les données volumineuses.
j'ai utilis é    trois algorithmes : 

  1.  la méthode PCAMIX de Kiers (1991), une méthode d’analyse en composantes principales pour une combinaison de variables quantitatives et qualitatives,;
  2.      Une classification de variables à l’aide du parquet ‘ClustOfVar » afin de regrouper ensemble les variables fortement liées entre elles et de résumer chaque classe de variables obtenue par une seule variable synthétique numérique ;
  3.   Le passage de la classification de variables à la typologie d’individus s’est opéré grâce à la méthode « partionning clustering » en utilisant l'algorithme 'CLARA"  sur le score des individus  obtenus a partir des variables synthetiques du point 2.


Merci



--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "FactoMineR users".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse factominer-use...@googlegroups.com.
Cette discussion peut être lue sur le Web à l'adresse https://groups.google.com/d/msgid/factominer-users/cba13df1-b546-40e0-8439-09077f9584e7n%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages