{"id":4893,"date":"2026-09-11T14:18:35","date_gmt":"2026-09-11T14:18:35","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-calculer-centiles-python-exemples\/"},"modified":"2026-09-11T14:18:35","modified_gmt":"2026-09-11T14:18:35","slug":"comment-calculer-centiles-python-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-calculer-centiles-python-exemples","title":{"rendered":"Comment calculer les centiles en Python (avec exemples)"},"content":{"rendered":"<p>Dans le domaine de l&rsquo;analyse exploratoire des donn\u00e9es, de l&rsquo;inf\u00e9rence statistique et de l&rsquo;apprentissage automatique, la caract\u00e9risation rigoureuse de la dispersion et de la tendance centrale d&rsquo;une distribution constitue une \u00e9tape pr\u00e9alable incontournable. Si la moyenne arithm\u00e9tique et l&rsquo;\u00e9cart-type demeurent les m\u00e9triques canoniques de la statistique param\u00e9trique, leur vuln\u00e9rabilit\u00e9 intrins\u00e8que face aux valeurs aberrantes et aux asym\u00e9tries de distribution impose le recours \u00e0 des indicateurs d&rsquo;ordre plus robustes. Les centiles incarnent cette approche non param\u00e9trique par excellence, offrant une segmentation granulaire d&rsquo;un ensemble d&rsquo;observations ordonn\u00e9es afin d&rsquo;en cartographier la morphologie probabiliste sans pr\u00e9supposer la normalit\u00e9 sous-jacente des donn\u00e9es.<\/p>\n<p>Le langage <a rel=\"noopener noreferrer\" href=\"https:\/\/www.python.org\/\">Python<\/a> s&rsquo;est progressivement impos\u00e9 comme la r\u00e9f\u00e9rence contemporaine du calcul scientifique et de l&rsquo;ing\u00e9nierie des donn\u00e9es. Gr\u00e2ce \u00e0 un \u00e9cosyst\u00e8me riche articul\u00e9 autour de biblioth\u00e8ques fondamentales telles que <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/\">NumPy<\/a>, <a rel=\"noopener noreferrer\" href=\"https:\/\/pandas.pydata.org\/\">Pandas<\/a> et <a rel=\"noopener noreferrer\" href=\"https:\/\/scipy.org\/\">SciPy<\/a>, l&rsquo;extraction de m\u00e9triques distributionnelles complexes b\u00e9n\u00e9ficie \u00e0 la fois d&rsquo;une abstraction syntaxique \u00e9l\u00e9gante et d&rsquo;une efficacit\u00e9 algorithmique compil\u00e9e en langage C ou Fortran. N\u00e9anmoins, l&rsquo;apparente simplicit\u00e9 d&rsquo;un appel de fonction dissimule une diversit\u00e9 consid\u00e9rable de subtilit\u00e9s m\u00e9thodologiques, allant des strat\u00e9gies d&rsquo;interpolation math\u00e9matique aux contraintes d&rsquo;alignement dimensionnel le long des tenseurs.<\/p>\n<p>Le pr\u00e9sent article propose une exploration exhaustive, th\u00e9orique et appliqu\u00e9e, du calcul des centiles au sein de l&rsquo;environnement de programmation Python. \u00c0 travers l&rsquo;examen minutieux des fondements statistiques, l&rsquo;analyse comparative des structures de calcul vectoriel, l&rsquo;\u00e9tude des \u00e9cueils computationnels li\u00e9s aux valeurs manquantes et l&rsquo;application concr\u00e8te \u00e0 des jeux de donn\u00e9es r\u00e9els, ce guide a vocation \u00e0 outiller le chercheur, l&rsquo;analyste de donn\u00e9es et l&rsquo;ing\u00e9nieur d&rsquo;une ma\u00eetrise m\u00e9thodologique totale de ces outils fondamentaux d&rsquo;estimation.<\/p>\n<h2>1. Fondements th\u00e9oriques et d\u00e9finition statistique des centiles<\/h2>\n<h3>1.1 D\u00e9finition formelle du n-i\u00e8me centile dans une distribution<\/h3>\n<p>D&rsquo;un point de vue formel, le <em>n<\/em>-i\u00e8me centile, couramment d\u00e9sign\u00e9 sous le terme de percentile dans la litt\u00e9rature anglo-saxonne, repr\u00e9sente la valeur d&rsquo;une variable al\u00e9atoire en de\u00e7\u00e0 de laquelle se situe une proportion d\u00e9termin\u00e9e de <em>n<\/em> pour cent des observations d&rsquo;un \u00e9chantillon ou d&rsquo;une population. Soit un ensemble fini de donn\u00e9es compos\u00e9 de <em>N<\/em> r\u00e9alisations ind\u00e9pendantes et identiquement distribu\u00e9es, not\u00e9es <em>X<\/em> = {<em>x<\/em><sub>1<\/sub>, <em>x<\/em><sub>2<\/sub>, &#8230;, <em>x<\/em><sub><em>N<\/em><\/sub>}. Lorsque ces observations sont r\u00e9ordonn\u00e9es selon une relation d&rsquo;ordre non d\u00e9croissante telle que <em>x<\/em><sub>(1)<\/sub> &le; <em>x<\/em><sub>(2)<\/sub> &le; &#8230; &le; <em>x<\/em><sub>(<em>N<\/em>)<\/sub>, le <em>n<\/em>-i\u00e8me centile constitue le point de coupure partitionnant cette s\u00e9rie ordonn\u00e9e de mani\u00e8re \u00e0 ce que <em>n<\/em>% des valeurs lui soient inf\u00e9rieures ou \u00e9gales.<\/p>\n<p>Dans le cadre de la th\u00e9orie des probabilit\u00e9s, cette notion s&rsquo;articule directement avec la fonction de r\u00e9partition cumulative empirique, fr\u00e9quemment d\u00e9sign\u00e9e par l&rsquo;acronyme ECDF pour <em>Empirical Cumulative Distribution Function<\/em>. Si l&rsquo;on d\u00e9signe par <em>F<\/em>(<em>x<\/em>) = <em>P<\/em>(<em>X<\/em> &le; <em>x<\/em>) la fonction de r\u00e9partition th\u00e9orique d&rsquo;une variable al\u00e9atoire continue, le quantile d&rsquo;ordre <em>p<\/em> (o\u00f9 <em>p<\/em> = <em>n<\/em> \/ 100 avec <em>p<\/em> &isin; [0, 1]) est d\u00e9fini math\u00e9matiquement comme l&rsquo;infimum des valeurs de <em>x<\/em> v\u00e9rifiant <em>F<\/em>(<em>x<\/em>) &ge; <em>p<\/em>, ce qui correspond \u00e0 la fonction quantile inverse : <em>Q<\/em>(<em>p<\/em>) = inf{<em>x<\/em> &isin; &real; : <em>F<\/em>(<em>x<\/em>) &ge; <em>p<\/em>}. Cette formulation probabiliste met en exergue la distinction fondamentale entre une estimation param\u00e9trique, tributaire de param\u00e8tres de position et d&rsquo;\u00e9chelle au sein d&rsquo;une famille de lois pr\u00e9d\u00e9finie, et une estimation non param\u00e9trique, libre de tout mod\u00e8le a priori.<\/p>\n<p>Une propri\u00e9t\u00e9 math\u00e9matique cruciale des centiles r\u00e9side dans leur invariance d&rsquo;\u00e9chelle face aux transformations strictement monotones. Soit une transformation <em>g<\/em>: &real; &rarr; &real; strictement croissante ; le centile d&rsquo;ordre <em>n<\/em> de la variable transform\u00e9e <em>Y<\/em> = <em>g<\/em>(<em>X<\/em>) correspond rigoureusement \u00e0 l&rsquo;image par <em>g<\/em> du centile d&rsquo;ordre <em>n<\/em> de la variable d&rsquo;origine <em>X<\/em>, c&rsquo;est-\u00e0-dire <em>Q<\/em><sub><em>Y<\/em><\/sub>(<em>p<\/em>) = <em>g<\/em>(<em>Q<\/em><sub><em>X<\/em><\/sub>(<em>p<\/em>)). Cette propri\u00e9t\u00e9 conf\u00e8re aux centiles une robustesse exceptionnelle lors de manipulations alg\u00e9briques non lin\u00e9aires, telles que l&rsquo;application d&rsquo;un logarithme ou d&rsquo;une fonction puissance, pr\u00e9servant int\u00e9gralement l&rsquo;ordonnancement relatif des rangs statistiques.<\/p>\n<h3>1.2 Distinction math\u00e9matique entre centiles, quartiles et d\u00e9ciles<\/h3>\n<p>L&rsquo;analyse distributionnelle repose sur une hi\u00e9rarchie de quantiles d&rsquo;ordres vari\u00e9s, dont la nomenclature refl\u00e8te le facteur de subdivision de l&rsquo;espace des donn\u00e9es. Tandis que les centiles op\u00e8rent une partition de la distribution en cent fractions d&rsquo;effectifs th\u00e9oriquement \u00e9gaux, les quartiles la divisent en quatre segments \u00e9quiprobables de 25% chacun, et les d\u00e9ciles en dix segments de 10%. Il existe une stricte \u00e9quivalence formelle entre ces diff\u00e9rents d\u00e9coupages : le premier quartile (Q1) correspond invariablement au 25e centile, le deuxi\u00e8me quartile (Q2) co\u00efncide avec le 50e centile, et le troisi\u00e8me quartile (Q3) s&rsquo;identifie au 75e centile. De la m\u00eame mani\u00e8re, le premier d\u00e9cile (D1) \u00e9quivaut au 10e centile, tandis que le neuvi\u00e8me d\u00e9cile (D9) mat\u00e9rialise le 90e centile.<\/p>\n<p>Au c\u0153ur de cette architecture se dresse la m\u00e9diane, param\u00e8tre de position central correspondant au 50e centile de la s\u00e9rie observ\u00e9e. Contrairement \u00e0 la moyenne arithm\u00e9tique qui int\u00e8gre l&rsquo;amplitude quantitative de chaque observation, la m\u00e9diane ne sollicite que l&rsquo;information relative \u00e0 l&rsquo;ordre des \u00e9l\u00e9ments. Elle minimise l&rsquo;esp\u00e9rance de l&rsquo;\u00e9cart absolu, garantissant une s\u00e9paration rigoureuse de la population en deux sous-ensembles de m\u00eame taille. Cette propri\u00e9t\u00e9 en fait le pivot de la statistique non param\u00e9trique, stabilisant les diagnostics quantitatifs au sein d&rsquo;\u00e9chantillons marqu\u00e9s par des distributions asym\u00e9triques ou tronqu\u00e9es.<\/p>\n<p>L&rsquo;\u00e9cartement relatif de ces seuils structurels fournit une mesure standardis\u00e9e de la dispersion de l&rsquo;\u00e9chantillon. L&rsquo;intervalle interquartile, d\u00e9fini par la diff\u00e9rence alg\u00e9brique <em>IQR<\/em> = Q3 &#8211; Q1, englobe la moiti\u00e9 centrale de la masse empirique des donn\u00e9es. L&rsquo;intervalle semi-interquartile, obtenu en divisant l&rsquo;<em>IQR<\/em> par deux, sert d&rsquo;estimateur d&rsquo;\u00e9chelle alternatif \u00e0 l&rsquo;\u00e9cart-type, offrant une m\u00e9trique de variabilit\u00e9 exempte des d\u00e9formations provoqu\u00e9es par les valeurs situ\u00e9es aux extr\u00e9mit\u00e9s de la distribution.<\/p>\n<h3>1.3 R\u00f4le des centiles dans l&rsquo;analyse de donn\u00e9es empiriques<\/h3>\n<p>L&rsquo;int\u00e9r\u00eat pr\u00e9pond\u00e9rant des centiles dans le traitement des jeux de donn\u00e9es r\u00e9els d\u00e9coule de leur r\u00e9sistance intrins\u00e8que face aux valeurs aberrantes extr\u00eames (commun\u00e9ment d\u00e9sign\u00e9es par le terme anglais d&rsquo;<em>outliers<\/em>). Dans de nombreuses disciplines appliqu\u00e9es, telles que la biom\u00e9trie, la psychom\u00e9trie, les sciences \u00e9conomiques ou l&rsquo;ing\u00e9nierie de la fiabilit\u00e9, les instruments de mesure enregistrent des art\u00e9facts techniques ou des \u00e9v\u00e9nements exceptionnels qui biaisent drastiquement les moments polynomiaux de la distribution. Tandis qu&rsquo;une unique valeur infiniment grande d\u00e9truit la pertinence d&rsquo;une moyenne ou d&rsquo;une variance, elle laisse inchang\u00e9s l&rsquo;ensemble des centiles situ\u00e9s en de\u00e7\u00e0 du rang maximal.<\/p>\n<p>Au-del\u00e0 de leur r\u00e9sistance analytique, les centiles constituent un outil privil\u00e9gi\u00e9 pour caract\u00e9riser l&rsquo;asym\u00e9trie distributionnelle sans n\u00e9cessiter le calcul d&rsquo;un coefficient de Skewness de Fisher-Pearson. En \u00e9valuant la dissym\u00e9trie spatiale entre la m\u00e9diane et les seuils p\u00e9riph\u00e9riques, notamment \u00e0 travers l&rsquo;\u00e9cart inter-centile (par exemple la diff\u00e9rence entre le 90e et le 10e centile rapport\u00e9e \u00e0 l&rsquo;\u00e9cart interquartile), le praticien peut diagnostiquer imm\u00e9diatement la pr\u00e9sence d&rsquo;un \u00e9talement asym\u00e9trique \u00e0 droite (asym\u00e9trie positive) ou \u00e0 gauche (asym\u00e9trie n\u00e9gative). Cette approche g\u00e9om\u00e9trique offre une lecture directe des queues de distribution souvent invisibles lors d&rsquo;une simple r\u00e9duction univari\u00e9e.<\/p>\n<p>Enfin, les centiles fournissent une passerelle m\u00e9thodologique essentielle pour l&rsquo;interpr\u00e9tation des donn\u00e9es continues converties sur des \u00e9chelles ordinales standardis\u00e9es. Dans le cadre de l&rsquo;\u00e9valuation clinique ou du calibrage de syst\u00e8mes de cotation industrielle, la valeur absolue brute d&rsquo;une m\u00e9trique importe souvent moins que son positionnement relatif au sein d&rsquo;une cohorte de r\u00e9f\u00e9rence. Exprimer une mesure sous la forme d&rsquo;un rang centile permet de neutraliser les divergences dimensionnelles d&rsquo;\u00e9chelles disparates et d&rsquo;\u00e9tablir un r\u00e9f\u00e9rentiel universellement intelligible pour la prise de d\u00e9cision op\u00e9rationnelle.<\/p>\n<h2>2. Environnement Python et configuration pour l&rsquo;analyse num\u00e9rique<\/h2>\n<h3>2.1 S\u00e9lection et installation des biblioth\u00e8ques fondamentales<\/h3>\n<p>Pour ex\u00e9cuter des calculs de centiles \u00e0 haute performance, l&rsquo;interpr\u00e9teur Python standard doit \u00eatre adoss\u00e9 \u00e0 un \u00e9cosyst\u00e8me de calcul matriciel optimis\u00e9. Le socle incontournable de cette infrastructure est constitu\u00e9 par la biblioth\u00e8que <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/\">NumPy<\/a>, qui impl\u00e9mente le type fondamental <code>ndarray<\/code>, permettant la manipulation de conteneurs contigus en m\u00e9moire et la vectorisation des op\u00e9rations statistiques \u00e9crites en C. L&rsquo;\u00e9chelon sup\u00e9rieur est assur\u00e9 par la biblioth\u00e8que <a rel=\"noopener noreferrer\" href=\"https:\/\/pandas.pydata.org\/\">Pandas<\/a>, con\u00e7ue sp\u00e9cifiquement pour le traitement des donn\u00e9es structur\u00e9es h\u00e9t\u00e9rog\u00e8nes au moyen de structures tabulaires de type <code>DataFrame<\/code> et de vecteurs \u00e9tiquet\u00e9s <code>Series<\/code>.<\/p>\n<p>En compl\u00e9ment de ces deux modules primordiaux, la suite logicielle <a rel=\"noopener noreferrer\" href=\"https:\/\/scipy.org\/\">SciPy<\/a>, via son sous-module <code>scipy.stats<\/code>, met \u00e0 disposition une panoplie de fonctions statistiques sp\u00e9cialis\u00e9es consacr\u00e9es aux lois de probabilit\u00e9 continues et discr\u00e8tes, facilitant l&rsquo;estimation de quantiles pond\u00e9r\u00e9s, conditionnels ou invers\u00e9s. L&rsquo;installation conjointe de ces biblioth\u00e8ques au sein d&rsquo;un environnement de production n\u00e9cessite le recours \u00e0 des gestionnaires d&rsquo;environnements virtuels isol\u00e9s tels que <code>venv<\/code> ou <a rel=\"noopener noreferrer\" href=\"https:\/\/docs.conda.io\/en\/latest\/\">Conda<\/a>, pr\u00e9venant ainsi les conflits d&rsquo;interd\u00e9pendance binaire entre versions compil\u00e9es.<\/p>\n<p>Une configuration optimale de l&rsquo;espace de travail s&rsquo;effectue g\u00e9n\u00e9ralement par l&rsquo;ex\u00e9cution de commandes de gestion de paquets standardis\u00e9es via le terminal syst\u00e8me :<\/p>\n<p><code>python -m venv stat_env<\/code><br \/>\n<code>source stat_env\/bin\/activate<\/code><br \/>\n<code>pip install numpy pandas scipy matplotlib seaborn<\/code><\/p>\n<p>Ce protocole assure l&rsquo;instanciation d&rsquo;un interpr\u00e9teur reproductible, ind\u00e9pendant des configurations globales du syst\u00e8me d&rsquo;exploitation, et garantit la parfaite compatibilit\u00e9 des biblioth\u00e8ques de bas niveau indispensables aux acc\u00e9l\u00e9rations mat\u00e9rielles BLAS (<em>Basic Linear Algebra Subprograms<\/em>) et LAPACK (<em>Linear Algebra Package<\/em>).<\/p>\n<h3>2.2 Reproductibilit\u00e9 scientifique et initialisation du g\u00e9n\u00e9rateur al\u00e9atoire<\/h3>\n<p>L&rsquo;exp\u00e9rimentation statistique et la validation des mod\u00e8les d&rsquo;\u00e9valuation de centiles reposent fondamentalement sur la g\u00e9n\u00e9ration d&rsquo;\u00e9chantillons synth\u00e9tiques repr\u00e9sentatifs de variables continues. Pour assurer une reproductibilit\u00e9 scientifique rigoureuse, condition sine qua non de toute d\u00e9marche empirique r\u00e9plicable, il s&rsquo;av\u00e8re imp\u00e9ratif de contr\u00f4ler le m\u00e9canisme de g\u00e9n\u00e9ration de nombres pseudo-al\u00e9atoires. Historiquement, l&rsquo;environnement NumPy exploitait la fonction d&rsquo;initialisation <code>numpy.random.seed()<\/code>, laquelle configurait un \u00e9tat global statique pour le g\u00e9n\u00e9rateur de Mersenne Twister (MT19937).<\/p>\n<p>Les versions contemporaines de NumPy ont profond\u00e9ment modernis\u00e9 cette approche en d\u00e9pr\u00e9ciant la modification de l&rsquo;\u00e9tat global au profit de l&rsquo;instanciation explicite d&rsquo;un g\u00e9n\u00e9rateur via la classe <code>numpy.random.default_rng()<\/code>. Ce g\u00e9n\u00e9rateur moderne met en \u0153uvre l&rsquo;algorithme PCG64 (<em>Permuted Congruential Generator<\/em>), offrant des propri\u00e9t\u00e9s statistiques largement sup\u00e9rieures en termes de p\u00e9riode, de distribution multidimensionnelle et d&rsquo;imperm\u00e9abilit\u00e9 aux corr\u00e9lations ind\u00e9sirables dans les calculs hautement parall\u00e9lis\u00e9s.<\/p>\n<p>L&rsquo;instanciation de ce g\u00e9n\u00e9rateur permet de synth\u00e9tiser des distributions complexes selon des lois param\u00e9triques parfaitement reproductibles :<\/p>\n<p><code>import numpy as np<\/code><br \/>\n<code>rng = np.random.default_rng(seed=42)<\/code><br \/>\n<code>echantillon_continu = rng.normal(loc=100.0, scale=15.0, size=1000)<\/code><\/p>\n<p>L&rsquo;utilisation d&rsquo;une graine explicite (ici l&rsquo;entier 42) garantit que toute ex\u00e9cution ult\u00e9rieure du script num\u00e9rique produira une s\u00e9quence strictement identique d&rsquo;observations simul\u00e9es, condition indispensable \u00e0 l&rsquo;auditabilit\u00e9 du code et \u00e0 l&rsquo;exactitude des d\u00e9monstrations m\u00e9thodologiques.<\/p>\n<h3>2.3 Structuration formelle des donn\u00e9es brutes en entr\u00e9e<\/h3>\n<p>L&rsquo;efficacit\u00e9 computationnelle des algorithmes de calcul de quantiles en Python d\u00e9pend intimement de l&rsquo;agencement interne des structures de donn\u00e9es en m\u00e9moire vive. Les collections natives du langage Python, \u00e0 l&rsquo;instar des listes standards (<code>list<\/code>), constituent des tableaux de pointeurs pointant vers des objets Python g\u00e9n\u00e9riques dispers\u00e9s de fa\u00e7on non contigu\u00eb dans la m\u00e9moire dynamique (<em>heap<\/em>). Cette architecture entra\u00eene une importante surcharge cognitive pour le processeur, provoqu\u00e9e par le d\u00e9r\u00e9f\u00e9rencement constant des adresses et l&rsquo;impossibilit\u00e9 d&rsquo;exploiter efficacement les m\u00e9canismes de mise en m\u00e9moire cache L1\/L2.<\/p>\n<p>L&rsquo;exploitation de structures <code>ndarray<\/code> de NumPy pallie cette d\u00e9ficience structurelle en imposant un typage strict et une stricte homog\u00e9n\u00e9it\u00e9 m\u00e9moire. Chaque \u00e9l\u00e9ment d&rsquo;un vecteur num\u00e9rique est cod\u00e9 selon un format binaire invariable (par exemple <code>numpy.float64<\/code> ou <code>numpy.int32<\/code>), log\u00e9 dans un bloc de m\u00e9moire s\u00e9quentiel et contigu (agencement de type <em>C-contiguous<\/em> ou <em>Fortran-contiguous<\/em>). Cette compacit\u00e9 autorise l&rsquo;interpr\u00e9teur \u00e0 ex\u00e9cuter des instructions vectorielles SIMD (<em>Single Instruction, Multiple Data<\/em>), optimisant consid\u00e9rablement les routines de tri et de recherche ordonn\u00e9e indispensables au calcul des centiles.<\/p>\n<p>La conversion syst\u00e9matique des structures natives h\u00e9t\u00e9rog\u00e8nes vers des tableaux typ\u00e9s doit \u00eatre ex\u00e9cut\u00e9e pr\u00e9alablement \u00e0 toute op\u00e9ration statistique :<\/p>\n<p><code>donnees_brutes = [14.2, 18.5, 9.8, 12.1, 15.6]<\/code><br \/>\n<code>vecteur_optimise = np.array(donnees_brutes, dtype=np.float64)<\/code><\/p>\n<p>Ce formalisme pr\u00e9vient les d\u00e9gradations de performance induites par le transtypage implicite et pr\u00e9pare la structure de donn\u00e9es \u00e0 supporter les calculs matriciels de grande \u00e9chelle.<\/p>\n<h2>3. Calcul \u00e9l\u00e9mentaire des centiles avec la fonction numpy.percentile()<\/h2>\n<h3>3.1 Syntaxe g\u00e9n\u00e9rale et param\u00e8tres essentiels de numpy.percentile()<\/h3>\n<p>Au sein de la biblioth\u00e8que NumPy, la fonction <code>numpy.percentile()<\/code> s&rsquo;impose comme l&rsquo;op\u00e9rateur fondamental pour d\u00e9river un ou plusieurs centiles \u00e0 partir d&rsquo;un ensemble d&rsquo;observations num\u00e9riques. La signature de cette m\u00e9thode regroupe un param\u00e8tre obligatoire principal et une s\u00e9rie d&rsquo;arguments de configuration facultatifs : <code>numpy.percentile(a, q, axis=None, out=None, overwrite_input=False, method='linear', keepdims=False)<\/code>. L&rsquo;argument obligatoire <code>a<\/code> attend le conteneur des donn\u00e9es sources, lequel peut prendre la forme d&rsquo;un tableau de dimension quelconque ou d&rsquo;un objet convertible en <code>ndarray<\/code>.<\/p>\n<p>Le second argument, not\u00e9 <code>q<\/code>, d\u00e9signe l&rsquo;ordre du centile recherch\u00e9. Contrairement \u00e0 certaines conventions de th\u00e9orie math\u00e9matique qui expriment les quantiles sur l&rsquo;intervalle unitaire r\u00e9el [0, 1], la fonction <code>numpy.percentile()<\/code> exige une sp\u00e9cification stricte \u00e0 l&rsquo;int\u00e9rieur de l&rsquo;intervalle ferm\u00e9 [0, 100]. Ce param\u00e8tre accepte aussi bien un scalaire unique \u00e0 virgule flottante qu&rsquo;un it\u00e9rable (liste, tuple, tableau unidimensionnel) de fractions percentiles. Toute tentative de sp\u00e9cifier une valeur en dehors de ces bornes d&rsquo;exclusion provoque la lev\u00e9e d&rsquo;une exception de type <code>ValueError<\/code>.<\/p>\n<p>Par d\u00e9faut, la fonction op\u00e8re sur l&rsquo;int\u00e9gralit\u00e9 du tableau pr\u00e9alablement aplati en un vecteur unidimensionnel lorsque le param\u00e8tre <code>axis<\/code> conserve sa valeur nulle par d\u00e9faut. L&rsquo;argument <code>overwrite_input<\/code>, param\u00e9tr\u00e9 par d\u00e9faut sur <code>False<\/code>, peut \u00eatre forc\u00e9 \u00e0 <code>True<\/code> afin d&rsquo;autoriser l&rsquo;algorithme \u00e0 modifier directement en m\u00e9moire l&rsquo;ordonnancement du tableau source au cours des phases de tri partiel, \u00e9conomisant ainsi de substantielles allocations d&rsquo;adresses m\u00e9moires interm\u00e9diaires sur les tr\u00e8s grands volumes de donn\u00e9es.<\/p>\n<h3>3.2 Calcul d&rsquo;un centile unique sur un vecteur de donn\u00e9es<\/h3>\n<p>Pour appr\u00e9hender le m\u00e9canisme \u00e9l\u00e9mentaire de la m\u00e9thode, consid\u00e9rons la constitution d&rsquo;un vecteur de cent valeurs discr\u00e8tes al\u00e9atoires, calibr\u00e9es sur un domaine d&rsquo;observation d\u00e9termin\u00e9, afin d&rsquo;en extraire un centile unitaire arbitraire, tel que le 37e centile :<\/p>\n<p><code>import numpy as np<\/code><br \/>\n<code>generateur = np.random.default_rng(123)<\/code><br \/>\n<code>observations = generateur.integers(low=1, high=500, size=100)<\/code><br \/>\n<code>centile_37 = np.percentile(observations, q=37)<\/code><\/p>\n<p>Le calcul aboutit \u00e0 une valeur num\u00e9rique scalaire repr\u00e9sentative du point d&rsquo;inflexion distributionnel. L&rsquo;algorithme interne proc\u00e8de d&rsquo;abord au tri conceptuel du vecteur, puis d\u00e9termine la coordonn\u00e9e d&rsquo;indexation continue correspondant au 37e centile selon la formule de rang <em>i<\/em> = <em>q<\/em> &times; (<em>N<\/em> &#8211; 1) \/ 100. Pour <em>N<\/em> = 100 \u00e9l\u00e9ments index\u00e9s de 0 \u00e0 99, l&rsquo;index th\u00e9orique calcul\u00e9 vaut exactement 37 &times; 99 \/ 100 = 36.63.<\/p>\n<p>La valeur num\u00e9rique extraite ne co\u00efncide pas n\u00e9cessairement avec un \u00e9l\u00e9ment brut pr\u00e9sent dans le jeu de donn\u00e9es initial. En raison de la fraction d\u00e9cimale r\u00e9siduelle (0.63), la m\u00e9thode par d\u00e9faut ex\u00e9cute une interpolation lin\u00e9aire barycentrique entre la valeur situ\u00e9e \u00e0 l&rsquo;indice plancher 36 et celle log\u00e9e \u00e0 l&rsquo;indice plafond 37 du vecteur ordonn\u00e9. Cette \u00e9tape garantit la continuit\u00e9 de l&rsquo;estimation statistique sur l&rsquo;ensemble de l&rsquo;espace des donn\u00e9es continues.<\/p>\n<h3>3.3 Extraction vectoris\u00e9e de centiles multiples et quartiles<\/h3>\n<p>L&rsquo;un des avantages majeurs de l&rsquo;impl\u00e9mentation de NumPy r\u00e9side dans sa capacit\u00e9 \u00e0 traiter simultan\u00e9ment un vecteur arbitraire de centiles en une unique passe computationnelle. Plut\u00f4t que d&rsquo;it\u00e9rer manuellement au moyen d&rsquo;une boucle imp\u00e9rative Python pour extraire les quartiles fondamentaux d&rsquo;une s\u00e9rie, il convient d&rsquo;alimenter directement l&rsquo;argument <code>q<\/code> \u00e0 l&rsquo;aide d&rsquo;une collection ordonn\u00e9e de seuils :<\/p>\n<p><code>quartiles = np.percentile(observations, q=[25, 50, 75])<\/code><\/p>\n<p>L&rsquo;objet retourn\u00e9 par l&rsquo;interpr\u00e9teur adopte la forme d&rsquo;un tableau <code>ndarray<\/code> unidimensionnel dont la dimensionnalit\u00e9 refl\u00e8te rigoureusement la longueur de la collection sp\u00e9cifi\u00e9e en entr\u00e9e. L&rsquo;\u00e9l\u00e9ment situ\u00e9 \u00e0 l&rsquo;indice 0 correspond au premier quartile (25e centile), l&rsquo;\u00e9l\u00e9ment d&rsquo;indice 1 mat\u00e9rialise la m\u00e9diane empirique (50e centile), et le troisi\u00e8me index restitue le troisi\u00e8me quartile (75e centile).<\/p>\n<p>Cette approche vectoris\u00e9e pr\u00e9sente un rendement computationnel sans commune mesure avec une s\u00e9quence d&rsquo;ex\u00e9cutions scalaires distinctes. L&rsquo;algorithme sous-jacent tire parti du pr\u00e9-tri ou du partitionnement s\u00e9lectif des donn\u00e9es pour r\u00e9soudre l&rsquo;ensemble des coordonn\u00e9es d&rsquo;interpolation au cours du m\u00eame parcours structurel du tableau. La r\u00e9duction de la surcharge d&rsquo;interpr\u00e9tation du bytecode Python contribue \u00e0 minimiser le temps d&rsquo;ex\u00e9cution global, particuli\u00e8rement lorsque la liste des centiles cibles comprend des dizaines d&rsquo;\u00e9chelons granulaires.<\/p>\n<h2>4. Traitement des centiles sur des DataFrames et Series avec Pandas<\/h2>\n<h3>4.1 Utilisation de la m\u00e9thode Series.quantile()<\/h3>\n<p>Au sein du paradigme d&rsquo;analyse tabulaire offert par la biblioth\u00e8que <a rel=\"noopener noreferrer\" href=\"https:\/\/pandas.pydata.org\/\">Pandas<\/a>, le calcul des percentiles s&rsquo;op\u00e8re par le biais de la m\u00e9thode <code>quantile()<\/code> associ\u00e9e aux structures unidimensionnelles de type <code>Series<\/code>. Une divergence fondamentale d&rsquo;ordre syntaxique et conceptuel doit imp\u00e9rativement \u00eatre soulign\u00e9e entre NumPy et Pandas : l\u00e0 o\u00f9 la premi\u00e8re attend une \u00e9chelle exprim\u00e9e en pourcentages entiers ou d\u00e9cimaux sur l&rsquo;intervalle [0, 100], la m\u00e9thode <code>Series.quantile()<\/code> op\u00e8re rigoureusement sur l&rsquo;intervalle de probabilit\u00e9 unitaire [0.0, 1.0].<\/p>\n<p>L&rsquo;\u00e9valuation du 85e centile d&rsquo;une s\u00e9rie \u00e9tiquet\u00e9e requiert par cons\u00e9quent une normalisation d\u00e9cimale pr\u00e9alable de l&rsquo;argument d&rsquo;entr\u00e9e :<\/p>\n<p><code>import pandas as pd<\/code><br \/>\n<code>mesures = pd.Series([102.5, 115.0, 98.4, 122.1, 107.8, 110.3], name=\"Vitesse\")<\/code><br \/>\n<code>centile_85 = mesures.quantile(q=0.85)<\/code><\/p>\n<p>Cette relation math\u00e9matique stricte, r\u00e9gie par l&rsquo;identit\u00e9 <em>q<\/em><sub>Pandas<\/sub> = <em>q<\/em><sub>NumPy<\/sub> \/ 100, harmonise le comportement de l&rsquo;analyse avec les conventions formalis\u00e9es de la th\u00e9orie de la mesure et du calcul des probabilit\u00e9s. La m\u00e9thode de Pandas pr\u00e9serve par ailleurs l&rsquo;int\u00e9grit\u00e9 du contexte m\u00e9tadonn\u00e9es associ\u00e9 \u00e0 l&rsquo;\u00e9chantillon, propageant le nom de la s\u00e9rie et ses sp\u00e9cificit\u00e9s d&rsquo;indexation au travers de la cha\u00eene de transformation analytique.<\/p>\n<h3>4.2 Calcul sur l&rsquo;ensemble des colonnes d&rsquo;un DataFrame<\/h3>\n<p>Appliqu\u00e9e \u00e0 l&rsquo;\u00e9chelle d&rsquo;un tableau bidimensionnel de type <code>DataFrame<\/code>, la m\u00e9thode <code>quantile()<\/code> d\u00e9ploie une analyse multivari\u00e9e simultan\u00e9e le long de ses axes structurels. Par d\u00e9faut, l&rsquo;\u00e9valuation s&rsquo;ex\u00e9cute selon l&rsquo;axe vertical (<code>axis=0<\/code>), ce qui g\u00e9n\u00e8re une projection statistique calculant le quantile d&rsquo;int\u00e9r\u00eat ind\u00e9pendamment pour chaque colonne num\u00e9rique du jeu de donn\u00e9es :<\/p>\n<p><code>matrice_donnees = pd.DataFrame({<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;'Pression': [1.2, 2.4, 1.8, 3.1, 2.7],<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;'Temperature': [34.5, 38.2, 31.0, 42.1, 39.4],<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;'Debit': [120, 150, 110, 190, 175]<\/code><br \/>\n<code>})<\/code><br \/>\n<code>seuils_intermediaires = matrice_donnees.quantile(q=[0.10, 0.50, 0.90])<\/code><\/p>\n<p>Le r\u00e9sultat de cette op\u00e9ration matricielle ne se r\u00e9duit pas \u00e0 une simple s\u00e9quence de scalaires, mais s&rsquo;incarne dans un nouveau <code>DataFrame<\/code> structur\u00e9. Les index de lignes adoptent la valeur des probabilit\u00e9s quantiles soumises \u00e0 l&rsquo;argument <code>q<\/code> (0.10, 0.50, 0.90), tandis que les colonnes conservent les libell\u00e9s descriptifs originaux des variables \u00e9tudi\u00e9es.<\/p>\n<p>Pandas int\u00e8gre un m\u00e9canisme natif de filtrage automatique des types qui \u00e9carte de fa\u00e7on transparente les colonnes contenant des cha\u00eenes de caract\u00e8res ou des objets non num\u00e9riques arbitraires (sauf param\u00e9trage contraire explicite via <code>numeric_only=False<\/code>). Cette abstraction \u00e9vite au d\u00e9veloppeur l&rsquo;\u00e9criture fastidieuse de filtres de s\u00e9lection de types, simplifiant consid\u00e9rablement l&rsquo;exploration de tableaux composites int\u00e9grant des descripteurs nominaux et m\u00e9triques.<\/p>\n<h3>4.3 Agr\u00e9gation par sous-groupes avec groupby() et describe()<\/h3>\n<p>L&rsquo;exploration avanc\u00e9e de cohortes impose fr\u00e9quemment la segmentation de la population statistique en sous-ensembles conditionnels afin de mesurer les disparit\u00e9s de distribution entre groupes d&rsquo;observations distincts. La combinaison des m\u00e9thodes <code>groupby()<\/code> et <code>quantile()<\/code> permet d&rsquo;ex\u00e9cuter des agr\u00e9gations segment\u00e9es d&rsquo;une grande compacit\u00e9 algorithmique :<\/p>\n<p><code>df_clinique = pd.DataFrame({<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;'Groupe': ['Controle', 'Controle', 'Traitement', 'Traitement', 'Controle', 'Traitement'],<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;'Reponse': [12.4, 14.1, 22.8, 25.1, 13.9, 29.4]<\/code><br \/>\n<code>})<\/code><br \/>\n<code>profil_groupes = df_clinique.groupby('Groupe')['Reponse'].quantile([0.25, 0.75])<\/code><\/p>\n<p>L&rsquo;objet r\u00e9sultant se dote d&rsquo;un index hi\u00e9rarchique \u00e0 deux niveaux (<em>MultiIndex<\/em>), reliant formellement chaque modalit\u00e9 cat\u00e9gorielle aux centiles fractionnaires qui lui sont propres.<\/p>\n<p>Pour dresser un bilan statistique exhaustif d&rsquo;une variable ou d&rsquo;un tableau entier, la m\u00e9thode g\u00e9n\u00e9rique <code>describe()<\/code> offre une solution d&rsquo;une remarquable \u00e9l\u00e9gance synth\u00e9tique gr\u00e2ce \u00e0 son argument param\u00e9trable <code>percentiles<\/code> :<\/p>\n<p><code>synthese_academique = df_clinique.groupby('Groupe').describe(percentiles=[0.05, 0.25, 0.50, 0.75, 0.95])<\/code><\/p>\n<p>Cette invocation unique g\u00e9n\u00e8re une matrice synth\u00e9tique incorporant les effectifs valides, la moyenne arithm\u00e9tique, l&rsquo;\u00e9cart-type, ainsi que la grille compl\u00e8te des centiles sollicit\u00e9s. Les tableaux obtenus se pr\u00eatent imm\u00e9diatement \u00e0 l&rsquo;exportation vers des formats d&rsquo;\u00e9dition acad\u00e9mique tels que LaTeX ou HTML, fournissant une charpente descriptive standardis\u00e9e conforme aux exigences m\u00e9thodologiques des publications scientifiques.<\/p>\n<h2>5. M\u00e9thodes d&rsquo;interpolation math\u00e9matique dans Python<\/h2>\n<h3>5.1 Origine computationnelle du probl\u00e8me de l&rsquo;interpolation<\/h3>\n<p>Le calcul des centiles sur un ensemble fini de donn\u00e9es se heurte in\u00e9vitablement \u00e0 un obstacle math\u00e9matique fondamental : la discontinuit\u00e9 intrins\u00e8que de l&rsquo;espace d&rsquo;\u00e9chantillonnage empirique. Contrairement \u00e0 une loi de distribution th\u00e9orique d\u00e9finie sur un continuum r\u00e9el infini, un \u00e9chantillon discret ne comprend qu&rsquo;un nombre fini <em>N<\/em> d&rsquo;observations. Lorsque l&rsquo;on cherche \u00e0 d\u00e9terminer la valeur correspondant \u00e0 un centile arbitraire <em>q<\/em>, la position ou le rang statistique th\u00e9orique, not\u00e9 <em>i<\/em>, ne co\u00efncide que tr\u00e8s exceptionnellement avec un indice entier exact du tableau ordonn\u00e9.<\/p>\n<p>L&rsquo;indice th\u00e9orique se calcule formellement selon une relation lin\u00e9aire int\u00e9grant la taille d&rsquo;\u00e9chantillon, traditionnellement formalis\u00e9e dans les moteurs num\u00e9riques par l&rsquo;expression :<\/p>\n<p><em>i<\/em> = <em>q<\/em> \/ 100 &times; (<em>N<\/em> &#8211; 1)<\/p>\n<p>Si la quantit\u00e9 <em>i<\/em> ainsi obtenue admet une partie fractionnaire non nulle, c&rsquo;est-\u00e0-dire si <em>i<\/em> = <em>k<\/em> + <em>d<\/em> o\u00f9 <em>k<\/em> est la composante enti\u00e8re et <em>d<\/em> &isin; ]0, 1[ la composante fractionnaire, il devient strictement impossible d&rsquo;extraire directement un \u00e9l\u00e9ment mesur\u00e9 unique dans la s\u00e9rie. Le syst\u00e8me informatique se trouve contraint de r\u00e9soudre une ind\u00e9termination : faut-il s\u00e9lectionner l&rsquo;observation d&rsquo;indice <em>k<\/em>, celle d&rsquo;indice <em>k<\/em> + 1, ou concevoir une estimation synth\u00e9tique interm\u00e9diaire ? C&rsquo;est pr\u00e9cis\u00e9ment l&rsquo;objet des sch\u00e9mas d&rsquo;interpolation math\u00e9matique, dont le choix conditionne l&rsquo;exactitude de l&rsquo;estimation finale.<\/p>\n<h3>5.2 \u00c9tude d\u00e9taill\u00e9e des modes d&rsquo;interpolation de NumPy<\/h3>\n<p>Historiquement, la fonction <code>numpy.percentile()<\/code> g\u00e9rait cette ind\u00e9termination via le param\u00e8tre <code>interpolation<\/code>, d\u00e9sormais modernis\u00e9 sous l&rsquo;appellation g\u00e9n\u00e9rique <code>method<\/code> \u00e0 partir des versions r\u00e9centes de la biblioth\u00e8que pour converger vers la typologie canonique \u00e9tablie par Rob J. Hyndman et Yanan Fan en 1996. Le mode par d\u00e9faut demeure l&rsquo;interpolation lin\u00e9aire classique (<code>method='linear'<\/code>), laquelle calcule une moyenne pond\u00e9r\u00e9e barycentrique entre les deux valeurs cons\u00e9cutives encadrant l&rsquo;indice fractionnaire :<\/p>\n<p><em>Q<\/em>(<em>q<\/em>) = <em>x<\/em><sub>(<em>k<\/em>)<\/sub> + <em>d<\/em> &times; (<em>x<\/em><sub>(<em>k<\/em>+1)<\/sub> &#8211; <em>x<\/em><sub>(<em>k<\/em>)<\/sub>)<\/p>\n<p>En sus du sch\u00e9ma lin\u00e9aire, NumPy impl\u00e9mente une palette de variantes d&rsquo;arrondi et d&rsquo;attribution d\u00e9terministe :<\/p>\n<ul>\n<li><strong>lower<\/strong> : tronque syst\u00e9matiquement la partie fractionnaire pour retenir exclusivement l&rsquo;observation situ\u00e9e \u00e0 l&rsquo;indice plancher <em>x<\/em><sub>(<em>k<\/em>)<\/sub>, sans aucune alt\u00e9ration de l&rsquo;\u00e9chelle originelle des valeurs r\u00e9elles.<\/li>\n<li><strong>higher<\/strong> : force l&rsquo;arrondi au rang strictement sup\u00e9rieur en attribuant la valeur de l&rsquo;indice plafond <em>x<\/em><sub>(<em>k<\/em>+1)<\/sub> d\u00e8s lors qu&rsquo;une fraction d\u00e9cimale r\u00e9siduelle est observ\u00e9e.<\/li>\n<li><strong>midpoint<\/strong> : op\u00e8re une moyenne arithm\u00e9tique simple et non pond\u00e9r\u00e9e entre les deux bornes, calculant rigoureusement (<em>x<\/em><sub>(<em>k<\/em>)<\/sub> + <em>x<\/em><sub>(<em>k<\/em>+1)<\/sub>) \/ 2 ind\u00e9pendamment de la proximit\u00e9 relative de la fraction <em>d<\/em> avec l&rsquo;une ou l&rsquo;autre des extr\u00e9mit\u00e9s.<\/li>\n<li><strong>nearest<\/strong> : applique la r\u00e8gle de l&rsquo;arrondi arithm\u00e9tique standard au plus proche voisin, s\u00e9lectionnant <em>x<\/em><sub>(<em>k<\/em>)<\/sub> si <em>d<\/em> &lt; 0.5 et <em>x<\/em><sub>(<em>k<\/em>+1)<\/sub> si <em>d<\/em> &ge; 0.5.<\/li>\n<\/ul>\n<p>Dans ses impl\u00e9mentations les plus abouties, NumPy permet \u00e9galement de solliciter l&rsquo;ensemble des neuf m\u00e9thodes formalis\u00e9es de Hyndman et Fan (m\u00e9thodes num\u00e9rot\u00e9es de <code>weibull<\/code> \u00e0 <code>median_unbiased<\/code>), adaptant les param\u00e8tres de trac\u00e9 des rangs afin d&rsquo;annuler le biais d&rsquo;estimation pour des familles sp\u00e9cifiques de distributions continues.<\/p>\n<h3>5.3 Impact des variantes d&rsquo;interpolation sur les r\u00e9sultats num\u00e9riques<\/h3>\n<p>La divergence num\u00e9rique induite par l&rsquo;adoption de sch\u00e9mas d&rsquo;interpolation concurrents s&rsquo;av\u00e8re particuli\u00e8rement marqu\u00e9e sur des \u00e9chantillons d&rsquo;effectif restreint. Dans un petit groupe d&rsquo;\u00e9tude compos\u00e9 de 10 patients, le d\u00e9calage marginal d&rsquo;un indice fractionnaire peut induire des variations quantitatives substantielles du centile calcul\u00e9. Par exemple, si la 3e observation ordonn\u00e9e s&rsquo;\u00e9tablit \u00e0 20 et la 4e \u00e0 50, une interpolation lin\u00e9aire avec <em>d<\/em> = 0.5 restituera la valeur synth\u00e9tique 35, alors que le mode <em>lower<\/em> renverra 20 et le mode <em>higher<\/em> produira 50.<\/p>\n<p>D&rsquo;un point de vue asymptotique, lorsque la taille de l&rsquo;\u00e9chantillon <em>N<\/em> cro\u00eet vers l&rsquo;infini, la distance relative entre deux observations cons\u00e9cutives <em>x<\/em><sub>(<em>k<\/em>+1)<\/sub> &#8211; <em>x<\/em><sub>(<em>k<\/em>)<\/sub> converge stochastiquement vers z\u00e9ro au sein d&rsquo;une distribution continue r\u00e9guli\u00e8re. Par cons\u00e9quent, les disparit\u00e9s num\u00e9riques observ\u00e9es entre les modes d&rsquo;interpolation s&rsquo;att\u00e9nuent progressivement jusqu&rsquo;\u00e0 devenir totalement n\u00e9gligeables sur les volum\u00e9tries de donn\u00e9es massives (<em>Big Data<\/em>).<\/p>\n<p>Le choix d&rsquo;un mode sp\u00e9cifique doit demeurer guid\u00e9 par les contraintes ontologiques de la discipline d&rsquo;application. Dans les contextes o\u00f9 l&rsquo;existence d&rsquo;une valeur interpol\u00e9e n&rsquo;a aucun sens physique ou pratique (par exemple, un nombre d&rsquo;accidents du travail ou une cotation clinique discr\u00e8te sur une \u00e9chelle de Likert), le recours aux m\u00e9thodes non interpolantes de type <em>lower<\/em>, <em>higher<\/em> ou <em>nearest<\/em> s&rsquo;av\u00e8re m\u00e9thodologiquement imp\u00e9ratif pour garantir que le centile retourn\u00e9 appartienne formellement \u00e0 l&rsquo;espace d&rsquo;\u00e9tats empirique observ\u00e9.<\/p>\n<h2>6. Gestion des donn\u00e9es manquantes et valeurs atypiques<\/h2>\n<h3>6.1 Vuln\u00e9rabilit\u00e9 de numpy.percentile() face aux valeurs NaN<\/h3>\n<p>Dans l&rsquo;\u00e9cosyst\u00e8me num\u00e9rique Python, les valeurs manquantes ou ind\u00e9termin\u00e9es sont repr\u00e9sent\u00e9es par la constante \u00e0 virgule flottante standardis\u00e9e <code>NaN<\/code> (<em>Not a Number<\/em>), d\u00e9finie par la norme internationale IEEE 754. L&rsquo;impl\u00e9mentation standard de la fonction <code>numpy.percentile()<\/code> adopte un comportement strictement conservateur vis-\u00e0-vis de ces entit\u00e9s : toute op\u00e9ration arithm\u00e9tique ou comparaison logique impliquant une valeur <code>NaN<\/code> propage imm\u00e9diatement l&rsquo;ind\u00e9termination \u00e0 l&rsquo;ensemble du calcul statistique.<\/p>\n<p>En cons\u00e9quence, si un tableau de donn\u00e9es contient ne serait-ce qu&rsquo;une unique valeur manquante parmi des millions d&rsquo;observations valides, l&rsquo;ex\u00e9cution standard de <code>numpy.percentile()<\/code> renverra invariablement <code>nan<\/code> comme r\u00e9sultat :<\/p>\n<p><code>serie_corrompue = np.array([12.0, 15.5, np.nan, 18.2, 22.0])<\/code><br \/>\n<code>resultat_aberrant = np.percentile(serie_corrompue, 50)<\/code><\/p>\n<p>Cette vuln\u00e9rabilit\u00e9 algorithmique pose un risque analytique majeur dans les pipelines de traitement automatis\u00e9s. L&rsquo;absence de lev\u00e9e explicite d&rsquo;exception (le calcul s&rsquo;ach\u00e8ve techniquement avec succ\u00e8s sans \u00e9mettre de <code>TypeError<\/code> ou de <code>ValueError<\/code>) peut masquer silencieusement l&rsquo;alt\u00e9ration de m\u00e9triques d\u00e9cisionnelles en aval. L&rsquo;analyste doit imp\u00e9rativement instaurer un protocole d&rsquo;audit pr\u00e9alable de la compl\u00e9tude matricielle avant de soumettre ses vecteurs aux op\u00e9rateurs vectoriels de base.<\/p>\n<h3>6.2 Application de numpy.nanpercentile() pour donn\u00e9es lacunaires<\/h3>\n<p>Pour surmonter l&rsquo;\u00e9cueil de la propagation ind\u00e9sirable des valeurs manquantes, NumPy int\u00e8gre une m\u00e9thode alternative d\u00e9di\u00e9e : <code>numpy.nanpercentile()<\/code>. Cette fonction intercepte dynamiquement les occurrences de valeurs <code>NaN<\/code>, les filtre en amont du partitionnement des donn\u00e9es et recalcule les centiles uniquement sur le sous-ensemble des observations empiriquement valides :<\/p>\n<p><code>resultat_valide = np.nanpercentile(serie_corrompue, 50)<\/code><\/p>\n<p>D&rsquo;un point de vue algorithmique, <code>numpy.nanpercentile()<\/code> ajuste de fa\u00e7on autonome la taille effective de l&rsquo;\u00e9chantillon <em>N<\/em>. Si un tableau initial de dimension 100 pr\u00e9sente 7 valeurs nulles, la taille d&rsquo;\u00e9chantillon mobilis\u00e9e pour la d\u00e9rivation de l&rsquo;indice fractionnaire <em>i<\/em> sera automatiquement ramen\u00e9e \u00e0 <em>N<\/em><sub>eff<\/sub> = 93. Ce comportement \u00e9mule fid\u00e8lement le param\u00e8tre <code>dropna=True<\/code> nativement exploit\u00e9 par la biblioth\u00e8que Pandas lors des appels \u00e0 la m\u00e9thode <code>Series.quantile()<\/code>.<\/p>\n<p>Il importe toutefois de souligner l&rsquo;implication m\u00e9thodologique de cette omission. Ignorer unilat\u00e9ralement les valeurs manquantes repose sur l&rsquo;hypoth\u00e8se statistique implicite que le m\u00e9canisme g\u00e9n\u00e9rateur d&rsquo;incompl\u00e9tude rel\u00e8ve du sch\u00e9ma MCAR (<em>Missing Completely At Random<\/em>). Si les lacunes d&rsquo;observation d\u00e9pendent en r\u00e9alit\u00e9 de la magnitude de la variable elle-m\u00eame (sch\u00e9ma MNAR pour <em>Missing Not At Random<\/em>), l&rsquo;exclusion pure et simple op\u00e9r\u00e9e par <code>numpy.nanpercentile()<\/code> introduit un biais d&rsquo;\u00e9chantillonnage syst\u00e9matique dans l&rsquo;estimation des quantiles extr\u00eames, alt\u00e9rant la validit\u00e9 interne des conclusions de recherche.<\/p>\n<h3>6.3 Robustesse des centiles face aux valeurs aberrantes (outliers)<\/h3>\n<p>La sup\u00e9riorit\u00e9 \u00e9pist\u00e9mologique des centiles sur les statistiques bas\u00e9es sur les moments d&rsquo;ordre sup\u00e9rieur \u00e9clate particuli\u00e8rement lors du traitement des cohortes contamin\u00e9es par des valeurs atypiques ou extr\u00eames. L\u00e0 o\u00f9 la pr\u00e9sence d&rsquo;une mesure aberrante d\u00e9place arbitrairement la moyenne arithm\u00e9tique et inflate exponentiellement la variance empirique, la m\u00e9diane (50e centile) pr\u00e9sente un point de rupture (<em>breakdown point<\/em>) optimal de 50%. Cela signifie que la moiti\u00e9 des donn\u00e9es doit \u00eatre corrompue avant que la m\u00e9diane ne devienne totalement arbitraire.<\/p>\n<p>Cette r\u00e9silience conf\u00e8re aux centiles un statut d&rsquo;op\u00e9rateur privil\u00e9gi\u00e9 pour l&rsquo;identification formelle des valeurs aberrantes elles-m\u00eames. Selon le crit\u00e8re classique d&rsquo;\u00e9tiquetage popularis\u00e9 par John Tukey, l&rsquo;intervalle interquartile est exploit\u00e9 pour d\u00e9limiter les fronti\u00e8res de plausibilit\u00e9 statistique d&rsquo;une distribution :<\/p>\n<ul>\n<li><strong>Borne inf\u00e9rieure de Tukey<\/strong> : Q1 &#8211; 1.5 &times; (Q3 &#8211; Q1)<\/li>\n<li><strong>Borne sup\u00e9rieure de Tukey<\/strong> : Q3 + 1.5 &times; (Q3 &#8211; Q1)<\/li>\n<\/ul>\n<p>Les observations situ\u00e9es au-del\u00e0 de ces fronti\u00e8res sont formellement cat\u00e9goris\u00e9es comme des valeurs atypiques l\u00e9g\u00e8res, le multiplicateur pouvant \u00eatre \u00e9tendu \u00e0 3.0 pour rep\u00e9rer les anomalies extr\u00eames. Alternativement, dans le traitement du signal et les sciences financi\u00e8res, les praticiens ont recours \u00e0 une strat\u00e9gie de winsorisation bas\u00e9e sur les percentiles p\u00e9riph\u00e9riques : les valeurs situ\u00e9es sous le 1er ou le 5e centile sont \u00e9cr\u00eat\u00e9es et ramen\u00e9es au seuil exact de ce centile, de m\u00eame que les valeurs d\u00e9passant le 95e ou le 99e centile sont plafonn\u00e9es. Ce lissage statistique pr\u00e9serve la taille totale de l&rsquo;\u00e9chantillon tout en \u00e9liminant l&rsquo;influence d\u00e9stabilisatrice des fluctuations stochastiques marginales.<\/p>\n<h2>7. Calcul de centiles multidimensionnels le long d&rsquo;axes sp\u00e9cifiques<\/h2>\n<h3>7.1 Fonctionnement du param\u00e8tre axis dans NumPy<\/h3>\n<p>Dans de nombreuses applications d&rsquo;apprentissage automatique, de traitement d&rsquo;images ou d&rsquo;analyse spatiotemporelle, les donn\u00e9es se pr\u00e9sentent sous la forme de matrices ou de tenseurs multidimensionnels. L&rsquo;argument fondamental <code>axis<\/code> de la fonction <code>numpy.percentile()<\/code> r\u00e9git l&rsquo;orientation spatiale de la r\u00e9duction statistique op\u00e9r\u00e9e sur ces structures complexes.<\/p>\n<p>Lorsque <code>axis=None<\/code>, le tableau source subit un aplatissement complet (<em>flattening<\/em>) en un vecteur univari\u00e9 continu pr\u00e9alable \u00e0 l&rsquo;extraction statistique. En revanche, la d\u00e9signation explicite d&rsquo;un axe permet d&rsquo;ex\u00e9cuter l&rsquo;analyse de mani\u00e8re vectoris\u00e9e le long d&rsquo;une dimension cibl\u00e9e :<\/p>\n<p><code>matrice_2d = np.array([<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;[10, 20, 30],<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;[40, 50, 60],<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;[70, 80, 90]<\/code><br \/>\n<code>])<\/code><br \/>\n<code>centiles_colonnes = np.percentile(matrice_2d, 50, axis=0)<\/code><br \/>\n<code>centiles_lignes = np.percentile(matrice_2d, 50, axis=1)<\/code><\/p>\n<p>L&rsquo;instruction <code>axis=0<\/code> projette le calcul verticalement sur l&rsquo;ensemble des lignes pour chaque colonne, retournant un vecteur contenant la m\u00e9diane empirique de chaque colonne (ici <code>[40., 50., 60.]<\/code>). \u00c0 l&rsquo;inverse, <code>axis=1<\/code> ex\u00e9cute une r\u00e9duction horizontale le long des colonnes pour chaque rang\u00e9e, produisant la m\u00e9diane individuelle de chaque ligne (soit <code>[20., 50., 80.]<\/code>). L&rsquo;assignation d&rsquo;un tuple d&rsquo;axes, tel que <code>axis=(0, 2)<\/code> sur un tenseur d&rsquo;ordre trois, permet de r\u00e9duire simultan\u00e9ment plusieurs dimensions structurelles au cours d&rsquo;un appel unitaire.<\/p>\n<h3>7.2 Conservation de la dimensionnalit\u00e9 avec keepdims<\/h3>\n<p>Par d\u00e9faut, l&rsquo;application d&rsquo;une r\u00e9duction statistique le long d&rsquo;un axe entra\u00eene la disparition de la dimension contract\u00e9e au sein de l&rsquo;objet r\u00e9sultant. Ainsi, l&rsquo;application d&rsquo;un centile avec <code>axis=0<\/code> sur une matrice de dimensions (100, 20) retourne un tableau unidimensionnel de dimensions (20,). Cette alt\u00e9ration dimensionnelle peut entraver les op\u00e9rations ult\u00e9rieures de calcul diff\u00e9rentiel ou de normalisation matricielle par diffusion (<em>broadcasting<\/em>).<\/p>\n<p>L&rsquo;utilisation de l&rsquo;argument bool\u00e9en <code>keepdims=True<\/code> neutralise ce comportement en pr\u00e9servant explicitement le rang tensoriel originel au sein de la sortie :<\/p>\n<p><code>seuils_maintenus = np.percentile(matrice_2d, 50, axis=0, keepdims=True)<\/code><\/p>\n<p>La structure dimensionnelle r\u00e9sultante adopte la forme stricte (1, 3). Les dimensions r\u00e9duites sont maintenues avec une taille unitaire, ce qui permet d&rsquo;ex\u00e9cuter des soustractions ou des divisions directes sans reconfiguration manuelle d&rsquo;axe (<code>reshape<\/code>) :<\/p>\n<p><code>matrice_centree = matrice_2d - seuils_maintenus<\/code><\/p>\n<p>Ce m\u00e9canisme de diffusion garantit un code vectoriel \u00e9pur\u00e9, r\u00e9duisant les risques d&rsquo;incompatibilit\u00e9 de forme matricielle (<em>shape mismatch<\/em>) et optimisant l&rsquo;allocation de la m\u00e9moire vive au sein des boucles d&rsquo;apprentissage profond.<\/p>\n<h3>7.3 Extension aux tenseurs tridimensionnels et spatio-temporels<\/h3>\n<p>L&rsquo;analyse de s\u00e9ries temporelles longitudinales issues de cohortes multipatients constitue une illustration matricielle canonique de la puissance des calculs multidimensionnels le long d&rsquo;axes sp\u00e9cifiques. Imaginons un tenseur tridimensionnel <em>T<\/em> de forme (<em>S<\/em>, <em>V<\/em>, <em>T<\/em>), repr\u00e9sentant respectivement <em>S<\/em> sujets d&rsquo;\u00e9tude, <em>V<\/em> variables physiologiques distinctes (fr\u00e9quence cardiaque, pression art\u00e9rielle, saturation en oxyg\u00e8ne), et <em>T<\/em> pas de temps \u00e9chantillonn\u00e9s au cours d&rsquo;une \u00e9preuve d&rsquo;effort :<\/p>\n<p><code>tenseur_medical = rng.normal(size=(50, 3, 1000))<\/code><br \/>\n<code>profil_temporel_median = np.percentile(tenseur_medical, 50, axis=0)<\/code><\/p>\n<p>Dans cette configuration, l&rsquo;argument <code>axis=0<\/code> contracte la dimension des sujets pour isoler, pour chaque seconde d&rsquo;enregistrement et pour chaque signal physiologique, la trajectoire m\u00e9diane interindividuelle. Le tenseur r\u00e9sultant adopte la forme exacte (3, 1000), fournissant une cin\u00e9tique standardis\u00e9e du groupe.<\/p>\n<p>Pour extraire les fuseaux d&rsquo;incertitude distributionnels autour de cette m\u00e9diane, il suffit de solliciter simultan\u00e9ment les percentiles p\u00e9riph\u00e9riques :<\/p>\n<p><code>fuseau_dispersion = np.percentile(tenseur_medical, [10, 90], axis=0)<\/code><\/p>\n<p>Le tenseur produit pr\u00e9sente alors une dimensionnalit\u00e9 de forme (2, 3, 1000), le premier axe mat\u00e9rialisant respectivement la borne inf\u00e9rieure (10e centile) et la borne sup\u00e9rieure (90e centile) de la cohorte. Ce traitement \u00e0 haut d\u00e9bit s&rsquo;ex\u00e9cute quasi instantan\u00e9ment gr\u00e2ce \u00e0 la parall\u00e9lisation interne des routines d&rsquo;indexation sous-jacentes, \u00e9vitant le d\u00e9ploiement d&rsquo;it\u00e9rations explicites chronophages.<\/p>\n<h2>8. Calcul statistique avec SciPy et applications comparatives<\/h2>\n<h3>8.1 Calcul du centile invers\u00e9 avec scipy.stats.percentileofscore()<\/h3>\n<p>Tandis que la fonction <code>numpy.percentile()<\/code> calcule la valeur de l&rsquo;abscisse correspondant \u00e0 une fraction de probabilit\u00e9 cumulative donn\u00e9e, le probl\u00e8me inverse se pose fr\u00e9quemment dans l&rsquo;analyse de donn\u00e9es : \u00e9tant donn\u00e9 une valeur observ\u00e9e sp\u00e9cifique, quel est le rang centile empirique qui lui correspond au sein d&rsquo;une distribution de r\u00e9f\u00e9rence ? Le sous-module <a rel=\"noopener noreferrer\" href=\"https:\/\/scipy.org\/\">scipy.stats<\/a> r\u00e9pond pr\u00e9cis\u00e9ment \u00e0 cette exigence m\u00e9thodologique au travers de la fonction sp\u00e9cialis\u00e9e <code>percentileofscore()<\/code>.<\/p>\n<p>La signature de cette fonction requiert le tableau des observations de r\u00e9f\u00e9rence, la valeur cible dont on \u00e9value le positionnement relatif, ainsi qu&rsquo;un argument d\u00e9terminant <code>kind<\/code> qui r\u00e9git la gestion math\u00e9matique des \u00e9galit\u00e9s d&rsquo;ex \u00e6quo :<\/p>\n<p><code>from scipy import stats<\/code><br \/>\n<code>cohortes = np.array([10, 20, 30, 40, 50, 50, 50, 60, 70, 80])<\/code><br \/>\n<code>rang_strict = stats.percentileofscore(cohortes, score=50, kind='strict')<\/code><br \/>\n<code>rang_faible = stats.percentileofscore(cohortes, score=50, kind='weak')<\/code><br \/>\n<code>rang_moyen = stats.percentileofscore(cohortes, score=50, kind='mean')<\/code><br \/>\n<code>rang_rang = stats.percentileofscore(cohortes, score=50, kind='rank')<\/code><\/p>\n<p>Les divergences entre ces modes de calcul refl\u00e8tent des nuances conceptuelles majeures :<\/p>\n<ul>\n<li><strong>strict<\/strong> : quantifie le pourcentage strict des observations inf\u00e9rieures \u00e0 la valeur cible (<em>x<\/em> &lt; <em>score<\/em>). Pour notre s\u00e9rie, 4 valeurs sur 10 \u00e9tant strictement inf\u00e9rieures \u00e0 50, le r\u00e9sultat renvoy\u00e9 est de 40.0%.<\/li>\n<li><strong>weak<\/strong> : \u00e9value le pourcentage d&rsquo;observations inf\u00e9rieures ou \u00e9gales au score d&rsquo;int\u00e9r\u00eat (<em>x<\/em> &le; <em>score<\/em>). Sept valeurs v\u00e9rifiant cette condition, la fonction retourne 70.0%.<\/li>\n<li><strong>mean<\/strong> : impl\u00e9mente la d\u00e9finition standard de l&rsquo;association psychom\u00e9trique en calculant la moyenne arithm\u00e9tique des scores stricts et faibles, soit (40.0 + 70.0) \/ 2 = 55.0%, assignant aux ex \u00e6quo le centre de gravit\u00e9 de leur intervalle probabiliste.<\/li>\n<li><strong>rank<\/strong> : d\u00e9ploie un classement ordinal formel pr\u00e9servant les sp\u00e9cificit\u00e9s des \u00e9chelles discr\u00e8tes cumul\u00e9es.<\/li>\n<\/ul>\n<p>Cette distinction s&rsquo;av\u00e8re fondamentale lors de l&rsquo;attribution de scores \u00e9talonn\u00e9s ou de percentiles normatifs dans le cadre de diagnostics cliniques, o\u00f9 une confusion entre les modes <em>strict<\/em> et <em>weak<\/em> alt\u00e9rerait significativement le diagnostic du patient.<\/p>\n<h3>8.2 Exploitation de scipy.stats.scoreatpercentile()<\/h3>\n<p>Avant la g\u00e9n\u00e9ralisation des m\u00e9thodes modernes de NumPy et Pandas, le sous-module <code>scipy.stats<\/code> constituait le canal historique de d\u00e9rivation des centiles via la fonction <code>scoreatpercentile()<\/code>. Bien que cette m\u00e9thode demeure pleinement fonctionnelle \u00e0 des fins de r\u00e9trocompatibilit\u00e9 logicielle ascendante au sein des scripts scientifiques existants, elle encapsule aujourd&rsquo;hui pour l&rsquo;essentiel les routines d&rsquo;optimisation de NumPy.<\/p>\n<p>Elle se distingue toutefois par une gestion fine du param\u00e8tre <code>limit<\/code>, lequel permet de restreindre l&rsquo;\u00e9chantillon d&rsquo;\u00e9valuation \u00e0 un intervalle ouvert ou ferm\u00e9 de valeurs plausibles, \u00e9cartant automatiquement les anomalies de capture d&rsquo;instruments physiques sans exiger de filtrage bool\u00e9en pr\u00e9alable du tableau source :<\/p>\n<p><code>donnees_capteurs = np.array([-999, 12.1, 14.5, 13.8, 15.2, 9999])<\/code><br \/>\n<code>seuil_filtre = stats.scoreatpercentile(donnees_capteurs, per=50, limit=(0, 100))<\/code><\/p>\n<p>En mati\u00e8re d&rsquo;efficience computationnelle, <code>numpy.percentile()<\/code> supplante g\u00e9n\u00e9ralement les appels s\u00e9quentiels \u00e0 <code>scoreatpercentile()<\/code> sur les donn\u00e9es massives en raison d&rsquo;une surcharge d&rsquo;encapsulation r\u00e9duite dans l&rsquo;interpr\u00e9tation des arguments. N\u00e9anmoins, pour des analyses univari\u00e9es ponctuelles au sein d&rsquo;environnements acad\u00e9miques coupl\u00e9s \u00e0 SciPy, cette fonction offre une alternative syntaxique directe et robuste.<\/p>\n<h3>8.3 Ajustement aux distributions th\u00e9oriques continues<\/h3>\n<p>L&rsquo;estimation des centiles ne se cantonne pas \u00e0 l&rsquo;observation empirique d&rsquo;\u00e9chantillons finis ; elle constitue \u00e9galement le socle de l&rsquo;analyse inf\u00e9rentielle param\u00e9trique. Le module <code>scipy.stats<\/code> offre une mod\u00e9lisation analytique compl\u00e8te des lois de probabilit\u00e9 au travers de leurs fonctions de point de pourcentage (<em>Percent Point Function<\/em>, not\u00e9e <code>ppf<\/code>), qui repr\u00e9sentent math\u00e9matiquement la fonction quantile inverse th\u00e9orique <em>F<\/em><sup>-1<\/sup>(<em>p<\/em>).<\/p>\n<p>La confrontation rigoureuse des percentiles empiriques d&rsquo;un \u00e9chantillon r\u00e9el avec les centiles th\u00e9oriques projet\u00e9s par une loi normale permet d&rsquo;\u00e9valuer graphiquement et quantitativement la conformit\u00e9 d&rsquo;une distribution :<\/p>\n<p><code>mu, sigma = 100, 15<\/code><br \/>\n<code>centiles_empiriques = np.percentile(echantillon_continu, [25, 50, 75])<\/code><br \/>\n<code>centiles_theoriques = stats.norm.ppf([0.25, 0.50, 0.75], loc=mu, scale=sigma)<\/code><\/p>\n<p>Une concordance num\u00e9rique \u00e9troite entre ces deux vecteurs confirme l&rsquo;ad\u00e9quation de l&rsquo;hypoth\u00e8se de gaussianit\u00e9 sous-jacente. Cette m\u00e9thodologie quantile-quantile sous-tend la construction algorithmique des diagrammes Q-Q (<em>Quantile-Quantile Plots<\/em>), outils diagnostiques indispensables pour attester de la normalit\u00e9 des r\u00e9sidus de mod\u00e9lisation lin\u00e9aire avant de proc\u00e9der \u00e0 des inf\u00e9rences param\u00e9triques de type ANOVA ou r\u00e9gressions moindres carr\u00e9s.<\/p>\n<h2>9. Visualisation graphique des centiles avec Matplotlib et Seaborn<\/h2>\n<h3>9.1 Repr\u00e9sentation par diagrammes en bo\u00eete \u00e0 moustaches (boxplots)<\/h3>\n<p>La transcription visuelle des centiles constitue un levier d\u00e9terminant pour la communication scientifique et l&rsquo;interpr\u00e9tation morphologique des donn\u00e9es. Le diagramme en bo\u00eete \u00e0 moustaches, conceptualis\u00e9 par John Tukey et d\u00e9mocratis\u00e9 dans l&rsquo;\u00e9cosyst\u00e8me Python par les biblioth\u00e8ques <a rel=\"noopener noreferrer\" href=\"https:\/\/matplotlib.org\/\">Matplotlib<\/a> et <a rel=\"noopener noreferrer\" href=\"https:\/\/seaborn.pydata.org\/\">Seaborn<\/a>, mat\u00e9rialise graphiquement les quartiles fondamentaux de mani\u00e8re standardis\u00e9e.<\/p>\n<p>Au sein d&rsquo;un trac\u00e9 r\u00e9alis\u00e9 avec Seaborn via la commande <code>sns.boxplot()<\/code>, les \u00e9l\u00e9ments structurels de la figure renvoient directement aux centiles calcul\u00e9s :<\/p>\n<ul>\n<li>Le bord inf\u00e9rieur du rectangle central mat\u00e9rialise le 25e centile (Q1).<\/li>\n<li>La ligne transversale barrant l&rsquo;int\u00e9rieur de la bo\u00eete trace la m\u00e9diane empirique (50e centile).<\/li>\n<li>Le bord sup\u00e9rieur de la structure repr\u00e9sente le 75e centile (Q3).<\/li>\n<li>L&rsquo;amplitude totale du rectangle figure g\u00e9om\u00e9triquement l&rsquo;\u00e9cart interquartile (IQR).<\/li>\n<\/ul>\n<p>Les extensions lin\u00e9aires d\u00e9sign\u00e9es sous le nom de moustaches (<em>whiskers<\/em>) ne s&rsquo;\u00e9tirent pas n\u00e9cessairement jusqu&rsquo;aux extr\u00eames absolus de la s\u00e9rie. Par d\u00e9faut, elles sont configur\u00e9es pour atteindre la valeur observ\u00e9e la plus \u00e9loign\u00e9e situ\u00e9e \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un intervalle de 1.5 &times; IQR \u00e0 partir des quartiles sup\u00e9rieur et inf\u00e9rieur. Toute donn\u00e9e positionn\u00e9e au-del\u00e0 de ce p\u00e9rim\u00e8tre g\u00e9om\u00e9trique est individuellement repr\u00e9sent\u00e9e sous la forme d&rsquo;un point isol\u00e9, signalant visuellement son statut d&rsquo;observation atypique potentielle.<\/p>\n<h3>9.2 Trac\u00e9 de la courbe de r\u00e9partition cumulative empirique (ECDF)<\/h3>\n<p>Bien que le diagramme en bo\u00eete \u00e0 moustaches r\u00e9sume efficacement la dispersion centrale, il comprime l&rsquo;information morphologique fine de la distribution. Le trac\u00e9 de la fonction de r\u00e9partition cumulative empirique (ECDF) comble cette lacune en offrant une visualisation continue et non param\u00e9trique de l&rsquo;int\u00e9gralit\u00e9 des centiles de l&rsquo;\u00e9chantillon. La biblioth\u00e8que Seaborn permet d&rsquo;instancier directement cette projection par l&rsquo;interm\u00e9diaire de la m\u00e9thode <code>sns.ecdfplot()<\/code>.<\/p>\n<p>Sur un diagramme ECDF, l&rsquo;axe horizontal porte l&rsquo;\u00e9chelle des valeurs quantitatives de la variable continue, tandis que l&rsquo;axe vertical d\u00e9ploie une \u00e9chelle de probabilit\u00e9s cumul\u00e9es s&rsquo;\u00e9talant de 0.0 \u00e0 1.0 (soit de 0% \u00e0 100%). La lecture de n&rsquo;importe quel centile s&rsquo;effectue par une simple projection orthogonale : en s\u00e9lectionnant une fraction sur l&rsquo;ordonn\u00e9e (par exemple 0.90 pour le 90e centile), l&rsquo;intersection avec la courbe en escalier projet\u00e9e sur l&rsquo;axe des abscisses indique imm\u00e9diatement la valeur seuil empirique correspondante.<\/p>\n<p>L&rsquo;enrichissement de la figure par l&rsquo;adjonction de lignes de rep\u00e8re vectorielles discontinues (via les fonctions <code>plt.axvline()<\/code> et <code>plt.axhline()<\/code> de Matplotlib) mat\u00e9rialise instantan\u00e9ment les seuils critiques d&rsquo;un protocole exp\u00e9rimental, facilitant l&rsquo;interpr\u00e9tation clinique ou industrielle des tol\u00e9rances de distribution sans l&rsquo;interm\u00e9diation de tables num\u00e9riques r\u00e9barbatives.<\/p>\n<h3>9.3 Superposition sur les histogrammes et courbes de densit\u00e9 (KDE)<\/h3>\n<p>Une modalit\u00e9 visuelle particuli\u00e8rement informative consiste \u00e0 combiner l&rsquo;estimation de la densit\u00e9 par la m\u00e9thode des noyaux (<em>Kernel Density Estimation<\/em>, ou KDE) avec l&rsquo;histogramme des fr\u00e9quences et la projection explicite de rep\u00e8res verticaux identifiant les centiles cl\u00e9s. Cette articulation g\u00e9om\u00e9trique unifie l&rsquo;appr\u00e9hension de la forme de la loi (asym\u00e9trie, kurtosis, multimodalit\u00e9) et la lecture de ses indicateurs de coupure quantile.<\/p>\n<p>Cette superposition s&rsquo;articule ais\u00e9ment en Python en associant un trac\u00e9 <code>sns.histplot(kde=True)<\/code> \u00e0 une s\u00e9rie d&rsquo;it\u00e9rations tra\u00e7ant des lignes de seuil color\u00e9es pour les 10e, 50e et 90e centiles. Il est en outre possible d&rsquo;exploiter la fonction <code>plt.fill_between()<\/code> de Matplotlib pour colorer sp\u00e9cifiquement la r\u00e9gion interquartile sous la courbe de densit\u00e9.<\/p>\n<p>Cette zone ombr\u00e9e, enserr\u00e9e entre le 25e et le 75e centile, offre une mise en relief imm\u00e9diate de la densit\u00e9 centrale des donn\u00e9es. Les asym\u00e9tries morphologiques sautent alors aux yeux du lecteur : si la surface color\u00e9e est d\u00e9cal\u00e9e d&rsquo;un c\u00f4t\u00e9 de la distribution ou si la m\u00e9diane ne partage pas l&rsquo;aire centrale en deux volumes g\u00e9om\u00e9triquement sym\u00e9triques, la non-gaussianit\u00e9 de la s\u00e9rie appara\u00eet avec une clart\u00e9 irr\u00e9futable, soutenant visuellement la d\u00e9monstration statistique.<\/p>\n<h2>10. Performance algorithmique et passage \u00e0 l&rsquo;\u00e9chelle sur m\u00e9gadonn\u00e9es<\/h2>\n<h3>10.1 Complexit\u00e9 temporelle des algorithmes sous-jacents<\/h3>\n<p>L&rsquo;extraction d&rsquo;un centile sur une s\u00e9rie de taille <em>N<\/em> requiert fondamentalement une op\u00e9ration d&rsquo;ordonnancement partiel ou total des \u00e9l\u00e9ments de la collection. L&rsquo;approche intuitive la plus rudimentaire consisterait \u00e0 ex\u00e9cuter un tri exhaustif de l&rsquo;\u00e9chantillon pr\u00e9alablement \u00e0 l&rsquo;extraction de la coordonn\u00e9e index\u00e9e. Les meilleurs algorithmes de tri universel en m\u00e9moire, tels que Timsort (utilis\u00e9 nativement par Python) ou Introsort (couramment exploit\u00e9 en C++), affichent une complexit\u00e9 temporelle asymptotique th\u00e9orique de l&rsquo;ordre de <em>O<\/em>(<em>N<\/em> log <em>N<\/em>) dans le cas moyen et dans le pire des cas.<\/p>\n<p>Cependant, pour d\u00e9terminer un centile sp\u00e9cifique ou un nombre fini de quantiles, il s&rsquo;av\u00e8re inutilement dispendieux d&rsquo;ordonner l&rsquo;int\u00e9gralit\u00e9 des observations. Les biblioth\u00e8ques optimis\u00e9es telles que NumPy impl\u00e9mentent des algorithmes de s\u00e9lection non comparative d\u00e9riv\u00e9s du <em>Quickselect<\/em> de Hoare, ou de la m\u00e9thode de partitionnement <em>Introselect<\/em> d\u00e9velopp\u00e9e par David Musser. Cet algorithme hybride permute les \u00e9l\u00e9ments de part et d&rsquo;autre d&rsquo;un pivot jusqu&rsquo;\u00e0 ce que la <em>k<\/em>-i\u00e8me position soit rigoureusement isol\u00e9e, sans garantir l&rsquo;ordre relatif des sous-ensembles adjacents.<\/p>\n<p>Gr\u00e2ce \u00e0 cette strat\u00e9gie de s\u00e9lection partitionn\u00e9e, la complexit\u00e9 temporelle moyenne est abaiss\u00e9e \u00e0 <em>O<\/em>(<em>N<\/em>), soit une progression strictement lin\u00e9aire proportionnelle au volume des donn\u00e9es trait\u00e9es. Cette diff\u00e9rence d&rsquo;ordre de grandeur th\u00e9orique devient substantielle d\u00e8s lors que l&rsquo;effectif <em>N<\/em> franchit le cap des dizaines ou centaines de millions d&rsquo;enregistrements, transformant un calcul potentiellement prohibitif en une routine presque instantan\u00e9e.<\/p>\n<h3>10.2 Mesure comparative de performance (NumPy vs Pandas vs Python brut)<\/h3>\n<p>L&rsquo;efficience computationnelle des diff\u00e9rents moteurs de calcul disponibles en Python peut \u00eatre quantifi\u00e9e avec pr\u00e9cision au moyen du module standard d&rsquo;\u00e9talonnage <code>timeit<\/code>. Consid\u00e9rons un vecteur synth\u00e9tique de 10 millions d&rsquo;observations flottantes \u00e0 virgule double, sur lequel nous mesurons le temps de d\u00e9rivation de la m\u00e9diane (50e centile) \u00e0 travers trois paradigmes concurrents : une boucle it\u00e9rative pure en Python standard associ\u00e9e \u00e0 un tri natif, l&rsquo;op\u00e9rateur <code>numpy.percentile()<\/code>, et la m\u00e9thode <code>Series.quantile()<\/code> de Pandas.<\/p>\n<p>Les r\u00e9sultats exp\u00e9rimentaux mettent invariablement en lumi\u00e8re la sous-performance critique du Python brut. L&rsquo;impl\u00e9mentation na\u00efve d&rsquo;un tri de liste via <code>donnees.sort()<\/code> suivie d&rsquo;une s\u00e9lection d&rsquo;index requiert plusieurs secondes de traitement processeur et monopolise une volum\u00e9trie m\u00e9moire massive pour la manipulation des conteneurs de pointeurs. \u00c0 l&rsquo;oppos\u00e9, <code>numpy.percentile()<\/code> ex\u00e9cute l&rsquo;op\u00e9ration en une fraction de seconde, gr\u00e2ce \u00e0 ses routines compil\u00e9es en langage C exploitant des blocs contigus en m\u00e9moire cache et un partitionnement d&rsquo;espace m\u00e9moire minimal.<\/p>\n<p>L&rsquo;impl\u00e9mentation de Pandas, bien qu&rsquo;articul\u00e9e en sous-main sur les m\u00eames primitives vectorielles que NumPy, affiche une l\u00e9g\u00e8re surcharge temporelle d&rsquo;environ 5% \u00e0 15%. Cette minime p\u00e9nalit\u00e9 computationnelle est imputable aux couches d&rsquo;abstraction orient\u00e9es objet qui g\u00e8rent la validation d&rsquo;int\u00e9grit\u00e9 de l&rsquo;index, la v\u00e9rification des types de s\u00e9ries et la surveillance active d&rsquo;\u00e9ventuels masques de valeurs manquantes. Pour les boucles critiques de calcul intensif ou de simulation Monte-Carlo r\u00e9p\u00e9t\u00e9es des millions de fois, l&rsquo;utilisation directe des fonctions de bas niveau de NumPy s&rsquo;impose donc logiquement comme le choix de pr\u00e9dilection.<\/p>\n<h3>10.3 Strat\u00e9gies d&rsquo;approximation sur donn\u00e9es massives (Streaming)<\/h3>\n<p>En d\u00e9pit des optimisations algorithmiques d&rsquo;ordre <em>O<\/em>(<em>N<\/em>), la fonction <code>numpy.percentile()<\/code> pr\u00e9sente une limitation structurelle incontournable : elle requiert le chargement int\u00e9gral des donn\u00e9es au sein de la m\u00e9moire vive (RAM) de la machine h\u00f4te. Lorsque le volume d&rsquo;un jeu de donn\u00e9es exc\u00e8de la capacit\u00e9 physique de m\u00e9moire (plusieurs dizaines ou centaines de gigaoctets g\u00e9n\u00e9r\u00e9s par des flux transactionnels ou des capteurs t\u00e9l\u00e9m\u00e9triques), l&rsquo;ex\u00e9cution de l&rsquo;algorithme d\u00e9clenche une saturation de swap ou une interruption brutale de type <code>MemoryError<\/code>.<\/p>\n<p>Pour contourner ce goulot d&rsquo;\u00e9tranglement mat\u00e9riel, les ing\u00e9nieurs de donn\u00e9es exploitent des algorithmes probabilistes d&rsquo;esquisse (<em>sketching algorithms<\/em>) con\u00e7us pour le calcul de quantiles en flux continu (<em>streaming<\/em>). L&rsquo;algorithme <em>t-digest<\/em>, conceptualis\u00e9 par Ted Dunning, constitue le mod\u00e8le le plus probant de cette classe d&rsquo;estimateurs. Plut\u00f4t que de stocker chaque observation individuelle, le <em>t-digest<\/em> accumule les donn\u00e9es au sein de centro\u00efdes compacts dont la taille s&rsquo;ajuste dynamiquement, conservant une pr\u00e9cision extr\u00eame aux fronti\u00e8res de la distribution (pr\u00e8s des centiles 0 et 100) tout en comprimant massivement l&#8217;empreinte m\u00e9moire d&rsquo;un facteur pouvant atteindre plusieurs millions.<\/p>\n<p>Au sein de l&rsquo;\u00e9cosyst\u00e8me Python, ces structures d&rsquo;approximation sont accessibles via des biblioth\u00e8ques telles que <code>tdigest<\/code> ou int\u00e9gr\u00e9es au c\u0153ur de frameworks de calcul distribu\u00e9 comme <a rel=\"noopener noreferrer\" href=\"https:\/\/www.dask.org\/\">Dask<\/a>. Dask permet de partitionner un ensemble massif de donn\u00e9es r\u00e9parties sur un cluster de machines et d&rsquo;\u00e9valuer les centiles globaux avec une marge d&rsquo;erreur contr\u00f4l\u00e9e, franchissant les limites de mise \u00e0 l&rsquo;\u00e9chelle inh\u00e9rentes aux biblioth\u00e8ques purement monothread\u00e9es.<\/p>\n<h2>11. \u00c9tudes de cas appliqu\u00e9es \u00e0 l&rsquo;analyse de donn\u00e9es psychologiques<\/h2>\n<h3>11.1 \u00c9talonnage standardis\u00e9 des scores de tests psychom\u00e9triques<\/h3>\n<p>La psychom\u00e9trie constitue un domaine d&rsquo;application embl\u00e9matique o\u00f9 la manipulation rigoureuse des centiles s&rsquo;av\u00e8re indispensable \u00e0 l&rsquo;exercice clinique. Lorsqu&rsquo;une batterie d&rsquo;\u00e9valuation cognitive standardis\u00e9e (telle qu&rsquo;une \u00e9chelle de m\u00e9moire ou un test de quotient intellectuel de type WISC\/WAIS) est administr\u00e9e \u00e0 un patient, le score brut obtenu (repr\u00e9sentant la simple somme des items r\u00e9solus) est d\u00e9pourvu de valeur diagnostique intrins\u00e8que. Il doit imp\u00e9rativement \u00eatre converti en un rang centile standardis\u00e9, calcul\u00e9 \u00e0 partir d&rsquo;un groupe d&rsquo;\u00e9talonnage repr\u00e9sentatif de la population d&rsquo;appartenance.<\/p>\n<p>Imaginons la cohorte d&rsquo;\u00e9talonnage suivante, compos\u00e9e d&rsquo;un \u00e9chantillon normatif d&rsquo;enfants du m\u00eame groupe d&rsquo;\u00e2ge ayant compl\u00e9t\u00e9 une \u00e9preuve d&rsquo;attention s\u00e9lective, face auquel nous positionnons le score d&rsquo;un nouvel individu :<\/p>\n<p><code>etalonnage_normatif = np.array([32, 45, 48, 52, 55, 58, 60, 62, 65, 68, 70, 72, 75, 78, 82, 85, 90, 94])<\/code><br \/>\n<code>score_sujet = 52<\/code><br \/>\n<code>rang_patient = stats.percentileofscore(etalonnage_normatif, score_sujet, kind='mean')<\/code><\/p>\n<p>L&rsquo;obtention d&rsquo;un rang centile de 22.22% signifie que le sujet surpasse approximativement 22% de ses pairs, tandis que pr\u00e8s de 78% de la cohorte de r\u00e9f\u00e9rence t\u00e9moigne de performances sup\u00e9rieures. En pratique neuropsychologique, les performances situ\u00e9es sous le 5e ou le 2e centile sont g\u00e9n\u00e9ralement retenues comme seuil de d\u00e9ficit pathologique av\u00e9r\u00e9.<\/p>\n<p>Ce protocole analytique neutralise la forme originelle de la distribution des scores bruts. En psychologie clinique, de nombreuses \u00e9preuves manifestent un effet plafond (la majorit\u00e9 des participants normatifs atteignent des scores maximaux), ce qui engendre une asym\u00e9trie n\u00e9gative prononc\u00e9e rendant totalement inop\u00e9rante l&rsquo;utilisation des scores Z gaussiens classiques. La conversion en rangs centiles restitue une \u00e9chelle ordinale universelle et imm\u00e9diatement traduisible pour le bilan clinique.<\/p>\n<h3>11.2 Analyse chronom\u00e9trique des temps de r\u00e9action cognitive<\/h3>\n<p>L&rsquo;\u00e9tude chronom\u00e9trique des temps de r\u00e9action cognitive face \u00e0 des stimuli perceptifs (t\u00e2ches de type Stroop ou d\u00e9tection visuelle) confronte syst\u00e9matiquement le chercheur \u00e0 des distributions empiriques hautement asym\u00e9triques \u00e0 \u00e9talement positif, traditionnellement mod\u00e9lis\u00e9es par des lois Ex-Gaussiennes ou de Wald. La majorit\u00e9 des r\u00e9ponses motrices s&rsquo;agr\u00e8gent autour d&rsquo;une latence minimale physiologique (par exemple 250 \u00e0 400 millisecondes), tandis qu&rsquo;une longue tra\u00eene de r\u00e9ponses lentes s&rsquo;\u00e9tire jusqu&rsquo;\u00e0 plusieurs secondes en raison de d\u00e9faillances attentionnelles transitoires.<\/p>\n<p>Dans ce contexte pr\u00e9cis, synth\u00e9tiser les performances d&rsquo;un individu ou d&rsquo;une condition exp\u00e9rimentale par la simple moyenne arithm\u00e9tique et son \u00e9cart-type produit une distorsion m\u00e9thodologique grave. Le recours \u00e0 un profil vectoris\u00e9 de centiles fournit en revanche une d\u00e9composition fine des m\u00e9canismes sous-jacents :<\/p>\n<p><code>temps_reaction_ms = np.array([285, 290, 305, 310, 312, 325, 340, 360, 410, 490, 680, 1120])<\/code><br \/>\n<code>p10, p50, p90 = np.percentile(temps_reaction_ms, [10, 50, 90])<\/code><\/p>\n<p>Cette tripartition distributionnelle offre une interpr\u00e9tation fonctionnelle distincte :<\/p>\n<ul>\n<li>Le 10e centile (P10) isole la vitesse limite d&rsquo;ex\u00e9cution visuomotrice et la transmission nerveuse sensorielle pure, largement ind\u00e9pendante de la charge cognitive complexe.<\/li>\n<li>Le 50e centile (P50, la m\u00e9diane) mat\u00e9rialise la tendance centrale stable du traitement d&rsquo;information sans contamination par les fluctuations de vigilance.<\/li>\n<li>Le 90e centile (P90) quantifie sp\u00e9cifiquement l&rsquo;amplitude des d\u00e9crochages attentionnels et l&rsquo;instabilit\u00e9 du contr\u00f4le ex\u00e9cutif frontal.<\/li>\n<\/ul>\n<p>L&rsquo;\u00e9cart inter-centile P90 &#8211; P10 se r\u00e9v\u00e8le infiniment plus informatif et discriminant pour diagnostiquer des troubles du d\u00e9ficit de l&rsquo;attention que les m\u00e9triques classiques de dispersion param\u00e9trique.<\/p>\n<h3>11.3 D\u00e9tection empirique de profils cliniques atypiques<\/h3>\n<p>L&rsquo;identification de profils psychopathologiques complexes requiert fr\u00e9quemment l&rsquo;analyse conjointe de plusieurs dimensions symptomatiques au sein d&rsquo;une cohorte clinique. Consid\u00e9rons un \u00e9chantillon structur\u00e9 sous forme de DataFrame Pandas int\u00e9grant deux \u00e9chelles d&rsquo;\u00e9valuation standardis\u00e9es : le score d&rsquo;Anxi\u00e9t\u00e9 G\u00e9n\u00e9ralis\u00e9e (GAD-7) et le score d&rsquo;\u00c9puisement Professionnel (Maslach Burnout Inventory) :<\/p>\n<p><code>donnees_eval = pd.DataFrame({<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;'Sujet_ID': [f'P_{i:03d}' for i in range(1, 11)],<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;'Anxiete': [5, 8, 12, 14, 18, 6, 9, 21, 15, 11],<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;'Burnout': [22, 31, 45, 38, 56, 19, 28, 62, 49, 35]<\/code><br \/>\n<code>})<\/code><\/p>\n<p>Pour isoler les patients manifestant une s\u00e9v\u00e9rit\u00e9 critique n\u00e9cessitant une prise en charge urgente, l&rsquo;analyste peut impl\u00e9menter un filtrage bas\u00e9 sur le croisement des seuils centiles sup\u00e9rieurs (par exemple le 80e centile sur chaque dimension respective) :<\/p>\n<p><code>seuil_anxiete = donnees_eval['Anxiete'].quantile(0.80)<\/code><br \/>\n<code>seuil_burnout = donnees_eval['Burnout'].quantile(0.80)<\/code><br \/>\n<code>profils_critiques = donnees_eval[<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;(donnees_eval['Anxiete'] >= seuil_anxiete) &<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;(donnees_eval['Burnout'] >= seuil_burnout)<\/code><br \/>\n<code>]<\/code><\/p>\n<p>Cette op\u00e9ration r\u00e9alise une segmentation non param\u00e9trique multidimensionnelle. L&rsquo;analyste s&rsquo;affranchit des discordances d&rsquo;unit\u00e9s de mesure entre les deux tests pour cartographier un sous-espace clinique objectif. La restitution des identifiants patients isol\u00e9s au sein d&rsquo;un tableau filtr\u00e9 permet ensuite de planifier des interventions th\u00e9rapeutiques cibl\u00e9es sur cette population \u00e0 haut risque.<\/p>\n<h2>12. Bonnes pratiques, erreurs fr\u00e9quentes et recommandations m\u00e9thodologiques<\/h2>\n<h3>12.1 Confusions conceptuelles et discordances d&rsquo;\u00e9chelles de saisie<\/h3>\n<p>L&rsquo;une des sources d&rsquo;erreurs logiques les plus r\u00e9pandues lors de la mise en \u0153uvre de calculs de centiles en Python r\u00e9side dans la disparit\u00e9 d&rsquo;\u00e9chelle d&rsquo;argumentation entre les modules NumPy et Pandas. Comme d\u00e9taill\u00e9 pr\u00e9c\u00e9demment, NumPy exige un intervalle de valeurs compris entre 0 et 100 pour son param\u00e8tre <code>q<\/code>, tandis que la m\u00e9thode de Pandas requiert rigoureusement un intervalle de probabilit\u00e9 compris entre 0.0 et 1.0.<\/p>\n<p>Une confusion entre ces deux conventions engendre des dysfonctionnements majeurs :<\/p>\n<ul>\n<li>Soumettre la valeur scalaire <code>50<\/code> \u00e0 la fonction <code>Series.quantile(50)<\/code> de Pandas provoque l&rsquo;arr\u00eat imm\u00e9diat du programme par l&rsquo;\u00e9mission d&rsquo;une exception de type <code>ValueError: percentiles should be in [0, 1]<\/code>.<\/li>\n<li>\u00c0 l&rsquo;inverse, et de mani\u00e8re bien plus pernicieuse, passer la valeur <code>0.50<\/code> \u00e0 la fonction <code>numpy.percentile(vecteur, 0.50)<\/code> ne d\u00e9clenche aucune erreur d&rsquo;ex\u00e9cution. Le moteur NumPy interpr\u00e8te cette requ\u00eate comme une demande l\u00e9gitime d&rsquo;extraction du demi-centile (le 0.50e centile, soit la valeur sous laquelle se trouve 0.5% des donn\u00e9es), retournant une valeur d&rsquo;extr\u00e9mit\u00e9 au lieu de la m\u00e9diane esp\u00e9r\u00e9e.<\/li>\n<\/ul>\n<p>Une seconde confusion conceptuelle courante consiste \u00e0 assimiler le centile calcul\u00e9 \u00e0 un pourcentage direct du score maximal r\u00e9alisable au test. Obtenir un score de 80 points sur une \u00e9preuve not\u00e9e sur 100 n&rsquo;implique absolument pas que l&rsquo;individu se situe au 80e centile ; si l&rsquo;\u00e9preuve est particuli\u00e8rement accessible et que 90% des participants obtiennent une note de 95 points, un score de 80 correspondra en r\u00e9alit\u00e9 \u00e0 un centile tr\u00e8s modeste, proche des tranches inf\u00e9rieures de distribution.<\/p>\n<h3>12.2 Pi\u00e8ges computationnels li\u00e9s aux types et structures de donn\u00e9es<\/h3>\n<p>La robustesse des estimations quantiles peut \u00e9galement \u00eatre compromise par des \u00e9cueils li\u00e9s \u00e0 la repr\u00e9sentation binaire des donn\u00e9es informatiques. L&rsquo;utilisation de types \u00e0 virgule flottante de faible pr\u00e9cision, tels que <code>numpy.float16<\/code> ou <code>numpy.float32<\/code>, fr\u00e9quemment employ\u00e9s en apprentissage automatique pour limiter la consommation de bande passante sur les cartes graphiques (GPU), introduit des erreurs d&rsquo;arrondi susceptibles de fausser les tests d&rsquo;\u00e9galit\u00e9 logique lors des tris partiels, g\u00e9n\u00e9rant des inversions artificielles d&rsquo;indices fractionnaires.<\/p>\n<p>La pr\u00e9sence de valeurs infinies non standardis\u00e9es (<code>np.inf<\/code> ou <code>-np.inf<\/code>), issues de divisions par z\u00e9ro non intercept\u00e9es dans la cha\u00eene de pr\u00e9traitement, induit \u00e9galement des d\u00e9rives math\u00e9matiques singuli\u00e8res. Contrairement aux valeurs <code>NaN<\/code> qui propagent une ind\u00e9termination explicite, l&rsquo;infini positif est syst\u00e9matiquement rel\u00e9gu\u00e9 au dernier rang de l&rsquo;ordonnancement. En cons\u00e9quence, les centiles \u00e9lev\u00e9s (par exemple le 99e ou le 99.9e centile) peuvent adopter la valeur <code>inf<\/code>, an\u00e9antissant l&rsquo;utilit\u00e9 pratique de la mesure sans qu&rsquo;aucun avertissement ne soit \u00e9mis dans les journaux d&rsquo;ex\u00e9cution.<\/p>\n<p>Enfin, une inefficience algorithmique fr\u00e9quente consiste \u00e0 appliquer manuellement la fonction <code>numpy.sort()<\/code> sur un tableau pr\u00e9alablement \u00e0 l&rsquo;appel de <code>numpy.percentile()<\/code>. Comme explicit\u00e9 dans la section algorithmique, NumPy d\u00e9ploie nativement une s\u00e9lection partitionn\u00e9e d&rsquo;ordre lin\u00e9aire ; contraindre l&rsquo;interpr\u00e9teur \u00e0 ex\u00e9cuter un tri complet pr\u00e9alable en <em>O<\/em>(<em>N<\/em> log <em>N<\/em>) dissipe inutilement du temps de calcul processeur sans apporter le moindre gain de pr\u00e9cision num\u00e9rique au r\u00e9sultat final.<\/p>\n<h3>12.3 Guide r\u00e9capitulatif pour des analyses statistiques reproductibles<\/h3>\n<p>Pour assurer la p\u00e9rennit\u00e9, la tra\u00e7abilit\u00e9 et la conformit\u00e9 acad\u00e9mique des analyses statistiques articul\u00e9es autour des centiles en langage Python, le chercheur ou l&rsquo;analyste se doit d&rsquo;adopter un ensemble de r\u00e8gles m\u00e9thodologiques strictes :<\/p>\n<ul>\n<li><strong>Explicitation syst\u00e9matique des hyperparam\u00e8tres<\/strong> : Documentez imp\u00e9rativement le mode d&rsquo;interpolation retenu (par exemple <code>method='linear'<\/code> ou <code>method='nearest'<\/code>) au sein des rapports de recherche afin de permettre la r\u00e9plication rigoureuse des r\u00e9sultats sur des moteurs tiers (tels que R, SAS ou SPSS).<\/li>\n<li><strong>Verrouillage de l&rsquo;environnement mat\u00e9riel et logiciel<\/strong> : Enregistrez formellement les versions exactes de l&rsquo;interpr\u00e9teur Python, de NumPy et de SciPy au sein d&rsquo;un fichier standardis\u00e9 de d\u00e9pendances (<code>requirements.txt<\/code> ou <code>environment.yml<\/code>) pour pr\u00e9venir les fluctuations d&rsquo;algorithmes par d\u00e9faut d&rsquo;une r\u00e9vision logicielle \u00e0 l&rsquo;autre.<\/li>\n<li><strong>Validation d\u00e9fensive des types et contraintes<\/strong> : Encapsulez vos routines critiques dans des fonctions d&rsquo;analyse d\u00e9fensives v\u00e9rifiant la compl\u00e9tude dimensionnelle, l&rsquo;absence de valeurs infinies et l&rsquo;ad\u00e9quation formelle des bornes d&rsquo;\u00e9chelles avant toute extraction statistique.<\/li>\n<\/ul>\n<p>Le mod\u00e8le de code ci-dessous mat\u00e9rialise une cha\u00eene de traitement robuste, modulaire et pr\u00eate pour une int\u00e9gration en environnement de production scientifique :<\/p>\n<p><code>import numpy as np<\/code><br \/>\n<code>from typing import Union, Sequence<\/code><\/p>\n<p><code>def extraire_centiles_securises(<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;donnees: Union[np.ndarray, Sequence[float]],<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;centiles: Union[float, Sequence[float]],<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;methode: str = \"linear\"<\/code><br \/>\n<code>) -> np.ndarray:<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;\"\"\"<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;Extrait les centiles d'un vecteur numerique de maniere defensive et robuste.<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;Ignore les valeurs manquantes (NaN) et intercepte les anomalies d'echelle.<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;\"\"\"<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;tableau = np.asarray(donnees, dtype=np.float64)<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;tableau_nettoye = tableau[np.isfinite(tableau)]<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;if tableau_nettoye.size == 0:<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise ValueError(\"Le vecteur de donnees ne contient aucune valeur finie exploitable.\")<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;q = np.asarray(centiles, dtype=np.float64)<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;if np.any(q &lt; 0.0) or np.any(q &gt; 100.0):<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise ValueError(\"Les centiles doivent etre rigoureusement compris entre 0.0 et 100.0.\")<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;return np.percentile(tableau_nettoye, q=q, method=methode)<\/code><\/p>\n<p>En int\u00e9grant syst\u00e9matiquement ce niveau d&rsquo;exigence formelle au sein de vos scripts de traitement de donn\u00e9es, vous garantissez l&rsquo;exactitude num\u00e9rique, la r\u00e9silience aux anomalies et la transf\u00e9rabilit\u00e9 m\u00e9thodologique de vos conclusions empiriques \u00e0 travers l&rsquo;ensemble des sph\u00e8res applicatives de la science des donn\u00e9es moderne.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<p>Dunning, T. (2021). Computing extremely accurate quantiles using t-digests. <em>Data Science and Engineering<\/em>, 6(4), 353-366. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1007\/s41019-021-00163-x\">https:\/\/doi.org\/10.1007\/s41019-021-00163-x<\/a><\/p>\n<p>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&iacute;o, F. A., Wiebe, M., Peterson, P., &hellip; Oliphant, T. E. (2020). Array programming with NumPy. <em>Nature<\/em>, 585(7825), 357-362. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1038\/s41586-020-2649-2\">https:\/\/doi.org\/10.1038\/s41586-020-2649-2<\/a><\/p>\n<p>Hoare, C. A. R. (1961). Algorithm 65: Find. <em>Communications of the ACM<\/em>, 4(7), 321-322. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1145\/366622.366647\">https:\/\/doi.org\/10.1145\/366622.366647<\/a><\/p>\n<p>Hunter, J. D. (2007). Matplotlib: A 2D graphics environment. <em>Computing in Science &amp; Engineering<\/em>, 9(3), 90-95. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1109\/MCSE.2007.55\">https:\/\/doi.org\/10.1109\/MCSE.2007.55<\/a><\/p>\n<p>Hyndman, R. J., &amp; Fan, Y. (1996). Sample quantiles in statistical packages. <em>The American Statistician<\/em>, 50(4), 361-365. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1080\/00031305.1996.10473566\">https:\/\/doi.org\/10.1080\/00031305.1996.10473566<\/a><\/p>\n<p>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-61). <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.25080\/Majora-92bf1922-00a\">https:\/\/doi.org\/10.25080\/Majora-92bf1922-00a<\/a><\/p>\n<p>Musser, D. R. (1997). Introspective sorting and selection algorithms. <em>Software: Practice and Experience<\/em>, 27(8), 983-993. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1002\/(SICI)1097-024X(199708)27:8&lt;983::AID-SPE117&gt;3.0.CO;2-#\">https:\/\/doi.org\/10.1002\/(SICI)1097-024X(199708)27:8&lt;983::AID-SPE117&gt;3.0.CO;2-#<\/a><\/p>\n<p>Tukey, J. W. (1977). <em>Exploratory data analysis<\/em>. Addison-Wesley.<\/p>\n<p>Virtanen, P., Gommers, R., Oliphant, T. E., Haberland, M., Reddy, T., Cournapeau, D., Burovski, E., Peterson, P., Weckesser, W., Bright, J., van der Walt, S. J., Brett, M., Wilson, J., Millman, K. J., Mayorov, N., Nelson, A. R. J., Jones, E., Kern, R., Larson, E., &hellip; SciPy 1.0 Contributors. (2020). SciPy 1.0: Fundamental algorithms for scientific computing in Python. <em>Nature Methods<\/em>, 17(3), 261-272. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1038\/s41592-019-0686-2\">https:\/\/doi.org\/10.1038\/s41592-019-0686-2<\/a><\/p>\n<p>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><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour calculer les centiles en Python avec NumPy, Pandas et SciPy : th\u00e9orie, formules, algorithmes d&rsquo;interpolation et exemples concrets.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[2465,3910],"tags":[6869,2960,2466,2468,2344],"class_list":["post-4893","psych_stat","type-psych_stat","status-publish","hentry","category-programmation-python","category-statistiques-et-psychometrie","tag-centiles","tag-numpy","tag-pandas","tag-python","tag-statistiques"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4893","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=4893"}],"version-history":[{"count":0,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4893\/revisions"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4893"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}