{"id":3545,"date":"2026-10-14T18:01:03","date_gmt":"2026-10-14T18:01:03","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-utiliser-fonction-pandas-value-counts-avec-exemples\/"},"modified":"2026-10-14T18:01:03","modified_gmt":"2026-10-14T18:01:03","slug":"comment-utiliser-fonction-pandas-value-counts-avec-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-utiliser-fonction-pandas-value-counts-avec-exemples","title":{"rendered":"Comment utiliser la fonction value_counts() de Pandas (avec exemples)"},"content":{"rendered":"<p>Dans le paysage contemporain de la science des donn\u00e9es et de l&rsquo;ing\u00e9nierie analytique, la biblioth\u00e8que <a rel=\"noopener noreferrer\" href=\"https:\/\/pandas.pydata.org\/\">Pandas<\/a> s&rsquo;est impos\u00e9e comme le standard computationnel pr\u00e9\u00e9minent pour la manipulation, le nettoyage et l&rsquo;exploration de donn\u00e9es tabulaires en langage Python. Au sein de cette bo\u00eete \u00e0 outils algorithmique, l&rsquo;\u00e9tape initiale et incontournable de tout protocole de recherche empirique demeure l&rsquo;analyse exploratoire des donn\u00e9es (Exploratory Data Analysis ou EDA). Cette phase critique exige des instruments \u00e0 la fois v\u00e9loces, d\u00e9terministes et expressifs, capables de r\u00e9sumer la structure sous-jacente des variables observ\u00e9es sans alt\u00e9rer l&rsquo;int\u00e9grit\u00e9 de l&rsquo;information brute. La m\u00e9thode <code>value_counts()<\/code> incarne pr\u00e9cis\u00e9ment cette convergence entre rigueur statistique univari\u00e9e et efficience informatique vectoris\u00e9e.<\/p>\n<p>Con\u00e7ue originellement comme une m\u00e9thode applicable aux objets de type <code>Series<\/code>, avant d&rsquo;\u00eatre \u00e9tendue aux structures multidimensionnelles de type <code>DataFrame<\/code>, la fonction <code>value_counts()<\/code> permet d&rsquo;extraire la distribution empirique des fr\u00e9quences d&rsquo;un vecteur de donn\u00e9es discr\u00e8tes ou cat\u00e9gorielles. Qu&rsquo;il s&rsquo;agisse de mesurer la pr\u00e9valence d&rsquo;un sympt\u00f4me clinique dans un essai randomis\u00e9, d&rsquo;\u00e9valuer la distribution des modalit\u00e9s de r\u00e9ponses \u00e0 une \u00e9chelle psychom\u00e9trique ordonn\u00e9e, ou de d\u00e9tecter d&rsquo;\u00e9ventuels d\u00e9s\u00e9quilibres d&rsquo;\u00e9chantillonnage au sein d&rsquo;une cohorte sociologique, cette fonction condense en un seul appel optimis\u00e9 en langage C\/Cython une s\u00e9quence complexe d&rsquo;op\u00e9rations de hachage, d&rsquo;agr\u00e9gation et de tri hi\u00e9rarchique.<\/p>\n<p>Le pr\u00e9sent trait\u00e9 constitue un examen exhaustif et didactique de la m\u00e9thode <code>value_counts()<\/code> de Pandas. Con\u00e7u pour les chercheurs, statisticiens et ing\u00e9nieurs de donn\u00e9es exigeants, ce guide explore en profondeur la signature algorithmique de la fonction, la m\u00e9canique sous-jacente de ses param\u00e8tres op\u00e9rationnels, ainsi que ses implications th\u00e9oriques et pratiques dans la gestion des valeurs manquantes, la normalisation probabiliste, la discr\u00e9tisation continue et le croisement multivari\u00e9. \u00c0 travers des cas d&rsquo;\u00e9tudes appliqu\u00e9s aux sciences comportementales et \u00e0 la psychologie exp\u00e9rimentale, nous expliciterons comment exploiter cette fonction de mani\u00e8re optimale tout en d\u00e9jouant les pi\u00e8ges m\u00e9thodologiques inh\u00e9rents \u00e0 l&rsquo;interpr\u00e9tation des fr\u00e9quences observ\u00e9es.<\/p>\n<h2>1. Introduction th\u00e9orique et r\u00f4le de value_counts() dans l&rsquo;analyse exploratoire des donn\u00e9es<\/h2>\n<h3>1.1 D\u00e9finition formelle et utilit\u00e9 fondamentale en statistique descriptive<\/h3>\n<p>D&rsquo;un point de vue purement formel et math\u00e9matique, la m\u00e9thode <code>Series.value_counts()<\/code> op\u00e8re comme un op\u00e9rateur d&rsquo;agr\u00e9gation statistique univari\u00e9e d\u00e9di\u00e9 aux variables qualitatives (nominales ou ordinales) ainsi qu&rsquo;aux variables quantitatives discr\u00e8tes. Soit un vecteur d&rsquo;observations fini not\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"X = (x_1, x_2, dots, x_n)\">$X = (x_1, x_2, dots, x_n)$<\/span> comprenant <span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span> r\u00e9alisations empiriques issues d&rsquo;un univers statistique <span class=\"arabpsy-math-inline\" data-latex=\"U\">$U$<\/span>. L&rsquo;ensemble des modalit\u00e9s uniques distinctes observables au sein de ce vecteur est d\u00e9sign\u00e9 par l&rsquo;ensemble quotient <span class=\"arabpsy-math-inline\" data-latex=\"K = {k_1, k_2, dots, k_m}\">$K = {k_1, k_2, dots, k_m}$<\/span>, o\u00f9 <span class=\"arabpsy-math-inline\" data-latex=\"m le n\">$m le n$<\/span> repr\u00e9sente la cardinalit\u00e9 exacte de la s\u00e9rie. La fonction <code>value_counts()<\/code> a pour finalit\u00e9 computationnelle de construire l&rsquo;application qui, \u00e0 chaque modalit\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"k_j in K\">$k_j in K$<\/span>, associe son effectif absolu ou fr\u00e9quence absolue, d\u00e9finie math\u00e9matiquement par la mesure de comptage :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"n_j = \\sum_{i=1}^n \\mathbb{I}(x_i = k_j)\">$$n_j = \\sum_{i=1}^n \\mathbb{I}(x_i = k_j)$$<\/span><\/p>\n<p>Dans cette formulation, <span class=\"arabpsy-math-inline\" data-latex=\"\\mathbb{I}\">$\\mathbb{I}$<\/span> d\u00e9signe la fonction indicatrice bool\u00e9enne classique, laquelle prend la valeur 1 lorsque la condition d&rsquo;\u00e9galit\u00e9 est rigoureusement satisfaite, et 0 dans le cas contraire. L&rsquo;importance fondamentale de ce d\u00e9nombrement empirique au cours de la phase d&rsquo;inspection pr\u00e9liminaire des jeux de donn\u00e9es ne saurait \u00eatre sous-estim\u00e9e. D\u00e8s la r\u00e9ception d&rsquo;un tableau de donn\u00e9es non \u00e9pur\u00e9, le statisticien doit imp\u00e9rativement appr\u00e9hender la variabilit\u00e9 interne de ses variables. L&rsquo;examen des fr\u00e9quences brutes constitue la premi\u00e8re ligne de d\u00e9fense contre les erreurs d&rsquo;acquisition, les artefacts de transcription et les d\u00e9rives d&rsquo;\u00e9chantillonnage.<\/p>\n<p>Cette d\u00e9marche permet notamment d&rsquo;identifier la cardinalit\u00e9 r\u00e9elle d&rsquo;un vecteur, c&rsquo;est-\u00e0-dire le nombre de niveaux effectifs adopt\u00e9s par une variable. Une telle v\u00e9rification r\u00e9v\u00e8le sans ambigu\u00eft\u00e9 des divergences structurelles majeures, telles que l&rsquo;existence de modalit\u00e9s inattendues provoqu\u00e9es par une casse inconsistante (par exemple, l&rsquo;apparition conjointe de libell\u00e9s tels que \u00ab Contr\u00f4le \u00bb, \u00ab contr\u00f4le \u00bb et \u00ab CONTROLE \u00bb) ou l&rsquo;insertion erron\u00e9e de codes num\u00e9riques sentinelles au sein de s\u00e9ries cens\u00e9es \u00eatre alphab\u00e9tiques. En outre, la dispersion des effectifs met imm\u00e9diatement en exergue la pr\u00e9sence d&rsquo;un d\u00e9s\u00e9quilibre de classes (class imbalance). Dans les applications d&rsquo;apprentissage automatique supervis\u00e9 et de r\u00e9gression logistique, d\u00e9tecter pr\u00e9cocement qu&rsquo;une classe d&rsquo;int\u00e9r\u00eat ne repr\u00e9sente qu&rsquo;une fraction marginale (par exemple moins de 2 % de l&rsquo;\u00e9chantillon global) conditionne enti\u00e8rement le choix ult\u00e9rieur des m\u00e9triques d&rsquo;\u00e9valuation, n\u00e9cessitant le basculement d&rsquo;une simple exactitude globale vers des mesures d&rsquo;aire sous la courbe ROC ou de score F-b\u00eata ajust\u00e9.<\/p>\n<h3>1.2 Pertinence dans la recherche empirique et comportementale<\/h3>\n<p>Dans les champs disciplinaires de la recherche empirique, des neurosciences cognitives et des sciences du comportement, la m\u00e9thode <code>value_counts()<\/code> constitue la cheville ouvri\u00e8re du d\u00e9pouillement quantitatif des protocoles exp\u00e9rimentaux. Lorsque des participants sont soumis \u00e0 des batteries de questionnaires standardis\u00e9s int\u00e9grant des \u00e9chelles de Likert ou des choix forc\u00e9s dichotomiques, la quantification imm\u00e9diate de la distribution des r\u00e9ponses permet de v\u00e9rifier la validit\u00e9 apparente des instruments de mesure. Elle offre aux psychom\u00e8tres la capacit\u00e9 de rep\u00e9rer des effets de plancher (floor effects) ou des effets de plafond (ceiling effects), o\u00f9 une proportion \u00e9crasante des r\u00e9pondants s\u00e9lectionne syst\u00e9matiquement l&rsquo;extr\u00e9mit\u00e9 inf\u00e9rieure ou sup\u00e9rieure de l&rsquo;\u00e9chelle gradu\u00e9e, signalant une insensibilit\u00e9 m\u00e9trologique de l&rsquo;item \u00e9tudi\u00e9.<\/p>\n<p>Par ailleurs, au sein des plans factoriels inter-sujets ou mixtes, l&rsquo;\u00e9valuation de la r\u00e9partition effective des participants au travers des diff\u00e9rentes conditions exp\u00e9rimentales s&rsquo;av\u00e8re critique. Bien que la randomisation th\u00e9orique vise une assignation \u00e9quilibr\u00e9e des sujets au sein des bras de test (par exemple, groupe contr\u00f4le versus groupe recevant une intervention cognitive sp\u00e9cifique), des d\u00e9fections en cours de protocole, des crit\u00e8res d&rsquo;exclusion a posteriori ou des biais d&rsquo;attrition diff\u00e9rentielle induisent fr\u00e9quemment des disparit\u00e9s d&rsquo;effectifs. L&rsquo;usage m\u00e9thodique de <code>value_counts()<\/code> documente de mani\u00e8re transparente ces asym\u00e9tries et guide l&rsquo;arbitrage entre des analyses de variance (ANOVA) pour plans \u00e9quilibr\u00e9s et des mod\u00e8les lin\u00e9aires g\u00e9n\u00e9raux \u00e0 effets mixtes sp\u00e9cifiquement adapt\u00e9s aux matrices d\u00e9s\u00e9quilibr\u00e9es.<\/p>\n<p>L&rsquo;exploration de l&rsquo;homog\u00e9n\u00e9it\u00e9 d\u00e9mographique au sein des cohortes constitue un autre volet central d&rsquo;application. L&rsquo;examen minutieux des distributions des variables nominales (sexe biologique, appartenance cat\u00e9gorielle, statut socioprofessionnel) et ordinales (niveau d&rsquo;\u00e9tudes, tranches de revenus) \u00e9claire le degr\u00e9 de repr\u00e9sentativit\u00e9 de l&rsquo;\u00e9chantillon extrait par rapport \u00e0 la population cible parente. Enfin, sur le plan des statistiques de tendance centrale pour variables non m\u00e9triques, la modalit\u00e9 dominante mise en \u00e9vidence par le premier rang de <code>value_counts()<\/code> fournit directement le mode empirique de la distribution, offrant ainsi un indice synth\u00e9tique indispensable pour caract\u00e9riser les tendances typiques d&rsquo;un comportement social ou psychologique.<\/p>\n<h3>1.3 Comparaison conceptuelle avec d&rsquo;autres approches algorithmiques<\/h3>\n<p>L&rsquo;\u00e9cosyst\u00e8me du langage Python et les syst\u00e8mes de gestion de bases de donn\u00e9es relationnelles proposent de multiples m\u00e9canismes algorithmiques destin\u00e9s \u00e0 agr\u00e9ger des collections d&rsquo;\u00e9l\u00e9ments. Il convient d&rsquo;analyser la sp\u00e9cificit\u00e9 computationnelle de <code>value_counts()<\/code> en la contrastant avec les alternatives courantes que sont l&rsquo;objet <code>collections.Counter<\/code> de la biblioth\u00e8que standard Python et la clause d\u00e9clarative <code>GROUP BY COUNT(*)<\/code> du langage formel SQL.<\/p>\n<p>L&rsquo;objet <code>collections.Counter<\/code> proc\u00e8de par it\u00e9ration s\u00e9quentielle pure au niveau de l&rsquo;interpr\u00e9teur Python. Bien que performant pour des structures de donn\u00e9es natives (listes, tuples), il traite les \u00e9l\u00e9ments via une boucle d&rsquo;\u00e9valuation d&rsquo;instructions bytecode qui souffre d&rsquo;un surco\u00fbt d&rsquo;encapsulation (overhead) substantiel pour chaque objet \u00e9valu\u00e9. Chaque valeur doit \u00eatre extraite sous forme d&rsquo;objet Python ind\u00e9pendant, hach\u00e9e via la m\u00e9thode interne <code>__hash__()<\/code>, puis ins\u00e9r\u00e9e dans une table de hachage g\u00e9n\u00e9rique. \u00c0 l&rsquo;inverse, <code>value_counts()<\/code> d\u00e9l\u00e8gue l&rsquo;int\u00e9gralit\u00e9 du traitement d&rsquo;agr\u00e9gation aux routines vectoris\u00e9es de bas niveau \u00e9crites en C et en Cython. Les structures de m\u00e9moire contigu\u00ebs typiques des tableaux NumPy sous-jacents aux s\u00e9ries Pandas permettent d&rsquo;exploiter les m\u00e9canismes de vectorisation du processeur et d&rsquo;optimiser l&rsquo;utilisation de la m\u00e9moire cache L1\/L2, conduisant \u00e0 des gains de vitesse d&rsquo;ex\u00e9cution atteignant souvent un ou deux ordres de grandeur sur des jeux de donn\u00e9es comportant plusieurs millions de lignes.<\/p>\n<p>En comparaison avec une clause SQL de type <code>SELECT variable, COUNT(*) FROM table GROUP BY variable ORDER BY count DESC<\/code>, l&rsquo;avantage de <code>value_counts()<\/code> r\u00e9side dans sa localisation en m\u00e9moire vive (in-memory analytics) et son int\u00e9gration sans couture avec l&rsquo;ensemble des structures analytiques de Pandas. Contrairement \u00e0 un moteur relationnel qui impose une s\u00e9rialisation r\u00e9seau, un verrouillage potentiel de tables et la compilation d&rsquo;un plan d&rsquo;ex\u00e9cution formel, <code>value_counts()<\/code> s&rsquo;ex\u00e9cute de mani\u00e8re synchrone et produit instantan\u00e9ment un objet r\u00e9exploitable pour des calculs d&rsquo;alg\u00e8bre lin\u00e9aire ou des repr\u00e9sentations graphiques vectorielles.<\/p>\n<p>Enfin, vis-\u00e0-vis de la m\u00e9thode g\u00e9n\u00e9rique <code>describe()<\/code> de Pandas, la compl\u00e9mentarit\u00e9 est manifeste. Lorsqu&rsquo;elle est appliqu\u00e9e \u00e0 une colonne textuelle ou cat\u00e9gorielle, <code>describe()<\/code> ne d\u00e9livre qu&rsquo;un aper\u00e7u r\u00e9ducteur compos\u00e9 de quatre m\u00e9triques : l&rsquo;effectif total non nul (<code>count<\/code>), le nombre de modalit\u00e9s uniques (<code>unique<\/code>), la modalit\u00e9 la plus fr\u00e9quente (<code>top<\/code>) et sa fr\u00e9quence brute (<code>freq<\/code>). L&rsquo;appel \u00e0 <code>value_counts()<\/code> d\u00e9ploie l&rsquo;int\u00e9gralit\u00e9 du spectre distributionnel de la s\u00e9rie, exposant non pas seulement l&rsquo;\u00e9l\u00e9ment sommital, mais la totalit\u00e9 de la structure de dispersion empirique.<\/p>\n<h2>2. Syntaxe fondamentale, signature et param\u00e8tres de la m\u00e9thode<\/h2>\n<h3>2.1 D\u00e9composition de la signature officielle de la m\u00e9thode<\/h3>\n<p>L&rsquo;architecture technique de la m\u00e9thode repose sur une signature rigoureusement standardis\u00e9e au sein du code source de la biblioth\u00e8que Pandas. La signature canonique de la m\u00e9thode au niveau de l&rsquo;objet <code>Series<\/code> se pr\u00e9sente sous la forme suivante :<\/p>\n<p><code>Series.value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True)<\/code><\/p>\n<p>Chacun de ces arguments formels a \u00e9t\u00e9 m\u00e9ticuleusement param\u00e9tr\u00e9 afin d&rsquo;offrir par d\u00e9faut le comportement analytique le plus fr\u00e9quemment sollicit\u00e9 en pratique, tout en pr\u00e9servant une modularit\u00e9 totale :<\/p>\n<ul>\n<li><strong>normalize<\/strong> (bool\u00e9en, valeur par d\u00e9faut : <code>False<\/code>) : lorsqu&rsquo;il est instanci\u00e9 \u00e0 <code>True<\/code>, la m\u00e9thode divise chaque effectif absolu par la somme globale des d\u00e9comptes valides, retournant ainsi des fr\u00e9quences relatives (ou proportions) dont la somme est unitaire.<\/li>\n<li><strong>sort<\/strong> (bool\u00e9en, valeur par d\u00e9faut : <code>True<\/code>) : r\u00e9git l&rsquo;application d&rsquo;un tri syst\u00e9matique sur les r\u00e9sultats calcul\u00e9s. Par d\u00e9faut, la s\u00e9rie r\u00e9sultante est ordonn\u00e9e selon l&rsquo;importance num\u00e9rique des fr\u00e9quences observ\u00e9es.<\/li>\n<li><strong>ascending<\/strong> (bool\u00e9en, valeur par d\u00e9faut : <code>False<\/code>) : gouverne la direction de l&rsquo;ordonnancement lorsque <code>sort=True<\/code>. La configuration par d\u00e9faut assure un tri descendant (de la modalit\u00e9 la plus fr\u00e9quente \u00e0 la plus rare), tandis que sa permutation \u00e0 <code>True<\/code> applique un ordre strictement ascendant.<\/li>\n<li><strong>bins<\/strong> (entier ou s\u00e9quence scalaire, optionnel, valeur par d\u00e9faut : <code>None<\/code>) : applicable exclusivement aux donn\u00e9es de nature num\u00e9rique continue ou discr\u00e8te. Cet argument instruit l&rsquo;algorithme de proc\u00e9der pr\u00e9alablement \u00e0 une discr\u00e9tisation par segmentation en classes contigu\u00ebs.<\/li>\n<li><strong>dropna<\/strong> (bool\u00e9en, valeur par d\u00e9faut : <code>True<\/code>) : d\u00e9termine le traitement r\u00e9serv\u00e9 aux marqueurs d&rsquo;absence de donn\u00e9es (<code>np.nan<\/code>, <code>pd.NA<\/code>, <code>None<\/code>). Par d\u00e9faut, ces valeurs ind\u00e9termin\u00e9es sont exclues de l&rsquo;agr\u00e9gation, ce qui pr\u00e9sente des implications m\u00e9thodologiques critiques que nous d\u00e9taillerons ult\u00e9rieurement.<\/li>\n<\/ul>\n<p>Dans les versions modernes de Pandas (notamment depuis l&rsquo;av\u00e8nement des branches 1.x et 2.x), l&rsquo;interfa\u00e7age de ces param\u00e8tres respecte les conventions strictes de typage Python (type hinting), garantissant que le non-respect des types attendus (par exemple transmettre une cha\u00eene de caract\u00e8res \u00e0 l&rsquo;argument <code>normalize<\/code>) d\u00e9clenche imm\u00e9diatement une exception explicite de type <code>TypeError<\/code> ou <code>ValueError<\/code> lors de la phase de validation des arguments.<\/p>\n<h3>2.2 Types de donn\u00e9es pris en charge et structures d&rsquo;entr\u00e9e<\/h3>\n<p>La robustesse computationnelle de <code>value_counts()<\/code> se manifeste dans son ubiquit\u00e9 typologique : elle est capable de traiter virtuellement l&rsquo;ensemble des types de donn\u00e9es (dtypes) pris en charge par le moteur de Pandas. En premier lieu, elle excelle dans la prise en charge des colonnes textuelles, qu&rsquo;elles soient mod\u00e9lis\u00e9es sous l&rsquo;ancien type g\u00e9n\u00e9rique <code>object<\/code> (reposant sur des pointeurs de cha\u00eenes Python) ou sous le nouveau type d\u00e9di\u00e9 <a rel=\"noopener noreferrer\" href=\"https:\/\/pandas.pydata.org\/docs\/user_guide\/text.html\">StringDtype<\/a> introduit pour pallier les inefficiences de m\u00e9moire.<\/p>\n<p>En second lieu, les variables factorielles d\u00e9clar\u00e9es sous le type formel <code>CategoricalDtype<\/code> font l&rsquo;objet d&rsquo;un traitement sp\u00e9cialis\u00e9 hautement optimis\u00e9. L&rsquo;existence d&rsquo;une table interne r\u00e9pertoriant exhaustivement les cat\u00e9gories autoris\u00e9es modifie substantiellement le comportement algorithmique de la m\u00e9thode. Dans ce contexte pr\u00e9cis, la fonction est capable de pr\u00e9server les modalit\u00e9s th\u00e9oriquement possibles mais empiriquement non observ\u00e9es dans l&rsquo;\u00e9chantillon, leur assignant un d\u00e9compte d&rsquo;occurrences rigoureusement nul lorsque les param\u00e8tres ad\u00e9quats sont mobilis\u00e9s.<\/p>\n<p>En troisi\u00e8me lieu, les colonnes num\u00e9riques, qu&rsquo;elles soient constitu\u00e9es d&rsquo;entiers sign\u00e9s ou non (<code>int8<\/code>, <code>int16<\/code>, <code>int32<\/code>, <code>int64<\/code>) ou de nombres en virgule flottante (<code>float32<\/code>, <code>float64<\/code>), sont trait\u00e9es sans d\u00e9gradation de pr\u00e9cision. Enfin, la m\u00e9thode d\u00e9montre une remarquable fiabilit\u00e9 sur les types temporels et calendaires, tels que les s\u00e9ries temporelles index\u00e9es sous <code>DatetimeIndex<\/code> ou les colonnes de type <code>datetime64[ns]<\/code> et <code>Timedelta<\/code>. Les \u00e9v\u00e9nements chronologiques discrets peuvent ainsi \u00eatre d\u00e9nombr\u00e9s avec une granularit\u00e9 temporelle absolue, permettant de rep\u00e9rer la concentration temporelle de certains ph\u00e9nom\u00e8nes exp\u00e9rimentaux.<\/p>\n<h3>2.3 Structure et indexation de l&rsquo;objet retourn\u00e9<\/h3>\n<p>La compr\u00e9hension fine de l&rsquo;architecture structurelle de l&rsquo;objet produit par <code>value_counts()<\/code> est indispensable pour automatiser son exploitation au sein de pipelines de traitement complexes. La m\u00e9thode ne retourne jamais un tableau brut ou une simple liste, mais un objet formel de type <code>pd.Series<\/code> dot\u00e9 de propri\u00e9t\u00e9s g\u00e9om\u00e9triques et m\u00e9tadonn\u00e9es pr\u00e9cises.<\/p>\n<p>Dans cet objet r\u00e9sultant, les valeurs observables primitives (les modalit\u00e9s d\u00e9nombr\u00e9es) subissent une translation fonctionnelle majeure : elles sont extraites de l&rsquo;espace des donn\u00e9es vectorielles pour \u00eatre transf\u00e9r\u00e9es directement au niveau de l&rsquo;index de la nouvelle <code>Series<\/code>. Cet index de sortie peut adopter diverses formes selon la nature de la variable source, allant d&rsquo;un <code>Index<\/code> g\u00e9n\u00e9rique textuel \u00e0 un <code>Int64Index<\/code>, un <code>CategoricalIndex<\/code> ou un <code>IntervalIndex<\/code> lorsque le param\u00e8tre de discr\u00e9tisation a \u00e9t\u00e9 activ\u00e9. Les valeurs associ\u00e9es port\u00e9es par cette nouvelle s\u00e9rie repr\u00e9sentent exclusivement les effectifs calcul\u00e9s (ou les proportions relatives). Par d\u00e9faut, ces valeurs sont typ\u00e9es sous la forme d&rsquo;entiers 64 bits standardis\u00e9s (<code>int64<\/code>), garantissant l&rsquo;absence de d\u00e9bordement arithm\u00e9tique m\u00eame face \u00e0 des collections de donn\u00e9es colossales approchant les milliards d&rsquo;enregistrements.<\/p>\n<p>Sur le plan des m\u00e9tadonn\u00e9es, l&rsquo;index h\u00e9rite du nom de la colonne initiale (propri\u00e9t\u00e9 <code>name<\/code>), tandis que la s\u00e9rie de sortie est g\u00e9n\u00e9ralement d\u00e9pourvue de nommage conflictuel ou adopte le nom contextuel assign\u00e9 lors des r\u00e9cents ajustements d&rsquo;API de Pandas. Cette organisation topologique conf\u00e8re une puissance analytique remarquable : l&rsquo;utilisateur peut interroger le r\u00e9sultat indiff\u00e9remment par \u00e9tiquette de modalit\u00e9 via l&rsquo;accesseur <code>.loc[]<\/code>, ou par rang d&rsquo;importance fr\u00e9quentielle via l&rsquo;accesseur positionnel <code>.iloc[]<\/code>.<\/p>\n<h2>3. D\u00e9nombrement basique des valeurs uniques dans une Series Pandas<\/h2>\n<h3>3.1 Instanciation d&rsquo;une Series et calcul des occurrences brutes<\/h3>\n<p>Pour illustrer de mani\u00e8re concr\u00e8te et didactique le fonctionnement intrins\u00e8que de la m\u00e9thode, consid\u00e9rons la mise en place d&rsquo;une s\u00e9rie unidimensionnelle simulant les r\u00e9ponses qualitatives d&rsquo;un groupe d&rsquo;individus soumis \u00e0 un protocole d&rsquo;\u00e9valuation sensorielle. Douze sujets expriment leur pr\u00e9f\u00e9rence parmi quatre options nominales discr\u00e8tes : \u00ab Modalit\u00e9 A \u00bb, \u00ab Modalit\u00e9 B \u00bb, \u00ab Modalit\u00e9 C \u00bb et \u00ab Modalit\u00e9 D \u00bb. Le vecteur exp\u00e9rimental s&rsquo;instancie traditionnellement \u00e0 l&rsquo;aide du constructeur fondamental de Pandas :<\/p>\n<p>Dans un contexte d&rsquo;ex\u00e9cution r\u00e9el, le code Python s&rsquo;articule comme suit :<\/p>\n<pre><code>import pandas as pd\nimport numpy as np\n\nreponses_sensorielles = pd.Series([\n    \"Modalit\u00e9 A\", \"Modalit\u00e9 B\", \"Modalit\u00e9 A\", \"Modalit\u00e9 C\", \n    \"Modalit\u00e9 A\", \"Modalit\u00e9 B\", \"Modalit\u00e9 D\", \"Modalit\u00e9 A\", \n    \"Modalit\u00e9 C\", \"Modalit\u00e9 B\", \"Modalit\u00e9 A\", \"Modalit\u00e9 B\"\n], name=\"Evaluation\")\n\neffectifs = reponses_sensorielles.value_counts()\n<\/code><\/pre>\n<p>L&rsquo;ex\u00e9cution de cette commande produit la distribution ordonn\u00e9e des effectifs bruts. L&rsquo;examen du tableau r\u00e9sultant r\u00e9v\u00e8le imm\u00e9diatement la hi\u00e9rarchie empirique des choix exprim\u00e9s. La \u00ab Modalit\u00e9 A \u00bb \u00e9merge au premier rang avec un total de 5 occurrences, suivie imm\u00e9diatement par la \u00ab Modalit\u00e9 B \u00bb totalisant 4 s\u00e9lections, la \u00ab Modalit\u00e9 C \u00bb avec 2 s\u00e9lections, et enfin la \u00ab Modalit\u00e9 D \u00bb qui ne recueille qu&rsquo;un unique suffrage.<\/p>\n<p>Une r\u00e8gle \u00e9l\u00e9mentaire de validation analytique consiste \u00e0 v\u00e9rifier la conservation de la masse des donn\u00e9es. La somme int\u00e9grale des \u00e9l\u00e9ments composant la s\u00e9rie retourn\u00e9e, obtenue par l&rsquo;appel vectoris\u00e9 <code>effectifs.sum()<\/code>, doit obligatoirement co\u00efncider avec la longueur initiale du vecteur d&rsquo;entr\u00e9e d\u00e9termin\u00e9e par <code>len(reponses_sensorielles)<\/code>, \u00e0 la condition stricte qu&rsquo;aucune donn\u00e9e manquante n&rsquo;ait \u00e9t\u00e9 pr\u00e9alablement introduite dans le syst\u00e8me d&rsquo;observation.<\/p>\n<h3>3.2 Analyse de la nature des r\u00e9sultats renvoy\u00e9s<\/h3>\n<p>Une inspection rigoureuse de l&rsquo;objet g\u00e9n\u00e9r\u00e9 permet d&rsquo;en appr\u00e9hender la double nature index-valeurs. Lorsque l&rsquo;on interroge la propri\u00e9t\u00e9 <code>effectifs.dtype<\/code>, l&rsquo;interpr\u00e9teur confirme sans \u00e9quivoque le stockage des d\u00e9comptes sous la forme <code>dtype('int64')<\/code>. L&rsquo;acc\u00e8s \u00e0 la propri\u00e9t\u00e9 <code>effectifs.index<\/code> renvoie un conteneur d&rsquo;indexation optimis\u00e9 contenant la s\u00e9quence ordonn\u00e9e des \u00e9tiquettes : <code>Index(['Modalit\u00e9 A', 'Modalit\u00e9 B', 'Modalit\u00e9 C', 'Modalit\u00e9 D'], dtype='object', name='Evaluation')<\/code>.<\/p>\n<p>Cette architecture conf\u00e8re une flexibilit\u00e9 d&rsquo;interrogation absolue. Si le chercheur souhaite isoler sp\u00e9cifiquement la fr\u00e9quence associ\u00e9e \u00e0 une modalit\u00e9 pr\u00e9cise, l&rsquo;op\u00e9rateur d&rsquo;indexation explicite par \u00e9tiquette s&rsquo;utilise directement :<\/p>\n<pre><code>frequence_b = effectifs.loc[\"Modalit\u00e9 B\"]\n# Renvoie la valeur scalaire enti\u00e8re : 4\n<\/code><\/pre>\n<p>Inversement, s&rsquo;il s&rsquo;agit d&rsquo;extraire la fr\u00e9quence de la modalit\u00e9 dominante sans pr\u00e9sumer de son libell\u00e9 nominal exact, l&rsquo;acc\u00e8s positionnel s&rsquo;av\u00e8re optimal :<\/p>\n<pre><code>frequence_dominante = effectifs.iloc[0]\n# Renvoie le d\u00e9compte du premier rang : 5\nmodalite_dominante = effectifs.index[0]\n# Renvoie l'\u00e9tiquette correspondante : 'Modalit\u00e9 A'\n<\/code><\/pre>\n<p>Pour assurer l&rsquo;interop\u00e9rabilit\u00e9 des r\u00e9sultats avec des architectures applicatives externes ou des micro-services Web, l&rsquo;objet peut \u00eatre instantan\u00e9ment converti vers des formats standards du langage Python, notamment sous la forme d&rsquo;un dictionnaire associatif via l&rsquo;instruction <code>effectifs.to_dict()<\/code>, ou s\u00e9rialis\u00e9 sous la forme d&rsquo;une cha\u00eene formelle conforme \u00e0 la sp\u00e9cification JSON par le biais de la m\u00e9thode <code>effectifs.to_json()<\/code>.<\/p>\n<h3>3.3 Traitement des variables cat\u00e9gorielles versus num\u00e9riques discr\u00e8tes<\/h3>\n<p>La nature du type de donn\u00e9es sous-jacent module de fa\u00e7on d\u00e9terminante le comportement de <code>value_counts()<\/code>. Lorsque les donn\u00e9es sont explicitement converties vers le type optimis\u00e9 <code>CategoricalDtype<\/code>, l&rsquo;univers des modalit\u00e9s est formellement circonscrit par le sch\u00e9ma th\u00e9orique d\u00e9fini par l&rsquo;exp\u00e9rimentateur. Consid\u00e9rons une variable encodant les niveaux d&rsquo;une \u00e9chelle ordonn\u00e9e de s\u00e9v\u00e9rit\u00e9 clinique comprenant les degr\u00e9s : \u00ab Faible \u00bb, \u00ab Mod\u00e9r\u00e9 \u00bb, \u00ab \u00c9lev\u00e9 \u00bb, et \u00ab Critique \u00bb. Supposons qu&rsquo;au cours d&rsquo;un essai pilote men\u00e9 sur un effectif restreint, aucun patient ne pr\u00e9sente l&rsquo;\u00e9tat \u00ab Critique \u00bb.<\/p>\n<p>Si la variable demeure stock\u00e9e sous forme de cha\u00eenes de caract\u00e8res brutes (type <code>object<\/code>), l&rsquo;appel \u00e0 <code>value_counts()<\/code> omettra purement et simplement la modalit\u00e9 \u00ab Critique \u00bb, car celle-ci est physiquement absente de la m\u00e9moire. En revanche, si la colonne est formellement typ\u00e9e en tant que cat\u00e9gorie explicite :<\/p>\n<pre><code>type_severite = pd.CategoricalDtype(\n    categories=[\"Faible\", \"Mod\u00e9r\u00e9\", \"\u00c9lev\u00e9\", \"Critique\"], \n    ordered=True\n)\nserie_clinique = pd.Series([\"Faible\", \"Mod\u00e9r\u00e9\", \"Faible\", \"Mod\u00e9r\u00e9\"], dtype=type_severite)\ncomptage_categoriel = serie_clinique.value_counts(sort=False)\n<\/code><\/pre>\n<p>L&rsquo;objet r\u00e9sultant pr\u00e9serve l&rsquo;int\u00e9gralit\u00e9 du domaine de d\u00e9finition de la variable. La modalit\u00e9 \u00ab Critique \u00bb appara\u00eet alors formellement dans l&rsquo;index de sortie, affubl\u00e9e d&rsquo;un effectif rigoureusement \u00e9gal \u00e0 0. Cette propri\u00e9t\u00e9 est fondamentale en recherche quantitative : elle pr\u00e9vient les biais d&rsquo;omission lors de la concat\u00e9nation de multiples tables exp\u00e9rimentales ou de l&rsquo;application de tests d&rsquo;ad\u00e9quation du Khi-deux, o\u00f9 la dimension de la matrice de contingence doit imp\u00e9rativement correspondre au nombre th\u00e9orique de degr\u00e9s de libert\u00e9 pr\u00e9vus par le protocole exp\u00e9rimental.<\/p>\n<h2>4. Gestion et quantification des valeurs manquantes avec dropna<\/h2>\n<h3>4.1 Le comportement d&rsquo;exclusion par d\u00e9faut des donn\u00e9es nulles<\/h3>\n<p>Dans l&rsquo;ing\u00e9nierie des donn\u00e9es empiriques, la compl\u00e9tude parfaite des jeux d&rsquo;enregistrements rel\u00e8ve de l&rsquo;exception plut\u00f4t que de la norme. Des d\u00e9faillances de capteurs mat\u00e9riels, des refus de r\u00e9ponse \u00e0 des items invasifs dans un sondage ou des erreurs de fusion de tables g\u00e9n\u00e8rent in\u00e9luctablement des enregistrements nuls. Dans l&rsquo;\u00e9cosyst\u00e8me Pandas, ces donn\u00e9es manquantes sont conventionnellement mat\u00e9rialis\u00e9es par le marqueur flottant <code>numpy.nan<\/code> (Not a Number) ou, dans les versions r\u00e9centes, par la sentinelle typ\u00e9e unifi\u00e9e <code>pandas.NA<\/code>.<\/p>\n<p>Par d\u00e9faut, la m\u00e9thode <code>value_counts()<\/code> adopte une posture m\u00e9thodologique stricte : le param\u00e8tre <code>dropna<\/code> est positionn\u00e9 de mani\u00e8re intrins\u00e8que sur la valeur bool\u00e9enne <code>True<\/code>. Ce choix d&rsquo;impl\u00e9mentation trouve sa justification dans la tradition statistique consistant \u00e0 n&rsquo;\u00e9valuer la distribution des fr\u00e9quences que sur l&rsquo;\u00e9chantillon des donn\u00e9es valides observables. Toutefois, cette convention induit un p\u00e9ril m\u00e9thodologique majeur : l&rsquo;omission silencieuse des donn\u00e9es manquantes. Si un analyste n&rsquo;y prend garde, la somme des fr\u00e9quences retourn\u00e9es par l&rsquo;appel par d\u00e9faut sera strictement inf\u00e9rieure au cardinal de l&rsquo;index de la s\u00e9rie d&rsquo;origine. Cette divergence masqu\u00e9e peut fausser radicalement l&rsquo;estimation de la puissance statistique des tests ult\u00e9rieurs en dissimulant un taux potentiellement critique de d\u00e9perdition d&rsquo;observations.<\/p>\n<h3>4.2 Impl\u00e9mentation du param\u00e8tre dropna=False<\/h3>\n<p>Afin de contrer cet aveuglement statistique et d&rsquo;incorporer explicitement la quantification de l&rsquo;absence d&rsquo;information dans le bilan exploratoire, il est imp\u00e9ratif d&rsquo;assigner l&rsquo;argument <code>dropna=False<\/code> lors de l&rsquo;appel de la m\u00e9thode. Illustrons ce comportement au moyen d&rsquo;un \u00e9chantillon exp\u00e9rimental d\u00e9grad\u00e9 :<\/p>\n<pre><code>donnees_observationnelles = pd.Series([\n    \"R\u00e9action Positive\", np.nan, \"R\u00e9action N\u00e9gative\", \n    \"R\u00e9action Positive\", np.nan, \"R\u00e9action Neutre\", \n    \"R\u00e9action Positive\", np.nan\n])\n\nbilan_complet = donnees_observationnelles.value_counts(dropna=False)\n<\/code><\/pre>\n<p>L&rsquo;ex\u00e9cution de cette commande contraint l&rsquo;algorithme \u00e0 traiter la sentinelle de vacuit\u00e9 informationnelle <code>NaN<\/code> comme une modalit\u00e9 empirique \u00e0 part enti\u00e8re. Le tableau de sortie classe ainsi l&rsquo;absence de donn\u00e9e dans la hi\u00e9rarchie du d\u00e9nombrement :<\/p>\n<ul>\n<li>R\u00e9action Positive : 3 occurrences<\/li>\n<li>NaN : 3 occurrences<\/li>\n<li>R\u00e9action N\u00e9gative : 1 occurrence<\/li>\n<li>R\u00e9action Neutre : 1 occurrence<\/li>\n<\/ul>\n<p>Cette inclusion modifie substantiellement l&rsquo;index r\u00e9sultant, qui incorpore d\u00e9sormais une valeur ind\u00e9termin\u00e9e. Une bonne pratique d&rsquo;audit de donn\u00e9es consiste \u00e0 croiser syst\u00e9matiquement la valeur obtenue pour la modalit\u00e9 <code>NaN<\/code> dans <code>value_counts(dropna=False)<\/code> avec le r\u00e9sultat d\u00e9livr\u00e9 par l&rsquo;op\u00e9rateur bool\u00e9en d\u00e9di\u00e9 <code>donnees_observationnelles.isna().sum()<\/code>. La parfaite concordance de ces deux valeurs atteste de la fid\u00e9lit\u00e9 de l&rsquo;inventaire des donn\u00e9es incompl\u00e8tes avant toute prise de d\u00e9cision concernant leur imputation ou leur suppression d\u00e9finitive.<\/p>\n<h3>4.3 Enjeux m\u00e9thodologiques de la non-r\u00e9ponse et des biais d&rsquo;attrition<\/h3>\n<p>L&rsquo;\u00e9valuation rigoureuse des donn\u00e9es nulles via <code>dropna=False<\/code> transcende la simple v\u00e9rification informatique : elle touche au c\u0153ur de la validit\u00e9 interne des inf\u00e9rences statistiques. Dans la litt\u00e9rature m\u00e9thodologique consacr\u00e9e aux donn\u00e9es manquantes, notamment formalis\u00e9e par Donald Rubin, les m\u00e9canismes g\u00e9n\u00e9rateurs d&rsquo;absence sont cat\u00e9goris\u00e9s en trois r\u00e9gimes distincts : les donn\u00e9es manquantes compl\u00e8tement de mani\u00e8re al\u00e9atoire (MCAR &#8211; Missing Completely At Random), les donn\u00e9es manquantes de mani\u00e8re al\u00e9atoire conditionnelle (MAR &#8211; Missing At Random), et les donn\u00e9es manquantes de mani\u00e8re non al\u00e9atoire (MNAR &#8211; Missing Not At Random).<\/p>\n<p>L&rsquo;affichage explicite des d\u00e9comptes de valeurs manquantes constitue la premi\u00e8re \u00e9tape diagnostique pour suspecter un m\u00e9canisme MNAR. Par exemple, si au sein d&rsquo;une recherche clinique \u00e9valuant l&rsquo;efficacit\u00e9 d&rsquo;une psychoth\u00e9rapie exp\u00e9rimentale de l&rsquo;anxi\u00e9t\u00e9, la modalit\u00e9 <code>NaN<\/code> relative \u00e0 l&rsquo;\u00e9valuation finale du traitement repr\u00e9sente 40 % des effectifs globaux, l&rsquo;analyste ne peut d\u00e9cemment pas postuler une absence neutre. Ce taux massif signale un biais d&rsquo;attrition aigu : les participants pour lesquels le traitement a potentiellement \u00e9chou\u00e9 ou induit des effets secondaires d\u00e9l\u00e9t\u00e8res ont vraisemblablement abandonn\u00e9 le protocole de recherche de mani\u00e8re diff\u00e9rentielle.<\/p>\n<p>La quantification document\u00e9e de ces volumes d&rsquo;abandon oriente de mani\u00e8re cruciale les strat\u00e9gies ult\u00e9rieures de mod\u00e9lisation statistique. Elle permet de juger s&rsquo;il convient de d\u00e9ployer des techniques d&rsquo;imputation multiple par \u00e9quations cha\u00een\u00e9es (MICE), d&rsquo;appliquer une analyse en intention de traiter (ITT) par le biais de mod\u00e8les mixtes marginaux, ou de restreindre l&rsquo;\u00e9tude \u00e0 l&rsquo;\u00e9chantillon des cas complets tout en actant formellement la limitation m\u00e9thodologique dans le rapport scientifique final.<\/p>\n<h2>5. Normalisation et conversion des fr\u00e9quences absolues en proportions relatives<\/h2>\n<h3>5.1 M\u00e9canique statistique du param\u00e8tre normalize=True<\/h3>\n<p>Tandis que le d\u00e9nombrement en effectifs absolus fournit une appr\u00e9ciation concr\u00e8te du volume des donn\u00e9es amass\u00e9es, l&rsquo;analyse comparative inter-groupes ou inter-\u00e9chantillons requiert une ind\u00e9pendance vis-\u00e0-vis de la taille globale de la cohorte <span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span>. C&rsquo;est pr\u00e9cis\u00e9ment l&rsquo;objet du param\u00e8tre formel <code>normalize=True<\/code>, lequel transmue l&rsquo;op\u00e9rateur d&rsquo;accumulation en un estimateur non param\u00e9trique de la loi de probabilit\u00e9 discr\u00e8te sous-jacente.<\/p>\n<p>D&rsquo;un point de vue op\u00e9ratoire, lorsque <code>normalize<\/code> est activ\u00e9, la m\u00e9thode calcule, pour chaque modalit\u00e9 observable <span class=\"arabpsy-math-inline\" data-latex=\"k_j\">$k_j$<\/span>, la fr\u00e9quence relative empirique <span class=\"arabpsy-math-inline\" data-latex=\"f_j\">$f_j$<\/span> d\u00e9finie par le quotient de son effectif propre <span class=\"arabpsy-math-inline\" data-latex=\"n_j\">$n_j$<\/span> par l&rsquo;effectif cumul\u00e9 total des observations prises en compte :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"f_j = \\frac{n_j}{\\sum_{p=1}^m n_p}\">$$f_j = \\frac{n_j}{\\sum_{p=1}^m n_p}$$<\/span><\/p>\n<p>L&rsquo;ensemble des fr\u00e9quences relatives calcul\u00e9es respecte formellement les axiomes \u00e9l\u00e9mentaires de Kolmogorov r\u00e9gissant les mesures probabilistes sur des espaces discrets finis : chaque proportion individuelle est strictement born\u00e9e dans le segment r\u00e9el <span class=\"arabpsy-math-inline\" data-latex=\"[0, 1]\">$[0, 1]$<\/span>, et la somme int\u00e9grale de ces composantes v\u00e9rifie l&rsquo;\u00e9galit\u00e9 unitaire absolue :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\sum_{j=1}^m f_j = 1.0\">$$\\sum_{j=1}^m f_j = 1.0$$<\/span><\/p>\n<p>Il importe de souligner avec rigueur l&rsquo;interaction entre <code>normalize=True<\/code> et <code>dropna<\/code>. Si <code>dropna=True<\/code> (configuration standard), le d\u00e9nominateur de la fraction correspond rigoureusement \u00e0 la somme des valeurs non nulles. D\u00e8s lors, chaque proportion traduit la pr\u00e9valence de la modalit\u00e9 au sein de la sous-population des r\u00e9pondants valides. En revanche, si l&rsquo;on assigne simultan\u00e9ment <code>normalize=True<\/code> et <code>dropna=False<\/code>, le d\u00e9nominateur int\u00e8gre le contingent des donn\u00e9es manquantes. La proportion associ\u00e9e \u00e0 chaque modalit\u00e9 valide est donc m\u00e9caniquement r\u00e9duite, refl\u00e9tant son poids relatif exact vis-\u00e0-vis de l&rsquo;\u00e9chantillon brut total initialement collect\u00e9. Sur le plan informatique, ces ratios sont stock\u00e9s sous forme de flottants double pr\u00e9cision (<code>float64<\/code>), assurant une pr\u00e9cision num\u00e9rique jusqu&rsquo;\u00e0 15 d\u00e9cimales significatives.<\/p>\n<h3>5.2 Conversion des proportions relatives en pourcentages lisibles<\/h3>\n<p>Bien que les proportions d\u00e9cimales comprises entre 0 et 1 soient privil\u00e9gi\u00e9es pour les manipulations alg\u00e9briques ult\u00e9rieures et l&rsquo;impl\u00e9mentation d&rsquo;algorithmes d\u00e9cisionnels, la communication scientifique des r\u00e9sultats au sein d&rsquo;articles \u00e9valu\u00e9s par les pairs ou de rapports de synth\u00e8se manag\u00e9riaux requiert conventionnellement une expression en pourcentages lisibles.<\/p>\n<p>La conversion s&rsquo;op\u00e8re par une transformation affine vectoris\u00e9e triviale mais essentielle en multipliant directement la s\u00e9rie normalis\u00e9e par le scalaire 100. En exploitant la surcharge des op\u00e9rateurs math\u00e9matiques au sein de Pandas, la syntaxe s&rsquo;av\u00e8re concise :<\/p>\n<pre><code>serie_statut = pd.Series([\"Succ\u00e8s\", \"\u00c9chec\", \"Succ\u00e8s\", \"Succ\u00e8s\", \"En cours\", \"\u00c9chec\"])\npourcentages = serie_statut.value_counts(normalize=True) * 100\n<\/code><\/pre>\n<p>Pour assurer une int\u00e9gration impeccable au sein de tableaux de publication, il est fr\u00e9quemment d&rsquo;usage de combiner cette op\u00e9ration avec les fonctions d&rsquo;arrondi ou de formatage de cha\u00eenes :<\/p>\n<pre><code>pourcentages_arrondis = pourcentages.round(2)\n<\/code><\/pre>\n<p>Une construction analytique particuli\u00e8rement \u00e9l\u00e9gante et valorisante dans un protocole d&rsquo;exploration consiste \u00e0 fusionner au sein d&rsquo;un unique <code>DataFrame<\/code> r\u00e9capitulatif les effectifs absolus et les pourcentages correspondants. Cette consolidation s&rsquo;op\u00e8re ais\u00e9ment par concat\u00e9nation horizontale de deux appels distincts de la m\u00e9thode :<\/p>\n<pre><code>tableau_frequences = pd.concat({\n    \"Effectif absolu (n)\": serie_statut.value_counts(dropna=False),\n    \"Proportion (%)\": (serie_statut.value_counts(normalize=True, dropna=False) * 100).round(2)\n}, axis=1)\n<\/code><\/pre>\n<p>Ce tableau synoptique offre une lisibilit\u00e9 ergonomique maximale, synth\u00e9tisant d&rsquo;un seul coup d&rsquo;\u0153il le volume brut et l&rsquo;importance relative de chaque modalit\u00e9 observ\u00e9e.<\/p>\n<h3>5.3 Interpr\u00e9tation des distributions relatives dans les \u00e9chantillons<\/h3>\n<p>L&rsquo;exploitation des fr\u00e9quences relatives normalis\u00e9es constitue le socle m\u00e9thodologique indispensable pour la comparaison de distributions issues d&rsquo;\u00e9chantillons h\u00e9t\u00e9rog\u00e8nes de tailles asym\u00e9triques. Supposons qu&rsquo;un chercheur compare les profils de coping face au stress entre une cohorte clinique hospitali\u00e8re (<span class=\"arabpsy-math-inline\" data-latex=\"n = 85\">$n = 85$<\/span>) et une cohorte non clinique issue de la population g\u00e9n\u00e9rale (<span class=\"arabpsy-math-inline\" data-latex=\"n = 1,420\">$n = 1,420$<\/span>). Toute comparaison directe fond\u00e9e sur les effectifs bruts est rigoureusement st\u00e9rile et trompeuse du fait de l&rsquo;\u00e9cart d&rsquo;un facteur 16 entre les volumes d&rsquo;observation.<\/p>\n<p>La normalisation univari\u00e9e par <code>value_counts(normalize=True)<\/code> permet d&rsquo;aplanir imm\u00e9diatement cet effet d&rsquo;\u00e9chelle. Elle rend directement commensurables les proportions allou\u00e9es aux m\u00e9canismes d&rsquo;\u00e9vitement cognitif ou de r\u00e9solution active au sein de chaque groupe exp\u00e9rimental. Cette approche met en lumi\u00e8re des ph\u00e9nom\u00e8nes d&rsquo;asym\u00e9trie statistique masqu\u00e9s, comme l&rsquo;hyper-repr\u00e9sentation d&rsquo;une modalit\u00e9 pathologique qui ne r\u00e9unirait que 30 cas bruts dans le groupe clinique (soit une proportion massive de 35,3 %), alors qu&rsquo;elle compterait 100 individus dans le groupe t\u00e9moin (ce qui ne constitue en r\u00e9alit\u00e9 qu&rsquo;une proportion marginale de 7,04 %).<\/p>\n<p>En outre, les fr\u00e9quences normalis\u00e9es obtenues \u00e0 partir de grands \u00e9chantillons constituent des estimateurs convergents (au sens de la loi forte des grands nombres) des probabilit\u00e9s a priori au sein des mod\u00e8les bay\u00e9siens ou des classificateurs probabilistes tels que Naive Bayes. Elles permettent enfin de documenter formellement la repr\u00e9sentativit\u00e9 d&rsquo;un \u00e9chantillon exp\u00e9rimental par rapport aux tables de recensement d\u00e9mographique de r\u00e9f\u00e9rence, autorisant le statisticien \u00e0 valider ou rejeter l&rsquo;hypoth\u00e8se de congruence de la cohorte d&rsquo;\u00e9tude.<\/p>\n<h2>6. Contr\u00f4le de l&rsquo;ordonnancement et du tri des fr\u00e9quences<\/h2>\n<h3>6.1 Tri hi\u00e9rarchique d\u00e9croissant par d\u00e9faut<\/h3>\n<p>Le comportement algorithmique par d\u00e9faut de la fonction <code>value_counts()<\/code> int\u00e8gre un ordonnancement syst\u00e9matique dict\u00e9 par le param\u00e8tre <code>sort=True<\/code> conjugu\u00e9 \u00e0 <code>ascending=False<\/code>. Sous cette configuration canonique, l&rsquo;objet r\u00e9sultant est structur\u00e9 selon une hi\u00e9rarchie d\u00e9croissante stricte des effectifs d\u00e9nombr\u00e9s. L&rsquo;int\u00e9r\u00eat m\u00e9thodologique de cette organisation est imm\u00e9diat : elle offre au chercheur une identification visuelle instantan\u00e9e du mode statistique de la variable, ainsi que de la pente g\u00e9n\u00e9rale de la d\u00e9croissance distributionnelle.<\/p>\n<p>Sur le plan algorithmique, une fois l&rsquo;\u00e9tape d&rsquo;accumulation par hachage achev\u00e9e, les \u00e9l\u00e9ments font l&rsquo;objet d&rsquo;un tri bas\u00e9 sur des impl\u00e9mentations hautement efficientes de type Quicksort, Mergesort ou Timsort, selon les optimisations internes du noyau C. La stabilit\u00e9 du tri est un aspect technique crucial : lorsque deux modalit\u00e9s distinctes pr\u00e9sentent rigoureusement le m\u00eame effectif empirique (\u00e9galit\u00e9 parfaite d&rsquo;occurrences), l&rsquo;impl\u00e9mentation de Pandas garantit g\u00e9n\u00e9ralement le maintien de l&rsquo;ordre relatif d&rsquo;apparition originale des donn\u00e9es au sein de la s\u00e9rie source, \u00e9vitant ainsi toute ind\u00e9termination stochastique dans le positionnement des \u00e9tiquettes au niveau de l&rsquo;index.<\/p>\n<p>Cette disposition descendante s&rsquo;av\u00e8re particuli\u00e8rement ergonomique dans les diagnostics pr\u00e9liminaires d&rsquo;audit de donn\u00e9es, permettant d&rsquo;isoler en une fraction de seconde la r\u00e9ponse h\u00e9g\u00e9monique au sein d&rsquo;une enqu\u00eate ou le type de pathologie le plus r\u00e9pandu au sein d&rsquo;un registre \u00e9pid\u00e9miologique hospitalier.<\/p>\n<h3>6.2 Tri ascendant pour l&rsquo;identification des modalit\u00e9s rares<\/h3>\n<p>Si la recherche des modes empiriques r\u00e9clame un tri d\u00e9croissant, la d\u00e9tection des anomalies de saisie, des valeurs extr\u00eames ou des signaux faibles exige une inversion sym\u00e9trique de la perspective. Cette inversion est gouvern\u00e9e par le basculement de l&rsquo;argument bool\u00e9en <code>ascending=True<\/code>, tout en maintenant <code>sort=True<\/code> :<\/p>\n<pre><code>serie_diagnostics = pd.Series([\n    \"Grippe\", \"Rhume\", \"Grippe\", \"Grippe\", \"Bronchite\", \n    \"Rhume\", \"COVID-19\", \"Erreur_Code_99\", \"Grippe\"\n])\nfrequences_rares = serie_diagnostics.value_counts(ascending=True)\n<\/code><\/pre>\n<p>Dans ce sc\u00e9nario d&rsquo;ex\u00e9cution, le sommet de la structure de sortie est occup\u00e9 par les modalit\u00e9s pr\u00e9sentant les effectifs les plus faibles. Cet agencement constitue une proc\u00e9dure heuristique d&rsquo;une efficacit\u00e9 redoutable pour le nettoyage syst\u00e9matique des donn\u00e9es (data cleaning). L&rsquo;analyste observe imm\u00e9diatement les modalit\u00e9s ne pr\u00e9sentant qu&rsquo;une unique occurrence (<span class=\"arabpsy-math-inline\" data-latex=\"n=1\">$n=1$<\/span>). Dans l&rsquo;exemple ci-dessus, la modalit\u00e9 <code>Erreur_Code_99<\/code> ou des coquilles orthographiques isol\u00e9es apparaissent instantan\u00e9ment en premi\u00e8re position.<\/p>\n<p>Au-del\u00e0 de la simple correction d&rsquo;erreurs d&rsquo;encodage, le tri ascendant joue un r\u00f4le analytique d\u00e9terminant dans l&rsquo;\u00e9tude des distributions \u00e0 longue tra\u00eene (long-tail distributions), fr\u00e9quentes en linguistique computationnelle (loi de Zipf) ou en \u00e9cologie des communaut\u00e9s (esp\u00e8ces rares au sein d&rsquo;un biome). Il offre un acc\u00e8s direct aux cat\u00e9gories marginales dont l&rsquo;accumulation constitue parfois un volume non n\u00e9gligeable mais dont l&rsquo;individualit\u00e9 demeure infinit\u00e9simale.<\/p>\n<h3>6.3 Pr\u00e9servation ou r\u00e9organisation selon l&rsquo;index naturel<\/h3>\n<p>Il est des circonstances m\u00e9thodologiques o\u00f9 l&rsquo;ordonnancement dict\u00e9 par les fr\u00e9quences s&rsquo;av\u00e8re contre-productif, perturbant la logique intrins\u00e8que de la variable \u00e9tudi\u00e9e. C&rsquo;est \u00e9minemment le cas des variables ordinales, telles que les niveaux d&rsquo;une \u00e9chelle d&rsquo;\u00e9valuation comportementale s&rsquo;\u00e9chelonnant de 1 (\u00ab Pas du tout d&rsquo;accord \u00bb) \u00e0 5 (\u00ab Tout \u00e0 fait d&rsquo;accord \u00bb). Un tri fond\u00e9 sur la popularit\u00e9 des r\u00e9ponses m\u00e9langerait de fa\u00e7on confuse les \u00e9chelons num\u00e9riques, compliquant la lecture s\u00e9quentielle de la gradation psychologique.<\/p>\n<p>Pour neutraliser le tri bas\u00e9 sur les effectifs, deux approches computationnelles compl\u00e9mentaires sont envisageables. La premi\u00e8re consiste \u00e0 sp\u00e9cifier le param\u00e8tre <code>sort=False<\/code> directement dans l&rsquo;appel initial. Dans cette configuration, l&rsquo;algorithme omet l&rsquo;\u00e9tape de r\u00e9organisation des d\u00e9comptes ; la s\u00e9rie r\u00e9sultante pr\u00e9serve alors l&rsquo;ordre arbitraire selon lequel les modalit\u00e9s uniques ont \u00e9t\u00e9 rencontr\u00e9es pour la premi\u00e8re fois lors du parcours lin\u00e9aire du vecteur source. Cette d\u00e9sactivation offre au passage une optimisation computationnelle non n\u00e9gligeable sur des s\u00e9ries de tr\u00e8s grande cardinalit\u00e9, en \u00e9conomisant le co\u00fbt temporel <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{O}(M \\log M)\">$\\mathcal{O}(M \\log M)$<\/span> associ\u00e9 \u00e0 l&rsquo;algorithme de tri.<\/p>\n<p>La seconde approche, hautement recommand\u00e9e pour les variables ordinales et temporelles, consiste \u00e0 encha\u00eener l&rsquo;appel de <code>value_counts()<\/code> avec la m\u00e9thode sp\u00e9cialis\u00e9e <code>.sort_index()<\/code> :<\/p>\n<pre><code>echelle_likert = pd.Series([3, 4, 2, 5, 1, 3, 2, 4, 3, 5, 2, 3])\ndistribution_ordonnee = echelle_likert.value_counts(sort=False).sort_index()\n<\/code><\/pre>\n<p>Cette formulation \u00e9l\u00e9gante garantit que l&rsquo;index de la s\u00e9rie finale est rigoureusement ordonn\u00e9 de fa\u00e7on croissante selon la valeur naturelle des modalit\u00e9s (1, 2, 3, 4, 5), autorisant une inspection imm\u00e9diate de l&rsquo;allure de la distribution (sym\u00e9trie, aplatissement, d\u00e9calage vers la droite ou vers la gauche) similaire \u00e0 la lecture visuelle d&rsquo;un histogramme discr\u00e9tis\u00e9.<\/p>\n<h2>7. Discr\u00e9tisation continue et d\u00e9coupage en classes via le param\u00e8tre bins<\/h2>\n<h3>7.1 Principe de la discr\u00e9tisation automatique sur variables quantitatives<\/h3>\n<p>Bien que la fonction <code>value_counts()<\/code> soit universellement reconnue pour son efficacit\u00e9 sur les donn\u00e9es cat\u00e9gorielles discr\u00e8tes, son spectre fonctionnel s&rsquo;\u00e9tend avec une \u00e9gale pertinence aux s\u00e9ries quantitatives continues gr\u00e2ce au puissant param\u00e8tre <code>bins<\/code>. Appliquer <code>value_counts()<\/code> dans sa configuration par d\u00e9faut sur une variable num\u00e9rique continue (telle que des temps de r\u00e9action mesur\u00e9s en millisecondes ou des concentrations plasmatiques d&rsquo;un biomarqueur exprim\u00e9es en micromoles par litre) produit un r\u00e9sultat analytiquement st\u00e9rile : chaque valeur individuelle pr\u00e9sentant une pr\u00e9cision d\u00e9cimale unique, la fonction g\u00e9n\u00e9rera une table titanesque o\u00f9 l&rsquo;immense majorit\u00e9 des effectifs sera \u00e9gale \u00e0 1.<\/p>\n<p>L&rsquo;introduction du param\u00e8tre <code>bins<\/code> permet de rem\u00e9dier instantan\u00e9ment \u00e0 cette \u00e9cueil en instruisant Pandas d&rsquo;effectuer au pr\u00e9alable une segmentation de l&rsquo;espace continu en un ensemble d&rsquo;intervalles contigus. Lorsque l&rsquo;argument <code>bins<\/code> re\u00e7oit un entier scalaire <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span> (par exemple <code>bins=5<\/code>), la m\u00e9thode \u00e9value l&rsquo;\u00e9tendue totale de la variable (<span class=\"arabpsy-math-inline\" data-latex=\"X_{\\max} - X_{\\min}\">$X_{\\max} &#8211; X_{\\min}$<\/span>), divise cet intervalle en <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span> plages d&rsquo;amplitudes rigoureusement identiques, et d\u00e9nombre le nombre d&rsquo;observations empiriques chutant \u00e0 l&rsquo;int\u00e9rieur de chaque partition.<\/p>\n<p>Les \u00e9l\u00e9ments constitutifs de l&rsquo;index r\u00e9sultant ne sont plus des scalaires num\u00e9riques simples mais des objets de type structurel <code>pandas.IntervalIndex<\/code>. Chaque intervalle est formellement exprim\u00e9 sous une notation math\u00e9matique semi-ouverte standard (g\u00e9n\u00e9ralement ouverte \u00e0 gauche et ferm\u00e9e \u00e0 droite, par exemple <span class=\"arabpsy-math-inline\" data-latex=\"(10.5, 20.0]\">$(10.5, 20.0]$<\/span>), assurant une disjonction parfaite entre les classes cons\u00e9cutives sans ambigu\u00eft\u00e9 quant \u00e0 l&rsquo;appartenance des valeurs positionn\u00e9es pr\u00e9cis\u00e9ment sur les bornes fronti\u00e8res.<\/p>\n<h3>7.2 Personnalisation des intervalles et limites de segmentation<\/h3>\n<p>L&rsquo;automatisation du d\u00e9coupage en classes d&rsquo;\u00e9gale largeur pr\u00e9sente une limite m\u00e9thodologique s\u00e9v\u00e8re : elle est fortement vuln\u00e9rable \u00e0 la pr\u00e9sence de valeurs extr\u00eames ou aberrantes qui \u00e9tirent artificiellement l&rsquo;amplitude globale, cr\u00e9ant des intervalles centraux surcharg\u00e9s et des intervalles p\u00e9riph\u00e9riques d\u00e9sesp\u00e9r\u00e9ment vides. Pour pallier cette contrainte, le param\u00e8tre <code>bins<\/code> accepte la transmission d&rsquo;une s\u00e9quence explicite de bornes scalaires (sous forme de liste ou de tableau NumPy).<\/p>\n<p>Consid\u00e9rons l&rsquo;analyse d&rsquo;une cohorte de sujets pour laquelle nous souhaitons quantifier la distribution des \u00e2ges selon des segments d\u00e9mographiques et \u00e9pid\u00e9miologiques standardis\u00e9s non lin\u00e9aires : les mineurs (0 \u00e0 17 ans), les jeunes adultes (18 \u00e0 35 ans), les adultes d&rsquo;\u00e2ge moyen (36 \u00e0 64 ans) et les seniors (65 ans et plus). Le param\u00e9trage explicite des fronti\u00e8res s&rsquo;ex\u00e9cute ainsi :<\/p>\n<pre><code>ages_cohorte = pd.Series([12, 18, 22, 45, 67, 82, 34, 19, 56, 71, 29, 15, 48])\nbornes_personnalisees = [0, 17, 35, 64, 100]\n\ndistribution_ages = ages_cohorte.value_counts(bins=bornes_personnalisees, sort=False)\n<\/code><\/pre>\n<p>Ce traitement g\u00e9n\u00e8re une s\u00e9rie index\u00e9e par les quatre plages sp\u00e9cifi\u00e9es : <code>(-0.001, 17.0]<\/code>, <code>(17.0, 35.0]<\/code>, <code>(35.0, 64.0]<\/code> et <code>(64.0, 100.0]<\/code>. Il convient de souligner l&rsquo;ajustement infinit\u00e9simal automatique op\u00e9r\u00e9 par l&rsquo;algorithme sur la borne minimale inf\u00e9rieure afin d&rsquo;assurer l&rsquo;inclusion rigoureuse de la plus petite observation disponible au sein de la s\u00e9rie. Toute valeur empirique situ\u00e9e rigoureusement en dehors de l&rsquo;espace global d\u00e9limit\u00e9 par les bornes fournies est classifi\u00e9e sous forme de valeur manquante et sera donc r\u00e9gie par le comportement usuel du param\u00e8tre <code>dropna<\/code>.<\/p>\n<h3>7.3 Comparaison empirique avec pd.cut() et pd.qcut()<\/h3>\n<p>Sur le plan de l&rsquo;architecture logicielle de Pandas, le param\u00e8tre <code>bins<\/code> de la m\u00e9thode <code>value_counts()<\/code> agit comme un raccourci syntaxique \u00e9l\u00e9gant encapsulant un appel sous-jacent \u00e0 la fonction vectoris\u00e9e autonome <a rel=\"noopener noreferrer\" href=\"https:\/\/pandas.pydata.org\/docs\/reference\/api\/pandas.cut.html\">pd.cut()<\/a>. Il est toutefois essentiel de d\u00e9limiter avec rigueur les champs de pertinence m\u00e9thodologique entre cette int\u00e9gration directe et l&rsquo;usage modulaire combin\u00e9 des fonctions <code>pd.cut()<\/code> et <code>pd.qcut()<\/code>.<\/p>\n<p>L&rsquo;utilisation de <code>value_counts(bins=...)<\/code> se r\u00e9v\u00e8le incomparable de concision pour une exploration univari\u00e9e instantan\u00e9e au sein d&rsquo;une session interactive de terminal ou d&rsquo;un calepin Jupyter : elle ne modifie pas le DataFrame sous-jacent et s&rsquo;ex\u00e9cute sans allouer de m\u00e9moire pour une colonne additionnelle interm\u00e9diaire. Toutefois, elle souffre d&rsquo;un d\u00e9ficit de param\u00e9trage : il est impossible d&rsquo;assigner des \u00e9tiquettes textuelles signifiantes (labels) aux intervalles cr\u00e9\u00e9s directement au sein de cet appel, et le contr\u00f4le fin de l&rsquo;inclusion des bornes (param\u00e8tres <code>right=True\/False<\/code> ou <code>include_lowest=True\/False<\/code>) demeure inaccessible.<\/p>\n<p>De surcro\u00eet, la discr\u00e9tisation int\u00e9gr\u00e9e dans <code>value_counts()<\/code> repose exclusivement sur une segmentation en classes d&rsquo;\u00e9gale largeur spatiale arithm\u00e9tique. Lorsqu&rsquo;un statisticien requiert une discr\u00e9tisation par quantiles \u00e9quiprobables (o\u00f9 chaque intervalle regroupe exactement la m\u00eame fraction de l&rsquo;\u00e9chantillon, par exemple des quartiles ou des d\u00e9ciles), l&rsquo;usage de la fonction sp\u00e9cialis\u00e9e <code>pd.qcut()<\/code> s&rsquo;av\u00e8re incontournable. Dans un tel contexte, le paradigme analytique pr\u00e9conis\u00e9 consiste \u00e0 transformer d&rsquo;abord la variable via <code>pd.qcut()<\/code>, puis \u00e0 appliquer en cascade la m\u00e9thode <code>value_counts()<\/code> sur la variable cat\u00e9gorielle ainsi g\u00e9n\u00e9r\u00e9e :<\/p>\n<pre><code>quartiles_temps = pd.qcut(temps_reaction, q=4, labels=[\"Q1_Rapide\", \"Q2_Moyen\", \"Q3_Lent\", \"Q4_TresLent\"])\ndistribution_quartiles = quartiles_temps.value_counts(sort=False)\n<\/code><\/pre>\n<h2>8. Extension aux DataFrames multidimensionnels et analyses bivari\u00e9es<\/h2>\n<h3>8.1 Utilisation de value_counts() sur un DataFrame complet<\/h3>\n<p>L&rsquo;une des avanc\u00e9es majeures introduites dans l&rsquo;architecture logicielle de Pandas \u00e0 partir de la version 1.1 r\u00e9side dans l&rsquo;extension officielle de la m\u00e9thode <code>value_counts()<\/code> \u00e0 l&rsquo;objet multidimensionnel <code>DataFrame<\/code>. Auparavant, la m\u00e9thode \u00e9tait strictement confin\u00e9e aux vecteurs unidimensionnels <code>Series<\/code>, obligeant les d\u00e9veloppeurs \u00e0 recourir \u00e0 des encha\u00eenements verbeux d&rsquo;op\u00e9rateurs <code>groupby()<\/code> pour quantifier les combinaisons d&rsquo;attributs.<\/p>\n<p>Lorsqu&rsquo;elle est invoqu\u00e9e directement sur un <code>DataFrame<\/code> (ou sur un sous-ensemble projet\u00e9 de colonnes), la m\u00e9thode <code>DataFrame.value_counts()<\/code> ne r\u00e9alise pas des d\u00e9comptes ind\u00e9pendants colonne par colonne. Au contraire, elle op\u00e8re une v\u00e9ritable factorisation conjointe : elle recherche l&rsquo;ensemble des tuples uniques form\u00e9s par l&rsquo;intersection des valeurs align\u00e9es sur une m\u00eame ligne, et calcule l&rsquo;effectif associ\u00e9 \u00e0 chacune de ces combinaisons multivari\u00e9es :<\/p>\n<pre><code>donnees_experimentales = pd.DataFrame({\n    \"Condition\": [\"Contr\u00f4le\", \"Test\", \"Test\", \"Contr\u00f4le\", \"Test\", \"Contr\u00f4le\", \"Test\"],\n    \"Sexe\": [\"F\", \"M\", \"F\", \"F\", \"M\", \"M\", \"F\"],\n    \"Reponse\": [\"Oui\", \"Non\", \"Oui\", \"Non\", \"Oui\", \"Oui\", \"Non\"]\n})\n\nprofils_multivaries = donnees_experimentales.value_counts()\n<\/code><\/pre>\n<p>L&rsquo;objet retourn\u00e9 par cette op\u00e9ration est une <code>pd.Series<\/code> hautement structur\u00e9e dont l&rsquo;index n&rsquo;est plus unilat\u00e9ral, mais prend la forme d&rsquo;un <code>pd.MultiIndex<\/code> hi\u00e9rarchique \u00e0 plusieurs niveaux, o\u00f9 chaque niveau correspond \u00e0 l&rsquo;une des colonnes impliqu\u00e9es dans le groupement. Les effectifs associ\u00e9s traduisent directement la fr\u00e9quence de cooccurrence empirique des attributs au sein de la cohorte analys\u00e9e, permettant de cartographier instantan\u00e9ment les profils multivari\u00e9s dominants ou au contraire totalement absents.<\/p>\n<h3>8.2 Analyse bivari\u00e9e et croisements de variables qualitatives<\/h3>\n<p>La capacit\u00e9 d&rsquo;appliquer <code>value_counts()<\/code> sur une paire s\u00e9lectionn\u00e9e de variables nominales constitue l&rsquo;un des outils les plus directs pour amorcer une analyse bivari\u00e9e d&rsquo;association qualitative. En projetant la m\u00e9thode sur deux dimensions sp\u00e9cifiques, l&rsquo;analyste g\u00e9n\u00e8re en substance la distribution conjointe brute des variables \u00e9tudi\u00e9es :<\/p>\n<pre><code>distribution_bivariee = donnees_experimentales[[\"Condition\", \"Reponse\"]].value_counts()\n<\/code><\/pre>\n<p>L&rsquo;exploitation conjointe du param\u00e8tre <code>normalize=True<\/code> dans ce contexte bivari\u00e9 fournit la loi de probabilit\u00e9 conjointe empirique <span class=\"arabpsy-math-inline\" data-latex=\"P(Condition = c, Reponse = r)\">$P(Condition = c, Reponse = r)$<\/span>, o\u00f9 la masse totale des proportions r\u00e9parties sur l&rsquo;ensemble des cases du MultiIndex somme exactement \u00e0 1.0. Cette d\u00e9marche met imm\u00e9diatement en relief d&rsquo;\u00e9ventuelles d\u00e9pendances stochastiques : si la combinaison <code>(\"Test\", \"Oui\")<\/code> pr\u00e9sente une fr\u00e9quence relative disproportionnellement sup\u00e9rieure \u00e0 la combinaison <code>(\"Contr\u00f4le\", \"Oui\")<\/code>, l&rsquo;exp\u00e9rimentateur dispose d&rsquo;un indice pr\u00e9liminaire flagrant sugg\u00e9rant un effet potentiel de la condition exp\u00e9rimentale sur le comportement de r\u00e9ponse.<\/p>\n<p>De plus, cette structure sous forme de MultiIndex autorise des op\u00e9rations d&rsquo;extraction cibl\u00e9es et d&rsquo;\u00e9cr\u00e9mage particuli\u00e8rement ergonomiques. L&rsquo;analyste peut filtrer d&rsquo;un simple masque bool\u00e9en l&rsquo;ensemble des cooccurrences dont le d\u00e9compte est inf\u00e9rieur \u00e0 un seuil d&rsquo;\u00e9chantillonnage critique (par exemple <code>distribution_bivariee[distribution_bivariee >= 5]<\/code>), isolant instantan\u00e9ment le signal statistique robuste du bruit d&rsquo;\u00e9chantillonnage constitu\u00e9 par des \u00e9v\u00e9nements conjoints anecdotiques.<\/p>\n<h3>8.3 Confrontation m\u00e9thodologique : value_counts() versus groupby().size() et crosstab()<\/h3>\n<p>L&rsquo;introduction de <code>value_counts()<\/code> sur les DataFrames suscite une interrogation m\u00e9thodologique r\u00e9currente : comment cette approche se positionne-t-elle vis-\u00e0-vis des idiomes historiques que sont <code>groupby().size()<\/code> et <a rel=\"noopener noreferrer\" href=\"https:\/\/pandas.pydata.org\/docs\/reference\/api\/pandas.crosstab.html\">pd.crosstab()<\/a> ? Il convient d&rsquo;\u00e9tablir une grille comparative rigoureuse fond\u00e9e sur la morphologie des donn\u00e9es, la vitesse d&rsquo;ex\u00e9cution et le traitement des valeurs nulles.<\/p>\n<p>La distinction premi\u00e8re r\u00e9side dans la g\u00e9om\u00e9trie structurelle de la sortie (format long versus format large) :<\/p>\n<ul>\n<li><code>DataFrame.value_counts()<\/code> produit intrins\u00e8quement une <code>Series<\/code> au format long unifi\u00e9 avec un <code>MultiIndex<\/code>, tri\u00e9e syst\u00e9matiquement par fr\u00e9quence d\u00e9croissante. C&rsquo;est l&rsquo;outil par excellence pour l&rsquo;ordonnancement imm\u00e9diat des profils d&rsquo;attributs les plus pr\u00e9valents.<\/li>\n<li><code>pd.crosstab(index, columns)<\/code> g\u00e9n\u00e8re directement une matrice de contingence bidimensionnelle au format large (pivot table). Elle est incomparablement sup\u00e9rieure pour la visualisation synoptique des interactions crois\u00e9es, l&rsquo;application imm\u00e9diate du test formel du Khi-deux d&rsquo;ind\u00e9pendance via la biblioth\u00e8que SciPy, et le calcul de marges conditionnelles par ligne ou par colonne (gr\u00e2ce \u00e0 l&rsquo;argument <code>margins=True<\/code>).<\/li>\n<li>L&rsquo;encha\u00eenement <code>DataFrame.groupby(['Var1', 'Var2']).size()<\/code> constitue l&rsquo;anc\u00eatre programmatique fondamental. Par d\u00e9faut, <code>groupby().size()<\/code> trie la sortie selon les \u00e9tiquettes de l&rsquo;index et non selon les effectifs. Il requiert un appel additionnel explicite \u00e0 <code>.sort_values(ascending=False)<\/code> pour r\u00e9pliquer le comportement de base de <code>value_counts()<\/code>.<\/li>\n<\/ul>\n<p>Sur le plan des performances computationnelles, des analyses comparatives (benchmarks) rigoureuses d\u00e9montrent que <code>DataFrame.value_counts()<\/code> et <code>groupby().size()<\/code> partagent en coulisses des segments substantiels de code factoris\u00e9 en Cython. Leurs performances temporelles sont globalement \u00e9quivalentes sur des volumes d&rsquo;enregistrements mod\u00e9r\u00e9s \u00e0 \u00e9lev\u00e9s. En revanche, <code>pd.crosstab()<\/code> pr\u00e9sente un surco\u00fbt temporel notable li\u00e9 \u00e0 la restructuration matricielle bidimensionnelle de la table, ce qui rend <code>value_counts()<\/code> nettement pr\u00e9f\u00e9rable lorsque l&rsquo;agr\u00e9gation bivari\u00e9e est ex\u00e9cut\u00e9e de mani\u00e8re intensive au sein de boucles it\u00e9ratives d&rsquo;entra\u00eenement ou de validations crois\u00e9es.<\/p>\n<h2>9. Visualisation graphique des distributions produites par value_counts()<\/h2>\n<h3>9.1 G\u00e9n\u00e9ration de diagrammes en barres avec l&rsquo;interface Matplotlib<\/h3>\n<p>L&rsquo;exploration univari\u00e9e ne saurait \u00eatre compl\u00e8te sans une transcription visuelle imm\u00e9diate des grandeurs num\u00e9riques calcul\u00e9es. L&rsquo;objet <code>Series<\/code> r\u00e9sultant de l&rsquo;appel \u00e0 <code>value_counts()<\/code> est nativement interfac\u00e9 avec l&rsquo;\u00e9cosyst\u00e8me graphique de <a rel=\"noopener noreferrer\" href=\"https:\/\/matplotlib.org\/\">Matplotlib<\/a> au travers de l&rsquo;accesseur universel <code>.plot()<\/code>. Cette architecture permet d&rsquo;\u00e9tablir une passerelle directe et vectoris\u00e9e sans aucune allocation de structure interm\u00e9diaire :<\/p>\n<pre><code>import matplotlib.pyplot as plt\n\nfrequences_modalites = donnees_experimentales[\"Condition\"].value_counts()\n\n# Instanciation d'un diagramme en barres verticales standardis\u00e9\nfig, ax = plt.subplots(figsize=(8, 5))\nfrequences_modalites.plot(kind=\"bar\", color=\"#2b5c8f\", edgecolor=\"black\", ax=ax)\nax.set_title(\"Distribution des effectifs au sein des conditions exp\u00e9rimentales\", fontsize=14, fontweight=\"bold\")\nax.set_xlabel(\"Modalit\u00e9 assign\u00e9e\", fontsize=12)\nax.set_ylabel(\"Effectif absolu (n)\", fontsize=12)\nax.grid(axis=\"y\", linestyle=\"--\", alpha=0.7)\nplt.tight_layout()\nplt.show()\n<\/code><\/pre>\n<p>Dans les contextes d&rsquo;ing\u00e9nierie o\u00f9 les libell\u00e9s des modalit\u00e9s cat\u00e9gorielles pr\u00e9sentent une grande longueur textuelle (par exemple le texte int\u00e9gral de questions psychom\u00e9triques ou des terminologies nosologiques complexes), le diagramme vertical traditionnel engendre des chevauchements d&rsquo;\u00e9tiquettes sur l&rsquo;axe des abscisses. La parade ergonomique consiste \u00e0 substituer l&rsquo;argument <code>kind=\"bar\"<\/code> par son pendant horizontal <code>kind=\"barh\"<\/code>. Combin\u00e9 avec <code>value_counts(ascending=True)<\/code>, ce diagramme horizontal garantit que la modalit\u00e9 dominante tr\u00f4ne tout en haut de la figure graphique, assurant un confort de lecture optimal conforme aux standards \u00e9ditoriaux internationaux.<\/p>\n<h3>9.2 Int\u00e9gration avec Seaborn pour des rendus esth\u00e9tiques et avanc\u00e9s<\/h3>\n<p>Pour la production de visualisations r\u00e9pondant aux plus hauts crit\u00e8res d&rsquo;\u00e9l\u00e9gance graphique des revues scientifiques, l&rsquo;interfa\u00e7age avec la biblioth\u00e8que <a rel=\"noopener noreferrer\" href=\"https:\/\/seaborn.pydata.org\/\">Seaborn<\/a> s&rsquo;av\u00e8re particuli\u00e8rement f\u00e9cond. Bien que Seaborn int\u00e8gre la fonction autonome <code>sns.countplot()<\/code> capable d&rsquo;op\u00e9rer le d\u00e9nombrement en interne \u00e0 partir de donn\u00e9es brutes non agr\u00e9g\u00e9es, l&rsquo;utilisation coupl\u00e9e de <code>value_counts()<\/code> et de <code>sns.barplot()<\/code> offre un contr\u00f4le granulaire sup\u00e9rieur sur le tri et le pr\u00e9-filtrage des modalit\u00e9s.<\/p>\n<p>Pour ce faire, il est pr\u00e9conis\u00e9 de convertir la s\u00e9rie de fr\u00e9quences en un v\u00e9ritable DataFrame via la m\u00e9thode <code>.reset_index()<\/code>, conf\u00e9rant ainsi des noms explicites aux colonnes de travail :<\/p>\n<pre><code>import seaborn as sns\n\ndf_comptages = reponses_sensorielles.value_counts().reset_index()\ndf_comptages.columns = [\"Evaluation\", \"Frequence\"]\n\nfig, ax = plt.subplots(figsize=(9, 5))\nsns.barplot(data=df_comptages, x=\"Evaluation\", y=\"Frequence\", palette=\"mako\", ax=ax)\n\n# Incrustation des valeurs num\u00e9riques scalaires au sommet de chaque barre\nfor index, row in df_comptages.iterrows():\n    ax.text(index, row.Frequence + 0.1, f\"{row.Frequence}\", ha=\"center\", va=\"bottom\", fontweight=\"bold\")\n\nax.set_title(\"R\u00e9partition fr\u00e9quentielle annot\u00e9e des \u00e9valuations\", fontsize=13)\nplt.show()\n<\/code><\/pre>\n<p>L&rsquo;annotation explicite des sommets de barres par les d\u00e9comptes scalaires bruts \u00e9limine toute ambigu\u00eft\u00e9 de parallaxe pour le lecteur, conciliant la perception g\u00e9om\u00e9trique de la hauteur avec la pr\u00e9cision arithm\u00e9tique de la donn\u00e9e num\u00e9rique brute.<\/p>\n<h3>9.3 Bonnes pratiques ergonomiques pour repr\u00e9senter les fr\u00e9quences<\/h3>\n<p>La repr\u00e9sentation visuelle des donn\u00e9es discr\u00e8tes est r\u00e9gie par des principes ergonomiques et statistiques rigoureux formalis\u00e9s par des th\u00e9oriciens de la visualisation tels qu&rsquo;Edward Tufte. Le premier pr\u00e9cepte cardinal consiste \u00e0 proscrire formellement l&rsquo;usage des diagrammes circulaires (pie charts ou camemberts). De multiples recherches en psychophysique de la perception ont irr\u00e9futablement d\u00e9montr\u00e9 que le cortex visuel humain \u00e9value avec une impr\u00e9cision notoire les aires angulaires et les surfaces circulaires, alors qu&rsquo;il excelle dans le d\u00e9codage comparatif de longueurs align\u00e9es le long d&rsquo;une \u00e9chelle commune (diagrammes en barres). Cette limitation perceptive s&rsquo;aggrave exponentiellement d\u00e8s lors que le nombre de modalit\u00e9s exc\u00e8de trois ou quatre, rendant la comparaison des proportions adjacentes totalement illisible.<\/p>\n<p>Le second d\u00e9fi ergonomique concerne la gestion de la haute cardinalit\u00e9. Lorsqu&rsquo;une variable nominale comporte 30, 50 ou 100 modalit\u00e9s distinctes (par exemple la liste exhaustive des pays de r\u00e9sidence des r\u00e9pondants), tenter de tracer l&rsquo;int\u00e9gralit\u00e9 des barres conduit \u00e0 un encombrement visuel destructeur. La bonne pratique m\u00e9thodologique repose sur la technique du regroupement d&rsquo;\u00e9cr\u00e9mage (tail collapse) :<\/p>\n<pre><code>top_n = 5\nfrequences = variable_haute_cardinalite.value_counts()\ntop_frequences = frequences.iloc[:top_n]\nreste_frequences = pd.Series({\"Autres cat\u00e9gories\": frequences.iloc[top_n:].sum()})\nfrequences_consolidees = pd.concat([top_frequences, reste_frequences])\n<\/code><\/pre>\n<p>En agr\u00e9geant la longue tra\u00eene des modalit\u00e9s mineures sous une \u00e9tiquette synth\u00e9tique commune, l&rsquo;analyste pr\u00e9serve la fid\u00e9lit\u00e9 de l&rsquo;ordre de grandeur de l&rsquo;\u00e9chantillon tout en maintenant la clart\u00e9 s\u00e9miologique du graphique. Enfin, les principes d&rsquo;accessibilit\u00e9 visuelle imposent d&rsquo;adopter des palettes de couleurs perceptuellement uniformes et compatibles avec les diff\u00e9rentes formes de dyschromatopsie (daltonisme), telles que les \u00e9chelles viridis, plasma ou cividis.<\/p>\n<h2>10. Optimisation des performances et gestion de la m\u00e9moire sur grands volumes<\/h2>\n<h3>10.1 Impact du type category sur la rapidit\u00e9 d&rsquo;ex\u00e9cution<\/h3>\n<p>Dans le traitement de volum\u00e9tries massives de donn\u00e9es (Big Data) exc\u00e9dant plusieurs dizaines de millions d&rsquo;enregistrements, la gestion efficiente de l&rsquo;espace m\u00e9moire et du temps de calcul machine devient un imp\u00e9ratif d&rsquo;ing\u00e9nierie critique. L&rsquo;une des optimisations les plus spectaculaires de Pandas repose sur le transtypage des colonnes textuelles du type g\u00e9n\u00e9rique <code>object<\/code> vers le type sp\u00e9cialis\u00e9 <code>category<\/code>.<\/p>\n<p>Lorsqu&rsquo;une s\u00e9rie est typ\u00e9e en tant qu&rsquo;<code>object<\/code>, chaque cellule encapsule un pointeur formel vers une cha\u00eene de caract\u00e8res allou\u00e9e de mani\u00e8re dispers\u00e9e au sein de la m\u00e9moire vive heap de Python. Lors de l&rsquo;ex\u00e9cution de <code>value_counts()<\/code>, le processeur doit d\u00e9r\u00e9f\u00e9rencer chaque pointeur individuellement, extraire l&rsquo;objet cha\u00eene et calculer sa signature de hachage. En revanche, le type <code>category<\/code> impl\u00e9mente un m\u00e9canisme d&rsquo;encodage par dictionnaire interne : chaque modalit\u00e9 textuelle unique est stock\u00e9e une seule fois dans un registre de r\u00e9f\u00e9rence, et le vecteur de donn\u00e9es lui-m\u00eame n&rsquo;est constitu\u00e9 que d&rsquo;un tableau compact d&rsquo;entiers de bas niveau (entiers sign\u00e9s 8, 16 ou 32 bits selon la cardinalit\u00e9 du domaine) pointant vers les indices de ce catalogue.<\/p>\n<p>D\u00e8s lors, l&rsquo;ex\u00e9cution de <code>value_counts()<\/code> sur une colonne de type <code>category<\/code> s&rsquo;affranchit totalement du co\u00fbt de hachage des cha\u00eenes textuelles. L&rsquo;algorithme se r\u00e9sume \u00e0 une simple incr\u00e9mentation d&rsquo;indices entiers au sein d&rsquo;un tableau d&rsquo;accumulateurs de dimension fixe. Sur des bancs d&rsquo;essai standardis\u00e9s impliquant un \u00e9chantillon de 10 millions de lignes comportant une dizaine de cat\u00e9gories distinctes, le basculement vers le type <code>category<\/code> r\u00e9duit g\u00e9n\u00e9ralement l&#8217;empreinte m\u00e9moire d&rsquo;un facteur 4 \u00e0 8, tout en multipliant la vitesse d&rsquo;ex\u00e9cution de <code>value_counts()<\/code> par un facteur 3 \u00e0 5.<\/p>\n<h3>10.2 Complexit\u00e9 algorithmique spatiale et temporelle du hachage<\/h3>\n<p>La m\u00e9canique intime qui r\u00e9git l&rsquo;efficacit\u00e9 de <code>value_counts()<\/code> repose sur l&rsquo;impl\u00e9mentation d&rsquo;une table de hachage de pointe d\u00e9velopp\u00e9e au sein du noyau C\/Cython de Pandas (khash). La compr\u00e9hension de sa complexit\u00e9 algorithmique permet d&rsquo;anticiper son comportement face \u00e0 des architectures de donn\u00e9es divergentes.<\/p>\n<p>Sur le plan de la complexit\u00e9 temporelle, l&rsquo;\u00e9tape initiale d&rsquo;insertion et de comptage des \u00e9l\u00e9ments op\u00e8re en temps amorti moyen lin\u00e9aire not\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{O}(N)\">$\\mathcal{O}(N)$<\/span>, o\u00f9 <span class=\"arabpsy-math-inline\" data-latex=\"N\">$N$<\/span> repr\u00e9sente le nombre total d&rsquo;enregistrements composant la s\u00e9rie. L&rsquo;acc\u00e8s, la recherche et l&rsquo;incr\u00e9mentation de la fr\u00e9quence d&rsquo;une cl\u00e9 au sein d&rsquo;une table de hachage bien dimensionn\u00e9e s&rsquo;effectuent en temps constant moyen <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{O}(1)\">$\\mathcal{O}(1)$<\/span>. Une fois l&rsquo;int\u00e9gralit\u00e9 du tableau balay\u00e9e, si le param\u00e8tre <code>sort=True<\/code> est activ\u00e9, l&rsquo;algorithme proc\u00e8de au tri des <span class=\"arabpsy-math-inline\" data-latex=\"M\">$M$<\/span> modalit\u00e9s uniques extraites. Cette phase d&rsquo;ordonnancement pr\u00e9sente une complexit\u00e9 temporelle asymptotique de l&rsquo;ordre de <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{O}(M \\log M)\">$\\mathcal{O}(M \\log M)$<\/span>. Par cons\u00e9quent, la complexit\u00e9 temporelle globale de l&rsquo;op\u00e9ration se mod\u00e9lise formellement comme suit :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\mathcal{T}_{total} = \\mathcal{O}(N + M \\log M)\">$$\\mathcal{T}_{total} = \\mathcal{O}(N + M \\log M)$$<\/span><\/p>\n<p>Dans la quasi-totalit\u00e9 des contextes analytiques r\u00e9els, la cardinalit\u00e9 des modalit\u00e9s uniques est infinit\u00e9simale par rapport \u00e0 la taille globale de la s\u00e9rie (<span class=\"arabpsy-math-inline\" data-latex=\"M ll N\">$M ll N$<\/span>), ce qui conf\u00e8re \u00e0 la m\u00e9thode un comportement globalement lin\u00e9aire hautement performant. Toutefois, dans les situations pathologiques o\u00f9 la variable approche l&rsquo;unicit\u00e9 absolue (par exemple un identifiant unique ou une cl\u00e9 primaire UUID o\u00f9 <span class=\"arabpsy-math-inline\" data-latex=\"M \\approx N\">$M \\approx N$<\/span>), la d\u00e9gradation des performances devient sensible : les collisions de hachage se multiplient, la table requiert de multiples r\u00e9allocations dynamiques d&rsquo;espace m\u00e9moire, et le terme de tri <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{O}(N \\log N)\">$\\mathcal{O}(N \\log N)$<\/span> devient pr\u00e9pond\u00e9rant. Dans une telle conjoncture, d\u00e9sactiver imp\u00e9rativement le tri via <code>sort=False<\/code> permet de pr\u00e9server la lin\u00e9arit\u00e9 stricte du temps d&rsquo;ex\u00e9cution.<\/p>\n<h3>10.3 Strat\u00e9gies d&rsquo;extension pour les ensembles de donn\u00e9es massifs<\/h3>\n<p>Lorsque le volume d&rsquo;un jeu de donn\u00e9es outrepasse la capacit\u00e9 physique de la m\u00e9moire vive install\u00e9e sur la machine d&rsquo;analyse (fichiers de plusieurs dizaines ou centaines de gigaoctets), l&rsquo;appel direct et global \u00e0 <code>pd.read_csv()<\/code> suivi de <code>value_counts()<\/code> d\u00e9clenche irr\u00e9m\u00e9diablement une erreur d&rsquo;\u00e9puisement m\u00e9moire de type <code>MemoryError<\/code>. Deux paradigmes d&rsquo;ing\u00e9nierie permettent de surmonter cette barri\u00e8re technique.<\/p>\n<p>La premi\u00e8re strat\u00e9gie repose sur la technique du fractionnement par morceaux (chunking). En mobilisant le param\u00e8tre <code>chunksize<\/code> de l&rsquo;it\u00e9rateur de lecture de Pandas, les donn\u00e9es sont ing\u00e9r\u00e9es de mani\u00e8re s\u00e9quentielle par blocs discrets. \u00c0 l&rsquo;int\u00e9rieur de la boucle de lecture, un appel local \u00e0 <code>value_counts()<\/code> est ex\u00e9cut\u00e9 sur chaque tron\u00e7on, et un accumulateur global consolide les r\u00e9sultats partiels via une addition vectorielle align\u00e9e sur l&rsquo;index :<\/p>\n<pre><code>accumulateur_frequences = pd.Series(dtype=\"int64\")\n\nfor fragment in pd.read_csv(\"registre_colossal.csv\", chunksize=500_000, usecols=[\"VariableInteret\"]):\n    comptages_partiels = fragment[\"VariableInteret\"].value_counts(dropna=False)\n    accumulateur_frequences = accumulateur_frequences.add(comptages_partiels, fill_value=0).astype(\"int64\")\n\naccumulateur_frequences = accumulateur_frequences.sort_values(ascending=False)\n<\/code><\/pre>\n<p>La seconde strat\u00e9gie consiste \u00e0 d\u00e9l\u00e9guer le traitement \u00e0 des biblioth\u00e8ques de calcul parall\u00e8le et distribu\u00e9. L&rsquo;\u00e9cosyst\u00e8me <a rel=\"noopener noreferrer\" href=\"https:\/\/www.dask.org\/\">Dask DataFrame<\/a> \u00e9mule rigoureusement l&rsquo;interface de programmation (API) de Pandas tout en partitionnant les calculs sur l&rsquo;ensemble des c\u0153urs de calcul d&rsquo;une machine ou sur les n\u0153uds d&rsquo;un cluster distant via un graphe de t\u00e2ches asynchrones. De mani\u00e8re concurrente, le moteur computationnel moderne <a rel=\"noopener noreferrer\" href=\"https:\/\/pola.rs\/\">Polars<\/a>, enti\u00e8rement d\u00e9velopp\u00e9 en langage Rust, propose une ex\u00e9cution nativement multithread\u00e9e et vectoris\u00e9e (instructions SIMD), divisant drastiquement les dur\u00e9es d&rsquo;agr\u00e9gation fr\u00e9quentielle sur les architectures multi-c\u0153urs modernes.<\/p>\n<h2>11. Pi\u00e8ges courants, limites statistiques et erreurs d&rsquo;interpr\u00e9tation<\/h2>\n<h3>11.1 Biais induit par l&rsquo;omission involontaire des donn\u00e9es manquantes<\/h3>\n<p>L&rsquo;omission involontaire des valeurs nulles r\u00e9sultant de la configuration standard <code>dropna=True<\/code> constitue incontestablement la b\u00e9vue m\u00e9thodologique la plus fr\u00e9quente et la plus insidieuse en analyse exploratoire. Les r\u00e9percussions de ce comportement par d\u00e9faut s&rsquo;av\u00e8rent d\u00e9vastatrices lorsque le statisticien encha\u00eene sans pr\u00e9caution le calcul des proportions relatives par l&rsquo;entremise de <code>normalize=True<\/code>.<\/p>\n<p>Pour saisir l&rsquo;ampleur du biais math\u00e9matique induit, supposons une cohorte m\u00e9dicale de <span class=\"arabpsy-math-inline\" data-latex=\"N = 1,000\">$N = 1,000$<\/span> patients recrut\u00e9s pour tester l&rsquo;innocuit\u00e9 d&rsquo;un compos\u00e9 pharmaceutique. Lors du suivi, 600 patients omettent de renseigner le questionnaire de tol\u00e9rance (valeurs nulles), 300 rapportent une absence totale d&rsquo;effets ind\u00e9sirables, et 100 signalent des c\u00e9phal\u00e9es s\u00e9v\u00e8res. Si l&rsquo;analyste ex\u00e9cute l&rsquo;instruction candide <code>serie.value_counts(normalize=True)<\/code>, Pandas exclut d&#8217;embl\u00e9e les 600 observations manquantes. Le d\u00e9nominateur de la normalisation est alors r\u00e9duit \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"300 + 100 = 400\">$300 + 100 = 400$<\/span>. Le r\u00e9sultat indiquera que 75 % des patients tol\u00e8rent parfaitement le traitement et que 25 % pr\u00e9sentent des c\u00e9phal\u00e9es.<\/p>\n<p>L&rsquo;interpr\u00e9tation de ces chiffres comme refl\u00e9tant l&rsquo;\u00e9tat de la cohorte est fallacieuse : la proportion r\u00e9elle d&rsquo;effets ind\u00e9sirables document\u00e9s au sein de l&rsquo;\u00e9chantillon brut total n&rsquo;est pas de 25 %, mais rigoureusement de <span class=\"arabpsy-math-inline\" data-latex=\"\\frac{100}{1,000} = 10,%\">$\\frac{100}{1,000} = 10,%$<\/span>. Si l&rsquo;absence de r\u00e9ponse est corr\u00e9l\u00e9e \u00e0 un abandon pour intol\u00e9rance majeure (m\u00e9canisme MNAR), la distorsion des estimations de risque compromet l&rsquo;int\u00e9grit\u00e9 de l&rsquo;\u00e9valuation clinique. L&rsquo;audit de donn\u00e9es impose ainsi d&rsquo;ex\u00e9cuter syst\u00e9matiquement une double \u00e9valuation : une analyse restreinte aux cas valides et une analyse globale en population totale sp\u00e9cifiant formellement <code>dropna=False<\/code>.<\/p>\n<h3>11.2 Confusion entre indexation positionnelle et indexation par \u00e9tiquettes<\/h3>\n<p>Une source chronique de bogues informatiques r\u00e9side dans l&rsquo;ambigu\u00eft\u00e9 entourant l&rsquo;interrogation de l&rsquo;objet <code>Series<\/code> g\u00e9n\u00e9r\u00e9 par <code>value_counts()<\/code>, tout particuli\u00e8rement lorsque la variable d\u00e9nombr\u00e9e est elle-m\u00eame de nature num\u00e9rique enti\u00e8re. Consid\u00e9rons une variable mesurant le nombre de comorbidit\u00e9s associ\u00e9es chez des patients, dont les valeurs observ\u00e9es s&rsquo;\u00e9tendent de 0 \u00e0 4.<\/p>\n<p>L&rsquo;application de <code>value_counts()<\/code> produit une s\u00e9rie dont les valeurs sont les occurrences calcul\u00e9es, et dont l&rsquo;index est constitu\u00e9 des entiers 0, 1, 2, 3, 4. Supposons que le mode de la s\u00e9rie soit la valeur 2 (observ\u00e9e 50 fois), suivie par la valeur 0 (observ\u00e9e 30 fois). La s\u00e9rie r\u00e9sultante d\u00e9bute donc comme suit :<\/p>\n<ul>\n<li>Index 2 : Valeur 50<\/li>\n<li>Index 0 : Valeur 30<\/li>\n<\/ul>\n<p>Si un programmeur non averti r\u00e9dige l&rsquo;instruction <code>resultat[0]<\/code>, un comportement pernicieux \u00e9merge en fonction des versions de Pandas et des r\u00e8gles de d\u00e9pr\u00e9ciation : l&rsquo;instruction peut \u00eatre interpr\u00e9t\u00e9e soit comme une recherche de l&rsquo;\u00e9tiquette 0 (qui renverra la valeur 30), soit comme une s\u00e9lection du premier \u00e9l\u00e9ment par position ordinale (qui renverra la valeur 50). Pour \u00e9liminer toute ambigu\u00eft\u00e9 de syntaxe, l&rsquo;analyste doit imp\u00e9rativement bannir l&rsquo;indexation directe entre crochets et recourir exclusivement aux accesseurs canoniques :<\/p>\n<ul>\n<li><code>resultat.loc[0]<\/code> : garantit sans \u00e9quivoque la s\u00e9lection de la modalit\u00e9 dont l&rsquo;\u00e9tiquette nominale est \u00e9gale \u00e0 0.<\/li>\n<li><code>resultat.iloc[0]<\/code> : garantit de fa\u00e7on d\u00e9terministe l&rsquo;extraction de la valeur positionn\u00e9e au premier rang ordinal de la s\u00e9rie (le mode de la distribution).<\/li>\n<\/ul>\n<p>Alternativement, l&rsquo;application imm\u00e9diate de <code>.reset_index()<\/code> transforme la structure en un DataFrame s\u00e9curis\u00e9 \u00e0 deux colonnes distinctes, neutralisant d\u00e9finitivement ce risque d&rsquo;interf\u00e9rence s\u00e9mantique.<\/p>\n<h3>11.3 Traitement inad\u00e9quat des types de donn\u00e9es mixtes et flottants<\/h3>\n<p>La pr\u00e9sence de types de donn\u00e9es h\u00e9t\u00e9rog\u00e8nes au sein d&rsquo;une m\u00eame colonne constitue un \u00e9cueil classique lors de l&rsquo;ingestion de fichiers mal form\u00e9s (tels que des extractions Excel corrompues). La m\u00e9thode <code>value_counts()<\/code> distingue strictement les types sous-jacents lors de ses op\u00e9rations d&rsquo;\u00e9galit\u00e9 par hachage. Par cons\u00e9quent, au sein d&rsquo;une s\u00e9rie contamin\u00e9e, la valeur enti\u00e8re <code>1<\/code> et la cha\u00eene de caract\u00e8res <code>\"1\"<\/code> seront comptabilis\u00e9es comme deux modalit\u00e9s distinctes et \u00e9tanches, scindant artificiellement l&rsquo;effectif r\u00e9el de la cat\u00e9gorie.<\/p>\n<p>Un ph\u00e9nom\u00e8ne d&rsquo;une \u00e9gale gravit\u00e9 concerne le d\u00e9nombrement direct de variables num\u00e9riques flottantes (<code>float<\/code>). En raison des approximations inh\u00e9rentes \u00e0 la norme de repr\u00e9sentation binaire \u00e0 virgule flottante IEEE 754, deux valeurs qui devraient \u00eatre th\u00e9oriquement identiques \u00e0 la suite d&rsquo;un calcul analytique peuvent diff\u00e9rer au niveau de leur 16e d\u00e9cimale (par exemple <code>0.30000000000000004<\/code> versus <code>0.3<\/code>). La m\u00e9thode <code>value_counts()<\/code> les traitera comme deux cl\u00e9s uniques disjointes.<\/p>\n<p>Enfin, le traitement des cha\u00eenes de caract\u00e8res brutes requiert un assainissement pr\u00e9alable m\u00e9ticuleux. L&rsquo;apparition d&rsquo;espaces typographiques invisibles en fin de mot (trailing spaces), d&rsquo;espaces ins\u00e9cables ou de variations minimes de casse (\u00ab Non \u00bb, \u00ab non \u00bb, \u00ab Non \u00bb) suffit \u00e0 atomiser la distribution empirique. Une r\u00e8gle d&rsquo;ing\u00e9nierie fondamentale impose de nettoyer pr\u00e9alablement la s\u00e9rie via les m\u00e9thodes vectoris\u00e9es de cha\u00eenes textuelles :<\/p>\n<pre><code>serie_nettoyee = serie_textuelle.astype(str).str.strip().str.upper()\nfrequences_valides = serie_nettoyee.value_counts()\n<\/code><\/pre>\n<h2>12. \u00c9tudes de cas appliqu\u00e9es et sc\u00e9narios d&rsquo;analyse psychologique et comportementale<\/h2>\n<h3>12.1 Cas 1 : Analyse des r\u00e9ponses \u00e0 une \u00e9chelle de Likert<\/h3>\n<p>Dans le cadre d&rsquo;un protocole d&rsquo;\u00e9valuation psychom\u00e9trique portant sur l&rsquo;anxi\u00e9t\u00e9 professionnelle, 200 participants ont r\u00e9pondu \u00e0 l&rsquo;affirmation suivante : \u00ab Je ressens une tension nerveuse diffuse au d\u00e9but de chaque journ\u00e9e de travail \u00bb. Les r\u00e9ponses sont recueillies sur une \u00e9chelle de Likert standardis\u00e9e en 5 points ancr\u00e9e de 1 (\u00ab En d\u00e9saccord total \u00bb) \u00e0 5 (\u00ab En accord total \u00bb). L&rsquo;objectif m\u00e9thodologique est d&rsquo;analyser la distribution des r\u00e9ponses, d&rsquo;examiner la sym\u00e9trie de la distribution, et de g\u00e9n\u00e9rer un tableau synth\u00e9tique publiable incluant les fr\u00e9quences cumul\u00e9es.<\/p>\n<p>Le code d&rsquo;analyse s&rsquo;articule comme suit :<\/p>\n<pre><code>import pandas as pd\nimport numpy as np\n\n# Simulation de l'\u00e9chantillon de r\u00e9ponses psychom\u00e9triques (N=200)\nnp.random.seed(42)\nreponses_brutes = pd.Series(\n    np.random.choice([1, 2, 3, 4, 5], size=200, p=[0.10, 0.20, 0.35, 0.25, 0.10]),\n    name=\"Item_Anxiete\"\n)\n\n# Structuration factorielle ordonn\u00e9e\nlibelles = {\n    1: \"1 - D\u00e9saccord total\",\n    2: \"2 - D\u00e9saccord partiel\",\n    3: \"3 - Neutre\",\n    4: \"4 - Accord partiel\",\n    5: \"5 - Accord total\"\n}\nreponses_explicites = reponses_brutes.map(libelles)\n\n# D\u00e9nombrement et ordonnancement selon les ancres th\u00e9oriques\neffectifs_bruts = reponses_explicites.value_counts(sort=False).sort_index()\nproportions = (reponses_explicites.value_counts(normalize=True, sort=False).sort_index() * 100).round(2)\n\n# Calcul des pourcentages cumul\u00e9s pour \u00e9valuer la charge directionnelle\npourcentages_cumules = proportions.cumsum().round(2)\n\n# Consolidation de la table de publication psychom\u00e9trique\nsynthese_likert = pd.DataFrame({\n    \"Effectif brut (n)\": effectifs_bruts,\n    \"Fr\u00e9quence relative (%)\": proportions,\n    \"Fr\u00e9quence cumul\u00e9e (%)\": pourcentages_cumules\n})\n<\/code><\/pre>\n<p>L&rsquo;inspection du tableau r\u00e9sultant offre une lecture psychom\u00e9trique imm\u00e9diate. L&rsquo;examen des pourcentages cumul\u00e9s r\u00e9v\u00e8le que 62,5 % des participants se positionnent sur un \u00e9chelon inf\u00e9rieur ou \u00e9gal au point neutre, r\u00e9futant l&rsquo;hypoth\u00e8se d&rsquo;une anxi\u00e9t\u00e9 g\u00e9n\u00e9ralis\u00e9e au sein de l&rsquo;\u00e9chantillon. La sym\u00e9trie g\u00e9n\u00e9rale des r\u00e9ponses autour de la modalit\u00e9 pivot \u00ab Neutre \u00bb confirme l&rsquo;absence d&rsquo;effet de plafond critique et valide la sensibilit\u00e9 discriminative de l&rsquo;item au sein de la cohorte \u00e9tudi\u00e9e.<\/p>\n<h3>12.2 Cas 2 : Contr\u00f4le d&rsquo;adh\u00e9sion et de conformit\u00e9 dans un essai longitudinal<\/h3>\n<p>Les protocoles longitudinaux en neurosciences et en psychologie de la sant\u00e9 sont particuli\u00e8rement vuln\u00e9rables \u00e0 l&rsquo;\u00e9rosion progressive des effectifs au fur et \u00e0 mesure que les sessions s&rsquo;\u00e9chelonnent dans le temps. Consid\u00e9rons un essai longitudinal \u00e9valuant l&rsquo;efficacit\u00e9 d&rsquo;un protocole d&rsquo;entra\u00eenement cognitif digitalis\u00e9 s&rsquo;\u00e9talant sur trois phases distinctes : Session Initiale (<span class=\"arabpsy-math-inline\" data-latex=\"T_1\">$T_1$<\/span>), Session Interm\u00e9diaire (<span class=\"arabpsy-math-inline\" data-latex=\"T_2\">$T_2$<\/span>), et Session Post-Intervention (<span class=\"arabpsy-math-inline\" data-latex=\"T_3\">$T_3$<\/span>). L&rsquo;analyste doit quantifier l&rsquo;adh\u00e9sion des participants, rep\u00e9rer le moment exact du d\u00e9crochage et identifier si le profil d&rsquo;attrition est asym\u00e9trique selon le groupe d&rsquo;assignation.<\/p>\n<p>La mise en \u0153uvre analytique mobilise l&rsquo;application multidimensionnelle de <code>value_counts()<\/code> :<\/p>\n<pre><code># Mod\u00e9lisation d'une cohorte longitudinale de 150 participants\ndonnees_suivi = pd.DataFrame({\n    \"Groupe\": np.random.choice([\"Entra\u00eenement Actif\", \"Contr\u00f4le Sham\"], size=150),\n    \"T1_Complete\": [\"Oui\"] * 150,\n    \"T2_Complete\": np.random.choice([\"Oui\", \"Non\"], size=150, p=[0.85, 0.15]),\n    \"T3_Complete\": np.random.choice([\"Oui\", \"Non\"], size=150, p=[0.70, 0.30])\n})\n\n# Recodage : un participant absent en T2 ne peut participer en T3\ndonnees_suivi.loc[donnees_suivi[\"T2_Complete\"] == \"Non\", \"T3_Complete\"] = \"Non\"\n\n# Analyse multivari\u00e9e des profils longitudinaux d'adh\u00e9sion\nprofils_attrition = donnees_suivi.value_counts(\n    subset=[\"Groupe\", \"T2_Complete\", \"T3_Complete\"], \n    normalize=True\n).mul(100).round(2).reset_index(name=\"Proportion_Globale\")\n<\/code><\/pre>\n<p>L&rsquo;examen de la table consolid\u00e9e met imm\u00e9diatement en \u00e9vidence le taux d&rsquo;ach\u00e8vement exhaustif du protocole (participants pr\u00e9sentant le triplet \u00ab Oui, Oui, Oui \u00bb) ventil\u00e9 entre le groupe d&rsquo;entra\u00eenement cognitif et le groupe t\u00e9moin sham. Si une disproportion marqu\u00e9e appara\u00eet (par exemple un taux d&rsquo;abandon en <span class=\"arabpsy-math-inline\" data-latex=\"T_3\">$T_3$<\/span> atteignant 40 % dans le groupe actif contre seulement 10 % dans le groupe contr\u00f4le), l&rsquo;\u00e9quipe de recherche doit imp\u00e9rativement questionner la tol\u00e9rance subjective ou l&rsquo;ennui g\u00e9n\u00e9r\u00e9 par la t\u00e2che cognitive avant d&rsquo;inf\u00e9rer la moindre conclusion quant \u00e0 l&rsquo;efficacit\u00e9 du protocole.<\/p>\n<h3>12.3 Cas 3 : D\u00e9tection d&rsquo;anomalies de saisie et de distributions aberrantes<\/h3>\n<p>Au sein d&rsquo;un laboratoire de psychologie cognitive exp\u00e9rimentale, les participants r\u00e9alisent une t\u00e2che de Stroop informatis\u00e9e. Les temps de r\u00e9action (TR) sont automatiquement transcrits en millisecondes dans un fichier de sortie. En raison de d\u00e9faillances de micro-rupteurs du clavier d&rsquo;acquisition ou de tentatives d&rsquo;anticipation motrice r\u00e9flexe, des valeurs physiologiquement aberrantes viennent polluer la distribution : des temps n\u00e9gatifs, des temps quasi-nuls (<span class=\"arabpsy-math-inline\" data-latex=\"TR &lt; 150\">$TR &lt; 150$<\/span> ms) incompatibles avec les temps de conduction axonale et d&rsquo;int\u00e9gration corticale, ou des temps d\u00e9mesur\u00e9s (<span class=\"arabpsy-math-inline\" data-latex=\"TR &gt; 5,000\">$TR &gt; 5,000$<\/span> ms) traduisant un d\u00e9crochage attentionnel du sujet.<\/p>\n<p>L&rsquo;utilisation combin\u00e9e de <code>value_counts()<\/code> avec une discr\u00e9tisation par <code>bins<\/code> permet de construire une routine automatis\u00e9e d&rsquo;audit et d&rsquo;\u00e9lagage des donn\u00e9es :<\/p>\n<pre><code># Simulation d'une s\u00e9rie de temps de r\u00e9action exp\u00e9rimentaux contamin\u00e9s\ntemps_mesures = pd.Series([\n    450, 520, 380, -999, 120, 610, 490, 530, 410, \n    7800, 460, 510, 15, 540, 480, 525, -50\n], name=\"Temps_Reaction\")\n\n# D\u00e9finition de bornes physiologiques rigoureusement justifi\u00e9es\nbornes_cognitives = [-np.inf, 0, 150, 1500, np.inf]\n\n# Quantification syst\u00e9matique des cat\u00e9gories de validit\u00e9\naudit_temps = temps_mesures.value_counts(bins=bornes_cognitives, sort=False)\naudit_temps.index = [\n    \"Artefacts n\u00e9gatifs (Erreurs syst\u00e8me)\",\n    \"Anticipations motrices (< 150 ms)\",\n    \"Temps physiologiques valides [150 - 1500 ms]\",\n    \"Lenteurs \/ Distractions (> 1500 ms)\"\n]\n\n# Calcul des pourcentages de rejet m\u00e9thodologique\nbilan_audit = pd.DataFrame({\n    \"Nombre d'essais\": audit_temps,\n    \"Pourcentage de l'\u00e9chantillon (%)\": (audit_temps \/ len(temps_mesures) * 100).round(2)\n})\n<\/code><\/pre>\n<p>Cette impl\u00e9mentation transforme instantan\u00e9ment une inspection fastidieuse en un protocole de rejet quantifi\u00e9, d\u00e9terministe et reproductible. Les essais chutant dans les intervalles d&rsquo;artefacts ou d&rsquo;anticipation motrice sont imm\u00e9diatement isol\u00e9s et document\u00e9s conform\u00e9ment aux directives m\u00e9thodologiques internationales (notamment les recommandations de l&rsquo;American Psychological Association), garantissant que les mod\u00e8les d&rsquo;analyse de variance ou les mod\u00e9lisations par courbes de diffusion (Drift-Diffusion Models) ult\u00e9rieurs soient appliqu\u00e9s sur un substrat empirique assaini et valide.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>American Psychological Association. (2020). <em>Publication manual of the American Psychological Association<\/em> (7th ed.). American Psychological Association. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1037\/0000165-000\">https:\/\/doi.org\/10.1037\/0000165-000<\/a><\/li>\n<li>Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P., Cournapeau, D., Wieser, E., Taylor, J., Berg, S., Smith, N. J., Kern, R., Picus, M., Hoyer, S., van Kerkwijk, M. H., Brett, M., Haldane, A., del R\u00edo, J. F., Wiebe, M., Peterson, P., \u2026 Oliphant, T. E. (2020). Array programming with NumPy. <em>Nature<\/em>, 585(7825), 357\u2013362. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1038\/s41586-020-2649-2\">https:\/\/doi.org\/10.1038\/s41586-020-2649-2<\/a><\/li>\n<li>Hunter, J. D. (2007). Matplotlib: A 2D graphics environment. <em>Computing in Science &amp; Engineering<\/em>, 9(3), 90\u201395. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1109\/MCSE.2007.55\">https:\/\/doi.org\/10.1109\/MCSE.2007.55<\/a><\/li>\n<li>Little, R. J. A., &amp; Rubin, D. B. (2019). <em>Statistical analysis with missing data<\/em> (3rd ed.). John Wiley &amp; Sons. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1002\/9781119482260\">https:\/\/doi.org\/10.1002\/9781119482260<\/a><\/li>\n<li>McKinney, W. (2010). Data structures for statistical computing in Python. In S. van der Walt &amp; J. Millman (Eds.), <em>Proceedings of the 9th Python in Science Conference<\/em> (pp. 56\u201361). <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.25080\/Majora-92bf1922-00a\">https:\/\/doi.org\/10.25080\/Majora-92bf1922-00a<\/a><\/li>\n<li>McKinney, W. (2022). <em>Python for data analysis: Data wrangling with pandas, NumPy, and Jupyter<\/em> (3rd ed.). O&rsquo;Reilly Media. <a rel=\"noopener noreferrer\" href=\"https:\/\/wesmckinney.com\/book\/\">https:\/\/wesmckinney.com\/book\/<\/a><\/li>\n<li>The pandas development team. (2024). <em>pandas-dev\/pandas: Pandas<\/em> (Version 2.2.0). Zenodo. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.5281\/zenodo.3509134\">https:\/\/doi.org\/10.5281\/zenodo.3509134<\/a><\/li>\n<li>Tufte, E. R. (2001). <em>The visual display of quantitative information<\/em> (2nd ed.). Graphics Press.<\/li>\n<li>Waskom, M. L. (2021). Seaborn: Statistical data visualization. <em>Journal of Open Source Software<\/em>, 6(60), 3021. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.21105\/joss.03021\">https:\/\/doi.org\/10.21105\/joss.03021<\/a><\/li>\n<li>Wickham, H. (2014). Tidy data. <em>Journal of Statistical Software<\/em>, 59(10), 1\u201323. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.18637\/jss.v059.i10\">https:\/\/doi.org\/10.18637\/jss.v059.i10<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide complet pour ma\u00eetriser la fonction Pandas value_counts() : syntaxe, normalisation, valeurs manquantes, binning et analyses de donn\u00e9es avec exemples.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[304,2464],"tags":[1884,5563,2466,2468,2069],"class_list":["post-3545","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-de-recherche","category-science-des-donnees","tag-analyse-de-donnees","tag-exploration-de-donnees","tag-pandas","tag-python","tag-statistique-descriptive"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/3545","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat"}],"about":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/types\/psych_stat"}],"author":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3545"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/3545\/revisions"}],"predecessor-version":[{"id":16508,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/3545\/revisions\/16508"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3545"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3545"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3545"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}