{"id":9444,"date":"2026-10-14T18:02:31","date_gmt":"2026-10-14T18:02:31","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-compter-observations-par-groupe-sas\/"},"modified":"2026-10-14T18:02:31","modified_gmt":"2026-10-14T18:02:31","slug":"comment-compter-observations-par-groupe-sas","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-compter-observations-par-groupe-sas","title":{"rendered":"Comment compter les observations par groupe dans SAS"},"content":{"rendered":"<p>Dans le domaine de l&rsquo;ing\u00e9nierie statistique et du traitement des donn\u00e9es massives, le d\u00e9nombrement pr\u00e9cis des observations r\u00e9parties au sein de sous-populations constitue un pr\u00e9alable analytique indispensable. Qu&rsquo;il s&rsquo;agisse de valider l&rsquo;int\u00e9grit\u00e9 distributionnelle d&rsquo;un essai clinique soumis aux exigences de la <a rel=\"noopener noreferrer\" href=\"https:\/\/www.fda.gov\">Food and Drug Administration<\/a> ou de garantir l&rsquo;\u00e9quilibrage des strates dans une enqu\u00eate sociologique complexe, la d\u00e9termination exacte des fr\u00e9quences conditionnelles repr\u00e9sente le point d&rsquo;ancrage de toute inf\u00e9rence valide. L&rsquo;environnement logiciel du <a rel=\"noopener noreferrer\" href=\"https:\/\/www.sas.com\">SAS System<\/a>, \u00e9prouv\u00e9 depuis des d\u00e9cennies au sein des industries hautement r\u00e9gul\u00e9es, d\u00e9ploie un \u00e9ventail d&rsquo;architectures algorithmiques con\u00e7ues pour r\u00e9pondre \u00e0 cet imp\u00e9ratif avec une efficacit\u00e9 et une reproductibilit\u00e9 absolues.<\/p>\n<p>Toutefois, la diversit\u00e9 des approches offertes par l&rsquo;\u00e9cosyst\u00e8me SAS &mdash; allant de la flexibilit\u00e9 ensembliste du Structured Query Language (SQL) aux m\u00e9canismes s\u00e9quentiels ultra-optimis\u00e9s de l&rsquo;\u00e9tape DATA, en passant par les proc\u00e9dures d&rsquo;analyse cat\u00e9gorielle et descriptive sp\u00e9cialis\u00e9es &mdash; place fr\u00e9quemment l&rsquo;analyste face \u00e0 un arbitrage d&rsquo;optimisation complexe. Le choix de la m\u00e9thode idoine ne rel\u00e8ve pas simplement d&rsquo;une pr\u00e9f\u00e9rence stylistique de programmation ; il engage directement la gestion de la m\u00e9moire vive, la minimisation des op\u00e9rations d&rsquo;entr\u00e9es-sorties sur disque et la conformit\u00e9 m\u00e9thodologique des structures de donn\u00e9es r\u00e9sultantes. Ce choix d\u00e9pend intrins\u00e8quement de la volum\u00e9trie globale de la table, du nombre de dimensions de regroupement, de la pr\u00e9sence potentielle de valeurs manquantes et des exigences de restitution finale des m\u00e9triques.<\/p>\n<p>Cet article propose un trait\u00e9 m\u00e9thodologique et technique exhaustif d\u00e9di\u00e9 aux techniques de comptage d&rsquo;observations par groupe dans SAS. \u00c0 travers l&rsquo;examen approfondi des paradigmes d\u00e9claratifs, proc\u00e9duraux et s\u00e9quentiels, chaque section d\u00e9taille les structures de code, diss\u00e8que le fonctionnement des moteurs sous-jacents et formule des recommandations concr\u00e8tes d&rsquo;optimisation algorithmique. En s&rsquo;appuyant sur des cas empiriques rigoureusement document\u00e9s, cette analyse fournit aux statisticiens, biostatisticiens et ing\u00e9nieurs de donn\u00e9es les comp\u00e9tences th\u00e9oriques et appliqu\u00e9es n\u00e9cessaires pour concevoir des programmes d&rsquo;agr\u00e9gation robustes, efficients et parfaitement int\u00e9grables au sein de pipelines de production industrielle.<\/p>\n<h2>1. Introduction \u00e0 l&rsquo;agr\u00e9gation et au d\u00e9nombrement cat\u00e9goriel dans SAS<\/h2>\n<h3>1.1 Importance m\u00e9thodologique du comptage d&rsquo;observations<\/h3>\n<p>Dans la d\u00e9marche empirique, le d\u00e9nombrement des unit\u00e9s statistiques selon leurs modalit\u00e9s d&rsquo;appartenance ne constitue pas une simple formalit\u00e9 descriptive, mais un imp\u00e9ratif m\u00e9thodologique de premier ordre. La premi\u00e8re fonction de ce comptage r\u00e9side dans le contr\u00f4le m\u00e9ticuleux de l&rsquo;\u00e9quilibre des cohortes. Dans un essai comparatif randomis\u00e9 ou une \u00e9tude quasi-exp\u00e9rimentale, un d\u00e9s\u00e9quilibre impr\u00e9vu entre les bras de traitement et le groupe t\u00e9moin est souvent le signe d&rsquo;une faille dans le protocole de randomisation ou d&rsquo;un biais d&rsquo;attrition pr\u00e9coce. La v\u00e9rification imm\u00e9diate des effectifs par cellule factorielle permet de s&rsquo;assurer de la validit\u00e9 interne du protocole avant toute estimation des effets causaux.<\/p>\n<p>Par ailleurs, la quantification des volumes d&rsquo;observations conditionnels s&rsquo;av\u00e8re d\u00e9terminante pour la puissance statistique des tests d&rsquo;hypoth\u00e8ses ult\u00e9rieurs. L&rsquo;erreur de type II d\u00e9pend \u00e9troitement de la taille d&rsquo;\u00e9chantillon effective au sein de chaque strate d&rsquo;analyse. Des strates excessivement r\u00e9duites entra\u00eenent une inflation de la variance d&rsquo;\u00e9chantillonnage, r\u00e9duisant consid\u00e9rablement la capacit\u00e9 des mod\u00e8les lin\u00e9aires g\u00e9n\u00e9ralis\u00e9s \u00e0 d\u00e9tecter des diff\u00e9rences statistiquement significatives. D\u00e8s la phase de nettoyage et d&rsquo;exploration, le d\u00e9nombrement cat\u00e9goriel pr\u00e9vient les risques d&rsquo;inf\u00e9rence fallacieuse induits par des cellules sous-repr\u00e9sent\u00e9es.<\/p>\n<p>Enfin, la d\u00e9tection pr\u00e9coce des asym\u00e9tries distributionnelles permet d&rsquo;anticiper les violations des postulats fondamentaux de nombreux mod\u00e8les param\u00e9triques. La pr\u00e9sence de groupes clairsem\u00e9s cr\u00e9e des instabilit\u00e9s num\u00e9riques majeures, notamment lors de l&rsquo;estimation du maximum de vraisemblance dans les r\u00e9gressions logistiques polytomiques ou les mod\u00e8les de risques proportionnels de Cox. Identifier ces asym\u00e9tries d\u00e8s les premi\u00e8res \u00e9tapes du traitement permet d&rsquo;adopter des solutions m\u00e9thodologiques adapt\u00e9es, telles que le regroupement raisonn\u00e9 de modalit\u00e9s, la stratification a posteriori ou le recours \u00e0 des m\u00e9thodes d&rsquo;estimation exactes.<\/p>\n<h3>1.2 Vue d&rsquo;ensemble des architectures de traitement SAS<\/h3>\n<p>Le syst\u00e8me SAS se distingue par la coexistence de paradigmes de traitement fondamentalement diff\u00e9rents pour ex\u00e9cuter des t\u00e2ches d&rsquo;agr\u00e9gation. Le premier paradigme, incarn\u00e9 par la proc\u00e9dure PROC SQL, repose sur une approche d\u00e9clarative. L&rsquo;utilisateur sp\u00e9cifie le r\u00e9sultat attendu au moyen de clauses standardis\u00e9es, d\u00e9l\u00e9guant au compilateur SQL interne de SAS le soin d&rsquo;optimiser le plan d&rsquo;ex\u00e9cution, d&rsquo;ordonnancer les lectures en m\u00e9moire et de structurer le regroupement sans n\u00e9cessiter la gestion explicite d&rsquo;algorithmes de tri pr\u00e9alables.<\/p>\n<p>\u00c0 l&rsquo;oppos\u00e9 de cette approche ensembliste, l&rsquo;\u00e9tape DATA native de SAS fonctionne selon une logique proc\u00e9durale et s\u00e9quentielle. Elle op\u00e8re directement au niveau de la ligne d&rsquo;enregistrement par l&rsquo;interm\u00e9diaire du Program Data Vector (PDV), un espace m\u00e9moire tampon d\u00e9di\u00e9. Cette m\u00e9thode exige une organisation pr\u00e9alable stricte des observations &mdash; g\u00e9n\u00e9ralement assur\u00e9e par un tri pr\u00e9liminaire &mdash; mais conf\u00e8re au programmeur un contr\u00f4le d\u00e9terministe absolu sur chaque cycle de traitement. L&rsquo;acc\u00e8s aux variables automatiques permet une granularit\u00e9 d&rsquo;intervention algorithmique inaccessible via le simple langage d\u00e9claratif SQL.<\/p>\n<p>Entre ces deux extr\u00eames se d\u00e9ploient les proc\u00e9dures d&rsquo;analyse d\u00e9di\u00e9es, telles que PROC FREQ, PROC MEANS et PROC SUMMARY. Ces outils compil\u00e9s en code machine de bas niveau sont hautement optimis\u00e9s pour des calculs statistiques sp\u00e9cifiques. Tandis que PROC FREQ excelle dans l&rsquo;analyse de tableaux de contingence et le calcul rapide de pourcentages associ\u00e9s, la famille MEANS\/SUMMARY tire parti d&rsquo;arborescences de segmentation en m\u00e9moire particuli\u00e8rement v\u00e9loces. Le choix entre ces architectures d\u00e9pend de la typologie des donn\u00e9es, des volumes \u00e0 traiter et des contraintes d&rsquo;infrastructure.<\/p>\n<h3>1.3 Pr\u00e9sentation du jeu de donn\u00e9es exp\u00e9rimental<\/h3>\n<p>Pour illustrer concr\u00e8tement ces m\u00e9thodologies d&rsquo;agr\u00e9gation, nous d\u00e9finissons un cadre exp\u00e9rimental standardis\u00e9 reposant sur une table nomm\u00e9e <code>my_data<\/code>. Ce jeu de donn\u00e9es synth\u00e9tique refl\u00e8te les structures matricielles courantes en recherche clinique et en \u00e9conomie du travail, combinant des variables cat\u00e9gorielles ind\u00e9pendantes et une variable continue d\u00e9pendante. Cette configuration permet de mettre en \u0153uvre des d\u00e9nombrements univari\u00e9s et crois\u00e9s tout en surveillant la distribution de m\u00e9triques quantitatives.<\/p>\n<p>La structure de cette table s&rsquo;articule autour de trois variables principales : <code>equipe<\/code>, une variable textuelle d\u00e9signant l&rsquo;unit\u00e9 structurelle d&rsquo;appartenance (trois modalit\u00e9s : A, B et C) ; <code>poste<\/code>, une seconde variable cat\u00e9gorielle pr\u00e9cisant la fonction op\u00e9rationnelle occup\u00e9e par l&rsquo;individu (deux modalit\u00e9s : Attaque, Defense) ; et <code>score<\/code>, une variable num\u00e9rique continue repr\u00e9sentant une mesure de performance ou un biomarqueur continu. Cette composition cr\u00e9e une grille factorielle \u00e0 six cellules distinctes, id\u00e9ale pour \u00e9valuer la capacit\u00e9 des diff\u00e9rentes m\u00e9thodes \u00e0 g\u00e9rer des segmentations \u00e0 dimensions multiples.<\/p>\n<p>L&rsquo;instanciation de cette table au sein de la biblioth\u00e8que de travail temporaire <code>WORK<\/code> est effectu\u00e9e par une \u00e9tape DATA canonique, imm\u00e9diatement valid\u00e9e par l&rsquo;ex\u00e9cution de la proc\u00e9dure PROC PRINT. Cette validation visuelle confirme le chargement int\u00e8gre des observations et sert de point de r\u00e9f\u00e9rence pour contr\u00f4ler l&rsquo;exactitude des calculs d&rsquo;agr\u00e9gation d\u00e9velopp\u00e9s dans les sections suivantes.<\/p>\n<h2>2. Pr\u00e9paration et structuration pr\u00e9liminaire des donn\u00e9es<\/h2>\n<h3>2.1 Importation et instanciation robuste de la table<\/h3>\n<p>L&rsquo;instanciation d&rsquo;une table d&rsquo;analyse dans SAS requiert une rigueur formelle absolue, particuli\u00e8rement lors de la d\u00e9claration des attributs de colonnes. L&rsquo;utilisation conjointe des instructions <code>INPUT<\/code> et <code>DATALINES<\/code> permet d&rsquo;injecter des donn\u00e9es directement dans le flux du programme. Lors de cette op\u00e9ration, la d\u00e9finition explicite du type et de la longueur allou\u00e9e aux variables \u00e9vite les instabilit\u00e9s d&rsquo;encodage et les corruptions silencieuses lors des comparaisons de cha\u00eenes de caract\u00e8res.<\/p>\n<p>Pour notre jeu de donn\u00e9es, la variable <code>equipe<\/code> est configur\u00e9e comme une cha\u00eene d&rsquo;un caract\u00e8re, tandis que la variable <code>poste<\/code> n\u00e9cessite une r\u00e9servation m\u00e9moire d&rsquo;au moins sept octets pour contenir la modalit\u00e9 <code>Defense<\/code> sans troncature. La variable <code>score<\/code> est d\u00e9clar\u00e9e selon un format num\u00e9rique standard SAS \u00e0 virgule flottante sur 8 octets. Le code d&rsquo;initialisation suivant \u00e9tablit la table <code>my_data<\/code> :<\/p>\n<p><code>DATA my_data;<br \/>\n&nbsp;&nbsp;LENGTH equipe $ 1 poste $ 7 score 8;<br \/>\n&nbsp;&nbsp;INPUT equipe $ poste $ score;<br \/>\n&nbsp;&nbsp;DATALINES;<br \/>\nA Attaque 12<br \/>\nA Attaque 15<br \/>\nA Defense 22<br \/>\nB Attaque 18<br \/>\nB Defense 10<br \/>\nB Defense 29<br \/>\nC Attaque 33<br \/>\nC Defense 41<br \/>\n;<br \/>\nRUN;<\/code><\/p>\n<p>Cette d\u00e9claration explicite garantit l&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle d\u00e8s le chargement en m\u00e9moire vive. Elle \u00e9limine les ambigu\u00eft\u00e9s d&rsquo;assignation automatique de type que le moteur SAS applique par d\u00e9faut lorsqu&rsquo;aucune instruction <code>LENGTH<\/code> n&rsquo;est fournie.<\/p>\n<h3>2.2 Validation de la structure via PROC CONTENTS et PROC PRINT<\/h3>\n<p>Avant d&rsquo;engager tout calcul d&rsquo;effectifs, il est indispensable de valider les m\u00e9tadonn\u00e9es de la table nouvellement cr\u00e9\u00e9e. La proc\u00e9dure PROC CONTENTS joue ici un r\u00f4le pr\u00e9pond\u00e9rant en offrant une radiographie compl\u00e8te du descripteur de fichier SAS. Elle permet de certifier que les variables cat\u00e9gorielles poss\u00e8dent des longueurs uniformes et que le moteur de stockage n&rsquo;a pas introduit d&rsquo;attributs impr\u00e9vus susceptibles de fausser les op\u00e9rations d&rsquo;\u00e9quivalence logique au sein des clauses de regroupement.<\/p>\n<p><code>PROC CONTENTS DATA=my_data;<br \/>\nRUN;<\/code><\/p>\n<p>L&rsquo;examen du journal d&rsquo;ex\u00e9cution et de la sortie g\u00e9n\u00e9r\u00e9e permet de v\u00e9rifier la conformit\u00e9 du moteur d&rsquo;acc\u00e8s, la page de code utilis\u00e9e, ainsi que le nombre total d&rsquo;observations physiques stock\u00e9es dans la table (ici <em>N = 8<\/em>). Simultan\u00e9ment, la proc\u00e9dure PROC PRINT valide l&rsquo;ordonnancement s\u00e9quentiel initial des donn\u00e9es et l&rsquo;absence de d\u00e9calage dans la lecture des flux d\u00e9limit\u00e9s par des espaces :<\/p>\n<p><code>PROC PRINT DATA=my_data NOOBS;<br \/>\nRUN;<\/code><\/p>\n<p>L&rsquo;utilisation de l&rsquo;option <code>NOOBS<\/code> supprime l&rsquo;affichage de la colonne des num\u00e9ros d&rsquo;enregistrement s\u00e9quentiels, concentrant la restitution sur les composantes structurelles de la matrice. L&rsquo;inspection conjointe du dictionnaire de m\u00e9tadonn\u00e9es et des enregistrements confirme la bonne conformit\u00e9 de la structure avant d&rsquo;aborder les processus d&rsquo;agr\u00e9gation.<\/p>\n<h3>2.3 Gestion des espaces et de la casse dans les identifiants de groupe<\/h3>\n<p>L&rsquo;une des causes les plus courantes de biais lors du d\u00e9nombrement par groupe provient de variations typographiques invisibles dans les identifiants textuels. Des espaces r\u00e9siduels de d\u00e9but ou de fin de cha\u00eene, ou encore une instabilit\u00e9 de casse (minuscules et majuscules m\u00e9lang\u00e9es), incitent le compilateur SAS \u00e0 consid\u00e9rer comme distinctes des modalit\u00e9s en r\u00e9alit\u00e9 identiques. Ce ph\u00e9nom\u00e8ne entra\u00eene une fragmentation artificielle des cat\u00e9gories et fausse gravement la distribution des effectifs.<\/p>\n<p>Pour pr\u00e9venir ce risque d&rsquo;erreur, une \u00e9tape de nettoyage pr\u00e9alable utilisant les fonctions <code>UPCASE<\/code> et <code>STRIP<\/code> est recommand\u00e9e. La fonction <code>UPCASE<\/code> uniformise la typographie en convertissant l&rsquo;ensemble des caract\u00e8res alphab\u00e9tiques en capitales, tandis que la fonction <code>STRIP<\/code> \u00e9limine l&rsquo;int\u00e9gralit\u00e9 des espaces situ\u00e9s en t\u00eate et en queue de cha\u00eene :<\/p>\n<p><code>DATA my_data_clean;<br \/>\n&nbsp;&nbsp;SET my_data;<br \/>\n&nbsp;&nbsp;equipe = STRIP(UPCASE(equipe));<br \/>\n&nbsp;&nbsp;poste = STRIP(UPCASE(poste));<br \/>\nRUN;<\/code><\/p>\n<p>De plus, l&rsquo;encodage des caract\u00e8res (par exemple UTF-8 ou Latin1\/Wlatin1) et la table de collation sous-jacente d\u00e9terminent la mani\u00e8re dont le moteur SAS \u00e9value l&rsquo;\u00e9galit\u00e9 entre deux cha\u00eenes. Dans un environnement multilingue, des caract\u00e8res accentu\u00e9s ou des r\u00e8gles d&rsquo;ordonnancement r\u00e9gionales diff\u00e9rentes peuvent scinder des groupes identiques. Une normalisation pr\u00e9ventive en amont de toute agr\u00e9gation assure une classification rigoureuse des facteurs.<\/p>\n<h2>3. D\u00e9nombrement \u00e0 facteur unique avec PROC SQL<\/h2>\n<h3>3.1 Syntaxe fondamentale de la clause GROUP BY<\/h3>\n<p>Le module PROC SQL impl\u00e9mente le standard ANSI SQL au c\u0153ur de SAS, offrant une syntaxe d\u00e9clarative reconnue pour les op\u00e9rations d&rsquo;agr\u00e9gation. Lorsqu&rsquo;il s&rsquo;agit de d\u00e9nombrer des observations selon une seule dimension cat\u00e9gorielle, l&rsquo;instruction <code>SELECT<\/code> s&rsquo;associe \u00e0 la fonction scalaire d&rsquo;agr\u00e9gation <code>COUNT(*)<\/code> et \u00e0 la clause <code>GROUP BY<\/code>. La m\u00e9canique interne du moteur SQL op\u00e8re en isolant chaque modalit\u00e9 unique de la variable sp\u00e9cifi\u00e9e, avant de balayer les partitions pour d\u00e9nombrer les enregistrements qui leur sont rattach\u00e9s.<\/p>\n<p><code>PROC SQL;<br \/>\n&nbsp;&nbsp;SELECT equipe, COUNT(*) AS effectif_total<br \/>\n&nbsp;&nbsp;FROM my_data<br \/>\n&nbsp;&nbsp;GROUP BY equipe;<br \/>\nQUIT;<\/code><\/p>\n<p>L&#8217;emploi du s\u00e9lecteur universel <code>COUNT(*)<\/code> garantit la prise en compte de chaque enregistrement physique du groupe, ind\u00e9pendamment de la pr\u00e9sence \u00e9ventuelle de valeurs manquantes dans d&rsquo;autres colonnes de la table. L&rsquo;instruction <code>AS effectif_total<\/code> cr\u00e9e un alias qui assigne une \u00e9tiquette et un nom de colonne explicites au vecteur d&rsquo;agr\u00e9gation. Enfin, l&rsquo;instruction de cl\u00f4ture <code>QUIT;<\/code> est requise : contrairement \u00e0 la majorit\u00e9 des proc\u00e9dures SAS r\u00e9gies par un <code>RUN;<\/code>, PROC SQL maintient son environnement actif en m\u00e9moire jusqu&rsquo;\u00e0 la r\u00e9ception de cet ordre d&rsquo;interruption formel.<\/p>\n<h3>3.2 Application empirique sur une variable de strate unique<\/h3>\n<p>L&rsquo;ex\u00e9cution de la requ\u00eate pr\u00e9c\u00e9dente sur la table <code>my_data<\/code> produit une synth\u00e8se claire de la distribution des observations entre les diff\u00e9rentes \u00e9quipes. L&rsquo;examen des r\u00e9sultats permet de constater que l&rsquo;\u00e9quipe A compte exactement trois observations, l&rsquo;\u00e9quipe B rassemble trois observations, et l&rsquo;\u00e9quipe C totalise deux observations. L&rsquo;addition de ces sous-totaux donne bien un total de huit, validant la conservation exhaustive de la population d&rsquo;origine.<\/p>\n<p>L&rsquo;analyse de ces strates met en lumi\u00e8re l&rsquo;\u00e9quivalence d&rsquo;effectif entre les unit\u00e9s A et B, tandis que l&rsquo;unit\u00e9 C pr\u00e9sente un sous-\u00e9chantillonnage relatif d&rsquo;un tiers. Dans un contexte exp\u00e9rimental r\u00e9el, cette l\u00e9g\u00e8re asym\u00e9trie appellerait une analyse des causes : s&rsquo;agit-il d&rsquo;un taux de non-r\u00e9ponse plus \u00e9lev\u00e9, d&rsquo;un recrutement plus difficile ou d&rsquo;un d\u00e9s\u00e9quilibre inh\u00e9rent \u00e0 la structure de la population cible ? PROC SQL r\u00e9v\u00e8le instantan\u00e9ment ces \u00e9carts d\u00e8s le premier niveau d&rsquo;agr\u00e9gation.<\/p>\n<p>Le moteur SQL de SAS calcule automatiquement ces agr\u00e9gats sans exiger de tri pr\u00e9alable sur la table source. Il instancie en coulisses une structure d&rsquo;arborescence binaire ou une table de hachage temporaire en m\u00e9moire vive, optimisant ainsi le calcul d&rsquo;effectifs pour les volum\u00e9tries mod\u00e9r\u00e9es sans surco\u00fbt d&rsquo;op\u00e9rations d&rsquo;entr\u00e9es-sorties sur le disque de stockage.<\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/count11.jpg\" alt=\"\" \/><\/figure>\n<h3>3.3 Cr\u00e9ation d&rsquo;une table p\u00e9renne des effectifs group\u00e9s<\/h3>\n<p>Si la visualisation interactive des r\u00e9sultats dans la fen\u00eatre de sortie est pratique lors des phases exploratoires, la production de pipelines analytiques fiables impose la sauvegarde syst\u00e9matique de ces agr\u00e9gats dans une table SAS p\u00e9renne. L&rsquo;instruction <code>CREATE TABLE<\/code> r\u00e9pond pr\u00e9cis\u00e9ment \u00e0 cette exigence en redirigeant le flux de donn\u00e9es agr\u00e9g\u00e9es vers un ensemble de donn\u00e9es r\u00e9utilisable par d&rsquo;autres \u00e9tapes analytiques ult\u00e9rieures.<\/p>\n<p><code>PROC SQL;<br \/>\n&nbsp;&nbsp;CREATE TABLE work.comptage_equipe AS<br \/>\n&nbsp;&nbsp;SELECT equipe, COUNT(*) AS nombre_lignes<br \/>\n&nbsp;&nbsp;FROM my_data<br \/>\n&nbsp;&nbsp;GROUP BY equipe;<br \/>\nQUIT;<\/code><\/p>\n<p>La table <code>work.comptage_equipe<\/code> est stock\u00e9e au sein de la biblioth\u00e8que temporaire <code>WORK<\/code>. Elle pr\u00e9sente une architecture compacte de deux colonnes et trois lignes. Pour des op\u00e9rations de jointures ult\u00e9rieures, cette table synth\u00e9tique peut \u00eatre enrichie d&rsquo;un index simple sur la variable <code>equipe<\/code> \u00e0 l&rsquo;aide de l&rsquo;instruction <code>CREATE UNIQUE INDEX<\/code>, maximisant ainsi l&rsquo;efficience des requ\u00eates aval.<\/p>\n<p>Cette approche pr\u00e9sente un avantage d\u00e9terminant sur le plan de la gouvernance des donn\u00e9es : elle permet d&rsquo;isoler les r\u00e9sultats du comptage au sein de structures normalis\u00e9es, pr\u00eates pour des calculs d\u00e9riv\u00e9s tels que le calcul de proportions relatives, la pond\u00e9ration statistique ou l&rsquo;injection dans des mod\u00e8les de propension.<\/p>\n<h2>4. D\u00e9nombrement multivari\u00e9 par croisement de strates avec PROC SQL<\/h2>\n<h3>4.1 Extension de la clause GROUP BY \u00e0 plusieurs dimensions<\/h3>\n<p>L&rsquo;analyse des syst\u00e8mes statistiques complexes implique fr\u00e9quemment la prise en compte conjointe de multiples variables de stratification. La clause <code>GROUP BY<\/code> s&rsquo;adapte \u00e0 cette exigence gr\u00e2ce \u00e0 l&rsquo;incorporation d&rsquo;une liste de variables s\u00e9par\u00e9es par des virgules. D&rsquo;un point de vue conceptuel, cette d\u00e9marche revient \u00e0 calculer l&rsquo;effectif des cellules issues du produit cart\u00e9sien des modalit\u00e9s de chaque facteur de regroupement.<\/p>\n<p><code>PROC SQL;<br \/>\n&nbsp;&nbsp;SELECT equipe, poste, COUNT(*) AS effectif_cellule<br \/>\n&nbsp;&nbsp;FROM my_data<br \/>\n&nbsp;&nbsp;GROUP BY equipe, poste;<br \/>\nQUIT;<\/code><\/p>\n<p>Dans cette requ\u00eate, le moteur de traitement structure son d\u00e9nombrement sur le couple ordonn\u00e9 <em>(equipe, poste)<\/em>. L&rsquo;\u00e9valuation hi\u00e9rarchique s&rsquo;op\u00e8re selon l&rsquo;ordre sp\u00e9cifi\u00e9 dans la clause <code>GROUP BY<\/code>. Le syst\u00e8me proc\u00e8de \u00e0 une premi\u00e8re partition par \u00e9quipe, puis subdivise chacune de ces partitions selon les modalit\u00e9s de la variable <code>poste<\/code>. Cette approche permet une analyse multidimensionnelle tout en conservant une syntaxe compacte et lisible.<\/p>\n<h3>4.2 Analyse empirique des sous-groupes crois\u00e9s<\/h3>\n<p>L&rsquo;ex\u00e9cution de la requ\u00eate crois\u00e9e sur la table <code>my_data<\/code> g\u00e9n\u00e8re une matrice d\u00e9taill\u00e9e r\u00e9v\u00e9lant la r\u00e9partition fine des observations au sein des diff\u00e9rents r\u00f4les op\u00e9rationnels :<\/p>\n<ul>\n<li>L&rsquo;\u00e9quipe A comporte 2 unit\u00e9s en <code>Attaque<\/code> et 1 unit\u00e9 en <code>Defense<\/code>.<\/li>\n<li>L&rsquo;\u00e9quipe B pr\u00e9sente une configuration inverse avec 1 unit\u00e9 en <code>Attaque<\/code> et 2 unit\u00e9s en <code>Defense<\/code>.<\/li>\n<li>L&rsquo;\u00e9quipe C affiche une stricte \u00e9galit\u00e9, avec 1 unit\u00e9 affect\u00e9e \u00e0 l&rsquo;<code>Attaque<\/code> et 1 unit\u00e9 en <code>Defense<\/code>.<\/li>\n<\/ul>\n<p>Cette d\u00e9composition met en lumi\u00e8re des d\u00e9s\u00e9quilibres internes au sein des \u00e9quipes A et B, masqu\u00e9s lors du d\u00e9nombrement univari\u00e9 pr\u00e9c\u00e9dent qui affichait un effectif global identique de trois individus pour chacune. L&rsquo;analyse crois\u00e9e d\u00e9montre ainsi toute son utilit\u00e9 pour d\u00e9tecter des allocations asym\u00e9triques susceptibles d&rsquo;introduire des facteurs de confusion dans des analyses d&rsquo;inf\u00e9rence non contr\u00f4l\u00e9es.<\/p>\n<p>Elle permet \u00e9galement de v\u00e9rifier la pr\u00e9sence ou l&rsquo;absence de cellules factorielles vides. Dans notre exemple, les six cellules potentielles sont toutes renseign\u00e9es, garantissant la compl\u00e9tude du sch\u00e9ma factoriel pour ces deux variables de stratification.<\/p>\n<h3>4.3 Filtrage conditionnel des groupes via la clause HAVING<\/h3>\n<p>L&rsquo;exploitation de tables volumineuses r\u00e9parties sur de nombreuses strates conduit fr\u00e9quemment \u00e0 la production d&rsquo;une multitude de sous-groupes clairsem\u00e9s dont les effectifs sont insuffisants pour garantir des estimations robustes. Il devient alors n\u00e9cessaire de restreindre la sortie aux seuls groupes d\u00e9passant une taille critique d&rsquo;observations. Dans le paradigme SQL, cette restriction post-agr\u00e9gation ne s&rsquo;effectue pas via la clause <code>WHERE<\/code> &mdash; qui op\u00e8re en amont sur les lignes individuelles &mdash; mais \u00e0 travers l&rsquo;instruction <code>HAVING<\/code>.<\/p>\n<p><code>PROC SQL;<br \/>\n&nbsp;&nbsp;SELECT equipe, poste, COUNT(*) AS effectif_cellule<br \/>\n&nbsp;&nbsp;FROM my_data<br \/>\n&nbsp;&nbsp;GROUP BY equipe, poste<br \/>\n&nbsp;&nbsp;HAVING COUNT(*) &gt;= 2;<br \/>\nQUIT;<\/code><\/p>\n<p>L&rsquo;instruction <code>HAVING COUNT(*) &gt;= 2<\/code> filtre les groupes agr\u00e9g\u00e9s apr\u00e8s leur calcul complet, excluant les configurations n&rsquo;atteignant pas le seuil fix\u00e9. Dans notre cas, seules les cellules pr\u00e9sentant au moins deux observations sont conserv\u00e9es, \u00e0 savoir le groupe <em>(A, Attaque)<\/em> avec 2 unit\u00e9s et le groupe <em>(B, Defense)<\/em> avec 2 unit\u00e9s. Toutes les autres combinaisons, limit\u00e9es \u00e0 une unit\u00e9, sont \u00e9cart\u00e9es du r\u00e9sultat.<\/p>\n<p>Ce m\u00e9canisme de filtrage dynamique sur les effectifs conditionnels est particuli\u00e8rement pr\u00e9cieux pour s\u00e9curiser les r\u00e9gressions cat\u00e9gorielles, o\u00f9 l&rsquo;introduction de cellules \u00e0 faible effectif ou unitaires peut g\u00e9n\u00e9rer des ph\u00e9nom\u00e8nes de quasi-s\u00e9paration compl\u00e8te des points et compromettre la convergence des estimateurs.<\/p>\n<h2>5. Alternative classique : Utilisation de la proc\u00e9dure PROC FREQ<\/h2>\n<h3>5.1 Syntaxe de l&rsquo;instruction TABLES \u00e0 une dimension<\/h3>\n<p>Dans l&rsquo;arsenal proc\u00e9dural de SAS, la proc\u00e9dure PROC FREQ constitue la m\u00e9thode par excellence pour l&rsquo;analyse des fr\u00e9quences cat\u00e9gorielles. Con\u00e7ue sp\u00e9cifiquement pour le traitement des variables discr\u00e8tes, elle optimise chaque cycle de calcul pour g\u00e9n\u00e9rer non seulement les d\u00e9nombrements bruts, mais \u00e9galement les fr\u00e9quences relatives et cumul\u00e9es. Sa mise en \u0153uvre s&rsquo;articule autour de l&rsquo;instruction fondamentale <code>TABLES<\/code>.<\/p>\n<p><code>PROC FREQ DATA=my_data;<br \/>\n&nbsp;&nbsp;TABLES equipe \/ NOPERCENT NOCUM;<br \/>\nRUN;<\/code><\/p>\n<p>Par d\u00e9faut, PROC FREQ g\u00e9n\u00e8re une grille statistique compl\u00e8te comprenant les effectifs, les pourcentages de population correspondants, les fr\u00e9quences cumul\u00e9es et les pourcentages cumul\u00e9s. L&rsquo;adjonction des options <code>NOPERCENT<\/code> et <code>NOCUM<\/code> \u00e9pure la sortie d&rsquo;affichage en supprimant les colonnes d\u00e9riv\u00e9es pour isoler uniquement les d\u00e9comptes bruts par groupe.<\/p>\n<p>Sur le plan algorithmique, PROC FREQ alloue une m\u00e9moire proportionnelle au nombre de modalit\u00e9s distinctes de la variable analys\u00e9e, et non au volume brut d&rsquo;enregistrements. Cela lui conf\u00e8re une rapidit\u00e9 d&rsquo;ex\u00e9cution souvent sup\u00e9rieure \u00e0 celle de PROC SQL sur des tables massives, tout en garantissant une empreinte m\u00e9moire ma\u00eetris\u00e9e.<\/p>\n<h3>5.2 G\u00e9n\u00e9ration de tableaux crois\u00e9s bidimensionnels<\/h3>\n<p>Pour appr\u00e9hender l&rsquo;interaction entre deux dimensions cat\u00e9gorielles, PROC FREQ utilise l&rsquo;op\u00e9rateur d&rsquo;interaction ast\u00e9risque au sein de l&rsquo;instruction <code>TABLES<\/code>. La combinaison de deux facteurs d\u00e9clenche l&rsquo;\u00e9laboration d&rsquo;un tableau crois\u00e9 bidimensionnel (tableau de contingence), articulant visuellement les effectifs de chaque ligne et colonne.<\/p>\n<p><code>PROC FREQ DATA=my_data;<br \/>\n&nbsp;&nbsp;TABLES equipe * poste \/ NOROW NOCOL NOPERCENT;<br \/>\nRUN;<\/code><\/p>\n<p>Un tableau de contingence brut int\u00e8gre par d\u00e9faut quatre m\u00e9triques au sein de chaque cellule : l&rsquo;effectif brut, le pourcentage global du tableau, le pourcentage en ligne (profil ligne) et le pourcentage en colonne (profil colonne). Si cette richesse analytique est utile, elle nuit parfois \u00e0 la lisibilit\u00e9 des rapports de synth\u00e8se ax\u00e9s sur les seuls volumes. L&rsquo;adjonction des options <code>NOROW<\/code>, <code>NOCOL<\/code> et <code>NOPERCENT<\/code> neutralise l&rsquo;affichage de ces ratios pour concentrer la matrice sur les stricts d\u00e9nombrements physiques.<\/p>\n<p>Cette configuration de PROC FREQ offre une vue d&rsquo;ensemble compacte des effectifs crois\u00e9s, facilitant l&rsquo;\u00e9valuation imm\u00e9diate de la structure d&rsquo;un jeu de donn\u00e9es complexe lors des audits pr\u00e9alables.<\/p>\n<h3>5.3 Exportation des comptages dans une table SAS avec l&rsquo;option OUT=<\/h3>\n<p>L&rsquo;int\u00e9gration des r\u00e9sultats issus de PROC FREQ dans une cha\u00eene automatis\u00e9e de traitement n\u00e9cessite la conversion des grilles d&rsquo;affichage en tables physiques d&rsquo;analyse. Cette transition s&rsquo;op\u00e8re directement \u00e0 l&rsquo;aide de l&rsquo;option <code>OUT=<\/code> positionn\u00e9e sur l&rsquo;instruction <code>TABLES<\/code>.<\/p>\n<p><code>PROC FREQ DATA=my_data NOPRINT;<br \/>\n&nbsp;&nbsp;TABLES equipe * poste \/ OUT=work.frequences_croisees;<br \/>\nRUN;<\/code><\/p>\n<p>L&rsquo;introduction de l&rsquo;option globale <code>NOPRINT<\/code> sur l&rsquo;instruction principale <code>PROC FREQ<\/code> suspend l&rsquo;envoi des flux d&rsquo;affichage vers le sous-syst\u00e8me de restitution (ODS), acc\u00e9l\u00e9rant l&rsquo;ex\u00e9cution et r\u00e9servant les ressources pour l&rsquo;\u00e9criture sur disque. La table de sortie ainsi cr\u00e9\u00e9e, nomm\u00e9e <code>work.frequences_croisees<\/code>, contient syst\u00e9matiquement les variables de regroupement ainsi que deux variables automatiquement g\u00e9n\u00e9r\u00e9es par le moteur :<\/p>\n<ul>\n<li><code>COUNT<\/code> : la variable num\u00e9rique contenant le d\u00e9compte brut des observations pour la cellule concern\u00e9e.<\/li>\n<li><code>PERCENT<\/code> : la variable num\u00e9rique repr\u00e9sentant la proportion relative de la cellule par rapport au total g\u00e9n\u00e9ral.<\/li>\n<\/ul>\n<p>Cette m\u00e9thode allie la robustesse d&rsquo;un calcul optimis\u00e9 \u00e0 la flexibilit\u00e9 d&rsquo;une table d&rsquo;agr\u00e9gats pr\u00eate pour l&rsquo;analyse statistique ou la mod\u00e9lisation ult\u00e9rieure.<\/p>\n<h2>6. Approche s\u00e9quentielle : D\u00e9nombrement via l&rsquo;\u00e9tape DATA et FIRST.\/LAST.<\/h2>\n<h3>6.1 Obligation pr\u00e9alable du tri des donn\u00e9es avec PROC SORT<\/h3>\n<p>Contrairement aux proc\u00e9dures d\u00e9claratives ou d&rsquo;agr\u00e9gation globale qui g\u00e8rent les regroupements en m\u00e9moire de mani\u00e8re autonome, l&rsquo;\u00e9tape DATA native repose sur un mod\u00e8le de balayage s\u00e9quentiel direct. Pour mettre en \u0153uvre des logiques de comptage par groupe via le Program Data Vector (PDV), les observations doivent imp\u00e9rativement \u00eatre ordonn\u00e9es de fa\u00e7on contigu\u00eb selon les cl\u00e9s de regroupement cibl\u00e9es. Cette exigence structurelle impose l&rsquo;ex\u00e9cution pr\u00e9alable de la proc\u00e9dure PROC SORT.<\/p>\n<p><code>PROC SORT DATA=my_data OUT=work.my_data_sorted;<br \/>\n&nbsp;&nbsp;BY equipe poste;<br \/>\nRUN;<\/code><\/p>\n<p>L&rsquo;instruction <code>BY<\/code> sp\u00e9cifie la hi\u00e9rarchie des crit\u00e8res d&rsquo;ordonnancement. Le moteur SAS applique un tri en cascade : la table est d&rsquo;abord ordonn\u00e9e selon les valeurs de la variable <code>equipe<\/code>, puis, pour chaque modalit\u00e9 identique d&rsquo;\u00e9quipe, selon les modalit\u00e9s de la variable <code>poste<\/code>. Cette organisation permet aux enregistrements appartenant \u00e0 un m\u00eame sous-groupe de se succ\u00e9der sans discontinuit\u00e9 sur les pages disque.<\/p>\n<p>Si la table source est volumineuse, cette phase de tri peut mobiliser d&rsquo;importantes ressources d&rsquo;\u00e9change (fichiers temporaires d&rsquo;E\/S) dans l&rsquo;environnement SASWORK. Toutefois, cet investissement initial permet ensuite des lectures s\u00e9quentielles extr\u00eamement rapides lors des \u00e9tapes de calcul ult\u00e9rieures.<\/p>\n<h3>6.2 M\u00e9canisme interne des variables temporaires FIRST. et LAST.<\/h3>\n<p>D\u00e8s lors qu&rsquo;une instruction <code>BY<\/code> est introduite dans une \u00e9tape DATA, le compilateur SAS cr\u00e9e automatiquement deux variables temporaires bool\u00e9ennes pour chaque variable list\u00e9e : <code>FIRST.variable<\/code> et <code>LAST.variable<\/code>. Ces indicateurs, log\u00e9s au sein du Program Data Vector mais non enregistr\u00e9s dans la table finale, constituent les briques de base de l&rsquo;algorithme d&rsquo;agr\u00e9gation s\u00e9quentielle.<\/p>\n<p>La variable <code>FIRST.variable<\/code> prend la valeur binaire 1 au niveau du premier enregistrement marquant l&rsquo;entr\u00e9e dans une nouvelle modalit\u00e9, et 0 pour tous les suivants. Inversement, la variable <code>LAST.variable<\/code> bascule \u00e0 1 au niveau du dernier enregistrement du groupe avant qu&rsquo;une modalit\u00e9 diff\u00e9rente ne soit lue ou que la fin du fichier ne soit atteinte. L&rsquo;exploitation conjointe de ces balises et de l&rsquo;instruction <code>RETAIN<\/code> permet d&rsquo;orchestrer un d\u00e9compte d&rsquo;observations pr\u00e9cis et d\u00e9terministe :<\/p>\n<p><code>DATA work.comptage_data_step;<br \/>\n&nbsp;&nbsp;SET work.my_data_sorted;<br \/>\n&nbsp;&nbsp;BY equipe poste;<br \/>\n&nbsp;&nbsp;RETAIN effectif_groupe;<br \/>\n&nbsp;&nbsp;IF FIRST.poste THEN effectif_groupe = 1;<br \/>\n&nbsp;&nbsp;ELSE effectif_groupe + 1;<br \/>\nRUN;<\/code><\/p>\n<p>L&rsquo;instruction <code>RETAIN<\/code> indique au superviseur SAS de pr\u00e9server la valeur de la variable <code>effectif_groupe<\/code> d&rsquo;une it\u00e9ration de lecture \u00e0 l&rsquo;autre au sein du PDV, annulant la r\u00e9initialisation automatique \u00e0 blanc (valeur manquante) par d\u00e9faut. Lorsque l&rsquo;ex\u00e9cution d\u00e9tecte le d\u00e9but d&rsquo;un nouveau groupe (<code>IF FIRST.poste THEN<\/code>), le compteur est r\u00e9initialis\u00e9 \u00e0 1. Pour les observations subs\u00e9quentes du m\u00eame groupe, le compteur s&rsquo;incr\u00e9mente d&rsquo;une unit\u00e9.<\/p>\n<h3>6.3 Conservation exclusive de l&rsquo;effectif final par groupe<\/h3>\n<p>L&rsquo;algorithme pr\u00e9sent\u00e9 ci-dessus calcule un compteur cumul\u00e9 sur l&rsquo;ensemble des enregistrements individuels. Si l&rsquo;objectif final est de g\u00e9n\u00e9rer une table synth\u00e9tique contenant uniquement le total par cellule &mdash; \u00e0 l&rsquo;instar des r\u00e9sultats fournis par PROC SQL ou PROC FREQ &mdash;, il convient de filtrer la sortie pour ne conserver que la derni\u00e8re observation de chaque partition au moyen de la clause <code>IF LAST.variable THEN OUTPUT<\/code>.<\/p>\n<p><code>DATA work.synthese_groupes(KEEP=equipe poste effectif_total);<br \/>\n&nbsp;&nbsp;SET work.my_data_sorted;<br \/>\n&nbsp;&nbsp;BY equipe poste;<br \/>\n&nbsp;&nbsp;RETAIN effectif_total;<br \/>\n&nbsp;&nbsp;IF FIRST.poste THEN effectif_total = 1;<br \/>\n&nbsp;&nbsp;ELSE effectif_total + 1;<br \/>\n&nbsp;&nbsp;IF LAST.poste THEN OUTPUT;<br \/>\nRUN;<\/code><\/p>\n<p>L&rsquo;instruction <code>OUTPUT<\/code> n&rsquo;est ex\u00e9cut\u00e9e que lorsque le drapeau <code>LAST.poste<\/code> prend la valeur logique 1, isolant ainsi l&rsquo;effectif consolid\u00e9 du groupe. L&rsquo;option <code>KEEP=<\/code> plac\u00e9e sur l&rsquo;en-t\u00eate du jeu de donn\u00e9es \u00e9limine les variables individuelles superflues (telles que <code>score<\/code>) et le marqueur transitoire, ne retenant que les facteurs de stratification et leur d\u00e9nombrement final.<\/p>\n<p>Cette approche s\u00e9quentielle via l&rsquo;\u00e9tape DATA conf\u00e8re une flexibilit\u00e9 algorithmique sans \u00e9gale. Elle permet d&rsquo;int\u00e9grer facilement des conditions m\u00e9tier personnalis\u00e9es au fil de l&rsquo;eau, comme la d\u00e9tection d&rsquo;observations anormales ou le calcul imbriqu\u00e9 d&rsquo;indicateurs composites, sans n\u00e9cessiter de passes d&rsquo;agr\u00e9gation additionnelles.<\/p>\n<h2>7. Agr\u00e9gation descriptive robuste avec PROC MEANS et PROC SUMMARY<\/h2>\n<h3>7.1 Configuration des proc\u00e9dures de synth\u00e8se pour le calcul de l&rsquo;effectif<\/h3>\n<p>Les proc\u00e9dures PROC MEANS et PROC SUMMARY partagent un moteur analytique identique orient\u00e9 vers la statistique descriptive. La diff\u00e9rence historique r\u00e9side dans leur cible par d\u00e9faut : PROC MEANS dirige prioritairement ses calculs vers la fen\u00eatre de sortie standard, tandis que PROC SUMMARY a \u00e9t\u00e9 con\u00e7ue pour produire de mani\u00e8re optimis\u00e9e des tables de donn\u00e9es synth\u00e9tiques sans g\u00e9n\u00e9rer d&rsquo;affichage. Pour d\u00e9nombrer les observations, ces proc\u00e9dures s&rsquo;appuient sur la statistique fondamentale <code>N<\/code> (nombre de valeurs non manquantes) ou sur le d\u00e9compte absolu de fr\u00e9quence.<\/p>\n<p><code>PROC SUMMARY DATA=my_data NWAY;<br \/>\n&nbsp;&nbsp;CLASS equipe poste;<br \/>\n&nbsp;&nbsp;OUTPUT OUT=work.resume_summary(DROP=_TYPE_) N=effectif_valide;<br \/>\nRUN;<\/code><\/p>\n<p>L&rsquo;instruction <code>CLASS<\/code> d\u00e9finit les variables de segmentation cat\u00e9gorielle \u00e0 partir desquelles les strates sont form\u00e9es. Contrairement \u00e0 une instruction <code>BY<\/code>, l&rsquo;instruction <code>CLASS<\/code> ne requiert aucun tri pr\u00e9alable des donn\u00e9es, la gestion des croisements s&rsquo;effectuant dynamiquement en m\u00e9moire via des structures d&rsquo;arbres internes.<\/p>\n<p>L&rsquo;option <code>NWAY<\/code> joue un r\u00f4le d\u00e9terminant : elle ordonne \u00e0 la proc\u00e9dure d&rsquo;\u00e9liminer les niveaux d&rsquo;agr\u00e9gation d&rsquo;ordre inf\u00e9rieur (tels que les totaux g\u00e9n\u00e9raux ou marginaux \u00e0 une seule variable) pour restreindre l&rsquo;\u00e9criture aux intersections factorielles les plus fines, correspondant au croisement complet des variables <code>equipe<\/code> et <code>poste<\/code>.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/count12.jpg\" alt=\"\" \/><\/figure>\n<h3>7.2 Structure de la table de sortie et interpr\u00e9tation de _TYPE_ et _FREQ_<\/h3>\n<p>La g\u00e9n\u00e9ration d&rsquo;une table de sortie via l&rsquo;instruction <code>OUTPUT OUT=<\/code> dans PROC MEANS ou PROC SUMMARY enrichit automatiquement les m\u00e9triques demand\u00e9es de deux variables r\u00e9serv\u00e9es g\u00e9n\u00e9r\u00e9es par le syst\u00e8me : <code>_TYPE_<\/code> et <code>_FREQ_<\/code>. La compr\u00e9hension de ces deux indicateurs est essentielle pour manipuler correctement les tables d&rsquo;agr\u00e9gation.<\/p>\n<p>La variable <code>_FREQ_<\/code> contient l&rsquo;effectif absolu d&rsquo;enregistrements rattach\u00e9s \u00e0 chaque ligne de la table d&rsquo;agr\u00e9gation. Elle correspond exactement au volume de donn\u00e9es associ\u00e9es \u00e0 la strate d\u00e9finie, ind\u00e9pendamment de la pr\u00e9sence de valeurs manquantes sur les variables d&rsquo;analyse continue. C&rsquo;est l&rsquo;\u00e9quivalent direct du <code>COUNT(*)<\/code> en syntaxe SQL.<\/p>\n<p>La variable <code>_TYPE_<\/code> est un masque binaire traduit sous forme de nombre entier qui identifie pr\u00e9cis\u00e9ment le niveau de croisement de la ligne. Dans une architecture \u00e0 deux variables <code>CLASS A B<\/code> sans l&rsquo;option <code>NWAY<\/code> :<\/p>\n<ul>\n<li><code>_TYPE_ = 0<\/code> repr\u00e9sente l&rsquo;agr\u00e9gation marginale absolue (le total g\u00e9n\u00e9ral sur toute la table).<\/li>\n<li><code>_TYPE_ = 1<\/code> repr\u00e9sente l&rsquo;agr\u00e9gation partielle selon la derni\u00e8re variable de la classe (la variable B).<\/li>\n<li><code>_TYPE_ = 2<\/code> repr\u00e9sente l&rsquo;agr\u00e9gation partielle selon la premi\u00e8re variable de la classe (la variable A).<\/li>\n<li><code>_TYPE_ = 3<\/code> repr\u00e9sente le croisement complet et simultan\u00e9 des variables A et B.<\/li>\n<\/ul>\n<p>La ma\u00eetrise de la variable <code>_TYPE_<\/code> permet, au sein d&rsquo;une unique extraction statistique, d&rsquo;obtenir simultan\u00e9ment les d\u00e9comptes cellulaires, les totaux de sous-groupes et le d\u00e9nominateur global de l&rsquo;\u00e9chantillon, simplifiant ainsi le calcul subs\u00e9quent de ratios complexes sans multiplier les proc\u00e9dures.<\/p>\n<h3>7.3 Comparaison entre l&rsquo;instruction BY et l&rsquo;instruction CLASS<\/h3>\n<p>L&rsquo;obtention de sous-groupes dans PROC SUMMARY et PROC MEANS peut \u00eatre formul\u00e9e soit \u00e0 travers l&rsquo;instruction <code>CLASS<\/code>, soit via l&rsquo;instruction <code>BY<\/code>. Si les deux conduisent \u00e0 des d\u00e9nombrements similaires, leurs implications computationnelles diff\u00e8rent notablement.<\/p>\n<p>L&rsquo;utilisation de l&rsquo;instruction <code>BY<\/code> requiert un tri pr\u00e9alable exhaustif de la table source via PROC SORT. En contrepartie, le moteur SAS traite les donn\u00e9es groupe par groupe, lib\u00e9rant la m\u00e9moire apr\u00e8s chaque partition. Cette strat\u00e9gie s&rsquo;av\u00e8re particuli\u00e8rement adapt\u00e9e lorsque la m\u00e9moire vive est restreinte ou que le nombre de strates est extr\u00eamement important, \u00e9vitant ainsi les d\u00e9passements de capacit\u00e9 m\u00e9moire.<\/p>\n<p>\u00c0 l&rsquo;inverse, l&rsquo;instruction <code>CLASS<\/code> traite l&rsquo;ensemble des donn\u00e9es sans exiger de tri pr\u00e9alable, mais alloue en contrepartie une arborescence en m\u00e9moire vive capable de conserver l&rsquo;int\u00e9gralit\u00e9 des combinaisons de facteurs. Sur des tables contenant des millions de lignes assorties d&rsquo;une cardinalit\u00e9 cat\u00e9gorielle \u00e9lev\u00e9e, cette m\u00e9thode peut saturer l&rsquo;allocation m\u00e9moire allou\u00e9e \u00e0 la session utilisateur. En revanche, pour des cardinalit\u00e9s faibles \u00e0 mod\u00e9r\u00e9es, l&rsquo;approche <code>CLASS<\/code> offre des performances de calcul nettement sup\u00e9rieures en s&rsquo;affranchissant du co\u00fbt d&rsquo;\u00e9criture et de lecture d&rsquo;une phase de tri interm\u00e9diaire sur disque.<\/p>\n<h2>8. Traitement des valeurs manquantes et des cas particuliers<\/h2>\n<h3>8.1 Comportement diff\u00e9rentiel face aux valeurs manquantes de regroupement<\/h3>\n<p>La gestion des valeurs manquantes repr\u00e9sente un enjeu critique dans l&rsquo;exactitude des calculs d&rsquo;effectifs. Selon les proc\u00e9dures utilis\u00e9es, le moteur SAS adopte des comportements tr\u00e8s diff\u00e9rents face \u00e0 des valeurs absentes dans les variables de groupe, ce qui peut conduire \u00e0 des divergences sensibles dans les r\u00e9sultats si ces m\u00e9canismes ne sont pas ma\u00eetris\u00e9s.<\/p>\n<p>Par d\u00e9faut, la proc\u00e9dure PROC FREQ exclut syst\u00e9matiquement les observations comportant une valeur manquante sur les variables list\u00e9es dans l&rsquo;instruction <code>TABLES<\/code> du calcul de ses effectifs valides et de ses tableaux de contingence. Les observations concern\u00e9es sont alors rel\u00e9gu\u00e9es dans une note explicative en pied de table. Pour contraindre la proc\u00e9dure \u00e0 int\u00e9grer les donn\u00e9es manquantes comme une modalit\u00e9 d&rsquo;analyse \u00e0 part enti\u00e8re, il est n\u00e9cessaire d&rsquo;adjoindre l&rsquo;option <code>MISSING<\/code> :<\/p>\n<p><code>PROC FREQ DATA=my_data;<br \/>\n&nbsp;&nbsp;TABLES equipe * poste \/ MISSING;<br \/>\nRUN;<\/code><\/p>\n<p>\u00c0 l&rsquo;inverse, PROC SQL regroupe par d\u00e9faut toutes les valeurs manquantes d&rsquo;une variable de stratification sous une m\u00eame classe d\u00e9di\u00e9e, consid\u00e9rant la valeur nulle (symbolis\u00e9e par un point pour les donn\u00e9es num\u00e9riques ou une cha\u00eene vide pour les variables textuelles) comme une modalit\u00e9 l\u00e9gitime. Omettre ces divergences de fonctionnement peut introduire des \u00e9carts inattendus lors du rapprochement de r\u00e9sultats calcul\u00e9s par diff\u00e9rentes proc\u00e9dures.<\/p>\n<h3>8.2 Comptage des valeurs manquantes au sein des variables m\u00e9triques<\/h3>\n<p>Une distinction fondamentale doit \u00eatre \u00e9tablie entre le volume d&rsquo;enregistrements rattach\u00e9s \u00e0 une strate et la compl\u00e9tude des variables de mesure associ\u00e9es. Dans le langage SQL impl\u00e9ment\u00e9 par SAS, cette nuance s&rsquo;exprime \u00e0 travers l&rsquo;opposition entre <code>COUNT(*)<\/code> et <code>COUNT(nom_variable)<\/code>.<\/p>\n<p><code>PROC SQL;<br \/>\n&nbsp;&nbsp;SELECT equipe,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNT(*) AS total_lignes,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNT(score) AS scores_valides,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(CASE WHEN score IS NULL THEN 1 ELSE 0 END) AS scores_manquants<br \/>\n&nbsp;&nbsp;FROM my_data<br \/>\n&nbsp;&nbsp;GROUP BY equipe;<br \/>\nQUIT;<\/code><\/p>\n<p>Alors que <code>COUNT(*)<\/code> quantifie le nombre absolu de lignes physiques allou\u00e9es \u00e0 la strate <code>equipe<\/code>, l&rsquo;instruction <code>COUNT(score)<\/code> ignore d\u00e9lib\u00e9r\u00e9ment les enregistrements pour lesquels la variable <code>score<\/code> contient une valeur manquante. Cette divergence fonctionnelle met en \u00e9vidence la diff\u00e9rence entre la repr\u00e9sentativit\u00e9 brute d&rsquo;un groupe et la compl\u00e9tude r\u00e9elle de ses variables quantitatives associ\u00e9es.<\/p>\n<p>La formulation explicite de ratios de compl\u00e9tude &mdash; en confrontant les enregistrements valides aux volumes bruts &mdash; constitue une \u00e9tape m\u00e9thodologique essentielle pour documenter la qualit\u00e9 des donn\u00e9es avant toute mod\u00e9lisation statistique.<\/p>\n<h3>8.3 Gestion des formats d\u00e9finis par l&rsquo;utilisateur avec PROC FORMAT<\/h3>\n<p>L&rsquo;utilisation de formats de restitution personnalis\u00e9s, construits via la proc\u00e9dure PROC FORMAT, modifie en profondeur la granularit\u00e9 du d\u00e9nombrement en cr\u00e9ant des regroupements virtuels de modalit\u00e9s sans alt\u00e9rer la table de donn\u00e9es physique d&rsquo;origine.<\/p>\n<p><code>PROC FORMAT;<br \/>\n&nbsp;&nbsp;VALUE $grpfmt<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;'A', 'B' = 'Groupe Principal'<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;'C' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 'Groupe Secondaire';<br \/>\nRUN;<\/p>\n<p>PROC FREQ DATA=my_data;<br \/>\n&nbsp;&nbsp;FORMAT equipe $grpfmt.;<br \/>\n&nbsp;&nbsp;TABLES equipe;<br \/>\nRUN;<\/code><\/p>\n<p>Dans cet exemple, l&rsquo;application du format <code>$grpfmt.<\/code> agr\u00e8ge les observations des \u00e9quipes A et B au sein d&rsquo;une modalit\u00e9 consolid\u00e9e unique nomm\u00e9e <code>Groupe Principal<\/code>, tandis que l&rsquo;\u00e9quipe C est renomm\u00e9e <code>Groupe Secondaire<\/code>. Le rapport g\u00e9n\u00e9r\u00e9 affichera ainsi 6 observations pour le premier groupe et 2 pour le second.<\/p>\n<p>De surcro\u00eet, lors de l&rsquo;exploitation conjointe de formats d\u00e9finis par l&rsquo;utilisateur et de proc\u00e9dures d&rsquo;agr\u00e9gation telles que PROC SUMMARY ou PROC TABULATE, l&rsquo;option <code>PRELOADFMT<\/code> permet de forcer la pr\u00e9sence dans les tables de sortie de toutes les modalit\u00e9s pr\u00e9vues par le format, y compris celles pour lesquelles aucune observation n&rsquo;existe dans le jeu de donn\u00e9es d&rsquo;entr\u00e9e. Cette fonctionnalit\u00e9 est particuli\u00e8rement utile pour stabiliser les grilles de restitution dans les cha\u00eenes de production de tableaux standards.<\/p>\n<h2>9. Optimisation des performances sur les grands ensembles de donn\u00e9es<\/h2>\n<h3>9.1 Impact du volume sur l&rsquo;efficacit\u00e9 algorithmique<\/h3>\n<p>Lorsque le volume de donn\u00e9es atteint des dizaines de millions d&rsquo;enregistrements ou mobilise plusieurs centaines de gigaoctets, le choix de la m\u00e9thode d&rsquo;agr\u00e9gation a un impact direct sur la consommation des ressources syst\u00e8me. L&rsquo;enjeu technique r\u00e9side dans la r\u00e9duction des op\u00e9rations d&rsquo;entr\u00e9es-sorties (E\/S) sur disque et l&rsquo;optimisation de l&rsquo;espace de stockage temporaire au sein de la biblioth\u00e8que SASWORK.<\/p>\n<p>Le recours \u00e0 une phase de tri pr\u00e9alable par PROC SORT, bien qu&rsquo;efficace pour des structures s\u00e9quentielles, g\u00e9n\u00e8re un co\u00fbt d&rsquo;\u00e9criture proportionnel \u00e0 la taille de la table source. Sur des bases volumineuses, la cr\u00e9ation de fichiers de travail temporaires pour r\u00e9organiser les observations peut rapidement saturer les disques allou\u00e9s et monopoliser les files d&rsquo;attente du processeur.<\/p>\n<p>Pour limiter cette charge, une bonne pratique consiste \u00e0 restreindre la table en amont aux seules variables indispensables \u00e0 l&rsquo;aide de l&rsquo;option <code>KEEP=<\/code> d\u00e8s l&rsquo;\u00e9tape de lecture. Cette s\u00e9lection pr\u00e9coce r\u00e9duit significativement l&#8217;empreinte m\u00e9moire du Program Data Vector et diminue le volume de donn\u00e9es transf\u00e9r\u00e9 sur les disques de travail, acc\u00e9l\u00e9rant ainsi les op\u00e9rations de d\u00e9nombrement aval.<\/p>\n<h3>9.2 Indexation et partitionnement pour acc\u00e9l\u00e9rer les clauses de groupe<\/h3>\n<p>L&rsquo;impl\u00e9mentation d&rsquo;index simples ou composites sur les variables de regroupement constitue un levier d&rsquo;optimisation majeur pour les requ\u00eates ex\u00e9cut\u00e9es via PROC SQL. Lorsqu&rsquo;un index est pr\u00e9sent sur la colonne cible d&rsquo;un <code>GROUP BY<\/code>, l&rsquo;optimisateur de requ\u00eates de SAS peut exploiter directement cette arborescence binaire pour d\u00e9nombrer les enregistrements par modalit\u00e9, sans n\u00e9cessiter un parcours s\u00e9quentiel complet de la table sous-jacente.<\/p>\n<p><code>PROC DATASETS LIBRARY=work NOLIST;<br \/>\n&nbsp;&nbsp;MODIFY my_data;<br \/>\n&nbsp;&nbsp;INDEX CREATE idx_equipe = (equipe);<br \/>\nQUIT;<\/code><\/p>\n<p>L&rsquo;activation de l&rsquo;index \u00e9vite l&rsquo;\u00e9tape de tri interne et permet au moteur d&rsquo;acc\u00e9der directement aux segments pr\u00e9-agr\u00e9g\u00e9s de la table. Les performances peuvent \u00eatre v\u00e9rifi\u00e9es dans le journal SAS en activant les options de diagnostic syst\u00e8me <code>OPTIONS MSGLEVEL=I;<\/code>, qui documentent si l&rsquo;optimisateur a effectivement mobilis\u00e9 l&rsquo;index ou s&rsquo;il a proc\u00e9d\u00e9 \u00e0 un balayage lin\u00e9aire complet.<\/p>\n<p>Dans des contextes industriels reposant sur SAS Scalable Performance Data Server (SPDS) ou des moteurs de stockage partitionn\u00e9s, l&rsquo;alignement des cl\u00e9s de regroupement sur les partitions physiques permet en outre de parall\u00e9liser les lectures, d\u00e9multipliant ainsi les vitesses de traitement sur les infrastructures multi-c\u0153urs.<\/p>\n<h3>9.3 Techniques de tables de hachage en m\u00e9moire dans l&rsquo;\u00e9tape DATA<\/h3>\n<p>Sur les architectures modernes dot\u00e9es d&rsquo;une m\u00e9moire vive abondante, l&rsquo;utilisation des objets de hachage (<em>hash objects<\/em>) au sein de l&rsquo;\u00e9tape DATA offre les meilleures performances possibles pour agr\u00e9ger de grands volumes de donn\u00e9es. Cette technique permet de d\u00e9nombrer des observations sans aucun tri pr\u00e9alable, en stockant directement les agr\u00e9gats en m\u00e9moire dans une table de recherche \u00e0 acc\u00e8s direct en temps constant <em>O(1)<\/em>.<\/p>\n<p><code>DATA _NULL_;<br \/>\n&nbsp;&nbsp;IF _N_ = 1 THEN DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;DECLARE HASH h(ordered: 'yes');<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;h.DEFINEKEY('equipe');<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;h.DEFINEDATA('equipe', 'effectif');<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;effectif + 1;<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;effectif = 1;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;h.ADD();<br \/>\n&nbsp;&nbsp;END;<br \/>\n&nbsp;&nbsp;IF eof THEN h.OUTPUT(DATASET: 'work.comptage_hash');<br \/>\nRUN;<\/code><\/p>\n<p>\u00c0 la premi\u00e8re it\u00e9ration (<code>IF _N_ = 1<\/code>), l&rsquo;objet hash <code>h<\/code> est instanci\u00e9 en m\u00e9moire, configurant <code>equipe<\/code> comme cl\u00e9 d&rsquo;acc\u00e8s et <code>effectif<\/code> comme variable de donn\u00e9es. Pour chaque ligne lue, la m\u00e9thode <code>h.FIND()<\/code> v\u00e9rifie l&rsquo;existence de la cl\u00e9. Si la modalit\u00e9 est d\u00e9j\u00e0 enregistr\u00e9e, le compteur est incr\u00e9ment\u00e9 et r\u00e9\u00e9crit via la m\u00e9thode <code>h.REPLACE()<\/code> ; sinon, l&rsquo;entr\u00e9e est initialis\u00e9e \u00e0 1 via <code>h.ADD()<\/code>. Enfin, lorsque le fichier est enti\u00e8rement lu (<code>IF eof<\/code>), la m\u00e9thode <code>h.OUTPUT()<\/code> d\u00e9charge directement les r\u00e9sultats agr\u00e9g\u00e9s sur disque.<\/p>\n<p>Cette approche s&rsquo;affranchit enti\u00e8rement des limites d&rsquo;I\/O disque inh\u00e9rentes aux tris traditionnels, r\u00e9duisant souvent de mani\u00e8re spectaculaire le temps de traitement sur des bases comportant plusieurs dizaines de millions d&rsquo;enregistrements.<\/p>\n<h2>10. Restitution acad\u00e9mique et mise en forme des r\u00e9sultats d&rsquo;effectifs<\/h2>\n<h3>10.1 Mise en page des tableaux r\u00e9capitulatifs avec PROC TABULATE<\/h3>\n<p>Si la production de tables brutes r\u00e9pond aux besoins de calcul aval, la communication scientifique des r\u00e9sultats exige des structures d&rsquo;affichage conformes aux normes acad\u00e9miques et aux exigences \u00e9ditoriales. La proc\u00e9dure PROC TABULATE est con\u00e7ue pour g\u00e9n\u00e9rer des tableaux crois\u00e9s hi\u00e9rarchis\u00e9s complexes associant \u00e9l\u00e9gance visuelle et rigueur statistique.<\/p>\n<p><code>PROC TABULATE DATA=my_data;<br \/>\n&nbsp;&nbsp;CLASS equipe poste;<br \/>\n&nbsp;&nbsp;TABLE equipe ALL='Total G\u00e9n\u00e9ral',<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;poste*(N='Effectif' PCTN='Part (%)') ALL='Total'*N \/ RTS=25;<br \/>\nRUN;<\/code><\/p>\n<p>La syntaxe de PROC TABULATE structure les dimensions du tableau de part et d&rsquo;autre de la virgule : les termes positionn\u00e9s avant d\u00e9finissent les lignes, tandis que les instructions subs\u00e9quentes gouvernent les colonnes. L&rsquo;op\u00e9rateur de croisement ast\u00e9risque imbrique les statistiques demand\u00e9es (<code>N<\/code> et <code>PCTN<\/code>) au sein des modalit\u00e9s de la variable <code>poste<\/code>.<\/p>\n<p>L&rsquo;introduction du mot-cl\u00e9 <code>ALL<\/code> ins\u00e8re automatiquement des marges d&rsquo;agr\u00e9gation globale, calculant de mani\u00e8re transparente les totaux de lignes et de colonnes. Des \u00e9tiquettes explicites sont appliqu\u00e9es directement via des cha\u00eenes textuelles entre guillemets, assurant la production d&rsquo;un livrable statistique clair et pr\u00eat pour publication.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/count13.jpg\" alt=\"\" \/><\/figure>\n<h3>10.2 Rapports formels via PROC REPORT<\/h3>\n<p>La proc\u00e9dure PROC REPORT combine les fonctionnalit\u00e9s d&rsquo;agr\u00e9gation d&rsquo;une proc\u00e9dure statistique avec la souplesse de mise en page d&rsquo;un g\u00e9n\u00e9rateur d&rsquo;\u00e9tats. Sa force r\u00e9side dans sa capacit\u00e9 \u00e0 fusionner les observations identiques tout en permettant le calcul dynamique de sous-totaux et la mise en forme conditionnelle des cellules.<\/p>\n<p><code>PROC REPORT DATA=my_data NOWD HEADLINE HEADSKIP;<br \/>\n&nbsp;&nbsp;COLUMN equipe poste N;<br \/>\n&nbsp;&nbsp;DEFINE equipe \/ GROUP '\u00c9quipe de Recherche' WIDTH=20;<br \/>\n&nbsp;&nbsp;DEFINE poste \/ GROUP 'R\u00f4le Op\u00e9rationnel' WIDTH=15;<br \/>\n&nbsp;&nbsp;DEFINE N \/ 'Effectif Assign\u00e9' FORMAT=5.0 WIDTH=15;<br \/>\n&nbsp;&nbsp;BREAK AFTER equipe \/ SUMMARIZE SUPPRESS STYLE=[FONT_WEIGHT=BOLD];<br \/>\n&nbsp;&nbsp;RBREAK AFTER \/ SUMMARIZE STYLE=[FONT_WEIGHT=BOLD];<br \/>\nRUN;<\/code><\/p>\n<p>L&rsquo;attribut <code>GROUP<\/code> assign\u00e9 aux variables <code>equipe<\/code> et <code>poste<\/code> ordonne \u00e0 la proc\u00e9dure d&rsquo;agr\u00e9ger les lignes partageant des valeurs identiques, \u00e9vitant ainsi les redondances visuelles. L&rsquo;instruction <code>BREAK AFTER equipe \/ SUMMARIZE<\/code> ins\u00e8re automatiquement une ligne de sous-total en gras \u00e0 chaque rupture de s\u00e9quence d&rsquo;\u00e9quipe, tandis que l&rsquo;instruction <code>RBREAK AFTER \/ SUMMARIZE<\/code> ajoute une ligne de totalisation g\u00e9n\u00e9rale en cl\u00f4ture du rapport.<\/p>\n<p>Cette granularit\u00e9 de contr\u00f4le typographique et structurel fait de PROC REPORT un outil privil\u00e9gi\u00e9 pour \u00e9diter des rapports d&rsquo;essais cliniques, des relev\u00e9s \u00e9pid\u00e9miologiques ou des annexes de conformit\u00e9 r\u00e9glementaire.<\/p>\n<h3>10.3 Exportation multi-formats avec l&rsquo;Output Delivery System (ODS)<\/h3>\n<p>L&rsquo;architecture de l&rsquo;Output Delivery System (ODS) encapsule les proc\u00e9dures SAS en amont de leur rendu visuel, permettant d&rsquo;exporter les r\u00e9sultats vers une multitude de formats documentaires standardis\u00e9s &mdash; tels que PDF, RTF ou HTML &mdash; sans r\u00e9\u00e9crire le code de calcul statistique.<\/p>\n<p><code>ODS RTF FILE=\"C:rapportsdecompte_effectifs.rtf\" STYLE=Journal;<br \/>\nODS PDF FILE=\"C:rapportsdecompte_effectifs.pdf\" STYLE=Sapphire;<\/p>\n<p>PROC FREQ DATA=my_data;<br \/>\n&nbsp;&nbsp;TABLES equipe * poste \/ NOROW NOCOL NOPERCENT;<br \/>\n&nbsp;&nbsp;TITLE \"Rapport d'\u00c9quilibre des Effectifs Exp\u00e9rimentaux\";<br \/>\nRUN;<\/p>\n<p>ODS PDF CLOSE;<br \/>\nODS RTF CLOSE;<\/code><\/p>\n<p>La destination <code>ODS RTF<\/code> produit un document directement \u00e9ditable sous des logiciels de traitement de texte tels que Microsoft Word, facilitant l&rsquo;int\u00e9gration des tableaux dans des manuscrits scientifiques. L&rsquo;utilisation du style pr\u00e9d\u00e9fini <code>Journal<\/code> applique une typographie sobre, \u00e9pur\u00e9e et sans aplats de couleur superflus, strictement conforme aux exigences de nombreuses revues \u00e0 comit\u00e9 de lecture.<\/p>\n<p>Simultan\u00e9ment, la destination <code>ODS PDF<\/code> fige le rendu graphique au sein d&rsquo;un vecteur typographique portable et non modifiable, id\u00e9al pour archiver les r\u00e9sultats des protocoles de recherche et garantir l&rsquo;auditabilit\u00e9 \u00e0 long terme des analyses.<\/p>\n<h2>11. \u00c9tude de cas empirique : Analyse de cohortes exp\u00e9rimentales<\/h2>\n<h3>11.1 Sc\u00e9nario d&rsquo;\u00e9tude comportementale et structure de la cohorte<\/h3>\n<p>Pour illustrer la mise en \u0153uvre de ces techniques dans un cadre m\u00e9thodologique concret, consid\u00e9rons une \u00e9tude exp\u00e9rimentale multicentrique \u00e9valuant l&rsquo;efficacit\u00e9 d&rsquo;une intervention comportementale sur la gestion du stress en milieu professionnel. La population d&rsquo;analyse se compose de 12 participants r\u00e9partis au sein d&rsquo;un plan factoriel \u00e0 deux facteurs : le <code>Centre<\/code> hospitalier d&rsquo;inclusion (deux modalit\u00e9s : Paris, Lyon) et le <code>Traitement<\/code> assign\u00e9 (deux modalit\u00e9s : Actif, Placebo). Une mesure continue, l&rsquo;<code>Anxiete_Score<\/code>, est enregistr\u00e9e en fin de protocole.<\/p>\n<p><code>DATA cohorte_clinique;<br \/>\n&nbsp;&nbsp;LENGTH Centre $ 5 Traitement $ 7 Anxiete_Score 8;<br \/>\n&nbsp;&nbsp;INPUT Centre $ Traitement $ Anxiete_Score;<br \/>\n&nbsp;&nbsp;DATALINES;<br \/>\nParis Actif 42<br \/>\nParis Actif 38<br \/>\nParis Actif 45<br \/>\nParis Placebo 55<br \/>\nParis Placebo 58<br \/>\nLyon Actif 36<br \/>\nLyon Actif 40<br \/>\nLyon Placebo 62<br \/>\nLyon Placebo 65<br \/>\nLyon Placebo 60<br \/>\nLyon Placebo 59<br \/>\nLyon . 50<br \/>\n;<br \/>\nRUN;<\/code><\/p>\n<p>L&rsquo;observation finale comporte d\u00e9lib\u00e9r\u00e9ment une valeur manquante sur la variable <code>Traitement<\/code> (repr\u00e9sent\u00e9e par un point), illustrant une d\u00e9viation de protocole ou une incertitude d&rsquo;assignation fr\u00e9quente dans les \u00e9tudes de terrain. Cette configuration permet de mettre \u00e0 l&rsquo;\u00e9preuve les diff\u00e9rentes m\u00e9thodes d&rsquo;agr\u00e9gation face \u00e0 une anomalie concr\u00e8te d&rsquo;\u00e9chantillonnage.<\/p>\n<h3>11.2 Application crois\u00e9e des diff\u00e9rentes m\u00e9thodes SAS sur le cas d&rsquo;\u00e9tude<\/h3>\n<p>L&rsquo;application compar\u00e9e des proc\u00e9dures PROC SQL, PROC FREQ et de l&rsquo;\u00e9tape DATA sur cette cohorte permet d&rsquo;illustrer concr\u00e8tement leurs comportements respectifs face \u00e0 des donn\u00e9es r\u00e9elles.<\/p>\n<p><code>\/* Approche 1 : PROC SQL *\/<br \/>\nPROC SQL;<br \/>\n&nbsp;&nbsp;CREATE TABLE work.sql_result AS<br \/>\n&nbsp;&nbsp;SELECT Centre, Traitement, COUNT(*) AS N_SQL<br \/>\n&nbsp;&nbsp;FROM cohorte_clinique<br \/>\n&nbsp;&nbsp;GROUP BY Centre, Traitement;<br \/>\nQUIT;<\/p>\n<p>\/* Approche 2 : PROC FREQ avec gestion des donn\u00e9es manquantes *\/<br \/>\nPROC FREQ DATA=cohorte_clinique NOPRINT;<br \/>\n&nbsp;&nbsp;TABLES Centre * Traitement \/ OUT=work.freq_result(RENAME=(COUNT=N_FREQ)) MISSING;<br \/>\nRUN;<\/code><\/p>\n<p>L&rsquo;inspection des tables de sortie r\u00e9v\u00e8le une parfaite convergence num\u00e9rique entre les deux m\u00e9thodes. L&rsquo;enregistrement comportant la modalit\u00e9 manquante pour la variable <code>Traitement<\/code> au sein du centre de Lyon est clairement identifi\u00e9 et isol\u00e9 dans une classe d&rsquo;effectif unitaire (<em>N = 1<\/em>). L&rsquo;utilisation conjointe de ces deux techniques confirme l&rsquo;exactitude des calculs d&rsquo;agr\u00e9gation.<\/p>\n<p>Sur le plan des performances, si les temps d&rsquo;ex\u00e9cution sont imperceptibles sur cet \u00e9chantillon r\u00e9duit, la trace m\u00e9moire montre que PROC FREQ alloue moins de structures dynamiques temporaires que PROC SQL, confirmant sa l\u00e9g\u00e8ret\u00e9 algorithmique pour les traitements de contingence purs.<\/p>\n<h3>11.3 V\u00e9rification de l&rsquo;\u00e9quilibre statistique et d\u00e9tection d&rsquo;attrition<\/h3>\n<p>L&rsquo;examen des effectifs crois\u00e9s au sein de la table d&rsquo;analyse met en lumi\u00e8re des d\u00e9s\u00e9quilibres de distribution marqu\u00e9s entre les centres d&rsquo;investigation :<\/p>\n<ul>\n<li>\u00c0 Paris, la r\u00e9partition s&rsquo;\u00e9tablit \u00e0 3 sujets sous <code>Actif<\/code> et 2 sujets sous <code>Placebo<\/code>, traduisant un profil relativement \u00e9quilibr\u00e9.<\/li>\n<li>\u00c0 Lyon, la r\u00e9partition affiche 2 sujets sous <code>Actif<\/code>, 4 sujets sous <code>Placebo<\/code>, ainsi qu&rsquo;un sujet sans assignation formalis\u00e9e.<\/li>\n<\/ul>\n<p>La mise en \u00e9vidence de ce d\u00e9s\u00e9quilibre au sein du centre lyonnais &mdash; avec un bras placebo deux fois plus volumineux que le bras actif &mdash; alerte imm\u00e9diatement l&rsquo;analyste statisticien. Elle peut \u00eatre le signe d&rsquo;une faille dans l&rsquo;application de la liste de randomisation locale, ou d&rsquo;une attrition s\u00e9lective pr\u00e9coce ayant principalement affect\u00e9 les participants recevant le traitement actif.<\/p>\n<p>L&rsquo;identification imm\u00e9diate de ces anomalies par le simple d\u00e9nombrement crois\u00e9 conditionne l&rsquo;orientation m\u00e9thodologique des analyses ult\u00e9rieures : ajustement imp\u00e9ratif sur le centre dans les mod\u00e8les multivari\u00e9s, recours \u00e0 des pond\u00e9rations inverses de probabilit\u00e9 d&rsquo;assignation, ou conduite d&rsquo;analyses de sensibilit\u00e9 pour \u00e9valuer l&rsquo;impact de ces donn\u00e9es manquantes.<\/p>\n<h2>12. Diagnostic des erreurs fr\u00e9quentes et synth\u00e8se des bonnes pratiques<\/h2>\n<h3>12.1 Analyse des messages d&rsquo;erreur et d&rsquo;avertissement classiques<\/h3>\n<p>La pratique quotidienne de la programmation d&rsquo;agr\u00e9gation sous SAS confronte r\u00e9guli\u00e8rement l&rsquo;analyste \u00e0 des erreurs d&rsquo;ex\u00e9cution ou \u00e0 des avertissements explicites dans le journal. La ma\u00eetrise de leur signification permet une r\u00e9solution rapide des anomalies de code.<\/p>\n<p>L&rsquo;anomalie la plus classique en syntaxe SQL r\u00e9side dans l&rsquo;omission d&rsquo;une variable non agr\u00e9g\u00e9e au sein de la clause <code>GROUP BY<\/code>. Lorsqu&rsquo;une colonne appara\u00eet dans l&rsquo;instruction <code>SELECT<\/code> sans faire l&rsquo;objet d&rsquo;une fonction d&rsquo;agr\u00e9gation (comme <code>COUNT<\/code> ou <code>AVG<\/code>) et sans \u00eatre mentionn\u00e9e dans le <code>GROUP BY<\/code>, PROC SQL d\u00e9clenche un avertissement explicite dans le journal :<\/p>\n<p><code>WARNING: A GROUP BY clause has been transformed into an ORDER BY clause because neither the SELECT clause nor the optional HAVING clause of the associated table-expression referenced an aggregate function.<\/code><\/p>\n<p>Dans d&rsquo;autres configurations similaires, le moteur SQL applique un calcul d&rsquo;agr\u00e9gation global puis r\u00e9assigne la valeur calcul\u00e9e \u00e0 chaque ligne individuelle d&rsquo;origine via un m\u00e9canisme dit de r\u00e9-\u00e9mergence des donn\u00e9es (<em>remerging<\/em>), provoquant un surco\u00fbt d&rsquo;I\/O impr\u00e9vu et des r\u00e9sultats conceptuellement diff\u00e9rents d&rsquo;une stricte synth\u00e8se par groupe.<\/p>\n<p>Lors de l&rsquo;utilisation de l&rsquo;\u00e9tape DATA, l&rsquo;omission du tri pr\u00e9alable d\u00e9clenche un arr\u00eat d&rsquo;ex\u00e9cution imm\u00e9diat assorti de l&rsquo;erreur fatale bien connue :<\/p>\n<p><code>ERROR: BY variables are not properly sorted on data set WORK.MY_DATA.<\/code><\/p>\n<p>Ce message rappelle le caract\u00e8re strictement d\u00e9terministe et s\u00e9quentiel de l&rsquo;\u00e9tape DATA : d\u00e8s lors qu&rsquo;un changement de modalit\u00e9 inattendu se produit dans les cl\u00e9s d&rsquo;un bloc <code>BY<\/code>, l&rsquo;int\u00e9grit\u00e9 de la logique s\u00e9quentielle est rompue et le compilateur SAS stoppe le traitement pour pr\u00e9venir tout calcul erron\u00e9.<\/p>\n<h3>12.2 Grille de d\u00e9cision pour le choix de la m\u00e9thode idoine<\/h3>\n<p>Pour arbitrer efficacement entre les diff\u00e9rentes solutions de d\u00e9nombrement par groupe dans SAS, il convient d&rsquo;\u00e9valuer plusieurs crit\u00e8res cl\u00e9s relatifs aux donn\u00e9es et aux objectifs de restitution.<\/p>\n<p>La proc\u00e9dure PROC SQL s&rsquo;av\u00e8re particuli\u00e8rement adapt\u00e9e lorsque la table est d\u00e9j\u00e0 int\u00e9gr\u00e9e au sein d&rsquo;une s\u00e9quence de requ\u00eates relationnelles complexes, ou que l&rsquo;agr\u00e9gat d&rsquo;effectif doit faire l&rsquo;objet d&rsquo;un filtrage post-calcul direct via l&rsquo;instruction <code>HAVING<\/code> sans n\u00e9cessiter de tables interm\u00e9diaires. Son paradigme d\u00e9claratif garantit en outre une grande portabilit\u00e9 vers d&rsquo;autres moteurs de bases de donn\u00e9es relationnelles.<\/p>\n<p>La proc\u00e9dure PROC FREQ s&rsquo;impose comme le choix optimal pour l&rsquo;analyse cat\u00e9gorielle exploratoire, la construction rapide de tableaux de contingence crois\u00e9s et l&rsquo;extraction conjointe d&rsquo;effectifs et de pourcentages d&rsquo;\u00e9chantillonnage associ\u00e9s, tout en offrant une gestion robuste des valeurs manquantes gr\u00e2ce \u00e0 l&rsquo;option <code>MISSING<\/code>.<\/p>\n<p>L&rsquo;\u00e9tape DATA native (via les variables <code>FIRST.<\/code> et <code>LAST.<\/code>) ou les techniques de tables de hachage constituent la solution de r\u00e9f\u00e9rence lorsqu&rsquo;il est n\u00e9cessaire d&rsquo;int\u00e9grer des calculs s\u00e9quentiels complexes ou d&rsquo;intervenir chirurgicalement sur chaque enregistrement. Enfin, PROC SUMMARY et PROC MEANS demeurent incontournables d\u00e8s lors que le calcul des effectifs doit \u00eatre coupl\u00e9 \u00e0 l&rsquo;\u00e9valuation simultan\u00e9e de param\u00e8tres continus (moyennes, \u00e9carts-types, m\u00e9dianes) au sein d&rsquo;une grille multi-niveaux coh\u00e9rente.<\/p>\n<h3>12.3 Standardisation du code et r\u00e8gles d&rsquo;hygi\u00e8ne de programmation SAS<\/h3>\n<p>Dans un contexte de recherche clinique ou industrielle soumis \u00e0 des normes d&rsquo;audit rigoureuses, la qualit\u00e9 du code d&rsquo;agr\u00e9gation ne se mesure pas seulement \u00e0 son exactitude num\u00e9rique, mais \u00e9galement \u00e0 sa clart\u00e9, sa maintenabilit\u00e9 et sa tra\u00e7abilit\u00e9 pour les tiers.<\/p>\n<p>Une bonne hygi\u00e8ne de programmation repose sur une indentation syst\u00e9matique et lisible, l&rsquo;explicitation syst\u00e9matique des noms de variables cr\u00e9\u00e9es (en \u00e9vitant les alias g\u00e9n\u00e9riques non document\u00e9s) et l&rsquo;insertion de commentaires d\u00e9crivant les hypoth\u00e8ses m\u00e9thodologiques sous-jacentes. L&rsquo;utilisation syst\u00e9matique de l&rsquo;instruction <code>DROP=<\/code> ou <code>KEEP=<\/code> garantit que seules les variables n\u00e9cessaires sont propag\u00e9es dans les tables d\u00e9riv\u00e9es, \u00e9vitant l&rsquo;encombrement inutile des environnements de stockage.<\/p>\n<p>De plus, il est essentiel d&rsquo;inclure en fin de cha\u00eene des proc\u00e9dures de nettoyage formelles pour supprimer les tables de travail interm\u00e9diaires et lib\u00e9rer l&rsquo;espace temporaire allou\u00e9 dans la biblioth\u00e8que SASWORK :<\/p>\n<p><code>PROC DATASETS LIBRARY=work NOLIST;<br \/>\n&nbsp;&nbsp;DELETE my_data_sorted frequences_croisees sql_result;<br \/>\nQUIT;<\/code><\/p>\n<p>Enfin, l&rsquo;archivage reproductible des programmes &mdash; associant dans un environnement versionn\u00e9 le code source, la description formelle du descripteur de donn\u00e9es d&rsquo;entr\u00e9e et le journal d&rsquo;ex\u00e9cution complet &mdash; permet de satisfaire pleinement aux exigences de tra\u00e7abilit\u00e9 et de reproductibilit\u00e9 requises par les revues scientifiques et les agences r\u00e9glementaires internationales.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Cody, R. (2018). <em>Cody&rsquo;s Data Cleaning Techniques Using SAS<\/em> (3e \u00e9d.). SAS Institute Inc.<\/li>\n<li>Delwiche, L. D., &amp; Slaughter, S. J. (2019). <em>The Little SAS Book: A Primer<\/em> (6e \u00e9d.). SAS Institute Inc.<\/li>\n<li>Food and Drug Administration. (2021). <em>Data Standards for Study Data<\/em>. U.S. Department of Health and Human Services. <a rel=\"noopener noreferrer\" href=\"https:\/\/www.fda.gov\">https:\/\/www.fda.gov<\/a><\/li>\n<li>SAS Institute Inc. (2020). <em>Base SAS 9.4 Procedures Guide: Statistical Procedures<\/em> (5e \u00e9d.). SAS Institute Inc. <a rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\">https:\/\/documentation.sas.com<\/a><\/li>\n<li>SAS Institute Inc. (2023). <em>SAS SQL Procedure User&rsquo;s Guide, Version 9.4<\/em>. SAS Institute Inc. <a rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\">https:\/\/documentation.sas.com<\/a><\/li>\n<li>Shen, F. (2015). Techniques for Optimizing Data Aggregation in Massive Data Warehouses. <em>Journal of Statistical Software<\/em>, 65(3), 1\u201318.<\/li>\n<li>Tukey, J. W. (1977). <em>Exploratory Data Analysis<\/em>. Addison-Wesley.<\/li>\n<li>Wicklin, R. (2013). <em>Simulating Data with SAS<\/em>. SAS Institute Inc.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour d\u00e9nombrer les observations par groupe dans SAS \u00e0 l&rsquo;aide de PROC SQL, PROC FREQ et de l&rsquo;\u00e9tape DATA.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[1829,9499],"tags":[10467,10458,9504,10466,235],"class_list":["post-9444","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-statistique","category-programmation-sas","tag-comptage-dobservations","tag-group-by","tag-proc-freq","tag-proc-sql","tag-sas"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9444","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=9444"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9444\/revisions"}],"predecessor-version":[{"id":9448,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9444\/revisions\/9448"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9444"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}