{"id":9499,"date":"2026-10-14T18:02:30","date_gmt":"2026-10-14T18:02:30","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-calculer-somme-par-groupe-sas\/"},"modified":"2026-10-14T18:02:30","modified_gmt":"2026-10-14T18:02:30","slug":"comment-calculer-somme-par-groupe-sas","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-calculer-somme-par-groupe-sas","title":{"rendered":"Comment calculer la somme par groupe dans SAS"},"content":{"rendered":"<p>Dans le domaine de l&rsquo;ing\u00e9nierie des donn\u00e9es et de l&rsquo;analyse biostatistique, le traitement analytique des grands ensembles d&rsquo;informations repose sur des op\u00e9rations fondamentales de r\u00e9duction dimensionnelle. Parmi ces op\u00e9rations, l&rsquo;agr\u00e9gation conditionnelle et le calcul de m\u00e9triques cumulatives par sous-groupes constituent le socle de toute d\u00e9marche d\u00e9cisionnelle rigoureuse. L&rsquo;environnement logiciel de SAS (Statistical Analysis System), reconnu mondialement pour sa robustesse algorithmique et sa conformit\u00e9 aux exigences r\u00e9glementaires strictes telles que celles de la Food and Drug Administration (FDA), fournit aux data scientists et aux statisticiens une multitude d&rsquo;architectures computationnelles pour ex\u00e9cuter ces agr\u00e9gations avec une pr\u00e9cision arithm\u00e9tique optimale.<\/p>\n<p>Le calcul de la somme par groupe repr\u00e9sente bien plus qu&rsquo;une banale sommation arithm\u00e9tique. Il s&rsquo;agit d&rsquo;un processus structurel au cours duquel des flux d&rsquo;enregistrements h\u00e9t\u00e9rog\u00e8nes sont partitionn\u00e9s selon des crit\u00e8res cat\u00e9goriels pr\u00e9cis, trait\u00e9s s\u00e9quentiellement ou ensemblistement, puis synth\u00e9tis\u00e9s dans des structures tabulaires pr\u00eates pour la mod\u00e9lisation statistique ou le rapportage institutionnel. Les praticiens sont constamment confront\u00e9s \u00e0 un arbitrage m\u00e9thodologique : convient-il d&rsquo;adopter l&rsquo;approche d\u00e9clarative du langage d&rsquo;interrogation structur\u00e9 (SQL), la puissance de contr\u00f4le s\u00e9quentiel offerte par le vecteur de donn\u00e9es du programme (Program Data Vector ou PDV) au sein de l&rsquo;\u00e9tape DATA, ou bien l&rsquo;efficience pr\u00e9compil\u00e9e des proc\u00e9dures analytiques sp\u00e9cialis\u00e9es telles que PROC MEANS et PROC SUMMARY ?<\/p>\n<p>Ce guide exhaustif a pour vocation d&rsquo;analyser en profondeur les m\u00e9canismes internes, la syntaxe, l&rsquo;optimisation des ressources et la validation num\u00e9rique du calcul de la somme par groupe dans l&rsquo;\u00e9cosyst\u00e8me SAS. En d\u00e9cortiquant les paradigmes proc\u00e9duraux, les comportements sous-jacents face aux valeurs manquantes, la gestion des entr\u00e9es-sorties sur disque ainsi que les structures avanc\u00e9es en m\u00e9moire vive, cette \u00e9tude propose un cadre de r\u00e9f\u00e9rence th\u00e9orique et pratique pour transformer des volumes massifs d&rsquo;observations en synth\u00e8ses quantitatives fiables et reproductibles.<\/p>\n<h2>1. Introduction m\u00e9thodologique \u00e0 l&rsquo;agr\u00e9gation de donn\u00e9es group\u00e9es dans SAS<\/h2>\n<h3>1.1 Importance de la sommation par sous-groupes en analyse quantitative<\/h3>\n<p>La sommation par sous-groupes constitue une op\u00e9ration fondamentale de transformation des donn\u00e9es qui permet de passer d&rsquo;un niveau micro-analytique, caract\u00e9ris\u00e9 par des observations atomiques individuelles, \u00e0 un niveau macro-analytique structur\u00e9 autour de cat\u00e9gories d&rsquo;int\u00e9r\u00eat. Dans des disciplines rigoureuses telles que l&rsquo;\u00e9pid\u00e9miologie clinique, l&rsquo;\u00e9conom\u00e9trie ou la recherche comportementale, les chercheurs recueillent des milliers, voire des millions de points de contact individuels. La n\u00e9cessit\u00e9 de r\u00e9duire ces dimensions matricielles est primordiale pour rendre l&rsquo;information intelligible et interpr\u00e9table, sans pour autant sacrifier la structure sous-jacente des covariables.<\/p>\n<p>Il existe une distinction m\u00e9thodologique fondamentale entre l&rsquo;obtention d&rsquo;agr\u00e9gats globaux et la d\u00e9composition factorielle par strates. Si la moyenne ou la somme totale d&rsquo;une variable m\u00e9trique fournit une mesure de tendance centrale ou de volume \u00e0 l&rsquo;\u00e9chelle d&rsquo;une population enti\u00e8re, elle masque in\u00e9vitablement les disparit\u00e9s internes et les effets de composition. En d\u00e9composant ces sommes selon des variables de stratification nominales ou ordinales, l&rsquo;analyste met en lumi\u00e8re la variabilit\u00e9 inter-strates et pr\u00e9pare le terrain pour l&rsquo;analyse de variance, la r\u00e9gression hi\u00e9rarchique ou les mod\u00e8les \u00e0 effets mixtes.<\/p>\n<p>Enfin, au sein du pipeline d&rsquo;ing\u00e9nierie statistique, la sommation par groupe intervient comme une phase cruciale de pr\u00e9traitement et de nettoyage. Elle permet d&rsquo;\u00e9tablir des pond\u00e9rations, de d\u00e9river des variables de niveau sup\u00e9rieur (par exemple, calculer le budget total consomm\u00e9 par un d\u00e9partement pour le r\u00e9injecter au niveau de chaque projet) et de cr\u00e9er des indicateurs composites de synth\u00e8se. La ma\u00eetrise de cette \u00e9tape garantit l&rsquo;int\u00e9grit\u00e9 analytique des mod\u00e8les pr\u00e9dictifs d\u00e9ploy\u00e9s en aval.<\/p>\n<h3>1.2 Panorama des paradigmes de traitement disponibles sous SAS<\/h3>\n<p>L&rsquo;une des grandes forces de l&rsquo;environnement <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.sas.com\">SAS<\/a> r\u00e9side dans sa dualit\u00e9 paradigmatique, offrant aux ing\u00e9nieurs le choix entre des logiques de programmation d\u00e9claratives, imp\u00e9ratives et analytiques d\u00e9di\u00e9es. Le paradigme d\u00e9claratif s&rsquo;incarne principalement \u00e0 travers la proc\u00e9dure PROC SQL, qui impl\u00e9mente le standard ANSI du Structured Query Language avec des extensions propri\u00e9taires hautement optimis\u00e9es. Dans ce cadre, le d\u00e9veloppeur sp\u00e9cifie le r\u00e9sultat attendu sans dicter l&rsquo;algorithme sous-jacent, laissant l&rsquo;optimiseur de requ\u00eates d\u00e9terminer le plan d&rsquo;acc\u00e8s aux tables et les algorithmes de jointure ou de hachage les plus appropri\u00e9s.<\/p>\n<p>\u00c0 l&rsquo;inverse, l&rsquo;\u00e9tape DATA incarne un paradigme imp\u00e9ratif, s\u00e9quentiel et proc\u00e9dural gouvern\u00e9 par le vecteur de donn\u00e9es du programme (Program Data Vector &#8211; PDV). Ce mod\u00e8le repose sur une boucle implicite qui lit chaque observation ligne par ligne, permettant un contr\u00f4le granulaire absolu sur chaque cycle d&rsquo;ex\u00e9cution gr\u00e2ce aux instructions de traitement par groupe (BY-Group processing). L&rsquo;ing\u00e9nieur dicte explicitement quand les compteurs doivent \u00eatre r\u00e9initialis\u00e9s, comment les valeurs doivent \u00eatre retenues en m\u00e9moire et \u00e0 quel moment pr\u00e9cis l&rsquo;enregistrement consolid\u00e9 doit \u00eatre \u00e9crit sur le disque.<\/p>\n<p>Entre ces deux approches se trouvent les proc\u00e9dures analytiques pr\u00e9programm\u00e9es, au premier rang desquelles figurent PROC MEANS et PROC SUMMARY. Con\u00e7ues sp\u00e9cifiquement pour le calcul haute performance de statistiques descriptives univari\u00e9es et multivari\u00e9es, ces proc\u00e9dures utilisent des algorithmes C\/C++ internes compil\u00e9s, capables de parall\u00e9liser les calculs statistiques et de g\u00e9n\u00e9rer automatiquement des tables multidimensionnelles complexes sans exiger une \u00e9criture fastidieuse de code algorithmique.<\/p>\n<h3>1.3 Objectifs p\u00e9dagogiques et cadre d&rsquo;\u00e9valuation des performances<\/h3>\n<p>L&rsquo;objectif de cette \u00e9tude est de doter les programmeurs SAS, qu&rsquo;ils soient analystes juniors ou architectes de donn\u00e9es confirm\u00e9s, d&rsquo;une grille de lecture critique pour s\u00e9lectionner la m\u00e9thode d&rsquo;agr\u00e9gation la plus adapt\u00e9e \u00e0 leurs contraintes op\u00e9rationnelles. Le choix d&rsquo;une m\u00e9thode ne doit jamais \u00eatre le fruit du hasard ou d&rsquo;une simple pr\u00e9f\u00e9rence stylistique ; il doit d\u00e9couler d&rsquo;une analyse rigoureuse de la volum\u00e9trie des donn\u00e9es, de l&rsquo;\u00e9tat de pr\u00e9-ordonnancement des tables et de la complexit\u00e9 des regroupements factoriels requis.<\/p>\n<p>Le cadre d&rsquo;\u00e9valuation des performances s&rsquo;articule autour de trois indicateurs syst\u00e8me majeurs : l&#8217;empreinte en m\u00e9moire vive (RAM), le temps processeur (CPU time) et la bande passante d&rsquo;entr\u00e9es-sorties (I\/O). Alors qu&rsquo;une solution d\u00e9clarative sous PROC SQL peut s&rsquo;av\u00e9rer extr\u00eamement concise \u00e0 \u00e9crire, elle peut engendrer un co\u00fbt machine prohibitif si l&rsquo;optimiseur d\u00e9clenche des tris implicites sur des tables de plusieurs centaines de gigaoctets. Inversement, l&rsquo;\u00e9tape DATA s\u00e9quentielle exige un tri pr\u00e9alable explicite (via PROC SORT), d\u00e9pla\u00e7ant la charge de traitement en amont de la cha\u00eene analytique.<\/p>\n<p>Enfin, la rigueur m\u00e9trologique impose d&rsquo;\u00e9valuer la pr\u00e9cision num\u00e9rique et la conservation des m\u00e9tadonn\u00e9es lors de chaque phase de r\u00e9duction. La gestion de l&rsquo;arithm\u00e9tique en virgule flottante double pr\u00e9cision, la pr\u00e9servation des formats d&rsquo;affichage mon\u00e9taires ou temporels et la documentation formelle des attributs de table repr\u00e9sentent des crit\u00e8res d&rsquo;\u00e9valuation tout aussi d\u00e9terminants que la simple vitesse d&rsquo;ex\u00e9cution.<\/p>\n<h2>2. Fondements syntaxiques et structure du jeu de donn\u00e9es de r\u00e9f\u00e9rence<\/h2>\n<h3>2.1 Cr\u00e9ation du jeu de donn\u00e9es d&rsquo;exp\u00e9rimentation via l&rsquo;\u00e9tape DATA<\/h3>\n<p>Pour assurer la reproductibilit\u00e9 exp\u00e9rimentale des concepts th\u00e9oriques d\u00e9velopp\u00e9s dans cet article, nous \u00e9tablissons un jeu de donn\u00e9es de r\u00e9f\u00e9rence standardis\u00e9 simulant les performances sportives d&rsquo;athl\u00e8tes au sein de diff\u00e9rentes franchises. Ce corpus, nomm\u00e9 arbitrairement <code>my_data<\/code>, encapsule \u00e0 la fois des variables qualitatives nominales et des mesures m\u00e9triques continues, reproduisant ainsi les d\u00e9fis classiques d&rsquo;imbrication factorielle observ\u00e9s en entreprise.<\/p>\n<p>L&rsquo;\u00e9tape DATA suivante proc\u00e8de \u00e0 l&rsquo;allocation des types, des longueurs et au chargement des enregistrements \u00e0 partir d&rsquo;un flux textuel brut d\u00e9limit\u00e9 par l&rsquo;instruction <code>datalines<\/code> :<\/p>\n<p>data my_data;<br \/>\n&nbsp;&nbsp;input team $ position $ points;<br \/>\n&nbsp;&nbsp;datalines;<br \/>\nA Guard 12<br \/>\nA Guard 20<br \/>\nA Guard 22<br \/>\nA Forward 14<br \/>\nA Forward 16<br \/>\nA Forward 10<br \/>\nB Guard 20<br \/>\nB Guard 22<br \/>\nB Forward 25<br \/>\nB Forward 17<br \/>\nB Forward 25<br \/>\n;<br \/>\nrun;<\/p>\n<p>Dans cette structure, la variable nominale <code>team<\/code> code l&rsquo;appartenance \u00e0 l&rsquo;entit\u00e9 collective (\u00e9quipes A et B), la variable <code>position<\/code> qualifie le r\u00f4le tactique sur le terrain (Guard ou Forward), et la variable quantitative <code>points<\/code> enregistre les r\u00e9alisations m\u00e9triques individuelles. La syntaxe <code>input team $ position $ points;<\/code> indique au compilateur SAS d&rsquo;allouer par d\u00e9faut huit octets pour les cha\u00eenes de caract\u00e8res et huit octets en format flottant double pr\u00e9cision pour la variable num\u00e9rique.<\/p>\n<h3>2.2 Inspection structurelle et validation des donn\u00e9es<\/h3>\n<p>Toute manipulation analytique rigoureuse doit d\u00e9buter par une validation imm\u00e9diate de l&rsquo;int\u00e9grit\u00e9 de la table ainsi mat\u00e9rialis\u00e9e. La proc\u00e9dure PROC PRINT permet d&rsquo;afficher l&rsquo;ensemble des enregistrements dans le journal d&rsquo;ex\u00e9cution ou au sein de la destination de livraison ODS (Output Delivery System), confirmant l&rsquo;alignement s\u00e9quentiel des colonnes et l&rsquo;absence de d\u00e9calage dans la lecture des flux de donn\u00e9es :<\/p>\n<p>proc print data=my_data noobs;<br \/>\nrun;<\/p>\n<p>L&rsquo;inspection des descripteurs de table via la proc\u00e9dure PROC CONTENTS constitue l&rsquo;\u00e9tape subs\u00e9quente incontournable pour auditer les m\u00e9tadonn\u00e9es. L&rsquo;instruction <code>proc contents data=my_data; run;<\/code> r\u00e9v\u00e8le non seulement la structure physique du fichier (pages de donn\u00e9es, encodage des caract\u00e8res, date de cr\u00e9ation), mais v\u00e9rifie \u00e9galement que les types de variables correspondent aux attentes computationnelles. Une erreur classique consisterait \u00e0 importer la variable <code>points<\/code> sous forme de cha\u00eene de caract\u00e8res, ce qui bloquerait toute tentative de sommation ult\u00e9rieure.<\/p>\n<p>L&rsquo;examen empirique de la distribution des scores r\u00e9v\u00e8le onze observations r\u00e9parties de mani\u00e8re asym\u00e9trique : six athl\u00e8tes appartiennent \u00e0 l&rsquo;\u00e9quipe A (trois arri\u00e8res et trois ailiers) et cinq athl\u00e8tes \u00e0 l&rsquo;\u00e9quipe B (deux arri\u00e8res et trois ailiers). Cette configuration d\u00e9s\u00e9quilibr\u00e9e constitue un banc d&rsquo;essai id\u00e9al pour v\u00e9rifier le comportement des algorithmes face \u00e0 des tailles d&rsquo;\u00e9chantillons non uniformes.<\/p>\n<h3>2.3 Propri\u00e9t\u00e9s distributionnelles et classification des variables d&rsquo;agr\u00e9gation<\/h3>\n<p>D&rsquo;un point de vue de la mod\u00e9lisation statistique, les variables de regroupement cat\u00e9gorielles peuvent \u00eatre class\u00e9es selon leur niveau d&rsquo;\u00e9chelle et leur structure d&rsquo;ind\u00e9pendance. Dans notre jeu de donn\u00e9es, nous distinguons une agr\u00e9gation univari\u00e9e (portant uniquement sur la variable <code>team<\/code>) et une agr\u00e9gation multivari\u00e9e ou crois\u00e9e (combinant <code>team<\/code> et <code>position<\/code>). La variable <code>team<\/code> pr\u00e9sente deux modalit\u00e9s exhaustives et mutuellement exclusives, ce qui en fait un facteur fixe binaire.<\/p>\n<p>La relation entre <code>team<\/code> et <code>position<\/code> pr\u00e9sente une structure hi\u00e9rarchique imbriqu\u00e9e ou factorielle crois\u00e9e compl\u00e8te, dans la mesure o\u00f9 chaque modalit\u00e9 de la position tactique est observ\u00e9e au sein de chaque franchise sportive. L&rsquo;orthogonalit\u00e9 des variables de classification garantit que la d\u00e9composition de la variance et la sommation des sous-totaux ne souffrent pas de colin\u00e9arit\u00e9 structurelle ou de cellules vides dans la matrice de contingence sous-jacente.<\/p>\n<p>Comprendre la distribution empirique de la variable m\u00e9trique <code>points<\/code> est \u00e9galement capital : elle ne pr\u00e9sente aucune valeur n\u00e9gative ni valeur aberrante extr\u00eame, mais illustre une variabilit\u00e9 intra-groupe sensible. L&rsquo;\u00e9quipe A affiche des scores variant de 10 \u00e0 22 points, tandis que l&rsquo;\u00e9quipe B pr\u00e9sente des valeurs s&rsquo;\u00e9chelonnant de 17 \u00e0 25 points. Ces caract\u00e9ristiques serviront de bornes de contr\u00f4le pour valider l&rsquo;exactitude de nos calculs d&rsquo;agr\u00e9gation dans les sections suivantes.<\/p>\n<h2>3. Calcul de la somme par un groupe unique avec PROC SQL<\/h2>\n<h3>3.1 Structure syntaxique fondamentale de l&rsquo;instruction GROUP BY<\/h3>\n<p>La proc\u00e9dure PROC SQL impl\u00e9mente une approche ensembliste \u00e9l\u00e9gante pour agr\u00e9ger des donn\u00e9es num\u00e9riques. Contrairement \u00e0 l&rsquo;\u00e9tape DATA, l&rsquo;utilisateur n&rsquo;a pas \u00e0 se pr\u00e9occuper de l&rsquo;ordre s\u00e9quentiel dans lequel les enregistrements sont physiquement stock\u00e9s sur le sous-syst\u00e8me de disques. La syntaxe repose sur l&rsquo;int\u00e9gration harmonieuse de la clause <code>SELECT<\/code>, de la fonction d&rsquo;agr\u00e9gation vectorielle <code>SUM()<\/code> et de la clause d&rsquo;ordonnancement logique <code>GROUP BY<\/code>.<\/p>\n<p>Consid\u00e9rons l&rsquo;impl\u00e9mentation minimale suivante pour agr\u00e9ger les scores selon l&rsquo;unique dimension de l&rsquo;\u00e9quipe :<\/p>\n<p>proc sql;<br \/>\n&nbsp;&nbsp;select team, sum(points) as sum_points<br \/>\n&nbsp;&nbsp;from my_data<br \/>\n&nbsp;&nbsp;group by team;<br \/>\nquit;<\/p>\n<p>Dans ce bloc d&rsquo;instructions, la fonction <code>sum(points)<\/code> ordonne au moteur SQL de condenser toutes les lignes partageant la m\u00eame valeur pour le champ <code>team<\/code> en une observation synth\u00e9tique unique. L&rsquo;op\u00e9rateur <code>as sum_points<\/code> attribue explicitement un alias repr\u00e9sentatif \u00e0 la colonne calcul\u00e9e r\u00e9sultante, \u00e9vitant ainsi la g\u00e9n\u00e9ration automatique de noms de variables opaques ou tronqu\u00e9s par le syst\u00e8me.<\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/sasSum1.jpg\" alt=\"\" \/><\/figure>\n<h3>3.2 Ex\u00e9cution et analyse du traitement univari\u00e9<\/h3>\n<p>Lors de l&rsquo;ex\u00e9cution de cette requ\u00eate, le moteur de traitement SQL de SAS analyse la table source et proc\u00e8de \u00e0 une analyse discriminante des cl\u00e9s de regroupement. Pour l&rsquo;\u00e9quipe A, les scores individuels (12, 20, 22, 14, 16, 10) sont somm\u00e9s pour produire un total arithm\u00e9tique rigoureux de 94 points. Pour l&rsquo;\u00e9quipe B, le cumul des observations (20, 22, 25, 17, 25) g\u00e9n\u00e8re un montant consolid\u00e9 de 109 points.<\/p>\n<p>Sur le plan m\u00e9canique interne, l&rsquo;optimiseur de requ\u00eates SQL (SQL Query Optimizer) \u00e9value si la table est pr\u00e9alablement tri\u00e9e ou index\u00e9e par la variable <code>team<\/code>. En l&rsquo;absence d&rsquo;index sp\u00e9cifique, SAS instancie dynamiquement une structure d&rsquo;arbre binaire ou recourt \u00e0 un algorithme de tri interne en m\u00e9moire temporaire (Hash Grouping ou Sort-Merge Grouping). Ce tri implicite est totalement transparent pour l&rsquo;analyste, mais constitue un facteur de consommation de cycles processeur dont il faut imp\u00e9rativement tenir compte lors du passage \u00e0 l&rsquo;\u00e9chelle industrielle.<\/p>\n<p>Le r\u00e9sultat g\u00e9n\u00e9r\u00e9 par ce traitement univari\u00e9 met imm\u00e9diatement en \u00e9vidence l&rsquo;avantage comparatif de l&rsquo;\u00e9quipe B en termes de volume offensif global (109 points contre 94 pour l&rsquo;\u00e9quipe A), d\u00e9montrant la capacit\u00e9 imm\u00e9diate de la sommation par groupe \u00e0 transformer un tableau de donn\u00e9es brutes en un format d\u00e9cisionnel exploitable.<\/p>\n<h3>3.3 Stockage permanent ou temporaire de la table agr\u00e9g\u00e9e<\/h3>\n<p>Par d\u00e9faut, l&rsquo;ex\u00e9cution d&rsquo;une instruction <code>SELECT<\/code> au sein de PROC SQL dirige l&rsquo;affichage des r\u00e9sultats exclusivement vers la fen\u00eatre d&rsquo;affichage ODS sans cr\u00e9er de table de donn\u00e9es r\u00e9utilisable dans l&rsquo;espace de travail. En programmation d&rsquo;entreprise, il est presque toujours n\u00e9cessaire de mat\u00e9rialiser ce r\u00e9sultat dans une table SAS temporaire (log\u00e9e dans la biblioth\u00e8que <code>WORK<\/code>) ou permanente.<\/p>\n<p>Pour p\u00e9renniser ces agr\u00e9gats, la syntaxe doit \u00eatre enrichie de la directive <code>CREATE TABLE<\/code> comme suit :<\/p>\n<p>proc sql;<br \/>\n&nbsp;&nbsp;create table aggregated_team as<br \/>\n&nbsp;&nbsp;select team, sum(points) as sum_points format=comma8.0 label=&rsquo;Score Total&rsquo;<br \/>\n&nbsp;&nbsp;from my_data<br \/>\n&nbsp;&nbsp;group by team;<br \/>\nquit;<\/p>\n<p>Cette approche conf\u00e8re un contr\u00f4le total sur les attributs de la table cible. L&rsquo;analyste peut associer directement des formats de pr\u00e9sentation (par exemple, <code>format=comma8.0<\/code>) et des libell\u00e9s documentaires (<code>label='Score Total'<\/code>) d\u00e8s la phase de cr\u00e9ation. La table <code>aggregated_team<\/code> devient ainsi un composant structur\u00e9 pr\u00eat \u00e0 \u00eatre consomm\u00e9 par d&rsquo;autres modules de mod\u00e9lisation ou export\u00e9 vers des syst\u00e8mes de bases de donn\u00e9es relationnelles distants.<\/p>\n<h2>4. Calcul de la somme par groupes multiples avec PROC SQL<\/h2>\n<h3>4.1 Extension de la clause GROUP BY \u00e0 plusieurs dimensions factorielles<\/h3>\n<p>L&rsquo;analyse descriptive univari\u00e9e atteint rapidement ses limites lorsqu&rsquo;il s&rsquo;agit de comprendre des ph\u00e9nom\u00e8nes multidimensionnels complexes. Dans de nombreuses situations r\u00e9elles, les donn\u00e9es doivent \u00eatre d\u00e9coup\u00e9es selon une taxonomie hi\u00e9rarchique ou un croisement de plusieurs facteurs d&rsquo;exposition. Sous PROC SQL, l&rsquo;extension du calcul de la somme \u00e0 des groupes multiples s&rsquo;effectue avec une fluidit\u00e9 syntaxique remarquable par l&rsquo;ajout successif de variables dans la clause <code>GROUP BY<\/code>.<\/p>\n<p>Le code suivant illustre l&rsquo;\u00e9valuation simultan\u00e9e de l&rsquo;\u00e9quipe et de la position tactique sur le terrain :<\/p>\n<p>proc sql;<br \/>\n&nbsp;&nbsp;create table aggregated_team_position as<br \/>\n&nbsp;&nbsp;select team, position, sum(points) as sum_points<br \/>\n&nbsp;&nbsp;from my_data<br \/>\n&nbsp;&nbsp;group by team, position;<br \/>\nquit;<\/p>\n<p>L&rsquo;ordre de d\u00e9claration des colonnes au sein de la clause <code>GROUP BY<\/code> d\u00e9finit la granularit\u00e9 du partitionnement logique. Bien que l&rsquo;ordre n&rsquo;affecte pas la valeur arithm\u00e9tique de la somme pour chaque cellule factorielle, il dicte l&rsquo;ordre d&rsquo;imbrication des enregistrements dans la table g\u00e9n\u00e9r\u00e9e, facilitant la lecture humaine ou les jointures ult\u00e9rieures fond\u00e9es sur des cl\u00e9s composites hi\u00e9rarchis\u00e9es.<\/p>\n<h3>4.2 D\u00e9composition granulaire des sous-totaux<\/h3>\n<p>L&rsquo;ex\u00e9cution de cette requ\u00eate crois\u00e9e scinde nos onze observations originales en quatre cellules distinctes correspondant aux intersections cart\u00e9siennes r\u00e9elles pr\u00e9sentes dans l&rsquo;\u00e9chantillon. L&rsquo;analyse des r\u00e9sultats r\u00e9v\u00e8le les distributions sous-jacentes suivantes :<\/p>\n<ul>\n<li><strong>\u00c9quipe A, Forward :<\/strong> la somme des scores (14 + 16 + 10) \u00e9quivaut \u00e0 40 points.<\/li>\n<li><strong>\u00c9quipe A, Guard :<\/strong> la somme des scores (12 + 20 + 22) s&rsquo;\u00e9l\u00e8ve \u00e0 54 points.<\/li>\n<li><strong>\u00c9quipe B, Forward :<\/strong> la somme des scores (25 + 17 + 25) atteint 67 points.<\/li>\n<li><strong>\u00c9quipe B, Guard :<\/strong> la somme des scores (20 + 22) totalise 42 points.<\/li>\n<\/ul>\n<p>Ce niveau de granularit\u00e9 apporte des \u00e9clairages fondamentaux qui demeuraient invisibles au niveau macroscopique univari\u00e9. Si l&rsquo;\u00e9quipe B domine globalement au score g\u00e9n\u00e9ral (109 contre 94), cette sup\u00e9riorit\u00e9 est exclusivement imputable \u00e0 ses joueurs en position \u00ab Forward \u00bb (67 points contre 40 pour l&rsquo;\u00e9quipe A). \u00c0 l&rsquo;inverse, sur le segment tactique \u00ab Guard \u00bb, l&rsquo;\u00e9quipe A surpasse l&rsquo;\u00e9quipe B (54 points contre 42). Ce ph\u00e9nom\u00e8ne illustre l&rsquo;importance capitale du partitionnement factoriel multiple pour \u00e9viter les biais d&rsquo;agr\u00e9gation et le <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/fr.wikipedia.org\/wiki\/Paradoxe_de_Simpson\">paradoxe de Simpson<\/a>.<\/p>\n<h3>4.3 Filtrage post-agr\u00e9gation \u00e0 l&rsquo;aide de la clause HAVING<\/h3>\n<p>Dans de nombreux cas d&rsquo;usage, il est indispensable de restreindre la table de sortie aux seuls groupes dont la somme cumul\u00e9e exc\u00e8de un seuil op\u00e9rationnel sp\u00e9cifique. Les d\u00e9veloppeurs non avertis commettent fr\u00e9quemment l&rsquo;erreur conceptuelle de tenter d&rsquo;ins\u00e9rer des fonctions d&rsquo;agr\u00e9gation au sein de la clause <code>WHERE<\/code>, ce qui d\u00e9clenche imm\u00e9diatement une erreur d&rsquo;analyse syntaxique dans le compilateur SAS.<\/p>\n<p>La r\u00e8gle fondamentale du mod\u00e8le relationnel impose que la clause <code>WHERE<\/code> op\u00e8re comme un filtre pr\u00e9-agr\u00e9gation, agissant ligne par ligne avant le calcul des totaux, tandis que la clause <code>HAVING<\/code> agit strictement en post-agr\u00e9gation, filtrant les r\u00e9sultats une fois les groupes constitu\u00e9s :<\/p>\n<p>proc sql;<br \/>\n&nbsp;&nbsp;select team, position, sum(points) as sum_points<br \/>\n&nbsp;&nbsp;from my_data<br \/>\n&nbsp;&nbsp;group by team, position<br \/>\n&nbsp;&nbsp;having sum_points &gt; 50;<br \/>\nquit;<\/p>\n<p>Dans cet exemple, seules les strates satisfaisant la condition stricte d&rsquo;avoir accumul\u00e9 strictement plus de 50 points seront \u00e9mises dans la table r\u00e9sultante. En l&rsquo;occurrence, le sous-groupe des arri\u00e8res de l&rsquo;\u00e9quipe A (54 points) et celui des ailiers de l&rsquo;\u00e9quipe B (67 points) seront conserv\u00e9s, tandis que les autres cat\u00e9gories seront \u00e9lagu\u00e9es de l&rsquo;ensemble final. Cette s\u00e9gr\u00e9gation pr\u00e9coce optimise consid\u00e9rablement la taille des jeux de donn\u00e9es destin\u00e9s au stockage \u00e0 long terme.<\/p>\n<h2>5. Approche proc\u00e9durale via l&rsquo;\u00e9tape DATA et les variables FIRST. et LAST.<\/h2>\n<h3>5.1 Pr\u00e9requis de tri pr\u00e9alable avec PROC SORT<\/h3>\n<p>L&rsquo;approche s\u00e9quentielle au sein de l&rsquo;\u00e9tape DATA repose sur une m\u00e9canique radicalement diff\u00e9rente de la logique relationnelle de SQL. Pour que SAS puisse ex\u00e9cuter un traitement de groupe via l&rsquo;instruction <code>BY<\/code>, les donn\u00e9es sources doivent imp\u00e9rativement \u00eatre ordonn\u00e9es selon les variables de regroupement, sous peine d&rsquo;interruption imm\u00e9diate du programme par une erreur critique du superviseur SAS.<\/p>\n<p>L&rsquo;ordonnancement rigoureux des donn\u00e9es s&rsquo;effectue par l&rsquo;appel \u00e0 la proc\u00e9dure de tri PROC SORT :<\/p>\n<p>proc sort data=my_data out=my_data_sorted;<br \/>\n&nbsp;&nbsp;by team position;<br \/>\nrun;<\/p>\n<p>Le moteur d&rsquo;ex\u00e9cution de PROC SORT analyse les cl\u00e9s de classification simples ou composites et r\u00e9organise physiquement les pages d&rsquo;enregistrements sur le disque. Cet ordonnancement garantit que tous les enregistrements partageant les m\u00eames valeurs de <code>team<\/code> et <code>position<\/code> deviennent strictement contigus en m\u00e9moire. Cet agencement lin\u00e9aire permet au pointeur de lecture du Program Data Vector de balayer les donn\u00e9es de mani\u00e8re unidirectionnelle, sans jamais n\u00e9cessiter de co\u00fbteux retours en arri\u00e8re dans le flux d&rsquo;entr\u00e9es-sorties.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/sasSum2.jpg\" alt=\"\" \/><\/figure>\n<h3>5.2 M\u00e9canisme d&rsquo;accumulation s\u00e9quentielle avec RETAIN et op\u00e9rateur somme<\/h3>\n<p>Une fois les donn\u00e9es rigoureusement ordonn\u00e9es, l&rsquo;\u00e9tape DATA d\u00e9ploie toute sa puissance algorithmique gr\u00e2ce \u00e0 la combinaison de deux m\u00e9canismes internes : l&rsquo;instruction <code>RETAIN<\/code> (ou son \u00e9quivalent implicite) et les variables temporaires automatiques g\u00e9n\u00e9r\u00e9es par l&rsquo;instruction <code>BY<\/code>, \u00e0 savoir <code>FIRST.variable<\/code> et <code>LAST.variable<\/code>.<\/p>\n<p>Par d\u00e9faut, \u00e0 chaque it\u00e9ration de la boucle de l&rsquo;\u00e9tape DATA, le superviseur r\u00e9initialise toutes les variables num\u00e9riques \u00e0 la valeur manquante (repr\u00e9sent\u00e9e par un point). L&rsquo;op\u00e9rateur de sommation implicite (syntaxe d&rsquo;addition <code>variable + increment;<\/code>) modifie ce comportement par d\u00e9faut : il applique automatiquement une clause de r\u00e9tention en m\u00e9moire \u00e0 la variable d&rsquo;accumulation et convertit silencieusement les \u00e9ventuelles valeurs manquantes en z\u00e9ros arithm\u00e9tiques :<\/p>\n<p>data team_summary (drop=points);<br \/>\n&nbsp;&nbsp;set my_data_sorted;<br \/>\n&nbsp;&nbsp;by team position;<br \/>\n&nbsp;&nbsp;if first.position then sum_points = 0;<br \/>\n&nbsp;&nbsp;sum_points + points;<br \/>\n&nbsp;&nbsp;if last.position then output;<br \/>\nrun;<\/p>\n<p>Dans ce segment de code, lorsque le moteur rencontre la premi\u00e8re observation d&rsquo;une nouvelle position au sein d&rsquo;une \u00e9quipe (<code>first.position = 1<\/code>), le compteur <code>sum_points<\/code> est r\u00e9initialis\u00e9 \u00e0 z\u00e9ro. \u00c0 chaque ligne lue pour ce m\u00eame groupe, l&rsquo;expression <code>sum_points + points;<\/code> incr\u00e9mente le cumulatif. L&rsquo;instruction <code>RETAIN<\/code> implicite emp\u00eache SAS de vider la valeur du compteur entre les cycles de lecture.<\/p>\n<h3>5.3 S\u00e9lection et \u00e9mission des enregistrements agr\u00e9g\u00e9s finaux<\/h3>\n<p>Le contr\u00f4le de l&rsquo;\u00e9criture sur le disque s&rsquo;ex\u00e9cute \u00e0 l&rsquo;aide de la conditionnelle <code>if last.position then output;<\/code>. Dans un traitement par \u00e9tapes s\u00e9quentiel, chaque ligne d&rsquo;origine traverse le vecteur de donn\u00e9es du programme. Si l&rsquo;instruction <code>OUTPUT<\/code> n&rsquo;\u00e9tait pas soumise \u00e0 cette condition, la table de sortie contiendrait l&rsquo;ensemble des observations initiales avec une colonne suppl\u00e9mentaire affichant la progression cumulative de la somme (somme glissante ou running total).<\/p>\n<p>L&rsquo;utilisation judicieuse de <code>last.position<\/code> force l&rsquo;\u00e9criture d&rsquo;une ligne sur le disque uniquement lorsque le pointeur de lecture atteint l&rsquo;ultime observation du sous-groupe factoriel actif. La variable atomique <code>points<\/code> est exclue de la structure finale via l&rsquo;option <code>drop=points<\/code> pour garantir que la table r\u00e9sultante pr\u00e9sente une dimensionnalit\u00e9 strictement identique \u00e0 celle obtenue par la proc\u00e9dure SQL.<\/p>\n<p>Cette approche proc\u00e9durale offre une flexibilit\u00e9 incomparable : elle permet d&rsquo;effectuer des calculs conditionnels hautement personnalis\u00e9s au cours du cycle de sommation, de g\u00e9n\u00e9rer des indicateurs d&rsquo;alertes complexes ou de ventiler simultan\u00e9ment les flux vers plusieurs tables de sortie distinctes \u00e0 l&rsquo;aide de blocs logiques <code>SELECT-WHEN<\/code> ou <code>IF-THEN-ELSE<\/code> impossibles \u00e0 formuler sous une syntaxe SQL standard.<\/p>\n<h2>6. Agr\u00e9gation statistique avanc\u00e9e avec PROC MEANS et PROC SUMMARY<\/h2>\n<h3>6.1 Configuration \u00e9l\u00e9mentaire et choix des instructions de classification<\/h3>\n<p>Les proc\u00e9dures analytiques PROC MEANS et PROC SUMMARY sont sp\u00e9cifiquement con\u00e7ues pour l&rsquo;ing\u00e9nierie statistique et l&rsquo;agr\u00e9gation de masse. Bien qu&rsquo;elles partagent des fondations algorithmiques rigoureusement identiques, leur syntaxe offre deux m\u00e9thodes distinctes pour segmenter les observations : l&rsquo;instruction <code>CLASS<\/code> et l&rsquo;instruction <code>BY<\/code>.<\/p>\n<p>L&rsquo;impl\u00e9mentation classique avec l&rsquo;instruction <code>CLASS<\/code> s&rsquo;articule comme suit :<\/p>\n<p>proc means data=my_data noprint nway;<br \/>\n&nbsp;&nbsp;class team position;<br \/>\n&nbsp;&nbsp;var points;<br \/>\n&nbsp;&nbsp;output out=summary_output (drop=_type_ _freq_) sum=sum_points;<br \/>\nrun;<\/p>\n<p>Contrairement \u00e0 l&rsquo;instruction <code>BY<\/code> qui exige un ordonnancement pr\u00e9alable strict par PROC SORT, l&rsquo;instruction <code>CLASS<\/code> traite les donn\u00e9es sans tri physique obligatoire en construisant une table de hachage interne ou un arbre de combinaison des niveaux factoriels directement en m\u00e9moire vive. L&rsquo;instruction quantitative <code>VAR<\/code> isole les m\u00e9triques num\u00e9riques \u00e0 soumettre au calcul, interdisant le traitement inutile d&rsquo;autres colonnes num\u00e9riques pr\u00e9sentes dans la table source.<\/p>\n<h3>6.2 Extraction vers une table de sortie avec l&rsquo;instruction OUTPUT<\/h3>\n<p>Le c\u0153ur de l&rsquo;automatisation analytique repose sur la clause <code>OUTPUT OUT=<\/code>, qui mat\u00e9rialise les calculs statistiques dans un nouveau jeu de donn\u00e9es. La sp\u00e9cification explicite <code>sum=sum_points<\/code> restreint l&rsquo;op\u00e9ration de calcul \u00e0 la seule sommation num\u00e9rique et renomme le vecteur r\u00e9sultant de mani\u00e8re intelligible.<\/p>\n<p>Par d\u00e9faut, toute proc\u00e9dure de classification SAS g\u00e9n\u00e8re deux variables syst\u00e8me fondamentales :<\/p>\n<ul>\n<li><code>_TYPE_<\/code> : un identifiant binaire ou d\u00e9cimal qui code le niveau d&rsquo;agr\u00e9gation repr\u00e9sent\u00e9 par l&rsquo;enregistrement (par exemple, total g\u00e9n\u00e9ral, sous-total par \u00e9quipe, ou total crois\u00e9 \u00e9quipe-position).<\/li>\n<li><code>_FREQ_<\/code> : une variable de comptage entier indiquant le nombre exact d&rsquo;observations brutes ayant contribu\u00e9 au calcul de la statistique dans cette cellule.<\/li>\n<\/ul>\n<p>L&rsquo;ajout de l&rsquo;option <code>NWAY<\/code> dans l&rsquo;en-t\u00eate de la proc\u00e9dure est une bonne pratique indispensable lorsque l&rsquo;analyste ne d\u00e9sire extraire que le niveau de stratification le plus fin (le croisement complet de toutes les variables <code>CLASS<\/code>), en \u00e9liminant automatiquement tous les sous-totaux marginaux et le grand total g\u00e9n\u00e9ral. L&rsquo;utilisation conjointe de l&rsquo;option de jeu de donn\u00e9es <code>drop=_type_ _freq_<\/code> finalise le nettoyage de la table pour lui conf\u00e9rer une puret\u00e9 structurelle optimale.<\/p>\n<h3>6.3 Diff\u00e9renciation op\u00e9rationnelle entre PROC MEANS et PROC SUMMARY<\/h3>\n<p>Sur le plan historique et architectural, la distinction entre PROC MEANS et PROC SUMMARY est devenue subtile mais demeure essentielle dans les environnements de production industrielle. Par d\u00e9faut, la proc\u00e9dure PROC MEANS est configur\u00e9e pour diriger l&rsquo;impression de ses r\u00e9sultats vers la destination de rapportage ODS active (g\u00e9n\u00e9ration de tableaux HTML, PDF ou texte brut dans le visualiseur de r\u00e9sultats SAS).<\/p>\n<p>\u00c0 l&rsquo;inverse, PROC SUMMARY a \u00e9t\u00e9 historiquement con\u00e7ue pour le travail par lots (batch processing) et n&rsquo;active aucun m\u00e9canisme d&rsquo;affichage par d\u00e9faut. Elle se focalise exclusivement sur la g\u00e9n\u00e9ration silencieuse et ultra-rapide de tables de donn\u00e9es via l&rsquo;instruction <code>OUTPUT<\/code>. Bien que l&rsquo;option <code>NOPRINT<\/code> neutralise l&rsquo;affichage de PROC MEANS, PROC SUMMARY demeure le standard de facto au sein des scripts d&rsquo;ing\u00e9nierie de donn\u00e9es en raison de sa s\u00e9mantique orient\u00e9e production.<\/p>\n<p>De surcro\u00eet, ces deux proc\u00e9dures supportent l&rsquo;option <code>CHARTYPE<\/code>, qui force SAS \u00e0 repr\u00e9senter la variable <code>_TYPE_<\/code> sous forme d&rsquo;une cha\u00eene de caract\u00e8res binaires (ex. \u00ab\u00a011\u00a0\u00bb pour deux facteurs crois\u00e9s), facilitant ainsi le d\u00e9codage programmatique des niveaux hi\u00e9rarchiques lors de l&rsquo;analyse d&rsquo;enqu\u00eates ou de donn\u00e9es censur\u00e9es complexes.<\/p>\n<h2>7. Gestion des donn\u00e9es manquantes et valeurs nulles dans la sommation<\/h2>\n<h3>7.1 Comportement diff\u00e9rentiel face aux valeurs manquantes selon la m\u00e9thode<\/h3>\n<p>L&rsquo;int\u00e9grit\u00e9 d&rsquo;un calcul de sommation d\u00e9pend directement de la fa\u00e7on dont le syst\u00e8me traite les valeurs manquantes (missing values), repr\u00e9sent\u00e9es par un point d&rsquo;interrogation ou un point d\u00e9cimal simple (<code>.<\/code>) en environnement SAS num\u00e9rique. Une disparit\u00e9 fondamentale s\u00e9pare l&rsquo;arithm\u00e9tique directe de l&rsquo;\u00e9tape DATA des fonctions pr\u00e9programm\u00e9es.<\/p>\n<p>Si un analyste utilise l&rsquo;op\u00e9rateur arithm\u00e9tique d&rsquo;addition classique (<code>+<\/code>) au sein d&rsquo;une \u00e9tape DATA s\u00e9quentielle, SAS applique le principe de propagation stricte des valeurs nulles : toute addition impliquant une valeur manquante renvoie inexorablement une valeur manquante (par exemple, <code>5 + . = .<\/code>). Cette caract\u00e9ristique peut alt\u00e9rer de mani\u00e8re silencieuse des calculs d&rsquo;agr\u00e9gation entiers si un seul individu d&rsquo;un sous-groupe n&rsquo;a pas renseign\u00e9 son score.<\/p>\n<p>\u00c0 l&rsquo;oppos\u00e9, tant la fonction SQL <code>sum()<\/code> que la fonction SAS <code>SUM()<\/code> et les proc\u00e9dures MEANS\/SUMMARY ignorent les valeurs manquantes lors de l&rsquo;accumulation arithm\u00e9tique. Si un sous-groupe contient les valeurs 10, 20 et une valeur manquante, la sommation retournera 30, et non une valeur nulle. Ce n&rsquo;est que si l&rsquo;int\u00e9gralit\u00e9 des observations d&rsquo;un sous-groupe est manquante que le r\u00e9sultat final sera \u00e9valu\u00e9 \u00e0 une valeur manquante num\u00e9rique.<\/p>\n<h3>7.2 Option MISSING et conservation des cat\u00e9gories incompl\u00e8tes<\/h3>\n<p>Un \u00e9cueil statistique classique concerne les valeurs manquantes situ\u00e9es non pas dans les variables quantitatives d&rsquo;analyse, mais dans les variables qualitatives de regroupement elles-m\u00eames. Par d\u00e9faut, PROC MEANS, PROC SUMMARY et l&rsquo;\u00e9tape DATA avec instruction <code>CLASS<\/code> excluent syst\u00e9matiquement de l&rsquo;analyse toute observation pr\u00e9sentant une valeur manquante dans l&rsquo;une des variables de classification.<\/p>\n<p>Cette exclusion arbitraire peut introduire un biais de s\u00e9lection s\u00e9v\u00e8re et fausser le rapprochement des effectifs totaux avec la population source. Pour contraindre SAS \u00e0 consid\u00e9rer les valeurs manquantes de regroupement comme des strates analytiques valides \u00e0 part enti\u00e8re, il est imp\u00e9ratif d&rsquo;int\u00e9grer l&rsquo;option <code>MISSING<\/code> dans la d\u00e9claration de la proc\u00e9dure :<\/p>\n<p>proc summary data=my_data missing nway;<br \/>\n&nbsp;&nbsp;class team position;<br \/>\n&nbsp;&nbsp;var points;<br \/>\n&nbsp;&nbsp;output out=summary_with_missing sum=sum_points;<br \/>\nrun;<\/p>\n<p>Sous PROC SQL, la norme relationnelle impose d\u00e9j\u00e0 ce comportement par d\u00e9faut : les valeurs <code>NULL<\/code> au sein d&rsquo;une colonne de partitionnement sont regroup\u00e9es au sein d&rsquo;une cat\u00e9gorie unique. L&rsquo;harmonisation de ces comportements entre les diff\u00e9rentes proc\u00e9dures repr\u00e9sente une \u00e9tape cruciale pour garantir la coh\u00e9rence des indicateurs agr\u00e9g\u00e9s \u00e0 l&rsquo;\u00e9chelle d&rsquo;une entreprise.<\/p>\n<h3>7.3 Audit des agr\u00e9gats pour d\u00e9tecter les biais induits par les valeurs absentes<\/h3>\n<p>Tout rapport analytique professionnel doit int\u00e9grer un protocole d&rsquo;audit permettant d&rsquo;\u00e9valuer la compl\u00e9tude des donn\u00e9es ayant g\u00e9n\u00e9r\u00e9 les sommes de groupe. Se contenter d&rsquo;afficher la somme arithm\u00e9tique sans documenter le taux de couverture des observations expose l&rsquo;analyste \u00e0 de graves erreurs d&rsquo;interpr\u00e9tation manag\u00e9riale ou clinique.<\/p>\n<p>L&rsquo;instruction <code>OUTPUT<\/code> de PROC SUMMARY permet d&rsquo;extraire simultan\u00e9ment la somme, le nombre d&rsquo;observations valides (<code>N<\/code>) et le nombre exact d&rsquo;observations manquantes (<code>NMISS<\/code>) pour chaque cellule de calcul :<\/p>\n<p>proc summary data=my_data nway;<br \/>\n&nbsp;&nbsp;class team;<br \/>\n&nbsp;&nbsp;var points;<br \/>\n&nbsp;&nbsp;output out=audit_aggregation <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;sum=sum_points <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;n=valid_count <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;nmiss=missing_count;<br \/>\nrun;<\/p>\n<p>L&rsquo;\u00e9valuation du ratio <code>missing_count \/ (valid_count + missing_count)<\/code> permet d&rsquo;\u00e9tablir des r\u00e8gles de d\u00e9cision automatis\u00e9es. Si le taux d&rsquo;attrition au sein d&rsquo;un groupe d\u00e9passe un seuil d&rsquo;alerte pr\u00e9d\u00e9fini (par exemple, 15 % de donn\u00e9es non renseign\u00e9es), la somme calcul\u00e9e peut \u00eatre signal\u00e9e comme sujette \u00e0 caution ou r\u00e9orient\u00e9e vers un algorithme d&rsquo;imputation multiple avant validation d\u00e9finitive.<\/p>\n<h2>8. Optimisation des performances sur des volum\u00e9tries massives<\/h2>\n<h3>8.1 Empreinte m\u00e9moire et allocation des ressources d&rsquo;ex\u00e9cution<\/h3>\n<p>Lors du traitement de tables massives renfermant des centaines de millions d&rsquo;enregistrements (telles que des logs de t\u00e9l\u00e9communications ou des flux de transactions financi\u00e8res), l&rsquo;architecture sous-jacente du calcul de somme par groupe d\u00e9termine la viabilit\u00e9 technique du traitement. Le premier param\u00e8tre de r\u00e9gulation r\u00e9side dans l&rsquo;allocation de la m\u00e9moire vive via l&rsquo;option syst\u00e8me <code>MEMSIZE<\/code> et le dimensionnement de la biblioth\u00e8que temporaire <code>WORK<\/code>.<\/p>\n<p>L&rsquo;\u00e9tape DATA s\u00e9quentielle associ\u00e9e \u00e0 un jeu de donn\u00e9es pr\u00e9alablement tri\u00e9 pr\u00e9sente l&#8217;empreinte m\u00e9moire la plus faible et la plus pr\u00e9visible. Dans la mesure o\u00f9 le vecteur de donn\u00e9es du programme ne conserve qu&rsquo;une seule ligne \u00e0 la fois en m\u00e9moire vive (\u00e0 l&rsquo;exception de quelques compteurs d&rsquo;accumulation), l&rsquo;algorithme s&rsquo;ex\u00e9cute selon une complexit\u00e9 spatiale th\u00e9orique en (O(1)). Elle est totalement immunis\u00e9e contre les saturations de m\u00e9moire vive, quelle que soit la taille de la table sur disque.<\/p>\n<p>\u00c0 l&rsquo;inverse, PROC SQL et PROC SUMMARY avec instruction <code>CLASS<\/code> allouent des structures dynamiques en RAM pour cartographier l&rsquo;ensemble des combinaisons factorielles. Si la cardinalit\u00e9 des variables de groupement est tr\u00e8s \u00e9lev\u00e9e (plusieurs millions de modalit\u00e9s uniques), la m\u00e9moire allou\u00e9e peut saturer, contraignant SAS \u00e0 basculer vers des fichiers d&rsquo;\u00e9change temporaires sur disque (spilling). Ce ph\u00e9nom\u00e8ne de pagination induit une chute spectaculaire des d\u00e9bits d&rsquo;entr\u00e9es-sorties et un allongement massif des temps d&rsquo;ex\u00e9cution processeur.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/sasSum3.jpg\" alt=\"\" \/><\/figure>\n<h3>8.2 Utilisation strat\u00e9gique des index pour acc\u00e9l\u00e9rer le partitionnement<\/h3>\n<p>L&rsquo;indexation de la table source constitue un puissant levier d&rsquo;acc\u00e9l\u00e9ration pour les requ\u00eates d&rsquo;agr\u00e9gation, mais son utilisation requiert une compr\u00e9hension fine de l&rsquo;optimiseur SAS. Un index simple ou composite (cr\u00e9\u00e9 via l&rsquo;instruction <code>CREATE INDEX<\/code> sous PROC DATASETS ou PROC SQL) maintient un arbre B (B-Tree) ordonn\u00e9 des valeurs de cl\u00e9s pointant directement vers les num\u00e9ros d&rsquo;enregistrement physiques correspondants.<\/p>\n<p>Lorsqu&rsquo;une proc\u00e9dure SQL soumet une clause <code>GROUP BY<\/code> sur des colonnes index\u00e9es, l&rsquo;optimiseur peut exploiter cet index pour lire les donn\u00e9es dans un ordre d\u00e9j\u00e0 stratifi\u00e9, \u00e9vitant ainsi l&rsquo;ex\u00e9cution d&rsquo;un algorithme de tri lourd et consommateur d&rsquo;I\/O. Toutefois, si la table est fortement fragment\u00e9e sur le disque, la lecture s\u00e9quentielle via un index peut g\u00e9n\u00e9rer des acc\u00e8s disques al\u00e9atoires (random I\/O) qui s&rsquo;av\u00e8rent paradoxalement plus lents qu&rsquo;un balayage s\u00e9quentiel complet (full table scan).<\/p>\n<p>Il est donc pr\u00e9conis\u00e9 d&rsquo;utiliser des index uniquement lorsque la table est volumineuse, que les variables de regroupement pr\u00e9sentent une s\u00e9lectivit\u00e9 optimale, et que les donn\u00e9es physiques sur le disque pr\u00e9sentent un taux de corr\u00e9lation de clustering \u00e9lev\u00e9 avec l&rsquo;index.<\/p>\n<h3>8.3 Techniques de traitement en m\u00e9moire avec les tables de hachage<\/h3>\n<p>Pour les environnements SAS disposant d&rsquo;une large allocation de m\u00e9moire vive, l&rsquo;utilisation des objets de hachage (hash objects) int\u00e9gr\u00e9s \u00e0 l&rsquo;\u00e9tape DATA repr\u00e9sente la m\u00e9thode la plus rapide et la plus sophistiqu\u00e9e pour calculer des sommes par groupe sans aucun tri physique pr\u00e9alable. Cette structure algorithmique impl\u00e9mente une table de dispersion associative en m\u00e9moire dont la complexit\u00e9 de recherche et de mise \u00e0 jour approche le temps constant th\u00e9orique (O(1)).<\/p>\n<p>L&rsquo;extrait de code suivant d\u00e9montre l&rsquo;impl\u00e9mentation industrielle d&rsquo;un hash object d&rsquo;agr\u00e9gation :<\/p>\n<p>data _null_;<br \/>\n&nbsp;&nbsp;if 0 then set my_data(keep=team points);<br \/>\n&nbsp;&nbsp;if _N_ = 1 then do;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;declare hash h(hashexp: 8, ordered: &lsquo;ascending&rsquo;);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;h.defineKey(&lsquo;team&rsquo;);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;h.defineData(&lsquo;team&rsquo;, &lsquo;sum_points&rsquo;);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;h.defineDone();<br \/>\n&nbsp;&nbsp;end;<br \/>\n&nbsp;&nbsp;set my_data end=eof;<br \/>\n&nbsp;&nbsp;if h.find() = 0 then do;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;sum_points = sum_points + points;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;h.replace();<br \/>\n&nbsp;&nbsp;end;<br \/>\n&nbsp;&nbsp;else do;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;sum_points = points;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;h.add();<br \/>\n&nbsp;&nbsp;end;<br \/>\n&nbsp;&nbsp;if eof then h.output(dataset: &lsquo;hash_aggregated_team&rsquo;);<br \/>\nrun;<\/p>\n<p>Cette technique lit la table brute en une seule et unique passe s\u00e9quentielle. Pour chaque enregistrement, SAS interroge la table de hachage en m\u00e9moire. Si l&rsquo;\u00e9quipe existe d\u00e9j\u00e0, le score est cumul\u00e9 et la nouvelle somme est stock\u00e9e via la m\u00e9thode <code>replace()<\/code>. Si la cl\u00e9 est rencontr\u00e9e pour la premi\u00e8re fois, l&rsquo;enregistrement est initialis\u00e9 avec la m\u00e9thode <code>add()<\/code>. \u00c0 la lecture de la derni\u00e8re observation (<code>eof<\/code>), la m\u00e9thode <code>output()<\/code> mat\u00e9rialise l&rsquo;int\u00e9gralit\u00e9 de la synth\u00e8se sur disque. Cette approche surpasse syst\u00e9matiquement PROC SQL et PROC SORT sur les tr\u00e8s grands volumes de donn\u00e9es.<\/p>\n<h2>9. Restructuration et mise en forme des r\u00e9sultats agr\u00e9g\u00e9s<\/h2>\n<h3>9.1 Pivotage des donn\u00e9es agr\u00e9g\u00e9es avec PROC TRANSPOSE<\/h3>\n<p>Les tables issues des processus de sommation sont syst\u00e9matiquement g\u00e9n\u00e9r\u00e9es dans une disposition dite \u00ab longue \u00bb (normalized or tall form), o\u00f9 chaque combinaison factorielle est mat\u00e9rialis\u00e9e par une ligne d&rsquo;enregistrement distincte. Dans de multiples sc\u00e9narios de pr\u00e9sentation ex\u00e9cutive ou de calcul matriciel, il est indispensable de faire pivoter cette structure vers une disposition dite \u00ab large \u00bb (wide form), o\u00f9 une dimension factorielle est transpos\u00e9e en une s\u00e9rie de colonnes d&rsquo;agr\u00e9gats.<\/p>\n<p>La proc\u00e9dure PROC TRANSPOSE permet de r\u00e9aliser cette m\u00e9tamorphose topologique de mani\u00e8re totalement param\u00e9tr\u00e9e :<\/p>\n<p>proc transpose data=aggregated_team_position out=pivoted_summary(drop=_name_);<br \/>\n&nbsp;&nbsp;by team;<br \/>\n&nbsp;&nbsp;id position;<br \/>\n&nbsp;&nbsp;var sum_points;<br \/>\nrun;<\/p>\n<p>Dans cette architecture de transformation, l&rsquo;instruction <code>BY team;<\/code> \u00e9tablit les lignes invariantes du nouveau tableau. L&rsquo;instruction <code>ID position;<\/code> ordonne au transpositeur d&rsquo;utiliser les modalit\u00e9s textuelles de la variable <code>position<\/code> (en l&rsquo;occurrence, \u00ab Forward \u00bb et \u00ab Guard \u00bb) comme intitul\u00e9s norm\u00e9s des nouvelles colonnes num\u00e9riques calcul\u00e9es. L&rsquo;instruction <code>VAR sum_points;<\/code> d\u00e9signe la m\u00e9trique quantitative somm\u00e9e \u00e0 r\u00e9affecter dans les cellules matricielles ainsi cr\u00e9\u00e9es.<\/p>\n<h3>9.2 Formatage et habillage visuel via PROC FORMAT et ODS<\/h3>\n<p>Une somme num\u00e9rique brute d\u00e9pourvue de s\u00e9mantique de mise en forme alt\u00e8re la lisibilit\u00e9 des livrables analytiques. L&rsquo;association de dictionnaires de formats via PROC FORMAT et l&rsquo;exploitation des destinations ODS permettent de transformer des tables SAS d\u00e9pouill\u00e9es en tableaux de bord institutionnels \u00e0 forte valeur ajout\u00e9e.<\/p>\n<p>L&rsquo;ing\u00e9nieur peut encapsuler les r\u00e8gles d&rsquo;habillage num\u00e9rique et de codage des modalit\u00e9s \u00e0 l&rsquo;aide de directives d\u00e9claratives :<\/p>\n<p>proc format;<br \/>\n&nbsp;&nbsp;value $team_desc &lsquo;A&rsquo; = &lsquo;Franchise Atlantique&rsquo; &lsquo;B&rsquo; = &lsquo;Franchise Pacifique&rsquo;;<br \/>\n&nbsp;&nbsp;picture pt_format low-high = &lsquo;000 pts&rsquo; (prefix=&rsquo;Score: &lsquo;);<br \/>\nrun;<br \/>\nods excel file=\u00a0\u00bbRapport_Aggregations.xlsx\u00a0\u00bb style=statistical;<br \/>\nproc print data=aggregated_team noobs label;<br \/>\n&nbsp;&nbsp;format team $team_desc. sum_points pt_format.;<br \/>\n&nbsp;&nbsp;label team = &lsquo;Division Sportive&rsquo; sum_points = &lsquo;Performance Consolid\u00e9e&rsquo;;<br \/>\nrun;<br \/>\nods excel close;<\/p>\n<p>Cette s\u00e9quence assigne des libell\u00e9s exhaustifs, applique un masque de formattage dynamique personnalis\u00e9 (<code>picture format<\/code>) et exporte directement la synth\u00e8se financi\u00e8re ou op\u00e9rationnelle vers une feuille de calcul Excel nativement stylis\u00e9e selon les chartes graphiques statistiques du syst\u00e8me. Cette s\u00e9paration rigoureuse entre la couche de stockage des calculs et la couche de pr\u00e9sentation constitue l&rsquo;un des piliers des architectures de donn\u00e9es professionnelles sous SAS.<\/p>\n<h3>9.3 Normalisation des m\u00e9tadonn\u00e9es des tables de sortie<\/h3>\n<p>Au sein d&rsquo;un entrep\u00f4t de donn\u00e9es d&rsquo;entreprise ou d&rsquo;un lac de donn\u00e9es clinique, les tables de synth\u00e8se agr\u00e9g\u00e9es ne sont jamais isol\u00e9es ; elles alimentent des pipelines de production automatis\u00e9s (batch ETL). La pr\u00e9sence de noms de colonnes anarchiques g\u00e9n\u00e9r\u00e9s automatiquement par des proc\u00e9dures analytiques (tels que <code>_TYPE_<\/code>, <code>_FREQ_<\/code> ou des alias tronqu\u00e9s) constitue un facteur majeur d&rsquo;instabilit\u00e9 logicielle.<\/p>\n<p>La proc\u00e9dure PROC DATASETS offre un cadre unifi\u00e9 et hautement performant pour renommer, r\u00e9\u00e9tiqueter et documenter les tables de sommes sans n\u00e9cessiter de r\u00e9\u00e9criture physique des fichiers de donn\u00e9es :<\/p>\n<p>proc datasets library=work nolist;<br \/>\n&nbsp;&nbsp;modify aggregated_team;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;rename sum_points = total_score_val;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;label total_score_val = \u00ab\u00a0Somme arithm\u00e9tique valid\u00e9e des points 2024\u00a0\u00bb;<br \/>\nquit;<\/p>\n<p>Cette standardisation garantit que les m\u00e9tadonn\u00e9es techniques respectent scrupuleusement le dictionnaire de donn\u00e9es institutionnel. La tra\u00e7abilit\u00e9 des transformations et la stabilit\u00e9 des interfaces de programmation applicative (API) internes de SAS s&rsquo;en trouvent ainsi p\u00e9rennis\u00e9es.<\/p>\n<h2>10. Validation empirique et contr\u00f4le d&rsquo;int\u00e9grit\u00e9 des calculs de sommes<\/h2>\n<h3>10.1 Rapprochement arithm\u00e9tique entre total g\u00e9n\u00e9ral et totaux group\u00e9s<\/h3>\n<p>Le contr\u00f4le de qualit\u00e9 des donn\u00e9es (Data Quality Assurance) impose de v\u00e9rifier l&rsquo;exactitude des calculs de sommation par des m\u00e9canismes de contr\u00f4le de bouclage comptable. L&rsquo;un des principes cardinaux r\u00e9side dans la d\u00e9monstration math\u00e9matique de l&rsquo;\u00e9galit\u00e9 stricte entre le total g\u00e9n\u00e9ral non group\u00e9 de la population cible et la somme int\u00e9grale des sous-totaux factoriels g\u00e9n\u00e9r\u00e9s par groupe.<\/p>\n<p>Toute divergence entre ces deux agr\u00e9gats r\u00e9v\u00e8le syst\u00e9matiquement une anomalie sous-jacente : pr\u00e9sence de doublons cach\u00e9s introduits par de mauvaises jointures cart\u00e9siennes, \u00e9limination silencieuse d&rsquo;enregistrements pr\u00e9sentant des valeurs manquantes dans les cl\u00e9s de classification, ou corruption de pointeurs de lecture. Ce rapprochement peut \u00eatre totalement automatis\u00e9 \u00e0 l&rsquo;aide d&rsquo;un bloc macro conditionnel SAS :<\/p>\n<p>%macro audit_sommes(table_source=, var_analyse=, table_agregee=, var_agregee=);<br \/>\n&nbsp;&nbsp;proc sql noprint;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;select sum(&amp;var_analyse) into :grand_total from &amp;table_source;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;select sum(&amp;var_agregee) into :somme_groupes from &amp;table_agregee;<br \/>\n&nbsp;&nbsp;quit;<br \/>\n&nbsp;&nbsp;%if %sysevalf(&amp;grand_total ne &amp;somme_groupes) %then %do;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;%put ERROR: Incoh\u00e9rence arithm\u00e9tique d\u00e9tect\u00e9e ! Total brut: &amp;grand_total. vs Somme groupes: &amp;somme_groupes.;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;%abort cancel;<br \/>\n&nbsp;&nbsp;%end;<br \/>\n&nbsp;&nbsp;%else %do;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;%put NOTE: Validation arithm\u00e9tique r\u00e9ussie. Bouclage parfait (&amp;grand_total.).;<br \/>\n&nbsp;&nbsp;%end;<br \/>\n%mend audit_sommes;<\/p>\n<p>L&rsquo;int\u00e9gration syst\u00e9matique de telles balises de validation d\u00e9fensive au sein des cha\u00eenes d&rsquo;int\u00e9gration continue prot\u00e8ge l&rsquo;\u00e9cosyst\u00e8me analytique contre la propagation d&rsquo;indicateurs erron\u00e9s dans les rapports r\u00e9glementaires.<\/p>\n<h3>10.2 Techniques de double programmation pour la certification des r\u00e9sultats<\/h3>\n<p>Dans les industries hautement r\u00e9gul\u00e9es, telles que le d\u00e9veloppement clinique de m\u00e9dicaments sous la supervision de l&rsquo;Agence Europ\u00e9enne des M\u00e9dicaments (EMA) ou de la FDA, la norme m\u00e9thodologique exige la pratique de la double programmation ind\u00e9pendante. Cette discipline stipule que deux programmeurs statisticiens doivent produire ind\u00e9pendamment la m\u00eame table agr\u00e9g\u00e9e en utilisant deux m\u00e9thodologies de programmation distinctes (par exemple, PROC SQL versus \u00e9tape DATA ou PROC MEANS).<\/p>\n<p>La confrontation rigoureuse des deux jeux de donn\u00e9es de sortie s&rsquo;op\u00e8re via la proc\u00e9dure de validation d&rsquo;\u00e9lite PROC COMPARE :<\/p>\n<p>proc compare base=aggregated_team compare=summary_output criterion=0.00000001 novalues;<br \/>\n&nbsp;&nbsp;id team;<br \/>\n&nbsp;&nbsp;var sum_points;<br \/>\nrun;<\/p>\n<p>La proc\u00e9dure PROC COMPARE audite chaque cellule de donn\u00e9es ligne par ligne et variable par variable. Le journal d&rsquo;ex\u00e9cution compile un rapport exhaustif attestant de la conformit\u00e9 int\u00e9grale des deux sources ou consignant les moindres divergences d\u00e9tect\u00e9es, qu&rsquo;il s&rsquo;agisse de l\u00e9gers d\u00e9calages d&rsquo;arrondi ou de discordances structurelles dans les cl\u00e9s de classification. Le code de retour syst\u00e8me <code>SYSINFO<\/code> permet d&rsquo;automatiser la signature \u00e9lectronique de conformit\u00e9 du script.<\/p>\n<h3>10.3 Gestion des arrondis et pr\u00e9cision des types de donn\u00e9es num\u00e9riques<\/h3>\n<p>L&rsquo;environnement SAS architecture ses variables num\u00e9riques selon le standard international <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/standards.ieee.org\/ieee\/754\/6027\/\">IEEE 754<\/a> pour la virgule flottante en double pr\u00e9cision sur huit octets (64 bits). Bien que ce syst\u00e8me procure environ 15 \u00e0 17 chiffres significatifs de pr\u00e9cision, l&rsquo;accumulation s\u00e9quentielle de nombres d\u00e9cimaux peut induire des erreurs d&rsquo;arrondi infinit\u00e9simales (floating-point roundoff errors).<\/p>\n<p>Ces anomalies de pr\u00e9cision s&rsquo;expliquent par le fait que certaines fractions d\u00e9cimales (comme 0.1 ou 0.7) ne poss\u00e8dent pas de repr\u00e9sentation binaire exacte finie, se transformant en fractions p\u00e9riodiques infinies en base deux. Lors de sommations r\u00e9p\u00e9t\u00e9es sur des millions de lignes, ces micro-r\u00e9sidus s&rsquo;accumulent et peuvent g\u00e9n\u00e9rer des discordances apparentes lorsqu&rsquo;un op\u00e9rateur logique v\u00e9rifie une condition de stricte \u00e9galit\u00e9 (par exemple, <code>if sum_points = 100.3 then ...<\/code>).<\/p>\n<p>Pour neutraliser totalement ce comportement machine, il est fortement recommand\u00e9 d&rsquo;encapsuler les m\u00e9triques dans la fonction de troncation arithm\u00e9tique <code>ROUND()<\/code> :<\/p>\n<p>sum_points = round(sum_points + points, 0.0001);<\/p>\n<p>Cette pr\u00e9caution math\u00e9matique \u00e9limine le bruit r\u00e9siduel en virgule flottante et pr\u00e9serve l&rsquo;isomorphisme parfait des calculs quel que soit le compilateur ou le syst\u00e8me d&rsquo;exploitation h\u00f4te (Linux, Windows Server ou z\/OS mainframe).<\/p>\n<h2>11. Cas d&rsquo;usage avanc\u00e9s et variations fonctionnelles de sommation<\/h2>\n<h3>11.1 Calcul de sous-totaux et totaux g\u00e9n\u00e9raux avec GROUPING SETS et ROLLUP<\/h3>\n<p>Les rapports d\u00e9cisionnels exigent fr\u00e9quemment la pr\u00e9sentation conjointe de plusieurs niveaux hi\u00e9rarchiques au sein d&rsquo;une seule et m\u00eame structure tabulaire : les d\u00e9tails crois\u00e9s les plus fins, les sous-totaux interm\u00e9diaires par cat\u00e9gorie majeure, et le total g\u00e9n\u00e9ral consolid\u00e9. Historiquement, l&rsquo;obtention d&rsquo;un tel r\u00e9sultat imposait l&rsquo;\u00e9criture de multiples requ\u00eates unies par des clauses <code>UNION ALL<\/code>.<\/p>\n<p>La proc\u00e9dure PROC SQL enrichie des extensions analytiques permet de g\u00e9n\u00e9rer ces hi\u00e9rarchies en une seule passe logique gr\u00e2ce aux op\u00e9rateurs <code>ROLLUP<\/code> et <code>GROUPING SETS<\/code> :<\/p>\n<p>proc sql;<br \/>\n&nbsp;&nbsp;select team, position, sum(points) as sum_points<br \/>\n&nbsp;&nbsp;from my_data<br \/>\n&nbsp;&nbsp;group by rollup(team, position);<br \/>\nquit;<\/p>\n<p>L&rsquo;op\u00e9rateur <code>ROLLUP(team, position)<\/code> g\u00e9n\u00e8re automatiquement trois strates d&rsquo;agr\u00e9gation d\u00e9croissantes :<\/p>\n<ul>\n<li>Le niveau fin : sommes crois\u00e9es pour chaque combinaison unique de <code>team<\/code> et <code>position<\/code>.<\/li>\n<li>Le niveau interm\u00e9diaire : sous-total de chaque <code>team<\/code>, o\u00f9 la variable <code>position<\/code> est assign\u00e9e \u00e0 une valeur nulle.<\/li>\n<li>Le niveau racine : grand total g\u00e9n\u00e9ral de l&rsquo;ensemble du jeu de donn\u00e9es (203 points), o\u00f9 les deux variables de classification sont nulles.<\/li>\n<\/ul>\n<p>Cette compacit\u00e9 syntaxique r\u00e9duit consid\u00e9rablement le co\u00fbt machine en \u00e9vitant des relectures multiples des tables de donn\u00e9es et simplifie l&rsquo;architecture globale des flux de travail d\u00e9cisionnels.<\/p>\n<h3>11.2 Sommation conditionnelle au sein des groupes via l&rsquo;expression CASE WHEN<\/h3>\n<p>Un d\u00e9fi classique d&rsquo;ing\u00e9nierie de donn\u00e9es consiste \u00e0 agr\u00e9ger des donn\u00e9es en appliquant des r\u00e8gles d&rsquo;exclusion ou de pond\u00e9ration diff\u00e9renci\u00e9es selon la valeur d&rsquo;autres attributs, sans scinder la table originale. L&rsquo;imbrication de la fonction d&rsquo;agr\u00e9gation <code>SUM()<\/code> avec l&rsquo;expression conditionnelle <code>CASE WHEN<\/code> sous PROC SQL constitue l&rsquo;un des idiomes de programmation les plus puissants du langage SAS.<\/p>\n<p>Supposons que nous souhaitions segmenter, pour chaque franchise sportive, les points marqu\u00e9s exclusivement lors d&rsquo;actions \u00e0 haute performance (d\u00e9finies arbitrairement comme un score individuel sup\u00e9rieur ou \u00e9gal \u00e0 20 points) par rapport aux points r\u00e9guliers :<\/p>\n<p>proc sql;<br \/>\n&nbsp;&nbsp;create table conditional_aggregation as<br \/>\n&nbsp;&nbsp;select team,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum(points) as total_global,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum(case when points &gt;= 20 then points else 0 end) as points_elite,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum(case when points &lt; 20 then points else 0 end) as points_standard<br \/>\n&nbsp;&nbsp;from my_data<br \/>\n&nbsp;&nbsp;group by team;<br \/>\nquit;<\/p>\n<p>Cette construction permet de vectoriser le traitement logique. En une seule lecture de la table <code>my_data<\/code>, SAS calcule simultan\u00e9ment le volume global et ventile les contributions selon des partitions op\u00e9rationnelles \u00e9tanches. Cette m\u00e9thode \u00e9limine le recours \u00e0 des \u00e9tapes DATA interm\u00e9diaires de filtrage et acc\u00e9l\u00e8re consid\u00e9rablement le temps de calcul global des entrep\u00f4ts de donn\u00e9es.<\/p>\n<h3>11.3 Calculs de pourcentages et poids relatifs intra-groupe<\/h3>\n<p>La sommation par groupe constitue souvent le d\u00e9nominateur fondamental n\u00e9cessaire au calcul de ratios de contribution relative, comme la proportion de points inscrits par chaque joueur au sein de son \u00e9quipe respective. R\u00e9aliser cette op\u00e9ration n\u00e9cessite d&rsquo;associer la somme globale du groupe \u00e0 chaque observation individuelle.<\/p>\n<p>Sous PROC SQL, cette op\u00e9ration s&rsquo;ex\u00e9cute de fa\u00e7on spectaculaire gr\u00e2ce au m\u00e9canisme de r\u00e9-agr\u00e9gation automatique (Remerging Summary Statistics) :<\/p>\n<p>proc sql;<br \/>\n&nbsp;&nbsp;create table team_share as<br \/>\n&nbsp;&nbsp;select team, position, points,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum(points) as team_total,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(points \/ sum(points)) * 100 as pct_of_team format=6.2<br \/>\n&nbsp;&nbsp;from my_data<br \/>\n&nbsp;&nbsp;group by team;<br \/>\nquit;<\/p>\n<p>Lorsque le moteur SQL constate qu&rsquo;une variable individuelle (<code>points<\/code>) coexiste dans la clause <code>SELECT<\/code> avec une statistique agr\u00e9g\u00e9e (<code>sum(points)<\/code>) partitionn\u00e9e par une variable de groupe (<code>team<\/code>), il effectue automatiquement une auto-jointure interne (remerging). SAS calcule d&rsquo;abord la somme de l&rsquo;\u00e9quipe, puis la diffuse sur chaque ligne individuelle appartenant \u00e0 cette \u00e9quipe, permettant ainsi le calcul imm\u00e9diat du pourcentage de contribution relative de chaque joueur. Cette fonctionnalit\u00e9 propri\u00e9taire de SAS SQL \u00e9pargne au d\u00e9veloppeur la complexit\u00e9 d&rsquo;une auto-jointure explicite.<\/p>\n<h2>12. Synth\u00e8se comparative des m\u00e9thodes et arbre d\u00e9cisionnel<\/h2>\n<h3>12.1 Matrice d&rsquo;\u00e9valuation technique et op\u00e9rationnelle<\/h3>\n<p>Pour structurer le choix de l&rsquo;ing\u00e9nieur SAS face aux diff\u00e9rentes technologies d&rsquo;agr\u00e9gation \u00e9tudi\u00e9es tout au long de cet article, il convient de dresser un bilan analytique multicrit\u00e8re \u00e9valuant la compacit\u00e9 syntaxique, la vitesse de traitement, l&rsquo;impact sur les entr\u00e9es-sorties et les contraintes de pr\u00e9-tri.<\/p>\n<ul>\n<li><strong>PROC SQL :<\/strong> Brille par sa concision syntaxique, sa portabilit\u00e9 relationnelle universelle et sa capacit\u00e9 native d&rsquo;auto-jointure (remerging). En revanche, elle pr\u00e9sente une consommation de m\u00e9moire vive difficilement contr\u00f4lable sur des donn\u00e9es massives et peut masquer des op\u00e9rations de tri implicites tr\u00e8s co\u00fbteuses.<\/li>\n<li><strong>\u00c9tape DATA avec BY-Group :<\/strong> Offre un contr\u00f4le algorithmique absolu sur le flux d&rsquo;ex\u00e9cution et une consommation m\u00e9moire quasi-nulle ((O(1))). Toutefois, elle impose un pr\u00e9requis inviolable d&rsquo;ordonnancement physique via PROC SORT et exige un volume de code plus important pour s\u00e9curiser les compteurs avec <code>RETAIN<\/code> et <code>FIRST.\/LAST.<\/code>.<\/li>\n<li><strong>PROC MEANS \/ PROC SUMMARY :<\/strong> Constituent les moteurs de calcul statistique les plus optimis\u00e9s, exploitant le multithreading mat\u00e9riel et offrant une extraction multidimensionnelle native avec l&rsquo;option <code>NWAY<\/code>. Leurs limites tiennent \u00e0 une syntaxe parfois aust\u00e8re pour les non-statisticiens et \u00e0 la production de variables syst\u00e8me (<code>_TYPE_<\/code>, <code>_FREQ_<\/code>) devant \u00eatre \u00e9lagu\u00e9es.<\/li>\n<li><strong>Tables de Hachage en m\u00e9moire (Hash Objects) :<\/strong> Fournissent les performances d&rsquo;ex\u00e9cution les plus fulgurantes en s&rsquo;affranchissant totalement du tri pr\u00e9alable. Leur complexit\u00e9 de mise en \u0153uvre r\u00e9serve cependant leur usage \u00e0 des d\u00e9veloppeurs seniors disposant de serveurs dot\u00e9s d&rsquo;une volum\u00e9trie de RAM g\u00e9n\u00e9reuse.<\/li>\n<\/ul>\n<h3>12.2 Arbre d\u00e9cisionnel pour le choix de la proc\u00e9dure optimale<\/h3>\n<p>L&rsquo;orientation m\u00e9thodologique au sein d&rsquo;un projet analytique SAS peut \u00eatre r\u00e9sum\u00e9e sous forme d&rsquo;une s\u00e9rie de r\u00e8gles de d\u00e9cision logiques rigoureuses :<\/p>\n<p>Si l&rsquo;analyste recherche avant tout la simplicit\u00e9 d&rsquo;\u00e9criture au sein d&rsquo;un flux de donn\u00e9es principalement articul\u00e9 autour de requ\u00eates relationnelles ou doit calculer simultan\u00e9ment des pourcentages de contribution intra-groupe (remerging), <strong>PROC SQL<\/strong> repr\u00e9sente la solution par d\u00e9faut.<\/p>\n<p>Si la table de donn\u00e9es source est d\u00e9j\u00e0 ordonn\u00e9e physiquement par les variables de regroupement ou si le traitement n\u00e9cessite l&rsquo;application de logiques de d\u00e9rivation proc\u00e9durales hautement personnalis\u00e9es au fil de l&rsquo;eau (ventilation multi-tables, r\u00e8gles de gestion m\u00e9tier complexes), <strong>l&rsquo;\u00c9tape DATA avec variables FIRST. et LAST.<\/strong> s&rsquo;impose incontestablement.<\/p>\n<p>Si l&rsquo;objectif consiste \u00e0 g\u00e9n\u00e9rer de multiples indicateurs de dispersion (somme, moyenne, \u00e9cart-type, quantiles) ou \u00e0 analyser les combinaisons de facteurs hi\u00e9rarchiques sans se soucier du tri pr\u00e9alable tout en exploitant la parall\u00e9lisation mat\u00e9rielle, <strong>PROC SUMMARY avec l&rsquo;instruction CLASS et l&rsquo;option NWAY<\/strong> constitue le standard de l&rsquo;industrie.<\/p>\n<p>Enfin, face \u00e0 des volum\u00e9tries de donn\u00e9es massives non tri\u00e9es n\u00e9cessitant une ex\u00e9cution en temps r\u00e9el ou un d\u00e9bit batch contraint, le recours \u00e0 un <strong>Hash Object en \u00e9tape DATA<\/strong> s&rsquo;av\u00e8re le choix d&rsquo;excellence technique absolue.<\/p>\n<h3>12.3 Recommandations et bonnes pratiques de programmation SAS<\/h3>\n<p>Pour assurer la maintenabilit\u00e9 et la robustesse des applications statistiques au fil des cycles de vie logiciels, plusieurs normes de d\u00e9veloppement doivent \u00eatre syst\u00e9matiquement appliqu\u00e9es :<\/p>\n<p>Premi\u00e8rement, bannissez formellement les noms de variables de sortie non document\u00e9s. Tout agr\u00e9gat doit recevoir un alias explicite refl\u00e9tant sa nature arithm\u00e9tique et la variable sous-jacente (par exemple, <code>points_sum<\/code> ou <code>total_points<\/code> au lieu de l&rsquo;intitul\u00e9 g\u00e9n\u00e9rique par d\u00e9faut). Deuxi\u00e8mement, documentez syst\u00e9matiquement la gestion des valeurs manquantes dans les m\u00e9tadonn\u00e9es de production, en utilisant express\u00e9ment l&rsquo;option <code>MISSING<\/code> si les cat\u00e9gories nulles portent une signification analytique.<\/p>\n<p>Troisi\u00e8mement, encapsulez vos s\u00e9quences d&rsquo;agr\u00e9gation r\u00e9currentes dans des macros param\u00e9tr\u00e9es compil\u00e9es, afin d&rsquo;interdire la duplication de code et de propager de mani\u00e8re transparente les optimisations d&rsquo;options syst\u00e8me (telles que <code>BUFSIZE<\/code> ou <code>THREADS<\/code>). Enfin, appliquez syst\u00e9matiquement des protocoles de double validation arithm\u00e9tique avec PROC COMPARE avant tout d\u00e9ploiement en production, garantissant que vos calculs de sommes par groupe demeurent universellement reproductibles, pr\u00e9cis et irr\u00e9prochables.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Cody, R. (2018). <em>Learning SAS by Example: A Programmer&rsquo;s Guide<\/em> (2nd ed.). SAS Institute Inc. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/support.sas.com\/en\/books.html\">https:\/\/support.sas.com\/en\/books.html<\/a><\/li>\n<li>Delwiche, L. D., &amp; Slaughter, S. J. (2019). <em>The Little SAS Book: A Primer<\/em> (6th ed.). SAS Institute Inc. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/support.sas.com\/en\/books.html\">https:\/\/support.sas.com\/en\/books.html<\/a><\/li>\n<li>IEEE. (2019). <em>IEEE Standard for Floating-Point Arithmetic<\/em> (IEEE Std 754-2019). IEEE. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/standards.ieee.org\/ieee\/754\/6027\/\">https:\/\/standards.ieee.org\/ieee\/754\/6027\/<\/a><\/li>\n<li>SAS Institute Inc. (2020). <em>SAS 9.4 SQL Procedure User\u2019s Guide<\/em> (4th ed.). SAS Institute Inc. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\">https:\/\/documentation.sas.com<\/a><\/li>\n<li>SAS Institute Inc. (2021). <em>Base SAS 9.4 Procedures Guide: Statistical Procedures<\/em> (5th ed.). SAS Institute Inc. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\">https:\/\/documentation.sas.com<\/a><\/li>\n<li>Secor, P. (2014). <em>Hash Object Programming in Base SAS<\/em>. SAS Institute Inc. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/support.sas.com\/resources\/papers\/proceedings14\/1480-2014.pdf\">https:\/\/support.sas.com\/resources\/papers\/proceedings14\/1480-2014.pdf<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour calculer la somme par groupe dans SAS via PROC SQL, l&rsquo;\u00e9tape DATA et PROC MEANS, avec optimisation et contr\u00f4le d&rsquo;int\u00e9grit\u00e9.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[9499,359],"tags":[3016,10541,10466,235,10540],"class_list":["post-9499","psych_stat","type-psych_stat","status-publish","hentry","category-programmation-sas","category-statistiques-appliquees","tag-agregation-de-donnees","tag-proc-means","tag-proc-sql","tag-sas","tag-somme-par-groupe"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9499","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=9499"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9499\/revisions"}],"predecessor-version":[{"id":9503,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9499\/revisions\/9503"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9499"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9499"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9499"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}