{"id":4020,"date":"2026-10-14T18:01:10","date_gmt":"2026-10-14T18:01:10","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-ajuster-taille-bacs-histogrammes-matplotlib\/"},"modified":"2026-10-14T18:01:10","modified_gmt":"2026-10-14T18:01:10","slug":"comment-ajuster-taille-bacs-histogrammes-matplotlib","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-ajuster-taille-bacs-histogrammes-matplotlib","title":{"rendered":"Comment ajuster la taille des bacs dans les histogrammes Matplotlib"},"content":{"rendered":"<p>La visualisation de donn\u00e9es quantitatives continues constitue l&rsquo;un des piliers fondamentaux de l&rsquo;analyse exploratoire et de l&rsquo;inf\u00e9rence statistique moderne. D\u00e8s lors qu&rsquo;un chercheur, un ing\u00e9nieur ou un analyste fait face \u00e0 une collection d&rsquo;observations empiriques non structur\u00e9es, la premi\u00e8re d\u00e9marche analytique consiste invariablement \u00e0 examiner la morphologie de la distribution sous-jacente. Cette morphologie \u2014 qu&rsquo;elle r\u00e9v\u00e8le une sym\u00e9trie id\u00e9ale, une asym\u00e9trie positive prononc\u00e9e, une bimodalit\u00e9 latente ou la pr\u00e9sence de queues de distribution \u00e9paisses \u2014 dicte la validit\u00e9 des mod\u00e8les param\u00e9triques ult\u00e9rieurs et oriente les choix m\u00e9thodologiques fondamentaux. Dans cet \u00e9cosyst\u00e8me, l&rsquo;histogramme demeure la repr\u00e9sentation graphique la plus intuitive et la plus universellement d\u00e9ploy\u00e9e. Pourtant, sous cette apparente simplicit\u00e9 op\u00e9ratoire se dissimule un processus complexe d&rsquo;estimation non param\u00e9trique de densit\u00e9 dont l&rsquo;exactitude d\u00e9pend d&rsquo;un facteur hautement sensible : le partitionnement de l&rsquo;espace des donn\u00e9es en classes, commun\u00e9ment appel\u00e9es \u00ab bacs \u00bb ou <em>bins<\/em>.<\/p>\n<p>Dans l&rsquo;environnement de programmation scientifique Python, la biblioth\u00e8que <a rel=\"noopener noreferrer\" href=\"https:\/\/matplotlib.org\/\">Matplotlib<\/a> s&rsquo;est impos\u00e9e comme le standard <em>de facto<\/em> pour la g\u00e9n\u00e9ration de graphiques publiables et rigoureux. Sa fonction phare, <code>plt.hist()<\/code> (ou son pendant orient\u00e9 objet <code>ax.hist()<\/code>), fournit une interface puissante permettant de transformer un vecteur continu d&rsquo;observations en une s\u00e9rie d&rsquo;intervalles discrets contigus surmont\u00e9s de rectangles verticaux. Toutefois, l&rsquo;utilisation na\u00efve des param\u00e8tres par d\u00e9faut de cet outil expose l&rsquo;analyste \u00e0 des illusions visuelles majeures. Un histogramme param\u00e9tr\u00e9 de mani\u00e8re inad\u00e9quate peut masquer des sous-populations cliniques distinctes, introduire des modes artificiels g\u00e9n\u00e9r\u00e9s par le simple bruit d&rsquo;\u00e9chantillonnage, ou encore alt\u00e9rer dramatiquement l&rsquo;\u00e9valuation visuelle de la variance d&rsquo;un ph\u00e9nom\u00e8ne.<\/p>\n<p>Le contr\u00f4le rigoureux de la taille, du nombre et de l&rsquo;alignement des bacs ne rel\u00e8ve donc pas d&rsquo;une simple coquetterie esth\u00e9tique, mais d&rsquo;un imp\u00e9ratif \u00e9pist\u00e9mologique et m\u00e9thodologique. Cet article propose une exploration exhaustive, th\u00e9orique et appliqu\u00e9e, des m\u00e9canismes de discr\u00e9tisation offerts par Matplotlib. Des fondements math\u00e9matiques de l&rsquo;erreur quadratique int\u00e9gr\u00e9e moyenne jusqu&rsquo;aux impl\u00e9mentations vectoris\u00e9es avanc\u00e9es avec NumPy, en passant par les r\u00e8gles heuristiques optimales et le traitement de donn\u00e9es cliniques asym\u00e9triques, ce guide dresse le panorama complet des techniques indispensables pour ma\u00eetriser la granularit\u00e9 de vos histogrammes et garantir l&rsquo;int\u00e9grit\u00e9 de vos interpr\u00e9tations scientifiques.<\/p>\n<h2>1. Fondements th\u00e9oriques de la discr\u00e9tisation et r\u00f4le des bacs dans la visualisation de donn\u00e9es<\/h2>\n<h3>1.1 D\u00e9finition math\u00e9matique et conceptuelle du bac (bin)<\/h3>\n<p>Sur le plan math\u00e9matique, la construction d&rsquo;un histogramme repose sur le partitionnement d&rsquo;un ensemble compact ou semi-compact de la droite r\u00e9elle <span class=\"arabpsy-math-inline\" data-latex=\"\\mathbb{R}\">$\\mathbb{R}$<\/span>, sur lequel se d\u00e9ploie une variable al\u00e9atoire continue <span class=\"arabpsy-math-inline\" data-latex=\"X\">$X$<\/span>. Soit un \u00e9chantillon de donn\u00e9es unidimensionnelles <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{D} = {x_1, x_2, dots, x_N}\">$\\mathcal{D} = {x_1, x_2, dots, x_N}$<\/span> issu d&rsquo;une population parente gouvern\u00e9e par une fonction de densit\u00e9 de probabilit\u00e9 inconnue <span class=\"arabpsy-math-inline\" data-latex=\"f(x)\">$f(x)$<\/span>. Le processus de discr\u00e9tisation consiste \u00e0 diviser le support observ\u00e9 de la variable en un ensemble ordonn\u00e9 de <span class=\"arabpsy-math-inline\" data-latex=\"K\">$K$<\/span> sous-intervalles mutuellement exclusifs et exhaustivement couvrants, d\u00e9sign\u00e9s sous le terme de bacs (ou <em>bins<\/em> en anglais) :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"B_k = [e_{k-1}, e_k) \\quad \\text{pour } k in {1, 2, dots, K}\">$$B_k = [e_{k-1}, e_k) \\quad \\text{pour } k in {1, 2, dots, K}$$<\/span><\/p>\n<p>o\u00f9 les grandeurs scalaires <span class=\"arabpsy-math-inline\" data-latex=\"{e_0, e_1, dots, e_K}\">${e_0, e_1, dots, e_K}$<\/span> repr\u00e9sentent les limites ou fronti\u00e8res de classe (<em>bin edges<\/em>). Par construction axiomatique de la th\u00e9orie des ensembles, ces intervalles v\u00e9rifient l&rsquo;absence de chevauchement :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"B_j \\cap B_k = \\emptyset \\quad \\forall j \\neq k\">$$B_j \\cap B_k = \\emptyset \\quad \\forall j \\neq k$$<\/span><\/p>\n<p>et leur union forme un recouvrement continu de l&rsquo;\u00e9tendue des donn\u00e9es observ\u00e9es. Pour chaque bac <span class=\"arabpsy-math-inline\" data-latex=\"B_k\">$B_k$<\/span>, on d\u00e9finit sa largeur intrins\u00e8que par la diff\u00e9rence g\u00e9om\u00e9trique <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta_k = e_k - e_{k-1}\">$\\Delta_k = e_k &#8211; e_{k-1}$<\/span>, ainsi qu&rsquo;un effectif empirique <span class=\"arabpsy-math-inline\" data-latex=\"n_k\">$n_k$<\/span> correspondant au nombre total d&rsquo;observations tombant \u00e0 l&rsquo;int\u00e9rieur des bornes de l&rsquo;intervalle :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"n_k = \\sum_{i=1}^N \\mathbb{I}(x_i in B_k)\">$$n_k = \\sum_{i=1}^N \\mathbb{I}(x_i in B_k)$$<\/span><\/p>\n<p>o\u00f9 <span class=\"arabpsy-math-inline\" data-latex=\"\\mathbb{I}\">$\\mathbb{I}$<\/span> d\u00e9signe la fonction indicatrice standard. La relation entre la fr\u00e9quence observ\u00e9e <span class=\"arabpsy-math-inline\" data-latex=\"n_k\">$n_k$<\/span>, la largeur <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta_k\">$\\Delta_k$<\/span> et la hauteur de la barre graphique \u00e9rig\u00e9e au-dessus de <span class=\"arabpsy-math-inline\" data-latex=\"B_k\">$B_k$<\/span> constitue l&rsquo;un des points de rupture conceptuels les plus fr\u00e9quents dans l&rsquo;analyse de donn\u00e9es. Dans un histogramme de fr\u00e9quences absolues, la hauteur correspond directement \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"n_k\">$n_k$<\/span>. En revanche, d\u00e8s lors que l&rsquo;on cherche \u00e0 estimer la densit\u00e9 de probabilit\u00e9 sous-jacente, la hauteur <span class=\"arabpsy-math-inline\" data-latex=\"h_k\">$h_k$<\/span> de la barre doit imp\u00e9rativement \u00eatre normalis\u00e9e par la largeur du bac et la taille globale de l&rsquo;\u00e9chantillon :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"h_k = \\frac{n_k}{N \\cdot \\Delta_k}\">$$h_k = \\frac{n_k}{N \\cdot \\Delta_k}$$<\/span><\/p>\n<p>Cette distinction met en exergue la divergence structurelle entre un diagramme en barres cat\u00e9goriel (<em>bar chart<\/em>) et un histogramme continu. Le diagramme en barres repr\u00e9sente des entit\u00e9s qualitatives discr\u00e8tes, nominales ou ordinales, pour lesquelles la largeur des barres est purement conventionnelle et arbitraire, sans signification g\u00e9om\u00e9trique. Dans un histogramme, la surface de chaque rectangle repr\u00e9sente la proportion de la masse de probabilit\u00e9 contenue dans l&rsquo;intervalle consid\u00e9r\u00e9. Modifier arbitrairement la largeur sans ajuster la hauteur d\u00e9truit instantan\u00e9ment la relation g\u00e9om\u00e9trique de proportionnalit\u00e9, faussant irr\u00e9m\u00e9diablement l&rsquo;estimation de la fonction de densit\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"f(x)\">$f(x)$<\/span>.<\/p>\n<h3>1.2 Le compromis biais-variance dans le choix de la largeur des bacs<\/h3>\n<p>L&rsquo;estimation non param\u00e9trique de densit\u00e9 par histogramme est intimement r\u00e9gie par le dilemme universel du compromis biais-variance. La largeur de classe <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta\">$\\Delta$<\/span> (ou <span class=\"arabpsy-math-inline\" data-latex=\"h\">$h$<\/span> dans la litt\u00e9rature statistique anglo-saxonne) agit comme un param\u00e8tre de lissage qui gouverne l&rsquo;\u00e9quilibre entre la fid\u00e9lit\u00e9 aux donn\u00e9es observ\u00e9es et la g\u00e9n\u00e9ralisation \u00e0 la loi de probabilit\u00e9 th\u00e9orique g\u00e9n\u00e9ratrice.<\/p>\n<p>Le ph\u00e9nom\u00e8ne de sous-lissage (<em>under-smoothing<\/em>) se produit lorsque la largeur des bacs est excessivement faible par rapport \u00e0 la dispersion locale des observations. Dans cette configuration, le nombre de bacs <span class=\"arabpsy-math-inline\" data-latex=\"K\">$K$<\/span> devient disproportionnellement \u00e9lev\u00e9, et chaque bac ne recueille qu&rsquo;un nombre infime d&rsquo;observations, souvent compris entre z\u00e9ro et deux. L&rsquo;histogramme qui en r\u00e9sulte pr\u00e9sente une silhouette hautement d\u00e9chiquet\u00e9e, domin\u00e9e par des fluctuations stochastiques al\u00e9atoires propres \u00e0 l&rsquo;\u00e9chantillon fini plut\u00f4t que par la structure macroscopique de la population. Sur le plan statistique, le mod\u00e8le souffre d&rsquo;une variance excessive : deux \u00e9chantillons ind\u00e9pendants tir\u00e9s de la m\u00eame loi g\u00e9n\u00e9reront des histogrammes aux profils radicalement h\u00e9t\u00e9rog\u00e8nes. Cette variabilit\u00e9 parasite masque les modes r\u00e9els de la distribution et pi\u00e8ge l&rsquo;observateur dans l&rsquo;interpr\u00e9tation d&rsquo;art\u00e9facts de mesure sans validit\u00e9 externe.<\/p>\n<p>\u00c0 l&rsquo;oppos\u00e9, le sur-lissage (<em>over-smoothing<\/em>) d\u00e9coule d&rsquo;un partitionnement compos\u00e9 de bacs excessivement larges. Dans ce cas de figure, une portion substantielle de la dynamique distributionnelle est agr\u00e9g\u00e9e au sein d&rsquo;un contingent restreint d&rsquo;intervalles massifs. Si cette approche garantit une variance d&rsquo;\u00e9chantillonnage quasi nulle en stabilisant les fr\u00e9quences d&rsquo;un pr\u00e9l\u00e8vement \u00e0 l&rsquo;autre, elle introduit un biais syst\u00e9matique catastrophique. Les d\u00e9tails morphologiques fins, tels que l&rsquo;asym\u00e9trie locale, l&rsquo;aplatissement (kurtosis) ou la pr\u00e9sence critique de distributions bimodales dissimulant deux sous-groupes fonctionnels distincts, sont totalement an\u00e9antis par l&rsquo;effet d&rsquo;\u00e9crasement spatial.<\/p>\n<p>Afin de formaliser rigoureusement ce compromis, les statisticiens recourent au crit\u00e8re de l&rsquo;Erreur Quadratique Int\u00e9gr\u00e9e Moyenne, couramment abr\u00e9g\u00e9e en <a rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/Mean_integrated_squared_error\">MISE (Mean Integrated Squared Error)<\/a>. Pour un estimateur par histogramme <span class=\"arabpsy-math-inline\" data-latex=\"\\hat{f}(x)\">$\\hat{f}(x)$<\/span>, la MISE s&rsquo;exprime comme l&rsquo;int\u00e9grale sur tout le support du carr\u00e9 de l&rsquo;esp\u00e9rance de l&rsquo;\u00e9cart \u00e0 la densit\u00e9 r\u00e9elle :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{MISE}(\\hat{f}) = \\mathbb{E} \\left[ \\int_{-\\infty}^{+\\infty} (\\hat{f}(x) - f(x))^2 , dx \\right] = \\int \\text{Biais}^2(\\hat{f}(x)) , dx + \\int \\text{Var}(\\hat{f}(x)) , dx\">$$\\text{MISE}(\\hat{f}) = \\mathbb{E} \\left[ \\int_{-\\infty}^{+\\infty} (\\hat{f}(x) &#8211; f(x))^2 , dx \\right] = \\int \\text{Biais}^2(\\hat{f}(x)) , dx + \\int \\text{Var}(\\hat{f}(x)) , dx$$<\/span><\/p>\n<p>L&rsquo;analyse asymptotique d\u00e9montre que pour une largeur de bac uniforme <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta\">$\\Delta$<\/span>, le terme de biais int\u00e9gr\u00e9 converge vers z\u00e9ro \u00e0 une vitesse d&rsquo;ordre <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{O}(\\Delta^2)\">$\\mathcal{O}(\\Delta^2)$<\/span>, tandis que la variance int\u00e9gr\u00e9e diverge \u00e0 l&rsquo;ordre <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{O}\\left(\\frac{1}{N\\Delta}\\right)\">$\\mathcal{O}\\left(\\frac{1}{N\\Delta}\\right)$<\/span> lorsque <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta to 0\">$\\Delta to 0$<\/span>. L&rsquo;optimisation globale de la MISE impose ainsi de trouver la racine d&rsquo;une fonction d\u00e9riv\u00e9e o\u00f9 l&rsquo;augmentation de la variance compense exactement la r\u00e9duction du biais. Ce point d&rsquo;inflexion conditionne la transition entre une repr\u00e9sentation illusoire et une estimation scientifique valide.<\/p>\n<h3>1.3 Applications empiriques dans les sciences comportementales et psychologiques<\/h3>\n<p>L&rsquo;impact de la discr\u00e9tisation se manifeste avec une acuit\u00e9 particuli\u00e8re dans le domaine des sciences comportementales, cognitives et psychologiques. Dans ces disciplines, les grandeurs mesur\u00e9es r\u00e9sultent fr\u00e9quemment de processus neuronaux complexes dont les signatures distributionnelles constituent le c\u0153ur m\u00eame des hypoth\u00e8ses scientifiques test\u00e9es.<\/p>\n<p>Consid\u00e9rons l&rsquo;analyse des temps de r\u00e9action (TR) dans des paradigmes de d\u00e9cision lexicale ou de d\u00e9tection visuelle chronom\u00e9tr\u00e9e. Les temps de r\u00e9action ne suivent pratiquement jamais une loi normale centr\u00e9e et sym\u00e9trique ; ils sont remarquablement bien mod\u00e9lis\u00e9s par la distribution ex-gaussienne, issue de la convolution math\u00e9matique d&rsquo;une loi gaussienne (repr\u00e9sentant les \u00e9tapes sensorielles et motrices p\u00e9riph\u00e9riques) et d&rsquo;une distribution exponentielle (refl\u00e9tant les processus d\u00e9cisionnels centraux). Cette loi pr\u00e9sente une longue queue positive vers les latences \u00e9lev\u00e9es. Un choix arbitraire de bacs trop larges dans Matplotlib \u00e9crase cette tra\u00eene asymptotique, masquant les variations subtiles induites par une charge cognitive exp\u00e9rimentale ou par des d\u00e9ficits attentionnels pathologiques. Inversement, des bacs excessivement fins cr\u00e9ent des modes multiples et artificiels qui pourraient conduire le chercheur \u00e0 postuler erron\u00e9ment l&rsquo;existence de plusieurs sous-processus cognitifs s\u00e9quentiels l\u00e0 o\u00f9 il n&rsquo;existe qu&rsquo;un unique m\u00e9canisme stochastique unimodal.<\/p>\n<p>Un enjeu m\u00e9thodologique analogue \u00e9merge lors de l&rsquo;examen des scores psychom\u00e9triques issus de questionnaires cliniques agr\u00e9g\u00e9s sur des \u00e9chelles de type Likert (par exemple, le Beck Depression Inventory ou les sous-\u00e9chelles d&rsquo;anxi\u00e9t\u00e9 du STAI). Bien que ces scores d\u00e9rivent de r\u00e9ponses discr\u00e8tes ordonn\u00e9es, ils sont trait\u00e9s dans la pratique clinique et \u00e9pid\u00e9miologique comme des approximations continues d&rsquo;un trait latent sous-jacent. Si la taille du bac est fix\u00e9e sans tenir compte de la m\u00e9trique intrins\u00e8que de l&rsquo;instrument de mesure, des distorsions majeures peuvent survenir, telles que l&rsquo;agr\u00e9gation in\u00e9gale de cat\u00e9gories de r\u00e9ponse ou le masquage des effets d&rsquo;ancrage psychologique.<\/p>\n<p>Enfin, le diagnostic visuel pr\u00e9cis des \u00ab effets de plancher \u00bb (<em>floor effects<\/em>) et des \u00ab effets de plafond \u00bb (<em>ceiling effects<\/em>) d\u00e9pend intimement de la r\u00e9solution choisie. Dans les bilans neuropsychologiques \u00e9valuant des atteintes mn\u00e9siques ou ex\u00e9cutives, une accumulation anormale de sujets au score minimal ou maximal renseigne sur l&rsquo;insensibilit\u00e9 du test \u00e0 discriminer des alt\u00e9rations s\u00e9v\u00e8res ou des capacit\u00e9s pr\u00e9serv\u00e9es d&rsquo;\u00e9lite. Un histogramme dot\u00e9 de bacs trop larges englobera ces scores limites au sein d&rsquo;intervalles plus vastes, neutralisant la capacit\u00e9 du clinicien \u00e0 diagnostiquer l&rsquo;inad\u00e9quation instrumentale du protocole \u00e9valuatif.<\/p>\n<h2>2. Architecture technique de la fonction plt.hist() dans Matplotlib<\/h2>\n<h3>2.1 Anatomie de la m\u00e9thode plt.hist() et param\u00e8tres cl\u00e9s<\/h3>\n<p>Au c\u0153ur de l&rsquo;\u00e9cosyst\u00e8me graphique de Matplotlib r\u00e9side la fonction <code>plt.hist()<\/code>, encapsul\u00e9e au niveau le plus fondamental au sein de la classe <code>matplotlib.axes.Axes.hist()<\/code>. Cette m\u00e9thode prend en charge \u00e0 la fois le calcul math\u00e9matique de la discr\u00e9tisation et l&rsquo;instanciation des \u00e9l\u00e9ments vectoriels de bas niveau n\u00e9cessaires au rendu visuel. L&rsquo;architecture de cette commande repose sur une structure de param\u00e8tres hautement param\u00e9trables, dont le r\u00f4le et la nature doivent \u00eatre parfaitement appr\u00e9hend\u00e9s par l&rsquo;analyste.<\/p>\n<p>Le param\u00e8tre d\u00e9terminant le d\u00e9coupage de l&rsquo;axe r\u00e9el est l&rsquo;argument formel <code>bins<\/code>. Cet argument se caract\u00e9rise par une remarquable polyvalence polymorphique, acceptant trois grandes cat\u00e9gories de types de donn\u00e9es :<\/p>\n<ul>\n<li><strong>Un entier strictement positif (<span class=\"arabpsy-math-inline\" data-latex=\"k in \\mathbb{N}^*\">$k in \\mathbb{N}^*$<\/span>) :<\/strong> Sp\u00e9cifie le nombre total de bacs \u00e0 g\u00e9n\u00e9rer uniform\u00e9ment entre les valeurs extr\u00eames de l&rsquo;\u00e9chantillon ou de la plage d\u00e9finie.<\/li>\n<li><strong>Une s\u00e9quence num\u00e9rique ordonn\u00e9e (liste Python, tableau unidimensionnel <code>numpy.ndarray<\/code>) :<\/strong> D\u00e9finit de fa\u00e7on explicite la totalit\u00e9 des bornes de s\u00e9paration <span class=\"arabpsy-math-inline\" data-latex=\"[e_0, e_1, dots, e_K]\">$[e_0, e_1, dots, e_K]$<\/span>. Cette approche autorise tant les pas uniformes que les d\u00e9coupages \u00e0 largeur variable.<\/li>\n<li><strong>Une cha\u00eene de caract\u00e8res (<em>string<\/em>) :<\/strong> Active un algorithme automatis\u00e9 de s\u00e9lection de la taille des bacs pris en charge nativement par le moteur sous-jacent de NumPy (tels que <code>'auto'<\/code>, <code>'fd'<\/code>, <code>'scott'<\/code>, <code>'sturges'<\/code>, <code>'doane'<\/code>, etc.).<\/li>\n<\/ul>\n<p>L&rsquo;ex\u00e9cution de la m\u00e9thode <code>plt.hist()<\/code> ne se limite pas \u00e0 la g\u00e9n\u00e9ration d&rsquo;un trac\u00e9 statique sur le canevas ; elle proc\u00e8de au calcul analytique et retourne un triplet de structures de donn\u00e9es extr\u00eamement utile pour le contr\u00f4le programmatique ult\u00e9rieur :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{Sortie} = (n, \\text{bins}, \\text{patches})\">$$\\text{Sortie} = (n, \\text{bins}, \\text{patches})$$<\/span><\/p>\n<p>Le premier \u00e9l\u00e9ment, <span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span>, correspond \u00e0 un tableau NumPy unidimensionnel (ou une liste de tableaux dans le cas de s\u00e9ries multiples superpos\u00e9es) contenant les d\u00e9comptes scalaires ou les valeurs de densit\u00e9 calcul\u00e9es pour chaque intervalle. Le deuxi\u00e8me \u00e9l\u00e9ment, <span class=\"arabpsy-math-inline\" data-latex=\"\\text{bins}\">$\\text{bins}$<\/span>, est un tableau de dimension <span class=\"arabpsy-math-inline\" data-latex=\"K+1\">$K+1$<\/span> listant de fa\u00e7on exhaustive les coordonn\u00e9es cart\u00e9siennes de toutes les fronti\u00e8res d&rsquo;intervalles. Le troisi\u00e8me \u00e9l\u00e9ment, <span class=\"arabpsy-math-inline\" data-latex=\"\\text{patches}\">$\\text{patches}$<\/span>, est une collection ordonn\u00e9e d&rsquo;objets graphiques de type <code>matplotlib.patches.Rectangle<\/code> (ou <code>Polygon<\/code> selon le type d&rsquo;affichage). Ces conteneurs graphiques encapsulent les attributs visuels de chaque barre individuelle, incluant leur couleur de remplissage, leur transparence, leur motif de hachure et la g\u00e9om\u00e9trie exacte de leur contour.<\/p>\n<p>La morphologie des hauteurs calcul\u00e9es dans le vecteur <span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span> est intimement modul\u00e9e par trois param\u00e8tres auxiliaires cruciaux : <code>range<\/code>, <code>density<\/code> et <code>weights<\/code>. Le param\u00e8tre <code>range<\/code>, attendant un tuple de deux r\u00e9els <code>(min, max)<\/code>, contraint le calcul de la discr\u00e9tisation \u00e0 une fen\u00eatre spatiale born\u00e9e, rejetant temporairement les observations ext\u00e9rieures. Le param\u00e8tre bool\u00e9en <code>density<\/code>, lorsqu&rsquo;il est instanci\u00e9 \u00e0 <code>True<\/code>, ordonne la division math\u00e9matique des fr\u00e9quences de mani\u00e8re \u00e0 ce que la somme des surfaces des rectangles soit strictement \u00e9gale \u00e0 l&rsquo;unit\u00e9 (<span class=\"arabpsy-math-inline\" data-latex=\"\\sum_{k=1}^K n_k \\Delta_k = 1\">$\\sum_{k=1}^K n_k \\Delta_k = 1$<\/span>). Enfin, l&rsquo;argument <code>weights<\/code> permet d&rsquo;assigner \u00e0 chaque point de donn\u00e9es un coefficient scalaire d&rsquo;importance statistique, modifiant la sommation indicatrice au profit d&rsquo;une somme pond\u00e9r\u00e9e, m\u00e9canisme indispensable pour l&rsquo;analyse d&rsquo;\u00e9chantillons stratifi\u00e9s ou l&rsquo;ajustement de donn\u00e9es de sondage pond\u00e9r\u00e9es.<\/p>\n<h3>2.2 Le comportement par d\u00e9faut de Matplotlib<\/h3>\n<p>D&rsquo;un point de vue historique et architectural, le comportement par d\u00e9faut de Matplotlib a fait l&rsquo;objet d&rsquo;\u00e9volutions significatives. Pendant de nombreuses ann\u00e9es, jusqu&rsquo;aux versions de la branche 1.x, Matplotlib appliquait une heuristique universelle immuable : l&rsquo;attribution d&rsquo;un nombre fixe de dix bacs (<code>bins=10<\/code>) d&rsquo;\u00e9gale largeur, couvrant l&rsquo;amplitude totale observ\u00e9e de l&rsquo;\u00e9chantillon, d\u00e9finie par <span class=\"arabpsy-math-inline\" data-latex=\"[\\min(\\mathcal{D}), \\max(\\mathcal{D})]\">$[\\min(\\mathcal{D}), \\max(\\mathcal{D})]$<\/span>. Cette approche arbitraire, calqu\u00e9e sur des standards historiques h\u00e9rit\u00e9s d&rsquo;anciennes versions de MATLAB, pr\u00e9sentait des faiblesses statistiques \u00e9videntes, conduisant quasi syst\u00e9matiquement \u00e0 un sur-lissage catastrophique sur des cohortes massives, ou \u00e0 un sous-lissage aberrant sur des micro-\u00e9chantillons de moins de vingt observations.<\/p>\n<p>\u00c0 partir de la version 2.0 de Matplotlib, une refonte substantielle a \u00e9t\u00e9 op\u00e9r\u00e9e afin de converger vers les conventions analytiques modernes. Bien que la valeur par d\u00e9faut de l&rsquo;argument formel <code>bins<\/code> soit rest\u00e9e fix\u00e9e \u00e0 l&rsquo;entier 10 dans la signature de base pour des raisons imp\u00e9rieuses de compatibilit\u00e9 ascendante, l&rsquo;architecture a \u00e9t\u00e9 profond\u00e9ment interconnect\u00e9e avec les estimateurs dynamiques de la biblioth\u00e8que <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/\">NumPy<\/a>. Ainsi, lorsque le param\u00e8tre <code>bins<\/code> est omis dans les interfaces de haut niveau ou explicitement configur\u00e9 sur <code>'auto'<\/code>, le syst\u00e8me d\u00e9l\u00e8gue le calcul optimal de partitionnement au moteur statistique de NumPy via la m\u00e9thode interne <code>numpy.histogram_bin_edges()<\/code>.<\/p>\n<p>Un aspect fondamental de la m\u00e9canique interne concerne la gestion des valeurs minimales et maximales par rapport aux bornes ext\u00e9rieures. Par convention algorithmique dans Matplotlib, les intervalles sont ferm\u00e9s \u00e0 gauche et ouverts \u00e0 droite :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"B_k = [e_{k-1}, e_k) \\quad \\forall k in {1, 2, dots, K-1}\">$$B_k = [e_{k-1}, e_k) \\quad \\forall k in {1, 2, dots, K-1}$$<\/span><\/p>\n<p>Cependant, pour garantir l&rsquo;inclusion int\u00e9grale de la valeur maximale observ\u00e9e <span class=\"arabpsy-math-inline\" data-latex=\"x_{\\max} = \\max(\\mathcal{D})\">$x_{\\max} = \\max(\\mathcal{D})$<\/span> sans exiger la cr\u00e9ation d&rsquo;un bac infinit\u00e9simal suppl\u00e9mentaire, le tout dernier bac de la s\u00e9rie d\u00e9roge \u00e0 cette convention et adopte un intervalle ferm\u00e9 des deux c\u00f4t\u00e9s :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"B_K = [e_{K-1}, e_K]\">$$B_K = [e_{K-1}, e_K]$$<\/span><\/p>\n<p>Cette asym\u00e9trie de fermeture est essentielle \u00e0 conna\u00eetre lorsque des donn\u00e9es discr\u00e8tes ou semi-discr\u00e8tes touchent exactement les fronti\u00e8res th\u00e9oriques, sous peine de commettre des erreurs d&rsquo;interpr\u00e9tation sur la localisation exacte des observations extr\u00eames.<\/p>\n<h2>3. M\u00e9thode 1 : D\u00e9finition explicite du nombre entier de bacs<\/h2>\n<h3>3.1 Syntaxe fondamentale avec un argument entier<\/h3>\n<p>L&rsquo;approche la plus \u00e9l\u00e9mentaire pour moduler la granularit\u00e9 d&rsquo;un histogramme consiste \u00e0 fournir un entier scalaire <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span> \u00e0 l&rsquo;argument <code>bins<\/code>. La syntaxe op\u00e9rationnelle s&rsquo;\u00e9nonce simplement sous la forme <code>plt.hist(data, bins=k)<\/code>, o\u00f9 <span class=\"arabpsy-math-inline\" data-latex=\"k in \\mathbb{N}^*\">$k in \\mathbb{N}^*$<\/span>.<\/p>\n<p>D\u00e8s la r\u00e9ception de cet argument scalaire, l&rsquo;algorithme sous-jacent de Matplotlib d\u00e9termine l&rsquo;\u00e9tendue globale des donn\u00e9es par l&rsquo;\u00e9valuation des valeurs extr\u00eames observ\u00e9es, not\u00e9es <span class=\"arabpsy-math-inline\" data-latex=\"x_{\\min} = \\min(data)\">$x_{\\min} = \\min(data)$<\/span> et <span class=\"arabpsy-math-inline\" data-latex=\"x_{\\max} = \\max(data)\">$x_{\\max} = \\max(data)$<\/span> (ou born\u00e9es par le param\u00e8tre optionnel <code>range<\/code> si celui-ci est fourni). L&rsquo;espace continu d\u00e9limit\u00e9 par l&rsquo;intervalle ferm\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"[x_{\\min}, x_{\\max}]\">$[x_{\\min}, x_{\\max}]$<\/span> est alors scind\u00e9 de mani\u00e8re d\u00e9terministe en <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span> sous-intervalles de largeur parfaitement uniforme <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta\">$\\Delta$<\/span>, calcul\u00e9e selon la formule :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\Delta = \\frac{x_{\\max} - x_{\\min}}{k}\">$$\\Delta = \\frac{x_{\\max} &#8211; x_{\\min}}{k}$$<\/span><\/p>\n<p>Les coordonn\u00e9es vectorielles des <span class=\"arabpsy-math-inline\" data-latex=\"k+1\">$k+1$<\/span> limites de bacs r\u00e9sultantes sont ensuite g\u00e9n\u00e9r\u00e9es de mani\u00e8re s\u00e9quentielle par la suite arithm\u00e9tique :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"e_i = x_{\\min} + i \\cdot \\Delta \\quad \\text{pour } i in {0, 1, dots, k}\">$$e_i = x_{\\min} + i \\cdot \\Delta \\quad \\text{pour } i in {0, 1, dots, k}$$<\/span><\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/bin1.png\" alt=\"matplotlib histogram with specific number of bins\" \/><figcaption>matplotlib histogram with specific number of bins<\/figcaption><\/figure>\n<p>Pour illustrer ce m\u00e9canisme avec un cas concret, consid\u00e9rons une s\u00e9rie exp\u00e9rimentale restreinte d&rsquo;\u00e9valuation cognitive comprenant dix observations : <span class=\"arabpsy-math-inline\" data-latex=\"{12, 14, 15, 18, 19, 21, 22, 25, 28, 32}\">${12, 14, 15, 18, 19, 21, 22, 25, 28, 32}$<\/span>. L&rsquo;amplitude totale observ\u00e9e est ici de <span class=\"arabpsy-math-inline\" data-latex=\"32 - 12 = 20\">$32 &#8211; 12 = 20$<\/span>. Si l&rsquo;analyste sp\u00e9cifie d\u00e9lib\u00e9r\u00e9ment <code>bins=4<\/code>, la largeur de chaque sous-intervalle sera de <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta = 20 \/ 4 = 5.0\">$\\Delta = 20 \/ 4 = 5.0$<\/span>. Les limites de bacs g\u00e9n\u00e9r\u00e9es seront ainsi positionn\u00e9es aux valeurs <span class=\"arabpsy-math-inline\" data-latex=\"[12.0, 17.0, 22.0, 27.0, 32.0]\">$[12.0, 17.0, 22.0, 27.0, 32.0]$<\/span>. Les observations sont alors r\u00e9parties m\u00e9caniquement dans ces quatre compartiments : trois points dans <span class=\"arabpsy-math-inline\" data-latex=\"[12, 17)\">$[12, 17)$<\/span>, quatre points dans <span class=\"arabpsy-math-inline\" data-latex=\"[17, 22)\">$[17, 22)$<\/span>, deux points dans <span class=\"arabpsy-math-inline\" data-latex=\"[22, 27)\">$[22, 27)$<\/span>, et un point dans <span class=\"arabpsy-math-inline\" data-latex=\"[27, 32]\">$[27, 32]$<\/span>.<\/p>\n<p>L&rsquo;incr\u00e9mentation successive de la valeur enti\u00e8re <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span> produit un raffinement visuel progressif de la morphologie de la distribution. En augmentant <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span>, on passe progressivement d&rsquo;une vision synth\u00e9tique et globale \u00e0 une repr\u00e9sentation d\u00e9taill\u00e9e des micro-variations de l&rsquo;\u00e9chantillon. Toutefois, cette augmentation m\u00e9canique doit \u00eatre manipul\u00e9e avec pr\u00e9caution pour \u00e9viter d&rsquo;atteindre le seuil critique de sous-lissage mentionn\u00e9 pr\u00e9c\u00e9demment.<\/p>\n<h3>3.2 D\u00e9limitation du contour avec l&rsquo;argument edgecolor<\/h3>\n<p>Un \u00e9cueil ergonomique et perceptif r\u00e9current lors de l&rsquo;utilisation de Matplotlib d\u00e9coule de la politique d&rsquo;affichage graphique par d\u00e9faut des barres de l&rsquo;histogramme. Par d\u00e9faut, les rectangles contigus sont dessin\u00e9s avec une couleur de fond monochrome (le traditionnel bleu acier <em>tab:blue<\/em>) sans aucune ligne de s\u00e9paration p\u00e9riph\u00e9rique, ou avec une bordure de couleur identique au corps du polygone. D\u00e8s lors que deux bacs cons\u00e9cutifs poss\u00e8dent des hauteurs similaires ou que l&rsquo;histogramme pr\u00e9sente une s\u00e9quence continue de barres de m\u00eame niveau, la discrimination visuelle des fronti\u00e8res de classe devient impossible pour l&rsquo;\u0153il humain.<\/p>\n<p>Pour restaurer l&rsquo;int\u00e9grit\u00e9 s\u00e9miologique de la repr\u00e9sentation, il est fortement recommand\u00e9 d&rsquo;utiliser syst\u00e9matiquement l&rsquo;argument formel <code>edgecolor<\/code> (pouvant \u00eatre abr\u00e9g\u00e9 en <code>ec<\/code>), combin\u00e9 de mani\u00e8re optimale avec l&rsquo;\u00e9paisseur de ligne <code>linewidth<\/code> (ou <code>lw<\/code>). L&rsquo;inclusion explicite de <code>edgecolor='black'<\/code> (ou d&rsquo;une nuance de gris sombre comme <code>edgecolor='#333333'<\/code>) permet de tracer une d\u00e9marcation nette et contrast\u00e9e entre chaque intervalle :<\/p>\n<pre style=\"display:none\">\n# Exemple conceptuel d'application de la bordure\nplt.hist(data, bins=25, color='skyblue', edgecolor='black', linewidth=1.2)\n<\/pre>\n<p>Cette d\u00e9limitation typographique procure des avantages analytiques imm\u00e9diats. Premi\u00e8rement, elle permet d&rsquo;identifier sans ambigu\u00eft\u00e9 l&rsquo;existence de bacs d&rsquo;effectif nul (<span class=\"arabpsy-math-inline\" data-latex=\"n_k = 0\">$n_k = 0$<\/span>). Dans une distribution continue sans bordures visibles, un bac vide se traduit par un espace vierge sur l&rsquo;axe horizontal que le syst\u00e8me perceptif humain tend naturellement \u00e0 interpr\u00e9ter comme un saut d&rsquo;\u00e9chelle ou un artefact d&rsquo;alignement plut\u00f4t que comme une classe de fr\u00e9quence z\u00e9ro. Deuxi\u00e8mement, la d\u00e9limitation graphique souligne la r\u00e9gularit\u00e9 ou l&rsquo;irr\u00e9gularit\u00e9 du maillage, facilitant la comparaison de la densit\u00e9 relative entre classes adjacentes.<\/p>\n<h3>3.3 Limites et approximations de l&rsquo;attribution d&rsquo;un entier fixe<\/h3>\n<p>Bien que l&rsquo;assignation d&rsquo;un entier fixe <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span> constitue une d\u00e9marche rapide et intuitive pour l&rsquo;exploration superficielle, elle souffre de limitations math\u00e9matiques et pratiques majeures d\u00e8s lors que la rigueur de publication est exig\u00e9e. La premi\u00e8re faiblesse structurelle r\u00e9side dans le fait que l&rsquo;algorithme sous-jacent ignore superbement la s\u00e9mantique de l&rsquo;unit\u00e9 de mesure. En divisant aveugl\u00e9ment l&rsquo;amplitude <span class=\"arabpsy-math-inline\" data-latex=\"x_{\\max} - x_{\\min}\">$x_{\\max} &#8211; x_{\\min}$<\/span> par <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span>, les limites r\u00e9sultantes <span class=\"arabpsy-math-inline\" data-latex=\"e_i\">$e_i$<\/span> correspondent presque toujours \u00e0 des nombres d\u00e9cimaux irrationnels ou dot\u00e9s de longues tra\u00eenes flottantes. Par exemple, diviser une amplitude d&rsquo;\u00e2ge de 18 \u00e0 65 ans par 7 bacs g\u00e9n\u00e8re des classes d&rsquo;une largeur de <span class=\"arabpsy-math-inline\" data-latex=\"6.71428...\">$6.71428&#8230;$<\/span> ann\u00e9es, positionnant les fronti\u00e8res \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"24.71, 31.42, 38.14...\">$24.71, 31.42, 38.14&#8230;$<\/span> ans, ce qui s&rsquo;av\u00e8re totalement inexploitable sur le plan interpr\u00e9tatif.<\/p>\n<p>Ce ph\u00e9nom\u00e8ne s&rsquo;av\u00e8re particuli\u00e8rement pr\u00e9judiciable lors de l&rsquo;analyse de variables discr\u00e8tes prenant des valeurs enti\u00e8res strictes, comme le nombre d&rsquo;erreurs commises \u00e0 une t\u00e2che, le nombre d&rsquo;enfants par foyer, ou le score obtenu \u00e0 une \u00e9preuve cognitive br\u00e8ve. Lorsque des unit\u00e9s ins\u00e9cables sont d\u00e9coup\u00e9es par des largeurs de bacs d\u00e9cimales arbitraires, certains bacs finissent par englober deux valeurs enti\u00e8res possibles (par exemple, les scores 3 et 4) tandis que d&rsquo;autres bacs adjacents n&rsquo;en englobent qu&rsquo;une seule (par exemple, le score 5). Il en r\u00e9sulte une distorsion dramatique sous forme d&rsquo;un profil en \u00ab peigne \u00bb ou d&rsquo;art\u00e9facts en dents de scie o\u00f9 l&rsquo;alternance des hauteurs de barres ne traduit pas une propri\u00e9t\u00e9 de la distribution sous-jacente, mais simplement une incoh\u00e9rence arithm\u00e9tique de la discr\u00e9tisation.<\/p>\n<p>Enfin, l&rsquo;attribution d&rsquo;un entier fixe est excessivement sensible \u00e0 la pr\u00e9sence de valeurs aberrantes (<em>outliers<\/em>). Si un \u00e9chantillon contient une unique valeur extr\u00eame situ\u00e9e \u00e0 plusieurs \u00e9carts-types de la masse centrale, l&rsquo;amplitude <span class=\"arabpsy-math-inline\" data-latex=\"x_{\\max} - x_{\\min}\">$x_{\\max} &#8211; x_{\\min}$<\/span> est d\u00e9mesur\u00e9ment \u00e9tir\u00e9e. Avec un <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span> constant, cet \u00e9tirement force l&rsquo;\u00e9largissement de tous les bacs, provoquant un sur-lissage involontaire et d\u00e9vastateur de la zone centrale d&rsquo;int\u00e9r\u00eat o\u00f9 se concentre la quasi-totalit\u00e9 des effectifs.<\/p>\n<h2>4. M\u00e9thode 2 : D\u00e9finition explicite des bornes d&rsquo;intervalles par liste ou s\u00e9quence<\/h2>\n<h3>4.1 Syntaxe par vecteur de coordonn\u00e9es limites<\/h3>\n<p>Pour pallier int\u00e9gralement les approximations de l&rsquo;entier fixe et reprendre le contr\u00f4le rigoureux du maillage, l&rsquo;architecture de Matplotlib autorise la transmission directe d&rsquo;une s\u00e9quence num\u00e9rique ordonn\u00e9e \u00e0 l&rsquo;argument <code>bins<\/code>. La syntaxe fondamentale prend alors la forme d&rsquo;un conteneur vectoriel :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{bins} = [e_0, e_1, e_2, dots, e_n]\">$$\\text{bins} = [e_0, e_1, e_2, dots, e_n]$$<\/span><\/p>\n<p>Dans ce paradigme de param\u00e9trage, l&rsquo;utilisateur sp\u00e9cifie non pas le nombre total de bacs, mais l&rsquo;ensemble complet et exhaustif de leurs coordonn\u00e9es limites. D\u00e8s lors, si la s\u00e9quence transmise comprend <span class=\"arabpsy-math-inline\" data-latex=\"n+1\">$n+1$<\/span> \u00e9l\u00e9ments scalaires ordonn\u00e9s, Matplotlib construira exactement <span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span> rectangles graphiques sur l&rsquo;axe des abscisses. La condition fondamentale d&rsquo;int\u00e9grit\u00e9 exige que le vecteur soit strictement monotone croissant :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"e_0 &lt; e_1 &lt; e_2 &lt; dots &lt; e_n\">$$e_0 &lt; e_1 &lt; e_2 &lt; dots &lt; e_n$$<\/span><\/p>\n<p>L&rsquo;introduction d&rsquo;un vecteur non tri\u00e9 provoquera invariablement la lev\u00e9e d&rsquo;une exception de type <code>ValueError<\/code> par le moteur de validation de Matplotlib.<\/p>\n<p>Cette approche manuelle permet d&rsquo;adapter parfaitement les coupures de l&rsquo;histogramme \u00e0 des seuils cliniques normalis\u00e9s, \u00e0 des d\u00e9coupages r\u00e9glementaires ou \u00e0 des constantes th\u00e9oriques reconnues. Par exemple, lors de l&rsquo;\u00e9tude de l&rsquo;Indice de Masse Corporelle (IMC), les fronti\u00e8res de classification de l&rsquo;Organisation Mondiale de la Sant\u00e9 ne reposent pas sur des divisions \u00e9quidistantes abstraites, mais sur des coupures cat\u00e9gorielles fonctionnelles : sous-poids (<span class=\"arabpsy-math-inline\" data-latex=\"&lt; 18.5\">$&lt; 18.5$<\/span>), corpulence normale (<span class=\"arabpsy-math-inline\" data-latex=\"[18.5, 25)\">$[18.5, 25)$<\/span>), surpoids (<span class=\"arabpsy-math-inline\" data-latex=\"[25, 30)\">$[25, 30)$<\/span>), ob\u00e9sit\u00e9 mod\u00e9r\u00e9e (<span class=\"arabpsy-math-inline\" data-latex=\"[30, 35)\">$[30, 35)$<\/span>) et ob\u00e9sit\u00e9 s\u00e9v\u00e8re (<span class=\"arabpsy-math-inline\" data-latex=\"[35, 40]\">$[35, 40]$<\/span>). En transmettant la liste explicite <code>bins=[15, 18.5, 25, 30, 35, 40]<\/code>, l&rsquo;analyste fait correspondre chaque barre de l&rsquo;histogramme \u00e0 une entit\u00e9 nosologique directement interpr\u00e9table.<\/p>\n<p>La convention de fermeture des intervalles est pilot\u00e9e par le param\u00e8tre optionnel <code>right<\/code> de la fonction <code>plt.hist()<\/code>, qui prend par d\u00e9faut la valeur <code>False<\/code> (c&rsquo;est-\u00e0-dire des intervalles de type semi-ouvert <span class=\"arabpsy-math-inline\" data-latex=\"[e_{k-1}, e_k)\">$[e_{k-1}, e_k)$<\/span> avec inclusion de la limite inf\u00e9rieure). En configurant <code>right=True<\/code>, l&rsquo;utilisateur inverse cette logique math\u00e9matique pour adopter des intervalles ferm\u00e9s \u00e0 droite et ouverts \u00e0 gauche :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"B_k = (e_{k-1}, e_k] \\quad \\text{pour } k in {2, dots, n}\">$$B_k = (e_{k-1}, e_k] \\quad \\text{pour } k in {2, dots, n}$$<\/span><\/p>\n<p>le premier bac de la s\u00e9quence devenant alors exceptionnellement ferm\u00e9 des deux c\u00f4t\u00e9s (<span class=\"arabpsy-math-inline\" data-latex=\"B_1 = [e_0, e_1]\">$B_1 = [e_0, e_1]$<\/span>) afin d&rsquo;inclure rigoureusement la valeur minimale.<\/p>\n<h3>4.2 Cr\u00e9ation de bacs uniformes \u00e0 l&rsquo;aide de structures Python natives<\/h3>\n<p>Lorsque l&rsquo;objectif est d&rsquo;obtenir des bacs de largeur parfaitement constante align\u00e9s sur des valeurs enti\u00e8res significatives sans recourir \u00e0 des biblioth\u00e8ques externes, les structures g\u00e9n\u00e9ratrices natives du langage Python, en particulier la fonction <code>range()<\/code>, offrent une solution \u00e9l\u00e9gante et l\u00e9g\u00e8re.<\/p>\n<p>La fonction native <code>range(start, stop, step)<\/code> produit une s\u00e9quence immuable d&rsquo;entiers r\u00e9guliers. Dans le contexte de l&rsquo;alimentation du param\u00e8tre <code>bins<\/code> de Matplotlib, cette structure pr\u00e9sente l&rsquo;avantage d&rsquo;\u00e9liminer toute impr\u00e9cision li\u00e9e \u00e0 l&rsquo;arithm\u00e9tique flottante pour les variables discr\u00e8tes. Consid\u00e9rons le cas d&rsquo;une \u00e9preuve chronom\u00e9tr\u00e9e standardis\u00e9e o\u00f9 les scores bruts sont distribu\u00e9s entre 0 et 100 points, et pour laquelle le protocole scientifique impose une granularit\u00e9 par tranches de 10 points. Le vecteur de bornes est imm\u00e9diatement g\u00e9n\u00e9r\u00e9 et transmis de la mani\u00e8re suivante :<\/p>\n<pre style=\"display:none\">\nbornes = list(range(0, 101, 10))\n# G\u00e9n\u00e8re [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]\nplt.hist(scores, bins=bornes, edgecolor='black')\n<\/pre>\n<p>Une vigilance technique absolue s&rsquo;impose quant \u00e0 la borne de fermeture de la fonction <code>range()<\/code>. Par d\u00e9finition intrins\u00e8que \u00e0 la conception de Python, l&rsquo;argument <code>stop<\/code> est exclusif. Par cons\u00e9quent, pour cr\u00e9er un histogramme couvrant une variable susceptible d&rsquo;atteindre la valeur 100 avec un pas de 10, l&rsquo;argument d&rsquo;arr\u00eat doit \u00eatre param\u00e9tr\u00e9 \u00e0 101 (ou toute valeur strictement comprise entre 100 et 110). Si l&rsquo;on programmait par inadvertance <code>range(0, 100, 10)<\/code>, le dernier \u00e9l\u00e9ment du vecteur de bornes serait 90. Toutes les observations empiriques comprises entre 90 et 100 seraient alors irr\u00e9m\u00e9diablement tronqu\u00e9es et rejet\u00e9es hors de la visualisation.<\/p>\n<p>L&rsquo;utilisation conjointe de <code>min()<\/code> et <code>max()<\/code> coupl\u00e9s aux fonctions math\u00e9matiques d&rsquo;arrondi <code>math.floor()<\/code> et <code>math.ceil()<\/code> permet de concevoir des g\u00e9n\u00e9rateurs de bornes automatiques garantissant la couverture int\u00e9grale du spectre empirique :<\/p>\n<pre style=\"display:none\">\nimport math\nlimite_basse = math.floor(min(data))\nlimite_haute = math.ceil(max(data)) + 1\nbins_personnalises = list(range(limite_basse, limite_haute, 5))\n<\/pre>\n<h3>4.3 Isolation et exclusion cibl\u00e9e de plages de donn\u00e9es<\/h3>\n<p>L&rsquo;un des comportements les plus puissants \u2014 mais \u00e9galement les plus risqu\u00e9s \u2014 de la sp\u00e9cification de bornes explicites r\u00e9side dans la gestion implicite des donn\u00e9es situ\u00e9es hors-cadre. Contrairement \u00e0 d&rsquo;autres outils statistiques qui \u00e9tendent automatiquement les limites pour englober toutes les donn\u00e9es fournies, Matplotlib applique un principe de filtrage g\u00e9om\u00e9trique strict lorsque des bornes explicites sont fournies.<\/p>\n<p>Soit un vecteur de bornes <span class=\"arabpsy-math-inline\" data-latex=\"\\text{bins} = [e_0, e_1, dots, e_n]\">$\\text{bins} = [e_0, e_1, dots, e_n]$<\/span>. Toute observation empirique <span class=\"arabpsy-math-inline\" data-latex=\"x_i\">$x_i$<\/span> appartenant au jeu de donn\u00e9es <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{D}\">$\\mathcal{D}$<\/span> telle que :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"x_i  e_n\">$$x_i  e_n$$<\/span><\/p>\n<p>est purement et simplement exclue du calcul des fr\u00e9quences et de la repr\u00e9sentation graphique. L&rsquo;observation ne fait l&rsquo;objet d&rsquo;aucun message d&rsquo;erreur, ni d&rsquo;aucun avertissement (<em>warning<\/em>) dans la console d&rsquo;ex\u00e9cution : elle dispara\u00eet silencieusement de la visualisation.<\/p>\n<p>Cette propri\u00e9t\u00e9 offre un outil particuli\u00e8rement commode pour isoler d\u00e9lib\u00e9r\u00e9ment le \u00ab c\u0153ur \u00bb d&rsquo;une distribution sans devoir pr\u00e9alablement cr\u00e9er une copie tronqu\u00e9e du tableau de donn\u00e9es en m\u00e9moire vive. Par exemple, si une distribution de latences comportementales s&rsquo;\u00e9tend de 150 ms \u00e0 plusieurs dizaines de secondes en raison d&rsquo;inattentions passag\u00e8res de quelques sujets, restreindre l&rsquo;observation \u00e0 la fen\u00eatre physiologique d&rsquo;int\u00e9r\u00eat clinique en fixant <code>bins=np.arange(150, 1050, 50)<\/code> permet de zoomer instantan\u00e9ment sur l&rsquo;intervalle <span class=\"arabpsy-math-inline\" data-latex=\"[150, 1000]\">$[150, 1000]$<\/span> ms, les valeurs au-del\u00e0 de 1000 ms \u00e9tant automatiquement neutralis\u00e9es.<\/p>\n<p>Toutefois, cette commodit\u00e9 technique engage la responsabilit\u00e9 m\u00e9thodologique du chercheur. Omettre de d\u00e9clarer dans une publication que des valeurs extr\u00eames ont \u00e9t\u00e9 tronqu\u00e9es visuellement constitue une faute d&rsquo;int\u00e9grit\u00e9 scientifique majeure. De surcro\u00eet, si le param\u00e8tre <code>density=True<\/code> est activ\u00e9 conjointement avec un vecteur de bornes restreint, la normalisation de la densit\u00e9 s&rsquo;effectuera uniquement sur le sous-ensemble des donn\u00e9es incluses entre <span class=\"arabpsy-math-inline\" data-latex=\"e_0\">$e_0$<\/span> et <span class=\"arabpsy-math-inline\" data-latex=\"e_n\">$e_n$<\/span>. L&rsquo;int\u00e9grale de la zone visible sera bien \u00e9gale \u00e0 1, mais elle ne repr\u00e9sentera plus la v\u00e9ritable densit\u00e9 de probabilit\u00e9 de l&rsquo;ensemble de l&rsquo;\u00e9chantillon initial, surestimant m\u00e9caniquement la probabilit\u00e9 relative de la r\u00e9gion centrale.<\/p>\n<h2>5. M\u00e9thode 3 : Contr\u00f4le pr\u00e9cis de la largeur exacte des bacs avec NumPy<\/h2>\n<h3>5.1 Formulation math\u00e9matique via np.arange()<\/h3>\n<p>Dans la pratique scientifique rigoureuse, l&rsquo;exigence m\u00e9thodologique ne s&rsquo;exprime que tr\u00e8s rarement en termes de \u00ab nombre total de rectangles \u00bb \u00e0 r\u00e9partir sur le canevas. Elle s&rsquo;\u00e9nonce presque syst\u00e9matiquement en termes de \u00ab largeur de classe constante \u00bb poss\u00e9dant une signification physique, biologique ou psychologique imm\u00e9diate : par exemple, des tranches exactes de 100 millisecondes, des paliers de 5 points de QI, ou des segments d&rsquo;\u00e2ge de 5 ann\u00e9es pleines. La formulation math\u00e9matique id\u00e9ale requiert donc de piloter directement la grandeur scalaire <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta\">$\\Delta$<\/span>.<\/p>\n<p>L&rsquo;instrument privil\u00e9gi\u00e9 pour impl\u00e9menter ce contr\u00f4le direct sous l&rsquo;environnement scientifique Python est la fonction <code>numpy.arange()<\/code>. La syntaxe g\u00e9n\u00e9rale pour g\u00e9n\u00e9rer la grille de discr\u00e9tisation s&rsquo;\u00e9nonce comme suit :<\/p>\n<pre style=\"display:none\">\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nlargeur_bac = 5.0\nbornes = np.arange(val_min, val_max + largeur_bac, largeur_bac)\nplt.hist(donnees, bins=bornes, edgecolor='black')\n<\/pre>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/bin2.png\" alt=\"\" \/><\/figure>\n<p>L&rsquo;attention du programmeur doit se concentrer imp\u00e9rativement sur le second argument de la fonction : <code>val_max + largeur_bac<\/code>. Tout comme la fonction native <code>range()<\/code>, <code>np.arange()<\/code> applique une exclusion stricte de son argument d&rsquo;arr\u00eat (<em>stop<\/em>). Par cons\u00e9quent, si l&rsquo;on sp\u00e9cifie simplement <code>np.arange(val_min, val_max, largeur_bac)<\/code>, et que l&rsquo;\u00e9tendue <span class=\"arabpsy-math-inline\" data-latex=\"val_{\\max} - val_{\\min}\">$val_{\\max} &#8211; val_{\\min}$<\/span> s&rsquo;av\u00e8re \u00eatre un multiple exact de la largeur <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta\">$\\Delta$<\/span>, la coordonn\u00e9e <span class=\"arabpsy-math-inline\" data-latex=\"val_{\\max}\">$val_{\\max}$<\/span> ne figurera pas dans le tableau r\u00e9sultant. Le dernier sous-intervalle calcul\u00e9 s&rsquo;arr\u00eatera \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"val_{\\max} - \\Delta\">$val_{\\max} &#8211; \\Delta$<\/span>. Il s&rsquo;ensuit que l&rsquo;observation maximale pr\u00e9sente dans l&rsquo;\u00e9chantillon sera \u00e9vinc\u00e9e de l&rsquo;histogramme en raison du m\u00e9canisme d&rsquo;exclusion d\u00e9crit au paragraphe pr\u00e9c\u00e9dent.<\/p>\n<p>L&rsquo;ajout explicite du terme <span class=\"arabpsy-math-inline\" data-latex=\"+\\Delta\">$+\\Delta$<\/span> (ou d&rsquo;une marge fractionnaire <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta + \\epsilon\">$\\Delta + \\epsilon$<\/span>) au point d&rsquo;arr\u00eat garantit que la borne sup\u00e9rieure finale soit rigoureusement sup\u00e9rieure ou \u00e9gale \u00e0 la valeur maximale observ\u00e9e. Cette construction conf\u00e8re une reproductibilit\u00e9 absolue aux analyses comparatives : en fixant <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta\">$\\Delta$<\/span> \u00e0 une constante invariante pour diff\u00e9rentes cohortes ou diff\u00e9rentes conditions exp\u00e9rimentales, l&rsquo;analyste \u00e9limine tout biais d&rsquo;\u00e9chelle li\u00e9 aux fluctuations de taille d&rsquo;\u00e9chantillon.<\/p>\n<h3>5.2 Alternative avec np.linspace() pour des subdivisions r\u00e9guli\u00e8res<\/h3>\n<p>Bien que <code>np.arange()<\/code> constitue la m\u00e9thode la plus naturelle pour fixer la largeur <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta\">$\\Delta$<\/span>, la fonction <code>numpy.linspace()<\/code> repr\u00e9sente une alternative analytique puissante fond\u00e9e sur une logique compl\u00e9mentaire : le contr\u00f4le rigoureux du nombre total de points d&rsquo;\u00e9valuation sur un segment continu pr\u00e9d\u00e9fini <span class=\"arabpsy-math-inline\" data-latex=\"[a, b]\">$[a, b]$<\/span>.<\/p>\n<p>La signature de cette fonction, <code>numpy.linspace(start, stop, num)<\/code>, prend en charge la g\u00e9n\u00e9ration d&rsquo;un tableau unidimensionnel de <span class=\"arabpsy-math-inline\" data-latex=\"num\">$num$<\/span> valeurs \u00e9quidistantes d\u00e9butant exactement \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"start\">$start$<\/span> et se terminant exactement \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"stop\">$stop$<\/span> (l&rsquo;argument optionnel <code>endpoint=True<\/code> \u00e9tant actif par d\u00e9faut). La distinction conceptuelle majeure par rapport \u00e0 <code>np.arange()<\/code> r\u00e9side dans le statut des param\u00e8tres :<\/p>\n<ul>\n<li>Avec <code>np.arange()<\/code>, la largeur <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta\">$\\Delta$<\/span> est fix\u00e9e de mani\u00e8re rigide, tandis que le nombre final de bacs est une variable d\u00e9pendante de l&rsquo;amplitude globale.<\/li>\n<li>Avec <code>np.linspace()<\/code>, le nombre d&rsquo;intervalles <span class=\"arabpsy-math-inline\" data-latex=\"K = num - 1\">$K = num &#8211; 1$<\/span> et les bornes extr\u00eames absolues sont rigidement verrouill\u00e9s, tandis que la largeur effective de chaque bac est calcul\u00e9e automatiquement par division : <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta = \\frac{stop - start}{num - 1}\">$\\Delta = \\frac{stop &#8211; start}{num &#8211; 1}$<\/span>.<\/li>\n<\/ul>\n<p>Un avantage technique d\u00e9cisif de <code>np.linspace()<\/code> r\u00e9side dans sa totale immunit\u00e9 contre les anomalies arithm\u00e9tiques de la virgule flottante qui affectent parfois <code>np.arange()<\/code>. Dans la norme IEEE 754 r\u00e9gissant les calculs flottants sur microprocesseur, l&rsquo;accumulation r\u00e9cursive d&rsquo;un pas d\u00e9cimal comme $0.1$ ou $0.01$ engendre de l\u00e9g\u00e8res impr\u00e9cisions d&rsquo;arrondi binaire. Ces micro-r\u00e9sidus peuvent amener <code>np.arange()<\/code> \u00e0 inclure ou exclure de fa\u00e7on impr\u00e9visible le dernier \u00e9l\u00e9ment d&rsquo;un vecteur selon que l&rsquo;arrondi exc\u00e8de ou non la borne de coupure. La fonction <code>np.linspace()<\/code>, en calculant chaque coordonn\u00e9e par interpolation lin\u00e9aire directe :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"e_i = a + i \\cdot \\left(\\frac{b - a}{num - 1}\\right)\">$$e_i = a + i \\cdot \\left(\\frac{b &#8211; a}{num &#8211; 1}\\right)$$<\/span><\/p>\n<p>\u00e9chappe \u00e0 cette d\u00e9rive cumulative et garantit un positionnement rigoureux des fronti\u00e8res extr\u00eames.<\/p>\n<h3>5.3 Gestion des pas d\u00e9cimaux et des micro-intervalles<\/h3>\n<p>L&rsquo;exploration de donn\u00e9es physiologiques, \u00e9lectrophysiologiques ou neuro-imageriques (telles que les latences de potentiels \u00e9voqu\u00e9s visuels ou les dur\u00e9es d&rsquo;ondes c\u00e9r\u00e9brales sur trac\u00e9 EEG) requiert fr\u00e9quemment l&rsquo;analyse de signaux variant sur des micro-intervalles temporels, imposant des largeurs de bacs fractionnaires d&rsquo;ordre d\u00e9cimal ou millim\u00e9trique (par exemple, <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta = 0.05\">$\\Delta = 0.05$<\/span> s ou <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta = 0.001\">$\\Delta = 0.001$<\/span> s).<\/p>\n<p>Dans ce contexte \u00e0 haute r\u00e9solution, plusieurs pr\u00e9cautions m\u00e9thodologiques doivent \u00eatre scrupuleusement respect\u00e9es :<\/p>\n<p>D&rsquo;une part, la d\u00e9rive arithm\u00e9tique binaire doit \u00eatre activement neutralis\u00e9e. Pour concevoir une s\u00e9rie de bacs d\u00e9cimaux sans fluctuation marginale impr\u00e9vue, il est souvent pr\u00e9f\u00e9rable de construire la s\u00e9quence sur une \u00e9chelle d&rsquo;entiers redimensionn\u00e9e, puis de diviser l&rsquo;ensemble du vecteur par le facteur d&rsquo;\u00e9chelle correspondant. Par exemple, pour obtenir des bacs de $0.05$ s s&rsquo;\u00e9tendant de $0.0$ s \u00e0 $2.0$ s, l&rsquo;\u00e9criture vectorielle :<\/p>\n<pre style=\"display:none\">\nbornes = np.arange(0, 205, 5) \/ 100.0\n<\/pre>\n<p>fournit une pr\u00e9cision num\u00e9rique rigoureuse exempte de tout art\u00e9fact r\u00e9siduel.<\/p>\n<p>D&rsquo;autre part, lorsque la densit\u00e9 de rectangles devient excessivement dense sur le graphique (plusieurs centaines de bacs sur une largeur d&rsquo;axe restreinte), le rendu visuel peut \u00eatre totalement oblit\u00e9r\u00e9 par l&rsquo;\u00e9paisseur des bordures. Si l&rsquo;argument <code>edgecolor='black'<\/code> est conserv\u00e9 avec sa largeur de ligne par d\u00e9faut (g\u00e9n\u00e9ralement 1 pixel), la surface globale de l&rsquo;histogramme appara\u00eetra comme une masse sombre informe o\u00f9 les lignes de contour finissent par recouvrir enti\u00e8rement les couleurs de remplissage. Dans ces configurations de micro-intervalles, il devient imp\u00e9ratif soit de d\u00e9sactiver la bordure (<code>edgecolor='none'<\/code>), soit de r\u00e9duire son \u00e9paisseur \u00e0 des valeurs sub-pixel (<code>linewidth=0.3<\/code>), soit de basculer vers un mode de trac\u00e9 filaire continu \u00e0 l&rsquo;aide de l&rsquo;argument <code>histtype='step'<\/code> ou <code>histtype='stepfilled'<\/code>.<\/p>\n<h2>6. S\u00e9lection algorithmique automatis\u00e9e de la taille des bacs<\/h2>\n<h3>6.1 La r\u00e8gle de Sturges et ses limites<\/h3>\n<p>L&rsquo;automatisation du calcul du nombre de bacs constitue un champ d&rsquo;investigation statistique ancien. La m\u00e9thode la plus universellement r\u00e9pandue \u2014 et paradoxalement la plus critiqu\u00e9e de la litt\u00e9rature contemporaine \u2014 est la c\u00e9l\u00e8bre r\u00e8gle formul\u00e9e par <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1080\/01621459.1926.10502161\">Herbert Sturges en 1926<\/a>. Con\u00e7ue \u00e0 une \u00e9poque o\u00f9 le calcul manuel imposait des contraintes s\u00e9v\u00e8res, la formulation de Sturges repose sur la mod\u00e9lisation d&rsquo;une distribution sym\u00e9trique par le d\u00e9veloppement des coefficients binomiaux issus du triangle de Pascal. Pour un \u00e9chantillon de taille <span class=\"arabpsy-math-inline\" data-latex=\"N\">$N$<\/span>, le nombre id\u00e9al de bacs <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span> est donn\u00e9 par l&rsquo;\u00e9quation :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"k = \\lceil 1 + \\log_2(N) \\rceil = \\lceil 1 + 3.322 \\cdot \\log_{10}(N) \\rceil\">$$k = \\lceil 1 + \\log_2(N) \\rceil = \\lceil 1 + 3.322 \\cdot \\log_{10}(N) \\rceil$$<\/span><\/p>\n<p>La r\u00e8gle de Sturges s&rsquo;active dans Matplotlib via l&rsquo;argument <code>bins='sturges'<\/code>.<\/p>\n<p>Bien que cette \u00e9quation fournisse une approximation commode pour des cohortes de taille tr\u00e8s modeste (<span class=\"arabpsy-math-inline\" data-latex=\"N &lt; 200\">$N &lt; 200$<\/span>) issues de populations distribu\u00e9es de fa\u00e7on strictement gaussienne, elle pr\u00e9sente des d\u00e9faillances structurelles majeures d\u00e8s que ces conditions id\u00e9ales ne sont plus satisfaites. Son premier d\u00e9faut r\u00e9dhibitoire concerne sa convergence logarithmique extr\u00eamement lente face aux grands \u00e9chantillons. Par exemple, pour une base de donn\u00e9es moderne de <span class=\"arabpsy-math-inline\" data-latex=\"N = 10,000\">$N = 10,000$<\/span> observations, la r\u00e8gle de Sturges ne propose que 15 bacs ; pour <span class=\"arabpsy-math-inline\" data-latex=\"N = 1,000,000\">$N = 1,000,000$<\/span> d&#039;observations, elle ne prescrit que 21 bacs. Cette stagnation du d\u00e9coupage engendre un ph\u00e9nom\u00e8ne massif et syst\u00e9matique de sur-lissage, an\u00e9antissant l&#039;immense gain de pr\u00e9cision et de r\u00e9solution que permettrait normalement un grand \u00e9chantillon.<\/p>\n<p>Le second \u00e9cueil r\u00e9side dans son inaptitude totale \u00e0 appr\u00e9hender les distributions asym\u00e9triques ou plurimodales. La d\u00e9rivation math\u00e9matique de Sturges supposant implicitement une forme binomiale parfaitement sym\u00e9trique, son application \u00e0 des distributions dot\u00e9es d&rsquo;une asym\u00e9trie marqu\u00e9e (telles que des lois log-normales ou des lois de Pareto) conduit \u00e0 une sous-estimation dramatique du nombre de bacs requis pour r\u00e9soudre correctement la r\u00e9gion du mode.<\/p>\n<h3>6.2 La r\u00e8gle de Scott : Prise en compte de la variance de l&rsquo;\u00e9chantillon<\/h3>\n<p>Afin de pallier les insuffisances th\u00e9oriques de la formule de Sturges, le statisticien David Scott a propos\u00e9 en 1979 une d\u00e9rivation asymptotique rigoureuse fond\u00e9e sur la minimisation formelle de l&rsquo;erreur quadratique int\u00e9gr\u00e9e moyenne (MISE). En postulant que la distribution sous-jacente continue <span class=\"arabpsy-math-inline\" data-latex=\"f(x)\">$f(x)$<\/span> est une densit\u00e9 normale th\u00e9orique de variance <span class=\"arabpsy-math-inline\" data-latex=\"\\sigma^2\">$\\sigma^2$<\/span>, Scott d\u00e9montre math\u00e9matiquement que la largeur optimale de bac <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta^*\">$\\Delta^*$<\/span> ob\u00e9it \u00e0 la relation de proportionnalit\u00e9 :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\Delta^* = \\frac{3.49 \\cdot s}{N^{1\/3}}\">$$\\Delta^* = \\frac{3.49 \\cdot s}{N^{1\/3}}$$<\/span><\/p>\n<p>o\u00f9 <span class=\"arabpsy-math-inline\" data-latex=\"s\">$s$<\/span> repr\u00e9sente l&rsquo;estimateur sans biais de l&rsquo;\u00e9cart-type de l&rsquo;\u00e9chantillon empirique :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"s = \\sqrt{\\frac{1}{N-1}\\sum_{i=1}^N (x_i - \\bar{x})^2}\">$$s = \\sqrt{\\frac{1}{N-1}\\sum_{i=1}^N (x_i &#8211; \\bar{x})^2}$$<\/span><\/p>\n<p>La r\u00e8gle de Scott s&rsquo;ex\u00e9cute directement dans Matplotlib par le passage de l&rsquo;argument <code>bins='scott'<\/code>.<\/p>\n<p>L&rsquo;apport de cette formulation est substantiel. Contrairement \u00e0 la r\u00e8gle de Sturges, la largeur de bac r\u00e9tr\u00e9cit ici en proportion de <span class=\"arabpsy-math-inline\" data-latex=\"N^{-1\/3}\">$N^{-1\/3}$<\/span>, assurant que le nombre total de bacs cro\u00eet \u00e0 l&rsquo;ordre <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{O}(N^{1\/3})\">$\\mathcal{O}(N^{1\/3})$<\/span>. Cette dynamique garantit une v\u00e9ritable convergence asymptotique : plus la puissance de l&rsquo;\u00e9chantillonnage s&rsquo;accro\u00eet, plus l&rsquo;histogramme affine sa r\u00e9solution pour r\u00e9v\u00e9ler des d\u00e9tails structurels fins, tout en pr\u00e9servant le contr\u00f4le de la variance d&rsquo;estimation.<\/p>\n<p>Cependant, la vuln\u00e9rabilit\u00e9 de la m\u00e9thode de Scott se situe dans sa d\u00e9pendance directe envers l&rsquo;\u00e9cart-type empirique <span class=\"arabpsy-math-inline\" data-latex=\"s\">$s$<\/span>. L&rsquo;\u00e9cart-type constitue une m\u00e9trique de dispersion notoirement non-robuste, dont la valeur peut \u00eatre disproportionnellement dilat\u00e9e par la pr\u00e9sence d&rsquo;une seule donn\u00e9e aberrante dans l&rsquo;\u00e9chantillon. En cas de contamination s\u00e9v\u00e8re par des valeurs extr\u00eames, <span class=\"arabpsy-math-inline\" data-latex=\"s\">$s$<\/span> augmente artificiellement, entra\u00eenant un \u00e9largissement indu de <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta^*\">$\\Delta^*$<\/span> et, par voie de cons\u00e9quence, un sur-lissage non d\u00e9sir\u00e9 du c\u0153ur de la distribution.<\/p>\n<h3>6.3 La r\u00e8gle de Freedman-Diaconis : Robustesse aux valeurs aberrantes<\/h3>\n<p>Pour immuniser l&rsquo;estimation optimale de la largeur de bac contre la sensibilit\u00e9 aux valeurs aberrantes, David Freedman et Persi Diaconis ont publi\u00e9 en 1981 une am\u00e9lioration majeure de la r\u00e8gle de Scott. La <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1007\/BF01025868\">r\u00e8gle de Freedman-Diaconis<\/a> substitue \u00e0 l&rsquo;\u00e9cart-type classique une statistique d&rsquo;ordre robuste : l&rsquo;\u00e9cart interquartile (<em>Interquartile Range<\/em> ou IQR), d\u00e9fini par la diff\u00e9rence entre le troisi\u00e8me quartile (<span class=\"arabpsy-math-inline\" data-latex=\"Q_3\">$Q_3$<\/span>, 75e centile) et le premier quartile (<span class=\"arabpsy-math-inline\" data-latex=\"Q_1\">$Q_1$<\/span>, 25e centile) :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{IQR} = Q_3 - Q_1\">$$\\text{IQR} = Q_3 &#8211; Q_1$$<\/span><\/p>\n<p>La largeur optimale du bac selon Freedman-Diaconis est alors formul\u00e9e comme suit :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\Delta_{\\text{FD}} = \\frac{2 \\cdot \\text{IQR}(X)}{N^{1\/3}}\">$$\\Delta_{\\text{FD}} = \\frac{2 \\cdot \\text{IQR}(X)}{N^{1\/3}}$$<\/span><\/p>\n<p>Cette r\u00e8gle heuristique est appel\u00e9e nativement dans Matplotlib par le biais de la cha\u00eene <code>bins='fd'<\/code>.<\/p>\n<p>La robustesse math\u00e9matique de cet estimateur est consid\u00e9rable. L&rsquo;\u00e9cart interquartile poss\u00e8de un point de rupture (<em>breakdown point<\/em>) de 25 %, ce qui signifie qu&rsquo;un quart des observations de l&rsquo;\u00e9chantillon peuvent \u00eatre arbitrairement alt\u00e9r\u00e9es ou projet\u00e9es \u00e0 l&rsquo;infini sans que la valeur de l&rsquo;IQR ne subisse d&rsquo;explosion asymptotique. Ainsi, en pr\u00e9sence de queues de distribution extr\u00eamement allong\u00e9es, de processus de mesure bruit\u00e9s ou de donn\u00e9es asym\u00e9triques lourdes (tr\u00e8s courantes en psychologie et en neurosciences computationnelles), la r\u00e8gle de Freedman-Diaconis conserve un maillage parfaitement ajust\u00e9 \u00e0 la zone centrale de forte densit\u00e9, ignorant les distorsions provoqu\u00e9es par les valeurs p\u00e9riph\u00e9riques.<\/p>\n<p>Pour cette raison, la r\u00e8gle de Freedman-Diaconis est quasi universellement consid\u00e9r\u00e9e par la communaut\u00e9 statistique appliqu\u00e9e comme le choix algorithmique automatis\u00e9 par d\u00e9faut le plus fiable et le plus s\u00e9curisant pour des variables continues non strictement gaussiennes.<\/p>\n<h3>6.4 Algorithmes sp\u00e9cialis\u00e9s : Knuth, Wand et Auto<\/h3>\n<p>Au-del\u00e0 des trois grands classiques, l&rsquo;\u00e9cosyst\u00e8me NumPy\/Matplotlib int\u00e8gre d&rsquo;autres paradigmes algorithmiques raffin\u00e9s. Le plus notable est le s\u00e9lecteur adaptatif <code>bins='auto'<\/code>. Loin de correspondre \u00e0 une heuristique rigide unique, le mode <code>'auto'<\/code> applique une logique de s\u00e9lection conditionnelle fond\u00e9e sur un arbitrage entre Freedman-Diaconis et Sturges :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\Delta_{\\text{auto}} = \\begin{\\cases} \\Delta_{\\text{FD}} &amp;a\\mp; \\text{si } \\text{IQR}(X) &gt; 0 \\text{ et } N ge 100  \\Delta_{\\text{Sturges}} &amp;a\\mp; \\text{dans le cas contraire} \\end{\\cases}\">$$\\Delta_{\\text{auto}} = \\begin{\\cases} \\Delta_{\\text{FD}} &#038;a\\mp; \\text{si } \\text{IQR}(X) &gt; 0 \\text{ et } N ge 100  \\Delta_{\\text{Sturges}} &#038;a\\mp; \\text{dans le cas contraire} \\end{\\cases}$$<\/span><\/p>\n<p>Le basculement vers la r\u00e8gle de Sturges s&rsquo;av\u00e8re indispensable lorsque l&rsquo;\u00e9cart interquartile s&rsquo;effondre \u00e0 z\u00e9ro. Cette anomalie statistique se produit couramment sur des donn\u00e9es fortement discr\u00e9tis\u00e9es ou caract\u00e9ris\u00e9es par une concentration massive de plus de 50 % des observations sur une valeur identique : dans ce cas, <span class=\"arabpsy-math-inline\" data-latex=\"Q_1\">$Q_1$<\/span> et <span class=\"arabpsy-math-inline\" data-latex=\"Q_3\">$Q_3$<\/span> co\u00efncident, ce qui annulerait l&rsquo;IQR et entra\u00eenerait une division par z\u00e9ro dans la formule de Freedman-Diaconis. Le s\u00e9lecteur <code>'auto'<\/code> g\u00e8re cette contingence en basculant automatiquement vers une heuristique alternative stable.<\/p>\n<p>Dans la litt\u00e9rature computationnelle avanc\u00e9e, d&rsquo;autres approches m\u00e9ritent d&rsquo;\u00eatre signal\u00e9es, bien qu&rsquo;elles exigent des biblioth\u00e8ques tierces (telles que <a rel=\"noopener noreferrer\" href=\"https:\/\/www.astropy.org\/\">Astropy<\/a>) pour \u00eatre directement d\u00e9ploy\u00e9es :<\/p>\n<ul>\n<li><strong>La r\u00e8gle bay\u00e9sienne de Knuth (<em>Knuth&rsquo;s Rule<\/em>) :<\/strong> Formul\u00e9e par Kevin Knuth en 2006, cette approche traite l&rsquo;optimisation des bacs comme un probl\u00e8me d&rsquo;inf\u00e9rence bay\u00e9sienne non param\u00e9trique. Elle calcule la probabilit\u00e9 <em>a posteriori<\/em> du nombre de bacs en supposant une vraisemblance multinomiale combin\u00e9e \u00e0 une loi <em>a priori<\/em> non informative de Dirichlet, optimisant l&rsquo;histogramme par maximisation de l&rsquo;\u00e9vidence du mod\u00e8le.<\/li>\n<li><strong>L&rsquo;estimateur de Wand (<em>Wand&rsquo;s Plug-in Rule<\/em>) :<\/strong> D\u00e9velopp\u00e9 par Matt Wand en 1997, cet algorithme utilise des m\u00e9thodes dites \u00ab plug-in \u00bb d&rsquo;ordre sup\u00e9rieur bas\u00e9es sur l&rsquo;estimation non param\u00e9trique des d\u00e9riv\u00e9es fonctionnelles de la densit\u00e9 sous-jacente, \u00e9liminant ainsi toute hypoth\u00e8se pr\u00e9alable de normalit\u00e9 m\u00eame sur des distributions \u00e0 modes multiples complexes.<\/li>\n<\/ul>\n<h2>7. Gestion des bacs \u00e0 largeur variable (non uniforme)<\/h2>\n<h3>7.1 Construction d&rsquo;intervalles non \u00e9quidistants<\/h3>\n<p>L&rsquo;ensemble des d\u00e9veloppements pr\u00e9c\u00e9dents reposait sur le postulat implicite d&rsquo;une discr\u00e9tisation uniforme o\u00f9 chaque bac partage rigoureusement la m\u00eame largeur spatiale <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta\">$\\Delta$<\/span>. Cependant, une telle r\u00e9gularit\u00e9 g\u00e9om\u00e9trique s&rsquo;av\u00e8re profond\u00e9ment inadapt\u00e9e \u00e0 la description de nombreux ph\u00e9nom\u00e8nes naturels et comportementaux r\u00e9gis par des dynamiques d&rsquo;\u00e9chelle, des lois de puissance ou des distributions exponentielles \u00e9tal\u00e9es sur plusieurs ordres de grandeur.<\/p>\n<p>Dans de tels contextes, imposer un maillage uniforme confronte l&rsquo;analyste \u00e0 un dilemme insoluble : soit les bacs sont dimensionn\u00e9s pour capturer les variations infinit\u00e9simales de la r\u00e9gion d&rsquo;origine (ce qui g\u00e9n\u00e8re des milliers de bacs vides le long de la queue de distribution), soit ils sont calibr\u00e9s pour agr\u00e9ger la queue (ce qui \u00e9crase irr\u00e9m\u00e9diablement le mode initial en un unique rectangle massif). La solution analytique r\u00e9side dans la mise en \u0153uvre de bacs \u00e0 largeur variable (non uniforme), o\u00f9 le pas spatial s&rsquo;\u00e9largit progressivement \u00e0 mesure que l&rsquo;on s&rsquo;\u00e9loigne de la masse centrale.<\/p>\n<p>Cette g\u00e9om\u00e9trie non uniforme est directement support\u00e9e par Matplotlib par la transmission d&rsquo;une s\u00e9quence de limites non lin\u00e9aires. L&rsquo;approche standard pour les lois de puissance ou les ph\u00e9nom\u00e8nes multi-\u00e9chelles (comme les temps d&rsquo;attente sur un serveur ou les seuils de d\u00e9tection auditive en d\u00e9cibels) consiste \u00e0 utiliser une progression g\u00e9om\u00e9trique ou logarithmique via <code>numpy.logspace()<\/code> ou <code>numpy.geomspace()<\/code> :<\/p>\n<pre style=\"display:none\">\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# G\u00e9n\u00e9ration de limites distribu\u00e9es de mani\u00e8re logarithmique entre 10^0 et 10^4\nbornes_variables = np.logspace(0, 4, num=20)\nplt.hist(donnees_asymetriques, bins=bornes_variables, edgecolor='black')\nplt.xscale('log') # Synchronisation indispensable de l'axe visuel\n<\/pre>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/bin3.png\" alt=\"\" \/><\/figure>\n<p>Une seconde approche, particuli\u00e8rement pertinente en analyse socio-\u00e9conomique ou psychom\u00e9trique comparative, repose sur le d\u00e9coupage par quantiles empiriques. \u00c0 l&rsquo;aide de <code>numpy.quantile()<\/code> ou <code>numpy.percentile()<\/code>, l&rsquo;analyste peut d\u00e9terminer les fronti\u00e8res de classes de telle sorte que chaque bac contienne initialement une proportion rigoureusement identique d&rsquo;observations (par exemple, des d\u00e9ciles contenant chacun exactement 10 % de la population totale). Dans ce cas pr\u00e9cis, la variabilit\u00e9 des largeurs <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta_k\">$\\Delta_k$<\/span> renseigne directement sur la densit\u00e9 locale : des bacs tr\u00e8s resserr\u00e9s signalent une forte concentration de points, tandis que des bacs tr\u00e8s larges indiquent une rar\u00e9faction de l&rsquo;\u00e9chantillon.<\/p>\n<h3>7.2 Imp\u00e9ratif m\u00e9thodologique : L&rsquo;utilisation de density=True<\/h3>\n<p>L&rsquo;introduction d&rsquo;intervalles \u00e0 largeur variable soul\u00e8ve un pi\u00e8ge m\u00e9thodologique absolu d&rsquo;une gravit\u00e9 exceptionnelle. Si l&rsquo;on trace un histogramme \u00e0 bacs variables en conservant les fr\u00e9quences absolues sur l&rsquo;axe vertical (le mode de fonctionnement par d\u00e9faut de Matplotlib), la repr\u00e9sentation graphique viole le principe s\u00e9miologique fondamental formul\u00e9 par Jacques Bertin : <em>l&rsquo;aire d&rsquo;un symbole visuel doit \u00eatre rigoureusement proportionnelle \u00e0 la quantit\u00e9 quantitative qu&rsquo;elle transcrit<\/em>.<\/p>\n<p>Consid\u00e9rons deux bacs successifs : un premier bac <span class=\"arabpsy-math-inline\" data-latex=\"B_1\">$B_1$<\/span> de largeur <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta_1 = 1.0\">$\\Delta_1 = 1.0$<\/span> contenant 100 observations, et un second bac <span class=\"arabpsy-math-inline\" data-latex=\"B_2\">$B_2$<\/span> de largeur <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta_2 = 10.0\">$\\Delta_2 = 10.0$<\/span> contenant \u00e9galement 100 observations. Si Matplotlib trace ces donn\u00e9es en effectifs bruts, la hauteur des deux barres sera rigoureusement identique (<span class=\"arabpsy-math-inline\" data-latex=\"y = 100\">$y = 100$<\/span>). Cependant, en raison de l&rsquo;\u00e9largissement d\u00e9cupl\u00e9 de la base du rectangle, la surface g\u00e9om\u00e9trique de la seconde barre sera dix fois plus vaste que celle de la premi\u00e8re ($1000$ unit\u00e9s de surface contre $100$). L&rsquo;observateur humain, dont la perception cognitive int\u00e8gre inconsciemment les aires surfaciques, percevra le second intervalle comme \u00e9tant dix fois plus important ou plus repr\u00e9sent\u00e9 dans la population que le premier, ce qui constitue une distorsion visuelle majeure.<\/p>\n<p>Pour conjurer cette falsification involontaire, l&rsquo;analyste a l&rsquo;obligation math\u00e9matique d&rsquo;activer le param\u00e8tre <code>density=True<\/code> :<\/p>\n<pre style=\"display:none\">\nplt.hist(donnees, bins=bornes_variables, density=True, edgecolor='black')\n<\/pre>\n<p>Sous cette commande, Matplotlib abandonne le d\u00e9compte absolu pour calculer la densit\u00e9 empirique locale <span class=\"arabpsy-math-inline\" data-latex=\"h_k\">$h_k$<\/span> sur chaque segment :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"h_k = \\frac{n_k}{N \\cdot \\Delta_k} = \\frac{\\text{Fr\u00e9quence Relative}_k}{\\Delta_k}\">$$h_k = \\frac{n_k}{N \\cdot \\Delta_k} = \\frac{\\text{Fr\u00e9quence Relative}_k}{\\Delta_k}$$<\/span><\/p>\n<p>Dans cette configuration, l&rsquo;aire g\u00e9om\u00e9trique <span class=\"arabpsy-math-inline\" data-latex=\"A_k\">$A_k$<\/span> de chaque rectangle correspond rigoureusement \u00e0 l&rsquo;int\u00e9gration de la hauteur sur sa largeur :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"A_k = h_k \\cdot \\Delta_k = \\left(\\frac{n_k}{N \\cdot \\Delta_k}\\right) \\cdot \\Delta_k = \\frac{n_k}{N}\">$$A_k = h_k \\cdot \\Delta_k = \\left(\\frac{n_k}{N \\cdot \\Delta_k}\\right) \\cdot \\Delta_k = \\frac{n_k}{N}$$<\/span><\/p>\n<p>La surface de la barre redevient ainsi strictement proportionnelle \u00e0 la probabilit\u00e9 empirique d&rsquo;appartenance \u00e0 cette classe. De surcro\u00eet, la sommation des aires de l&rsquo;ensemble de l&rsquo;histogramme v\u00e9rifie rigoureusement la condition d&rsquo;unitarit\u00e9 propre aux fonctions de densit\u00e9 de probabilit\u00e9 :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\sum_{k=1}^K A_k = \\sum_{k=1}^K \\left(\\frac{n_k}{N}\\right) = \\frac{1}{N} \\sum_{k=1}^K n_k = \\frac{N}{N} = 1\">$$\\sum_{k=1}^K A_k = \\sum_{k=1}^K \\left(\\frac{n_k}{N}\\right) = \\frac{1}{N} \\sum_{k=1}^K n_k = \\frac{N}{N} = 1$$<\/span><\/p>\n<p>L&rsquo;utilisation d&rsquo;histogrammes \u00e0 bacs variables sans normalisation de densit\u00e9 constitue l&rsquo;une des erreurs d&rsquo;analyse les plus s\u00e9v\u00e8rement sanctionn\u00e9es lors des relectures par les pairs dans les revues acad\u00e9miques de premier rang.<\/p>\n<h2>8. Impact perceptif et biais cognitifs li\u00e9s au choix des bacs<\/h2>\n<h3>8.1 Le biais d&rsquo;ancrage et la manipulation visuelle de la forme<\/h3>\n<p>L&rsquo;acte graphique n&rsquo;est jamais neutre sur le plan cognitif. L&rsquo;ajustement de la taille des bacs dans un histogramme poss\u00e8de un pouvoir de suggestion visuelle si puissant qu&rsquo;il est possible, \u00e0 partir d&rsquo;un unique jeu de donn\u00e9es invariant, de produire des repr\u00e9sentations sugg\u00e9rant des conclusions scientifiques mutuellement exclusives. Ce ph\u00e9nom\u00e8ne est connu sous le terme de manipulation de la modalit\u00e9 perceptive.<\/p>\n<p>En modifiant simplement le param\u00e8tre <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta\">$\\Delta$<\/span> (ou <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span>), un analyste peut ais\u00e9ment convertir visuellement une distribution unimodale asym\u00e9trique en une distribution sugg\u00e9rant l&rsquo;existence de plusieurs pics distincts (bimodalit\u00e9 ou trimodalit\u00e9) par l&rsquo;introduction d&rsquo;un sous-lissage d\u00e9lib\u00e9r\u00e9 capturant le bruit d&rsquo;\u00e9chantillonnage. Inversement, et de mani\u00e8re bien plus pernicieuse dans la recherche biom\u00e9dicale et psychologique, un sur-lissage excessif est capable d&rsquo;unifier deux sous-populations r\u00e9elles en un unique d\u00f4me central lisse et sym\u00e9trique.<\/p>\n<p>Imaginons une cohorte clinique h\u00e9t\u00e9rog\u00e8ne de patients diagnostiqu\u00e9s pour un trouble de l&rsquo;humeur, au sein de laquelle coexistent sans distinction <em>a priori<\/em> deux sous-groupes \u00e9tiologiques : une premi\u00e8re sous-population dont le profil de r\u00e9ponse \u00e0 une mol\u00e9cule antid\u00e9pressive est rapide et substantiel, et une seconde sous-population caract\u00e9ris\u00e9e par une r\u00e9sistance pharmacologique. L&rsquo;\u00e9valuation de l&rsquo;am\u00e9lioration clinique sur une \u00e9chelle continue produit une distribution bimodale sous-jacente, r\u00e9v\u00e9lant la superposition de deux courbes en cloche d\u00e9cal\u00e9es sur l&rsquo;axe des abscisses. Si le chercheur trace un histogramme avec un nombre arbitrairement restreint de bacs (par exemple, la valeur par d\u00e9faut <code>bins=10<\/code> sur un \u00e9chantillon mod\u00e9r\u00e9), le gouffre s\u00e9parant les deux d\u00f4mes sera totalement combl\u00e9 par l&rsquo;agr\u00e9gation spatiale. L&rsquo;analyste conclura \u00e0 tort \u00e0 une efficacit\u00e9 uniform\u00e9ment distribu\u00e9e de la th\u00e9rapeutique avec une simple variance interindividuelle mod\u00e9r\u00e9e, occultant l&rsquo;existence cruciale d&rsquo;un groupe r\u00e9fractaire n\u00e9cessitant une strat\u00e9gie d&rsquo;intervention alternative.<\/p>\n<h3>8.2 Sensibilit\u00e9 \u00e0 l&rsquo;origine (phase) des bacs<\/h3>\n<p>Alors que l&rsquo;attention des praticiens se focalise quasi exclusivement sur la largeur de classe <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta\">$\\Delta$<\/span>, une vuln\u00e9rabilit\u00e9 beaucoup plus subtile et m\u00e9connue concerne la localisation spatiale de l&rsquo;origine du partitionnement, d\u00e9sign\u00e9e en th\u00e9orie du traitement du signal sous le concept de \u00ab phase \u00bb des bacs.<\/p>\n<p>Soit une largeur de bac parfaitement optimale et fixe <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta\">$\\Delta$<\/span>. Le positionnement de la grille de discr\u00e9tisation sur la droite r\u00e9elle n\u00e9cessite de d\u00e9terminer un point de d\u00e9part arbitraire <span class=\"arabpsy-math-inline\" data-latex=\"x_0\">$x_0$<\/span>. Les limites des bacs sont alors d\u00e9finies par :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"e_k = x_0 + k \\cdot \\Delta \\quad \\text{a\\vec } x_0 le \\min(\\mathcal{D})\">$$e_k = x_0 + k \\cdot \\Delta \\quad \\text{a\\vec } x_0 le \\min(\\mathcal{D})$$<\/span><\/p>\n<p>Si l&rsquo;on d\u00e9cale ce point d&rsquo;ancrage d&rsquo;une fraction infinit\u00e9simale de la largeur (par exemple en choisissant <span class=\"arabpsy-math-inline\" data-latex=\"x_0&#039; = x_0 + \\frac{\\Delta}{3}\">$x_0&prime; = x_0 + \\frac{\\Delta}{3}$<\/span>), sans alt\u00e9rer d&rsquo;un iota la largeur <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta\">$\\Delta$<\/span> ni la valeur des donn\u00e9es, le profil morphologique de l&rsquo;histogramme peut subir des m\u00e9tamorphoses spectaculaires. Des observations group\u00e9es qui tombaient auparavant au sein d&rsquo;un m\u00eame bac peuvent se retrouver scind\u00e9es de part et d&rsquo;autre d&rsquo;une fronti\u00e8re de classe nouvellement d\u00e9plac\u00e9e, cr\u00e9ant l&rsquo;illusion de l&rsquo;\u00e9mergence soudaine d&rsquo;un second mode ou de la disparition d&rsquo;un creux distributionnel.<\/p>\n<p>Ce ph\u00e9nom\u00e8ne d&rsquo;instabilit\u00e9 par d\u00e9phasage est particuli\u00e8rement aigu sur les petits \u00e9chantillons (<span class=\"arabpsy-math-inline\" data-latex=\"N &lt; 100\">$N &lt; 100$<\/span>). Pour neutraliser ce biais cognitif, deux pratiques de standardisation s&#039;imposent :<\/p>\n<ul>\n<li>Ancrer syst\u00e9matiquement l&rsquo;origine <span class=\"arabpsy-math-inline\" data-latex=\"x_0\">$x_0$<\/span> sur des valeurs rondes ou des seuils cardinaux poss\u00e9dant une justification physique externe (par exemple, z\u00e9ro absolu, niveau du hasard exp\u00e9rimental, ou moyenne th\u00e9orique de standardisation).<\/li>\n<li>Moyonner les repr\u00e9sentations \u00e0 travers plusieurs d\u00e9phasages successifs, principe math\u00e9matique qui a directement inspir\u00e9 l&rsquo;estimateur par polygone de fr\u00e9quences d\u00e9phas\u00e9 et, ultimement, l&rsquo;estimation non param\u00e9trique par noyau de convolution (<em>Kernel Density Estimation<\/em>).<\/li>\n<\/ul>\n<h3>8.3 Bonnes pratiques \u00e9thiques pour la communication scientifique<\/h3>\n<p>Face \u00e0 la plasticit\u00e9 morphologique des histogrammes, la communaut\u00e9 scientifique internationale formule des exigences d\u00e9ontologiques de plus en plus rigoureuses quant \u00e0 la publication de visualisations de distributions empiriques :<\/p>\n<p>La premi\u00e8re r\u00e8gle d\u00e9ontologique consiste en la <strong>transparence m\u00e9thodologique absolue<\/strong>. Il est formellement prohib\u00e9 dans un article scientifique d&rsquo;ins\u00e9rer un histogramme sans expliciter dans la l\u00e9gende du graphique ou dans la section m\u00e9thodologique le protocole de discr\u00e9tisation employ\u00e9 (par exemple : <em>\u00ab L&rsquo;histogramme a \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9 sous Matplotlib avec une largeur de bac constante de 2.5 unit\u00e9s selon la r\u00e8gle de Freedman-Diaconis \u00bb<\/em>). Cette mention garantit la reproductibilit\u00e9 des r\u00e9sultats par des \u00e9quipes tierces.<\/p>\n<p>La deuxi\u00e8me recommandation pr\u00e9conise le recours \u00e0 la <strong>double visualisation<\/strong>, combinant la nature discr\u00e8te de l&rsquo;histogramme avec la continuit\u00e9 d&rsquo;un estimateur de densit\u00e9 par noyau (KDE). La superposition d&rsquo;une courbe KDE liss\u00e9e permet de distinguer imm\u00e9diatement si un d\u00e9crochage local de l&rsquo;histogramme constitue un saut structurel corrobor\u00e9 par le noyau ou s&rsquo;il s&rsquo;agit d&rsquo;un artefact imputable au d\u00e9coupage spatial des barres.<\/p>\n<p>Enfin, l&rsquo;insertion d&rsquo;un diagramme en tapis (<strong>rug plot<\/strong>) en bordure inf\u00e9rieure de l&rsquo;axe des abscisses repr\u00e9sente une pratique ergonomique d&rsquo;une rare \u00e9l\u00e9gance. Le rug plot trace chaque observation individuelle sous la forme d&rsquo;un trait vertical microscopique. Ce dispositif maintient l&rsquo;acc\u00e8s visuel direct aux donn\u00e9es brutes non agr\u00e9g\u00e9es, permettant au lecteur de v\u00e9rifier instantan\u00e9ment si un rectangle volumineux repose sur un cluster dense de dizaines de points ou sur une observation unique isol\u00e9e au milieu du vide.<\/p>\n<h2>9. Personnalisation esth\u00e9tique et optimisation de la lisibilit\u00e9 des bacs<\/h2>\n<h3>9.1 Ajustement de l&rsquo;espacement relatif et typologie des barres<\/h3>\n<p>La transmission efficace de l&rsquo;information quantitative d\u00e9pend de l&rsquo;ergonomie visuelle du trac\u00e9. Matplotlib offre un large \u00e9ventail d&rsquo;arguments d&rsquo;ajustement permettant de transcender le rendu aust\u00e8re des graphiques natifs.<\/p>\n<p>L&rsquo;argument formel <code>rwidth<\/code> (<em>relative width<\/em>) permet de rompre d\u00e9lib\u00e9r\u00e9ment la contigu\u00eft\u00e9 g\u00e9om\u00e9trique des rectangles. Par d\u00e9faut, <code>rwidth=1.0<\/code>, ce qui implique que chaque rectangle occupe 100 % de l&rsquo;espace allou\u00e9 par la largeur <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta_k\">$\\Delta_k$<\/span>, les barres se touchant mutuellement sans solution de continuit\u00e9. En fixant <code>rwidth=0.85<\/code>, chaque barre n&rsquo;occupe plus que 85 % de sa largeur th\u00e9orique, laissant un espace blanc vertical \u00e9quivalant \u00e0 15 % entre les blocs cons\u00e9cutifs :<\/p>\n<pre style=\"display:none\">\nplt.hist(donnees, bins=15, rwidth=0.85, color='#2b5c8f')\n<\/pre>\n<p>Bien que cette disposition doive \u00eatre mani\u00e9e avec pr\u00e9caution pour ne pas confondre le graphe avec un diagramme en barres cat\u00e9goriel, elle est souvent appr\u00e9ci\u00e9e pour all\u00e9ger la charge visuelle lors de pr\u00e9sentations orales ou sur des supports num\u00e9riques \u00e0 haute luminosit\u00e9.<\/p>\n<p>Le param\u00e8tre <code>histtype<\/code> red\u00e9finit fondamentalement la typologie du rendu vectoriel. Il accepte quatre valeurs fondamentales :<\/p>\n<ul>\n<li><code>'bar'<\/code> (d\u00e9faut) : Rectangles traditionnels individuels avec remplissage complet.<\/li>\n<li><code>'barstacked'<\/code> : Piles verticales de barres positionn\u00e9es les unes sur les autres pour d\u00e9composer des effectifs multicat\u00e9gories au sein d&rsquo;une m\u00eame classe.<\/li>\n<li><code>'step'<\/code> : Trac\u00e9 purement filaire monochrome ne dessinant que le contour sup\u00e9rieur ext\u00e9rieur de l&rsquo;histogramme, sans lignes verticales internes ni remplissage. Cette option est id\u00e9ale pour superposer cinq ou six distributions exp\u00e9rimentales concurrentes sans aucune obstruction visuelle.<\/li>\n<li><code>'stepfilled'<\/code> : Variante ferm\u00e9e de la ligne polygonale ext\u00e9rieure combinant un remplissage uniforme interne et l&rsquo;absence de d\u00e9marcations verticales inter-classes.<\/li>\n<\/ul>\n<p>Enfin, lorsque deux conditions exp\u00e9rimentales distinctes (par exemple, groupe contr\u00f4le versus groupe trait\u00e9) doivent \u00eatre compar\u00e9es sur le m\u00eame axe avec des barres pleines, le contr\u00f4le de la transparence par l&rsquo;argument scalaire <code>alpha<\/code> (compris entre 0.0 pour une transparence totale et 1.0 pour une opacit\u00e9 compl\u00e8te, typiquement calibr\u00e9 \u00e0 <code>alpha=0.6<\/code>) s&rsquo;av\u00e8re indispensable pour observer les zones de chevauchement mutuel.<\/p>\n<h3>9.2 Alignement et graduation des axes sur les limites des bacs<\/h3>\n<p>L&rsquo;une des sources majeures d&rsquo;ambigu\u00eft\u00e9 pour le lecteur d&rsquo;un histogramme provient de la dissonance cognitive entre les graduations automatiques de l&rsquo;axe des abscisses (les rep\u00e8res de l&rsquo;axe <span class=\"arabpsy-math-inline\" data-latex=\"X\">$X$<\/span>, ou <em>ticks<\/em>) et les v\u00e9ritables limites g\u00e9om\u00e9triques des bacs. Par d\u00e9faut, le moteur de placement de Matplotlib configure les graduations \u00e0 des intervalles arrondis ind\u00e9pendants (par exemple, des marques tous les 10 points : 10, 20, 30), alors que les bacs ont pu \u00eatre calcul\u00e9s sur des fronti\u00e8res non align\u00e9es (par exemple : 12.3, 22.3, 32.3). Il devient d\u00e8s lors particuli\u00e8rement ardu de d\u00e9terminer dans quel intervalle tombe pr\u00e9cis\u00e9ment une valeur interm\u00e9diaire.<\/p>\n<p>La solution programmatique optimale consiste \u00e0 forcer explicitement la synchronisation des graduations de l&rsquo;axe sur le vecteur des limites de bacs retourn\u00e9 par l&rsquo;appel \u00e0 <code>plt.hist()<\/code> :<\/p>\n<pre style=\"display:none\">\ncounts, bin_edges, patches = plt.hist(donnees, bins=np.arange(0, 105, 15), edgecolor='black')\nplt.xticks(bin_edges)\n<\/pre>\n<p>En assignant <code>bin_edges<\/code> \u00e0 la commande <code>plt.xticks()<\/code>, chaque rep\u00e8re visuel et chaque \u00e9tiquette num\u00e9rique viennent se verrouiller math\u00e9matiquement sous la ligne de d\u00e9marcation exacte de chaque rectangle. L&rsquo;ambigu\u00eft\u00e9 de lecture est ainsi \u00e9radiqu\u00e9e : le lecteur visualise instantan\u00e9ment que le premier bac couvre rigoureusement la plage <span class=\"arabpsy-math-inline\" data-latex=\"[0, 15]\">$[0, 15]$<\/span>, le second <span class=\"arabpsy-math-inline\" data-latex=\"[15, 30]\">$[15, 30]$<\/span>, et ainsi de suite.<\/p>\n<p>Si la densit\u00e9 de bacs est \u00e9lev\u00e9e, provoquant une superposition illisible des chiffres sur l&rsquo;axe horizontal, deux raffinements typographiques peuvent \u00eatre mis en \u0153uvre :<\/p>\n<ul>\n<li>L&rsquo;application d&rsquo;une rotation angulaire aux \u00e9tiquettes via <code>plt.xticks(bin_edges, rotation=45)<\/code>.<\/li>\n<li>Le sous-\u00e9chantillonnage r\u00e9gulier des \u00e9tiquettes affich\u00e9es tout en conservant les rep\u00e8res visuels mineurs :<\/li>\n<\/ul>\n<pre style=\"display:none\">\n# Affichage textuel d'un rep\u00e8re sur deux\nplt.xticks(bin_edges[::2], rotation=45)\n<\/pre>\n<h3>9.3 Coloration conditionnelle et mise en valeur de bacs sp\u00e9cifiques<\/h3>\n<p>Sur le plan de l&rsquo;analyse s\u00e9lective et de la communication didactique, il est fr\u00e9quemment souhaitable de diriger l&rsquo;attention de l&rsquo;audience vers une fraction sp\u00e9cifique de la distribution : un intervalle de risque pathologique, un seuil d&rsquo;admissibilit\u00e9 \u00e0 un concours, ou une zone de rupture thermique. La structure orient\u00e9e objet de Matplotlib permet d&rsquo;atteindre ce degr\u00e9 de personnalisation microscopique gr\u00e2ce au triplet retourn\u00e9 par la fonction.<\/p>\n<p>Le troisi\u00e8me conteneur issu de l&rsquo;ex\u00e9cution, <code>patches<\/code>, est une instance de <code>matplotlib.container.BarContainer<\/code> contenant la liste ordonn\u00e9e des objets vectoriels repr\u00e9sentant chaque rectangle. En it\u00e9rant s\u00e9quentiellement sur cette collection \u00e0 l&rsquo;aide d&rsquo;une boucle Python standard, l&rsquo;analyste peut inspecter la g\u00e9om\u00e9trie de chaque bac et appliquer des r\u00e8gles de coloration conditionnelle :<\/p>\n<pre style=\"display:none\">\ncounts, bin_edges, patches = plt.hist(scores, bins=20, edgecolor='black')\n\n# Coloration conditionnelle selon un seuil critique fix\u00e9 \u00e0 70\nfor i in range(len(patches)):\n    # bin_edges[i] repr\u00e9sente la limite gauche du bac\n    if bin_edges[i] &gt;= 70:\n        patches[i].set_facecolor('#d9534f') # Rouge alerte\n        patches[i].set_alpha(0.8)\n    else:\n        patches[i].set_facecolor('#5bc0de') # Bleu standard\n        patches[i].set_alpha(0.5)\n<\/pre>\n<p>Cette technique permet de transformer un graphique purement descriptif en un puissant instrument d&rsquo;aide \u00e0 la d\u00e9cision visuelle. L&rsquo;adjonction de rep\u00e8res verticaux globaux \u00e0 l&rsquo;aide de la commande <code>plt.axvline()<\/code> permet de contextualiser imm\u00e9diatement cette mise en valeur par rapport aux param\u00e8tres centraux de la population :<\/p>\n<pre style=\"display:none\">\nplt.axvline(np.mean(scores), color='darkred', linestyle='--', linewidth=2, label='Moyenne empirique')\nplt.axvline(np.median(scores), color='darkgreen', linestyle=':', linewidth=2, label='M\u00e9diane')\nplt.legend()\n<\/pre>\n<h2>10. Cas d&rsquo;usage sp\u00e9cifiques : Variables discr\u00e8tes et donn\u00e9es complexes<\/h2>\n<h3>10.1 Ajustement pour donn\u00e9es discr\u00e8tes et \u00e9chelles de Likert<\/h3>\n<p>L&rsquo;application non critique d&rsquo;un algorithme de discr\u00e9tisation continue \u00e0 des variables intrins\u00e8quement discr\u00e8tes constitue l&rsquo;une des sources d&rsquo;erreurs les plus courantes dans la recherche en psychologie sociale et en sciences de l&rsquo;\u00e9ducation. Les instruments psychom\u00e9triques reposent massivement sur des \u00e9chelles de type Likert en 5 ou 7 points (par exemple : 1 = Pas du tout d&rsquo;accord, jusqu&rsquo;\u00e0 5 = Tout \u00e0 fait d&rsquo;accord).<\/p>\n<p>Si un analyste transmet de telles donn\u00e9es \u00e0 Matplotlib avec une commande na\u00efve du type <code>plt.hist(scores_likert, bins=5)<\/code>, les limites automatiques seront calcul\u00e9es sur l&rsquo;intervalle <span class=\"arabpsy-math-inline\" data-latex=\"[1, 5]\">$[1, 5]$<\/span>. Avec <span class=\"arabpsy-math-inline\" data-latex=\"k=5\">$k=5$<\/span>, la largeur de classe sera de <span class=\"arabpsy-math-inline\" data-latex=\"\\Delta = (5 - 1)\/5 = 0.8\">$\\Delta = (5 &#8211; 1)\/5 = 0.8$<\/span>. Les sous-intervalles r\u00e9sultants seront ainsi : <span class=\"arabpsy-math-inline\" data-latex=\"[1.0, 1.8)\">$[1.0, 1.8)$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"[1.8, 2.6)\">$[1.8, 2.6)$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"[2.6, 3.4)\">$[2.6, 3.4)$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"[3.4, 4.2)\">$[3.4, 4.2)$<\/span>, et <span class=\"arabpsy-math-inline\" data-latex=\"[4.2, 5.0]\">$[4.2, 5.0]$<\/span>. En examinant attentivement ces fronti\u00e8res, on constate avec stup\u00e9faction que :<\/p>\n<ul>\n<li>Le premier bac recueille uniquement le score 1.<\/li>\n<li>Le deuxi\u00e8me bac recueille uniquement le score 2.<\/li>\n<li>Le troisi\u00e8me bac recueille uniquement le score 3.<\/li>\n<li>Le quatri\u00e8me bac recueille uniquement le score 4.<\/li>\n<li>Le cinqui\u00e8me bac recueille les scores 5 mais son comportement marginal est asym\u00e9trique en raison de la fermeture ferm\u00e9e des deux c\u00f4t\u00e9s.<\/li>\n<\/ul>\n<p>Si l&rsquo;amplitude des donn\u00e9es r\u00e9elles s&rsquo;\u00e9tend de 1 \u00e0 7 et que l&rsquo;on applique <span class=\"arabpsy-math-inline\" data-latex=\"k=5\">$k=5$<\/span>, certains bacs vont regrouper deux entiers tandis que d&rsquo;autres n&rsquo;en recevront qu&rsquo;un seul, ruinant instantan\u00e9ment la repr\u00e9sentativit\u00e9 de la fr\u00e9quence observ\u00e9e.<\/p>\n<p>Pour repr\u00e9senter rigoureusement des variables discr\u00e8tes prenant des valeurs enti\u00e8res isol\u00e9es <span class=\"arabpsy-math-inline\" data-latex=\"S = {1, 2, dots, M}\">$S = {1, 2, dots, M}$<\/span>, la r\u00e8gle absolue consiste \u00e0 <strong>centrer les bacs sur les entiers<\/strong> en d\u00e9calant les fronti\u00e8res de classe d&rsquo;une demi-unit\u00e9 (<span class=\"arabpsy-math-inline\" data-latex=\"\\pm 0.5\">$\\pm 0.5$<\/span>) :<\/p>\n<pre style=\"display:none\">\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nvaleurs_possibles = np.array([1, 2, 3, 4, 5])\n# Construction des bornes centr\u00e9es : [0.5, 1.5, 2.5, 3.5, 4.5, 5.5]\nbornes_likert = np.arange(0.5, 6.5, 1.0)\n\nplt.hist(reponses, bins=bornes_likert, rwidth=0.8, edgecolor='black')\nplt.xticks(valeurs_possibles)\n<\/pre>\n<p>Sous cette formulation, le score entier <span class=\"arabpsy-math-inline\" data-latex=\"x\">$x$<\/span> est positionn\u00e9 au centre g\u00e9om\u00e9trique exact du rectangle d&rsquo;\u00e9valuation <span class=\"arabpsy-math-inline\" data-latex=\"[x - 0.5, x + 0.5]\">$[x &#8211; 0.5, x + 0.5]$<\/span>. Chaque bac poss\u00e8de une largeur unitaire stricte de $1.0$, \u00e9liminant toute ambigu\u00eft\u00e9 de r\u00e9partition et garantissant une sym\u00e9trie parfaite de l&rsquo;estimation des fr\u00e9quences.<\/p>\n<h3>10.2 Traitement des valeurs extr\u00eames et distributions \u00e0 queue lourde<\/h3>\n<p>Les distributions financi\u00e8res (rendements boursiers, distribution des revenus), d\u00e9mographiques ou comportementales (temps de fixation oculaire, temps de pause lors d&rsquo;une t\u00e2che de frappe au clavier) pr\u00e9sentent r\u00e9guli\u00e8rement des queues lourdes (<em>heavy-tailed distributions<\/em>) ou des \u00e9talements asymptotiques extr\u00eames sur plusieurs ordres de grandeur.<\/p>\n<p>Dans ce contexte, deux m\u00e9thodologies avanc\u00e9es permettent de pr\u00e9server la lisibilit\u00e9 de la visualisation sans compromettre l&rsquo;int\u00e9grit\u00e9 de l&rsquo;\u00e9chantillon :<\/p>\n<p>La premi\u00e8re strat\u00e9gie repose sur la discr\u00e9tisation semi-logarithmique \u00e0 l&rsquo;aide de la fonction <code>numpy.logspace()<\/code>. Cette technique g\u00e9n\u00e8re des bacs dont la largeur cro\u00eet de fa\u00e7on exponentielle avec la distance \u00e0 l&rsquo;origine. L&rsquo;histogramme qui en r\u00e9sulte doit \u00eatre coupl\u00e9 \u00e0 une mise \u00e0 l&rsquo;\u00e9chelle logarithmique de l&rsquo;axe horizontal via <code>plt.xscale('log')<\/code>, transformant la repr\u00e9sentation en un espace perceptif o\u00f9 la loi de puissance sous-jacente appara\u00eet sous une forme lin\u00e9aire ais\u00e9ment quantifiable.<\/p>\n<p>La seconde strat\u00e9gie, largement exploit\u00e9e en analyse actuarielle et \u00e9pid\u00e9miologique, consiste en l&rsquo;agr\u00e9gation terminale en bacs ouverts (technique dite de <em>winsorisation<\/em> visuelle ou de <em>clipping<\/em>). Lorsque quelques observations aberrantes s&rsquo;\u00e9tendent de mani\u00e8re d\u00e9mesur\u00e9e sans apporter d&rsquo;information morphologique pertinente, l&rsquo;analyste peut redimensionner artificiellement ces valeurs limites vers un seuil plafond pr\u00e9d\u00e9fini :<\/p>\n<pre style=\"display:none\">\nseuil_plafond = 500\ndonnees_clippees = np.clip(donnees_brutes, a_min=None, a_max=seuil_plafond)\nbornes = np.arange(0, seuil_plafond + 25, 25)\n\nplt.hist(donnees_clippees, bins=bornes, edgecolor='black')\n<\/pre>\n<p>Le dernier bac de l&rsquo;histogramme recueille alors la totalit\u00e9 de la masse de probabilit\u00e9 contenue au-del\u00e0 du seuil de 500 unit\u00e9s. L&rsquo;imp\u00e9ratif \u00e9thique exige ici de modifier explicitement l&rsquo;\u00e9tiquette de ce dernier rectangle (par exemple en annotant l&rsquo;axe avec la mention <em>\u00ab <span class=\"arabpsy-math-inline\" data-latex=\"ge 500\">$ge 500$<\/span> \u00bb<\/em>) afin d&rsquo;avertir explicitement le lecteur que la barre terminale constitue un compartiment d&rsquo;accumulation ouvert.<\/p>\n<h3>10.3 Comparaison de distributions multigroupes et bacs harmonis\u00e9s<\/h3>\n<p>L&rsquo;analyse comparative de deux ou plusieurs sous-populations exp\u00e9rimentales (par exemple, cohorte saine versus cohorte pathologique, ou groupe contr\u00f4le versus groupe interventionnel) repr\u00e9sente un cas d&rsquo;usage clinique omnipr\u00e9sent. Dans ce sc\u00e9nario, une erreur m\u00e9thodologique gravissime consiste \u00e0 g\u00e9n\u00e9rer les histogrammes de chaque groupe de fa\u00e7on totalement autonome en laissant Matplotlib d\u00e9terminer les bacs s\u00e9par\u00e9ment pour chaque sous-\u00e9chantillon.<\/p>\n<p>Si le groupe A pr\u00e9sente une amplitude de <span class=\"arabpsy-math-inline\" data-latex=\"[10, 40]\">$[10, 40]$<\/span> et que le groupe B s&rsquo;\u00e9tale sur <span class=\"arabpsy-math-inline\" data-latex=\"[15, 60]\">$[15, 60]$<\/span>, des appels ind\u00e9pendants \u00e0 <code>plt.hist()<\/code> calculeront des limites de bacs divergentes et asynchrones pour les deux s\u00e9ries. Tenter de superposer ou de comparer c\u00f4te \u00e0 c\u00f4te de telles figures induit en erreur le clinicien : un d\u00e9calage apparent de position ou de hauteur peut r\u00e9sulter simplement du fait que les observations du groupe A sont divis\u00e9es en tranches de 3 unit\u00e9s tandis que celles du groupe B sont segment\u00e9es en tranches de 4.5 unit\u00e9s.<\/p>\n<p>Le principe fondamental de comparabilit\u00e9 exige l&rsquo;<strong>harmonisation stricte et centralis\u00e9e des bacs<\/strong>. Une grille unique et commune de discr\u00e9tisation doit \u00eatre calcul\u00e9e \u00e0 l&rsquo;\u00e9chelle de l&rsquo;union globale de toutes les cohortes, puis appliqu\u00e9e identiquement \u00e0 chaque sous-ensemble :<\/p>\n<pre style=\"display:none\">\n# Calcul de l'enveloppe globale absolue\nmin_global = min(np.min(groupe_A), np.min(groupe_B))\nmax_global = max(np.max(groupe_A), np.max(groupe_B))\n\n# D\u00e9finition d'une grille de partitionnement invariante\nbacs_communs = np.linspace(min_global, max_global, 30)\n\n# Trac\u00e9 superpos\u00e9 rigoureusement harmonis\u00e9\nplt.hist(groupe_A, bins=bacs_communs, alpha=0.5, density=True, label='Groupe Contr\u00f4le', color='blue')\nplt.hist(groupe_B, bins=bacs_communs, alpha=0.5, density=True, label='Groupe Exp\u00e9rimental', color='orange')\nplt.legend()\n<\/pre>\n<p>L&rsquo;activation du param\u00e8tre <code>density=True<\/code> est ici d&rsquo;autant plus cruciale si les deux groupes poss\u00e8dent des effectifs in\u00e9gaux (<span class=\"arabpsy-math-inline\" data-latex=\"N_A \\neq N_B\">$N_A \\neq N_B$<\/span>). Sans cette normalisation surfacique unitaire, la cohorte la plus nombreuse \u00e9craserait visuellement la cohorte restreinte, emp\u00eachant d&rsquo;appr\u00e9cier si les lois distributionnelles sous-jacentes partagent ou non des param\u00e8tres de forme et de position identiques.<\/p>\n<h2>11. Approche orient\u00e9e objet avec Matplotlib : M\u00e9thode ax.hist()<\/h2>\n<h3>11.1 Transition de l&rsquo;interface fonctionnelle (pyplot) \u00e0 l&rsquo;interface orient\u00e9e objet<\/h3>\n<p>Dans l&rsquo;architecture logicielle de Matplotlib, il existe une distinction fondamentale entre deux paradigmes de programmation : l&rsquo;interface fonctionnelle bas\u00e9e sur l&rsquo;\u00e9tat global courant (incarn\u00e9e par le module <code>matplotlib.pyplot<\/code>, calqu\u00e9 historiquement sur l&rsquo;ergonomie s\u00e9quentielle de MATLAB) et l&rsquo;interface orient\u00e9e objet (OO) explicite. Si l&rsquo;approche fonctionnelle (<code>plt.hist()<\/code>) convient parfaitement \u00e0 l&rsquo;exploration rapide dans un carnet interactif de type Jupyter Notebook, le d\u00e9veloppement de pipelines de traitement automatis\u00e9s, modulaires et robustes destin\u00e9s \u00e0 la recherche scientifique reproductible impose imp\u00e9rativement l&rsquo;adoption du paradigme orient\u00e9 objet.<\/p>\n<p>Dans le paradigme orient\u00e9 objet, la hi\u00e9rarchie graphique est formellement instanci\u00e9e par la d\u00e9composition entre un canevas global (l&rsquo;objet <code>Figure<\/code>) et un ou plusieurs syst\u00e8mes de coordonn\u00e9es cart\u00e9siennes ind\u00e9pendants (les objets <code>Axes<\/code>). La cr\u00e9ation canonique de la structure s&rsquo;op\u00e8re via la fonction de fabrique :<\/p>\n<pre style=\"display:none\">\nfig, ax = plt.subplots(figsize=(8, 5), dpi=300)\n<\/pre>\n<p>L&rsquo;ex\u00e9cution de la discr\u00e9tisation est alors d\u00e9l\u00e9gu\u00e9e \u00e0 la m\u00e9thode d\u00e9di\u00e9e de l&rsquo;axe : <code>ax.hist()<\/code>. Cette m\u00e9thode accepte l&rsquo;int\u00e9gralit\u00e9 rigoureuse des arguments formels analys\u00e9s dans les sections ant\u00e9rieures (<code>bins<\/code>, <code>range<\/code>, <code>density<\/code>, <code>edgecolor<\/code>, etc.), mais garantit que le rendu s&rsquo;op\u00e8re exclusivement au sein du conteneur topologique sp\u00e9cifi\u00e9 :<\/p>\n<pre style=\"display:none\">\ncounts, bin_edges, patches = ax.hist(\n    donnees,\n    bins='fd',\n    density=True,\n    facecolor='#377eb8',\n    edgecolor='black',\n    linewidth=0.8,\n    alpha=0.85\n)\n\n# Configuration modulaire orient\u00e9e objet\nax.set_title(\"Distribution des temps d'acc\u00e8s lexical\", fontsize=14, fontweight='bold')\nax.set_xlabel(\"Latence (millisecondes)\", fontsize=12)\nax.set_ylabel(\"Densit\u00e9 empirique\", fontsize=12)\nax.grid(True, linestyle='--', alpha=0.6)\n<\/pre>\n<p>Cette dissociation structurelle entre la figure globale et l&rsquo;axe de projection permet d&rsquo;int\u00e9grer sans friction l&rsquo;analyse par histogramme au sein d&rsquo;architectures logicielles industrielles, de micro-services web ou de suites de tests unitaires automatis\u00e9es, le graphe pouvant \u00eatre manipul\u00e9, s\u00e9rialis\u00e9 ou export\u00e9 vectoriellement sans jamais d\u00e9pendre d&rsquo;un \u00e9tat global de session susceptible d&rsquo;\u00eatre corrompu par d&rsquo;autres threads d&rsquo;ex\u00e9cution.<\/p>\n<h3>11.2 Histogrammes \u00e0 panneaux multiples (Subplots) avec bacs synchronis\u00e9s<\/h3>\n<p>La puissance du paradigme orient\u00e9 objet se r\u00e9v\u00e8le pleinement lors de la construction de graphiques \u00e0 panneaux multiples (<em>subplots<\/em> ou <em>small multiples<\/em> selon la terminologie d&rsquo;Edward Tufte). Cette m\u00e9thodologie visuelle consiste \u00e0 comparer plusieurs conditions exp\u00e9rimentales, profils d\u00e9mographiques ou tranches chronologiques au moyen d&rsquo;une grille de graphiques distincts juxtapos\u00e9s sur une m\u00eame planche de publication.<\/p>\n<p>La r\u00e9ussite m\u00e9thodologique d&rsquo;un tel agencement repose sur une contrainte absolue : la <strong>synchronisation spatiale int\u00e9grale<\/strong> des axes et des bacs. Si l&rsquo;\u00e9chelle des abscisses ou la segmentation des bacs fluctue d&rsquo;un panneau \u00e0 l&rsquo;autre au sein d&rsquo;une m\u00eame planche, le cerveau humain applique spontan\u00e9ment une comparaison analogique directe, induisant des contresens massifs d&rsquo;interpr\u00e9tation clinique.<\/p>\n<p>L&rsquo;impl\u00e9mentation robuste de ce principe en syntaxe orient\u00e9e objet n\u00e9cessite de conjuguer le calcul centralis\u00e9 d&rsquo;un vecteur de bornes invariant avec les m\u00e9canismes de verrouillage d&rsquo;axes de Matplotlib :<\/p>\n<pre style=\"display:none\">\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# G\u00e9n\u00e9ration d'une grille 1x3 avec axes partag\u00e9s\nfig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15, 5), sharex=True, sharey=True, dpi=300)\n\n# D\u00e9termination d'une grille commune de discr\u00e9tisation sur l'ensemble des cohortes\ntoutes_donnees = np.concatenate([groupe_jeunes, groupe_adultes, groupe_seniors])\nlargeur_commune = 2.0\nbornes_globales = np.arange(\n    np.floor(toutes_donnees.min()),\n    np.ceil(toutes_donnees.max()) + largeur_commune,\n    largeur_commune\n)\n\ncohortes = [groupe_jeunes, groupe_adultes, groupe_seniors]\ntitres = ['18-35 ans', '36-60 ans', '61-85 ans']\ncouleurs = ['#4daf4a', '#377eb8', '#e41a1c']\n\nfor ax, data, titre, col in zip(axes, cohortes, titres, couleurs):\n    ax.hist(data, bins=bornes_globales, density=True, color=col, edgecolor='black', alpha=0.7)\n    ax.set_title(f\"Cohorte : {titre}\", fontsize=12)\n    ax.set_xlabel(\"Score d'inhibition cognitive\")\n    ax.grid(True, linestyle=':', alpha=0.5)\n\naxes[0].set_ylabel(\"Densit\u00e9 de probabilit\u00e9\")\nplt.tight_layout()\n<\/pre>\n<p>L&rsquo;activation des arguments <code>sharex=True<\/code> et <code>sharey=True<\/code> garantit que toutes les sous-fen\u00eatres partagent rigoureusement les m\u00eames dimensions physiques sur le plan cart\u00e9sien. Coupl\u00e9e au vecteur unique <code>bornes_globales<\/code>, cette configuration assure que chaque barre d&rsquo;un panneau correspond au m\u00eame intervalle spatial et \u00e0 la m\u00eame unit\u00e9 de masse que sur les panneaux adjacents, permettant une comparaison imm\u00e9diate de la d\u00e9rive des moyennes, de l&rsquo;\u00e9largissement des variances ou de l&rsquo;\u00e9mergence d&rsquo;asym\u00e9tries au fil du vieillissement cognitif.<\/p>\n<h2>12. Synth\u00e8se pratique, erreurs fr\u00e9quentes et guide de d\u00e9pannage<\/h2>\n<h3>12.1 Diagnostic des erreurs classiques de param\u00e9trage<\/h3>\n<p>La pratique quotidienne de la discr\u00e9tisation sous Matplotlib expose les praticiens \u00e0 une s\u00e9rie d&rsquo;anomalies r\u00e9currentes dont l&rsquo;identification et la r\u00e9solution exigent une compr\u00e9hension fine de la tuyauterie logicielle sous-jacente.<\/p>\n<p><strong>1. L&rsquo;omission silencieuse des donn\u00e9es terminales :<\/strong> Comme explor\u00e9 dans les sections ant\u00e9rieures, l&rsquo;utilisation de <code>np.arange(data.min(), data.max(), step)<\/code> exclut structurellement la valeur maximale si l&rsquo;amplitude est un multiple exact de <span class=\"arabpsy-math-inline\" data-latex=\"step\">$step$<\/span>. Cette erreur ne provoque aucune lev\u00e9e d&rsquo;exception, mais fausse syst\u00e9matiquement les calculs de densit\u00e9 et de fr\u00e9quence cumul\u00e9e. <em>Rem\u00e8de :<\/em> Toujours ajouter une unit\u00e9 de pas au terme de fin : <code>np.arange(min, max + step, step)<\/code>.<\/p>\n<p><strong>2. La violation de monotonicit\u00e9 :<\/strong> L&rsquo;envoi \u00e0 l&rsquo;argument <code>bins<\/code> d&rsquo;une liste de coordonn\u00e9es non tri\u00e9es par ordre croissant (par exemple issue d&rsquo;une op\u00e9ration d&rsquo;ensemble sans ordonnancement d\u00e9terministe) l\u00e8ve imm\u00e9diatement l&rsquo;exception fatale :<\/p>\n<pre style=\"display:none\">\nValueError: `bins` must increase monotonically, when an array\n<\/pre>\n<p><em>Rem\u00e8de :<\/em> Encapsuler syst\u00e9matiquement la s\u00e9quence de bornes personnalis\u00e9es dans un tri vectoriel : <code>bins = np.sort(bornes)<\/code>.<\/p>\n<p><strong>3. La pr\u00e9sence de valeurs manquantes (NaN) ou infinies :<\/strong> Par d\u00e9faut, si le vecteur de donn\u00e9es transmis \u00e0 <code>plt.hist()<\/code> contient ne serait-ce qu&rsquo;une seule valeur non num\u00e9rique de type <code>np.nan<\/code> ou une divergence asymptotique de type <code>np.inf<\/code>, le moteur d&rsquo;\u00e9valuation de Matplotlib \u00e9choue avec un message d&rsquo;erreur explicite :<\/p>\n<pre style=\"display:none\">\nValueError: max must be larger than min in range parameter or input data contains NaNs\n<\/pre>\n<p>L&rsquo;algorithme de calcul des bornes est incapable de statuer sur le minimum et le maximum d&rsquo;une s\u00e9rie contamin\u00e9e par des donn\u00e9es manquantes. <em>Rem\u00e8de :<\/em> Appliquer une exclusion bool\u00e9enne stricte en amont du trac\u00e9 graphique \u00e0 l&rsquo;aide de l&rsquo;indexation NumPy :<\/p>\n<pre style=\"display:none\">\ndonnees_propres = donnees[np.isfinite(donnees)]\nplt.hist(donnees_propres, bins='fd')\n<\/pre>\n<p><strong>4. Le conflit entre les param\u00e8tres range et bins s\u00e9quentiels :<\/strong> Si l&rsquo;utilisateur fournit simultan\u00e9ment un tableau explicite de bornes \u00e0 l&rsquo;argument <code>bins<\/code> et un tuple restrictif \u00e0 l&rsquo;argument <code>range<\/code>, Matplotlib ignorera g\u00e9n\u00e9ralement le param\u00e8tre <code>range<\/code> ou pourra d\u00e9clencher un comportement inattendu selon les versions de la biblioth\u00e8que. <em>Rem\u00e8de :<\/em> R\u00e9server <code>range<\/code> exclusivement aux appels utilisant un entier scalaire pour <code>bins<\/code> ; lorsque l&rsquo;on emploie un vecteur s\u00e9quentiel, le contr\u00f4le des limites doit s&rsquo;effectuer directement au sein des coordonn\u00e9es transmises.<\/p>\n<h3>12.2 Arbre d\u00e9cisionnel pour le choix de la m\u00e9thode d&rsquo;ajustement<\/h3>\n<p>Afin de guider m\u00e9thodologiquement le choix de l&rsquo;analyste face \u00e0 la multiplicit\u00e9 des options de discr\u00e9tisation pr\u00e9sent\u00e9es, le tableau d\u00e9cisionnel suivant synth\u00e9tise les recommandations op\u00e9rationnelles en fonction de la nature des donn\u00e9es empiriques et de l&rsquo;objectif scientifique vis\u00e9 :<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse: collapse;width: 100%;margin: 20px 0\">\n<thead style=\"background-color: #f2f2f2\">\n<tr>\n<th>Type de Donn\u00e9es &amp; Contexte<\/th>\n<th>M\u00e9thode Recommand\u00e9e<\/th>\n<th>Syntaxe Python Exemplaire<\/th>\n<th>Justification M\u00e9thodologique<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Exploration initiale aveugle<\/strong> (Taille d&rsquo;\u00e9chantillon inconnue, distribution libre)<\/td>\n<td>S\u00e9lection adaptative automatis\u00e9e<\/td>\n<td><code>bins='auto'<\/code><\/td>\n<td>Compromis optimal entre Freedman-Diaconis et Sturges ; \u00e9vite l&rsquo;\u00e9cueil du sur-lissage des cohortes massives.<\/td>\n<\/tr>\n<tr>\n<td><strong>Donn\u00e9es continues asym\u00e9triques<\/strong> ou avec valeurs aberrantes (ex. temps de r\u00e9action)<\/td>\n<td>R\u00e8gle de Freedman-Diaconis<\/td>\n<td><code>bins='fd'<\/code><\/td>\n<td>Exploite l&rsquo;\u00e9cart interquartile (IQR) ; r\u00e9sistance exceptionnelle \u00e0 la contamination par les queues de distribution.<\/td>\n<\/tr>\n<tr>\n<td><strong>Donn\u00e9es continues gaussiennes<\/strong> de taille mod\u00e9r\u00e9e sans outliers (<span class=\"arabpsy-math-inline\" data-latex=\"N &lt; 1000\">$N &lt; 1000$<\/span>)<\/td>\n<td>R\u00e8gle de Scott<\/td>\n<td><code>bins='scott'<\/code><\/td>\n<td>Minimise math\u00e9matiquement l&rsquo;erreur quadratique int\u00e9gr\u00e9e moyenne (MISE) sous l&rsquo;hypoth\u00e8se de normalit\u00e9.<\/td>\n<\/tr>\n<tr>\n<td><strong>Variables discr\u00e8tes enti\u00e8res<\/strong> (Scores psychom\u00e9triques, \u00e9chelles de Likert 1-5 ou 1-7)<\/td>\n<td>Bornes manuelles d\u00e9cal\u00e9es d&rsquo;une demi-unit\u00e9<\/td>\n<td><code>bins=np.arange(0.5, max+1.5, 1.0)<\/code><\/td>\n<td>Centre rigoureusement chaque entier <span class=\"arabpsy-math-inline\" data-latex=\"x\">$x$<\/span> au milieu de son bac <span class=\"arabpsy-math-inline\" data-latex=\"[x-0.5, x+0.5]\">$[x-0.5, x+0.5]$<\/span> ; neutralise les art\u00e9facts de discr\u00e9tisation.<\/td>\n<\/tr>\n<tr>\n<td><strong>Unit\u00e9s physiques \/ cliniques signifiantes<\/strong> (Paliers d&rsquo;\u00e2ge de 5 ans, pas de 100 ms)<\/td>\n<td>Largeur de pas fixe vectoris\u00e9e via NumPy<\/td>\n<td><code>bins=np.arange(min, max+w, w)<\/code><\/td>\n<td>Garantit une interpr\u00e9tabilit\u00e9 directe et imm\u00e9diate des intervalles pour la communication scientifique et clinique.<\/td>\n<\/tr>\n<tr>\n<td><strong>Distributions \u00e0 loi de puissance<\/strong> \/ Multi-\u00e9chelles (Donn\u00e9es financi\u00e8res, latences \u00e9tendues)<\/td>\n<td>Bacs \u00e0 progression logarithmique<\/td>\n<td><code>bins=np.logspace(a, b, num)<\/code> + <code>density=True<\/code><\/td>\n<td>R\u00e9sout simultan\u00e9ment la forte concentration \u00e0 l&rsquo;origine et la rar\u00e9faction asymptotique dans la queue.<\/td>\n<\/tr>\n<tr>\n<td><strong>Comparaison de cohortes multiples<\/strong> (<span class=\"arabpsy-math-inline\" data-latex=\"N_A \\neq N_B\">$N_A \\neq N_B$<\/span>, sous-groupes ind\u00e9pendants)<\/td>\n<td>Grille globale invariante unifi\u00e9e<\/td>\n<td><code>bins=bornes_unifiees<\/code> + <code>density=True<\/code><\/td>\n<td>\u00c9limine tout biais d&rsquo;\u00e9chelle g\u00e9om\u00e9trique entre les panneaux compar\u00e9s ; rend les aires comparables.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>12.3 Perspectives et alternatives modernes pour la densit\u00e9 empirique<\/h3>\n<p>Bien que l&rsquo;histogramme classique demeure un instrument historique indispensable, les d\u00e9veloppements r\u00e9cents de la science des donn\u00e9es visuelle offrent des alternatives et des compl\u00e9ments structuraux de haut niveau qu&rsquo;il convient de ma\u00eetriser pour enrichir sa pratique analytique.<\/p>\n<p>Dans l&rsquo;\u00e9cosyst\u00e8me Python, la biblioth\u00e8que <a rel=\"noopener noreferrer\" href=\"https:\/\/seaborn.pydata.org\/\">Seaborn<\/a>, b\u00e2tie au sommet des primitives graphiques de Matplotlib, propose la fonction moderne <code>sns.histplot()<\/code>. Cette m\u00e9thode introduit deux arguments formels d&rsquo;une rare commodit\u00e9 ergonomique : <code>binwidth<\/code> et <code>binrange<\/code>. Plut\u00f4t que de devoir instancier des vecteurs NumPy complexes via <code>np.arange()<\/code>, l&rsquo;utilisateur peut d\u00e9clarer directement <code>binwidth=5<\/code> et <code>binrange=(0, 100)<\/code>, Seaborn prenant automatiquement en charge la vectorisation sous-jacente, la fermeture des intervalles et la gestion s\u00e9curis\u00e9e des bornes marginales.<\/p>\n<p>Au-del\u00e0 de l&rsquo;histogramme, l&rsquo;estimation de densit\u00e9 par noyau (<a rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/Kernel_density_estimation\">Kernel Density Estimation &#8211; KDE<\/a>) s&rsquo;affranchit totalement du partitionnement par bacs. En rempla\u00e7ant chaque observation ponctuelle par une fonction continue gaussienne (ou noyau r\u00e9gulateur) de variance <span class=\"arabpsy-math-inline\" data-latex=\"h\">$h$<\/span> (la bande passante ou <em>bandwidth<\/em>) et en sommant l&rsquo;ensemble de ces contributions \u00e9l\u00e9mentaires, le KDE produit une courbe de densit\u00e9 parfaitement lisse, exempte des art\u00e9facts d&rsquo;ancrage spatial et de phase qui affectent in\u00e9vitablement les histogrammes. L&rsquo;affichage conjoint de l&rsquo;histogramme et du trac\u00e9 KDE (facilement activable via l&rsquo;argument <code>kde=True<\/code> dans Seaborn) repr\u00e9sente aujourd&rsquo;hui le standard de r\u00e9f\u00e9rence pour l&rsquo;exploration de distributions complexes.<\/p>\n<p>Enfin, lorsque l&rsquo;analyse s&rsquo;\u00e9tend \u00e0 la comparaison de dizaines de groupes simultan\u00e9s, l&rsquo;histogramme s&rsquo;efface g\u00e9n\u00e9ralement au profit des trac\u00e9s en bo\u00eete \u00e0 moustaches (<em>boxplots<\/em>) et des trac\u00e9s en violon (<em>violin plots<\/em>). Les violons, qui int\u00e8grent la densit\u00e9 empirique de fa\u00e7on sym\u00e9trique le long d&rsquo;un axe cat\u00e9goriel, permettent d&rsquo;appr\u00e9hender d&rsquo;un coup d&rsquo;\u0153il la position, la dispersion, l&rsquo;asym\u00e9trie et la multimodalit\u00e9 de multiples cohortes sans que le graphique ne sombre dans la saturation visuelle inh\u00e9rente \u00e0 la superposition d&rsquo;une multitude de rectangles contigus.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul style=\"list-style-type: none;padding-left: 0;line-height: 1.8\">\n<li style=\"margin-bottom: 12px\">Bertin, J. (1967). <em>S\u00e9miologie graphique : Les diagrammes, les r\u00e9seaux, les cartes<\/em>. Gauthier-Villars.<\/li>\n<li style=\"margin-bottom: 12px\">Freedman, D., &amp; Diaconis, P. (1981). On the histogram as a density estimator: <span class=\"arabpsy-math-inline\" data-latex=\"L_2\">$L_2$<\/span> theory. <em>Zeitschrift f\u00fcr Wahrscheinlichkeitstheorie und verwandte Gebiete<\/em>, 57(4), 453\u2013476. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1007\/BF01025868\">https:\/\/doi.org\/10.1007\/BF01025868<\/a><\/li>\n<li style=\"margin-bottom: 12px\">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 style=\"margin-bottom: 12px\">Knuth, K. H. (2006). Optimal data-based binning for histograms. <em>arXiv preprint physics\/0605197<\/em>. <a rel=\"noopener noreferrer\" href=\"https:\/\/arxiv.org\/abs\/physics\/0605197\">https:\/\/arxiv.org\/abs\/physics\/0605197<\/a><\/li>\n<li style=\"margin-bottom: 12px\">Matplotlib Development Team. (2023). <em>matplotlib.axes.Axes.hist Documentation (Version 3.8)<\/em>. Matplotlib Project. <a rel=\"noopener noreferrer\" href=\"https:\/\/matplotlib.org\/stable\/api\/_as_gen\/matplotlib.axes.Axes.hist.html\">https:\/\/matplotlib.org\/stable\/api\/_as_gen\/matplotlib.axes.Axes.hist.html<\/a><\/li>\n<li style=\"margin-bottom: 12px\">NumPy Developers. (2023). <em>numpy.histogram_bin_edges Documentation (Version 1.26)<\/em>. NumPy Project. <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.histogram_bin_edges.html\">https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.histogram_bin_edges.html<\/a><\/li>\n<li style=\"margin-bottom: 12px\">Scott, D. W. (1979). On optimal and data-based histograms. <em>Biometrika<\/em>, 66(3), 605\u2013610. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1093\/biomet\/66.3.605\">https:\/\/doi.org\/10.1093\/biomet\/66.3.605<\/a><\/li>\n<li style=\"margin-bottom: 12px\">Scott, D. W. (2015). <em>Multivariate density estimation: Theory, practice, and visualization<\/em> (2nd ed.). John Wiley &amp; Sons. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1002\/9781118575574\">https:\/\/doi.org\/10.1002\/9781118575574<\/a><\/li>\n<li style=\"margin-bottom: 12px\">Silverman, B. W. (1986). <em>Density estimation for statistics and data analysis<\/em>. Chapman and Hall\/CRC. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1201\/9781315140919\">https:\/\/doi.org\/10.1201\/9781315140919<\/a><\/li>\n<li style=\"margin-bottom: 12px\">Sturges, H. A. (1926). The choice of a class interval. <em>Journal of the American Statistical Association<\/em>, 21(153), 65\u201366. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1080\/01621459.1926.10502161\">https:\/\/doi.org\/10.1080\/01621459.1926.10502161<\/a><\/li>\n<li style=\"margin-bottom: 12px\">Tufte, E. R. (2001). <em>The visual display of quantitative information<\/em> (2nd ed.). Graphics Press.<\/li>\n<li style=\"margin-bottom: 12px\">Wand, M. P. (1997). Data-based choice of histogram bin width. <em>The American Statistician<\/em>, 51(1), 59\u201364. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1080\/00031305.1997.10473591\">https:\/\/doi.org\/10.1080\/00031305.1997.10473591<\/a><\/li>\n<li style=\"margin-bottom: 12px\">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<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour ma\u00eetriser l&rsquo;ajustement de la taille, du nombre et des bornes des bacs dans les histogrammes avec Matplotlib et NumPy.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[2141,2687],"tags":[3329,3150,2468,2344,2041],"class_list":["post-4020","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-quantitative","category-visualisation-de-donnees","tag-histogramme","tag-matplotlib","tag-python","tag-statistiques","tag-visualisation-de-donnees"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4020","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=4020"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4020\/revisions"}],"predecessor-version":[{"id":16580,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4020\/revisions\/16580"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4020"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4020"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4020"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}