L’analyse de séquences : une introduction avec le logiciel R et le package TraMineR
Par Nicolas Robette1
Depuis les années 1980, l’étude quantitative des trajectoires biographiques (life course analysis) a pris une ampleur considérable dans le champ des sciences sociales. Les collectes de données micro-individuelles longitudinales se sont développées, principalement sous la forme de panels ou d’enquêtes rétrospectives. Parallèlement à cette multiplication des données disponibles, la méthodologie statistique a connu de profondes évolutions. L’analyse des biographies (event history analysis) – qui ajoute une dimension diachronique aux modèles économétriques mainstream – s’est rapidement imposée comme l’approche dominante : il s’agit de modéliser la durée des situations ou le risque d’occurrence des événements.
L’analyse de séquences
Cependant, ces dernières années ont vu la diffusion d’un large corpus de méthodes descriptives d’analyse de séquences, au sein desquelles l’appariement optimal (optimal matching) occupe une place centrale2. L’objectif principal de ces méthodes est d’identifier – dans la diversité d’un corpus de séquences constituées de séries d’états successifs – les régularités, les ressemblances, puis le plus souvent de construire des typologies de « séquences-types ». L’analyse de séquences constitue donc un moyen de décrire mais aussi de mieux comprendre le déroulement de divers processus.
La majeure partie des applications de l’analyse de séquences traite de trajectoires biographiques ou de carrières professionnelles. Dans ces cas, chaque trajectoire ou chaque carrière est décrite par une séquence, autrement dit par une suite chronologiquement ordonnée de « moments » élémentaires, chaque moment correspondant à un « état » déterminé de la trajectoire (par exemple, pour les carrières professionnelles : être en emploi, au chômage ou en inactivité). Mais on peut bien sûr imaginer des types de séquences plus originaux : Andrew Abbott, le sociologue américain qui a introduit l’optimal matching dans les sciences sociales dans les années 1980, s’en est par exemple servi pour étudier la structure rhétorique d’articles scientifiques ou des séquences de pas de danses traditionnelles.
En France, les premiers travaux utilisant l’appariement optimal sont ceux de Claire Lemercier sur les carrières des membres des institutions consulaires parisiennes au XIXe siècle (Lemercier, 2005), et de Laurent Lesnard sur les emplois du temps (Lesnard, 2008). Mais dès les années 1980, les chercheurs du Céreq construisaient des typologies de trajectoires d’insertion à l’aide des méthodes d’analyse des données « à la française » (analyse des correspondances, etc.)3. Au final, on dénombre maintenant plus d’une centaine d’articles de sciences sociales contenant ou discutant des techniques empruntées à l’analyse de séquences.
Pour une présentation des différentes méthodes d’analyse de séquences disponibles et de leur mise en œuvre pratique, il existe un petit manuel en français, publié l’année dernière aux éditions du Ceped (collection « Les clefs pour ») et disponible en pdf (Robette, 2011). De plus, un article récemment publié dans le Bulletin de Méthodologie Sociologique compare de manière systématique les résultats obtenus par les principales méthodes d’analyse de séquences (Robette & Bry, 2012). La conclusion en est qu’avec des données empiriques aussi structurées que celles que l’on utilise en sciences sociales, l’approche est robuste, c’est-à-dire qu’un changement de méthode aura peu d’influence sur les principaux résultats. Cependant, l’article tente aussi de décrire les spécificités de chaque méthode et les différences marginales qu’elles font apparaître, afin de permettre aux chercheurs de mieux adapter leurs choix méthodologiques à leur question de recherche.
Afin d’illustrer la démarche de l’analyse de séquences, nous allons procéder ici à la description « pas à pas » d’un corpus de carrières professionnelles, issues de l’enquête Biographies et entourage (INED, 2000)4. Et pour ce faire, on va utiliser le logiciel R, qui propose la solution actuellement la plus complète et la plus puissante en matière d’analyse de séquences.. Les méthodes d’analyse de séquences par analyses factorielles ou de correspondances ne nécessitent pas de logiciel spécifique : tous les logiciels de statistiques généralistes peuvent être utilisés (SAS, SPSS, STATA, R, etc.). En revanche, il n’existe pas de fonctions pour l’appariement optimal dans SAS ou SPSS. Certains logiciels gratuits implémentent l’appariement optimal (comme Chesa ou TDA) mais il faut alors recourir à d’autres programmes pour dérouler l’ensemble de l’analyse (classification, représentation graphique). STATA propose le module « sq », qui dispose d’un éventail de fonctions intéressantes. Mais c’est R et le package « TraMineR », développé par des collègues de l’Université de Genève (Gabadinho et al, 2011), qui fournit la solution la plus complète et la plus puissante à ce jour : on y trouve l’appariement optimal mais aussi d’autres algorithmes alternatifs, ainsi que de nombreuses fonctions de description des séquences et de représentation graphique. Le fait que R fonctionne avec un langage de programmation peut sembler dissuasif a priori, mais il existe des tutoriels très pédagogiques (voir notamment le billet de Julien Barnier sur ce même blog) et au final, quelques lignes de codes permettent de réaliser une analyse de séquences de sa première à sa dernière étape, d’en modifier les « réglages » et de recommencer presque instantanément, ce qui fait gagner beaucoup de temps. C’est ce que tente d’illustrer l’exemple qui suit.
Installer « TraMineR » et récupérer les données
Tout d’abord, à quoi ressemblent nos données ? On a reconstruit à partir de l’enquête les carrières de 1000 hommes. Pour chacune, on connaît la position professionnelle chaque année, de l’âge de 14 ans jusqu’à 50 ans. Cette position est codée de la manière suivante : les codes 1 à 6 correspondent aux groupes socioprofessionnels de la nomenclature des PCS de l’INSEE (agriculteurs exploitants ; artisans, commerçants et chefs d’entreprise ; cadres et professions intellectuelles supérieures ; professions intermédiaires ; employés ; ouvriers) ; on y a ajouté « études » (code 7), « inactivité » (code 8) et « service militaire » (code 9). Le fichier de données comporte une ligne par individu et une colonne par année : la variable 1 correspond à la position à 14 ans, la variable 2 à la position à 15 ans, etc. Par ailleurs, les enquêtés étant tous nés entre 1930 et 1950, on ajoute à notre base une variable « génération » à trois modalités, prenant les valeurs suivantes : 1=1930-1938 ; 2=1939-1945 ; 3=1946-1950. Au final, la base est constituée de 500 lignes et de 37+1=38 colonnes et se présente sous la forme d’un fichier texte au format .csv (téléchargeable ici).
Une fois R ouvert, on commence par installer les bibliothèques de fonctions (packages) nécessaires à ce programme (opération à ne réaliser que lors de leur première utilisation) et par les charger en mémoire5. Le package « TraMineR » propose de nombreuses fonctions pour l’analyse de séquences. Le package « cluster » comprend un certain nombre de méthodes de classification automatique.
> install.packages(c('TraMineR'))
> library(TraMineR)
> library(cluster)
On met en mémoire les paramètres graphiques par défaut :
> par.def <- par()
On importe ensuite les données, on recode la variable « génération » pour lui donner des labels plus explicites et on jette un coup d’œil à la structure du tableau de données :
> donnees<-read.csv("http://nicolas.robette.free.fr/Docs/trajpro.csv",header=T)
> donnees$generation <- factor(donnees$generation,labels=c('1930-38', '1939-45', '1946-50'))
> str(donnees)
On a bien 1000 observations et 38 variables. On définit maintenant des labels pour les différents états qui composent les séquences et on crée un objet « séquence » :
> labels <- c("agric","acce","cadr","pint","empl","ouvr","etud","inact","smil")
> seq <- seqdef(donnees[,1:37], states=labels)
Ces étapes préalables achevées, on peut comparer les séquences en calculant les dissimilarités entre paires de séquences. On va ici utiliser la méthode la plus répandue, l’appariement optimal (optimal matching). Cette méthode consiste, pour chaque paire de séquences, à compter le nombre minimal de modifications (substitutions, suppressions, insertions) qu’il faut faire subir à l’une des séquences pour obtenir l’autre. On peut considérer que chaque modification est équivalente, mais il est aussi possible de prendre en compte le fait que les « distances » entre les différents états n’ont pas toutes la même « valeur » (par exemple, la distance sociale entre emploi à temps plein et chômage est plus grande qu’entre emploi à temps plein et emploi à temps partiel), en assignant aux différentes modifications des « coûts » distincts. Dans notre exemple, on va créer une « matrice des coûts de substitution » dans laquelle tous les coûts sont constants et égaux à 26 :
> couts <- seqsubm(seq,method="CONSTANT", cval=2)
Ensuite, on calcule la matrice de distance entre les séquences (i.e contenant les « dissimilarités » entre les séquences), avec un coût d’insertion/suppression (indel) que l’on fixe ici à 1.1 :
> seq.om <- seqdist(seq, method="OM", indel=1.1, sm=couts)
Cette matrice des distances ou des dissimilarités entre séquences peut ensuite être utilisée pour une classification ascendante hiérarchique (CAH), qui permet de regrouper les séquences en un certain nombre de « classes » en fonction de leur proximité :
> seq.agnes <- agnes(as.dist(seq.om), method="ward", keep.diss=FALSE)
Avec la fonction plot, il est possible de tracer l’arbre de la classification (dendrogramme) :
> par(par.def)
> plot(as.dendrogram(seq.agnes), leaflab=”none”
L’observation, sur ce dendogramme ou sur la courbe des sauts d’inertie présentée ci-dessous, des sauts d’inertie des dernières étapes de la classification peut servir de guide pour déterminer le nombre de classes que l’on va retenir pour la suite des analyses :
> par(par.def)
> plot(sort(seq.agnes$height, decreasing=TRUE)[1:20], type=‘s’, xlab="nb de classes", ylab="inertie")
Une première inflexion dans la courbe des sauts d’inertie apparaît au niveau d’une partition en 5 classes (indiquée en rouge sur les deux graphiques précédents). On voit aussi une seconde inflexion assez nette à 7 classes (indiquée en vert). Mais il faut garder en tête le fait que ces outils ne sont que des guides, le choix devant avant tout se faire après différents essais, en fonction de l’intérêt des résultats par rapport à la question de recherche et en arbitrant entre exhaustivité et parcimonie.
On fait ici le choix d’une partition en 5 classes :
> nbcl <- 5
> seq.part <- cutree(seq.agnes, nbcl)
> seq.part <- factor(seq.part,labels=paste('classe',1:nbcl,sep='.'))
Pour se faire une première idée de la nature des classes de la typologie, il existe un certain nombre de représentations graphiques. Les chronogrammes (state distribution plots) présentent une série de coupes transversales : pour chaque âge, on a les proportions d’individus de la classe dans les différentes situations (agriculteur, étudiant, etc.).
> seqdplot(seq, group=seq.part, xtlab=14:50, border=NA, withlegend=T)
Chacune des classes semble caractérisée par un groupe professionnel principal : profession intermédiaire pour la classe 1, ouvrier pour la 2, employé pour la 3, cadre pour la 4 et indépendant pour la 5. Cependant, on aperçoit aussi des « couches » d’autres couleurs, indiquant que l’ensemble des carrières ne sont probablement pas stables.
Les « tapis » (index plots) permettent de mieux visualiser la dimension individuelle des séquences. Chaque segment horizontal représente une séquence, découpée en sous-segments correspondant aux aux différents états successifs qui composent la séquence.
> seqiplot(seq, group=seq.part, xtlab=14:50, tlim=0, space=0, border=NA, withlegend=T, yaxis=FALSE)
Il est possible de trier les séquences pour rendre les tapis plus lisibles (on trie ici par multidimensional scaling) :
> ordre <- cmdscale(as.dist(seq.om),k=1)
> seqiplot(seq, group=seq.part, sortv=ordre, xtlab=14:50, tlim=0, space=0, border=NA, withlegend=T, yaxis=FALSE)
On voit mieux apparaître ainsi l’hétérogénéité de certaines classes. Les classes 1, 3 et 4, par exemple, semblent regrouper des carrières relativement stables (respectivement de professions intermédiaires, d’employés et de cadres) et des carrières plus « mobiles » commencées comme ouvrier (classes 1 et 3, en orange) ou comme profession intermédiaire (classe 4, en rouge). De même, la majorité des membres de la dernière classe commencent leur carrière dans un groupe professionnel distinct de celui qu’ils occuperont par la suite (indépendants). Ces distinctions apparaissent d’ailleurs si on relance le programme avec un nombre plus élevé de classes (en remplaçant le « 5 » de la ligne « nbcl <- 5 » par « 7 », seconde inflexion de la courbe des sauts d’inertie, et en exécutant de nouveau le programme à partir de cette ligne) : les stables et les mobiles se trouvent alors dans des classes distinctes.
La distance moyenne des séquences d’une classe au centre de cette classe permet de mesurer plus précisément l’homogénéité des classes :
> round(aggregate(disscenter(as.dist(seq.om), group=seq.part), list(seq.part),mean)[,-1],1)
13.1 8.9 15.6 9.7 16.5
Cela nous confirme que les classes 1, 3 et 5 sont nettement plus hétérogènes que les autres, alors qua la classe 2 est la plus homogène.
D’autres représentations graphiques existent pour poursuivre l’examen de la typologie. On peut visualiser les 10 séquences les plus fréquentes de chaque classe :
> seqfplot(seq, group=seq.part, withlegend=T)
On peut aussi visualiser l’état modal (celui qui correspond au plus grand nombre de séquences de la classe) à chaque âge :
> seqmsplot(seq, group=seq.part, xtlab=14:50, withlegend=T, title="classe")
On peut également représenter les durées moyennes passées dans les différents états :
> seqmtplot(seq, group=seq.part, withlegend=T)
Enfin, l’entropie transversale décrit l’évolution de l’homogénéité de la classe. Pour un âge donné, une entropie proche de 0 signifie que tous les individus de la classe (ou presque) sont dans la même situation. A l’inverse, l’entropie est de 1 si les individus sont dispersés dans toutes les situations. Ce type de graphique peut être pratique pour localiser les moments de transition, l’insertion professionnelle ou une mobilité sociale ascendante, par exemple :
> seqHtplot(seq, group=seq.part, xtlab=14:50, withlegend=T)
On souhaite maintenant connaître la distribution de la typologie (en effectifs et en pourcentages) :
> distri.eff <- table(seq.part)
> distri.eff
> round(distri.eff/sum(distri.eff)*100,1)
seq.part
classe.1 classe.2 classe.3 classe.4 classe.5
280 199 114 341 66
seq.part
classe.1 classe.2 classe.3 classe.4 classe.5
28.0 19.9 11.4 34.1 6.6
On poursuit ensuite la description des classes en croisant la typologie avec la variable « generation » :
> round(100*prop.table(table(seq.part,donnees$generation),2),1)
> chisq.test(table(seq.part,donnees$generation))
seq.part 1930-38 1939-45 1946-50
classe.1 25.6 27.1 31.0
classe.2 20.9 20.0 18.9
classe.3 7.9 13.6 12.9
classe.4 38.2 31.9 32.1
classe.5 7.4 7.5 5.2
Pearson’s Chi-squared test
data: table(seq.part, donnees$generation[1:1000])
X-squared = 12.0319, df = 8, p-value = 0.1498
Le lien entre le fait d’avoir un certain type de carrières et la cohorte de naissance est significatif à un seuil de 15%. On constate par exemple l’augmentation continue de la proportion de carrières de type « professions intermédiaires » (classe 1) et, entre les deux cohortes les plus anciennes, l’augmentation de la part des carrières de type « employés » (classe 3) et la baisse de la part des carrières de type « cadres » (classe 4).
Bien d’autres analyses sont envisageables : croiser la typologie avec d’autres variables (origine sociale, etc.), construire l’espace des carrières possibles, étudier les interactions entre trajectoires familiales et professionnelles, analyser la variance des dissimilarités entre séquences en fonction de plusieurs variables « explicatives »7 … Mais l’exemple proposé est sans doute bien suffisant pour une première introduction !
Bibliographie
Abbott A., 2001, Time matters. On theory and method, The University of Chicago Press.
Abbott A., Hrycak A., 1990, « Measuring ressemblance in sequence data : an optimal matching analysis of musicians’ careers », American journal of sociology, (96), p.144-185. sur jstor
Abbott A., Tsay A., 2000, « Sequence analysis and optimal matching methods in sociology: Review and prospect », Sociological methods & research, 29(1), p.3-33. sur Sage
Gabadinho, A., Ritschard, G., Müller, N.S. & Studer, M., 2011, « Analyzing and visualizing state sequences in R with TraMineR », Journal of Statistical Software, 40(4), p.1-37. lien
Grelet Y., 2002, « Des typologies de parcours. Méthodes et usages », Document Génération 92, (20), 47 p. lien
Lelièvre É., Vivier G., 2001, « Évaluation d’une collecte à la croisée du quantitatif et du qualitatif : l’enquête Biographies et entourage », Population, (6), p.1043-1073. sur Persée
Lemercier C., 2005, « Les carrières des membres des institutions consulaires parisiennes au XIXe siècle », Histoire et mesure, XX (1-2), p.59-95. sur revues.org
Lesnard L., 2008, « Off-Scheduling within Dual-Earner Couples: An Unequal and Negative Externality for Family Time », American Journal of Sociology, 114(2), p.447-490. lien
Lesnard L., Saint Pol T. (de), 2006, « Introduction aux Méthodes d’Appariement Optimal (Optimal Matching Analysis) » Bulletin de Méthodologie Sociologique, 90, p.5-25. sur revues.org
Robette N., 2011, Explorer et décrire les parcours de vie: les typologies de trajectoires, CEPED (Les Clefs pour), 86 p. lien
Robette N., 2012, « Du prosélytisme à la sécularisation. Le processus de diffusion de l’Optimal Matching Analysis », document de travail. lien
Robette N., Bry X., 2012, « Harpoon or bait? A comparison of various metrics to fish for life course patterns », Bulletin de Méthodologie Sociologique, 116, p.5-24. sur Sage (draft disponible ici)
Robette N., Thibault N., 2008, « L’analyse exploratoire de trajectoires professionnelles: analyse harmonique qualitative ou appariement optimal? », Population-F, 64(3), p.621-646. sur Cairn
Savage M., 2009, « Contemporary Sociology and the Challenge of Descriptive Assemblage », European Journal of Social Theory, 12(1), p.155-174. sur Sage
- Maître de conférences à l’Université de Versailles Saint-Quentin-en-Yvelines. Adresse électronique : nicolas.robette[arobase]uvsq.fr. [↩]
- Pour une analyse des conditions sociales de la diffusion de l’analyse de séquences dans le champ des sciences sociales, voir Robette, 2012. [↩]
- Voir par exemple l’article d’Yvette Grelet (2002). [↩]
- Pour une analyse plus poussée de ces données, avec deux méthodes différentes, voir Robette & Thibault, 2008. Pour une présentation de l’enquête, voir Lelièvre & Vivier, 2001. [↩]
- Le programme R avec l
’’ensemble des lignes de code présentées dans cet exemple est disponible ici. [↩] - le fonctionnement de l’algorithme d’appariement optimal – et notamment le choix des coûts – est décrit dans le chapitre 3 du manuel. [↩]
- L’articulation entre méthodes « descriptives » et méthodes « explicatives » est un prolongement possible de l’analyse de séquences, ce que j’avais d’ailleurs écrit dans la conclusion du manuel. Cependant, l’analyse de séquences était envisagée par Abbott comme une alternative à la sociologie quantitative mainstream, i.e le « paradigme des variables » et ses hypothèses implicites souvent difficilement tenables (Abbott, 2001), et je souscris maintenant totalement au fait qu’une bonne description solidement fondée théoriquement vaut bien des « modèles explicatifs » (Savage, 2009). [↩]
OpenEdition vous propose de citer ce billet de la manière suivante :
Nicolas Robette (24 octobre 2012). L’analyse de séquences : une introduction avec le logiciel R et le package TraMineR. QUANTI / Sciences sociales. Consulté le 9 octobre 2024 à l’adresse https://doi.org/10.58079/t4av
Bravo et merci Nicolas !
En complément, à noter un autre tout récent tutoriel en français, tout aussi excellent (avec un exemple sur, au contraire, une petite base de données, histoire oblige…). C’est dans un livre en papier mais il y a des compléments en ligne sur le site de Jacques Cellier [toutefois en rade à la minute où j’écris]. Voir http://www.pur-editions.fr/detail.php?idOuv=2964
Merci pour cette excellente introduction à TraMineR.
Pour ceux que ça peut intéresser, une petite astuce pour représenter tapis et dendrogramme sur le même graphique, le tapis étant alors trié selon le dendrogramme.
Voir http://joseph.larmarange.net/?Representer-un-tapis-de-sequences
Bonjour
merci pour cette page. Moi j’ai un autre souci.
Je vous explique mon problème. (je précise je débute sur R)
Je pars d’un fichier dans lequel j’ai pu utiliser traminer, afin de savoir les parcours, séquences professionnelles les plus utilisées pour arriver à une équipe clef (variable=typepostefinal), je pars des 7 positions de job (POSN (actuel) à POSN7 (jusqu’à 8e poste avant) que les personnes avaient. Certaines n’en ayant que 2 ou 3.
J’ai eu mes séquences les plus fréquentes, ainsi que mes sous-séquences.
Cependant maintenant il faut que je généralise ce que j’ai pu faire pour 270 équipes clef (toujours la même variable=typepostefinal).
Comment puis m’y prendre?
Merci pour vos retours .
Il m’est vraiment difficile de vous répondre sans avoir une vue plus précise de vos données et de ce que vous voulez en faire. Si votre problème persiste, contactez moi par mail.
Il y a un problème lorsque je veux exécuter cette ligne :
> seq labels seq <- seqdef(donnees[,1:37], states=labels)
Erreur : impossible de trouver la fonction "seqdef"
Merci par avance pour votre retour.
Carole.
Si la fonction n’est pas trouvée, c’est probablement que le package “TraMineR” n’est pas correctement installé ou qu’il n’a pas été chargé en mémoire [avec l’instruction suivante: library(TraMineR) ].