Consulter
Transcription
Consulter
Sébastien Ringuedé SAS ® Version 9.2 Introduction au décisionnel : méthode et maîtrise du langage http://www.free-livres.com/ Préface de Daniel Delorge, Directeur général SAS France SAS Livre Page I Jeudi, 18. septembre 2008 6:03 18 Sébastien Ringuedé Université d’Orléans, LEO, UMR CNRS 6221 SAS Introduction au décisionnel : méthode et maîtrise du langage SAS Livre Page II Jeudi, 18. septembre 2008 6:03 18 SAS® software, SAS® 6.12, SAS® 8.2, SAS®9, SAS® 9.1.3, SAS® 9.2, AppDev StudioTM software, SAS® Business Intelligence server, SAS High Power Forecasting® software, SAS Enterprise Guide® software, SAS® Enterprise Intelligence Platform, Enterprise MinerTM software, SAS OnlineDoc® documentation, SAS®Metadata Server, SAS/ACCESS® software, SAS/ CONNECT® software, SAS/ETS® software, SAS/GRAPH® software, SAS/IML® software, SAS/INSIGHT® software, SAS/IntrNet® software, SAS/OR® software, SAS/SHARE® software, SAS/STAT® software, SAS® Integration Technologies, SASware Ballot® sont des marques déposées de SAS Institute inc., Cary, North Carolina, USA. Publié par Pearson Education France 47 bis, rue des Vinaigriers 75010 PARIS Tél. : 01 72 74 90 00 Mise en pages : TyPAO ISBN : 978-2-7440-4167-9 Copyright © 2008 Pearson Education France Tous droits réservés Tous les autres noms de produits ou de marques cités dans cet ouvrage sont des marques déposées par leurs propriétaires respectifs. Le nom SAS désignera en fonction du contexte le produit, le langage ou la société qui commercialise le progiciel SAS. SAS se prononce comme un nom « SAS » et non comme un sigle. Aucune représentation ou reproduction, même partielle, autre que celles prévues à l’article L. 122-5 2˚ et 3˚ a) du code de la propriété intellectuelle ne peut être faite sans l’autorisation expresse de Pearson Education France ou, le cas échéant, sans le respect des modalités prévues à l’article L. 122-10 dudit code. SAS Livre Page III Jeudi, 18. septembre 2008 6:03 18 Remerciements Je tiens à remercier SAS France pour m’avoir confié une version de SAS 9.2 afin de pouvoir terminer cet ouvrage. Mes remerciements vont plus particulièrement à Ariane Sioufi, Directeur Académique SAS France, Grégoire de Lassence, Responsable Pédagogie et Recherche SAS France, pour leur aide et leurs encouragements. Le propos de cet ouvrage n’engage que son auteur et en aucun cas SAS Institute s.a.s, filiale de SAS Institute Inc., ni SAS Institute Inc. Cet ouvrage n’aurait pas pu être écrit sans l’aide de relecteurs. Mes remerciements vont tout particulièrement à Bernard Gestin ainsi qu’à Roselyne Adame Key, Gildas Amegbo, Karim Aroussi, Alaâ-Eddine Aznag, Edwige Balliet, Claire Formont, Mihaela Ivanof, Lucie Moreau, Carole Njoya, Séverine Outreville, Amélie Renvoisé, Dieudonné Sondjo, Sessi Tokpavi et plus généralement aux étudiants du master ESA (Économétrie et Statistique Appliquée) de l’université d’Orléans qui, par leurs questions et leurs remarques, ont enrichi au fil du temps cet ouvrage qui n’était au départ que le support de mon cours d’introduction à SAS. www.univ-orleans.fr/deg/masters/ESA/ Les erreurs et imprécisions qui pourront apparaître dans cet ouvrage restent miennes. Les demandes d’éclaircissements et de suggestions seront toujours les bienvenues : [email protected] Le site compagnon de cet ouvrage est un élément indispensable à votre apprentissage de SAS : www.sas-sr.com Merci à Gilbert Colletaz et Christophe Hurlin pour leur patience… À Laurence, Léonie, Marceau et Lucien qui ne connaissent de SAS que le temps que j’ai passé à la rédaction de cet ouvrage. SAS Livre Page IV Jeudi, 18. septembre 2008 6:03 18 SAS Livre Page V Jeudi, 18. septembre 2008 6:03 18 Table des matières Remerciements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . III Préface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XIII Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Présentation de l’ouvrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Progresser dans votre connaissance de SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . Comment travailler avec cet ouvrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La certification SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aller plus loin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SAS : une communauté active d’utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . Les différentes versions de SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SAS Windows, Unix, OpenVMS, z/OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Disposer du système SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conventions typographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 3 3 4 5 6 7 8 8 9 1. Créer une table SAS* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 Faisons connaissance avec SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Les tables SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Cas simple : les informations sont séparées par un espace . . . . . . . . . . 13 13 15 16 16 18 20 23 26 28 31 32 1.4 1.5 1.3.1 Créons notre première table SAS. . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.2 L’éditeur SAS : une aide à la programmation . . . . . . . . . . . . . . . . 1.3.3 Demander l’exécution d’un programme. . . . . . . . . . . . . . . . . . . . 1.3.4 Les bibliothèques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprenons bien le cas simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les valeurs manquantes sur variables numériques . . . . . . . . . . . . . . . . 1.5.1 Plus de deux modalités aux valeurs manquantes . . . . . . . . . . . . . 1.5.2 Cas des valeurs manquantes saisies par aucun signe . . . . . . . . . . 2. Pour aller plus loin dans la création de tables SAS* . . . . . . . . . . . 2.1 La création d’une table SAS à partir d’un fichier informatique . . . . 2.2 Autres indicateurs de séparation des modalités . . . . . . . . . . . . . . . . . . 2.3 2.2.1 Les modalités sont séparées par des tabulations. . . . . . . . . . . . . . 2.2.2 Les modalités sont séparées par des virgules. . . . . . . . . . . . . . . . . 2.2.3 Les modalités sont séparées par un caractère quelconque. . . . . . . . . 2.2.4 Les modalités sont séparées par un point-virgule . . . . . . . . . . . . Les données présentées en colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1 Premier cas : l’absence d’espace entre les modalités . . . . . . . . . . 2.3.2 Cas général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 33 36 36 37 38 38 39 39 40 SAS Livre Page VI Jeudi, 18. septembre 2008 6:03 18 VI ◆ SAS 2.4 2.5 2.6 2.7 2.8 2.9 2.3.4 Le positionnement relatif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.5 Un cas particulier : la dernière modalité est de longueur variable . 2.3.6 Position relative et position absolue des modalités . . . . . . . . . . . 2.3.7 Une seconde application de @x . . . . . . . . . . . . . . . . . . . . . . . . . . . Les espaces dans les modalités de variables alphanumériques . . . . . . . Toutes les observations apparaissent sur une même ligne . . . . . . . . . . Les modalités relatives à une même observation apparaissent sur plusieurs lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6.1 Cas simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6.2 Cas moins simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6.3 Un dernier cas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Retour sur la gestion des valeurs manquantes . . . . . . . . . . . . . . . . . . . . . Les INFORMAT : format des valeurs entrantes . . . . . . . . . . . . . . . . . . . 2.8.1 Les INFORMAT des variables alphanumériques . . . . . . . . . . . . . 2.8.2 Les INFORMAT des variables numériques . . . . . . . . . . . . . . . . . a. Quelques INFORMAT sur variables numériques . . . . . . . . . b. Préciser ou pas W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c. Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.8.3 Des variables numériques particulières : les dates et heures. . . . a. Les INFORMAT de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . b. L’option YEARCUTOFF . . . . . . . . . . . . . . . . . . . . . . . . . . . . c. Les INFORMAT de temps . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.8.4 Créons notre propre INFORMAT !. . . . . . . . . . . . . . . . . . . . . . . . a. Cas simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b. Cas plus complexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exportons nos tables SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 43 44 44 45 47 48 48 50 51 52 54 54 57 58 60 63 63 64 67 68 68 69 70 74 Conclusion des chapitres 1 et 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Regardez et comprenez votre fichier brut . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lisez la fenêtre JOURNAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examinez votre table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 77 78 80 3. La modification des tables SAS* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 L’exécution par SAS de vos programmes . . . . . . . . . . . . . . . . . . . . . . . 83 84 85 86 87 88 90 90 93 3.2 3.1.1 Les informations descriptives de la table. . . . . . . . . . . . . . . . . . . . 3.1.2 La longueur de l’enregistrement des variables alphanumériques 3.1.3 L’impossibilité de modifier le type de la variable . . . . . . . . . . . . . 3.1.4 L’exécution du programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.5 Les conséquences du RESET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.6 OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.7 RETURN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les opérateurs et les fonctions usuelles de construction et de transformation de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Les opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2 Les fonctions numériques usuelles . . . . . . . . . . . . . . . . . . . . . . . . 3.2.3 Les fonctions statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 94 95 96 SAS Livre Page VII Jeudi, 18. septembre 2008 6:03 18 Table des matières ◆ VII 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.2.4 Les fonctions particulières aux séries temporelles . . . . . . . . . . . . 3.2.5 Les générateurs de nombres aléatoires . . . . . . . . . . . . . . . . . . . . . 3.2.6 Les fonctions sur les chaînes de caractères . . . . . . . . . . . . . . . . . . 3.2.7 La concaténation de variables alphanumériques . . . . . . . . . . . . . 3.2.8 Les fonctions propres aux dates . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.9 Une fonction spécifique aux valeurs manquantes . . . . . . . . . . . . Alléger une table SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1 Effacer certaines variables/ne conserver que certaines variables. 3.3.2 Écarter ou ne conserver que certaines observations : WHERE, IF et SELECT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a. IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b. WHERE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c. SELECT/WHEN/OTHERWISE . . . . . . . . . . . . . . . . . . . . . . 3.3.3 Sélection d’observations à partir de leur numéro d’observation La construction de nouvelles variables au sein d’une table SAS . . . . . . 3.4.1 La conversion des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.2 La construction sans condition . . . . . . . . . . . . . . . . . . . . . . . . . . . La construction sous conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5.1 Les commandes IF – THEN – ELSE . . . . . . . . . . . . . . . . . . . . . . . 3.5.2 Les commandes IF THEN/ELSE IF THEN . . . . . . . . . . . . . . . . . . 3.5.3 Les commandes IFN et IFC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5.4 La commande IF/GOTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5.5 Les commandes SELECT/WHEN/OTHERWISE. . . . . . . . . . . . . 3.5.6 Une dernière possibilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les boucles DO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6.1 Le DO simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6.2 Le DO itératif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6.3 Les boucles DO UNTIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6.4 Les boucles DO WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les boucles sur ARRAY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7.1 Principes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7.2 Exemples d’application. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Donner une mémoire à SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.8.1 La commande RETAIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.8.2 La commande RETAIN alliée aux options FIRST et LAST . . . . . 3.8.3 Faire référence à des valeurs passées . . . . . . . . . . . . . . . . . . . . . . . Les listes de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.9.1 Première possibilité. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.9.2 Deuxième possibilité : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.9.3 Troisième possibilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.9.4 Quatrième possibilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 97 98 102 104 108 108 108 109 110 111 113 115 116 116 117 119 120 120 122 123 124 124 125 126 126 127 128 129 129 130 134 134 135 139 141 141 141 142 142 4. Combiner les tables SAS* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 4.1 Ajouter des individus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 4.2 Ajouter des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 4.2.1 PROC SORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 SAS Livre Page VIII Jeudi, 18. septembre 2008 6:03 18 VIII ◆ SAS 4.3 4.4 4.2.2 MERGE – Cas standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3 Le cas des séries temporelles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.4 Merger des tables de dimensions différentes . . . . . . . . . . . . . . . . 4.2.5 Quelques sources de problème en cas de merge. . . . . . . . . . . . . . 4.2.6 La nature des variables clés de réunion de deux tables . . . . . . La mise à jour : commande UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . Les marqueurs : un outil utile dans les phases de merge . . . . . . . . . . . . . 5. Faciliter la gestion des tables SAS* . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1 La procédure PROC CONTENTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Les LABEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 L’attribution d’un FORMAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 5.5 5.6 5.3.1 L’utilisation de FORMAT prédéfinis sur des variables numériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.2 FORMAT ou INFORMAT ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.3 Quelques FORMAT utiles sur variables numériques. . . . . . . . . . 5.3.4 Les FORMAT d’affichage des variables de date . . . . . . . . . . . . . . 5.3.5 Les FORMAT d’affichage des variables alphanumériques . . . . . . . 5.3.6 La création de FORMAT spécifiques. . . . . . . . . . . . . . . . . . . . . . . a. PROC FORMAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b. Assigner des FORMAT spécifiques de façon permanente à une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c. Utiliser des FORMAT spécifiques dans des sorties sans que ceux-ci soient dans la table SAS . . . . . . . . . . . . . . d. Créer plusieurs FORMAT spécifiques pour une même variable . . . . . . . . . . . . . . . . . . . . . . . . . . . e. Les FORMAT entrelacés . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.7 Une seconde utilisation de PUT . . . . . . . . . . . . . . . . . . . . . . . . . . La longueur de l’enregistrement des variables numériques . . . . . . . . . . . La gestion des tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.5.1 Quelques bonnes pratiques de gestion de vos tables . . . . . . . . . . 5.5.2 Empêcher SAS de réécrire une table de même nom . . . . . . . . . . La gestion des OPTIONS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.6.1 Les options de SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.6.2 Le niveau de modification des options . . . . . . . . . . . . . . . . . . . . . 5.6.3 La modification du fichier de configuration SASV9.CFG . . . . . . 5.6.4 AUTOEXEC.SAS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 148 149 149 150 151 153 155 156 157 159 159 161 162 163 166 167 167 168 169 170 170 172 173 175 175 177 178 178 180 181 182 6. Quelques procédures de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 6.1 Titres et pieds de pages de vos sorties dans la fenêtre SORTIE* . . . . . . 186 6.2 PROC MEANS* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 6.2.1 Le choix des mots clés statistiques . . . . . . . . . . . . . . . . . . . . . . . . . 190 6.2.2 Les tables d’OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 6.2.3 La paramétrisation de vos sorties. . . . . . . . . . . . . . . . . . . . . . . . . . 193 6.3 PROC UNIVARIATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 6.4 PROC PRINT* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 SAS Livre Page IX Jeudi, 18. septembre 2008 6:03 18 Table des matières ◆ IX 6.5 6.6 6.7 6.4.1 PROC PRINT pour des sorties dans la fenêtre SORTIE . . . . . . . 6.4.2 PROC PRINT et ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a. La syntaxe de l’option STYLE . . . . . . . . . . . . . . . . . . . . . . . . b. Premier exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c. « Traffic lightening » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROC REPORT* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.1 Exemples simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.2 L’instruction DEFINE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.3 Les variables et leurs usages possibles . . . . . . . . . . . . . . . . . . . . . . a. Les variables ORDER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b. Les variables GROUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c. Les variables ACROSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . d. Les variables COMPUTED . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.4 Les rapports intégrant des informations de type liste et des informations de synthèse . . . . . . . . . . . . . . . . . . . . . . . . . . a. Cas simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b. Quelques précautions à prendre . . . . . . . . . . . . . . . . . . . . . . 6.5.5 Trois exemples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a. 1er exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b. Second exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c. Un dernier exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.6 PROC REPORT et ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROC FREQ* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.1 Les tableaux de fréquences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.2 Les tableaux croisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROC TABULATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.7.1 Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.7.2 Exemples d’applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a. Structures lignes-colonnes des tableaux . . . . . . . . . . . . . . . . b. Les variables d’analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c. Choix de la statistique éditée dans le tableau . . . . . . . . . . . . d. L’introduction de récapitulatifs dans le tableau . . . . . . . . . . e. L’introduction de pourcentage dans les tableaux . . . . . . . . 6.7.3 PROC TABULATE et ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 204 206 208 209 210 211 212 214 214 215 218 219 221 221 223 223 224 225 226 228 229 230 230 235 235 237 238 241 242 244 247 250 7. Les graphiques sous SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 7.1 Les commandes STATEMENTS dans SAS/GRAPH . . . . . . . . . . . . . . . 256 7.1.1 Les polices et couleurs dans SAS/GRAPH. . . . . . . . . . . . . . . . . . . 257 a. Les couleurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 b. Les polices dans SAS/GRAPH . . . . . . . . . . . . . . . . . . . . . . . . 260 7.1.2 GOPTIONS : les options graphiques. . . . . . . . . . . . . . . . . . . . . . . 262 7.1.3 Les titres, les pieds de pages, les notes dans SAS/GRAPH . . . . . . . . . 264 7.1.4 Les commandes AXIS<1…99> . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 7.1.5 Les commandes PATTERN<1…99> . . . . . . . . . . . . . . . . . . . . . . 269 SAS Livre Page X Jeudi, 18. septembre 2008 6:03 18 X ◆ SAS 7.2 7.3 7.4 7.5. PROC GCHART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2.1 Les options possibles de HBAR et VBAR . . . . . . . . . . . . . . . . . . . a. Options de présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . b. Options statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c. Options sur les points centraux . . . . . . . . . . . . . . . . . . . . . . . d. Options sur les axes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2.2 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROC GPLOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.1 Les graphiques proposés par GPLOT . . . . . . . . . . . . . . . . . . . . . . a. Syntaxe de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b. Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.2 Les commandes LEGEND<1…99> . . . . . . . . . . . . . . . . . . . . . . . a. Créons nos premières légendes . . . . . . . . . . . . . . . . . . . . . . . b. Quelques options possibles de LEGEND . . . . . . . . . . . . . . . 7.3.3. Les commandes SYMBOL <1…99> . . . . . . . . . . . . . . . . . . . . . a. Options d’apparence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b. Les méthodes d’interpolation . . . . . . . . . . . . . . . . . . . . . . . . 7.3.4 PLOT2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.5 Exemples – première partie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.6 L’édition de vos graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.7 Exemples – deuxième partie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vos graphiques et ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4.1 Un exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4.2 Les polices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4.3 GOPTIONS DEVICE= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SAS 9.2 – Les procédures « STATISTICAL GRAPHICS » . . . . . . . . . . . 271 273 273 275 276 277 278 290 290 290 291 294 295 297 299 299 303 306 306 316 318 324 325 326 327 329 8. ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 8.1 ODS : les principes* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 8.1.1 Les raisons d’utiliser ODS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 8.1.2 Les destinations ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 8.1.3 ODS DOCUMENT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 8.1.4 Une première approche des sorties en HTML . . . . . . . . . . . . . . . 335 8.1.5 Les limites des sorties ODS générées automatiquement . . . . . . . . . 337 8.2 ODS HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 8.2.1 La gestion des fichiers créés par ODS* . . . . . . . . . . . . . . . . . . . . . 338 8.2.2 Plusieurs procédures dans une sortie unique* . . . . . . . . . . . . . . . 339 8.2.3 Introduction de tables des matières*. . . . . . . . . . . . . . . . . . . . . . . 341 8.2.4 Paramétrer la table des matières – première partie . . . . . . . . . . . 342 8.2.5 Personnaliser vos sorties – ODS TRACE . . . . . . . . . . . . . . . . . . . 344 8.2.6 ODS SELECT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 8.2.7 Destinations multiples des sorties* . . . . . . . . . . . . . . . . . . . . . . . . 348 8.2.8 ODS OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 8.2.9 Faciliter la navigation sur Internet. . . . . . . . . . . . . . . . . . . . . . . . . 351 SAS Livre Page XI Jeudi, 18. septembre 2008 6:03 18 Table des matières ◆ XI 8.3 8.4 8.5 8.6 Agir sur votre environnement – la procédure PROC TEMPLATE . . . . 8.3.1 La détermination des blocs de style à modifier. . . . . . . . . . . . . . . 8.3.2 La modification des polices utilisées . . . . . . . . . . . . . . . . . . . . . . . 8.3.3 Modifier l’allure d’un tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.4 La modification des couleurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.5 La sauvegarde des styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.6 Ajouter de nouveaux attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . ODS RTF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.4.1 La gestion des grands tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.4.2 La modification de vos tableaux dans Excel . . . . . . . . . . . . . . . . . 8.4.3 Les modifications de styles dans ODS RTF. . . . . . . . . . . . . . . . . . ODS PRINTER et ODS PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.5.1 ODS PRINTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.5.2 ODS PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.5.3 Un premier exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.5.4 ESCAPECHAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.5.5 Second exemple – illustration des capacités d’ESCAPECHAR . 8.5.6 Création d’une page de garde. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.5.7 La personnalisation de la table des matières – deuxième partie . 8.5.8 La construction de vos sommaires avec ODS. . . . . . . . . . . . . . . . Un nouvel outil : ODS GRAPHICS . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 355 357 360 362 364 364 367 369 369 370 372 372 373 376 377 379 381 382 383 385 9. Le langage macro sous SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 9.1 Les concepts du langage macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 9.2 Les macro-variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 9.2.1 Accéder à la valeur d’une macro-variable . . . . . . . . . . . . . . . . . . . 394 9.2.2 Les macro-variables automatiques . . . . . . . . . . . . . . . . . . . . . . . . 395 9.2.3 La suppression des macro-variables . . . . . . . . . . . . . . . . . . . . . . . 397 9.3 Les fonctions macro du langage SAS . . . . . . . . . . . . . . . . . . . . . . . . . . 398 9.3.1 La routine CALL SYMPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398 9.3.2 La fonction SYMGET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 9.4 Les macro-fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405 9.4.1 Les macro-fonctions sur chaînes de caractères. . . . . . . . . . . . . . . 406 9.4.2 Les macro-fonctions permettant l’évaluation. . . . . . . . . . . . . . . . 407 9.4.3 Les macro-fonctions de quoting . . . . . . . . . . . . . . . . . . . . . . . . . . 408 9.5 Premiers exemples sans macro-programme . . . . . . . . . . . . . . . . . . . . . 411 9.6 Les macro-programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416 9.6.1 Environnement local/environnement global . . . . . . . . . . . . . . . . 417 9.6.2 GLOBAL/LOCAL : pour quoi faire ? . . . . . . . . . . . . . . . . . . . . . . . 419 9.6.3 Le paramétrage des macro-programmes . . . . . . . . . . . . . . . . . . . 420 9.6.4 Les macro-commandes propres aux macro-programmes. . . . . . 422 a. Les constructions conditionnelles : %IF . . . . . . . . . . . . . . . 423 b. Les boucles %DO simples . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 c. %DO %WHILE et %DO %UNTIL . . . . . . . . . . . . . . . . . . . 427 9.7 Conserver ses macro-programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429 SAS Livre Page XII Jeudi, 18. septembre 2008 6:03 18 XII ◆ SAS 9.8 9.9 Quelle aide au débogage des macro-programmes ? . . . . . . . . . . . . . . . 9.8.1 Ordre et Méthode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.8.2 Les outils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un cas pratique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.9.1 Les données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.9.2 Les différents graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429 430 430 431 432 436 Bibliographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 * La présence d’un astérisque indique que le point développé fait partie du programme de la certification SAS (SAS 9 certification base programming). Un astérisque à côté d’un intitulé de chapitre indique que le chapitre complet est au programme de la certification. S’il est présent à côté d’un nom de section, seuls la section et ses développements font partie du programme de la certification. SAS Livre Page XIII Jeudi, 18. septembre 2008 6:03 18 Préface Ayant moi-même été un utilisateur SAS, avant de prendre la responsabilité du développement de la filiale française il y a bientôt vingt ans, j’ai eu un grand intérêt et un réel plaisir à découvrir l’ouvrage réalisé par Sébastien Ringuedé. SAS propose des solutions décisionnelles pour transformer les données en connaissance, et ainsi, permettre de prendre la bonne décision au bon moment. Depuis plus de trente ans, les solutions SAS couvrent l’ensemble du processus d’informatique décisionnelle, de l’intégration de sources de données d’origines multiples, leur transformation, leur stockage et leur analyse, jusqu’à la diffusion de l’information et de la connaissance. La métamorphose entre les solutions SAS® 8 et celles reposant sur la plateforme décisionnelle intégrée SAS® 9 permet notamment de répondre aux nouveaux problèmes d’administration et d’ergonomie. Néanmoins, une grande partie de la puissance et de l’adaptabilité de ces solutions est due au fait que celles-ci reposent sur le langage de programmation de quatrième génération : le langage SAS. Toutes les applications de la plate-forme SAS sont basées sur ce socle fondamental et il est possible de l’adapter pour peu que l’on sache programmer en SAS. Objectivement, le langage SAS est l’un des plus puissants et des plus stables du marché. Savoir programmer correctement en SAS est une compétence incontournable pour l’adaptation des solutions SAS aux besoins spécifiques de chaque entreprise. Nous proposons des solutions pour répondre aux problématiques les plus pointues des différents métiers de l’entreprise (finance, ressources humaines, logistique, marketing, gestion des risques…) et leur apportons une réponse pour l’analyse et la gestion de leur performance. Nous avons aussi développé des solutions répondant aux spécificités sectorielles auxquelles elles peuvent être confrontées (optimisation des marges dans la grande distribution, obligations réglementaires dans la banque, fraude à l’assurance, attrition dans les télécommunications…). Les entreprises privées et publiques ont des attentes de plus en plus fortes en termes d’optimisation, de pilotage et de mesure de leurs performances ; les projets décisionnels n’ont jamais été aussi nombreux et variés. Il est nécessaire qu’il y ait des personnes sachant programmer en SAS pour les mettre en place et assurer leur succès. Plus qu’une initiation, cet ouvrage de référence est un vrai cours complet, en français, pour apprendre à programmer en SAS. Les années d’expérience pédagogique de l’auteur sont ici synthétisées en un livre à la fois clair, accessible et complet. Bien plus que les concepts, il permet de découvrir la philosophie et la logique du langage SAS. Je le recommande donc vivement aussi bien aux professionnels qui doivent déployer la plate-forme SAS, qu’aux enseignants-chercheurs dans leurs travaux académiques, ou aux étudiants souhaitant rapidement maîtriser le socle de base de SAS. Nous retrouvons ici tous les éléments nécessaires qui, complétés par un minimum d’exercices pratiques, doivent permettre de passer la certification « SAS Base Programming for SAS®9 ». SAS propose des solutions à des problématiques très complexes. SAS Livre Page XIV Jeudi, 18. septembre 2008 6:03 18 XIV ◆ SAS Mais aussi intelligentes ces solutions logicielles soient-elles, elles nécessitent de la matière grise pour les mettre en place et les maintenir. Nos clients ont donc besoin de compétences fiables. Les certifications SAS sont des attestations individuelles à validité internationale, reconnues par nos clients et nos partenaires. Vous trouverez aussi quelques-unes des dernières fonctionnalités mises en production avec SAS 9.2, Sébastien Ringuedé étant l’un des premiers partenaires académiques à en bénéficier. Rappelons que SAS est né dans l’université. Ce livre est une preuve de plus que les relations entre la société SAS et les universités sont bien plus qu’un discours politique : il s’agit d’un engagement solide et durable. Daniel Delorge Directeur Général de SAS France SAS Livre Page 1 Jeudi, 18. septembre 2008 6:03 18 Introduction Présentation de l’ouvrage Cet ouvrage s’adresse à tous les utilisateurs débutants ou de niveau intermédiaire du langage SAS, qu’ils soient en formation dans les départements d’économie, de gestion, de mathématiques appliquées, de statistique, de biologie, de STID, de MIAGE, d’IAE des universités, dans les écoles de commerce, d’ingénieurs, ou qu’ils évoluent déjà dans le monde professionnel. Le système SAS est très vaste : on pourrait presque dire qu’il existe autant d’utilisations de SAS que d’utilisateurs. Il existe cependant un socle commun de connaissances mobilisées quotidiennement par tous ces utilisateurs. C’est ce socle que se propose d’explorer cet ouvrage. L’ouvrage vise à présenter les connaissances fondamentales et transversales nécessaires à la programmation SAS, plus particulièrement à la création, la modification, la manipulation et la gestion des tables de données. Il s’intéresse également aux procédures d’exploration et de première exploitation des données. Enfin, il aborde la production de graphiques, de documents de présentation en format HTML, RTF ou PDF, ainsi que le langage macro propre au système SAS. Pour les utilisateurs qui ont pour finalité la manipulation et la transformation de données, puis la production de rapports présentant ces dernières, cet ouvrage détaille les outils qu’ils doivent mobiliser. Pour les personnes qui utilisent en plus les outils économétriques et statistiques, nous couvrons dans cet ouvrage les phases en amont et en aval de l’analyse qu’elles doivent mener au moyen du système SAS. Aucun travail d’analyse ou de construction de rapport n’est possible sur des données non préparées. Les outils que nous aborderons au cours des six premiers chapitres vous aideront à mettre en forme ces données et à les explorer. Il s’agit d’une phase essentielle de votre travail puisque les données, dans leur forme brute, n’ont jamais la forme des données sur lesquelles vous pouvez directement appliquer vos outils économétriques et statistiques ou sur la base desquelles vous pouvez immédiatement rédiger un rapport. Les données brutes que l’on vous confiera devront dans un premier temps être transformées en une table SAS parfaitement fidèle à vos données originales. C’est précisément l’objet des chapitres 1 et 2. Nous examinons dans le chapitre 3 les outils à votre disposition pour créer, à partir des variables présentes dans une table brute et au moyen de transformations et de combinaisons, les variables nécessaires à votre travail. SAS Livre Page 2 Jeudi, 18. septembre 2008 6:03 18 2 ◆ SAS Dans de très nombreux cas, il est aussi nécessaire de mobiliser plusieurs sources de données et donc de combiner des tables entre elles. C’est ce que nous voyons dans le chapitre 4. Ainsi, ce n’est pas une seule mais plusieurs tables que vous manipulerez, dans des versions plus ou moins évoluées. Il est donc nécessaire de les organiser et de les gérer de façon à travailler le plus efficacement possible. Ce point essentiel est traité dans le chapitre 5. Nous examinons dans le chapitre 6 un ensemble de procédures à même de vous permettre d’explorer, de connaître et de comprendre vos données. On ne peut en effet analyser ou présenter des données que si on les connaît bien. Ces outils d’exploration des tables vont seront utiles aussi dans la phase de retransmission de vos résultats puisque, même si votre finalité première est l’analyse économétrique ou statistique, vous aurez très souvent besoin de présenter au moyen de tableaux les données qui servent de base à votre analyse. Nous présentons dans le chapitre 7 les procédures graphiques qui peuvent, ici encore, être utiles lors des phases d’exploration et de présentation de vos résultats. La phase de présentation des résultats est réalisée en aval de l’analyse. C’est une phase importante puisque votre travail d’analyse ne rencontrera jamais l’attention qu’il mérite s’il est livré dans une forme brute. Le document doit être attrayant par sa forme et indiquer de façon claire les principaux résultats que vous avez obtenus. Les entreprises construisent des bases de données de plus en plus importantes et c’est le rôle du statisticien de tirer de ces données des informations essentielles au développement de son entreprise. Ce rôle, de par la position qu’occupe le statisticien, est particulier. Les analyses que peut fournir le statisticien sont destinées non pas à d’autres statisticiens mais à des personnes qui devront, sur la base de ces analyses, prendre des décisions. Une part essentielle du travail du statisticien en entreprise est donc d’expliquer au moyen d’un langage non technique l’essentiel de ses résultats. Bien sûr, il ne s’agit pas de privilégier le fond au détriment de la forme : les analyses que vous fournirez devront être techniquement indiscutables mais vous n’obtiendrez pas l’attention que mérite votre analyse si leur forme n’est pas attrayante. La retransmission de vos résultats et la rédaction de rapports mobilisent à nouveau les procédures présentées dans le chapitre 6 ainsi que les procédures graphiques explorées dans le chapitre 7. Nous examinons dans le chapitre 8 l’Output Delivery System (ODS) livré avec SAS. Au moyen de cet outil offert par SAS, vous avez en effet la possibilité de produire en quelques instructions des documents attrayants au format HTML, RTF (Rich Text Format), que vous pouvez coller dans votre traitement de texte, ou PDF. Ce dernier format peut être utilisé si vous souhaitez effectuer une présentation au moyen d’un vidéoprojecteur. Le chapitre 9 consacré au langage macro conclut cet ouvrage. En effet, pour percevoir l’intérêt du langage macro, il faut avoir une certaine expérience de SAS et être conscient que votre travail comprend des phases répétitives ou qu’il suffit de modifier quelques instructions pour qu’un programme dédié au traitement d’une table spécifique puisse aussi analyser une autre table. Après une large introduction au langage macro de SAS, nous présentons un exemple mobilisant les connaissances que vous aurez acquises au cours des huit premiers chapitres. SAS Livre Page 3 Jeudi, 18. septembre 2008 6:03 18 Introduction ◆ 3 Progresser dans votre connaissance de SAS Cet ouvrage ne saurait prétendre à l’exhaustivité. Cependant, il aborde les problèmes les plus courants et vous donne les outils qui vous permettront de les résoudre. Ainsi, le chapitre 7, consacré aux graphiques, explore principalement deux types de graphiques : les histogrammes et les courbes. À cette occasion, sont présentés les éléments de langage communs à toutes les procédures graphiques. En effet, une fois que vous maîtriserez ces deux outils ainsi que le langage propre à l’environnement graphique, vous pourrez aisément exploiter les possibilités des autres procédures graphiques offertes par SAS. Chaque chapitre commence par expliquer les concepts de base avant d’aborder des notions plus complexes. Ainsi, dans l’exposé d’une procédure, il y aura peu de rapport entre les résultats simples que nous proposerons dans un premier temps et les derniers résultats. Ces derniers résultats ne peuvent cependant pas être compris sans les premières parties dans lesquelles les principaux concepts sont exposés avant d’être mis en pratique. C’est pour cette même raison que le chapitre consacré au langage macro est présenté en dernier : il mobilise en effet l’ensemble des connaissances abordées dans les huit premiers chapitres. Nous avons fait le choix de passer sous silence les interfaces proposées par SAS qui permettent en quelques clics de réaliser un graphique, d’importer des données, de créer des tableaux, etc. Ces interfaces, certes conviviales, écrivent le programme à votre place mais ne vous dispensent absolument pas de connaître les outils de la programmation SAS. En effet, ces interfaces ne peuvent mobiliser 100 % des outils de programmation offerts par les procédures qu’elles émulent. Si votre demande s’éloigne des cas standard et si vous n’avez aucune connaissance des outils de la programmation SAS, vous ne pourrez pas comprendre le programme créé par votre interface et le modifier de manière qu’il produise le résultat souhaité. Les utilisateurs avancés de SAS qui prétendent ne pas coder ajoutent généralement que c’est parce qu’ils ont beaucoup codé… Comment travailler avec cet ouvrage Le site compagnon de cet ouvrage est le complément indispensable à votre travail d’apprentissage de SAS. Vous retrouverez ce site à l’adresse suivante : www.sas-sr.com Ce site vous offre : • tous les programmes proposés dans l’ouvrage ; • toutes les sorties générées par ces programmes, y compris celles non reproduites dans cet ouvrage ; • tous les fichiers nécessaires à la reproduction des exemples ; • tous les fichiers nécessaires aux exercices proposés ; • les solutions aux exercices proposés ; • des compléments à cet ouvrage ; SAS Livre Page 4 Jeudi, 18. septembre 2008 6:03 18 4 ◆ SAS • l’ensemble des liens vers des sites Internet proposés dans cet ouvrage ; • des outils de recherche, simples d’utilisation, qui permettent de retrouver des exemples de programmes qui emploient des commandes et des options spécifiques. Tout au long des chapitres, des exercices vous sont proposés. N’attendez pas d’avoir lu l’intégralité d’un chapitre pour les effectuer : ils sont indispensables à la compréhension des notions abordées et constituent généralement des passerelles entre les différents concepts. Ne consultez les solutions qu’au terme d’une réelle réflexion ! C’est en commettant des erreurs que l’on progresse. À partir du chapitre 5, les exercices sont moins nombreux. Vous êtes invité à reproduire l’intégralité des nombreux exemples de programmation proposés afin de bien comprendre l’impact de chacune des commandes et options utilisées. Vous avez la possibilité d’en retirer certaines ou de les remplacer par d’autres. Les exemples qui concluent les différentes sections des chapitres 6, 7, 8, et 9 mobilisent l’ensemble des concepts évoqués auparavant. Si vous ne deviez reproduire que ces exemples, le seul enseignement que vous risquez d’en tirer, c’est le constat d’une identité entre ce que vous aurez sur votre écran et ce que vous décrit l’ouvrage. Si vous ne comprenez pas les concepts, vous ne pourrez rien apprendre d’un programme offrant plus de cinq instructions. Vous maîtriserez les concepts lorsque, avant même l’exécution du programme, vous aurez une idée précise de la structure du résultat produit. La certification SAS Cet ouvrage couvre l’intégralité du programme SAS 9 Certification Base Programming. Il va même au-delà en approfondissant certains domaines et en explorant des domaines non couverts par la certification comme SAS/GRAPH et le langage macro. Les sections qui font partie du programme de la certification SAS sont indiquées au moyen d’un astérisque dans le sommaire. Pour plus de détails sur le programme de cette certification, vous pouvez consulter le site suivant : support.sas.com/certify/creds/testbp9.html Cette certification est reconnue internationalement et constitue un réel plus dans un curriculum vitae. Nous vous encourageons vivement à la passer dans l’un des centres de test PROMETRIC. Si votre formation est partenaire de SAS ACADEMIC, vous pourrez bénéficier de coûts réduits. L’épreuve, d’une durée de deux heures, prend la forme d’un QCM de 70 questions en anglais sur ordinateur. Pour chaque question, 4 réponses sont proposées. Si vous avez au moins 46 bonnes réponses, vous obtenez la certification. Bien entendu, pendant le temps de l’épreuve, vous ne disposez pas de SAS. Le centre de formation SAS, de son côté, propose une offre associant une journée de préparation à la certification, un manuel d’entraînement et l’examen. www.sas.com/france/services/training/certification.html Attention, j’attire votre attention sur le fait que, pour réussir cette certification, vous devez connaître parfaitement le système SAS. Vous connaîtrez le système SAS lorsque vous pourrez dire, en examinant différents programmes mais sans les exécuter, ce que vous allez obtenir ou pourquoi ils ne peuvent pas fonctionner. Cette connaissance ne SAS Livre Page 5 Jeudi, 18. septembre 2008 6:03 18 Introduction ◆ 5 s’acquiert qu’au moyen d’une pratique régulière et approfondie des outils évoqués dans le programme de la certification. La compréhension du système SAS ne suffit pas. Cette phase de compréhension, premier stade de votre apprentissage, vous permet uniquement de comprendre pourquoi un programme ne fonctionne pas lorsque vous l’exécutez. Le site compagnon de cet ouvrage donne des exemples de questions qui pourraient vous être posées dans le cadre de cette certification1. Aller plus loin Nous indiquerons très souvent des liens Internet vers des documents devant vous permettre d’approfondir vos connaissances dans un domaine particulier. Cependant, malgré le soin apporté et le temps passé à la rédaction de cet ouvrage, il est possible que vous ne trouviez pas de réponse à la question que vous vous posez. Dans ce cas, vous devrez de vous-même trouver d’autres sources. Votre première source de renseignements est bien entendu l’aide SAS installée sur votre ordinateur, que vous activez avec la touche F1 de votre clavier. Vous pouvez aussi ouvrir le menu Aide, puis sélectionnez Introduction au système SAS. Vous naviguez dans cette aide de trois manières : • Par l’onglet Sommaire. Vous pouvez consulter alors l’aide SAS comme vous consultez un livre. • Par l’onglet Index. Vous devez alors indiquer l’instruction au sujet de laquelle vous recherchez des renseignements. • Par l’onglet Rechercher. Indiquez plusieurs mots clés et explorez les pages de l’aide qui contiennent ces mots. Nous ferons souvent référence à des articles de l’aide SAS, soit en partant de l’onglet Sommaire, soit en indiquant l’entrée à consulter dans l’Index. En vous invitant à consulter tel ou tel article, nous souhaitons vous aider là aussi dans votre apprentissage de l’aide SAS dans laquelle il pourrait vous sembler difficile de naviguer. Dans cet ouvrage, lorsque nous ferons référence à une entrée de l’aide, merci de respecter minuscules et majuscules pour retrouver l’article cité. Si l’aide SAS n’est pas installée sur votre ordinateur, vous pouvez aussi la consulter sur le site support de SAS : support.sas.com/documentation/ À partir de cette page, vous pouvez accéder à l’aide de : • SAS 8.2 : v8doc.sas.com/sashtml/ • SAS 9.1.3 : support.sas.com/onlinedoc/913/docMainpage.jsp • SAS 9.2 : support.sas.com/cdlsearch?ct=80000 L’organisation de l’aide en ligne de SAS 9.2 diffère de l’aide installée sur votre ordinateur. L’aide SAS 8.2 de par son organisation reste intéressante à utiliser lorsque vous consultez la page d’aide consacrée à une instruction de procédure, vous avez la possibilité de revenir au chapitre auquel appartient la procédure, contrairement aux aides de SAS 9.x. 1. L’exercice 3.1 proposé dans la section 3.1.3. est tout à fait typique des questions posées à cet examen. SAS Livre Page 6 Jeudi, 18. septembre 2008 6:03 18 6 ◆ SAS Vous avez aussi accès à un ensemble de documentations techniques qui ne sont pas comprises dans l’aide. SAS France propose des documentations en français à partir de son propre site support : www.sas.com/france/services/support/ SAS : une communauté active d’utilisateurs Si l’aide SAS doit toujours être votre référence lorsque vous recherchez une information sur une procédure ou une commande, les exemples qu’elle vous propose sont généralement simples et ne vous permettent pas toujours d’apprécier la richesse et les possibilités offertes par une procédure particulière. Il est toujours intéressant de s’éloigner de l’aide SAS pour regarder ce que d’autres utilisateurs peuvent faire avec SAS. Les utilisateurs de SAS forment une communauté très active et il existe, essentiellement basés aux États-Unis, de très nombreux groupes d’utilisateurs au premier rang desquels se trouve SAS Global Forum (anciennement SUGI – SAS User Group International) : www.support.sas.com/events/sasglobalforum/ Ce groupe d’utilisateurs organise chaque année une conférence internationale au cours de laquelle des articles d’utilisateurs illustrant les possibilités de telle ou telle procédure sont exposés avant d’être mis à la disposition des utilisateurs SAS du monde entier. Vous pouvez aisément consulter ces articles sur le site suivant : www.lexjansen.com/ Ce dernier site vous permet aussi de consulter les articles rédigés dans le cadre des groupes régionaux basés aux États-Unis1 : Enfin, à partir de ce site, vous avez aussi la possibilité de consulter les articles présentés au cours des conférences de deux groupes d’utilisateurs de l’industrie pharmaceutique : • PharmaSUG (The Pharmaceutical Industry SAS Users Group) : www.pharmasug.org/ • PhUSE (Pharmaceutical Users Software Exchange) basé en Europe : www.phuse.eu/ Les forums de discussion constituent aussi une source de renseignements appréciable. Un forum très actif et existant depuis 1996 est hébergé par l’université de Géorgie : • Forum SAS-L : www.listserv.uga.edu/archives/sas-l.html SAS Institute héberge aussi son propre forum : support.sas.com/forums/index.jspa Attention, cependant, il s’agit là d’un forum d’utilisateurs qui ne saurait se substituer au support technique offert par SAS et que chaque client SAS (sauf les clients ACADEMIC) peut saisir en cas de problème. Le support SAS peut être contacté à cette adresse : support.sas.com/techsup/ À l’heure actuelle, il existe peu de forums à accès gratuit en langue française. Vous pouvez cependant entrer en contact moyennant un abonnement annuel avec d’autres utilisateurs français, participer au Club utilisateurs annuel de deux jours, à la journée SAS Forum Tech, et accéder à l’extranet utilisateurs ainsi qu’à son forum sur le site SAS FORUM France : www.sas.com/france/sasforum/ 1. SESUG, MWSUG, NESUG, SCSUG, WUSS, et PNWSUG. SAS Livre Page 7 Jeudi, 18. septembre 2008 6:03 18 Introduction ◆ 7 Vous trouverez aussi sur le forum développez.net une section consacrée à SAS : www.developpez.net/forums/forumdisplay.php?f=886 Vous pouvez aussi consulter le très intéressant blog de Véronique Bourcier consacré à SAS : www.sasreference.fr Divers groupes d’utilisateurs sont aussi présents sur Internet. Vous pouvez par exemple consulter les archives et contacter les utilisateurs du groupe Google http://groups.google.fr/group/comp.soft-sys.sas/topics SAS Institute soutient l’activité des groupes d’utilisateurs et prend en considération les expériences des utilisateurs du système SAS. L’existence du SASware BALLOT est une expression de cet intérêt. Chaque année, SAS Institute demande aux utilisateurs quels ajouts ils souhaiteraient. Pour plus de détails sur le SASware BALLOT, vous pouvez consulter le lien support.sas.com/community/ballot/ Les différentes versions de SAS Vous devez vous demander si cet ouvrage est adapté à la version de SAS que vous avez à disposition. En effet, différentes versions de SAS existent ou ont existé. SAS Institute distingue les versions principales (SAS 6.12, SAS 8.2 et SAS 9.2) des versions intermédiaires. Le passage d’une version à une autre est toujours synonyme d’ajouts importants. Les ajouts qui concernent l’objet de cet ouvrage sont peu nombreux et seront signalés. ODS est cependant un cas particulier. ODS a été introduit avec SAS 8.0 en 1999. De très nombreuses modifications et améliorations ont été apportées depuis et certains programmes, notamment dans la partie consacrée à ODS PDF, peuvent ne pas fonctionner avec des versions antérieures à SAS 9.2. Vous trouverez sur le site compagnon de cet ouvrage des versions des programmes proposés dans le chapitre 8 compatibles avec SAS 9.1.3. Nous tentons aussi, dans la mesure du possible, de proposer des versions compatibles avec SAS 8.2. Le système SAS est conçu de telle manière qu’un programme qui fonctionne dans une version donnée fonctionnera aussi dans les versions ultérieures de SAS. Certaines anciennes fonctions, remplacées depuis par des fonctions plus puissantes, même si elles ne sont plus documentées, continuent et continueront à pouvoir être utilisées. Le passage d’une version à une autre n’est donc pas synonyme d’un complet réapprentissage de SAS : ce que vous apprenez aujourd’hui sera encore valable demain. SAS est loué par votre employeur, votre école ou votre université : il n’y a pas de coût supplémentaire demandé au client SAS lorsqu’une nouvelle version apparaît. Seules les contraintes propres aux clients1 peuvent expliquer le maintien d’une version relativement ancienne de SAS. Vous comprenez donc que différentes versions de SAS peuvent subsister à un moment donné du temps : on peut ainsi considérer qu’actuellement, trois versions de SAS coexistent : SAS 8.2, SAS 9.1.3 et SAS 9.2. SAS 9.2 a commencé à être déployé et distribué au printemps 2008. Le déploiement complet de SAS 9.2 doit se terminer courant 2009 avec la livraison des outils d’analyse propres aux métadonnées. Lorsque SAS 9.2 sera totalement déployé, SAS 9.1.3. disparaîtra. 1. Notamment en matière de tests suite à la migration des données entre différentes versions. SAS Livre Page 8 Jeudi, 18. septembre 2008 6:03 18 8 ◆ SAS SAS Windows, Unix, OpenVMS, z/OS Cet ouvrage traitera exclusivement de SAS Windows. En effet, si vous débutez sous SAS, il y a de très fortes chances que la version de SAS à votre disposition soit une version Windows. Si, par la suite, vous êtes appelé à travailler dans un environnement non Windows, vous découvrirez que les différences entre votre SAS Windows et SAS dans un autre environnement résident dans : • la façon de débuter une session SAS ; • l’adressage des fichiers externes à SAS ; • l’existence de quelques options spécifiques à votre environnement. Les programmes écrits au moyen de SAS Windows fonctionneront parfaitement sur d’autres systèmes d’exploitation. Il n’y a quasiment aucune différence entre SAS Windows et les versions UNIX, OpenVMS et z/OS de SAS. Disposer du système SAS Si vous êtes actuellement dans une université ou une école, il se peut que la formation que vous suivez soit inscrite au programme SAS ACADEMIC1. L’inscription à ce programme permet à votre formation de bénéficier d’un certain nombre de licences SAS à un coût tout à fait intéressant et autorise l’installation sur votre ordinateur personnel de SAS pendant la durée de votre formation initiale (y compris pendant la durée de votre stage) contre une inscription au Club ACADEMIC de SAS et la signature d’un contrat de licence. Pour tous renseignements sur SAS ACADEMIC, vous pouvez consulter le site suivant : www.sas.com/france/academic/ Si vous ne pouvez bénéficier de l’offre SAS ACADEMIC, vous avez la possibilité de découvrir et de travailler sur une version limitée de SAS (SAS Learning Edition 4.1), suffisante pour l’apprentissage de SAS proposé par cet ouvrage – le site support.sas.com/learn/le/ fournit toutes les informations dont vous pouvez avoir besoin. Cette version allégée de SAS contient les modules suivants : Base SAS (V9.1.3 SP4), SAS/STAT, SAS/GRAPH, SAS/QC, SAS/ETS et SAS entreprise guide 4.12. Cette version restreint l’affichage et les manipulations aux 1 500 premières lignes de votre table3. Le nombre de variables n’est pas limité. Ce programme a une durée de vie limitée (au moment où est rédigée cette introduction, la version 4.1 de SAS Learning Edition est programmée pour ne plus fonctionner après le 31 décembre 2011) et n’est pas gratuit. Le coût est tout à fait raisonnable (60 $ sans la documentation en anglais si vous êtes étudiant, 160 € avec la documentation dans les autres cas). Cette version de SAS n’est pas compatible avec Microsoft Windows® Vista™. 1. Environ 100 établissements et 200 filières sont actuellement partenaire SAS au travers du programme SAS ACADEMIC. 2. Certaines procédures propres aux modules cités ne sont pas contenues dans cette version. 3. Toutes les tables utilisées dans cet ouvrage contiennent moins de 1 500 observations. SAS Livre Page 9 Jeudi, 18. septembre 2008 6:03 18 Introduction ◆ 9 Conventions typographiques Les programmes (instructions, noms de variable, noms de tables) que vous pourrez écrire dans SAS peuvent employer minuscules et majuscules. Seules les valeurs prises par les modalités des variables alphanumériques doivent respecter la casse. Nous avons cependant employé dans cet ouvrage les majuscules et les minuscules de façon à vous aider au mieux dans votre compréhension des nombreux programmes proposés. Tous les mots clés propres au langage SAS apparaissent en majuscules dans les programmes et dans le corps du texte. Les mots qui apparaissent en gras dans les programmes sont les instructions qui débutent et qui terminent une étape (ici, DATA et RUN). À l’intérieur du programme, les instructions propres au langage SAS apparaissent en majuscules (SET, IF, THEN, DO, RANUNI, etc.). Les noms des tables, des variables, des FORMAT et INFORMAT qui apparaissent dans le programme seront systématiquement écrits en minuscules. Nous indiquons par l’emploi des minuscules que le programme fonctionnera tout aussi bien si vous utilisez d’autres noms pour les tables ou les variables. DATA test2; SET test; FORMAT date ddmmyy.; ATTRIB x FORMAT=8.4 LABEL="Variable analysée"; IF x<15 THEN DO; x7=RANUNI(234); x9=x2+x12; END; RUN; Dans le corps du texte, seront systématiquement repris en majuscules les noms des commandes, fonctions, options, mais aussi le nom des variables, des FORMAT, INFORMAT, etc. Les programmes seront indentés afin de vous permettre de mieux suivre et de mieux comprendre leur finalité. Il y a toujours au moins un niveau d’indentation, parfois plusieurs. Dans le cas du programme présenté ici, pour la commande ATTRIB, nous indentons une seconde fois pour signifier au lecteur que l’instruction LABEL est un élément de la commande ATTRIB. Nous indentons une seconde fois après l’instruction IF pour indiquer au lecteur que les deux instructions permettant de définir les variables X7 et X9 ne s’appliquent pas à toutes les observations (cette construction est en fait conditionnée au respect de la condition énoncée par l’instruction IF). L’instruction CARDS et les données qui suivent cette instruction ne seront pas indentées. Il n’est pas forcément nécessaire d’organiser les programmes de cette manière mais au fur et à mesure que les programmes que vous rédigerez s’allongeront, vous constaterez qu’une telle organisation facilite grandement la compréhension. À l’exception de certains programmes très courts, les programmes proposés dans l’ouvrage sont numérotés, ce qui vous permet de les retrouver facilement sur le site compagnon de cet ouvrage. SAS Livre Page 10 Jeudi, 18. septembre 2008 6:03 18 10 ◆ SAS Un peu d’histoire Le logiciel SAS est le fruit du travail d’un groupe de chercheurs de la North Carolina State University débuté en 1966. En 1967, James H. Goodnight, actuel CEO de SAS Institute, rejoint le projet et travaille à la stabilité du logiciel et à la création des procédures. Ce logiciel a connu à partir de 1971 un grand succès aussi bien auprès de la communauté universitaire qu’auprès de l’industrie pharmaceutique et de l’agriculture, en raison notamment de sa capacité à gérer les données manquantes. En 1976, l’entreprise SAS Institute est créée notamment par James H. Goodnight et John P. Sall. SAS s’est depuis imposé comme le leader mondial de l’informatique décisionnelle. Il est aujourd’hui présent dans 96 des 100 premières entreprises du classement Fortune Global 500® et dans près de 44 000 sites clients répartis dans 107 pays. SAS Institute a réalisé un chiffre d’affaires de 2,15 milliards de dollars en 2007 dont 21 % a été réinvesti dans la recherche. SAS signifiait à l’origine Statistical Analysis System. La signification de l’acronyme a depuis été perdue, marquant ainsi le fait que SAS est beaucoup plus de nos jours qu’un simple logiciel de traitement statistique. Le logiciel SAS en tant que tel n’existe plus ; il faudrait plutôt parler d’un système SAS, ou d’un progiciel SAS, composé de logiciels SAS intégrés. Les modules du système SAS explorés Le système SAS est composé de différents modules ayant tous une fonctionnalité propre. Le module Base SAS constitue le cœur de votre système SAS – il est nécessaire au fonctionnement des autres produits SAS. Il permet de plus l’exécution des étapes DATA, du langage macro, des outils offerts par ODS (Output Delivery System), ainsi que les analyses statistiques simples, les procédures utilitaires comme PROC CONTENTS, PROC PRINT ou PROC SORT. Nous consacrerons l’essentiel de cet ouvrage à l’exploration des fonctionnalités de Base SAS. Le langage SAS est un langage dit de quatrième génération (L4G). Il s’agit, comme nous allons le découvrir dans cet ouvrage, d’un langage peu technique, très proche de la syntaxe naturelle. SAS/GRAPH est le second module que nous explorerons dans cet ouvrage. Cette application permet de créer des graphiques et, depuis SAS 9.2 et l’introduction d’ODS GRAPHICS, d’intégrer automatiquement des graphiques prédéterminés dans les sorties des procédures d’analyses. Une présentation succincte d’autres modules de SAS1 SAS/ACCESS permet d’accéder aux données produites par d’autres logiciels, de les utiliser dans SAS et même de créer à partir de SAS des fichiers dans des formats externes. SAS/ACCESS propose différents modules qui permettent une intégration à différents systèmes de gestion de base de données (SGBD) du marché et à certains progiciels de gestion intégré (PGI ou ERP – Enterprise Resource Planning). Voici une liste d’exemples non exhaustive : SAS/ACCESS Interface to SAP BW, to Teradata, to DB2, to MySQL, to ODBC, to OLE DB, to ORACLE, to PC Files (Microsoft Excel, Microsoft Access, Lotus 1-2-3, DBF), to PeopleSoft, etc. 1. Merci à Grégoire de Lassence pour l’aide apportée à la rédaction de cet encadré. SAS Livre Page 11 Jeudi, 18. septembre 2008 6:03 18 Introduction ◆ 11 SAS AppDev Studio est l’outil de développement de SAS permettant notamment de : • créer des interfaces clientes ; • créer des servlets, des applets, pour construire des applications clientes sur les technologies Web ; • créer des portlets pour compléter le portail ; • créer des plug-in à ajouter aux clients Java ; • développer des applications analytiques et de pilotage en client léger, Java ou Windows ; • exploiter au mieux la puissance du serveur SAS dans des applications de pilotage sur mesure ; SAS AppDev Studio constitue un environnement de développement complet et autonome pour concevoir tous types d’applications. SAS/CONNECT permet de connecter des ordinateurs sur lesquels est installé SAS. Vous partagerez au moyen de cette application vos tables de données ; des programmes écrits sur un ordinateur pourront être exécutés sur un second. SAS Data Integration Studio est une interface cliente Java de la plate-forme décisionnelle SAS. Elle fait partie des packages « SAS Data Integration Server » et « SAS Enterprise Data Integration Server ». Plus de détails peuvent être obtenus à l’adresse www.sas.com/france/software/technologies/dw.html. SAS Enterprise Guide permet de manipuler des données, de faire des analyses statistiques et des rapports. Cette application développée en .NET est donc une application uniquement Windows. Enterprise Guide génère du code SAS, qui est exécuté par un moteur SAS base. SAS Enterprise Guide ne peut être utilisé sans une connexion à un socle Base SAS. SAS Enterprise Miner est le module de Data Mining de SAS. C’est une « usine » à modèle permettant l’industrialisation de l’exploitation intensive de gigantesques bases de données. SAS/ETS (Econometrics, Times Series) est le module qui comprend les outils pour l’économétrie des séries temporelles et la prévision (ARIMA, VARMAX, TIMESERIES…). SAS High Performance Forecasting est une application d’aide à la production de prévisions. SAS/IML (Interactive Matrix Language) permet d’utiliser un langage matriciel. SAS/INSIGHT est un outil de visualisation des données. Ce module est remplacé depuis SAS 9.2 par SAS Stat Studio (www.support.sas.com /rnd/app/studio/studio.html). SAS/Integration Technologies permet de partager des ressources et d’intégrer SAS dans vos diverses autres applications. SAS/IntrNet permet l’implémentation de vos applications SAS sur Internet. SAS/IRP (Inventory Replenishment Planning) est un outil de gestion des stocks. SAS Livre Page 12 Jeudi, 18. septembre 2008 6:03 18 12 ◆ SAS SAS NLS (National Language Support) n’est pas un module en tant que tel mais une application qui permet à SAS de fonctionner au mieux sur des systèmes non américains. SAS OLAP Server est un SGBD1 multidimensionnel. SAS Open Metadata Architecture est une architecture permettant la mise en place, le déploiement et l’administration de la plate-forme SAS. SAS/OR (Operational Research) regroupe des fonctions avancées de recherche opérationnelle comme la programmation (linéaire ou non) et la résolution d’optimisation de graphe. SAS/SHARE permet l’accès de plusieurs utilisateurs à une même table de données. SAS/STAT offre les outils de l’analyse statistique comme l’analyse de la variance et la plupart des formes de régression. Vous pouvez accéder à des descriptifs complets des produits et des solutions proposés par le système SAS sur le site de SAS Institute : www.sas.com/products/ 1. Système de gestion de bases de données. SAS Livre Page 13 Jeudi, 18. septembre 2008 6:03 18 1 Créer une table SAS Au sommaire de ce chapitre : 1.1. Faisons connaissance avec SAS 1.2. Les tables SAS 1.3. Cas simple : les informations sont séparées par un espace 1.4. Comprenons bien le cas simple 1.5. Les valeurs manquantes sur variables numériques Ce premier chapitre a pour objectif de vous aider dans vos premiers pas sous SAS. Il s’agit plus particulièrement de vous présenter l’environnement SAS et de vous apprendre à créer vos premières tables. 1.1 Faisons connaissance avec SAS Au démarrage de SAS, l’écran de la figure 1.1 apparaît. Figure 1.1 • Capture d’écran SAS Windows. SAS Livre Page 14 Jeudi, 18. septembre 2008 6:03 18 14 ◆ SAS Cet écran, typique des versions 8 et 9 de SAS Windows, est désigné sous le terme de Display Manager System (DMS). Il est composé de cinq fenêtres principales : • La fenêtre EDITEUR. Cette fenêtre permet de saisir les programmes et d’en demander l’exécution. Dans l’éditeur amélioré qui s’affiche à l’écran, les différentes commandes que vous saisissez s’affichent dans diverses couleurs. La signification de ces couleurs est précisée plus loin dans ce chapitre. • La fenêtre JOURNAL. Dans cette fenêtre, s’affichent les commentaires de SAS sur les programmes que vous exécuterez. • La fenêtre SORTIE. Les sorties demandées par vos programmes seront dirigées vers cette fenêtre. • La fenêtre EXPLORATEUR. Comme l’explorateur de votre ordinateur, cette fenêtre vous permet de naviguer dans vos diverses bibliothèques (voir section 1.3.4) et votre Poste de travail. Vous retrouvez dans Dossiers favoris les dossiers Mes documents et le Bureau. Dans le dossier Raccourcis de fichiers, vous pouvez créer des raccourcis vers différents fichiers de votre disque dur. De façon à organiser au mieux votre travail, n’hésitez pas à personnaliser le contenu de ces dossiers. • La fenêtre RESULTATS. Cette fenêtre permet de naviguer entre les divers résultats qui vont s’afficher dans la fenêtre SORTIE et d’effacer certaines sorties pour ne conserver que les plus utiles. Les graphiques que vous allez produire vont être envoyés dans une nouvelle fenêtre GRAPH. Les sorties générées par ODS (voir chapitre 8) sont envoyées dans une fenêtre RESULTS VIEWER et peuvent être aussi envoyées en même temps dans la fenêtre SORTIE. Figure 1.2 • La fenêtre COMMANDE et le menu. En fonction de la fenêtre active (fenêtre qui s’affiche avec un bandeau bleu foncé – voir figure 1.1), le menu peut différer de celui représenté à la figure 1.2 (fenêtre EDITEUR active). • Fichier permet d’ouvrir ou de sauvegarder un programme, d’importer ou d’exporter une table, d’imprimer ou de terminer une session SAS. • Edition propose les commandes d’édition habituelles : Annuler/Rétablir, Copier, Coller, Rechercher, Remplacer, Sélectionner tout, Effacer la sélection ou la fenêtre. Ce menu permet également d’afficher le programme dans sa forme réduite ou développée. • Affichage permet de naviguer entre les diverses fenêtres, d’en ouvrir de nouvelles, de rouvrir des fenêtres que vous aviez fermées. • Outils permet l’accès à différents éditeurs (requêtes, éditeur de tables, de graphiques, de rapports…). C’est dans ce menu que vous accédez aux commandes de personnalisation de la barre d’outils et à différentes options. • Executer vous permet de demander l’exécution de votre programme et de vous connecter si votre SAS fonctionne en mode client-serveur. SAS Livre Page 15 Jeudi, 18. septembre 2008 6:03 18 Créer une table SAS ◆ 15 • Solutions permet d’accéder à un ensemble d’outils d’analyse. • Fenêtre vous permet un ensemble d’options relatives à l’organisation de vos fenêtres sur votre écran. À partir de ce menu, vous pouvez aussi passer d’une fenêtre à une autre. • Aide permet d’accéder à l’aide SAS. Dans la barre d’outils, vous disposez d’une fenêtre COMMANDE qui nous sera particulièrement utile lorsque nous traiterons des graphiques et des sorties ODS. Les icônes situées à droite de cette zone de commande ont respectivement les fonctions suivantes : Nouveau, Ouvrir, Enregistrer, Imprimer, Aperçu avant impression, Couper, Copier, Coller, Annuler, Nouvelle bibliothèque, Explorateur SAS, Soumettre, Supprimer tout, Interrompre, Aide SAS. Une info-bulle vous indique la fonction de l’icône lorsque vous passez le pointeur de votre souris dessus. 1.2 Les tables SAS Dans le vocabulaire SAS, le terme « table » indique le fichier dans lequel sont stockées les données que vous allez analyser. Vous pouvez imaginer une table SAS comme un tableau avec : • en colonnes, les variables (âge, sexe, diplôme…) ; • en lignes, les observations (des individus, des périodes…). Si vous ne regardez qu’une colonne, vous verrez l’ensemble des modalités que peut prendre une variable au sein de votre population. Sur une ligne, vous verrez les modalités prises par toutes les variables pour une observation donnée. Afin de mieux comprendre la structure d’une table de données, nous avons ouvert au moyen de l’EXPLORATEUR la table CLASS, livrée avec SAS 9.1 et 9.2. Pour ouvrir cette table, allez dans la fenêtre EXPLORATEUR, double-cliquez sur BIBLIOTHEQUE, puis sur SASHELP et enfin sur CLASS. Figure 1.3 • Ouvrir une table dans la fenêtre VIEWTABLE. SAS Livre Page 16 Jeudi, 18. septembre 2008 6:03 18 16 ◆ SAS Les variables contenues dans cette table sont NAME, SEX, AGE, HEIGHT et WEIGHT. Les observations sont relatives à des individus. Cette table en contient 19. Sur la figure 1.3, le nom de la table sur le bandeau est préfixé par le nom de la bibliothèque dans laquelle est stockée cette table (voir section 1.3.4). Cet éditeur de table ne doit pas être confondu avec un tableur. Il est possible d’apporter certaines modifications à la table via la fenêtre VIEWTABLE (modification de certaines valeurs, tris, mises en forme…), mais pour toutes modifications majeures, vous devrez passer par une étape DATA et donc par l’écriture d’un programme dans la fenêtre EDITEUR. Avant de modifier une table et de créer les variables dont vous aurez besoin, vous devez créer une table. Cette étape de création est extrêmement importante puisqu’elle conditionne votre résultat final : si votre table n’est pas le reflet exact des données dont vous disposez, les analyses que vous pourrez mener par la suite n’auront aucune valeur. SAS offre des outils qui vous permettent de vous assurer que votre table est bien une fidèle reproduction de vos données originales. Ces divers outils seront présentés dans la conclusion du chapitre 2. Nous allons voir dans ce premier chapitre comment, dans le cas le plus simple, créer une table SAS à partir de données. Les données que vous souhaitez voir transformées en une table SAS peuvent prendre deux formes : soit elles sont déjà dans un fichier informatique, soit elles sont sur une feuille de papier et vous devez les entrer dans la fenêtre EDITEUR. Nous allons traiter ce dernier cas, que vous rencontrerez très rarement, en premier. Vous pourrez ainsi vous familiariser avec les tables SAS et comprendre comment SAS interprète les données qui lui sont soumises. 1.3 Cas simple : les informations sont séparées par un espace Dans cette section, nous allons créer nos premières tables SAS. Au-delà de ce travail, il s’agit aussi d’approfondir notre connaissance du fonctionnement de SAS et son environnement. L’exécution de notre premier programme nous permettra de nous familiariser avec l’EDITEUR SAS et les bibliothèques. 1.3.1 Créons notre première table SAS Programme 1.1 DATA test; INPUT CARDS; 78 5 5 1161 35 6 3 1336 82 1 5 1499 ;RUN; x1 x2 x3 x4 x5 $; ABÉLIEN ALMÉRIC ANIEL Nous sommes ici dans le cas le plus simple : il y a cinq variables à saisir (X1 X2 X3 X4 X5) et vous observez la présence de cinq modalités par observations (78 5 5 1161 ABÉLIEN pour la première observation). Les modalités à saisir sont séparées les unes SAS Livre Page 17 Jeudi, 18. septembre 2008 6:03 18 Créer une table SAS ◆ 17 des autres par un espace1. Sur chaque ligne du programme, apparaissent les modalités prises par les variables pour une observation (et une seule). DATA test; Cette instruction demande à SAS de créer une table que l’on va appeler TEST. Cette commande, comme TOUTES les commandes de SAS, se termine par un « ; ». Si vous oubliez de conclure une instruction par un point-virgule, le programme ne s’exécutera pas. Au début, 80 % des erreurs de programmation que vous rencontrerez seront liées à des « ; » oubliés. Le nom d’une table ne doit pas excéder 32 caractères. Vous pouvez utiliser toutes les lettres non accentuées et le signe « _ ». Il peut contenir des chiffres mais ne doit pas débuter par un chiffre. SAS ne fait pas la distinction entre les majuscules et les minuscules. La table TEST est donc parfaitement équivalente à la table test. Si, au moyen de l’EXPLORATEUR, vous recherchez votre table TEST, celle-ci est placée dans la bibliothèque WORK et a pour nom ‘Test’. Pour écrire le programme, vous pouvez employer aussi bien les majuscules que les minuscules. La mise en forme du programme n’a aucune importance : vous pouvez ajouter autant d’espaces ou de sauts de lignes que vous le souhaitez entre, par exemple, les termes DATA et TEST. INPUT x1 x2 x3 x4 x5 $; Dans cette table TEST, il y a cinq variables. X1, X2, X3 et X4 sont des variables numériques, X5 est une variable alphanumérique (du texte) – on indique à SAS qu’une variable est alphanumérique en ajoutant le signe « $ » après son nom. INPUT est une instruction essentielle puisqu’elle permet à SAS de comprendre la structure des données brutes qu’il va devoir transformer en une table SAS. Nous disposons, comme nous le verrons par la suite, d’un ensemble d’options qui indiqueront la structure et la nature de ces données, et comment elles doivent être interprétées pour pouvoir être utilisées dans une table SAS. Vos variables peuvent prendre à peu près n’importe quel nom. Celui-ci ne doit pas dépasser 32 caractères (les versions plus anciennes de SAS n’acceptaient que des noms de variables de 8 caractères au maximum). Le nom de votre variable peut contenir des lettres non accentuées, des chiffres et le signe « _ ». En revanche, les signes %, $, !, *, &, #, @ sont à proscrire. Le nom de votre variable ne peut pas commencer par un chiffre. En ce qui concerne les noms des variables, SAS ne fait aucune différence entre les majuscules et les minuscules. SAS ne fait pas de distinction entre les variables TOTO et toto, ce qui implique que vous ne pouvez pas, au sein d’une même table, créer à la fois une variable X1 et une variable x1. Si, au moment de la création de la table, vous déclarez la création d’une variable « ToTo », SAS écrira systématiquement « ToTo » dans ses sorties lorsqu’il y aura invocation de cette variable, mais vous pourrez appeler sans aucune difficulté cette variable lors de procédures ultérieures au moyen de toto, TOTO, tOtO, TotO, etc. Avant SAS 9, vous ne pouviez avoir au maximum que 32 767 variables dans une table SAS. Avec les versions 9 de SAS, seul votre ordinateur vous limite. 1. Si vos modalités sont séparées par plusieurs espaces, cela ne change rien. Si vous ajoutez des espaces dans le programme 1.1, par exemple, la table sera parfaitement créée. SAS Livre Page 18 Jeudi, 18. septembre 2008 6:03 18 18 ◆ SAS Le nombre d’observations que vous pouvez inclure dans une table SAS est illimité. Une fois de plus, seules les capacités de votre ordinateur limiteront le nombre d’observations de votre table. À titre de comparaison, une feuille Excel 2003 ne comprend que 256 colonnes et 65 536 lignes1. Le séparateur décimal interne à SAS est le point : 3.14. Si vous ne précisez pas l’INFORMAT (voir section 2.8.) qui permet de faire comprendre à SAS des données avec le séparateur décimal virgule, « 3,14 » ne sera pas compris comme un chiffre. CARDS; Au moyen de cette instruction, vous indiquez ici à SAS que les données arrivent. Vous pouvez aussi utiliser l’instruction DATALINES. 78 5 5 1161 ABÉLIEN 35 6 3 1336 ALMÉRIC 82 1 5 1499 ANIEL Voici donc les données : les observations sont présentées en lignes. Pour le premier individu X1=78, X2=5, X3=5, X4=1161 et X5 (variable alphanumérique)=ABÉLIEN. ;RUN; Nous avons déjà indiqué qu’une commande SAS prend généralement fin avec un « ; ». Lorsqu’on constitue une table SAS, il est important de situer le point-virgule qui marque la fin de l’arrivée des données sur la ligne qui suit la dernière donnée. Vous perdez la dernière ligne de données si, au lieu de 82 1 5 1499 ANIEL ;RUN; vous entrez : 82 1 5 1499 ANIEL; RUN; Vous remarquerez que, dans ce cas, le fond jaune caractéristique des plages de saisie des données a disparu et que les données numériques apparaissent en sarcelle (bleuvert moyen). En général, SAS n’accorde aucune importance aux retours chariot. Faites cependant attention au retour chariot dans les parties de programmes où sont présentées les données. Dans certains cas, vous pourriez avoir une table différente de vos données originales. L’instruction RUN qui clôt le programme n’est pas obligatoire si vous utilisez une instruction CARDS (ou DATALINES). Votre programme sera parfaitement exécuté sans celui-ci mais vous devrez le soumettre jusqu’au point-virgule placé sur la ligne après la dernière ligne de données. 1.3.2 L’éditeur SAS : une aide à la programmation SAS est conscient que son langage de programmation peut être compliqué et vous aide en affichant certains mots dans des couleurs différentes. Il est important de prendre garde aux couleurs prises par les différents éléments de votre programme puisqu’elles peuvent, avant même que vous ne soumettiez votre programme, vous indiquer si celui-ci à des chances d’être exécuté correctement ou pas. 1. 1 048 576 lignes et 16 384 colonnes dans la version 2007. SAS Livre Page 19 Jeudi, 18. septembre 2008 6:03 18 Créer une table SAS ◆ 19 La lecture seule de ce livre en noir et blanc ne vous éclairera pas beaucoup quant aux différentes couleurs que vous rencontrerez dans votre éditeur. Merci de reproduire dans votre éditeur SAS le programme 1.21. Programme 1.2 * programme de création de la table test; /* le programme */ DATA test; INPUT x1 8.4 x2 ddmmyy.; INFILE 'c:\mes documents\test.txt'; VAR x1; IMPUT x2; IF x1=1 THEN z1="texte"; FORMAT x1 8.4; CARDS; 1 2 3 4 ;RUN; PROC PRINT DATA=test; VAR x1; RUN; %MACRO print ; %LET texte=test; PROC PRINT;RUN; %MEND ; %print En vert apparaissent les commentaires que vous avez introduits dans vos programmes. Ils sont introduits : • au moyen d’un astérisque (*) – le commentaire prend alors fin au premier « ; » rencontré ; • au moyen de « /* » – le commentaire prend alors fin lorsque vous entrez la chaîne « */ ». Les mots clés ouvrant et fermant les étapes (DATA/RUN, PROC/RUN et %MACRO/%MEND) apparaissent en bleu et en gras. À l’intérieur des étapes DATA et PROC, les instructions propres à l’étape sont reconnues par l’éditeur et s’affichent en bleu clair (INPUT, INFILE, IF, THEN, FORMAT, CARDS pour l’étape DATA – VAR et DATA pour l’étape PROC PRINT). Les instructions VAR et IMPUT de l’étape DATA ne sont pas reconnues par l’éditeur et apparaissent en rouge dans le programme (VAR parce que cette instruction n’est pas possible dans l’étape DATA et IMPUT parce que cette instruction n’existe pas – les erreurs de frappe dans les noms des instructions peuvent donc être repérées). Les chaînes de caractères entre quotes, simples ou doubles, sont reprises en violet. Elles indiquent soit un chemin vers un fichier externe, soit la modalité d’une variable alphanumérique. La zone de saisie des données est présentée avec un fond jaune. Les noms des INFORMAT (DDMMYY.), des FORMAT et des constantes numériques (1 dans la ligne débutant par IF) apparaissent en sarcelle (bleu-vert moyen). 1. Ce programme peut aussi être téléchargé sur le site compagnon de cet ouvrage : www.sas-sr.com. SAS Livre Page 20 Jeudi, 18. septembre 2008 6:03 18 20 ◆ SAS Les constantes numériques apparaissent de plus toujours en gras ; c’est également le cas de certains FORMAT ou INFORMAT (de type W.D : 8.4)1. Les autres éléments des programmes de l’étape DATA et PROC apparaissent en noir : il s’agit soit des noms des tables créées ou utilisées (TEST), ou des variables (X1, X2, Z1). La programmation macro présente des singularités : le texte à l’intérieur des macroprogrammes apparaît généralement en noir non gras, sauf les éléments propres au langage macro. Ces éléments débutent généralement par le signe % (%LET dans le programme 1.2) et apparaissent en bleu. Il est important d’observer les couleurs prises par le texte. En cas de rouge, il est parfaitement inutile de soumettre votre programme. Si le mot PROC ne devait pas apparaître en bleu et en gras, relisez votre programme et trouvez-en la raison avant toute demande d’exécution (retirez le point-virgule placé juste avant PROC PRINT, par exemple). Figure 1.4 • Capture d’écran du programme 1.1. Dans l’éditeur, un signe apparaît systématiquement à gauche de la commande DATA ou PROC de début d’étape. En cliquant sur ce symbole, vous avez la possibilité de réduire et de développer chaque étape DATA ou PROC. 1.3.3 Demander l’exécution d’un programme Une fois le programme saisi, il convient de demander à SAS de l’exécuter. Ceci peut être fait de plusieurs manières mais dans tous les cas, vous devez au préalable sélectionner votre programme de la même manière que vous sélectionnez un texte dans votre traitement de texte. Pour demander l’exécution de votre programme, vous avez plusieurs possibilités : • Vous appuyez sur la touche F3 de votre clavier. • Vous cliquez sur l’icône située sur la barre d’outils. • Vous sélectionnez la commande Soumettre du menu Exécuter. • Vous cliquez du bouton droit et choisissez dans la zone de l’éditeur Soumettre sélection ou Soumettre tout. • Pour les programmes qui utilisent beaucoup de ressources, vous avez aussi la possibilité de demander une exécution en mode BATCH. Vous devez saisir votre programme, puis l’enregistrer sur votre disque dur. Terminez votre session SAS 1. Les INFORMAT sont traités dans la section 2.8., les FORMAT sont présentés dans la section 5.3. SAS Livre Page 21 Jeudi, 18. septembre 2008 6:03 18 Créer une table SAS ◆ 21 (quittez SAS) et, au moyen de l’explorateur Windows, retrouvez votre programme sur votre disque dur. Cliquez du bouton droit et sélectionnez Batch Submit with SAS 9.2. Figure 1.5 • L’exécution d’un programme en mode Batch. Si vous ne sélectionnez pas votre programme et si vous demandez une exécution, toutes les lignes de programme saisies dans la fenêtre EDITEUR seront exécutées (même les parties de programme que vous ne voulez pas exécuter). Si votre programme disparaît (c’est possible avec certaines versions de SAS), tapez sur la touche F4 ou demandez dans le menu Exécuter/Rappeler la dernière exécution pour le faire réapparaître. Si, pour une raison ou une autre, vous souhaitez interrompre le programme, vous pouvez soit appuyer simultanément sur Ctrl et Pause ou, dans la barre d’outils, sur le bouton . Dans tous les cas, la fenêtre présentée à la figure 1.6 apparaîtra. Figure 1.6 • Interrompre un programme SAS – première étape. Confirmez l’annulation de l’exécution de votre programme (voir figure 1.7). Figure 1.7 • Interrompre un programme SAS – seconde étape. SAS Livre Page 22 Jeudi, 18. septembre 2008 6:03 18 22 ◆ SAS Merci de soumettre maintenant à SAS le programme 1.1 présenté précédemment. Rien ne semble se passer. C’est une fausse impression. Passez dans la fenêtre JOURNAL. Si SAS a correctement exécuté votre programme, vous devez voir votre programme s’afficher en noir, ainsi que des commentaires. Tant que ces commentaires sont en bleu, tout va bien. Si vous voyez du vert, c’est qu’il y a eu un « petit » problème : SAS a quand même exécuté votre programme mais il se pose des questions quant à la pertinence de celui-ci. Si vous voyez du rouge, c’est qu’il y a eu une erreur de programmation majeure. Le programme n’a pas été exécuté. Lorsque vous examinez votre fenêtre JOURNAL, il convient de commencer à lire à partir du début du programme : une erreur qui apparaît en fin de programme peut être due à une erreur intervenue plus tôt. Si vous vous focalisez uniquement sur la dernière erreur, il est bien possible que jamais vous ne trouviez pourquoi le programme n’a pas fonctionné. Ces erreurs sont généralement de trois types : • Vous avez mal orthographié certains mots clés. • Des « ; » sont manquants ou non valides. • Vous faites appel à des options ou à des commandes non valides. Vous devez ensuite systématiquement vérifier que votre table est bien conforme aux données originales. Si votre table ne comprend pas trop d’observations, vous pouvez utiliser la procédure PROC PRINT : PROC PRINT DATA=test; RUN; Chaque procédure de SAS effectue une tâche bien précise. La procédure PRINT demande par exemple l’impression de la table. Maintenant, quelle que soit la procédure employée, vous aurez toujours le même type de syntaxe : PROC XXXXX DATA=xxxxx options; Lignes de commandes; RUN; Si vous ne faites pas intervenir d’options au niveau de la commande de procédure (PROC XXXX), vous pouvez ne pas indiquer la table sur laquelle vous voulez exécuter cette procédure. Elle sera alors exécutée sur la dernière table créée. Sur votre fenêtre SORTIE apparaît la table telle que SAS l’a comprise. Pour limiter le nombre d’observations (imaginez ce qui se passe si votre table comprend quelques millions d’observations), vous pouvez spécifier le nombre d’observations à envoyer dans la fenêtre SORTIE. PROC PRINT DATA=test (OBS=10); RUN; Dans le cas présent, les dix premières observations seront envoyées dans votre fenêtre SORTIE. Si vous souhaitez voir les dix dernières observations, regardez dans un premier temps le nombre d’observations de votre table. Celui-ci est indiqué dans la fenêtre JOURNAL lors de la création de votre table. Imaginons que celui-ci soit égal à 150000. Ensuite : PROC PRINT DATA=test (FIRSTOBS=149990); RUN; SAS Livre Page 23 Jeudi, 18. septembre 2008 6:03 18 Créer une table SAS ◆ 23 Pour imprimer les observations 9990 à 10000 : PROC PRINT DATA=test (FIRSTOBS=9990 OBS=10000); RUN; La valeur donnée à OBS est nécessairement supérieure à celle donnée à FIRSTOBS. 1.3.4 Les bibliothèques Si tout se passe bien lors de la phase de création de la table, SAS vous donne ce type de message dans la fenêtre JOURNAL : NOTE: The data set WORK.TEST has 3 observations and 5 variables. Cela signifie qu’il a créé une table TEST dans la bibliothèque WORK. Par défaut, vous disposez de quatre bibliothèques : WORK, SASHELP, SASUSER et MAPS1. Pour accéder au contenu de ces bibliothèques, cliquez sur l’onglet EXPLORATEUR, puis double-cliquez sur BIBLIOTHEQUES. Figure 1.8 • Les bibliothèques. La bibliothèque MAPS contient les fonds de cartes que vous pouvez utiliser dans la procédure graphique GMAP. La bibliothèque SASHELP contient les tables qui vous permettent de refaire les exemples proposés dans l’aide. Elle contient également un certain nombre de fichiers nécessaires au bon fonctionnement de SAS. Vous ne pouvez rien écrire dans ces bibliothèques. La bibliothèque SASUSER contient les informations qui sont propres à l’utilisateur. WORK est la bibliothèque temporaire, vidée de son contenu lorsque vous quittez SAS. C’est dans cette bibliothèque que seront placées, par défaut, les tables que vous allez créer au cours d’une session. Si vous souhaitez conserver cette table pour une utilisation ultérieure, vous devez la placer dans une bibliothèque permanente. La commande DATA TEST est parfaitement équivalente à la commande DATA WORK.TEST. Vous trouverez dans l’aide SAS ou sur Internet de très nombreux programmes dans lesquels les auteurs précisent systématiquement la bibliothèque WORK pour indiquer que la table est à placer dans la bibliothèque temporaire. Dans cet ouvrage, si aucune bibliothèque n’est indiquée, c’est que la table créée ou modifiée est située dans la bibliothèque temporaire. Pour créer une bibliothèque permanente, vous pouvez utiliser la commande suivante : LIBNAME lib 'c:\mes documents'; 1. Cette dernière bibliothèque peut ne pas être présente. SAS Livre Page 24 Jeudi, 18. septembre 2008 6:03 18 24 ◆ SAS LIBNAME : demande à SAS de créer une bibliothèque permanente. Le nom de cette bibliothèque est LIB. ‘c:\mes documents\’ est l’emplacement physique, sur votre disque dur, de cette bibliothèque. La commande LIBNAME fait partie des commandes qui définissent votre environnement, elle se place en dehors des commandes DATA et PROC. Le chemin physique doit être encadré par des quotes, simples ou doubles. Cependant, si dans le nom d’un de vos dossiers cités apparaît une quote, vous devrez impérativement utiliser des quotes doubles : LIBNAME toto "C:\intro_SAS\fichiers pour l’analyse" ; La seule difficulté consiste ici à donner à SAS un chemin DOS correct. Si votre chemin n’est pas correct, la bibliothèque ne peut pas être créée. Il est possible d’attribuer à une bibliothèque plusieurs emplacements. Ainsi : Programme 1.3 LIBNAME lamar ('d:\mes documents\sas exemple' 'c:\mes documents'); Vous pourrez aussi créer une bibliothèque en utilisant l’icône « Nouvelle bibliothèque » située sur la barre d’outils : Figure 1.9 • Le bouton Nouvelle bibliothèque. Autre possibilité : cliquez du bouton droit dans la fenêtre EXPLORATEUR active, puis sélectionnez Nouveau. La fenêtre présentée à la figure 1.10 apparaîtra. Figure 1.10 • Création d’une nouvelle bibliothèque. SAS Livre Page 25 Jeudi, 18. septembre 2008 6:03 18 Créer une table SAS ◆ 25 Vous devez alors préciser le nom, le moteur et le chemin physique de votre bibliothèque. En spécifiant un moteur, vous avez la possibilité d’indiquer à SAS quel type de fichiers il va trouver à l’emplacement physique que vous lui indiquez. Le moteur par défaut est V9 (pour SAS, version 9)1. En cochant Activer au démarrage, la bibliothèque que vous créez sera systématiquement définie à chaque début de session. Si vous ne cochez pas Activer au démarrage, la bibliothèque sera détruite à la fin de votre session SAS. Attention, cela ne signifie pas que l’ensemble des tables créées et placées dans cette bibliothèque vont être détruites, mais que l’association entre le nom de votre bibliothèque et son emplacement physique sur votre disque dur sera perdue. Vous aurez toujours la possibilité, au cours d’une session ultérieure, de réallouer à cet emplacement physique une bibliothèque, de même nom ou pas, et d’analyser à nouveau vos tables sauvegardées. Le nom d’une bibliothèque ne doit pas excéder 32 caractères. Vous pouvez utiliser toutes les lettres non accentuées et le signe « _ ». Il peut contenir des chiffres mais ne doit pas débuter par un chiffre. Si vous avez à spécifier un moteur particulier, vous pouvez aussi le faire au moyen de la commande LIBNAME. LIBNAME old V6 'C:\intro_SAS\tables V6 de SAS'; Dans tous les cas, il conviendra de regarder la fenêtre JOURNAL afin de voir si votre bibliothèque a été correctement créée. Parmi les messages que vous trouverez dans la fenêtre JOURNAL, vous observerez le message suivant : Moteur : V9 Cela signifie qu’à cet emplacement, seront à lire et seront écrites des tables enregistrées dans le format propre aux versions 7 (très peu distribuée), 8 et 9 de SAS2. Parmi les moteurs possibles, vous remarquez la présence d’un moteur Excel. Vous devinez donc qu’il est possible de lire et d’écrire directement au moyen de SAS des fichiers Excel. Attention cependant : lorsque vous créez une bibliothèque de type Excel, vous devez spécifier le nom d’un classeur – les feuilles contenues dans le classeur pourront être ensuite examinées au moyen de SAS. Les noms des feuilles sont cependant différents des noms que vous pourrez lire dans la fenêtre EXPLORATEUR3. Pour placer votre table TEST dans votre bibliothèque, il vous suffit d’exécuter le programme 1.4. Programme 1.4 DATA lib.test; SET test; RUN; 1. La version SAS 9.2 propose différents moteurs. Dans leurs versions Windows, SAS 9.2 et 9.1.3 proposent dix moteurs différents (voir l’aide SAS, entrée ENGINE system option). L’accès à ces différents moteurs dépend des caractéristiques de votre SAS Access. 2. La lecture de tables créées par SAS 6 (sauf celles créées par la version 6.06) et par la version 5 ne pose pas de difficulté. Pour plus de détails, voir l’aide SAS (entrée library engines, V9 engine). 3. Pour connaître les noms attribués aux feuilles, vous pouvez exécuter le programme suivant : PROC CONTENTS DATA=old._all_; RUN; OLD est ici une bibliothèque de type Excel créée au moyen de la commande : LIBNAME old EXCEL 'c:\intro_SAS\xls\classeur1.xls'; SAS Livre Page 26 Jeudi, 18. septembre 2008 6:03 18 26 ◆ SAS La première instruction demande la création d’une table TEST dans la bibliothèque LIB. La seconde instruction indique que SAS doit utiliser (SET) la table TEST, située actuellement dans la bibliothèque temporaire. Le RUN demande l’exécution du programme. Dans le cas où votre bibliothèque contient plusieurs chemins physiques, SAS ira écrire votre table à l’emplacement indiqué par le premier chemin. Dans le cas LAMAR à double chemin (voir programme 1.3), les tables seront écrites dans ‘d:\mes documents\sas exemples’. Des tables peuvent avoir des noms identiques tant qu’elles sont situées dans des bibliothèques différentes. À l’issue de l’éxécution du programme 1.4, vous disposez de deux tables TEST, une dans la bibliothèque WORK et l’autre dans la bibliothèque TOTO. Il est possible de créer directement la table SAS dans une bibliothèque définie au préalable : Programme 1.5 DATA toto.test; INPUT X1 X2 X3 X4 X5 $; CARDS; 78 5 5 1161 ABÉLIEN 35 6 3 1336 ALMÉRIC 82 1 5 1499 ANIEL ;RUN; Exercice 1.1 : Voici des données que vous allez devoir entrer dans une table SAS : a1t23 b 4 abc 5 6 c7z89 d 10 rt 11 12 Combien avez-vous de variables ? d’observations ? Rédigez le programme qui créera votre table. 1.4 Comprenons bien le cas simple Avant d’aller plus loin dans la création de tables SAS, voyons ce qui se passe dans les cas suivants afin de bien comprendre que ce qui suit votre instruction INPUT conditionne votre résultat – nos différents exemples nous permettront aussi d’introduire la gestion des valeurs manquantes dans une table SAS. Programme 1.6 Résultat 1.1 DATA test; INPUT x1 x2 x3 x4 x5; CARDS; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 ;RUN; Obs 1 2 3 4 5 6 7 8 9 10 4x1 4x2 4x3 4x4 4x5 1 6 11 16 21 26 31 36 41 46 2 7 12 17 22 27 32 37 42 47 3 8 13 18 23 28 33 38 43 48 4 9 14 19 24 29 34 39 44 49 5 10 15 20 25 30 35 40 45 50 SAS Livre Page 27 Jeudi, 18. septembre 2008 6:03 18 Créer une table SAS ◆ 27 Le programme 1.6 représente le cas standard : par observation, nous avons cinq modalités – cinq variables sont déclarées au moyen de la commande INPUT. Programme 1.7 DATA test; INPUT x1 x2 x3 CARDS; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 ;RUN; Résultat 1.2 Obs ; 1 2 3 4 5 6 7 8 9 10 4x1 4x2 4x3 1 6 11 16 21 26 31 36 41 46 2 7 12 17 22 27 32 37 42 47 3 8 13 18 23 28 33 38 43 48 4 Dans le programme 1.7, nous indiquons à SAS qu’il a trois variables à saisir : une fois qu’il a saisi ces trois variables, SAS passe à la ligne de données suivante et néglige les informations en fin de ligne. Programme 1.8 Résultat 1.3 DATA test; INPUT x1 x2 x3 x4 x5; CARDS; 1 2 3 4 … … … 49 50 ;RUN; Obs 1 2 3 4 5 6 7 8 9 10 4x1 4x2 4x3 4x4 4x5 1 6 11 16 21 26 31 36 41 46 2 7 12 17 22 27 32 37 42 47 3 8 13 18 23 28 33 38 43 48 4 9 14 19 24 29 34 39 44 49 5 10 15 20 25 30 35 40 45 50 Dans le programme 1.8, nous avons indiqué à SAS qu’il avait cinq variables à saisir : s’il ne trouve pas l’information sur la ligne de données, il passe à la ligne suivante pour rechercher cette information. Ces deux exemples doivent malgré tout vous faire comprendre que si, dans votre ligne INPUT, vous avez spécifié trop ou pas assez de variables par rapport aux informations contenues dans le bloc CARDS, vous risquez certains problèmes comme le montre le programme 1.9. Dans le programme 1.10, il y a bien cinq variables à saisir mais pour certaines observations, la modalité de la variable X5 est manquante. SAS Livre Page 28 Jeudi, 18. septembre 2008 6:03 18 28 ◆ SAS Programme 1.9 Résultat 1.4 DATA test; INPUT x1 x2 x3 x4 x5 x6; CARDS; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 ;RUN; Obs Programme 1.10 Résultat 1.5 DATA test; INPUT x1 x2 x3 x4 x5; CARDS; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 ;RUN; Obs 4x1 4x2 4x3 4x4 4x5 1 2 3 4 5 6 7 1 6 11 21 26 36 41 2 7 12 22 27 37 42 3 8 13 23 28 38 43 4 9 14 24 29 39 44 5 10 16 25 31 40 46 1 2 3 4 5 4x1 4x2 4x3 4x4 4x5 4x6 1 11 21 31 41 2 12 22 32 42 3 13 23 33 43 4 14 24 34 44 5 15 25 35 45 6 16 26 36 46 SAS, par défaut, procède donc de la manière suivante : il lira autant de modalités qu’il y a de variables déclarées dans la commande INPUT, quitte à aller sur la ligne suivante. Lorsque, pour une observation, il pense avoir connaissance des modalités de toutes les variables déclarées dans la ligne INPUT, il cesse de lire sur la ligne de données et commence l’enregistrement de l’observation suivante sur la ligne de données suivante. Cependant, un certain nombre d’options permettent de modifier le fonctionnement par défaut de SAS comme nous allons le voir incidemment dans la section suivante. 1.5 Les valeurs manquantes sur variables numériques Dans les tables que vous allez construire, certaines de vos variables ne seront pas renseignées pour certaines observations. Nous avons examiné un cas dans lequel seules les modalités de la dernière variable peuvent être valeur manquante (voir programme 1.10). Ce cas est aisément résolu par l’introduction de l’option MISSOVER dans la commande INFILE. La commande INFILE indique généralement à SAS qu’il va recevoir ces données d’un fichier extérieur (voir section 2.1.). Cependant, ici, il n’y a pas de fichier extérieur à SAS Livre Page 29 Jeudi, 18. septembre 2008 6:03 18 Créer une table SAS ◆ 29 lire et ce que l’on souhaite, c’est pouvoir utiliser une option de cette commande INFILE. Comme les données arrivent par la fenêtre EDITEUR, vous ajoutez à côté de cette commande l’option CARDS, puis l’option souhaitée (ici, MISSOVER). Programme 1.11 Résultat 1.6 DATA test; INFILE CARDS MISSOVER; INPUT x1 x2 x3 x4 x5; CARDS; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 ;RUN; Obs 1 2 3 4 5 6 7 8 9 10 4x1 4x2 4x3 4x4 4x5 41 6 11 16 21 26 31 36 41 46 42 7 12 17 22 27 32 37 42 47 43 8 13 18 23 28 33 38 43 48 44 9 14 19 24 29 34 39 44 49 45 10 . 20 25 . 35 40 . 50 Cette option MISSOVER indique à SAS de ne pas rechercher sur la ligne suivante si, sur une même ligne de données, il observe moins de modalités qu’il n’a de variables déclarées dans la commande INPUT. C’est une option intéressante puisqu’elle vous garantit que vous aurez dans votre table autant d’observations que de lignes dans vos données initiales. Attention cependant, cette option MISSOVER n’est pas idéale pour résoudre les problèmes de valeurs manquantes : Programme 1.12 Résultat 1.7 DATA test; INFILE CARDS MISSOVER; INPUT x1 x2 x3 x4 x5; CARDS; 1 2 3 5 6 7 8 9 10 11 12 13 14 . 16 17 18 19 20 21 22 23 24 25 26 27 28 29 . 31 32 33 34 35 36 37 38 39 40 41 42 43 44 . 46 47 48 49 50 ;RUN; Obs 1 2 3 4 5 6 7 8 9 10 4x1 4x2 4x3 4x4 4x5 41 6 11 16 21 26 31 36 41 46 42 7 12 17 22 27 32 37 42 47 43 8 13 18 23 28 33 38 43 48 45 9 14 19 24 29 34 39 44 49 4. 10 . 20 25 . 35 40 . 50 Vous constatez ici que votre table n’est pas à l’image de vos données originales. L’introduction de l’option MISSOVER ne règle en rien le problème puisque, pour la première observation, X4 a pour modalité 5 et X5 est déclaré valeur manquante. C’est exactement le type d’erreur que vous devez absolument éviter. SAS Livre Page 30 Jeudi, 18. septembre 2008 6:03 18 30 ◆ SAS Dans le cadre simple qui est le nôtre actuellement (les modalités des variables à saisir sont séparées par des espaces), il est impératif que les valeurs manquantes soient marquées par quelque chose : • soit, comme dans le programme 1.12, par un point (signe par défaut des valeurs manquantes des variables numériques) ; • soit, comme dans le programme 1.13, par une lettre quelconque en prenant soin au préalable de déclarer cette lettre comme signe de valeur manquante. Programme 1.13 Résultat 1.8 MISSING x; DATA test; INPUT x1 x2 x3 x4 x5; CARDS; 1 2 3 x 5 6 7 8 9 10 11 12 13 14 . 16 17 18 19 20 21 22 23 24 25 26 27 28 29 . 31 32 33 34 35 36 37 38 39 40 41 42 43 44 . 46 47 48 49 50 ;RUN; Obs 1 2 3 4 5 6 7 8 9 10 4x1 4x2 4x3 4x4 4x5 41 46 11 16 21 26 31 36 41 46 42 47 12 17 22 27 32 37 42 47 43 48 13 18 23 28 33 38 43 48 4x 49 14 19 24 29 34 39 44 49 45 10 . 20 25 . 35 40 . 50 Cette dernière option peut être intéressante s’il existe plusieurs raisons à une valeur manquante. Imaginons que votre table reprenne les résultats qu’une enquête effectuée auprès de consommateurs sur les caractéristiques de leur abonnement auprès des opérateurs de téléphonie mobile. La première question posée est : « Quel est le nom de votre opérateur de téléphonie mobile ? » • Certains consommateurs ne vont pas répondre parce qu’ils ne le souhaitent pas. • D’autres ne répondront pas parce qu’ils ne sont pas concernés par la question (« je n’ai pas de téléphone portable »)1. Le traitement à imposer à vos données étant différent en fonction de la raison qui a poussé le consommateur à ne pas répondre, il peut être utile de distinguer ici les raisons de cette non-réponse. Si vous omettez l’instruction MISSING, SAS construira, en l’absence de toute autre erreur de paramétrage de votre ligne INPUT, une table à l’image de votre fichier initial à cette différence près que les « x » seront remplacés par des « . ». En effet, vous avez déclaré dans votre instruction INPUT que les variables sont numériques. Si, lors de son examen des données, SAS lit autre chose que du numérique, il vous envoie dans la fenêtre JOURNAL un message de ce type : NOTE: Données incorrectes pour x4 en ligne 5 7-7. RÈGLE : ----+----1----+----2----+----3----+----4----+----5----+----6----+----7 5 1 2 3 x 5 x1=1 x2=2 x3=3 x4=. x5=5 _ERROR_=1 _N_=1 1. Nous imaginons ici que la question « Avez-vous un téléphone portable ? » n’a pas été posée, que l’enquêteur a saisi d’un « x » les réponses « je n’ai pas de téléphone portable » et d’un « . » les nonrépondants. SAS Livre Page 31 Jeudi, 18. septembre 2008 6:03 18 Créer une table SAS ◆ 31 Ce message signifie : ce que SAS voit pour la variable X4 ne lui convient pas. SAS vous invite à regarder la ligne 5 de cette fenêtre JOURNAL. Vous pourrez y lire entre les colonnes 7 et 7 (SAS vous offre une règle et vous envoie vers le « x ») cette modalité qui ne semble pas convenir pour cette variable que vous avez déclarée comme étant numérique. Sur la dernière ligne, on voit ce que SAS a fait de cette modalité : il a transformé le « x » en une valeur manquante : « . ». La table est tout de même créée mais vous avez perdu une information précieuse. Attention enfin à cette instruction MISSING : vous remarquez qu’elle est placée avant l’instruction DATA. Il s’agit en effet d’une instruction qui modifie le fonctionnement par défaut de SAS au même titre que l’instruction OPTIONS (voir section 5.6.). Pendant toute la durée de votre session, « x » sera considéré comme possible signe de valeur manquante des variables numériques et, si vous avez à créer plusieurs tables au cours d’une même session, il est possible que vous obteniez des résultats non désirés1. Nous vous recommandons, une fois la table créée, de revenir au fonctionnement par défaut de SAS en soumettant l’instruction MISSING;. 1.5.1 Plus de deux modalités aux valeurs manquantes L’introduction de deux valeurs aux valeurs manquantes permet d’ajouter une information qualitative sur la variable. Il peut arriver que la modalité d’une variable soit manquante pour plus de deux raisons. Admettons que ces raisons soient A, B et C. Il demeure possible de conserver l’information lors de la création de votre table SAS et ce, de deux façons : • Il vous suffit de déclarer plusieurs modalités possibles pour les valeurs manquantes dans l’instruction MISSING. MISSING A B C; • Demandez à la personne qui va créer votre fichier brut à ce que les modalités A, B et C, pour cette variable, soient précédées d’un point. Programme 1.14 Programme 1.15 Résultat 1.9 DATA test; INPUT x1; CARDS; 1 2 .A 4 .B 6 7 .C 9 ;RUN; MISSING A B C; DATA test; INPUT x1; CARDS; 1 2 A 4 B 6 7 C 9 ;RUN; Obs 1 2 3 4 5 6 7 8 9 x1 1 2 A 4 B 6 7 C 9 1. Ce sera le cas si, au cours d’une même session, vous soumettez le programme 1.15 et le programme 2.16 (voir section 2.4). SAS Livre Page 32 Jeudi, 18. septembre 2008 6:03 18 32 ◆ SAS Votre variable X1 est numérique, vous pourrez donc lui soumettre tous les traitements possibles sur variables numériques tout en conservant votre information de nature qualitative. 1.5.2 Cas des valeurs manquantes saisies par aucun signe À ce stade, nous savons donc gérer une valeur manquante si elle est saisie dans les données originales par un « . » ou par une lettre quelconque. Que faire si elle est saisie par un espace comme dans l’exemple suivant dans lequel X3 n’est pas renseigné pour les observations 1 et 3 ? 1 2 4 5 6 7 8 9 10 11 12 14 15 16 17 18 19 20 Il faut déjà espérer que les valeurs manquantes soient toujours saisies par la même chose (ici, trois espaces). Si tel est le cas, sélectionnez votre zone de données et au moyen d’un Chercher/Remplacer (menu Édition), remplacez les trois espaces par « ’espace’ . ‘espace’ ». Vous obtiendrez ainsi : 1 2 . 4 5 6 7 8 9 10 11 12 . 14 15 16 17 18 19 20 Si maintenant, votre enregistrement est de la forme : 15 12 53 48 Vous n’avez aucun moyen de savoir quelle variable est manquante et il y a peu d’espoir que vous puissiez vous en sortir. Ce chapitre nous a expliqué comment SAS fonctionne par défaut lorsqu’il crée une table. Nous avons aussi vu qu’au moyen d’options, il était possible de modifier le fonctionnement par défaut. Nous pouvons donc nous intéresser maintenant à des cas moins standard. SAS Livre Page 33 Jeudi, 18. septembre 2008 6:03 18 2 Pour aller plus loin dans la création de tables SAS Au sommaire de ce chapitre : 2.1. La création d’un fichier SAS au moyen d’un fichier informatique 2.2. Autres indicateurs de séparation des modalités 2.3. Les données présentées en colonnes 2.4. Les espaces dans les modalités de variables alphanumériques 2.5. Toutes les observations apparaissent sur une même ligne 2.6. Les modalités relatives à une même observation apparaissent sur plusieurs lignes 2.7. Retour sur la gestion des valeurs manquantes 2.8. Les INFORMAT : format des valeurs entrantes 2.9. Exportons nos tables SAS Les données que vous utiliserez pour créer une table SAS n’auront pas toujours la forme indiquée dans le premier chapitre. Ce deuxième chapitre décrit les outils de programmation utiles pour traiter des cas s’éloignant du cas simple afin de créer vos tables SAS. 2.1 La création d’une table SAS à partir d’un fichier informatique1 Imaginons que vous ayez 10 000 observations à faire entrer dans votre table SAS. Ces observations sont dans un fichier au format TXT sur votre disque dur. Vous pourriez ouvrir ce fichier, copier les 10 000 lignes et les coller dans l’éditeur de SAS. La procédure risquerait d’être lourde. On traitera ce genre de données comme ci-après. 1. Tous les fichiers de données bruts TESTxx.txt sont téléchargeables sur le site compagnon de cet ouvrage : www.sas-sr.com. SAS Livre Page 34 Jeudi, 18. septembre 2008 6:03 18 34 ◆ SAS Programme 2.1 DATA test; INFILE 'C:\intro_SAS\fichiers\test21.txt'; INPUT X1 X2 X3 X4 X5 $; RUN; Dans notre exemple, les valeurs prises par nos différentes variables sont séparées par un espace. Après la commande INFILE, vous devez indiquer entre quotes le chemin d’accès à votre fichier. Ici, le fichier à traiter est un fichier TXT. SAS peut traiter des fichiers *.DAT ou *.CSV au moyen de la commande INFILE1. Il peut être utile de limiter dans un premier temps les traitements à un nombre réduit d’observations. Par exemple, vous avez 100 000 observations mais, dans une phase préparatoire, vous souhaitez (pour gagner du temps) traiter uniquement un échantillon : vous pouvez limiter le nombre d’observations à lire au moyen de l’option OBS et aussi préciser quelle ligne dans le fichier brut considérer pour la première observation grâce à la commande FIRSTOBS. Attention si vous combinez les deux commandes : Programme 2.2 DATA test; INFILE 'C:\intro_SAS\fichiers\test22.txt' OBS=50 FIRSTOBS=20; INPUT X1 X2 X3 X4 X5 $; RUN; Votre table ne présentera que les observations représentées sur les lignes 20 à 50. OBS sera donc obligatoirement supérieur à FIRSTOBS. La commande OBS=x indique à SAS de lire jusqu’à la xième ligne du fichier. Ces instructions FIRSTOBS et OBS sont plus utiles qu’il n’y paraît. Si, par exemple, dans un fichier de 50 lignes à transformer en table SAS, les deux premières lignes et la dernière ligne sont occupées par des données inutiles. Programme 2.3 DATA test; INFILE 'C:\intro_SAS\fichiers\test23.txt' FIRSTOBS=3 OBS=49; INPUT X1 X2 X3 X4 X5 $; RUN; Il est possible que chaque ligne de données dans le fichier brut soit particulièrement longue. Tant qu’elles contiennent toutes moins de 256 caractères (blancs compris), cela ne pose pas de problème. Si au moins une ligne devait compter un nombre plus important de caractères, il convient de l’indiquer à SAS au moyen de l’option LRECL dans la commande INFILE. Programme 2.4 DATA test; INFILE 'C:\intro_SAS\fichiers\test24.txt' LRECL=600; INPUT X1-X200; RUN; 1. TXT, CSV et DAT sont les formats les plus usuels. La commande INFILE peut gérer d’autres formats. Consultez l’aide SAS pour plus d’informations. SAS Livre Page 35 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 35 Dans le cas présent, 200 variables numériques sont à créer. Elles ont toutes des modalités comprises entre 10 et 99 et un espace sépare chaque modalité. Un enregistrement (une ligne de données) contient donc 200 * 2 + 199 = 599 caractères. Comment être sûr que SAS a lu l’intégralité de la ligne de données et comment savoir sans ouvrir le fichier que vous n’avez pas besoin de l’option LRECL ? Lorsque vous créez une table SAS, dans la fenêtre JOURNAL, vous aurez, parmi les messages en bleu, le commentaire suivant : NOTE: 6 records were read from the infile ‘C:\intro_SAS\fichiers\bourvil2.txt’. The minimum record length was 30. The maximum record length was 41. SAS vous indique ici que la longueur maximale des enregistrements qu’il a traités est de 41 caractères : vous n’avez pas besoin de l’option LRECL. S’il devait indiquer 256, cela signifierait pour vous l’obligation de spécifier un LRECL suffisamment grand pour pouvoir lire dans la fenêtre JOURNAL un « maximum record length » inférieur au LRECL spécifié. Vous disposez aussi d’un module d’importation des données accessible via le menu Fichier, puis Importer des données. Ce module vous permet d’importer des fichiers Excel, Access, Dbase, Lotus 1 2 3, ou des fichiers au format CSV et TXT. Pour que vous puissiez utiliser ce module d’importation, il faut que vos données soient « propres » : elles doivent pouvoir être rentrées telles quelles dans SAS. L’utilisation de ce module d’importation est très simple et vous êtes invité à le découvrir par vousmême. Ce module est particulièrement utile lorsque votre séparateur de modalités est la tabulation comme nous le verrons par la suite. L’utilisation de la commande INFILE oblige pour l’instant l’écriture du chemin DOS complet vers le fichier que vous souhaitez voir transformé en une table SAS. Même en utilisant l’explorateur Windows pour copier ce lien, puis le coller dans l’éditeur, l’écriture du chemin DOS peut être fastidieuse si au cours d’une même session, vous devez créer plusieurs tables. L’instruction FILENAME peut simplifier votre travail. Comme l’instruction LIBNAME, FILENAME agit sur votre environnement et doit donc être exécutée en dehors des étapes DATA ou PROC. FILENAME brut 'C:\intro_SAS\fichiers'; La commande FILENAME permet de préciser un dossier dans lequel est stocké l’ensemble des fichiers que vous souhaitez transformer en tables SAS. Nous nommons ce dossier « brut ». Lors de la création de la table, vous pouvez directement faire référence à ce dossier au moyen de la programmation suivante : DATA test; INFILE brut(test_A.txt); …; RUN; L’instruction FILENAME peut aussi faire référence à un fichier (et non pas à un emplacement physique). Ainsi : FILENAME fichier 'C:\intro_SAS\fichiers\test_B.txt'; L’étape de création de votre table commencera alors de la manière suivante : DATA test; INFILE fichier; …; RUN; SAS Livre Page 36 Jeudi, 18. septembre 2008 6:03 18 36 ◆ SAS 2.2 Autres indicateurs de séparation des modalités Nous avons vu que le séparateur de modalités par défaut était l’espace. Vous rencontrerez très certainement des fichiers bruts dans lesquels un autre séparateur de modalités sera utilisé. Des options d’INFILE vous permettront de traiter parfaitement ce type de fichiers. Si vos données sont présentes dans votre fenêtre EDITEUR, vous pourrez toujours mobiliser les options d’INFILE via la commande INFILE CARDS votre_option ; 2.2.1 Les modalités sont séparées par des tabulations Imaginons que les modalités soient séparées par des tabulations (ce sera le cas dans votre fenêtre EDITEUR si vous copiez-collez d’Excel vers SAS). Si vous passez par une instruction CARDS, cela ne pose aucun problème, votre programmation ne changera pas et la table sera parfaitement créée. Programme 2.5 DATA test; INPUT CARDS; 78 5 35 6 82 1 ;RUN; X1 X2 X3 X4 X5 $; 5 3 5 1161 1336 1499 ABÉLIEN ALMÉRIC ANIEL En revanche, si vous cherchez à créer une table SAS à partir d’un fichier externe à SAS, il vous faudra utiliser la commande INFILE et l’option EXPANDTABS : Programme 2.6 DATA test; INFILE 'C:\intro_SAS\fichiers\test26.txt' EXPANDTABS; INPUT X1 X2 X3 X4 X5 $; RUN; Soyez prudent si le séparateur est une tabulation. Vous trouverez parmi les fichiers exemples de cet ouvrage un fichier appelé TEST100.TXT qui comprend 9 observations et 100 variables. Pour la première observation, les 100 variables sont toutes égales à 1 ; pour la deuxième, elles sont toutes égales à 2 ; pour la troisième, elles sont toutes égales à 3, etc. Pour chaque observation, vous pourriez considérer que la longueur de l’enregistrement est égale à 199 (100 caractères et 99 tabulations). Si vous demandez à créer une table à partir de ce fichier, le programme que vous allez écrire sera le suivant : Programme 2.7 DATA test; INFILE 'C:\intro_SAS\fichiers\test100.txt' EXPANDTABS; INPUT x1-x100; RUN; SAS Livre Page 37 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 37 Vous regardez votre fenêtre JOURNAL et vous lirez, parmi d’autres informations : NOTE: 9 enregistrements lus dans infile ‘C:\intro_SAS\test100.txt’. La longueur min. de l’enregistrement était 199. La longueur max. de l’enregistrement était 199. Puis, immédiatement en dessous : Une ou plusieurs lignes ont été tronquées. NOTE: SAS est allé à la ligne lorsque l’instruction INPUT a atteint la fin d’une ligne. NOTE: La table WORK.TEST a 2 observations et 100 variables. La table n’a pas été correctement créée puisque vous n’avez pas les 9 observations prévues. SAS vous indique qu’il a tronqué une ou plusieurs lignes. Demandez maintenant, au moyen d’un PROC PRINT, l’édition de la table que vous venez de créer. Vous constaterez qu’effectivement, il y a un problème. Les remarques reprises dans le JOURNAL sont symptomatiques d’une longueur d’enregistrement supérieure aux 256 caractères prévus par défaut. Il se trouve cependant que SAS vous indique que la longueur maximale de vos enregistrements est égale à 199. Lorsque la tabulation est utilisée comme séparateur de modalités, dans le JOURNAL, une tabulation compte pour un caractère. Cependant, en interne à SAS, une tabulation compte pour 7 caractères. Votre longueur d’enregistrement est donc non pas de 199 caractères mais de 100 + 99 * 7 caractères = 793 caractères. En spécifiant LRECL=793 (ou plus), votre table sera parfaitement créée – si vous indiquez LRECL=792, votre table ne sera pas identique à votre fichier brut de départ. Assurez-vous donc de spécifier une longueur d’enregistrement suffisamment grande. La longueur de l’enregistrement que vous lirez dans la fenêtre JOURNAL, si elle est différente de 256 caractères1, ne peut vous être utile que pour calculer le nombre minimal de caractères à considérer pour LRECL en utilisant cette formule : (nombre de variables créées -1)*7 + (longueur max. de l’enregistrement déclarée dans la fenêtre JOURNAL – nombre de variables créées – 1) 2.2.2 Les modalités sont séparées par des virgules Si les valeurs sont séparées par une virgule (1,2,3…), vous utiliserez l’option DSD. Programme 2.8 DATA test; INFILE 'C:\intro_SAS\fichiers\test28.txt' DSD; INPUT X1 X2 X3 X4 X5 $; RUN; Nous reviendrons sur les possibilités de cette commande DSD par la suite. 1. Si la longueur de l’enregistrement est égale à 256, cela signifie que SAS a cessé sa lecture au bout de 256 caractères. Vous pouvez dans un premier temps spécifier un LRECL plus élevé – il faut nécessairement que votre LRECL soit supérieur à la longueur maximale de votre enregistrement et que, simultanément, SAS ne vous dise pas qu’une ou plusieurs lignes ont été tronquées. SAS Livre Page 38 Jeudi, 18. septembre 2008 6:03 18 38 ◆ SAS 2.2.3 Les modalités sont séparées par un caractère quelconque Si les valeurs sont séparées par un caractère autre que ceux déjà évoqués (1?2?3?… par exemple), vous utiliserez l’option DLM et indiquerez entre quotes le caractère utilisé : Programme 2.9 DATA test; INFILE 'c:\intro_SAS\fichiers\test29.txt' DLM='?'; INPUT X1 X2 X3 X4 X5 $; RUN; Attention cependant à cette commande DLM. Vous devez choisir un caractère de séparation qui n’apparaîtra pas au sein des modalités des variables que vous voulez créer. La solution qui consiste à choisir deux caractères rares n’est pas valide comme le montre le programme 2.10. Programme 2.10 DATA test; INFILE CARDS DLM='@#'; INPUT email $ com $; CARDS; [email protected]@#A ;RUN; Les données brutes sont composées d’une adresse e-mail et d’une seconde variable COM. Si vous exécutez ce programme, vous constaterez qu’il ne fonctionne pas comme nous le souhaitions. Un PROC PRINT donne en effet : Obs 1 email a com esa.fr Lorsque vous indiquez deux caractères, cela signifie en fait que les séparateurs peuvent être l’un des deux caractères : via l’instruction DLM, vous offrez à SAS une liste des séparateurs de modalités possibles. Des codes clavier Alt permettent de créer des caractères rares – voir par exemple ce site pour une liste des codes possibles : www.toutimages.com/codes_caracteres.htm Pour créer un caractère rare, il suffit de taper le code à quatre chiffres correspondant tout en maintenant enfoncée la touche Alt de votre clavier. Par exemple : (Alt 0222 : le Thorn islandais majuscule). Il ne vous reste plus qu’à rechercherremplacer les deux (ou plus) caractères par le caractère que vous avez choisi. 2.2.4 Les modalités sont séparées par un point-virgule Étant donné la signification du point-virgule pour SAS, il n’est pas conseillé de l’utiliser pour séparer les modalités. Si vos données sont dans un fichier, une commande INFILE accompagnée de l’option DLM=‘;’ suffira. (Vous pouvez essayer avec le fichier d’accompagnement POINTVIRGULE.TXT.) Si les données que vous avez à transformer en table sont dans la fenêtre EDITEUR, vous devrez utiliser conjointement DLM et l’instruction CARDS4 ou DATALINES4. SAS Livre Page 39 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 39 Programme 2.11 DATA test; INFILE CARDS DLM=';'; INPUT x1 x2 x3 x4 x5; CARDS4; 1;2;3;4;5 1;2;3;4;5 ;;;; RUN; Insérez « ;;;; » avant votre RUN habituel afin d’indiquer à SAS que la plage de données à saisir est terminée. 2.3 Les données présentées en colonnes Deux principaux formats d’enregistrement des données bruts existent : les données formatées en colonnes (COLUMN INPUT) et les données non formatées (LIST INPUT). Nous verrons que les données formatées en colonnes présentent plusieurs avantages, le premier d’entre eux étant la possibilité de saisir des modalités alphanumériques contenant des espaces. 2.3.1 Premier cas : l’absence d’espace entre les modalités Dans le cas où aucun séparateur de modalités n’existe, vous ne pourrez rien faire si vos données brutes ont la forme suivante : 123456albert 123jean-pierre 123456789martine Trois variables sont à saisir dans cet exemple. Rien ne nous permet de savoir où commencent et où terminent les modalités de chacune des variables. Lorsque les données sont formatées en colonnes, on dispose d’infomations quant à l’emplacement réservé aux modalités de chacune des variables au sein de l’enregistrement. Programme 2.12 DATA test3; INPUT x1 1-5 x2 6-10 x3 11 x4 12-16 x5 $ 17-23; CARDS; 0005900002101028ABÉLIEN 0006700005100615ALMÉRIC 0000200004301371ADÉLIEN ;RUN; Nous disposons d’enregistrements de longueur 23 (23 caractères). Dans la commande INPUT, nous indiquons à SAS que la variable X1 est numérique et qu’elle a pour valeur ce qui est observé sur les cinq premiers caractères, entre la colonne 1 et la colonne 5. X2 va du 6e au 10e caractère, X5 est alphanumérique et sa valeur est présentée entre les 17e et 23e caractères. On peut donc tracer « à la règle » des colonnes SAS Livre Page 40 Jeudi, 18. septembre 2008 6:03 18 40 ◆ SAS dans nos données : dans chaque colonne apparaît une variable. Le premier exemple cité plus haut ne peut pas être traité parce que vous ne pouvez pas tracer de traits verticaux pour délimiter les différentes modalités. Exercice 2.1 : Créez une table SAS en utilisant les données ci-dessous pour obtenir la table ci-contre : 123456789abc 987654321def 253698741ghi 879654321jkl 324578961lmn 524169387opq Obs 1 2 3 4 5 6 x1 123 987 253 879 324 524 x2 45 65 69 65 57 16 x3 6789 4321 8741 4321 8961 9387 x4 abc def ghi jkl lmn opq 2.3.2 Cas général Les données présentées en colonnes ont généralement la forme suivante : ----+----1----+----2----+----3----+----4----+----5----+----6 la grande vadrouille Louis de Funès 16 1966 A V 7 le mur de l’atlantique Jean Poiret 14 1970 AB 6 le cercle rouge Alain Delon 20 1970 Z A 8 le corniaud Louis de Funès 14 1965 SD 4 le chanteur de mexico Luis Mariano 12 1956 A B 5 la traversée de Paris Jean Gabin 19 1958 S 2 La règle ne fait pas partie des données mais permet de lire les positions prises par les diverses modalités. Les données apparaissent donc ici en colonnes. Le titre occupe les colonnes 1 à 22. De la colonne 25 à la colonne 38 apparaît le nom de l’acteur qui partage l’affiche avec Bourvil. Une note (subjective) au film en question occupe les colonnes 40 et 41. L’année de sortie du film est comprise entre les colonnes 45 et 48. Les colonnes 50 à 52 affichent un code de trois lettres au maximum pouvant contenir un blanc. Enfin, un numéro d’ordre se trouve en colonne 551. Une petite fenêtre, située dans le coin inférieur droit de votre fenêtre EDITEUR, vous indique la ligne (Ln) sur laquelle vous vous trouvez ainsi que le numéro de la colonne (Col) qui suit votre curseur. Vous pouvez ainsi repérer facilement les colonnes qui contiennent vos modalités. Si vos données sont présentes dans un fichier extérieur, vous avez la possibilité d’utiliser les outils FSLIST et NOTEPAD introduits dans la conclusion des chapitres 1 et 2. Si vous entrez les commandes classiques pour traiter ce fichier, cela ne fonctionnera pas essentiellement parce que vous avez à saisir une variable alphanumérique particulière : le titre du film, composé de plusieurs mots, séparés par des espaces. Programme 2.13 DATA bourvil; INPUT film $ acteur $ note annee code $ ordre; CARDS; la grande vadrouille Louis de Funès 16 1966 A V 7 1. Les données utilisées dans cette section sont reprises dans le fichier bourvil.txt que vous pouvez télécharger sur le site compagnon de cet ouvrage. SAS Livre Page 41 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 41 le mur de l’atlantique le cercle rouge le corniaud le chanteur de mexico la traversée de Paris ;RUN; Jean Poiret Alain Delon Louis de Funès Luis Mariano Jean Gabin 14 20 14 12 19 1970 1970 1965 1956 1958 AB Z A SD A B S 6 8 4 5 2 Le résultat 2.1 reprend les résultats obtenus du PROC PRINT. Résultat 2.1 Obs film 1 2 3 4 5 6 la le le le le la acteur grande mur cercle corniaud chanteur traversé note annee code ordre . . . . . . . . . . . . de Jean Delon Funès Luis Jean . . 20 14 . . Par défaut, SAS considère que les modalités sont séparées par des espaces et les caractéristiques de votre instruction INPUT font que SAS pense qu’il doit avoir une approche par défaut. Il enregistre donc dans la variable FILM ce qu’il voit jusqu’à ce qu’il rencontre un espace, enregistre pour ACTEUR le deuxième mot du titre, tente d’enregistrer dans une variable numérique le troisième mot du titre ou le prénom de l’acteur si le titre ne comprend que deux mots et renvoie donc une valeur manquante. Idem pour l’année, etc. Ici, puisque les données sont présentées en colonnes, il convient d’adapter votre programmation en spécifiant soit les emplacements par colonne des variables, soit l’INFORMAT (voir section 2.8.) de la variable à saisir. Votre ligne INPUT devient ainsi : INPUT film $ 1-22 acteur $ 25-38 note annee code $ 50-52 ordre ; Votre table SAS sera parfaitement créée. Nous sommes ici proches du cas examiné par le programme 2.12. Nous aurions pu aussi préciser dans la ligne INPUT l’emplacement des variables NOTE, ANNEE et ORDRE. En fait, cela n’est pas utile puisque, par exemple, lorsque SAS a terminé l’enregistrement de la variable ACTEUR, il passe systématiquement les blancs qui peuvent suivre pour ne commencer l’enregistrement de la variable NOTE que lorsque celle-ci commence effectivement. Étant donné que les trois variables ne comprennent pas de blanc dans leur modalité, forcer la lecture entre telle et telle colonne ne serait pas utile parce que les variables sont enregistrées dans un ordre identique à celui de l’enregistrement. Si vous souhaitez que vos variables soient enregistrées dans un ordre différent de celui de l’enregistrement, cela ne pose pas de réel problème si vous spécifiez pour chaque variable les colonnes entre lesquelles SAS devra lire l’information. Ainsi, la ligne d’INPUT suivante organise vos données dans votre table d’une manière peut-être plus utile pour vous : INPUT ordre 55 acteur $ 25-38 film $ 1-22 annee 45-48 note 40-41 code $ 50-52 ; SAS Livre Page 42 Jeudi, 18. septembre 2008 6:03 18 42 ◆ SAS 2.3.4 Le positionnement relatif Afin d’indiquer à SAS la position de vos modalités, vous pouvez soit indiquer les colonnes qui contiennent les données (positionnement absolu), soit adopter un positionnement relatif : INPUT film $ 1-22 +2 acteur $ 25-38 +1 note +2 annee code $ 50-52 +2 ordre ; Rappel de l’allure de l’enregistrement : ----+----1----+----2----+----3----+----4----+----5----+----6 la grande vadrouille Louis de Funès 16 1966 A V 7 L’instruction INPUT demande à SAS de lire la variable FILM entre les colonnes 1 et 22, de se déplacer ensuite de 2 colonnes (+2), de lire (donc à partir de la 25e colonne) la variable ACTEUR entre les colonnes 25 et 38, puis la variable NOTE dont l’enregistrement prend fin dès qu’est passé l’espace qui suit cette note. Ensuite, SAS doit passer deux colonnes et lire ANNEE. Une colonne après commence CODE, variable alphanumérique de 3 caractères. SAS doit enfin sauter deux colonnes pour lire ORDRE. La programmation proposée ici n’a aucun intérêt et est même dangereuse. Il faut bien comprendre comment se passe l’enregistrement d’une modalité pour voir le caractère dangereux de ce type de programme. Lorsque vous enregistrez la variable ACTEUR, vous précisez à SAS qu’il doit enregistrer pour cette variable ce qu’il observe entre les colonnes 25 et 38. Dans ce cas, SAS n’a pas besoin d’un espace pour clore l’enregistrement ; vous pouvez donc lui demander de se déplacer d’une colonne (il passe donc la colonne 39) et de commencer à enregistrer la note. Maintenant, pour clore l’enregistrement de NOTE, puisque vous n’avez rien précisé de particulier, SAS a besoin de l’espace qui suit pour clore son enregistrement. Il passe donc l’espace en 42e colonne, et doit se déplacer de deux colonnes pour enregistrer l’année. Si vous n’y prenez pas garde, vous serez tenté de mettre un +3. Or, ce faisant, il commencera l’enregistrement de l’année en 46e colonne (et produira donc 966 au lieu de 1966). Par conséquent, si vous souhaitez utiliser les possibilités offertes par les commandes de type +X au sein de l’instruction INPUT, vous devrez toujours vous demander si SAS a besoin de l’espace qui suit la modalité pour clore la saisie de cette modalité. Vous saurez ainsi où est votre curseur et pourrez déterminer le nombre de colonnes à sauter. Ensuite, la démarche est qualifiée d’inutile. En effet, il n’y a pas de problème particulier ici qui justifie l’utilisation des +X. Cette procédure présente un réel intérêt quand, par exemple, une partie de votre enregistrement est à négliger. Si vous souhaitez que la note que vous avez donnée à un film n’apparaisse pas dans votre table SAS, la ligne d’INPUT suivante demandera à SAS de ne pas lire cette information : INPUT film $ 1-22 +2 acteur $ 25-38 +6 annee code $ 50-52 +2 ordre; Toujours si vos données sont formatées en colonnes, vous pouvez éviter d’utiliser cette commande +X au moyen de la ligne d’INPUT suivante : INPUT film $ 1-22 +2 acteur $ 25-38 annee 45-48 code $ 50-52 +2 ordre; Enfin, si vos données ne sont pas formatées en colonnes, l’utilisation de +X ne sera possible que si la variable à écarter présente des modalités qui prennent toujours le même nombre de caractères. Si cela n’est pas le cas, il conviendra de saisir la variable à écarter, puis de l’effacer au moyen d’une commande DROP. SAS Livre Page 43 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 43 Programme 2.14 DATA test (DROP=x2); INPUT X1 X2 X3; CARDS; 125 12 120 15 654321 4 ;RUN; 2.3.5 Un cas particulier : la dernière modalité est de longueur variable Imaginons que notre fichier de départ ait cette forme particulière : Louis de Funès Jean Poiret Alain Delon Louis de Funès Luis Mariano Jean Gabin 16 14 20 14 12 19 1966 1970 1970 1965 1956 1958 A V AB Z A SD A B S 7 6 8 4 5 2 la le le le le la grande vadrouille mur de l’atlantique cercle rouge corniaud chanteur de mexico traversée de Paris Vous diriez alors : « Aucune différence, nous devons pouvoir passer le même type de programmation. » Vérifions que cela ne fonctionne pas : Exercice 2.2 : 1. Transformez les données ci-dessus en table SAS – données à l’écran – vous passez donc par un CARDS. 2. Adaptez votre programme en retirant CARDS et les lignes de données. (Vous passez donc par un INFILE. Fichier à utiliser ici : BOURVIL3.TXT.) À l’issue de cet exercice, vous devez constater que la question 1 ne pose aucun problème. En revanche, la création de la table au moyen du fichier brut ne se passe pas bien. En fait, lorsque vous passez par un INFILE, si la dernière variable est alphanumérique et de longueur variable (c’est bien le cas ici, puisque les titres n’ont pas tous le même nombre de caractères), sans l’option TRUNCOVER d’INFILE, SAS lira « trop de caractères » en prenant au besoin des informations présentes sur la ligne suivante. Pour définir les colonnes entre lesquelles vous devez lire le titre du film, vous allez prendre le titre le plus long et constater qu’il occupe les colonnes 33 à 54. Dans votre fichier, chaque titre ne prend pas forcément 22 caractères. SAS, pour remplir le titre, va alors chercher le premier bloc de 22 caractères présent sur une même ligne et passe pour cela à la ligne suivante. Ceci vous explique pourquoi, lorsque vous demandez un PROC PRINT, vous observez le résultat 2.2. Résultat 2.2 Obs acteur note 1 2 3 Louis de Funès Alain Delon Luis Mariano 16 20 12 annee 1966 1970 1956 code A V Z A A B ordre 7 8 5 titre Jean Poiret 14 Louis de Funès 14 Jean Gabin 19 19 19 19 L’option TRUNCOVER indique à SAS de ne pas rechercher sur la ligne suivante si on lui demande de lire un certain nombre de caractères pour une variable et qu’il ne SAS Livre Page 44 Jeudi, 18. septembre 2008 6:03 18 44 ◆ SAS trouve pas exactement ce nombre de caractères. Attention, si l’option TRUNCOVER vous sera souvent utile lors d’un passage par une commande INFILE pour créer une table, elle vous sera parfaitement inutile lorsque vous passerez par un CARDS : SAS ne force pas la lecture sur les lignes suivantes s’il lui manque des caractères lors d’une entrée de données par CARDS. 2.3.6 Position relative et position absolue des modalités Lorsque les modalités sont présentées en colonnes, il existe une seconde manière de noter les positions des variables en position absolue. Ainsi : INPUT film $ 1-22 acteur $ 25-38 @40 note @45 annee code $ 50-52 @55 ordre; La commande @X indique à SAS de se positionner en xème colonne pour lire la variable dont le nom suit. Cette commande évite les calculs nécessaires à l’utilisation des +X pour passer d’une variable à une autre. Vous devez uniquement connaître la position où débute la variable. Les données que nous utilisons dans ce chapitre ne nécessitent pas l’utilisation des instructions @X. Une instruction @X permet notamment d’écarter une variable lors de la construction de la table. Dans le même temps, l’utilisation seule de @X ne sera pas possible si un espace apparaît dans la modalité que vous souhaitez saisir. Ce type de programmation permet de « revenir en arrière », et d’effectuer un second passage sur la ligne de données. Ainsi, la ligne INPUT suivante : INPUT film $ 1-22 acteur $ 25-38 @40 note @45 annee code $ 50-52 @55 ordre @25 prenom $; Après avoir saisi la variable ORDRE, nous avons demandé à SAS de revenir en arrière et de se positionner en 25e colonne pour retenir dans la variable PRENOM le prénom de l’acteur qui partage l’affiche avec Bourvil. Ce genre de manœuvre n’est pas possible avec la commande +X puisqu’il n’existe pas de commande –X. 2.3.7 Une seconde application de @X Imaginons que nous disposions des données suivantes : prénom: Sophie remarque: BB prénom: Hélène remarque: A prénom: Julie remarque: CCC prénom: Marie remarque: AB prénom: Erwan remarque: AC prénom: Emilie remarque: DDD prénom: Valérie remarque: CC prénom: Sylvain remarque: AC prénom: Marie remarque: BB prénom: Claire remarque: A prénom: Aurélie remarque: CCC prénom: Sanaa remarque: AB prénom: Guillaume remarque: AC prénom: Damien remarque: DDD prénom: Lucie remarque: CC prénom: Elodie remarque: AC prénom: Antoine remarque: AC prénom: Benjamin remarque: AB SAS Livre Page 45 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 45 Un bug informatique a créé ce fichier. Vous pouvez malgré tout en faire une table SAS en profitant des récurrences « prénom: » et « remarque: » Programme 2.15 DATA test; INPUT @'prénom:' eleve :$10. @'remarque:' attitude $; CARDS; … les données ;RUN; Nous avons ici une seconde application de l’option @ dans une commande INPUT. Nous avons vu l’intérêt d’un @5 X1 qui indiquait à SAS de se placer en cinquième colonne pour lire la variable X1, @’prénom:’ ELEVE demande à SAS d’avancer dans la ligne et de trouver « prenom: » pour ensuite lire la variable ELEVE (le « :$10. » est un INFORMAT – voir section 2.8.). Exercice 2.3 : Essayez cette manœuvre dans le fichier ABCD.TXT. Est-ce que le nombre de lignes du fichier est bien égal au nombre d’observations de votre table ? Modifiez votre programmation de façon que votre table soit fidèle à votre fichier de départ. 2.4 Les espaces dans les modalités de variables alphanumériques Un des avantages aux données formatées en colonnes, c’est qu’elles autorisent des modalités contenant des espaces. Si les données ne sont pas formatées en colonnes et si l’espace est le séparateur par défaut, SAS ne pourra pas comprendre la différence entre l’espace au milieu de la modalité et l’espace qui sépare les modalités de deux variables distinctes. Exemple : X2 est numérique et vaut forcément 1 ; le texte avant le 1 est à mettre dans la variable alphanumérique X1. Programme 2.16 DATA test; INPUT X1 $ X2; CARDS; aa 1 aa a 1 aa a a 1 ;RUN; Dans le cas présent, vous ne pourrez pas créer votre table SAS1. Si, à l’intérieur des modalités, vous avez des espaces, vous devez absolument créer une distinction entre le séparateur de modalités et l’espace qui intervient dans la modalité. Si vous ne 1. Dans le programme 1.15, nous avions introduit l’instruction MISSING A B C ; Si vous exécutez les programmes 2.16 et 1.15 au cours de la même session, la modalité A continue à être considérée comme valeur manquante d’une variable numérique et votre variable X2 prendra respectivement les valeurs 1, A et A – vous n’observez aucun message d’erreur dans votre fenêtre JOURNAL. Pour revenir au fonctionnement par défaut de SAS, soumettez l’instruction MISSING;. SAS Livre Page 46 Jeudi, 18. septembre 2008 6:03 18 46 ◆ SAS disposez que d’un fichier TXT1, c’est manuellement que vous devrez intervenir en introduisant, par exemple, deux espaces entre le nom de l’acteur et le titre du film. Programme 2.17 DATA test; INPUT X1 $ & X2; CARDS; aa 1 aa a 1 aa a a 1 ;RUN; Le & placé juste avant la variable X2 indique à SAS d’attendre de voir au moins deux séparateurs de modalités consécutifs avant de passer à l’enregistrement de la variable suivante. Vous avez aussi la possibilité d’introduire un autre séparateur de modalités, ce nouveau séparateur conduisant SAS à considérer l’espace comme un caractère quelconque : Programme 2.18 DATA test; INFILE CARDS DLM='#'; INPUT X1 $ X2; CARDS; aa#1 aa a#1 aa a a#1 ;RUN; En revanche, l’utilisation d’une tabulation comme séparateur de modalités ne fonctionnera pas. Dans le fichier TABU.TXT, qui reprend les données ci-dessus, le dièse a été remplacé par une tabulation. Pour créer une table, a priori, nous exécuterions le programme 2.19. Programme 2.19 DATA tabu; INFILE 'C:\intro_SAS\fichiers\tabu.txt' EXPANDTABS; INPUT X1 $ X2; RUN; Ce programme ne fonctionne pas. L’option EXPANDTABS continue à considérer l’espace comme un séparateur de modalités. Votre table ressemblera au résultat 2.3. Résultat 2.3 Obs X1 1 2 3 aa aa aa X2 1 . . 1. Bien entendu, si vous disposez d’un fichier Excel, le module d’importation des données (menu FICHIER/Importer données) remplira parfaitement son office. SAS Livre Page 47 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 47 Vous devrez ouvrir votre fichier de données avec un traitement de texte quelconque ou au moyen de NOTEPAD (voir conclusion des chapitres 1 et 2) et remplacer votre tabulation par un caractère qui vous permette d’utiliser l’option DLM. Vous pourrez aussi passer par Excel, enregistrer votre fichier dans un format XLS, pour ensuite utiliser le module d’importation. 2.5 Toutes les observations apparaissent sur une même ligne Dans les cas simples que nous avons examinés jusqu’ici, chaque ligne du fichier brut correspondait à une observation. Imaginons maintenant qu‘une ligne corresponde à plusieurs observations. Pour l’exercice 2.4, vous ne disposez pas encore des outils permettant d’apporter des réponses pertinentes aux questions posées – ce qui est important ici, c’est de comprendre pourquoi le programme que vous allez rédiger pour répondre à la question posée ne fonctionne pas. Exercice 2.4 : Dans le fichier FLORIDE.TXT, vous disposez des précipitations observées en Floride depuis plus d’un siècle dans les vingt-deux stations d’observations de cet État. Malheureusement, nous avons fait une mauvaise manipulation en préparant ce fichier : les observations sont bien séparées d’un espace mais il n’y a aucun saut de ligne. Exemple : 80211 1903 -9999 80211 1904 2507 80211 1905 4876 80211 1906 5023 80211 1907 6356 … Sur cette ligne, 80211 est le numéro de la base ; 1903, l’année d’observation ; –9999 désigne la valeur manquante ; sinon ce sont les précipitations annuelles que vous observerez. Créez une table SAS avec ces données (merci de traiter aussi dans le même temps les valeurs manquantes en remplaçant -9999 par un ‘.’). Il y a 2 299 observations. La ligne de données que vous avez à traiter comprend un peu moins de 38 000 caractères. Nous avons vu que, par défaut, lorsque SAS analyse une ligne de données, c’est ce qui suit l’instruction INPUT et les options qui peuvent apparaître dans l’instruction INFILE qui déterminent sa façon de lire les données. Parmi les éléments du fonctionnement par défaut de SAS, nous avons ainsi vu que lorsque SAS a donné à toutes les variables définies par l’instruction INPUT une modalité, il cesse de lire la ligne de données et passe à la ligne suivante. Dans le cas de l’exercice 2.4, nous ne voulons pas que SAS passe à la ligne suivante (qui n’existe pas en fait). Ceci sera fait au moyen de l’option @@ de l’instruction INPUT. Le programme qui traitera correctement le fichier FLORIDE.TXT est donc le suivant : Programme 2.20 DATA floride; INFILE 'C:\intro_SAS\fichiers\floride.txt' LRECL=38000; INPUT base annee pluie @@; IF pluie=-9999 THEN pluie=.; RUN; Puisque la longueur d’une ligne de données dépasse 256 caractères, vous devez spécifier un LRECL suffisamment important. Certains d’entre vous ont peut-être tenté SAS Livre Page 48 Jeudi, 18. septembre 2008 6:03 18 48 ◆ SAS d’introduire une commande MISSING -9999 pour traiter le problème des valeurs manquantes codées –9999. Cette commande MISSING n’est pas possible ici puisque seules des lettres peuvent être utilisées pour marquer une valeur manquante. Pour corriger les valeurs manquantes1, il vous faudra remplacer les –9999 par valeur manquante. C’est objet de la quatrième ligne du programme 2.20. 2.6 Les modalités relatives à une même observation apparaissent sur plusieurs lignes Vous allez apprendre à transformer plusieurs lignes dans votre fichier brut en une observation. Si vos données apparaissent à l’écran (CARDS), vous n’aurez généralement pas besoin d’outils de programmation spécifiques. En effet, comme nous l’avons vu dans la section 1.4., si dans votre ligne INPUT vous spécifiez plus de variables qu’il n’y a d’informations sur une ligne, et si vous passez par un CARDS, SAS cherchera à lire les informations sur les lignes suivantes. Maintenant, pour créer une table SAS à partir d’un fichier extérieur (commande INFILE), il est nécessaire de mettre en place une programmation spécifique. 2.6.1 Cas simple Imaginons que nous ayons le fichier suivant à transformer en table SAS : ----+----1----+----2----+----3----+----4----+ la grande vadrouille 16 1966 A 7 le mur de l’atlantique 14 1970 AB 6 Sur la base de ce que vous savez déjà, sans les outils de programmation que nous allons développer plus loin, vous pourriez écrire le programme 2.21. Programme 2.21 DATA bourvil; INPUT film $ 1-22 note annee code $ ordre; CARDS; la grande vadrouille 16 1966 A 7 le mur de l’atlantique 14 1970 AB 6 RUN; Ce programme fonctionne parfaitement. Vous trouverez ces mêmes données dans le fichier ESSAI.TXT. 1. C’est absolument nécessaire. Imaginez que vous souhaitiez calculer des précipitations moyennes par année ou par station météorologique. Si vous conservez des –9999, il est bien possible que vous puissiez démontrer que la pluie part du sol et va vers les nuages. SAS Livre Page 49 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 49 Un programme adapté au fait que les données ne sont plus à l’écran pourrait être le suivant : Programme 2.22 DATA bourvil; INFILE 'C:\intro_SAS\fichiers\essai.txt' TRUNCOVER; INPUT film $ 1-22 note annee code $ ordre; RUN; Vous êtes obligé de passer par un TRUNCOVER parce que les titres ne font pas tous 22 caractères. Cependant, vous constaterez, au moyen d’un PROC PRINT sur la table créée, que votre programmation n’a pas fonctionné. Lorsque vous faites référence à un fichier brut, sans outils de programmation spécifiques, en utilisant l’option TRUNCOVER, vous aurez toujours autant d’observations que de lignes dans votre fichier brut. Lorsque les informations relatives à nos observations (films) se retrouvent sur plusieurs lignes, vous devrez utiliser les intructions « / » et « #X ». Pour créer votre table, vous pouvez adopter le programme 2.23. Programme 2.23 DATA bourvil; INFILE 'C:\intro_SAS\fichiers\essai.txt' TRUNCOVER; INPUT film $ 1-22 / note 1-2 annee / code $ 1-3 ordre 6; RUN; Le signe / indique à SAS de passer à la ligne suivante après avoir lu la variable FILM présentée sur les colonnes 1 à 22, puis de passer à la ligne suivante (la troisième) après avoir lu la variable ANNEE. D’une manière équivalente, on pouvait aussi entrer : INPUT film $ 1-22 #2 note 1-2 annee #3 code $ 1-3 ordre 6; La commande # indique à SAS sur quelle ligne il doit se situer pour lire les informations suivantes qui se trouvent sur les deuxième et troisième lignes. Tout comme pour la commande @x qui permet de se déplacer à droite et à gauche sur une ligne, la commande #x permet de revenir en arrière. INPUT film $ 1-22 #2 note 1-3 annee #3 code $ 1-3 ordre 6 #1 article $ 1-2; Il est demandé à SAS, une fois saisie la variable ORDRE, de revenir sur la première ligne pour construire une variable avec les deux premières lettres du titre du film. Exercice 2.5 : Dans le fichier SGTPEPPER.TXT, vous trouverez la liste des chansons comprises dans l’album des Beatles, Sgt Pepper’s Lonely Hearts Club Band. Le fichier est organisé de la manière suivante : ----+----1----+----2----+----3----+----4----+ 1 Sgt. Pepper’s Lonely Hearts Club Band Lennon McCartney 2:02 A Ordre / titre de la chanson / Compositeur 1 / compositeur 2 / durée du titre / face Créez une table SAS à partir de ce fichier. Vous devez utiliser le fichier externe – ne copiez-collez pas vos données dans l’éditeur. SAS Livre Page 50 Jeudi, 18. septembre 2008 6:03 18 50 ◆ SAS 2.6.2 Cas moins simple Dans la section précédente, les observations apparaissaient certes sur plusieurs lignes mais on pouvait compter sur le fait que chaque observation s’affichait sur un même nombre de lignes. Les données qui vont être utilisées pour le programme 2.24 diffèrent sensiblement par leur organisation. On n’observe pas la même régularité que dans le cas précédent. Une première ligne indique le nom de la famille à considérer (clé 1) et les suivantes (autant de lignes que de membres dans la famille), les clés 2, indiquent le prénom et l’âge des membres de la famille. Ce type de données pourrait être issu d’un recensement de la population, par exemple. Nous étudierons les instructions qui permettent de traiter ce genre de table plus loin. Si c’est votre première lecture de cet ouvrage, vous pourrez revenir plus tard sur ce programme et ses commentaires. Programme 2.24 DATA famille; RETAIN nom; INPUT cle @; IF cle=1 THEN INPUT @11 nom $; ELSE DO; INPUT @3 prenom $12. @15 age; OUTPUT; END; CARDS; 1 famille Dupont 2 Pierre 38 2 Sophie 37 2 Théodore 6 2 Marcelline 5 1 famille Dubois 2 Frédéric 42 2 Michelle 37 2 Marie 11 1 famille Durand 2 Jean 53 1 famille Dufour 2 Hervé 78 2 Marie 75 ;RUN; Résultat 2.4 Obs 1 2 3 4 5 6 7 8 9 10 nom Dupont Dupont Dupont Dupont Dubois Dubois Dubois Durand Dufour Dufour cle 2 2 2 2 2 2 2 2 2 2 prenom Pierre Sophie Théodore Marcelline Frédéric Michelle Marie Jean Hervé Marie age 38 37 6 5 42 37 11 53 78 75 1. Création d’une table famille. 2. La commande RETAIN indique à SAS qu’il doit se rappeler d’une ligne sur l’autre ce qu’il a mis dans la variable NOM (voir section 3.8.1.). 3. INPUT : SAS saisit la clé (si 1 -> FAMILLE si 2 -> PRENOM et AGE). Via l’instruction @, vous demandez à SAS d’attendre. Le @ permet ici des traitements conditionnés au résultat de la commande INPUT. 4. Si CLE=1, alors SAS enregistre une variable alphanumérique NOM, à lire à partir de la 11e colonne. 5. Dans le cas contraire (ELSE), les instructions situées entre les commandes DO (voir section 3.6.1) et END (DO s’arrête avec END ;) sont exécutées. SAS va alors saisir PRENOM et AGE, puis il écrira dans la table l’observation (instruction OUTPUT) composée des modalités prises par NOM (qu’il a en mémoire), PRENOM et AGE. SAS Livre Page 51 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 51 Exercice2.6 : Le fichier BEATLES.TXT a une structure très proche de celle de SGTPEPPER.TXT sauf qu’il s’agit ici de traiter non plus un mais quatre albums des Beatles. ----+----1----+----2----+----3----+----4----+ 0 1967 Sgt. Pepper’s Lonely Hearts Club Band 1 Sgt. Pepper’s Lonely Hearts Club Band Lennon McCartney 2:02 A La ligne 0 donne l’année de sortie de l’album ainsi que son titre ; les lignes suivantes (>0) reprennent dans le même ordre et avec la même structure le numéro d’ordre de la chanson, son titre, le premier compositeur, le deuxième compositeur, la durée (minutes, secondes) et la face sur le 33 tours original. Vous devez obtenir la table suivante : Obs 51 album Abbey Road annee 1969 num 8 titre Because compo1 Lennon duree duree compo2 M S McCartney 2 45 face B 2.6.3 Un dernier cas Imaginons que les données soient organisées de la manière suivante : ----+----1----+----2----+----3----+----4----+----5----+----6----+ 0 famille Dupont 4 Pierre 38 Sophie 37 Théodore 6 Marcelline 5 0 famille Dubois 3 Frédéric 42 Michelle 37 Marie 11 0 famille Durand 1 Jean 53 0 famille Dufour 2 Hervé 78 Marie 75 Ici, les deux premières lignes doivent être combinées pour donner dans votre table quatre observations (une par membre de la famille), les lignes 3 et 4 produiront trois informations, etc. Dans ce cas, c’est l’observation de la structure de votre fichier brut qui vous aidera à trouver la solution. On remarque déjà que la clé est ici égale au nombre de membres de la famille et que les données sont présentées en colonnes – le premier prénom débute en colonne 3, le deuxième en colonne 18, le troisième en colonne 33 et le quatrième en colonne 48. Le programme 2.25 prend en compte ces diverses informations pour construire correctement la table souhaitée. Programme 2.25 DATA famille; RETAIN nom; INPUT cle @; IF cle=0 THEN INPUT @11 nom $; ELSE DO I=1 TO cle; INPUT @(3+15*(i-1)) prenom $12. age @@; OUTPUT; END; CARDS; 0 famille Dupont 4 Pierre 38 Sophie 37 Théodore 6 Marcelline 0 famille Dubois 3 Frédéric 42 Michelle 37 Marie 11 0 famille Durand 5 SAS Livre Page 52 Jeudi, 18. septembre 2008 6:03 18 52 ◆ SAS 1 Jean 53 0 famille Dufour 2 Hervé 78 Marie ;RUN; 75 Encore une fois, le programme présenté ci-dessus fait appel à des outils de programmation que nous n’avons pas encore vus. La principale différence réside dans la boucle DO (voir section 3.6.2.) qui va « tourner » autant de fois que la famille a de membres (information donnée par CLE). Lorsque I=1 (premier tour de boucle), l’information PRENOM est à lire en colonne 3 = 3 + 15 * (1 – 1). La variable AGE est à lire ensuite. @@ indique à SAS de ne pas passer à la ligne de données suivante. Les deux variables ont maintenant leur modalité, la commande OUTPUT indique à SAS d’écrire dans la table les valeurs des variables CLE, NOM, I, PRENOM et AGE. On examine maintenant cette même sous-partie du programme pour I=2. La variable PRENOM est à lire en 18e colonne (3 + 15 * (2 – 1)), puis AGE vient ensuite… La présente configuration des données n’est pas commune. Ayez cependant à l’esprit que vous pourrez toujours construire une table SAS fidèle à vos données, quelle que soit l’organisation des données, si vous avez compris la logique de cette organisation. Une dernière remarque enfin : vous noterez que la table construite ici a plus d’observations que de lignes dans le fichier brut de départ. C’est une conséquence de la présence dans le programme de la boucle DO et surtout de l’instruction OUTPUT. 2.7 Retour sur la gestion des valeurs manquantes Dans la section 1.5., nous avons vu que les valeurs manquantes des variables numériques devaient absolument être saisies au moyen soit d’un « . », soit d’un caractère que vous pourrez ensuite déclarer comme significatif d’une valeur manquante. Ce n’est pas tout à fait exact. Prenons le fichier MISSING1.TXT : a;b;c;1;2;3 d;e;f;4;5;6 g;h;i;7;8;9 k;l;m;10;11;12 Pour le faire comprendre à SAS, vous allez exécuter le programme 2.26. Programme 2.26 DATA test; INFILE 'C:\intro_SAS\fichiers\missing1.txt' DLM=';'; INPUT x1 $ x2 $ x3 $ n1 n2 n3; RUN; Et cela fonctionnera parfaitement. Imaginons maintenant que vous ayez des valeurs manquantes dans ce même fichier (MISSING2.TXT) mais que celles-ci ne soient pas saisies par des « . » a;b;c;1;2;3 ;e;f;4;5;6 g;;i;7;8;9 k;l;;10;;12 SAS Livre Page 53 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 53 Si vous demandez une exécution du même programme et si vous réalisez ensuite un PROC PRINT, vous constaterez que cela ne fonctionne absolument pas. Vous obtenez en effet : Résultat 2.5 Obs 1 2 x1 x2 x3 a e b f c 4 n1 n2 n3 1 5 2 6 3 . Pourquoi ? Simplement parce que vos valeurs manquantes ne sont saisies par rien. SAS propose une solution via l’instruction DSD associée à l’instruction DLM. Programme 2.27 DATA test; INFILE 'C:\intro_SAS\fichiers\missing2.txt' DLM=';' DSD; INPUT x1 $ x2 $ x3 $ n1 n2 n3; RUN; Comme nous l’avons déjà vu, vous devez employer l’instruction DSD si vos données sont séparées par des virgules. Associée à l’instruction DLM, elle indique que si deux séparateurs de modalités se suivent, il y a une valeur manquante. Si vous exécutez maintenant le programme ci-dessus et si vous demandez un PROC PRINT sur votre table, vous aurez bien quelque chose de correct. Vous avez également la possibilité de créer une table au moyen des données reproduites dans le programme 2.28. Programme 2.28 DATA test; INFILE CARDS DLM=' ' DSD; INPUT x1 x2 x3; CARDS; 1 2 3 4 6 7 8 9 ;RUN; Puisque deux séparateurs de modalités définies par DLM se suivent, la variable X2 pour la seconde observation sera déclarée manquante. En revanche, ce type de programmation peut devenir dangereux si vous l’appliquez aux données brutes reproduites dans le programme 2.29. Programme 2.29 DATA test; INFILE CARDS DLM=' ' DSD; INPUT x1 x2 x3; CARDS; 1 2 3 4 6 7 8 9 ;RUN; SAS Livre Page 54 Jeudi, 18. septembre 2008 6:03 18 54 ◆ SAS Vous noterez ici qu’entre 4 et 6, il y a trois espaces : SAS va exécuter le programme comme vous le lui avez ordonné et déclarera X3 comme valeur manquante pour le second individu. Maintenant, dans le cas présent, vous n’aurez aucune difficulté à gérer ce problème de valeur manquante non marqué par un signe quelconque puisque vos données sont présentées en colonnes. 2.8 Les INFORMAT : format des valeurs entrantes Le signe $ que vous devez ajouter à la suite du nom d’une variable alphanumérique est un INFORMAT. Il a pour objet, comme tous les INFORMAT, de dire à SAS comment traiter une information pour la transformer en une modalité lisible par SAS. Il existe beaucoup d’INFORMAT et l’objet de cette section est d’évoquer les plus courants1. 2.8.1 Les INFORMAT des variables alphanumériques Nous travaillons ici à nouveau avec les données suivantes2 : la grande vadrouille le mur de l’atlantique le cercle rouge le corniaud le chanteur de mexico la traversée de Paris Louis de Funès Jean Poiret Alain Delon Louis de Funès Luis Mariano Jean Gabin 16 14 20 14 12 19 1966 1970 1970 1965 1956 1958 A V AB Z A SD A B S 7 6 8 4 5 2 Par défaut, les variables alphanumériques dans SAS comprennent 8 caractères : la prise en compte d’un nombre de caractères plus élevé ne pourra se faire que grâce à la spécification d’un INFORMAT qui indiquera combien de caractères considérer pour telle variable alphanumérique. Un INFORMAT de variable alphanumérique se termine toujours par un « . ». INPUT film $char22. acteur $char14. note annee code $ 50-52 ordre ; Cette commande indique à SAS que la variable alphanumérique FILM aura EXACTEMENT 22 caractères et SAS mettra 22 caractères à toutes les observations de film. Si le titre fait plus de 22 caractères, SAS tronquera les 23e et suivants. Si vous entrez plutôt 3: INPUT film $22. acteur $14. note annee code $ 50-52 ordre ; SAS éliminera les espaces, s’il y en a, en début de modalité. C’est important si, par exemple, vous avez l’intention de trier votre table en fonction de cette variable alphanumérique. Dans les procédures de tri, l’espace a une valeur. Si vous conservez les 1. Voir dans la documentation SAS : SAS PRODUCTS / BASE SAS / SAS LANGUAGE DICTIONNARY / DICTIONNARY OF LANGUAGE ELEMENTS / INFORMAT. Sur les 41 INFORMAT sur variables alphanumériques présentés dans l’aide de SAS 9.1.3, cette section citera moins d’une dizaine d’INFORMAT. Les INFORMAT binaire colonne et les INFORMAT ISO 8601 ne seront pas évoqués dans cet ouvrage. 2. Fichier bourvil.txt. 3. Vous observerez souvent dans d’autres programmes SAS des lignes INPUT X $ 20. plutôt que les lignes X $20. comme ici. Les deux formes sont parfaitement équivalentes. SAS Livre Page 55 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 55 espaces, vous aurez en premier le titre de film contenant le moins de caractères et à la fin, celui qui a le plus de caractères. À égalité du nombre de caractères, vous aurez bien un tri alphabétique. Une autre différence entre $w. et $CHARw. réside dans le traitement des valeurs manquantes. $w. considérera le point « . » comme symbole d’une valeur manquante, pas $CHARw. Avec ce second INFORMAT sur variable alphanumérique, là aussi, vous forcez la longueur maximale à 22 caractères : si la modalité comprend plus de 22 caractères, SAS coupe. Sur les variables alphanumériques, il existe donc deux principaux INFORMAT : $W. et $CHARW. Par l’imposition d’un INFORMAT, vous précisez en fait le nombre de caractères qui doivent être lus dans les données brutes (partie « W » de l’INFORMAT) et utilisés pour enregistrer la variable dans la table. Vous indiquez aussi comment SAS doit interpréter ces données brutes (partie « $ » ou « CHAR » de l’INFORMAT). Exercice 2.7 : Modifiez la ligne INPUT en introduisant l’INFORMAT adéquat de la variable Code. Dans l’exemple qui nous occupe, vous comprenez que, dans la ligne d’INPUT, les options $ 1-22 et $22. sont parfaitement équivalentes. Vous ne pouvez pas spécifier à la fois un INFORMAT et indiquer une position absolue – c’est en fait logique puisque la définition de la variable par sa position absolue et le signe $ définit aussi son INFORMAT. Exercice 2.8 : Le fichier LEADER_CCCP.TXT est à transformer en table SAS. Vladimir-Ilych Lenin Joseph Stalin Georgy Malenkov Nikita Khrushchev Leonid Brezhnev Yuri Andropov Konstantin Chernenko Mikhail Gorbachev Sans modifier quoi que ce soit dans cette liste, constituez une table SAS de deux variables (prénom et nom). Ne passez pas trop de temps sur cet exercice, vous ne disposez pas des outils qui vous permettraient de répondre à la question. Tentez quand même de le résoudre afin de comprendre pourquoi cela ne fonctionne pas. De nombreux prénoms et noms de famille prennent plus de 8 caractères. Il conviendrait donc dans le cas présent de lire pour le prénom, au besoin, jusqu’à 14 caractères, et pour le nom de famille, au besoin, jusqu’à 10 caractères. Dans leur forme actuelle, les INFORMAT n’ont pas cette capacité : ils lisent exactement le nombre de caractères indiqué. Pour indiquer à SAS qu’il doit lire un certain nombre de caractères mais que s’il voit un signe de fin de modalité, il doit cesser son enregistrement, vous devez ajouter « : » devant l’INFORMAT. Ainsi, la ligne d’INPUT suivante construira bien la table souhaitée : INPUT prenom :$14. nom :$10. ; Il n’y a pas besoin d’indiquer ici l’option TRUNCOVER dans l’instruction INFILE. La fin de ligne est considéré par les INFORMAT de type :$w. comme un signe d’arrêt de l’enregistrement. SAS Livre Page 56 Jeudi, 18. septembre 2008 6:03 18 56 ◆ SAS Le tiret entre Vladimir et Ilych n’a aucune justification dans la grammaire russe, il était simplement présent afin de vous simplifier la tâche. S’il n’y avait pas ce tiret, comment constitueriez-vous votre table SAS1 ? Pour résoudre ce problème, vous pouvez introduire une petite modification dans le fichier tel qu’il apparaît plus haut en mettant par exemple deux espaces entre le prénom et le nom (voir section 2.4.). Ensuite, votre ligne INPUT deviendra : INPUT prenom & $14. nom $10.; Programme 2.30 DATA acteur; INPUT acteur $ film $; CARDS; Bourvil La traversée de Paris Jean Gabin La bête humaine Louis de Funes Pouic Pouic ;RUN; Le programme 2.30 ne fonctionnera pas quel que soit l’INFORMAT que vous choisirez parce que l’espace apparaît au sein des modalités et qu’il est en même temps le séparateur de modalités. Il faut donc que votre fichier brut soit modifié et que le séparateur de modalités diffère de l’espace. Dans le fichier ACTEUR1.TXT un séparateur égal à # a été introduit. Dans le fichier ACTEUR.TXT, la tabulation est utilisée. Voici le programme qui traite le fichier ACTEUR1.TXT : Programme 2.31 DATA acteur1; INFILE 'C:\intro_SAS\fichiers\acteur1.txt' DLM='#'; INPUT acteur :$20. film :$30.; ;RUN; Pour traiter maintenant le fichier ACTEUR2.TXT, vous vous dites qu’il suffit d’indiquer EXPANDTABS dans la ligne INFILE à la place de DLM=. Mais cela ne fonctionne pas. Programme 2.32 DATA acteur; INFILE 'C:\intro_SAS\fichiers\acteur2.txt' EXPANDTABS; INPUT acteur :$20. film :$30.; RUN; Dans le cas présent, SAS arrête la lecture des variables au premier espace qu’il rencontre alors que vous lui avez indiqué que le séparateur était la tabulation. Vous pouvez alors ouvrir votre fichier de données au moyen d’un éditeur quelconque (par exemple, Word) et commander un remplacement des tabulations (^t sous Word) par une séparateur spécifique comme # pour ensuite relancer un programme analogue au programme 2.322. 1. Dans ce cas, les variables ne sont pas présentées en colonnes mais il existe des espaces au sein des modalités des variables alphanumériques. 2. Mais si vos modalités sont séparées par des tabulations, vous ouvrirez sans problème votre fichier dans Excel, pourrez l’enregistrer en format Excel pour ensuite l’importer via le module d’importation de SAS. SAS Livre Page 57 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 57 D’autres INFORMAT sur variables alphanumériques sont disponibles. Pour une liste complète, consultez l’aide SAS1. Le tableau 2.1 vous présente quelques INFORMAT. Tableau 2.1 • INFORMAT des variables alphanumériques Donnée brute INFORMAT appliqué Modalité dans SAS "bourvil" $quote9. bourvil ‘fernandel’ $quote11. fernandel SAS 9’2" $quote9. SAS 9’2 Bourvil $upcase3. BOU Bourvil $upcase7. BOURVIL 01010010 $binary. R 01101110 $binary. n 2.8.2 Les INFORMAT des variables numériques Vous n’avez pas besoin de spécifier un INFORMAT si la modalité brute que vous avez à transformer en une modalité de variable SAS est de la forme : 23 23.2 -23 00023 2.3E1 2.3E01 230E-1 Les données numériques ont parfois des formes qui ne conviennent pas à SAS. Nous avons ainsi vu que le séparateur décimal interne à SAS était le « . ». Si l’on essaie d’entrer des données avec des virgules, SAS interprète ce type de données comme un caractère et crée des valeurs manquantes dans la table. Un INFORMAT permet de gérer ce type de difficulté. Les choses sont cependant simplifiées par rapport aux INFORMAT sur variables alphanumériques parce que le statut du W n’est pas le même si vous utilisez un INFORMAT numérique ou si vous utilisez un INFORMAT alphanumérique. Avec un INFORMAT sur variable alphanumérique, le W indique deux choses : • le nombre de caractères à lire dans le fichier brut, information nécessaire si votre modalité fait plus de 8 caractères ou si un espace intervient dans la modalité ; • le nombre d’octets à utiliser pour enregistrer la modalité dans la table SAS et donc le nombre maximal de caractères qui pourront être enregistrés pour cette variable2. En ce qui concerne les variables numériques, le W ne spécifie pas le nombre d’octets à utiliser pour enregistrer la modalité dans la table SAS3. Il ne sert qu’à indiquer le nombre de caractères à lire dans le fichier brut. Ensuite, contrairement aux variables alphanumériques, SAS ne limite pas sa lecture à 8 caractères4. Par conséquent, sauf dans des cas particuliers, vous n’aurez pas besoin de spécifier le W des INFORMAT numériques et la plupart de vos INFORMAT seront de la forme :INFORMAT. 1. Onglet Sommaire : SAS products / Dictionnary of Language Elements / Informats. 2. En effet, pour enregistrer un caractère, il faut un octet. 3. Vous pouvez tout de même fixer le nombre d’octets utilisés pour stocker une modalité numérique mais cela n’est pas possible avec l’instruction INPUT – les données numériques sont systématiquement codées sur 8 octets. 4. Dans une étape DATA incluant un CARDS, les chiffres composés au maximum de 308 caractères sont acceptés par SAS. SAS Livre Page 58 Jeudi, 18. septembre 2008 6:03 18 58 ◆ SAS Dans quels cas aurez-vous besoin de spécifier le W ? Nous développerons la réponse à cette question dans la section 2.8.2.b. mais retenez pour l’instant que vous aurez à préciser le W dans essentiellement deux cas (que vous rencontrerez rarement) : • Si le séparateur de modalités est l’espace et qu’il apparaisse des espaces au sein de votre modalité brute1. Exemple : 1 000, 1er janvier 2008 • S’il n’y a pas de séparateur de modalités et que votre donnée numérique présente toujours le même nombre de caractères2. Exemple : 1000abc 0043def pour des modalités de 1000 et de 43 pour la variable numérique. a. Quelques INFORMAT sur variables numériques Les nouvelles versions de SAS sont toujours l’occasion d’introduire de nouveaux INFORMAT. Pour connaître la liste complète des INFORMAT à disposition pour votre version de SAS, consultez l’aide SAS3. Nous ne présenterons ici que les INFORMAT les plus courants avec la notation utilisée par l’aide SAS, à savoir INFORMATw.d4. Vous utiliserez le plus souvent ces INFORMAT sous leur forme :INFORMAT. Généralement, un INFORMATw.d demande la lecture d’exactement W caractères et la multiplication par 10-D de la donnée lue si la donnée est entière. Attention, si la donnée est décimale, la multiplication par 10-D ne sera pas effectuée. NUMXw.d Cet INFORMAT permet de lire les données avec le séparateur décimal (virgule). :NUMX. va transformer 896,48 (donnée brute) en 896.48 (donnée SAS). Il est également possible de demander une multiplication par un 10-d mais étant donné que les données ont des séparateurs décimaux, elle ne s’appliquera pas. Exercice 2.9 : Sur la base du fichier MARDI.TXT, créez une table SAS. Ouvrez ce fichier au moyen d’un éditeur de texte quelconque. PERCENTw.d Enlève les points, les blancs, les signes $, les tirets, transforme les parenthèses gauches en signe – (s’il n’y a pas de signe – entre les parenthèses). 1. Ce cas est très improbable. En effet, pour que vous puissiez construire une table qui comprendrait plusieurs variables, si l’espace intervient à la fois au sein de la modalité et comme séparateur de modalités, il faudrait que votre variable numérique présente toujours le même nombre de caractères ou que vos données soient présentées en colonnes. 2. Ce cas aurait pu être rencontré dans les années 60-70 où il était important d’économiser de l’espace de stockage. Pour ce faire, les données brutes étaient systématiquement en colonnes, sans modalité de séparation et sans séparateur décimal. Pour transformer ces modalités brutes, il convenait alors d’employer un INFORMAT w.d demandant à lire w caractères, puis à multiplier la donnée par 10-d. Cet INFORMAT existe toujours. 3. Voir dans la documentation SAS, onglet Sommaire : SAS PRODUCTS / BASE SAS / SAS LANGUAGE DICTIONNARY / DICTIONNARY OF LANGUAGE ELEMENTS / INFORMAT. Sur les 46 INFORMAT sur variables numériques présentés dans l’aide de SAS 9.1.3, cette section ne cite qu’une vingtaine d’INFORMAT. L’aide de SAS 9.2 n’indique que 38 INFORMAT sur variables numériques. 4. Si un INFORMAT ou un FORMAT utilise la possibilité offerte par le d, il n’est jamais suivi d’un point. Le point que vous observez ici termine la phrase. SAS Livre Page 59 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 59 Ainsi : Donnée brute INFORMAT Modalité SAS 1% :PERCENT. 0.01 1.6% :PERCENT. 0.016 (1%) :PERCENT. –0.01 (-1%) :PERCENT. –0.01 1% PERCENT3. 0.01 -1%$ :PERCENT. –0.01 1 :PERCENT. 1 1) :PERCENT. 1 En revanche, si le signe % n’apparaît pas, la donnée n’est pas divisée par 100. Pour la donnée brute 1 %, vous devrez préciser le nombre de caractères à lire étant donné qu’un espace apparaît entre le 1 et le signe %. Exercice 2.10 : Créez deux tables SAS au moyen des fichiers TAUX.TXT et TAUXV.TXT – le second fichier vous apprendra qu’un INFORMAT pour lequel le « d » est spécifié peut avoir son utilité. COMMAw.d Répond à un problème spécifiquement américain. Lorsque ceux-ci écrivent 1000000 de dollars, cela donne $1,000,000. :COMMA. va transformer $1,000,000 (donnée brute) en 1000000 (donnée SAS). COMMAw.d enlève les signes $, les blancs, les pourcentages, les virgules, les tirets, les parenthèses droites et transforme les parenthèses gauches en signes –. La transformation par 10-D est aussi possible. Exercice 2.11 : Appliquez l’INFORMAT COMMAw.d aux données suivantes que vous aurez, au préalable, replacées dans une seule colonne. 1,000,000 $1,000,000 1 000 000 1-000-000 (1,000,000) (-1,000.00) €1.000.000 1 000 000% Retirez les modalités brutes présentant des espaces pour vérifier que :COMMA. traite les autres modalités. COMMAXw.d Réalise les mêmes transformations sauf qu’elles s’appliquent aux données du type 1.000.000 (notation à l’européenne de 1000000). EUROw.d Retirera les virgules et les signes € (le signe E pour l’euro n’est plus reconnu par SAS depuis la version 9.1) qui pourraient apparaître « à l’américaine », avant la somme donc. :EURO. va transformer €1,000,000 (donnée brute) en 1000000 (donnée SAS). SAS Livre Page 60 Jeudi, 18. septembre 2008 6:03 18 60 ◆ SAS EUROXw.d Réalise les mêmes transformations sur les sommes saisies à l’européenne. :EUROX. va transformer €1.000.000 (donnée brute) en 1000000 (donnée SAS). b. Préciser ou pas W1 S’il n’y a pas d’espace dans les différentes modalités de vos données brutes, vous n’avez pas besoin de préciser W. Programme 2.33 DATA test; INPUT X1 :comma. X2 :eurox. X3 :euro. X4 :percent. X5 :numx. X6; CARDS; $1000 €1000,00 €10,000.00 4% 125,6 125.6 $4 €100000 €2,234 (4%) 0,2 12334323.2 ;RUN; Dans les différentes modalités de vos données brutes, s’il apparaît des espaces mais que le séparateur de modalités ne soit pas l’espace mais un caractère quelconque, vous n’avez pas besoin de préciser W. Programme 2.34 DATA test; INFILE CARDS DLM='@'; INPUT X1 :comma. X2 :eurox. X3 :euro. X4 :percent. X5 :numx. X6; CARDS; $ 1000@€ 1000,00@€10 000.00@4 %@125,[email protected] $ 4@€ 100 000@€2 234@(4%)@0,[email protected] ;RUN; Dans les différentes modalités de vos données brutes, s’il apparaît des espaces et que le séparateur de modalités soit aussi l’espace, vous ne pourrez pas construire une table SAS si vos données ne sont pas présentées en colonnes. Programme 2.35 DATA test; INPUT X1 ??? X2 ??? X3 ??? X4 ??? X5 ??? X6; CARDS; $ 1000 € 1000,00 €10 000.00 4 % 125,6 125.6 $ 4 € 100 000 €2 234 (4%) 0,2 12334323.2 ;RUN; Dans les différentes modalités de vos données brutes, s’il apparaît des espaces et que le séparateur de modalités soit aussi l’espace, pour que vous puissiez construire une 1. Les exemples de cette section expliquent dans quels cas vous devrez préciser le W. Ils sont constitués d’étapes DATA dans lesquelles les données sont introduites au moyen d’une commande CARDS. Vous retrouverez sur le site compagnon de cet ouvrage ces programmes adaptés à la construction d’une table au moyen d’un fichier externe. Les règles énoncées restent bien entendus valables. SAS Livre Page 61 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 61 table SAS, vos données devront être présentées en colonnes. Vous aurez alors besoin de préciser les W. Programme 2.36 DATA test; INPUT X1 comma6. X2 eurox10. X3 euro11. X4 percent5. X5 :numx. X6 ; CARDS; $ 1000 € 1000,00 €10 000.00 4 % 125,6 125.6 $ 4 € 100 000 €2 234 (4%) 0,2 12334323.2 ;RUN; Attention si vous devez utiliser W à la position du curseur : ----+----1----+----2----+----3----+----4----+----5----+----6$ 1000 € 1000,00 €10 000.00 4 % 125,6 125.6 Pour la première variable, nous demandons la lecture de 6 caractères ; le curseur est donc en position 6. Pour lire la variable suivante, bien que la modalité ne prenne que 9 caractères, nous devons demander la lecture de 10 caractères afin de lire le dernier 0 de « 1000,00 ». Si vos données sont présentées en colonnes mais qu’il n’apparaît pas d’espace au sein de vos modalités, vous n’aurez pas besoin de préciser les W. Programme 2.37 DATA test; INPUT X1 :comma. X2 :eurox. X3 :euro. X4 :percent. X5 :numx. X6; CARDS; $1000 €1000,00 €10000.00 4% 125,6 125.6 $4 €100000 €2234 (4%) 0,2 12334323.2 ;RUN; Enfin, si vous pouvez utiliser les INFORMAT sous leur forme :INFORMAT, il est parfaitement inutile de préciser le W : celui-ci n’est pas pris en compte. Programme 2.38 DATA test; INPUT X1 :comma1. X2 :eurox1. X3 :euro1. X4 :percent1. X5 :numx1. X6; CARDS; $1000 €1000,00 €10000.00 4% 125,6 125.6 $4 €100000 €2234 (4%) 0,2 12334323.2 ;RUN; Pour associer à plusieurs variables le même INFORMAT, vous pouvez passer par une commande INFORMAT. Dans la commande INPUT, vous n’aurez alors plus besoin de préciser les INFORMAT nécessaires à la compréhension de la donnée brute : Programme 2.39 DATA test; INFORMAT X1 X2 numx.; SAS Livre Page 62 Jeudi, 18. septembre 2008 6:03 18 62 ◆ SAS INPUT X1 X2; CARDS; 1,2 2,3 3,4 4,5 ;RUN; Attention cependant : les INFORMAT qui pourraient apparaître dans la commande INFORMAT seront traités comme des :INFORMAT. Il est alors parfaitement inutile de préciser le W dans ce cas sauf dans l’exemple proposé par le programme 2.40. Programme 2.40 DATA test; INFORMAT X1 X2 comma1.2; INPUT X1 X2; CARDS; $1000 $2000 $30000 $40000 ;RUN; Dans le programme 2.40, nous souhaitons que les données brutes soient multipliées par 10-2 ; ceci est possible en précisant le D. Si vous exécutez ce programme, vous constaterez que le W n’est pas pris en compte puisque SAS lit bien l’intégralité des données brutes. Vous pouvez donner n’importe quelle valeur à W entre 1 et 32, le résultat sera toujours le même. Vous pouvez aussi ne pas préciser de W : COMMA.2. Il reste aussi possible d’appliquer le même INFORMAT à plusieurs variables au moyen de la commande INPUT : Programme 2.41 DATA test; INPUT (X1 X2) (:comma.2); CARDS; $1000 $2000 $30000 $40000 ;RUN; Il nous reste deux cas à préciser : lorsque les modalités sont séparées par des tabulations et lorsqu’elles sont séparées par des virgules. Dans le cas où les modalités sont séparées par une tabulation, si les modalités ne contiennent pas d’espaces, vous n’avez pas besoin de préciser W. En revanche, si les modalités contiennent des espaces, vous ne pourrez pas construire de table SAS directement1 : vous devrez ouvrir votre fichier brut, au moyen d’Excel par exemple, et importer votre fichier enregistré dans un format Excel grâce au module d’importation de SAS. Si votre séparateur de modalités est la virgule, vous avez deux possibilités : 1. Vos modalités ne contiennent pas de virgules, vous n’aurez alors pas besoin de préciser W. 1. Nous avons en effet vu dans la section 2.4. que si vos modalités sont séparées par des tabulations, l’espace continue à être considéré comme le séparateur de modalités. SAS-CH-02 Page 63 Jeudi, 18. septembre 2008 6:38 18 Pour aller plus loin dans la création de tables SAS ◆ 63 2. Vos modalités contiennent des virgules. Par exemple, $1,000,000.00 : • Si ces modalités ont des longueurs constantes ou si elles sont présentées en colonnes, vous devrez introduire des W et surtout pas de « : ». • Dans le cas contraire, il vous sera impossible de créer une table SAS. Ce dernier cas est réellement problématique. Pour le résoudre, soit vous demandez à la personne qui a construit ce fichier brut un autre séparateur de modalités, soit vous modifiez à la main votre fichier brut. Cette tâche risque d’être difficile (et même impossible) dans le cas suivant : 1,000.24,234,567,23,54,67,123,345 Quatre variables se cachent dans cet enregistrement. La modalité de la dernière variable peut être 345, 123345, 123.345 ou 67123354. c. Exercices Exercice 2.12 : Dans le fichier PABLO, vous trouverez un descriptif du catalogue des disques PABLO (extrait) – label de jazz des années 70, créé par Norman Granz, créateur du label Verve. Les disques de ce label ont fait l’objet de rééditions (collection OJC) en disques 33 tours vinyle et étaient distribués par deux sociétés jusqu’à recemment : Fantasy aux ÉtatsUnis et ZYX en Allemagne. Dans ce fichier sont indiqués, dans l’ordre, la référence PABLO du disque, l’artiste, le titre de l’album, si Fantasy le vend en format vinyle (fantasy/no), la référence OJC en cas de vente par Fantasy, le prix Fantasy en dollars, si ZYX le vend en format vinyle (ZYX/no) et le prix ZYX en euros. Créez une table SAS au moyen des données présentées. Merci de regarder la structure du fichier PABLO au moyen d’un éditeur de texte quelconque avant de lancer quoi que ce soit. Exercice 2.13 : Construisez une table SAS en utilisant le fichier PABLO2.TXT (catalogue complet – la structure du fichier diffère très nettement). Réservez 48 caractères pour l’artiste (la variable artiste peut prendre jusqu’à 95 caractères : vous allez donc la tronquer), 40 caractères pour le titre de l’album (qui peut prendre jusqu’à 70 caractères). La structure des observations est la suivante : ----+----1----+----2----+----3----+----4----+ 2312131 Count Basie & His Orchestra Warm Breeze fantasy OJC-994 $9.98 ZYX €11,49 2.8.3 Des variables numériques particulières : les dates et heures Les dates et heures sont des variables numériques. Si une variable reprenant une date apparaît dans votre fichier brut sous la forme ‘01JAN2008’, vous devez, au moyen d’un INFORMAT, faire comprendre à SAS, lors de la création d’une table SAS, qu’il s’agit bien d’une date. Sinon, si vous enregistrez cette variable sous une forme alphanumérique, vous ne pourrez pas, par exemple, regrouper les observations relatives à un même mois, trier vos données par ancienneté, ou calculer un temps entre deux observations consécutives. SAS Livre Page 64 Jeudi, 18. septembre 2008 6:03 18 64 ◆ SAS a. Les INFORMAT de date SAS stocke une date sous la forme d’une variable numérique qui indique le nombre de jours séparant la date en question du 01/01/1960 : un chiffre négatif indiquera donc une date antérieure au 1er janvier 1960. SAS gérera n’importe quelle date entre 1582 (année d’imposition du calendrier grégorien) et 20 000. Plusieurs cas sont possibles : Premier cas : Vous avez trois variables qui saisissent la date (une variable jours, une variable mois et une variable année). La fonction MDY vous permet de construire votre variable : Programme 2.42 DATA test; INPUT JJ MM AA; date=MDY(MM,JJ,AA); CARDS; 1 1 1960 1 1 1900 10 10 1980 20 12 2003 ;RUN; PROC PRINT; RUN; Résultat 2.6 Obs JJ MM AA date 1 2 3 4 1 1 10 20 1 1 10 12 1960 1900 1980 2003 0 -21914 7588 16059 La fonction MDY vous permet de recoder un ensemble de variables dans la forme que SAS comprend comme étant une date (un nombre de jours qui sépare votre date du 01/01/1960). Attention : SAS comprend les dates à l’américaine, c’est-à-dire mois/jours/année (MDY : Month Day Year). La date peut être rendue plus parlante par l’application d’un FORMAT. Le FORMAT définit la forme que devra prendre la variable à l’affichage1. Programme 2.43 DATA test; SET test; FORMAT date yymmdd10.; RUN; PROC PRINT; RUN; 1. Nous traiterons des FORMAT plus en détail dans la section 5.3. SAS Livre Page 65 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 65 Résultat 2.7 Obs JJ MM AA date 1 2 3 4 1 1 10 20 1 1 10 12 1960 1900 1980 2003 1960-01-01 1900-01-01 1980-10-10 2003-12-20 Deuxième cas : Votre date, dans votre fichier brut, est dans une forme qui peut être comprise par SAS au moyen d’un INFORMAT. Imaginons pour cela que votre date, dans le fichier que vous devez transformer en table SAS, apparaisse sous la forme suivante : 01/12/1960 pour 1er décembre 1960. Programme 2.44 DATA date3; INPUT date :ddmmyy.; CARDS; 01/12/1960 02/12/1960 03/12/1960 ;RUN; Assurez-vous de spécifier le bon INFORMAT : ici, les modalités sont bien 1 décembre 1960, 2 décembre 1960 et 3 décembre 1960. Dans le meilleur des cas, si vous vous trompez d’INFORMAT, SAS ne va pas comprendre et rejettera votre programme. S’il l’exécute malgré tout, vous risquez de rencontrer quelques problèmes. Exemple d’erreur d’INFORMAT : Programme 2.45 DATA date3; INPUT date :mmddyy.; CARDS; 01/12/1960 02/12/1960 03/12/1960 ;RUN; Avec cet INFORMAT, SAS comprend vos dates à l’américaine et les codifiera en interne comme étant les 12 janvier 1960, 12 février 1960, 12 mars 1960. Si vous devez et pouvez spécifier le W, les INFORMAT incluant les W peuvent ne pas comprendre des dates écrites dans une forme voisine. DDMMYY10. peut ainsi transformer 1/1/1960, 01/01/1960, 01-01-1960, 01011960, 01/01/60, 010160 ou 01 01 1960 en une date SAS. DDMMYY6. ne comprendra pas 01/01/1960. En revanche, si vous pouvez ne pas préciser le W, l’INFORMAT :DDMMYY. comprendra toutes les formes possibles dans lesquelles il n’y a pas d’espace. Programme 2.46 DATA test_d; INPUT X :DDMMYY. @@; CARDS; 01102007 011007 01-10-2007 01-10-07 01/10/2007 01/10/07 01.10.2007 01.10.07 01:10:2007 01:10:07 1102007 11007 1-10-2007 1-10-07 1/10/2007 1/10/07 1.10.2007 1.10.07 1:10:2007 1:10:07 ;RUN; SAS Livre Page 66 Jeudi, 18. septembre 2008 6:03 18 66 ◆ SAS Tableau 2.2 • Liste des INFORMAT les plus courants sur dates (1er octobre 2007) Dates dans votre fichier brut INFORMAT spécifique Forme générale 1OCT07 DATE7. :DATE. 1OCT07 DATE. 01OCT07 DATE7. 01OCT2007 DATE9. 01-OCT-07 DATE9. 011007 DDMMYY6. 01 10 07 DDMMYY8. 01/10/07 DDMMYY8. 01/10/2007 DDMMYY10. 07274 JULIAN. 2007274 JULIAN7. 100107 MMDDYY. 100107 MMDDYY6. 10/01/07 MMDDYY8. 10/01/2007 MMDDYY10. Oct07 MONYY. Oct2007 MONYY7. 071001 YYMMDD6. 071001 YYMMDD. 07-10-01 YYMMDD8. 07 10 01 YYMMDD8. 2007-10-01 YYMMDD10. 07Q4 YYQ. 2007Q4 YYQ6. :DDMMYY. :JULIAN. :MMDDYY. :MONYY. :YYMMDD. :YYQ. Attention : ce tableau est loin d’être complet. Consultez l’aide SAS pour connaître les INFORMAT de date disponibles pour votre version de SAS. Il est aussi possible de faire entrer des dates saisies en français ou dans d’autres langues. Les langues1 comprises par SAS sont : Danish DAN French FRA Norwegian NOR Swedish SVE Dutch NLD German DEU Portuguese PTG Swiss_French FRS Finnish FIN Italian ITA Spanish ESP Swiss_German DES Vous utiliserez pour cela les INFORMAT suivants : EURDFDE. (version internationale de DATE.) et EURDFMY. (version internationale de MONYY.). On peut utiliser 1. Les langues indiquées ici sont celles livrées avec SAS 9.1. De nouvelles langues ont été introduites avec SAS 9.2 (voir section 5.3.4.). SAS Livre Page 67 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 67 ces INFORMAT dans la forme internationale en spécifiant une option de langue – on peut aussi simplement modifier le préfixe. Ainsi :1 Programme 2.472 DATA date4; INPUT date fradfde.; CARDS; 01JAN60 01FEV60 01MAR60 01AVR60 01MAI60 01JUN60 01JUL60 01AOU60 01SEP60 01OCT60 01NOV60 01DEC60 ;RUN; OPTIONS DFLANG=french; DATA date4; INPUT date eurdfde.; CARDS; 01JAN60 01FEV60 01MAR60 01AVR60 01MAI60 01JUN60 01JUL60 01AOU60 01SEP60 01OCT60 01NOV60 01DEC60 ;RUN; Troisième cas : votre date est saisie de manière que SAS ne la comprendra pas même en utilisant un de ses INFORMAT. Vous pourrez alors procéder de deux manières : • Soit vous devrez recoder les jours, mois et années (trois variables distinctes) pour ensuite utiliser la fonction MDY. Exemple : 1er juillet 2002. • Soit vous devrez créer votre propre INFORMAT (voir section 2.8.4.). b. L’option YEARCUTOFF Soit la date suivante qui apparaît dans un fichier brut : 01/01/07. Quelle est exactement la date qui se cache derrière ce 01/01/07 : le 1er janvier 2007, 1907, 1807… ? Par défaut, la date sera comprise (et recodée) comme étant le 1er janvier 2007. Dans le cas où 07 signifie en fait 1907, vous devez spécifier une nouvelle valeur pour le YEARCUTOFF, option qui définit votre environnement. OPTIONS YEARCUTOFF = yyyy; Par défaut, le YEARCUTOFF est égal à 1920 : pour SAS, la date 01/01/10 correspond forcément au 1er janvier 2010, la date 01/01/19 à 01/01/2019, mais il traduit le 01/01/20 en 01/01/1920. Si vous souhaitez que le 01/01/20 soit considéré par SAS comme le 01/01/2020, vous devez modifier le YEARCUTOFF en lui donnant une valeur supérieure à 1920. Cette option est inutile si vous entrez vos dates sous la forme 01/01/1789. Exercice 2.14 : Quel YEARCUTOFF faut-il spécifier pour que 14/07/89 soit traité par SAS comme étant le 14 juillet 1789 ? 1. JUI n’est jamais une abréviation correcte – employez JUN pour juin et JUL pour juillet. SAS Livre Page 68 Jeudi, 18. septembre 2008 6:03 18 68 ◆ SAS c. Les INFORMAT de temps Le principe des variables d’heure est identique à celui des variables de date. Les mesures du temps stockées par SAS correspondent au nombre de secondes qui séparent minuit de l’heure considérée. Ainsi, 23:59:59.9, soit un dixième de seconde avant minuit, sera enregistré par SAS sous la forme 86399.9 (0.9 + 59 + 59 * 60 + 23 * 60 * 60) – une mesure de l’heure est toujours positive. Il existe deux INFORMAT de temps : TIME. qui saura gérer 1:00:00 et 13:00:00. DATETIME. qui saura gérer 17MAR00:00:00:00. DATETIME. est un INFORMAT de temps particulier puisqu’il utilise non pas un nombre de secondes entre minuit et l’heure considérée mais un nombre de secondes entre le 1er janvier 1960 et l’heure considérée du jour considéré. Dans votre fichier de départ, si votre heure apparaît non pas sous la forme 12:00:00 mais sous la forme de trois variables (ou quatre si vous disposez des dixièmes, voire des centièmes de seconde), il ne vous restera plus qu’à calculer le nombre de secondes entre votre heure et minuit. Pour plus de détails sur les dates et heures, reportez-vous à l’aide SAS : (SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/lrcon.hlp/a002200738.htm (SAS 9.2) : support.sas.com/documentation/cdl/en/lrcon/59522/HTML/default/ a002200738.htm Exercice 2.15 : Reprenez ce que vous avez fait sur les fichiers SGTPEPPER.TXT et BEATLES.TXT. Nous avions lors de l’exercice scindé l’information durée du morceau en deux : durée en minutes et durée en secondes. Reprenez votre programmation en y appliquant l’INFORMAT correct (s’il existe). 2.8.4 Créons notre propre INFORMAT1 ! Pour plus de renseignements sur le sujet de cette section, vous pouvez consulter les documents suivants : www2.sas.com/proceedings/sugi27/p101-27.pdf www.nesug.info/Proceedings/nesug97/begtut/levine.pdf Vous observerez très certainement un jour des données qui nécessitent un INFORMAT mais pour lesquelles l’INFORMAT désiré n’existe pas. SAS vous offre la possibilité de créer vous-même un INFORMAT. Prenons un exemple. Votre entreprise a effectué une enquête, sans vous consulter, et a saisi les réponses aux questions qu’elle a posées de la manière suivante : oui/non/ne sait pas. De plus, elle a sous-traité la saisie des réponses aux questionnaires papier à une entreprise qui a bâclé le travail : les réponses contenues dans votre fichier brut sont de la forme oui/OUI/Oui ; non/NON/Non ; ne sait pas/Ne Sait Pas/NE SAIT PAS. En revanche, votre responsable 1. Attention : cette section fait appel à des notions qui n’ont pas été évoquées jusqu’à maintenant (mais qui seront vues par la suite). Si c’est votre première lecture de cet ouvrage, vous pouvez passer cette section et y revenir par la suite. Nous n’évoquons pas dans cette section la sauvegarde pour utilisation ultérieure des INFORMAT. Ce point sera plus particulièrement traité dans la section 5.3.6.b. SAS Livre Page 69 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 69 vous indique qu’ils avaient prévu qu’un problème pouvait se poser : ils ont fait mettre deux espaces entre chaque modalité dans le fichier brut. Vous avez ici le choix entre deux procédures. La procédure simple et une procédure plus compliquée mais qui vous permettra de vous sortir de cas beaucoup plus ardus que celui exposé ici. a. Cas simples Un cas est simple lorsque vous n’avez que quelques modalités possibles pour une variable. Ainsi, dans le cas de l’exemple présenté ici, nous avons neuf modalités de réponse possibles que nous allons transformer en trois valeurs (1, 2 et 3). Dans le cas simple, vous pouvez passer directement par PROC FORMAT. Programme 2.48 PROC FORMAT; INVALUE enq 'OUI','Oui','oui' = 1 'NON','Non','non' = 2 'NE SAIT PAS', 'ne sait pas', 'Ne Sait Pas' = 3; RUN; Le programme présenté ici construit un INFORMAT numérique (puisque les modalités prises par la variable réponse seront par la suite 1, 2 et 3). On pourrait construire un INFORMAT alphanumérique de la même manière : Programme 2.49 PROC FORMAT; INVALUE $enq 'OUI','Oui','oui' = 'O' 'NON','Non','non' = 'N' 'NE SAIT PAS', 'ne sait pas', 'Ne Sait Pas' = 'NSP'; RUN; Les remarques qui suivent sont valables que vous créiez un INFORMAT ou bien un FORMAT1 : • Le nom de l’INFORMAT (FORMAT) ne doit pas prendre plus de 7 caractères, signe dollar compris, si vous avez une version 8, ou plus de 31 caractères si vous avez une version 9. • L’INFORMAT est alphanumérique si les LABEL sont précisés entre quotes (cas du programme 2.49). • Dans ce cas, le nom de votre INFORMAT (FORMAT) doit commencer par le signe $. • Vous ne pouvez pas prendre pour nom celui d’un INFORMAT (FORMAT) existant. • Votre INFORMAT/FORMAT ne peut se terminer par un chiffre. Dans le cas des INFORMAT/FORMAT alphanumériques, les LABEL que vous allez associer à certaines valeurs peuvent prendre jusqu’à 32 767 caractères depuis SAS 9. Pour spécifier les valeurs à associer à un LABEL, vous pouvez les saisir comme : • Une valeur unique : 4 ou ‘A’ ou ‘OUI’. 1. Voir la section 5.3. SAS Livre Page 70 Jeudi, 18. septembre 2008 6:03 18 70 ◆ SAS • Une liste de valeurs de même type séparées par des virgules : 4, 5, 12, 23 ou ‘A’, ‘B’, ‘Z’, ‘OUI’. • Un intervalle de valeurs alphanumériques. Ainsi, pour toutes lettres comprises entre M et Z : ‘M’-’Z’. • Un intervalle de valeurs numériques. Ainsi, pour toutes valeurs numériques comprises entre 1 et 50 : 1-50. Pour spécifier des intervalles numériques, vous pouvez indiquer : • low-13 : pour inférieur ou égal à 13. • low-<13 : pour strictement inférieur à 13. • 25-high : pour supérieur ou égal à 25. • 25<-high : pour strictement supérieur à 25. • Si vous spécifiez mal vos intervalles, si elles se chevauchent comme dans 14-25 et 25-high, le second intervalle sera traité comme l’intervalle « strictement supérieur à 25 ». • La valeur OTHER est possible pour associer un LABEL à toutes valeurs non évoquées par les intervalles. OTHER doit cependant intervenir en dernier. Que se passe-t-il si vous oubliez une possibilité de réponse à associer à une certaine modalité (par exemple, si la réponse non a été saisie NoN pour un individu). Si l’INFORMAT que vous avez crée est un alphanumérique, la réponse ‘NoN’ est reprise telle quelle dans votre table final – cela va vous permettre de reprendre la définition de votre INFORMAT et de la compléter des modalités que vous avez oubliées. Si votre INFORMAT est numérique, dans le cas présent, la modalité associée dans la table sera valeur manquante ce qui est ici beaucoup plus problématique. Il convient, lorsque vous créez votre table en utilisant un INFORMAT que vous avez construit, de lire votre fenêtre JOURNAL. Si SAS rencontre des modalités non évoquées lors de la construction de l’INFORMAT, il peut vous l’indiquer de la manière suivante : NOTE: Données incorrectes pour rep en ligne 521 1-11. RÈGLE : ----+----1----+----2----+----3----+----4----+----5----+----6521 oUi rep=. _ERROR_=1 _N_=3 À partir de cette remarque, vous saurez comment compléter votre PROC FORMAT des modalités pour l’instant manquantes. b. Cas plus complexes Dans certains cas, l’écriture complète de toutes les valeurs brutes possibles et des valeurs transformées ne sera pas possible. Vous devrez alors utiliser une procédure plus complexe. Dans un premier temps, nous reprenons le programme présenté dans la section précédente avec cette procédure plus complexe : Programme 2.50 DATA infmt; INPUT start $11. @13 label $; FMTNAME="enq"; TYPE='J'; CARDS; SAS Livre Page 71 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 71 oui O Oui O OUI O non N NON N Non N ne sait pas NSP NE SAIT PAS NSP Ne Sait Pas NSP ;RUN; PROC FORMAT CNTLIN=infmt; RUN; DATA test; INPUT nom & $10. (rep1 rep2 rep3)(& $enq.); CARDS; jean oui OUI Oui Pierre non NON Non paul ne sait pas NE SAIT PAS Ne Sait Pas ;RUN; Vous créez dans un premier temps une table dans laquelle vous résumez votre INFORMAT. Il est important que cette table contienne des variables appelées : • START (dans laquelle vous saisirez vos modalités de réponses brutes) ; • LABEL (modalités à donner après le passage par l’INFORMAT) ; • FMTNAME (qui aura pour modalité le nom de votre INFORMAT) ; • TYPE (=‘J’ J pour INFORMAT caractère). Les données de la table INFMT sont formatées en colonnes en raison de la modalité ‘ne sait pas’. L’instruction PROC FORMAT permet la création de l’INFORMAT au moyen des données contenues dans la table INFMT. Nous utilisons ensuite l’INFORMAT créé pour traiter les données de la table TEST. La variable TYPE peut prendre, en cas de création d’INFORMAT, les valeurs J (INFORMAT caractère), I (INFORMAT numérique). Vous pourrez aussi créer des FORMAT avec ce type de commande (voir section 5.3.6.) – à ce moment, TYPE pourra être égal à C si le FORMAT est caractère, ou N s’il est numérique. Vous pouvez ne pas préciser TYPE si, en cas d’INFORMAT numérique, vous faites précéder le nom de votre INFORMAT d’un @ ($ si l’INFORMAT est caractère)1. Bien entendu, vous pouviez aussi créer une table à partir du fichier brut, puis via une programmation, recréer les différentes valeurs obtenues au moyen de votre INFORMAT2. Cependant, dans certains cas, la construction de la table dans sa forme brute suivie d’un travail pour obtenir la variable dans le format que vous souhaitez sera délicate, voire impossible, particulièrement si votre fichier brut contient des formes de date particulières. 1. Un INFORMAT est caractère lorsqu’il transforme une donnée en une chaîne de caractères ; il est numérique s’il transforme la donnée brute en donnée numérique – la forme de la donnée brute ne compte pas. Un FORMAT est numérique lorsqu’il est appliqué à une variable numérique, et caractère lorsqu’il est appliqué à une variable alphanumérique. 2. Il suffit en effet ici de saisir les modalités brutes, puis de les transformer via la fonction UPCASE (voir section 3.2.6.) pour ensuite construire une nouvelle variable et attribuer les valeurs 1,2,3 en fonction de la modalité brute observée. SAS Livre Page 72 Jeudi, 18. septembre 2008 6:03 18 72 ◆ SAS Imaginons le scénario suivant : dans votre fichier brut, vos dates ont été saisies sous la forme 1er janvier 2006, 2 janvier 2006 (des ventes sont indiquées ensuite, deux espaces séparent la date des montants vendus). Il n’existe pas d’INFORMAT qui vous permette de lire cette donnée. En revanche, cette date est dans un FORMAT de présentation des dates connu (voir sections 5.3. pour les FORMAT et 5.3.4. pour les FORMAT spécifiques aux dates). Retenez pour l’instant que le FORMAT est une sorte de filtre qui vous permet d’afficher, par exemple, une date dans un format lisible (et non plus comme un nombre de jours séparant votre date du 1er janvier 1960). Votre programmation devient dans ce cas : Programme 2.51 DATA infmt2; RETAIN fmtname "datefra" TYPE "I"; DO LABEL="1jan2004"d TO "1jan2006"d; start = PUT(LABEL,fradfwdx.); start = TRIM(LEFT(start)); OUTPUT; END; RUN; PROC FORMAT CNTLIN=infmt2; RUN; DATA test; INPUT date & datefra. vente; CARDS; 19 décembre 2005 1 20 décembre 2005 2 21 décembre 2005 3 22 décembre 2005 3 1er décembre 2005 5 ;RUN; Dans le programme 2.51, nous créons une table INFMT2 qui va servir de base à l’INFORMAT. La commande RETAIN1 va permettre de créer, comme dans le premier cas, les variables FMTNAME et TYPE – cette commande est rendue nécessaire par la présence d’une boucle DO2. Cette boucle permet la création d’une série de dates entre le 1er janvier 2004 et le 1er janvier 2006. Le suffixe « d » indique à SAS que la chaîne de texte entre les guillemets est une date (et c’est pour cela que l’incrémentation va pouvoir se faire). La commande PUT3 crée une variable alphanumérique START égale à la date écrite dans le FORMAT FRADFWDX (qui est bien la forme prise par les dates dans notre fichier brut). La commande TRIM permet d’effacer les espaces qui pourraient apparaître dans l’enregistrement de la date : vous forcez le positionnement de la date à gauche et s’il apparaît des espaces, ils sont effacés. La commande OUTPUT permet à chaque tour dans la boucle d’écrire les variables LABEL, START, FMTNAME et TYPE. Ensuite, la procédure PROC FORMAT, comme dans l’exemple précédant, crée l’INFORMAT spécifique que vous pouvez ensuite 1. Voir section 3.8.1. 2. Voir section 3.6.2. 3. Voir section 3.4.1. SAS Livre Page 73 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 73 appliquer pour créer votre table. Là encore, une programmation à l’intérieur d’une étape DATA est possible mais nettement plus délicate que la programmation proposée ici. Nous avons dans le présent cas profité du fait que, même si l’INFORMAT n’existait pas, la date était présentée dans un FORMAT connu de SAS. Vous aurez bien souvent des cas dans lesquels la date ne ressemble à rien de connu. Imaginons par exemple que dans votre fichier brut, la date se présente sous la forme 2006/AOU/01. Quels sont les problèmes liés à cette date ? • Effectivement, aucun INFORMAT ne peut lire cette date. • Cette date n’est même pas présentée dans un FORMAT de SAS. • Elle est en français (AOU pour août ; si elle avait été en anglais, on aurait dû lire AUG). Vous pouvez vous en sortir avec une programmation légèrement modifiée : Programme 2.52 OPTIONS DFLANG=french; PROC FORMAT; PICTURE tempo LOW-HIGH = '%Y/%b/%d' (DATATYPE = DATE); RUN; DATA infmt3; RETAIN FMTNAME "datefraa" TYPE "I"; DO LABEL="01jan2004"d TO "01jan2007"d; start = PUT(LABEL,tempo11.); start = TRIM (LEFT (start) ); OUTPUT; END; RUN; PROC FORMAT CNTLIN=infmt3; RUN; DATA test; INPUT date datefraa.; CARDS; 2006/aou/15 2005/sep/21 2004/jan/5 ;RUN; Nous choisissons le français comme langue par défaut via une commande OPTIONS puisque les abréviations des mois sont en français. Le premier PROC FORMAT va créer un INFORMAT temporaire (tempo) via la commande PICTURE : vous indiquez ainsi à SAS que toutes les valeurs (low-high) sont organisées de la façon suivante : %Y : année en 4 chiffres ; %b : mois en trois lettres dans la langue par défaut ; %d : jour du mois en chiffres (voir plus bas pour d’autres codes possibles). Année, mois et jour sont séparés par des signes « / » – l’option DATATYPE indique que nous créons bien un INFORMAT de date. Ensuite, vous créez une table INFMT3 qui va vous servir à construire votre INFORMAT définitif en utilisant la même procédure que précédemment. La seule difficulté est de donner à SAS le nombre de caractères qu’il doit utiliser pour écrire la date dans le FORMAT temporaire – ici, 11 au maximum, 4 pour l’année + 1 (/) + 3 pour le mois + 1 (/) + 2 pour le jour. SAS Livre Page 74 Jeudi, 18. septembre 2008 6:03 18 74 ◆ SAS La commande PICTURE sur des dates, ayant des formes très particulières, va vous permettre de vous sortir de très nombreuses situations délicates. Différents codes sont possibles : • %A : nom du jour en toutes lettres. • %b : nom du mois en abrégé. • %B : nom du mois en toutes lettres. • %d : numéro du jour dans le mois. • %j : numéro du jour dans l’année. • %m : mois en décimal. • %w : jour de la semaine en décimal. • %y : année en deux chiffres (sans les siècles). • %Y : année en quatre chiffres (avec les siècles). Ces commandes fonctionneront aussi sur des dates non anglaises (mais vous devrez spécifier la langue à utiliser via OPTIONS). Pour plus de détails sur la commande PICTURE, consultez l’article suivant : www2.sas.com/proceedings/sugi31/243-31.pdf Exercice 2.16 : Vous avez dans votre fichier brut la date suivante : « Mercredi 12 décembre 2007 ». Adaptez la programmation pour créer l’INFORMAT qui va saisir cette date. Imaginez maintenant que cette date est de la forme suivante :« mercredi 12 décembre 2007 ». Adaptez à nouveau votre programmation pour saisir correctement cette date. Et que devient votre programmation si votre date est au format suivant : « Mercredi, le 12 décembre 2007 » ? 2.9 Exportons nos tables SAS Vous devez maîtriser la notion de FORMAT pour comprendre cette section (voir section 5.3.). Si c’est votre première lecture de cet ouvrage, vous pouvez passer cette section et y revenir par la suite. Vous disposez maintenant d’une table SAS que vous souhaitez pouvoir exploiter avec un autre logiciel. Vous devez donc exporter votre table et lui assigner un format d’enregistrement tel qu’il sera aisément lisible par votre second logiciel. La procédure est relativement aisée et peut se faire grâce à une étape DATA1. Imaginons que vous disposiez d’une table de n individus pour lesquels 100 variables X1-X100 sont renseignées. Vous souhaitez créer un fichier qui contiendra uniquement les variables X1-X10. Programme 2.53 DATA _NULL_; SET test; FILE 'C:\intro_SAS\fichiers\extrait.txt'; PUT x1-x10; RUN; 1. Vous pourrez aussi utiliser la procédure PROC EXPORT – voir l’aide de SAS ou le module d’exportation des tables (menu FICHIER/Exporter données). SAS Livre Page 75 Jeudi, 18. septembre 2008 6:03 18 Pour aller plus loin dans la création de tables SAS ◆ 75 Ici, il n’est pas forcément efficace d’écrire une nouvelle table SAS qui présenterait les caractéristiques du fichier que vous souhaitez créer. L’instruction DATA _NULL_ vous permet de profiter de l’ensemble des outils de programmation de l’étape DATA sans créer pour autant une nouvelle table SAS. Vous devez indiquer par l’instruction FILE l’endroit physique sur votre disque dur où doit être placé votre fichier. L’instruction PUT liste les variables que vous souhaitez voir dans votre fichier. Comme vous pouvez le constater, la syntaxe présentée ici est très proche de la syntaxe utilisée lorsque vous transformez un fichier externe en table SAS via les instructions INFILE et INPUT. Dans le fichier que vous venez de créer, les modalités sont séparées par des espaces. Cependant, rien ne vous empêche d’utiliser certaines des options vues avec les commandes INFILE et INPUT pour donner à votre fichier TXT (ou CSV) l’allure souhaitée permettant une ouverture plus facile avec votre second logiciel. Vous ne pouvez cependant pas demander à ce que vos modalités soient séparées par des tabulations. Vous pouvez retirer les FORMAT qui sont associés à certaines de vos variables1 dans votre table originale au moyen de l’instruction FORMAT _ALL_. Ce ne sera cependant pas toujours une bonne idée. Ainsi, imaginons que X1 soit une date (et, donc, un nombre de jours qui sépare la date en question du 01/01/1960). Si vous exportez cette variable dans un fichier TXT sans FORMAT et qu’ensuite, dans Excel par exemple, vous appliquiez à votre modalité un FORMAT de date, vous aurez quelques surprises (parce que, pour Excel, une date est un nombre de jours, forcément positif, qui sépare la date en question du 01/01/1900). Il peut donc être utile de maintenir le FORMAT existant, voire d’imposer un FORMAT particulier pour être sûr que votre modalité sera correctement saisie par votre second logiciel. Par exemple, si votre date est présentée, dans SAS, au moyen d’un FORMAT MMDDYY10 (affichage des dates à « l’américaine ») que vous conservez ce FORMAT dans le fichier d’exportation, Excel ne comprendra pas qu’il s’agit là d’une date et considérera cette dernière comme une chaîne de caractères (et vous ne pourrez rien en faire). En revanche, si vous imposez un autre FORMAT (comme le DDMMYY10), votre modalité sera parfaitement interprétée comme une date dans Excel. Programme 2.54 DATA _NULL_; SET test; FILE 'C:\intro_SAS\fichiers\extrait.txt'; PUT x1 :ddmmyy10. x2-x10; RUN; Le « : » qui précède le nom du FORMAT à utiliser est important. Si vous l’omettez, SAS ne mettra pas de séparateur entre votre date et la variable X2. Ici, le « : » indique à SAS de prendre 10 caractères pour écrire la date selon ce FORMAT et d’ajouter ensuite le séparateur par défaut égal à l’espace. Si vos modalités ne contiennent pas d’espace, vous pourrez ensuite ouvrir votre fichier sous Excel en indiquant que votre fichier est de type « largeur fixe ». Si des espaces interviennent dans vos modalités, introduisez un séparateur de modalités particulier – votre type de fichier est alors un fichier « délimité ». Sur l’ecran suivant du module d’importation des données d’Excel, vous préciserez le séparateur de modalités que vous avez adopté. 1. Les FORMATS sont présentés en détail dans la section 5.3. SAS Livre Page 76 Jeudi, 18. septembre 2008 6:03 18 76 ◆ SAS La modification de FORMAT, voire une imposition d’un nouveau FORMAT, est obligatoire, si la table contient des données décimales, le séparateur décimal dans SAS étant le point et dans Excel, la virgule. Elle sera aussi obligatoire si vos variables mesurent des montants dans une quelconque monnaie ($1,000,000.00). Exercice 2.17 : Parmi les fichiers d’accompagnement de cet ouvrage, vous trouverez une table SAS appelée aexporter. Exportez-la de façon qu’Excel la comprenne parfaitement ! SAS Livre Page 77 Jeudi, 18. septembre 2008 6:03 18 Conclusion des chapitres 1 et 2 La procédure de création d’une table SAS à partir d’un fichier brut extérieur est une procédure délicate. En effet, il est absolument essentiel que votre table soit bien l’image exacte du fichier brut dont vous disposez. Une mauvaise spécification de votre ligne INPUT et un mauvais jeu d’options dans la commande INFILE vous conduiront immanquablement à créer des tables n’ayant qu’un rapport au mieux lointain avec votre fichier original. L’objet de cette conclusion est de vous donner quelques conseils vous permettant de vérifier que votre table est bien à l’image de votre fichier brut. Regardez et comprenez votre fichier brut Il est absolument impossible de créer une table SAS si on ne comprend pas la structure du fichier brut et l’organisation des données. Pour examiner votre table, vous pouvez utiliser un traitement de texte ou les commandes FSLIST et NOTEPAD. La commande FSLIST est à exécuter dans la fenêtre COMMANDE (en haut à droite). SAS vous invite alors à ouvrir un fichier – demandez à pouvoir ouvrir tous types de fichiers et retrouvez sur votre disque dur votre fichier brut. Vous pouvez alors demander, dans la fenêtre COMMANDE, COLS pour voir apparaître une réglette ou NUMBER pour voir apparaître des numéros de lignes. Vous pouvez ainsi avoir l’écran reproduit par le résultat C.1. Résultat C.1 La réglette vous sera particulièrement utile si vous voulez connaître les nombres de caractères à réserver aux différentes variables alphanumériques, dans le cas où vous auriez besoin de le préciser. La commande NOTEPAD permet le même type de résultat sauf que lorsque vous ordonnez NOTEPAD dans la fenêtre SAS Livre Page 78 Jeudi, 18. septembre 2008 6:03 18 78 ◆ SAS COMMANDE, une fenêtre vide apparaît. Pour ouvrir un fichier, cliquez alors du bouton droit dans la fenêtre, demandez Ouvrir, puis retrouvez votre fichier. Pour faire apparaître la réglette, demandez NUMBER dans la fenêtre COMMANDE, puis demandez, dans la fenêtre NOTEPAD, l’insertion de réglette à l’endroit où vous le souhaitez en tapant COLS, puis ENTER sur les numéros de lignes. Contrairement à FSLIST, NOTEPAD permet la modification des fichiers bruts. L’enregistrement de votre fichier modifié avec NOTEPAD est automatique lorsque vous quittez la fenêtre. Si vous utilisez la fonction rechercher-remplacer, les remplacements ne seront effectifs que lorsque vous quitterez la fenêtre. De plus, seuls les rechercher-remplacer de caractères sont possibles. Contrairement à des traitements de texte plus évolués, SAS ne semble pas donner la possibilité de remplacer, par exemple, une chaîne de caractères par une tabulation. Résultat C.2 Si votre fichier brut est de taille importante, ne tentez pas immédiatement de créer votre table sur le fichier complet : travaillez plutôt sur un échantillon d’environ 1 000 à 2 000 individus. Ensuite, écrivez dans votre ligne INPUT la liste des variables que vous allez créer, puis, une fois cette liste faite, réfléchissez aux INFORMAT que vous devez appliquer. Donnez ensuite les options nécessaires à INFILE pour que votre fichier soit bien compris. Vous pourrez alors soumettre votre programme. Lisez la fenêtre JOURNAL Les utilisateurs débutants oublient très souvent de consulter la fenêtre JOURNAL. Pourtant, c’est dans cette fenêtre que vous lirez les informations qui doivent vous aider à comprendre si votre programme s’est bien déroulé et si votre table a bien été construite. Imaginons un programme qui a effectivement créé une table SAS (sans erreur de syntaxe donc – l’erreur de syntaxe la plus courante est l’absence de point-virgule). La première chose à faire est de lire les longueurs d’enregistrement maximale et minimale. La longueur maximale doit être strictement inférieure à 256 caractères. Si cela n’est pas le cas, vous devez spécifier une longueur d’enregistrement LRECL différente de la valeur par défaut. Augmentez progressivement votre LRECL et exécutez votre programme jusqu’à l’observation d’une longueur maximale inférieure à votre LRECL SAS Livre Page 79 Jeudi, 18. septembre 2008 6:03 18 Conclusion des chapitres 1 et 2 ◆ 79 spécifié. Attention, si votre séparateur de modalités est la tabulation, vous ne pourrez pas compter sur la longueur maximale de l’enregistrement donnée par la fenêtre JOURNAL (voir section 2.2.1.). Regardez ensuite le nombre de lignes lues dans le fichier brut et le nombre d’observations dans la table SAS qui a été créée. Si votre fichier brut est de structure une ligne pour une observation, vous devez avoir une égalité entre ces deux nombres. S’il est de structure trois lignes pour une observation, le nombre d’observations multiplié par trois doit donner le nombre de lignes du fichier brut. Sauf si vous avez utilisé une option @@ (voir section 2.5.), votre nombre d’observations est forcément inférieur ou égal au nombre de lignes de votre fichier brut1. S’il n’y a pas égalité, plusieurs cas sont possibles et vous devez absolument savoir pourquoi il n’y a pas correspondance. • La différence est très faible. Il se peut que dans votre fichier brut, des lignes vides existent – c’est assez souvent le cas à la fin du fichier brut. Vérifiez à nouveau votre fichier brut. • Si ce n’est pas le cas, vous pouvez être certain que, pour créer une observation, il y a eu combinaison de modalités appartenant à plusieurs lignes – il s’agit d’une erreur grave. Ce dernier type d’erreur est généralement dû à de mauvais INFORMAT. La première chose à faire est d’activer l’option TRUNCOVER d’INFILE pour forcer la correspondance entre les lignes du fichier et le nombre d’observations de la table. Il y a cependant peu de chance pour que cette simple manœuvre suffise à régler votre problème. Il y a fort à parier qu’au moins un des INFORMAT que vous avez spécifiés n’est pas le bon. Vous devrez alors avoir recours à un PROC PRINT (si votre table comprend peu de variables et peu d’observation) ou à l’EXPLORATEUR. Les variables apparaissent en colonnes dans l’ordre de leur création. Un résultat étrange indique généralement une erreur sur un INFORMAT. Les erreurs les plus courantes sont : Dans le cas INFORMATw • Vous avez spécifié un nombre de caractères trop important pour lire les modalités de votre variable. SAS va donc lire des caractères de la modalité suivante. • Le nombre de caractères que vous avez spécifié n’est pas assez important. SAS arrête donc sa lecture au milieu de la modalité, puis considère la fin de la modalité comme modalité de la variable suivante. Si votre variable suivante est numérique, et si c’est une chaîne de caractères qui arrive pour la lecture de cette variable, vous aurez alors une valeur manquante. • Attention à la position de votre curseur ! Avec ce type d’INFORMAT, l’enregistrement cesse au bout du wième caractère et la variable suivante est enregistrée à partir du w + 1ième caractère (voir section 2.3.4.). Dans le cas :INFORMAT. • Si votre INFORMAT est alphanumérique, les modalités peuvent contenir des espaces (ou des séparateurs de modalités) – vous n’avez donc dans votre variables que le premier mot de votre modalité, les autres sont envoyés vers les variables suivantes. Si la variable suivante est une variable numérique, la chaîne de caractères ne sera pas acceptée et vous aurez des valeurs manquantes. 1. Cette affirmation n’est plus juste si, d’une façon générale, vous avez sur une ligne des informations relatives à plusieurs observations. SAS Livre Page 80 Jeudi, 18. septembre 2008 6:03 18 80 ◆ SAS • Attention, si le séparateur de modalités est la tabulation, l’enregistrement cesse aussi quand SAS rencontre un espace. Ce n’est pas le cas lorsque vous utilisez un séparateur de modalités défini par DLM (voir section 2.2.3.). Lorsque vous êtes à peu près sûr de vos INFORMAT, il est possible que vous lisiez dans votre fenêtre JOURNAL des informations du genre : NOTE: Données incorrectes pour y en ligne 5 3-3. RÈGLE : ----+----1----+----2----+----3----+----4----+----5----+----65 4 a 6 x=4 y=. z=6 _ERROR_=1 _N_=2 Le message issu de la fenêtre JOURNAL vous indique dans le cas présent que vous tentez d’entrer dans une variable définie comme numérique dans la commande INPUT des données non numériques. Il peut s’agir une nouvelle fois d’un mauvais INFORMAT. Il se peut aussi que vous ayez face à vous une modalité qui pour quelques observations, a été mal codée lors de la saisie et la construction de votre fichier brut (imaginez pour cela un code postal qui est écrit 75OOO – avec des O comme dans Ornicar plutôt que des zéros). Si vous ne faites rien, vous allez perdre une information puisque votre variable sera codée valeur manquante. Une solution consiste à forcer un enregistrement en alphanumérique pour ensuite, dans un second temps, reconstruire une variable numérique à partir de l’alphanumérique et commander des traitements particuliers dans le cas où la variable numérique est valeur manquante alors que l’alphanumérique ne l’est pas. Vous remarquez également la présence d’une règle : celle-ci est à utiliser en conjonction avec l’information présentée en NOTE. SAS vous indique qu’il rencontre un problème avec la donnée présentée ligne 5 de votre fenêtre JOURNAL entre les caractères 3 et 3 : la règle permet de voir que le « a » n’est pas accepté pour la variable Y, définie comme numérique dans la ligne INPUT. Enfin, _ERROR_ et _N_ sont des variables automatiques dont nous expliquons l’origine dans la section 3.1.4. Elles vous indiquent que SAS a rencontré une ou plusieurs erreurs (_ERROR_=1 si le nombre d’erreurs est supérieur à zéro) lors de l’exécution du programme pour l’observation n˚ 2 (_N_=2). Examinez votre table Il est donc important que vous ayez une fenêtre JOURNAL parfaitement propre. Voici les informations que vous devriez y trouver : NOTE: L’infile ‘C:\intro_SAS\fichiers\merg1.txt’ est : Nom de fichier=C:\intro_SAS\fichiers\merg1.txt, RECFM=V,LRECL=256 NOTE: 10 enregistrements lus dans infile ‘C:\intro_SAS\fichiers\merg1.txt’. La longueur min. de l’enregistrement était 18. La longueur max. de l’enregistrement était 20. NOTE: La table WORK.TEST a 10 observations et 5 variables. NOTE: L’étape DATA a utilisé (Durée totale du processus) : temps réel 0.00 secondes temps processeur 0.00 secondes SAS Livre Page 81 Jeudi, 18. septembre 2008 6:03 18 Conclusion des chapitres 1 et 2 ◆ 81 Toutefois, une telle fenêtre ne vous garantit pas que votre table sera à l’image exacte de votre fichier brut. Il convient de procéder à quelques vérifications. A priori, vous devez connaître pour chaque variable le type de modalités que vous devez rencontrer. Ordonnez alors : PROC FREQ; RUN; La commande est dangereuse parce qu’elle consiste à demander à SAS de construire un tableau de fréquences pour chacune des variables. Pour les variables de type identifiant individuel, vous allez donc avoir autant de lignes dans votre tableau que d’individus dans votre table. Vous pouvez limiter dans ce cas les variables à examiner en ne spécifiant que les variables pour lesquelles vous souhaitez un tableau de fréquences via la programmation suivante : PROC FREQ; TABLES x1 x2 x3; RUN; Vous devrez alors répondre à deux questions : • Les modalités observées pour cette variable sont-elles bien celles que vous attendiez ? • Est-il normal d’avoir autant de valeurs manquantes ? Il n’y a pas vraiment de « truc » que nous puissions vous donner1. Avec l’expérience, vous réussirez rapidement à répondre à ces deux questions. Les problèmes liés aux valeurs manquantes apparaîtront plus clairement lors des phases de modification des tables puisque, parmi les messages qui peuvent apparaître dans votre fenêtre JOURNAL, vous pouvez avoir : NOTE: Des valeurs manquantes ont été générées à la suite d’une opération sur des valeurs manquantes. Chaque endroit est défini par : (Nombre de fois) dans (Ligne):(Colonne). 100 dans 23:5 Il est très important de comprendre l’origine de vos valeurs manquantes puisque les nouvelles variables construites sur la base de votre variable de départ auront souvent des valeurs manquantes si votre variable de départ présente des valeurs manquantes. En outre, c’est grâce à cet examen que vous constaterez la grande distance entre votre table actuelle et la table qui vous est nécessaire pour produire vos premiers résultats. La table issue de l’étape de création est rarement prête à l’analyse : vous devrez la modifier, construire de nouvelles variables… 1. Il faut malgré tout citer le mode DEBUG qui est à réserver aux cas dans lesquels vous ne comprenez vraiment pas pourquoi la table créée n’est pas à l’image de votre fichier brut. Pour plus de renseignements, vous pouvez consulter l’aide SAS, entrée DEBUG option / DATA statement. Attention, ce mode n’a rien de simple. SAS Livre Page 82 Jeudi, 18. septembre 2008 6:03 18 SAS Livre Page 83 Jeudi, 18. septembre 2008 6:03 18 3 La modification des tables SAS Au sommaire de ce chapitre : 3.1. L’exécution par SAS de vos programmes 3.2. Les opérateurs et les fonctions usuelles de construction et de transformation de variables 3.3. Alléger une table SAS 3.4. La construction de nouvelles variables au sein d’une table SAS. 3.5. La construction sous conditions 3.6. Les boucles DO 3.7. Les boucles sur ARRAY 3.8. Donner une mémoire à SAS 3.9. Les listes de variables Vous disposez à ce stade d’une table, copie fidèle de vos données brutes stockées jusqu’à maintenant dans un fichier externe à SAS. Vous allez maintenant devoir modifier votre table parce que les variables telles que vous les souhaitez n’existent pas encore. Il est possible, dès la phase de création de la table SAS, de créer de nouvelles variables à partir des variables listées dans la commande INPUT ou de modifier celles-ci. Votre programme aura alors la structure suivante : DATA test; INPUT x1 x2 ...; ** vos commandes de modification / construction de variables interviennent ensuite; CARDS; vos données ;RUN; Nous vous conseillons, dans un premier temps, de ne pas mélanger les étapes DATA de création de table avec les étapes DATA de modification de table. Chacune de ces étapes présente des difficultés qui lui sont propres et les questions auxquelles vous devrez répondre à l’issue de chacune d’elles sont différentes. Si, au terme d’une étape DATA de création de table, vous devez vous demander si votre table est bien fidèle à vos données initiales, au terme de la phase de modification des tables SAS, vous devrez, entre autres, vous demander si le programme que vous avez soumis a bien construit ce que vous souhaitiez. SAS Livre Page 84 Jeudi, 18. septembre 2008 6:03 18 84 ◆ SAS 3.1 L’exécution par SAS de vos programmes Le point traité dans cette section est extrêmement important puisqu’il doit vous aider à comprendre pourquoi, dans certains cas, malgré l’apparente cohérence de votre programmation, SAS ne construit pas exactement la table que vous souhaitez. Il s’agit plus particulièrement de préciser ici comment SAS analyse et exécute les programmes que vous lui soumettez et de voir les conséquences sur votre programmation de ce fonctionnement. Bien qu’introductive à ce chapitre, cette section fait appel à des éléments de programmation que nous détaillerons plus loin dans l’ouvrage. Notre analyse portera sur le programme 3.2, qui modifie la table créée par le programme 3.1. Programme 3.1 DATA new; INPUT ind $ X1 X2 X3 $3.; CARDS; Albert 1 2 A René 1 3 A Gino 2 3 A Alberto 2 2 B Guido 1 3 B Renato 1 2 C ;RUN; Programme 3.2 DATA new2 (KEEP=X4 X5 X1 ind); SET new (RENAME=(X3=X4) DROP=X2); IF X4='A' THEN X5='groupe Z A'; ELSE IF X4='B' THEN X5='groupe Z B'; ELSE X5='groupe non défini'; X1=X1*10; RUN; Avant tout traitement des données, SAS analyse le programme afin de vérifier s’il ne contient pas d’erreur de syntaxe. Il est ensuite recodé en langage machine. Il n’y a pour l’instant aucune modification de votre table. Si votre programme ne présente pas d’erreur, son exécution peut commencer. SAS va ensuite analyser votre programme pour créer deux (voire trois) zones logiques : une première zone va rassembler l’ensemble des informations générales sur votre table (date de création, heure de création, nom de la table, version de SAS utilisée) et les variables qu’elle contient (nombre, type, longueur de l’enregistrement, etc.). Parallèlement, une seconde zone logique appelée PROGRAM DATA VECTOR (PDV) va être créée. C’est dans cette zone que vont transiter vos données, en provenance de la table précisée par l’instruction SET. Si la table est créée à partir d’un fichier brut externe, les données seront versées dans un premier temps dans une autre zone logique appelée INPUT BUFFER avant de passer dans le PDV. Nous nous concentrerons uniquement dans cet ouvrage au cas d’une modification de table déjà existante. SAS Livre Page 85 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 85 3.1.1 Les informations descriptives de la table Outre des informations générales sur la table (son nom, sa date et son heure de création, la version de SAS utilisée pour sa création, etc.), vous trouverez des informations sur les variables qu’elle contient1. Ces dernières informations sont importantes puisqu’elles structurent le PDV dans lequel les données vont transiter avant d’être envoyées vers la table de sortie. Le programme 3.2, interprété par SAS, offre un descriptif complet des variables qui, in fine, seront dans la table NEW2. Ce descriptif comprend le nom des variables, leur type, leur longueur et leur position dans l’enregistrement. Dans la table NEW créée par le programme 3.1, la position des variables dans l’enregistrement est donnée par leur ordre dans l’instruction INPUT. La longueur totale de l’enregistrement d’une observation est égale, dans la table NEW, à 32 octets (4 variables * 8 octets) et non pas à 3 variables * 8 octets + 3 = 27 octets. Les cinq octets de différence ne sont pas utilisés mais sont « mis en réserve ». Dans le programme 3.2, nous créons une variable alphanumérique de longueur 10, la longueur totale de l’enregistrement n’augmentera que de huit puisque deux octets parmi les cinq mis en réserve seront alors utilisés. Nous pouvons donc comprendre l’enregistrement d’une observation, dans la table NEW, comme une suite de 32 octets : les huits premiers sont réservés à l’enregistrement de la variable IND, les huit suivants, à l’enregistrement de X1, les huit suivants pour X2, les deux suivants pour X3 et cinq octets restent vides. Le PDV va ensuite se structurer de la manière suivante : • Suite à l’instruction DATA mais aussi à la lecture complète du programme, SAS sait qu’il n’y aura que les variables X4, X5, X1 et IND dans la table NEW2, puisqu’aucune autre variable n’est citée dans le programme et que la variable X2 n’est pas reprise de la table NEW2. Les informations offertes par la seule instruction DATA ne structurent aucunement le PDV. Elles ne seront utilisées que lors de la phase de création de la table. • L’instruction SET est importante dans la structuration du PDV3. Puisque la table NEW2 est créée à partir de la table NEW, SAS peut alors reprendre certaines informations contenues dans la table NEW : – La variable IND alphanumérique est conservée avec sa position dans l’enregistrement. Première variable citée après l’instruction INPUT, IND, variable alphanumérique dans NEW, est conservée dans NEW2 : elle est alphanumérique et placée en première position. – X1, variable numérique dans NEW, est conservée dans NEW2 : elle est numérique et conserve sa seconde position. – La commande RENAME indique à SAS que la variable X4 est alphanumérique puisque, dans la table NEW, X3 était alphanumérique. X4 est placé en troisième position puisque c’était la position de X3. – Il reste à connaître le type de la variable X5 qui sera placée en quatrième position. SAS saura dès la troisième ligne que X5 est alphanumérique lorsqu’une quote suit le signe égale. X5 est placée en quatrième position dans l’enregistrement. 1. Ces informations peuvent être consultées au moyen de PROC CONTENTS (voir section 5.1.). 2. S’il n’y avait pas eu l’instruction DROP=X2 dans l’instruction SET, la variable X2 aurait eu une place réservée dans de PDV même si, in fine, elle n’aurait pas fait partie de la table NEW2. 3. En cas de création de table à partir d’un fichier brut, c’est l’instruction INPUT qui est importante. SAS Livre Page 86 Jeudi, 18. septembre 2008 6:03 18 86 ◆ SAS La troisième information importante qui structurera le PVD est la longueur de l’enregistrement de chacune des variables. Pour une variable numérique, ceci ne pose pas de réel problème : si la variable est numérique, sa modalité est codée sur 8 octets. Il existe au sein de l’étape DATA des instructions (LENGTH par exemple) qui permettent de modifier le nombre d’octets utilisés pour coder les modalités numériques. Vous pouvez, sur les variables numériques uniquement, augmenter ou diminuer cette longueur sans aucun problème au cours d’une même étape DATA1. 3.1.2 La longueur de l’enregistrement des variables alphanumériques En ce qui concerne les variables alphanumériques, la longueur mesure aussi le nombre d’octets à réserver pour l’enregistrement de la modalité. Attention cependant, il s’agit ici d’enregistrer des caractères (et non plus des nombres) sous la forme d’une suite de 0/1 : pour enregistrer un caractère (128 ou 256 possibilités selon votre système), il faut un octet. La longueur définit donc aussi le nombre maximal de caractères que vous pourrez enregistrer2. Dans notre exemple, les variables IND et X4 sont reprises de la table NEW : leurs longueurs d’enregistrement seront donc reprises (soit 8 caractères, la longueur par défaut des variables alphanumériques pour IND, et 3 caractères pour X4, anciennement X3 dans NEW). En ce qui concerne X5, c’est par l’analyse du programme que SAS va déterminer sa longueur d’enregistrement. C’est au moment où X5 est cité pour la première fois que SAS va déterminer la longueur de son enregistrement en regardant le nombre de caractères pris par la première modalité citée. Ici, la première modalité rencontrée est ‘groupe Z A’, soit 10 caractères. Si la première modalité avait utilisé 2 caractères, la longueur réservée dans la table aurait aussi été de 2. Les variables alphanumériques ont une longueur par défaut de 8 caractères uniquement si, dans une phase de création de la table, vous n’indiquez dans votre commande INPUT que l’INFORMAT $. sans spécifier de longueur. En ce qui concerne les variables alphanumériques, il est très important de comprendre les conséquences de ce fonctionnement. À la cinquième ligne du programme, vous observez pour la variable X5 une nouvelle modalité de 17 caractères. SAS a déjà réservé 10 caractères pour cette variable alphanumérique et une fois que cette longueur est fixée, il n’est plus possible de la modifier3 : les individus pour lesquels va s’appliquer cette ligne de programme auront pour modalité de X5 uniquement les 10 premiers caractères de ‘groupe non défini’, soit ‘groupe non’. Si vous souhaitez que SAS puisse enregistrer un nombre de caractères différent de celui donné par la première modalité, il faut que vous le lui indiquiez avant que cette première modalité n’apparaisse et, par conséquent, le plus tôt possible dans le programme. 1. Nous verrons dans la section 5.4. qu’il peut être utile de diminuer le nombre d’octets utilisés pour coder une variable numérique. 2. Ainsi, sur 8 octets, si votre variable est alphanumérique, vous pouvez enregistrer n’importe quelle suite de 8 caractères alors que si votre variable est numérique, vous pouvez (sous Windows) enregistrer n’importe quel entier jusqu’à 9 007 199 254 740 992. 3. Que ce soit à la hausse ou à la baisse. SAS Livre Page 87 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 87 Dans le cas présent, il faut que vous introduisiez après la commande SET l’instruction suivante : LENGTH x5 $ 17; Exercice 3.1 : Dans une table TEST, vous avez une variable X alphanumérique de longueur 10. Le programme suivant est exécuté : DATA test2; LENGTH x $ 5.; SET test; x='123456789012345'; RUN; Quelle est la longueur de X dans la table TEST2 ? 3.1.3 L’impossibilité de modifier le type de la variable Examinons ce programme : Programme 3.3 DATA test; x=1; z=1; y='A'; RUN; DATA test; SET test; IF x=1 THEN x='A'; IF z=1 THEN z='2'; IF y='A' THEN y=1; w=y+10; v=z||z; u=y; u=u+10; RUN; À l’issue du programme, nous obtenons : Variable Modalité Type de la variable Longueur X Z Y W V 2 U . 2 1 11 num num alpha num alpha 2 alpha * 8 8 1 8 24 1 X, au début de l’étape DATA/SET, est une variable numérique. Le programme tente de lui donner une modalité alphanumérique. A la sortie du programme, X est toujours une variable numérique et sa modalité est valeur manquante parce que ‘A’ n’est pas compris par SAS. Il vous l’indique d’ailleurs puisque vous pouvez lire dans votre JOURNAL : NOTE: Données numériques incorrectes, ‘A’ , dans ligne 70 colonne 15. SAS Livre Page 88 Jeudi, 18. septembre 2008 6:03 18 88 ◆ SAS La variable Z reste elle aussi numérique mais la chaîne de caractères ‘2’ est interprétée par SAS pour devenir une donnée numérique. Y, au début du programme, est une variable alphanumérique. Nous tentons de lui donner une valeur numérique, acceptée dans une certaine mesure puisque la modalité de Y est bien ‘1’ au sortir du programme. La variable W est la somme d’une variable alphanumérique (de modalité 1) et de 10. Dans de tels cas, bien que vous ajoutiez une variable alphanumérique et un nombre, SAS tentera de convertir la donnée alphanumérique en une donnée numérique pour effectuer le calcul demandé. Ceci explique pourquoi W est une variable numérique de modalité 11. Pour déterminer V, une fonction de concaténation « ! ! » est utilisée. Comme on ne concatène que des caractères, V est alphanumérique. SAS va ensuite transformer la modalité numérique de Z en une alphanumérique et concaténera bien la chaîne de caractères « 2 » avec une seconde chaîne « 2 ». Lorsqu’elle est transformée en alphanumérique, la longueur d’une variable numérique est alors égale à 12. V aura une longueur totale de 24 caractères. Il nous reste à comprendre l’étrange modalité prise par U : sa construction est proche de celle de W et on aurait dû observer une modalité de 11 sauf que la variable U a repris les caractéristiques de Y (instruction U=Y) et donc sa longueur : on ne peut écrire ‘11’ sur un seul caractère (octet). SAS remplace donc ce ‘11’ par ‘*’. Pour résumer : • Au cours d’une étape DATA, une variable X numérique ne peut pas devenir, avec le même nom, alphanumérique. • Au cours d’une étape DATA, une variable Y alphanumérique ne peut pas devenir, avec le même nom, numérique. • Une variable numérique peut être utilisée comme alphanumérique pour la construction d’une nouvelle variable alphanumérique. • Une valeur numérique saisie par une variable alphanumérique peut être utilisée pour créer une nouvelle variable numérique. • Dans le cas d’une commande U=Y, l’égalité porte en fait sur l’ensemble des caractéristiques de la variable : ses modalités par observation mais aussi son type et sa longueur d’enregistrement. • Si pour créer une variable, vous utilisez une fonction propre aux variables alphanumériques (numériques), la variable créée sera alphanumérique (numérique). La fenêtre JOURNAL vous signale les utilisations de modalités alphanumériques comme des modalités numériques et vice versa au moyen des messages suivants : NOTE: Valeurs alphanumériques converties en numériques valeurs aux endroits donnés par : (Ligne):(Colonne). NOTE: Valeurs numériques converties en alphanumériques valeurs aux endroits donnés par : (Ligne):(Colonne). 3.1.4 L’exécution du programme Nous reprenons maintenant notre analyse du programme 3.2. Les informations relatives aux variables (nom, type, longueur, ordre dans l’enregistrement) sont complètes, le PDV est constitué et SAS va pouvoir traiter les observations. SAS Livre Page 89 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 89 IND $ 8 1 X1 num 8 2 X4 $ 3 3 X5 $ 10 4 Nom de la variable Type Longueur Ordre PDV Bloc descriptif Là aussi, il est très important de comprendre la manière dont SAS traite les données. SAS va prendre les observations une par une pour leur appliquer le programme. SAS va en fait exécuter votre programme un nombre de fois égal à votre nombre d’observations. Au moment où SAS aborde la première observation, les champs réservés dans le PDV aux différentes variables sont mis en valeurs manquantes. Figure 3.1 • Le PDV – étape 1. PDV Bloc descriptif Puisque la table NEW2 est construite à partir de NEW, SAS va reprendre certaines informations de la première observation pour commencer à remplir le PVD. IND $ 8 1 Albert X1 num 8 2 1 X4 $ 3 3 X5 $ 10 4 Nom de la variable Type Longueur Ordre A Figure 3.2 • Le PDV – étape 2. PDV Bloc descriptif La suite du programme permet de donner une valeur à X5, puis de modifier la valeur prise par X1 pour l’individu 1 : IND $ 8 1 Albert X1 num 8 2 10 X4 $ 3 3 A X5 $ 10 4 Nom de la variable Type Longueur Ordre Groupe Z A Figure 3.3 • Le PDV – étape 3. Même si une modalité est déjà présente dans le PVD, vous avez donc toujours la possibilité de la modifier au cours du programme. Ceci est valable quelle que soit la nature de la variable. Lorsque, pour la première observation, le programme est exécuté entièrement, au moment où SAS lit le RUN qui clôt le programme, SAS verse le contenu du PDV dans la table créée par l’instruction DATA (il « OUTPUT »), il SAS Livre Page 90 Jeudi, 18. septembre 2008 6:03 18 90 ◆ SAS réinitialise le PDV (il « RESET ») et il remonte en haut du programme pour traiter la seconde observation (il « RETURN »). Il existe dans chaque table un marqueur de fin de table1. Lorsque SAS rencontre ce marqueur, il terminera l’exécution du programme par la fermeture de la table créée par l’instruction DATA. Au cours de cette phase d’exécution, SAS crée deux variables automatiques _N_ et _ERROR_. _N_ augmente de 1 à chaque exécution du programme : il correspondra donc au numéro de l’observation. Cette variable automatique peut être utilisée par vos programmes si vous souhaitez traiter une observation dont vous connaissez le rang2. La variable _ERROR_ prend la valeur 0 si le programme est exécuté correctement, 1 si SAS a rencontré un problème. Ce sont ces mêmes variables qui s’affichent dans votre fenêtre JOURNAL lorsque votre programme rencontre un problème. NOTE: Données incorrectes pour y en ligne 5 3-3. RÈGLE : ----+----1----+----2----+----3----+----4----+----5----+----65 4 a 6 x=4 y=. z=6 _ERROR_=1 _N_=2 Ce message repris de la fenêtre JOURNAL indique que, pour la deuxième observation, SAS a rencontré une difficulté dans l’exécution de votre programme. 3.1.5 Les conséquences du RESET Lorsque SAS termine le traitement d’une observation, il remet en valeurs manquantes l’ensemble des zones du PDV avant de traiter l’observation suivante. Des fonctions comme LAG permettent de « regarder en arrière »3. Nous traiterons plus particulièrement de la fonction LAG et de ses limites dans la section 3.8.3. mais retenez pour l’instant qu’une instruction de type : y=LAG(x); indique en fait à SAS de ne pas vider entièrement le PDV et de conserver dans le PDV, d’une observation à l’autre, les modalités de X. SAS ne peut pas revenir sur une précédente observation mais il peut en conserver la trace dans son PDV. 3.1.6 OUTPUT Parmi les trois tâches qu’effectue SAS lorsqu’il a terminé d’exécuter l’ensemble des commandes du programme (lorsqu’il arrive au RUN), nous avons vu qu’il verse le contenu du PDV vers la table finale. Il est possible de demander à SAS de verser le PDV dans la table finale avant que le programme ne soit terminé. 1. Vous avez la possibilité de matérialiser ce marqueur en utilisant une option END= dans l’instruction SET. DATA test2; SET test END=fdt; IF fdt THEN …; RUN; Cette matérialisation peut vous permettre un ensemble de traitements à n’effectuer que sur la dernière observation. Voir par exemple le programme 3.30. 2. _N_ est utilisé dans le programme 7.35 et, surtout, dans le chapitre 9 consacré au langage macro. 3. Mais il est absolument impossible, avec le langage de l’étape DATA, de regarder « en avant ». SAS Livre Page 91 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 91 Imaginons le cas suivant : vous souhaitez placer une somme de 1 000 euros au taux de 5 % et savoir combien vous aurez au bout d’un an, de deux ans, de trois ans et de quatre ans : Programme 3.4 DATA capital; capital=1000; annee=0; OUTPUT; annee=1; capital=capital*1.05; OUTPUT; annee=2; capital=capital*1.05; OUTPUT; annee=3; capital=capital*1.05; OUTPUT; annee=4; capital=capital*1.05; RUN; PROC PRINT; RUN; Et vous obtenez : Résultat 3.1 Obs capital annee 1 2 3 4 1000.00 1050.00 1102.50 1157.63 0 1 2 3 En spécifiant OUTPUT, vous remarquez que le PDV n’est pas remis à zéro (puisque les modalités continuent à être calculées) et qu’il n’y a pas de RETURN (puisque dans le cas de cette table à une observation, un RETURN signifierait la fermeture de la table et donc l’arrêt des calculs). Dans le cas présent, pour ANNEE=4, les données sont aussi calculées mais elles ne sont pas versées dans la table finale. Si dans votre programme est présente une instruction OUTPUT, la capacité de RUN à verser le PDV dans la table finale lui est retirée. Programme 3.5 DATA capital; DO annee=0 TO 3; capital=1000*(1.05)**annee; OUTPUT; END; annee=4; capital=1000*(1.05)**annee; RUN; SAS Livre Page 92 Jeudi, 18. septembre 2008 6:03 18 92 ◆ SAS Ce programme est équivalent au programme 3.4 mais fait appel à des outils de programmation non vus pour l’instant. Si vous éditez la table créée par ce programme, vous constaterez quatre observations mais pas de donnée relative à la quatrième année. Pour que la donnée relative à la quatrième année apparaisse, vous devez indiquer l’instruction OUTPUT juste avant le RUN. Ce type de programmation permet des modifications intéressantes des dimensions de vos tables. Sans instruction OUTPUT, si votre table de départ possède n lignes, vous pouvez être certain que votre table finale ne pourra pas contenir strictement plus de n lignes. Imaginons maintenant que votre table ait la structure reproduite par le programme 3.6. Programme 3.6 DATA test; INPUT nom $ annee1 annee2 annee3 annee4 annee5; CARDS; Albert 1 2 3 4 5 Robert 6 7 8 9 10 ;RUN; PROC PRINT; RUN; Nous souhaitons en fait obtenir une table possédant trois variables : une variable NOM, une variable ANNEE et une variable X reprenant en colonnes les informations qui sont présentées ici en lignes. Cette modification de dimension de la table ne peut être obtenue, au sein d’une étape DATA, qu’au moyen d’instructions OUTPUT dans votre programme : Programme 3.7 DATA test2; SET test; annee=1; x=annee1; OUTPUT; annee=2; x=annee2; OUTPUT; annee=3; x=annee3; OUTPUT; annee=4; x=annee4; OUTPUT; annee=5; x=annee5; OUTPUT; KEEP nom annee x; RUN; SAS Livre Page 93 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 93 Et vous obtiendrez : Résultat 3.2 Obs 1 2 3 4 5 6 7 8 9 10 nom annee Albert Albert Albert Albert Albert Robert Robert Robert Robert Robert 1 2 3 4 5 1 2 3 4 5 x 1 2 3 4 5 6 7 8 9 10 3.1.7 RETURN Lorsque SAS rencontre le RUN et qu’il est en phase de construction de la table, il retourne en haut du programme pour traiter l’observation suivante si elle existe. Au cours de votre programme, vous avez moyen de lui indiquer, avant que celui-ci ne soit entièrement examiné, de passer à l’observation suivante. Programme 3.8 DATA test; INPUT X @@; CARDS; 1 2 3 4 5 6 ;RUN; DATA test; SET test; Y=x*10; IF x>3 THEN DO; Z=x*100; RETURN; END; w=x*1000; RUN; Pour obtenir : Résultat 3.3 Obs X Y 1 2 3 4 5 6 1 2 3 4 5 6 10 20 30 40 50 60 Z . . . 400 500 600 w 1000 2000 3000 . . . Sans instruction RETURN, W serait construit pour l’ensemble des observations de la table. Ici, lorsque X n’est pas strictement supérieur à 3, les instructions qui suivent DO ne sont pas appliquées et, par conséquent, W sera calculé. Dans le cas où X est strictement supérieur à 3, W n’est pas construit parce que, parmi les instructions que SAS rencontre, il observe un RETURN qui signifie : « Tu as terminé d’appliquer le programme pour l’observation courante, tu peux verser le PDV dans la table, retourner en haut du programme et passer à l’observation suivante. » SAS Livre Page 94 Jeudi, 18. septembre 2008 6:03 18 94 ◆ SAS Cette instruction sera particulièrement utile dans le cas de programmes très longs sur des bases importantes pour économiser du temps de calcul par exemple. Maintenant que nous avons compris les bases du fonctionnement interne du logiciel SAS dans les étapes de modification des tables, nous pouvons examiner les outils qui permettent de modifier et d’enrichir les tables. 3.2 Les opérateurs et les fonctions usuelles de construction et de transformation de variables SAS fournit des opérateurs et des fonctions pour construire et transformer les variables. Seuls les plus usuels vous seront présentés ici. Pour une liste complète des fonctions possibles, vous pouvez consulter l’aide SAS1. 3.2.1 Les opérateurs2 Ils sont ici énumérés par priorité décroissante : Priorité 1 Puissance Changement de signe Minimum des opérandes Maximum des opérandes Non Priorité 2 Multiplication Division Priorité 3 Addition Soustraction Priorité 4 Concaténation Priorité 5 Égal Différent de Inférieur Inférieur ou égal Supérieur Supérieur ou égal Appartient à ** +, – >< <> not ou ^ ou ~ * / + – || ou ! ! (sur variables alphanumériques : AB||CD = ABCD2 = NE ou ^= ou ~= < ou LT <= ou LE > ou GT >= ou GE IN Exemple : X IN (v1, v2, v3, …,vn) [parenthèses obligatoires] Depuis SAS 9, vous pouvez aussi utiliser IN de la manière suivante : X IN (v1, v2:v3, v4, v5:v6) 1. Dans l’aide SAS, onglet Sommaire : SAS PRODUCTS / BASE SAS / SAS LANGAGE DICTIONNARY/ DICTIONNARY OF LANGAGE ELEMENTS / FUNCTIONS AND CALL ROUTINES. 2. La concaténation sera examinée plus en détail dans la section 3.2.7. SAS Livre Page 95 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 95 Note : les opérateurs de comparaison peuvent être combinés sans faire appel à des opérateurs booléens. Exemple : IF x>10 AND x<15 THEN …; est équivalent à IF 10<x<15 THEN…; IF x<10 OR x>15 THEN …; est équivalent à IF 10>x>15 THEN… ; IMPORTANT : Les valeurs manquantes sont inférieures à TOUT. Ainsi, pour : IF x<4 THEN ok=1; OK=1 si x est valeur manquante. Priorité 6 Et AND ou & Priorité 7 Ou OR ou / ou | 3.2.2 Les fonctions numériques usuelles Ces fonctions interviendront, sauf mention contraire, dans vos programmes de la manière suivante : FCT(A) ou A est soit une constante numérique, une variable ou une combinaison de variables. ABS Valeur absolue. EXP Exponentielle. INT Partie entière. FLOOR Plus grand entier supérieur ou égal à l’argument. CEIL Plus petit entier inférieur ou égal à l’argument. LOG Logarithme népérien. LOG10 Logarithme décimal. SAS Livre Page 96 Jeudi, 18. septembre 2008 6:03 18 96 ◆ SAS MOD Modulo. MOD (A,B) donne le reste de la division de A par B. ROUND Arrondi à l’entier le plus proche. Attention, si vous souhaitez un arrondi à quatre chiffres après la virgule, vous devrez utiliser la programmation suivante : X=ROUND(Y,0.0001). SIGN Signe de l’argument. Renvoie –1 si < 0, 1 si > 0. SQRT Racine carrée. 3.2.3 Les fonctions statistiques Ces fonctions s’appliquent sur plusieurs variables. Vous pouvez déclarer les variables à analyser de deux manières : • FCT(OF X1-X12) pour analyser les variables X1, X2, … X12. • FCT(X1,X2,X3) pour analyser les variables X1, X2 et X3. MAX Maximum. MIN Minimum des valeurs non manquantes. N Nombre de valeurs non manquantes. NMISS Nombre de valeurs manquantes. MEAN Moyenne des valeurs non manquantes. STD Écart-type des valeurs non manquantes. SUM Somme des valeurs non manquantes. VAR Variance des valeurs non manquantes. Ces fonctions sont des fonctions « lignes » et non « colonnes » : elles ne vous permettront pas d’obtenir la valeur maximale prise par une variable sur une population considérée. Soit la table suivante : Obs 1 2 3 X1 X2 X3 X4 4 7 9 5 5 4 6 6 3 7 8 11 SAS Livre Page 97 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 97 Avec la fonction MAX, vous pouvez construire une nouvelle variable au moyen de la ligne suivante au sein d’une étape DATA : test=MAX(x1, x2, x3, x4); ou encore : test=MAX(of x1-x4); TEST, nouvelle variable, prendra les valeurs 7 (observation n˚ 1), 8 (observation n˚ 2) et 11 (observation n˚ 3). 3.2.4 Les fonctions particulières aux séries temporelles DIFn Différence. Exemple : DIF2(Z) vous donnera Zt – Zt–2. LAGn Retard. Exemple : LAG5(Zt) vous donnera Zt–5. Si n n’est pas spécifié, il est égal à 1. Les particularités de ces fonctions seront évoquées plus en détail dans la section 3.8.3. 3.2.5 Les générateurs de nombres aléatoires La commande est de la forme RANloi(S) où S est un entier qui sert à contrôler l’initialisation du générateur de base : • Si s <= 0 : initialisation par l’horloge. La séquence n’est pas reproductible. • Si s > 0 : s est le premier point de la congruence. La séquence est reproductible. Les générateurs : RANUNI Loi uniforme sur [0 ; 1]. Autre nom de cette fonction : UNIFORME. RANNOR Loi normale N(0,1). Autre nom de cette fonction : NORMAL. RANBIN Loi binomiale (ajouter après le S les paramètres N et P de votre binomiale). RANCAU Loi de Cauchy. RANEXP Loi exponentielle. RANGAM Loi gamma (ajouter après le S, après une virgule, le paramètre de votre gamma). RANPOI Loi Poisson (ajouter après le S, après une virgule, le paramètre de votre poisson). SAS Livre Page 98 Jeudi, 18. septembre 2008 6:03 18 98 ◆ SAS 3.2.6 Les fonctions sur les chaînes de caractères SAS 9.0 a été l’occasion de l’introduction de 53 nouvelles fonctions sur chaîne de caractères1. Le lecteur intéressé par une présentation complète de ces nouvelles fonctions pourra consulter le lien suivant : support.sas.com/documentation/whatsnew/91x/lrdictwhatsnew900.htm mais aussi un document pdf très intéressant rédigé par Tim Muir : www.hasug.org/newsletters/hasug200511/Muir_Character_Function_Fun.pdf Avec SAS 9.2, ce sont huit nouvelles fonctions qui ont été ajoutées (CATQ, CHAR, COUNTW, FINDW, FIRST, TRANSTRN, WHICHC et WHICHN). Il est possible que les utilisateurs de SAS 8.2 ne disposent pas de l’ensemble des fonctions qui vont être présentées ici2. L’argument de ces fonctions peut être une variable alphanumérique ou une chaîne de caractères saisie entre quotes (simples ou doubles). Pour bien comprendre l’utilité de certaines de ces fonctions, vous devez avoir à l’esprit que les variables alphanumériques sont alignées à gauche par défaut (c’est nécessaire pour trier les chaînes de caractères dans l’ordre alphabétique). RIGHT(X) Alignement à droite. LEFT(X) Alignement à gauche. LENGTH(X) Longueur de la chaîne X. TRIM(X) Supprimer les blancs à droite. STRIP(X) Alignement à gauche, puis suppression des blancs à droite. UPCASE(X) Convertir en majuscules. LOWCASE(X) Convertir en minuscules. 1. Ces nouvelles fonctions sont : ANYALNUM, ANYALPHA, ANYCNTRL, ANYDIGIT, ANYFIRST, ANYGRAPH, ANYLOWER, ANYNAME, ANYPRINT, ANYPUNCT, ANYSPACE, ANYUPPER, ANYXDIGIT, CAT, CATS, CATT, CATX, CHOOSEC, CHOOSEN, COMPARE, COMPGED, COMPLEV, COUNT, COUNTC, FIND, FINDC, IFC, IFN, LENGTHC, LENGTHM, LENGTHN, NLITERAL, NOTALNUM, NOTALPHA, NOTCNTRL, NOTDIGIT, NOTFIRST, NOTGRAPH, NOTLOWER, NOTNAME, NOTPRINT, NOTPUNCT, NOTSPACE, NOTUPPER, NOTXDIGIT, NVALID, PROPCASE, PRXCHANGE, PRXPOSN, SCANQ, STRIP, SUBPAD, SUBSTRN. 2. Parmi les fonctions qui sont citées dans cette section, certaines ne sont présentes dans SAS que depuis la version 9.1 : il s’agit de CAT, CATS, CATT, CATX, PROPCASE et COUNT. La fonction STRIP a été introduite dans SAS 9.0. SAS Livre Page 99 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 99 PROPCASE(X) La première lettre de chaque mot de la chaîne de caractères est convertie en majuscule, les lettres suivantes sont converties en minuscules. PROPCASE(‘seBASTien rinGUEDé’) donne ‘Sébastien Ringuedé’. COMPBL(X) Comprimer plusieurs blancs consécutifs en un seul blanc. SUBSTR(X,d <,n>)1 Il existe deux utilisations possibles de cette fonction. Première utilisation : extraire de la chaîne X une sous-chaîne de longueur n en commençant au dème caractère. Exemple : soit une variable X qui prend la valeur ‘abcdef ’ SUBSTR (X,5,2) vous donnera ‘ef ’. Seconde utilisation : cette fonction permet de placer au sein d’une chaîne de caractères une nouvelle chaîne de caractères à un emplacement donné. Le programme 3.9 présente les deux utilisations possibles de la fonction SUBSTR. Programme 3.9 DATA test; X='aaa123'; y=SUBSTR(X,1,3); SUBSTR(X,1,3)='bbb'; RUN; Vous retrouverez dans la variable Y, la chaîne de caractères ‘aaa’ et, à l’issue du programme, dans X, la chaîne de caractères ‘bbb123’. L’instruction SUBSTR(X,1,3)=‘bbb’ demande donc à SAS de remplacer les trois premiers caractères par la chaîne ‘bbb’. Si votre instruction est de la forme SUBSTR(X,1,4)=‘bbb’, X devient ‘bbb 23’. SCAN(X,n <,délimiteur>) Cette fonction explore la chaîne de caractères X et donne le nème élément, les éléments étant séparés par le délimiteur que vous pouvez spécifier (ce n’est pas obligatoire) entre quotes. Le programme 3.10 illustre les possibilités de la fonction SCAN. Programme 3.10 DATA test; X1=SCAN("j’utilise la fonction scan",3); X2=SCAN('23 24,25 26,27 28,29',3); X3=SCAN('23 24,25 26,27 28,29',3,','); X4=SCAN('23 24,25 26,27 28,29',3,' ,'); X5=SCAN('23 24,25 26,27 28,29',-3); RUN; 1. Pour certaines fonctions SAS, vous devrez spécifier plusieurs arguments. Les arguments facultatifs seront toujours encadrés par les signes <> : <,argument facultatif>. Si vous définissez l’argument facultatif (ou les arguments facultatifs), il devra être séparé du précédent au moyen d’une virgule. SAS Livre Page 100 Jeudi, 18. septembre 2008 6:03 18 100 ◆ SAS Si vous ne spécifiez pas de délimiteur, SAS ne considérera que les signes suivants comme délimiteurs : Blanc . < ( + | & ! $ * ) ; ^ – / , % X1 sera donc égal à « fonction » et X2 sera égal à 25. Lorsque vous spécifiez un délimiteur, seul celui-ci sera considéré pour saisir le nième mot que vous recherchez. Ainsi, X3 sera égal à ‘27 28’. Pour X4, deux délimiteurs entre les quotes ont été spécifiés : l’espace (blanc) et la virgule. X4 est donc égal à 25. Si le chiffre indiqué après la chaîne de caractères est positif, SCAN analyse la chaîne de caractères en partant de la gauche ; s’il est négatif, la chaîne est examinée à partir de la droite. Ainsi, X5 est égal à 27. Lorsque la fonction SCAN est utilisée, les variables qui sont construites ont par défaut une longueur égale à 200 caractères. Il est possible de limiter le nombre de caractères à réserver aux variables qui vont être construites par la commande SCAN au moyen d’une instruction LENGTH. Celle-ci doit intervenir en haut du programme et peut prendre la forme suivante : LENGTH x1-x5 $ 8; FIND (chaîne, chaîne recherchée <,modifieur>) Renvoie la position dans la chaîne de caractères de la chaîne de caractères recherchée. La fonction INDEX ressemble à la fonction FIND mais elle présente moins de possibilités. Programme 3.11 DATA test; chaine='abc abc DEF ghiabc abc'; x1=FIND(chaine,'abc'); x2=FIND(chaine,'def'); x3=FIND(chaine,'def','i'); x4=FIND(chaine,'ghi'); x5=FIND(chaine,'abc',8); x6=FIND(chaine,'abc abc '); x7=FIND(chaine,'abc abc ','t'); RUN; Pour X1, on recherche la position de la première chaîne de caractère ‘abc’ dans la modalité de la variable CHAINE. Vous obtiendrez 1. La chaîne ‘def ’ n’est pas présente dans la modalité de CHAINE. Pour que la recherche ne soit pas sensible à la casse, vous pouvez introduire le modifieur ‘i’. X3 est alors égal à 10 (il apparaît deux blancs entre les deux premiers ‘abc’). La chaîne ‘ghi’ est bien détectée et débute en 14e position (la fonction FIND ne recherche donc pas un mot, encadré par des délimiteurs, mais bien une chaîne de caractères). Pour X5, nous demandons de ne rechercher la chaîne ‘abc’ qu’à partir du 8e caractère. X5 est par conséquent égal à 17. X6 est égal à zéro parce que la chaîne ‘abc ‘ (6 blancs après ‘abc’) n’est pas présente. En revanche, si vous employez le modifieur ‘t’, les blancs situés à droite de la chaîne recherchée et à droite de la chaîne à explorer sont supprimés : X7 est alors égal à 17. INDEX se différencie de FIND dans le sens où : • Vous ne pouvez pas rechercher une chaîne de caractères sans prendre en compte la casse (modifieur ‘i’). SAS Livre Page 101 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 101 • Vous ne pouvez pas éliminer les blancs à droite qui pourraient intervenir dans les chaînes de caractères à explorer et à rechercher (modifieur ‘t’). • INDEX regarde obligatoirement de gauche à droite à partir du premier caractère : vous ne pouvez pas demander une recherche à partir du nième caractère. TRANSWRD (chaîne, extrait à trouver, à remplacer par) Dans une chaîne de caractères, permet de remplacer une chaîne de caractères par une autre. Programme 3.12 DATA test; chaine='abc abc DEF ghiabc abc'; chaine=TRANWRD(chaine,'abc','000'); RUN; Dans cet exemple, la chaîne ‘abc’ est remplacée par ‘000’. La variable CHAINE à l’issue du programme a donc pour modalité : ‘000 000 DEF ghi000 000’. COUNTW (chaîne<, delimiteurs><,modifieur(s)>) Très attendue par les utilisateurs SAS et introduite avec SAS 9.2, cette fonction permet de compter le nombre de mots d’une chaîne de caractères. Le programme 3.13 propose quelques exemples d’application : Programme 3.13 DATA test; x1=COUNTW("la cigale et la fourmi"); x2=COUNTW("la cigale et l’abeille"); x3=COUNTW("la cigale et l’abeille","‘ "); x4=COUNTW("SAS/DATA/SAS GRAPH/PROC PRINT/ODS"); x5=COUNTW("SAS/DATA/SAS GRAPH/PROC PRINT/ODS",,'p'); x6=COUNTW("penses-tu à grand-mère ?"); x7=COUNTW("penses-tu à grand-mère ?",,'p'); x8=COUNTW("penses-tu à grand-mère ?",' ','p'); RUN; X1 sera égal à 5, ce qui est juste, et X2 à 4 ; ce qui est faux. Les délimiteurs de mots par défaut sont, si votre ordinateur utilise des caractères ASCII : blank ! $ % & ( ) * + , – . / ; < ^ | Pour la chaîne de caractères ‘la cigale et l’abeille’, il faut aussi considérer l’apostrophe comme un délimiteur : ceci est possible si vous spécifiez vous-même vos délimiteurs de mots. La construction de la variable X3 utilise cette possibilité en spécifiant l’apostrophe et l’espace (blank) comme seuls délimiteurs possibles. Pour X4, puisque l’espace et ‘/’ sont considérés comme des délimiteurs par défaut, COUNTW comptera 7 mots. Pour la construction de la variable X5, nous demandons via le modifieur ‘P’ à ce que seuls les caractères de ponctuation (et donc « / ») soient considérés comme des délimiteurs : X5 est donc égal à 5. Si vous souhaitez utiliser les possibilités offertes par les modifieurs, attention à bien spécifier les modifieurs en troisième position comme dans le cas de la construction des variables X5, X7 et X8. Pour X5, si vous retirez une virgule, vous demandez en fait à ce que seul le caractère ‘p’ soit considéré comme un délimiteur de mots (et vous obtiendrez 3). SAS Livre Page 102 Jeudi, 18. septembre 2008 6:03 18 102 ◆ SAS La chaîne de caractères « penses-tu à grand-mère ? » compte, selon les règles de la langue française, 4 mots (« penses », « tu », « à » et « grand-mère »). SAS ne permet pas de compter correctement le nombre de mots de cette chaîne de caractères : • X6 est égal à 6 parce que le point d’interrogation est compté comme un mot (il n’est pas délimiteur). • X7 est égal à 3 puisque seules les marques de ponctuation sont comptées comme délimiteurs. Les trois mots sont « pensez », « vous à grand » et « mère », • X8 est égal à 5 : les signes de ponctuation et l’espace sont considérés comme des délimiteurs. Pour les variables X5, X7 et X8, nous avons utilisé le modifieur ‘p’. Il existe dix-neuf autres modifieurs possibles pour la fonction COUNTW. Pour plus de détails sur ces modifieurs, consultez l’aide SAS (entrée COUNTW) ou l’aide en ligne : (SAS 9.2) : support.sas.com/documentation/cdl/en/lrdict/59540/HTML/default/ a002977495.htm Les utilisateurs de versions de SAS antérieures à SAS 9.2 peuvent aussi compter le nombre de mots d’une chaîne de caractères mais ils doivent pour cela utiliser la fonction SCAN comme le montre le programme 3.141 : Programme 3.14 DATA test; chaine = "la cigale et l’abeille"; nbr_mot = 1; DO UNTIL (SCAN(chaine, nbr_mot," '")=''); nbr_mot+1; END; nbr_mot+(-1); RUN; 3.2.7 La concaténation de variables alphanumériques La concaténation des variables alphanumériques n’est pas sans poser de difficultés. Pour vous en convaincre, regardons la table suivante : Programme 3.15 DATA test; INPUT (X Y Z) ($); CARDS; a abc c ab ab f abc a i ;RUN; DATA test; SET test; C=X||','||Y||','||Z; RUN; 1. On utilise ici une boucle DO UNTIL (voir section 3.6.3.) grâce à laquelle la variable NBR_MOT construite par incrémentation (voir section 3.4.2.) augmente de 1 à chaque tour de boucle. La boucle cessera de tourner lorsque la fonction SCAN trouvera la chaîne ‘’ (vide) : on est alors à la fin de la chaîne de caractères examinée. En retirant 1 au résultat, on obtient bien le nombre de mots de la chaîne de caractères. Merci de revenir par la suite sur ce programme. SAS Livre Page 103 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 103 Pour concaténer des variables alphanumériques, vous utilisez la commande | |. Via un PROC PRINT, vous obtenez le résultat suivant : Résultat 3.4 Obs 1 2 3 X Y Z a ab abc abc ab a c f i C a ab abc ,abc ,ab ,a ,c ,f ,i Vous auriez plutôt souhaité un résultat de la forme ‘a,abc,c’. Votre résultat actuel est lié à la forme particulière de l’enregistrement des variables alphanumériques. Les variables X Y et Z ont la longueur par défaut des variables alphanumériques, soit 8 caractères. Les modalités des variables sont placées à gauche dans l’enregistrement : ceci explique que lorsque vous concaténez vos variables, vous observez la modalité, puis un certain nombre d’espaces, la virgule et le texte de la seconde modalité. a....... abc..... c....... Figure 3.4 • Organisation de l’enregistrement des variables alphanumériques. Pour obtenir le résultat ‘a,abc,c’ souhaité, vous devez indiquer à SAS d’effacer les espaces qui pourraient se trouver à droite de la modalité : c’est l’objet de la fonction TRIM. Programme 3.16 DATA test; SET test; CB=TRIM(X)||','||TRIM(Y)||','||Z; RUN; Pour obtenir : Résultat 3.5 Obs 1 2 3 X Y Z a ab abc abc ab a c f i CB a,abc,c ab,ab,f abc,a,i Cette fonction TRIM n’a d’intérêt que dans une phase de concaténation : elle a pour objectif non pas de placer la modalité à droite, mais de ne pas considérer les espaces à droite en cas de concaténation. Si vous voulez vraiment placer la modalité à droite, vous devrez utiliser la fonction RIGHT(X). La fonction CATX permet de systématiser ces concaténations en retirant les blancs qui peuvent intervenir à droite ou à gauche et insère les séparateurs de votre choix. Le programme 3.17 est équivalent au programme 3.16. Programme 3.17 DATA test; SET test; C=CATX(',',X,Y,Z); CC=CATX(',',X,'@',Y,'123 456',Z); RUN; SAS Livre Page 104 Jeudi, 18. septembre 2008 6:03 18 104 ◆ SAS Le séparateur doit être indiqué en premier. Vous indiquez ensuite les variables à concaténer ou directement des chaînes de caractères comme dans le cas de la construction de la variable CC. Les fonctions CAT, CATS et CATT sont relativement proches de CATX sauf que vous ne pouvez pas spécifier de séparateurs. CAT concatène sans retirer les blancs qui pourraient apparaître à droite et à gauche, CATS concatène en retirant les blancs à droite et à gauche, CATT ne retire que les blancs à droite. Exercice 3.2 : Retrouvez sur Internet le texte d’un poème de Raymond Queneau intitulé IXATNU SIOFNNUT I AVAY. Construisez une table SAS avec le texte de ce poème. Les 36 vers doivent être repris dans quatre variables nommées V1 à V4. Votre table aura donc 9 observations, la variable V1 reprend le premier, cinquième, neuvième… vers. 1. Créez quatre nouvelles variables, copies de V1-V4, dans lesquelles vous aurez remplacé toutes les occurrences de « taxi », quelle que soit la casse, par « para ». 2. Réunissez les vers 3 et 4 (V3 et V4) dans une nouvelle variable. 3. Créez quatre nouvelles variables reprenant les derniers mots des vers V1 et V3, puis les deuxièmes lettres de ces mots. 4. Renversez l’ordre des lettres de ces derniers mots et remplacez les mots de départ par leur « inverse ». (Vous aurez besoin pour répondre à cette question de lire la section 3.4.1. et de faire connaissance avec le FORMAT $REVERSw.) 5. Refaites les questions 3 et 4 en remplaçant cette fois-ci le troisième mot par son inverse. 6. Combien y a-t-il de lettres dans chacun des vers ? (« taxi taxi » ne compte que 8 lettres.) Pour répondre aux questions posées, vous aurez très souvent besoin de « nester » différentes fonctions. Ainsi, si vous avez une variable alphanumérique X enregistrée sur 12 caractères et contenant un mot quelconque, LENGTH(X) sera égal à 12 (quel que soit son nombre de caractères). En revanche, LENGTH(TRIM(X)) vous donnera bien le nombre de caractères du mot contenu dans votre variable. Nous avons présenté la fonction SUBSTR de la manière suivante : SUBSTR(X,d,n)=‘texte’ Ici, dans la modalité de X, SAS remplace les n caractères à partir du dème par « texte ». Vous découvrirez grâce à cet exercice que la commande : SUBSTR(X,Y,Z)=W dans laquelle Y, Z et W sont des variables est possible. Vous remplacez ici dans la modalité de X les n caractères (information enregistrée comme modalité de Z), à partir du dème (information enregistrée comme modalité de Y), par le texte enregistré comme modalité de W. Cette possibilité est aussi valable pour les autres fonctions texte. 3.2.8 Les fonctions propres aux dates Nous avons vu lors de l’examen des INFORMAT de date qu’une date pour SAS est un nombre de jours qui sépare la date en question du 1er janvier 1960. Lors de la création de la table, pour faire comprendre qu’une modalité donnée saisit une date, vous devez SAS Livre Page 105 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 105 entrer l’INFORMAT correct. Au cours d’une étape DATA, vous pouvez faire comprendre à SAS qu’une variable saisira une date au moyen d’une instruction : X='13mar2008’d C’est le suffixe « d » suivant la date saisie entre quotes (simples ou doubles) qui indique à SAS qu’il doit interpréter le texte comme une date1. Deux remarques : • Les mois doivent être saisis au moyen de trois lettres – il s’agit impérativement des abréviations anglaises des mois, soit JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC. Si vous modifiez la langue par défaut par une commande OPTIONS DFLANG=FRENCH, cela ne change rien : vous ne pourrez pas utiliser les abréviations françaises. • Attention au YEARCUTOFF si vous n’indiquez que deux chiffres dans votre date (voir section 2.8.3.b.) MDY(MM,JJ,AA) Convertit en nombre de jours depuis le 1er janvier 1960 une date saisie par son mois (MM), son jour (JJ) et son année (AA). Exemple : MDY(3,13,2008) = 17604 (le 13 mars 2008) YEAR(date) Renvoie l’année d’une date donnée. QTR(date) Renvoie le trimestre d’une date donnée. MONTH(date) Renvoie le mois d’une date donnée. DAY(date) Renvoie le jour dans le mois d’une date donnée. WEEKDAY(date) Renvoie le jour dans la semaine d’une date donnée. (1 : dimanche, 2 : lundi…). DATEPART(date) Transforme une date de la forme ‘11MAR2008:14:40:25’ codée en interne comme un nombre de secondes depuis de 1er janvier 1960 en date mesuré par un nombre de jours depuis le 1er janvier 1960. TIMEPART(date) Transforme une date de la forme ‘11MAR2008:14:40:25’ codée en interne comme un nombre de secondes depuis de 1er janvier 1960 en un nombre de secondes écoulées depuis minuit du jour considéré. 1. Vous emploierez le suffixe « t » pour faire comprendre à SAS que 12:34 (ou 12:34:00) est une heure et le suffixe « dt » si vous avez un enregistrement date/heure de la forme ‘11MAR2008:14:40:25’, cette date/heure sera recodée par SAS comme un nombre de secondes depuis le 1er janvier 1960, 0:00:00. Les heures sont recodées comme un nombre de secondes depuis minuit. SAS Livre Page 106 Jeudi, 18. septembre 2008 6:03 18 106 ◆ SAS DATE() ou TODAY() Renvoie la date de l’horloge interne de SAS. On n’a pas besoin d’argument dans cette fonction – il faut tout de même indiquer les deux parenthèses. DATETIME() Transforme la date de l’horloge interne de SAS en nombre de secondes depuis le 1er janvier 1960. INTNX (‘période’,var_date, nbr) Permet d’avancer ou de reculer une date saisie dans VAR_DATE d’un certain nombre de périodes (nbr). Le type de période (‘période’) doit être spécifié (‘day’, ‘week’, ‘month’, ‘qtr’, ‘year’, ‘hour’, ‘minute’, ‘second’…)1. Le programme 3.18 propose un exemple d’application. Programme 3.18 DATA test; date='12jan2008’d; date2=INTNX('week',date,-1); FORMAT date date2 weekdate30.; RUN; Il est demandé à SAS de mettre dans DATE2 le premier jour de la première semaine avant le 12 janvier 2008. Les dates étant saisies par un nombre de jours depuis le 1er janvier 1960, un FORMAT permettra d’afficher ces dates de façon lisible (voir section 5.3.). Si vous demandez un PROC PRINT à l’issue du programme, vous observerez le résultat 3.6. Résultat 3.6 Obs 1 date date2 Saturday, January 12, 2008 Sunday, December 30, 2007 Par défaut, les semaines commencent le dimanche. La semaine précédant la semaine contenant le 12 janvier commençait le dimanche 30 décembre. Si vous choisissez ‘month‘ dans cette instruction : date2=INTNX('month',date,+1); SAS vous donnera le premier jour du mois suivant votre date. Si vous demandez ‘year‘, ce sera le premier jour de l’année de votre date augmenté du nombre de périodes que vous aurez précisé. Il s’agit là du fonctionnement par défaut de SAS. Il est possible de modifier ce fonctionnement par défaut en changeant « l’alignement », quatrième argument optionnel de la fonction INTNX. Cet alignement peut prendre les valeurs b (beginning), m (middle) et e (end). 1. Voir l’aide SAS pour plus de définition de périodes (entrée INTCK functions / interval boundaries and). SAS Livre Page 107 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 107 Programme 3.19 DATA test; date='12jan2008’d; date2=INTNX('week',date,-1,'b'); date3=INTNX('week',date,-1,'m'); date4=INTNX('week',date,-1,'e'); FORMAT date date2-date4 weekdate30.; RUN; Vous obtiendrez : DATE2 : Sunday, December 30, 2007 soit le jour qui débute la semaine qui précède le 12/01/08. DATE3 : Wednesday, January 2, 2008 soit le jour au milieu de la semaine qui précède le 12/01/08. DATE4 : Saturday, January 5, 2008 soit le jour qui termine la semaine qui précède le 12/01/08. INTCK(‘période’, de la date, à la date) Permet de calculer le nombre de périodes (type de période à préciser) entre deux dates. Ici, si vous demandez : dif1=INTCK('month',date1,date2); Vous obtiendrez le nombre de mois entre le premier jour du mois qui contient la date1 et le premier jour du mois qui contient la date2. Il y a ainsi un mois entre le 31 janvier 2008 et le 1er février 2008. De la même manière, il y a une année entre n’importe quelle date de 2007 et n’importe quelle date de 2008. DATDIF et YRDIF (date de début, date de fin, ‘méthode’) Les fonctions DATDIF et YRDIF calculent la différence exprimée en années entre deux dates. Ces fonctions calculent en fait un nombre de jours qui est ensuite exprimé en années. Vous devez spécifier à SAS la méthode à utiliser pour calculer les durées des mois et des années. Quatre méthodes sont possibles : 1. ‘ACT/ACT’ permet d’utiliser le nombre réel de jours dans les mois et le nombre réel de jours dans les années. Il s’agit en fait du nombre de jours dans les années de 365 jours divisé par 365, auquel on ajoute le nombre de jours des années de 366 jours divisé par 366 jours. YRDIF('01mar07’d, '01mar08'd, 'act/act') donne 1.00229. 366 jours séparent ces deux dates : 306 jours sur 2007 et 60 jours sur 2008 soit 1.00229 année = 306 / 365 + 60 / 366. 2. ‘30/360’ pour forcer le nombre de jours par mois à 30 et le nombre de jours dans l’année à 360. YRDIF('01mar07’d, '01mar08'd, '30/360') donne 1 puisqu’il y a exactement 12 mois de 30 jours entre les deux dates et qu’une année dure 360 jours. SAS Livre Page 108 Jeudi, 18. septembre 2008 6:03 18 108 ◆ SAS 3. ‘ACT/360’ pour utiliser le nombre de jours réel dans les mois et forcer le nombre de jours dans une année à 360 jours. YRDIF('01mar07'’d, '01mar08’d, 'act/360') donne 1.01667 * 360 = 366 jours. 4. ‘ACT/365’ pour utiliser le nombre de jours réel dans les mois et forcer le nombre de jours dans une année à 365. YRDIF('01mar07’d, '01mar08'd, 'act/365') donne 1.00274 * 365 = 366 jours. Les méthodes de calcul ACT/360 et ACT/365 ne peuvent pas être utilisées avec la fonction DATDIF. 3.2.9 Une fonction spécifique aux valeurs manquantes La fonction MISSING(X1) permet de savoir si les modalités de la variable X1 sont valeurs manquantes quel que soit le type de la variable et quelle que soit la codification retenue pour noter la valeur manquante. 3.3 Alléger une table SAS Avant de créer les variables dont vous aurez besoin, il est possible de réduire le nombre d’individus ou le nombre de variables de votre table afin de la rendre plus compacte et plus légère. Des commandes spécifiques vous y aideront. 3.3.1 Effacer certaines variables/ne conserver que certaines variables Si vous souhaitez, pour des raisons pratiques, travailler sur une table contenant une certaine partie de vos variables (« on enlève des colonnes »), vous passerez par les commandes DROP ou KEEP. Ainsi, nous disposons au départ d’une table GROS que nous allons utiliser (SET) pour construire une table PETIT. Si vous ne souhaitez conserver que certaines variables : Programme 3.20 DATA petit; SET gros; KEEP X1 X2; RUN; Si vous souhaitez abandonner certaines variables : Programme 3.21 DATA test; SET gros; DROP X1 X2; RUN; Vous comprenez bien que les commandes DROP et KEEP peuvent difficilement être présentes en même temps lors d’une même étape DATA (c’est cependant possible). SAS Livre Page 109 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 109 Le type de programmation présenté dans les programmes 3.20 et 3.21 consomme beaucoup de ressources. En effet, il conduit à faire passer dans le PDV l’intégralité des variables présentes dans la table GROS pour ensuite ne verser dans la table PETIT que certaines de ces variables. Le programme 3.22 présente une programmation plus économe en ressources. Programme 3.22 DATA petit; SET gros (KEEP=x1 x2 x3); RUN; Ou : DATA petit; SET gros (DROP=x1 x2 x3); RUN; Dans le cas présent, au moyen de l’instruction KEEP, seules les variables listées passeront par le PDV. Au moyen de l’instruction DROP, seules les variables non listées passeront par le PDV. L’économie de ressources (temps de calcul, espace sur votre disque dur) est flagrante lorsque l’on gère des tables comprenant quelques millions de lignes et quelques milliers de variables. Les instructions DROP= et KEEP= peuvent intervenir aussi bien dans l’instruction DATA que SET. Attention cependant : DATA test2 (DROP=X1 X2); SET test1 (DROP= X3 X4); ..programme de modification de la table..; RUN; Ici, SAS part de la table TEST1 de laquelle il écarte les variables X3 et X4 : vous ne pouvez donc pas utiliser ces dernières dans le programme de modification de la table. L’instruction DROP= dans l’instruction DATA indique qu’il devra écarter les variables X1 et X2 pour écrire la table TEST2. Dans le corps du programme, ces variables restent cependant disponibles : vous pouvez y faire appel pour en construire de nouvelles. 3.3.2 Écarter ou ne conserver que certaines observations : WHERE, IF et SELECT Si maintenant vous souhaitez travailler sur une table ne contenant qu’une certaine partie de vos observations (« on enlève des lignes »), vous avez le choix entre les commandes suivantes : • IF/THEN OUTPUT ou IF/THEN DELETE; • WHERE; • SELECT/WHEN/OTHERWISE. SAS Livre Page 110 Jeudi, 18. septembre 2008 6:03 18 110 ◆ SAS a. IF Imaginons que nous disposions d’une table dans laquelle sont présents à la fois des hommes et des femmes. Le sexe de l’individu est saisi au moyen d’une variable égale à 0 si l’individu est un homme et 1 s’il s’agit d’une femme. Nous ne souhaitons effectuer des analyses que sur la population féminine. Programme 3.23 DATA femme; SET ensemble; IF sexe=0 THEN DELETE; RUN; ou encore, Programme 3.24 DATA femme; SET ensemble; IF sexe=1; RUN; IF SEXE=1; est donc équivalent à IF SEXE=0 THEN DELETE; Programme 3.25 DATA femme; SET ensemble; IF sexe=1 THEN OUTPUT; RUN; Dans le programme 3.25, si la condition définie par le IF est remplie, alors l’individu doit aller dans la table à créer (définie par DATA). Autre possibilité, si vous souhaitez scinder votre table en deux : Programme 3.26 DATA femme homme; SET ensemble; IF sexe=1 THEN OUTPUT femme; ELSE OUTPUT homme; RUN; La forme à employer dépend de la nature de votre variable définissant l’éligibilité – avec une variable à deux modalités, toutes les formes sont possibles ; avec une variable prenant plus de modalités, certaines formes peuvent apparaître plus fastidieuses à écrire. L’instruction IF, spécifique à l’étape DATA, dispose dans SAS d’un statut particulier puisque vous pouvez aussi bien l’utiliser pour la construction de nouvelles variables que pour la sélection d’observations au sein d’une table existante. Tous les opérateurs et fonctions présentés dans la section 3.2. peuvent être utilisés avec une instruction IF. SAS Livre Page 111 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 111 b. WHERE Contrairement à IF, WHERE ne peut être utilisé que pour sélectionner des observations d’une table existante. L’utilisation de WHERE est à privilégier puisque c’est la programmation la moins consommatrice de ressources. Programme 3.27 DATA femme; SET ensemble (WHERE = (sexe=1)); RUN; Bien entendu, les conditions d’éligibilité à la table finale peuvent être combinées. Si vous disposez d’une variable saisissant la couleur des cheveux des individus (1 : blond 2 : brun 3 : châtain 4 : autre) et si vous souhaitez uniquement travailler sur les femmes blondes : Programme 3.28 DATA femme; SET ensemble (WHERE = (sexe=1 AND cheveux=1)); RUN; On peut aussi avoir : Programme 3.29 DATA femme; SET ensemble; WHERE sexe=1 AND cheveux=1; RUN; Avec l’instruction WHERE, que de nombreuses procédures permettent d’utiliser, le traitement ne sera effectué que sur une partie de votre table. A contrario, IF est une commande spécifique à l’étape DATA : aucune procédure n’autorise cette commande. En plus de la relative universalité de la commande WHERE, il existe d’autres caractéristiques importantes qu’il convient de préciser. Les fonctions WHERE et IF ne sont pas strictement équivalentes. Les instructions de type WHERE sont traitées en priorité et conditionnent le passage dans le PROGRAM DATA VECTOR : si la condition définie par WHERE n’est pas remplie, l’observation n’est pas versée dans le PDV. Ce fonctionnement a deux conséquences : • Une instruction WHERE ne peut intervenir que dans une étape DATA, incluant un SET. • Une instruction WHERE est moins consommatrice de ressources qu’une instruction IF1. 1. Par conséquent, si votre table est de taille importante, essayez d’utiliser WHERE dans vos phases de sélection d’observations. Ceci ne devrait pas poser de problème si vos conditions d’appartenance à la table sont simples. Cependant, si les conditions sont multiples et si elles se combinent, une seule instruction WHERE ne sera peut-être pas facile à écrire. Vous pourrez passer dans ce cas par la construction d’une variable temporaire ayant une certaine valeur si l’observation est à exclure, puis utiliser pour finir IF / THEN OUTPUT ou DELETE. SAS Livre Page 112 Jeudi, 18. septembre 2008 6:03 18 112 ◆ SAS En effet, si votre condition est spécifiée au moyen d’une instruction IF, l’observation passera par le PDV, même si elle ne remplit pas la condition spécifiée. Dans une instruction WHERE, pour définir vos conditions d’éligibilité, vous pouvez utiliser les opérateurs arithmétiques (+, –, *, /, **), les opérateurs de comparaison (=, ^=, >, <, >=, <=, IN et leurs équivalents mnémoniques, soit respectivement EQ, NE, GT, LT, GE, LE), les opérateurs booléens (ou opérateurs logiques : AND (&), OR (|), NOT). Vous pouvez aussi utiliser || (concaténation), des nombres positifs ou négatifs ainsi que les parenthèses pour spécifier l’ordre dans lequel vos conditions sont évaluées. Cet ordre dans lequel ces conditions sont évaluées est important : vous n’aurez pas les mêmes résultats en fonction de la position de vos parenthèses. Dans l’instruction WHERE présentée à la figure 3.5, les parenthèses sont telles que la condition (X4=1 | X5=1) est évaluée en premier : WHERE x1=1 AND (x2=1 | (x3=1 AND (X4=1 | x5=1))); 1 2 3 4 Figure 3.5 • Position des parenthèses et priorités dans la résolution des instructions. Votre résultat sera totalement différent si votre condition WHERE devient : WHERE (((x1=1 AND x2=1) | x3=1 ) AND x4=1 ) | x5=1 ; Vous avez la possibilité d’utiliser, au sein d’une instruction WHERE, les fonctions habituelles de SAS que nous avons évoquées précédemment1. En revanche, vous ne pouvez pas employer l’option OF qui apparaît dans certaines fonctions comme MEAN(OF X1-X5) [voir les fonctions présentées dans la section 3.2.3.]. WHERE MEAN(of x1-x3)=5; WHERE MEAN(x1,x2,x3)=5; La première écriture de la condition WHERE conduit à une erreur de syntaxe. Pour utiliser ce type de fonction, vous devez impérativement lister vos variables séparées d’une virgule, comme dans la seconde instruction, pour que la condition WHERE soit exécutée. Vous disposez de plus de certaines fonctions qui sont spécifiques à la commande WHERE. BETWEEN – AND Exemple : WHERE x BETWEEN 10 AND 20; Pour ne conserver dans votre table que les observations pour lesquelles X est supérieur ou égal à 10 et inférieur ou égal à 20. 1. En fait, puisque WHERE ne sert qu’à sélectionner des observations d’une table existante, parmi l’ensemble des fonctions évoquées à partir de la section 3.2.2., seules quelques-unes pourront avoir une réelle utilité dans ce cadre (SUBSTR par exemple, uniquement dans sa première utilisation possible ; voir section 3.2.6.). SAS Livre Page 113 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 113 CONTAINS Exemple : WHERE x CONTAINS 'ville' ; WHERE x ? 'ville' ; X est une variable alphanumérique. Seules les observations dans lesquelles la chaîne de caractères ‘ville’ est observée dans la modalité de X seront conservées. IS NULL ou IS MISSING Exemple : WHERE X IS NULL; WHERE X IS MISSING; On ne conserve ici que les observations pour lesquelles X est valeur manquante. Le type de la variable n’a pas d’importance. LIKE Exemple : WHERE x LIKE 'F%'; WHERE x LIKE 'F_e%'; WHERE x LIKE 'F_e_'; WHERE x LIKE 'F_e__'; La première instruction WHERE permet de ne conserver que les observations pour lesquelles X commence par ‘F’. La deuxième ne conserve que les observations pour lesquelles X commence par ‘F’ pour lesquelles X a en troisième lettre ‘e’. La troisième instruction WHERE ne conservera que les observations pour lesquelles X est de longueur 4, première lettre ‘F’, troisième lettre ‘e’. La quatrième permet de conserver les observations pour lesquelles X est écrit au moyen de 5 lettres, ‘F’ est la première lettre et ‘e’ la quatrième. =* (ressemble phonétiquement à) Permet de sélectionner des observations à partir d’une modalité d’une variable alphanumérique qui se prononce en anglais comme la chaîne que vous avez indiquée. Cette fonction utilise un algorithme particulier appelé SOUNDEX – il n’existe pas de version francisée de cet algorithme. Exemple repris de l’aide SAS : si votre variable X prend les valeurs Schmitt, Smith, Smithson, Smitt, Smythe, WHERE X=*'Smith'; permet de ne conserver que les observations pour lesquelles X est égal à Schmitt, Smith, Smitt et Smythe. c. SELECT/WHEN/OTHERWISE Afin de sélectionner des observations dans une table en fonction de certains critères, il est aussi possible de passer par des commandes SELECT/WHEN/OTHERWISE. Ces commandes ont une logique quelque peu différente de celles que nous avons pu voir jusqu’à maintenant1. Imaginons l’exemple suivant : vous disposez d’une table reprenant des informations sur des clients situés en France et vous souhaitez envoyer à chaque direction régionale 1. Ces commandes sont en fait typiques du langage SQL. SAS Livre Page 114 Jeudi, 18. septembre 2008 6:03 18 114 ◆ SAS des tables ne reprenant que les informations relatives aux clients de la région dont elle a la charge. Programme 3.30 DATA reg1 reg2 reg3 reg4 reg5 reg6 autre; SET France; SELECT (dep); WHEN ('45','37','36','41','18','28') OUTPUT reg1; WHEN ('10','52','51') OUTPUT reg2; WHEN ('62','59') OUTPUT reg3; *.suite du programme..; OTHERWISE OUTPUT autre; END; RUN; Dans le présent exemple, la variable DEP est alphanumérique. Si elle est numérique, vous devrez retirer les quotes encadrant les modalités. L’instruction WHEN indique que si la variable DEP prend les modalités entre parenthèses, alors l’observation doit être envoyée vers la table REG1. L’instruction OTHERWISE n’est pas obligatoire mais permettra de regrouper les observations sur lesquelles aucune condition WHEN n’a été vérifiée. La commande SELECT est toujours suivie d’un END. Second exemple d’application de ce type de programmation : vous disposez d’une table dans laquelle sont saisies les notes à un examen et vous êtes arrivé à la conclusion suivante : si la note est supérieure à 6 et que ce soit un garçon, celui-ci doit être considéré comme un bon étudiant ; si la note est supérieure à 10 et que ce soit une fille, alors c’est une bonne étudiante. Vous souhaitez construire deux tables, une table pour les bons étudiants et une autre pour les moins bons. Programme 3.311 DATA bons moins_bons; SET ensemble; SELECT; WHEN ((note > 10 AND sexe=2) | (note > 6 AND sexe=1)) OUTPUT bons; OTHERWISE OUTPUT moins_bons; END; RUN; Nous aborderons à nouveau les commandes SELECT/WHEN/OTHERWISE dans la section 3.5.5. consacrée à la construction de nouvelles variables sous conditions. 1. AND étant prioritaire sur OR (|), nous pouvions tout à fait écrire la condition sous la forme : WHEN (note > 10 AND sexe=2 | note > 6 AND sexe=1) Nous vous recommandons plutôt la prudence dans ce genre de programmation faisant appel aux opérateurs booléens en utilisant systématiquement les parenthèses comme dans ce programme. On se souvient rarement que AND est prioritaire sur OR. SAS Livre Page 115 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 115 3.3.3 Sélection d’observations à partir de leur numéro d’observation L’option POINT= de la commande SET permet d’accéder directement à une observation particulière dans une table SAS. Cette option est cependant délicate car il est nécessaire de l’associer à d’autres commandes. Vous disposez par exemple d’une table à partir de laquelle vous souhaitez construire une seconde table ne conservant que le 8e individu. Un programme utilisant l’option POINT= peut alors être utilisé : Programme 3.32 DATA test10; obs=8; SET test POINT=obs; OUTPUT; STOP; RUN; Avant que la commande SET n’intervienne, vous devez déjà définir une variable qui vous indiquera le rang de l’observation à conserver. Dans la commande SET, vous associez à POINT le nom de cette variable. L’option POINT= doit impérativement être associée à une commande STOP. Si cette commande n’est pas présente, vous entrez dans une boucle infinie. En effet, lorsque vous utilisez l’option POINT, SAS va directement à l’observation que vous lui avez spécifiée : il ne verra donc pas le marqueur qui lui indique qu’il est en fin de table. La rencontre avec ce marqueur commandant l’écriture de la table ordonnée par DATA. Sans commande STOP, la table n’est pas écrite et votre programme continue à être exécuté. Dans le même temps, nous avons vu que l’écriture dans la table ordonnée par DATA s’effectuait lorsque SAS rencontrait l’instruction RUN. Dans le cas présent, puisque le STOP interrompt l’exécution du programme, le RUN ne commande pas l’écriture de la table et vous devez introduire une instruction OUTPUT avant le STOP. Cette option POINT= peut être utile si vous souhaitez par exemple créer une table qui ne reprendra qu’une observation sur dix. Programme 3.33 DATA test10; DO obs=1 TO 1000 BY 10; SET test point=obs; OUTPUT; END; STOP; RUN; Si vous souhaitez ne conserver qu’un individu tous les p individus, vous pouvez passer par cette programmation alternative qui utilise la fonction MOD (pour MODulo) : cette fonction vous donne le reste entier de la division d’un chiffre par un autre (7 : 4 = 1 ; il reste 3). SAS Livre Page 116 Jeudi, 18. septembre 2008 6:03 18 116 ◆ SAS Programme 3.34 DATA test10; SET test; IF MOD(_N_,10)=1; RUN; Et si vous voulez garder un individu tous les dix individus à partir du troisième : Programme 3.35 DATA test10; SET test; IF MOD(_N_,10)=3; RUN; Attention cependant : si les deux programmations proposées ici sont équivalentes en termes de résultat, elles ne sont pas équivalentes en termes de ressources utilisées. En permettant un accès direct à une ou plusieurs observations, l’option POINT= ne demande pas un examen complet de la table. La programmation alternative proposée ici examine chacune des observations de votre table. Si votre table est de taille importante, il est recommandé d’utiliser POINT=. Exercice 3.3 : Dans les programmes 3.34 et 3.35, une instruction IF a été utilisée pour sélectionner des observations. Il est pourtant recommandé dans la section 3.3.2.b. d’utiliser plutôt la commande WHERE. Essayez de remplacer le IF par WHERE. Vous verrez que cela ne fonctionne pas. Pourquoi ? 3.4 La construction de nouvelles variables au sein d’une table SAS Partant de la table que vous avez construite, vous aurez nécessairement besoin de construire, sur base des variables déjà présentes, de nouvelles variables. Nous présentons dans la section 3.4.2. les outils à votre disposition pour construire des variables sans condition. La section 3.4.1. présente un outil simple qui vous permet, alors que votre table est déjà créée, d’utiliser les INFORMATS afin de créer de nouvelles variables. 3.4.1 La conversion des variables La fonction INPUT permet des conversions de variables en demandant l’application d’un INFORMAT à une variable déjà présente dans votre table. Parmi les fichiers d’accompagnement à cet ouvrage, vous trouverez une table SAS appelée DOLLAR. La personne qui a créé la table ne se souvenait plus du nom de l’INFORMAT lui permettant de transformer des sommes ayant la forme €1.000,00 en une donnée numérique compréhensible par SAS. Elle a donc enregistré cette somme dans une variable alphanumérique, se disant qu’elle réussirait bien un jour à lui redonner une forme numérique. Nous avons vu dans la section 3.1.3. qu’en créant une nouvelle variable égale à la variable alphanumérique multipliée par 1, on pouvait créer la variable numérique souhaitée. Cela ne fonctionnera pas ici, en raison de la présence dans l’enregistrement SAS Livre Page 117 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 117 du signe €, des « . », séparateur des milliers, et de la virgule. La transformation de cette variable alphanumérique en une variable numérique compréhensible par SAS peut cependant être réalisée au moyen d’une instruction INPUT. Programme 3.36 DATA dollar; SET lib.dollar; ca_num=INPUT(ca,eurox12.2); RUN; Cette commande permet la création d’une nouvelle variable numérique CA_NUM, égale à CA, interprétée par l’INFORMAT EUROX12.2.1 La nature de la variable créée au moyen d’une instruction INPUT dépendra de la nature (numérique/alphanumérique) de l’INFORMAT. Si vous utilisez $5. à la place d’EUROX12.2, votre variable créée sera alphanumérique et les modalités seront égales aux cinq premiers caractères des modalités de CA. L’élément W de l’INFORMAT doit être obligatoirement renseigné : vous ne pouvez pas utiliser dans une instruction INPUT les INFORMAT dans leur forme :INFORMAT. Exercice 3.4 : Dans la table DOLLAR, vous trouverez une variable alphanumérique DATE dont les modalités sont des dates présentées sous la forme d’une chaîne de caractères : ‘13/01/2008’. Transformez cette variable alphanumérique en variable numérique et vérifiez que cette nouvelle variable mesure bien un nombre de jours entre la date en question et le 1er janvier 1960. 3.4.2 La construction sans condition Vous utiliserez pour cela les différentes fonctions indiquées dans la section 3.2. Quelques exemples : Programme 3.37 DATA testdd; SET testdd; x2=x1**2; x3=x1*56; x4=x1/RANUNI(8); x5=EXP((x4+x2)/x3); x6=SUM(x1,x3,x4)/MAX(x2,x5)**(MIN(of x1-x4)); RUN; La syntaxe est toujours identique : la variable à créer est une fonction d’autres variables dont vous disposez au moment où est saisie la ligne de programme. Contrairement au programme 3.37, le programme 3.38 n’a pas de sens. Programme 3.38 DATA testdd; SET testdd; x6=SUM(x1,x3,x4)/MAX(x2,x5)**(MIN(of x1-x4)); x2=x1**2; 1. EUROX12.2 (sans point à la fin) est bien l’INFORMAT utilisé ici. SAS Livre Page 118 Jeudi, 18. septembre 2008 6:03 18 118 ◆ SAS x3=x1*56; x4=x1/RANUNI(8); x5=EXP((x4+x2)/x3); RUN; Si, dans la table au départ, vous disposez de X1, au moment où X6 est définie, SAS ne sait pas ce que sont X3, X4 et X5. X6 sera alors valeur manquante. La structure : nouvelle variable = fonction d’une variable déjà présente dans la table SAS n’est pas toujours obligatoire. Par exemple : Programme 3.39 DATA test; SET test; x7+x; t+1; n+x**2; RUN; Le programme 3.39 va vous créer une nouvelle variable (X7) somme cumulée des X. Exercice 3.5 : Quelles sont les variables qui vont être créées par t+1 et pas n+x**2 ? La construction de variables incrémentées présente des caractéristiques différentes de celles des variables construites par la programmation vue plus haut. Normalement, lorsque vous construisez une variable comme une fonction d’autres variables déjà présentes dans la table, si une de ces variables présente une valeur manquante, votre nouvelle variable est alors, elle aussi, valeur manquante. Les variables construites par incrémentations ne peuvent pas avoir comme modalité une valeur manquante. Imaginons par exemple que nous disposions d’une table dans laquelle sont reprises les notes obtenues par des étudiants à un examen. Nous avons oublié le nom de la procédure qui calcule une moyenne et tentons donc de calculer la moyenne de ces notes uniquement au moyen d’une étape DATA. Le programme 3.40 crée une table fictive1 : Programme 3.40 DATA note_etudiant; DO etu=1 TO 100; note=ROUND(RANUNI(123)*RANUNI(234)*20+2,1); exc=RANUNI(234); IF note>20 THEN note=20; IF exc<0.15 THEN note=.; OUTPUT; END; RUN; 1. La construction de ce fichier fictif fait appel à des notions de programmation que nous développerons dans les sections suivantes – merci de revenir sur ce programme par la suite. SAS Livre Page 119 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 119 Certains étudiants sont défaillants (15 % d’étudiants défaillants). La moyenne est calculée lors d’une étape DATA – nous ne conservons que la dernière ligne de la table en ajoutant d’une part l’option END=XXX dans la ligne SET et en indiquant d’autre part, IF XXX à la fin du programme. Programme 3.41 DATA note_etudiant_M; SET note_etudiant END=dernier; somme_note+note; nb_etudiant+1; moyenne=somme_note/nb_etudiant; IF dernier; KEEP moyenne; RUN; PROC PRINT; RUN; Et vous obtenez 6.64 de moyenne – c’est évidemment très peu. Retirez les deux dernières lignes du programme et regardez la table complète. Qu’observez-vous ? Résultat 3.7 Obs . . . 26 27 28 29 30 31 32 33 . . . etu 26 27 28 29 30 31 32 33 note exc 6 2 . . . 16 3 13 0.19986 0.99949 0.02290 0.01336 0.11700 0.95227 0.34507 0.30917 somme_ note 153 155 155 155 155 171 174 187 nb_etudiant 26 27 28 29 30 31 32 33 moyenne 5.88462 5.74074 5.53571 5.34483 5.16667 5.51613 5.43750 5.66667 La variable SOMME_NOTE n’est pas valeur manquante malgré le fait que pour la calculer, vous ajoutez des notes aux valeurs manquantes (qui sont donc considérées ici comme égales à zéro). La moyenne calculée est donc forcément fausse puisque c’est la somme des points obtenus par les individus présents à l’examen divisée par le nombre d’individus convoqués à l’examen. Lorsque vous utiliserez cet outil de programmation, vous prendrez donc garde aux valeurs manquantes qui pourraient très vite vous conduire à des résultats faux. 3.5 La construction sous conditions Nous allons examiner dans cette section les outils dont vous pouvez disposer pour construire des variables qui auront leurs modalités liées au respect d’une ou de plusieurs conditions. SAS Livre Page 120 Jeudi, 18. septembre 2008 6:03 18 120 ◆ SAS 3.5.1 Les commandes IF – THEN – ELSE Nous disposons d’une variable CHEVEUX valant soit 1, 2, 3 ou 4. Nous souhaitons créer à partir de cette variable quatre indicatrices : BLOND, CHATAIN, BRUN, et AUTRE. Programme 3.42 DATA test; SET test; IF cheveux=1 IF cheveux=2 IF cheveux=3 IF cheveux=4 RUN; THEN THEN THEN THEN blond=1;ELSE blond=0; brun=1;ELSE brun=0; chatain=1;ELSE chatain=0; autre=1;ELSE autre=0; La programmation exécutée ici est dangereuse puisque vous prenez la table TEST et que vous écrivez à nouveau une table TEST : en cas de mauvaise programmation, vous ne pourrez plus revenir à votre table initiale1! IF détermine la condition. Si celle-ci est remplie, alors on applique le THEN;. Si elle n’est pas remplie, on applique le ELSE. Le ELSE n’est pas obligatoire : IF cheveux=1 THEN blond=1; Pour les individus blonds, on observera bien BLOND=1 mais pour les autres, on aura BLOND=. (valeur manquante). Ce qui suit le THEN peut rester vide, mais vous devrez toujours indiquer le THEN; si vous rentrez la ligne suivante : IF cheveux=1 THEN; ELSE BLOND=0; Vous obtiendrez BLOND=0 pour tous les non-blonds et BLOND=. (valeur manquante) pour les blonds. ATTENTION : mettre un IF sans THEN/ELSE est problématique puisque, comme nous l’avons vu dans la section 3.3.2.a., IF cheveux=1; est équivalent à IF cheveux ^=1 THEN DELETE; 3.5.2 Les commandes IF THEN/ELSE IF THEN Nous repartons ici de la table NOTE_ETUDIANT créée par le programme 3.40. Nous souhaitons créer à partir de la note des commentaires : Programme 3.43 DATA note_etudiant2; SET note_etudiant; LENGTH conclusion $ 20; 1. Si vous commettez une erreur de programmation majeure (en rouge dans votre fenêtre JOURNAL), comme la table demandée n’est pas créée, il n’y aura pas de problème. En revanche, si vous avez entré une instruction qui, par exemple, efface des observations ou des variables, si vous n’avez pas de copie de sauvegarde de votre table, vous ne pourrez pas revenir à votre table de départ (voir section 5.5.). SAS Livre Page 121 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 121 IF note<5 THEN conclusion='aucun travail'; ELSE IF note<10 THEN conclusion='peu de travail'; ELSE IF note<13 THEN conclusion='bases acquises'; ELSE IF note<16 THEN conclusion='bon travail'; ELSE conclusion='excellent'; RUN; Exercice 3.6 : (Rappel) à quoi sert la ligne suivante1 ? LENGTH conclusion $ 20; Si vous ne mettez pas les ELSE, les seuls commentaires que vous aurez seront ‘bon travail’ et ‘excellent’. Programme 3.44 DATA note_etudiant3; SET note_etudiant; LENGTH conclusion $ 20; IF note<5 THEN conclusion='aucun travail'; IF note<10 THEN conclusion='peu de travail'; IF note<13 THEN conclusion='bases acquises'; IF note<16 THEN conclusion='bon travail'; ELSE conclusion='excellent'; RUN; En effet, une personne qui a une note de 3 respecte la condition NOTE<16 – il respecte aussi les autres conditions mais seule la dernière compte. Pour avoir les bons commentaires sans utiliser l’instruction ELSE, il faudrait être beaucoup plus complet sur les spécifications du IF en réalisant des encadrements ou en ajoutant une condition de valeur manquante : IF note<13 AND MISSING(conclusion) THEN conclusion='bases acquises'; Exercice 3.7 : À partir de la table NOTE_ETUDIANT créée par le programme 3.40, écrivez le programme complet qui construira correctement la variable CONCLUSION sans utiliser un ELSE IF. Rappel : les valeurs manquantes sont inférieures à tout. Si vous ne prenez pas en compte ce rappel, vous aurez pour les étudiants défaillants un commentaire « aucun travail », ce qui est inexact. Merci d’adapter votre programmation pour donner aux défaillants une modalité spécifique. Exercice 3.8 : Dans le fichier EXAMEN.TXT, vous allez retrouver les informations suivantes SEPAREES par un espace : H Damien 17/6/1986 3 5 7,2 6,9 5 5,4 Sexe / prénom / date de naissance / groupe de td / note1 / note2 / note3 / note4 / note5 Créez une table SAS avec les données relatives aux 314 étudiants de ce fichier. 1. Calculez, au moyen d’étapes DATA, la moyenne obtenue par chaque étudiant – s’il a plus de 10 de moyenne générale, il est reçu sans mention ; si sa moyenne est 1. Voir section 3.1.2. pour la réponse. SAS Livre Page 122 Jeudi, 18. septembre 2008 6:03 18 122 ◆ SAS comprise entre 12 et 14, il obtient une mention AB ; si la moyenne est comprise entre 14 et 16, il obtient une mention B ; et si la moyenne est supérieure à 16, il aura une mention TB. Créez une variable qui indique le résultat à l’examen des étudiants (reçu/recalé). Créez une table dans laquelle vous observez ces résultats (sexe, prénom, date de naissance LISIBLE, groupe de TD, moyenne, résultat et mention). Créez une seconde table destinée à l’affichage selon les principes des jurys du Bac (seuls les admis sont présents sur la liste). 2. Créez une troisième table dans laquelle devra apparaître : Le nombre de reçus, le pourcentage de réussites, de mentions Très Bien, et par groupe de TD, le nombre de reçus et le pourcentage de réussites. Cet exercice va vous apprendre à vous servir de l’instruction END (voir programme 3.41). 3.5.3 Les commandes IFN et IFC Introduites dans SAS 9, les commandes IFN et IFC permettent la construction de variables sous conditions de façon très simple et très rapide : IFN(condition, valeur numérique si condition vraie, valeur numérique si condition fausse, valeur numérique si valeur manquante) IFC(condition, texte si condition vraie, texte si condition fausse, texte si valeur manquante) Vous n’êtes pas obligé de préciser la modalité à renvoyer en cas de valeur manquante (et nous allons voir qu’il semble d’ailleurs difficile d’exploiter cette possibilité). Programme 3.45 DATA note_etudiant4; SET note_etudiant; resultat=IFN(note>=10,1,0); resultat2=IFC(note>=10 ,'reçu','recalé'); RUN; La variable RESULTAT vaut 1 si la note est supérieure ou égale à 10, 0 sinon – RESULTAT2, variable alphanumérique, aura pour modalité « reçu » et « recalé ». Le lecteur attentif se dit que les étudiant défaillants ont comme modalité la même que celle des étudiants qui ont passé l’examen et qui ont obtenu une note inférieure à 10. Pour créer une troisième modalité « défaillant », la programmation imbrique deux IFN/IFC : Programme 3.46 DATA note_etudiant5; SET note_etudiant; resultat=IFN(MISSING(note),-1,IFN(note>=10,1,0)); resultat2=IFC(MISSING(note),'défaillant',IFC(note>=10 , 'reçu', 'recalé')); RUN; La possibilité de renvoyer une troisième modalité en cas de valeur manquante semble difficile à exploiter étant donné que les IFN et les IFC sont tout à fait équivalents à des structures IF/ELSE. La valeur manquante a une « valeur numérique » (elle est inférieure SAS Livre Page 123 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 123 à tout) et si, pour construire la variable RESULTAT2, vous utilisez la commande suivante : resultat2=IFC(note<10 ,'recalé','reçu','défaillant'); les défaillants seront déclarés recalés puisque valeur manquante est bien inférieure à 10. 3.5.4 La commande IF/GOTO La commande IF/GOTO peut être comprise au travers du programme 3.47. Programme 3.47 DATA test; INPUT x1 x2; CARDS; 1 1 1 2 1 3 2 1 2 2 2 3 ;RUN; DATA test; SET test; x3=x1*10; IF x1=1 THEN GOTO lala; x4=-x1; x5=-x2; lala: x6=-x1; x7=-x2; RUN; La création de la variable X3 se fait sans condition. Les variables X4 et X5 ne sont créées que dans le cas où la condition spécifiée après le IF n’est pas remplie. On comprend donc que les variables X4 et X5 ne vont être créées que dans le cas où X1 est différent de 1. Les commandes qui viennent après le texte « lala: » (veuillez noter le « : ») s’appliqueront ensuite sans condition, sur l’intégralité des observations de votre table. Un PROC PRINT effectué à l’issue du programme vous donnera donc le résultat 3.8. Résultat 3.8 Obs 1 2 3 4 5 6 x1 x2 x3 x4 x5 x6 x7 1 1 1 2 2 2 1 2 3 1 2 3 10 10 10 20 20 20 . . . -2 -2 -2 . . . -1 -2 -3 -1 -1 -1 -2 -2 -2 -1 -2 -3 -1 -2 -3 La structure de ce type de programme est nettement plus dure à suivre (vous spécifiez une condition pour ensuite demander un certain nombre de tâches à effectuer si la condition n’est pas remplie) et l’utilisation des IF/GOTO n’est pas conseillée. Un DO simple pourra remplir exactement le même office (voir section 3.6.1.). SAS Livre Page 124 Jeudi, 18. septembre 2008 6:03 18 124 ◆ SAS 3.5.5 Les commandes SELECT/WHEN/OTHERWISE La commande SELECT grâce à laquelle nous avons construit plusieurs tables à partir d’une seule en fonction de critères sur une ou plusieurs variables (voir section 3.3.2.c.) peut aussi être utilisée pour la construction de nouvelles variables sous conditions. Le programme 3.43 peut être réécrit avec les commandes SELECT. Il aura alors la forme suivante : Programme 3.48 DATA notesas; SET notesas; LENGTH conclusion $ 20; SELECT; WHEN (note<5) conclusion='rien compris'; WHEN (note<10) conclusion='peu de travail'; WHEN (note<13) conclusion='bases acquises'; WHEN (note<16) conclusion='bon travail'; OTHERWISE conclusion='excellent'; END; RUN; Cet exemple nous permet de comprendre en quoi la logique de ce type de commande est différente de la logique de fonctionnement interne à SAS telle qu’elle a été décrite dans la section 3.1. Ici, la construction de la variable sera parfaitement effectuée (alors qu’on aurait pu s’attendre à n’avoir que deux modalités ‘bon travail’ et ‘excellent’). En fait, dès qu’une observation est traitée par une condition spécifiée par le WHEN, les instructions qui viennent ensuite ne sont pas examinées pour cette observation (alors que dans une programmation SAS, toutes les lignes du programme sont examinées). Ceci vous explique pourquoi ce type de programmation (et donc le langage SQL) est beaucoup plus rapide que le langage SAS standard. 3.5.6 Une dernière possibilité Nous avons vu que la structure suivante n’était pas obligatoire : Nouvelle variable = fonction d’une ancienne variable présente dans la table SAS On peut en effet construire des variables incrémentées de la manière suivante : n+1; On peut aussi se servir de cette possibilité dans le cadre de la construction d’une nouvelle variable avec conditions. Sur la base de la table créée par le programme 3.40, nous souhaitons connaître le nombre d’individus qui ont eu une note strictement supérieure à 15. Nous pouvons pour cela passer par : Programme 3.49 DATA note_etudiant7; SET note_etudiant; IF note > 15 THEN compte+1; RUN; SAS Livre Page 125 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 125 Une autre possibilité est offerte par le programme suivant : DATA note_etudiant8; SET note_etudiant; compte + (note > 15); RUN; Dans le cas présent, (note > 25) est compris comme une condition qui vaut 1 si l’expression est vraie pour l’observation considérée et zéro sinon. Vous demandez donc au moyen du programme 3.49 de créer une variable COMPTE qui augmentera de 1 à chaque fois que vous rencontrerez un individu ayant eu une note strictement supérieure à 15. Le nombre d’individus ayant eu plus de 15 pourra être observé sur la dernière ligne de la table créée. Afin de comprendre l’intérêt de ce type de programmation, imaginons le cas suivant : nous souhaitons pouvoir créer, à partir de la variable NOTE présente dans la table créée par le programme 3.40, une nouvelle variable qui va valoir 1 si l’étudiant a eu moins de 5 (5/20 inclus), 2 si la note est comprise entre 5 et 10 inclus, 3 si la note est comprise entre 10 et 15 inclus, et 4 pour les notes supérieures à 15. Vous pourriez exécuter un programme de ce type : Programme 3.50 notegrp = 1; IF 5 < note <= 10 THEN notegrp = 2; IF 10 < note <= 15 THEN notegrp = 3; IF note > 15 THEN notegrp = 4; La ligne suivante offrira le même résultat : notegrp= 1 + (note>5)+(note>10)+(note>15); 3.6 Les boucles DO Plusieurs versions du DO existent dans SAS. Mais quelle que soit la version du DO utilisé, il est toujours terminé par un END;. DO ; DO simple suivi d’un ensemble d’instructions. DO I=1 TO 10 BY 1 ; DO itératif (BY 1 indique le pas). DO X=3,5,12 ; Réalise les instructions qui suivent uniquement dans le cas où X=3, X=5, et X=12. DO WHILE (expression) Les instructions qui suivent doivent être exécutées tant que l’expression est vraie. DO UNTIL (expression) Les instructions qui suivent doivent être exécutées jusqu’à ce que l’expression soit vraie. SAS Livre Page 126 Jeudi, 18. septembre 2008 6:03 18 126 ◆ SAS DO sur ARRAY ; Instruction multiple sur un bloc de variables défini par la commande ARRAY. Ce dernier type de boucle DO sera traité dans la section 3.7. Vous avez de plus la possibilité de combiner ces différents types de DO. DO i= 1 TO 1000 WHILE (sum < 100); Examinons maintenant les possibilités offertes par les boucles DO. 3.6.1 Le DO simple Exécute un ensemble de commandes – le DO simple est généralement associé à un IF. Programme 3.51 DATA test; SET test; IF x1>15 THEN DO; x2=x4+5; x7=x3**6; x8=SQRT(x1); END; RUN; Ici, le DO vous permet de réaliser plusieurs instructions si la condition du IF est vérifiée. (Cette procédure devra être préférée au GOTO.) Exercice 3.9 : Réécrivez le programme présenté dans la section consacrée à IF/GOTO en employant un DO simple. 3.6.2 Le DO itératif Imaginons que vous souhaitiez créer une table dans laquelle apparaîtraient 100 nombres tirés au hasard (loi uniforme). Le DO itératif vous permet cette création simplement : Programme 3.52 DATA test; DO i = 1 TO 100; rand = RANUNI(0); OUTPUT; END; RUN; Dans votre table TEST, vous retrouverez I variant de 1 à 100 et une variable RAND. L’instruction OUTPUT est ici obligatoire. Si vous retirez cette instruction, SAS va bien construire vos 100 tirages mais la table construite n’aura pas vos 100 observations puisqu’il placera uniquement dans votre table ce qu’il a dans le PDV au moment du RUN : il n’y aura donc qu’une observation. Exécutez malgré tout ce programme en retirant la commande OUTPUT. Si vous regardez la table créée, vous constaterez que celle-ci présente bien une seule observation. SAS Livre Page 127 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 127 De plus, vous constaterez que la variable I sera égale à 101. Ceci s’explique par le fait que l’incrémentation de la variable I se fait au niveau de l’instruction END qui clôt la boucle. C’est parce que la valeur 101 est strictement supérieure à la borne supérieure que la boucle cesse de tourner1. IMPORTANT : en cas de DO itératif, vérifiez bien votre programme de façon que vous ne rentriez pas dans une boucle infinie ! Ensuite, n’oubliez pas que vous avez ici une étape DATA dans laquelle une commande OUTPUT existe. Il est inutile d’introduire des lignes de programmes entre END et RUN : ces lignes, si elles sont parfaitement comprises par SAS, ne donneront pas naissance aux variables souhaitées dans la table créée (voir section 3.1.6.). Autres possibilités d’itérations : DO DO DO DO DO I=1 TO n; I=n TO 1 BY -1; I=k+1 TO n-1; I=1 TO k-1,k+1 TO n; I=.1 TO .9 BY .1, 1 TO 10 BY 1, 20 TO 100 BY 10; Vous avez aussi la possibilité de lister les valeurs sur lesquelles vous souhaitez que certaines instructions soient effectuées : DO I=2,5,8,345; 3.6.3 Les boucles DO UNTIL Les boucles DO UNTIL permettent d’exécuter une commande jusqu’à ce qu’une condition (à spécifier après le UNTIL) soit vraie. L’expression est estimée après chaque exécution des instructions qui suivent : vous êtes donc sûr que vos instructions seront estimées au moins une fois. (Évaluation de l’expression « en bas de la boucle »). Programme 3.53 DATA test; x=0; DO UNTIL (86*x**2-3608*x-168=0); x+1; y=86*x**2-3608*x-168; END; RUN; L’équation 86X2–3608X–168 admet une racine entière positive. Le programme 3.53 permet de retrouver cette racine. Attention, si vous n’introduisez pas la ligne X+1, l’expression sera toujours estimée avec la même valeur de X (soit 0 et vous entrez dans une boucle infinie). Si votre équation n’admet pas de racine entière positive, vous entrez aussi dans une boucle infinie. 1. Si vous introduisez une instruction X=i avant la commande END, vous constaterez que la variable X vaudra bien 100 alors que I vaudra 101. Nous vous recommandons par mesure de précaution de ne jamais conserver une variable de type i en vous disant qu’elle mesure le nombre de fois où la boucle a tourné : si une instruction OUTPUT intervient dans votre boucle, ce sera vrai ; dans le cas contraire, ce sera faux. SAS Livre Page 128 Jeudi, 18. septembre 2008 6:03 18 128 ◆ SAS Vous pouvez aussi construire des programmes dans lesquels des boucles itératives seront associées avec des conditions de type UNTIL. La structure de la boucle est modifiée. Programme 3.54 DATA test; DO X=1 TO 100 UNTIL (86*X**2-3608*X-168=0); Y=86*X**2-3608*X-168; END; RUN; La boucle cessera de tourner soit lorsque X aura atteint la valeur 100, soit lorsque la condition définie par UNTIL sera remplie. Vous ne pouvez pas entrer dans des boucles infinies avec ce type de programmation. 3.6.4 Les boucles DO WHILE Les boucles DO WHILE permettent d’exécuter une commande tant qu’une condition (à spécifier après le WHILE) est vraie. L’expression est estimée avant les commandes : contrairement à la boucle DO UNTIL, vous n’êtes pas sûr que les instructions soient exécutées au moins une fois. (Évaluation de l’expression « en haut de la boucle »). Exemple : Pour différentes valeurs du taux de croissance de la population, nous souhaitons savoir au bout de combien d’années la population double. Programme 3.55 DATA population; DO taux = 1,2,2.5,3,4,5,10; annee = 0; population = 1; DO WHILE (population < 2); population=population*(1+taux/100); annee+1; END; OUTPUT; END; KEEP taux annee; RUN; En fait, SAS va prendre la première valeur de TAUX, fixer ANNEE à 0 et POPULATION à 1 ; il va ensuite regarder la population au bout d’une année. Si cette population est inférieure à 2, il augmente de 1 la variable ANNEE et recalcule la population. Quand la population est supérieure à 2, c’est la fin de la boucle DO WHILE. Il passe alors à la seconde valeur du taux. La condition à spécifier en utilisant DO UNTIL pour obtenir exactement la même chose est : DO UNTIL (population > 2); Ici aussi, des commandes associant une boucle itérative et une commande WHILE sont possibles : DO x=1 TO 100 WHILE (condition); SAS Livre Page 129 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 129 3.7 Les boucles sur ARRAY Le principe des boucles sur ARRAY est de pouvoir effectuer sur un ensemble de variables des traitements identiques. Avant d’illustrer le fonctionnement de ce type de boucle, intéressons-nous aux principes des ARRAY. 3.7.1 Principes La commande ARRAY permet de regrouper un certain nombre de variables pour la durée d’une étape DATA. Ce type de commande permet ensuite des traitements groupés et simplifie de façon assez importante vos programmes. La structure de la commande est la suivante : ARRAY nom{5} x1 x2 x3 x4 x5; Le bloc de variables appelé NOM comprend 5 membres : X1, X2, X3, X4 et X5. Vous n’êtes pas obligé de spécifier le nombre d’éléments que contient votre bloc de variables. La lecture de votre programme sera cependant plus délicate parce qu’il devient difficile de distinguer le nom du bloc du nom des variables intégrées à ce bloc. Il est donc recommandé d’indiquer la dimension (le nombre de variables) que contient votre bloc. Pour spécifier la dimension de votre bloc, vous pouvez aussi utiliser les parenthèses et les crochets. Si vous ne connaissez pas la dimension de votre bloc, vous pouvez utiliser l’astérisque (*). ARRAY num{*} _NUMERIC_; Nous regroupons par la précédente commande l’ensemble des variables numériques de la table dans un bloc appelé NUM. Il est aussi possible d’utiliser _ALL_, _CHARACTER_ et toutes les possibilités d’appel de listes de variables qui seront évoquées dans la section 3.9. Vous pouvez de plus spécifier indirectement la dimension de votre bloc au moyen de commandes de ce style : ARRAY nom{11:15} x11-x15; La déclaration des variables qui composent le bloc n’est pas obligatoire mais dans ce dernier cas, vous devez impérativement spécifier la dimension de votre bloc. Vous pouvez ainsi avoir des instructions de la forme suivante : ARRAY x{5}; S’il existe déjà des variables X1-X5 dans votre table, SAS les placera dans le bloc X. Dans le cas contraire, la simple déclaration de l’ARRAY créera ces variables. Si votre commande ARRAY a pour objectif la création de variables, il convient de préciser si vos variables sont alphanumériques ou numériques. Dans le cas précédent, elles sont numériques. La commande suivante créera des variables alphanumériques : ARRAY x{5} $; Enfin, il est possible d’assigner à vos variables, si vous les créez, des valeurs initiales. ARRAY bloc1{*} $3. x1-x5 ('a' 'b' 'c' 'd' 'e'); ARRAY bloc2{*} y1-y5 (1,2,3,4,5); Ces valeurs initiales doivent être indiquées entre parenthèses, séparées ou pas par une virgule (par un blanc sinon), entre quotes si vos variables sont alphanumériques. SAS Livre Page 130 Jeudi, 18. septembre 2008 6:03 18 130 ◆ SAS Ici, nous avons souhaité créer des variables alphanumériques d’une longueur de trois. Trois commandes équivalentes permettent d’arriver à ce résultat : ARRAY bloc1{*} $3. x1-x5 ('a' 'b' 'c' 'd' 'e'); ARRAY bloc2{*} $3 z1-z5 ('a' 'b' 'c' 'd' 'e'); ARRAY bloc3{*} $ 3 w1-w5 ('a' 'b' 'c' 'd' 'e'); L’instruction suivante : ARRAY x(5) _TEMPORARY_; vous permet de créer des variables à placer dans un bloc ARRAY sans pour autant conserver vos variables dans votre table finale. Ce type de programmation vous sera utile lors de votre étape DATA, quand vous aurez besoin de variables intermédiaires qui, combinées entre elles, construiront la ou les variables dont vous aurez besoin au cours de votre analyse. Les blocs de variables peuvent aussi être de dimension multiple. Elles se déclarent, pour un bloc à deux dimensions, de la manière suivante : ARRAY mult(9,9) x1-x81; Nous verrons, dans la section suivante, au moyen d’un exemple, l’intérêt de ce type de bloc de variables. 3.7.2 Exemples d’application Un premier exemple simple est donné par le programme 3.56. Programme 3.56 DATA enquete; INFILE 'C:\intro_SAS\fichiers\enquete.txt'; INPUT personne q1-q100; ARRAY ques{100} q1-q100; DO index = 1 TO 100; IF ques{index}=. THEN DELETE; END; RUN; Nous créons une table dans laquelle seuls les individus qui ont répondu aux 100 questions posées subsistent. La boucle DO sur le bloc de variables défini par la commande ARRAY vous épargne l’écriture de 100 lignes de la forme suivante : IF q1=. THEN DELETE; IF q2=. THEN DELETE; Pour le second exemple, nous allons créer une table de données fictives reprenant les notes obtenues par 100 étudiants à leurs examens (9 matières). Programme 3.57 DATA note (DROP=i); ARRAY result(9); DO etu=1 TO 100; DO i=1 TO DIM(result); SAS Livre Page 131 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 131 result(i)=ROUND(RANNOR(25)*2+8+RANUNI(3)*4,0.1); IF RANUNI(14)<0.05 THEN result(i)=.; END; OUTPUT; END; RUN; La commande ARRAY permet la création de 9 variables RESULT1-RESULT9. Pour chacun des 100 étudiants, les notes sont créées par des combinaisons de réalisations de variables aléatoires normales et uniformes. Certaines notes sont ensuite changées en valeurs manquantes (pour créer des défaillants). Vous remarquez que, dans la boucle de création des notes, I varie de 1 à DIM(result). La fonction DIM(bloc) donne la dimension d’un bloc de variables. Ce n’est pas très utile ici mais cette commande aura son utilité quand vos blocs seront de dimensions inconnues (cas des ARRAY bloc{*} _NUMERIC_ par exemple). Une fois que les 9 notes sont calculées pour un étudiant donné, l’instruction OUTPUT demande l’écriture des variables pour l’observation, et on peut déterminer les notes de l’étudiant suivant : c’est parce que l’on souhaite une série de notes par étudiant que l’instruction OUTPUT intervient en bas de la boucle DO sur ETU. Si vous faites intervenir votre instruction OUTPUT en bas de la boucle sur I, 9 observations seront créées pour chaque étudiant. Nous souhaitons maintenant construire une variable alphanumérique qui indiquera les épreuves sur lesquelles les étudiants sont déclarés défaillants. Le programme 3.58 remplit cet objectif : Programme 3.58 DATA note2 (DROP=i def); SET note; LENGTH defaillant $ 20; ARRAY result(9); DO i=1 TO dim(result); IF result(i)=. THEN def=i; ELSE def=.; defaillant=CATX(' ',defaillant,def); END; RUN; Pour un étudiant qui aurait été défaillant aux épreuves 5 et 8, par exemple, on souhaite le résultat suivant : . . . . 5 . . 8 . Il faut déjà déclarer une variable alphanumérique DEFAILLANT d’une longueur suffisante pour pouvoir contenir au moins 17 caractères (9 matières + un blanc entre chaque résultat). Vous remarquez que nous déclarons à nouveau l’ARRAY RESULT. C’est en effet obligatoire puisque les blocs de variables ne sont valables qu’au cours de votre étape DATA : lorsque celle-ci se termine, l’information ARRAY n’est pas sauvée au sein de la table. SAS Livre Page 132 Jeudi, 18. septembre 2008 6:03 18 132 ◆ SAS Ensuite, pour chacune des variables du bloc, si la note est manquante, nous donnerons à la variable DEF le numéro d’ordre de la variable dans le bloc (DEF est valeur manquante sinon) pour ensuite concaténer à la variable DEFAILLANT la valeur de la variable DEF. Dans ce dernier exemple, nous allons utiliser des blocs multidimentionnels. Les notes des étudiants peuvent être regroupées en unités d’enseignement : les notes 1 à 3 appartiennent à l’unité 1, les notes 4 à 6 à l’unité 2 et les notes 7 à 9 à la troisième unité. Nous souhaitons calculer des moyennes par unité d’enseignement. En revanche, la moyenne d’une unité doit être égale à la valeur manquante si l’individu ne s’est pas présenté à un examen de cette unité. Programme 3.59 DATA note3(DROP=i j); SET note2; ARRAY result(3,3); ARRAY moy{*} moy1-moy3; ARRAY def(*) def1-def3; DO i=1 TO dim1(result); moy(i)=0; def(i)=0; DO j=1 TO dim2(result); def(i)+(result(i,j)=.); moy(i)+result(i,j)/3; END; IF def(i)>0 THEN moy(i)=.; END; RUN; Nous savons déjà que nous disposons de 9 variables RESULTS, elles sont ici organisées dans une ARRAY double (ARRAY RESULT(3,3)). Au cours du programme qui suit, si vous appelez l’élément (1 ,1) de ce bloc, vous allez obtenir RESULT1 ; RESULT9 est donc l’élément (3,3). Pour mieux comprendre les variables qui vont être associées à un élément du bloc, vous pouvez imaginer une représentation en forme d’arbre : Ainsi, pour le bloc RESULT(3,3) : dim1 1 1 1 2 2 2 3 3 3 dim2 1 2 3 1 2 3 1 2 3 var result1 result2 result3 result4 result5 result6 result7 result8 result9 SAS Livre Page 133 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 133 Un bloc X(2,3,4) contiendra 24 variables (2 * 3 * 4 = 24) : dim1 dim2 dim3 1 1 1 1 1 2 1 1 3 1 1 4 1 2 1 1 2 2 1 2 3 1 2 4 1 3 1 1 3 2 1 3 3 1 3 4 variable x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 dim1 dim2 dim3 2 1 1 2 1 2 2 1 3 2 1 4 2 2 1 2 2 2 2 2 3 2 2 4 2 3 1 2 3 2 2 3 3 2 3 4 variable x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 Dans le programme 3.59, la première boucle débute par une mise à zéro des variables MOY et DEF. Ensuite, à l’intérieur de la seconde boucle, on construit une variable qui va donner le nombre de défaillances, puis on somme les notes en les divisant par 3. Lorsque la première boucle débute, I=1, la seconde boucle (J=1 TO DIM2(RESULT)) va bien analyser les éléments (1,1), (1,2) et (1,3) du bloc, soit RESULT1, RESULT2 et RESULT3 pour en calculer une moyenne. À la sortie de la boucle sur J, nous disposons d’une moyenne, calculée au moyen d’une incrémentation et d’un nombre de défaillances sur l’unité d’enseignement. La moyenne calculée n’est cependant pas bonne si l’étudiant est défaillant à au moins une épreuve : en effet, lorsqu’on construit une variable au moyen d’une incrémentation, si des valeurs manquantes se trouvent parmi les modalités, le processus d’incrémentation les considère comme égales à 0 (voir section 3.4.2.). Ce que nous souhaitons, c’est qu’en cas de défaillance, la moyenne ne soit pas calculée mais qu’elle soit égale à valeur manquante. Exercice 3.10 : Modifiez la programmation que vous avez utilisée dans l’exercice EXAMEN.TXT en utilisant les boucles DO sur ARRAY. Exercice 3.11 : Suite à une innovation pédagogique, les unités d’enseignement ont été redéfinies : pour obtenir la moyenne de l’unité 1, vous devez maintenant calculer la moyenne des notes 1, 4 et 7. L’unité 2 regroupe les notes 2, 5 et 8, l’unité 3 regroupe les notes 3, 6 et 9. Modifiez le programme 3.59 de façon à recalculer correctement les moyennes des notes obtenues pour les trois unités. Exercice 3.12 : Reprenez le programme 3.57 en retirant la ligne qui crée des notes défaillantes. Une nouvelle réforme pédagogique vient d’intervenir : les notes font l’objet de pondérations différentes : les notes 1, 5 et 9 sont pondérées avec un coefficient 3 ; les notes 2, 4 et 8 sont pondérées avec un coefficient 2 ; les notes 3, 6 et 7 sont pondérées avec un coefficient 1. Les blocs d’enseignement restent ceux définis dans le programme 3.59. Calculez les moyennes obtenues à chacun des blocs. SAS Livre Page 134 Jeudi, 18. septembre 2008 6:03 18 134 ◆ SAS Exercice 3.13 : Un bloc de variables a été créé au moyen de l’instruction suivante : ARRAY Y(3,3,5); 1. Combien de variables sont présentes dans ce bloc de variables ? 2. Quel est le nom de la variable qui correspond aux éléments (1,3,5), (2,2,4), (3,3,4) de ce bloc ? 3.8 Donner une mémoire à SAS Nous avons vu qu’en traitant les informations une par une, au moment de traiter une donnée, SAS n’avait aucun souvenir de la donnée précédente (voir section 3.1.5.). Il existe cependant certaines fonctions qui forcent SAS à conserver une trace des valeurs établies pour des observations déjà traitées. SAS est donc capable de « se souvenir ». Toutefois, les limites de cette capacité sont réelles. 3.8.1 La commande RETAIN Cette commande RETAIN permet à SAS de se rappeler la valeur prise par une variable donnée pour une observation précédente. Imaginons que nous disposons d’une table que nous pensons triée de façon croissante sur une variable X donnée. Nous souhaitons pouvoir vérifier que ce tri est juste : Programme 3.60 DATA test; INPUT X @@; CARDS; 1 2 4 3 7 6 ;RUN; DATA test; SET test; RETAIN lastx .; IF x < lastx THEN PUT "l’observation n’est pas dans l’ordre, x=" x; ELSE lastx = x; RUN; Pour que SAS ait une mémoire, il faut modifier le fonctionnement du PDV et empêcher le RESET qui remet les champs du PDV en valeurs manquantes avant que SAS ne traite une nouvelle observation. C’est ce que permet l’instruction RETAIN. Il est possible de préciser la valeur de LASTX avant que SAS n’aborde la première observation. Dans le programme 3.60, LASTX est égal à valeur manquante. Quand SAS aborde le premier individu, il regarde si LASTX est bien inférieur à la modalité de X de cet individu (c’est bien le cas puisque la valeur manquante est inférieure à tout) – le THEN ne s’applique donc pas et c’est le ELSE qui va s’appliquer : SAS fixe donc une nouvelle valeur à LASTX égale à la valeur de X constatée pour le premier individu. SAS Livre Page 135 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 135 Comme LASTX est une variable RETAIN, lorsque SAS examine le second individu, il ne vide pas le PDV en mettant toutes les valeurs des variables à valeurs manquantes. Il conserve ainsi la valeur de LASTX égale au X de la première observation. Abordons maintenant la seconde observation : imaginons qu’un X soit inférieur au X du premier individu (l’ordre n’est donc pas respecté). À ce moment-là, le THEN s’applique et l’instruction PUT demande à SAS d’écrire dans la fenêtre JOURNAL un message suivi de la valeur X problématique. 3.8.2 La commande RETAIN alliée aux options FIRST et LAST Comprenons avant tout le fonctionnement des options FIRST et LAST. Il ne s’agit pas ici de commandes mais d’informations construites lorsque vous triez une table en fonction d’une clé. Imaginons que nous disposons d’une table TEST0 dans laquelle il existe une variable qui sert d’identifiant. Au cours d’une première étape, les données sont triées en fonction de cet identifiant au moyen de la procédure PROC SORT. Programme 3.61 DATA test0; INPUT identifiant @@; CARDS; 5 3 4 3 4 4 1 2 ;RUN; PROC SORT DATA=test0; <- demande de tri de la table test0 BY identifiant; <- la clef de tri (tri croissant par défaut)1 RUN; DATA test;SET test0; BY identifiant; IF first.identifiant ^= last.identifiant; RUN; Nous avons ici un programme qui va mettre les individus présents plus d’une fois dans la table dans une table spécifique. Dans l’étape DATA, nous reprécisons la clé de tri par une instruction BY et les variables cachées FIRST et LAST peuvent alors être utilisées. En fait, deux informations sont créées : • FIRST.identifiant vaut 1 si c’est la première fois que SAS voit cette valeur de la variable identifiant et 0 sinon. • LAST.identifiant vaut 1 si c’est la dernière fois que SAS voit cet identifiant (SAS regarde donc « devant »)2 et 0 sinon. Facilitons votre compréhension du programme au moyen de la figure 3.6. 1. PROC SORT sera présenté plus en détail dans la section 4.2.1. 2. Mais c’est un leurre : c’est la procédure PROC SORT qui crée les FIRST et LAST. Par le rappel de la clé de tri, on demande en fait à SAS de ressortir ces informations, issues de PROC SORT. Une étape DATA seule ne peut pas regarder pour une ligne n les informations présentées en ligne n+1. SAS Livre Page 136 Jeudi, 18. septembre 2008 6:03 18 136 ◆ SAS Identifiant first.identifiant last.identifiant résultat 1 1 1 écarté de la table test 2 1 1 écarté de la table test 3 1 0 dans la table test 3 0 1 dans la table test 4 1 0 dans la table test 4 0 0 écarté de la table test 4 0 1 dans la table test 5 1 1 écarté de la table test Figure 3.6 • Illustration du fonctionnement de FIRST et LAST. À l’issue de l’étape DATA, nous savons donc que nous devons regarder de plus près ce qui se passe sur les individus 3 et 4. Gardez à l’esprit que la ligne : IF first.identifiant ^= last.identifiant; est équivalente à : IF first.identifiant = last.identifiant THEN DELETE; IF first.identifiant ^= last.identifiant THEN OUTPUT; Les variables FIRST et LAST alliées à un RETAIN peuvent être particulièrement intéressantes : nous disposons d’une table dans laquelle, pour 3 individus (1, 2 et 3), est donnée une information (variable X) mesurée à divers moments. Ces informations sont reprises dans le tableau suivant. Ind X Ind X Ind X 1 1 1 1 1 1 16 12 19 15 18 17 2 2 2 2 2 10 20 8 14 30 3 3 3 3 59 45 2 18 À partir de la table SAS reprenant ces informations, nous souhaitons pouvoir créer une table dans laquelle, pour chaque individu, nous allons disposer des trois valeurs de X les plus élevées. Le programme s’écrit dans ce cas : Programme 3.621 LIBNAME lib 'C:\intro_SAS\fichiers'; PROC SORT DATA=lib.grp; BY ind; RUN; DATA max; SET lib.grp; BY ind; 1. Vous trouverez la table GRP dans les fichiers exemples de cet ouvrage que vous pouvez télécharger sur le site compagnon : www.sas-sr.com SAS Livre Page 137 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 137 RETAIN x1-x3; IF first.ind THEN DO; x1 = .; x2 = .; x3 = .; END; IF x >= x1 THEN DO; *(1); x3 = x2; x2 = x1; x1 = x; END; ELSE IF x >= x2 THEN DO; *(2); x3 = x2; x2 = x; END; ELSE IF x >= x3 THEN x3 = x;*(3); IF last.ind THEN OUTPUT; KEEP ind x1-x3; RUN; Puisque nous allons utiliser FIRST et LAST, nous devons dans un premier temps rappeler la clé de tri. Les variables X1 à X3 sont des variables RETAIN. Nous ne précisons par leurs valeurs au départ mais par défaut, celles-ci sont égales à valeur manquante. Lorsque c’est la première fois que l’individu est vu, nous demandons une initialisation à valeur manquante des variables X1 à X3. Cette instruction est importante pour traiter correctement les individus 2 et 3. En l’absence de cette instruction, nous pourrions aborder ces individus avec des informations relatives à l’individu précédent. Ensuite, indépendamment du fait que l’observation soit FIRST ou LAST, les commandes IF/ELSE IF ((1) (2) et (3)), expliquées plus en détail à la figure 3.7, s’appliquent. Lorsque sera abordée la dernière observation relative à cet individu, le PDV sera versé dans la table finale. Regardons comment s’appliquent les IF/ELSE IF sur les données de l’individu 1 – les cinq premières colonnes vous donnent l’état du PDV après le traitement des observations relatives à l’individu 1. quelle ligne Commentaires est appliquée ? Ind X X1 X2 X3 1 1 1 16 12 19 . 16 16 19 . . 12 16 . . . 12 (1) (2) (1) 1 15 19 16 15 (3) 1 1 18 17 19 19 18 18 16 17 (2) Initialisation Puisque 16>., 16 est placé en X1 12<16 et 12>., 12 est placé en X2 19>16 et décalage : 12 passe en X3, 16 passe en X2 et 19 est placé en X1 15<19 et 15<16 mais 15>12 : remplacement idem Nous sommes à last.ind=1 : le PDV est envoyé vers la table et SAS peux passer à l’individu 2 Figure 3.7 • Illustration du fonctionnement du programme 3.62. Dans le fichier d’OUTPUT (MAX), il ne nous restera pour l’individu 1 que la variable IND et les variables X1-X3. Il était possible de faire autrement en triant au préalable les données de la table de départ en fonction de IND et de X. On peut même si on le SAS Livre Page 138 Jeudi, 18. septembre 2008 6:03 18 138 ◆ SAS souhaite retenir les six valeurs les plus élevées (ce qui serait délicat avec une programmation analogue à celle examinée précédemment). Programme 3.63 PROC SORT DATA=lib.grp; BY ind DESCENDING x; RUN; Nous demandons un tri à deux clés : 1er clé (IND) croissante et seconde clé (donc à IND identiques) décroissante (variable X). Ensuite : Programme 3.64 DATA test1; SET lib.grp; BY ind; RETAIN x1-x6; IF first.ind THEN DO; x1 = .; x2 = .; x3 = .;x4 = .; x5 = .; x6 = .; END; IF x>=x1 THEN x1=x; ELSE IF x>=x2 THEN x2=x; ELSE IF x>=x3 THEN x3=x; ELSE IF x>=x4 THEN x4=x; ELSE IF x>=x5 THEN x5=x; ELSE IF x>=x6 THEN x6=x; IF last.ind THEN OUTPUT; RUN; On tire avantage du fait que les valeurs de X sont triées par individus. Si vous avez plusieurs clés de tri et que vous souhaitiez faire appel aux fonctionnalités FIRST et LAST sur une autre clé de tri, vous devrez indiquer vos différentes clés. Programme 3.65 PROC SORT DATA=test; BY X1 X2; RUN; DATA test; SET test; BY x1 x2; IF last.x2 .... Dans le cas du programme 3.64, puisque vous n’avez pas indiqué que la table était triée en fonction de IND puis, de manière décroissante, en fonction de X, un appel à FIRST.X ou LAST.X est impossible. Il aurait fallu pour cela indiquer : BY ind DESCENDING x ; Exercice 3.14 : Le fichier ÉLECTION2002.TXT, sur quatre colonnes, donne les résultats du premier tour de l’élection présidentielle de 2002. La première variable est le département (codé en deux chiffres ou deux lettres), la seconde est le département en toutes lettres, puis le nom du candidat et enfin le pourcentage des votes exprimés SAS Livre Page 139 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 139 que ce candidat a réalisé dans le département en question. Le séparateur des modalités est le « ; ». 1. Sur la base de ce fichier, créez une table SAS (révision). 2. Créez une seconde table dans laquelle vous pourrez lire pour chaque candidat les noms des trois départements dans lesquels ils ont réalisé les scores les plus importants ainsi que ce score. 3.8.3 Faire référence à des valeurs passées Dans les cas les plus simples, vous n’aurez pas besoin de RETAIN. Vous disposez d’une série Xt et vous souhaitez calculer Yt = Xt + Xt-1. La fonction LAG suffira : Programme 3.66 DATA test; SET test; x_1=LAG(x); y=x+x_1; RUN; La fonction LAG est cependant piégeuse comme va vous le montrer le programme 3.67. La variable X doit être considérée comme un identifiant ; Y est la variable à analyser. Programme 3.67 DATA test; INPUT X Y; CARDS; 1 1 1 2 1 3 1 4 2 1 2 2 2 3 2 4 3 1 3 2 3 3 3 4 ;RUN; PROC SORT DATA=test; BY X Y; RUN; DATA test;SET test; BY X Y; IF first.X THEN dif_Y=Y; ELSE dif_Y=Y-LAG(Y); RUN; Le programme présenté ici cherche à calculer la différence entre le Y de l’observation et le Y de l’observation précédente si celle-ci est relative au même individu (saisi par SAS Livre Page 140 Jeudi, 18. septembre 2008 6:03 18 140 ◆ SAS la variable X). DIF_Y doit être égal à Y si ce n’est pas le cas. Avec les données de la table TEST construite par le programme 3.67, DIF_Y doit donc être égal à 1 quelle que soit l’observation. Vous examinez le programme et vous vous dites qu’il doit parfaitement fonctionner. Exécutez ce programme, puis demandez un PROC PRINT. Vous verrez que cela ne fonctionne pas : Résultat 3.9 Obs X Y 1 2 3 4 5 6 7 8 9 10 11 12 1 1 1 1 2 2 2 2 3 3 3 3 1 2 3 4 1 2 3 4 1 2 3 4 dif_Y 1 . 1 1 1 -2 1 1 1 -2 1 1 Pourquoi ? Parce que, SAS fonctionne ligne de données par ligne de données et que, une fois la ligne passée, s’il n’a pas mis d’informations en réserve, il ne peut pas revenir en arrière. SAS ne fait que vous en donner l’impression. Comprenons ce qui se passe en interne. Lorsque SAS passe sur la première observation, le ELSE ne s’applique pas, il ne sait donc pas qu’il va devoir conserver dans le PDV la valeur de la variable Y comme une commande RETAIN pourrait le faire. Lorsqu’il arrive sur la seconde observation, comme à la précédente observation, il ne sait pas qu’il va devoir retarder la variable Y (et donc conserver sa valeur dans le PDV) ; lorsqu’on lui demande LAG(Y), il renvoie « valeur manquante » et, par conséquent, 2 – valeur manquante = valeur manquante. En revanche, comme le ELSE s’applique, il met en réserve la valeur de Y au cas où on la lui demanderait plus tard. Lors de l’examen de la troisième observation, puisque le ELSE s’applique, il ressort la valeur de Y qu’il a vue lors de la deuxième observation pour calculer DIF_Y. Passons à la cinquième observation : le ELSE ne s’applique pas et donc, en interne, la valeur réservée pour LAG(Y) et qui subsiste dans PDV pour le Y observé n’est pas modifiée. Ainsi, lorsqu’il arrive à la sixième observation, pour calculer DIF_Y, il va utiliser la valeur de LAG Y qu’il connaît et donc la valeur observée pour la quatrième observation, d’où : DIF_Y : 2 – 4 = -2 Prenez garde lorsque vous employez la fonction LAG (ou DIF, puisque le principe est le même). Si vous utilisez LAG pour construire une variable sans condition (X=LAG(Y)), vous ne devriez avoir aucun problème. Maintenant, si vous utilisez LAG à l’intérieur de la construction d’une variable avec condition, vous n’obtiendrez pas ce que vous souhaitez. Vous écrirez donc plutôt des programmes qui auront cette forme (pour aboutir au résultat que l’on souhaitait au départ) : Programme 3.68 DATA test; SET test; BY X Y; dif_y=y-LAG(y); SAS Livre Page 141 Jeudi, 18. septembre 2008 6:03 18 La modification des tables SAS ◆ 141 IF first.X THEN DO; dif_Y=Y; END; RUN; 3.9 Les listes de variables Lorsque vous créez une table SAS ou lorsque vous utilisez une procédure pour analyser votre table, vous pouvez être amené à avoir besoin de lister un nombre important de variables. Plutôt que d’écrire toutes ces variables séparées par un espace, vous pouvez utiliser les possibilités offertes par les listes de variables. 3.9.1 Première possibilité La commande INPUT suivante est parfaitement valide : INPUT x1-x5; Elle est équivalente à cette commande : INPUT x1 x2 x3 x4 x5; Il existe en fait interne à SAS des possibilités de créer des listes de variables. Ainsi, si vous souhaitez créer 30 variables, vous pouvez soit en écrire la liste (perte de temps), soit créer une liste tout simplement en appelant X1-X30 (ou VAR1-VAR30). Ici, nous utilisons des listes avec des préfixes identiques. Il est possible de demander des statistiques simples sur les variables X1-X30 par la procédure PROC MEANS (voir section 6.2. pour plus de détails sur cette procédure). Vous pouvez écrire : Programme 3.69 PROC MEANS DATA=test; VAR x1-x30; RUN; 3.9.2 Deuxième possibilité : Imaginons que votre table contienne l’ensemble de variables suivant : xfgr xhdt xbvr xmpo xpel Si vous demandez des statistiques simples par la procédure PROC MEANS sur ces variables, vous pouvez soit écrire : Programme 3.70 PROC MEANS DATA=test; VAR xlddk xpoiu xhrnj xrega xlsgr; RUN; Soit (et vous gagnez du temps) PROC MEANS DATA=test; VAR x:; RUN; SAS Livre Page 142 Jeudi, 18. septembre 2008 6:03 18 142 ◆ SAS Merci de noter les « : » après le X. Toutes les variables dont le nom commence par X seront traitées. 3.9.3 Troisième possibilité Les listes prédéfinies par SAS : _NUMERIC_ : appellera toutes les variables numériques. _CHARACTER_ : appellera toutes les variables alphanumériques. _ALL_ : appellera toutes les variables. 3.9.4 Quatrième possibilité Nous avons créé une table SAS avec la ligne INPUT suivante : INPUT a b c $ d e f $ g h i $; • Si vous avez besoin d’appeler les variables entre B et G : B--G. . • Si vous ne voulez que les variables numériques entre B et G : B -NUMERIC- G. Attention : pour les blocs de variables saisies par « -- », ce n’est pas l’ordre alphabétique qui est ici utilisé pour créer ces blocs mais l’ordre des variables dans votre table SAS. Si vous ignorez cet ordre, vous pouvez le retrouver au moyen d’un PROC CONTENTS (procédure qui vous permet de voir la structure d’une table). Programme 3.71 PROC CONTENTS DATA=test POSITION; RUN; L’option POSITION permet un affichage des variables présentes dans une table dans leur ordre d’enregistrement (#). Ainsi, vous obtiendrez un résultat proche du résultat 3.10. Résultat 3.10 -----Alphabetic List of Variables and Attributes----# Variable Type Len Pos ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 3 hrnj Num 8 16 1 lddk Num 8 0 5 lsgr Num 8 32 2 poiu Num 8 8 4 rega Num 8 24 -----Variables Ordered by Position----# Variable Type Len Pos ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 1 lddk Num 8 0 2 poiu Num 8 8 3 hrnj Num 8 16 4 rega Num 8 24 5 lsgr Num 8 32 Si vous appelez HRNJ--REGA, vous n’obtiendrez un traitement que sur les variables HRNJ (position 3) et REGA (position 4). SAS Livre Page 143 Jeudi, 18. septembre 2008 6:03 18 4 Combiner les tables SAS Au sommaire de ce chapitre : 4.1. Ajouter des individus 4.2. Ajouter des variables 4.3. La mise à jour : commande UPDATE 4.4. Les marqueurs : un outil pouvant se révéler utile dans les phases de merge Les informations dont vous pourriez avoir besoin pour mener votre analyse peuvent être présentes dans plusieurs tables et vous pourriez avoir besoin de réunir ces informations au sein d’une même table. Dans ce cadre, trois cas typiques sont possibles : • Soit vous souhaitez ajouter des observations (de nouveaux individus). • Soit vous souhaitez ajouter des informations (de nouvelles variables). • Soit vous souhaitez mettre à jour certaines informations. Il convient de bien savoir ce que vous souhaitez faire puisque, nous allons le montrer dans les sections qui suivent, le type de programmation à mettre en œuvre dépend clairement de votre objectif. Il est, dans tous les cas, indispensable de bien connaître vos tables avant de tenter de les combiner. 4.1 Ajouter des individus Il s’agit ici de construire une table contenant « plus de lignes ». Imaginons, cas simple, que les tables que vous souhaitez réunir aient exactement la même structure : les noms des variables présentes dans les deux tables sont identiques et mesure bien des choses identiques (si X1 mesure l’âge dans une table, il mesure bien aussi l’âge dans l’autre). Dans ce cas, la procédure à suivre est simple : Programme 4.11 DATA test; SET test1 test2; RUN; 1. Les programmes présentés dans ce chapitre ne proposent pas les phases de constructions des tables nécessaires à leur exécution. Vous retrouverez sur le site compagnon ces programmes complets : www.sas-sr.com SAS Livre Page 144 Jeudi, 18. septembre 2008 6:03 18 TEST1 144 ◆ SAS ID X1 1 2 3 4 5 6 A B C D E F ID X1 7 8 9 10 11 12 G H I J K L TEST2 SET test1 test2 ; ID X1 1 2 3 4 5 6 7 8 9 10 11 12 A B C D E F G H I J K L Figure 4.1 • Ajouter des individus – SET. TEST1 Et si la table n’a pas la même structure, que se passe-t-il ? Vous disposez d’une variable ID commune mais la seconde variable, qui pourtant mesure la même chose dans les deux tables, se nomme X1 dans la première et X2 dans la seconde table. En relançant le programme 4.1, vous obtiendrez une table qui a la structure représentée par la figure 4.2. ID X1 1 2 3 4 5 6 A B C D E F ID X2 7 8 9 10 11 12 G H I J K L TEST2 SET test1 test2 ; ID X1 1 2 3 4 5 6 7 8 9 10 11 12 A B C D E F X2 G H I J K L Figure 4.2 • Instruction SET – variables non communes. Pour résoudre ce problème, vous devez procéder comme vous le montre le programme 4.2. Programme 4.2 DATA test; SET test1 test2 (RENAME = (x2=x1)); RUN; Il est ici demandé ici à SAS de renommer dans la table TEST2 la variable X2 et de l’appeler maintenant X1 (structure « ancien nom » = « nouveau nom »). Si vous souhaitez en même temps renommer la variable ID en IDENT : SAS Livre Page 145 Jeudi, 18. septembre 2008 6:03 18 Combiner les tables SAS ◆ 145 Programme 4.3 DATA test; SET test1 (RENAME = (id=ident)) test2 (RENAME = (x2=x1 id=ident)); RUN; TEST2 TEST1 Vous pouvez aussi demander à ce qu’au moment de la réunion des deux tables, les observations d’une table soient insérées dans la seconde table en fonction de la valeur prise par une variable, commune aux deux tables. ID X1 1 2 5 5 6 8 A B C D E F ID X1 1 3 5 7 10 10 G H I J K L SET test1 test2 ; BY id ; ID X1 1 1 2 3 5 5 5 6 7 8 10 10 A G B H C D I E J F K L Figure 4.3 • Instructions SET et BY. Pour réaliser ce type de réunion de table, il faut au préalable que les deux tables soient triées en fonction de la variable commune (ID dans la figure 4.3). Le résultat que vous obtenez dépend de l’ordre dans lequel les tables sont présentées dans l’instruction SET. Ainsi, le résultat présenté ci-dessus est obtenu via une instruction SET TEST1 TEST2. SAS lit d’abord les informations de TEST1. Dans TEST2, si une observation contient le même identifiant, elle est placée à la suite de celle(s) de TEST1. Bien entendu, avec une instruction SET TEST2 TEST1, le résultat différera un peu. Pour arriver au même résultat, il demeure possible de réunir les deux tables au moyen d’un SET TEST1 TEST2, sans instruction BY, pour ensuite demander un PROC SORT sur la variable commune aux deux tables. 4.2 Ajouter des variables Vous disposez maintenant de deux tables présentant des informations différentes pour un même individu. Il s’agit donc de constituer une table qui contiendra l’ensemble des informations relatives aux individus. La réunion des deux tables va s’effectuer en fonction de variable(s) commune(s) que l’on appelle clé(s). La réunion de deux tables commence toujours par une procédure de tri des tables en fonction de la ou des clés. SAS Livre Page 146 Jeudi, 18. septembre 2008 6:03 18 146 ◆ SAS 4.2.1 PROC SORT PROC SORT est la procédure qui permet de trier une table en fonction des valeurs prises par une variable. Nous avons déjà utilisé cette procédure, notamment dans les programmes 3.62, 3.63, 3.65 et 3.67. PROC SORT DATA=test; BY ind DESCENDING x; RUN; Deux clés de tri sont précisées ici. Le tri est par défaut croissant ou par ordre alphabétique si votre clé est une variable alphanumérique. Plusieurs options, à préciser dans la ligne PROC SORT, peuvent s’avérer utiles : OUT= Pour créer une nouvelle table SAS triée – la table de départ n’est pas modifiée. TAGSORT Option à privilégier si vous avez une table de très grande taille à trier – SAS ne trie dans ce cas que les clés de tri et le numéro de l’observation – il joindra ce prétri aux autres données ensuite. Cette option ne vous fait pas forcément gagner du temps mais elle économise de la place sur le disque dur. Les procédures de tri demandent beaucoup d’espace sur un disque dur ; si votre table fait 1 Go, vous devez disposer d’au moins de 3 Go d’espace libre1. NODUPKEYS Les observations en double (mêmes valeurs aux modalités de tri) sont effacées – seule la première observation qui propose un certain jeu de valeurs aux variables de tri est conservée dans la table finale (fonctionne différemment dans un environnement VMS). NODUPRECS (ou NODUP) Les observations en double (mêmes valeurs pour l’ensemble des variables dans ta table) peuvent être effacées – ce n’est pas certain à moins d’effectuer un tri sur l’ensemble des variables de la table. Avant d’écrire une observation dans la table finale, SAS regarde si l’observation précédente n’est pas exactement identique à celle qu’il s’apprête à écrire. Si c’est le cas, il n’écrit pas la nouvelle observation. Attention, SAS ne regarde pas l’ensemble des observations déjà écrites dans la table avant de choisir s’il écarte ou pas l’observation courante. Depuis SAS 9.2, une nouvelle option très intéressante est proposée : PRESORTED SAS analyse votre table afin de voir si elle n’est pas déjà triée. Si elle ne l’est pas, le tri sera effectué. C’est une option intéressante quand les tables sont très volumineuses. Les procédures de tri sont très gourmandes en ressources et il arrive souvent que l’on trie une table alors que celle-ci est déjà triée. 1. Une autre option possible pour économiser de la place sur le disque dur est OVERWRITE qui permet d’effacer la table de départ avant que la table triée ne soit écrite. Cette option est extrêmement dangereuse et ne doit être utilisée que si vous avez une copie de secours de votre table. Quand SAS trie une table, il conserve la table de départ : en cas de problème, vous ne perdez pas celle-ci. Avec OVERWRITE, en cas de problème, votre table est perdue. SAS Livre Page 147 Jeudi, 18. septembre 2008 6:03 18 Combiner les tables SAS ◆ 147 4.2.2 MERGE – Cas standard Le cas standard est résumé par la figure 4.4. TEST1 AN X1 2002 2003 2004 2006 2007 2008 A B C D E F TEST2 AN X2 2001 2002 2003 2004 2005 2006 1 2 3 4 5 6 AN X1 MERGE test1 test2 ; BY an ; 2001 2002 2003 2004 2005 2006 2007 2008 A B C D E F X2 1 2 3 4 5 6 . . Figure 4.4 • MERGE – cas standard. Les procédures qui suivent doivent être suivies scrupuleusement : Pour pouvoir réunir deux tables, il faut que celles-ci contiennent des informations sur des ensembles similaires d’individus et que ces individus soient saisis par un identifiant commun. La procédure à suivre est, dans ce premier cas, présentée par le programme 4.4. Programme 4.4 PROC SORT DATA=test1; BY an; RUN; PROC SORT DATA=test2; BY an; RUN; DATA mergb; MERGE test1 test2; BY an; RUN; Il est démandé à SAS de trier les tables à réunir en fonction de la variable commune (identifiant), ici AN. Ensuite, une table MERGB, résultat d’un MERGE entre TEST1 et TEST2, doit être créée. Via BY AN, nous indiquons à SAS que la variable commune aux deux tables est AN et qu’il doit appairer les informations en fonction des modalités prises par cet identifiant. Exercice 4.1 : Réunissez les fichiers TAILLE.TXT et CHEVEUX.TXT qui contiennent les mêmes individus mais qui offrent chacun des informations différentes (structure : identifiant individuel et information). SAS Livre Page 148 Jeudi, 18. septembre 2008 6:03 18 148 ◆ SAS Si vous oubliez un élément de la programmation, vous risquez de rencontrer de sévères problèmes : • Premier cas. Vous oubliez de réaliser les tris en fonction de vos identifiants : SAS ne réalisera pas le MERGE. Une instruction BY apparaît dans le programme et, comme pour tout programme contenant un BY, si la ou les tables ne sont pas triées au préalable, SAS ne peut pas exécuter le programme. • Second cas. Vous ne mettez pas le BY identifiant dans le programme de MERGE. SAS réalisera quand même le MERGE mais vous aurez une chance relativement élevée d’obtenir n’importe quoi. Sans instruction BY, la procédure MERGE indique à SAS de mettre deux tables l’une à côté de l’autre. Nous reprenons le cas des tables de la figure 4.4. TEST1 AN X1 2002 2003 2004 2006 2007 2008 A B C D E F TEST2 AN X2 2001 2002 2003 2004 2005 2006 AN X1 MERGE test1 test2 ; BY an ; 1 2 3 4 5 6 2001 2002 2003 2004 2005 2006 A B C D E F X2 1 2 3 4 5 6 Figure 4.5 • MERGE et oubli de l’instruction BY. Ne pas indiquer de variable BY ne pose pas de problème si : 1. Les données ont été triées. 2. Les deux tables offrent des informations pour exactement les mêmes individus. Si une des conditions n’est pas respectée, le MERGE sera effectué mais le résultat sera toujours hasardeux. Dans le cas de la figure 4.5, les variables X1 et X2 apparaissent dans l’ordre dans lequel elles sont dans les tables TEST1 et TEST2. La variable AN, commune aux deux tables, apparaît telle qu’elle est dans la table TEST2. Si vous inversez l’ordre des tables dans l’instruction MERGE, les années seront telles qu’elles apparaîtront dans la table TEST1. 4.2.3 Le cas des séries temporelles La réunion en passant par un BY est là aussi nécessaire. La variable citée par l’instruction BY est, bien entendu, l’identifiant temporel. Exercice 4.2 : Vous travaillerez pour cet exercice sur les données des fichiers MAGA1.TXT et MAGA2.TXT. Les deux fichiers offrent quatre variables : Structure du fichier MAGA1.TXT : jours – mois – année – X1 Structure du fichier MAGA2.TXT : jours – mois – année – X2 Merger les deux tables – vous n’avez pas le droit d’utiliser la fonction MDY. SAS Livre Page 149 Jeudi, 18. septembre 2008 6:03 18 Combiner les tables SAS ◆ 149 4.2.4 Merger des tables de dimensions différentes L’exercice 4.3 doit vous permettre de comprendre ce que l’on entend par « dimensions différentes ». Exercice 4.3 : Vous travaillerez pour cet exercice sur les données des fichiers EMPLOYE.TXT et ETABLISSEMENT.TXT. EMPLOYE.TXT offre des informations sur les salariés qui travaillent dans divers établissements d’une même entreprise. Vous devez intégrer à la table des salariés les informations relatives aux établissements. Structure du fichier EMPLOYE.TXT : nom – X1 – X2 – établissement. Structure du fichier ETABLISSEMENT.TXT : Etablissement – E1 – E2. Créez les deux tables, puis réunissez-les. 4.2.5 Quelques sources de problème en cas de MERGE Les cas évoqués jusqu’ici sont des cas d’école mais, dans la réalité, les choses sont généralement un peu plus compliquées. Vos principales difficultés seront liées à la présence dans vos deux tables de variables portant exactement le même nom mais qui ne peuvent pas être considérées comme des clés de réunion. Si ces variables, communes aux deux tables, mesurent des choses différentes, vous passerez par des instructions de type RENAME comme nous l’avons indiqué dans la section 4.1. Maintenant, si vos variables mesurent la même chose, il est indispensable que vous interveniez sur vos tables avant de les réunir. Le programme 4.5 crée deux tables problématiques : Programme 4.5 DATA table1 (KEEP = date action1 action3) table2 (KEEP = date action1 action2); DO date='1jan2007’d TO '31dec2007’d; action1=RANNOR(125)*10+150; temp=ROUND(RANUNI(22)); action2=RANNOR(254)*15+1542; action3=RANNOR(458)*5+50; OUTPUT table1; action1=action1+temp; OUTPUT table2; END; RUN; DATA table2;SET table2; IF date >'30sep2007’d; RUN; Dans TABLE1, nous disposons pour une série de dates, du cours de deux actions : l’action 1 et l’action 3. Dans TABLE2, pour une série de dates plus courte (il manque le 4e trimestre), le cours de l’action 2 est observé ainsi que, une nouvelle fois, le cours de l’action 1. Attention cependant : il existe quelques différences entre les deux séries de cours de l’action 1 (en moyenne une ligne sur deux, le cours de l’action 1 est augmenté de 1 par rapport aux cours observés dans la TABLE1). La variable ACTION1 est donc présente dans les deux tables, sur des périodes différentes ; elle mesure la même chose, SAS Livre Page 150 Jeudi, 18. septembre 2008 6:03 18 150 ◆ SAS mais peut prendre des modalités différentes selon la table. Bien entendu, seule une de ses séries est bonne. Si vous exécutez le programme de MERGE standard : Programme 4.6 PROC SORT DATA=table1; BY date; RUN; PROC SORT DATA=table2; BY date; RUN; DATA table_a; MERGE table1 table2; BY date; RUN; Vous obtiendrez bien une réunion des deux tables. Maintenant, quel cours de l’action 1 avez-vous ? Celui de la table 1 ou celui de la table 2 ? En fait, vous aurez le cours proposé par la seconde table de l’instruction MERGE. Si votre commande MERGE est plutôt : Programme 4.7 DATA table_b; MERGE table2 table1; BY date; RUN; Le cours de l’action 1 sera celui de TABLE1. Vous avez donc peut-être écrasé la bonne information. Dans TABLE2, il manque les données du 4e trimestre. Si vous examinez votre table complète, quel que soit le programme de MERGE utilisé, la série de cours d’action 1 sera toujours complète. Ainsi, lorsque vous demandez : MERGE table1 table2; la variable ACTION1 sera égale à ce que l’on observe sur les trois premiers trimestres dans TABLE2 et pour le dernier trimestre, il prendra les données de TABLE1. Avant tout MERGE de tables, merci de vous assurer que seules la ou les variables clés de mergeage sont communes aux tables que vous souhaitez réunir. Si ce n’est pas le cas, passez par des RENAME, puis une fois que les tables sont réunies, examinez vos deux variables mesurant la même chose et déterminez celle que vous souhaitez conserver. 4.2.6 La nature des variables clés de réunion de deux tables Si maintenant seule votre clé de réunion est commune à vos deux tables, vous pouvez rencontrer une dernière difficulté si l’une est enregistrée sous la forme d’une variable alphanumérique et l’autre sous la forme d’une variable numérique. Sur la base des tables créées lors de la section précédente, exécutez ce programme : SAS Livre Page 151 Jeudi, 18. septembre 2008 6:03 18 Combiner les tables SAS ◆ 151 Programme 4.81 DATA table1b; SET table1 (DROP=action1); FORMAT date ddmmyy10.; RUN; DATA table2b;SET table2 (RENAME=(date=date2)); date=PUT(date2,ddmmyy10.); DROP date2 action1; RUN; Si vous regardez maintenant vos deux tables au moyen d’un PROC PRINT, vous vous dites qu’il n’y a aucun problème. Votre MERGE ne fonctionnera cependant pas puisque dans la table TABLE2B, la variable DATE est alphanumérique. Si vous tentez maintenant malgré tout un MERGE, vous observerez dans votre fenêtre JOURNAL le message d’erreur suivant : ERREUR: La variable date a été définie comme alphanumérique et numérique. Il convient donc aussi de vous assurer que vos variables clés sont de même type. La question de la nature de la variable clé de réunion ne posera enfin lorsqu’il vous semblera qu’il n’y a pas de variable clé de réunion. Ce sera par exemple le cas dans l’exercice 6.1 (voir section 6.2.). Il vous faudra alors créer, dans les deux tables à réunir, une variable à modalité unique, puis utiliser cette variable comme clé de réunion. 4.3 La mise à jour : commande UPDATE Dans ce cas, vous disposez d’une table de base qu’il est possible de mettre à jour en y intégrant les informations contenues dans une seconde table. Dans ce cas, vous devez pouvoir ajouter certaines informations relatives notamment aux dernières périodes, mais aussi modifier certaines informations auxquelles on a apporté une correction dernièrement (par exemple, votre table de départ, portant sur une entreprise, ne propose qu’un chiffre d’affaires approximatif pour le mois de juillet et vous ne disposez pas d’information sur le chiffre d’affaires du mois d’août). Par exemple, deux tables sont créées à partir des fichiers bruts UPDATEMASTER.TXT et UPDATEMAJ.TXT : Résultat 4.1 Table MASTER Numm 1 2 3 4 5 6 7 Tables MAJ Mois CA Numm Janvier Février Mars Avril Mai Juin Juillet 30 35 37 35 39 40 36 5 6 7 8 Mois CA Mai Juin Juillet Aout . 39 38 41 1. La fonction PUT utilisée par ce programme est décrite dans la section 5.3.7. SAS Livre Page 152 Jeudi, 18. septembre 2008 6:03 18 152 ◆ SAS Pour mettre à jour la table MASTER au moyen des informations contenues dans UPDATE, la procédure à suivre est présentée par le programme 4.9 et le résultat est illustré par la figure 4.6. Programme 4.9 PROC SORT DATA=master; BY numm; RUN; PROC SORT DATA=maj; BY numm; RUN; DATA master; UPDATE master maj; BY numm; RUN; La commande UPDATE MASTER MAJ ; indique de mettre à jour la table MASTER au moyen des informations contenues dans MAJ. L’ordre dans lequel vos tables sont citées est donc extrêmement important. Vous obtenez à l’issue de ce programme : MASTER Numm X1 1 2 3 4 5 6 7 Janvier Février Mars avril Mai Juin Juillet Numm X1 MAJ CA 30 35 37 35 39 40 36 CA Numm X1 UPDATE master maj ; BY numm ; 1 2 3 4 5 6 7 8 Janvier Février Mars avril Mai Juin Juillet Aout CA 30 35 37 35 39 39 38 41 . 5 Mai 6 Juin 39 7 Juillet 38 8 Aout 41 Figure 4.6 • La mise à jour. SAS n’a pas effacé les données propres au mois de mai ; il a modifié les saisies dans la table des mois de juin et de juillet ; enfin, il a ajouté les données relatives au mois d’août qui n’apparaissaient pas dans la table initiale. Exercice 4.4 : Vous travaillerez sur les données des fichiers MASTER.TXT, MAJ-A.TXT et MAJ-B.TXT. Une entreprise dispose de deux établissements A et B dont elle suit les résultats sur deux variables X1 et X2 dans le fichier MASTER. Les comptables des deux établissements vous font parvenir des données permettant la mise à jour de MASTER. Structure du fichier MASTER.TXT : année – établissement – X1 – X2 Structure du fichier MAJ-A.TXT : année – X1 – X2 Structure du fichier MAJ-B.TXT : année – X1 – X2 Réalisez cette mise à jour – les choses sont moins simples qu’il n’y paraît… SAS Livre Page 153 Jeudi, 18. septembre 2008 6:03 18 Combiner les tables SAS ◆ 153 4.4 Les marqueurs : un outil utile dans les phases de MERGE SAS vous offre la possibilité de créer au cours de vos étapes de MERGE (ou vos étapes UPDATE) des marqueurs indiquant l’origine de l’information. Vous pourrez ainsi voir dans votre table finale pour chaque individu si les informations dont vous disposez viennent de la première table, de la seconde ou des deux. Attention, ces marqueurs sont internes à SAS : il n’y a pas création à proprement parler de variables mais SAS gardera une trace de l’origine des données pour des traitements ultérieurs. Programme 4.10 PROC SORT DATA=syndicat; BY salarie; RUN; PROC SORT DATA=note; BY salarie; RUN; DATA ensemble; MERGE syndicat(IN=in1) note(IN=in2); BY salarie; IF in1 AND in2 THEN origine='double'; ELSE IF in1 THEN origine='un'; ELSE IF in2 THEN origine='deux'; IF origine='deux' THEN syndicat='non'; RUN; Nous réalisons ici un MERGE presque classique en triant dans un premier temps les tables en fonction de la variable sur laquelle se fera l’appariement (ici SALARIE). Nous demandons par l’instruction IN de créer un marqueur IN1, qui sera égal à 1 dans la table finale ENSEMBLE pour les individus présents dans la table SYNDICAT, et un second marqueur IN2, qui sera égal à 1 dans la table ENSEMBLE pour les individus présents dans la table NOTE). La variable ORIGINE est ensuite créée : elle vaut ‘double’ si l’individu était présent dans les deux tables, ‘un’ si l’individu n’était présent que dans la première table et ‘deux’ si l’individu n’était présent que dans la seconde table. Bien entendu, les individus présents dans la second table mais absents de la première présentent pour la variable SYNDICAT une valeur manquante, remplacée par la dernière instruction avant le RUN par la modalité ‘non’. Exercice 4.5 : Dans les fichiers SCORES1.TXT et SCORES2.TXT, vous disposez pour un ensemble d’individus de notes à l’examen « économétrie » (dans scores1) et de notes à l’examen « statistiques non paramétriques » (dans scores2). Vous devez créer deux tables : dans la première table, vous n’observerez que les étudiants qui ont eu une note aux deux examens. Dans la seconde table, doivent se retrouver les individus qui n’ont passé qu’un examen sur les deux. Créez ces tables. Structure du fichier SCORES1.TXT : identifiant – note Structure du fichier SCORES2.TXT : identifiant – note SAS Livre Page 154 Jeudi, 18. septembre 2008 6:03 18 SAS Livre Page 155 Jeudi, 18. septembre 2008 6:03 18 5 Faciliter la gestion des tables SAS Au sommaire de ce chapitre : 5.1. La procédure PROC CONTENTS 5.2. Les LABEL 5.3. L’attribution d’un FORMAT 5.4. La longueur de l’enregistrement des variables numériques 5.5. La gestion des tables 5.6. La gestion des options Vous allez très vite avoir sur votre ordinateur de très nombreuses tables SAS construites il y a plus ou moins longtemps. Vous pourrez avoir des difficultés à gérer concrètement vos diverses tables. Voici quelques exemples de problèmes que vous risquez de rencontrer : • Dans cette version de la table, est-ce que cette variable si importante est présente ? • Le nom de variable SDRRF vous semblait, lorsque vous l’avez construite, parfaitement en accord avec la signification concrète de cette variable mais vous l’avez oubliée. • Cette variable peut prendre comme modalité 1, 2, 3 et 4. Chacune des modalités a une signification concrète mais vous ne remettez plus la main sur la feuille de papier qui vous sert de dictionnaire de variables. • En raison d’un nombre de variables de plus en plus important, votre table prend trop de place sur votre disque dur, ce qui rend sa manipulation très délicate, voire impossible. • Cette table existe sous de multiples formes, plus ou moins évoluées, et vous ne savez plus quelles sont les versions temporaires de travail et quelle table doit être exploitée. • Le programme que vous venez de soumettre n’était pas correct et son exécution vous a fait perdre des informations importantes parce que la table créée avait le même nom que la table de départ. Si vous rencontrez ces problèmes, c’est que vous n’avez pas mis en place, au moment de votre travail sur vos tables, les outils facilitant votre gestion des tables SAS. Attention, les outils qui sont présentés ici sont uniquement préventifs : ils ne permettent pas de régler les problèmes que vous pourrez rencontrer. Nous conclurons ce chapitre sur les outils dont vous disposez pour gérer vos options et modifier ainsi le fonctionnement par défaut de votre système SAS. SAS Livre Page 156 Jeudi, 18. septembre 2008 6:03 18 156 ◆ SAS 5.1 La procédure PROC CONTENTS PROC CONTENTS vous permet de voir la structure d’une table SAS. Vous disposerez ainsi d’un ensemble d’informations qui peuvent se révéler utiles pour vos traitements. PROC CONTENTS DATA=test; RUN; Sur la table que nous avions en mémoire lors de la rédaction de cet ouvrage, la procédure PROC CONTENTS donne ce résultat : Résultat 5.1 1 2 3 4 Vous observez la présence de quatre types d’information regroupées en cadres. Les cadres 2 et 4 sont les plus intéressants : Dans le cadre 2, les informations indiquées sont : • le nombre d’observations de la table (six dans le cas présent) ; • le nombre de variables (six dans le cas présent) ; • s’il existe des index associés à cette table (si vous demandez un index sur une variable, SAS pourra accéder beaucoup plus rapidement aux données – voir l’aide SAS pour plus de détails1 et à l’adresse suivante : support.sas.com/techsup/technote/ts580.pdf) ; • la longueur de chaque observation ; • si des observations ont été supprimées (attention cette information ne peut apparaître que dans des conditions très précises – voir aide SAS) ; • si cette table est compressée ; • si elle est triée. 1. Voir SOMMAIRE / SAS Products / Base SAS / SAS 9.2 Language Reference Concepts / SAS Files Concepts / SAS Data Files / Understanding SAS indexes. SAS Livre Page 157 Jeudi, 18. septembre 2008 6:03 18 Faciliter la gestion des tables SAS ◆ 157 Le cadre 3 présente des informations relatives à l’hôte (l’ordinateur) et au moteur (votre version de SAS). Le cadre 1 vous donne des informations sur la date de création de la table, sa dernière modification, etc. Le cadre 4 donne des informations relatives aux variables présentes dans votre table. Par défaut, les variables sont présentées dans l’ordre alphabétique. Pour chaque variable, sont indiqués son ordre dans l’enregistrement (colonne ‘#’), son type (alphanumérique ou numérique) et sa longueur. Les options possibles de cette procédure sont les suivantes : POSITION Ajoute un classement des variables par position dans l’enregistrement. PROC CONTENTS DATA=lib.test POSITION;RUN; Cette option est utile lorsque l’on veut créer des blocs de variables avec « -- » (voir section 3.9.4.). SHORT Pour obtenir uniquement une liste de variables. NOPRINT Pour que rien ne soit produit dans la fenêtre SORTIE. Cette option est utile si vous demandez une table de sortie à PROC CONTENTS. PROC CONTENTS DATA=lib.test OUT=lib.toto NOPRINT;RUN; Dans cette table de sortie seront présentées les informations relatives à votre table. Pour connaître la structure de l’ensemble des tables d’une bibliothèque donnée : PROC CONTENTS DATA=lib._all_; RUN; Si vous appliquez PROC CONTENTS afin d’obtenir des informations sur les tables contenues dans une bibliothèque, vous pouvez introduire l’option NODS (ou NODETAILS). Ceci vous permettra de produire uniquement la liste des tables présentes dans cette bibliothèque et d’exclure les rapports complets tels qu’ils sont présentés par le résultat 5.1. 5.2 Les LABEL Parmi les fichiers support de cet ouvrage, vous trouverez une table TEST2. Si vous réalisez un PROC CONTENTS sur cette table, vous obtiendrez : Résultat 5.2 -----Alphabetic List of Variables and Attributes----# Variable Type Len Pos Label ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 1 X1 Num 8 0 département de naissance 2 X2 Num 8 8 code de la commune 3 X3 Num 8 16 nombre de versements 4 X4 Num 8 24 dernier versement 5 X5 Char 8 32 prénom SAS Livre Page 158 Jeudi, 18. septembre 2008 6:03 18 158 ◆ SAS Les LABEL permettent d’expliciter les variables dont les noms n’évoquent pas grandchose par eux-mêmes. Ces LABEL, à spécifier dans une étape DATA, réapparaîtront, par exemple, dans vos tableaux croisés, ce qui vous épargnera de saisir des titres. La programmation pour créer les LABEL présentée dans le résultat 5.2 est reprise dans le programme 5.1. Programme 5.1 DATA lib.test2; SET lib.test2; LABEL x1='Département de naissance' x2='Code de la commune' x3='Nombre de versements' x4='Dernier versement' x5='Prénom'; RUN; Vous pourrez aussi passer par une commande ATTRIB pour attribuer à vos variables un LABEL (la commande ATTRIB est examinée plus en détail dans la section 5.4.). Exercice 5.1 : Retournons à l’exercice EXAMEN.TXT (voir section 3.5.2.). Nous avions créé une table qui indiquait le nombre de personnes reçues, le pourcentage de reçus, de mentions Très Bien, et par groupe de TD, le nombre de reçus et le pourcentage de réussites. À coup sûr, cette table, examinée au moyen d’un PROC PRINT, doit être peu lisible. Introduisez des LABEL pour rendre les résultats plus explicites. Vous remarquerez qu’à la suite de ce travail, si vous lancez un PROC PRINT, vous ne verrez pas vos LABEL. Pour que ceux-ci apparaissent, vous pouvez lancer la commande suivante : PROC PRINT DATA=bilan LABEL; RUN; Vous pourrez ainsi obtenir un résultat semblable à celui-ci : Résultat 5.3 Obs nombre de personnes reçues nombre de mentions très bien 1 92 13 nbre de reçus, groupe n°1 nbre de reçus, groupe n°2 nbre de reçus, groupe n°3 24 39 18 nbre de reçus, groupe n°4 11 Obs % de reçus, tous groupes confondus % de reçus, groupe n°1 % de reçus, groupe n°2 % de reçus, groupe n°3 % de reçus, groupe n°4 1 0.29299 0.31579 0.30233 0.25 0.29730 Au cours d’une étape DATA, nous avons associé des LABEL aux variables. Vous disposez aussi de l’instruction LABEL dans de très nombreuses procédures (voir le programme 6.30 proposé dans la section 6.4.1., par exemple). Ces LABEL ne sont alors utilisés que pour les sorties générées par la procédure au sein de laquelle vous les avez saisis. SAS Livre Page 159 Jeudi, 18. septembre 2008 6:03 18 Faciliter la gestion des tables SAS ◆ 159 5.3 L’attribution d’un FORMAT Pour rendre plus lisibles vos données, vous pouvez attribuer des FORMAT à des variables, de date par exemple (voir programmes 3.18 et 3.19). Ces FORMAT ne font que modifier la manière d’afficher vos données, ils ne transforment pas vos modalités à l’intérieur de vos tables. De très nombreux FORMAT sont livrés avec SAS. Vous avez aussi la possibilité d’en créer de nouveaux vous-même en utilisant PROC FORMAT. L’utilisation d’un FORMAT permet ainsi le regroupement de modalités sans création d’une nouvelle variable. 5.3.1 L’utilisation de FORMAT prédéfinis sur des variables numériques Exercice 5.2 : À partir du fichier PRIX.TXT, créez une table SAS. Nous supposons que la variable prix a été l’objet de calculs préalables compliqués (ce qui explique pourquoi cette variable a 9 décimales). Vous souhaitez, avant toute analyse, créer un simple tableau dans lequel vont apparaître les valeurs prises par votre variable prix. PROC FREQ DATA=test; TABLES prix; RUN; Nous reviendrons sur le principe de PROC FREQ dans la section 6.6. Si vous exécutez ce programme, un tableau d’environ 200 pages va être créé dans votre fenêtre SORTIE. Ce résultat est illisible et parfaitement inutile. Il peut être plus judicieux de simplement présenter les prix en s’arrêtant à la première décimale. On peut, pour cela, créer lors d’une étape DATA une nouvelle variable arrondie de la variable prix grâce à la fonction ROUND. Il s’agit là d’une solution certes possible mais qui va alourdir votre table et vous prendre du temps. S’il s’agit uniquement de pouvoir visualiser la distribution des modalités de votre variable, vous pourrez alternativement attribuer à cette variable numérique un FORMAT qui ne sera employé qu’à la lecture (mais pas pour les calculs) : Programme 5.2 DATA test; SET test; FORMAT prix 4.1; RUN; Nous demandons à SAS de présenter la variable numérique prix en utilisant 4 caractères et un chiffre au plus après la virgule. Si, ensuite, vous souhaitez un affichage avec 4 décimales : Programme 5.3 DATA test; SET test; FORMAT prix 7.4; RUN; SAS Livre Page 160 Jeudi, 18. septembre 2008 6:03 18 160 ◆ SAS Les prix s’afficheront avec quatre décimales mais les décimales non affichées ne seront pas perdues. L’utilisation de FORMAT nécessite cependant quelques précautions. Il est impératif de spécifier correctement le nombre de caractères à utiliser pour représenter la variable. Si ce nombre de caractères devait être trop faible, votre affichage pourrait être sans rapport avec vos vraies données. Si SAS ne parvient pas à présenter toutes les modalités de votre variable avec le FORMAT que vous lui avez indiqué, votre fenêtre JOURNAL affichera le message suivant : NOTE: Au moins un format W.D est trop petit pour que les chiffres soient imprimés. La partie décimale peut être décalée par le format "BEST. Ce message doit être compris comme une invitation à modifier votre FORMAT. Vous avez toujours la possibilité de demander le FORMAT BESTw. Dans ce cas, SAS choisira la meilleure notation en fonction de la nature de vos modalités1. Ainsi, un FORMAT 4.2 ne peut afficher correctement que des modalités strictement supérieures à -1 (exemple : –.99) et strictement inférieures à 10 (9.99). Vous avez déjà besoin de trois caractères pour afficher deux décimales (n’oubliez pas le point, séparation décimale), il ne vous reste qu’un caractère pour afficher soit le signe moins, soit l’unité. Si votre FORMAT est correctement choisi, celui-ci présentera les données comme si vous aviez demandé un arrondi. Programme 5.4 DATA test; INPUT x @@; CARDS; 1101 1101.1 1101.2 1101.3 1101.4 1101.5 1101.6 1101.7 1101.8 1101.9 1102 ; PROC PRINT DATA=test; FORMAT x 4.0; RUN; Résultat 5.4 Obs 1 2 3 4 5 6 7 8 9 10 11 x 1101 1101 1101 1101 1101 1102 1102 1102 1102 1102 1102 Vous pouvez aussi souhaiter utiliser un FORMAT pour une procédure donnée sans pour autant l’introduire dans la table. Votre instruction FORMAT devra alors prendre place au sein même de votre procédure : 1. Pour comprendre la manière dont SAS procède pour déterminer la meilleure présentation possible de vos données, voir l’aide SAS, entrée BESTw. Format. SAS Livre Page 161 Jeudi, 18. septembre 2008 6:03 18 Faciliter la gestion des tables SAS ◆ 161 Programme 5.5 PROC FREQ DATA=test; TABLES x; FORMAT x 7.4; RUN; 5.3.2 FORMAT ou INFORMAT ? Il est nécessaire que vous saisissiez les différences importantes qui peuvent exister entre les FORMAT et les INFORMAT : même si les termes appelant les FORMAT et les INFORMAT peuvent apparaître semblables, FORMAT et INFORMAT sont deux concepts différents. Exemple 8.4 : • Si 8.4 est un FORMAT, alors vous demandez que la modalité soit représentée au moyen de 8 caractères et 4 chiffres après la virgule1. • Si 8.4 est un INFORMAT, alors vous demandez de lire dans le fichier brut 8 caractères pour la variable et de multiplier le résultat obtenu par 10-4, si la modalité ne contient pas de séparateur décimal. Les choses peuvent cependant devenir compliquées si vous imposez des FORMAT lors de la phase de création de votre table comme le montre le programme 5.6. Programme 5.6 DATA test; FORMAT Y 10.3 X $char3.; Y=123.4567; X="bonjour"; PUT X/Y; RUN; L’instruction PUT demande ici d’écrire dans la fenêtre JOURNAL ce que SAS a dans la table pour X et Y. Vous obtenez alors : bon 123.457 Si vous demandez maintenant un PROC PRINT : Résultat 5.5 Obs 1 Y 123.457 X bon PROC PRINT DATA=test; FORMAT _all_; RUN; Obs 1 Y 123.457 X bon 1. 8.4 conviendra pour une variable numérique dont les valeurs sont strictement supérieures à –100 et strictement inférieures à 1000. SAS Livre Page 162 Jeudi, 18. septembre 2008 6:03 18 162 ◆ SAS L’instruction FORMAT _ALL_ vous épargne d’utiliser les FORMAT pour la sortie ordonnée par PROC PRINT. Vous remarquerez que la modalité de Y est corrompue définitivement. La modalité est affectée par la demande d’un FORMAT. La même chose se passe pour la variable alphanumérique X : le FORMAT demandé ici semble avoir agi comme un INFORMAT modifiant la lecture de la donnée brute. Si maintenant vous relancez le programme en plaçant l’instruction FORMAT juste avant l’instruction PUT, vous n’aurez aucune difficulté. Il vous est donc recommandé de procéder dans l’ordre suivant : 1. Créez votre table et utilisez à ce moment les INFORMAT. 2. Une fois votre table créée, imposez des FORMAT si vous le souhaitez. 5.3.3 Quelques FORMAT utiles sur variables numériques Donnée SAS FORMAT (forme générale) FORMAT appliqué Affichage 23451.23 COMMAw.d COMMA10.2 23,451.23 23451.23 COMMAXw.d COMMAX10.2 23.421,23 23451.23 DOLLARw.d DOLLAR10.2 $23,421.23 23451.23 DOLLARXw.d DOLLARX10.2 $23.421,23 23451.23 NLNUMw.d NLNUM9.2 23 421,23 23451.23 EUROw.d EURO10.2 €23,451.23 23451.23 EUROXw.d EUROX10.2 €23.451,23 23451.23 Ew. E10. E12. 2.345E+04 2.34512E+04 0.666666666 FRACTw. FRACT. 2/3 0.1 PERCENTw.d PERCENT10. 10% 2004 ROMANw. ROMAN10. MMIV 0.11111111 WORDSw. WORDS25. zero and eleven hundredths 1.50 WORDFw. WORDF30. one and 50/100 Une liste plus complète des FORMAT possibles sur variables numériques pourra être trouvée dans votre documentation SAS1 ou dans l’aide en ligne : (SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/lrdict.hlp/a001263753.htm (SAS 9.2) : support.sas.com/documentation/cdl/en/lrdict/59540/HTML/default/ a001263753.htm À noter depuis la version 9.1 de SAS un ensemble de nouveaux FORMAT monétaires : NLMNLAUD Australian Dollars NLMNLHKD Hong Kong Dollars NLMNLPLN Polish Zlotych NLMNLCAD Canadian Dollars NLMNLILS Israeli New Shekels NLMNLRUR Russian Rubles NLMNLCHF Swiss Francs Japanese Yen NLMNLSEK Swedish Kronor NLMNLJPY 1. Entrée Formats, puis by category. SAS Livre Page 163 Jeudi, 18. septembre 2008 6:03 18 Faciliter la gestion des tables SAS ◆ 163 NLMNLCNY Chinese Yuan Renminbi NLMNLKRW Korean Won NLMNLSGD Singapore Dollars NLMNLDKK Danish Kroner NLMNLMYR Malaysian Ringgits NLMNLTWD Taiwan New Dollars NLMNLEUR Euros NLMNLNOK Norwegian Kroner NLMNLUSD US Dollars NLMNLGBP British Pounds NLMNLNZD New Zealand Dollars NLMNLZAR South African Rand Exemple : 1000,00 NLMNLAUD15.2 AU$1000.00 Il s’agit ici d’une notation nationale des sommes en dollars autraliens. Pour une notation internationale (AUD1000.00), les FORMAT débuteront non pas par NLMNL mais par NLMNI. Dans SAS 9.2, des FORMAT qui permettent la conversion de monnaies ont été introduits. Exemple : EURFRFRFw.d pour convertir en euros des sommes en francs. EURTOFRFw.d pour convertir en francs des sommes en euros. Pour plus de détails sur ces nouveaux FORMAT, vous pouvez consulter l’aide SAS, entrée European Currency Conversion. 5.3.4 Les FORMAT d’affichage des variables de date Nous avons déjà précisé que les dates sont enregistrées dans les tables SAS comme un nombre de jours qui séparent la date en question du 1er janvier 1960. À l’affichage, vous pouvez cependant souhaiter voir, non pas un nombre de jours, mais bien une date. Vous appliquerez donc un FORMAT à votre date. Ainsi : Programme 5.7 DATA date4; INPUT date fradfde.; CARDS; 01JAN60 01FEV60 01MAR60 01AVR60 01MAI60 01JUN60 01JUL60 01AOU60 01SEP60 01OCT60 01NOV60 01DEC60 ;RUN; ** résultat du PROC PRINT; Obs date 1 2 3 4 5 6 7 8 9 10 11 12 0 31 60 91 121 152 182 213 244 274 305 335 DATA date4; SET date4; FORMAT date fradfde.; RUN; ** résultat du PROC PRINT; Obs date 1 2 3 4 5 6 7 8 9 10 11 12 01jan60 01fev60 01mar60 01avr60 01mai60 01jun60 01jul60 01aou60 01sep60 01oct60 01nov60 01dec60 SAS Livre Page 164 Jeudi, 18. septembre 2008 6:03 18 164 ◆ SAS Il existe de très nombreux FORMAT de date. La date du 1er octobre 2007 (en fait, 17740) peut ainsi être affichée de différentes manières : FORMAT (forme générale) FORMAT appliqué Exemple INTERNATIONAL/FRANÇAIS DATEw. DATE7. 01OCT07 EURDFDE./FRADFDE. DATE9. 01OCT2007 EURDFDD./FRADFDD. DDMMYY6. 011007 DDMMYY8. 01/10/07 DDMMYY10. 01/10/2007 DDMMYYw.a DOWNAMEw. DOWNAME. Monday DOWNAME3. Mon JULDAYw. JULDAY 274 JULIANw. JULIAN. 07274 JULIAN7. 2007274 MMDDYY6. 100107 MMDDYY8. 10/01/07 MMDDYY10. 10/01/2007 MMDDYYw. MMYYxw. EURDFDWN./FRADFDWN. MMYYS5. 10/07 MMYYS7 10/2007 MONNAME. October MONNAME3. Oct MONTHw. MONTH. 10 MONYYw. MONYY. Oct07 EURDFMY./FRADFMY. MONYY7. Oct2007 FRADFMY7. QTRw. QTR. 4 QTRRw. QTRR. IV WEEKDATEw. WEEKDATE9. Monday WEEKDATE15. Mon, Oct 1, 07 WEEKDATE. Monday, October 1, 2007 WEEKDATE29. Monday, October 1, 2007 WEEKDATX9. Monday EURDFWKX./FRADFWKX8. WEEKDATX15. Mon, 1 oct 07 FRADFWKX15. WEEKDATX. Monday, 1 October 2007 FRADFWKX. WEEKDATX29. Monday, 1 October 2007 FRADFWKX27. WEEKDAY. 2 EURDFDN./FRADFDN. MONNAMEw. WEEKDATXw. WEEKDAYw. EURDFMN./FRADFMN. SAS Livre Page 165 Jeudi, 18. septembre 2008 6:03 18 Faciliter la gestion des tables SAS ◆ 165 FORMAT (forme générale) FORMAT appliqué Exemple WORDATEw. WORDATE3. Oct WORDATE9. October WORDATE12. Oct 1, 2007 WORDATE. October 1, 2007 WORDATE18. October 1, 2007 WORDATX3. Oct EURDFWDX./FRADFWDX3. WORDATX9. October FRADFWDX9. WORDATX12. 1 Oct 2007 FRADFWDX12. WORDATX. 1 October 2007 FRADFWDX. WORDATEX. 1 October 2007 YYYY. 2007 YYYY2. 07 YYMMxw. YYMMS. 2007/10 YYMMDDw. YYMMDD6. 071001 YYMMDD. 07-10-01 YYMMDD10. 2007-10-01 YYMONw. YYMON. 2007OCT YYQxw. YYQS. 2007/4 WORDATXw. YEARw. INTERNATIONAL/FRANÇAIS a. De plus, certains FORMAT peuvent être déclinés. Par exemple : DDMMYYC. (01:10:07) DDMMYYD. (01-10-07), DDMMYYP. (01.10.07) et DDMMYYS. (01/10/07). Vous remarquez que les FORMAT qui offrent une présentation des dates contenant des mots disposent de versions internationales (et donc françaises). Pour utiliser les versions internationales de ces FORMAT (EURDFxx), il faut modifier la valeur de DFLANG (langue par défaut). Programme 5.8 OPTIONS DFLANG=french; PROC PRINT; FORMAT date eurdfwdx.; RUN; Vous obtiendrez : Résultat 5.6 Obs JJ MM AA 1 2 3 4 1 1 10 20 1 1 10 12 1960 1900 1980 2003 date 1er janvier 1er janvier 10 octobre 20 décembre 1960 1900 1980 2003 SAS Livre Page 166 Jeudi, 18. septembre 2008 6:03 18 166 ◆ SAS Sans modifier la langue par défaut, vous pouvez aussi utiliser les FORMAT internationaux en remplaçant le préfixe EUR par le préfixe correspondant à votre langue1. Langues disponibles dans SAS 9.1 : Danish DAN Dutch NLD Finnish FIN French FRA German DEU Italian ITA Norwegian NOR Portuguese PTG Spanish ESP Swedish SVE Swiss_French FRS Swiss_German DES De nouvelles langues ont été introduites avec SAS 9.2. Il s’agit de : Afrikaans AFR Catalan CAT Croatian CRO Czech CSY Hungarian HUN Macedonian MAC Polish POL Russian RUS Slovenian SLO Programme 5.9 PROC PRINT; FORMAT date ptgdfwdx.; RUN; Résultat 5.7 Obs JJ MM AA 1 2 3 4 1 1 10 20 1 1 10 12 1960 1900 1980 2003 date 1 de janeiro 1 de janeiro 10 de outubro 20 de dezembro de de de de 1960 1900 1980 2003 Exercice 5.3 : Dans la table SAS nommée DATETIME, est présente une variable date à laquelle on a appliqué un FORMAT DATETIME20. : les dates apparaissent sous la forme 28APR2005:02:43:34. (C’est par exemple sous ce FORMAT qu’apparaissent les dates lorsque vous importez une table en provenance d’ACCESS.) Appliquez à cette date le FORMAT DDMMYY8. (C’est bien moins facile qu’il n’y paraît et vous en conclurez qu’il ne faut jamais faire confiance à ce que l’on voit d’une table SAS lorsque des FORMAT ont été appliqués…) 5.3.5 Les FORMAT d’affichage des variables alphanumériques Les FORMAT d’affichage des variables alphanumériques les plus courants sont $CHARw. et $w. FORMAT alpha $char8.; FORMAT alpha $10.; 1. Ces FORMAT nationaux ont des caractéristiques en terme de nombre de caractères à utiliser qui sont propres à chaque langue. Pour plus de détails, voir dans l’aide SAS, entrée International Date and Datetime Formats. SAS Livre Page 167 Jeudi, 18. septembre 2008 6:03 18 Faciliter la gestion des tables SAS ◆ 167 Il n’apparaît pas de différences entre ces deux FORMAT. D’autres FORMAT existent et peuvent ainsi transformer toutes vos minuscules en majuscules, ou inverser l’ordre des lettres : BOURVIL LIVRUOB. Pour plus de détails, consultez l’aide SAS (entrée Formats, puis, dans l’arborescence, by category) ou les liens vers l’aide en ligne cités dans la section 5.3.3. 5.3.6 La création de FORMAT spécifiques À ce stade, vous avez dû comprendre que les FORMAT permettent d’afficher les modalités prises par une variable de manière lisible. Si certains FORMAT sont proposés par SAS, il est aussi possible de créer ses propres FORMAT au moyen de la procédure PROC FORMAT (déjà évoquée pour créer des INFORMAT spécifiques – voir section 2.8.4.). Consultez à nouveau cette section, et plus particulièrement l’ensemble des règles existantes, pour plus de détails sur le nom des FORMAT, la spécification des intervalles, etc. a. PROC FORMAT Nous travaillerons pour cette section sur le fichier VILLES.TXT. Dans ce fichier, vous trouverez une liste de villes de la région Centre, le département (45, 28, 36) dans lequel ses villes se situent, un code indiquant si la ville est préfecture (1), sous-préfecture (2) ou chef lieu de canton (3) et un deuxième code indiquant en trois lettres le département (loi, eur, ind). Exercice 5.4 : Créez une table SAS au moyen de ce fichier (variables à créer : VILLE, DEP, CODE, et CODE2). Un PROC PRINT vous donne un résultat peu clair que l’on va rendre plus lisible au moyen de FORMAT spécifiques appropriés grâce au programme 5.10. Programme 5.10 PROC FORMAT; VALUE fdepart 45='Loiret' 28='Eure et Loir' 36='Indre'; VALUE fcode 1='Préfecture' 2='sous préfecture' 3='chef lieu de canton'; VALUE $fcodeb 'loi'='Loiret' 'eur'='Eure et Loir' 'ind'='Indre'; RUN; DATA villes; SET villes; FORMAT dep fdepart. code fcode. code2 $fcodeb.; RUN; SAS Livre Page 168 Jeudi, 18. septembre 2008 6:03 18 168 ◆ SAS Si maintenant, vous ordonnez un PROC PRINT, vous verrez que votre table est devenue plus lisible. Quelques petits détails à savoir : • Un FORMAT peut prendre n’importe quel nom mais ne doit pas se terminer ni commencer par un chiffre. • Si vous créez un FORMAT que vous destinez à une variable alphanumérique, il faut mettre un $ au début du nom du FORMAT, dans la phase de définition et dans la phase d’attribution. Le FORMAT FCODE va être appliqué à une variable numérique1. • À l’intérieur de PROC FORMAT, votre FORMAT ne doit pas se terminer par un point. • Dans la phase d’attribution de votre FORMAT à une variable, le nom de votre FORMAT doit se terminer par un point. b. Assigner des FORMAT spécifiques de façon permanente à une table Est-ce que les FORMAT créés sont associés de façon permanente à vos variables ? Non, pas dans le cas présent. Il faut que vous demandiez à SAS d’enregistrer les FORMAT en ajoutant à votre commande PROC FORMAT l’option LIBRARY= : LIBNAME malib 'C:\intro_SAS'; PROC FORMAT LIBRARY=malib; + lignes de commande; RUN; MALIB est la bibliothèque créée au moyen d’une commande LIBNAME. En spécifiant LIBRARY=MALIB, SAS crée un fichier FORMAT que l’on pourra appeler et compléter lors d’une utilisation ultérieure2. Vous remarquez que, pour l’instant, la table VILLES est temporaire. Pour créer une table permanente : DATA malib.villes; SET villes; RUN; À ce stade, si vous quittez SAS pour ensuite débuter une nouvelle session et si vous réalisez un PROC PRINT, vos FORMAT ne seront pas connus et votre table refusera de s’ouvrir – dans la fenêtre JOURNAL, vous aurez ce message : Résultat 5.8 2 PROC PRINT DATA=malib.villes;RUN; ERROR: Format FDEPART not found or couldn’t be loaded for variable departement. ERROR: Format FCODE not found or couldn’t be loaded for variable code. ERROR: Format $FCODEB not found or couldn’t be loaded for variable code2. NOTE: The SAS System stopped processing this step because of errors. NOTE: PROCEDURE PRINT used: real time 0.03 seconds cpu time 0.03 seconds 1. Rappel : Un INFORMAT est caractère lorsqu’il transforme une donnée en une chaîne de caractères ; il est numérique s’il transforme la donnée brute en donnée numérique – la forme de la donnée brute ne compte pas. Un FORMAT est numérique lorsqu’il est appliqué à une variable numérique, et caractère lorsqu’il est appliqué à une variable alphanumérique. 2. Si, à un emplacement physique, existe une table de FORMAT, la définition de nouveaux FORMAT enregistrés dans la même bibliothèque lors d’une nouvelle session SAS ne détruit pas le fichier FORMAT déjà existant mais le complète. SAS Livre Page 169 Jeudi, 18. septembre 2008 6:03 18 Faciliter la gestion des tables SAS ◆ 169 Où sont vos FORMAT ? Vous devez dire à SAS l’endroit où il doit rechercher les FORMAT spécifiques au moyen de la commande : OPTIONS FMTSEARCH=(malib.formats); Vos FORMAT seront de nouveau disponibles et utilisables lorsque vous réaliserez votre PROC PRINT. Vous pouvez simplement indiquer la bibliothèque dans laquelle se trouvent vos FORMAT, voire indiquer plusieurs librairies : OPTIONS FMTSEARCH=(malib work); Si vous appelez votre bibliothèque LIBRARY, plutôt que de lui attribuer un nom quelconque (ici MALIB), vous n’aurez pas besoin de la ligne d’OPTIONS : SAS ira de luimême chercher les FORMAT dont il a besoin. En effet, SAS recherche par défaut un fichier de FORMAT dans la bibliothèque LIBRARY et dans la bibliothèque WORK. S’il ne trouve pas ce fichier, il vous envoie un message d’erreur du type présenté par le résultat 5.8. Si, vous souhaitez que SAS exécute le programme que vous lui soumettez même s’il ne trouve pas les FORMAT que vous aviez pourtant pris la peine de sauvegarder quelque part, vous pouvez entrer la ligne d’OPTIONS suivante : OPTIONS NOFMTERR; Cette option demande à ce qu’il n’y ait pas de message d’erreur et de refus de traitement en cas d’absence de FORMAT. Cette option vous sera particulièrement utile si un de vos correspondants vous transmet une table dans laquelle il a introduit des FORMAT spécifiques sans vous transmettre ces derniers. Il aurait dû envoyer à la fois sa table et le fichier dans lequel sont stockées les définitions des FORMAT spécifiques FORMAT.SAS7BCAT (à rechercher sur votre disque dur, à l’endroit physique qui correspond à votre bibliothèque). Si vous créez un INFORMAT au moyen de PROC FORMAT et que vous souhaitiez l’enregistrer pour une utilisation ultérieure, la démarche est identique à celle exposée ici : vous devez enregistrer votre INFORMAT en utilisant l’option LIBRARY= et, pour pouvoir utiliser votre INFORMAT, indiquer la bibliothèque dans laquelle vous avez sauvegardé votre INFORMAT via l’option FMTSEARCH. c. Utiliser des FORMAT spécifiques dans des sorties sans que ceux-ci soient dans la table SAS Vous pouvez souhaiter que vos FORMAT spécifiques ne soient pas dans votre table SAS et qu’ils soient uniquement présents lorsque vous utilisez telle ou telle procédure (un PROC PRINT, par exemple). Nous devons déjà retirer les FORMAT de la table : Programme 5.111 DATA malib.villes; SET malib.villes; FORMAT dep code code2; RUN; Si vous réalisez un PROC PRINT sur votre table, les FORMAT ont bien disparu. Maintenant, dans la procédure demandant une sortie, il demeure possible d’utiliser les FORMAT spécifiques : 1. FORMAT _ALL_ est tout aussi possible dans ce programme. SAS Livre Page 170 Jeudi, 18. septembre 2008 6:03 18 170 ◆ SAS Programme 5.12 PROC PRINT DATA=malib.villes; FORMAT dep fdepart. code fcode. code2 $fcodeb.; RUN; Une fois de plus, si vous quittez SAS et que vous entriez à nouveau, même si vous définissez votre bibliothèque au moyen d’un LIBNAME et si vous ordonnez ce PROC PRINT, les FORMAT spécifiques n’apparaîtront pas. Vous devrez là encore passer par : OPTIONS FMTSEARCH=(malib); d. Créer plusieurs FORMAT spécifiques pour une même variable Cette procédure n’a de sens que dans une commande de sortie : dans une table SAS, vous ne pouvez attribuer qu’un FORMAT par variable. Nous créons un second FORMAT pour la variable département : Programme 5.13 PROC FORMAT; VALUE floiret 45='loiret' OTHER='non Loiret'; RUN; Ici, les anciens FORMAT spécifiques ne sont pas écrasés par la commande. Le nouveau FORMAT est ajouté à la liste de FORMAT déjà existants dans la table MALIB.FORMAT. Programme 5.14 PROC PRINT DATA=malib.villes; FORMAT dep floiret. code fcode. code2 $fcodeb.; RUN; PROC PRINT DATA=malib.villes; FORMAT dep fdepart. code fcode. code2 $fcodeb.; RUN; Et vous obtiendrez le résultat escompté. Au bout d’un moment, il est possible que vous ne sachiez plus très bien ce que vos FORMAT spécifiques signifient concrètement. Si vous avez perdu le programme qui a construit ces FORMAT, vous pouvez toujours connaître leurs structures au moyen de l’option FMTLIB. Programme 5.15 PROC FORMAT LIBRARY=malib.formats FMTLIB; RUN; e. Les FORMAT entrelacés La procédure PROC FORMAT est bien plus puissante qu’il n’y paraît. Un dernier exemple pour vous convaincre. Nous travaillerons ici sur le fichier FMTCOMPET.TXT. Dans ce fichier, on dispose de trois variables : un identifiant individuel, le revenu de la SAS Livre Page 171 Jeudi, 18. septembre 2008 6:03 18 Faciliter la gestion des tables SAS ◆ 171 personne pour l’année 2007 et l’âge de la personne. Le programme 5.16 crée la table SAS, puis un FORMAT entrelacé grâce à l’option MULTILABEL : Programme 5.16 DATA fmt; INFILE 'C:\intro_SAS\fichiers\fmtcompet.txt'; INPUT ident revenu age; RUN; PROC FORMAT; VALUE age(MULTILABEL) low-19 = '19 et -' 20-29 = '20-29' 30-39 = '30-39' 40-49 = '40-49' 50-59 = '50-59' 60-high = '60 et +' 20-35 = '20-35' 36-55 = '36-55' 55-high = '55 et +'; RUN; Afin de connaître le revenu moyen pour chaque classe d’âges, vous allez utiliser la procédure PROC MEANS (voir section 6.2.). Programme 5.17 PROC MEANS DATA=fmt; VAR revenu; CLASS age/MLF; FORMAT age age.; RUN; La variable à analyser (instruction VAR) est le revenu. L’instruction CLASS permet l’analyse par classes d’âges. L’option MLF indique que le FORMAT qui s’applique à la variable AGE est un FORMAT entrelacé. Lors de la procédure PROC MEANS, nous associons la variable AGE au FORMAT AGE. Nous obtenons ainsi : Résultat 5.9 N age Obs N Mean Std Dev Minimum Maximum ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 19 et 56 56 9458.11 6540.98 2013.00 23152.00 20-29 229 229 8299.69 5675.63 2016.00 26889.00 20-35 308 308 8235.31 5574.86 2016.00 26889.00 30-39 122 122 7992.65 5344.39 2005.00 23461.00 36-55 153 153 8003.22 5371.25 2001.00 22457.00 40-49 83 83 8007.52 5017.68 2001.00 22457.00 50-59 47 47 9523.60 6786.57 2002.00 24534.00 55 et + 75 75 9156.59 5598.39 2002.00 24534.00 60 et + 52 52 8412.37 4769.21 2296.00 22093.00 ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Sans FORMAT assigné à la variable de classification AGE, vous auriez eu quatre statistiques calculées pour chaque modalité de AGE. Vous constatez donc que les FORMAT, au-delà d’une simple représentation des modalités sous une forme plus SAS Livre Page 172 Jeudi, 18. septembre 2008 6:03 18 172 ◆ SAS lisible, peuvent aussi être utilisés pour des analyses en provoquant des regroupements de modalités. 5.3.7 Une seconde utilisation de PUT Parmi les commandes de SAS, il existe la commande PUT que vous verrez souvent dans des exemples de programmation parce qu’elle permet, dans sa première version, d’envoyer un résultat dans la fenêtre JOURNAL. Ainsi, le programme 5.18 permet l’affichage de la date correspondant à 17654 dans le FORMAT date7. Programme 5.18 DATA test; date=17654; PUT date date7.; RUN; SAS vous propose aussi une fonction PUT qui permet de créer une variable alphanumérique en donnant à la nouvelle variable les modalités d’une autre variable à laquelle on applique un certain FORMAT. Cette fonction PUT ne doit pas être confondue avec la fonction INPUT traitée dans la section 3.4.1. Nous reprenons la table FMT créée par le programme 5.16. Programme 5.19 DATA fmt; SET fmt; revenu_2=PUT(revenu,eurox12.2); revenu_3=INPUT(revenu_2,eurox12.2); RUN; La fonction PUT utilisée dans le programme 5.19 permet de créer une variable alphanumérique REVENU_2 qui a pour modalité REVENU à laquelle on a appliqué le FORMAT EUROX12.21. La fonction INPUT crée une variable numérique en ordonnant la lecture des modalités de REVENU_2 au moyen de l’INFORMAT EUROX12.2. La nature de la variable créée par la fonction INPUT est différente selon la nature de l’INFORMAT utilisé. La fonction PUT ne peut créer que des variables alphanumériques. Cette fonction PUT vous est particulièrement utile lorsque vous avez créé votre propre FORMAT. Seuls les FORMAT non entrelacés peuvent être utilisés ici. Exemple : Nous avons créé un FORMAT appelé AGEB non entrelacé (- de 19, 20-29, 30-39, 40-49, 50-59 et + de 60). Exercice 5.5 : Écrivez le programme qui permet de créer ce FORMAT AGEB. Nous souhaitons maintenant créer une variable qui reprenne ce FORMAT sous forme de modalités. Un utilisateur peu expérimenté procédera de cette manière : 1. Le FORMAT EUROX12.2 (sans point à la fin) est bien le FORMAT appliqué. SAS Livre Page 173 Jeudi, 18. septembre 2008 6:03 18 Faciliter la gestion des tables SAS ◆ 173 Programme 5.20 DATA fmt; SET fmt; IF age<20 THEN ager='19 et -'; IF 19<age<30 THEN ager='20-29'; IF 29<age<40 THEN ager='30-39'; IF 39<age<50 THEN ager='40-49'; IF 49<age<60 THEN ager='50-59'; IF age>59 THEN ager='60 et +'; RUN; Cette longue liste de commandes est avantageusement remplacée par : Programme 5.21 DATA fmt; SET fmt; ager=PUT(age,ageb.); RUN; 5.4 La longueur de l’enregistrement des variables numériques Lorsque vous réalisez un PROC CONTENTS sur une table SAS, parmi les informations qui vous sont offertes, on vous donne le LENGTH (la longueur) de la variable, c’est-à-dire, pour les variables numériques, le nombre d’octets attribués à cette variable dans la table SAS. Il peut être utile de modifier cette longueur principalement pour économiser de la place sur votre disque dur. Attention : il s’agit là d’une procédure très dangereuse si vous ne comprenez pas très exactement ce que vous faites. Si les modalités de votre variable sont décimales, ne tentez aucune modification. En revanche, s’il s’agit d’entiers, il est possible d’imposer une longueur d’enregistrement comprise entre 3 et 8 pour réduire la taille de votre table SAS. Cela n’est intéressant que si vous avez une table de plusieurs dizaines, voire plusieurs centaines de mégaoctets. LENGTH Max. VALUE LENGTH Max. VALUE 3 8 192 6 137 438 953 472 4 2 097 152 7 35 184 372 088 832 5 536 870 912 8 9 007 199 254 740 990 Pour chaque longueur d’enregistrement, vous disposez dans le tableau ci-dessus de la valeur entière maximale que pourra prendre votre variable1 (le signe est géré en 1. Ces valeurs maximales dépendent de votre système d’exploitation. Ici, ce sont les valeurs maximales possibles avec Windows, Unix, OS/2, OpenVMS Alpha. Sur CMS, VAX et OS/390, les LENGTH peuvent varier de 2 à 8 : les entiers maximaux possibles en fonction du nombre d’octets alloués (K) sont égaux à 2(K-1)*8. Sous Windows, c’est 2(8K-11). SAS Livre Page 174 Jeudi, 18. septembre 2008 6:03 18 174 ◆ SAS interne par SAS indépendamment de la longueur de l’enregistrement). Par exemple, un LENGTH à 3 est particulièrement recommandé pour des variables indicatrices ou pour des variables prenant peu de valeurs. S’il vous est possible de modifier la longueur d’enregistrement d’une variable numérique au moyen de la commande LENGTH, vous ne pouvez pas modifier la longueur attribuée à une variable alphanumérique (voir section 3.1.2.). Programme 5.22 DATA test; INPUT X XB; CARDS; 1 6.17856 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 ;RUN; DATA test; SET test; LENGTH X Xb 3; RUN; Votre table devient : Résultat 5.10 Obs 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 X XB 6.1777 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000 9.0000 10.0000 L’attribution d’une longueur de 3 à la variable XB nous a conduits à un résultat erroné que nous ne pourrons plus corriger par la suite. Une nouvelle fois : ne modifiez rien si vos modalités contiennent des décimales ! Exercice 5.6 : Créez une table contenant 100 000 lignes et 100 variables X1-X100 codées chacune aléatoirement en 0-1 (vous allez ainsi obtenir une matrice 100000 * 100 remplie de 0 et de 1). Quel espace sur le disque dur prend votre table ? Modifiez maintenant la longueur des variables et fixez cette longueur au minimum. Quelle est la place prise par votre table maintenant ? Pour modifier la longueur d’une variable numérique, nous avons utilisé la commande LENGTH mais vous pouvez aussi recourir à l’instruction ATTRIB. Cette SAS Livre Page 175 Jeudi, 18. septembre 2008 6:03 18 Faciliter la gestion des tables SAS ◆ 175 fonction autorise en plus l’attribution de FORMAT, d’INFORMAT, de LABEL à vos variables ou à un ensemble de variables. Quelques exemples : ATTRIB ATTRIB ATTRIB ATTRIB ATTRIB x1 LENGTH=3; x1 INFORMAT=mmddyy. FORMAT=worddate.; x1-x100 LABEL='Test 0/1'; x1 x2 LENGTH=$4 LABEL='TEST'; x1 LENGTH=$4 LABEL='Test' x2 LENGTH=$2 LABEL='Réponse'; Bien sûr, l’application d’un INFORMAT n’a un sens que dans une phase de création de table. Une fois la table créée, il n’est plus question de faire intervenir un INFORMAT. Enfin, les deux dernières commandes ATTRIB présentées ci-dessus ne peuvent prendre place que dans une étape DATA de création de table. Une fois la longueur d’une variable alphanumérique donnée, vous ne pouvez plus modifier cette longueur. 5.5 La gestion des tables Lorsque vous travaillez avec SAS, vous pouvez très vite être submergé par les tables et par les programmes. Vos difficultés proviendront alors du fait que vous ne savez plus quelle table doit être utilisée ni quel programme permet de construire telle ou telle table. Dans cette section, vous trouverez quelques conseils vous permettant d’organiser au mieux votre travail. Vous éviterez ainsi, espérons-le, un problème que tous les utilisateurs SAS ont rencontré un jour : l’exécution d’une version non définitive d’un programme qui contribue à l’écrasement d’une table qui, elle, devait être définitive. 5.5.1 Quelques bonnes pratiques de gestion de vos tables Les tables sur lesquelles vous allez travailler existeront sur votre disque dur en plusieurs versions. Il convient que vous mettiez en place une organisation vous permettant de limiter le nombre de versions. Cette organisation passe par une gestion efficace de vos bibliothèques. Considérez déjà que la bibliothèque WORK porte bien son nom : c’est votre bibliothèque de travail, dans laquelle, en utilisant une table présente dans une bibliothèque non temporaire, vous allez pouvoir tester un programme. Il est donc conseillé d’avoir des étapes DATA incluant un SET de la forme suivante : DATA test; SET lib.important; … Vous n’écrirez jamais d’un seul jet le programme qui réalisera ce que vous souhaitez. Il n’est donc pas conseillé, lors de la phase de test du programme, d’adopter une programmation qui conduirait à remplacer votre table. DATA lib.important; SET lib.important; Si, dans un tel programme, vos instructions concourent à effacer des observations, des variables ou modifier des modalités de variables déjà existantes, vous n’aurez aucun moyen de revenir à votre table de départ. SAS Livre Page 176 Jeudi, 18. septembre 2008 6:03 18 176 ◆ SAS Au sein même des tables temporaires, les programmes qui demandent le remplacement d’une table par une autre table de même nom (DATA TEST ; SET TEST) peuvent s’avérer problématiques. Le programme 5.23 vous en donne un exemple. Programme 5.23 DATA test; DO x=1 TO 10; OUTPUT; END; RUN; DATA test; SET test; n+1; ** + des commandes qui vont être ajoutées au fur et à mesure de l’élaboration du programme complet; RUN; Dans une première phase, nous créons la table TEST. La seconde phase symbolise le programme que vous écrivez pour modifier votre table. Au cours de son élaboration, ce programme doit subir des modifications et des améliorations : vous allez le soumettre plusieurs fois. La ligne N + 1 a été introduite dès la première exécution du programme et subsiste dans toutes les versions de travail de votre programme. Exécutez maintenant la seconde phase du programme 5.23 plusieurs fois et ordonnez un PROC PRINT. Résultat 5.11 Obs 1 2 3 4 5 6 7 8 9 10 X n 1 2 3 4 5 6 7 8 9 10 16 17 18 19 20 21 22 23 24 25 Si la variable N est créée à la première exécution, lors des suivantes, vous partez de la variable N déjà présente dans la table pour lui ajouter 1. Si, pour la première observation, N est égal à 16, c’est donc parce que le programme a été exécuté seize fois. Pour éviter un tel problème1, adoptez ce genre de programmation : DATA test; SET lib.important (KEEP= uniquement les variables utiles); ** votre programme dans sa phase de construction; RUN; De façon à économiser vos ressources, dans un premier temps, travaillez seulement sur un extrait de votre table ne contenant que les variables utiles à l’élaboration de votre programme. Au moyen des outils que nous allons aborder dans le chapitre 6, 1. Examinez à nouveau l’exercice 3.3 : vous avez dû utiliser la fonction MISSING pour répondre à la question posée. Que va-t-il se passer si vous exécutez plusieurs fois votre programme et si vous êtes dans le cas DATA TEST ; SET TEST ? SAS Livre Page 177 Jeudi, 18. septembre 2008 6:03 18 Faciliter la gestion des tables SAS ◆ 177 vous vérifierez que votre programme construit bien les variables que vous souhaitez. Ensuite, une fois que vous serez sûr de votre programme, vous vous poserez la question du remplacement de la table écrite sur votre disque dur. Si votre programme modifie des variables existantes dans votre table de départ, s’il efface certaines variables existantes, s’il efface certaines observations ou si vous n’avez aucune sauvegarde externe de votre table, il est recommandé, pour plus de sécurité, de ne pas remplacer la table présente sur votre disque dur : DATA lib.important2 (DROP= les variables temporaires); SET lib.important; ** votre programme définitif; RUN; Si vous construisez des variables temporaires, qui en fait n’ont été utilisées que pour vous permettre de construire vos variables définitives, ne conservez pas ces variables. Maintenant, si vous êtes sûr que votre programme ne fait qu’ajouter des informations à votre table de départ (ou si vous disposez d’une sauvegarde), vous pourrez alors enregistrer votre nouvelle table via : DATA lib.important (DROP= les variables temporaires); SET lib.important; ** votre programme définitif; RUN; Dans tous les cas, vous devrez conserver votre programme définitif et détruire les versions de travail. 5.5.2 Empêcher SAS de réécrire une table de même nom Vous avez la possibilité de demander à SAS de refuser toutes commandes qui contribueraient à détruire une table existante dans une bibliothèque non temporaire au moyen de l’option NOREPLACE. OPTIONS NOREPLACE; Si vous avez ensuite besoin de remplacer une table par une table de même nom, vous pouvez désactiver l’option au moyen de la commande : OPTIONS REPLACE; Vous pouvez aussi, si l’option NOREPLACE est active, autoriser temporairement le remplacement des tables à l’intérieur de la commande DATA : DATA lib.important (REPLACE=yes); SET lib.important; … L’option NOREPLACE n’agit pas pour les tables de la bibliothèque temporaire. En revanche, au niveau de l’étape DATA, certains programmes empêchent le remplacement : DATA test (REPLACE=no); SET test3; … Si vous avez déjà une table TEST dans votre bibliothèque temporaire, elle ne sera pas remplacée et un message d’erreur s’affichera dans votre fenêtre JOURNAL pour vous l’indiquer. SAS Livre Page 178 Jeudi, 18. septembre 2008 6:03 18 178 ◆ SAS 5.6 La gestion des OPTIONS1 Dans la section 5.5.2., vous avez vu que l’on pouvait modifier le fonctionnement de SAS en spécifiant des options. Nous avons ainsi modifié le fonctionnement de SAS pour l’empêcher d’écraser une table existante dans une bibliothèque non temporaire. Dans cette section, nous allons tenter de modifier encore plus profondément le fonctionnement de SAS en lui demandant de ne pas détruire, à la fin de chaque session, les tables présentes dans la bibliothèque temporaire. Cet exercice a pour but de vous présenter la démarche et les outils dont vous disposez pour modifier le fonctionnement de SAS par défaut. 5.6.1 Les options de SAS Le fonctionnement de SAS est régi par plus de 350 options. Ces options sont regroupées par groupes que vous pouvez voir au moyen du programme suivant : PROC OPTIONS LISTGROUPS; RUN; Vous obtiendrez dans la fenêtre JOURNAL les différents groupes d’options : GROUP=COMMUNICATIONS GROUP=ENVDISPLAY GROUP=ERRORHANDLING GROUP=ENVFILES GROUP=LANGUAGECONTROL GROUP=EXECMODES GROUP=EXTFILES GROUP=SASFILES GROUP=INPUTCONTROL GROUP=GRAPHICS GROUP=LOGCONTROL GROUP=LISTCONTROL GROUP=LOG_LISTCONTROL GROUP=MACRO GROUP=SORT GROUP=INSTALL GROUP=MEMORY GROUP=PERFORMANCE GROUP=CODEGEN GROUP=ISPF GROUP=REXX GROUP=ADABAS GROUP=DATACOM GROUP=DB2 GROUP=IDMS GROUP=IMS GROUP=ORACLE GROUP=ODSPRINT GROUP=EMAIL GROUP=DATAQUALITY GROUP=HELP GROUP=META GROUP=PDF GROUP=SECURITY GROUP=SVG GROUP=SMF GROUP=SQL Gestion de réseaux et Chiffrement Affichage Traitement des erreurs Fichiers Contrôle du langage Initialisation et opération Fichiers externes Fichiers SAS Traitement des données Paramètres du pilote Journal SAS Résultat procédure Journal SAS et Résultat procédure Macro SAS Options de procédure Installation Mémoire Performance Génération du code ISPF REXX Adabas Datacom DB2 IDMS IMS Oracle Impression ODS E-mail Qualité des données Aide Métadonnées PDF SECURITY SVG SMF SQL 1. Certaines options ont déjà été évoquées : DFLANG (sections 2.8.3.a., 2.8.4.b. et 5.3.4.), NOFMTERR, FMTSEARCH (section 5.3.6.b.) et YEARCUTOFF (section 2.8.3.b.). SAS Livre Page 179 Jeudi, 18. septembre 2008 6:03 18 Faciliter la gestion des tables SAS ◆ 179 Si notre objet est d’empêcher SAS d’écraser les tables présentes dans la bibliothèque temporaire, nous nous disons que l’option, si elle existe, est présentée dans le groupe ENVFILES (Fichiers). Pour connaître les différentes options propres à ce groupe, vous pouvez exécuter le programme suivant : PROC OPTIONS GROUP=ENVFILES; RUN; Un rapide examen de la fenêtre JOURNAL, dans laquelle s’affiche la sortie générée par PROC OPTIONS, indique que nous devons nous concentrer sur les options WORKINIT et WORKTERM : WORKINIT WORKTERM Erase all files from WORK library at SAS invocation Erase files from WORK library at SAS termination Nous découvrons donc que les tables de la bibliothèque temporaire sont effacées lorsque votre session débute et lorsque votre session se termine1. Pour obtenir plus de détails sur ces options, vous pouvez exécuter le programme suivant : PROC OPTIONS DEFINE VALUE OPTION=WORKINIT; PROC OPTIONS DEFINE VALUE OPTION=WORKTERM; RUN; L’option VALUE vous donne, entre autres, la valeur de cette option dans votre système. L’option DEFINE permet d’indiquer : • un texte de description de l’option ; • le groupe de l’option ; • le type de l’option – option Booléenne (WORKINIT/NOWORKINIT) ou option pour laquelle vous devez spécifier une valeur (vous disposerez alors d’informations sur les valeurs possibles) ; • des informations relatives au moment où cette option peut être modifiée ; • s’il est possible que votre administrateur vous bloque l’accès à cette option ; • si PROC OPTSAVE et DMOPTSAVE disposent de la capacité d’enregistrer cette option. DMOPTSAVE est une commande à exécuter dans la fenêtre de commande (en haut à gauche) qui vous permet de sauvegarder dans une table l’ensemble des options actives pour ensuite les recharger lors d’une nouvelle session SAS via DMOPTLOAD. DMOPTSAVE SASUSER.mes_options / DMOPTLOAD SASUSER.mes_options Il est préférable d’enregistrer ces options dans SASUSER. PROC OPTSAVE réalise cette même sauvegarde mais à partir de l’EDITEUR. PROC OPTSAVE OUT=SASUSER.mes_options; RUN; Pour recharger vos options sauvegardées lors d’une session ultérieure, vous passerez par PROC OPTLOAD. PROC OPTLOAD DATA=SASUSER.mes_options; RUN; 1. Ce double effacement est utile lorsque votre session SAS ne se termine pas normalement, dans le cas d’une coupure d’électricité, par exemple. SAS Livre Page 180 Jeudi, 18. septembre 2008 6:03 18 180 ◆ SAS Nos options WORKINIT et WORKTERM présentent des caractéristiques différentes et importantes pour la suite de notre démarche. PROC OPTSAVE et DMOPTSAVE ne peuvent pas enregistrer l’option WORKINIT. WORKTERM When Can Optsave WORKINIT When Can Optsave Set: Démarrage ou à tout moment de la session SAS : Proc Optsave ou la commande Dmoptsave enregistreront cette option Set: Démarrage Environnement (détails inconnus) ou Démarrage Session uniquement : Proc Optsave ou la commande Dmoptsave n’enregistreront pas cette option. Nous apprenons ainsi que les options peuvent être modifiées à différents moments : • au démarrage (dans un fichier AUTOEXEC.SAS par exemple – voir section 5.6.4.) ; • au cours de la session ; • au démarrage environnement ; • au démarrage session (dans le fichier de configuration – voir section 5.6.3.). Si certaines options peuvent être modifiées quand vous le souhaitez, d’autres ne peuvent l’être qu’à certains moments très précis. 5.6.2 Le niveau de modification des options Vous décidez des options à appliquer de quatre manières. • La commande OPTIONS Spécifiez les options qui s’appliqueront dans la fenêtre EDITEUR au moyen d’une commande OPTIONS. Si, dans la fenêtre SORTIE, vous ne souhaitez plus voir les numéros de pages et la date, vous pouvez alors exécuter la commandes suivante : OPTIONS NODATE NONUMBER; Ces options ne s’appliqueront que pour la présente session. À la session suivante, les valeurs de ces options reviendront à celles par défaut. La valeur de l’option WORKTERM peut être modifiée à ce niveau – vous ne pouvez pas agir ici sur la valeur de WORKINIT. • La fenêtre OPTIONS de SAS Vous faites apparaître cette fenêtre en demandant l’exécution de la commande OPTIONS dans la fenêtre de commande (en haut à gauche). SAS Livre Page 181 Jeudi, 18. septembre 2008 6:03 18 Faciliter la gestion des tables SAS ◆ 181 Retrouvez alors l’option dont vous souhaitez modifier la valeur, puis cliquez dessus. Les modifications apportées ne seront valables que pour la session courante. La valeur de l’option WORKTERM peut être modifiée à ce niveau contrairement à WORKINIT. • SAS invocation Vous pouvez demander l’ouverture de SAS au moyen de la fenêtre EXECUTER de Windows. En plus de la demande d’ouverture de SAS, vous pouvez indiquer certaines options comme le montre la figure suivante : Ces options seront actives uniquement pour la session qui débutera. Les valeurs de WORKINIT et de WORKTERM peuvent être modifiées à ce niveau. • Fichier de configuration Les options que vous spécifierez dans le fichier de configuration SASV9.CFG seront systématiquement actives. Pour les désactiver, vous devrez modifier votre fichier de configuration. 5.6.3 La modification du fichier de configuration SASV9.CFG La modification du fichier de configuration n’est pas une chose à envisager à la légère. Elle peut avoir des conséquences extrêmement graves sur le fonctionnement de SAS puisque ce fichier auquel SAS fait appel quand vous débutez une section contient des informations essentielles à son bon fonctionnement. Avant toute modification de SASV9.CFG, effectuez une sauvegarde de ce fichier. Pour trouver l’endroit physique où est enregistré votre fichier de configuration, si vous êtes sous Windows, cliquez dans Windows sur Démarrer, retrouvez l’icône SAS et cliquez du bouton droit pour demander les propriétés. SAS Livre Page 182 Jeudi, 18. septembre 2008 6:03 18 182 ◆ SAS Le chemin vers votre fichier SASV9.CFG est indiqué dans l’onglet Raccourci/cible. Ce fichier peut être édité au moyen du Bloc-notes de Windows. Vous pouvez alors ajouter l’instruction parmi les premières lignes : -NOWORKINIT N’oubliez pas le tiret juste avant l’instruction. Vous ne pouvez intervenir que dans la partie supérieure du fichier de configuration. N’intervenez jamais après la ligne : /* DO NOT EDIT BELOW THIS LINE – INSTALL Application edits below this line */ Il est possible que vous obteniez en fait un fichier très court d’une seule ligne avec une seule instruction CONFIG : -CONFIG "C:\Program Files\SAS\SAS 9.1\nls\fr\SASV9.CFG" Ce fichier, généralement situé dans le même répertoire que votre fichier SAS.EXE, n’est pas votre fichier de configuration réel1 mais vous avez quand même la possibilité d’y introduire vos modifications d’options. Elles doivent cependant impérativement intervenir avant l’instruction CONFIG. Enregistrez ensuite votre fichier de configuration. Au début de votre prochaine session SAS, l’option sera active. Elle restera active de session en session tant que vous ne retirerez pas la ligne NOWORKINIT de votre fichier de configuration. N’effacez jamais votre fichier de configuration ! 5.6.4 AUTOEXEC.SAS Les options que l’on spécifie au moyen d’une commande OPTIONS ne sont valables que pour la durée de votre session (NOWORKTERM ou NODATE par exemple). Vous pourriez souhaiter voir des options appliquées systématiquement. Il est possible de les ajouter à votre fichier SASV9.CFG mais étant donné que les modifications de ce 1. Mais il vous permet de retrouver l’endroit sur votre disque dur où est placé votre fichier de configuration. SAS Livre Page 183 Jeudi, 18. septembre 2008 6:03 18 Faciliter la gestion des tables SAS ◆ 183 fichier sont à éviter parce que dangereuses, nous vous conseillons plutôt de préciser ces options dans un fichier AUTOEXEC.SAS. Dans ce fichier, qui sera exécuté au début de chaque session SAS, vous pouvez spécifier un ensemble de tâches. Nous allons ici utiliser ce fichier pour définir des options que l’on va vouloir appliquer de session en session mais vous pourriez tout à fait demander tout autre chose (par exemple, la construction d’une table mise à jour des données de la veille au moyen de données présentes sur Internet). Si ce fichier n’existe pas encore sur votre ordinateur, vous pouvez l’écrire à partir de votre fenêtre EDITEUR et y introduire toutes les commandes propres au langage SAS. Le programme 5.24 vous donne quelques exemples : Programme 5.24 ** ceci est mon autoexec.sas; OPTIONS NODATE NONUMBER NOWORKTERM; TITLE "Session SAS de SR"; LIBNAME lib "C:\intro_SAS\fichiers\"; ** fin de mon fichier autoexec.sas; Vous devez ensuite enregistrer ce fichier en l’appelant AUTOEXEC.SAS sur votre disque dur, à l’endroit où se trouve SAS.EXE. Sous Windows, avec SAS 9.2, un chemin typique vers ce fichier est : C:\Program Files\SAS9.2\SASFoundation\9.2 Avec SAS 9.1, le chemin typique est : C:\Program Files\SAS\SAS 9.1 Quittez SAS, puis débutez une nouvelle session : vos commandes sont exécutées dès l’ouverture de la session. Détruisez le fichier si vous ne souhaitez plus que ces options s’appliquent. Si le fichier AUTOEXEC.SAS existe déjà, ouvrez ce fichier et ajoutez les commandes que vous souhaitez. Les tables de la bibliothèque temporaire ne seront désormais plus effacées de session en session1 : nous avons pour cela modifié le fichier de configuration et créé un fichier AUTOEXEC.SAS. Il n’est pas aisé d’annuler les options que vous avez pu entrer au cours de votre session SAS et les options présentes dans votre fichier AUTOEXEC.SAS. Il n’existe pas d’instruction de retour aux valeurs par défaut des options. Votre seule possibilité est d’enregistrer, avant modifications, vos options par défaut dans une table via PROC OPTSAVE, puis, au moment où vous souhaitez revenir aux options par défaut, exécuter un PROC OPTLOAD. Les options que l’on peut spécifier uniquement dans le fichier de configuration ne peuvent cependant pas être modifiées au cours d’une session SAS. 1. Ceci n’est en fait pas conseillé et ne doit être envisagé que de manière temporaire. SAS Livre Page 184 Jeudi, 18. septembre 2008 6:03 18 SAS Livre Page 185 Jeudi, 18. septembre 2008 6:03 18 6 Quelques procédures de base Au sommaire de ce chapitre : 6.1. Titres, pieds de pages de vos sorties dans la fenêtre SORTIE 6.2. PROC MEANS 6.3. PROC UNIVARIATE 6.4. PROC PRINT 6.5. PROC REPORT 6.6. PROC FREQ 6.7. PROC TABULATE Ce chapitre vous présente un ensemble de procédures qui vous aideront dans votre travail sur vos tables en amont et en aval de votre analyse. En amont, parce que ces procédures vont vous permettre de « voir » vos données, de les comprendre, d’en apprécier la qualité, d’obtenir des informations qui vous aideront à construire vos variables, de vérifier si elles ont été correctement créées, de constater l’existence de certaines relations entre vos variables et peut-être de modifier votre approche en créant de nouvelles variables. Les procédures qui vont être exposées sont donc essentielles non seulement pour connaître et comprendre vos variables, mais également à la préparation des données qui seront ensuite analysées. Si vous ne connaissez pas vos données, si vous ne les comprenez pas, si vous ne les préparez pas, il est très peu probable que votre analyse conduise à un résultat convaincant. Ces procédures vous aideront aussi en aval de votre analyse, parce que tout travail d’analyse, aussi pointu qu’il puisse être, s’accompagne nécessairement d’un travail de présentation des données utilisées. Si vous souhaitez partager les résultats de votre analyse, vos auditeurs ou vos lecteurs auront besoin de tableaux de présentation de vos données ou de statistiques descriptives. SAS Livre Page 186 Jeudi, 18. septembre 2008 6:03 18 186 ◆ SAS 6.1 Titres et pieds de pages de vos sorties dans la fenêtre SORTIE Quelle que soit la procédure que vous envisagez d’utiliser, afin que ces résultats soient le plus parlant possible, vous pouvez être amené à vouloir, dans votre fenêtre SORTIE des titres ou des pieds de pages particuliers et autres que le : Le Système SAS 21:55 Monday, April 14, 2008 1 Pour retirer le titre par défaut (« Le Système SAS ») ou n’importe quel autre titre : TITLE; Il s’agit là d’une commande SAS qui peut être soumise à n’importe quel moment (en dehors ou à l’intérieur d’une étape DATA ou d’une étape PROC commandant une sortie). Pour définir un titre : TITLE "Ceci est mon nouveau titre"; Si vous soumettez cette commande, toutes vos sorties auront alors comme titre celui que vous venez d’indiquer et ce, jusqu’à ce que vous définissiez un nouveau titre ou jusqu’à ce que vous demandiez à SAS d’effacer ce titre par une instruction TITLE. Vous souhaitez un titre sur deux lignes : TITLE2 "Il est sur deux lignes"; Une nouvelle instruction TITLE enlèvera les deux titres que vous venez de définir. Les instructions TITLE et TITLE1 sont équivalentes. Si, au lieu de TITLE2, vous soumettez : TITLE1 "Il est sur deux lignes"; Cela efface le TITRE "ceci est mon nouveau titre" (comme le ferait une instruction TITLE) et efface le TITLE2. Le fait de définir un TITLEx, efface tous les titres supérieurs s’ils ont été définis. Ainsi, nous avons soumis trois titres TITLE1, TITLE2 et TITLE3. Si vous modifiez TITLE2, TITLE1 ne sera pas modifié, TITLE2 sera modifié (à votre demande) et TITLE3 sera effacé. Vous pouvez ensuite souhaiter une nouvelle police plus agréable. Dans les procédures qui impliquent une sortie dans la fenêtre SORTIE, vous avez le choix entre quelques polices d’affichage (très peu en fait). Vous pouvez modifier cette police lorsque, dans la fenêtre SORTIE, vous cliquez du bouton droit, puis sélectionnez TOOLS et FONT. Mais vous constaterez que les outils dont vous disposez pour réaliser une mise en page dans votre fenêtre SORTIE sont très réduits. Si vous souhaitez une réelle mise en page, vous devrez passer par une procédure ODS (voir chapitre 8). Diverses options sont cependant possibles et accessibles au moyen de la commande OPTIONS introduite dans la section 5.6. : CENTER/NOCENTER Centre ou pas les résultats de la fenêtre SORTIE. DATE/NODATE Imprime ou pas la date. SAS Livre Page 187 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 187 LINESIZE= Modifie la largeur des pages SORTIE (64 <> 256). PAGESIZE= Modifie la longueur des pages SORTIE (15<>32767). NUMBER/NONUMBER Affiche ou pas des numéros de page. PAGENO=n Commence à numéroter à n. ORIENTATION=PORTRAIT/LANDSCAPE Orientation de la feuille. RIGHTMARGIN= x cm, LEFTMARGIN= x cm, TOPMARGIN= x cm, BOTTOMMARGIN= x cm Marges droite, gauche, haut et bas. Les titres TITLE et FOOTNOTE peuvent aussi être définis à l’intérieur de la procédure qui commande votre sortie. Les pieds de pages (FOOTNOTE) obéissent aux mêmes règles que les titres. 6.2 PROC MEANS La procédure PROC MEANS permet d’obtenir des statistiques simples sur vos variables numériques. Elle peut être utile aussi bien dans une phase d’exploration de vos données, que dans des phases de modification de vos tables ou dans une phase de présentation de vos données1. La syntaxe de base de cette procédure est la suivante : PROC MEANS < liste-option > <mots-clés statistiques>; BY liste-de-variables; CLASS liste-de-variables <option(s)>; FREQ variable ; ID variable(s); OUTPUT <OUT=table SAS><liste_OUTPUT_statistique> <id-group-spec(s)> <max-id-spec(s)> <min-id-spec(s)> </option(s)>; TYPES requete(s); VAR liste de variables </WEIGHT=variable-poids>; WAYS entiers; WEIGHT variable ; 1. Les sorties que vous obtenez au moyen de PROC MEANS peuvent aussi être obtenues au moyen de PROC SUMMARY avec une syntaxe parfaitement identique à celle de PROC MEANS. Vous devez juste ajouter une option PRINT : PROC SUMMARY DATA=test PRINT;. SAS Livre Page 188 Jeudi, 18. septembre 2008 6:03 18 188 ◆ SAS Quelques options possibles de PROC MEANS sont1 : DATA= Spécifie la table sur laquelle produire vos statistiques. Comme pour toute procédure, si vous ne spécifiez rien, la table utilisée sera la dernière créée. Si vous faites appel à d’autres options à ce niveau, vous devez renseigner DATA=. MISSING Cette option vous permet de ne pas exclure les valeurs manquantes de vos variables de classification. FW= Spécifie la largeur des colonnes dans lesquelles sont présentées les statistiques demandées (égale à 12 par défaut). MAXDEC= Spécifie le nombre de chiffres après la virgule. ORDER= Spécifie l’ordre des modalités des variables de classification. Vous avez là le choix entre : • DATA. Ordonne les modalités des variables de classification en fonction de l’ordre dans lequel elles apparaissent dans la table. • FORMATTED. Affiche dans l’ordre alphabétique des modalités du FORMAT si vous avez appliqué un FORMAT à vos variables de classification. • FREQ. Ordonne dans un ordre croissant les fréquences des modalités de vos variables de classification. • UNFORMATTED. Peut afficher les FORMAT mais présente les variables de classification de façon ordonnée en fonction des modalités non formatées (fonctionnement par défaut). Nous présenterons par la suite d’autres options au moyen d’exemples. C’est par exemple au niveau de cette ligne que vous spécifiez les statistiques produites par PROC MEANS. Les instructions BY Ordonne la production de statistique par valeur de la variable BY – la table doit être triée au préalable. CLASS Liste la ou les variables de classification. Seront produites des statistiques par modalité de la ou des variables de classification – les résultats obtenus au moyen d’une instruction CLASS sont identiques à ceux obtenus au moyen d’un BY (mêmes 1. Lorsque nous présenterons une procédure, nous ne citerons que les options principales. Consultez l’aide SAS pour obtenir la liste complète des options. Onglet Sommaire : SAS PRODUCTS / BASE SAS / SAS PROCEDURES / PROCEDURES. Les procédures exposées dans cette section ont en commun les commandes WHERE, LABEL FORMAT et ATTRIB. Ces instructions ne sont pas reprises dans les exposés des syntaxes propres à chaque procédure. SAS Livre Page 189 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 189 statistiques calculées). La présentation est cependant plus ramassée. Vous n’avez pas besoin d’un tri préalable de la table. FREQ Identifie une variable numérique qui contient la fréquence de chaque observation. ID En cas de production d’une table de résultats demandée par OUTPUT ou dans le tableau produit dans la fenêtre SORTIE (si vous spécifiez PRINTIDVARS en option de PROC MEANS), ajoute la valeur maximale prise par la variable ID (valeur minimale si option IDMIN dans PROC MEANS). OUTPUT Commande la production d’une table de sortie dans laquelle seront stockées les statistiques produites. TYPES Spécifie les croisements souhaités de vos variables de classification. VAR Liste les variables sur lesquelles produire des statistiques. WAYS Indique le nombre de croisements entre vos variables de classification. Si, par exemple, vous avez trois variables de classification (X1-X3) et si vous spécifiez WAYS 2, les croisements dans vos variables de classification seront les X1*X2, X1*X3 et X2*X3. WEIGHT Spécifie la variable de pondération. Pour cette section, nous utiliserons le fichier ELEVE2.TXT. Dans ce fichier, vous trouverez le sexe de l’individu (H/F) ainsi que son prénom, sa date de naissance, la couleur de ses cheveux (1 : blond 2 : châtain 3 : brun 4 : autre), son QI, sa taille en centimètres et son poids. Le programme 6.1 crée la table ELEVE. Programme 6.1 DATA eleve; INFILE 'C:\intro_SAS\fichiers\eleve2.txt'; INPUT sexe $ prenom :$12. datenais :DDMMYY10. cheveux qi taille poids; age=INTCK('year',datenais,'23OCT2007’d); RUN; Commençons par la procédure la plus simple et voyons ce que nous obtenons. Programme 6.2 PROC MEANS DATA=eleve; RUN; SAS Livre Page 190 Jeudi, 18. septembre 2008 6:03 18 190 ◆ SAS Résultat 6.1 La procédure MEANS Variable Nb Moyenne Écart-type Minimum Maximum ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ datenais 314 11306.56 360.5781094 10593.00 12051.00 cheveux 314 2.2324841 0.9492366 1.0000000 4.0000000 Qi 314 100.2197452 8.0191141 70.0000000 121.0000000 taille 314 164.2006369 7.3263409 149.0000000 186.0000000 poids 314 66.6719745 7.9292425 48.0000000 89.0000000 age 314 16.4808917 0.9294358 15.0000000 18.0000000 ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Sur les variables numériques, SAS vous indique par défaut une moyenne, un écarttype, le minimum et le maximum en plus du nombre de points sur lesquels il a effectué les calculs. Sur les variables numériques CHEVEUX et DATENAIS, la moyenne n’a bien sûr aucun sens. Vous pouvez spécifier les variables pour lesquelles vous souhaitez des statistiques simples au moyen de la commande VAR. Programme 6.3 PROC MEANS DATA=eleve; VAR qi taille poids; RUN; Si vous souhaitez des statistiques différenciées en fonction du sexe, vous utiliserez l’instruction CLASS. Programme 6.4 PROC MEANS DATA=eleve; CLASS sexe; VAR qi taille poids; RUN; On aboutit au même résultat si, au lieu d’un CLASS, on passe par un BY (sauf qu’il faut classer la table au préalable et que le résultat est moins ramassé qu’avec l’instruction CLASS) : Programme 6.5 PROC SORT DATA=eleve; BY sexe; RUN; PROC MEANS DATA=eleve; BY sexe; VAR qi taille poids; RUN; 6.2.1 Le choix des mots clés statistiques Les mots clés statistiques suivants sont disponibles dans PROC MEANS : CLM CSS CV RANGE SKEWNESS | SKEW STDDEV | STD SAS Livre Page 191 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 191 KURTOSIS | KURT LCLM MAX MEAN MIN N NMISS STDERR SUM SUMWGT UCLM USS VAR mots-clés quantiles : MEDIAN | P50 P1 P5 P10 Q1 | P25 Q3 | P75 P90 P95 P99 QRANGE Mots clés de test d’hypothèses : PROBT T Il s’agit là de statistiques usuelles. Si vous souhaitez plus de renseignements quant au mode de calcul de ces statistiques, vous pouvez consulter l’aide SAS (entrée KEYWORD, puis FOR STATISTICS)1. Depuis SAS 9.2, le mode peut être calculé par PROC MEANS via le mot-clé MODE. Programme 6.6 PROC MEANS DATA=eleve N MIN MAX MEAN CLM; VAR qi taille poids; RUN; Si vous spécifiez une statistique à réaliser dans la ligne PROC MEANS, SAS ne calculera que cette statistique (les statistiques par défaut ne sont plus calculées – si vous les souhaitez, il faut ajouter les mots clés correspondant à ces statistiques). CLM réalise un encadrement autour de la moyenne, à 95 % (niveau de confiance 5 %). Si vous souhaitez un seuil de risque différent, vous le spécifiez via le mot-clé statistique ALPHA=0.1 par exemple. 6.2.2 Les tables d’OUTPUT Il est possible d’enregistrer des résultats dans une table pour effectuer ensuite des retraitements, par exemple, au moyen de la commande OUTPUT. Programme 6.7 PROC MEANS DATA=eleve; VAR qi taille poids; OUTPUT OUT=toto; RUN; PROC PRINT DATA=toto; RUN; 1. Pour plus d’explications, consultez le tableau 6.1 (section 6.5.3.b.) et la section 6.7.1. SAS Livre Page 192 Jeudi, 18. septembre 2008 6:03 18 192 ◆ SAS Vous obtiendrez alors dans la table de résultats les statistiques calculées par défaut : Résultat 6.2 Obs _TYPE_ _FREQ_ 1 2 3 4 5 0 0 0 0 0 314 314 314 314 314 _STAT_ N MIN MAX MEAN STD qi 314.000 70.000 121.000 100.220 8.019 taille poids 314.000 149.000 186.000 164.201 7.326 314.000 48.000 89.000 66.672 7.929 Exercice 6.1 (révision MERGE) : Vous souhaitez pouvoir disposer de variables supplémentaires indiquant, en fonction du sexe de l’individu, l’écart entre ce que vous observez pour lui (sur le QI, la taille et le poids) et la moyenne observée sur les individus du même sexe. Merci de merger la table de résultats créée avec votre table SAS de départ de façon à pouvoir calculer ces écarts à la moyenne (ici, vous ne devriez pas avoir de difficultés). Contruisez une nouvelle variable mesurant cette fois-ci l’écart entre le poids de la personne et le poids moyen, tous sexes confondus (c’est plus délicat qu’il n’y paraît – voir section 4.2.6.). Il est possible d’attribuer des noms spécifiques aux statistiques calculées (et cela est relativement utile pour traiter l’exercice précédent). Ainsi : Programme 6.8 PROC MEANS DATA=eleve; VAR qi taille poids; OUTPUT OUT=toto MEAN=qi_m taille_m poids_m; RUN; Les statistiques non demandées ne seront pas jointes dans la table de résultats (ici, seules les moyennes seront dans la table TOTO). Il est possible de demander dans la table de résultats toutes les statistiques évoquées dans la section 6.2.1., sur toutes les variables spécifiées après l’instruction VAR. Cependant, il est nécessaire de définir des noms pour chacune des statistiques sur chaque variable. Programme 6.9 PROC MEANS DATA=eleve; VAR qi taille poids; OUTPUT OUT=toto MEAN=qi_m taille_m poids_m MEDIAN=qi_med taille_med poids_med; RUN; Cette définition systématique peut se révéler très fastidieuse si vous demandez un nombre important de statistiques sur un nombre élevé de variables. Vous pourrez alors utiliser les options AUTONAME et AUTOLABEL. Programme 6.10 PROC MEANS DATA=eleve; VAR qi taille poids; OUTPUT OUT=toto MEAN= MEDIAN= / AUTONAME AUTOLABEL; RUN; SAS Livre Page 193 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 193 Dans ce cas, le fichier de résultat ne comportera qu’une seule ligne, avec l’ensemble des statistiques demandées. Le nom d’une statistique générée par AUTONAME est : nomdelavariable_nomdelastat. On distingue les statistiques demandées en option de PROC MEANS des statistiques demandées dans la table de résultat. Ainsi, vous pouvez demander la moyenne dans votre fenêtre de sortie et demander la médiane dans la table de résultat sans que celleci apparaisse dans la fenêtre SORTIE. En outre, l’instruction MAXID (MINID) permet de visualiser dans la table de résultats les individus correspondant aux valeurs maximales (minimales) : Programme 6.11 PROC MEANS DATA=eleve; CLASS sexe; VAR qi taille poids; OUTPUT OUT=toto MAX= qi_max taille_max poids_max MAXID (qi(prenom) taille(prenom) poids(prenom)) = Intelligent Grand Fort; RUN; Résultat 6.3 Obs 1 2 3 sexe _TYPE_ _FREQ_ F H 0 1 1 314 132 182 qi _max 121 114 121 taille poids _max _max Intelligent 186 186 184 89 87 89 Giang Barbara Giang Grand Fort Laetitia Laetitia Benoît Julian Laetitia Julian 6.2.3 La paramétrisation de vos sorties De nombreuses options permettent de paramétrer vos sorties. Vous pouvez par exemple vouloir produire vos statistiques sur un sous-échantillon de votre table. Programme 6.12 PROC MEANS DATA=eleve; WHERE sexe='H'; VAR taille;s RUN; Cette commande WHERE, déjà évoquée dans la section 3.3.2.b. lorsqu’il s’agissait de sélectionner des observations en fonction de critères, est possible dans de nombreuses procédures SAS. Elle limite dans ce cas l’exécution des procédures à la partie de la table qui satisfait à la condition énoncée par WHERE. Si vous utilisez plusieurs variables de classification, il est aussi possible de personnaliser vos sorties : Programme 6.13 PROC MEANS DATA=eleve; CLASS age sexe cheveux; VAR taille; RUN; SAS Livre Page 194 Jeudi, 18. septembre 2008 6:03 18 194 ◆ SAS Si vous exécutez le programme 6.13, vous allez obtenir 32 lignes de résultats parce que SAS va croiser l’ensemble des modalités des variables de classification et vous offrir ensuite pour chaque croisement les statistiques usuelles1. Une première manière de paramétrer vos sorties est l’emploi de la commande TYPES. Programme 6.14 PROC MEANS DATA=eleve; CLASS age sexe cheveux; TYPES sexe*(age cheveux); VAR taille; RUN; Vos statistiques seront ici calculées pour les croisements de SEXE et AGE, puis de SEXE et CHEVEUX. Vous n’aurez aucune statistique pour les croisements AGE*CHEVEUX. Si vous ajoutez l’option ‘()’ dans votre ligne TYPES, vous aurez en plus les statistiques toutes modalités des variables de classification confondues. Il se peut ensuite que, parmi les croisements de vos variables de classification, vous ne soyez pas intéressé par certains croisements. Une commande WHERE est ici possible mais n’est pas recommandée. Dans ce cas, il est plus efficace de construire au préalable une table qui indiquera les croisements sur lesquels vous souhaitez présenter vos statistiques : Programme 6.15 DATA class; INPUT age cheveux; CARDS; 15 1 15 2 15 3 15 4 17 1 17 2 18 1 18 4 ;RUN; PROC MEANS DATA=eleve CLASSDATA=class EXCLUSIVE; CLASS age cheveux; VAR taille; RUN; Pour obtenir des statistiques uniquement pour les croisements spécifiés dans la table CLASS, vous devez indiquer l’option EXCLUSIVE en plus de l’option CLASSDATA=. En ajoutant l’option PRINTALLTYPES à PROC MEANS, vous aurez de plus des statistiques pour chaque modalité de vos variables de classification et sur l’ensemble des individus. Attention, ces statistiques récapitulatives seront établies sur les observations présentées dans les croisements que vous avez spécifiés dans votre table CLASS (les personnes de 16 ans, les personnes de 17 ans ayant des cheveux 3 et 4 ainsi que les personnes de 18 ans ayant des cheveux 2 et 3 seront donc exclues). 1. 2 modalités pour SEXE, 4 modalités pour CHEVEUX et 4 modalités pour AGE = 32 lignes. SAS Livre Page 195 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 195 6.3 PROC UNIVARIATE Comme PROC MEANS, cette procédure propose un ensemble de statistiques descriptives, mais également : • des calculs de statistiques descriptives basés sur les moments ; • le calcul des modes, médianes, écarts interfractiles et quantiles ; • des détails sur les valeurs extrêmes des séries ; • des tableaux de fréquences ; • des outils graphiques permettant de visualiser les distributions ; • des tests statistiques ; • des tests de normalités des distributions… Il s’agit donc d’une procédure extrêmement puissante que nous ne décrirons que partiellement. Elle nous intéresse particulièrement par sa capacité à produire des statistiques non produites par PROC MEANS. Vous pouvez consulter la documentation SAS pour de plus amples renseignements. La partie de la syntaxe que nous utiliserons est tout à fait analogue à la syntaxe propre à PROC MEANS. Nous analysons à nouveau pour cette section la table ELEVE créée par le programme 6.1. Programme 6.16 PROC UNIVARIATE DATA=eleve; VAR poids; RUN; En plus des statistiques que vous pouvez avoir au moyen de PROC MEANS, vous obtenez des tests sur la moyenne (TESTS FOR LOCATION: MU0=0)1. Résultat 6.4 Procédure UNIVARIATE Variable : poids Moments N Moyenne Ecart-type Skewness Somme des carrés non corrigée Coeff. variation 314 66.6719745 7.92924247 0.0353823 1415457 11.8929168 Somme des poids Somme des observations Variance Kurtosis Somme des carrés corrigée Moy. erreur std 314 20935 62.8728862 0.3092238 19679.2134 0.44747304 Mesures statistiques de base Tendance centrale Moyenne Médiane Mode 66.67197 67.00000 67.00000 Dispersion Ecart-type Variance Intervalle Ecart interquartile 7.92924 62.87289 41.00000 11.00000 NOTE: Le mode affiché est le plus petit des 2 modes avec un effectif de 21. 1. Trois tests sont ici proposés : un test de student, un test de signe et un test de Wilcoxon. Ils testent tous les trois la possibilité que la valeur centrale soit égale à 0. Le test de student est valable s’il porte sur des données à peu près normalisées. Si ce n’est pas le cas, utilisez plutôt les tests non paramétriques (test de signe et test de Wilcoxon) qui sont des tests de médiane – Wilcoxon suppose une distribution symétrique. SAS Livre Page 196 Jeudi, 18. septembre 2008 6:03 18 196 ◆ SAS Tests de position : Mu0=0 Test -Statistique- -----p Value------ t de Student Signe Rangs signés t M S Pr > |t| Pr >= |M| Pr >= |S| 148.9966 157 24727.5 <.0001 <.0001 <.0001 Quantiles (Définition 5) Quantile 100% Max 99% 95% 90% 75% Q3 50% Médiane 25% Q1 10% 5% 1% 0% Min Valeur estimée 89 85 80 77 72 67 61 56 54 49 48 Observations extrêmes ----Plus bas--- ---Plus haut--- Valeur Obs. Valeur Obs. 48 49 49 49 50 308 185 113 79 245 84 85 86 87 89 65 287 12 272 215 Cette procédure vous sera utile dans votre phase d’exploration préalable des données en vous permettant de mieux voir, par exemple, les valeurs extrêmes de certaines variables pour ensuite tenter de les corriger (si cela est possible). Elle peut aussi vous être utile dans les phases de modification de vos tables. Imaginons par exemple que vous souhaitiez, au sein de votre table, construire une variable valant 1 si l’individu présente un poids inférieur au 20e percentile des poids des individus de son sexe, valant 2 s’il est supérieur au 80e percentile et valant 3 sinon. Les statistiques P20 et P80 ne peuvent pas être obtenues au moyen de PROC MEANS : vous devez utiliser PROC UNIVARIATE. Il convient alors de créer une table de résultats pour ensuite la merger avec votre table initiale avant de construire votre variable1. Le programme s’écrit alors : Programme 6.17 PROC UNIVARIATE DATA=eleve; CLASS sexe; VAR poids; OUTPUT OUT=test MEAN=moyenne PCTLPTS=20 80 PCTLPRE= poids PCTLNAME= p20 p80; RUN; L’instruction PCTLPTS précise les percentiles que vous souhaitez connaître ; PCTLPRE indique le préfixe commun aux variables à créer dans la table de résul1. Le langage macro vous permet d’obtenir un résultat identique plus simplement (voir chapitre 9). SAS Livre Page 197 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 197 tats ; PCTLNAME précise les suffixes (qui doivent impérativement commencer par une lettre). Nous avons aussi demandé à ce que les moyennes par sexe soient présentes dans la table. La table TEST est donc de la forme présentée par le résultat 6.5. Résultat 6.5 Obs sexe moyenne poidsp20 poidsp80 1 2 F H 64.4015 68.3187 57 61 71 75 Une fois vos deux tables triées en fonction de la clé SEXE, vous pourrez réaliser votre MERGE et construire votre nouvelle variable. Vous remarquerez que les tables produites par PROC UNIVARIATE sont plus condensées que celles produites par PROC MEANS. Pour obtenir une liste des statistiques possibles dans une table OUTPUT de PROC UNIVARIATE, vous pouvez consulter l’aide SAS (entrée UNIVARIATE procedure, puis output data sets). 6.4 PROC PRINT Depuis le début de cet ouvrage, nous avons utilisé PROC PRINT pour voir l’allure des tables que nous créons. Or, cette procédure offre d’autres options particulièrement intéressantes. Vous pourrez notamment l’utiliser pour réaliser des tableaux simples, sur des variables non croisées. 6.4.1 PROC PRINT pour des sorties dans la fenêtre SORTIE La syntaxe de base de cette procédure est la suivante : PROC PRINT < liste-option > ; VAR liste-de-variables ; ID liste-de-variables ; BY liste-de-variables ; PAGEBY variable-BY ; SUMBY variable-BY ; SUM liste-de-variables ; VAR Nomme les variables à imprimer. Les variables seront imprimées suivant leur ordre d’apparition dans l’instruction VAR. S’il n’y a pas d’instruction VAR, toutes les variables seront imprimées. ID Permet de mettre certaines variables en évidence en les imprimant dans les premières colonnes de la liste. Les numéros d’observations ne sont pas repris dans la sortie si vous spécifiez une variable ID. BY Entraîne l’impression des observations par modalité de la variable BY. SAS Livre Page 198 Jeudi, 18. septembre 2008 6:03 18 198 ◆ SAS PAGEBY Va à la page à chaque changement de modalité de la variable PAGEBY, ou de tout changement de variable définie avant elle. L’utilisation de PAGEBY nécessite l’utilisation de BY. SUMBY Présente un total à chaque changement de modalité d’une variable SUMBY, ou de tout changement de variable définie avant elle ; l’utilisation de SUMBY nécessite l’utilisation de BY. SUM Nomme les variables dont on souhaite le calcul de totaux. Si vous utilisez un BY, vous devrez impérativement1 réaliser un PROC SORT sur les mêmes variables et dans le même ordre que celui que vous présentez dans votre instruction BY. Les options suivantes peuvent être utilisées au niveau de la ligne PROC PRINT2. DATA=table-système-SAS Spécifie la table à utiliser ; si DATA= est omis, SAS utilise la dernière table créée. NOOBS Entraîne la suppression des numéros des observations. LABEL | L Demande l’utilisation des LABEL des variables (au lieu des noms des variables comme en-têtes de colonnes, les étiquettes peuvent être spécifiées lors de l’étape DATA ou dans la procédure PROC PRINT). SPLIT=‘caractère-split’ Scinde les étiquettes à chaque apparition du ‘caractère-split’ dans le texte qui suit l’instruction LABEL. N Imprime le nombre d’observations dans le fichier à la fin de la liste. ROUND | R Arrondit les valeurs à un nombre de décimales précisé dans une instruction FORMAT. Si aucun FORMAT n’est précisé, SAS arrondit à deux décimales. DOUBLE | D Entraîne un espacement double de la liste. 1. En réalité, le tri préalable n’est pas obligatoire. Vous pouvez ajouter suite au BY variable une option NOTSORTED qui indique à SAS que le fichier n’est pas trié ; BY x1 NOTSORTED;. Le temps nécessaire à l’obtention du résultat sera cependant plus long. De plus, certaines procédures n’acceptent pas le BY X1 NOTSORTED. 2. Certaines options ne seront pas présentées dans cet ouvrage. L’option STYLE est présentée dans la section 6.4.2. CONTENTS= est présenté dans la section 8.5.7. consacrée à ODS PDF. SAS Livre Page 199 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 199 UNIFORM | U Demande l’impression des valeurs des variables dans des colonnes de taille identique. Le fichier que nous allons utiliser pour comprendre l’intérêt de ces diverses commandes est VENDEURCELLULES.PRN : le disque vinyle revient en force et, dans le fichier donné, on dispose des ventes réalisées par cinq vendeurs d’un magasin de haute fidélité au cours des 12 mois de l’année 2007, pour trois références (DL-103, Goldring eroica LX et Ortofon Nr 2). Vous disposez ensuite du prix de vente de chaque cellule ainsi que du nombre d’unités vendues, par vendeur, par mois de l’année et par référence. Exercice 6.2 : Créez une table SAS au moyen du fichier VENDEURCELLULES.PRN (variables VENDEUR, MOIS, REFERENCE, PRIX, QUANTITE). Ajoutez une variable mesurant le chiffre d’affaires réalisé par vendeur, par période, par référence de cellule (CA). Les programmes suivants vous permettent d’obtenir des résultats que nous allons vous décrire sans forcément vous les proposer dans cet ouvrage. Toutes les sorties accompagnées de leurs programmes sont présentées sur le site Internet compagnon de cet ouvrage. Sur la base de cette table, la commande la plus simple que vous pouvez réaliser est : Programme 6.18 PROC PRINT DATA=cellule; TITLE 'Impression du fichier complet'; RUN; Vous pouvez aussi limiter le nombre d’observations à imprimer et éliminer la colonne OBS. Programme 6.19 PROC PRINT DATA=cellule (OBS=10) NOOBS; TITLE 'Impression du fichier – extrait'; TITLE2 'Seulement 10 observations'; RUN; Vous pouvez demander à ce que les références de cellules apparaissent en premier. En effet, lors d’une procédure PRINT, si vous ne précisez pas VAR, SAS met en première colonne la première variable pour lui (celle située en premier sur la ligne INPUT lors de la création de la table). L’instruction ID retire de la sortie le numéro de l’observation : l’option NOOBS n’est donc plus nécessaire. La table n’est pas triée. Programme 6.20 PROC PRINT DATA=cellule (OBS=10); ID reference; TITLE 'Impression du fichier – extrait'; TITLE2 'Référence cellule en ID – fichier non trié'; RUN; SAS Livre Page 200 Jeudi, 18. septembre 2008 6:03 18 200 ◆ SAS Si vous ne souhaitez que quelques variables, votre programme devient : Programme 6.21 PROC PRINT DATA=cellule NOOBS; VAR vendeur mois quantite CA; TITLE 'Quelques variables seulement'; RUN; Le programme 6.22 permet la présentation des mêmes variables mais uniquement pour le vendeur Jean-Pierre. Programme 6.22 PROC PRINT DATA=cellule NOOBS; VAR vendeur mois quantite CA; WHERE vendeur='Jean-Pierre'; TITLE 'Ses ventes'; RUN; Vous pouvez combiner les conditions spécifiées par l’instruction WHERE et ajouter des FORMAT pour rendre les résultats plus lisibles. Programme 6.23 PROC PRINT DATA=cellule NOOBS; VAR vendeur mois quantite CA; WHERE vendeur='Jean-Pierre' AND reference='DL-103'; TITLE 'Combien de DL-103 vendues par Jean-Pierre ?'; FORMAT CA eurox9.2; RUN; PROC PRINT DATA=cellule NOOBS; VAR vendeur mois reference quantite CA; WHERE quantite>15 OR CA > 3500; TITLE 'Plus de 15 cellules vendues ou plus de 3500 euros de ventes'; FORMAT CA eurox9.2; RUN; L’instruction SUM introduite dans le programme 6.24 permet de connaître le nombre de cellules vendues et le montant total des ventes. Programme 6.24 PROC PRINT DATA=cellule NOOBS; VAR vendeur mois quantite CA; WHERE quantite>15 OR CA > 3500; FORMAT CA eurox11.2; TITLE "Ajout de l’instruction SUM"; SUM quantite CA; RUN; SAS Livre Page 201 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 201 La modification du FORMAT entre les programmes 6.23 et 6.24 est rendue nécessaire par le fait que la somme nécessite l’utilisation de 11 caractères pour être écrite dans un FORMAT EUROX. Nous souhaitons maintenant connaître les ventes réalisées par vendeur au cours du premier trimestre, pour chaque référence de cellule. Il faut trier au préalable la table en fonction de la variable BY. Programme 6.25 PROC SORT DATA=cellule; BY vendeur; RUN; PROC PRINT DATA=cellule NOOBS; VAR mois reference quantite CA; WHERE mois < 4; SUM quantite CA; BY vendeur; FORMAT CA eurox11.2; TITLE "Ventes par vendeur, par référence au 1er trimestre"; RUN; Vous n’avez en fait pas besoin de préciser dans l’instruction VAR les variables listées dans l’instruction SUM. Extrait de la sortie obtenue ici : Résultat 6.6 ------------------ vendeur=René -----------------------mois 1 1 1 2 2 2 3 3 3 ------vendeur reference DL-103 Goldring Eroica LX Ortofon Nr 2 DL-103 Goldring Eroica LX Ortofon Nr 2 DL-103 Goldring Eroica LX Ortofon Nr 2 quantite 10 16 22 23 14 16 16 12 17 -------146 CA €1.550,00 €4.400,00 €4.400,00 €3.565,00 €3.850,00 €3.200,00 €2.480,00 €3.300,00 €3.400,00 ----------€30.145,00 ------------------ vendeur=Roger -----------------------mois 1 1 1 2 2 2 3 3 3 ------vendeur reference DL-103 Goldring Eroica LX Ortofon Nr 2 DL-103 Goldring Eroica LX Ortofon Nr 2 DL-103 Goldring Eroica LX Ortofon Nr 2 quantite 19 15 10 15 23 17 15 19 18 -------151 ======== 686 CA €2.945,00 €4.125,00 €2.000,00 €2.325,00 €6.325,00 €3.400,00 €2.325,00 €5.225,00 €3.600,00 ----------€32.270,00 =========== €144.325,00 SAS Livre Page 202 Jeudi, 18. septembre 2008 6:03 18 202 ◆ SAS Vous remarquerez que le FORMAT EUROX11.2 s’applique aussi bien aux données de la table qu’à la somme ordonnée par l’instruction SUM. Améliorons la présentation par l’emploi de ID. Programme 6.26 PROC PRINT DATA=cellule; VAR mois reference quantite CA; WHERE mois < 4; SUM quantite CA; BY vendeur; ID vendeur; FORMAT CA eurox11.2; TITLE "Ventes par vendeur, par référence 1er trimestre"; RUN; Le programme 6.27 permet la présentation des ventes de chaque vendeur par mois (double BY) : Programme 6.27 PROC SORT DATA=cellule; BY vendeur mois; RUN; PROC PRINT DATA=cellule; VAR mois reference quantite CA; WHERE mois < 4; SUM quantite CA; BY vendeur mois; ID vendeur; FORMAT CA eurox11.2; TITLE "Ventes par vendeur, par mois"; RUN; Vous remarquez que SAS réalise des sommes par mois, puis par vendeur. Si vous souhaitez uniquement des sommes sur certaines variables (par exemple, pas de somme par mois mais uniquement par vendeur), vous devez introduire une commande SUMBY : Programme 6.28 PROC PRINT DATA=cellule; VAR mois reference quantite CA; WHERE mois < 4; SUM quantite CA; BY vendeur mois; SUMBY vendeur; ID vendeur; FORMAT CA eurox11.2; TITLE "Ventes par vendeur, par référence 1er trimestre"; RUN; Si vous souhaitez uniquement un vendeur par page : SAS Livre Page 203 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 203 Programme 6.29 PROC PRINT DATA=cellule; VAR mois reference quantite CA; WHERE mois < 4; SUM quantite CA; BY vendeur mois; ID vendeur; PAGEBY vendeur; FORMAT CA eurox11.2; TITLE "Ventes par vendeur, par référence 1er trimestre"; RUN; On peut aussi attribuer des LABEL que l’on peut créer par une nouvelle étape DATA/SET. Mais si on souhaite que ces LABEL n’apparaissent pas dans la table SAS, on peut les créer à l’intérieur même de PROC PRINT. Programme 6.30 OPTIONS PAGESIZE=46; PROC PRINT DATA=cellule NOOBS LABEL; VAR reference quantite CA; WHERE mois < 4; SUM quantite CA; BY vendeur mois; PAGEBY vendeur; FORMAT CA eurox11.2; TITLE "Ventes par vendeur, par référence 1er trimestre"; FOOTNOTE "Les ventes de nos vendeurs"; FOOTNOTE2 "TRES CONFIDENTIEL"; LABEL vendeur = "Notre salarié" reference = "Référence cellule" quantite= "Ses ventes" CA = "Pour un CA de"; RUN; L’introduction de FOOTNOTE dans une sortie standard de SAS (fenêtre SORTIE) est toujours un peu problématique parce que ce texte de bas de page ne se placera pas immédiatement après le résultat produit mais bien en bas de la page. Si votre page est trop grande, il peut donc apparaître un espace important entre votre résultat et votre pied de page. C’est au moyen de l’option PAGESIZE=xxx que vous réduirez cet espace. Nous souhaitons que les LABEL qui font office de titres de colonnes apparaissent sur plusieurs lignes. Programme 6.31 PROC PRINT DATA=cellule NOOBS SPLIT='@'; VAR reference quantite CA; WHERE mois < 4; SUM quantite CA; BY vendeur mois; PAGEBY vendeur; SAS Livre Page 204 Jeudi, 18. septembre 2008 6:03 18 204 ◆ SAS FORMAT CA eurox11.2; TITLE "Ventes par vendeur, par référence 1er trimestre"; FOOTNOTE "Les ventes de nos vendeurs"; FOOTNOTE2 "TRES CONFIDENTIEL"; LABEL vendeur = "Notre salarié" reference = "Référence@cellule" quantite= "Ses ventes" CA = "Pour un@CA de"; RUN; On obtient ainsi le résultat 6.7 (extrait) : Résultat 6.7 Ventes par vendeur, par référence 1er trimestre --------- Notre salarié=Roger mois=1 -----Référence cellule Ses ventes Pour un CA de DL-103 Goldring Eroica LX Ortofon Nr 2 -----------------mois 19 15 10 -----44 €2.945,00 €4.125,00 €2.000,00 ----------€9.070,00 -------- Notre salarié=Roger mois=2 ------Référence cellule Ses ventes Pour un CA de DL-103 Goldring Eroica LX Ortofon Nr 2 -----------------mois 15 23 17 -----55 €2.325,00 €6.325,00 €3.400,00 ----------€12.050,00 -------- Notre salarié=Roger mois=3 -------Référence cellule Ses ventes Pour un CA de DL-103 Goldring Eroica LX Ortofon Nr 2 -----------------mois vendeur 15 19 18 -----52 151 ====== 686 €2.325,00 €5.225,00 €3.600,00 ----------€11.150,00 €32.270,00 =========== €144.325,00 Les ventes de nos vendeurs TRES CONFIDENTIEL Vous en conclurez donc que la procédure PROC PRINT est beaucoup plus riche qu’elle n’y paraît. En tout cas, elle peut s’avérer utile pour réaliser des tableaux simples sur des variables non croisées et vous permettre ainsi une présentation de vos données. 6.4.2 PROC PRINT et ODS ODS ne sera abordé que dans le chapitre 8, mais il nous a semblé intéressant de présenter les options supplémentaires proposées par PROC PRINT lorsque le résultat SAS Livre Page 205 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 205 de la procédure est envoyé vers une destination ODS. Vous allez pour cela activer (si vous ne l’avez pas encore fait) les sorties en HTML. Les sorties que nous examinons pour l’instant arrivent toutes dans la fenêtre SORTIE. Une option transformera votre sortie SAS classique en sortie HTML (c’est une des possibilités offertes par ODS). Pour activer les sorties en HTML, allez dans le menu OUTILS, et sélectionnez Options, puis Préférences. Choisissez alors l’onglet Résultats, cochez la case HTML et laissez le style par défaut (DEFAULT). Cochez éventuellement la case Afficher les résultats au fur et à mesure de leur génération. Nous partons du tableau donné par le programme 6.32. Programme 6.32 FOOTNOTE; PROC PRINT DATA=cellule NOOBS; ID mois; VAR quantite CA; WHERE vendeur='Jean-Pierre' AND reference='DL-103'; TITLE 'Les DL-103 vendues par Jean-Pierre ?'; SUM quantite CA; FORMAT CA eurox11.2; RUN; Nous ne nous concentrerons que sur la sortie HTML : Résultat 6.8 Vous remarquez déjà que la variable ID apparaît plus nettement que dans les sorties obtenues jusqu’alors dans la fenêtre SORTIE. Nous allons pouvoir améliorer la présentation de ce tableau via la commande STYLE. SAS Livre Page 206 Jeudi, 18. septembre 2008 6:03 18 206 ◆ SAS a. La syntaxe de l’option STYLE STYLE(élément)=[caractéristique1=valeur1 caractéristique2=valeur2…] Les crochets sont très importants (mais vous pouvez utiliser des accolades). Cette option peut être invoquée dans les procédures PROC PRINT, PROC REPORT et PROC TABULATE et sera de nouveau traitée dans les sections 6.5.6. et 6.7.3. Les éléments sur lesquels vous allez pouvoir apporter des modifications de STYLE sont1 : BYLABEL Le label de la variable BY. DATA Les cellules à l’intérieur du tableau (définies par les instructions VAR, ID et SUM). GRANDTOTAL Somme correspondant au grand total (instruction SUM). HEADER Les en-têtes de colonnes des variables (instructions VAR, ID ou SUM). N N= OBS Les données de la colonne OBS. OBSHEADER En-tête de la colonne OBS. TABLE La structure même du tableau – pour construire un tableau, SAS utilise un modèle dans lequel sont spécifiés l’épaisseur du cadre, la largeur des cellules, etc. TOTAL Les sommes intermédiaires (SUM). Vous disposez d’un certain nombre de styles livrés avec SAS (nous utilisons par exemple le style DEFAULT pour obtenir le résultat 6.8). À partir des commandes de STYLE, vous avez la possibilité de créer complètement votre propre style. Ce n’est pas notre objectif ici et c’est pourquoi nous n’indiquons pas précisément la fonction de chacun des termes ci-dessus pour ceux dont le sens pourrait sembler abstrait2. 1. Pour différents éléments, des instructions de la procédure PROC PRINT (VAR, ID…) apparaissent entre parenthèses. Cela signifie que, si vous souhaitez intervenir sur le style de cet élément de la sortie, votre option STYLE doit intervenir comme option de cette commande. Nous développons ce point plus loin. 2. Pour plus de détails, consultez l’aide SAS (entrée STYLE statement, puis TEMPLATE PROCEDURE) et trouvez dans cette page d’aide « STYLE statement ». SAS Livre Page 207 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 207 Sur ces éléments (sauf sur TABLE) vous pouvez modifier les caractéristiques suivantes : Sur TABLE, vous pouvez modifier les caractéristiques suivantes : ASIS= BACKGROUNDIMAGE= BACKGROUND= BORDERCOLOR= BACKGROUNDIMAGE= BORDERCOLORDARK= BORDERCOLOR= BORDERCOLORLIGHT= BORDERCOLORDARK= BORDERWIDTH= BORDERCOLORLIGHT= CELLPADDING= BORDERWIDTH= CELLSPACING= CELLHEIGHT= FONT=* CELLWIDTH= FLYOVER= FONT= FONT_FACE= FONT_SIZE= FONT_STYLE= FONT_WEIGHT= FONT_WIDTH= HREFTARGET= HTMLCLASS= JUST= NOBREAKSPACE= POSTHTML= POSTIMAGE= POSTTEXT= PREHTML= PREIMAGE= PRETEXT= PROTECTSPECIALCHARS= TAGATTR= URL= VJUST= FONT_FACE=* FONT_SIZE=* FONT_STYLE=* FONT_WEIGHT=* FONT_WIDTH=* FOREGROUND=* FRAME= HTMLCLASS= JUST= OUTPUTWIDTH= POSTHTML= POSTIMAGE= POSTTEXT= PREHTML= PREIMAGE= PRETEXT= RULES= * : ce sont les textes (au-dessus (PRE) ou au-dessous du tableau (POST)) définis par PRETEXT, POSTTEXT, PREHTML et POSTHTML qui sont concernés par la modification de ces caractéristiques BACKGROUND= Ce que nous souhaitons ici, c’est simplement indiquer comment modifier un style préexistant pour donner plus de sens à votre tableau. Pour ce faire, nous avons besoin de très peu d’éléments de la programmation de STYLE. Ces commandes STYLE peuvent intervenir comme des options de l’instruction PROC PRINT, mais aussi comme des options de certaines instructions à l’intérieur de la procédure. Une option STYLE à l’intérieur des instructions VAR et ID permet SAS Livre Page 208 Jeudi, 18. septembre 2008 6:03 18 208 ◆ SAS d’intervenir sur les éléments DATA et HEADER. Une option STYLE sur l’instruction SUM permet d’intervenir sur les éléments DATA, HEADER TOTAL et GRANDTOTAL. b. Premier exemple Ce premier programme illustre les modifications de style possibles. Programme 6.33 PROC PRINT DATA=cellule NOOBS STYLE(HEADER)=[BACKGROUND=black FOREGROUND=white JUST=center VJUST=center CELLWIDTH=3cm]; ID mois / STYLE(DATA)=[JUST=left] STYLE(HEADER)=[CELLHEIGHT=1.55cm FOREGROUND=white VJUST=center CELLWIDTH=1.35cm BACKGROUNDIMAGE='C:\intro_SAS\images\dl103.jpg']; VAR quantite; VAR CA; WHERE vendeur='Jean-Pierre' AND reference='DL-103'; TITLE 'Les DL-103 vendues par Jean-Pierre'; SUM quantite / STYLE(GRANDTOTAL)=[POSTTEXT=' DL-103']; SUM CA; FORMAT CA eurox11.2; RUN; Résultat 6.9 Les modifications de style qui interviennent en options de PROC PRINT s’appliquent à toutes les variables VAR (mais pas aux variables ID). Si nous avions spécifié une modification du STYLE de HEADER comme option de VAR CA, seul l’intitulé de la colonne de CA aurait été modifié : cela n’aurait pas été le cas de celui de QUANTITE. SAS Livre Page 209 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 209 Vous avez de plus la possibilité de multiplier les commandes VAR ou SUM et ainsi d’appliquer des éléments de style différents à des variables de même type. Les modifications réalisées apportent certes quelques informations supplémentaires (qu’est-ce qu’une DL-103 ? ; rappel de la référence vendues dans la somme de QUANTITE) et quelques modifications « esthétiques ». Il est possible d’aller un peu plus loin. c. « Traffic lightening » Certes, notre vendeur a réalisé un certain chiffre d’affaires. Cependant, sur la même référence de produit, on pourrait souhaiter comparer les ventes de notre vendeur avec les ventes des autres vendeurs sans pour autant modifier le contenu du tableau. Le traffic lightening, qui consiste à ajouter des caractéristiques de style qui vont être fonction des valeurs proposées dans la cellule du tableau, permet ce type de résultat. Nous allons commencer par analyser les quintiles des CA réalisés sur cette référence par l’ensemble des vendeurs de notre société grâce à PROC UNIVARIATE. Nous souhaitons pouvoir distinguer pour notre vendeur les mois pour lesquels ses ventes ont été particulièrement élevées des mois où elles ont été faibles. Programme 6.34 PROC UNIVARIATE DATA=cellule; WHERE reference='DL-103'; VAR CA; OUTPUT OUT=toto PCTLPTS= 40 60 80 PCTLPRE= p PCTLNAME= p40 p60 p80; RUN; DATA _null_; SET toto; CALL SYMPUT ("p40",pp40); CALL SYMPUT ("p60",pp60); CALL SYMPUT ("p80",pp80); RUN; PROC FORMAT; VALUE tl 0-&p40=lightgrey &p40-&p60 = yellow &p60-&p80 = orange OTHER = red; RUN; PROC PRINT DATA=cellule NOOBS STYLE(HEADER)=[BACKGROUND=black FOREGROUND=white JUST=center VJUST=center CELLWIDTH=3cm] STYLE(TABLE)= [POSTIMAGE='C:\intro_SAS\images\legende.gif']; ID mois / STYLE(DATA)=[JUST=left] STYLE(HEADER)=[CELLHEIGHT=1.55cm FOREGROUND=white VJUST=center CELLWIDTH=1.35cm BACKGROUNDIMAGE='C:\intro_SAS\images\dl103.jpg']; VAR quantite; VAR CA / STYLE(DATA)=[BACKGROUND=tl.]; SAS Livre Page 210 Jeudi, 18. septembre 2008 6:03 18 210 ◆ SAS WHERE vendeur='Jean-Pierre' AND reference='DL-103'; TITLE 'Les DL-103 vendues par Jean-Pierre'; SUM quantite / STYLE(GRANDTOTAL)=[POSTTEXT=' DL-103']; SUM CA; FORMAT CA eurox11.2; RUN; L’étape DATA intermédiaire fait appel à des macro-variables dans lesquelles nous stockons les valeurs des deuxième, troisième et quatrième quintiles1. Nous créons ensuite un FORMAT dans lequel nous relions l’intervalle 0-&p40 (donc les chiffres d’affaires – puisque ce FORMAT sera appliqué à la variable CA – appartenant aux deux premiers quintiles de la distribution) à la couleur LIGHTGRAY (couleur de fond des cellules sur le reste du tableau). Les chiffres d’affaires particulièrement élevés (les 20 % les plus élevés sur cette référence) sont associés à la couleur rouge. Dans la procédure de construction de tableau, nous indiquons que, pour la variable CA, la couleur de fond sera à rechercher dans le FORMAT que nous venons de construire. Résultat 6.10 La légende n’est pas créée par SAS : c’est une image en provenance d’un logiciel de dessin vectoriel extérieur à SAS. 6.5 PROC REPORT PROC REPORT est une procédure qui, comme PROC PRINT, permet des présentations particulièrement attrayantes de vos données. Il s’agit d’un outil nettement plus puissant que PROC PRINT mais qui demande un effort de programmation plus important2. 1. Voir le chapitre 9 consacré au langage macro de SAS. 2. Nous ne présenterons pas la syntaxe propre à cette procédure. Il nous a semblé plus efficace de travailler directement à partir d’exemples. SAS Livre Page 211 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 211 Pour cette section, nous emploierons à nouveau le fichier ELEVE2.TXT utilisé dans la section 6.2. consacrée à PROC MEANS. Le programme 6.35 permet de créer la table. Programme 6.35 DATA eleve; INFILE 'C:\intro_SAS\fichiers\eleve2.txt'; INPUT sexe $ prenom :$12. datenais :ddmmyy10. cheveux Qi taille poids; age=INTCK('year',datenais,'23OCT2007’d); RUN; Vous pouvez utiliser PROC REPORT dans trois environnements : deux environnements dans un mode fenêtre et un environnement dans un mode non fenêtré. C’est ce dernier mode que nous allons utiliser puisqu’il vous contraint à programmer vousmême votre rapport – une fois que vous serez habitué à la syntaxe, vous pourrez découvrir de vous-même les modes fenêtrés1. 6.5.1 Exemples simples Le programme 6.36 construit notre premier rapport. Programme 6.36 OPTIONS PAGESIZE=500; PROC REPORT DATA=eleve NOWINDOWS; RUN; C’est l’option NOWINDOWS qui indique à SAS que vous souhaitez utiliser PROC REPORT dans un mode non fenêtré. Vous obtenez une impression complète de votre table dont voici un extrait. Résultat 6.11 sexe F H H H F H H prenom Emilie Damien Fabien Boris Ingela Rémy Damien datenais 11136 11773 11869 11493 11004 11173 11378 cheveux 2 3 2 2 4 1 3 Qi 98 93 106 98 107 108 99 taille 170 158 168 165 172 173 172 poids 68 61 73 69 73 78 79 age 17 15 15 16 17 17 16 Vous remarquerez que les modalités des variables alphanumériques (numériques) sont alignées à gauche (à droite). Les variables apparaissent dans l’ordre dans lequel elles ont été créées. Les largeurs des colonnes sont par défaut de 9 caractères pour les variables numériques et égales au nombre de caractères des variables alphanumériques (ici 12 pour PRENOM et 8 pour SEXE) – chaque colonne est séparée de la suivante par deux espaces. 1. Ces modes fenêtrés sont en fait très peu utilisés. SAS Livre Page 212 Jeudi, 18. septembre 2008 6:03 18 212 ◆ SAS ----+----1----+----2----+---3----+---4----+----5----+----6----+----7----+---8---+----9 F Emilie 11136 2 98 170 68 17 |___8__|2|____12_____|2|____9___|… Pour sélectionner certaines variables et les présenter dans un ordre précis, vous emploierez l’instruction COLUMN : Programme 6.37 PROC REPORT DATA=eleve NOWINDOWS; COLUMN prenom sexe age datenais taille poids; RUN; Vous avez aussi la possibilité de sélectionner certaines observations via la commande WHERE qui, comme ATTRIB, FORMAT et LABEL, est valable dans de très nombreuses procédures : Programme 6.38 PROC REPORT DATA=eleve NOWINDOWS; COLUMN prenom sexe age datenais taille poids; WHERE cheveux=1; RUN; Si, dans votre instruction COLUMN, vous ne citez que des variables numériques, PROC REPORT vous offrira en plus du listing un tableau récapitulatif dans lequel vous observerez pour chaque variable la somme des modalités sur votre population. Si vous avez des valeurs manquantes sur certaines observations, celles-ci seront exclues du tableau produit à moins que vous ne spécifiiez l’option MISSING dans PROC REPORT. PROC REPORT DATA=eleve NOWINDOWS MISSING ;… 6.5.2 L’instruction DEFINE L’instruction DEFINE appliquée à une variable donnée va vous permettre de modifier en profondeur votre présentation de cette variable. Au moyen de cette instruction, vous pouvez : • définir la façon dont votre variable va être utilisée pour la construction de votre rapport ; • lui donner des attributs (FORMAT=), le nombre de caractères à utiliser pour la présentation des modalités (WIDTH=), un nombre de caractères à utiliser pour séparer cette variable de la précédente (SPACING=) ; • présenter dans un certain ordre vos modalités au moyen d’options (DESCENDING, NOPRINT, NOZERO, PAGE) ; • utiliser une justification différente de celle par défaut (CENTER, LEFT, RIGHT) ; • donner un intitulé à votre variable (identique à ce que vous obtenez avec un LABEL). Le programme 6.39 utilise certaines des possibilités offertes par DEFINE. SAS Livre Page 213 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 213 Programme 6.39 PROC FORMAT; VALUE $sexe 'H'='garçon' 'F'='fille'; RUN; PROC REPORT DATA=eleve NOWINDOWS HEADSKIP HEADLINE; COLUMN prenom sexe age datenais taille poids; WHERE cheveux=1; DEFINE prenom / RIGHT; DEFINE sexe / FORMAT=$sexe. LEFT SPACING=1 WIDTH=6; DEFINE age / WIDTH=3 SPACING=5 'Age'; DEFINE datenais / FORMAT=ddmmyy10. 'Date/de naissance'; DEFINE taille / WIDTH=6 'Taille'; DEFINE poids / WIDTH=6 'Poids'; RUN; On obtient (extrait) : Résultat 6.12 Date de prenom sexe Age naissance Taille Poids ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Rémy Audrey Josselin Baptiste garçon fille garçon garçon 17 17 16 17 04/08/1990 16/04/1990 04/08/1991 06/08/1990 173 165 173 167 78 65 79 71 L’ordre de présentation des options de DEFINE n’a pas d’importance. Pour créer un intitulé de colonne, il suffit de mettre votre texte entre quotes dans les options de DEFINE. Vous remarquerez que, pour la variable DATENAIS, le caractère / apparaît dans l’intitulé de colonne. Ceci permet de présenter cet intitulé sur trois lignes. / est le SPLIT par défaut ; si vous souhaitez utiliser un autre caractère de SPLIT, votre programmation devient : Programme 6.40 PROC REPORT DATA=eleve NOWINDOWS SPLIT='@'; …; DEFINE datenais / FORMAT=ddmmyy10. 'Date@de naissance'; … RUN; La procédure PROC REPORT scinde automatiquement les intitulés de colonnes. Si vous n’introduisez pas de caractère SPLIT, l’intitulé est présenté sur deux lignes : DATE DE, puis NAISSANCE. Le nombre de caractères que peut prendre chaque élément de l’intitulé de colonne est lié au nombre de caractères pris par la variable (dix dans le cas présent en raison du FORMAT appliqué à la variable DATENAIS). La présentation des intitulés de colonnes peut être améliorée via les options de PROC REPORT : HEADSKIP (qui introduit une ligne vide entre les intitulés de colonnes et les données) et HEADLINE (qui introduit un trait sous les intitulés de colonnes). SAS Livre Page 214 Jeudi, 18. septembre 2008 6:03 18 214 ◆ SAS 6.5.3 Les variables et leurs usages possibles Les variables présentes dans vos tables peuvent être utilisées de six manières différentes par PROC REPORT : ACROSS, ANALYSIS, COMPUTED, DISPLAY, GROUP, ORDER. Par défaut, les variables alphanumériques sont considérées comme des variables d’affichage (DISPLAY) ; les variables numériques sont considérées comme des variables qui peuvent faire l’objet d’analyses (ANALYSIS) – vous pouvez ainsi calculer des statistiques sur ces variables. a. Les variables ORDER Si vous déclarez une variable ORDER, les observations apparaissant dans votre rapport seront triées en fonction de cette variable. Votre présentation est allégée du fait que les modalités des variables ORDER n’apparaissent qu’une fois dans votre sortie. Programme 6.41 PROC REPORT DATA=eleve NOWINDOWS HEADSKIP HEADLINE; COLUMN prenom sexe age datenais taille poids; WHERE cheveux=1; DEFINE prenom / RIGHT; DEFINE sexe / ORDER FORMAT=$sexe. LEFT SPACING=1 WIDTH=6; DEFINE age / WIDTH=3 SPACING=5 'Age'; DEFINE datenais / FORMAT=ddmmyy10. 'Date de naissance'; DEFINE taille / WIDTH=6 'Taille'; DEFINE poids / WIDTH=6 'Poids'; RUN; Résultat 6.13 (extrait) Date de prenom sexe Age naissance Taille Poids ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Audrey fille Anda Sonia Edwige 17 16 18 17 16/04/1990 02/02/1991 05/12/1989 07/03/1990 165 172 162 156 65 73 63 56 Imaginons que vous souhaitiez une présentation par SEXE, puis un tri alphabétique sur les prénoms. Ceci est possible en indiquant que les variables SEXE et PRENOM sont des variables ORDER. L’ordre dans lequel sont présentées les commandes DEFINE n’a pas d’importance. En revanche, pour obtenir le résultat escompté, vous devez modifier l’ordre des variables dans la commande COLUMN en indiquant en premier SEXE, puis PRENOM. En revanche, si le PRENOM apparaît deux fois dans la table (et c’est bien le cas dans cette table il y a cinq Alexandre, deux Allan…), seule la première occurrence est marquée puisque chaque modalité des variables ORDER n’apparaît qu’une fois. Vous pouvez définir des variables ORDER aussi bien parmi les variables alphanumériques que parmi les variables numériques. Pour obtenir un tri décroissant, il suffit d’ajouter l’option DESCENDING : DEFINE taille / ORDER DESCENDING WIDTH=6 'Taille' ; SAS Livre Page 215 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 215 b. Les variables GROUP Ici, SAS regroupe les observations par modalité de la variable GROUP et produit une statistique par variable ANALYSIS pour chaque modalité de la variable GROUP. Par défaut, si aucune statistique n’est précisée pour les variables ANALYSIS, SAS calculera la somme. Attention cependant si vous exécutez le programme 6.42. Programme 6.42 PROC REPORT DATA=eleve NOWINDOWS HEADSKIP HEADLINE; COLUMN prenom sexe age datenais taille poids; WHERE cheveux=1; DEFINE prenom / RIGHT; DEFINE sexe / FORMAT=$sexe. LEFT SPACING=1 WIDTH=6; DEFINE age / GROUP WIDTH=3 SPACING=5 'Age'; DEFINE datenais / FORMAT=ddmmyy10. 'Date de naissance'; DEFINE taille / WIDTH=6 'Taille'; DEFINE poids / WIDTH=6 'Poids'; RUN; Vous n’observerez aucune différence entre le tableau obtenu et celui que vous pouvez obtenir si vous remplacez GROUP par ORDER dans la commande DEFINE associée à la variable AGE. Ce sera toujours ainsi si des variables DISPLAY (et donc des variables alphanumériques) apparaissent parmi les variables que vous souhaitez voir dans votre rapport. SAS ne pouvant pas calculer de statistiques sur les variables DISPLAY (un prénom « moyen »), il traite l’option GROUP comme une option ORDER. Pour bénéficier de l’option GROUP, il faut que les variables citées dans l’instruction COLUMN soit de type ACROSS, ANALYSIS, COMPUTED ou GROUP. Dans le programme 6.43, il n’apparaît pas de variable DISPLAY. Programme 6.43 PROC REPORT DATA=eleve NOWINDOWS HEADSKIP HEADLINE; COLUMN age datenais taille poids; WHERE cheveux=1; DEFINE age / GROUP WIDTH=3 SPACING=5 'Age'; DEFINE datenais / FORMAT=ddmmyy10. 'Date de naissance'; DEFINE taille / WIDTH=6 'Taille'; DEFINE poids / WIDTH=6 'Poids'; RUN; Résultat 6.14 Date de Age naissance Taille Poids ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 15 16 17 18 22/01/2285 22/10/2838 01/12/2751 25/03/2284 1598 4674 4281 1823 630 1949 1733 756 Cette option GROUP vous permet ainsi de comprendre que deux types de rapports peuvent être produits au moyen de PROC REPORT : des rapports de type liste ou offrant des informations de synthèse. SAS Livre Page 216 Jeudi, 18. septembre 2008 6:03 18 216 ◆ SAS La statistique produite par défaut est la somme (ce qui explique que les données présentées dans le tableau plus haut n’ont que très peu d’intérêt). Vous avez la possibilité de demander d’autres statistiques. Depuis SAS 9.2, il est possible de demander le mode via le mot-clé MODE. Tableau 6.1 • Les différentes statistiques disponibles dans PROC REPORT CSS Somme des écarts à la moyenne au carré Σ(xt – x̄ ) 2 USS Somme des carrés non corrigés : Σ(xt)2 CV Coefficient de variation (100 * STD / MEAN) MAX Valeur maximale MEAN Moyenne MIN Valeur minimale N Nombre d’observations non manquantes NMISS Nombre d’observations manquantes Range Range : max-min STD Écart-type : (CSS / (N – 1))0.5 STDERR STD / (N0.5) SUMWEIGHT Somme des pondérations PCTN Pourcentage d’une ligne ou d’une colonne sur un nombre d’observations PCTSUM Pourcentage d’une ligne ou d’une colonne sur la somme des valeurs d’une variable VAR Variance : STD2 T Valeur d’un t de Student testant l’égalité de la moyenne avec zero PRT Probabilité d’observer t de Student supérieur à la valeur absolue de T MEDIAN Médiane Le programme 6.44 demande des moyennes pour les variables ANALYSIS. Programme 6.44 PROC REPORT DATA=eleve NOWINDOWS HEADSKIP HEADLINE; COLUMN age datenais taille poids; WHERE cheveux=1; DEFINE age / GROUP WIDTH=3 SPACING=5 'Age'; DEFINE datenais / MEAN CENTER FORMAT=ddmmyy10. 'Date de naissance moyenne'; DEFINE taille / MEAN WIDTH=7 'Taille moyenne'; DEFINE poids / MEAN WIDTH=6 'Poids moyen'; RUN; * Programmation alternative; PROC REPORT DATA=eleve NOWINDOWS HEADSKIP HEADLINE; COLUMN age (datenais taille poids), MEAN; WHERE cheveux=1; DEFINE age / GROUP WIDTH=3 SPACING=5 'Age'; DEFINE datenais / CENTER FORMAT=ddmmyy10. 'Date de naissance moyenne'; DEFINE taille / WIDTH=7 'Taille moyenne'; DEFINE poids / WIDTH=6 'Poids moyen'; RUN; SAS Livre Page 217 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 217 L’autre programmation possible demande la production d’une statistique particulière à l’intérieur de l’instruction COLUMN. Le résultat est quasiment identique à celui de la première programmation, à la différence près que dans les intitulés de colonnes, en plus des LABEL que nous avons spécifiés, il apparaît aussi le mot « MEAN ». Vous obtiendrez, avec la première programmation : Résultat 6.15 Date de naissance Taille Poids Age moyenne moyenne moyen ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 15 16 17 18 03/07/1992 21/05/1991 16/06/1990 22/06/1989 159.8 166.929 164.654 165.727 63 69.607 66.654 68.727 Si vous souhaitez voir apparaître plusieurs statistiques construites sur une même variable, précisez la statistique à calculer dans les instructions DEFINE. Vous devez intervenir dans l’instruction COLUMN de la manière illustrée par le programme 6.451. Programme 6.45 PROC REPORT DATA=eleve NOWINDOWS HEADSKIP HEADLINE; COLUMN age datenais poids poids=poids2 poids=poids3; WHERE cheveux=1; DEFINE age / GROUP WIDTH=3 SPACING=5 'Age'; DEFINE datenais / MEAN CENTER FORMAT=ddmmyy10. 'Date de naissance moyenne'; DEFINE taille / MEAN WIDTH=7 'Taille moyenne'; DEFINE poids / MEAN WIDTH=6 'Poids moyen'; DEFINE poids2 / MIN 'Poids minimum'; DEFINE poids3 / MAX 'Poids maximum'; RUN; Pour obtenir : Résultat 6.16 Date de naissance Poids Poids Poids Age moyenne moyen minimum maximum ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 15 03/07/1992 63 54 72 16 21/05/1991 69.607 54 85 17 16/06/1990 66.654 53 78 18 22/06/1989 68.727 60 87 Attention ! Si vous avez au moins une variable DISPLAY, les statistiques MEAN MIN SUM MAX vous donneront toujours la même chose : la valeur de la variable pour l’individu. Pour qu’il y ait réellement un calcul de statistiques, vous ne devez pas avoir de variable DISPLAY (et donc produire des rapports de type synthèse). 1. Vous pouvez aussi modifier l’instruction COLUMN en : COLUMN age datenais poids,(MEAN MIN MAX); SAS Livre Page 218 Jeudi, 18. septembre 2008 6:03 18 218 ◆ SAS c. Les variables ACROSS Les résultats de l’option ACROSS sont très proches de ceux de l’option GROUP – seule la présentation change puisque les résultats sont présentés horizontalement et que, pour chaque modalité de la variable ACROSS, vous disposez en plus du nombre de points par modalité. Programme 6.46 PROC REPORT DATA=eleve NOWINDOWS HEADSKIP HEADLINE; COLUMN age datenais taille poids; WHERE cheveux=1; DEFINE age / ACROSS WIDTH=3 SPACING=5 'Age'; DEFINE datenais / MEAN CENTER FORMAT=ddmmyy10. 'Date de naissance moyenne'; DEFINE taille / MEAN WIDTH=7 'Taille moyenne'; DEFINE poids / MEAN WIDTH=6 'Poids moyen'; RUN; Le programme 6.46 permet d’obtenir le résultat 6.17. Résultat 6.17 Age Date de naissance Taille Poids 15 16 17 18 moyenne moyenne moyen ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 10 28 26 11 07/12/1990 165.013 67.573 Vous pouvez spécifier plusieurs variables ACROSS. Les statistiques produites ne changent pas mais pour la seconde variable ACROSS, vous disposerez de la répartition en nombre de points des individus par modalité de votre nouvelle variable ACROSS. Si vous avez maintenant une variable ACROSS et une variable GROUP, vous pouvez modifier radicalement le type de tableau produit : Programme 6.471 TITLE "Une variable ACROSS et une variable GROUP"; PROC REPORT DATA=eleve NOWINDOWS HEADSKIP HEADLINE; COLUMN age sexe ,(taille poids); DEFINE age / GROUP 'Age'; DEFINE sexe / ACROSS FORMAT=$sexe.; DEFINE taille / MEAN WIDTH=10 FORMAT=5.1’Taille'; DEFINE poids / MEAN WIDTH=10 FORMAT=5.1 'Poids'; RUN; 1. Le FORMAT $SEXE. a été créé au cours du programme 6.37. SAS Livre Page 219 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 219 Résultat 6.18 Une variable ACROSS et une variable GROUP sexe fille garçon Age Taille Poids Taille Poids ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 15 16 17 18 163.6 164.3 163.6 165.1 63.6 65.0 63.6 65.7 162.3 165.0 164.6 164.2 66.8 68.7 69.4 67.0 Attention cependant : dans votre instruction COLUMN, la variable GROUP doit être citée avant la variable ACROSS. Pour commander la production de la taille et du poids moyen par sexe, les variables TAILLE et POIDS sont séparées des variables de classification par une virgule. Ces deux variables sont entre parenthèses parce que nous souhaitons des moyennes de ces deux variables par sexe et par âge. Si vous désirez une taille moyenne tous sexes confondus, en plus des moyennes déjà présentées, votre commande COLUMN devient : COLUMN age sexe , (taille poids) taille; Vous avez la possibilité de définir plusieurs variables ACROSS ou GROUP. Si, par exemple, vous ajoutez CHEVEUX comme variable GROUP : COLUMN age cheveux sexe , (taille poids); DEFINE cheveux / GROUP ; Pour obtenir : Résultat 6.19 Une variable ACROSS et deux variables GROUP sexe fille garçon age cheveux Taille Poids Taille Poids ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 15 16 17 18 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 161.3 162.6 167.0 162.0 168.0 163.5 164.0 160.6 166.4 161.7 161.4 166.7 168.4 165.3 163.2 162.0 60.8 63.6 66.6 62.0 67.8 65.0 64.6 60.2 66.5 61.5 61.3 67.3 70.4 65.0 63.8 62.3 158.8 162.7 163.7 163.3 166.3 165.2 164.3 163.2 162.6 165.1 165.8 164.2 163.5 164.5 158.5 175.7 64.5 66.4 67.8 70.3 70.6 68.9 68.3 65.3 66.8 70.2 70.1 70.6 67.3 67.5 60.5 76.7 d. Les variables COMPUTED Il s’agit là d’une possibilité très intéressante offerte par PROC REPORT puisque, au sein de la procédure, vous pouvez demander la construction de nouvelles variables sans que celles-ci ne soient ajoutées à votre table. Sur la base de la table actuelle, nous souhaitons calculer un indice de masse corporelle (IMC = poids / (taille en mètre)2). SAS Livre Page 220 Jeudi, 18. septembre 2008 6:03 18 220 ◆ SAS Programme 6.48 PROC REPORT DATA=eleve NOWINDOWS HEADSKIP HEADLINE; COLUMN age datenais taille poids IMC; WHERE cheveux=1; DEFINE age / GROUP WIDTH=3 SPACING=5 'Age'; DEFINE datenais / MEAN CENTER FORMAT=ddmmyy10. 'Date de naissance moyenne'; DEFINE taille / MEAN WIDTH=7 'Taille moyenne'; DEFINE poids / MEAN WIDTH=6 'Poids moyen'; DEFINE IMC / COMPUTED WIDTH=16 CENTER FORMAT=5.2 'Indice de/masse corporelle'; COMPUTE IMC; IMC=poids.MEAN/(taille.MEAN/100)**2; ENDCOMP; RUN; Vous devez : • indiquer dans l’instruction COLUMN le nom de la variable que vous souhaitez introduire ; • introduire une commande DEFINE sur votre nouvelle variable en indiquant les options à appliquer et indiquer que cette variable est une variable COMPUTED ; • par une instruction COMPUTE, se terminant par une instruction ENDCOMP (ou ENDCOMPUTE), définir la manière dont votre nouvelle variable doit être calculée. Pour calculer une nouvelle variable à présenter dans le rapport, vous devez avoir des références de type ‘VAR.STATISTIQUE’ – dans le cas présent, vous manipulez POIDS.MEAN et TAILLE.MEAN. Il faut bien entendu que vous ayez demandé les statistiques (ici ‘MEAN’) dans les instructions DEFINE relatives aux variables que vous manipulez pour obtenir votre nouvelle variable. Le résultat 6.20 reproduit ce que vous allez obtenir. Résultat 6.20 Date de naissance Taille Poids Indice de Age moyenne moyenne moyen masse corporelle ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 15 16 17 18 03/07/1992 21/05/1991 16/06/1990 22/06/1989 159.8 166.929 164.654 165.727 63 69.607 66.654 68.727 24.67 24.98 24.59 25.02 L’indice de masse corporelle présenté dans cette synthèse est calculé à partir des moyennes présentes dans la synthèse ; ce n’est pas la moyenne des indices de masse corporelle calculés pour chaque individu. Si vous avez des variables DISPLAY parmi les variables indiquées dans l’instruction COLUMN, la variable IMC sera bien calculée sur les modalités déclarées pour chaque observation comme nous allons le voir dans la section suivante. SAS Livre Page 221 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 221 6.5.4 Les rapports intégrant des informations de type liste et des informations de synthèse Jusqu’à maintenant, nous avons produit soit des rapports sous forme de listes (des observations de la table apparaissent), soit sous forme de synthèses. Il pourrait être intéressant d’avoir à la fois des informations de type liste et des informations de synthèse. a. Cas simple Nous allons partir du rapport de type liste obtenu au moyen du programme 6.49. Programme 6.49 PROC REPORT DATA=eleve NOWINDOWS HEADSKIP HEADLINE; COLUMN prenom sexe datenais taille poids IMC; WHERE cheveux=4 AND age=18; DEFINE prenom / DISPLAY; DEFINE sexe / DISPLAY; DEFINE datenais / DISPLAY CENTER FORMAT=ddmmyy10. 'Date de naissance'; DEFINE taille / ANALYSIS MEAN WIDTH=7 'Taille'; DEFINE poids / ANALYSIS MEAN WIDTH=6 'Poids'; DEFINE IMC / COMPUTED WIDTH=16 CENTER FORMAT=5.2 'Indice de masse corporelle'; COMPUTE IMC; IMC=poids.MEAN/(taille.MEAN/100)**2; ENDCOMP; RUN; Résultat 6.21 Date de Indice de prenom sexe naissance Taille Poids masse corporelle ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Benoît Michael Nikki Sabrina Frederic Laurence H H F F H F 18/06/1989 31/01/1989 11/11/1989 21/12/1989 01/01/1989 12/12/1989 184 179 168 165 164 153 84 81 67 63 65 57 24.81 25.28 23.74 23.14 24.17 24.35 Nous forçons la variable DATENAIS en variable DISPLAY de façon que SAS ne calcule pas de statistique sur cette variable lorsque nous demanderons des informations de synthèse1. Améliorons la présentation en ajoutant à l’avant-dernière ligne (juste avant le RUN) l’instruction suivante : RBREAK AFTER / SUMMARIZE DOL DUL; Pour obtenir : 1. Contrairement aux exemples présentés précédemment, il n’y aura donc plus de date de naissance moyenne calculée… SAS Livre Page 222 Jeudi, 18. septembre 2008 6:03 18 222 ◆ SAS Résultat 6.22 Date de Indice de prenom sexe naissance Taille Poids masse corporelle ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Benoît Michael Nikki Sabrina Frederic Laurence H H F F H F 18/06/1989 31/01/1989 11/11/1989 21/12/1989 01/01/1989 12/12/1989 184 179 168 165 164 153 ======= 168.833 ======= 84 81 67 63 65 57 ====== 69.5 ====== 24.81 25.28 23.74 23.14 24.17 24.35 ================ 24.38 ================ RBREAK est l’instruction qui commande une synthèse, soit en début de rapport (BEFORE), soit en fin de rapport (AFTER). Après le /, vous devez spécifier un certain nombre d’options. Ici, SUMMARIZE demande la production des statistiques synthétiques, DOL (Double OverLining) et DUL (Double Underlining). OL et UL sont possibles. Programme 6.50 PROC REPORT DATA=eleve NOWINDOWS HEADSKIP HEADLINE; COLUMN prenom sexe datenais taille poids IMC; WHERE cheveux=4 AND age=18; DEFINE prenom / DISPLAY; DEFINE sexe / GROUP; DEFINE datenais / DISPLAY CENTER FORMAT=ddmmyy10. 'Date de naissance'; DEFINE taille / ANALYSIS MEAN WIDTH=7 'Taille'; DEFINE poids / ANALYSIS MEAN WIDTH=6 'Poids'; DEFINE IMC / COMPUTED WIDTH=16 CENTER FORMAT=5.2 'Indice de masse corporelle'; COMPUTE IMC; IMC=poids.MEAN/(taille.MEAN/100)**2; ENDCOMP; BREAK AFTER sexe / SUMMARIZE DOL DUL; RUN; Ici, la variable SEXE est définie comme une variable GROUP. Nous demandons ensuite une synthèse après chaque modalité de sexe (BREAK AFTER SEXE). Résultat 6.23 Date de Indice de prenom sexe naissance Taille Poids masse corporelle ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Nikki Sabrina Laurence Benoît Michael Frederic F ======== F ======== H ======== H ======== 11/11/1989 21/12/1989 12/12/1989 18/06/1989 31/01/1989 01/01/1989 168 165 153 ======= 162 ======= 184 179 164 ======= 175.667 ======= 67 63 57 ====== 62.333 ====== 84 81 65 ====== 76.667 ====== 23.74 23.14 24.35 ================ 23.75 ================ 24.81 25.28 24.17 ================ 24.84 ================ SAS Livre Page 223 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 223 Bien entendu, vous pouvez encore demander une synthèse générale en plus de ces synthèses partielles en réintroduisant la commande RBREAK. Les indices de masse corporelle indiqués pour les hommes et les femmes sont calculés à partir des moyennes de poids et de tailles des hommes et des femmes – ce n’est donc pas la moyenne des indices calculés. b. Quelques précautions à prendre Dans la table que nous utilisons, certains individus portent le même prénom, ce qui peut provoquer quelques difficultés dans la production des rapports. Il est TRÈS important de comprendre ces difficultés. Elles nous éclairent déjà sur la façon dont fonctionne PROC REPORT. Imaginons que vous souhaitez un rapport dans lequel les individus sont triés par sexes et par prénoms (dans un ordre alphabétique). Vous souhaitez lire les tailles des individus, puis une taille moyenne en bas du rapport. Vous souhaitez donc un rapport, à la fois de type liste et de type synthèse. Le programme 6.51 remplit cet objectif. Programme 6.51 PROC REPORT DATA=eleve NOWINDOWS HEADSKIP HEADLINE; COLUMN sexe prenom taille; DEFINE sexe / GROUP 'Sexe'; DEFINE prenom / GROUP 'Prénom' WIDTH=15; DEFINE taille / MEAN ANALYSIS FORMAT=8.2; BREAK AFTER sexe / SKIP SUMMARIZE UL OL; RUN; Vous pourriez être tenté de vous dire que tout va bien. Ce n’est pas le cas. Pour présenter vos prénoms triés par ordre alphabétique, nous avons demandé l’option GROUP pour la variable PRENOM : la statistique demandée sur la variable TAILLE est donc calculée pour chaque valeur de prenom : ce que vous observez dans votre rapport correspond donc à la moyenne des tailles des individus portant un certain prénom. Vous pensiez que votre rapport affichait des informations de type liste alors que vous disposez en fait d’informations de synthèse. Il convient donc de faire très attention lorsque vous définissez votre variable comme une variable GROUP puisque les statistiques sont calculées par modalités de ces variables. L’option qui aurait dû être associée avec PRENOM n’est pas GROUP mais ORDER. De façon générale, si vous souhaitez un rapport mixte et de vraies informations de type liste, en spécifiant une variable DISPLAY, vous serez sûr des informations produites. 6.5.5 Trois exemples Les exemples suivants illustrent la richesse de PROC REPORT. Nous vous conseillons cependant de passer cette section et d’y revenir plus tard, lorsque vous serez habitué à travailler avec cette procédure. SAS Livre Page 224 Jeudi, 18. septembre 2008 6:03 18 224 ◆ SAS a. 1er exemple Programme 6.52 PROC REPORT DATA=eleve NOWINDOWS HEADSKIP HEADLINE; COLUMN prenom sexe datenais poids poids_rap; WHERE cheveux=4 AND age=18; DEFINE prenom /DISPLAY; DEFINE sexe /GROUP; DEFINE datenais /DISPLAY CENTER FORMAT=ddmmyy10. 'Date de naissance'; DEFINE poids /ANALYSIS MEAN FORMAT=7.2 'Poids'; DEFINE poids_rap /COMPUTED CENTER FORMAT=percent11.2 'Rapport'; COMPUTE BEFORE sexe; mdp=poids.MEAN; ENDCOMP; COMPUTE poids_rap; poids_rap=poids.MEAN / mdp; ENDCOMP; BREAK AFTER sexe / SKIP SUMMARIZE OL UL; RUN; Nous souhaitons la production de deux statistiques à partir des poids des individus. La première statistique est le poids lui-même et la seconde est le rapport exprimé en pourcentage entre le poids de l’individu et le poids moyen des individus de même sexe que lui. Dans l’instruction COLUMN, vous observez POIDS et POIDS_RAP. Dans les instructions DEFINE associées à ces variables, il apparaît que : • POIDS est une variable d’analyse sur laquelle nous souhaitons calculer la moyenne. • POIDS_RAP est une variable calculée en deux étapes : – Pour chaque modalité de SEXE, avant même d’examiner les observations, nous voulons connaître la moyenne des poids par sexe (COMPUTE BEFORE SEXE). Avec cette dernière instruction, nous pourrons disposer du poids moyen des hommes et des femmes pour chaque modalité de SEXE. – POIDS_RAP est donc égal à POIDS.MEAN (c’est-à-dire au poids de l’individu puisque nous avons une variable DISPLAY, dans les lignes relatives aux individus et à la moyenne par sexe dans les lignes de synthèse) divisé par la moyenne des poids des individus de même sexe que lui. Pour obtenir : Résultat 6.24 Date de prenom sexe naissance Poids Rapport ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Nikki Sabrina Laurence F 11/11/1989 21/12/1989 12/12/1989 67.00 63.00 57.00 ƒƒƒƒƒƒƒ 62.33 ƒƒƒƒƒƒƒ 107.49% 101.07% 91.44% ƒƒƒƒƒƒƒƒƒƒƒ 100.00% ƒƒƒƒƒƒƒƒƒƒƒ 18/06/1989 31/01/1989 01/01/1989 84.00 81.00 65.00 ƒƒƒƒƒƒƒ 76.67 ƒƒƒƒƒƒƒ 109.57% 105.65% 84.78% ƒƒƒƒƒƒƒƒƒƒƒ 100.00% ƒƒƒƒƒƒƒƒƒƒƒ ƒƒƒƒƒƒƒƒ F ƒƒƒƒƒƒƒƒ Benoît Michael Frederic H ƒƒƒƒƒƒƒƒ H ƒƒƒƒƒƒƒƒ SAS Livre Page 225 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 225 L’option SKIP permet d’introduire une ligne vide entre les deux blocs (un par sexe) du rapport. b. Second exemple Nous allons modifier un peu notre table : Programme 6.53 DATA eleve4; LENGTH prenom $20.; SET eleve; sexe2=sexe; RUN; PROC REPORT DATA=eleve4 NOWINDOWS HEADSKIP HEADLINE; COLUMN sexe sexe2 prenom taille taille=taille_moy taille=taille_med; WHERE cheveux=3 AND age=18; DEFINE sexe / GROUP 'Sexe'; DEFINE sexe2 / GROUP NOPRINT; DEFINE prenom / 'Prénom' WIDTH=20; DEFINE taille / 'Taille' ANALYSIS FORMAT=8.2; DEFINE taille_moy / MEAN NOPRINT; DEFINE taille_med / MEDIAN NOPRINT; COMPUTE AFTER sexe; prenom='Taille Médiane'; taille.SUM=taille_med; ENDCOMP; COMPUTE AFTER sexe2; prenom='Taille Moyenne'; taille.SUM=taille_moy; ENDCOMP; BREAK AFTER sexe / SKIP SUMMARIZE UL OL; BREAK AFTER sexe2 / SUMMARIZE UL OL; RUN; Nous obtiendrons alors (extrait) : Résultat 6.25 Sexe Prénom Taille ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ F ƒƒƒƒƒƒƒƒ F ƒƒƒƒƒƒƒƒ ƒƒƒƒƒƒƒƒ F ƒƒƒƒƒƒƒƒ Laure Awa Laurence Madlena Jodi ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Taille Moyenne ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Taille Médiane ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 171.00 164.00 151.00 170.00 160.00 ƒƒƒƒƒƒƒƒ 163.20 ƒƒƒƒƒƒƒƒ ƒƒƒƒƒƒƒƒ 164.00 ƒƒƒƒƒƒƒƒ À partir de la variable TAILLE, nous souhaitons produire trois statistiques : la taille, la taille médiane et la taille moyenne. Nous demandons donc la création de TAILLE_MED et TAILLE_MOY à partir de TAILLE. COLUMN sexe sexe2 datenais prenom taille taille=taille_moy taille=taille_med; SAS Livre Page 226 Jeudi, 18. septembre 2008 6:03 18 226 ◆ SAS Dans cette instruction COLUMN, on remarque aussi deux variables SEXE et SEXE2 parfaitement identiques. Si on examine les instructions DEFINE relatives à ces variables : DEFINE sexe / GROUP 'Sexe'; DEFINE sexe2 / GROUP NOPRINT; La variable SEXE sera affichée dans le rapport ; c’est une variable GROUP. La variable SEXE2 ne sera pas présentée dans le rapport. DEFINE DEFINE DEFINE DEFINE prenom / 'Prénom' WIDTH=20; taille / ANALYSIS FORMAT=8.2; taille_moy / MEAN NOPRINT; taille_med / MEDIAN NOPRINT; Les deux dernières instructions DEFINE permettent de calculer la moyenne et la médiane à partir de TAILLE. Les instructions COMPUTE AFTER alliées aux instructions BREAK AFTER permettent plus spécifiquement d’ajouter des éléments à la partie synthèse du rapport. La première instruction COMPUTE indique que, dans la partie synthèse, la variable PRENOM prendra comme valeur ‘Taille Moyenne’ et que la valeur de TAILLE.SUM (calculée par l’instruction DEFINE sur TAILLE – la somme est la statistique calculée par défaut) doit être remplacée par la moyenne TAILLE_MOY. L’instruction BREAK AFTER SEXE demande alors de positionner dans la partie synthèse du rapport les valeurs de SEXE, la nouvelle valeur de PRENOM (ici, la statistique calculée) et la valeur de TAILLE.SUM (que l’on a remplacée par la statistique désirée). La création de la seconde variable SEXE est rendue nécessaire par le fait que l’on souhaite deux résultats dans la partie synthèse du rapport : il nous faut donc deux instructions BREAK AFTER, ce qui n’est possible que si vous disposez de deux variables. c. Un dernier exemple Il s’agit ici d’ajouter en bas de la partie liste du rapport une partie synthèse indiquant le poids moyen des filles, le poids moyen des garçons et le poids moyen de toutes les personnes de la table. Ce programme vous montre que vous avez la possibilité, au sein de la procédure PROC REPORT, de créer des variables supports, utilisées dans les calculs mais qui ne seront pas présentées dans le rapport final. (La variable MDP créée dans le premier exemple était déjà une variable support.) Programme 6.54 DATA eleve4;SET eleve4; a=1; b=1; RUN; PROC REPORT DATA=eleve4 NOWINDOWS HEADSKIP HEADLINE; COLUMN a b sexe prenom poids; DEFINE a / GROUP NOPRINT; DEFINE b / GROUP NOPRINT; DEFINE sexe / DISPLAY WIDTH=12; DEFINE prenom / DISPLAY WIDTH=20; DEFINE poids / ANALYSIS MEAN FORMAT=6.1; COMPUTE poids; IF sexe='H' THEN DO; SAS Livre Page 227 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 227 poidsh+poids.MEAN; nbh+1; END; IF sexe='F' THEN DO; poidsf+poids.MEAN; nbf+1; END; ENDCOMP; COMPUTE AFTER a; prenom='Moyenne homme'; poids.MEAN=poidsh/nbh; ENDCOMP; COMPUTE AFTER B; prenom='Moyenne femme'; poids.MEAN=poidsf/nbf; ENDCOMP; COMPUTE AFTER; prenom='Moyenne générale'; poids=poids.MEAN; ENDCOMP; BREAK AFTER b / SUMMARIZE DOL DUL; BREAK AFTER a / SUMMARIZE DUL; RBREAK AFTER / SUMMARIZE DUL; RUN; La première instruction COMPUTE va calculer des sommes cumulées des poids des hommes et des poids des femmes à partir de la variable POIDS. Dans le même temps, on construit deux variables indiquant le nombre d’hommes et le nombre de femmes. La variable A vaut 1 quel que soit l’individu. L’instruction COMPUTE AFTER A indique donc qu’en bas de la table, dans la partie synthèse du rapport, la variable PRÉNOM va prendre comme modalité le texte ‘Moyenne homme’ ; le poids moyen (statistique demandée dans l’instruction DEFINE sur la variable POIDS) va alors être égal à la moyenne du poids de hommes, calculée ici par la division de la somme des poids de l’ensemble des hommes par le nombre d’hommes. Dans la partie liste du rapport, la variable POIDS.MEAN est égale aux poids des individus puisque la variable PRENOM est DISPLAY. La dernière instruction COMPUTE AFTER ne faisant pas référence à une variable, passe en dernier. Vous ne pouvez pas avoir plusieurs instructions RBREAK dans PROC REPORT mais vous pouvez avoir plusieurs instructions BREAK. Ici, puisque A et B prennent une valeur unique, les BREAK AFTER placeront les résultats en bas du tableau et auront le même impact qu’une instruction RBREAK. Quel que soit l’ordre dans lequel vous présentez vos instructions BREAK et RBREAK, les statistiques seront présentées de la manière suivante : ==================== Moyenne femme ==================== Moyenne homme ==================== Moyenne générale ==================== ====== 64.4 ====== 68.3 ====== 66.7 ====== SAS Livre Page 228 Jeudi, 18. septembre 2008 6:03 18 228 ◆ SAS Le RBREAK conduira forcément la production de la statistique moyenne générale sur la dernière ligne. Maintenant, la moyenne femme est en première ligne parce qu’elle est calculée après B, qui apparaît en deuxième position sur la ligne COLUMN : il est donc prioritaire. La moyenne homme apparaît sur la deuxième ligne parce qu’il est calculé après A qui apparaît avant B dans l’instruction COLUMN. Si vous souhaitez inverser l’ordre de présentation des moyennes, c’est sur la ligne COLUMN qu’il faut intervenir en demandant, par exemple, COLUMN B A. Vous n’avez pas besoin de réorganiser votre programme pour autant. L’organisation du programme n’a en fait que peu d’importance comme c’est souvent le cas dans les procédures : si vous inversez la position des différents blocs en présentant en premier les BREAK/RBREAK, puis les COMPUTE AFTER, le COMPUTE POIDS, les DEFINE et enfin l’instruction COLUMN, votre rapport sera parfaitement créé. À la simple lecture de ce programme inversé, il est nettement plus compliqué de comprendre le résultat obtenu. 6.5.6 PROC REPORT et ODS Comme avec PROC PRINT, vous pouvez introduire des modifications de style dans PROC REPORT avec le même type de commandes que celles que nous avons vues dans la section 6.4.2. Vos commandes STYLE peuvent intervenir comme options de PROC REPORT ou comme options de DEFINE, RBREAK, BREAK ou COMPUTE. Vous pouvez intervenir sur les éléments des rapports : CALLDEF Une cellule du tableau identifiée par une commande CALL DEFINE (uniquement en tant d’option de PROC REPORT). COLUMN Colonne du tableau (option de PROC REPORT ou COLUMN). HEADER En-tête de colonne (option de PROC REPORT ou DEFINE). LINES Lignes générées par une commande LINE (non développée dans cet ouvrage – option de PROC REPORT, COMPUTE, RBREAK, BREAK). REPORT Ensemble du rapport (option de PROC REPORT). SUMMARY Partie synthèse du rapport (PROC REPORT, RBREAK ou BREAK). Si vous êtes intéressé plus particulièrement par STYLE dans des sorties ODS de PROC REPORT, consultez le document suivant : www.lexjansen.com/pharmasug/2007/hw/hw03.pdf SAS Livre Page 229 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 229 6.6 PROC FREQ PROC FREQ permet la construction de tableaux croisés simples. Pour des tableaux plus complexes, vous devrez passer par PROC TABULATE (voir section 6.7.). PROC FREQ est une procédure qui a son utilité aussi bien dans la phase d’exploration de vos tables que dans la phase de présentation de celles-ci. La syntaxe de base de cette procédure est la suivante : PROC FREQ < options > ; BY variables ; EXACT options statistiques < / options de calcul > ; OUTPUT < OUT=SAS-data-SET > options ; TABLES définition des tables à construire < / options > ; TEST options ; WEIGHT variable ; Les options possibles de PROC FREQ sont : DATA= Spécifie la table SAS à utiliser. COMPRESS Force SAS à mettre ces différents tableaux sur une seule page. FORMCHAR= Spécifie les caractères à utiliser pour définir les cases des tableaux. NOPRINT Demande à ce qu’il n’y ait pas d’impression dans la fenêtre SORTIE. ORDER= Spécifie l’ordre dans lequel doivent apparaître les modalités : ORDER=DATA Demande à SAS de produire des tableaux dans lesquels les modalités apparaîtront dans l’ordre dans lequel elles apparaissent dans la table. ORDER=FORMATTED Ordonne les données en fonction des FORMAT. ORDER=FREQ Ordonne les modalités en ordre décroissant de leur fréquence. ORDER=INTERNAL Valeur par défaut : les modalités des variables numériques sont présentées dans un ordre croissant (ordre alphabétique pour les variables alphanumériques). SAS Livre Page 230 Jeudi, 18. septembre 2008 6:03 18 230 ◆ SAS PAGE Produit un tableau par page. Nous travaillerons pour cette section sur le fichier CINEMA.PRN : Programme 6.55 DATA cinema; INFILE 'C:\intro_SAS\fichiers\cinema.prn' EXPANDTABS; INPUT age type $ cinema sexe; RUN; Dans cette table, se trouvent les résultats (fictifs) d’une enquête réalisée auprès de cinéphiles. On retrouve dans cette table l’âge de l’individu enquêté, le type de films qu’il préfère, le nombre de films qu’il a vus au cours de l’année passée et son sexe. 6.6.1 Les tableaux de fréquences La procédure dans sa plus simple exécution produira des tableaux de fréquences. Programme 6.56 PROC FREQ DATA=cinema; RUN; Le résultat 6.26 reprend un des tableaux produits. Résultat 6.26 Fréquence Pourcent. sexe Fréquence Pourcentage cumulée cumulé ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 0 455 49.95 455 49.95 1 456 50.05 911 100.00 Pour chaque modalité de la variable, vous disposez de la fréquence, du pourcentage, de la fréquence cumulée et du pourcentage cumulé. Ces tableaux de fréquences sont produits quel que soit le type de la variable. Vous avez la possibilité de limiter le nombre de tableaux produits via l’instruction TABLES. Programme 6.57 PROC FREQ DATA=cinema; TABLES sexe; RUN; Pour commander un tableau dans PROC FREQ, les instructions TABLES et TABLE sont équivalentes. 6.6.2 Les tableaux croisés Le programme 6.58 construit notre premier tableau croisé. SAS Livre Page 231 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 231 Programme 6.58 PROC FREQ DATA=cinema; TABLES type*sexe; RUN; Il s’agit là du seul tableau croisé simple que l’on peut produire à partir de cette table – les autres variables présentes ont trop de modalités. Nous allons donc introduire quelques FORMAT spécifiques. Programme 6.59 PROC FORMAT; VALUE fage low-20 = '20 et moins' 21-30 = '21-30 ans' 31-50 = '31-50 ans' 51-65 = '51-65 ans' 66-high = '66 et plus'; VALUE fcinema 0='0' 1-5='1-5' 6-10='6-10' 11-20='11-20' 21-30='21-30' 31-high='31 et plus'; VALUE sexe 0='Homme' 1='Femme'; RUN; DATA cinema;SET cinema; FORMAT age fage. cinema fcinema. sexe sexe.; RUN; Si vous demandez maintenant des tableaux de fréquences pour les variables, les FORMAT ayant été attribués, vous pouvez relancer le programme 6.56. Si les FORMAT n’avaient pas été attribués, il aurait fallu que nous demandions à SAS d’utiliser les FORMAT adéquats au sein de la procédure PROC FREQ. PROC FREQ DATA=cinema; FORMAT age fage. cinema fcinema. sexe sexe.; RUN; Puisque les modalités ont été réduites au moyen des FORMAT spécifiques, vous pouvez maintenant demander tous les tableaux croisés possibles et imaginables : Programme 6.60 PROC FREQ DATA=cinema; TABLES age*(sexe cinema type); RUN; Ici, SAS créera les tableaux age*sexe, age*cinema et age*type. Les règles de commandes des tableaux sont les suivantes : TABLES x y z; donne trois tris à plat. SAS Livre Page 232 Jeudi, 18. septembre 2008 6:03 18 232 ◆ SAS TABLES x*y; donne un tableau croisé avec les modalités de X en lignes et celles de Y en colonnes. TABLES x*(y z); est équivalent à X*Y et X*Z. TABLES (a b)*(c d); est équivalent à A*C A*D B*C B*D. TABLES (x1-x4)*(x6 x7); est équivalent à X1*X6 X1*X7 X2*X6 X2*X7 X3*X6 X3*X7 X4*X6 X4*X7. Résultat 6.27 age sexe Fréquence ‚ Pourcentage ‚ Pourct. en ligne‚ Pourct. en col. ‚Homme ‚Femme ‚ Total ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ 20 et moins ‚ 34 ‚ 44 ‚ 78 ‚ 3.73 ‚ 4.83 ‚ 8.56 ‚ 43.59 ‚ 56.41 ‚ ‚ 7.47 ‚ 9.65 ‚ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ 21-30 ans ‚ 110 ‚ 108 ‚ 218 ‚ 12.07 ‚ 11.86 ‚ 23.93 ‚ 50.46 ‚ 49.54 ‚ ‚ 24.18 ‚ 23.68 ‚ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ 31-50 ans ‚ 218 ‚ 226 ‚ 444 ‚ 23.93 ‚ 24.81 ‚ 48.74 ‚ 49.10 ‚ 50.90 ‚ ‚ 47.91 ‚ 49.56 ‚ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ 51-65 ans ‚ 83 ‚ 68 ‚ 151 ‚ 9.11 ‚ 7.46 ‚ 16.58 ‚ 54.97 ‚ 45.03 ‚ ‚ 18.24 ‚ 14.91 ‚ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ 66 et plus ‚ 10 ‚ 10 ‚ 20 ‚ 1.10 ‚ 1.10 ‚ 2.20 ‚ 50.00 ‚ 50.00 ‚ ‚ 2.20 ‚ 2.19 ‚ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ Total 455 456 911 49.95 50.05 100.00 Dans chaque case, apparaissent quatre informations : l’effectif, le pourcentage que représente cet effectif dans la population totale, le pourcentage ligne et le pourcentage colonne. Ainsi, dans le tableau age*sexe, dans la case correspondant à homme*20 ans et moins, 34 individus dans la population remplissent les deux critères : ils représentent 3.73 % de la population totale. Parmi les 20 ans et moins, 43.59 % sont des hommes (pourcentage ligne). Parmi les hommes, 7.47 % ont moins de 20 ans (pourcentage colonne). Si vous souhaitez n’afficher que certaines de ces informations, vous pouvez demander à SAS de retirer celles qui vous sont inutiles : Programme 6.61 PROC FREQ DATA=cinema; TABLES age*sexe / NOCOL NOROW NOPERCENT; RUN; SAS Livre Page 233 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 233 Ici, vous retirez les pourcentages colonnes (NOCOL), les pourcentages lignes (NOROW) et les pourcentages indiquant la part dans la population totale (NOPERCENT). Pour retirer les fréquences, on utilisera l’option NOFREQ1. Dans un tableau de fréquences (tri à plat), l’option NOCUM permet d’écarter de la sortie les données cumulées. Pour dresser des tableaux identiques pour différentes sous-populations, vous utiliserez la commande BY (la commande CLASS n’est pas autorisée dans PROC FREQ2). N’oubliez cependant pas de trier vos données au préalable. Programme 6.62 PROC SORT DATA=cinema; BY sexe; RUN; PROC FREQ DATA=cinema; BY sexe; TABLES age*cinema; RUN; Vous avez la possibilité, sans trier votre table, d’obtenir le même résultat avec le programme 6.63. Programme 6.63 PROC FREQ DATA=cinema; TABLES sexe*age*cinema; RUN; Si votre table contient des valeurs manquantes, elles sont exclues de l’analyse et vous observez en bas de votre tableau MISSING VALUE= nombre de valeurs manquantes. Vous pouvez souhaiter que SAS traite ces valeurs manquantes comme des modalités à part entière en introduisant l’option MISSING à votre demande de tableau3. Programme 6.64 PROC FREQ DATA=cinema; TABLES age*cinema / MISSING; RUN; Pour appliquer une pondération sur des données, vous devez nommer votre variable de pondération au moyen de la commande WEIGHT suivie du nom de votre variable de pondération. En plus de tableaux, PROC FREQ effectue un ensemble de tests statistiques. Pour plus de détails sur ces tests, reportez-vous à la documentation SAS4 ou à l’aide en ligne : (SAS 9.1.3) support.sas.com/onlinedoc/913/getDoc/fr/procstat.hlp/freq_sect10.htm# basestat_freq_freqtables 1. N’utilisez pas les quatre options à la fois… 2. Il ne s’agit en aucun cas d’une erreur : si vous avez compris l’objet de PROC FREQ, vous savez que la commande CLASS n’aurait absolument aucun intérêt. 3. Aucune valeur manquante n’apparaît dans la table CINEMA utilisée dans cette section. 4. Entrée FREQ procedure, TABLES Statement. SAS Livre Page 234 Jeudi, 18. septembre 2008 6:03 18 234 ◆ SAS (SAS 9.2) : support.sas.com/documentation/cdl/en/statug/59654/HTML/default/ statug_freq_sect010.htm Sont concernées par ces tests les commandes EXACT, TEST ainsi que de nombreuses options liées à l’instruction TABLES, qui apparaissent, comme toutes les options, après le /. La commande OUTPUT n’a d’intérêt que dans le cas où vous demandez à SAS de produire des statistiques ou des tests. (OUTPUT ne permet pas de créer un fichier dans lequel vous auriez votre tableau croisé.) En revanche, si vous souhaitez que votre tableau soit envoyé sur un fichier de résultats, c’est sur la ligne TABLES que vous devez l’indiquer : Programme 6.65 PROC FREQ DATA=cinema; TABLES age*cinema / OUT=toto; RUN; Si, ensuite, vous demandez un PROC PRINT sur la table TOTO, vous obtiendrez le résultat 6.28. Résultat 6.28 Obs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 age 20 et 20 et 20 et 20 et 20 et 20 et 20-30 20-30 20-30 20-30 20-30 20-30 30-50 30-50 30-50 30-50 30-50 30-50 50-65 50-65 50-65 50-65 50-65 50-65 65 et 65 et 65 et 65 et 65 et 65 et moins moins moins moins moins moins ans ans ans ans ans ans ans ans ans ans ans ans ans ans ans ans ans ans plus plus plus plus plus plus cinema 0 1-5 5-10 10-20 20-30 30 et 0 1-5 5-10 10-20 20-30 30 et 0 1-5 5-10 10-20 20-30 30 et 0 1-5 5-10 10-20 20-30 30 et 0 1-5 5-10 10-20 20-30 30 et plus plus plus plus plus COUNT 5 21 14 22 4 12 8 61 42 54 35 18 31 140 78 107 56 32 8 41 30 38 16 18 1 5 4 5 2 3 PERCENT 0.5488 2.3052 1.5368 2.4149 0.4391 1.3172 0.8782 6.6959 4.6103 5.9276 3.8419 1.9759 3.4029 15.3677 8.5620 11.7453 6.1471 3.5126 0.8782 4.5005 3.2931 4.1712 1.7563 1.9759 0.1098 0.5488 0.4391 0.5488 0.2195 0.3293 Le tableau a bien trente cases (5 modalités d’âge * 6 modalités de fréquentation). Les coordonnées de ces cases ainsi que les effectifs par case et le pourcentage que représente cet effectif dans le total sont repris dans votre fichier de résultats. Si vous demandez la réalisation de plusieurs tables et que vous souhaitiez une table de sortie, cette table ne contiendra que le dernier tableau demandé. Si vous souhaitez une table de sortie par tableau généré, vous devez spécifier plusieurs instructions TABLES. SAS Livre Page 235 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 235 Programme 6.66 PROC FREQ DATA=cinema; TABLES type*sexe /OUT=res; TABLES type*age /OUT=res2; RUN; Enfin, comme dans beaucoup d’autres procédures, vous pouvez sélectionner des observations sur lesquelles effectuer soit un tableau de fréquences, soit un tableau croisé, à l’aide de l’instruction WHERE. Programme 6.67 PROC FREQ DATA=cinema; TABLES type*cinema; WHERE age<50 AND sexe=1; RUN; 6.7 PROC TABULATE Procédure plus puissante que PROC FREQ, PROC TABULATE permet la construction de tableaux croisés très détaillés et peut offrir en même temps des statistiques descriptives. Elle partage un ensemble de points communs avec PROC PRINT et PROC REPORT, et constitue, après ces deux procédures, le troisième et dernier outil de production de tableaux complexes. Pour plus de détails, consultez l’ouvrage de Lauren E. Haworth, Proc Tabulate by Example, édité par SAS Institute, n˚56514 (ISBN-13: 978-1580253581). 6.7.1 Syntaxe La syntaxe est la suivante (il ne s’agit que d’un extrait, d’autres commandes sont possibles) : PROC TABULATE < liste-option > ; CLASS liste des variables de classification ; VAR liste des variables analysées ; TABLE <<expression-page, > expression-ligne, > expression-colonne < / liste-option-table >; BY variables ; FREQ variable ; KEYLABEL mot-clé-1='description-1' < ...mot-clé-n='description-n' > ; WEIGHT variable; Les options suivantes peuvent apparaître au niveau de PROC TABULATE : DATA=table-système-SAS Spécifie la table utilisée. Si DATA= est omis, SAS utilise la dernière table créée. SAS Livre Page 236 Jeudi, 18. septembre 2008 6:03 18 236 ◆ SAS FORMAT=w.d Spécifie la largeur des cellules et le nombre de décimales. Si FORMAT= est omis, FORMAT=BEST12.2 MISSING Cette option permet de maintenir dans le tableau l’observation dont la modalité d’une variable de classification est manquante. Une ligne ou une colonne MISSING sera ajoutée. ORDER=ordre Spécifie l’ordre d’affichage des en-têtes lignes ou colonnes pour les modalités des variables de CLASS. ORDER=DATA Ordre d’apparition dans les données ORDER=FORMATTED Ordre selon les FORMAT ORDER=FREQ Ordre par fréquences décroissantes ORDER=INTERNAL Ordre selon les valeurs internes (défaut) Nous verrons dans les divers exemples proposés dans cette section qu’il existe des options propres à la commande TABLE. Enfin, PROC TABULATE permet de générer les statistiques suivantes (elles ne sont pas toutes indiquées) : CSS CV MAX MEAN MIN N NMISS PCTN PCTSUM PRT RANGE STD STDERR SUM SUMWGT USS T VAR Somme des carrés corrigée pour la moyenne Coefficient de variation Valeur maximale Moyenne arithmétique Valeur minimale Nombre d’observations ayant une valeur non manquante pour la variable d’analyse Nombre d’observations ayant une valeur manquante pour la variable d’analyse Pourcentage des fréquences Pourcentage de la somme Probabilité d’une valeur absolue plus grande pour la valeur t Domaine des valeurs, MAX-MIN Écart-type Erreur type de la moyenne Somme Somme pondérée Somme des carrés non corrigée Valeur T de Student pour tester l’hypothèse d’une moyenne nulle de la population Variance SAS Livre Page 237 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 237 6.7.2 Exemples d’applications Nous travaillerons pour cette partie sur la table VENTE : une entreprise vend ses produits dans quatre régions (C Centre, L Limousin, B Bretagne et N Nord). Dans chacune de ces régions, elle dispose de trois magasins qui se différencient en fonction de la surface de vente (P Petit, M Moyen, G Gros). Chaque magasin vend trois produits (A, B et C) à deux clientèles spécifiques (G gros et D détail). Les prix de ventes sont identiques d’un lieu de vente à l’autre ; des prix particuliers sont offerts aux clients de type G. Dans votre table, vous disposez des factures émises au cours d’une certaine semaine. Un enregistrement a l’allure suivante : numfact 1 region C taille M produit A client D vente 130 prix 125.00 CA 16250.00 La facture numéro 1 provient d’un magasin de taille moyenne de la région Centre. Elle concerne un produit A vendu à un client de type détail. Il a acheté 130 unités de A au prix unitaire de 125 euros, soit un chiffre d’affaires de 16 250 euros. Le programme 6.68 crée la table complète (1000 observations). Programme 6.68 DATA ventes; deb='225435125215'; reg='CLBN'; DO j=0 TO 3; temp1=SUBSTR(deb,j*3+1,3); temp2=SUBSTR(reg,j+1,1); DO I=1 TO temp1; numfact+1; region=temp2; IF RANUNI(123)<0.3 THEN taille='P'; ELSE IF RANUNI(123)<0.8 THEN taille='M'; ELSE taille='G'; IF RANUNI(234)<0.25 THEN produit='A'; ELSE IF RANUNI(234)<0.58 THEN produit='B'; ELSE produit='C'; IF RANUNI(345)<0.64 THEN client='G'; ELSE client='D'; vente=ROUND(RANNOR(123)*20+125*(1-0.5*(client='P')),1); prix=ROUND(125*(produit='A')*(1-0.125*(client='G')) +150*(produit='B')*(1-0.14*(client='G')) +170*(produit='C')*(1-0.085*(client='G')),0.01); CA=prix*vente; OUTPUT; END; END; DROP i j deb reg temp1 temp2; RUN; PROC FORMAT; VALUE $region N='Nord' C='Centre' B='Bretagne' L='Limousin'; VALUE $taille P='Petit' M='Moyen' G='Gros'; VALUE $produit A='Prod. A' B='Prod. B' C='Prod. C'; VALUE $client G='Gros' D='Détail'; RUN; DATA ventes; SAS Livre Page 238 Jeudi, 18. septembre 2008 6:03 18 238 ◆ SAS SET ventes; FORMAT region $region. taille $taille. produit $produit. client $client.; RUN; De façon à rendre la table plus lisible, des FORMAT spécifiques ont été associés aux variables au moyen d’une étape DATA (nous n’aurons donc pas besoin de les demander dans l’étape de construction des tables). a. Structures lignes-colonnes des tableaux Au sein de la procédure PROC TABULATE, les commandes CLASS et TABLE commandent la structure lignes-colonnes des tableaux. Construisons un premier tableau simple : Programme 6.69 PROC TABULATE DATA=ventes F=10.; CLASS region; TABLE region; RUN; L’instruction CLASS indique à SAS que la ou les variables qui suivent doivent être considérées comme des variables de classification : cela signifie qu’elles serviront à définir les lignes ou les colonnes de votre tableau. Vous observerez autant de lignes/colonnes que vous avez de modalités différentes pour vos variables de classification (et une de plus si vous spécifiez l’option MISSING pour maintenir présentes dans votre tableau les factures qui ne sont pas rattachées à une des quatre régions). Dans le cas du premier tableau, aucune variable n’est analysée, ce qui explique que SAS met dans les cases du tableau défini par la commande TABLE les effectifs pour chaque modalité (le nombre de factures pour chaque région). L’option F=10. ou FORMAT=10. indique à SAS que, par défaut, les colonnes du tableau auront dix caractères de large et demande à afficher des entiers. Vous obtenez ainsi : Résultat 6.29 „ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ† ‚ region ‚ ‡ƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒ‰ ‚ Bretagne ‚ Centre ‚ Limousin ‚ Nord ‚ ‡ƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒ‰ ‚ N ‚ N ‚ N ‚ N ‚ ‡ƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒ‰ ‚ 125‚ 225‚ 435‚ 215‚ 탃ƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒŒ Vous pouvez avoir dans votre tableau plusieurs variables en colonnes : Programme 6.70 PROC TABULATE DATA=ventes F=10.; CLASS region produit; TABLE region produit; RUN; SAS Livre Page 239 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 239 Outre la répartition des factures par régions, vous obtiendrez la répartition des factures par types de produits. Il est aussi possible de construire un vrai tableau croisé : Programme 6.71 PROC TABULATE DATA=ventes F=10.; CLASS region produit; TABLE region,produit ; ** <- merci de noter la virgule; RUN; La première variable indiquée sera celle qui apparaîtra en ligne. La variable indiquée après la virgule apparaîtra en colonne. Votre tableau permet de savoir combien de factures émises en région Centre concerne le produit A. Vous avez la possibilité de choisir deux variables de classification pour définir les intitulés de lignes : Programme 6.72 PROC TABULATE DATA=ventes F=10.; CLASS region taille produit; TABLE region taille, produit; RUN; Ou encore deux variables de définition des lignes et deux variables de définition des colonnes : Programme 6.73 PROC TABULATE DATA=ventes F=10.; CLASS region taille produit client; TABLE region taille, produit client; RUN; Résultat 6.30 „ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ† ‚ ‚ produit ‚ client ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ Prod. A ‚ Prod. B ‚ Prod. C ‚ Détail ‚ Gros ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ N ‚ N ‚ N ‚ N ‚ N ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒ‰ ‚region ‚ ‚ ‚ ‚ ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ ‚ ‚ ‚ ‚Bretagne ‚ 24‚ 57‚ 44‚ 30‚ 95‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒ‰ ‚Centre ‚ 55‚ 87‚ 83‚ 90‚ 135‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒ‰ ‚Limousin ‚ 102‚ 192‚ 141‚ 164‚ 271‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒ‰ ‚Nord ‚ 56‚ 106‚ 53‚ 83‚ 132‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒ‰ ‚taille ‚ ‚ ‚ ‚ ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ ‚ ‚ ‚ ‚Gros ‚ 32‚ 70‚ 49‚ 57‚ 94‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒ‰ ‚Moyen ‚ 151‚ 243‚ 175‚ 208‚ 361‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒ‰ ‚Petit ‚ 54‚ 129‚ 97‚ 102‚ 178‚ 탃ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒŒ Vous avez la possibilité d’imbriquer les variables de classification : SAS Livre Page 240 Jeudi, 18. septembre 2008 6:03 18 240 ◆ SAS Programme 6.74 PROC TABULATE DATA=ventes F=10.; CLASS region taille produit; TABLE region*taille, produit; RUN; L’instruction * commande l’imbrication : pour chaque modalité de la variable REGION, nous souhaitons avoir les différentes modalités de TAILLE. Vous pouvez aussi comprendre l’espace entre deux variables de classification comme une commande de juxtaposition. Le programme 6.75 offre un second exemple d’imbrication : Programme 6.75 PROC TABULATE DATA=ventes F=7.; CLASS region taille produit; TABLE region, taille* produit /RTS=10; RUN; L’option RTS de la commande TABLE spécifie le nombre de caractères à réserver pour l’intitulé des lignes. Vous obtenez grâce à ce dernier programme le tableau reproduit par le résultat 6.31. Résultat 6.31 „ƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ† ‚ ‚ taille ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ Gros ‚ Moyen ‚ Petit ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ produit ‚ produit ‚ produit ‚ ‚ ‡ƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒ‰ ‚ ‚Prod. A‚Prod. B‚Prod. C‚Prod. A‚Prod. B‚Prod. C‚Prod. A‚Prod. B‚Prod. C‚ ‚ ‡ƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚ N ‚ N ‚ N ‚ N ‚ N ‚ N ‚ N ‚ N ‚ N ‚ ‡ƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚region ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‡ƒƒƒƒƒƒƒƒ‰ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚Bretagne‚ 2‚ 9‚ 7‚ 12‚ 32‚ 20‚ 10‚ 16‚ 17‚ ‡ƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚Centre ‚ 12‚ 16‚ 14‚ 28‚ 50‚ 45‚ 15‚ 21‚ 24‚ ‡ƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚Limousin‚ 11‚ 29‚ 21‚ 74‚ 102‚ 75‚ 17‚ 61‚ 45‚ ‡ƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚Nord ‚ 7‚ 16‚ 7‚ 37‚ 59‚ 35‚ 12‚ 31‚ 11‚ 탃ƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒŒ Le programme 6.76 présente une dernière possibilité : Programme 6.76 PROC TABULATE DATA=ventes F=7.; CLASS region taille produit; TABLE region, taille, produit /RTS=10; RUN; Ce programme produit, pour chaque modalité de REGION, un tableau croisant TAILLE et PRODUIT. En résumé, lorsque vous définissez la structure de votre tableau : • Les variables dont les modalités vont devenir intitulés de lignes ou de colonnes doivent être listées via l’instruction CLASS. SAS Livre Page 241 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 241 • L’instruction TABLE donne au tableau sa structure : – L’astérisque permet d’imbriquer les variables de classification (CLASS). – La virgule permet de commander un tableau croisé. – L’espace commande la juxtaposition. b. Les variables d’analyse Jusqu’à présent, seuls des effectifs étaient présentés dans le tableau. On connaissait ainsi le nombre d’observations ayant telle ou telle caractéristique. Nous allons maintenant introduire des variables à analyser. Deux variables sont particulièrement intéressantes : les ventes (nombre d’unités de biens vendus) et le chiffre d’affaires. L’instruction VAR permet de définir sur quelle(s) variable(s) portera l’analyse. Programme 6.77 PROC TABULATE DATA=ventes F=7.; CLASS produit; VAR vente ca; TABLE produit, vente ca; RUN; Résultat 6.32 „ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒ† ‚ ‚ vente ‚ CA ‚ ‚ ‡ƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚ Sum ‚ Sum ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚produit ‚ ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ ‚Prod. A ‚ 29790‚3448744‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚Prod. B ‚ 54895‚7508490‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚Prod. C ‚ 40375‚6471606‚ 탃ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒŒ Vous observez ainsi dans le tableau la somme des ventes (en unités vendues) et le chiffre d’affaires réalisé par type de produits vendus. Nous pouvons enrichir ce tableau en ajoutant une seconde variable de classification : Programme 6.78 PROC TABULATE DATA=ventes F=10.; CLASS produit client; VAR vente ca; TABLE produit client, vente ca; RUN; Ou, pour être encore plus précis, commander une imbrication : Programme 6.79 PROC TABULATE DATA=ventes F=7.; CLASS produit client; VAR vente ca; TABLE produit*client, vente ca; RUN; SAS Livre Page 242 Jeudi, 18. septembre 2008 6:03 18 242 ◆ SAS Vous pourriez souhaiter un tableau dans lequel : • Les produits sont présentés en lignes. • Les clients sont présentés en colonnes. • À l’intérieur du tableau, les ventes sont indiquées. Programme 6.80 PROC TABULATE DATA=ventes F=7.; CLASS produit client; VAR vente ca; TABLE produit,client*vente; RUN; Le programme 6.80 permet d’obtenir le tableau reproduit par le résultat 6.33. Résultat 6.33 „ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ† ‚ ‚ client ‚ ‚ ‡ƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒ‰ ‚ ‚Détail ‚ Gros ‚ ‚ ‡ƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚ vente ‚ vente ‚ ‚ ‡ƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚ Sum ‚ Sum ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚produit ‚ ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ ‚Prod. A ‚ 12184‚ 17606‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚Prod. B ‚ 20335‚ 34560‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚Prod. C ‚ 13237‚ 27138‚ 탃ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒŒ En fait, lorsqu’elle est placée entre deux variables de classification, la commande * commande l’imbrication. Si elle est placée entre une variable de classification et une variable d’analyse, elle commande l’analyse de la variable à l’intérieur du tableau. Les données apparaissant à l’intérieur du tableau ne seront pas modifiées si votre commande de tableau est de la forme : TABLE produit*vente,client; En revanche, les rappels du nom de la variable d’analyse et de la statistique éditée se feront en lignes et non plus en colonnes. c. Choix de la statistique éditée dans le tableau Jusqu’à présent, l’information offerte par SAS dans les tableaux est la somme (statistique par défaut). Il est possible de demander d’autres statistiques (celles-ci sont indiquées dans la section 6.7.1. – pour une liste complète, voir l’aide SAS, entrée TABULATE procedure, puis statistics). Pour commander la production de statistiques différentes de la somme, vous devez faire suivre votre variable d’analyse d’un astérisque (*), puis lister entre parenthèses votre liste de statistiques demandées1. 1. Si vous ne souhaitez qu’une seule statistique, les parenthèses ne sont pas obligatoires. SAS Livre Page 243 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 243 Programme 6.81 PROC TABULATE DATA=ventes F=7.; CLASS region client; VAR vente; TABLE region*client, vente*(MIN MEAN MAX); RUN; Exercice 6.3 : Quelle programmation vous donnera en lignes les régions et en colonnes, les types de clients ? Faites apparaître les informations sur le CA réalisé en totalité et en moyenne par type de clientèle pour chaque région. Exercice 6.4 : Quelle est la programmation pour obtenir les régions imbriquées avec les min max et moyenne des CA en lignes, et les produits en colonnes ? Si vous exécutez le programme 6.82, les moyennes et les sommes vont apparaître avec deux décimales : Programme 6.82 PROC TABULATE DATA=ventes F=7.2; CLASS region taille produit; VAR vente; TABLE region*taille, vente*(SUM MEAN); RUN; ** programme équivalent; PROC TABULATE DATA=ventes F=7.2; CLASS region taille; VAR vente; TABLE region*taille, vente*SUM vente*MEAN; RUN; Vous devinez maintenant que la commande de statistiques différentes sur des variables d’analyse différentes est tout à fait possible : Programme 6.83 PROC TABULATE DATA=ventes F=7.2; CLASS region taille; VAR vente ca; TABLE region*taille, ca*SUM vente*(MEAN SUM MIN); RUN; Ou encore : Programme 6.84 PROC TABULATE DATA=ventes F=7.2; CLASS region taille produit; VAR vente ca; TABLE region*taille, produit*(ca*SUM vente*(MEAN SUM MIN)); RUN; SAS Livre Page 244 Jeudi, 18. septembre 2008 6:03 18 244 ◆ SAS d. L’introduction de récapitulatifs dans le tableau Nous savons demander à SAS des tableaux croisés dans lesquels peuvent apparaître un certain nombre de statistiques (somme, moyenne, min, max….). On pourrait maintenant avoir envie de voir en bas ou à droite de nos tableaux ces mêmes statistiques, toutes modalités de la variable définissant les lignes confondues (en bas du tableau) ou toutes modalités de la variable en colonnes confondues (forcément à droite du tableau). Nous travaillerons dans un premier temps à introduire des « sommes récapitulatives » (statistique obtenue par défaut). Nous introduirons ensuite des récapitulatifs en lignes ou en colonnes d’autres statistiques. Partons de ce tableau : Programme 6.85 PROC TABULATE DATA=ventes F=7.; CLASS region taille produit; VAR vente ca; TABLE region*taille, produit*(ca vente); RUN; La somme (des ventes, du CA…) s’obtiendra par l’introduction de la commande ALL. La position de cette commande ALL est primordiale : Programme 6.86 PROC TABULATE DATA=ventes F=7.; CLASS region taille produit; VAR vente ca; TABLE region*taille ALL, produit*(ca vente); RUN; Étant donné la position de la commande ALL, vous ordonnez une somme, toutes modalités de région et de taille confondues. Vous obtenez bien en bas de votre tableau une ligne correspondant à la somme, toutes modalités confondues. Programme 6.87 PROC TABULATE DATA=ventes F=7.; CLASS region taille produit; VAR vente ca; TABLE region*(taille ALL) , produit*(ca vente); WHERE region NE 'B' AND region NE 'L'; RUN; SAS Livre Page 245 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 245 Résultat 6.34 „ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ† ‚ ‚ produit ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ Prod. A ‚ Prod. B ‚ Prod. C ‚ ‚ ‡ƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒ‰ ‚ ‚ CA ‚ vente ‚ CA ‚ vente ‚ CA ‚ vente ‚ ‚ ‡ƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚ Sum ‚ Sum ‚ Sum ‚ Sum ‚ Sum ‚ Sum ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚region ‚taille ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ ‚ ‚ ‚ ‚ ‚Centre ‚Gros ‚ 179473‚ 1543‚ 273771‚ 1972‚ 285835‚ 1751‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚Moyen ‚ 418195‚ 3539‚ 840444‚ 6203‚ 920825‚ 5776‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚Petit ‚ 206661‚ 1767‚ 361893‚ 2611‚ 479409‚ 2979‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚All ‚ 804329‚ 6849‚1476108‚ 10786‚1686069‚ 10506‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚Nord ‚taille ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚Gros ‚ 98269‚ 866‚ 287340‚ 2064‚ 125018‚ 783‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚Moyen ‚ 535265‚ 4669‚ 986400‚ 7164‚ 696602‚ 4336‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚Petit ‚ 173395‚ 1499‚ 514947‚ 3768‚ 233605‚ 1439‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚All ‚ 806929‚ 7034‚1788687‚ 12996‚1055225‚ 6558‚ 탃ƒƒƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒŒ Une simple paire de parenthèses et vous obtenez un tableau différent : ici, vous effectuez une somme sur toutes les modalités de taille. Comme taille est croisée avec région, cette somme est effectuée pour chaque région1. Programme 6.88 PROC TABULATE DATA=ventes F=7.; CLASS region taille produit; VAR vente ca; TABLE (region ALL)*taille , produit*(ca vente); RUN; Ici, vous allez obtenir une somme pour toutes les modalités de région confondues sur les différentes modalités de la variable TAILLE. Cette somme ne peut être qu’en bas du tableau. Programme 6.89 PROC TABULATE DATA=ventes F=7.; CLASS region taille produit; VAR vente ca; TABLE (region ALL)*taille ALL , produit*(ca vente); RUN; Ici, en plus de la somme sur les régions par taille, il est demandé une somme toutes modalités région*taille confondues. Vous pouvez même réaliser ce tableau (c’est le dernier) mais on peut se demander quelle utilité il pourrait avoir : 1. Seules deux régions sont analysées dans ce tableau. SAS Livre Page 246 Jeudi, 18. septembre 2008 6:03 18 246 ◆ SAS Programme 6.90 PROC TABULATE DATA=ventes F=7.2; CLASS region taille produit; VAR vente ca; TABLE (region ALL)*(taille ALL) ALL , produit*(ca vente); RUN; Exercice 6.5 : Sur la base du tableau précédent (dans sa version la plus simple, uniquement sur les CA), faites apparaître des sommes de CA par région toutes tailles confondues et des sommes tous produits confondus. Faites aussi apparaître le CA réalisé en totalité (toutes régions, tous produits, toutes tailles confondus). Exercice 6.6 : « On peut demander d’autres statistiques que la somme. » Repartons de la table CINEMA construite dans la section consacrée à PROC FREQ. Nous disposons dans cette table d’informations relatives à des individus : leur sexe, le type de films qu’il préfère, leur âge et le nombre de fois où ils sont allés au cinéma. 1. Quelles sont les variables de classification possibles ? 2. Quelles sont les variables qui peuvent faire l’objet d’une analyse ? 3. Dans les cases du tableau, quelles informations aurez-vous obtenues au moyen du programme suivant ? (n‘essayez pas de lancer ce programme pour répondre à la question) PROC TABULATE DATA=cinema f=10.; CLASS …; VAR …; TABLES type ALL,sexe ALL; RUN; 4. Que mettre à la place des ‘…’ si vous souhaitez voir le tableau ordonné par l’instruction TABLES ? 5. Quelle est la programmation à lancer si vous souhaitez vérifier que les femmes vont moins souvent au cinéma que les hommes ? 6. Les femmes semblent aller moins souvent au cinéma que les hommes. Mais ce résultat est-il valable quel que soit le type de films que les individus préfèrent ? Construisez le tableau qui pourrait répondre à cette question (tout en continuant à répondre à la question précédente). Les différentes programmations proposées jusqu’à maintenant ne construisent que des sommes lignes. Si vous souhaitez des sommes colonnes, l’instruction ALL doit s’appliquer à la variable de classification utilisée en colonnes : Programme 6.91 PROC TABULATE DATA=ventes F=7.; CLASS region taille produit; VAR vente ca; TABLE region*taille,(produit ALL)*(ca vente); RUN; Pour obtenir d’autres statistiques que la somme ainsi que des récapitulatifs, reprenons le tableau créé par le programme 6.92. SAS Livre Page 247 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 247 Programme 6.92 PROC TABULATE DATA=ventes F=7.2; CLASS region taille produit; VAR vente; TABLE region*taille, produit*vente*MEAN; RUN; Vous avez maintenant compris que les commandes ALL indiquant à SAS les modalités qu’il doit sommer pour créer son récapitulatif doivent être placées immédiatement après la variable de classification concernée par le récapitulatif. Programme 6.93 PROC TABULATE DATA=ventes CLASS region taille VAR vente; TABLE region*taille WHERE region NE 'B' RUN; F=7.2; produit; ALL, (produit ALL)*vente*MEAN; AND region NE 'L'; Ce programme 6.93 vous permet d’obtenir : Résultat 6.35 „ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒ† ‚ ‚ produit ‚ ‚ ‚ ‡ƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒ‰ ‚ ‚ ‚Prod. A‚Prod. B‚Prod. C‚ All ‚ ‚ ‡ƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚ vente ‚ vente ‚ vente ‚ vente ‚ ‚ ‡ƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚ Mean ‚ Mean ‚ Mean ‚ Mean ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚region ‚taille ‚ ‚ ‚ ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ ‚ ‚ ‚Centre ‚Gros ‚ 128.58‚ 123.25‚ 125.07‚ 125.38‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚Moyen ‚ 126.39‚ 124.06‚ 128.36‚ 126.16‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚Petit ‚ 117.80‚ 124.33‚ 124.13‚ 122.62‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚Nord ‚Gros ‚ 123.71‚ 129.00‚ 111.86‚ 123.77‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚Moyen ‚ 126.19‚ 121.42‚ 123.89‚ 123.43‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚ ‚Petit ‚ 124.92‚ 121.55‚ 130.82‚ 124.19‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚All ‚ 125.07‚ 123.22‚ 125.47‚ 124.38‚ 탃ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒŒ e. L’introduction de pourcentage dans les tableaux Vous trouverez peut-être des exemples de programme dans lesquels les pourcentages sont introduits au moyen de l’instruction PCTSUM. Cette instruction est problématique car elle commande d’indiquer sur quoi doit se faire le calcul du pourcentage. Ainsi : SAS Livre Page 248 Jeudi, 18. septembre 2008 6:03 18 248 ◆ SAS Programme 6.94 PROC TABULATE DATA=ventes F=7.2; CLASS region; VAR vente; TABLE region ALL,vente*(SUM PCTSUM <region ALL>); RUN; Nous demandons un tableau avec, en lignes, les régions, avec une ligne supplémentaire pour toutes les régions confondues (ALL). Nous analysons les ventes et nous souhaitons, sur cette variable, la somme des ventes (SUM), et le pourcentage (PCTSUM) que représentent les ventes par région et toutes régions confondues (REGION ALL) On doit bien sûr arriver à 100. Plutôt que PCTSUM, il vaut mieux utiliser les instructions REPPCTSUM, COLPCTSUM, ROWPCTSUM et PAGEPCTSUM. PCTSUM est à réserver à des cas beaucoup plus complexes (auxquels vous serez peut-être confronté un jour mais que l’on ne traitera pas dans cet ouvrage). Le programme 6.94 peut aisément être remplacé par : Programme 6.95 PROC TABULATE DATA=ventes F=7.2; CLASS region; VAR vente; TABLE region ALL,vente*(SUM COLPCTSUM); RUN; Nous demandons ici un pourcentage colonnes parce qu’une somme égale à 100 en colonnes est souhaitée. Partons maintenant du tableau donné par le programme 6.96. Programme 6.96 PROC TABULATE DATA=ventes F=7.2; CLASS region produit; VAR vente; TABLE region ALL,(produit ALL)*vente; RUN; Et si, au lieu de pourcentages colonnes (la somme en colonnes donne 100), vous souhaitez des pourcentages lignes (somme en lignes égale à 100) : Programme 6.97 PROC TABULATE DATA=ventes F=7.2; CLASS region produit; VAR vente; TABLE region ALL,(produit ALL)*vente*(SUM ROWPCTSUM); RUN; Vous obtiendrez le résultat 6.36. SAS Livre Page 249 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 249 Résultat 6.36 „ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ† ‚ ‚ produit ‚ ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ ‚ Prod. A ‚ Prod. B ‚ Prod. C ‚ Tout ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ vente ‚ vente ‚ vente ‚ vente ‚ ‚ ‡ƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒ‰ ‚ ‚ ‚RowPct-‚ ‚RowPct-‚ ‚RowPct-‚ ‚RowPct ‚ ‚ ‚ Sum ‚ Sum ‚ Sum ‚ Sum ‚ Sum ‚ Sum ‚ Sum ‚ Sum ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚region ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚Bretagne ‚2993.00‚ 19.33‚6986.00‚ 45.13‚5502.00‚ 35.54‚15481.0‚ 100.00‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚Centre ‚6849.00‚ 24.34‚10786.0‚ 38.33‚10506.0‚ 37.33‚28141.0‚ 100.00‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚Limousin ‚12914.0‚ 23.54‚24127.0‚ 43.99‚17809.0‚ 32.47‚54850.0‚ 100.00‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚Nord ‚7034.00‚ 26.46‚12996.0‚ 48.88‚6558.00‚ 24.67‚26588.0‚ 100.00‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒ‰ ‚Tout ‚29790.0‚ 23.82‚54895.0‚ 43.89‚40375.0‚ 32.28‚ 125060‚ 100.00‚ 탃ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒŒ Si vous souhaitez des pourcentages calculés sur le tableau (pourcentage cellule) : Programme 6.98 PROC TABULATE DATA=ventes F=7.2; CLASS region produit; VAR vente; TABLE region ALL,(produit ALL)*vente*(SUM REPPCTSUM); RUN; Grâce à ce dernier tableau, vous savez que les ventes de produits A effectuées par la région Bretagne représentent 2,39 % des ventes totales réalisées par l’entreprise, tous produits et toutes régions confondus. PAGEPCTSUM permet de calculer des pourcentages sur le total d’un tableau croisécroisé (instruction TABLE CLASS 1, CLASS 2, CLASS 3). Il y a donc ici production de plusieurs tableaux ; la somme des pourcentages offerts dans chaque tableau est égale à 100 %. Jusqu’à maintenant, les pourcentages ont été calculés sur la somme d’une variable d’analyse. Vous pourriez aussi avoir besoin de pourcentages calculés sur les effectifs. Vous utiliserez pour cela les instructions REPPCTN, COLPCTN, ROWPCTN et PAGEPCTN. Programme 6.99 PROC TABULATE DATA=ventes ; CLASS region produit; VAR ca; TABLE region ALL,(produit ALL)*CA*(REPPCTSUM*F=9.2 REPPCTN*F=9.1) / RTS=12; LABEL region='Région' produit='Produit vendu' CA="Chiffre d’affaires"; KEYLABEL SUM='Somme' ALL='Total' REPPCTSUM='Part dans les ventes totales' REPPCTN='Part dans les factures établies'; RUN; SAS Livre Page 250 Jeudi, 18. septembre 2008 6:03 18 250 ◆ SAS Pour obtenir : Résultat 6.37 „ƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ† ‚ ‚ Produit vendu ‚ ‚ ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ Prod. A ‚ Prod. B ‚ Prod. C ‚ Total ‚ ‡ƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚Chiffre d’affaires ‚Chiffre d’affaires ‚Chiffre d’affaires ‚chiffre d’affaires ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒ…ƒƒƒƒƒƒƒƒƒ‰ ‚ ‚Part dans‚Part dans‚Part dans‚Part dans‚Part dans‚Part dans‚Part dans‚Part dans‚ ‚ ‚ les ‚ les ‚ les ‚ les ‚ les ‚ les ‚ les ‚ les ‚ ‚ ‚ ventes ‚factures ‚ ventes ‚factures ‚ ventes ‚factures ‚ ventes ‚factures ‚ ‚ ‚ totales ‚établies ‚ totales ‚établies ‚ totales ‚établies ‚ totales ‚établies ‚ ‡ƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒ‰ ‚Région ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‡ƒƒƒƒƒƒƒƒƒƒ‰ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚Bretagne ‚ 1.93‚ 2.4‚ 5.46‚ 5.7‚ 4.97‚ 4.4‚ 12.37‚ 12.5‚ ‡ƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒ‰ ‚Centre ‚ 4.61‚ 5.5‚ 8.47‚ 8.7‚ 9.67‚ 8.3‚ 22.76‚ 22.5‚ ‡ƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒ‰ ‚Limousin ‚ 8.61‚ 10.2‚ 18.89‚ 19.2‚ 16.43‚ 14.1‚ 43.93‚ 43.5‚ ‡ƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒ‰ ‚Nord ‚ 4.63‚ 5.6‚ 10.26‚ 10.6‚ 6.05‚ 5.3‚ 20.95‚ 21.5‚ ‡ƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒƒ‰ ‚Total ‚ 19.79‚ 23.7‚ 43.08‚ 44.2‚ 37.13‚ 32.1‚ 100.00‚ 100.0‚ 탃ƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒŒ Afin d’améliorer la présentation de nos tableaux, nous utilisons déjà les FORMAT spécifiques définis dans le programme 6.68. Vous remarquez que le programme 6.99 introduit les commandes LABEL (étiquette de variable) et KEYLABEL (étiquette de mot-clé) pour remplacer les termes TOUT, SUM, REPPCTN et REPPCPSUM par des termes permettant d’expliquer ce que mesurent ces statistiques dans ce tableau. Avec SAS 9.1, pour déterminer les mots clés à remplacer via l’instruction KEYLABEL, il suffisait de regarder le tableau pour voir apparaître ALL, SUM, REPPCTN et REPPCPSUM. Avec SAS 9.2, ALL a été remplacé dans les sorties de PROC TABULATE par TOUT1. TOUT n’est cependant pas reconnu par KEYLABEL. Si vous souhaitez remplacer TOUT, c’est par le mot-clé ALL que vous passerez dans l’instruction KEYLABEL. Vous noterez aussi que nous pouvons jouer sur les FORMAT d’affichage des chiffres en spécifiant un FORMAT par défaut (option dans l’instruction PROC TABULATE, non demandé ici), puis un FORMAT spécifique sur certaines informations (ici REPPCTSUM demandé avec deux décimales et REPPCTPN demandé avec une décimale). Si vous précisez un FORMAT en option de PROC TABULATE, celui-ci s’impose à toutes les données des cellules du tableau à moins que vous ne précisiez, dans la commande TABLE, d’utiliser tel ou tel FORMAT pour cette statistique. 6.7.3 PROC TABULATE et ODS Comme nous avons pu le voir dans les sections 6.4.2. pour PROC PRINT et 6.5.6. pour PROC REPORT, les options STYLE permettent de modifier la présentation des tableaux générés par PROC TABULATE lorsque ceux-ci sont envoyés vers une direction ODS. Dans la procédure PROC TABULATE, les options STYLE peuvent intervenir comme options de PROC TABULATE ou de CLASS, CLASSLEV, KEYWORD, TABLE ou VAR. 1. 1. Les résultats 6.34 et 6.35 ont été générés avec SAS 9.1 (voir le ALL dans les lignes récapitulatives), alors que le résultat 6.36 a été généré avec SAS 9.2. SAS Livre Page 251 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 251 Contrairement à PROC PRINT ou à PROC REPORT, lorsque vous utilisez STYLE, vous n’avez pas besoin de préciser l’élément du style que vous voulez modifier. C’est en fonction de l’endroit où vous introduisez la commande STYLE que vous allez modifier tel ou tel élément du tableau. Partons du tableau créé par le programme 6.100. Programme 6.100 TITLE ' '; PROC TABULATE DATA=ventes F=eurox12.; CLASS region produit; VAR ca; TABLE region ALL , (produit ALL)*CA*(SUM REPPCTSUM*F=7.2) / RTS=12 BOX='BOX'; LABEL region='Région' produit='Produit vendu' CA="Chiffre d’affaires"; KEYLABEL SUM='Somme' ALL='Total' REPPCTSUM='Part dans les ventes totales'; WHERE produit NE 'C'; RUN; Résultat 6.38 Afin de voir à quel endroit placer votre commande STYLE pour agir sur telle ou telle partie du tableau, nous avons introduit dans le programme 6.101 sept commandes STYLE correspondant aux six zones de ce tableau. Ces commandes se contentent d’agir sur la couleur de fond ou sur la couleur de la police. Bien entendu, les paramètres de style que nous avons précisés lors de l’examen de PROC PRINT peuvent, à quelques exceptions près, s’appliquer ici (voir section 6.4.2.). Pour plus de détails sur ces divers paramètres, vous pouvez consulter le lien suivant : www2.sas.com/proceedings/sugi26/p003-26.pdf SAS Livre Page 252 Jeudi, 18. septembre 2008 6:03 18 252 ◆ SAS Programme 6.101 PROC TABULATE DATA=ventes F=EUROX12. STYLE=[FOREGROUND=white]; CLASS region produit / STYLE=[BACKGROUND=green]; CLASSLEV region / STYLE=[BACKGROUND=black]; CLASSLEV produit / STYLE=[BACKGROUND=black]; VAR ca / STYLE=[BACKGROUND=yellow]; TABLE region ALL,(produit ALL)*CA* (SUM*[STYLE=[BACKGROUND=orange]] REPPCTSUM*F=7.2) / RTS=12 BOX=[LABEL='BOX' STYLE=[BACKGROUND=brown]]; LABEL region='Région' produit='Produit vendu' CA="Chiffre d’affaires"; KEYLABEL SUM='Somme' ALL='Total' REPPCTSUM='Part dans les ventes totales'; KEYWORD ALL SUM / STYLE=[FOREGROUND=red BACKGROUND=lightblue]; WHERE produit NE 'C'; RUN; Résultat 6.39 4 3 6 2 5 4 3 2 1bis 1 Vous remarquez qu’il existe trois manières d’introduire la commande STYLE : • En option de PROC TABULATE. Pas de signe /. • En option des instructions VAR, CLASS, CLASSLEV et KEYWORDS. Avec le signe habituel des options : /. CLASSLEV est une instruction qui ne modifie pas votre tableau mais qui permet l’application de commande STYLE à des en-têtes de colonnes. • Dans l’instruction TABLE, STYLE apparaît entre crochets. Voyons maintenant à quels éléments d’un tableau produit par PROC TABULATE s’appliquent nos différentes commandes STYLE : Zones 1 et 1bis : les cellules du tableau peuvent être modifiées avec une commande STYLE en option de PROC TABULATE. Si votre commande est placée ici, elle SAS Livre Page 253 Jeudi, 18. septembre 2008 6:03 18 Quelques procédures de base ◆ 253 s’imposera à toutes les cellules sauf si vous imposez une nouvelle commande STYLE dans la commande TABLE. TABLE region ALL , (produit ALL)*CA*(SUM*[STYLE=[BACKGROUND=orange]]… Ici, pour les cellules correspondant à la colonne SUM (SOMME), nous demandons un fond orange – la couleur FOREGROUND=WHITE demandée en option de PROC TABULATE ne s’applique plus (et on reprend la couleur FOREGROUND par défaut, soit le noir)1. Zone 2 : STYLE appliqué à KEYWORD. Cette commande n’apparaissait pas dans le programme 6.100. KEYWORD ne modifie pas le tableau mais permet d’appliquer des commandes de STYLE aux mots clés évoqués dans KEYLABEL (il n’est pas possible d’appliquer STYLE à KEYLABEL). Si nous avions de plus ajouté REPPCTSUM, la couleur de fond de la case « part dans les ventes totales » aurait été identique à celle de « somme » et de « total ». En multipliant les instructions KEYWORD, on peut appliquer à chacun des éléments de type 2 un style différent. Zone 3 : STYLE appliqué à CLASSLEV. Nous avons multiplié les instructions CLASSLEV sans que cela soit réellement nécessaire puisque nous appliquons des couleurs de fond identiques. Nous aurions pu tout aussi bien appliquer des couleurs de fond différentes. Zone 4 : STYLE appliqué à CLASS. Zone 5 : STYLE appliqué à BOX=, option de TABLE. La syntaxe devient ici ardue : TABLE . . . . / RTS=12 BOX=[LABEL='BOX' STYLE=[BACKGROUND=brown]]; Normalement, pour entrer un texte dans la case en haut à gauche, il suffit d’indiquer en option de l’instruction TABLE : BOX='BOX' N’oubliez pas de mettre entre crochets (ou accolades) l’ensemble des options souhaitées pour BOX. Zone 6 : STYLE appliqué à VAR. Il est possible d’introduire une dernière commande STYLE dans l’instruction TABLE : TABLE . . . . / RTS=12 STYLE=[BACKGROUND=red] BOX=[LABEL='BOX' STYLE=[BACKGROUND=brown]]; Cette commande STYLE, option de TABLE puisqu’elle intervient après le /, permet de contrôler l’encadrement lui-même : les lignes qui composent le tableau seront rouges. 1. La colonne Part dans les ventes totales est en gris, la couleur par défaut (voir résultat 6.38). SAS Livre Page 254 Jeudi, 18. septembre 2008 6:03 18 SAS Livre Page 255 Jeudi, 18. septembre 2008 6:03 18 7 Les graphiques sous SAS Au sommaire de ce chapitre : 7.1. Les commandes STATEMENTS dans SAS/GRAPH 7.2. PROC GCHART 7.3. PROC GPLOT 7.4. Vos graphiques et ODS 7.5. SAS 9.2 – Les procédures « Statisticals Graphics » Différentes procédures proposées dans Base SAS permettent de réaliser des graphiques (PROC CHART, PROC PLOT et PROC TIMEPLOT). Les graphiques ainsi produits sont de mauvaise qualité. Si, en revanche, vous disposez du module SAS/GRAPH, vous avez la possibilité de réaliser très rapidement des graphiques d’excellente facture. Avec SAS/GRAPH, vous pouvez utiliser, entre autres, les procédures suivantes : • PROC GCHART permet de réaliser des histogrammes (en trois dimensions, deux dimensions horizontales, verticales), des camemberts, des donuts (camemberts à trous), des graphiques en étoile. • PROC GPLOT permet de réaliser des graphes opposant deux variables au moyen de nuages de points ou de lignes, des graphiques de régression (nuage + droite de régression + intervalle de confiance), des « boîtes à moustaches », des bulles. • PROC G3D permet de réaliser des graphiques en trois dimensions au moyen de surfaces continues ou de points. • PROC GCONTOUR permet de replacer sur deux dimensions des graphiques en trois dimensions. • PROC GMAP permet de réaliser des graphiques en deux ou trois dimensions sur des cartes. Vous pouvez ainsi ajouter des barres sur une carte, adopter des codes de couleurs par zone géographique… Pour des exemples de graphiques réalisés au moyen de ces procédures, vous pouvez soit consulter l’aide de SAS (entrée Introduction to SAS, puis GRAPH Software, puis overview), soit consulter l’aide en ligne à l’adresse suivante : (SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/graphref.hlp/intro-types.htm SAS Livre Page 256 Jeudi, 18. septembre 2008 6:03 18 256 ◆ SAS (SAS 9.2) : support.sas.com/documentation/cdl/en/graphref/59607/HTML/default/ intro-types.htm Si vous suivez ces deux liens, vous constaterez d’une part que SAS/GRAPH présente des procédures autres que celles que nous venons de citer et, d’autre part, que le passage à la version 9.2 a été l’occasion d’une très forte amélioration de SAS/GRAPH. Dans cet ouvrage, nous nous intéresserons uniquement aux possibilités des procédures PROC GCHART et PROC GPLOT. Il s’agit en effet des graphiques les plus couramment utilisés. De plus, les différentes procédures offertes par SAS/GRAPH ont un certain nombre d’éléments en commun. Une fois que vous serez familiarisé avec les éléments de langage propres à SAS/GRAPH et à la construction des graphiques proposés par PROC GCHART et PROC GPLOT, vous pourrez à peu de frais explorer les possibilités des autres procédures. Si vous lisez ce chapitre pour la première fois, nous vous conseillons de vous concentrer plus particulièrement sur les exemples qui illustrent les procédures PROC GCHART et PROC GPLOT – nous vous invitons à reconstruire au fur et à mesure de leur présentation ces différents graphiques et à modifier certaines options afin de bien comprendre leur impact avant de passer à l’exemple suivant. 7.1 Les commandes STATEMENTS dans SAS/GRAPH Dans SAS/GRAPH, vous avez la possibilité de définir, avant même de réaliser un graphique, un ensemble d’options qui vont déterminer le standard ou l’environnement à appliquer à vos graphiques. Nous verrons que cette phase de définition de l’environnement est essentielle et conditionne en grande partie votre résultat final. Ces commandes STATEMENTS sont au nombre de dix : AXIS, BY, FOOTNOTE, GOPTIONS, LEGEND, NOTE, ODS HTML, PATTERN, SYMBOL, TITLE. Dans ce chapitre, nous ne présenterons que les commandes AXIS, FOOTNOTE, GOPTIONS, LEGEND, PATTERN, SYMBOL, TITLE et NOTE. Les commandes LEGEND et SYMBOL seront développées dans la section consacrée à PROC GPLOT. Ces commandes STATEMENTS peuvent intervenir soit à l’intérieur de la procédure graphique que vous souhaitez utiliser (entre le PROC Gxxx1 et le RUN qui conclut cette procédure), soit avant la commande d’ouverture de procédure. Dans les exemples qui illustreront ce chapitre, pour plus de clarté, les commandes STATEMENTS seront systématiquement placées avant les instructions de construction de graphiques. Cette règle n’est pas valable pour la commande NOTE et la commande BY qui doivent forcément être placées à l’intérieur de la procédure. La commande ODS HTML doit être impérativement placée avant PROC Gxxx (voir chapitre 8). Une commande de type STATEMENTS, qu’elle soit placée au sein de la procédure ou avant la procédure, reste valable jusqu’à son annulation ou sa modification. Ainsi, dans les exemples proposés dans ce chapitre, les programmes débuteront le plus souvent par : GOPTIONS RESET=ALL; 1. Les PROC Gxxx sont les procédures propres à SAS/GRAPH. Les noms de ces procédures débutent toutes par la lettre G. SAS Livre Page 257 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 257 Cette commande annule en effet toutes les commandes STATEMENTS qui ont pu être exécutées. Attention cependant : les graphiques générés dépendent en partie de la version de SAS que vous utilisez mais aussi de l’ordinateur sur lequel vous travaillez. Il est possible que vous observiez de votre côté des graphiques légèrement différents de ceux reproduits dans le présent ouvrage ou sur le site Internet support à cet ouvrage où tous les graphiques présentés ici sont proposés dans leur version originale. 7.1.1 Les polices et couleurs dans SAS/GRAPH Avant d’examiner les commandes STATEMENTS qui agissent sur le cadre dans lequel votre graphique va être produit, nous consacrons cette section à deux éléments importants qui conditionnent votre résultat final : les couleurs et les polices. a. Les couleurs Les graphiques produits par SAS/GRAPH sont en couleurs. Si vous ne spécifiez pas les couleurs à utiliser pour tel ou tel élément de votre graphique, SAS utilisera une liste de couleurs par défaut. Les couleurs par défaut des versions antérieures à la version 9.2 étaient particulièrement vives, ce qui rendait quasi obligatoire leur modification vers des couleurs plus douces. Avec la version 9.2 de SAS, les couleurs par défaut ont été modifiées de façon assez importante et il est désormais possible de produire des graphiques tout à fait acceptables en les utilisant. Le programme qui suit vous permet de voir les couleurs par défaut utilisées par PROC GPLOT et PROC GCHART. Sur le site Internet compagnon de cet ouvrage, vous retrouverez les graphiques générés par ce programme au moyen de SAS 9.1 et SAS 9.2. Vous pourrez constater les améliorations apportées en la matière. Programme 7.1 GOPTIONS RESET=ALL; DATA test; ARRAY color(24) color1-color24; color1=1; DO i=2 TO 24; color(i)=color(i-1)+1; END; DO j=1 TO 24; OUTPUT; END; RUN; TITLE 'Couleurs par défaut GPLOT'; SYMBOL INTERPOL=join WIDTH=50; PROC GPLOT; PLOT (color1-color12)*j / OVERLAY NOFRAME; WHERE J NE .; RUN; TITLE 'Couleurs par défaut GCHART'; PROC GCHART; VBAR j / DISCRETE SUMVAR=color10 PATTERNID=MIDPOINT; RUN; SAS Livre Page 258 Jeudi, 18. septembre 2008 6:03 18 258 ◆ SAS Si ces couleurs ne vous satisfont pas (on pourrait imaginer qu’elles ne soient pas en accord avec une charte graphique que vous devez respecter), nous verrons par la suite qu’il est possible de donner à chaque élément de votre graphique la couleur de votre choix. Il est aussi possible de définir une nouvelle liste de couleurs à utiliser par défaut via la commande COLORS dans GOPTIONS1. Pour contrôler la cohérence de votre liste de couleurs, vous pourrez alors utiliser le programme 7.1 en retirant la ligne GOPTIONS RESET=ALL. Si vous ne souhaitez pas utiliser les couleurs par défaut et spécifier vous-même les couleurs à utiliser, il est possible de définir des couleurs en utilisant les codes RGB, CMYK, HLS, HSV (HSB), les échelles de gris ou les couleurs prédéfinies par SAS2. Vous pourrez avoir le sentiment d’avoir « trop » d’outils à votre disposition pour décider des couleurs à donner à ces graphiques. La difficulté n’est cependant pas de choisir une couleur mais de trouver un ensemble de couleurs qui peuvent aller ensemble. De façon ponctuelle, vous pouvez utiliser les couleurs prédéfinies par SAS. Il existe deux niveaux de couleurs prédéfinies. Le premier niveau (CNS) est résumé par le tableau 7.1. Tableau 7.1 • Les couleurs CNS Luminosité Saturation Couleur Black Gray Blue Very Dark Grayish Purple Dark Moderate Red Medium Strong Orange/Brown Light Vivid Yellow Very Light Green White Vous pouvez définir des couleurs à partir de ces codes. Les couleurs les plus simples à demander sont Black, White, Gray et les six couleurs qui apparaissent dans la colonne Couleur. Vous avez aussi la possibilité de combiner les diverses notations de Luminosité, Saturation et Couleur (impérativement dans cet ordre) de la manière suivante : Verydarkstrongblue very_dark_strong_blue “very dark strong blue“ 1. Voir l’aide SAS (entrée COLORS= graphics option, puis Graphics Options and Device Parameters Dictionary : COLORS). 2. Pour une présentation complète des outils de couleurs offerts par SAS, vous pouvez consulter : support.sas.com/onlinedoc/913/getDoc/fr/graphref.hlp/colors-specify-color.htm#colors-namingscheme (SAS 9.1.3) support.sas.com/documentation/cdl/en/graphref/59607/HTML/default/colors-specify-color.htm (SAS 9.2) Ou l’aide SAS, onglet Sommaire : SAS products / SAS GRAPH / SAS GRAPH reference / SAS GRAPH concepts / SAS GRAPH colors and images / Specifying colors in SAS GRAPH. SAS Livre Page 259 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 259 Vous pouvez donner deux codes couleurs dans ce type de demande de couleurs : Verydarkstrongredblue Et même demander dans ce cas une mise en avant d’une des deux couleurs : Verydarkstrongredishblue SAS propose d’autres définitions de couleurs au moyen de mots clés comme AliceBlue, AntiquaWhite, Aqua1… Pour connaître ces différents mots clés, demandez REGEDIT dans la fenêtre COMMANDE, puis COLORNAMES dans la fenêtre des registres qui s’affiche, puis ouvrez le dossier HTML. Pour voir à quoi correspondent ces différentes couleurs, vous pouvez consulter l’article de Lauren E. Haworth (annexe D en dernière page) : www.laurenhaworth.com/publications/132-30.pdf Vous pouvez aussi consulter l’article suivant sur Wikipedia : http://fr.wikipedia.org/wiki/Couleurs_du_Web Modifier la couleur donnée à un élément ne pose pas de difficultés. En revanche, choisir une couleur et déterminer des couleurs qui peuvent aller ensemble se révèle plus délicat. C’est pourquoi nous vous invitons à utiliser des couleurs codées au moyen des codes RGB. Au moyen d’un code RGB, une couleur est comprise comme un mélange de rouge, de vert et de bleu. Pour demander une couleur RGB, vous aurez des commandes de la forme suivante : COLOR=CXrrvvbb rr (vv, bb) est l’intensité du rouge (vert, bleu), donnée par un nombre hexadécimal pouvant aller de 00 à FF. 00 correspond au niveau le plus sombre de la couleur, FF correspond au niveau le plus clair. CXFFFFFF correspondra au blanc, CX000000 correspondra au noir. Comme il existe 256 possibilités de réglage d’intensité pour chaque composante, vous avez accès à 2563 = 16 777 216 couleurs différentes. De nombreux sites sur Internet vont vous aider dans le choix de vos couleurs. C’est plus particulièrement en raison de l’existence de ces nombreux sites que nous vous invitons à utiliser des couleurs RGB. Afin de choisir une couleur de fond et vous rendre compte de son rendu, vous pouvez consulter le site : www.clearink.com/dynakewb/ Vous obtenez une grille de 216 couleurs. Il suffit alors de cliquer sur la couleur de votre choix pour le fond de la page Web. Le code RGB correspondant apparaît dans une case (il suffit de copier-coller, de retirer le signe # et de le remplacer par CX). Les couleurs présentées ici sont dites « websafe » ; elles s’afficheront sans problème si votre graphique est appelé à être distribué via Internet ou intranet et donc à être ouvert via un navigateur. 1. Il s’agit en fait des couleurs dites X11. SAS Livre Page 260 Jeudi, 18. septembre 2008 6:03 18 260 ◆ SAS Les différentes couleurs que vous choisirez pour réaliser un graphique devront être assorties. Les sites suivants vous donneront les couleurs qui peuvent être associées à une couleur de base : www.hlrnet.com/colormatch/fr.php Évitez d’utiliser les couleurs primaires et leurs déclinaisons : inconsciemment, les déclinaisons proposées des couleurs primaires ont toujours une « signification » dans le sens où elles peuvent induire l’interprétation. Figure 7.1 • Capture d’écran de www.hlrnet.com/colormatch/fr.php. Si vous souhaitez obtenir les codes RGB des couleurs websafe proches de celles que vous avez sélectionnées, rendez-vous sur : www.catnmoose.com/wsc.shtml Ce site offre également de nombreuses possibilités : wellstyled.com/tools/colorscheme2/index-en.html En sélectionnant une couleur de base, vous pouvez obtenir un ensemble de couleurs possibles à associer à votre couleur de base, imposer divers filtres (option « variations ») et demander des couleurs websafe. Les codes couleurs RGB sont immédiatement indiqués et peuvent être copiés-collés dans SAS. Ce site propose seulement quatre couleurs assorties. b. Les polices dans SAS/GRAPH Comme vous pouvez le constater, dans la fenêtre SORTIE, seules les polices à chasse constante peuvent être utilisées. Ce sont les polices qui, quel que soit le caractère, prennent en largeur le même nombre de pixels sur votre écran. Par exemple : SASMONOSPACE et COURIER NEW sont des polices à chasse constante, contrairement à TIMES. Dans SAS/GRAPH, vous allez pouvoir appliquer à l’ensemble des éléments de texte qui composeront votre graphique la police de votre choix (si elle est SAS Livre Page 261 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 261 installée sur votre ordinateur). Vous devez indiquer le nom de la police que vous souhaitez utiliser entre quotes. TITLE F='times' "C’est le titre"; * F peut être utilisé à la place de FONT; Vous souhaitez des titres en gras et en italique : TITLE F='times/bold/italic' "C’est le titre"; Vous pouvez utiliser les simples quotes ou les doubles quotes pour préciser votre titre. Cependant, si votre titre contient une apostrophe, ce sont impérativement les doubles quotes que vous devrez utiliser. Vous devez impérativement séparer les éléments définissant votre police avec un slash (/). Dans ce cadre, l’antislash (\) n’est pas compris par SAS. Les ressources d’Internet peuvent aussi être mobilisées afin d’améliorer le rendu de votre graphique. Certes, vous pouvez vous contenter des polices installées sur votre ordinateur mais bien souvent, vous améliorerez votre présentation en utilisant des polices particulières que vous trouverez gratuitement sur le Web. Vous pourrez, par exemple, consulter les sites suivants : www.dafont.com/fr/ www.1001freefonts.com/ www.searchfreefonts.com/ Prenez garde cependant à ne pas faire preuve de trop de fantaisie et à ne violer aucun copyright en utilisant à des fins professionnelles des polices dont ce n’est pas la destination. SAS 9.2 met à votre disposition un certain nombre de nouvelles polices : Albany AMT, Cumberland AMT, Thorndale AMT, Symbol MT, Monotype Sorts, Monotype Sans WT J, Monotype Sans WT K, Monotype Sans WT SC, Monotype Sans WT TC, Thorndale Duospace WT J, Thorndale Duospace WT K, Thorndale Duospace WT SC, Thorndale Duospace WT TC, Arial Symbol, Times New Roman Symbol, MS PMincho, MS Mincho, MS PGothic, MS UI Gothic, Batang, BatangChe, Gungsuh, GungsuhChe, Dotum, DotumChe, Gulim, GulimChe, NSimSun, SimHei, SimSun, PMingLiU, MingLiU, HeiT. Les polices Albany AMT, Cumberland AMT, Thorndale AMT et Symbol MT proposent des versions italique et gras. Parmi les modifications intervenues dans la présentation des graphiques par défaut entre les versions 9.1 et 9.2 de SAS, vous constaterez l’abandon de la police SASFONT au profit de la police ARIAL. Arial SASFONT Il n’est désormais plus nécessaire de modifier systématiquement la police afin de rendre les graphiques plus présentables. SAS Livre Page 262 Jeudi, 18. septembre 2008 6:03 18 262 ◆ SAS 7.1.2 GOPTIONS : les options graphiques Au travers des commandes GOPTIONS, vous allez pouvoir définir un ensemble de paramètres qui vont définir l’environnement de base de votre graphique. Les commandes disponibles dans GOPTIONS sont présentées très succinctement dans l’aide SAS (entrée GOPTIONS statements) ou sur Internet : (SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/graphref.hlp/goptions chap.htm (SAS 9.2) : support.sas.com/documentation/cdl/en/graphref/59607/HTML/ default/goptionschap.htm La plupart de ces commandes sont expliquées plus explicitement au moyen d’un dictionnaire : (SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/graphref.hlp/a000713550.htm (SAS 9.2) : support.sas.com/documentation/cdl/en/graphref/59607/HTML/default/ a000713550.htm Pour connaître les GOPTIONS actives et obtenir des explications (en français dans SAS 9.2) sur l’impact de telle ou telle commande, vous pouvez exécuter le programme suivant : PROC GOPTIONS; RUN; Plus d’une centaine de commandes sont disponibles dans GOPTIONS. Certaines étant propres à votre système d’exploitation, nous ne pouvons pas toutes les étudier en détail. Par ailleurs, les liens que nous vous indiquons plus haut ne reprennent pas l’intégralité des commandes possibles sur GOPTIONS. Voici quelques-unes des possibilités données par GOPTIONS : GOPTIONS RESET=ALL Pour annuler toutes les GOPTIONS que vous avez pu déjà introduire et retourner aux valeurs par défaut. GOPTIONS RESET=GLOBAL Pour annuler toutes les commandes de type STATEMENTS (AXIS, FOOTNOTE, LEGEND, PATTERN, SYMBOL et TITLE). Les autres modifications apportées aux GOPTIONS ne seront pas annulées. GOPTIONS RESET=GOPTIONS Pour annuler toutes vos modifications de GOPTIONS sauf les commandes de type STATEMENTS. Vous pouvez introduire des options affectant l’apparence de la fenêtre dans laquelle apparaît le graphique. BORDER/NOBORDER Pour commander ou retirer un encadrement. Par défaut, un encadrement est appliqué. SAS Livre Page 263 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 263 HSIZE=, VSIZE=Xcm Pour avoir un graphique de Xcm de haut/large. Attention de bien spécifier ‘cm’. Si vous ne mettez rien, SAS traitera votre mesure comme une mesure dans l’unité par défaut, généralement la cellule ou carreau (CELLS1). GUNIT=CELLS/CM/IN/PCT/PT Par défaut, l’unité de mesure est la cellule (CELLS). Utilisez cette option pour modifier cette unité de mesure : cellule/centimètre/pouce/pourcentage du graphique/point. IBACK=‘c:\…’ Pour insérer une image de fond au lieu d’une couleur de fond. IMAGESTYLE=FIT/TILE Si vous insérez une image en fond, soit SAS étire l’image de façon qu’elle prenne l’intégralité de la fenêtre GRAPH (FIT), soit SAS prend l’image telle quelle et la reproduit au besoin (TILE). Par défaut, SAS duplique l’image. Options de couleur, de police CBACK= Couleur du fond. CTEXT= Couleur par défaut du texte. CTITLE= Couleur par défaut du titre. FTEXT= Police par défaut du texte. FTITLE= Police par défaut des titres. HTEXT= Hauteur par défaut du texte. L’unité par défaut est la cellule. Vous pouvez aussi demander par défaut du 14 points : HTEXT=14pt – si vous ne voulez pas écrire ‘pt’ chaque fois que vous allez définir une taille de texte, GUNIT=pt redéfinira l’unité de mesure des hauteurs de texte mais affectera aussi l’unité par défaut de VSIZE, HSIZE… HTITLE= Hauteur par défaut du titre. GOPTIONS vous permet aussi d’animer des images dans SAS/GRAPH, d’envoyer vos graphiques dans des fichiers, de gérer des imprimantes… 1. Les mesures en CELLS sont difficiles à maîtriser. Nous vous invitons à utiliser systématiquement le centimètre pour définir la taille de votre graphique ou le point pour définir la taille de votre police. SAS Livre Page 264 Jeudi, 18. septembre 2008 6:03 18 264 ◆ SAS Les commandes que vous avez mises dans GOPTIONS s’appliqueront à moins que vous indiquiez d’appliquer autre chose. Par exemple, la police définie dans GOPTIONS sera appliquée à moins que, dans une commande TITLE par exemple, vous en indiquiez une autre (qui ne sera utilisée que pour le titre en question). 7.1.3 Les titres, les pieds de pages, les notes dans SAS/GRAPH Il nous faut traiter à nouveau des titres et des pieds de pages puisque la syntaxe obéit ici à des règles différentes de celles qui peuvent régir les titres dans la fenêtre SORTIE et qui permettent des résultats nettement plus probants que ceux obtenus pour la fenêtre SORTIE. Les commandes TITLE et FOOTNOTE peuvent apparaître au sein de la procédure PROC Gxxx ou en dehors de la procédure. NOTE ne peut apparaître que dans la procédure. Par défaut (si vous n’avez pas modifié les paramètres par défaut par une commande GOPTIONS), TITLE1 est environ deux fois plus gros1 que les autres éléments de texte, centré, en haut, au-dessus du graphique. TITLE2 aura par défaut la même taille que les autres éléments du texte. Les pieds de pages apparaissent en bas, taille normale, centré. Les notes apparaissent par défaut dans la zone de graphique, à gauche. TITLE, FOOTNOTE et NOTES se programment de la même manière : Options d’apparence COLOR= ou C= Pour définir la couleur du texte. FONT= ou F= Police à utiliser. HEIGHT= ou H= Sans indication d’unité et si GUNIT n’a pas été modifié, H=2 demande que le texte occupe deux cellules en hauteur. Vous pouvez directement spécifier la taille de la police en points : H=12pt. Options de placement et d’espacement JUSTIFY=LEFT | CENTER | RIGHT ou J=L|C|R Positionnement du titre. LSPACE=ligne<unité> Ajoute des lignes au-dessus du titre, ou au-dessous du pied de page. MOVE=(x,y)<unité> Déplace le texte. Les unités peuvent être le centimètre (CM), le point (PT), le pouce (IN), le nombre de carreaux (CELLS – unité par défaut) ou le pourcentage (PCT : 0.5pct soit au milieu). X (Y) est la valeur du déplacement horizontal (vertical). 1. Par défaut, le rapport entre la taille du premier et du deuxième titre n’est pas constant, et dépend de la police utilisée. Avec la police ARIAL, TITLE2 est exactement deux fois plus petit que TITLE1 ; avec la police TIMES, ce rapport est égal à 2.45. SAS Livre Page 265 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 265 Options d’orientation ANGLE=degrés Pour un TITLE : • 90 : le titre est à gauche, vertical. • –90 : à droite, vertical. • 180 : en bas, à l’envers. Le titre tourne par rapport au centre du graphique comme s’il était au bout d’une hélice. LANGLE=degrés Le texte tourne sur lui-même. ROTATE=degrés Chaque caractère tourne sur lui-même de n degrés. Autres options BCOLOR= Couleur de fond en cas de BOX (encadrement du titre). BOX=1…4 Commande l’encadrement et l’épaisseur du cadre du titre. BSPACE=box-space<unité> Commande l’espace entre le titre et le cadre. DRAW=(x,y…,x-n,y-n)<unité> Trace des lignes entre des points définis par leurs coordonnées mesurées en unités CM, PCT, IN, CELLS. UNDERLIN=0…3 : Souligne le texte et commande l’épaisseur du trait. Pour annuler une définition de TITLE/FOOTNOTE/NOTE dans SAS, vous passerez par des commandes : TITLE3; ATTENTION : comme pour les titres et les pieds de pages de la fenêtre SORTIE, la commande TITLE3 annule le titre 3 et TOUS les titres supérieurs (TITLE4, TITLE5…). Les TITLE1 et TITLE2 ne sont pas modifiés. Pour annuler l’ensemble des pieds de pages (par exemple) : GOPTIONS RESET=FOOTNOTE; Si vous entrez GOPTIONS RESET=ALL; ou GOPTIONS RESET=GLOBAL ; SAS Livre Page 266 Jeudi, 18. septembre 2008 6:03 18 266 ◆ SAS vos commandes FOOTNOTE seront annulées (mais les autres instructions de type STATEMENTS seront aussi annulées et, par conséquent, vos TITLEs et NOTEs seront effacés). 7.1.4 Les commandes AXIS<1…99> Il s’agit par cette commande de définir un ensemble d’options qui s’appliqueront systématiquement à un axe. Vous pouvez déterminer jusqu’à 99 définitions d’axe. Vous travaillez ici en deux temps : dans un premier temps, en dehors de toutes procédures, vous définissez les caractéristiques qui seront appliquées à un axe ; dans un second temps, à l’intérieur de votre PROC Gxxx, vous indiquerez, par une commande, que pour cet axe, SAS devra utiliser la définition d’axe AXISn. Pour une présentation complète, consultez l’aide SAS en ligne : (SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/graphref.hlp/axischap.htm (SAS 9.2) : support.sas.com/documentation/cdl/en/graphref/59607/HTML/default/ axischap.htm La figure 7.2 vous présente les différents éléments qui composent un axe ainsi que les principales commandes à utiliser pour les modifier. Revenu Étiquette d'axe vertical (LABEL) 300 Axe vertical (STYLE, WIDTH) 200 Valeurs d'axe majeures (VALUE, ORDER) Marques mineures d'axe (MINOR) 100 Axe horizontal (STYLE, WIDTH) Marques majeures d'axe (MAJOR) 0 0 100 Consommation 200 300 Étiquette d'axe horizontal (LABEL) Figure 7.2 • Les éléments constitutifs des axes. Si les deux axes de votre graphique ont des caractéristiques identiques, vous pourrez passer par une définition d’axe AXIS unique. Si les caractéristiques diffèrent, vous aurez deux définitions d’axe AXIS. Lors d’une commande AXIS<1…99>, vous pouvez ainsi définir : Des options sur le type d’échelle désiré LOGBASE=base | E | PI Échelle logarithmique – e, Pi ou base (à définir – exemple : 10). SAS Livre Page 267 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 267 LOGSTYLE=EXPAND | POWER Présentation des log en EXPAND, soit 100 pour 102 ou power, 10^2 pour 102. ORDER= Spécifie les valeurs qui apparaîtront sur l’axe (seules ces valeurs vont apparaître). ORDER=(0 20 60 80 120) ORDER=(0 TO 100 BY 10) Le pas par défaut est 1. Options d’apparence COLOR= Couleur de toutes les composantes de l’axe (trait, repère et texte) à moins que vous ne spécifiiez une couleur particulière pour un des éléments au moyen d’un LABEL=(COLOR=couleur), REFLABEL=(COLOR= couleur), VALUE=(COLOR= couleur), CTEXT= ou encore CAXIS=. LENGTH= Longueur de l’axe : si vous n’ajoutez pas d’unité (CELLS/CM/IN/PCT/PT), l’unité par défaut est la cellule (sauf si vous avez redéfini l’unité de mesure par défaut via GOPTIONS GUNIT=CELLS/CM/IN/PCT/PT). OFFSET=(<n1 ><,n2 >)<unité > | (<n1<unité>><,n2<unité >>) OFFSET=(2cm,5cm) Nous demandons 2 cm entre le début de l’axe et la première marque majeure d’axe, puis 5 cm entre la dernière marque majeure d’axe et la fin de l’axe. ORIGIN=<(x><,y >)<unité> | (<x<unité>><,y<unité>>) ORIGIN=(8,5)cm; Nous demandons que l’origine de l’axe soit à 8 cm de la gauche du cadre et à 5 cm du bas du cadre. STYLE= Précise le type de ligne à utiliser pour l’axe. Reportez-vous au résultat 7.16 pour visualiser les différentes lignes dont vous pouvez disposer si vous ne souhaitez pas utiliser une ligne pleine. WIDTH=1/2/3/4 Par défaut égal à 1. Plus c’est élevé, plus le trait est épais. Options affectant les repères sur l’axe MAJOR=(option(s) ) | NONE Repères majeurs ou principaux. MINOR=(option(s) ) | NONE Repères mineurs ou secondaires. SAS Livre Page 268 Jeudi, 18. septembre 2008 6:03 18 268 ◆ SAS Les différentes options possibles pour ces marques d’axe sont : COLOR= Couleur de la marque d’axe. HEIGHT= hauteur de la marque <unité> Longueur de la marque d’axe. Par défaut, la longueur de la marque est de 0,5 cellule pour MAJOR et 0,25 cellule pour MINOR. Si les nombres sont négatifs, les marques d’axe seront dessinées à l’intérieur du graphique. NUMBER= Nombre de marques sur l’axe si l’option s’applique à MAJOR et nombre de marques entre deux MAJOR si l’option s’applique à MINOR. WIDTH= 1 par défaut, plus c’est élevé, plus la marque d’axe sera épaisse. Options sur le texte LABEL=(options(s) ) | NONE Options à imposer à l’intitulé de l’axe : ANGLE=degrés COLOR=couleur du texte FONT=police HEIGHT=hauteur du texte <unité > JUSTIFY=LEFT | CENTER | RIGHT ROTATE=degrés Exemple : AXIS1 LABEL=(ANGLE=90 COLOR=red FONT='times/bold' HEIGHT=10pt JUSTIFY=left ROTATE=45 "Label de l’axe"); Dans cet exemple, toutes les options vont s’appliquer au texte « label de l’axe ». Il est également possible d’appliquer des options différentes à des éléments spécifiques du texte de votre LABEL : AXIS1 LABEL=(ANGLE=90 JUSTIFY=center COLOR=red "Label" FONT='times/bold' HEIGHT=10pt JUSTIFY=left ROTATE=45 "de l’axe"); REFLABEL=(options) | NONE Dans le cas où vous créez une ligne particulière pour marquer une valeur, vous pouvez introduire, associée à cette ligne, un texte. Les options de présentation de ce texte sont identiques à celles possibles pour LABEL. SPLIT="split-char" En cas de texte long, SAS passe à la ligne suivante dès qu’il voit le caractère choisi comme split.char. VALUE=(options(s) ) | NONE Options à imposer au texte saisissant les valeurs des marques principales sur les axes. Les options de présentation de ce texte sont identiques à celles possible pour LABEL. Si vous souhaitez ne modifier que la nème marque sur l’axe, vous disposez de plus de l’option TICK=n : SAS Livre Page 269 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 269 Exemple : AXIS1 VALUE=(ANGLE=45 ROTATE=-45 COLOR=blue TICK=3 COLOR=red ROTATE=45 ); Ici, ANGLE=45 ROTATE=-45 COLOR=blue devraient s’appliquer à toutes les valeurs d’axe mais pour la troisième valeur d’axe, nous voulons COLOR=red ROTATE=45 ; la caractéristique ANGLE=45 s’applique aussi à cette troisième valeur d’axe. Pour annuler l’ensemble des commandes AXIS que vous avez pu définir au cours d’une session : GOPTIONS RESET=AXIS; Si vous entrez : GOPTIONS RESET=ALL; Ou : GOPTIONS RESET=GLOBAL ; Vos commandes AXIS seront annulées (ainsi que les autres instructions de type STATEMENTS). Pour annuler uniquement une commande AXIS donnée (ici, la définition d’AXIS1 n’est pas modifiée) : AXIS2; Cette instruction n’annule pas les définitions d’axe supérieures (AXIS3, AXIS4…). Si vous souhaitez éditer (dans la fenêtre JOURNAL) les définitions AXIS que vous avez pu définir au cours d’une session : PROC GOPTIONS AXIS NOLIST; RUN; 7.1.5 Les commandes PATTERN<1…99> La commande PATTERN définit un ensemble d’options relatives à des surfaces (barres d’un histogramme, surface sous une courbe…). Vous pouvez disposer au maximum de 99 définitions de type PATTERN. Au sein d’une instruction PATTERN, vous disposez des commandes suivantes : COLOR= Pour définir la couleur que vous souhaitez employer pour votre surface. REPEAT=nombre de fois Sur votre graphique, vous avez plusieurs surfaces distinctes à remplir. Par exemple, sur un histogramme, vous souhaitez représenter la distribution des poids et des QI dans une population donnée : vous avez deux surfaces à remplir, mesurant deux choses différentes. SAS change de couleur dès qu’il a une nouvelle surface à remplir. En spécifiant un nombre supérieur à 1, vous pouvez utiliser la même couleur sur vos différentes surfaces. VALUE=EMPTY/SOLID/style Si vous spécifiez EMPTY, votre surface sera vide (et aura la couleur du fond de votre graphique). Si vous spécifiez SOLID (valeur pas défaut), votre surface sera pleinement remplie par la couleur spécifiée ou par la couleur par défaut. SAS Livre Page 270 Jeudi, 18. septembre 2008 6:03 18 270 ◆ SAS Vous avez aussi la possibilité de définir un style. Vous avez alors besoin de deux éléments : Une lettre : L pour avoir des lignes nord-ouest/sud-est R pour avoir des lignes nord-est/sud-ouest X pour avoir du quadrillage Un chiffre allant de 1 à 5 définissant l’épaisseur des lignes. Plus le chiffre est élevé, plus les lignes sont épaisses. Le graphique de la figure 7.3, issu de la documentation SAS, illustre ce que vous pouvez ainsi obtenir : R X L E 1 2 3 4 5 S Figure 7.3 • Les différents styles possibles. Si l’instruction VALUE est particulièrement utile pour les procédures GMAP et GCONTOUR non abordées dans cet ouvrage, elle a aussi son utilité dans la procédure GPLOT, combinée avec l’instruction AREA, en permettant de spécifier la couleur à donner à la surface présente sous une courbe – dans ce cas, vous devez indiquer VALUE=SOLID. IMAGE=‘chemin dos’ Si vous souhaitez que votre surface soit remplie par une image enregistrée sur votre disque dur. IMAGESTYLE=FIT/TILE Commande associée avec IMAGE : vous emploierez FIT si vous voulez que votre image soit étirée de façon qu’elle corresponde à la surface et TILE si vous souhaitez que votre image ne soit pas étirée (et donc qu’elle soit reproduite autant de fois que nécessaire pour remplir la surface). Pour annuler l’ensemble des instructions PATTERN et revenir aux spécifications par défaut de SAS : GOPTIONS RESET=PATTERN; Si vous entrez GOPTIONS RESET=ALL; SAS Livre Page 271 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 271 ou GOPTIONS RESET=GLOBAL ; vos commandes PATTERN seront annulées (ainsi que les autres instructions de type STATEMENTS). Si vous souhaitez annuler une certaine instruction PATTERN (une seule et pas les autres) : PATTERN2; Attention : imaginons que vous ayez entré l’instruction PATTERN suivante : PATTERN4 VALUE=x3 COLOR=red REPEAT=2; Et qu’ensuite, vous entrez l’instruction : PATTERN4 COLOR=green ; Cette nouvelle définition de PATTERN4 n’annule pas la précédente définition : les instructions PATTERN sont additives contrairement à TITLE ou AXIS. Les options VALUE=x3 REPEAT=2 ne sont pas annulées et continuent à être valables : seule la définition de la couleur a été modifiée par la seconde instruction PATTERN4. Pour éditer les caractéristiques de l’ensemble des PATTERN actives dans la fenêtre JOURNAL : PROC GOPTIONS PATTERN NOLIST; RUN; 7.2 PROC GCHART La procédure PROC GCHART permet de réaliser des histogrammes. PROC GCHART DATA= Nom de la table SAS. Si rien n’est indiqué, SAS utilise la dernière table créée. GOUT= Bibliothèque (pour la sauvegarde des graphiques au fur et à mesure de leur création). Les différents types de graphiques possibles sont : • BLOCK • HBAR | HBAR3D | VBAR | VBAR3D • PIE | PIE3D | DONUT • STAR Nous explorerons essentiellement les possibilités offertes par VBAR. Construisons un premier histogramme au moyen du fichier d’exemple GRAPH.TXT. Programme 7.2 DATA graph; INFILE 'C:\intro_SAS\fichiers\graph.txt'; INPUT x1 x2; RUN; PROC GCHART DATA=graph; VBAR x1; RUN; SAS Livre Page 272 Jeudi, 18. septembre 2008 6:03 18 272 ◆ SAS Vous demandez ici de créer un histogramme sur la base de la variable X1 et vous obtenez : Résultat 7.1 Ici, tout est « automatique » : SAS effectue lui-même les regroupements en cas de variables numériques continues. Sur le graphique, les centres de classes sont indiquées, le pas est égal à la différence entre deux centres de classes (ici, 10). Si une observation présente une valeur de X1 égale à une borne, l’observation est mise dans la classe supérieure. L’axe horizontal est l’axe des classes. L’axe vertical est l’axe des réponses (ici, des effectifs) ; il peut également présenter des pourcentages, des pourcentages cumulés, des fréquences cumulées, des moyennes ou des sommes. Si votre variable est alphanumérique, il y aura autant de barres que la variable présente de modalités Il est également possible de demander à SAS de traiter une variable numérique comme une variable discrète (et obtenir ainsi autant de barres que votre variable présente de modalités). Vous pouvez remplacer la commande VBAR utilisée ici par les autres commandes possibles : BLOCK, HBAR, HBAR3D, VBAR3D, PIE, PIE3D, DONUT, STAR. Gardez à l’esprit que c’est la nature de vos données qui commande le graphique à effectuer. Les commandes HBAR et HBAR3D offrent en plus un tableau statistique reprenant les fréquences, fréquences cumulées, pourcentages et pourcentages cumulés. SAS Livre Page 273 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 273 7.2.1 Les options possibles de HBAR et VBAR Dans cet ouvrage, nous nous intéressons uniquement aux options de ces types de graphiques. Pour plus d’informations sur les options sur BLOCK, mais aussi sur PIE, PIE3D, DONUT (options communes à ces trois types de graphiques) ou STAR, consultez l’aide de SAS, soit sur votre ordinateur, soit sur Internet : Pour BLOCK : (SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/graphref.hlp/gchartblock.htm (SAS 9.2) : support.sas.com/documentation/cdl/en/graphref/59607/HTML/default/ gchart-block.htm Pour PIE, 3D et DONUT : (SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/graphref.hlp/gchart-pie.htm (SAS 9.2) : support.sas.com/documentation/cdl/en/graphref/59607/HTML/default/gchartpie.htm Pour STAR : (SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/graphref.hlp/gchartstar.htm (SAS 9.2) : support.sas.com/documentation/cdl/en/graphref/59607/HTML/default/ gchart-star.htm HBAR, HBAR3D, VBAR, VBAR3D partagent les mêmes options – elles sont cependant très nombreuses et ne peuvent faire l’objet d’une présentation complète dans le cadre de cet ouvrage. Nous n’étudierons pas les options spécifiques à HBAR3D et VBAR3D. Pour plus de renseignements, vous pouvez consulter l’aide SAS ou les liens suivants : (SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/graphref.hlp/gchart-bar.htm (SAS 9.2) : support.sas.com/documentation/cdl/en/graphref/59607/HTML/default/ gchart-bar.htm a. Options de présentation CAXIS= Couleur des axes. CFRAME= Couleur du fond en cas d’encadrement. COUTLINE= Couleur du contour des barres – si vous indiquez SAME, les contours des barres auront la même couleur que l’intérieur des barres. CTEXT= Couleur du texte. SAS Livre Page 274 Jeudi, 18. septembre 2008 6:03 18 274 ◆ SAS FRAME | NOFRAME Demande ou retire l’encadrement. GSPACE= En cas d’option GROUP=, indique l’espace entre chaque groupe de barres. LEGEND=LEGEND<1…99> Indique quelle définition de légende LEGENDn utiliser – voir section 7.3.2. NOLEGEND Pas de légende (dans le cas où celle-ci est produite automatiquement). PATTERNID=BY | GROUP | MIDPOINT | SUBGROUP Commande les changements de couleur (ou de type de remplissage) pour les barres : BY : changement de couleur à chaque modalité de la variable BY. GROUP : changement de couleur à chaque modalité de la variable GROUP. MIDPOINT : changement de couleur pour chaque barre – en cas d’option GROUP la séquence de couleurs est répétée pour chaque modalité de la variable GROUP. SUBGROUP : modification de la couleur pour chaque modalité de la variable SUBGROUP (il faut bien sûr que la variable SUBGROUP soit indiquée). SPACE= Pour définir l’espacement des barres. WIDTH= Pour définir la largeur de la barre. WOUTLINE= Pour définir l’épaisseur de la ligne autour de la barre. Les couleurs des barres dans ce type de graphique ne peuvent être modifiées que par une commande PATTERN préalable : Programme 7.3 PATTERN1 COLOR=y; PROC GCHART DATA=graph; VBAR x1 /CAXIS=orange CFRAME=blue COUTLINE=green CTEXT=red SPACE=0 CFREQ; RUN; Ce premier exemple nous permet d’insister sur vos choix de couleurs. Vous pouvez voir le graphique produit sur le site de cet ouvrage. Nous avons utilisé ici les codes couleurs prédéfinis dans SAS (voir section 7.1.1.). Or, ces couleurs, choisies au hasard, ne forment pas un ensemble assorti. SAS Livre Page 275 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 275 Résultat 7.2 Si vous avez deux séries à faire apparaître dans votre graphique, dans SAS 9.1 la couleur de la première série sera par défaut le rouge (RED), celle de la seconde le vert (GREEN). Comme nous l’avons indiqué dans la section 7.1.1., les couleurs par défaut dans SAS 9.2 ont été remplacées par des couleurs moins vives, plus dans des teintes pastel : la première couleur par défaut est un bleu ardoise, la seconde, un orange brique. Pour modifier ces couleurs, vous devrez passer par des instructions PATTERN1 et PATTERN2. b. Options statistiques De très nombreuses options ne s’appliquent qu’aux graphiques de type HBAR3D/VBAR3D. Ces options ne sont pas présentées ici mais vous pouvez consulter l’aide SAS (entrée GCHART procedure, HBAR and VBAR statements) ou l’aide SAS en ligne : (SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/graphref.hlp/gchart-bar.htm (SAS 9.2) : support.sas.com/documentation/cdl/en/graphref/59607/HTML/default/gchartbar.htm CFREQ Ajoute les fréquences cumulées au-dessus de chaque barre. CLM= Seuil de confiance si vous commandez une moyenne. CPERCENT Ajoute les pourcentages cumulés au-dessus de chaque barre. SAS Livre Page 276 Jeudi, 18. septembre 2008 6:03 18 276 ◆ SAS FREQ Ajoute les fréquences au-dessus de chaque barre. FREQ= Si vous réalisez un histogramme sur, par exemple, les mois d’une année, vous spécifiez ici la variable qui reprend les fréquences à saisir au moyen du graphique – vous êtes ici dans les cas de tables pré-analysées, SAS n’a pas à effectuer de regroupements. La variable à indiquer est forcément numérique. MEAN Ajoute la moyenne au-dessus de chaque barre. PERCENT Ajoute les pourcentages au-dessus de chaque barre. SUM Ajoute la somme au-dessus de chaque barre. SUMVAR= À associer avec l’option TYPE= et indique la variable analysée. TYPE= Par défaut, vous réalisez un histogramme reprenant des fréquences (TYPE=FREQ). Vous pouvez aussi représenter des pourcentages, des pourcentages cumulés et des fréquences cumulées TYPE= PCT | CPCT | CFREQ. Si vous indiquez une option SUMVAR=, vos barres peuvent représenter une moyenne (TYPE=MEAN) ou une somme (TYPE=SUM) sur cette variable. Les options CFREQ, CPERCENT, FREQ, MEAN, PERCENT et SUM ne peuvent être actives que si votre graphique l’autorise. Ainsi, pour un histogramme représentatif de fréquences, vous ne pourrez afficher que les fréquences. c. Options sur les points centraux DISCRETE Traite votre variable numérique comme une variable discrète et créera autant de barres qu’il y a de valeurs. GROUP= Au sein d’un même graphique, cette option produit autant de groupes de barres que la variable GROUP a de modalités. LEVELS= Impose le nombre de barres. MIDPOINTS= Si, au lieu de laisser SAS déterminer les plages, vous souhaitez par exemple que chaque barre représente un intervalle de 10, c’est ici qu’il faut agir en demandant par exemple : SAS Livre Page 277 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 277 MIDPOINTS=40 TO 150 BY 10 (si BY non spécifié, BY 1 est considéré) MIDPOINTS=40 60 100 120 130 MIDPOINTS=OLD SAS calcule ses plages en utilisant un algorithme de Nelder. MISSING Les valeurs manquantes sont intégrées au graphique. SUBGROUP= Variable qui permet de distinguer différentes sous-populations à l’intérieur d’une barre. d. Options sur les axes Les options présentées dans cette section ne remplacent pas complètement les caractéristiques d’axe que vous pouvez définir au moyen d’AXIS mais, dans certains cas, elles peuvent suffire. ASCENDING Option qui trie les barres dans un ordre ascendant (de la plus courte à la plus longue). AUTOREF Trace automatiquement des lignes horizontales (si VBAR) ou verticales (si HBAR). AXIS=<liste de valeurs> Permet d’afficher sur l’axe des réponses (fréquence, pourcentage…) certaines valeurs choisies. Attention, votre axe n’est plus orthonormé si, par exemple, votre liste de valeurs est du type 0 10 50 150. CLIPREF Si AUTOREF est activé, CLIPREF place vos lignes derrière les barres (devant sinon) – option possible uniquement avec les graphiques en deux dimensions (VBAR et HBAR). DESCENDING Option qui présente les barres dans un ordre descendant (de la plus longue à la plus courte). GAXIS=AXIS<1…99> MAXIS=AXIS<1…99> RAXIS=AXIS<1…99> Si vous avez une option GROUP=, un axe pour les groupes est créé. Pour imposer certaines options sur cet axe, définissez ces options au moyen d’une commande AXISn. Vous devrez ensuite indiquer en option GAXIS=AXISn. SAS Livre Page 278 Jeudi, 18. septembre 2008 6:03 18 278 ◆ SAS MAXIS est l’axe des classes (axe horizontal en cas de graphiques de type VBAR). RAXIS est l’axe des réponses (effectifs, pourcentages…) [axe vertical en cas de graphique de type VBAR]. MINOR= Nombre de marques d’axe mineures entre deux marques majeures. NOAXIS Retire les axes. NOBASEREF Retire la ligne de référence zéro qui apparaît lorsque SUM ou MEAN sont négatifs. NOZERO Supprime les plages sur lesquelles il y a un effectif nul. REF= Trace des lignes horizontales (VBAR) ou verticales (HBAR) aux valeurs que vous indiquez – option incompatible avec AUTOREF. Exemple : REF=10 20 30 7.2.2 Exemples Cette section va vous permettre de mieux appréhender les possibilités de GCHART grâce à des exemples riches en options de programmation. Nous travaillerons sur le fichier GCHART.CSV. Ce fichier répertorie l’ensemble des commerciaux d’une entreprise présents au cours des années 2005, 2006 et 2007. Pour chaque commercial, on dispose des informations suivantes : son sexe, son diplôme le plus élevé, le département de l’entreprise dans lequel il a été affecté, ses ventes au cours de l’année et l’année de l’observation de ses ventes. Le programme 7.4 permet de créer la table SAS. Programme 7.4 DATA gcharts; INFILE 'C:\intro_SAS\fichiers\gchart.csv' DLM=';'; INPUT sexe $ diplome :$12. departement :$10. ventes annee; RUN; Programme 7.5 TITLE "Nombre d’employés hommes et femmes"; PROC GCHART DATA=gcharts; VBAR sexe; RUN; SAS Livre Page 279 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 279 Résultat 7.3 Les graphiques ont par défaut un encadrement. Pour le retirer, il suffit d’ajouter l’option NOFRAME à VBAR. Si vous exécutez ce même programme avec SAS 9.1, les lettres avec accents ne seront pas affichées correctement. Afin que les caractères accentués soient affichés avec SAS 9.1, vous devez utiliser un jeu d’options de GOPTIONS parmi les deux suivants : GOPTIONS DEVMAP=iso8859 KEYMAP=iso8859; GOPTIONS DEVMAP=winansi KEYMAP=winansi; Le premier jeu fonctionne avec certaines polices (TIMES et SASFONT, par exemple) mais pas avec d’autres (SWISS, par exemple1). Le second jeu d’options devrait alors fonctionner. Si maintenant vous souhaitez utiliser les polices SWISS et SASFONT dans un même graphique et que vos textes contiennent des accents, cela sera difficile. Pour le premier jeu d’options, il est possible qu’un message d’erreur s’affiche dans la fenêtre JOURNAL. Cela fonctionne quand même. Ces options peuvent aussi être utiles avec SAS 9.2 pour certaines polices. Programme 7.6 TITLE "Nombre d’employés hommes et femmes"; PROC GCHART DATA=gcharts; HBAR sexe / NOFRAME; RUN; 1. Dans certaines documentations SAS, vous trouverez de très nombreux exemples de programmes qui construisent des graphiques en utilisant la police SWISS. Nous n’utiliserons pas cette police d’une part parce que son rendu est très mauvais et d’autre part parce que les problèmes d’accentuation continuent à se poser pour cette police, même avec SAS 9.2. SAS Livre Page 280 Jeudi, 18. septembre 2008 6:03 18 280 ◆ SAS Résultat 7.4 La commande HBAR permet la production d’un graphique offrant plus d’informations puisque vous disposez en plus de votre graphique d’un tri à plat de la variable représentée par l’histogramme. Programme 7.7 TITLE F='Times' "Proportions d’hommes et de femmes"; PATTERN VALUE=s COLOR=gold; PROC GCHART DATA=gcharts; VBAR sexe / TYPE = PERCENT; RUN; Résultat 7.5 Vous remarquerez que nous spécifions une police particulière pour le titre. La police par défaut (ARIAL) s’applique à l’ensemble des autres éléments de texte du graphique. L’instruction PATTERN modifie la couleur de remplissage. L’option VALUE n’a pas d’intérêt ici puisque VALUE=S(OLID) est le paramètre par défaut dans PATTERN. SAS Livre Page 281 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 281 Nous demandons de plus que le graphique représente la répartition hommes/femmes exprimée en pourcentages plutôt qu’en effectifs. Programme 7.8 TITLE1 F='times' "Nombre de commerciaux"; TITLE2 F='times' H=2 'en fonction des niveaux croissants de diplôme'; PATTERN COLOR=gold; PROC GCHART DATA=gcharts; VBAR diplome / TYPE = CFREQ NOFRAME MIDPOINTS = 'sans diplôme' 'BEPC' 'BAC' 'BAC+2' 'BAC+4'; RUN; Résultat 7.6 Nous demandons à utiliser la police TIMES pour les titres du graphique. Par défaut, la taille du second titre est deux fois plus petite que celle du premier titre. Pour que ce titre soit de la même taille que le premier, nous spécifions H(EIGHT)=2. Vous remarquerez cependant que le second titre n’est pas tout à fait de la même taille que le premier. Pour que le second titre soit identique au premier, vous devrez spécifier la taille des caractères à utiliser en points. Les autres éléments texte du graphique continuent à utiliser la police par défaut (ARIAL dans SAS 9.2). Nous demandons un graphique présentant les fréquences cumulées des différents diplômes (TYPE=CFREQ). Par défaut, les modalités sont présentées dans l’ordre alphabétique. Pour ce graphique, il est plus logique de les présenter dans l’ordre de leurs niveaux. Pour cela, il faut spécifier l’ordre dans lequel ces modalités doivent être présentées via l’option MIDPOINT=. Attention ! Ici, il est impératif que les modalités listées soient parfaitement identiques aux modalités de la variable dans votre table. Les espaces, majuscules, minuscules, etc., doivent être respectés. SAS Livre Page 282 Jeudi, 18. septembre 2008 6:03 18 282 ◆ SAS Programme 7.9 GOPTIONS FTEXT='times'; TITLE1 H=24pt "Répartition des CDD"; TITLE2 H=24pt 'en fonction des niveaux croissants de diplôme'; PATTERN COLOR=gold; PROC GCHART DATA=gcharts; VBAR diplome / TYPE = CPERCENT NOFRAME MIDPOINTS = 'sans diplôme' 'BEPC' 'BAC' 'BAC+2' 'BAC+4'; RUN; Résultat 7.7 Nous indiquons, via GOPTIONS, que la police à utiliser pour tous les textes est TIMES. Il devient alors inutile de préciser dans les instructions TITLE la police à utiliser. Le graphique est très proche de celui créé par le programme 7.8 – au lieu d’effectifs cumulés, il représente des fréquences cumulées (option CFREQ). Programme 7.10 TITLE1 H=20pt "Ventes totales dans chaque département"; TITLE2 H=20pt 'pour les années 2005-2007 '; PATTERN COLOR=gold; PROC GCHART DATA=gcharts; VBAR departement / SUMVAR=ventes NOFRAME; LABEL departement='Département' ventes='Nos ventes'; RUN; SAS Livre Page 283 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 283 Résultat 7.8 Nous souhaitons faire une analyse par départements et observer les ventes réalisées par les commerciaux des différents départements au cours de la période d’étude. La somme des ventes par département est calculée au moyen de l’instruction : VBAR departement / SUMVAR=ventes… Si maintenant, vous ne souhaitez voir représentées que les ventes de l’année 2005, vous pouvez ajouter, dans PROC GCHART, une instruction : WHERE annee=2005; Nous avons ajouté des instructions LABEL dans PROC GCHART de façon à modifier les intitulés d’axes. Par défaut, les intitulés d’axes sont égaux aux noms des variables ou à la statistique que vous représentez. Si vous ne souhaitez ne modifier que le nom à donner à l’intitulé de l’axe, une simple instruction LABEL suffit. Si vous souhaitez modifier plus que l’intitulé (sa police, sa taille, sa couleur…), vous devrez passer par des commandes STATEMENTS AXIS. Les GOPTIONS (et donc la police à utiliser) exécutées dans le programme 7.10 sont toujours actives pour le programme 7.11. Programme 7.11 TITLE1 H=20pt "Ventes moyennes dans chaque département"; TITLE2 H=20pt 'pour les années 2005-2007 '; PROC GCHART DATA=gcharts; VBAR departement / TYPE=mean SUMVAR=ventes NOFRAME; LABEL departement='Département' ventes='Nos ventes'; FORMAT ventes eurox10.; RUN; SAS Livre Page 284 Jeudi, 18. septembre 2008 6:03 18 284 ◆ SAS Résultat 7.9 Nous cherchons toujours à représenter les ventes de chaque département. Les effectifs de commerciaux par département étant différents, il est plus judicieux de représenter des ventes moyennes. Pour cela, nous utilisons l’instruction : VBAR departement / TYPE=mean SUMVAR=ventes… Nous imposons un FORMAT à la variable VENTES via l’instruction : FORMAT ventes eurox10.; Programme 7.12 GOPTIONS RESET=ALL; GOPTIONS IBACK='C:\intro_SAS\images\pommes.jpg' IMAGESTYLE=FIT FTEXT='thorndale AMT/bold' HTEXT=10pt; TITLE1 F='thorndale AMT' H=20pt "Nombre d’hommes et de femmes"; TITLE2 F='thorndale AMT' H=15pt 'dans chaque département'; PATTERN1 COLOR=gold; PATTERN2 COLOR=cream; AXIS1 LABEL=NONE; PROC FORMAT; VALUE $sexe 'M'='Hommes' 'F'='Femmes'; RUN; PROC GCHART DATA=gcharts; VBAR departement /SUBGROUP=sexe NOFRAME WIDTH=15 RAXIS=axis1; FORMAT sexe $sexe.; LABEL departement='Département'; RUN; SAS Livre Page 285 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 285 Résultat 7.10 La première commande annule l’ensemble des options graphiques qui ont pu être imposées jusqu’à maintenant. Nous devons en redéfinir de nouvelles. Nous demandons qu’une image de fond soit utilisée ; celle-ci1 doit être adaptée à la taille du graphique (elle est donc étirée). La police utilisée par défaut est THORNDALE AMT, livrée avec SAS 9.2, en gras. Par défaut, la hauteur du texte est égale à 10pt. Sur les titres, la police par défaut définie par GOPTIONS est conservée mais nous retirons l’option « gras ». La hauteur des textes est modifiée. Les instructions PATTERN redéfinissent les couleurs à utiliser pour les barres. L’instruction AXIS1 indique que nous ne voulons pas de LABEL sur l’axe. Nous créons ensuite un FORMAT spécifique pour la variable SEXE. La définition même du graphique : • Nous souhaitons que le graphique donne la répartition hommes/femmes par département : VBAR departement /SUBGROUP=sexe… • Nous ne voulons pas d’encadrement : …NOFRAME … • La largeur des barres doit être égale à 15 : …WIDTH=15… • Sur l’axe des réponses (axe vertical), la définition d’axe AXIS1 est appliquée : 1. L’image utilisée est une image libre de droits. SAS Livre Page 286 Jeudi, 18. septembre 2008 6:03 18 286 ◆ SAS …RAXIS=axis1 ; Nous demandons l’application du FORMAT spécifique défini plus haut à la variable SEXE et nous imposons ensuite un LABEL à la variable DEPARTEMENT. L’instruction SUBGROUP génère automatiquement la création de la légende. Si le nom de la variable n’avait pas été immédiatement lisible, on aurait pu le modifier en imposant à l’intérieur de PROC GCHART un LABEL à la variable SEXE. Programme 7.13 GOPTIONS RESET=ALL; GOPTIONS FTEXT='thorndale AMT/bold' CBACK=CXF7DCA0; TITLE1; TITLE2 H=20pt "Ventes réalisées 2005-2007"; PATTERN1 COLOR=CXAB986F; PATTERN2 COLOR=CXABA590; PATTERN3 COLOR=styg; AXIS1 LABEL=NONE; AXIS2 LABEL=(H=12pt COLOR=styg 'Somme des ventes') VALUE=(H=10pt TICK=1 H=12pt JUSTIFY=center TICK=6 H=12pt COLOR=red TICK=11 H=12pt JUSTIFY=center COLOR=red TICK=16 H=12pt COLOR=red TICK=21 H=12pt JUSTIFY=center COLOR=red); PROC GCHART DATA=gcharts; VBAR annee / SUMVAR=ventes SUBGROUP=departement DISCRETE NOFRAME MAXIS=axis1 RAXIS=axis2 WIDTH=15 COUTLINE=same; LABEL departement='Département'; RUN; Résultat 7.11 Ici, nous commençons par annuler l’ensemble des options graphiques soumises jusqu’à maintenant. Nous demandons à utiliser une couleur de fond autre que blanche (CBACK=CXF7DCA0). SAS Livre Page 287 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 287 Le TITLE1 est vide. Son utilité existe cependant : sans cette instruction TITLE1, le titre serait collé en haut du graphique. Cette instruction nous permet simplement de « décoller » le titre du haut du graphique. L’instruction AXIS2 permet de définir un ensemble d’options qui s’appliqueront à l’axe vertical (option RAXIS= à l’intérieur de PROC GCHART). AXIS2 LABEL=(H=12pt COLOR=styg 'Somme des ventes') VALUE=(H=10pt TICK=1 H=12pt JUSTIFY=center TICK=6 H=12pt COLOR=red TICK=11 H=12pt JUSTIFY=center COLOR=red TICK=16 H=12pt COLOR=red TICK=21 H=12pt JUSTIFY=center COLOR=red); Nous avons vu que l’attribution d’un texte quelconque comme intitulé d’axe pouvait se faire via une commande LABEL. Maintenant, si vous souhaitez plus d’options sur ce texte, vous devez passer par une instruction LABEL au sein de la commande AXIS. Vous pourrez ainsi attribuer une hauteur de texte particulière (ici, 12 points), une couleur à ce texte différente de la couleur des étiquettes de graduation de l’axe. L’intitulé d’axe en lui-même est à indiquer en dernier. Pour modifier la présentation des étiquettes de graduations de l’axe, passez par une instruction VALUE. L’instruction VALUE, dans un premier temps, donne un ensemble d’options à appliquer à toutes les valeurs d’axe (H=10pt). Ensuite, nous demandons l’application de certaines options à des valeurs d’axe particulières : TICK=1 H=12pt JUSTIFY=center Pour la première valeur d’axe (le zéro), nous souhaitons que la hauteur du texte passe à 12pt et que le texte soit centré. Dans le cas présent, c’est le LABEL donné à l’axe qui sert de référence pour ce centrage. En ce qui concerne le graphique : PROC GCHART DATA=gcharts; VBAR annee / SUMVAR=ventes SUBGROUP=departement DISCRETE NOFRAME MAXIS=axis1 RAXIS=axis2 WIDTH=15 COUTLINE=same; LABEL departement='Département'; RUN; Nous souhaitons une barre par année. Comme la variable est numérique, pour éviter que SAS ne « regroupe » des années au cours de la construction de son histogramme, nous indiquons que la variable ANNEE doit être traitée comme une variable discrète : il y aura donc autant de barres que de modalités à cette variable. Les barres doivent être représentatives des ventes (SUMVAR=VENTES) et nous voulons observer une répartition des ventes par département (SUBGROUP=DEPARTEMENT). Sur l’axe horizontal (MAXIS – axe des classes), nous souhaitons que la définition d’axe AXIS1 soit appliquée – ceci explique pourquoi cet axe n’a plus de LABEL (le LABEL année n’aurait pas eu un grand intérêt). Sur l’axe vertical, (RAXIS), nous voulons que la définition d’axe AXIS2 soit appliquée. La largeur des barres doit être de 15. Enfin, via l’instruction COUTLINE=SAME, nous demandons que l’encadrement des barres soit non plus en noir mais de la même couleur que la surface pleine. La légende est générée automatiquement en cas d’option SUBGROUP. La commande LABEL qui apparaît avant le RUN SAS Livre Page 288 Jeudi, 18. septembre 2008 6:03 18 288 ◆ SAS permet de remplacer, dans la légende, le texte « departement », nom de la variable, par le texte « Département ». Programme 7.14 GOPTIONS RESET=GOPTIONS; GOPTIONS IBACK='C:\intro_SAS\images\esa_pale.jpg' FTEXT='Thorndale AMT/bold' HTEXT=11pt; TITLE1; TITLE2 H=2 F='Thorndale AMT/italic' "Ventes réalisées par département 2005-2007" H=1 ANGLE=90 ' ' ANGLE=-90 ' '; FOOTNOTE1 " "; PATTERN1 IMAGE='C:\intro_SAS\images\barreg.jpg' IMAGESTYLE=FIT; PROC GCHART DATA=gcharts; VBAR departement / SUMVAR=ventes GROUP=annee NOFRAME COUTLINE=white WIDTH=10; LABEL annee="Année" departement="Département" ventes='Ventes (somme)'; RUN; Résultat 7.12 Nous demandons en fond de graphique le fichier esa_pale (logo du master ESA). Par défaut, cette image est TYLE : sa taille n’est pas modifiée et elle est reproduite autant de fois que nécessaire. L’instruction TITLE1 permet à nouveau de décoller le titre du haut du cadre. L’instruction TITLE2 est plus complexe : TITLE2 H=2 F='Thorndale AMT/italic' "Ventes réalisées par département 2005-2007" H=1 ANGLE=90 ' ' ANGLE=-90 ' '; SAS Livre Page 289 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 289 Le titre est composé de trois éléments : le titre du graphique à proprement dit, un deuxième titre vide, situé à gauche (ANGLE=90), et un troisième titre, vide lui aussi, situé à droite (ANGLE=–90). Les deux derniers éléments du titre permettent de créer un espace vide entre les bords du cadre et les bords du graphique. L’instruction FOOTNOTE vide permet de créer un espace vide entre le bas du graphique et le bas du cadre. Il existe d’autres méthodes pour introduire des marges autour du graphique dans la fenêtre graphique. Vous pouvez aussi passer des GOPTIONS VSIZE et HSIZE. L’instruction PATTERN demande à ce que soit utilisée une image particulière au lieu d’une couleur pour emplir un espace. L’image est ici une barre créée au moyen d’un logiciel de dessin vectoriel. L’image doit être étirée pour remplir l’espace (option IMAGESTYLE=FIT). Le graphique en lui-même demande une représentation des départements. La variable représentée est la somme des ventes, et nous souhaitons pour chaque département que les différentes années soient représentées (GROUP=ANNEE). Programme 7.15 GOPTIONS RESET=GOPTIONS; GOPTIONS IBACK='C:\intro_SAS\images\esa_pale.jpg' FTEXT='Thorndale AMT' IMAGESTYLE=TILE HTEXT=1.5; TITLE ' '; TITLE2 H=2 "Ventes moyennes réalisées par département 2005-2007"; PATTERN1 VALUE=s COLOR=gold; PROC GCHART DATA=gcharts; BLOCK departement / SUMVAR=ventes TYPE=mean GROUP=annee NOHEADING; FORMAT ventes dollarx6.0; LABEL departement="Département" annee='Année'; RUN; Résultat 7.13 Ce dernier exemple tente de vous montrer que, si vous maîtrisez les diverses options de paramétrage de VBAR, vous pourrez très rapidement construire les autres types de SAS Livre Page 290 Jeudi, 18. septembre 2008 6:03 18 290 ◆ SAS graphiques proposés par PROC GCHART. Ici, le graphique proposé est typique de ce que l’on obtient avec une commande BLOCK. Seule l’option NOHEADING vous est inconnue (cette option demande à SAS de ne pas afficher le titre par défaut de ce type de graphique qui est dans ce cas « BLOCK CHART OF MEAN »). 7.3 PROC GPLOT Il s’agit ici de construire un graphique dans lequel chaque observation est représentée au moyen d’un point ayant pour coordonnées la valeur prise par une variable X et la valeur prise par une variable Y. Il s’agit donc de représenter les relations qui peuvent exister entre deux ou plusieurs variables. Cette procédure permet aussi de générer des graphiques séparés pour chaque valeur d’une troisième variable ou d’indiquer, à côté de chaque point, la valeur prise par une troisième variable. 7.3.1 Les graphiques proposés par GPLOT Quatre types de graphique sont proposés par GPLOT : BUBBLE, BUBBLE2, PLOT et PLOT2. Nous ne traiterons ici que des graphiques de types PLOT et PLOT2. Pour plus de détails sur les graphiques de type BUBBLE, vous pouvez consulter l’aide SAS (entrée BUBBLE PLOT, puis Introduction to SAS/GRAPH). La syntaxe est très proche de celle utilisée dans PROC GCHART : PROC GPLOT DATA=table utilisée – ou la dernière table créée si rien n’est indiqué GOUT=bibliothèque dans laquelle enregistrer le graphe UNIFORM, en cas de graphes multiples, impose la même échelle sur les axes a. Syntaxe de base Le programme 7.16 propose un premier graphique réalisé avec une instruction PLOT sur la base du fichier brut CAC07.TXT. Programme 7.16 DATA CAC; INFILE 'C:\intro_SAS\fichiers\cac07.txt' EXPANDTABS; INPUT date :DDMMYY. cac; RUN; PROC SORT DATA=cac; BY date; RUN; GOPTIONS RESET=ALL; PROC GPLOT DATA=cac; PLOT cac*date; FORMAT date monyy.; RUN; SAS Livre Page 291 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 291 Résultat 7.14 SAS crée un graphe sur lequel les axes sont bornés par des valeurs MAX et MIN déterminées par SAS de façon que votre graphique représente l’intégralité des observations. Chaque axe est labellé avec le nom de la variable utilisée. La commande de production du graphique est : PLOT y*x La première variable indiquée sera représentée sur l’axe des ordonnées, la seconde variable sur l’axe des abscisses. Vous pouvez aussi demander : PLOT y*x=n N indique la définition de SYMBOL à utiliser. La commande SYMBOL de type STATEMENTS permet de créer vos propres symboles et sera exposée dans la section 7.3.3. SAS dispose d’une liste préétablie. PLOT (Y1 Y2)*X est équivalent à PLOT Y1*X Y2*X. Sans option OVERLAY, deux graphiques distincts sont créés. Vous pouvez aussi avoir des instructions de la forme PLOT Y*X=Z où Z est une troisième variable de classification. Vous obtiendrez autant de courbes que de valeurs de Z sur un même graphique. Ce type de commande crée de plus et automatiquement une légende. b. Options On peut recourir à différentes options pour améliorer ce graphique : AREAS=n Remplit des zones sur votre graphique. Il faut avant tout que vos points soient joints. On joint les points au moyen d’une commande SYMBOL. SAS Livre Page 292 Jeudi, 18. septembre 2008 6:03 18 292 ◆ SAS Programme 7.17 SYMBOL1 INTERPOL=JOIN; PROC GPLOT DATA=cac; PLOT cac*date / AREA=1; FORMAT date monyy.; RUN; Si, pour l’instruction AREA, n=1, la surface entre l’axe horizontal et la courbe est remplie ; si n=2, (et une seule courbe sur votre graphique), la surface au-dessus de la courbe est également remplie. Si vous avez deux courbes sur le même graphique, AREA=2 vous commandera un remplissage sous les deux courbes. GRID Trace un quadrillage. LEGEND | LEGEND=LEGEND<1…99> Pour des raisons de clarté dans notre exposé, les légendes seront traitées dans la section 7.3.2. NOLEGEND Enlève la légende lorsqu’elle est créée automatiquement par SAS. OVERLAY Place l’ensemble des graphes commandés par PLOT sur le même graphique. REGEQN Si vous commandez une régression, l’option INTERPOL=Rseries permet d’afficher les estimateurs de cette régression. SKIPMISS En cas d’INTERPOL=JOIN ou SPLINE, cette option fait apparaître les valeurs manquantes en brisant la courbe. Options d’apparence générale CAXIS= Couleur des axes. CFRAME= Couleur du fond du graphe. CTEXT= Couleur du texte. FRAME | NOFRAME Dessine un cadre autour de votre graphe ou retire ce cadre. NOAXIS | NOAXES Retire les axes de votre graphe. SAS Livre Page 293 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 293 Options sur axe horizontal AUTOHREF Trace automatiquement des lignes horizontales. CHREF= Spécifie la couleur de ces lignes horizontales. HAXIS=liste de valeurs | AXIS<1…99> Sur les axes, SAS trace automatiquement des repères pour les variables numériques. L’incrémentation est calculée automatiquement. Grâce à cette commande, vous pouvez définir les valeurs maximale et minimale ainsi que l’incrémentation. Par exemple : HAXIS = 100 TO 200 BY 10 Si votre axe représente des dates et que vous souhaitiez ne voir apparaître qu’une souspériode sur votre graphique, vous pouvez passer par une instruction ayant la forme suivante : HAXIS='01MAR2007’d TO '01JUN2007’d BY week Sans instruction BY, vous aurez une graduation par jour sur l’axe (en cas de données journalières). L’instruction BY peut être suivie de WEEK, MONTH, QUARTER, YEAR. Si votre objectif est de proposer un graphique uniquement sur une souspériode de la période totale, vous pourrez aussi passer par une commande WHERE : PROC GPLOT DATA=test; WHERE MONTH(date)>=7 AND YEAR(date)=2007; PLOT … HMINOR= Nombre de graduations secondaires entre les graduations principales. HREF= Pour tracer des lignes verticales aux valeurs indiquées (plutôt que AUTOHREF). HZERO Demande à ce que l’axe horizontal commence à zéro (ne fonctionnera pas si vous avez des valeurs négatives ou si vous avez spécifié un HAXIS). LHREF= Définit le type de lignes que vous aurez si vous demandez un HREF ou un AUTOHREF (il existe 46 types de lignes – voir section 7.3.3. consacrée à SYMBOL). HREVERSE Inverse l’ordre sur l’axe horizontal. Options sur axe vertical (quasiment identiques à celles possibles sur l’axe horizontal) AUTOVREF CVREF= LVREF= SAS Livre Page 294 Jeudi, 18. septembre 2008 6:03 18 294 ◆ SAS VAXIS=liste de valeurs | AXIS<1…99> VMINOR= VREF= VZERO VREVERSE Exercice 7.1 : Vous utiliserez pour cet exercice le fichier TYPEGR.TXT. Dans ce fichier sont présentes trois variables : une variable alphanumérique TYPE (A, B, C et D), une variable X et une variable Y. La relation entre X et Y dépend clairement de TYPE. Vous devez donc tracer un graphique sur lequel apparaîtront quatre courbes opposant X et Y, une par valeur de type. 7.3.2 Les commandes LEGEND<1…99> La commande LEGEND est une instruction de type STATEMENTS au même titre que TITLE ou PATTERN. Nous avons choisi de ne pas exposer cette commande dans la section 7.1. de ce chapitre essentiellement parce qu’il est délicat de créer des légendes si l’on ne dispose pas d’un graphique nécessitant une légende. Il n’est pas toujours aisé de créer une légende. Créez des légendes seulement si elles sont indispensables. Votre graphique devra donc présenter au moins deux courbes. Si, malgré tout, votre graphique présente une seule courbe, si vous disposez de SAS 9.1, vous pourrez créer une légende uniquement si vous indiquez l’option OVERLAY dans votre commande de graphique. Cette option n’est plus nécessaire avec SAS 9.2. Avant de définir votre légende, vous pouvez déjà demander l’affichage de la légende par défaut en ajoutant LEGEND en option de l’instruction PLOT (donc après le /). Vous constaterez que cette légende par défaut n’est généralement pas directement présentable. Créons une table qui permette la production d’un graphique demandant une légende. Programme 7.18 DATA FTSE; INFILE "C:\intro_SAS\fichiers\ftse100_07.txt" EXPANDTABS; INPUT date DDMMYY10. ftse; RUN; DATA nikkei; INFILE "C:\intro_SAS\fichiers\nikkei225_07.txt" EXPANDTABS; INPUT date DDMMYY10. nikkei; RUN; DATA DOWJONES; INFILE "C:\intro_SAS\fichiers\dowjci_07.txt" EXPANDTABS; INPUT date DDMMYY10. dow; RUN; DATA cac; INFILE "C:\intro_SAS\fichiers\cac07.txt" EXPANDTABS; INPUT date DDMMYY10. CAC; RUN; PROC SORT DATA=cac; BY date; RUN; PROC SORT DATA=ftse; BY date; RUN; SAS Livre Page 295 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 295 PROC SORT DATA=nikkei; BY date; RUN; PROC SORT DATA=dowjones; BY date; RUN; DATA bourse; MERGE nikkei cac ftse dowjones; BY date; RUN; PROC EXPAND DATA=bourse OUT=plot; ID date; RUN; La procédure PROC EXPAND permet d’interpoler des valeurs manquantes de séries chronologiques – pour plus de détails, voir l’aide SAS. a. Créons nos premières légendes Programme 7.19 SYMBOL1 INTERPOL=JOIN; LEGEND1 VALUE=(TICK=1 'Dow Jones' TICK=2 'CAC 40' TICK=3 'FTSE 100') LABEL=('Indice boursier') FRAME; AXIS1 LABEL=NONE; PROC GPLOT DATA=PLOT; PLOT dow*date cac*date ftse*date / OVERLAY LEGEND=legend1 VAXIS=axis1; FORMAT date monyy.; RUN; Avec ce programme, vous allez obtenir le graphique reproduit dans le résultat 7.15. Résultat 7.15 SAS Livre Page 296 Jeudi, 18. septembre 2008 6:03 18 296 ◆ SAS Vous pouvez afficher la légende par défaut en indiquant LEGEND en option de PLOT, sans référence à la définition de LEGEND1. Vous obtiendrez ainsi la légende suivante : PLOT dow CAC ftse Cette légende peut être satisfaisante lors d’un travail de préparation. En revanche, si vous souhaitez diffuser votre graphique, il convient de la rendre plus lisible. OVERLAY est la commande qui permet d’afficher plusieurs courbes sur un même graphique. Nous indiquons la présence d’une légende au graphique et que SAS doit rechercher les caractéristiques de cette légende dans LEGEND1. Les options proposées sur l’axe vertical ont été définies lors de la commande AXIS1. LEGEND1 permet la définition de la légende. Parmi les éléments de la légende, au moyen de VALUE, nous spécifions les entrées de la légende : pour la courbe 1 (TICK=1), qui correspondra dans PROC GPLOT à la première courbe demandée, soit à DOW*DATE, nous souhaitons l’entrée Dow Jones ; pour la deuxième courbe, CAC*DATE, nous choisissons CAC 40 ; pour la troisième courbe, nous voulons FTSE 100. L’instruction LABEL précise le LABEL de la légende. Si vous ne précisez rien, le LABEL par défaut est PLOT. Nous demandons via la commande FRAME un encadrement de la légende. L’instruction AXIS1 indique à SAS de ne pas donner de LABEL à cet axe. Cette définition d’axe sera appliquée à l’axe vertical. Par défaut, SAS utilise comme LABEL à l’axe vertical le nom de la première variable citée et représentée par cet axe après l’instruction PLOT. La commande LEGEND permet de paramétrer un ensemble important d’éléments. Pour plus de détails, on peut consulter l’aide SAS (entrée legend statements, puis legend statements) ou encore les liens suivants dans l’aide en ligne SAS : (SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/graphref.hlp/legendchap.htm (SAS 9.2) : support.sas.com/documentation/cdl/en/graphref/59607/HTML/default/ legendchap.htm Au moyen de cette commande LEGEND, vous pouvez contrôler : • la position et l’allure de la légende ; • le texte et l’apparence du LABEL de la légende (titre de la légende) ; • le texte et l’apparence des entrées au sein de la légende ; • le texte des LABEL pour les entrées de la légende. Ainsi, la définition de légende offerte par le programme 7.20 Programme 7.20 GOPTIONS FTEXT='garamond/bold' HTEXT=1.4; LEGEND1 FRAME CFRAME=CXFFF7E6 CBORDER=CXBFA160 LABEL=( H=1.6 JUSTIFY=C 'Indice' JUSTIFY=C 'boursier') VALUE=(TICK=1 JUSTIFY=C 'Dow Jones' JUSTIFY=C H=1 'New-York' TICK=2 JUSTIFY=C 'CAC 40' JUSTIFY=C H=1 'Paris' TICK=3 JUSTIFY=C 'FTSE 100' JUSTIFY=C H=1 'Londres'); SAS Livre Page 297 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 297 donnera le résultat suivant : FRAME demande un encadrement, CFRAME détermine la couleur à l’intérieur de l’encadrement et CBORDER, la couleur de l’encadrement. Pour le LABEL de la légende, la hauteur du texte diffère de la hauteur définie par GOPTIONS. H=1.4 va s’appliquer à l’ensemble des éléments VALUE. Nous demandons que le premier élément de LABEL soit centré – l’instruction est suivie du texte de ce premier élément (« Indice »). Nous indiquons ensuite que le second élément doit lui aussi être centré avant de donner le texte du second élément (« boursier »). Cette double commande JUSTIFY permet un affichage sur deux lignes du LABEL. Une approche identique est menée quant aux entrées de la légende. Nous demandons en revanche une taille de texte plus petite systématiquement pour la ville qui suit le nom de l’indice. b. Quelques options possibles de LEGEND Il serait très long de citer l’ensemble des options possibles. Vous êtes invité à consulter l’aide de SAS pour obtenir une présentation complète. Cette section ne présente qu’un nombre limité d’options possibles. Options d’apparence ACROSS= Spécifie le nombre d’entrées de légende par ligne. CBORDER= Couleur du cadre de la légende. CFRAME= Couleur de fond de la légende. CSHADOW= Création d’une légende ombrée ; spécifie la couleur de l’ombre. DOWN= Spécifie le nombre de lignes accordées à la légende. FRAME Ordonne un cadre autour de la légende. FWIDTH= Définit l’épaisseur du cadre (1-4). Options de position de la légende sur le graphique MODE=PROTECT | RESERVE | SHARE PROTECT : place la légende dans la zone du graphe – la légende peut recouvrir le graphique. SAS Livre Page 298 Jeudi, 18. septembre 2008 6:03 18 298 ◆ SAS RESERVE : place la légende en dehors du graphe. SHARE : place la légende dans la zone du graphe – la légende est transparente et ne masque pas le graphique. OFFSET=(<x ><,y >)<unité > | (<x <unité >><,y <unité >>) Spécifie le déplacement par rapport à la position préétablie. Les unités peuvent être le centimètre (CM), le point (PT), le pouce (IN), le nombre de caractères (CELLS) ou le pourcentage (PCT : 0.5pct, soit au milieu). Exemple OFFSET=(5cm,-3cm) déplace la légende vers la droite de 5 cm et vers le bas de 3 cm. ORIGIN=(<x ><,y >)<unité > | (<x <unité >><,y <unité >>) Spécifie la position de la légende : (0 cm, 0 cm) = en bas à gauche. POSITION=(<BOTTOM | MIDDLE | TOP> <LEFT | CENTER | RIGHT> <INSIDE | OUTSIDE>) Commande de position préétablie : POSITION=(TOP CENTER) en haut, centré – OUTSIDE est la norme. INSIDE est incompatible avec MODE=RESERVE. Options de texte LABEL=(options(s)) | NONE Le LABEL est, dans ce cas, le texte de présentation de la légende. Exemple LABEL=(color=red FONT='times' JUSTIFY=left POSITION=(bottom left) 'Texte de la légende') Ici ‘Texte de la légende’ commandé par LABEL apparaîtra en rouge, justifié à gauche, sous les entrées de la légende et à gauche. Le texte arrive TOUJOURS en dernier. ORDER= Liste de valeurs. VALUE=(options(s)) | NONE Comme pour LABEL, vous avez la possibilité d’appliquer les options COLOR, FONT, HEIGHT, JUSTIFY et POSITION. Vous devez indiquer ces options avant le texte de l’entrée. De plus, vous pouvez spécifier à quelle courbe doit s’appliquer l’entrée de légende que vous définissez par TICK=2, par exemple, pour la seconde courbe (voir programme 7.20). Pour annuler une légende : LEGEND1 ; Cette commande n’annule pas les légendes supérieures (LEGEND2, LEGEND3…). Comme pour AXIS, TITLE, FOOTNOTE et NOTE, une nouvelle définition LEGEND1 annule complètement une définition existante. Pour annuler toutes les légendes créées : GOPTIONS RESET=LEGEND; SAS Livre Page 299 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 299 Vous pouvez aussi passer par : GOPTIONS RESET=ALL; GOPTIONS RESET=GLOBAL; Mais dans ce cas, toutes les autres commandes STATEMENTS seront annulées. Pour retrouver les caractéristiques des légendes que vous avez créées : PROC GOPTIONS LEGEND NOLIST; RUN; 7.3.3. Les commandes SYMBOL <1…99> Si la commande PATTERN définit l’allure que doit avoir une surface à remplir, la commande SYMBOL précise l’allure d‘une courbe. Elle permet aussi de définir la nature de l’interpolation nécessaire pour joindre deux points. Cette commande sera essentiellement utilisée ici par la procédure GPLOT. Elle est aussi utilisée par PROC GCONTOUR. a. Options d’apparence BWIDTH= Si vous demandez un box plot, permet de spécifier l’épaisseur du trait des box plots. CI= Couleur du trait unissant les points. CO= Couleur (va s’appliquer à tous les éléments de la courbe à moins que vous ne spécifiiez CI ou CV). CV= Couleur du symbole marquant le point. FONT= Police à utiliser pour le symbole du point. HEIGHT= Hauteur du symbole marquant le point – unités CELLS/CM/IN/PCT/PT. L’unité sera celle par défaut (CELLS) à moins d’avoir précisé une unité de mesure dans GOPTIONS par la commande GUNIT. LINE= Spécifie le type de lignes à utiliser – pour visualiser les différentes lignes dont vous pouvez disposer, vous pouvez exécuter le programme 7.21. Programme 7.21 DATA test; ARRAY a{46} a1-a46; a1=1; DO j=2 TO 46; a(j)=a(j-1)+1; SAS Livre Page 300 Jeudi, 18. septembre 2008 6:03 18 300 ◆ SAS END; DO i=1 TO 10; OUTPUT; END; RUN; %MACRO line; %DO I=1 %TO 46; SYMBOL&i line=&i INTERPOL=JOIN VALUE=NONE COLOR=black; %END; %MEND; %line; GOPTIONS FTEXT='times'; AXIS1 ORDER=(1 TO 46 BY 1) LABEL=NONE; AXIS2 COLOR=white; PROC GPLOT; PLOT (a1-a46)*i/OVERLAY NOFRAME VAXIS=axis1 HAXIS=axis2; RUN; Vous obtiendrez : Résultat 7.16 POINTLABEL=<(options(s)) | NONE> Indiquez NONE si vous souhaitez que les points ne soient pas accompagnés de leur valeur. NONE est la valeur par défaut. Pour lire la donnée relative à un point de votre graphique, vous pourrez indiquer POINTLABEL et même spécifier un ensemble de paramètres de présentation de cette donnée. COLOR= FONT= HEIGHT= JUSTIFY=CENTER/LEFT/RIGHT POSITION=TOP/BOTTOM/MIDDLE SAS Livre Page 301 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 301 Exemple : SYMBOL1 POINTLABEL=(FONT='times' HEIGHT=10pt JUSTIFY=left) ; Par défaut, SAS indique au-dessus du point la valeur prise par la variable saisie par l’axe des ordonnées. Pour que la valeur prise par la variable apparaisse sur l’axe des abscisses (admettons que cette variable s’appelle X1), ajoutez dans votre parenthèse : "#X1" Si vous souhaitez que les deux coordonnées du point s’affichent, vous ajoutez plutôt : "#X1:#X2" <- ne pas oublier les « : » Vous pouvez même spécifier le séparateur entre les deux valeurs (ici, nous souhaitons « ; ») "#X1:#X2 $;" <- merci de ne pas oublier le « $ » Ou encore la valeur d’une troisième variable : "#X3" VALUE=special-SYMBOL | text-string | NONE Par la commande VALUE, vous spécifiez le caractère à utiliser pour marquer le point. Il est possible, par exemple, d’utiliser un symbole présent dans SAS. Le tableau reproduit à la figure 7.4 vous présente les différents symboles utilisables : Value = Symbole Remarque Value = plus % X & star ' square = diamond - triangle @ hash * Y + Z > paw . point < dot , circle / _ Underscore ? " À placer entre simples quotes ( # ) $ : Symbole Remarque À placer entre doubles quotes Point Virgule Figure 7.4 • Ensemble des signes que vous pouvez utiliser pour marquer vos points. SAS Livre Page 302 Jeudi, 18. septembre 2008 6:03 18 302 ◆ SAS Vous avez aussi la possibilité de définir vos propres VALUEs avec des polices graphiques de type DINGBATS (il faut donc que votre commande VALUE soit alliée à une commande FONT). À la figure qui suit, vous pouvez visualiser le type de valeurs que vous pouvez obtenir si vous utilisez la police graphique CIRCLE THINGS1. Exemple : SYMBOL4 FONT='circle things' VALUE='D'; Et les points sur votre graphique seront saisis par le symbole . SAS propose lui aussi des polices graphiques (les polices SPECIAL et WEATHER, par exemple) – pour plus de détails sur les polices graphiques livrées avec SAS/GRAPH, vous pouvez consulter l’aide en ligne : (SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/graphref.hlp/font-usinggraph-sw-fonts.htm (SAS 9.2) : support.sas.com/documentation/cdl/en/graphref/59607/HTML/ default/font-font-lists.htm Ou dans l’aide SAS, Sommaire : SAS products/SAS GRAPH/concepts/fonts/Software fonts WIDTH= Spécifie l’épaisseur de la courbe (=1 par défaut), =6 au maximum2. 1. Police libre de droits que vous pouvez télécharger sur le site www.dafont.com. 2. Il semblerait qu’en fait, on puisse aller au-delà de 6 comme le montre le programme 7.1 dans lequel on demande WIDTH=50. SAS Livre Page 303 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 303 b. Les méthodes d’interpolation SAS offre de très nombreuses méthodes d’interpolation. INTERPOL=JOIN Joint les points au moyen de lignes droites. INTERPOL=MAP/PLOT-PATTERN Demande à SAS de remplir des polygones définis par le graphique (par exemple, un espace entre deux courbes). INTERPOL=NEEDLE Trace un trait vertical entre le point et la valeur 0. INTERPOL=NONE Ne pas joindre les points. INTERPOL=STEP<placement><J><S> Commande un escalier : I=STEPL : point à gauche de la marche. I=STEPR : point à droite de la marche. I=STEPC : point au centre de la marche, Ce premier jeu d’options commande la nature de la ligne horizontale – sans option supplémentaire, vous n’avez que la partie horizontale des escaliers. I=STEP<L/R/C>J : Ligne verticale qui joint les lignes horizontales. I=STEP<L/R/C>S : Ordonne un tri de la variable sur l’abscisse avant de faire le graphique (si les données ne sont pas triées). STEP<L/R/C>JS est compris par SAS. INTERPOL=BOX<option(s)><00…25> Commande un BOX PLOT (boîte à moustache) – par défaut, C25 est en bas de la boîte, C75 en haut, la boîte est centrée sur la médiane et les pointes hautes et basses sont limitées à 1.5 intervalle interquartile. Exemple : l’intervalle interquartile (C75-C25) est égal à 100 (et C75=200). Si le maximum est égal à 225, la pointe ira jusqu’à 225 ; si le maximum est égal à 600, la pointe s’arrêtera à 200 + 1.5 * 100 = 350. Si vous avez spécifié une VALUE, SAS vous indiquera les points non représentés par cette VALUE. BOXF : colorie la boîte avec la couleur spécifiée par CV= et trace les lignes de la boîte elle-même avec la couleur spécifiée par CO=. BOXJ : joint les médianes par des lignes. BOXT : dessine des traits horizontaux au min et max. SAS Livre Page 304 Jeudi, 18. septembre 2008 6:03 18 304 ◆ SAS En plus de ces options (qui peuvent se cumuler : BOXFJT est compris par SAS), il est possible de spécifier les intervalles entre les valeurs extrêmes : BOX00 : les pointes vont de la valeur min à la valeur max. BOX01 : les pointes iront de C01 à C99. BOX05 : les pointes iront de C05 à C95. BOX10 : les pointes iront de C10 à C90. BOX25 : il n’y aura pas de pointes dans ce cas, seule la boîte sera représentée. Là encore, ces différentes options peuvent se cumuler : BOXFJT10 sera compris par SAS. INTERPOL=HILO<C><option(s)> Dans la version simple I=HILO, SAS trace une ligne entre le min et le max, et marque la moyenne. HILOC : si vous avez des cours bousiers et souhaitez représenter le min, le max et le cours à la fermeture (il faudra qu’à chaque date vous ayez au moins trois données) – la moyenne n’est plus calculée mais si vous avez plus de trois données par jour, SAS représentera les moyennes. HILOB : trace des barres au lieu des lignes. HILOJ : joint les valeurs moyennes (ou les cours de fermeture). HILOT : marques horizontales pour le minimum et le maximum. SAS comprendra HILOBJ HILOTJ, HILOCBJ, HILOCTJ, HILOCJ et HILOCT. INTERPOL=STD<1 | 2 | 3><variance><option(s)> Dans sa version simple INTERPOL=STD, relie la moyenne avec la moyenne +/– 2 écarts-types pour chaque valeur de X. Deux modes de calcul de la variance sont possibles : M : calcul de la variance de la moyenne pour chaque X en abscisse. P : (calcul par défaut) : calcul de la variance des valeurs de Y (en ordonnée). Vous avez de plus droit aux options B, J et T (voir plus haut). INTERPOL=R<type><0><CLM | CLI<50…99>> Commande des interpolations par régressions : I=RL : régression linéaire simple. I=RQ : régression cubique. I=RC : régression quadratique. I=RL0/RQ0/RC0 : force la relation à passer par l’origine (estimation sans constante). SAS Livre Page 305 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 305 Si vous ajoutez ensuite CLM, SAS tracera en plus de la courbe représentative de la régression un intervalle de confiance des prévisions sur données moyennes (par exemple, la consommation de glace DES enfants âgés de 9 ans). Si vous ajoutez CLI, SAS tracera en plus de la courbe représentative de la régression un intervalle de confiance des prévisions sur données individuelles (par exemple, la consommation de glace D’UN enfant âgé de 9 ans) L’intervalle de confiance est par défaut égal à 95 %. Si vous voulez une autre valeur, ajoutez à la suite l’intervalle de confiance désiré. Exemple : I=RC0CLI90 Des applications de ce type de méthode d’interpolation sont proposées dans la section 7.3.7. Vous pourrez aussi consulter l’aide SAS pour découvrir d’autres méthodes d’interpolation, les spline interpolation methods (entrée spline interpolation, puis symbol statement). INTERPOL=L<degree><P><S> Pour demander une interpolation de Lagrange afin de joindre les points. INTERPOL=SM<nn><P><S> Trace une courbe qui ne joint pas forcément les points en cas de série très bruitée. INTERPOL=SPLINE<P><S> Trace la courbe la plus douce possible afin de joindre tous les points. Afin de voir ce qu’offrent ces trois dernières méthodes d’interpolation, vous pouvez reprendre le programme 7.16 en introduisant une commande SYMBOL INTERPOL= L/SM/SPLINE avant le PROC PLOT. Pour annuler un SYMBOL : SYMBOL1 ; Cette commande n’annule pas les SYMBOL supérieurs (SYMBOL2,SYMBOL3…). Attention : comme pour l’instruction PATTERN, une nouvelle définition de SYMBOL1 n’annule pas l’ancienne définition si elle existe. Pour annuler tous les SYMBOL que vous avez pu redéfinir : GOPTIONS RESET=SYMBOL; Vous pouvez aussi passer par : GOPTIONS RESET=ALL; GOPTIONS RESET=GLOBAL; Mais dans ce cas, toutes les autres commandes STATEMENTS seront annulées. Pour retrouver les caractéristiques des SYMBOL que vous avez créés : PROC GOPTIONS SYMBOL NOLIST; RUN; SAS Livre Page 306 Jeudi, 18. septembre 2008 6:03 18 306 ◆ SAS 7.3.4 PLOT2 Un PLOT2 doit être précédé d’un PLOT et demande à SAS de créer un second axe vertical à droite. Cette commande est particulièrement utile quand les variables à représenter n’ont pas toutes la même échelle. Vous pouvez reprendre le programme 7.19 en ajoutant une instruction PLOT2 NIKKEI*DATE. Si vous utilisez PLOT2 et si vous souhaitez ajouter une légende à votre graphique, vous devrez créer deux légendes : une pour l’instruction PLOT et une autre pour l’instruction PLOT2. Si vous n’avez qu’une courbe sur un des axes verticaux, pour que votre légende s’affiche, avec SAS 9.1, vous devrez impérativement spécifier l’option OVERLAY. Cette option n’est plus nécessaire avec SAS 9.2. 7.3.5 Exemples – première partie Dans le même esprit que la section exemple de GCHART, l’objet de cette section est de vous proposer un ensemble d’exemples qui doivent vous éclairer sur les possibilités de PROC GPLOT. Nous utilisons une première table créée à partir du fichier TEMPERATURE.TXT. Programme 7.22 DATA temp; INFILE "C:\intro_SAS\fichiers\température.txt" EXPANDTABS; INPUT mois temp_min temp_max ville $; RUN; Dans la table créée, vous disposez des températures moyennes mensuelles minimales et maximales pour différentes villes1. Programme 7.23 GOPTIONS RESET=ALL; GOPTIONS FTEXT='garamond/bold' HTEXT=12pt CBACK=CXFFF5E6; TITLE1 JUSTIFY=l HEIGHT=20pt ' Température maximum moyenne mensuelle – Paris' H=3 ANGLE=90 ' ' H=3 A=-90 ' '; FOOTNOTE1 J=L ' Source: ' COLOR=blue 'http://weather.uk.msn.com/' J=R COLOR=black "2007 "; FOOTNOTE2 H=1 ' '; AXIS1 ORDER=(0 TO 30 BY 5) LABEL=(COLOR=CX995C00 J=C "Température" J=C "moyenne"); PROC GPLOT DATA=temp; PLOT temp_max*mois / HMINOR=0 VMINOR=0 VAXIS=axis1; WHERE ville='Paris'; RUN; 1. Source des données : http://weather.uk.msn.com/. SAS Livre Page 307 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 307 Résultat 7.17 Au cours de la section consacrée à PROC GCHART, nous avons déjà vu un ensemble d’éléments permettant de personnaliser vos graphiques. Notre travail n’a pas été vain puisque nous pouvons à nouveau utiliser ces diverses options de programmation pour les graphiques produits grâce à PROC GPLOT. Au moyen de GOPTIONS, nous spécifions la police à utiliser par défaut pour l’ensemble des éléments de texte du graphique ainsi que la couleur du fond du graphique. Vous remarquez que la couleur de fond du cadre du graphique reste en blanc. Pour que celle-ci soit identique à la couleur de fond du graphique, vous pouvez introduire une option CFRAME=CXFFF5E6 dans l’instruction PLOT1. L’instruction TITLE1 définit le titre du graphique mais permet aussi de décoller le graphique des bords droit et gauche du cadre par l’introduction d’éléments de titres vides. L’instruction FOOTNOTE définit le pied de page en deux parties : une partie à gauche composée elle-même de deux parties de couleurs différentes, puis un élément de texte à droite. La seconde instruction JUSTIFY (ou J=) permet la séparation du pied de page en deux éléments. La définition d’axe AXIS demande que les valeurs d’axe soient comprises entre 0 et 30, incrémentées de 5. Le LABEL de l’axe est composé de deux éléments de même couleur mais situés l’un au-dessous de l’autre. Ici encore, la nouvelle instruction JUSTIFY sépare le LABEL en deux éléments. Le graphique par lui-même est très simple. En option, il est demandé de ne pas avoir de marques d’axe mineures aussi bien sur l’axe horizontal que sur l’axe vertical. 1. Si vous exécutez le programme 7.23 dans SAS 9.1, vous constaterez que la couleur du fond du cadre du graphique est identique à celle du fond du graphique. SAS Livre Page 308 Jeudi, 18. septembre 2008 6:03 18 308 ◆ SAS Programme 7.24 ** Les GOPTIONS, FOOTNOTE et AXIS restent identiques à ceux définis dans le programme 7.23; SYMBOL1 COLOR=CXFF9900 INTERPOL=join; SYMBOL2 C=CX00248F WIDTH=2 I=join VALUE=star; SYMBOL3 C=CXBF6060 W=3 I=spline V=square; DATA temp; SET temp; temp_moy=(temp_max+temp_min)/2; RUN; TITLE1 JUSTIFY=l HEIGHT=20pt ' Températures moyennes mensuelles – Paris' H=3 ANGLE=90 ' ' H=3 A=-90 ' '; PROC GPLOT DATA=temp; PLOT (temp_min temp_moy temp_max )*mois / OVERLAY HMINOR=0 VMINOR=0 VAXIS=axis1; WHERE ville='Paris'; RUN; Résultat 7.18 SAS Livre Page 309 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 309 Nous introduisons ici des instructions SYMBOL afin de caractériser la courbe que nous souhaitons. Le graphique présenté ici demande l’utilisation des trois SYMBOL définis puisque trois courbes sont à tracer. SYMBOL1 s’appliquera à la première courbe demandée dans l’instruction PLOT, soit TEMP_MIN*MOIS. Pour la première courbe, on demande une courbe sans symbole pour marquer les points (une suite de segments). La deuxième courbe est aussi composée d’une succession de segments ; l’épaisseur du trait est double, une étoile marque les points. Pour la troisième, un carré marque les points. Il est demandé une épaisseur triple ainsi que INTERPOL=SPLINE. Pour les exemples qui suivent, vous pouvez être amené à définir, redéfinir et redéfinir les SYMBOL. Cette procédure est dangereuse parce que l’instruction SYMBOL1 peut ne pas annuler complètement la précédente définition de SYMBOL1. Vos caractéristiques se cumulent et vous risquez d’obtenir des résultats inattendus. Pour corriger cela, vous pouvez annuler tous vos SYMBOL via l’instruction SYMBOL1; SYMBOL2; SYMBOL3;... ou encore GOPTIONS RESET=SYMBOL; puis redéfinir vos SYMBOL. Programme 7.25 GOPTIONS RESET=ALL; GOPTIONS FTEXT='garamond/bold' HTEXT=1 IBACK="C:\intro_SAS\images\fond_esa.jpg" IMAGESTYLE=FIT; SYMBOL1 COLOR=CX99FF99 WIDTH=2 INTERPOL=SPLINE FONT='circle things' VALUE='A' CV=blue HEIGHT=1.5; AXIS1 ORDER=(0 TO 30 BY 5) LABEL=NONE; TITLE1 HEIGHT=5 " "; TITLE2 JUSTIFY=R HEIGHT=2.5 'Temperature maximum moyenne ' JUSTIFY=R ' Données mensuelles – Paris ' H=3 ANGLE=90 ' ' H=3 A=-90 ' '; TITLE3 H=2 " "; FOOTNOTE1 J=L ' Source: ' COLOR=blue 'http://weather.uk.msn.com/' J=R COLOR=black "2007 "; FOOTNOTE2 H=3 ' '; PROC GPLOT DATA=temp; PLOT temp_max*mois=1 / HMINOR=0 VMINOR=0 VAXIS=axis1 NOFRAME; WHERE ville = 'Paris'; RUN; SAS Livre Page 310 Jeudi, 18. septembre 2008 6:03 18 310 ◆ SAS Résultat 7.19 Le fond du graphique (le logo, le dégradé, l’encadrement ombré…) est un fichier externe à SAS, créé au moyen d’un logiciel de dessin. Vous trouverez ce fond de graphique parmi les fichiers support de cet ouvrage. L’instruction SYMBOL est en fait composée de deux éléments : un premier ensemble d’options qui vont définir l’allure de la courbe (COLOR=CX99FF99 (vert) WIDTH=2 INTERPOL=SPLINE). La seconde partie de l’instruction SYMBOL permet d’obtenir les marques de points particulières que vous observez sur le graphique : nous souhaitons utiliser la lettre ‘A’, taille 1,5, écrite en bleu au moyen de la police CIRCLE THINGS. Les commandes TITLE et FOOTNOTE ont pour objectif de cadrer au mieux le graphique par rapport au cadre1. Programme 7.26 GOPTIONS RESET=ALL; GOPTIONS FTEXT='garamond/bold' HTEXT=12pt CBACK=CXF2F2F2; SYMBOL1 C=black I=NONE FONT='circle things' VALUE='A' H=1.5; SYMBOL2 C=CX149035 I=NONE FONT='circle things' VALUE='B' H=1.5; SYMBOL3 C=CXFF9035 I=NONE FONT='circle things' VALUE='C' H=1.5; SYMBOL4 C=CXB35A00 I=NONE FONT='circle things' VALUE='D' H=1.5; AXIS1 ORDER=(0 TO 30 BY 5) LABEL=NONE; TITLE1 JUSTIFY=C HEIGHT=2.5 'Temperatures maximales moyennes' JUSTIFY=C 'Données mensuelles – Paris' H=3 ANGLE=90 ' ' H=3 A=-90 ' '; FOOTNOTE1 J=L ' Source: ' COLOR=blue 'http://weather.uk.msn.com/' J=R COLOR=black "2007 "; FOOTNOTE2 H=3 ' '; 1. Étant donné que votre fenêtre graphique n’a pas forcément les mêmes caractéristiques que celle de l’ordinateur sur lequel nous avons construit ce graphique, il est possible que le résultat obtenu soit différent de celui proposé ici. SAS Livre Page 311 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 311 PROC FORMAT; VALUE sample 1='Hiver' 2='Printemps' 3='Eté' 4='Automne'; RUN; DATA temp; SET temp; IF mois in(1,2,12) THEN saison=1; IF mois in(3,4,5) THEN saison=2; IF mois in(6,7,8) THEN saison=3; IF mois in(9,10,11) THEN saison=4; RUN; PROC GPLOT DATA=temp; PLOT temp_max*mois=saison / HMINOR=0 VMINOR=0 NOFRAME VAXIS=axis1; WHERE ville='Paris'; FORMAT saison sample.; RUN; Résultat 7.20 Dans ce graphique, on observe la création de quatre SYMBOL particuliers pour la définition desquels nous utilisons une police graphique (CIRCLE THINGS). Vous observez ensuite la création d’un FORMAT spécifique, puis dans la table de données, d’une nouvelle variable SAISON. Ensuite, dans PROC GPLOT, apparaît la commande suivante : PLOT temp_max*mois=saison Cette commande permet d’utiliser plusieurs SYMBOL pour la construction d’une courbe unique. Ici, puisque SAISON peut prendre quatre valeurs, nous définissons au préalable quatre SYMBOL distincts. Ce type de commande génère la création automatique de la légende. L’instruction d’attribution du FORMAT SAMPLE à la variable SAISON permet de rendre la légende plus lisible. SAS Livre Page 312 Jeudi, 18. septembre 2008 6:03 18 312 ◆ SAS Programme 7.271 SYMBOL1 SYMBOL2 SYMBOL3 SYMBOL4 I=NEEDLE; I=NEEDLE; I=NEEDLE; I=NEEDLE; AXIS1; AXIS1 ORDER=(-10 TO 20 BY 5) LABEL=NONE; TITLE1 JUSTIFY=C HEIGHT=2.5 'Temperatures minimales moyennes' JUSTIFY=C 'Données mensuelles – Helsinki' H=3 ANGLE=90 ' ' H=3 A=-90 ' '; FOOTNOTE1 J=L ' Source: ' COLOR=blue 'http://weather.uk.msn.com/'; FOOTNOTE2 H=3 ' '; PROC GPLOT DATA=temp; PLOT temp_min*mois=saison / HMINOR=0 VMINOR=0 NOFRAME VAXIS=axis1; WHERE ville='Helsinki'; FORMAT saison sample.; RUN; Résultat 7.21 Ce graphique diffère peu du précédent. Nous avons simplement ajouté une option d’interpolation (INTERPOL=NEEDLE) à chacune des instructions SYMBOL de façon qu’un trait relie le point à la valeur zéro. Vous remarquez que les nouvelles définitions de SYMBOL complètent celles données par le programme 7.26. 1. Pour pouvoir exécuter le programme 7.27, vous devez impérativement avoir exécuté le programme 7.26 au préalable. SAS Livre Page 313 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 313 Le trait horizontal passant par zéro est créé automatiquement par l’option d’interpolation. Si vous souhaitez un graphique sans cette option d’interpolation mais proposant un trait horizontal passant par 0, il suffit d’entrer HREF=0 en option à l’instruction PLOT. Les options d’interpolation peuvent être particulièrement intéressantes comme le montre le programme 7.28. Programme 7.28 GOPTIONS RESET=ALL; DATA temp2;SET temp; IF ville NE 'Helsinki' THEN DELETE; temp=temp_max;OUTPUT; temp=temp_min;OUTPUT; KEEP ville temp mois; RUN; GOPTIONS FTEXT='garamond/bold' HTEXT=12pt CBACK=CXF2F2F2; TITLE1 JUSTIFY=C HEIGHT=2.5 'Temperature min et max moyenne' JUSTIFY=C 'Données mensuelles – Helsinki' H=3 ANGLE=90 ' ' H=3 A=-90 ' '; FOOTNOTE1 J=L ' Source: ' COLOR=blue 'http://weather.uk.msn.com/' J=R COLOR=black "2007 "; FOOTNOTE2 H=3 ' '; SYMBOL I=HILOTJ C=CX149035 WIDTH=2; AXIS1 ORDER=(-10 TO 20 BY 5) LABEL=NONE; PROC GPLOT; PLOT temp*mois / NOFRAME HMINOR=0 VMINOR=0 VAXIS=axis1; RUN; Résultat 7.22 SAS Livre Page 314 Jeudi, 18. septembre 2008 6:03 18 314 ◆ SAS Les méthodes d’interpolation de types BOX, HILO et STD ne sont possibles que si, pour une même valeur de la variable en abscisse, vous disposez de plusieurs observations. Ceci explique l’étape DATA préalable à la construction du graphique dans laquelle, pour chaque valeur de MOIS, la variable TEMP reprend la température minimale et la température maximale1. La courbe joint les valeurs moyennes de chaque mois. Programme 7.29 GOPTIONS RESET=ALL; DATA temp3;SET temp; IF ville='Tunis' THEN tmin_tunis=temp_min; IF ville='Tunis' THEN tmax_tunis=temp_max; IF ville='Helsinki' THEN tmin_hels=temp_min; IF ville='Helsinki' THEN tmax_hels=temp_max; RUN; GOPTIONS FTEXT='garamond/bold' HTEXT=12pt CBACK=CXF2F2F2; SYMBOL1 I=SPLINE V=NONE; SYMBOL2 I=SPLINE V=NONE; SYMBOL3 I=SPLINE V=NONE; SYMBOL4 I=SPLINE V=NONE; PATTERN1 C=CXF2F2F2 V=SOLID; PATTERN2 C=CXFFCC35 V=SOLID; PATTERN3 C=CXF2F2F2 V=SOLID; PATTERN4 C=CXFE0000 V=SOLID; AXIS1 ORDER=(-10 TO 35 BY 5) LABEL=NONE; TITLE1 JUSTIFY=C F='Garamond' HEIGHT=20pt 'Comparaison des amplitudes de température' JUSTIFY=C 'Données mensuelles – Tunis Vs Helsinki' H=3 ANGLE=90 ' ' H=3 A=-90 ' '; FOOTNOTE1 J=L ' Source: ' COLOR=blue 'http://weather.uk.msn.com/' J=R COLOR=black "2007 "; FOOTNOTE2 H=3 ' '; PROC GPLOT DATA=temp3; PLOT (tmin_hels tmax_hels tmin_tunis tmax_tunis)*mois/ OVERLAY AREA=4 VMINOR=0 HMINOR=0 VAXIS=axis1 NOFRAME; NOTE COLOR=CXFF0000 H=0.05 MOVE=(12cm,1.2cm) BOX=1 BCOLOR=CXFF0000 '' COLOR=black H=1 MOVE=(12.7cm,1.1cm) 'Tunis' COLOR=CXFFCC35 H=0.05 MOVE=(15cm,1.2cm) BOX=1 BCOLOR=CXFFCC35 '' COLOR=black H=1 MOVE=(15.7cm,1.1cm) 'Helsinki'; RUN; 1. Si vous souhaitez vous exercer sur ces méthodes d’interpolation, rendez-vous sur le site de la météo suisse : www.meteosuisse.admin.ch. Dans l’onglet Climat, demandez la page Le climat depuis 1864. Vous pourrez alors télécharger des données mensuelles de températures et de précipitations depuis 1864. Ces données peuvent être librement téléchargées mais il n’est pas possible de les distribuer. SAS Livre Page 315 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 315 Résultat 7.23 Dans un premier temps, la table est modifiée de façon à disposer de quatres variables mesurant les températures minimales et maximales moyennes de Tunis et d’Helsinki. Via les instructions SYMBOL, nous demandons des courbes sans marque de point. Ensuite, au moyen des instructions PATTERN, nous définissons des caractéristiques à donner à quatre surfaces – deux surfaces seront du même gris que le fond du graphique (PATTERN1 et 3), une sera jaune (PATTERN2) et la dernière sera rouge (PATTERN4). Lorsque nous commandons la création du graphique, AREA=4 apparaît parmi les options. Cette instruction indique à SAS qu’il a quatre surfaces à remplir d’une couleur. Comme il y a quatre courbes, la première surface est située sous la première courbe (celle représentative des températures minimales mensuelles moyennes pour Helsinki), la deuxième sous la deuxième courbe, etc. Ici, l’ordre dans lequel vous entrez vos variables dans votre instruction PLOT est primordial. La courbe la plus basse est demandée en premier. La courbe la plus haute est demandée en dernier. À la surface, sous la courbe la plus basse, est appliqué PATTERN1 (une surface grise identique au fond du graphique), sous la deuxième courbe est appliqué PATTERN2 (une surface jaune). Vous vous demandez sans doute pourquoi la surface grise reste au-dessus de la surface jaune : simplement parce que le PATTERN1 est prioritaire sur le PATTERN2 – le jaune ne peut recouvrir le gris. PATTERN3 est ensuite appliqué à la surface entre la température maximale sur Helsinki et la température minimale sur Tunis ; ce gris ne peut pas recouvrir les jaunes et les gris placés sous lui (et définis par des PATTERN prioritaires). SAS Livre Page 316 Jeudi, 18. septembre 2008 6:03 18 316 ◆ SAS La légende créée sous le graphique est aussi particulière. Elle n’est pas produite par une instruction LEGEND mais par une instruction NOTE. Cette dernière instruction, évoquée dans la section 7.1.3., ne peut pas être placée en dehors de PROC GPLOT. NOTE COLOR=CXFF0000 H=0.05 MOVE=(12cm,1.2cm) BOX=1 BCOLOR=CXFF0000 '' COLOR=black H=1 MOVE=(12.7cm,1.1cm) 'Tunis' COLOR=CXFFCC35 H=0.05 MOVE=(15cm,1.2cm) BOX=1 BCOLOR=CXFFCC35 '' COLOR=black H=1 MOVE=(15.7cm,1.1cm) 'Helsinki'; La légende ainsi créée est composée de quatre éléments : les carrés de couleurs (BOX=1) et les entrées de légende. Les carrés constituent en fait des encadrements de texte (un espace de couleur identique (COLOR=CXFF0000) à la couleur du carré (BCOLOR=CXFF0000) qu’une instruction MOVE positionne sous le graphique. Il était aussi possible de créer beaucoup plus simplement une légende quasi identique à celle-ci avec une instruction LEGEND : LEGEND1 SHAPE=bar(8,1) VALUE=('' ' LABEL=NONE; Helsinki' '' ' Tunis') puis en ajoutant dans les options de PLOT LEGEND=legend1 Associée à une option AREA, l’instruction SHAPE=BAR permet de recréer les carrés de couleurs, d’en préciser la taille (8,1), puis de définir les textes en entrée de légende. Si vous ne les précisez pas, SAS indique le nom de la variable. Quatre carrés de couleurs sont créés puisque AREA= 4. Deux carrés gris restent invisibles mais ils sont bien là (vous pouvez changer la couleur de fond d’écran pour les apercevoir) en position 1 et en position 3 – l’instruction VALUE associe à ces carrés gris des textes vides. En positions 2 et 4, vous observez les noms de villes. 7.3.6 L’édition de vos graphiques Vous avez certainement noté au cours de la section 7.3.5. une progression dans la qualité des graphiques produits mais aussi une complexification de la programmation nécessaire à l’obtention de ces graphiques. Nous avons ainsi parfaitement conscience que la compréhension des instructions de la commande NOTE introduite dans le programme 7.29 n’a absolument rien de simple. Nous avons malgré tout utilisé la commande NOTE pour vous indiquer les difficultés que vous pourriez rencontrer en introduisant à l’intérieur de votre dessin un commentaire, ou comme dans l’exemple, deux images et du texte pour construire une légende. Sur les courbes présentées jusqu’à maintenant, on aurait aussi pu avoir envie d’ajouter une flèche, puis un texte indiquant la présence d’un point particulier devant retenir l’attention. C’est tout à fait possible avec SAS mais le positionnement de la flèche et du texte est particulièrement fastidieux. L’idéal serait de pouvoir disposer d’un éditeur graphique, à l’intérieur de SAS, qui permettrait l’introduction rapide de ce type de note. Certes, il existe un éditeur intégré à SAS auquel vous pouvez accéder en cliquant du bouton droit de la souris sur votre graphique, puis en demandant EDIT/EDIT CURRENT GRAPH. Vous constaterez alors que les possibilités offertes par cet éditeur sont très faibles et renoncerez très vite à l’utiliser. SAS Livre Page 317 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 317 Avec SAS 9.2, a été introduit un nouvel éditeur graphique nettement plus puissant : Statistical Graphics Editor (SGE). Nous évoquerons cet éditeur à la fin de ce chapitre (voir section 7.5) et dans la section 8.6. du chapitre consacré à ODS. Néanmoins, il ne nous sera d’aucune aide puisqu’il ne peut pas modifier les graphiques créés par la plupart des procédures de SAS/GRAPH. Seuls les graphiques générés par ODS GRAPHICS et les nouvelles procédures PROC SGPLOT, PROC SGPANEL et PROC SGSCATTER peuvent être modifiés avec cet éditeur. Tout n’est cependant pas perdu : c’est à l’extérieur de SAS que vous allez pouvoir trouver une solution à ce problème d’édition de vos graphiques. Les graphiques produits par SAS peuvent être très simplement copiés-collés dans votre traitement de texte (cliquez du bouton droit sur votre graphique, puis sélectionnez EDIT, puisCOPY). Vous avez aussi la possibilité de le coller dans des logiciels de dessin vectoriel tel Adobe Illustrator1. Une fois votre graphique collé dans ce logiciel, vous pouvez introduire assez rapidement toutes les modifications que vous souhaitez. Résultat 7.24 Les modifications apportées entre le résultat 7.23 et le résultat 7.24 ne nous ont pris que quelques minutes. Si nous avions dû introduire de telles modifications au moyen de SAS, cela aurait sans doute été beaucoup plus long. 1. Illustrator semble fonctionner parfaitement pour éditer et modifier les graphiques. D’autres logiciels de dessin vectoriel fonctionneront eux aussi très certainement mais nous ne pouvons vous en fournir la garantie. Paint n’est pas un logiciel de dessin vectoriel et ne peut pas être utilisé comme éditeur des graphiques générés par SAS. SAS Livre Page 318 Jeudi, 18. septembre 2008 6:03 18 318 ◆ SAS 7.3.7 Exemples – deuxième partie Pour les exemples suivants, nous allons utiliser la table BNP créée à partir des fichiers bruts CAC.TXT et BNP.TXT. Le programme 7.30 permet la création de la table. Programme 7.30 DATA cac; INFILE "C:\intro_SAS\fichiers\cac.txt" EXPANDTABS FIRSTOBS=2; INPUT date ddmmyy10. vol_cac cac; RUN; DATA bnp_tmp; INFILE "C:\intro_SAS\fichiers\bnp.txt" EXPANDTABS FIRSTOBS=2; INPUT date ddmmyy10. vol_bnp bnp; RUN; PROC SORT DATA=cac;BY date;RUN; PROC SORT DATA=bnp_tmp;BY date;RUN; DATA bnp; MERGE cac bnp_tmp; BY date; RUN; DATA bnp; SET bnp; rend_cac=(DIF(cac))/LAG(cac); rend_bnp=(DIF(bnp))/LAG(bnp); vol_bnp=vol_bnp/10**6; RUN; Dans cette table, vous disposez, parmi d’autres informations, des rendements journaliers du titre BNP à la Bourse de Paris, des volumes échangés de ce titre et du rendement journalier du CAC pour la période allant du 1er mars 2006 au 20 novembre 20071. Nous souhaitons un graphique dans lequel nous aurions à la fois une courbe (pour représenter l’évolution des cours) et des barres (pour représenter l’évolution des volumes échangés). On pourrait passer par PROC GBARLINE pour arriver à un tel résultat (voir l’aide SAS). En ce qui nous concerne, nous continuerons à utiliser PROC GCHART de façon à vous montrer que les différentes options d’interpolation employées simultanément permettent d’obtenir des résultats intéressants. Programme 7.31 GOPTIONS RESET=ALL; GOPTIONS FTEXT='garamond/bold' HTEXT=12pt CBACK=CXF2F2F2; TITLE1 JUSTIFY=C H=20pt "L’action BNP" JUSTIFY=C H=16pt 'Volumes échangés et évolution du cours'; FOOTNOTE1 J=L ' Source: ' C=blue 'http://fr.finance.yahoo.com/'; SYMBOL1 INTERPOL=NEEDLE WIDTH=5 COLOR=red; 1. Source de ces données : http://fr.finance.yahoo.com/. SAS Livre Page 319 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 319 SYMBOL2 INTERPOL=JOIN; AXIS1 ORDER=(0 TO 35 BY 5) MINOR=NONE LABEL=(JUSTIFY=center "Volumes" JUSTIFY=center "échangés" JUSTIFY=center H=10pt "(en millions)"); AXIS2 ORDER=(50 TO 95 BY 5) LABEL=("Cours"); AXIS3 COLOR=CXF2F2F2 ORDER=('01mar2006’d TO '20nov2007’d BY month) MINOR=none MAJOR=(C=black H=-0.5) VALUE=(COLOR=black H=8pt); PROC GPLOT DATA=bnp; PLOT vol_bnp*date/ VAXIS=axis1 HAXIS=axis3 NOFRAME; PLOT2 bnp*date / VAXIS=axis2; FORMAT date mmyys5.; RUN; Résultat 7.25 C’est en fait l’instruction SYMBOL1 associée à un INTERPOL=NEEDLE qui va ici permettre d’avoir, sur un même graphique, une courbe (caractéristiques définies par SYMBOL2) et des barres. Pour que les barres et les courbes ne se mélangent pas, il faut jouer sur les options d’axes (options ORDER sur AXIS1 et AXIS2). La définition d’axe AXE3 appliquée à l’axe horizontal demande un axe de couleur grise (a priori, donc, invisible sur un fond gris) mais précise que les valeurs d’axes majeures devront être noires. Pour une définition d’axe, lorsque l’instruction COLOR intervient, tous les éléments constitutifs de l’axe prennent la couleur indiquée à moins que l’on précise pour tel ou tel élément une autre couleur (voir SAS Livre Page 320 Jeudi, 18. septembre 2008 6:03 18 320 ◆ SAS section 7.1.4.). Cette manipulation est rendue nécessaire par le fait que l’axe apparaît, avec un espace, au-dessous des barres représentatives des volumes. Les derniers exemples illustrent les possibilités de certaines méthodes d’interpolation. Programme 7.32 GOPTIONS RESET=ALL; GOPTIONS FTEXT='garamond/bold' HTEXT=12pt CBACK=CXF2F2F2; TITLE1 J=C H=20pt "L’action BNP" J=C H=16pt 'Rendement du CAC et rendement du titre BNP'; FOOTNOTE1 J=R 'Source: ' C=blue 'http://fr.finance.yahoo.com/ '; FOOTNOTE2 J=R COLOR=black "Période 01/03/2006 – 20/11/2007 "; FOOTNOTE3 H=1 ' '; SYMBOL1 C=CX118E34 I=NONE V=circle; SYMBOL2 C=CXCC0099 I=RL V=circle; SYMBOL3 C=CXFF3300 I=RLCLI95 V=circle; SYMBOL4 C=white I=JOIN V=NONE; AXIS1 LABEL=('Rendement CAC'); AXIS2 LABEL=('Rendement BNP'); PROC GPLOT DATA=bnp; PLOT rend_bnp*rend_cac=1 /OVERLAY VREF=0 HREF=0 NOFRAME VAXIS=axis2 HAXIS=axis1; RUN; Résultat 7.26 Quatre définitions de SYMBOL sont présentées dans le programme 7.32. Pour le résultat 7.26, nous utilisons la première définition. Nous ajoutons au graphique des droites aux valeurs zéro des axes horizontal et vertical via l’option VREF et HREF de l’instruction PLOT. SAS Livre Page 321 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 321 Programme 7.33 PROC GPLOT DATA=bnp; PLOT rend_bnp*rend_cac=2 /OVERLAY VREF=0 HREF=0 NOFRAME VAXIS=axis2 HAXIS=axis1; RUN; Résultat 7.27 La méthode d’interpolation utilisée ici est la régression linéaire. En plus du nuage de points1, SAS ajoute à votre graphe la droite des MCO correspondant à la régression : Rendement_bnp = b1 + b2 * rendement_cac Si vous avez fait un peu de finance, vous savez que nous sommes en train d’estimer le bêta historique du titre BNP (sa sensibilité aux variations de marché). Comme indiqué dans la section 7.3.3.b., il est aussi possible de représenter la régression cubique et la régression quadratique. Programme 7.34 PROC GPLOT DATA=bnp; PLOT rend_bnp*rend_cac=3 /OVERLAY VREF=0 HREF=0 NOFRAME REGEQN VAXIS=axis2 HAXIS=axis1; RUN; 1. Le nuage de points continue à apparaître parce que nous avons spécifié une VALUE=CIRCLE dans la définition de SYMBOL2. Sans instruction VALUE, seule la droite apparaît. SAS Livre Page 322 Jeudi, 18. septembre 2008 6:03 18 322 ◆ SAS Résultat 7.28 La méthode d’interpolation demandée ici commande la présentation du nuage de points, de la droite de régression et d’un intervalle de confiance sur prévision individuelle (seuil à 95 %). Vous répondez ici à la question : quel est l’encadrement à 95% du rendement de l’action BNP le jour où le CAC diminue de 2 %, par exemple ? Une lecture graphique vous indique qu’il y a 95 % de chances pour que le titre BNP perde entre 0.9 % et 4.1 %. L’option REGEQN de l’instruction PLOT demande à ce que l’équation de la droite de régression soit indiquée sur la graphique. Ceci nous permet de voir que le bêta de cette action sur la période considérée est de 1.236. On apprécie la valeur d’un bêta par rapport à 1. Si le bêta est supérieur à 1, cela signifie que le titre monte plus que le marché lorsque celui-ci est à la hausse (et qu’il baisse plus que le marché lorsque celui-ci est à la baisse). On peut donc souhaiter voir sur le graphique une droite de pente 1. Programme 7.35 DATA bnp;SET bnp; IF _N_=1 THEN DO; x=-0.04;y=-0.04; END; IF _N_=2 THEN DO; x=0.04;y=0.04; END; SAS Livre Page 323 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 323 RUN; PROC GPLOT DATA=bnp; PLOT rend_bnp*rend_cac=3 y*x=4 /OVERLAY VREF=0 HREF=0 NOFRAME REGEQN VAXIS=axis2 HAXIS=axis1; RUN; Résultat 7.29 Pour tracer cette droite, il nous faut deux points. Ces points sont créés dans la table par le programme 7.35. Il est possible de donner à chaque élément de ce graphique des couleurs distinctes et d’agir aussi sur le cadre dans lequel le graphique est tracé1. Programme 7.36 SYMBOL3 CV=orange V=circle CI=CX33FF00 I=RLCLI95 CO=cyan WIDTH=2; SYMBOL4 C=white I=JOIN V=NONE WIDTH=2; PROC GPLOT DATA=bnp; PLOT rend_bnp*rend_cac=3 y*x=4 / OVERLAY VREF=0 HREF=0 FRAME REGEQN VAXIS=axis2 HAXIS=axis1 IFRAME="C:\intro_SAS\images\iframe.jpg" IMAGESTYLE=fit; RUN; 1. La photo utilisée pour ce graphique est une photo libre de droits téléchargée sur le site www.photolive.be SAS Livre Page 324 Jeudi, 18. septembre 2008 6:03 18 324 ◆ SAS Résultat 7.30 7.4 Vos graphiques et ODS L’Output Delivery System de SAS est une interface qui permet la production de documents dans divers formats. Dans le chapitre suivant, nous aborderons plus spécifiquement la production de documents HTML, PDF et RTF et vous aurez certainement envie d’intégrer des graphiques dans ces documents. Dans la version 9.1, l’intégration de graphiques dans des documents produits par ODS n’était pas sans poser de problèmes. Les styles ODS n’étaient pas pleinement applicables aux graphiques que vous pouviez construire et, quelquefois, le résultat obtenu pouvait sembler décevant dans le sens où les graphiques s’intégraient mal au reste du document. SAS 9.2 marque un progrès important en la matière. Il est maintenant très simple de produire des graphiques et d’y appliquer directement les styles ODS. Vous obtenez ainsi des résultats tout à fait séduisants comme nous allons le voir au moyen d’un exemple dans les pages qui suivent. Cependant, le travail que vous avez fourni jusqu’à maintenant au cours de ce chapitre ne doit pas être oublié. Effectivement, le passage par ODS vous permet d’oublier (temporairement) certains aspects de la mise en forme des graphiques (essentiellement les couleurs et les polices). Vous devrez continuer à définir des titres, des pieds de pages, des SYMBOL, des définitions d’axes, etc. ODS ne construira pas de légendes directement présentables. ODS n’écrira pas le programme commençant par PROC Gxxx et se terminant par RUN. SAS Livre Page 325 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 325 7.4.1 Un exemple Les programmes 7.37 et 7.38 produisent un graphique proche du graphique 7.28. Programme 7.37 GOPTIONS RESET=ALL; TITLE1 JUSTIFY=C "L’action BNP" JUSTIFY=C 'Rendement du CAC et rendement du titre BNP'; FOOTNOTE1 J=R 'Source: http://fr.finance.yahoo.com/ '; FOOTNOTE2 J=R "période 01/03/2006 – 20/11/2007 "; FOOTNOTE3 ' '; SYMBOL3 I=RLCLI95 V=circle; AXIS1 LABEL=('Rendement CAC'); AXIS2 LABEL=('Rendement BNP'); Par rapport au programme 7.32, un certain nombre d’éléments ont disparu : les GOPTIONS, les demandes de couleurs pour différents éléments, les références à des polices et les demandes de tailles de texte particulières. La demande de graphique devient : Programme 7.38 ODS HTML STYLE=curve; PROC GPLOT DATA=bnp; PLOT rend_bnp*rend_cac=3 /OVERLAY VREF=0 HREF=0 NOFRAME VAXIS=axis2 HAXIS=axis1; RUN; ODS HTML CLOSE; Résultat 7.31 SAS Livre Page 326 Jeudi, 18. septembre 2008 6:03 18 326 ◆ SAS Nous demandons la création du graphique via un STYLE livré avec SAS 9.2, en l’occurrence, CURVE. SAS vous propose de très nombreux STYLE ; vous retrouverez d’ailleurs sur le site compagnon de cet ouvrage ce même graphique produit au moyen des 52 styles livrés avec SAS 9.2. L’exécution de ce programme commande l’ouverture de la fenêtre RESULTS VIEWER et la création du graphique 7.31. Le graphique est créé par défaut dans un fichier PNG (avec la version 9.2) ou GIF (avec SAS 9.1) et enregistré à l’emplacement par défaut indiqué en bas à droite de votre écran. Vous pouvez spécifier l’emplacement où vous souhaitez enregistrer votre graphique de deux manières : • En modifiant cet emplacement par défaut : il suffit de double-cliquer dans la fenêtre dans laquelle s’affiche l’emplacement par défaut. • Directement dans la commande ODS HTML, en indiquant l’emplacement où vous souhaitez enregistrer votre graphique au moyen de l’option GPATH : ODS HTML STYLE=money GPATH='C:\intro_SAS\images' Lorsque vous activez la destination HTML d’ODS, SAS place en fait votre graphique dans une page HTML. En ne spécifiant que GPATH, votre fichier HTML continue à être envoyé vers l’emplacement par défaut. Pour spécifier un nouvel emplacement pour les fichiers HTML, vous emploierez l’option PATH=‘chemin dos’. Si seul PATH est spécifié, les graphiques seront envoyés aussi vers le dossier spécifié par PATH. Si vous ne produisez que des graphiques (et pas un document complet), vous pouvez aussi avoir besoin de l’option IMAGE_DPI qui définit la résolution de votre graphique. Par défaut, avec ODS HTML, la résolution des graphiques est de 100 DPI1. Pour modifier cette résolution, vous indiquez IMAGE_DPI=200 (par exemple). 7.4.2 Les polices Vous pourrez avoir des difficultés avec les graphiques que vous souhaiterez placer dans des documents produits par ODS si ceux-ci utilisent des polices non reconnues par SAS. Ce sera assez souvent le cas avec les polices que vous avez installées sur votre ordinateur après avoir installé SAS. Lorsque SAS/GRAPH produit un graphique, il peut utiliser n’importe quelle police placée dans le dossier Polices de votre système d’exploitation (pour accéder à ce dossier sous Windows, le chemin est généralement C:\Windows\Fonts). ODS, de façon générale, consulte non pas les polices de ce dossier mais uniquement celles situées dans le registre de SAS. Dans ce registre, au moment de l’installation de SAS 1. DPI : Dots Per Inch. SAS Livre Page 327 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 327 ont été placées les polices propres à SAS et les polices présentes dans votre système d’exploitation. Quand vous installez une nouvelle police sur votre ordinateur, la mise à jour du registre de SAS ne s’effectue pas automatiquement. Pour mettre à jour ce registre, vous pouvez demander l’exécution de ce programme : Programme 7.39 PROC FONTREG MODE=all MSGLEVEL=verbose; FONTPATH 'C:\Windows\Fonts'; RUN; La procédure PROC FONTREG est très peu documentée dans l’aide SAS (entrée PROC FRONTREG STATEMENT). Vous pouvez aussi consulter le document suivant : support.sas.com/documentation/onlinedoc/base/91/freetype-hub.pdf Lorsque vous exécutez le programme 7.39, l’option MSGLEVEL=VERBOSE demande à SAS l’écriture d’un rapport complet dans la fenêtre JOURNAL. Ce rapport indique les polices qui ont pu être ajoutées au registre de SAS et celles qui n’ont pas pu l’être. Pour connaître la liste des polices dont vous pouvez disposer, vous pouvez taper FONT dans la case COMMANDE située en haut à gauche sous la barre de menus (cette commande émule un outil qui vous permet de copier, puis de coller le nom exact de la police que vous souhaitez utiliser – cela vous épargne les fautes de frappe). Vous avez aussi la possibilité d’éditer le registre de SAS en tapant REGEDIT dans la case COMMANDE, puis SAS_REGISTRY/CORE/PRINTING/FREETYPE/FONTS. 7.4.3 GOPTIONS DEVICE= Pour que vos graphiques puissent « sortir » de la fenêtre graphique pour devenir un élément d’une page Web, d’un document RTF ou d’un document PDF par exemple, il est possible que vous ayez à spécifier un DEVICE=. Ces DEVICES agissent comme des modules capables d’écrire votre graphique dans un format compréhensible par une autre application. Ces DEVICE sont très nombreux et dépendent de votre installation de SAS (sa version et le système d’exploitation que vous utilisez). Pour connaître les DEVICE dont vous disposez pour votre installation de SAS, vous pouvez demander l’exécution du programme suivant : PROC GDEVICE; Une fenêtre s’ouvre suite à l’exécution de ce programme. Elle propose une liste de DEVICE accompagnée de descriptions. Pour avoir plus d’informations sur un DEVICE particulier, vous avez aussi la possibilité de passer par la fenêtre EXPLORATEUR de SAS, où vous sélectionnerez BIBLIOTHEQUES, puis SAS HELP, puis DEVICES. De très nombreux DEVICE s’attachent à écrire votre graphique dans un format compréhensible par telle ou telle imprimante. Vous disposez ensuite de modules qui vous permettent d’écrire votre graphique dans des formats GIF, JPEG, PNG, POSTSCRIPT… SAS Livre Page 328 Jeudi, 18. septembre 2008 6:03 18 328 ◆ SAS Dans le tableau suivant1, en fonction de la destination ODS, vous observerez la nature des documents produits, les différents DEVICE par défaut, le style ODS appliqué et la résolution par défaut. Tableau 7.2 • Format des images et destinations ODS Destinations Résultats Style ODS par défaut Format de l’image DPI par par défaut défaut (DEVICE) (résolution) HTML Fichier HTML Default PNG 100 LISTING Vers SAS – fenêtre GRAPH Listing PNG 100 LATEX Fichier LaTeX Default PostScript 200 PRINTER Trois FORMAT de sortie possibles dans cette famille : PCL, PDF ou PS (PostScript) Printer (PDF & PS) monochromePrinter (PCL) PNG dans le document – non récupérable 150 RTF Fichier RTF pour traitement de texte RTF PNG (récupérable) 200 Attention, ODS LATEX est expérimental même dans SAS 9.2. Dans la liste des DEVICE possibles, vous remarquez par exemple la présence de plusieurs DEVICE GIF (GIF, GIF160, GIF260, GIF373, GIF570, GIF733) : si tous ces DEVICE créent bien un fichier au format GIF, ils diffèrent entre eux par la taille de l’image qui va être produite. Le GIF standard créera un fichier de taille 800 * 600 pixels, le GIF160 générera un fichier plus petit (d’une taille maximale égale à 160 * 120 pixels). Quatre DEVICE sont particulièrement intéressants : GIFANIM, JAVA, JAVAIMG et ACTIVEX. GIFANIM permet de créer des graphiques GIF animés. Pour un exemple de ce type de graphique, consultez le forum du master ESA où un étudiant présente les deux premiers graphiques animés qu’il a construits : www.master-esa.com/viewtopic.php?id=119 Les graphiques ACTIVEX et JAVA sont particulièrement recommandés si vous souhaitez proposer votre travail sur Internet. ACTIVEX peut aussi bien produire un graphique interactif pour le Web qu’un graphique interactif au sein d’un document produit par votre traitement de texte. En ce qui concerne JAVA, DEVICE=JAVA est réservé aux applications Web. Vous en trouverez un exemple à l’adresse suivante : www.unt.edu/benchmarks/archives/2001/may01/SASC.htm Ce site propose un programme très simple qui permet de créer un premier graphique Java. Pour voir ce qu’est un graphique ACTIVEX, suivez les liens suivants : www.univ-orleans.fr/deg/masters/ESA/actX.htm http://robslink.com/SAS/nasa/graphs/elev3d.htm 1. Ce tableau est propre à la version 9.2 de SAS. Dans les versions antérieures, le format de l’image par défaut n’est jamais PNG mais GIF. SAS Livre Page 329 Jeudi, 18. septembre 2008 6:03 18 Les graphiques sous SAS ◆ 329 Si SAS est installé sur votre ordinateur (avec une version 9, vous ne devriez avoir aucun problème) et si votre navigateur Internet n’est pas trop ancien (Internet Explorer 5.0 minimum), vous allez pouvoir modifier l’allure de votre graphique grâce au bouton droit de votre souris. Toutes les applications graphiques de SAS/GRAPH ne peuvent pas être transformées en graphiques ACTIVEX : jusqu’à la version 8 de SAS, vous ne pouviez utiliser que des graphiques produits par GCHART, GCONTOUR, GMAP, GPLOT et G3D. Dans la version 9.1, ACTIVEX est compatible avec GAREABAR, GBARLINE, GCHART, GCONTOUR, GMAP, GPLOT, GRADAR et G3D. Il a été rendu compatible avec GTILE dans SAS 9.2. La construction de graphiques ACTIVEX ne vous dispensera pas d’apprendre à construire un graphique. De plus : 1. ACTIVEX est une technologie Microsoft qui n’est compatible qu’avec des produits Microsoft. Vous pouvez donc utiliser votre graphique aussi bien dans Microsoft Word, Microsoft Excel, Microsoft PowerPoint… mais pas dans les programmes équivalents des autres éditeurs. Ainsi, les graphiques ACTIVEX ne peuvent être vus qu’avec un navigateur Internet Explorer Microsoft. Mozilla Firefox, par exemple, ne saura pas lire votre graphique ACTIVEX à moins que vous lui ajoutiez un module supplémentaire (add-on IE6). 2. ACTIVEX est généralement désactivé car il constitue une porte d’entrée pour un grand nombre de virus. Microsoft intègre régulièrement des correctifs à ses systèmes d’exploitation qui peuvent désactiver les graphiques ACTIVEX (cas des correctifs de Windows XP (SP2) KB912812 et KB912945). 3. Si votre système est relativement ancien (Windows 98, par exemple), vous n’obtiendrez pas votre graphique ACTIVEX. 4. De nombreuses options de SAS/GRAPH ne sont pas compatibles avec ACTIVEX ou JAVA. 5. En ce qui concerne les graphiques JAVA, vous devez bien prendre garde à la version du JAVA RUNTIME ENVIRONMENT installée sur votre ordinateur et, surtout, ne jamais mettre à jour votre JAVA RUNTIME ENVIRONMENT. Si votre version est trop récente (par rapport à la version maximale possible pour votre système et votre version de SAS), vous n’obtiendrez rien. Pour connaître la version maximale supportée par votre installation de SAS et votre système d’exploitation, vous pouvez consulter support.sas.com/resources/thirdpartysupport/ 7.5. SAS 9.2 – Les procédures « STATISTICAL GRAPHICS » Avec SAS 9.2, trois nouvelles procédures graphiques ont été introduites. Elles font cependant appel à un nouveau type de programmation qui les éloigne des procédures graphiques déjà présentes dans SAS. Les procédures propres à SAS/GRAPH peuvent être considérées comme des procédures d’exploration ou de représentation de vos données. Les nouvelles procédures que SAS 9.2 propose à l’intérieur de STATISTICAL GRAPHICS doivent plutôt être vues comme des procédures graphiques permettant l’analyse des données. Nous nous éloignerions donc du propos de cet ouvrage si SAS Livre Page 330 Jeudi, 18. septembre 2008 6:03 18 330 ◆ SAS nous devions les présenter de façon exhaustive. Aussi, nous ne traiterons ici que des principales caractéristiques de ces procédures en mettant l’accent sur ce qui les différencient des procédures SAS/GRAPH. Contrairement aux procédures de SAS/GRAPH (PROC Gxxx), les procédures de STATISTICAL GRAPHICS (PROC SGxxx : PROC SGPLOT, PROC SGPANEL et PROC SGSCATTER) envoient le graphique produit non pas dans la fenêtre graphique, mais directement dans un fichier PNG sur votre disque dur. Pour observer le graphique produit, vous devez l’ouvrir en passant par l’explorateur SAS. Nous avons vu dans ce chapitre que les graphiques produits au moyen d’une procédure de SAS/GRAPH peuvent être copiés de la fenêtre GRAPH avec un éditeur de dessin vectoriel afin d’être modifiés. Les commandes STATEMENT demeurent essentielles à la mise en forme de vos graphiques. En ce qui concerne les graphiques produits au moyen de STATISTICAL GRAPHICS, de très nombreuses commandes STATEMENT n’agissent plus sur les graphiques produits1. Ensuite, puisque le graphique est directement envoyé dans un fichier PNG, il ne peut pas facilement être édité dans un éditeur externe pour être modifié. SAS 9.2 propose un nouvel éditeur graphique spécialement dédié à l’édition et à la modification des graphiques créé par STATISTICAL GRAPHICS et ODS GRAPHICS (qui sont en fait intégrés) : Statistical Graphics Editor. Pour activer cet éditeur, lorsque la fenêtre EXPLORATEUR est active, tapez dans la fenêtre COMMANDE « SGEDIT ON ». À partir de ce moment, tous les graphiques que vous allez créer avec des PROC SGxx ou ODS GRAPHICS pourront être édités et modifiés. Il suffit, à partir de l’explorateur SAS, de cliquer du bouton droit sur le nom du graphique produit, puis de demander Edition. Cet éditeur consomme cependant beaucoup de ressources et il n’est pas conseillé de le faire fonctionner en permanence (pour stopper la fonction Edition, exécutez SGEDIT OFF dans la fenêtre COMMANDE – la fenêtre EXPLORATEUR doit être active). Au moyen de cet éditeur, vous avez la possibilité d’intégrer à votre graphique du texte, de modifier les polices, d’appliquer un autre style, d’intégrer des images à votre graphique, etc. Il est possible de réaliser des modifications plus profondes des graphiques produits au moyen des procédures STATISTICAL GRAPHICS. Pour cela, il faut intervenir sur les styles qui guident la production de ces graphiques (les GRAPHICS TEMPLATE). Le lecteur intéressé par les possibilités de STATISTICAL GRAPHICS est invité à consulter le site compagnon de cet ouvrage sur lequel il trouvera un exposé des possibilités de ces nouvelles procédures, des exemples d’application ainsi que des liens vers des articles sur ces procédures, présentés au SAS Global Forum 2008. 1. Seules les commandes STATEMENTS BY, FORMAT, FOOTNOTE, LABEL, ODS GRAPHICS et TITLE agissent sur les procédures SGxxx. SAS Livre Page 331 Jeudi, 18. septembre 2008 6:03 18 8 ODS Au sommaire de ce chapitre : 8.1. ODS : les principes 8.2. ODS HTML 8.3. Agir sur votre environnement – la procédure PROC TEMPLATE 8.4. ODS RTF 8.5. ODS PRINTER et ODS PDF 8.6. Un nouvel outil : ODS GRAPHICS Dans l’introduction de son livre, Output Delivery System, the Basics1, Lauren E. Harworth écrit : « You want your output to be appealing, to help you to tell a story. You want your output to be impressive: it should look like you worked on it for hours, even if it only took a few minutes… » Elle conclut alors que ODS est fait pour vous ! ODS est une interface qui permet la production de tableaux de résultats ayant une forme beaucoup plus attrayante que les simples sorties que vous pouvez obtenir dans la fenêtre SORTIE. ODS peut générer pour vous des documents en HTML, en PDF, en RTF (que vous pourrez intégrer facilement dans un traitement de texte ou dans un tableur), en PS (Postscript), en LaTex (traitement de texte scientifique) et en Excel. Vous comprenez donc que l’objet d’ODS est de vous permettre de mieux partager vos résultats avec des personnes extérieures. Le moyen que vous choisissez pour faire connaître vos résultats commandera le type de sorties à demander à ODS. Vous souhaitez faire apparaître vos résultats sur Internet ? ODS HTML vous y aidera. Vous souhaitez réaliser un rapport écrit ? ODS RTF et ODS PDF vous seront indispensables. Vous souhaitez présenter vos résultats sous PowerPoint ? Vous utiliserez ODS RTF. Cependant, l’objet de ce chapitre n’est pas de faire une présentation complète d’ODS mais de vous permettre de réaliser vos premières sorties sous ODS. Une fois que vous aurez compris les principes de base de cette procédure particulière, il vous reviendra d’approfondir vous-même le sujet. Nous développerons essentiellement ODS HTML, ODS RTF et ODS PDF. Ce chapitre se conclut sur une présentation d’ODS GRAPHICS. 1. SAS publishing, n˚ 58087, ISBN-X 978-1580258593. SAS Livre Page 332 Jeudi, 18. septembre 2008 6:03 18 332 ◆ SAS 8.1 ODS : les principes Cette section explique les avantages d’utiliser ODS pour produire des documents destinés à être distribués. Nous préciserons ensuite la notion de destination ODS pour développer une première destination ODS : ODS DOCUMENT. Dans la section 8.1.4., nous traiterons des sorties HTML automatiques. Si celles-ci sont intéressantes, nous verrons qu’en fait, leur utilité est limitée. 8.1.1 Les raisons d’utiliser ODS Les sorties qui apparaissent dans la fenêtre SORTIE connaissent un certain nombre de limites qu’il convient d’apprécier pour comprendre l’intérêt que peut avoir ODS. 1. Vous n’avez déjà pas vraiment le choix dans la police de présentation des résultats. Vous ne pouvez ainsi qu’utiliser que des polices à chasse fixe (SAS Monofont, Courier…). Si vous copiez-collez vos résultats vers un traitement de texte, vous devez conserver la police SAS Monospace : si vous imposez, dans la fenêtre SORTIE, une police plus standard (la police de votre document), le résultat que vous allez obtenir sera peu engageant comme le montre l’exemple suivant : Le Système SAS 08:33 Friday, April 25, 2008 2 Procédure FREQ Fréquence Pctage. X1 Fréquence Pourcentage cumulée cumulé ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 1 1 33.33 1 33.33 4 1 33.33 2 66.67 7 1 33.33 3 100.00 2. Si vous copiez-collez vos résultats directement de votre fenêtre SORTIE dans votre tableur, vous ne pourrez rien en faire. 3. Même si l’aspect des résultats que vous obtenez vous convient, il sera difficile de les partager avec d’autres personnes non-utilisatrices de SAS parce que celles-ci ne disposent pas de la police SAS Monospace. Elles verront donc vos résultats sous la forme présentée au point 1. 4. Enfin, vous apprendrez que, même si vos résultats sont intéressants, si leur forme n’est pas attrayante, personne ne les lira. 8.1.2 Les destinations ODS Comme nous l’avons indiqué en introduction de ce chapitre, ODS peut créer des documents dans de multiples formats ou destinations. Nous examinerons (ou citerons) au cours de ce chapitre huit destinations. Le tableau 8.1 résume les caractéristiques de six d’entre elles1. 1. ODS MARKUP, bien que citée dans ce chapitre, n’est pas reprise ici. Cette procédure particulière est certes extrêmement puissante mais elle nous a semblé trop complexe pour être développée dans le cadre de cet ouvrage d’introduction. ODS PRINTER sera aussi évoquée dans la section 8.5.1. : cette procédure permet d’écrire vos résultats dans divers formats de type impression (PS, PCL, PDF…) et d’envoyer directement vos sorties vers une imprimante. ODS PDF est un élément de la famille ODS PRINTER. SAS Livre Page 333 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 333 Tableau 8.1 • Caractéristiques de certaines destinations ODS ODS Fenêtre Émulation d’un logiciel extérieur à SAS Format du fichier créé ODS LISTING SORTIE non Fichier liste SAS ODS OUTPUT non non Table SAS ODS DOCUMENT RESULTATS non Table de résultats ODS HTML RESULT VIEWER non HTML ODS RTF RESULT VIEWER Microsoft Word RTF ODS PDF RESULT VIEWER Acrobat Reader PDF Lorsque vous créez une sortie, vous avez la possibilité de l’envoyer vers une autre destination que votre fenêtre SORTIE (ODS LISTING est la destination par défaut). Il est possible d’envoyer votre sortie vers plusieurs destinations, et même de préciser des caractéristiques propres à chaque destination. Ainsi, lorsque vous ordonnez un PROC UNIVARIATE sur une variable, votre sortie est en fait composée de cinq éléments : vous pouvez décider d’envoyer le premier élément vers un fichier RTF, le deuxième vers un fichier HTML, le troisième vers un fichier PDF, le quatrième dans une table SAS, le cinquième vers votre fenêtre SORTIE. Les différents fichiers que ODS va générer pour vous ne seront créés que lorsque vous clôturerez votre destination par une instruction : ODS destination CLOSE ; Si plusieurs destinations ont été ouvertes, vous avez la possibilité de toutes les fermer au moyen de l’instruction : ODS _ALL_ CLOSE; Attention, cette dernière commande clôt aussi votre destination LISTING. Dans ce cas, si vous commandez ensuite une sortie, aucun résultat ne s’affichera et vous aurez dans votre fenêtre JOURNAL le message suivant : AVERTISSEMENT: Aucune destination de sortie active. 8.1.3 ODS DOCUMENT ODS DOCUMENT possède un statut particulier : cette destination d’ODS crée un fichier générique que vous pourrez ensuite transformer en ce que vous souhaitez. Cette procédure vous sera particulièrement utile pour les sorties qui génèrent beaucoup de calculs puisque, d’une session à l’autre, vous avez la possibilité d’ouvrir le document générique créé par ODS DOCUMENT et de commander de nouvelles sorties sans relancer pour cela toutes vos procédures. Nous allons voir les possibilités d’ODS DOCUMENT au moyen d’un exemple. Le programme 8.1 crée la table qui va être utilisée au cours de ce chapitre à partir du fichier brut ODS1.TXT. SAS Livre Page 334 Jeudi, 18. septembre 2008 6:03 18 334 ◆ SAS Programme 8.1 DATA vente; INFILE 'C:\intro_SAS\fichiers\ods1.txt'; INPUT departement :$10. produit nombre CA; RUN; PROC FORMAT; VALUE fprod 0='Chine' 1='Inde' 2='Vietnam' 4='Etats-Unis' 5='Camargue' 6='Népal' ;RUN; 3=‘Pakistan' Le programme 8.2 crée une sortie ODS DOCUMENT. Programme 8.2 LIBNAME lib 'C:\intro_SAS\ods'; ODS DOCUMENT NAME=lib.test82; PROC MEANS DATA=vente; CLASS produit; VAR nombre; RUN; ODS DOCUMENT CLOSE; Lors de la même session, vous pouvez commander des sorties de vos résultats en passant par la fenêtre RESULTATS. Cliquez du bouton droit sur l’icône de la sortie ODS DOCUMENT (l’icône utilisée pour les tables SAS). Figure 8.1 • ODS DOCUMENT. Une fenêtre s’ouvre alors et vous demande quel type de document vous souhaitez réaliser (voir figure 8.2). Si vous souhaitez créer un document ODS au moyen d’une sortie d’ODS DOCUMENT lors d’une session ultérieure à la session au cours de laquelle vous avez créé votre fichier générique, débutez votre session par la création d’une bibliothèque pointant vers l’emplacement physique où est stocké, sur votre disque dur, le fichier créé par ODS DOCUMENT, puis, lorsque la fenêtre RESULTAT est active, sur la barre de menus, AFFICHAGE, puis DOCUMENTS. Une nouvelle fenêtre DOCUMENTS SAS Livre Page 335 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 335 Figure 8.2 • Les destinations possibles. s’ouvrira dans le cadre dans lequel vous avez les fenêtres EXPLORATEUR et RESULTATS. Vous pourrez alors, de la même manière que précédemment, créer une sortie dans le format de votre choix. Vous remarquez à la figure 8.2, la présence de treize formats de sortie différents. Nous nous concentrerons principalement dans cet ouvrage sur les sorties en HTML, RTF, table de sortie, PS, PDF. Les sorties en XML (Extensible Markup Language), LaTex, WML (Wireless Markup Language) et CSV sont obtenues au moyen de ODS MARKUP. Les sorties PCL4 et 5 sont obtenues au moyen de ODS PRINTER. 8.1.4 Une première approche des sorties en HTML Les sorties que vous pouvez obtenir peuvent être directement représentées dans un format HTML sans passer par une commande ODS dans la fenêtre EDITEUR. Il suffit pour cela de le demander à SAS dans le menu Outils, puis Options/Préférences/Onglet Résultats. Cochez alors la case Créer HTML, puis les options Affichage des résultats au fur et à mesure de leur génération et Navigateur interne. Figure 8.3 • Activation des sorties HTML par défaut. SAS Livre Page 336 Jeudi, 18. septembre 2008 6:03 18 336 ◆ SAS Ensuite, dès que vous commanderez une sortie, vos résultats apparaîtront dans deux fenêtres : la fenêtre SORTIE et la fenêtre RESULT VIEWER. Vos résultats sont écrits en code HTML que vous pouvez copier-coller. Une capture d’écran d’un résultat généré en HTML est présentée ci-dessous : Résultat 8.1 Vous avez le choix entre divers styles pour afficher vos résultats. Pour le résultat 8.1, nous avons utilisé le style par défaut. Le même tableau utilisant le style « gears » vous donne : Résultat 8.2 Si vous souhaitez voir succinctement l’ensemble des styles fournis avec SAS (avant de construire vos propres styles), vous pouvez soumettre le programme 8.3. Programme 8.31 OPTIONS NODATE NONUMBER; GOPTIONS RESET=ALL; ODS LISTING CLOSE; ODS OUTPUT Stats=Temp1; PROC TEMPLATE; 1. Ce programme fait appel à des notions de programmation que nous n’avons pas encore vues et ne sera pas commenté. ODS OUTPUT sera examiné dans la section 8.2.8. La partie du programme commençant par %MACRO style et se terminant par %STYLE est typique du langage MACRO de SAS (voir chapitre 9). Il est inspiré d’un programme proposé par Lauren Haworth écrit à l’origine pour SAS 8.2. SAS Livre Page 337 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 337 LIST; RUN; ODS OUTPUT CLOSE; DATA _NULL_; SET temp1; WHERE SUBSTR(path,1,7)='Styles.'; style=SCAN(path,2,'.'); CALL SYMPUT('num',_N_); CALL SYMPUT(COMPRESS('STY'||_N_),style); RUN; DATA test; INPUT X Y Z @@; CARDS; 1 2 3 4 5 6 7 8 9 ; %MACRO style; ODS HTML FRAME='cadre.html' CONTENTS='contenu.html' BODY='bodyinutile.html'; %DO i=1 %TO # ODS HTML BODY="body&i..html" STYLE=&&sty&i; TITLE "les styles présents dans votre version de SAS"; TITLE2 "Ceci est le style &&sty&i"; ODS PROCLABEL "Ceci est le style &&sty&i"; PROC PRINT DATA=test; RUN; %END; ODS HTML CLOSE; %MEND; %STYLE; Dans un premier temps, vous pourrez vous contenter des styles offerts par SAS. Nous verrons au cours de ce chapitre qu’il est possible de personnaliser ces styles. 8.1.5 Les limites des sorties ODS générées automatiquement Si vous avez plusieurs tableaux obtenus de PROC différentes, vous ne pourrez pas tous les enregistrer dans un seul fichier. Dans la fenêtre RESULTS VIEWER, vous n’avez un accès direct qu’à la dernière sortie – pour retrouver les résultats établis précédemment, vous devez passer par la fenêtre RESULTATS. De plus, vos sorties HTML ne pourront pas être exportées vers un traitement de texte ou un tableur sans retraitements. En faisant un copier-coller depuis votre fenêtre HTML par exemple vers Word, vous devrez retravailler votre résultat pour obtenir quelque chose de lisible. De plus, les graphiques resteront dans la fenêtre de sortie graphique : seules les sorties envoyées vers la fenêtre SORTIE seront transformées en HTML. ODS s’impose donc. Dans ce chapitre, nous nous intéresserons à ODS RTF, ODS PDF et plus particulièrement à ODS HTML. Nous vous conseillons de lire attentivement cette section même si vous ne souhaitez pas réaliser de sorties en HTML. En effet, elle vous présente les commandes de base, communes à l’ensemble des sorties ODS. SAS Livre Page 338 Jeudi, 18. septembre 2008 6:03 18 338 ◆ SAS 8.2 ODS HTML La table que nous allons utiliser est créée au moyen du programme 8.1. Un premier résultat peut être obtenu au moyen du programme 8.4. Programme 8.4 ODS HTML BODY='84_1body.html'; PROC MEANS DATA=vente; CLASS produit; VAR nombre; RUN; ODS HTML CLOSE; Le programme commence par une instruction d’ouverture d’ODS HTML ; nous demandons dans le même temps la création d’un fichier 84_1BODY.HTML dans lequel sont stockés les résultats produits par les procédures qui vont être exécutées sur la table SAS. Le fichier ne sera effectivement créé que lorsque SAS rencontrera une instruction ODS HTML CLOSE. Dans le cas présent, ce fichier va être stocké dans l’emplacement par défaut. Pour savoir où est ce dernier, il vous suffit de lire, en haut de votre fenêtre RESULTS VIEWER, le chemin vers le fichier HTML que vous venez de créer. Vous pouvez modifier cet emplacement par défaut via le menu Outils/Options/Préférences/Onglet Résultats. Vous pourrez ensuite ouvrir ce fichier avec notre navigateur Internet1. Si vous ne spécifiez pas un nom de fichier, les sorties HTML seront aussi dirigées vers cet emplacement par défaut. 8.2.1 La gestion des fichiers créés par ODS Si vous voulez spécifier un emplacement précis sur votre disque dur, autre que l’emplacement par défaut, pour le fichier que vous voulez créer, vous pouvez entrer une instruction BODY incluant un chemin DOS : ODS HTML BODY='C:\intro_SAS\ods\resultat.html'; Vous pouvez aussi spécifier un emplacement par défaut de vos fichiers de résultats au moyen de la commande : FILENAME ODSOUT 'C:\intro_SAS\ods'; ODS HTML PATH=ODSOUT BODY='resultat2.html'; Vous devrez obligatoirement appeler l’emplacement physique où stocker vos fichiers ODSOUT. Si vous lui donnez un autre nom, cela ne fonctionnera pas. Désormais, dans cet ouvrage, toutes les sorties ODS que nous allons ordonner seront systématiquement dirigées vers le dossier défini comme étant l’ODSOUT. Si vous exécutez les programmes proposés (nous vous y invitons), de façon que les fichiers créés par une instruction ODS n’effacent pas des fichiers déjà existants créés par 1. Attention, la compatibilité avec les divers navigateurs Internet n’est pas assurée – vous pouvez ainsi avoir des difficultés à ouvrir vos fichiers HTML créés avec Mozilla Firefox alors que cela semble fonctionner avec Internet Explorer de Microsoft. Au moment où sont rédigées ces lignes, nous n’avons pas de solution permettant la lecture sans problème d’un fichier HTML généré par SAS avec Firefox. SAS Livre Page 339 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 339 d’autres programmes ODS1, les noms des fichiers générés auront la structure suivante dans le cas où le fichier est créé par le programme 8.4 : 84_1BODY.html Nous verrons que, dans le cas des fichiers BODY, une même instruction ODS peut conduire à la production de plusieurs fichiers. Dans le cas présent, si trois fichiers BODY sont créés, ils auront pour noms : 84_1BODY, 84_2BODY et 84_3BODY. La déclinaison des noms de fichiers est automatique. Les fichiers créés par les procédures graphiques (par défaut, en format GIF pour SAS 9.1 et PNG pour SAS 9.2) seront eux aussi systématiquement nommés de la manière suivante : PROC Gxxxx DATA=xxx; XXX xxx / … différentes options … NAME='G84'; RUN; Dans ce cas, au cours d’une même session, si vous exécutez plusieurs fois le même programme, les fichiers GIF ou PNG créés s’incrémentent automatiquement sans jamais écraser les précédents fichiers. En revanche, d’une séance de travail à une autre, comme l’incrémentation commence toujours à zéro, vous écraserez les fichiers créés la veille par le même programme. Avec SAS 9.1, le nom de votre fichier graphique ne pouvait pas dépasser 8 caractères. Avec SAS 9.2, vous avez droit à 256 caractères pour nommer votre fichier graphique2. 8.2.2 Plusieurs procédures dans une sortie unique Il est toujours possible de limiter les données qui pourraient apparaître dans votre tableau au moyen des commandes propres à chaque procédure. Programme 8.5 ODS HTML PATH=ODSOUT BODY='85_1body.html'; PROC MEANS DATA=vente NONOBS MEAN MIN MAX MAXDEC=1; VAR ca; RUN; ODS HTML CLOSE; Le tableau résultant du programme 8.5 n’affichera pas le nombre d’observations et indiquera seulement la moyenne, le minimum et le maximum avec pas plus d’un chiffre après la virgule. Les outils, comme TITLE ou FOOTNOTE, que nous avons déjà évoqués pour présenter les résultats dans la fenêtre SORTIE, peuvent être utilisés. Vous pouvez associer à ces commandes les options de présentation (couleur, hauteur du texte, justification…) vues au chapitre 7 consacré à SAS/GRAPH mais retenez qu’ODS offre des outils de mise en forme des textes beaucoup plus puissants que ceux que nous avons rencontrés jusqu’à maintenant. Ces outils sont examinés dans la section 8.5.4. 1. En revanche, si vous exécutez plusieurs fois le même programme, vous n’aurez sur votre disque dur que le fichier produit par votre dernière exécution. 2. Vous verrez cependant dans la fenêtre JOURNAL que seuls les huit premiers caractères de votre nom de fichier sont affichés. Sur votre disque dur, votre fichier graphique aura bien le nom demandé. SAS Livre Page 340 Jeudi, 18. septembre 2008 6:03 18 340 ◆ SAS Programme 8.6 ODS HTML PATH=ODSOUT BODY='86_1body.html'; TITLE COLOR=red "Entreprise Riz-Export"; TITLE2 "CA moyen par commande"; FOOTNOTE JUSTIFY=RIGHT H=10pt COLOR=red 'Année 2007'; PROC MEANS DATA=vente NONOBS MEAN MIN MAX MAXDEC=5; VAR ca; RUN; ODS HTML CLOSE; Jusqu’à présent, nous n’avons dans notre résultat HTML que le fruit d’une seule procédure. Il est tout à fait possible d’inclure dans la fenêtre de résultats HTML plusieurs résultats de procédures comme l’illustre le programme 8.7. Programme 8.7 ODS HTML PATH=ODSOUT BODY='87_1body.html' STYLE=gears; FOOTNOTE; TITLE "Données mensuelles"; TITLE2 "Ventes par division"; PROC MEANS DATA=vente NONOBS MEAN SUM MAXDEC=2; CLASS departement; VAR nombre; RUN; TITLE2 "Ventes par produit"; PROC MEANS DATA=vente NONOBS MEAN SUM MAXDEC=2; CLASS produit; VAR nombre; RUN; TITLE2 "Chiffre d’affaires par département"; PROC MEANS DATA=vente NONOBS MEAN SUM MAXDEC=2; CLASS departement; VAR ca; RUN; PROC UNIVARIATE DATA=vente; VAR ca; RUN; PROC GCHART DATA=vente; VBAR produit / SUBGROUP=departement SUMVAR=nombre DISCRETE NAME='G87'; RUN; ODS HTML CLOSE; STYLE=gears demande à ODS d’utiliser le style gears pour présenter les résultats. Avec SAS 9.2, ce style s’appliquera à tous les résultats, y compris au graphique demandé. Avec SAS 9.1, le graphique ressemblera à un copier-coller de votre fenêtre GRAPH. Il est possible que les lettres accentuées ne s’affichent pas correctement (voir section 7.2.2.). Avec SAS 9.1, les résultats de chaque procédure sont séparés par des barres au sein d’un unique résultat dans la fenêtre RESULTS VIEWER. Avec SAS 9.2, les résultats sont présentés sur des pages distinctes. À partir de la fenêtre RESULTS VIEWER, vous pouvez naviguer entre vos divers résultats grâce aux flèches gauche et droite de la barre d’outils. SAS Livre Page 341 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 341 8.2.3 Introduction de tables des matières1 Vous avez la possibilité, pour naviguer simplement entre vos différents résultats, de créer à gauche de votre écran une table des matières. Remplacez la ligne du programme 8.7 : ODS HTML PATH=ODSOUT BODY='86_1body.html' STYLE=gears; Par la ligne : Programme 8.8 ODS HTML PATH=ODSOUT BODY='88_1body.html' STYLE=gears CONTENTS='88_1contenu.html' FRAME='88_1cadre.html' NEWFILE=PROC; Et relancez le programme2. Ce programme va générer la création de huit fichiers dans le répertoire que vous avez défini comme ODSOUT : • Cinq fichiers BODY (88_1body, 88_2body…). Dans ces fichiers seront reproduits respectivement le résultat issu de la première procédure (88_1), puis de la deuxième (88_2), etc. • Un fichier 88_1contenu.html qui contient uniquement la table des matières. • Le fichier 88_1cadre.html construit le lien entre la table des matières et les différents fichiers BODY. C’est ce dernier fichier que vous devrez ouvrir au moyen de votre navigateur si vous souhaitez naviguer entre vos divers résultats. Résultat 8.3 La commande NEWFILE=PROC demande la création d’un fichier BODY par procédure. Plusieurs valeurs sont possibles pour NEWFILE : NEWFILE=PAGE Un fichier HTML est créé par page (une procédure unique peut produire plusieurs pages3). 1. Les tables des matières semblent particulièrement mal gérées par Mozilla Firefox. 2. N’oubliez pas de modifier le nom du graphique généré en G88. 3. Par exemple, une procédure PROC REG dans laquelle vous introduisez une instruction TEST. SAS Livre Page 342 Jeudi, 18. septembre 2008 6:03 18 342 ◆ SAS NEWFILE=OUTPUT Création d’une page par OUTPUT : les cinq sorties générées par PROC UNIVARIATE seront présentées non pas dans un fichier HTML unique mais dans cinq fichiers distincts. NEWFILE=NONE (fonctionnement par défaut) Toutes les sorties sont mises dans un fichier unique. Dans le cas NEWFILE=OUTPUT, avec le programme 8.8, ce sont douze fichiers qui sont créés (neuf BODY, un fichier CONTENTS, un fichier FRAME et le fichier PNG qui reprend le graphique). Si vous devez transmettre vos résultats, prenez bien garde à transmettre tous vos fichiers. 8.2.4 Paramétrer la table des matières – première partie Vous disposez de plusieurs outils pour paramétrer la partie « table des matières » de votre sortie HTML. Votre table des matières est pour l’instant telle que vous la voyez dans le résultat 8.3. C’est l’instruction CONTENTS= qui a permis de créer cette table des matières. Vous pouvez aussi utiliser une instruction PAGE=‘fichier.html’ : vous créerez alors une table des matières par page. Les termes « statistiques descriptives » seront remplacés par page 1, page 2, etc. Si vous maintenez les deux instructions simultanément, vous obtiendrez deux tables des matières, une par page et une par type de sortie1. Quel que soit le type de table des matières, vous avez la possibilité de remplacer les intitulés de procédures par le texte de votre choix via l’instruction ODS PROCLABEL. Le programme 8.9 illustre les possibilités de cette dernière instruction. Programme 8.9 ODS HTML PATH=ODSOUT BODY='89_1body.html' STYLE=gears NEWFILE=OUTPUT CONTENTS='89_1contenu.html' FRAME='89_1cadre.html'; TITLE "Données mensuelles"; TITLE2 "Ventes par division"; ODS PROCLABEL 'Nombre de ventes par division'; PROC MEANS DATA=vente NONOBS MEAN SUM MAXDEC=2; CLASS departement; VAR nombre; RUN; 1. Pour les utilisateurs de SAS 9.1 uniquement : si vous utilisez la construction de table des matières avec l’instruction PAGE=, vous devrez impérativement ajouter l’option (URL=NONE) après l’instruction PATH=ODSOUT. Vous ne pourrez pas naviguer entre vos divers résultats si cette option n’est pas précisée. Cette option (URL=NONE) doit, quelle que soit votre version de SAS, être ajoutée à la suite de l’instruction PATH si vous placez vos fichiers HMTL sur un serveur Internet. Elle permet en effet un adressage des fichiers HTML en relatif plutôt qu’en absolu. SAS Livre Page 343 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 343 TITLE2 "Ventes par produit"; PROC MEANS DATA=vente NONOBS MEAN SUM MAXDEC=2; CLASS produit; VAR nombre; RUN; TITLE2 "Chiffre d’affaires par département"; ODS PROCLABEL 'CA par division'; PROC MEANS DATA=vente NONOBS MEAN SUM MAXDEC=2; CLASS departement; VAR CA; RUN; PROC UNIVARIATE DATA=vente; VAR CA; RUN; PROC GCHART DATA=vente; VBAR produit / SUBGROUP=departement SUMVAR=nombre DISCRETE NAME="G89"; RUN; ODS HTML CLOSE; Résultat 8.4 Votre instruction ODS PROCLABEL ne s’applique qu’à la sortie qui vient immédiatement après. Ainsi, il n’y a aucune instruction ODS PROCLABEL avant la seconde sortie (le second PROC MEANS) et on retrouve dans la table des matières l’intitulé par défaut (The Means Procedure). En revanche, à l’intérieur du cadre des résultats (le cadre de droite), l’intitulé « Procédure MEANS » ne disparaît pas avec la commande ODS PROCLABEL. Si vous souhaitez que les titres évoquant la procédure utilisée disparaissent, vous ajoutez, au début de votre programmation : ODS NOPTITLE; Cette commande n’enlèvera cependant pas le nom de la procédure utilisée dans la partie « table des matières » de votre sortie HTML. Vous devrez employer l’option ODS NOPTITLE (ou son alias ODS NOPROCTITLE) pour retirer l’intitulé par défaut de la partie « données » de votre tableau et ODS PROCLABEL pour retirer (ou modifier) le titre par défaut de la partie « table des matières ». SAS Livre Page 344 Jeudi, 18. septembre 2008 6:03 18 344 ◆ SAS Vous remarquerez enfin, pour la dernière sortie générée, dans la table des matières, un sous-titre peu engageant : « Bar Chart of produit ». Pour modifier ce sous-titre, vous devez intervenir dans PROC GCHART en spécifiant l’option DESCRIPTION de VBAR : PROC GCHART DATA=vente; VBAR produit / SUBGROUP=departement SUMVAR=nombre DISCRETE NAME="810_1gr" DESCRIPTION="Représentation graphique"; RUN; Cette option DESCRIPTION= est disponible dans l’ensemble des procédures issues de SAS/GRAPH. Nous traiterons de nouveau de la personnalisation des tables des matières dans les sections 8.3.6. et 8.5.7. 8.2.5 Personnaliser vos sorties – ODS TRACE Jusqu’à présent, nous n’avons agi que sur certaines parties de la sortie : • les titres et les pieds de pages (TITLE, FOOTNOTE, ODS NOPTITLE) ; • le mode de présentation de la sortie par l’introduction de pages et de tables des matières ; • les intitulés de la table des matières (ODS PROCLABEL). Nous savons déjà agir en partie sur les sorties en intervenant sur les options des procédures utilisées (nous savons ainsi personnaliser nos graphiques, nos tableaux grâce à la syntaxe des différentes procédures utilisées). Ce qu’il nous reste à voir, c’est comment agir sur les éléments qui composent une sortie. Il nous faut déjà comprendre ce que sont ces éléments à l’aide de la commande ODS TRACE. Après avoir déterminé les éléments qui composent une sortie, nous introduirons la commande ODS OUTPUT dans la section 8.2.8. Programme 8.10 ODS TRACE ON; TITLE "Données mensuelles"; TITLE2 "Ventes par division"; PROC MEANS DATA=vente NONOBS MEAN SUM MAXDEC=2; CLASS departement; VAR nombre; RUN; ODS TRACE OFF; La commande ODS TRACE ON va générer dans la fenêtre JOURNAL un listing des éléments qui composent votre sortie avec leurs références internes à SAS. Si vous souhaitez que votre listing apparaisse plutôt dans la fenêtre SORTIE, vous emploierez alors la commande ODS TRACE ON / LISTING. Suite au PROC MEANS demandé, il apparaît dans la fenêtre JOURNAL les informations suivantes : Sortie ajoutée : ------------Nom : Summary Libellé : Statistiques descriptives Modèle : base.summary Chemin : Means.Summary ------------- SAS Livre Page 345 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 345 La sortie que vous avez dans la fenêtre SORTIE est appelée SUMMARY ; un libellé (LABEL) est associé à cette sortie (Statistiques descriptives). Le modèle (TEMPLATE) que l’on applique pour présenter les résultats s’appelle BASE.SUMMARY ; BASE est le dossier dans lequel SAS stocke ces modèles (TEMPLATE) qu’il utilise par défaut – le modèle à utiliser s’appelle ici SUMMARY. Nous comprendrons mieux l’intérêt du chemin (PATH) avec le programme 8.11. ODS TRACE vous sera essentiellement utile dans le cas de procédures générant plusieurs sorties, comme PROC UNIVARIATE. Programme 8.11 ODS TRACE ON; TITLE; PROC UNIVARIATE DATA=vente; VAR nombre; RUN; ODS TRACE OFF; La description des sorties vous est donnée dans votre fenêtre JOURNAL : Sortie ajoutée : ------------Nom : Moments Libellé : Moments Modèle : base.univariate.Moments Chemin : Univariate.nombre.Moments ------------Sortie ajoutée : ------------Nom : BasicMeasures Libellé : Mesures de base de position et de dispersion Modèle : base.univariate.Measures Chemin : Univariate.nombre.BasicMeasures ------------Sortie ajoutée : ------------Nom : TestsForLocation Libellé : Tests de position Modèle : base.univariate.Location Chemin : Univariate.nombre.TestsForLocation ------------Sortie ajoutée : ------------Nom : Quantiles Libellé : Quantiles Modèle : base.univariate.Quantiles Chemin : Univariate.nombre.Quantiles ------------Sortie ajoutée : ------------Nom : ExtremeObs Libellé : Observations extrêmes Modèle : base.univariate.ExtObs Chemin : Univariate.nombre.ExtremeObs ------------- SAS Livre Page 346 Jeudi, 18. septembre 2008 6:03 18 346 ◆ SAS Le chemin (PATH) résume les informations que vous pouvez avoir sur une sortie particulière. Dans le cas de sorties multiples, il a la structure suivante : procédure utilisée.variable analysée.nom de l’élément dans la sortie Pour limiter vos sorties et ne faire apparaître que certains éléments en cas de sorties multiples, vous emploierez la commande ODS SELECT. 8.2.6 ODS SELECT Si vous ne souhaitez afficher que les informations relatives aux observations extrêmes : Programme 8.12 ODS SELECT ExtremeObs; ODS HTML PATH=ODSOUT BODY='812_1body.html'; PROC UNIVARIATE DATA=vente; VAR nombre; RUN; ODS HTML CLOSE; Nous avons écrit ici le nom de l’élément de la sortie grâce à ODS TRACE, de la même manière que pour la sortie qui apparaissait dans la fenêtre JOURNAL. Nous aurions pu l’écrire uniquement avec des minuscules, ce qui n’aurait pas empêché SAS de ne présenter que les informations relatives aux observations extrêmes. La commande ODS SELECT intervient dans le programme 8.12 avant la commande de création du fichier HTML ; elle pouvait tout à fait intervenir juste après celle-ci. Si vous souhaitez voir apparaître plusieurs éléments d’une sortie, la syntaxe ne subira alors pas de modification majeure : ODS SELECT ExtremeObs TestsForLocation; Attention, cependant ! Il n’est pas possible ici d’agir sur l’ordre dans lequel vont apparaître les différentes sorties demandées. Les sorties apparaissent dans l’ordre de leur production par SAS. Si, plutôt que de sélectionner les éléments d’une sortie qui vous intéressent, vous souhaitez plutôt exclure certains éléments, vous passerez par ODS EXCLUDE. ODS EXCLUDE ExtremeObs ; Imaginons maintenant que vous ayez plusieurs procédures identiques à effectuer mais qu’au sein de chacune des procédures, vous souhaitez ne conserver qu’un seul élément de la sortie (les observations extrêmes, par exemple). Si vous demandez l’exécution du programme 8.131 : Programme 8.13 ODS SELECT ExtremeObs; ODS HTML PATH=ODSOUT BODY='813_1body.html'; PROC UNIVARIATE DATA=vente; 1. Les deux variables analysées appartenant à la même table, cette programmation n’est pas optimale. On peut imaginer que les deux variables que l’on souhaite analyser appartiennent à deux tables différentes. SAS Livre Page 347 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 347 VAR nombre; RUN; PROC UNIVARIATE DATA=vente; VAR CA; RUN; ODS HTML CLOSE; Vous constaterez que votre sortie HTML présente bien les valeurs extrêmes pour la première variable analysée mais offre l’intégralité des résultats sur la seconde variable analysée. En fait, ODS SELECT ne fonctionne que pour la procédure exécutée immédiatement après (même principe que ODS PROCLABEL). Si vous souhaitez que soit sélectionné toujours le même élément de la sortie, vous devez soit ajouter une nouvelle commande ODS SELECT avant le second PROC UNIVARIATE, soit ajouter l’option PERSIST dans votre commande ODS SELECT (ou ODS EXCLUDE) initiale. Programme 8.14 ODS SELECT ExtremeObs (PERSIST); ODS HTML PATH=ODSOUT BODY='814_1body.html'; PROC UNIVARIATE DATA=vente; VAR nombre; RUN; PROC UNIVARIATE DATA=vente; VAR CA; RUN; ODS HTML CLOSE; ODS SELECT ALL; Veuillez noter cependant que l’option PERSIST « persistera » jusqu’à ce que vous l’annuliez au moyen de la commande ODS SELECT ALL. La commande PERSIST est une commande dangereuse. Si vous réalisez par la suite une autre procédure (un PROC FREQ, par exemple), vous risquez d’avoir de sérieuses difficultés parce qu’il n’y a pas d’élément EXTREMEOBS dans la procédure PROC FREQ. En fait, vous n’aurez aucune sortie et risquez d’en chercher longtemps la cause puisqu’aucun message d’erreur n’apparaît dans votre fenêtre JOURNAL. Vous devinez que vous pouvez maintenant faire apparaître les éléments dans un ordre différent de celui de leur production par SAS : Programme 8.15 ODS HTML PATH=ODSOUT BODY='815_1body.html'; ODS SELECT ExtremeObs; PROC UNIVARIATE DATA=vente; VAR nombre; RUN; ODS SELECT TestsForLocation; PROC UNIVARIATE DATA=vente; VAR nombre; RUN; ODS HTML CLOSE; Ceci vous oblige cependant à exécuter deux fois la même procédure, ce qui, dans le cas d’une procédure intensive en calculs, peut devenir problématique. SAS Livre Page 348 Jeudi, 18. septembre 2008 6:03 18 348 ◆ SAS Nous souhaitons exploiter dans notre table une partie des résultats obtenus en lançant le programme 8.16. Programme 8.16 PROC FREQ DATA=vente; TABLES nombre produit departement / CHISQ; RUN; Avec un ODS TRACE, vous apprenez que six éléments composent cette sortie (trois tris à plat et trois tests de Khi2). Comme nous l’avons déjà vu, chacun de ces éléments se caractérise par un nom, un libellé (LABEL), un modèle et un chemin (PATH). Dans une instruction ODS SELECT (ou EXCLUDE), pour appeler un élément de la sortie, vous pouvez utiliser son nom, son libellé ou son chemin. Pour obtenir uniquement les tris à plat proposés par PROC FREQ : ODS SELECT onewayfreqs; ODS SELECT 'Fréquences à un critère de classification' ; Attention à cette dernière requête : le respect des majuscules/minuscules est essentiel pour que SAS retrouve bien ce que vous lui demandez. Pour obtenir ces tris à plat uniquement pour les variables NOMBRE et PRODUIT : ODS SELECT Freq.table1.Onewayfreqs table2.Onewayfreqs; ODS SELECT Onewayfreqs#1 Onewayfreqs#2; ODS SELECT 'Fréquences à un critère de classification'#1 'Fréquences à un critère de classification'#2; 8.2.7 Destinations multiples des sorties Les résultats reproduits dans votre fenêtre SORTIE sont identiques à ceux de votre sortie HTML. Les commandes SELECT/EXCLUDE s’appliquent donc à tous les types de sorties que vous générez. Il est possible de limiter le nombre de sorties uniquement pour certaines destinations. Ainsi, si votre programme est : Programme 8.17 ODS LISTING SELECT ExtremeObs; ODS HTML PATH=ODSOUT BODY='817_1body.html'; PROC UNIVARIATE DATA=vente; VAR nombre; RUN; ODS HTML CLOSE; Vous aurez dans votre fenêtre RESULTS VIEWER l’ensemble des éléments qui composent une sortie de PROC UNIVARIATE et, dans la fenêtre SORTIE, uniquement l’élément EXTREMEOBS. Si votre programme est : Programme 8.18 ODS LISTING SELECT ExtremeObs; ODS HTML PATH=ODSOUT BODY='818_1body.html'; SAS Livre Page 349 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 349 ODS HTML SELECT Quantiles; PROC UNIVARIATE DATA=vente; VAR nombre; RUN; ODS HTML CLOSE; Vous aurez dans votre fenêtre SORTIE uniquement l’élément EXTREMEOBS et, dans la fenêtre HTML, l’élément QUANTILES. Enfin, si vous omettez la première ligne, dans votre fenêtre SORTIE, vous aurez l’intégralité des éléments qui composent la sortie alors que dans la fenêtre HTML, seul l’élément QUANTILES apparaîtra. Attention, il faut cependant que votre instruction ODS HTML SELECT apparaisse après l’instruction de création de fichier (mais ODS SELECT, sans spécification de la destination ODS, peut intervenir avant ou après l’instruction de création du fichier HTML). La commande ODS _destination_ TEXT=‘texte de votre choix’1 permet d’introduire un texte avant ou après le résultat de la procédure. Vous avez donc la possibilité, si vous créez en même temps un résultat en HTML et un résultat en PDF par exemple, d’indiquer certains commentaires uniquement disponibles dans le résultat HTML et d’autres uniquement disponibles pour la sortie PDF. …; ODS PDF TEXT='Texte uniquement pour le PDF'; ODS HTML TEXT='Texte uniquement pour le fichier HTML'; …; 8.2.8 ODS OUTPUT Dans le programme 8.3, vous avez noté la présence d’une commande ODS OUTPUT : ODS OUTPUT Stats=Temp1; PROC TEMPLATE; LIST; RUN; ODS OUTPUT CLOSE; Ce programme permet de construire une table (TEMP1) dans laquelle est placée la liste des TEMPLATE disponibles dans votre version de SAS (et parmi ces TEMPLATE, nous avons besoin des STYLE utilisables par ODS). STATS est le nom de la sortie présentant la liste de ces TEMPLATE. ODS OUTPUT permet donc de transformer un élément d’une sortie SAS en une table SAS. Cette commande est donc déjà utile pour créer des tables de sorties pour les procédures qui ne disposent pas d’instruction OUTPUT. Pour mieux comprendre les possibilités d’ODS OUTPUT, nous allons exécuter le programme 8.19. Programme 8.19 PROC SORT DATA=vente; BY departement; RUN; 1. Cette commande ne sera pas utilisée dans cette section consacrée à ODS HTML et sera plus particulièrement explorée dans les sections 8.5.2. et suivantes consacrées à ODS PDF. SAS Livre Page 350 Jeudi, 18. septembre 2008 6:03 18 350 ◆ SAS ODS TRACE ON; PROC UNIVARIATE DATA=vente; BY departement; VAR nombre; RUN; ODS TRACE OFF; Vous constaterez dans votre fenêtre JOURNAL que votre sortie de PROC UNIVARIATE est composée de 20 éléments (4 modalités à la variable DEPARTEMENT * 5 éléments de sortie par défaut dans PROC UNIVARIATE). Si votre instruction ODS OUTPUT est de la forme : ODS OUTPUT BasicMeasures=temp; Vous obtiendrez dans la table TEMP les informations de l’élément BasicMeasures pour les quatre modalités de la variable DEPARTEMENT. Une commande équivalente est : ODS OUTPUT 'Mesures de base de position et de dispersion'=temp; ODS OUTPUT BasicMeasures#3=temp; Vous obtiendrez alors dans votre table TEMP uniquement les informations de BASICMEASURES pour la troisième modalité de votre variable BY (« grossiste »). Une commande équivalente est : ODS OUTPUT Univariate.ByGroup3.nombre.BasicMeasures=temp; ODS OUTPUT BasicMeasures(MATCH_ALL=tt)=temp1; Vous obtiendrez autant de tables TEMP que vous aurez d’éléments BasicMeasures dans votre sortie. L’option MATCH_ALL crée une macro-variable TT1 dans laquelle vont être stockés les noms des tables créées. Pour afficher cette liste dans votre JOURNAL, exécutez %PUT &TT;. Vous pouvez utiliser cette macro-variable dans vos programmes ultérieurs : DATA test; SET &tt; * équivalent à SET TEMP1 TEMP2 TEMP3 TEMP42; RUN; En revanche, si votre programme est de la forme : Programme 8.20 ODS OUTPUT BasicMeasures=temp1; PROC UNIVARIATE DATA=vente; VAR nombre; RUN; PROC UNIVARIATE DATA=vente; VAR CA; RUN; ODS OUTPUT CLOSE; 1. Voir chapitre 9. 2. Si l’instruction de création de tables avait été ODS OUTPUT BasicMeasures(MATCH_ALL=tt)=temp, les quatre tables créées auraient été TEMP, TEMP1, TEMP2 et TEMP3. SAS Livre Page 351 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 351 Dans ce cas, dans votre table TEMP1, vous aurez uniquement l’élément BasicMeasures obtenu de l’analyse de la variable NOMBRE. Pour que votre table créée comprenne les deux éléments BasicMeasures, votre instruction ODS OUTPUT sera de la forme suivante1 : ODS OUTPUT BasicMeasures(PERSIST=PROC)=temp1 ; Avec l’instruction suivante : ODS OUTPUT BasicMeasures(MATCH_ALL=ttt)=temp1; Deux tables seront créées : une pour les BasicMeasures de NOMBRE et la seconde pour les BasicsMeasures de CA. Si la commande ODS OUTPUT permet de créer des fichiers d’OUTPUT avec des procédures qui ne disposent pas de cette instruction, c’est aussi l’instruction qui, dans le cas de macro-programmes dans lesquels une procédure est exécutée un certain nombre de fois, vous permettra de sauvegarder dans une table les résultats obtenus à chaque exécution de votre procédure. 8.2.9 Faciliter la navigation sur Internet Si vous utilisez ODS HTML, c’est bien entendu dans le but de présenter vos résultats sur Internet. Nous avons vu que l’introduction d’une table des matières permettait déjà de naviguer entre les divers résultats que vous avez réalisés au cours d’une même instruction ODS HTML. Maintenant, imaginons que vos résultats aient été construits en plusieurs étapes ODS HTML. Si vous avez déjà conçu des sites Internet simples, vous vous dites qu’il suffit de construire une page d’accueil qui permet d’accéder aux divers résultats lorsqu’une simple table des matières ne suffit plus. Une fois que vous êtes sur un des résultats, comment faire pour continuer votre navigation, soit vers votre page d’accueil, soit vers une page externe, explicative de vos résultats par exemple ? Comment intégrer un lien vers votre adresse e-mail de façon que vos lecteurs puissent vous féliciter de vos résultats ? C’est en fait très simple puisque vous pouvez, au sein d’ODS HTML, utiliser les ressources du langage HTML. Ces éléments de langage HTML peuvent être introduits à deux niveaux : soit dans la définition de votre STYLE, soit dans les titres ou les pieds de pages. Pour cet ouvrage, nous nous contenterons d’agir uniquement sur les titres et les pieds de pages. Il ne s’agit pas ici de faire de vous un spécialiste du langage HTML mais de vous donner quelques « codes » particulièrement utiles. Pour plus d’informations sur le sujet, consultez les très nombreux SUGI PAPERS2 : www.lexjansen.com/sugi/ Dans cette section, nous utiliserons le résultat proposé par le programme 8.21. 1. L’option PERSIST=PROC pourra ne pas fonctionner si, parmi les procédures que vous utilisez, se trouve une instruction BY. La table créée sera fermée immédiatement après l’exécution de la procédure contenant ce BY. L’instruction CLASS ne pose pas de problème et devra être utilisée dans ce cas. 2. Faites une recherche sur ODS HTML PREHTML. Les articles de Lauren C. Haworth sur le sujet sont généralement très intéressants – voir aussi son site : www.laurenhaworth.com/. SAS Livre Page 352 Jeudi, 18. septembre 2008 6:03 18 352 ◆ SAS Programme 8.21 DATA test; DO i=1 TO 16; x1=ROUND(RANUNI(123)+1); x2=ROUND(RANUNI(234)+1); OUTPUT; END; DROP i; RUN; TITLE; FOOTNOTE; ODS NOPTITLE; ODS HTML BODY='821_1body.html' PATH=ODSOUT STYLE=default; PROC FREQ DATA=test; TABLES x1*x2; RUN; ODS HTML CLOSE; Si vous souhaitez revenir à la page qui vient de vous envoyer vers ce résultat, le plus simple est de créer un bouton BACK. Programme 8.22 ODS HTML BODY='822_1body.html' PATH=ODSOUT STYLE=default; PROC FREQ DATA=test; TABLES x1*x2; FOOTNOTE1 "Retour vers le site d’où je viens"; FOOTNOTE2 '<INPUT TYPE="button" VALUE="Cliquer ici" onClick="history. go(-1);"> '; RUN; ODS HTML CLOSE; Vous avez aussi la possibilité d’introduire un ou plusieurs liens vers d’autres sites Internet (les pieds de pages du programme 8.22 sont conservés). Programme 8.23 ODS HTML BODY='823_1body.html' PATH=ODSOUT STYLE=default; PROC FREQ DATA=test; TABLES x1*x2; TITLE 'Allons sur le site du'; TITLE2 '<A HREF="http://www.univ-orleans.fr/deg/masters/ESA/">Master ESA</A> ou sur le <A HREF="http://www.master-esa.com">forum</A>'; TITLE3 '<A HREF="http://www.sas.com">SAS</A> a créé ce tableau <A></A>'; TITLE4 '<A></A> Cet ouvrage est publié chez <A HREF=" http://www.pearsoneducation.fr">PEARSON</A>'; ;RUN; ODS HTML CLOSE; SAS Livre Page 353 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 353 Résultat 8.5 Quatre titres sont créés ici : le premier contient uniquement du texte standard ; le deuxième, un lien, puis du texte, puis un autre lien ; le troisième, un lien, puis du texte ; le dernier, un texte, puis un lien. Pour les titres contenant texte et lien : • Il faut absolument que vous débutiez votre titre par la commande HMTL <A. Si un texte suit, fermez cette commande par ></A> avant d’entrer votre texte. • Il faut absolument que vous terminiez votre titre par la commande HTML /A>. Si un texte précède cette commande, introduisez après votre texte <A><. Exemple : TITLE5 '<A></A>Le lien est <A HREF="http://www.sas.com">au milieu</A> du texte <A></A>'; La commande HTML pour créer un lien est : <A HREF="http://www.sas.com">texte sur lequel cliquer</A> En cliquant sur « texte sur lequel cliquer », vous irez vers le site www.sas.com. Étant donné que les adresses des sites que vous voulez atteindre sont nécessairement entre guillemets doubles, votre titre complet devra impérativement être entre guillemets simples. Si, dans un titre contenant du code HTML, vous avez besoin d’une apostrophe, vous remplacerez cette dernière par le code Ƈ. Enfin, si vous souhaitez que vos visiteurs vous contactent pour commenter vos résultats, un peu de langage HTML peut vous aider (les titres et les pieds de pages définis dans les programmes 8.31 et 8.32 sont conservés) : Programme 8.24 ODS HTML BODY='824_1body.html' PATH=ODSOUT STYLE=default; 1. Pour une table reprenant les codes des caractères spéciaux, voir : www.webmonkey.com/reference/special_characters/. SAS Livre Page 354 Jeudi, 18. septembre 2008 6:03 18 354 ◆ SAS PROC FREQ DATA=test; TABLES x1*x2; FOOTNOTE3 JUSTIFY=c '<A></A> Un commentaire : <A HREF="mailto:[email protected]?subject=bravo !">écrivez moi !</A>'; TITLE5 '<A></A>Le lien est <A HREF="http://www.sas.com">au milieu</A> du texte <A></A>'; RUN; ODS HTML CLOSE; Résultat 8.6 La commande HTML est dans ce cas : <A HREF="mailto:[email protected]?subject=bravo !">écrivez moi !</A> [email protected] est l’adresse à contacter. Le sujet du mail sera « bravo ! » et c’est en cliquant sur « écrivez moi » que votre logiciel de courrier électronique créera le message. Pour plus de détails sur la syntaxe de MAILTO, voir le site suivant : www.ianr.unl.edu/internet/mailto.html Si votre sortie HTML contient des graphiques, vous constaterez que les titres et les pieds de pages sont intégrés au graphique et qu’ils sont exactement identiques à ce que vous avez saisi : les éléments du langage HTML ne sont pas compris et ne sont donc pas transformés en liens. La solution ici consiste à demander en GOPTIONS DEVICE=JAVAIMG. Les titres et les pieds de pages sont alors sortis du graphique et les commandes HTML sont interprétées. Vous constaterez que l’aspect de votre graphique est légèrement modifié1. 1. Utilisateurs de SAS 9.1 : c’est uniquement avec GOPTIONS=JAVAIMG que vous pourrez obtenir un graphique auquel le STYLE que vous avez choisi sera appliqué. Sans cette option, votre graphique ressemblera toujours à un copier-coller de votre fenêtre GRAPH. SAS Livre Page 355 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 355 8.3 Agir sur votre environnement – la procédure PROC TEMPLATE L’environnement que vous utilisez pour produire vos résultats est résumé sous le terme de STYLE. Nous avons vu dans l’introduction de ce chapitre l’ensemble des STYLE dont vous pouvez disposer. Cette notion de STYLE a déjà été évoquée au cours du chapitre 6 lorsque nous avons détaillé les procédures PROC PRINT, PROC REPORT et PROC TABULATE. Elle a aussi été abordée dans le chapitre 7 consacré à SAS/GRAPH (voir section 7.4.). Nous allons chercher ici à modifier ces STYLE vers quelque chose que vous jugeriez plus à votre goût. Un STYLE est composé de blocs. Pour examiner ces blocs, vous pouvez exécuter le programme 8.25. Programme 8.25 PROC TEMPLATE; SOURCE styles.default; RUN; Et vous observerez dans votre fenêtre JOURNAL près de 600 lignes, divisées en 153 blocs (CLASS) qui composent votre style. Pour chaque bloc, vous observez ce que nous appellerons par la suite des attributs. Un style est donc constitué de très nombreux éléments et c’est au moyen de PROC TEMPLATE que vous allez pouvoir créer et surtout modifier un STYLE existant. Pour de nombreux utilisateurs expérimentés de SAS, la procédure PROC TEMPLATE est une des plus compliquées qui soient. Ce n’est pas faux mais nous verrons que dans la plupart des cas, sans (presque) rien connaître de PROC TEMPLATE, vous pouvez simplement et rapidement personnaliser votre style d’affichage. Les choses sont déjà plus simples qu’il n’y paraît puisque vous avez la possibilité de redéfinir un style (DEFINE) en partant d’un style PARENT déjà existant au moyen de la commande suivante (à ne pas exécuter pour l’instant) : PROC TEMPLATE; DEFINE STYLE lemien; PARENT = styles.default; … Il s’agit ensuite uniquement de modifier les caractéristiques des blocs du style qui vous intéressent. Vous conserverez, pour les blocs non modifiés, les attributs du style PARENT. 8.3.1 La détermination des blocs de style à modifier Il s’agissait là de la principale difficulté puisqu’il fallait découvrir, parmi les 153 blocs d’un style, celui qui pouvait bien correspondre à l’élément de la sortie que l’on souhaitait modifier. C’est en fait très simple. Le programme 8.26 reprend le programme que propose Lauren Haworth dans cet article : www2.sas.com/proceedings/sugi31/112-31.pdf SAS Livre Page 356 Jeudi, 18. septembre 2008 6:03 18 356 ◆ SAS Programme 8.26 ODS MARKUP PATH=ODSOUT BODY='826_1body.html' NEWFILE=OUTPUT CONTENTS='826_1contenu.html' FRAME='826_1cadre.html' TAGSET=tagsets.style_popup; ODS NOPTITLE; TITLE 'Déterminer les blocs de style à modifier'; FOOTNOTE 'Merci à Lauren Haworth'; PROC MEANS DATA=vente; CLASS produit; VAR nombre; RUN; ODS MARKUP CLOSE; Vous remarquez deux différences entre ce programme et les programmes que nous avons examinés jusqu’à maintenant : • le remplacement de HTML par MARKUP ; • l’introduction d’une option TAGSET=TAGSETS.STYLE_POPUP;. ODS MARKUP ne sera pas développé dans cet ouvrage et ne sera utilisé que dans cette section. Cette procédure semble être appelée à remplacer dans l’avenir un nombre important de procédures ODS actuelles puisqu’elle est capable de produire des fichiers CSV, cHTML, HTML 4.0, XHTML, LaTeX, XLS…1 Exécutez maintenant ce programme et rendez-vous dans la fenêtre RESULTS VIEWER. Résultat 8.7 Lorsque vous passez le curseur de la souris sur un élément de la sortie, celui-ci change de couleur. Cliquez sur un élément et une fenêtre PROC TEMPLATE SYNTAX s’ouvrira. Les éléments de style qui s’affichent dans cette fenêtre caractérisent la partie de la sortie que vous avez sélectionnée : vous pouvez les copier et les coller dans votre fenêtre de programmation afin de modifier, par exemple, le style des cases du tableau (STYLE DATA). 1. Pour une introduction à ODS MARKUP, vous pouvez consulter support.sas.com/rnd/base/ods/odsmarkup/p236-31.pdf SAS Livre Page 357 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 357 Le résultat 8.7 est une copie d’écran de la fenêtre RESULTS VIEWER. Nous n’avons dans cette fenêtre que la partie BODY de la sortie HTML. Il est certain que les éléments de style qui s’appliquent à la table des matières que nous avons demandée devront aussi être modifiés. Ceci ne pose aucun problème. Avec votre navigateur Internet, ouvrez le fichier CADRE. Vos deux éléments BODY et CONTENU vont s’afficher et (il faut généralement autoriser le navigateur à l’activer) votre fenêtre PROC TEMPLATE SYNTAX va de nouveau vous donner tous les renseignements dont vous avez besoin. Ces renseignements sont à l’intérieur du fichier HTML : SAS ne doit pas être nécessairement installé sur votre ordinateur pour que cette fenêtre s’affiche. 8.3.2 La modification des polices utilisées Dans la partie BODY de la sortie (le tableau), quatre éléments de la sortie font appel à une police (TITLE, FOOTNOTE, HEADER et DATA). Nous souhaitons pour l’instant uniquement modifier la police utilisée pour présenter les résultats (DATA) afin d’avoir du TIMES plutôt que de l’ARIAL. Programme 8.27 PROC TEMPLATE; DEFINE STYLE lemien; PARENT = styles.default; STYLE Data / FONT_FACE = "Times, Helvetica, sans-serif" FONT_SIZE = 3 FONT_WEIGHT = medium FONT_STYLE = roman FOREGROUND = cx000000 BACKGROUND = cxd3d3d3; END; RUN; La partie en gras du programme 8.27 est un simple copier-coller de la fenêtre PROC TEMPLATE SYNTAX dans lequel nous avons remplacé ARIAL par TIMES. Nous avons ajouté en bas du programme une commande END qui termine nécessairement une commande DEFINE. Si vous exécutez le programme 8.27, puis à nouveau le programme 8.26 en demandant l’utilisation de votre style (STYLE=LEMIEN dans l’instruction ODS MARKUP), vous constaterez que cela fonctionne. Vous pourrez ensuite sélectionner les éléments les uns après les autres, reprendre les commandes données par la fenêtre PROC TEMPLATE SYNTAX et, en quelques minutes, construire le programme 8.28. Programme 8.28 (ce programme reprend le programme 8.27) PROC TEMPLATE; DEFINE STYLE lemien; PARENT = styles.default; STYLE Data / FONT_FACE = "Times, Helvetica, sans-serif" FONT_SIZE = 3 FONT_WEIGHT = medium FONT_STYLE = roman SAS Livre Page 358 Jeudi, 18. septembre 2008 6:03 18 358 ◆ SAS FOREGROUND = cx000000 BACKGROUND = cxd3d3d3; STYLE Header / FONT_FACE = "Times, Helvetica, sans-serif" FONT_SIZE = 4 FONT_WEIGHT = bold FONT_STYLE = roman FOREGROUND = cx0033aa BACKGROUND = cxb0b0b0; STYLE SystemFooter / FONT_FACE = "Times, Helvetica, sans-serif" FONT_SIZE = 5 FONT_WEIGHT = bold FONT_STYLE = italic FOREGROUND = cx002288 BACKGROUND = cxe0e0e0; STYLE SystemTitle / FONT_FACE = "Times, Helvetica, sans-serif" FONT_SIZE = 5 FONT_WEIGHT = bold FONT_STYLE = italic FOREGROUND = cx002288 BACKGROUND = cxe0e0e0; END; RUN; Résultat 8.8 La commande : PROC TEMPLATE; DEFINE STYLE lemien; PARENT = styles.default; est équivalente à un DATA/SET : si votre style LEMIEN existe déjà, il sera effacé. Il est donc impératif, si vous construisez votre STYLE en plusieurs étapes, d’exécuter toujours le même programme auquel vous allez ajouter vos modifications sur tel ou tel bloc. SAS Livre Page 359 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 359 La programmation dans laquelle vous déclareriez votre propre STYLE comme STYLE PARENT n’est pas possible1. Pour chaque élément de texte, plusieurs polices sont indiquées : ces commandes indiquent à SAS d’utiliser en priorité la première police listée, puis la deuxième, si la première n’existe pas dans le système de la personne qui va lire votre fichier, puis la troisième. Ayez bien à l’esprit que si, virtuellement, vous avez la possibilité d’utiliser toutes les polices disponibles dans votre ordinateur, votre choix est, en pratique, limité puisque le fichier HTML que vous allez créer va être lu par d’autres personnes et que si cellesci ne disposent pas de la police que vous avez utilisée, elles n’obtiendront pas le résultat que vous avez construit. Dans le cas où des fichiers HTML sont produits, il existe un certain nombre de polices qui peuvent être considérées comme sûres parce que présentes dans 95 % des ordinateurs. Il s’agit des polices : Pour maintenant modifier les polices utilisées dans le sommaire, vous devez ajouter aux quatre blocs modifiés par le programme 8.28 les blocs : Programme 8.29 (ajoutez ces blocs au programme 8.28) STYLE ContentItem / FONT_FACE = "Times, Helvetica, sans-serif" FONT_SIZE = 3 FONT_WEIGHT = medium FONT_STYLE = roman FOREGROUND = cx0033aa; STYLE ContentProcName / FONT_FACE = "Times, Helvetica, sans-serif" FONT_SIZE = 3 FONT_WEIGHT = medium FONT_STYLE = roman FOREGROUND = cx002288; STYLE ContentTitle / FONT_FACE = "Times, Helvetica, sans-serif" FONT_SIZE = 3 FONT_WEIGHT = medium FONT_STYLE = italic FOREGROUND = cx002288; En ce qui concerne FONT_SIZE, vous devez indiquer une taille comprise entre 1 et 7 : il s’agit là de tailles de caractères utilisées par le langage HTML qui seront ensuite interprétées par votre navigateur Internet. Les différentes options possibles de FONT_WEIGHT sont : MEDIUM, BOLD, DEMI_BOLD*, EXTRA_BOLD*, LIGHT, DEMI_LIGHT* et EXTRA_LIGHT* (les 1. Que ce soit avec SAS 9.1 ou SAS 9.2, la procédure PROC TEMPLATE s’exécute sans erreur. Cependant, si vous tentez d’utiliser ce style, vous aurez un message d’erreur dans votre fenêtre JOURNAL avec SAS 9.1 et une erreur sévère avec SAS 9.2. SAS Livre Page 360 Jeudi, 18. septembre 2008 6:03 18 360 ◆ SAS options indiquées avec * sont possibles avec un nombre très restreint de polices). Les différentes options possibles de FONT_STYLE sont : ITALIC, ROMAN et SLANT. Les attributs FOREGROUND indiqués ici sont relatifs à la couleur prise par la police. 8.3.3 Modifier l’allure d’un tableau Il s’agit ici d’agir sur le style des lignes qui marquent les cases du tableau. Toujours grâce au programme 8.26, nous apprenons que le bloc qui définit cette partie du style est le bloc TABLE. Les quatre derniers attributs de TABLE vont plus particulièrement nous intéresser. Par défaut, ces attributs sont CELLSPACING=1, CELLPADDING=7, FRAME=BOX et RULES=GROUPS. Si vous souhaitez enlever tous les encadrements autour des cellules du tableau, vous devrez agir sur trois attributs marqués en gras dans le programme 8.30. Programme 8.30 PROC TEMPLATE; DEFINE STYLE styletabSR; PARENT=styles.default; STYLE Table / FONT_FACE = "Arial, Helvetica, sans-serif" FONT_SIZE = 3 FONT_WEIGHT = medium FONT_STYLE = roman FOREGROUND = cx002288 BACKGROUND = cxf0f0f0 CELLSPACING = 0 CELLPADDING = 7 FRAME = void RULES = none; END; RUN; RULES=GROUP agit dans notre tableau sur la ligne qui sépare les intitulés de lignes et de colonnes des données proprement dites. Les sorties qui suivent vous indiquent l’impact de RULES dans un tableau croisé obtenu avec PROC FREQ . Résultat 8.9 : par défaut, RULES = GROUPS Résultat 8.10 : avec RULES = NONE SAS Livre Page 361 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 361 RULES peut prendre les valeurs suivantes : • ALL. Lignes de séparation entre toutes les lignes et toutes les colonnes. • COLS. Lignes de séparation entre toutes les colonnes. • GROUPS. Lignes de séparation entre les intitulés lignes/colonnes et les données. • NONE. Aucune ligne de séparation. • ROWS. Lignes de séparation entre toutes les lignes. FRAME commande l’encadrement global du tableau. Le résultat 8.9 vous montre l’impact de FRAME sur un tableau croisé : Résultat 8.11 : avec FRAME = VOID Résultat 8.12 : avec CELLSPACING = 0 FRAME peut prendre les valeurs suivantes : • ABOVE. En haut. • BELOW. En bas. • BOX. Autour. • HSIDES. En haut et en bas. • LHS. À gauche. • RHS. À droite. • VOID. Aucune. • VSIDES. À gauche et à droite. CELLSPACING commande la séparation entre les diverses cellules du tableau (et explique les lignes blanches que vous pouvez voir dans le résultat 8.11 par exemple). Les trois options combinées (voir programme 8.30) sur un simple tableau croisé donnent : SAS Livre Page 362 Jeudi, 18. septembre 2008 6:03 18 362 ◆ SAS Résultat 8.13 CELLPADDING commande la hauteur et la largeur des cellules en indiquant le nombre de pixels minimal à droite et gauche ainsi qu’au-dessus et au-dessous de la valeur. Vous avez donc la possibilité d’aérer plus ou moins votre tableau au moyen de cette commande. 8.3.4 La modification des couleurs Les différents blocs cités dans les programmes 8.24, 8.25 et 8.26 font référence à des couleurs que vous pouvez modifier en les choisissant au moyen des outils cités dans la section 7.1.1. Il vous faudra aussi agir sur le bloc CONTENTS, non cité jusqu’à maintenant, pour modifier la couleur de fond du sommaire. Résultat 8.14 STYLE Contents / FONT_FACE = "Arial, Helvetica, sans-serif" FONT_SIZE = 3 FONT_WEIGHT = medium FONT_STYLE = roman FOREGROUND = cx0033aa BACKGROUND = cxb0b0b0; Nous allons continuer ici la définition du style LEMIEN (débutée lors du programme 8.28, à laquelle on a ajouté les éléments du programme 8.29 ainsi que les modifications relatives à l’aspect du tableau, présentées dans le programme 8.30). Au cours de cette phase de personnalisation des couleurs, il est utile d’avoir un outil qui vous indique à quelle couleur correspond tel ou tel code. Nous utilisons un des outils cités dans la section 7.1.1 : www.colorschemer.com/online.html Puisque votre objectif est de proposer votre tableau sur Internet, nous vous conseillons de vous limiter dans vos choix de couleurs aux polices dites « websafe ». SAS Livre Page 363 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 363 Nous avons modifié quelques couleurs1 et obtenons, dans un premier temps, le résultat 8.15. Résultat 8.15 Le cadre blanc autour du titre et du pied de page est gênant. Si vous cliquez sur cette bordure blanche, vous verrez que le style de cet encadrement est commandé par le bloc : Résultat 8.16 STYLE SysTitleAndFooterContainer / FONT_FACE = "Arial, Helvetica, sans-serif" FONT_SIZE = 3 FONT_WEIGHT = medium FONT_STYLE = roman FOREGROUND = cx002288 BACKGROUND = cxe0e0e0 WIDTH = 100% BORDERWIDTH = NaN CELLSPACING = 1 CELLPADDING = 1 FRAME = VOID RULES = NONE; Pour retirer l’encadrement, il faut ajouter ce bloc à votre définition de STYLE, fixer le CELLSPACING à zéro et retirer la ligne BORDERWIDTH=NaN. La présence de cette ligne est source d’erreurs de syntaxe (sans que nous puissions réellement savoir pourquoi)2. Vous remarquez que ce bloc contient des définitions de polices. Celles-ci ne semblent pas être utilisées ici, mais pour plus de sûreté, vous modifierez aussi vos polices et remplacerez ARIAL par TIMES. 1. Le programme complet est disponible sur le site Internet compagnon de cet ouvrage. 2. Utilisateurs de SAS 9.1 : cette instruction BORDERWIDTH n’apparaît pas mais c’est l’instruction WIDTH=100% qu’il faut retirer pour que votre PROC TEMPLATE s’exécute sans erreur. SAS Livre Page 364 Jeudi, 18. septembre 2008 6:03 18 364 ◆ SAS 8.3.5 La sauvegarde des styles Votre style personnalisé est sauvegardé automatiquement. Il n’y a donc pas de commandes spécifiques à saisir pour pouvoir, d’une session SAS à une autre, utiliser ce nouveau style que vous avez défini rapidement en quelques copier-coller. Cependant, notre style est adapté à la sortie que nous avons face à nous et il est bien possible que, pour d’autres types de sorties, vous ayez de nouveau à intervenir pour redéfinir de nouveaux blocs. Il vous faudra alors reprendre la programmation de votre style et y ajouter ces nouvelles informations. Si vous avez perdu votre programme, cela ne pose aucun problème puisque vous avez toujours la possibilité d’éditer les caractéristiques de votre style via le programme : PROC TEMPLATE; SOURCE lemien; RUN; Dans la fenêtre JOURNAL, vous retrouverez le programme qui vous a permis de créer le style LEMIEN. SAS vous indique en quoi votre style et le style parent dont il est issu peuvent différer. Les styles que vous créez ne sont pas placés au même endroit que les styles livrés avec SAS : ils sont placés dans votre bibliothèque SASUSER (ce qui vous permettra de les sauvegarder lorsque vous changerez d’ordinateur). 8.3.6 Ajouter de nouveaux attributs Les modifications que vous avons apportées jusqu’à maintenant ne concernaient que des attributs déjà présents dans les blocs définissant le style. Vous avez aussi la possibilité d’ajouter et de retirer des attributs. C’est ce que nous allons voir dans cette section. Le fond du document que vous avez créé est pour l’instant rempli avec une couleur que vous pouvez définir comme vous le souhaitez. Il est aussi possible d’intégrer un logo ou une image. Pour introduire un logo, vous devez recourir à l’attribut PREIMAGE comme le montre le programme 8.31. Programme 8.31 PROC TEMPLATE; DEFINE STYLE logoSR; parent=styles.default; STYLE Body / FONT_FACE = "Arial, Helvetica, sans-serif" FONT_SIZE = 3 FONT_WEIGHT = medium FONT_STYLE = roman FOREGROUND = cx002288 BACKGROUND = cxe0e0e0 PREIMAGE="C:\intro_SAS\images\logoesa.gif"; END; RUN; SAS Livre Page 365 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 365 Résultat 8.17 La couleur de fond est conservée. La commande PREIMAGE place par défaut le logo en haut à gauche. Le tableau est recalé dans la page vers le bas. Le halo blanc autour du logo n’est pas très beau. Dans la définition de votre style, vous pouvez retirer la ligne relative à la couleur de fond (celui-ci deviendra blanc), mais il faudra aussi supprimer la couleur de fond du bloc des titres et des sous-titres en intervenant sur les blocs SYSTEMFOOTER, SYSTEMTITLE et SYSTITLEANDFOOTERCONTAINER1. Ceci ne pose aucun problème grâce aux informations données par la fenêtre PROC TEMPLATE SYNTAX. Pour retirer cette couleur de fond, il vous suffit d’effacer la commande BACKGROUND=CX. Vous avez aussi la possibilité de conserver la commande et de lui donner la valeur _UNDEF_. Vous pouvez aussi utiliser une image de fond. L’exemple de programmation suivant permet de mieux comprendre comment fonctionnent les styles et surtout comment les modifier avec PROC TEMPLATE. La modification essentielle porte sur le bloc BODY qui devient : Programme 8.32 – attention, ce programme n’est pas complet PROC TEMPLATE; DEFINE STYLE logoSR2; parent=styles.default; STYLE Body / FONT_FACE = "Arial, Helvetica, sans-serif" FONT_SIZE = 3 FONT_WEIGHT = medium FONT_STYLE = roman FOREGROUND = cx002288 BACKGROUNDIMAGE = 'C:\intro_SAS\images\esa_pale.jpg' … 1. Le bloc du résultat 8.17 que nous avons déjà modifié pour retirer l’encadrement qui peut apparaître autour des titres et des pieds de pages n’est pas facile à « attraper » : vous devez cliquer sur le bord du bloc. SAS Livre Page 366 Jeudi, 18. septembre 2008 6:03 18 366 ◆ SAS Il faut là aussi enlever la couleur de fond des blocs SYSTEMFOOTER, SYSTEMTITLE et SYSTITLEANDFOOTERCONTAINER. Vous obtiendrez alors : Résultat 8.18 Enfin, la programmation 8.21 demande la création d’une table des matières qui, elle aussi, doit être personnalisée. Le site compagnon de cet ouvrage propose le programme complet qui permet d’introduire en image de fond le logo tel qu’il apparaît dans le résultat 8.18 (il suffit en fait de modifier le bloc CONTENTS). Ce dernier travail nous permet de revenir sur la personnalisation des tables des matières débutée à la section 8.2.4. L’instruction ODS PROCLABEL permet déjà de transformer ‘THE MEANS PROCEDURE’ en un texte de votre choix. Pour transformer TABLE OF CONTENTS, vous pouvez utiliser PROC TEMPLATE en modifiant la valeur de CONTENT TITLE dans le bloc TEXT : Programme 8.33 (introduisez le nom de votre choix pour la table des matières) STYLE text "Common text." / 'Fatal Banner' = "Fatal:" 'Error Banner' = "Error:" 'Warn Banner' = "Warning:" 'Note Banner' = "Note:" 'Pages Title' = "Table of Pages" 'Content Title' = "Table of Contents" 'suffix1' = " Procedure" 'prefix1' = "The "; Cette information n’est pas donnée par la fenêtre PROC TEMPLATE SYNTAX. Ainsi, même si les informations données par cette fenêtre doivent vous permettre de modifier la plupart des éléments de votre sortie, il demeure possible que vous ayez à « éplucher » la définition du style telle qu’elle peut apparaître dans votre fenêtre JOURNAL pour retrouver un bloc de style que vous souhaiteriez modifier, au moyen du programme : PROC TEMPLATE; SOURCE styles.default; RUN; SAS Livre Page 367 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 367 L’aide SAS vous sera une nouvelle fois très utile pour connaître l’impact des différents attributs et leurs destinations possibles. Nous attirons votre attention sur le fait que vous ne disposez pas des mêmes outils en fonction des destinations ODS (HTML, RTF, PDF…). Certains attributs sont propres à ODS HTML, d’autres fonctionnent avec toutes les destinations. Pour plus de détails, consultez l’aide SAS (entrée DEFINE STYLE STATEMENT, puis le sous-menu TEMPLATE PROCEDURE). Enfin, « éplucher » la définition d’un STYLE pourra vite devenir compliqué si votre STYLE a un STYLE PARENT. Les informations que vous recherchez seront à trouver soit dans le STYLE que vous utilisez, soit, si le bloc recherché a été repris tel quel du STYLE PARENT, dans ce dernier STYLE1. 8.4 ODS RTF La procédure ODS RTF vise à générer une sortie en RTF (Rich Text Format) que vous allez pouvoir directement ouvrir avec votre traitement de texte ou dans votre tableur si vous souhaitez pouvoir introduire de nouvelles informations à votre tableau. Pour créer votre premier fichier RTF, nous allons utiliser la table VENTE présentée dans la section 8.1.3. Programme 8.34 ODS RTF FILE='sortie8_34.rtf'; PROC MEANS DATA=vente NONOBS MAXDEC=1 SUM; CLASS produit; VAR ca; RUN; ODS RTF CLOSE; Puisque aucun chemin (PATH) particulier n’est précisé, le fichier RTF est créé à l’emplacement par défaut. Si c’est la première fois que vous exécutez une commande ODS RTF, il est possible que votre ordinateur vous demande si vous souhaitez ouvrir le fichier créé au moyen de votre traitement de texte ou si vous souhaitez l’enregistrer. Demandez à ouvrir le fichier – si vous indiquez de l’enregistrer, vous ne verrez pas immédiatement votre programme : vous devrez le rechercher sur votre disque dur. Résultat 8.19 1. Et les choses deviendront encore plus compliquées si vous créez un STYLE personnalisé à partir d’un STYLE qui a lui-même un style PARENT… SAS Livre Page 368 Jeudi, 18. septembre 2008 6:03 18 368 ◆ SAS Puisque nous ne précisons aucun style, SAS utilise le style par défaut d’ODS RTF ; ce style diffère du style par défaut d’ODS HTML. Le format par défaut des sorties RTF est le style appelé RTF dans la liste des styles. Vous avez la possibilité d’utiliser les styles HTML que nous avons déjà vus : ils seront adaptés comme le montre le programme 8.35. Programme 8.35 TITLE; FOOTNOTE; ODS NOPTITLE; ODS HTML FILE='835_1body.html' STYLE=logoSR2; ODS RTF FILE='sortie8_35.rtf' STYLE=logoSR2; PROC MEANS DATA=vente NONOBS MAXDEC=1 SUM; FORMAT produit fprod.; CLASS produit; VAR ca; RUN; ODS RTF CLOSE; ODS HTML CLOSE; Deux résultats ODS sont ici créés. Pour observer ces deux résultats, vous pouvez soit utiliser les flèches gauche/droite à partir de la fenêtre RESULTS VIEWER, soit, sur la fenêtre RESULTATS, demander à ouvrir tel ou tel type de résultat. Résultat 8.20 (HTML) Résultat 8.21 (RTF) SAS Livre Page 369 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 369 Les titres par défaut dans les sorties RTF apparaissent dans les en-têtes de documents de votre traitement de texte et les FOOTNOTEs dans les pieds de pages. Cette caractéristique peut vite devenir gênante si le tableau n’est qu’un élément du document que vous êtes en train de rédiger puisque, sur toutes les pages de votre document, vous risquez de voir apparaître ces mêmes en-têtes et pieds de pages (par exemple, « le système SAS » et « la procédure FREQ »). SAS fait bien les choses puisque : • Si vous copiez-collez votre tableau dans un document vide, les en-têtes et les pieds de pages seront collés eux aussi. • Si vous copiez-collez votre tableau dans un document déjà rédigé en partie, les en-têtes et les pieds de pages ne seront pas collés. Dans tous les cas, pour éviter ce genre de soucis, vous pouvez demander à ce que les titres et notes de bas de page soient intégrés à votre zone de texte via l’option BODYTITLE : ODS RTF FILE='sortie.rtf' STYLE=logoSR2 BODYTITLE; Enfin, vous avez dû remarquer que SAS refuse de créer votre sortie RTF si la précédente sortie n’a pas été close ou si votre précédente sortie est actuellement ouverte par votre traitement de texte. 8.4.1 La gestion des grands tableaux Programme 8.36 ODS RTF FILE='sortie8_36.rtf'; PROC FREQ DATA=vente; FORMAT produit fprod.; TABLES nombre; RUN; ODS RTF CLOSE; Le tableau produit par le programme 8.36 se présente sur deux pages. Sur la seconde page, SAS a reconstruit en haut de votre tableau les intitulés de colonnes. Si vous copiez-collez ce tableau dans votre traitement de texte (Word, par exemple), vous constaterez que, quelles que soient les marges haute et basse de votre traitement de texte, la seconde page débute toujours par les intitulés de colonnes. Si vous collez un grand tableau dans un document Word, un saut de page automatique sera créé en même temps. Il ne sera pas possible d’écrire avant le tableau et donc de lui donner un titre une fois que celui-ci sera collé dans Word. Si vous souhaitez donner un titre à votre tableau, c’est dans SAS que vous devrez le faire. 8.4.2 La modification de vos tableaux dans Excel Au lieu de coller votre tableau dans votre traitement de texte, vous avez aussi la possibilité de le coller dans votre tableur et d’ajouter de nouvelles informations tout en conservant le style propre au tableau. Ainsi, partant du tableau précédent collé dans un tableur, nous avons pu obtenir en quelques manœuvres1 : 1. Un tableau parfaitement identique à celui-ci pouvait être construit au moyen de PROC REPORT. SAS Livre Page 370 Jeudi, 18. septembre 2008 6:03 18 370 ◆ SAS Résultat 8.22 Le retraitement de vos tableaux dans un tableur est en fait gêné par le séparateur décimal qui, par défaut, est le point avec SAS et généralement la virgule dans votre tableur. Ce problème sera aisément réglé par l’imposition d’un FORMAT NUMX. Avec SAS, vous pouvez créer directement des fichiers XLS. ODS HTML (et ODS MARKUP1) donne cette possibilité, contrairement à ODS RTF. Programme 8.37 ODS HTML FILE='sortie8_37.xls'; PROC MEANS DATA=vente NONOBS MAXDEC=1 SUM; CLASS produit; VAR ca; FORMAT produit fprod.; RUN; ODS HTML CLOSE; Le fichier créé reste un fichier HTML mais l’extension XLS demande que celui-ci soit ouvert par Excel. Enregistrez-le ensuite dans un format classeur Excel. 8.4.3 Les modifications de styles dans ODS RTF Le programme 8.22 essentiel à la personnalisation d’un STYLE HTML (voir section 8.3.1.) fonctionne ici aussi avec un léger aménagement : dans le premier stade de personnalisation du style RTF, vous devez en effet demander une sortie en HTML en forçant l’utilisation de ce style RTF pour pouvoir disposer de la fenêtre PROC TEMPLATE SYNTAX, puis modifier votre style via PROC TEMPLATE. Vous pourrez ensuite demander à utiliser ce style avec ODS RTF. Lorsque vous créez un STYLE personnalisé, partez toujours, si cela est possible, du STYLE par défaut de la destination ODS. Programme 8.38 ODS MARKUP FILE='838_1body.html' TAGSET=tagsets.style_popup STYLE=RTF; PROC MEANS DATA=vente NONOBS MAXDEC=1 SUM; CLASS produit; 1. Il faut pour cela utiliser le TAGSET ExcelXP. Voir support.sas.com/rnd/base/ods/odsmarkup/excelxp_demo.html SAS Livre Page 371 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 371 VAR ca; FORMAT produit fprod.; RUN; ODS MARKUP CLOSE; Votre style RTF est essentiellement composé (pour la partie tableau) de trois blocs dont les attributs sont modifiés par le programme 8.39. Programme 8.39 PROC TEMPLATE; DEFINE STYLE rtf_sr; PARENT=styles.rtf; STYLE Header / FONT_FACE = "Garamond" FONT_SIZE = 13pt FONT_WEIGHT = bold FONT_STYLE = roman FOREGROUND = cx000000 BACKGROUND = lightpink; STYLE Data / FONT_FACE = "Garamond" FONT_SIZE = 12pt FONT_WEIGHT = Bold FONT_STYLE = roman FOREGROUND = cx000000; STYLE table / FONT_FACE = "Garamond" FONT_SIZE = 12pt FONT_WEIGHT = medium FONT_STYLE = roman FOREGROUND = cx000000 BORDERCOLOR=white CELLSPACING = 0 CELLPADDING = 20 FRAME = BOX RULES = ALL; ;END; RUN; Pour obtenir. Résultat 8.23 SAS Livre Page 372 Jeudi, 18. septembre 2008 6:03 18 372 ◆ SAS Vous remarquerez dans le programme 8.39 la modification de certains attributs ainsi que l’introduction dans le bloc TABLE d’un attribut BORDERCOLOR=WHITE. 8.5 ODS PRINTER et ODS PDF La destination PRINTER d’ODS ordonne l’impression de documents sur des imprimantes physiques (imprimante sous Windows, PCL et POSTSCRIPT) et la création de documents portables (que vous pouvez transférer) en format PDF, POSTSCRIPT et PCL. ODS PDF est donc une des destinations d’ODS PRINTER. Si nous consacrons une section à ODS PRINTER, l’essentiel de notre travail portera sur ODS PDF. Au moyen d’exemples, nous exposerons les outils qui vous permettront de réaliser un document de plusieurs pages que vous pourrez transmettre à des correspondants ou utiliser pour une présentation au moyen d’un vidéoprojecteur. 8.5.1 ODS PRINTER Au moyen d’ODS PRINTER, vous avez la possibilité de générer des sorties qui ne pourront pas être facilement modifiées par la personne à qui vous les transmettrez. Dans sa version la plus simple, sous Windows, ODS PRINTER ordonne à SAS d’envoyer les résultats des procédures qui suivent vers l’imprimante par défaut de votre ordinateur. Si vous êtes sous un système Unix, VMS ou z/OS, il n’y a pas d’impression mais la création d’un fichier PostScript. La programmation est ici de la forme suivante : Programme 8.40 ODS PRINTER; PROC FREQ DATA=vente; FORMAT produit fprod.; TABLES produit / NOPERCENT NOCUM; RUN; ODS PRINTER CLOSE; Si vous êtes sous Windows, il est possible que vous n’obteniez rien sur votre imprimante suite à ce programme. Plusieurs raisons sont possibles : • Vous n’avez pas accès à l’imprimante. • ODS vérifie l’option SYSPRINT (sur Windows) ou PRINTERPATH sur d’autres systèmes d’exploitation, et envoie le résultat vers l’imprimante par défaut si ces options ne sont pas remplies. Pour voir les valeurs de ces options, vous pouvez aller dans le menu Outils/Options/Système. Vous trouverez l’option SYSPRINT dans Contrôle de sortie Journal et Procédure, puis Résultats procédure. L’option PRINTERPATH apparaît dans Impression ODS. Pour définir une imprimante par défaut (si cela n’est pas encore fait), ouvrez le menu Fichier/Définir impression, et sélectionnez l’imprimante par défaut. Vous avez aussi la possibilité d’envoyer vos impressions sur d’autres imprimantes. Il faut pour cela que vous connaissiez le nom de cette imprimante – les différentes imprimantes s’affichent dans la fenêtre Définir impression. SAS Livre Page 373 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 373 Résultat 8.24 Et sans modifier l’imprimante par défaut, vous pourrez envoyer votre impression sur l’imprimante de votre choix au moyen de la programmation suivante : ODS PRINTER PRINTER="\\leosrv4\Lexmark Optra S 1650 PS"; Majuscules et minuscules n’ont pas d’importance dans la déclaration des noms d’imprimante. Plutôt que d’envoyer votre sortie directement sur une imprimante, vous avez aussi la possibilité de créer un fichier informatique, lisible par d’autres utilisateurs, dans un format PostScript ou PCL. Ce dernier format étant recommandé pour des imprimantes relativement anciennes, nous ne traiterons ici que des sorties en format PostScript (PS). L’idée est ici simplement de pouvoir stocker le fichier de résultats pour ensuite pouvoir l’imprimer (ou le transmettre). Attention, les sorties que vous pouvez obtenir dans un format PostScript ne peuvent pas être modifiées par la suite (contrairement à une sortie RTF que vous pouvez amender aussi bien dans votre traitement de texte que dans votre tableur). Pour créer un fichier PostScript si vous êtes sous Windows, il faut indiquer l’option FILE : ODS PRINTER FILE='sortie.ps' ; Vous prendrez bien entendu garde au fait qu’un fichier PS ne peut pas être lu sans un logiciel adéquat (comme Ghostscript). PRINTER est le style par défaut utilisé par ODS PRINTER. Si vous souhaitez créer votre propre style d’impression, nous vous invitons à le prendre comme style PARENT. 8.5.2 ODS PDF ODS vous offre la possibilité de créer des fichiers PDF (Portable Format Document). Il s’agit encore une fois de créer un document que vous partagerez avec d’autres utilisateurs sans que ceux-ci puissent facilement le modifier. Vous avez aussi la possibilité d’utiliser ces fichiers PDF pour effectuer des présentations au moyen d’un projecteur vidéo. Le programme 8.41 permet la création de notre premier fichier PDF : SAS Livre Page 374 Jeudi, 18. septembre 2008 6:03 18 374 ◆ SAS Programme 8.41 OPTIONS NODATE NONUMBER; ODS NOPTITLE; ODS PDF FILE='pgr841.pdf'; PROC FREQ DATA=vente; FORMAT produit fprod.; TABLES produit / NOPERCENT NOCUM; RUN; ODS PDF CLOSE; Vous aurez sur votre écran la sortie suivante : Résultat 8.25 SAS génère donc automatiquement un fichier PDF et, pour que vous puissiez voir ce fichier, active Acrobat Reader dans la fenêtre RESULTS VIEWER. SAS crée aussi une table de signets (équivalente à une table des matières) qui vous permettra de naviguer entre vos différents résultats. Si votre table des matières n’apparaît pas, cliquez sur le bouton Afficher/masquer le navigateur sur la première barre d’outils sur votre écran. Si vous ne souhaitez pas de table des matières, ajoutez une option NOTOC dans votre commande ODS PDF. Vous pouvez modifier en partie la table des matières avec les outils vus dans la section consacrée à ODS HTML. Pour modifier The Freq Procedure de la table des matières : ODS PROCLABEL 'Données par pays'; PRINTER est le style par défaut utilisé par ODS PDF. Vous avez cependant la possibilité d’utiliser n’importe quel style (aussi bien un style préexistant dans SAS qu’un style que vous avez défini vous-même). Si vous indiquez plusieurs procédures à reproduire au sein de votre document PDF, par défaut, vous n’aurez par page que le résultat d’une seule procédure. Une nouvelle page est créée au début de chaque commande PROC. Vous pouvez modifier ce type de fonctionnement via la commande STARTPAGE. SAS Livre Page 375 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 375 ODS PDF STARTPAGE=NEVER/NO/NOW/YES NEVER Le passage à la page suivante ne se fera que si vous le demandez via une instruction ODS PDF STARTPAGE=NOW ou lorsque la page sera remplie même si la procédure qui s’annonce est une procédure graphique. NO Le passage à la page suivante ne se fera que lorsque la page sera remplie (ou si vous le demandez), sauf si la procédure qui s’annonce est une procédure graphique. NOW Force le passage à la page suivante. YES Fonctionnement par défaut : dès qu’une nouvelle procédure débute, une nouvelle page est créée. Cette commande peut intervenir quand vous le souhaitez ; vous pouvez modifier la valeur de STARTPAGE au cours du programme qui crée votre PDF. Cette commande est, par exemple, particulièrement utile lorsque vous souhaitez introduire un texte avant votre tableau de résultats. Par défaut, les graphiques prennent une page entière. Il n’est pas conseillé de partager une page entre un graphique et le résultat de certaines procédures. Enfin, dans l’instruction de création du fichier PDF, vous pouvez ajouter les informations qui apparaîtront dans la fenêtre Propriétés (menu Fichier) du document s’il est ouvert avec Acrobat Reader directement : Résultat 8.26 Vous devez pour cela remplir les commandes suivantes1 : Programme 8.42 ODS PDF FILE='test.pdf' AUTHOR = "L’auteur du PDF" KEYWORDS = 'Liste de mots clés' SUBJECT = 'Sujet du PDF' TITLE = 'Le titre de votre PDF'; Dans la section suivante, nous allons étudier plus en détail le fonctionnement d’ODS PDF. 1. Ce programme fonctionne parfaitement avec SAS 9.1 mais pas avec SAS 9.2. SAS Livre Page 376 Jeudi, 18. septembre 2008 6:03 18 376 ◆ SAS 8.5.3 Un premier exemple Nous commencerons par ce document simple : Programme 8.43 GOPTIONS RESET=ALL; OPTIONS ORIENTATION=landscape PRINTERPATH=postscript NODATE NONUMBER; ODS ESCAPECHAR="^" NOPTITLE; TITLE H=5 'Ceci ^S={FOREGROUND=red} est ^S={} mon PDF'; ODS PDF FILE='pgr843.pdf' STYLE=gears COLUMNS=2 NOTOC; PROC FREQ DATA=vente; FORMAT produit fprod.; TABLES produit / NOPERCENT NOCUM; RUN; PROC PRINT DATA=vente (OBS=20) NOOBS; VAR produit; SUM nombre ca; FORMAT produit fprod.; RUN; ODS PDF COLUMNS=1; PROC FREQ DATA=vente; FORMAT produit fprod.; TABLES produit / NOPERCENT NOCUM; RUN; TITLE 'Les graphiques doivent être présentés sur des pages isolées'; GOPTIONS DEVICE=javaimg; AXIS1 LABEL=NONE; PROC GCHART DATA=vente; VBAR produit / TYPE=freq DISCRETE NOFRAME MAXIS=axis1 RAXIS=axis1; FORMAT produit fprod.; RUN; ODS PDF CLOSE; Ce programme permet la réalisation d’un document de trois pages1. Sur la première page, deux colonnes apparaissent : le résultat du PROC FREQ est présenté en première colonne ; le résultat du PROC PRINT, dans la seconde colonne. Les deux dernières pages sont présentées sur une colonne, un résultat par page. L’option PRINTERPATH indique à SAS de ne pas envoyer les sorties graphiques vers la fenêtre graphique. Le titre est défini avant l’instruction de création du fichier PDF. S’il avait été placé après, ou même à l’intérieur de la première procédure PROC FREQ, cela n’aurait strictement rien changé. Il apparaît en haut de la page, centré entre les deux colonnes. 1. Ce document peut bien entendu être téléchargé sur le site compagnon de cet ouvrage. SAS Livre Page 377 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 377 Résultat 8.27(extrait) Vous ne pouvez donc pas donner un titre général pour votre PDF, puis un titre à votre premier tableau. Si vous introduisez une commande TITLE après le RUN du PROC FREQ, ce titre ne s’affichera qu’à la seconde page. S’il est possible de donner un titre à une page, il n’est pas possible de donner un titre à chaque sortie lorsque vous avez plusieurs sorties par page. Vous pouvez également noté la présence d’une instruction TITLE particulière et d’une étrange commande ODS ESCAPECHAR : ODS ESCAPECHAR="^" NOPTITLE; TITLE H=5 'Ceci ^S={FOREGROUND=red} est ^S={} mon PDF'; 8.5.4 ESCAPECHAR ESCAPECHAR offre d’importantes possibilités. Cette fonction, introduite dans SAS 8.2, est documentée dans l’aide SAS seulement depuis SAS 9.2. Elle permet de mettre en forme les textes introduits dans le document PDF que vous réalisez. Ces mises en forme sont aussi possibles dans ODS HTML ou ODS RTF. En ce qui concerne ODS HTML, vous pouvez introduire des mises en forme en ouvrant le fichier SAS au moyen d’un éditeur HTML. Pour ODS RTF, les textes et les modifications de styles peuvent être effectués grâce à un traitement de texte. En ce qui concerne ODS PDF, une fois le document PDF créé, vous ne pouvez plus le modifier : il faut donc introduire ces textes et ces mises en forme dès la création du document. La commande ODS PDF ESCAPECHAR= « ^ » ne fait ici que préciser le caractère qui va indiquer à SAS que ce qui suit ne fait pas partie du texte, mais qu’il doit analyser et appliquer les commandes qui viennent. ESCAPECHAR permet essentiellement1 trois types d’actions2 : 1. Modifications de styles : ^S ^S={ATTRIBUT1=valeur1 ATTRIBUT2=valeur2…} texte à mettre en forme ^S={} Vous verrez un exemple d’application dès la première commande TITLE du programme 8.43 : nous demandons à ce que le mot « est » soit mis en rouge. La modification de style s’applique jusqu’à ce que vous indiquiez un retour au style normal via ^S={} ou jusqu’à ce que votre zone de texte soit terminée. 1. Il existe en fait une quatrième possibilité d’exploitation d’ESCAPECHAR : ^R (introduction de « texte brut », commandes RTF ou HTML). Voir www2.sas.com/proceedings/forum2007/099-2007.pdf 2. Dans les exemples qui suivent, nous prendrons systématiquement « ^ » comme ESCAPECHAR. Adaptez les programmes si vous souhaitez un autre ESCAPECHAR. SAS Livre Page 378 Jeudi, 18. septembre 2008 6:03 18 378 ◆ SAS 2. Mise en forme du texte (retour à la ligne, commande d’alignement, etc.) Vous introduisez au sein de votre texte des codes qui ne seront pas affichés à l’écran mais qui commanderont la mise en forme du texte. Par exemple : – ^m Le texte qui suit devra être aligné verticalement à cet endroit. – ^n Pour commander un retour à la ligne (^m est désactivé par ^n). – ^2n Deux retours à la ligne, etc. – ^-n Retour à la ligne et alignement vertical sur le ^m. – ^_ Espace insécable. 3. Insertion de mise en forme ou de caractères spéciaux déjà implémentés : – exposant^{super 2} pour obtenir exposant2. – indice^{sub 2} pour obtenir indice2. – ^{thispage} pour introduire le numéro de la page. – ^{lastpage} pour introduire le numéro de la dernière page. – ^{dagger} pour introduire le signe †. Avec SAS 9.2, de nouvelles fonctions sont apparues. La syntaxe de modification du style a été modifiée (mais les anciennes commandes continuent à être valables). Ainsi, pour modifier le style avec SAS 9.2, vous pourrez avoir ce type de commande : ^{STYLE [ATTRIBUT1=valeur1 ATTRIBUT2=valeur2] texte à mettre en forme} Ce type de commande est aussi possible : ^{STYLE [FONTSTYLE=italic] texte1 ^{STYLE [COLOR=red] texte2}} Le texte1 sera écrit en italique, le texte2 aussi – de plus, il sera rouge. Ce type de commande évite la « remise à zéro » effectuée par la commande ^S{} dans l’ancienne syntaxe. Avec SAS 9.2, vous pouvez aussi plus simplement introduire des caractères spéciaux au moyen des unicodes. {unicode O3B1} vous donnera α Dans votre traitement de texte, vous avez généralement la possibilité d’introduire des caractères spéciaux. Les unicodes associés à ces caractères spéciaux vous sont donnés dans la fenêtre qui permet l’introduction de ces derniers. SAS Livre Page 379 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 379 Les mises en forme peuvent intervenir dans n’importe quel élément de texte : • les titres et les pieds de pages ; • du texte introduit pas ODS destination TEXT= ; • les modalités de variables alphanumériques ; • les LABEL de variables alphanumériques. Attention, si les commandes de mise en forme que vous intégrez dans vos textes sont normalement invisibles dans les fenêtres de sortie ODS, elles apparaissent dans la fenêtre SORTIE standard. Ainsi : Programme 8.44 DATA test; variable= "Ceci ^S={FOREGROUND=red FONT_SIZE=18pt} est ^S={} mon PDF"; LABEL variable="Var^S={FONT_SIZE=18pt}iable"; RUN; TITLE ;FOOTNOTE; ODS PDF FILE='pgr844.pdf' STYLE=gears; PROC PRINT DATA=test NOOBS LABEL; RUN; ODS PDF CLOSE; Vous obtiendrez dans la fenêtre RESULTS VIEWER : Résultat 8.28 Dans la fenêtre SORTIE, vous aurez : var^S={FONT_SIZE=18pt}iable ceci ^S={FOREGROUND=red FONT_SIZE=18pt} est ^S={} mon PDF Vous trouverez dans le document suivant l’ensemble des options disponibles dans le cadre des commandes ^S : www2.sas.com/proceedings/sugi31/092-31.pdf Nous avons déjà évoqué ces options dans les sections consacrées à ODS et PROC PRINT (voir section 6.4.2.), TABULATE (voir section 6.7.3.) et REPORT (voir section 6.5.6.). En fonction de la destination de sortie (HTML, RTF ou PDF), vous ne disposez pas de toutes les commandes. 8.5.5 Second exemple – illustration des capacités d’ESCAPECHAR Reprenez le programme 8.43 et ajoutez les commandes proposées par le programme 8.45 juste après le RUN qui conclut la première procédure PROC FREQ. SAS Livre Page 380 Jeudi, 18. septembre 2008 6:03 18 380 ◆ SAS Programme 8.45 (à introduire dans le programme 8.43) ODS PDF TEXT=' '; ODS PDF TEXT="Voici le texte de présentation de mes données. Il s’agit de ^S={FOREGROUND = red} données simulées ^S={} qui n’ont bien^m entendu aucune fonction informative : ^-2n-elles sont simplement illustratives, ^-2n-je les ai inventées, ^-2n-elles sont donc fausses, ^-2n-elles sont générées au moyen de générateurs de nombres aléatoires."; ODS PDF TEXT="^S={FONT_SIZE=12PT} "; ODS PDF TEXT= "^S={FLYOVER='On peut imaginer introduire ici une définition quelconque ou la source des données' CELLWIDTH=8cm JUST=Left FONT_SIZE=10PT FONT_FACE='Verdana'} <- Lisez la petite note ici."; ODS PDF TEXT="^S={FONT_SIZE=12PT} "; ODS PDF TEXT="Ce texte est présenté sur la 1^{super ère} page, pas sur la 2^{super ème} page"; ODS PDF TEXT=' '; ODS PDF TEXT= "^S={FONT_SIZE=10pt JUST=center VJUST=middle CELLHEIGHT=20pt CELLWIDTH=13cm FONT_FACE='Verdana' URL='http:\\www.master-esa.com'}Cliquer ici pour aller vers un site"; Vous obtiendrez, dans la première colonne, juste au-dessous du premier tableau, les textes reproduits par le résultat 8.29. Résultat 8.29 Les commandes ODS PDF TEXT=‘ ‘; permettent d’aérer le texte. La deuxième commande ODS TEXT exploite les possibilités offertes par ESCAPECHAR pour mettre en forme votre texte. Le troisième groupe d’instructions ODS TEXT introduit une note (FLYOVER). Si vous avez sur votre ordinateur le fichier PDF construit ici, en passant le pointeur de votre souris sur l’icône, vous afficherez un petit texte. Le quatrième groupe d’instructions ODS TEXT utilise les mises en forme déjà implémentées. La dernière instruction ODS TEXT permet la création d’un cadre sur lequel il faut cliquer pour accéder à un site à partir du PDF (il faudra autoriser ACROBAT READER à accéder au site). SAS Livre Page 381 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 381 S’il n’est pas possible d’introduire un texte juste au-dessus du premier tableau1, c’est tout à fait possible au-dessus des autres tableaux proposés dans le PDF. Le passage d’une page à l’autre (ou d’une colonne à l’autre) s’effectue par défaut lorsque débute la procédure suivante (ce qui vous explique pourquoi votre texte est au-dessous du premier tableau). Si, dans l’instruction de création du PDF (ODS PDF FILE=), vous ajoutez l’option STARTPAGE=NO, puis l’instruction ODS PDF STARTPAGE=NOW juste au-dessus de la première instruction ODS PDF TEXT, le texte apparaîtra en haut de la seconde colonne. Vous remarquerez alors que le deuxième tableau est à cheval sur la page 1 (deuxième colonne) et la première colonne de la page 2. Le troisième tableau continue à être présentée seul sur une page en raison de l’instruction ODS PDF COLUMNS=1; qui force un passage à une page suivante. Nous vous invitons à ne pas tenter de faire cohabiter au sein d’une même page un graphique et un tableau. Les résultats que vous obtiendriez pourraient vous paraître étranges sans qu’il soit réellement possible d’en trouver l’explication. Par conséquent, l’option STARTPAGE=NEVER est à éviter (puisqu’elle n’autorise jamais de saut de page, même si la procédure qui débute est une procédure graphique). Préférez STARTPAGE=NO. L’introduction à la suite d’un graphique d’un texte mis en forme au moyen d’ESCAPECHAR ne pose généralement pas de problème. En revanche, l’introduction de notes (FLYOVER) ou de liens vers des sites Internet pose quelquefois des difficultés (principalement avec SAS 9.1). Avec SAS 9.2, nous vous recommandons d’utiliser JAVAIMG comme DEVICE pour vos graphiques et de paramétrer le moins possible ces derniers2. 8.5.6 Création d’une page de garde Vous pourriez avoir envie de créer une première page dans votre PDF dans laquelle vous introduiriez, uniquement au moyen de phrases, les sorties réalisées ensuite. Ce travail est délicat puisque, mis à part le titre de votre PDF, vous ne pouvez pas introduire de texte avant votre premier résultat et que, dans tous les cas, vous ne pouvez pas ordonner de saut de page à la suite de votre titre. La seule solution à votre disposition est l’introduction d’un graphique qui ne se voit pas… Le programme 8.46 remplace le début du programme jusqu’au premier PROC FREQ. Programme 8.46 GOPTIONS RESET=ALL; OPTIONS ORIENTATION=landscape PRINTERPATH=postscript NODATE NONUMBER; ODS ESCAPECHAR="^" NOPTITLE; ODS PDF FILE='pgr846.pdf' STYLE=gears NOTOC; GOPTIONS DEVICE=javaimg VSIZE=8cm HSIZE=8cm; SYMBOL I=none V=none; PROC GPLOT DATA=vente; PLOT produit*nombre / NOAXIS NOFRAME; RUN;QUIT; 1. C’est le cas dans SAS 9.2. SAS 9.1 a un fonctionnement légèrement différent. 2. L’utilisation de DEVICE=JAVAIMG avec SAS 9.1 peut être problématique. SAS Livre Page 382 Jeudi, 18. septembre 2008 6:03 18 382 ◆ SAS GOPTIONS RESET=ALL; ODS PDF TEXT= "^S={FONT_SIZE=32PT JUST=center} Voici le travail réalisé."; TITLE H=5 'Ceci ^S={FOREGROUND=red} est ^S={} mon PDF'; ODS PDF COLUMNS=2 ;…. Le graphique ordonné par PROC GPLOT est parfaitement invisible puisque nous ne demandons aucune interpolation, pas de valeur pour marquer les points, pas d’axe et pas de cadre. Vous obtiendrez au moyen de ce programme la page de garde présentée par le résultat 8.30. Résultat 8.30 Au moyen de GOPTIONS, la taille du graphique invisible est spécifiée. Lorsque le graphique est réalisé, les GOPTIONS sont toutes remises à leur valeur par défaut (elles s’appliquent au graphique produit par PROC GCHART si vous ne les annulez pas). Pour que le titre (« ceci est mon PDF ») continue à s’afficher dès la page 2, l’instruction TITLE doit intervenir avant ODS PDF COLUMNS=2;. 8.5.7 La personnalisation de la table des matières – deuxième partie Dans le programme 8.43, nous avons demandé à ce qu’aucune table des signets ne soit construite. Si vous demandez maintenant cette table des signets, il faut enlever l’option NOTOC qui apparaît dans l’instruction ODS PDF FILE. Pour personnaliser cette table des matières, vous pouvez utiliser : • ODS PROCLABEL (voir section 8.2.4.) ; • pour les procédures graphiques, en option de VBAR ou PLOT, l’option DESCRIPTION=‘texte’ (voir section 8.2.4.) ; • pour la procédure PROC PRINT, l’option CONTENTS : PROC PRINT DATA=vente CONTENTS="Texte pour sommaire"; Cette option est aussi possible pour PROC TABULATE et PROC REPORT. SAS Livre Page 383 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 383 Vous pouvez ainsi aboutir à la table des matières reproduite par le résultat 8.31. Résultat 8.31 Ici, le développement de l’arborescence du sommaire est maximal. Si vous ajoutez l’option PDFTOC=2, (par défaut, PDFTOC=01) dans votre instruction de création de table ODS PDF FILE, deux niveaux d’arborescence seront retirés et vous obtiendrez la table des matières proposée par le résultat 8.32. Résultat 8.32 Pour un ensemble de procédures (PROC FREQ dans notre exemple mais aussi pour PROC MEANS ou PROC UNIVARIATE), seule la personnalisation par ODS PROCLABEL est possible. Pour aller plus loin dans la personnalisation du sommaire, il faut que vous interveniez au niveau des modèles (TEMPLATES) qui permettent la construction des résultats. La procédure est expliquée dans ce document2 : www2.sas.com/proceedings/sugi28/146-28.pdf Il n’est cependant pas possible de personnaliser entièrement une table des matières, ce qui conduit de nombreux utilisateurs d’ODS à abandonner les sommaires construits automatiquement pour concevoir leurs propres sommaires au moyen des outils offerts par ESCAPECHAR. 8.5.8 La construction de vos sommaires avec ODS Pour introduire cette table des matières, nous repartons du document PDF créé par le programme 8.43 et modifié par le programme 8.45. Nous avons retiré le texte sous le premier tableau mais nous avons laissé l’instruction ODS PDF TEXT qui envoyait vers un site Internet pour la modifier. 1. Cette option n’est disponible que depuis SAS 9.2 – il n’y a pas d’option équivalente avec ODS HTML 2. La procédure est expliquée au moyen d’un exemple sur le site compagnon de cet ouvrage : www.sas-sr.com SAS Livre Page 384 Jeudi, 18. septembre 2008 6:03 18 384 ◆ SAS Programme 8.47 GOPTIONS RESET=ALL; OPTIONS ORIENTATION=landscape PRINTERPATH=postscript NODATE NONUMBER; ODS ESCAPECHAR="^" NOPTITLE; ODS PDF FILE='pgr847.pdf' STYLE=gears NOTOC; TITLE 'Ceci ^S={FOREGROUND=red} est ^S={} mon PDF'; ODS PDF COLUMNS=2; PROC FREQ DATA=vente; FORMAT produit fprod.; TABLES produit / NOPERCENT NOCUM; RUN; ODS PDF TEXT=‘ ‘; ODS PDF TEXT= "^S={FONT_SIZE=10pt JUST=center VJUST=middle CELLHEIGHT=20pt CELLWIDTH=13cm FONT_FACE='Verdana' URL='#graph'} Passer au GRAPH"; ODS PDF ANCHOR = "P1"; PROC PRINT DATA=vente (OBS=20) NOOBS; VAR produit; SUM nombre ca; FORMAT produit fprod.; RUN; ODS PDF COLUMNS=1; PROC FREQ DATA=vente; FORMAT produit fprod.; TABLES produit / NOPERCENT NOCUM; RUN; TITLE 'Les graphiques doivent être présentés sur des pages isolées '; GOPTIONS DEVICE=javaimg; AXIS1 LABEL=NONE; ODS PDF ANCHOR = 'graph'; PROC GCHART DATA=vente; VBAR produit / TYPE=freq DISCRETE NOFRAME MAXIS=axis1 RAXIS=axis1; FORMAT produit fprod.; RUN; ODS PDF TEXT= "^S={FONT_SIZE=10pt JUST=center VJUST=middle CELLHEIGHT=20pt CELLWIDTH=13cm FONT_FACE='Verdana' URL='#P1'} Retour Page 1"; ODS PDF CLOSE; L’instruction suivante crée une barre sur laquelle vous pouvez cliquer : ODS PDF TEXT= "^S={FONT_SIZE=10pt JUST=center VJUST=middle CELLHEIGHT=20pt CELLWIDTH=13cm FONT_FACE='Verdana' URL='#graph'} Passer au GRAPH"; Vous vous déplacez alors vers une « ancre » (ANCHOR) nommée GRAPH. L’ordre de création de cette ancre est donné juste avant la création du graphique via l’instruction : ODS PDF ANCHOR = 'graph'; Si vous demandez la création de l’ancre après le graphique, cela ne fonctionnera pas. Une instruction ANCHOR place en fait une ancre sur le résultat qui va suivre. Sur la page du SAS Livre Page 385 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 385 graphique, on retrouve une instruction URL demandant à ce que l’on se rende sur l’ancre P1. Cette ancre a été créée sur la première page au moyen de l’instruction : ODS PDF ANCHOR = "P1"; Vous remarquez qu’elle est placée après la procédure PROC FREQ : cette ancre est en fait attachée au résultat du PROC PRINT (pour vous en convaincre, modifiez l’instruction ODS PDF COLUMNS=2; et indiquez une colonne – lorsque vous cliquerez sur le bouton créé sur la page du graphique, le résultat du PROC PRINT s’affichera). Exercice 8.1 : Reprenez le document complet (avec sa page de garde) et créez, sur cette page de garde, un sommaire pouvant vous conduire directement sur chacune des pages. Au sein de chacune des pages (sauf dans la page sommaire), vous créerez un pied de page sur lequel vous pourrez cliquer pour revenir vers la page de garde. 8.6 Un nouvel outil : ODS GRAPHICS Une des principales innovations de SAS 9.2 est la mise en production d’ODS GRAPHICS. Cet outil était déjà présent dans SAS 9.0 et 9.1 et faisait partie des fonctionnalités cachées de SAS. En effet, les nouveaux produits proposés et documentés par une version SAS sont généralement déjà présents dans les versions antérieures. Ceux qui fonctionnent passent en production et deviennent officiels ; ceux qui ne fonctionnent pas disparaissent1. Si vous utilisez SAS 9.0 ou 9.1, la version d’ODS GRAPHICS dont vous disposez est donc une version de développement qui ne bénéficie pas de l’ensemble des possibilités offertes par ODS GRAPHICS dans SAS 9.2. ODS GRAPHICS et les nouvelles procédures d’analyse graphique que nous avons évoquées dans le chapitre 7 sont en fait deux éléments d’un même ensemble. ODS GRAPHICS ajoute en fait des sorties graphiques aux procédures d’analyses que vous pouvez utiliser. Les procédures propres à l’analyse de vos tables ne sont pas présentées dans cet ouvrage mais, comme pour les nouvelles procédures PROC SGxxx présentées dans la section 7.5, il nous semble intéressant d’évoquer l’existence de cette nouvelle fonctionnalité. ODS GRAPHICS, à l’intérieur d’une commande ODS HMTL, RTF ou PDF, permet de produire des graphiques auxquels le style de votre document PDF ou HTML est appliqué. La commande ODS GRAPHICS permet plus précisément la production de graphiques prédéterminés de la même manière que votre procédure génère des tableaux de résultats. Toutes les procédures proposées par SAS ne sont pas compatibles avec ODS GRAPHICS. Avec SAS 9.1, les procédures compatibles avec ODS GRAPHICS sont : • Module Base SAS : CORR; • Module SAS/ETS : ARIMA, AUTOREG, ENTROPY, EXPAND, MODEL, SYSLIN, TIMESERIES, UCM, VARMAX, X12. • Module SAS/High-Performance forecasting : HPF. • Module SAS/STAT : ANOVA, CORRESP, GAM, GENMOD, GLM, KDE, LIFETEST, LOESS, LOGISTIC, MI, MIXED, PHREG, PRINCOMP, PRINQUAL, REG, ROBUSTREG. 1. C’est par exemple le cas d’ODS LAYOUT, en développement dans SAS 9.1 et qui a disparu dans SAS 9.2. SAS Livre Page 386 Jeudi, 18. septembre 2008 6:03 18 386 ◆ SAS Avec SAS 9.2, les procédures suivantes ont été ajoutées : • Module Base SAS : FREQ, UNIVARIATE. • Module SAS/ETS : TSCSREG. • Module SAS/High-Performance Forecasting : HPFENGINE. • SAS/QC (expérimental) : ANOM, CAPABILITY, CUSUM, MACONTROL, PARETO, RELIABILITY, SHEWHART. • Module SAS/STAT : BOXPLOT, CALIS, CLUSTER, FACTOR, GLIMMIX, GLMSELECT, LIFEREG, MDS, MULTTEST, NPAR1WAY, PLS, QUANTREG, RSREG, TRANSREG, TTEST. Si vous disposez d’une version 9.2, les graphiques créés par ODS GRAPHICS peuvent être ouverts et modifiés avec Statistical Graphics Editor (SGE) [voir section 7.5]. Afin d’illustrer les possibilités d’ODS GRAPHICS, nous allons examiner les graphiques produits automatiquement par PROC FREQ. Cette procédure n’est compatible avec ODS GRAPHICS que depuis la version 9.2. Nous repartons de la table VENTE qui nous a accompagnés au long de ce chapitre. Pour activer ODS GRAPHICS, il suffit simplement de soumettre la ligne suivante : Programme 8.48 ODS GRAPHICS; ODS HTML BODY='848_1body.html'; PROC FREQ DATA=vente; TABLE produit; TABLE produit*departement; RUN; ODS HTML CLOSE; Ce programme ne modifie en rien votre sortie dans la fenêtre SORTIE et ne produit aucun graphique dans la fenêtre GRAPH. Seule votre sortie HTML est affectée puisque, en plus du tri à plat et du tableau croisé, vous constatez la production d’un graphique représentatif de la distribution de votre variable PRODUIT et de la distribution cumulée (sorties par défaut des tris à plat) : Résultat 8.33 SAS Livre Page 387 Jeudi, 18. septembre 2008 6:03 18 ODS ◆ 387 Pour le tableau croisé, vous constatez la production d’un graphique en deux parties représentatif de la distribution de PRODUIT par DEPARTEMENT (distributions conditionnelles). Résultat 8.34 Les graphiques générés sont présentés au moyen du style par défaut. Vous avez la possibilité d’imposer n’importe quel style ; la présentation de ces graphiques sera modifiée en conséquence. ODS GRAPHICS reste actif tant que vous ne demandez pas à SAS de cesser la production des graphiques par une instruction ODS GRAPHICS OFF. Quelques options propres à ODS GRAPHICS1 : ODS GRAPHICS / _options_; BORDER/NOBORDER Permet de commander un encadrement autour de votre graphique. HEIGHT= WIDTH= Spécifie la hauteur et la largeur de chaque graphique produit. L’unité par défaut est le pixel mais vous pouvez utiliser le centimètre (cm), le millimètre (mm), le pouce (in) et le point (pt). La taille par défaut des graphiques est de 480 * 640 pixels. IMAGEFMT= Permet de spécifier le format dans lequel les graphiques que vous allez créer seront enregistrés. Par défaut, SAS enregistre votre graphique dans le format le plus adapté à votre destination ODS, soit : • Pour ODS HTML, ODS PDF (et plus généralement, les sorties de la famille PRINTER), ODS RTF, le format par défaut sous SAS 9.2 est le PNG. Vous avez aussi accès au format JPEG. • Si vous choisissez ODS LISTING (les graphiques ne sont pas affichés par SAS mais un fichier par graphique est crée à l’emplacement par défaut des sorties ODS), le 1. L’ensemble des options propres à ODS GRAPHICS est présenté dans l’aide SAS, entrée ODS GRAPHICS statements, puis Dictionnary of ODS language statements. SAS Livre Page 388 Jeudi, 18. septembre 2008 6:03 18 388 ◆ SAS format par défaut est le PNG mais vous pouvez aussi demander BMP, DIB, EMF, EPSI, GIF, JFIF, JPEG, JPG, PBM, PDF, PS, SASEMF, STATIC, TIFF, WMF. IMAGEMAP/NOIMAGEMAP En cas de sortie par ODS HTML, si vous cliquez sur un graphique, un petit texte d’explication apparaît. NOIMAGEMAP retire ce texte. IMAGENAME=‘nom_fichier’ Pour donner un nom particulier aux fichiers dans lesquels sont stockés vos graphiques. L’incrémentation est automatique (non_fichier1, nom_fichier2…). L’option RESET=INDEX permet de repartir à zéro. Les fichiers sont enregistrés à l’emplacement par défaut – si vous souhaitez préciser l’emplacement où seront écrits vos fichiers, utilisez l’instruction GPATH à l’intérieur de votre commande ODS HTML. RESET/RESET= Pour annuler l’ensemble des options soumises (RESET) ou simplement une partie des options (RESET=HEIGHT, par exemple). NOSCALE/SCALE Si vous modifiez la taille de votre graphique via des options HEIGHT= et WIDTH=, pour que le contenu du graphique soit automatiquement adapté, vous demandez l’option SCALE. Vous demandez NOSCALE si vous ne souhaitez pas d’adaptation (valeur par défaut SCALE). Vous avez la possibilité de limiter la production de vos graphiques par des commandes ODS SELECT ou ODS EXCLUDE. Vous devez au préalable exécuter un ODS TRACE afin de connaître le nom des éléments graphiques. Les sorties graphiques générées par ODS GRAPHICS sont propres à chaque procédure. Vous pouvez au sein de chaque procédure compatible avec ODS GRAPHICS modifier votre sortie par défaut au moyen de l’option PLOTS=. Elle intervient généralement comme option de votre commande de sortie : PROC FREQ DATA=vente; TABLE produit / PLOTS=…; TABLE produit*departement/ PLOTS=…; RUN; Pour la syntaxe générale de cette option PLOTS, vous pouvez consulter l’aide SAS, entrée PLOTS= option, ODS Graphics. En fonction de la procédure que vous utilisez, les caractéristiques des sorties graphiques générées par ODS GRAPHICS sont exposées dans le détail de la syntaxe propre à la procédure. Vous devez là aussi consulter l’aide SAS en passant par le SOMMAIRE, puis SAS PRODUCTS. Recherchez alors le module qui contient votre procédure. Dans le détail de votre procédure, vous trouverez généralement une section consacrée à ODS GRAPHICS. SAS Livre Page 389 Jeudi, 18. septembre 2008 6:03 18 9 Le langage macro sous SAS Au sommaire de ce chapitre : 9.1. Les concepts du langage macro 9.2. Les macro-variables 9.3. Les fonctions macro du langage SAS 9.4. Les macro-fonctions 9.5. Premiers exemples sans macro-programme 9.6. Les macro-programmes 9.7. Conserver ses macro-programmes 9.8. Quelle aide au débogage des macro-programmes ? 9.9. Un cas pratique Arrivé à ce dernier chapitre, vous êtes maintenant un utilisateur expérimenté de SAS. Vous avez certainement remarqué que vos programmes ont souvent des éléments de syntaxe en commun, qui se répètent. Le langage macro a pour principal objectif d’éviter ces répétitions en créant des programmes génériques qui pourront s’appliquer dans différents contextes. Vous allez en fait paramétrer vos programmes et ainsi simplifier les traitements que vous allez imposer à vos données. Sans langage macro, lorsque vous avez un certain nombre de tâches identiques à effectuer sur de nombreuses tables, vous devez écrire votre programme une première fois et demander son exécution sur votre première table. Ensuite, vous identifiez les éléments permanents de votre programme et les éléments qui doivent être modifiés pour que ce programme puisse s’appliquer à la table suivante. Vous copiez-collez votre programme, modifiez ces éléments non permanents, puis réfléchissez à votre travail sur votre troisième table. Imaginons le cas suivant : vous disposez de 50 tables, contenant chacune une variable (le nom de la variable change entre chaque table). Votre souhait est de centrer chacune des variables : vous devez calculer une moyenne, rapatrier cette moyenne dans la table de départ et enfin calculer l’écart entre la variable et sa moyenne. Si vous n’utilisez pas le langage macro, votre programme SAS complet sera composé de 50 sous-programmes. Chaque sous-programme est constitué de quatre étapes : 1. Une étape PROC MEANS sur votre table avec construction d’une table d’OUTPUT. SAS Livre Page 390 Jeudi, 18. septembre 2008 6:03 18 390 ◆ SAS 2. Une étape DATA de modification de la table d’OUTPUT puisqu’il faut introduire une clé nécessaire au MERGE de l’étape 4. 3. Une étape de modification de la table de départ (introduction de la clé nécessaire au MERGE). 4. Le MERGE entre la table de départ modifiée et la table de résultats, puis le calcul de la différence entre la variable et sa moyenne. Maintenant, pour passer d’une table à une autre, vous allez devoir modifier le nom de la table, le nom de la variable à analyser, peut-être le nom de la table de résultats (si vous souhaitez la conserver pour une utilisation ultérieure), le nom de la variable moyenne, éventuellement le nom de la variable centrée… Ce sera long et fastidieux, et vous avez de fortes chances de commettre des erreurs de programmation. Le langage macro vous donne notamment la possibilité de réaliser des tâches similaires avec des valeurs modulables pour certains éléments (options, noms de tables, de bibliothèques, de variables). Grâce au langage macro, vous pourrez aussi : • effectuer certains traitements selon des valeurs, modifiables à souhait, affectées à un ou plusieurs paramètres ; • récupérer certains éléments résultant d’une étape DATA pour une utilisation dans une autre étape DATA. Pour illustrer le dernier point, vous remarquerez que votre souhait de centrer vos variables vous oblige à créer une table temporaire dans laquelle vous mettrez votre moyenne pour ensuite, via un MERGE, rapatrier cette information dans la table de départ. Si votre table de départ est de taille importante, cette façon de procéder peut vite devenir problématique parce qu’elle consomme du temps et surtout de la place sur votre disque dur. Le langage macro vous épargnera ce genre de perte de temps et de ressources. 9.1 Les concepts du langage macro Le langage macro doit être compris comme un langage à part, différent du langage SAS que nous avons étudié dans les huit premiers chapitres de cet ouvrage. Si ce langage est à part, il faut cependant qu’il s’intègre dans des programmes utilisant les outils du langage SAS : le langage macro ne peut rien produire1 s’il n’est pas associé à des étapes DATA ou à des PROC. Nous présenterons dans cette section les concepts propres à ce langage qui seront développés dans les sections suivantes. Ce langage fait appel principalement à quatre éléments : les macro-variables, les macrofonctions, les macro-instructions (ou macro-commandes) et les macro-programmes. Les macro-fonctions ont un ou plusieurs arguments et renvoient quelque chose : %PUT %EVAL(2+2); Dans cette instruction, %EVAL est une macro-fonction qui demande de considérer la chaîne de caractères 2+2 comme quelque chose à évaluer (cela fait 4). %PUT est une macro-instruction : elle ordonne la réalisation d’une tâche. Dans le cas présent, %PUT indique à SAS qu’il doit écrire ce qui suit dans la fenêtre JOURNAL. 1. Sauf des sorties dans votre fenêtre JOURNAL. SAS Livre Page 391 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 391 Le langage macro peut être utilisé de deux manières : en code ouvert ou à l’intérieur d’un macro-programme. L’instruction %PUT %EVAL(2+2) peut être exécutée seule, en dehors de toute autre commande, de la même manière qu’une commande OPTIONS : il s’agit d’une programmation en code ouvert. Un macro-programme est constitué de deux phases : une phase d’écriture et une phase d’exécution. Voici votre premier macro-programme dans sa phase d’écriture. Cette phase débute par une macro-commande %MACRO et se termine par une macro-commande %MEND. %MACRO test; %PUT %EVAL(2+2); %MEND test; Nous créons ici un macro-programme appelée TEST. Si vous soumettez ces trois lignes à SAS, vous constaterez qu’il ne se passe pas grand-chose dans votre fenêtre JOURNAL. Cependant, à partir du moment où votre macro-programme est soumis, vous pouvez demander son exécution quand bon vous semble, au moins pendant la durée de votre session SAS. %test %test %test %test Ces quatre demandes d’exécution conduiront à présenter dans la fenêtre JOURNAL quatre fois le résultat de 2+2. Si vous êtes en code ouvert, ou dans la phase d’écriture du macro-programme, vos instructions doivent se terminer par un point-virgule. Vous n’avez pas besoin de point-virgule pour que la demande d’exécution de votre macro-programme TEST soit exécutée. Les noms des macro-programmes, macrofonctions et macro-commandes débutent tous par le signe %. Dans les macro-programmes que vous allez écrire, vous aurez besoin de macrocommandes et de macro-fonctions qui auront généralement comme arguments des macro-variables. Dans une macro-variable, la valeur d’un paramètre est stockée sous la forme d’une chaîne de caractères. D’un point de vue physique, les macro-variables ne sont pas rattachées à une table mais sont stockées, pendant au moins la durée de votre session SAS (il est possible de les conserver d’une session à une autre), dans une table à part. Vous pouvez accéder à cette table afin de voir quelles sont les valeurs associées à cette macro-variables via l’EXPLORATEUR, puis SASHELP et enfin VMACRO. Si vous appelez votre macro-variable, SAS vous renvoie la chaîne de caractères qu’il associe à cette macro-variable. %LET TOTO=bonjour; %PUT le texte stocké dans ma première macro-variable est &TOTO; La première instruction fait appel à la macro-commande %LET. Cette macrocommande indique à SAS que le texte qui suit est le nom d’une macro-variable et qu’il trouvera après le signe égale la modalité à donner à cette macro-variable. %LET crée donc une macro-variable TOTO qui a pour modalité la chaîne de caractères « bonjour ». Pour appeler ensuite une macro-variable, vous utiliserez le caractère &. SAS Livre Page 392 Jeudi, 18. septembre 2008 6:03 18 392 ◆ SAS La seconde instruction vous permet de voir dans votre fenêtre JOURNAL le texte suivant : le texte stocké dans ma première macro-variable est bonjour Les macro-variables que vous allez définir peuvent être utilisées à l’intérieur de la programmation SAS usuelle comme le montre le programme 9.1. Les deux approches développées conduiront exactement au même résultat. Programme 9.1 Première approche sans macro-variables PROC PRINT DATA=test1; VAR x1 x2; WHERE annee=2007; RUN; Seconde approche avec macro-variables %LET base=test1; %LET VAR=x1 x2; %LET annee=2007; PROC PRINT DATA=&base; VAR &VAR; WHERE annee=&annee; RUN; Ce programme nous permet aussi de comprendre le fait suivant : les éléments du langage macro sont traités prioritairement par SAS. Lorsqu’un programme est soumis, les éléments macro sont résolus en premier et SAS remplace les appels aux macro-variables (&) par les valeurs qui ont été stockées. Une fois que toutes les références aux macro-variables ont été résolues, il exécutera les instructions propres au langage SAS (PROC ou DATA). Les noms de vos macro-variables doivent impérativement commencer par une lettre ou par un _ (underscore). Vous pouvez suite à ce caractère utiliser n’importe quelle lettre (même avec accent), n’importe quel chiffre et d’autres signes. La casse n’a aucune importance (les noms toto, Toto, ToTo, TOTO… sont parfaitement équivalents). La longueur maximale autorisée pour le nom d’une macro-variable est de 8 caractères si vous disposez d’une version de SAS antérieure à la version 8 et de 32 caractères depuis la version 8. Dans une macro-variable, vous allez pouvoir stocker une chaîne de caractères qui pourra représenter un nombre, une opération, une date, un programme… En fait, SAS va stocker dans la macro-variable tout le texte situé entre le signe égale qui suit le nom de la macro-variable et le point-virgule qui termine l’instruction %LET. Depuis la version 9 de SAS, vous pouvez stocker 65 534 caractères dans une macro-variable (32 767 dans la version 8 et 200 caractères dans les versions antérieures). Votre chaîne de caractères peut contenir n’importe quels caractères. Certains caractères comme %, la virgule, le point-virgule et l’apostrophe (ou une simple quote) peuvent cependant poser problème comme nous le verrons dans la section 9.4.3. La casse est conservée (ainsi, la valeur toto n’est pas équivalente à ToTo). Exécutez le programme 9.2. SAS Livre Page 393 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 393 Programme 9.2 %LET %LET %LET %LET %LET x1=jean dupont ; x2=2008; x3="étudiant du master 1 ESA"; x4=10/04/2008; x5=2+2; %PUT &x1 &x2 &x3 &x4 &x5; %PUT &x1 &x2 &x3 &x4 &x5; Vous obtenez dans votre fenêtre JOURNAL : Résultat 9.1 487 488 489 490 491 492 493 jean 494 495 496 497 498 jean %LET %LET %LET %LET %LET x1=jean dupont ; x2=2008 ; x3="étudiant du master 1 ESA" ; x4=10/04/2008 ; x5=2+2 ; %PUT &x1 &x2 &x3 &x4 &x5 ; dupont 2008 "étudiant du master 1 ESA" 10/04/2008 2+2 %PUT &x1 &x2 &x3 &x4 &x5; dupont 2008 "étudiant du master 1 ESA" 10/04/2008 2+2 Dans une macro-variable, vous ne stockez que du texte. Ainsi, 2+2 ne donne pas 4. Si vous mettez des guillemets, ils seront stockés dans la macro-variable1. Vous notez aussi la présence systématique d’un espace (et même de 15 espaces pour la macrovariable X1) entre la fin de la modalité à stocker et le point-virgule qui clôt l’instruction %PUT. Les espaces situés à droite du dernier caractère de la modalité ne sont pas stockés dans les macro-variables. 9.2 Les macro-variables L’objet de cette section est d’approfondir notre connaissance des macro-variables, notamment des règles qui concourent à l’accession des valeurs stockées dans ces macro-variables, les différents types de macro-variables et enfin les moyens dont vous disposez pour effacer vos macro-variables. 1. Attention, dans notre cas, les guillemets ne posent pas de difficultés car ils apparaissent par paires. Vous aurez des difficultés si vous tentez de faire saisir une chaîne de caractères qui contient un nombre impair de guillemets, voir section 9.4.3. SAS Livre Page 394 Jeudi, 18. septembre 2008 6:03 18 394 ◆ SAS 9.2.1 Accéder à la valeur d’une macro-variable L’accession à la valeur d’une macro-variable obéit à un certain nombre de règles qu’il convient de connaître afin de pouvoir utiliser au mieux le langage macro. Ces règles sont au nombre de six : 1. ¯ovariable fait ressortir la valeur stockée dans la macro-variable. 2. ¯ovariable. (merci de noter le point) fait ressortir la valeur stockée dans la macro-variable : Le signe & indique au compilateur macro que le nom de la macro-variable va commencer. Le signe « . » est optionnel : il indique à SAS que le nom de la macro-variable est terminé. 3. texte : si votre texte ne contient ni & ni % collé à un autre caractère, il est restitué tel quel par le compilateur macro. %PUT bonjour &TOTO; L’instruction écrira dans la fenêtre JOURNAL le texte « bonjour » suivi de la valeur stockée dans la macro-variable toto. 4. Chaque groupe de && sera remplacé par un seul & dans la lecture suivante de l’expression. %PUT bonjour &&TOTO; donnera le même résultat que précédemment mais la résolution de l’expression &&TOTO nécessiter deux passages par le compilateur macro : &&TOTO devient &TOTO, puis résolution de &TOTO 5. Le compilateur macro fait autant de lectures que necessaire pour éliminer tous les & dans l’expression qu’il a à traiter avant d’exécuter la commande %PUT. Le nombre de lectures effectuées par le compilateur macro n’est cependant pas égal au nombre de & qui peuvent se suivre. 6. Les expressions placées entre guillemets simples sont renvoyées telles quelles. TITLE 'Bonjour &TOTO'; Donnera comme titre à votre sortie : bonjour &toto Alors que : TITLE "Bonjour &TOTO"; donnera comme titre à votre sortie : BONJOUR + valeur de la macro-variable TOTO Prises isolément, ces règles ne semblent pas extraordinaires. Mais en les combinant, vous pouvez obtenir des résultats intéressants (voire inattendus si vous n’avez pas bien compris). Programme 9.3 %LET bibli=lib; %LET nombase=test; SAS Livre Page 395 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 395 %LET %LET %LET %LET %LET nombase1=toto; num=1; a=b; b=c; c=d; Si vous appelez &nombase &nombase. &nombase1 &nombase.1 &bibli&nombase &bibli.&nombase &bibli..&nombase &&nombase&num vous obtiendrez -> -> -> -> -> -> -> -> test test toto test1 libtest libtest lib.test toto Le dernier exemple mérite quelques explications : lors d’un premier passage dans le compilateur macro, &&NOMBASE&NUM devient &NOMBASE1, puis le deuxième passage donne le résultat toto. Les macro-variables A B et C vont nous permettre de mieux comprendre la règle numéro 4 : Si vous appelez &a &&&a &&&&&&&a vous obtiendrez -> b -> c -> d Lorsque l’expression &&&&&&&a est analysée par le compilateur macro, tous les groupes de && sont remplacés par un seul &, et &a est remplacé par sa valeur, soit « b » : &&&&&&&a devient &&&b (premier passage dans le compilateur macro). Les deux premiers & sont ensuite remplacés par un seul, et &b est remplacé par sa valeur, soit « c » : &&&b devient &c (deuxième passage). &c est remplacé par sa valeur (troisième passage). Il n’y a donc pas de correspondance exacte entre le nombre de & qui peuvent se suivre et le nombre de passages dans le compilateur macro. Ce dernier exemple permet juste de mieux comprendre les régles qui guident la résolution des macro-variables : vous aurez rarement besoin de plus de trois signes & consécutifs dans vos macro-programmes. 9.2.2 Les macro-variables automatiques Si vous souhaitez connaître les noms et les valeurs prises par les macro-variables, vous pouvez consulter la table VMACRO située dans SASHELP. On peut aussi, au lieu d’ouvrir la table, exécuter le programme 9.4. Programme 9.4 PROC PRINT DATA=sashelp.vmacro LABEL; VAR name value; WHERE scope="GLOBAL"; RUN; SAS Livre Page 396 Jeudi, 18. septembre 2008 6:03 18 396 ◆ SAS Il est aussi possible de voir les valeurs prises par les macro-variables ainsi que leur nom en exécutant : %PUT _all_; Vous remarquerez qu’avec cette dernière instruction, deux types de macro-variables apparaissent : les macro-variables GLOBAL et les macro-variables AUTOMATIC. Les GLOBAL sont celles que vous avez créées, les AUTOMATIC sont les macro-variables automatiques. Pour afficher uniquement les macro-variables créées (ou, alternativement, uniquement les automatiques) : %PUT _user_; ou %PUT _global_; %PUT _automatic_; Les macro-variables _USER_ se partagent en deux groupes : les macro-variables de type GLOBAL et les macro-variables de type LOCAL (voir section 9.6.1.). Dans le tableau 9.1, nous avons édité quelques-unes des macro-variables automatiques en donnant quelques explications. Tableau 9.1 • Les macro-variables automatiques Nom de la macrovariable Valeur de la macro-variable Explications SYSDATE 30APR08 Date système SYSDATE9 30APR2008 Idem mais en plus long SYSDAY Wednesday Jour d’aujourd’hui SYSDEVIC WIN Environnement SYSDSN WORK TEST Dernière bibliothèque et dernière table SYSERR 0 Mis à jour après chaque étape DATA ou PROC exécutée : 0 si OK, 4 si WARNING dans la fenêtre JOURNAL, 5 si message ERROR dans la fenêtre JOURNAL SYSLAST WORK.TEST Dernière table créée SYSPROCESSID 41D64DA0323343964020000000000000 Identifiant du processeur SYSPROCESSNAME DMS Process Indique que nous travaillons dans le mode fenêtré de SAS SYSPROCNAME PRINT Dernière PROC utilisée SYSRC 0 Code de la dernière erreur rencontrée SYSSCP WIN Environnement SYSSCPL XP_PRO Système d’exploitation SYSSITE 0050111545 Nom numéro de licence SAS SYSTIME 10:15 Heure d’ouverture de la session SAS SAS Livre Page 397 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 397 Tableau 9.1 • Les macro-variables automatiques (Suite) Nom de la macrovariable Valeur de la macro-variable Explications SYSUSERID Ringuede Propriétaire SYSVER 9.2 Version de SAS utilisée SYSVLONG 9.02.01M0P020508 Plus précis avec la date de l’installation de cette version La macro-variable SYSERR vous sera particulièrement utile en cas d’erreur dans votre programme puisqu’en fonction de la valeur prise par cette variable, vous pourrez arrêter votre programme à l’endroit où vous avez commis votre erreur de programmation. 9.2.3 La suppression des macro-variables La suppression des macro-variables s’effectue au moyen de la macro-instruction %SYMDEL. Vous ne pouvez effacer que les macro-variables que vous avez définies (_USER_). %SYMDEL macrovariable1 macrovariable2…; Les commandes %SYMDEL _ALL_; %SYMDEL MV1-MV9; ne sont pas possibles. Si vous souhaitez effacer l’ensemble des macro-variables construites, vous pouvez utiliser ce premier macro-programme1. Programme 9.5 %MACRO delmac; DATA macs; SET sashelp.vmacro; RUN; DATA _null_; SET macs; IF scope='GLOBAL' THEN CALL EXECUTE('%SYMDEL '||TRIM(LEFT(name))||';'); RUN; %MEND; %delmac ; Dans ce macro-programme appelé DELMAC, nous demandons la création d’une table MACS, copie de VMACRO, qui contient des détails sur l’ensemble des macrovariables à votre disposition. 1. Ce macro programme est proposé par diverses documentations et lettres d’information SAS. SAS Livre Page 398 Jeudi, 18. septembre 2008 6:03 18 398 ◆ SAS Sur cette table, nous indiquons que, pour les macro-variables de type GLOBAL, nous souhaitons : CALL EXECUTE('%SYMDEL '||TRIM(LEFT(name))||';') CALL EXECUTE est une routine qui permet de profiter des outils du langage macro à l’intérieur d’une étape DATA. Ici, lorsque la macro-variable est globale, SAS prend le nom de la variable, place ce nom à gauche (LEFT), efface les blancs qui pourraient apparaître à droite (TRIM)1 : nous effectuons donc une concaténation pour former la chaîne ‘%SYMDEL MV;’ CALL EXECUTE permet donc que cette commande appartenant au langage macro soit exécutée au sein de votre étape DATA. Ce fonctionnement est nécessaire puisque les informations utiles au langage macro se trouvent dans une table dont la manipulation est régie par le langage SAS. Enfin, le fait que les modalités des macro-variables soient des chaînes de caractères vous explique pourquoi nous utiliserons beaucoup les fonctions développées pour les variables alphanumériques et présentées dans la section 3.2.6. 9.3 Les fonctions macro du langage SAS La routine CALL EXECUTE vous indique qu’il existe, au sein du langage SAS, des instructions qui permettent un lien entre le langage SAS et le langage macro. C’est en effet nécessaire puisque les informations qui sont contenues dans des tables pourront vous être utiles dans votre programmation macro. À l’intérieur du langage SAS, vous disposez de cinq fonctions et de deux autres routines2. 9.3.1 La routine CALL SYMPUT Le principe d’une routine est d’utiliser des informations contenues dans une table sans pour autant modifier cette table. La routine CALL SYMPUT permet de créer des macro-variables auxquelles vous allez assigner des valeurs qui sont, pour l’instant, modalités d’une variable présente dans une table SAS. Cette instruction peut prendre trois formes. Dans sa version la plus simple, vous pouvez assigner à une macro-variable la valeur prise par une variable de votre table. Programme 9.6 DATA test; INPUT X $ @@; CARDS; 1. L’association LEFT et TRIM peut être remplacée par la fonction STRIP introduite avec SAS 9. Cependant, elle continue à être employée dans de nombreux programmes. 2. Les fonctions suivantes ne seront pas développées dans cet ouvrage : – SYMEXIST : indique si la macro variable existe ou pas (voir l’aide SAS, entrée SYMEXIST function). – SYMGLOBL : indique si une macro variable globale existe ou pas (voir l’aide SAS, entrée SYMGLOBL function). – SYMLOCAL : indique si une macro variable locale existe ou pas (voir l’aide SAS, entrée SYMLOCAL function). Nous développons dans cette section les routines CALL SYMPUT et CALL SYMPUTX ainsi que les fonctions SYMGET et RESOLVE. SAS Livre Page 399 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 399 a b c d e f g h i ;RUN; DATA test; SET test; CALL SYMPUT ("toto",x); RUN; Si vous appelez maintenant la macro-variable TOTO, vous constaterez que c’est « i » qui a été stocké (c’est en effet la valeur de X à la dernière ligne de la table qui est conservée puisque SAS a appliqué votre instruction à toutes les observations les unes après les autres). Vous noterez donc qu’une macro-variable ne peut contenir qu’une seule valeur (contrairement à une variable SAS qui peut prendre autant de valeurs qu’il y a d’observations dans votre table). La structure de l’instruction est la suivante : CALL SYMPUT ("nom de la MV", valeur de la MV) Le nom de la macro-variable doit impérativement apparaître entre quotes (simples ou doubles). Le second argument de cette instruction peut être : • une valeur : CALL SYMPUT("test",4); • une variable : CALL SYMPUT ("test",X); • une transformation de votre variable : CALL SYMPUT("test",X*RANNOR(234)). Dans le dernier cas, X doit être numérique. Vous pouvez utiliser n’importe quelle fonction propre au langage SAS. Il est ensuite possible, avec une instruction CALL SYMPUT, de créer plusieurs macro-variables. Programme 9.7 DATA test; SET test; CALL SYMPUT(COMPRESS("toto"!!_N_),x); RUN; L’instruction permet ici de créer autant de macro-variables qu’il y a de lignes dans la table de départ. TOTO1 aura pour valeur « a », TOTO2, « b », etc.. Vous pouvez écrire dans vos macro-variables des transformations de variables présentes dans votre table. Programme 9.8 DATA test; SET test; z+1; CALL SYMPUT(COMPRESS("toto"!!_N_),ROUND(z/5+1,1)); RUN; La procédure utilisée ici consiste à ouvrir la table, à effectuer une manœuvre, puis à fermer et donc récrire la table de départ. Si votre table est de taille importante, vous allez perdre du temps. On préférera toujours le type de programmation présenté par le programme 9.9 si vous n’avez rien à écrire dans la table (et c’est bien le cas ici : CALL SYMPUT est une routine qui ne modifie pas votre table). SAS Livre Page 400 Jeudi, 18. septembre 2008 6:03 18 400 ◆ SAS Programme 9.9 DATA _NULL_; SET test; CALL SYMPUT(COMPRESS("toto"!!_N_),ROUND(z/5+1,1)); RUN; Les macro-variables que vous allez créer au moyen d’une instruction CALL SYMPUT ne pourront être utilisées qu’après le RUN – il n’est pas possible ici d’avoir un programme de ce genre : Programme 9.10 DATA _NULL_; SET test; CALL SYMPUT(COMPRESS("toto"!!_N_),ROUND(z/5+1,1)); toto1=&toto1; RUN; Si vous souhaitez utiliser la valeur captée dans la macro-variable au sein de la même étape DATA, vous devez passer avant par l’instruction RESOLVE. Programme 9.11 DATA _NULL_; SET test; CALL SYMPUT(COMPRESS("toto"!!_N_),ROUND(z/5+1,1)); toto1=RESOLVE('&toto1'); RUN; La commande DATA _NULL_ indique à SAS d’ouvrir une table mais de ne rien écrire une fois les instructions réalisées : la manœuvre consistant à construire une nouvelle variable n’a donc ici aucun intérêt. L’instruction CALL SYMPUT peut aussi être utilisée d’une troisième manière. Dans ce dernier cas, la structure de votre ligne de commande est la suivante : CALL SYMPUT(var1,var2). Programme 9.12 DATA test; INPUT x1 $ x2; CARDS; a 1 b 2 c 1 d 2 f 1 ;RUN; DATA test; SET test; CALL SYMPUT (x1,x2); RUN; SAS Livre Page 401 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 401 Ce type de programmation permet de créer autant de macro-variables qu’il y a de modalités à la variable X1. Cette dernière variable doit être une variable alphanumérique et les modalités de cette variable doivent commencer par une lettre ou un underscore (blanc souligné) ‘_’ puisqu’elles vont devenir des noms de macro-variables. Cinq macro-variables sont créées par le programme 9.12 puisque X1 présente cinq modalités : %PUT &a &b &c &d &f; Le programme 9.13 permet de mieux comprendre les valeurs stockées dans les macro-variables créées par CALL SYMPUT dans ce cas. Programme 9.13 DATA test; INPUT x1 $ x2; CARDS; a 1 a 2 a 3 b 6 b 5 b 4 c 9 c 7 c 8 ;RUN; DATA _NULL_; SET test; CALL SYMPUT (x1,x2); RUN; %PUT on obtient:&a &b &c; Vous observez dans votre fenêtre JOURNAL le résultat suivant : 144 %PUT on obtient:&a &b &c ; on obtient: 3 4 8 Les valeurs stockées sont respectivement 3, 4 et 8, soit les dernières valeurs de X2 vues pour chaque modalité de X1. Vous noterez aussi que les modalités des macro-variables, lorsqu’elles sont numériques, sont placées à droite d’un champ d’une longueur de 12 caractères. Ainsi, pour résumer, la fonction CALL SYMPUT peut, à l’intérieur d’une étape DATA : • Créer une macro-variable dans laquelle on va stocker la valeur prise par une variable dans une table SAS : CALL SYMPUT (‘nom’, X) • Créer autant de macro-variables qu’il y a d’individus dans la table et attribuer à ces macro-variables la valeur prise par une certaine variable X : CALL SYMPUT (COMPRESS(‘nom’ !!_n_), X) • Créer autant de macro-variables qu’il y a de modalités à une certaine variable X1 et lui associer la valeur prise par une variable X2 : SAS Livre Page 402 Jeudi, 18. septembre 2008 6:03 18 402 ◆ SAS CALL SYMPUT (X1,X2) La routine CALL SYMPUTX est très proche de CALL SYMPUT. CALL SYMPUTX positionne à gauche les deux arguments et retire les blancs à droite du premier argument (le nom de la macro-variable). CALL SYMPUT ne positionne pas à gauche et ne retire que les blancs à droite du premier argument. Le programme 9.14 illustre cette différence de fonctionnement1. Programme 9.14 DATA _NULL_; CALL SYMPUTX(' testX ',' <- + blancs à droite retirés '); CALL SYMPUTX(' xX ', 123.456); CALL SYMPUT(' testT1 ',' ne fonctionne pas '); CALL SYMPUT(' xT1 ', 123.456); CALL SYMPUT('testT2 ',' pas à gauche + blancs à droite non retirés CALL SYMPUT('xT2 ', 123.456); RUN; %PUT %PUT %PUT %PUT '); testX=!&testX!; xX=!&xX!; testT2=!&testT2!; xT2=!&xT2!; Les macro-variables testT1 et xT1 ne sont pas créées puisqu’il n’y a pas d’alignement à gauche du premier argument et qu’une macro-variable doit avoir un nom commençant par une lettre ou un underscore2. Vous obtenez dans votre fenêtre JOURNAL le résultat 9.2. Résultat 9.2 239 %PUT testX=!&testX!; testX=!<- + blancs à droite retirés! 240 %PUT xX=!&xX!; xX=!123.456! 241 %PUT testT2=!&testT2!; testT2=! pas à gauche + blancs à droite non retirés 242 %PUT xT2=!&xT2!; xT2=! 123.456! ! Pour la dernière macro-variable créée, le texte ‘123.456’ est positionné à droite d’un champ de 12 caractères mais les caractères qui apparaissent à droite de xT2, dans l’instruction de création de la macro-variable, sont bien éliminés par l’instruction CALL SYMPUT. 9.3.2 La fonction SYMGET La fonction SYMGET permet de créer des variables dans une table SAS à partir de macro-variables que l’on aura définies au préalable. Elle permet, au cours d’une étape 1. Il existe d’autres différences de fonctionnement. Pour plus de détails, consultez l’aide SAS, entrée CALL SYMPUTX Routine. 2. Si vous exécutez le programme 9.14, vous constaterez une nouvelle fois la priorité donnée aux instructions du langage macro sur les instructions de l’étape DATA. Les deux premières instructions CALL SYMPUT génèrent une erreur de syntaxe : l’étape DATA est donc interrompue mais les quatre macro variables sont tout de même construites. SAS Livre Page 403 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 403 DATA et dans une certaine mesure, de « détricoter » ce que CALL SYMPUT a créé. La syntaxe de cette commande est : Z=SYMGET(argument). Trois programmations sont ici possibles : • Z=SYMGET(‘nom’) : dans ce cas, la variable Z aura comme modalité la valeur stockée dans la macro-variable nom. • Z=SYMGET(X1) : ici, X1 est une variable alphanumérique qui a pour modalités les noms des macro-variables définies au préalable. La nouvelle variable Z aura pour modalités les valeurs stockées dans ces macro-variables. On « détricote » ici ce que l’on a pu construire avec un CALL SYMPUT (X1,X2). • Z=SYMGET(‘nom’ !!LEFT(PUT(_N_,W.))) : il existe a priori n macro-variables. Z aura pour modalités les valeurs des macro-variables créées au moyen d’une commande CALL SYMPUT (COMPRESS(‘nom’ !!_N_), X). Le programme 9.15 propose une illustration du fonctionnement de SYMGET. La table TEST utilisée a été créée par le programme 9.13. Programme 9.15 DATA _NULL_; SET test; CALL SYMPUT('toto',x2); CALL SYMPUT(COMPRESS('titi'!!_N_),x2); CALL SYMPUT (x1,x2); RUN; DATA test2; SET test; Z1=SYMGET('toto'); Z2=SYMGET('titi'!!LEFT(PUT(_N_,2.))); Z3=SYMGET(x1); RUN; Votre table TEST2 a maintenant cette forme : Résultat 9.3 Obs 1 2 3 4 5 6 7 8 9 x1 a a a b b b c c c x2 1 2 3 6 5 4 9 7 8 Z1 Z2 Z3 8 8 8 8 8 8 8 8 8 1 2 3 6 5 4 9 7 8 3 3 3 4 4 4 8 8 8 La construction de Z1 ne pose pas de problème. 8 est la dernière modalité de X2 lue, Z1 est donc égal à 8 pour toutes les observations. En ce qui concerne la construction de Z2, quelques explications sont nécessaires1 : Z2=SYMGET('titi'!!LEFT(PUT(_N_,2.))); 1. L’instruction LEFT(PUT(_N_,2.)) peut être remplacée par PUT(_N_,2.,-L) – cette dernière programmation fait appel à des options de PUT non évoquées dans cet ouvrage. Voir l’aide SAS pour une description complète de cette instruction, entrée PUT function. SAS Livre Page 404 Jeudi, 18. septembre 2008 6:03 18 404 ◆ SAS Cette instruction permet de reconstruire la série des macro-variables TITI1, TITI2, etc. Nous demandons à SAS de concaténer TITI avec le rang de l’observation (_N_), qui sera écrit avec 2 caractères au maximum (il y a 9 observations dans la table, un seul caractère aurait suffi1) – ce numéro devra être positionné à gauche de façon que nous obtenions bien TITI1 et non pas TITI 1. La commande demande donc à SAS de mettre en ligne 1 la valeur enregistrée dans la macrovariable TOTO1, en ligne 2 la valeur enregistrée de TOTO2, etc. Il y a donc dans l’exemple présenté ici une stricte correspondance entre X2 et Z2. Maintenant, si vous avez, par exemple, trié votre table avant de créer la table TEST2, cette correspondance ne sera plus observée. En ce qui concerne Z3, la commande SYMGET indique à SAS de mettre en Z3 la valeur de la macro-variable dont le nom est donné par la modalité prise par X1. La commande SYMGET crée par défaut une variable alphanumérique ayant une longueur égale à 200. De façon que la taille de votre table ne soit pas trop importante, il conviendra de définir avant toute commande SYMGET la longueur de la variable à créer en fonction des modalités que vous allez lui imposer. Programme 9.16 DATA test2; SET test; LENGTH Z1 $ 8 Z2 $ 6 Z3 $ 4; Z1=LEFT(SYMGET('toto')); Z2=LEFT(SYMGET('titi'!!LEFT(PUT(_N_,2.)))); Z3=LEFT(SYMGET(x1)); RUN; L’instruction LEFT préalable au SYMGET est importante. Si SYMGET place dans une variable de longueur 200 la chaîne de texte contenue dans une macro-variable, le texte se retrouvera à droite dans l’enregistrement. L’instruction LENGTH demande, elle, de ne conserver que x caractères sur 200 mais SAS ne conserve que les x premiers caractères en partant de la gauche. Vous devez donc demander à ce que la chaîne de caractères soit placée à gauche pour qu’il subsiste quelque chose dans les modalités des variables Z1, Z2 et Z3. En revanche, si vous êtes passé au préalable par une routine CALL SYMPUTX pour créer vos macro-variables, l’alignement à gauche n’est pas nécessaire. Exercice 9.1 : Il ne s’agit pas ici d’exécuter le programme ci-dessous mais bien de réfléchir aux valeurs stockées dans les différentes macro-variables, de nommer les différentes macro-variables créées et ensuite de donner les modalités des variables créées à partir des macro-variables. Programme 9.17 DATA test; INPUT (x1 x2) ($); CARDS; pierre A 1. Par ailleurs, dans notre cas, si vous indiquez un FORMAT 1., la commande LEFT n’est plus obligatoire. SAS Livre Page 405 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 405 jean B luc A rené B tom A ;RUN; DATA test;SET test; CALL SYMPUT('toto',x2); CALL SYMPUT(COMPRESS('titi'!!_N_),x2); CALL SYMPUT (x2,x1); RUN; DATA test2; SET test; LENGTH Z1 $ 8 Z2 $ 6 Z3 $ 4; Z1=LEFT(SYMGET('toto')); Z2=LEFT(SYMGET('titi'!!LEFT(PUT(_N_,2.)))); Z3=LEFT(SYMGET(x2)); RUN; Exercice 9.2 : Un étudiant du master ESA est venu un jour me voir avec le problème suivant. Il dispose de deux tables de taille très importante. Dans la première table (DEP1), le département de résidence est saisi au moyen de deux variables alphanumériques. La première saisit le département au moyen de son numéro (01)1, la seconde saisit le département en toutes lettres (‘Ain’). Dans la seconde table, le département est uniquement saisi par son numéro et on souhaite pouvoir disposer dans cette seconde table des départements en toutes lettres. Un MERGE est impossible en raison de la taille des tables. Quelle programmation proposez-vous à cet étudiant ? (Vous pouvez vous aider des tables DEP1 et DEP2 jointes aux fichiers téléchargeables sur le site compagnon de cet ouvrage.) 9.4 Les macro-fonctions Nous allons évoquer dans cette section les fonctions propres au langage macro. Il existe principalement trois types de fonctions : les fonctions sur chaînes de caractères, les fonctions qui permettent l’évaluation et les macro-fonction de quoting. La fonction %SYSFUNC n’appartient cependant à aucune de ces catégories, étant donné sa principale caractéristique. Elle permet en effet d’émuler de très nombreuses fonctions du langage DATA afin de modifier la valeur d’une macro-variable. %SYSFUNC(FONCTION_SAS(¯ovariable),FORMAT); La partie FORMAT est optionnelle. Vous pouvez ici utiliser aussi bien des fonctions sur chaînes de caractères que des fonctions dédiées aux variables numériques. La valeur d’une macro-variable est toujours une chaîne de caractères mais si vous avez stocké un chiffre dans votre macro-variable (sous la forme d’une chaîne de caractères), sa transformation en donnée numérique est automatique. 1. La variable est cependant alphanumérique pour que l’on puisse saisir les références des deux départements de la Corse : 2A et 2B. SAS Livre Page 406 Jeudi, 18. septembre 2008 6:03 18 406 ◆ SAS L’instruction optionnelle FORMAT permet d’appliquer un FORMAT particulier à votre résultat. Programme 9.18 %LET %LET %PUT %LET %PUT toto=bonjour; toto2=%SYSFUNC(UPCASE(&toto)); &toto2; datefra=%SYSFUNC(TODAY(),fradfwkx.); &datefra; Vous obtiendrez dans votre fenêtre JOURNAL « BONJOUR » et « Mercredi 30 avril 2008 ». Certaines fonctions propres au langage DATA ne peuvent pas être émulées par %SYSFUNC. Il s’agit des fonctions DIF, DIM, HBOUND, IORCMSG, INPUT, LAG, LBOUND, MISSING, PUT, RESOLVE, SYMGET et, en général, de toutes les fonctions qui apportent des informations sur les variables. Il existe cependant des équivalents aux fonctions PUT et INPUT : PUTN, PUTC, INPUTN et INPUTC. Consultez l’aide SAS pour comprendre les différences entre les fonctions N et les fonctions C. 9.4.1 Les macro-fonctions sur chaînes de caractères Sur les chaînes de caractères, vous disposez de cinq macro-fonctions : %INDEX Indique la position d’un caractère ou d’une chaîne de caractères dans une chaîne de caractères. Programme 9.19 %LET toto=bonjour; %LET toto3=%INDEX(&toto,j); %PUT &toto3; Vous observerez que j est la quatrième lettre du mot « bonjour ». Attention, si vous recherchez la lettre ‘o’, %INDEX vous renverra la position du premier ‘o’rencontré (soit 2). %LENGTH Donne le nombre de caractères pris par une chaîne de caractères. Programme 9.20 %LET toto4=%LENGTH(&toto); %PUT &toto4; Vous obtiendrez dans votre fenêtre JOURNAL le nombre de caractères du mot « bonjour », soit 7. %SCAN Reproduit le xème mot d’une chaîne de caractères. SAS Livre Page 407 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 407 Programme 9.21 %LET toto=un texte avec plusieurs mots; %LET toto5=%SCAN(&toto,4); %PUT &toto5; Vous obtiendrez dans votre fenêtre JOURNAL le 4e mot de la chaîne, soit « plusieurs ». %SUBSTR Équivalent à la fonction SUBSTR de l’étape DATA (1re utilisation, voir section 3.2.6). Programme 9.22 %LET toto=un texte avec plusieurs mots; %LET toto5=%SUBSTR(&toto,4,10); %PUT &toto5; Vous obtiendrez dans votre fenêtre JOURNAL une chaîne de 10 caractères à partir du 4e, soit « texte avec ». %UPCASE Transforme les minuscules en majuscules. Programme 9.23 %LET toto=un texte avec plusieurs mots; %LET toto5=%UPCASE(&toto); %PUT &toto5; 9.4.2 Les macro-fonctions permettant l’évaluation %SYSEVALF Il s’agit ici de forcer le compilateur macro à réaliser des opérations (les seules opérations que vous pouvez ici réaliser sont l’addition, la soustraction, la multiplication et la division). Programme 9.24 %LET %PUT %PUT %PUT toto=2+2; &toto ; *<- et vous observerez 2+2; %SYSEVALF(&toto); * pour obtenir 4; %SYSEVALF((&toto+2)/3); * pour obtenir 2 ; Vous pouvez ajouter à %SYSEVALF un argument commandant une conversion. Les valeurs possibles de cet argument sont : INTEGER Pour obtenir la partie entière, %PUT %SYSEVALF(2/3, INTEGER) vous donnera 0. FLOOR Pour obtenir l’entier le plus petit entier inférieur ou égal à l’évaluation de l’expression. SAS Livre Page 408 Jeudi, 18. septembre 2008 6:03 18 408 ◆ SAS CEIL Pour obtenir l’entier immédiatement supérieur ou égal à l’évaluation de l’expression. BOOLEAN Donne 0 si le résultat est nul ou manquant, 1 sinon. %EVAL Effectue des évaluations sans virgule flottante. Programme 9.25 %PUT %SYSEVALF(2/3); ** pour obtenir 0.666666; %PUT %EVAL(2/3); ** et vous obtenez 0 ; 9.4.3 Les macro-fonctions de quoting Comprenons le problème en regardant cet exemple – merci de ne pas exécuter ce programme. Programme 9.26 %LET toto= c’est formidable; %PUT &toto; Si, malgré notre conseil, vous exécutez ce programme, vous constaterez qu’il ne se passe rien (et que votre SAS semble bloqué). Vous avez aussi remarqué que, sans même exécuter le programme, l’instruction %PUT ne semble plus être comprise par l’éditeur SAS (puisqu’elle reste en noir dans votre fenêtre EDITEUR). Si vous pouvez stocker du texte dans une macro-variable, certains caractères posent des difficultés. Dans le cas présent, l’apostrophe est problématique. Vous comprenez aisément que les points-virgules, mais aussi les virgules, poseront problème. Il convient de les « masquer » de façon qu’ils soient toujours présents à l’édition mais ignorés par le compilateur macro. De façon générale, si, dans le texte que vous souhaitez capter par une macro-variable, il apparaît les signes et mnémoniques présentés dans le tableau 9.2, il conviendra d’agir avec prudence. Tableau 9.2 • Signes et mnémoniques Blanc ) = LT ; ( | GE ¬ + AND GT ^ -- OR IN ~ * NOT % , (virgule) / EQ & ‘ < NE # " > LE SAS Livre Page 409 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 409 Imaginons que, avant chaque sortie graphique, nous souhaitions annuler les titres et les pieds de pages au moyen d’une macro-variable. Nous voulons donc pouvoir stocker dans la macro-variable le texte suivant : TITLE; FOOTNOTE; Le passage par %LET notitre=TITLE;FOOTNOTE; ne peut pas fonctionner – seul le mot « TITLE » est stocké dans la macro-variable ; le « ; » qui suit termine l’enregistrement de la macro-variable, l’instruction FOOTNOTE est bien comprise mais elle n’annule les pieds de pages qu’à cet endroit du programme. Plus tard, en faisant appel à la valeur de la macro-variable, vous n’annulerez que les titres. On utilise la macro-fonction %STR pour entrer dans une macro-variable un texte pouvant contenir les signes et mnémoniques du tableau 9.2. Programme 9.27 %LET notitre = %STR(TITLE; FOOTNOTE;); %PUT ¬itre; Vous obtenez bien dans votre fenêtre JOURNAL la chaîne « TITLE; FOOTNOTE; » Les quotes simples, doubles ainsi que les parenthèses doivent être précédées d’un signe % si elles ne sont pas présentes par paires dans votre chaîne de caractères. valeur souhaitée pour la macro- variable commande correcte ab"c"de %let test=%str(ab"c"de); ab’c’de %let test=%str(ab’c’de); ab(c)de %let test=%str(ab(c)de); ab"cde %let test=%str(ab%"cde); ab’cde %let test=%str(ab%'cde); ab(cde %let test=%str(ab%(cde); ab)cde %let test=%str(ab%)cde); 10% %let test=%str(10%%); Si la chaîne de caractères que vous souhaitez pour votre macro-variable contient des signes & et % que vous ne voulez pas que le compilateur macro interprète, vous utiliserez la macro-fonction %NRSTR. %LET test=%NRSTR(Wallace&Gromit connaissent %PUT et %LET); Si, au lieu de %NRSTR, vous utilisez %STR, le compilateur macro recherchera la valeur d’une macro-variable GROMIT et tentera d’exécuter les %PUT et %LET. SAS Livre Page 410 Jeudi, 18. septembre 2008 6:03 18 410 ◆ SAS Cependant, vos difficultés avec ces caractères spéciaux (ou caractères mnémoniques) ne vont pas cesser une fois que vous aurez entré votre texte dans la macro-variable. En effet, la transformation d’un texte via les fonctions sur chaînes de caractères risque d’être problématique. Programme 9.28 %LET %PUT %LET %PUT test=%STR(title;footnote;); &test; test2=%UPCASE(&test); &test2; La dernière partie du programme 9.28 ne fonctionne pas tel que vous le souhaitez puisqu’elle est équivalente à : %LET test2=%UPCASE(title;footnote;); %PUT &test2; Et vous obtiendrez TITLE au lieu de TITLE;FOOTNOTE; %UPCASE considère les caractères du tableau 9.2 comme des caractères normaux bien qu’ils aient une signification dans le langage SAS. Le point-virgule interrompt la mise en capitales de la chaîne de caractères. Ici, la fenêtre JOURNAL ne renvoie aucun message d’erreur, mais dans certains cas, la présence de ces caractères spéciaux peut provoquer le blocage du compilateur macro. La fonction %QUPCASE doit être employée ici puisqu’elle masque à la lecture les caractères du tableau 9.2. %LET test2=%QUPCASE(&test); %PUT &test2; Vous obtiendrez bien alors la chaîne de caractères TITLE;FOOTNOTE; Les fonctions %SCAN, %SUBSTR et %UPCASE ont ainsi un équivalent lorsque les textes à traiter contiennent des caractères mnémoniques : %QSCAN, %QSUBSTR et %QUPCASE. D’autres fonctions traitent de ce problème de quoting (%BQUOTE, %NRBQUOTE, %QUOTE, %NRQUOTE, %SUPERQ et %UNQUOTE) – ces fonctions ne seront pas abordées dans cet ouvrage. Pour plus de détails, consultez l’aide SAS afin de voir dans quels cas elles peuvent être utiles (entrée macro functions, puis list of)1. Si vous avez bloqué votre compilateur macro et, par conséquent, le fonctionnement de SAS, vous pouvez le débloquer soit en terminant votre session SAS, soit en soumettant la ligne suivante : *'; *"; *); */; %MEND; RUN; Jusqu’à ce que le message suivant apparaisse dans votre fenêtre JOURNAL : ERROR: No matching %MACRO statement for this %MEND statement. 1. Voir aussi dans l’aide SAS, entrée macro quoting et à partir du sommaire, SAS Products / Base SAS / SAS 9.2 Macro language: reference / understanding and using the macro facility / Macro quoting. SAS Livre Page 411 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 411 9.5 Premiers exemples sans macro-programme Avant de nous intéresser aux macro-programmes, nous allons mettre en pratique, au moyen d’un exemple, les diverses instructions que nous avons vues jusqu’à maintenant. Nous allons pour cela, au moyen du programme qui suit, créer une table dans laquelle, pour différentes familles, et pour chaque membre de la famille, nous suivrons pendant 11 ans la consommation de 10 marchandises (données annuelles). Programme 9.29 DATA test; INPUT famille $ @@; membre=ROUND(RANUNI(54)*5+1,1); DO nummbr=1 TO 7; IF RANUNI(5652)>0.5 THEN sexe=1; ELSE sexe=0; DO annee=1997 TO 2007; IF nummbr<=membre THEN OUTPUT; END; END; CARDS; Dupuis Fournier Durand Dufour Martin Dupont Moreau ;RUN; DATA test; SET test; ARRAY conso{10} conso1-conso10; DO I=1 TO 10; conso(i)=ROUND(ABS(RANNOR(52))*RANUNI(545)*100,1); END; RUN; Nous souhaitons dans un premier temps connaître, au moyen d’un graphique, la différence entre la consommation moyenne du bien 1 des individus d’une famille et celle de tous les individus de la table au cours des 11 années observées. Imaginons que nous ne connaissions rien au langage macro. Pour effectuer ce travail, voici le programme que nous allons exécuter : Programme 9.30 DATA test; SET test; one=1; RUN; ** nous allons avoir besoin d’une clé de mergeage pour ramener la moyenne dans la table de départ : ce sera « one »; PROC SORT DATA=test; BY one; RUN; PROC MEANS DATA=test MEAN; VAR conso1; SAS Livre Page 412 Jeudi, 18. septembre 2008 6:03 18 412 ◆ SAS OUTPUT OUT=toto MEAN=mconso1; BY one; RUN; DATA test; MERGE test toto; BY one; diff_conso1=conso1-mconso1; RUN; GOPTIONS FTEXT='century'; TITLE1 'Différence de consommation moyenne du bien 1 par famille'; AXIS1 LABEL=("Consommation 1"); PROC GCHART DATA=test; VBAR famille / TYPE=mean SUMVAR=diff_conso1 NOFRAME RAXIS=axis1; RUN; Vous obtiendrez alors le graphique désiré. Nous souhaitons maintenant réaliser ce même graphique pour un autre bien (CONSO2). Il faudrait copier le programme, le coller, puis remplacer CONSO1 par CONSO2, etc. Automatisons un peu les choses au moyen d’une macro-variable. Programme 9.31 %LET C=2; PROC SORT DATA=test; BY one; RUN; PROC MEANS DATA=test MEAN; VAR conso&c; OUTPUT OUT=toto MEAN=mgconso&c; BY one; RUN; DATA test; MERGE test toto; BY one; diff_conso&C=conso&c-mgconso&c; RUN; GOPTIONS FTEXT='century'; TITLE1 "Différence de consommation moyenne du bien &c par famille"; AXIS1 LABEL=("Consommation &c"); PROC GCHART DATA=test; VBAR famille / TYPE=mean SUMVAR=diff_conso&c NOFRAME RAXIS=axis1; RUN; Vous remarquerez la présence de double quotes autour du titre et du label de l’axe – c’est ici obligatoire pour obtenir la valeur stockée dans la macro-variable. La procédure qui vise à créer une table de résultats (TOTO) pour ensuite la merger avec la table de départ n’est pas efficace. En effet, vous allez alourdir votre table en ajoutant SAS Livre Page 413 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 413 des variables qui ne servent qu’à des calculs intermédiaires ; de plus, les procédures de MERGE peuvent être très longues si vos tables sont de grande taille. Simplifions notre programme : Programme 9.32 %LET C=2; PROC SORT DATA=test; BY one; RUN; PROC MEANS DATA=test MEAN; VAR conso&c; OUTPUT OUT=toto MEAN=mgconso&c; BY one; RUN; DATA _NULL_; SET toto; CALL SYMPUT("moy",mgconso&c); RUN; DATA test; SET test; diff_conso&C=conso&c-&moy; %PUT la moyenne pour la variable conso&c est &moy; RUN; GOPTIONS FTEXT='century'; TITLE1 "Différence de consommation moyenne du bien &c par famille"; TITLE2 "La consommation moyenne des individus en bien &c est de %LEFT(&moy)"; AXIS1 LABEL=("Consommation &c"); PROC GCHART DATA=test; VBAR famille / TYPE=mean SUMVAR=diff_conso&c NOFRAME RAXIS=axis1; RUN; Nous avons introduit la moyenne de la consommation du bien analysé dans un second titre. Elle apparaît cependant avec neuf chiffres après la virgule1. Cette moyenne peut être arrondie lors de l’étape DATA _NULL_. DATA _NULL_; SET toto; CALL SYMPUT("moy",ROUND(mgconso&c,0.1)); RUN; Vous noterez que, dans le second titre, nous faisons intervenir la commande %LEFT(&MOY). En l’absence de la macro-fonction %LEFT, il apparaît un écart important entre le texte du titre et la moyenne qui suit. Cette fonction permet simplement une présentation plus harmonieuse du graphique. 1. Si vous placez dans une macro variable une valeur numérique au moyen de CALL SYMPUT, vous conserverez au maximum les 12 premiers caractères de votre valeur numérique. SAS Livre Page 414 Jeudi, 18. septembre 2008 6:03 18 414 ◆ SAS Programme 9.33 %LET C=2; %LET cle=annee; PROC SORT DATA=test; BY &cle; RUN; PROC MEANS DATA=test MEAN; VAR conso&c; OUTPUT OUT=toto MEAN=m&cle.conso&c; BY &cle; RUN; DATA toto; SET toto; DROP _type_ _freq_; RUN; DATA test; MERGE test toto; BY &cle; RUN; DATA test; SET test; diff_conso&cle&C=conso&c-m&cle.conso&c; RUN; GOPTIONS FTEXT='century'; TITLE1 "Différence de consommation moyenne du bien &c par famille"; TITLE2 "pour chaque &cle"; AXIS1 LABEL=("Consommation &c"); PROC GCHART DATA=test; VBAR famille / TYPE=mean SUMVAR=diff_conso&cle&c NOFRAME RAXIS=axis1; BY &cle; RUN; Ce programme calcule des moyennes annuelles. On cherche à représenter graphiquement, pour chaque année, l’écart entre la consommation moyenne des individus d’une famille d’un bien donné et la consommation moyenne constatée au cours de la même année par toutes les familles de l’échantillon. Si vous le souhaitez, vous pouvez réaliser le même type d’analyse non plus par années, mais par sexes et en donnant la valeur SEXE à la variable CLE (c’est aussi possible avec NUMMBR : le numéro de l’individu dans la famille… vous réfléchirez au sens de votre graphique lorsqu’une seule famille est représentée). Nous indiquions suite au programme 9.31 que l’étape MERGE pouvait être problématique (parce synonyme de perte de temps si la table était importante). Nous l’avions alors remplacée par une étape DATA _NULL_. Ceci reste aussi possible ici avec quelques aménagements. SAS Livre Page 415 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 415 Programme 9.34 %LET C=2; %LET cle=annee; PROC SORT DATA=test; BY &cle; RUN; PROC MEANS DATA=test MEAN; VAR conso&c; OUTPUT OUT=toto MEAN=m&cle.conso&c; BY &cle; RUN; DATA _NULL_; SET toto; clee='A'!!LEFT(&cle); CALL SYMPUT (clee,m&cle.conso&c); RUN; DATA test;SET test; clee='A'!!LEFT(&cle); varr=SYMGET(clee); diff_conso&cle&C=conso&c-varr; RUN; GOPTIONS FTEXT='century'; TITLE1 "Différence de consommation moyenne du bien &c par famille"; TITLE2 "pour chaque &cle"; AXIS1 LABEL=("Consommation &c"); PROC GCHART DATA=test; VBAR famille / TYPE=mean SUMVAR=diff_conso&cle&c NOFRAME RAXIS=axis1; BY &cle; RUN; L’étape DATA _NULL_ est ici particulière. Nous allons créer autant de macro-variables qu’il y a de modalités à la variable année : ceci serait possible au moyen d’un CALL SYMPUT. Cependant, la variable ANNEE est numérique et les modalités ne peuvent pas, dans leur forme actuelle, passer dans un CALL SYMPUT (X1,X2). Nous créons par conséquent une nouvelle clé en concaténant ‘A’ avec l’année. Un SYMGET dans la table TEST associera à chaque année la moyenne de consommation du bien considéré pour cette année. SAS Livre Page 416 Jeudi, 18. septembre 2008 6:03 18 416 ◆ SAS 9.6 Les macro-programmes Comme nous l’avons précisé dans la section 9.1., un macro-programme comprend deux phases : une phase d’écriture et une phase d’exécution. Programme 9.35 %MACRO mp1; PROC PRINT; Écriture RUN; %MEND mp1; Exécution %mp1 L’instruction %MACRO MP1; demande la création d’un macro-programme que nous allons appeler MP1. Le programme est en fait très simple : il demande l’impression de la dernière table construite. %MEND MP1; commande la fermeture de l’enregistrement du macroprogramme MP1 – le rappel du nom du macro-programme n’est pas obligatoire ici, il est utile uniquement si vous imbriquez vos macro-programmes, autrement dit si des macro-programmes se trouvent à l’intérieur d’un macro-programme (ce type de programmation n’est pas du tout conseillé). L’instruction %MP1 commandera l’exécution du macro-programme. Vous remarquerez l’absence de point-virgule après l’instruction %MP1. Un point-virgule ou une instruction RUN ne sont pas nécessaires pour que le macro-programme soit exécuté. Comme pour les macro-variables, la casse n’a pas d’importance. Pour exécuter votre macro-programme, vous pouvez aussi bien demander %mp1, %Mp1, %mP1 ou %MP1. Après avoir exécuté la première partie du programme, vous pouvez exécuter ce macro-programme à n’importe quel moment ensuite. Les erreurs de syntaxe qui pourraient apparaître dans votre macro-programme ne donneront pas lieu à un affichage dans votre fenêtre JOURNAL suite à la soumission du macro-programme seul. C’est la phase d’exécution qui vous permet de savoir si vous avez commis des erreurs. Vous pouvez donner n’importe quel nom à votre macro-programme à condition qu’il n’excède pas 32 caractères et qu’il débute par une lettre ou un signe « _ ». Il est possible de combiner toutes lettres, chiffres et « _ ». Attention, vous ne pouvez cependant pas appeler votre macro-programme par les noms énoncés dans le tableau 9.3. Tableau 9.3 • Les noms que vous ne pouvez pas donner aux macro-programmes ABEND COMANDR EDIT INC LISTM OPEN RETURN SYMEXIST ABORT COPY ELSE INCLUDE LOCAL PAUSE RUN SYMGLOBL TO ACT DEACT END INDEX MACRO PUT SAVE SYMLOCAL TSO ACTIVATE DEL EVAL INFILE MEND QSCAN SCAN SYSCALL BQUOTE DELETE FILE INPUT METASYM QSUBSTR BY DISPLAY GLOBAL KEYDEF NRBQUOTE QUOTE THEN UNQUOTE STOP SYSEVALF UNSTR STR SYSEXEC UNTIL SAS Livre Page 417 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 417 Tableau 9.3 • Les noms que vous ne pouvez pas donner aux macro-programmes (Suite) CLEAR DMIDSPLY GO LENGTH NRQUOTE QSYSFUNC SUBSTR SYSFUNC UPCASE CLOSE DMISPLIT GOTO LET NRSTR QUPCASE SUPERQ SYSGET WHILE CMS DO IF LIST ON RESOLVE SYMDEL SYSRPUT WINDOW 9.6.1 Environnement local/environnement global Les macro-variables qui sont créées à l’intérieur d’un macro-programme sont par défaut de type LOCAL. Vous n’y aurez plus accès une fois que celui-ci sera exécuté. Les macro-variables créées en dehors des macro-programmes (donc en code ouvert) sont, elles, par défaut, de type GLOBAL. Programme 9.36 %LET toto=glo; %MACRO test; %LET toto=loc; %LET titi=loc; %PUT &toto &titi; %MEND; %PUT &toto &titi; %test %PUT &toto &titi; Résultat 9.4 427 %LET toto=glo; 428 %MACRO test; 429 %LET toto=loc; 430 %LET titi=loc; 431 %PUT &toto &titi; 432 %MEND; 433 434 %PUT &toto &titi; AVERTISSEMENT: Apparent symbolic reference TITI not resolved. glo &titi 435 %test loc loc 436 %PUT &toto &titi; AVERTISSEMENT: Apparent symbolic reference TITI not resolved. loc &titi La macro-variable TITI n’est pas connue après l’écriture du macro-programme et avant l’exécution du macro-programme. L’exécution du macro-programme %TEST permet d’afficher la valeur de la macro-variable locale TITI définie à l’intérieur du macro-programme mais une fois ce programme exécuté, la macro-variable TITI redevient inconnue. La macro-variable TOTO est globale puisque définie en dehors du macroprogramme. À la suite de l’écriture du macro-programme, TOTO est connue (« glo »). Si on exécute le macro-programme, TOTO s’affichera tel que nous le définissons à l’intérieur du macro-programme, mais comme TOTO est une macro-variable SAS Livre Page 418 Jeudi, 18. septembre 2008 6:03 18 418 ◆ SAS globale, la transformation demandée par le macro-programme sera encore valable en dehors du macro-programme. Programme 9.37 %SYMDEL toto titi; %LET toto=glo; %MACRO test; %LOCAL toto; %LOCAL titi; %LET toto=loc; %LET titi=loc; %PUT &toto &titi; %MEND; %PUT &toto &titi; %test %PUT &toto &titi; Résultat 9.5 439 %LET toto=glo; 440 %MACRO test; 441 %LOCAL toto; 442 %LOCAL titi; 443 %LET toto=loc; 444 %LET titi=loc; 445 %PUT &toto &titi; 446 %MEND; 447 448 %PUT &toto &titi; AVERTISSEMENT: Apparent symbolic reference TITI not resolved. glo &titi 449 %test loc loc 450 %PUT &toto &titi; AVERTISSEMENT: Apparent symbolic reference TITI not resolved. glo &titi Si vous soumettez à SAS les programmes présentés ici, n’oubliez pas d’effacer vos macro-variables avant de soumettre votre nouveau programme. Vous pourrez obtenir des résultats différents des nôtres si vous oubliez cette simple précaution. Dans le programme 9.37, nous demandons à ce que les macro-variables TITI et TOTO créées à l’intérieur du macro-programme demeurent au niveau local. La macro-variable TITI n’est pas connue après l’écriture du macro-programme : elle est connue lors de l’exécution de ce dernier, mais n’est plus connue ensuite. La modification que l’on impose à TOTO reste locale : suite au macro-programme et après l’exécution du programme, TOTO conserve à sa valeur donnée au niveau global. L’instruction %LOCAL TOTO permet en fait l’existence de deux macro-variables TOTO simultanément : une au niveau GLOBAL et l’autre au niveau LOCAL. Programme 9.38 %SYMDEL toto titi; %LET toto=glo; SAS Livre Page 419 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 419 %MACRO test; %GLOBAL titi; %LET toto=loc; %LET titi=loc; %PUT &toto &titi; %MEND; %PUT &toto &titi; %test %PUT &toto &titi; Résultat 9.6 480 %LET toto=glo; 481 %MACRO test; 482 %GLOBAL titi; 483 %LET toto=loc; 484 %LET titi=loc; 485 %PUT &toto &titi; 486 %MEND; 487 488 %PUT &toto &titi; AVERTISSEMENT: Apparent symbolic reference TITI not resolved. glo &titi 489 %test loc loc 490 %PUT &toto &titi; loc loc La commande %GLOBAL TOTO à l’intérieur de l’écriture du macroprogramme n’aurait aucun intérêt : TOTO est déjà une macro-variable globale (ce qui explique que son affichage ne change pas par rapport au premier exemple). Le comportement de la macro-variable TITI est plus intéressant. Nous déclarons, à l’intérieur du macro-programme, avant de dire ce qui sera mis dans la macro-variable TITI, que celle-ci sera globale. À l’issue du macroprogramme, elle reste inconnue ; lorsque nous exécutons le macro-programme, TITI prend sa valeur qui reste encore disponible ensuite. 9.6.2 GLOBAL/LOCAL : pour quoi faire ? Le fait que les macro-variables utilisées par les macro-programmes soient par défaut locales vous permet déjà d’économiser des ressources. Imaginons maintenant que le traitement que vous envisagez pour vos données se compose de deux étapes distinctes : vous exécutez un premier macro-programme dans le but de déterminer la valeur d’un certain paramètre. Une fois celle-ci déterminée, vous débutez un second macro-programme qui utilise la valeur de ce paramètre. %MACRO etape1; ** l’objectif est de déterminer la valeur d’un certain paramètre Z; %MEND; %MACRO etape2; ** reprise de la valeur de ce paramètre Z pour débuter un nouveau traitement; %MEND; SAS Livre Page 420 Jeudi, 18. septembre 2008 6:03 18 420 ◆ SAS Si vous ne définissez pas votre macro-variable contenant Z comme étant globale, vous ne pourrez pas effectuer votre analyse. Maintenant, si Z est modifié au cours de la deuxième étape, vous ne pourrez pas repartir dans une troisième étape avec la valeur de Z issue de la première (à moins que celle-ci n’ait été stockée dans une macro-variable clone de Z). 9.6.3 Le paramétrage des macro-programmes La syntaxe complète de l’instruction %MACRO est la suivante : %MACRO programme <(liste de paramètres)></ option(s)>;; <texte> %MEND <programme>; Par rapport au premier exemple, une liste de paramètres a été ajoutée. Cette liste est constituée des noms des macro-variables qui devront être utilisées dans le programme. Ainsi : Programme 9.39 %MACRO print (fichier, list, a_min); PROC PRINT DATA=&fichier; VAR &list; WHERE annee>&a_min; RUN; %MEND print; Ensuite, pour exécuter le macro-programme : %print (test,conso2,2006) ou encore : %print (test,conso2 conso3,2006) Lorsque vous demandez une exécution de votre macro-programme, vous devez donner une valeur aux macro-variables que vous avez introduites comme paramètres. L’ordre dans lequel vous entrez vos paramètres n’a pas d’importance lorsque vous écrivez votre macro-programme ; en revanche, lorsque vous demandez l’exécution de votre macro-programme, l’ordre pris par les paramètres doit être respecté : ils doivent être écrits dans un ordre identique à celui que vous avez défini lors de l’écriture de votre macro-programme. Programme 9.40 %MACRO stat_conso (fichier, var, annee1, annee2, stat); TITLE "Sortie macro stat_conso sur &var"; TITLE2 "Borne basse : &annee1 - borne haute : &annee2"; PROC MEANS DATA=&fichier &stat; VAR &var; WHERE annee>=&annee1 AND annee<=&annee2; RUN; %MEND stat_conso; %stat_conso (test,conso1 conso2,1997,2001,MEAN) SAS Livre Page 421 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 421 Les paramètres en entrée peuvent être soit positionnels, soit des mots clés. Dans le mode de paramétrage positionnel (celui que nous avons utilisé jusqu’à maintenant), il faut en théorie renseigner tous les paramètres lors de la demande d’exécution du macro-programme. Programme 9.41 %stat_conso %stat_conso %stat_conso %stat_conso (test,conso1 (test,conso1 (test,conso1 (test,conso1 conso2,1997,2001,MEAN) conso2,1997,2001,) conso2,1997,2001) conso2,1997) Les trois premières demandes d’exécution du macro-programme fonctionneront sans difficulté. Certes, pour les deuxième et troisième demandes, tous les paramètres ne sont pas renseignés mais cela n’a pas d’importance ici parce que c’est, d’une part, seul le dernier paramètre n’est pas renseigné et qu’ensuite, la procédure utilisée dans le macro-programme peut fonctionner sans attribuer de valeur à ce paramètre. La dernière demande d’exécution du macro-programme aurait pu, elle aussi, fonctionner si le programme sous-jacent n’avait pas eu besoin de la borne supérieure. Si vous exécutez cette dernière commande, vous aurez dans votre fenêtre JOURNAL le résultat suivant : 1 ! DATA=&fichier &stat; VAR &var; WHERE annee>=&annee1 AND annee<=&annee2 ; RUN; 76 ERREUR 76-322: Erreur de syntaxe ; l’instruction sera ignorée. ERREUR: Erreur de syntaxe détectée lors de l’analyse de la clause WHERE. Si votre paramètre n’est pas absolument nécessaire à l’exécution du programme, vous pouvez l’omettre. Soit un macro-programme ayant la forme suivante : %MACRO toto (param1,param2,param3,...,param_z); … %MEND toto; Lorsque vous allez demander l’exécution du macro-programme, si la valeur du paramètre 2 ne doit pas absolument être renseignée, vous obtiendrez quand même un résultat en exécutant : %toto(val1, ,val3,val4,...,val_z) Bien entendu, vous avez noté les deux virgules qui se suivent et qui indiquent bien que VAL2 n’est pas renseigné. Vous avez aussi la possibilité de paramétrer vos macro-programmes au moyen de mots clés. En passant par ce type de paramétrage, vous pouvez donner des valeurs par défaut aux paramètres de votre macro-programme. Lorsque vous demanderez l’exécution de votre macro-programme, si vous ne déclarez pas de valeur pour la macro-variable, SAS appliquera les valeurs que vous avez déclarées lors de l’écriture du macro-programme : il considérera donc ces dernières comme les valeurs par défaut. SAS Livre Page 422 Jeudi, 18. septembre 2008 6:03 18 422 ◆ SAS Programme 9.42 %MACRO stat_conso (fichier=test, var=conso1, annee1=1997, annee2=2001, stat=mean); TITLE "Sortie macro stat_conso sur &var"; TITLE2 "Borne basse : &annee1 - borne haute : &annee2"; PROC MEANS DATA=&fichier &stat; VAR &var; WHERE annee>=&annee1 AND annee<=&annee2; RUN; %MEND stat_conso; Les demandes d’exécution suivantes seront parfaitement réalisées : %stat_conso %stat_conso (stat=sum) %stat_conso (annee2=2004,stat=std) Ici, puisque vous rappelez les noms des macro-variables qui doivent être utilisées, l’ordre dans lequel ces macro-variables sont citées lorsqu’il y a demande d’exécution du macro-programme n’a pas d’importance. Vous avez aussi la possibilité d’effectuer un paramétrage mixte utilisant à la fois du paramétrage positionnel et du paramétrage par mots clés. Attention cependant à bien placer les paramètres positionnels avant les mots clés. Programme 9.43 %MACRO stat_conso (fichier, var, annee1, annee2, stat=mean); TITLE "Sortie macro stat_conso sur &var"; TITLE2 "Borne basse : &annee1 - borne haute : &annee2"; PROC MEANS DATA=&fichier &stat; VAR &var; WHERE annee>=&annee1 AND annee<=&annee2; RUN; %MEND stat_conso; Les demandes d’exécution suivantes fonctionneront : %stat_conso (test,conso1,1994,1997) %stat_conso (test,conso1,1994,1997,stat=std) 9.6.4 Les macro-commandes propres aux macroprogrammes Certaines macro-commandes ne sont disponibles qu’à l’intérieur des macroprogrammes et ce sont essentiellement ces macro-commandes qui rendent intéressante l’utilisation de macro-programmes. Grâce à ce type d’instruction, vous allez pouvoir mettre en place des traitements conditionnels et des traitements multiples sur table(s). Il existe douze macro-commandes propres aux macro-programmes. Nous avons déjà évoqué %LOCAL et %MEND. Six autres macro-commandes vont être évoquées dans les sections qui suivent (%DO, %DO itératif, %DO %UNTIL, %DO %WHILE, %END et %IF-%THEN-%ELSE)1. 1. %GOTO et %label:, %RETURN et %ABORT ne seront pas abordés dans cet ouvrage. SAS Livre Page 423 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 423 a. Les constructions conditionnelles : %IF À l’intérieur d’un macro-programme, le traitement sera différent selon qu’une condition sera respectée ou non. Cette commande est tout à fait comparable avec ce que vous faites dans une étape DATA avec l’instruction IF. La syntaxe est ici la suivante : %IF condition %THEN %DO; lot d’instructions 1…; %END; %ELSE %DO; lot d’instructions 2…; %END; On peut s’attendre à ce que les instructions à exécuter en cas de respect de la condition (ou en cas de non-respect) soient multiples. Ceci explique pourquoi vous associerez systématiquement un %IF avec %DO/%END. Programme 9.44 %MACRO resultat_aleatoire; %LET ping=%SYSFUNC(RANUNI(25),5.3); %IF &ping>0.5 %THEN %DO; TITLE "Le ping était inférieur à 0.5 : &ping"; PROC MEANS DATA=test MEAN; VAR conso1; RUN; %END; %ELSE %DO; TITLE "Le ping était supérieur à 0.5 : &ping"; PROC MEANS DATA=test std; VAR conso1; RUN; %END; %MEND; %resultat_aleatoire Pour définir vos conditions, vous disposez d’un nombre important d’opérateurs très proches de ceux utilisés dans le langage SAS (tableau issu de l’aide SAS). Tableau 9.4 • Les opérateurs Operateur Mnémonique Priorité Définition Exemple ** 1 Puissance A**B + 2 Préfixe positif +(A+B) - 2 Préfixe négatif -(A+B) ¬^~ NOT 3 Non logique NOT A * 4 multiplication A*B / 4 division A/B + 5 addition A+B SAS Livre Page 424 Jeudi, 18. septembre 2008 6:03 18 424 ◆ SAS Tableau 9.4 • Les opérateurs (Suite) Operateur Mnémonique Priorité Définition Exemple - 5 Soustraction A-B < LT 6 Strictement inférieur A<B <= LE 6 Inférieur ou égal A<=B = EQ 6 égal A=B # IN 6 Égal à un élément de la liste A#B C D E ¬= ^= ~= NE 6 Non égal à A NE B > GT 6 Strictement supérieur à A>B >= GE 6 Supérieur ou égal A>=B & AND 7 ET logique A=B & C=D | OR 8 OU logique A=B | C=D b. Les boucles %DO simples Une instruction particulièrement intéressante pour l’écriture des macro-programmes est la boucle %DO. Comme dans le langage DATA, vous pouvez utiliser des boucles %DO simples, %DO %WHILE et %DO %UNTIL. La syntaxe des boucles %DO à l’intérieur des macro-programmes est la suivante : %DO i=début %TO fin (%BY pas); Le pas par défaut est 1. Un premier exemple de boucle %DO est donné par le programme 9.45. Programme 9.45 %MACRO compte (x,c); %LET toto=0; %DO I=1 %TO %LENGTH(&x); %IF %SUBSTR(&x,&i,1)=&c %THEN %LET toto=%EVAL(&toto+1); %END; %PUT la chaîne comptait %LENGTH(&x) caractères, il y a &toto caractère(s) &c; %MEND; %compte (511856149865115581,1) Nous demandons ici à SAS de compter le nombre d’un caractère donné dans une chaîne de caractères de longueur variable. Il apparaît dans la fenêtre JOURNAL que la chaîne de caractères comptait six « 1 ». Les boucles %DO dans des macro-programmes sont particulièrement intéressantes parce qu’elles permettent d’effectuer : • une tâche plusieurs fois sur une même table ; • une même tâche sur différentes tables ; • un ensemble de tâches, plusieurs fois sur différentes tables. SAS Livre Page 425 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 425 Reprenons la table retraçant la consommation de 10 biens pendant 11 années de nos 7 familles. Au moyen des boucles %DO, nous pouvons généraliser les premiers graphiques que nous avons pu construire et réaliser une même tâche plusieurs fois sur la même table. Programme 9.46 %MACRO graphe; %DO C=1 %TO 10; PROC MEANS DATA=test MEAN NOPRINT; VAR conso&c; OUTPUT OUT=toto MEAN=mgconso&c; RUN; DATA _null_; SET toto; CALL SYMPUT("moy",ROUND(mgconso&c,0.001)); RUN; DATA test; SET test; diff_conso&C=conso&c-&moy; RUN; GOPTIONS FTEXT='century' FTITLE='century'; TITLE1 "Différence de consommation moyenne du bien &c par famille"; TITLE2 "La consommation moyenne des individus en bien &c est de %LEFT(&moy)"; AXIS1 LABEL=("Consommation &c"); PROC GCHART DATA=test; VBAR famille / TYPE=mean SUMVAR=diff_conso&c NOFRAME RAXIS=axis1; RUN; %END; %MEND; %graphe Pour les 10 biens analysés par l’enquête, le macro-programme présenté ici va réaliser les 10 graphiques représentatifs de l’écart entre la consommation du bien i de la famille et la consommation moyenne de l’ensemble des individus de l’enquête. Ces boucles %DO que l’on fait généralement tourner sur des valeurs numériques peuvent aussi tourner sur des alphanumériques avec un petit aménagement. Imaginons que nous souhaitons réaliser un graphique par famille. Pour chaque famille, nous voulons connaître la consommation moyenne d’un bien donné de chacun des membres. Programme 9.47 %MACRO famille (c); DATA temp; SET test; KEEP famille; SAS Livre Page 426 Jeudi, 18. septembre 2008 6:03 18 426 ◆ SAS RUN; PROC SORT DATA=temp NODUP; BY famille; RUN; DATA _null_; SET temp; CALL SYMPUT (COMPRESS('famille'!!_N_),famille); CALL SYMPUT ('max',_N_); RUN; %DO I=1 %TO &max; TITLE "Famille &&famille&i"; TITLE2 "Les consommations moyennes de biens &c des membres de la famille &&famille&i"; AXIS1 LABEL=NONE; PROC GCHART DATA=test; VBAR nummbr / TYPE=mean SUMVAR=conso&c NOFRAME DISCRETE RAXIS=axis1 MAXIS=axis1; WHERE famille="&&famille&i"; RUN; %END; %MEND; %famille (2) Enfin, au moyen du programme 9.48, nous allons effectuer une tâche identique sur plusieurs tables SAS créées à partir d’une table unique. Programme 9.48 %MACRO famille2(c); PROC SORT DATA=test; BY famille; RUN; DATA test; SET test; BY famille; RETAIN numfam 0; IF first.famille THEN numfam+1; ELSE numfam=numfam; CALL SYMPUT ('max',numfam); RUN; %DO i = 1 %TO &max; DATA test&i; SET test; IF numfam=&i THEN; ELSE DELETE; CALL SYMPUT ('famille',famille); RUN; AXIS1 LABEL=NONE; TITLE "Consommation annuelle moyenne de la famille &famille"; SAS Livre Page 427 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 427 TITLE2 "en bien &c"; PROC GCHART DATA=test&i; VBAR annee / TYPE=mean DISCRETE NOFRAME SUMVAR=conso&c RAXIS=axis1 MAXIS=axis1; RUN; %END; %MEND; %famille2 (3) Le programme 9.48 permet d’obtenir les consommations annuelles moyennes par les membres d’une famille en un certain lien à préciser lors de l’invocation du macroprogramme. c. %DO %WHILE et %DO %UNTIL Vous avez la possibilité d’effectuer une tâche jusqu’à ce qu’une certaine condition soit remplie (%DO %UNTIL) ou tant qu’une certaine condition est remplie (%DO %WHILE). Le fonctionnement de ces macro-fonctions reste très proche de celui des fonctions DO WHILE et DO UNTIL présentes dans l’étape DATA du langage SAS. Le programme 9.49 offre un exemple de fonctionnement d’une boucle %DO %UNTIL. Programme 9.49 %LET cross = sexe annee numfam; %MACRO tableau (c); %LET I=1; %DO %UNTIL (%SCAN(&cross,&i)= ); %LET leby = %SCAN(&cross,&i); PROC MEANS DATA=test MEAN; VAR conso&c; CLASS &leby; RUN; %LET I=%EVAL(&i+1); %END; %MEND; %tableau (5) Nous souhaitons ici calculer des moyennes de consommation d’un certain bien à préciser en fonction de l’année, du sexe et de la famille. Dans le cas des boucles %DO %UNTIL, la condition qui apparaît entre parenthèses est évaluée en bas de la boucle. Le programme sera donc exécuté au moins une fois et jusqu’à ce que la condition soit vraie (il conviendra donc d’éviter les conditions du style « jusqu’à ce que les poules aient des dents »). En ce qui concerne les boucles %DO %WHILE, la condition est évaluée en haut de la boucle (vous n’êtes donc pas sûr que le programme qui suit sera exécuté au moins une fois). Là encore, réfléchissez de façon à ne pas faire entrer SAS dans une boucle infinie (« tant que les carrés ont quatre coins »). Le programme 9.50 offre un exemple de fonctionnement d’une boucle %DO %UNTIL. SAS Livre Page 428 Jeudi, 18. septembre 2008 6:03 18 428 ◆ SAS Vous connaissez tous la fable La Cigale et la fourmi et vous savez tous qu’elle se termine par « Eh bien ! dansez maintenant. » – la question posée est de savoir combien de mots contient cette fable : Programme 9.50 %LET fable = %STR(La Cigale et la Fourmi La Cigale, ayant chanté Tout l%’été, Se trouva fort dépourvue Quand la bise fut venue : Pas un seul petit morceau De mouche ou de vermisseau. Elle alla crier famine Chez la Fourmi sa voisine, La priant de lui prêter Quelque grain pour subsister Jusqu%’à la saison nouvelle. "Je vous paierai, lui dit-elle, Avant l%’Oût, foi d%’animal, Intérêt et principal." La Fourmi n%’est pas prêteuse : C%’est là son moindre défaut. Que faisiez-vous au temps chaud ? Dit-elle à cette emprunteuse. – Nuit et jour à tout venant Je chantais, ne vous déplaise. – Vous chantiez ? j%’en suis fort aise. Eh bien ! dansez maintenant. ); %MACRO compte; %LET I=1; %DO %WHILE (%QSCAN(&fable,&i) ^= maintenant); %LET I=%EVAL(&i+1); %END; %PUT &i; %MEND; %compte Le macro-programme vous indique la présence de 112 mots dans la fenêtre JOURNAL. Si l’on suit les règles qui régissent le comptage des mots, on trouve en fait 113 mots. Pour voir ce que SAS considère comme un mot, vous pouvez modifier le programme 9.50 en introduisant entre la 3e et la 4e ligne l’instruction suivante : %PUT &i %QSCAN(&fable,&i); Vous observerez alors que « : », « ? » « " » sont considérés comme des mots. Par défaut, pour les fonctions %SCAN et %QSCAN, les délimiteurs de mots sont les caractères : blank . < ( + & ! $ * ) ; ^ – / , % | Il faut donc ajouter à cette liste « : », « ? » « " ». Pour « : », « ? », cela ne pose aucun problème puisque vous pouvez préciser vos délimiteurs. %QSCAN(&fable,&i,blank . < ( + & ! $ * ) ; ^ – / , % | ? :); Pour « " », c’est beaucoup plus difficile de par la nature de ce caractère. Maintenant, si une solution existe, il n’est peut-être pas nécessaire de la chercher parce que le compte de mots sera toujours faux. En effet, « - » est délimiteur. Maintenant, les mots qui apparaissent dans le dictionnaire comme « compte-gouttes » doivent compter pour un mot alors que « voulez-vous » doit compter pour deux1. 1. Le programme 9.50 vous donne un exemple de boucle DO UNTIL. Maintenant, si vous disposez de SAS 9.2 et si vous souhaitez compter les mots de la modalité d’une macro variable, vous pouvez utiliser les possibilités offertes par la fonction COUNTW (voir section 3.2.6.). Le nombre de mots peut être calculé par %LET test=%SYSFUNC(COUNTW(&fable ));. Vous obtiendrez 112 mots. SAS Livre Page 429 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 429 9.7 Conserver ses macro-programmes Les macro-programmes que vous pouvez écrire sont perdus d’une session à l’autre de la même manière que les tables de données que vous pouvez créer, s’ils appartiennent à la bibliothèque WORK temporaire, sont détruits lorsque vous quittez SAS. S’il est possible de sauvegarder vos tables d’une session à l’autre, vous devinez qu’il est possible de sauver vos macro-programmes. Attention cependant : un macro-programme sauvé vous permettra d’exécuter celuici plus tard. Vous devez aussi IMPÉRATIVEMENT sauver le programme source simplement pour pouvoir vérifier par la suite ce que fait exactement votre macroprogramme, voire le modifier. Pour pouvoir sauver votre macro-programme, vous devez impérativement : • Activer au préalable l’option globale MSTORED. • Indiquer la bibliothèque dans laquelle vous allez stocker ces macro-programmes : OPTIONS MSTORED SASMSTORE = lib; • Ajouter l’option STORE au moment de l’écriture du macro-programme : %MACRO toto (param…) / store; …; %MEND toto; LIB est une bibliothèque qui avait déjà été assignée au préalable. Ensuite, au cours d’une session ultérieure, si vous souhaitez de nouveau utiliser votre macro, vous devez repréciser via une instruction LIBNAME la bibliothèque dans laquelle vous avez stocké votre macro et soumettre à nouveau les options MSTORED et SASMSTORED=. Une seconde possibilité vous est offerte. Vous devez pour cela stocker la macro non pas sous sa forme compilée mais sous la forme d’un fichier de programme, portant le nom de votre macro. Aucune demande d’exécution de votre macro ne doit apparaître dans votre programme (votre programme commence donc par l’instruction %MACRO et se termine par l’instruction %MEND). Vous débuterez votre session ultérieure par l’instruction suivante : OPTIONS SASAUTOS=(SASAUTOS "C:\intro_SAS\macros") MAUTOSOURCE; Vous indiquerez entre guillemets doubles le chemin physique vers le fichier programme reprenant votre macro-programme. À la suite de cette commande, vous pourrez demander l’exécution de votre macro. 9.8 Quelle aide au débogage des macroprogrammes ? Si vous avez tenté d’écrire vos premiers macro-programmes en lisant ce chapitre, vous vous êtes rendu compte que les commentaires apparaissant dans la fenêtre JOURNAL n’étaient pas toujours d’une grande utilité en cas d’erreurs de programmation. Comme en ce qui concerne l’étape DATA, vous disposez d’un certain nombre d’outils qui vous permettent de voir plus précisément pourquoi votre macroprogramme ne fonctionne pas. Bien entendu, la mise à disposition de ces outils ne vous dispense pas d’organiser au préalable votre travail. SAS Livre Page 430 Jeudi, 18. septembre 2008 6:03 18 430 ◆ SAS 9.8.1 Ordre et Méthode Le titre de cette section est un peu martial mais c’est cependant ce qui doit caractériser votre travail lorsque vous écrivez votre macro-programme. Dans un premier temps, vous devez écrire votre programme sans aucune instruction de type macro et vous assurer qu’il fonctionne. Ensuite, pas à pas, introduisez les éléments de macro-programmation en vérifiant qu’après chaque nouvelle introduction, votre programme continue de fonctionner. Vous éviterez ainsi les phénomènes d’erreurs qui masquent d’autres erreurs et qu’on ne peut résoudre qu’en ayant résolu la première erreur. Au cours de ce processus de rédaction, la lecture du JOURNAL peut vous être d’une grande aide. N’oubliez pas cependant de regarder votre fenêtre JOURNAL en commençant par le haut. Dans le cadre de la programmation MACRO, vos difficultés vont vite devenir inextricables si vous voulez aller trop vite dans la rédaction de votre programme. 9.8.2 Les outils Maintenant, même en procédant avec ordre et méthode, vous pouvez tout de même avoir des erreurs dans votre code sans pour autant voir des messages d’erreur apparaître dans votre fenêtre JOURNAL. Pour vous aider à corriger votre programme, vous disposez principalement de trois instructions : SYMBOLGEN, MPRINT et MLOGIC1. Il s’agit d’options à activer via une commande OPTIONS. L’option SYMBOLGEN affiche un message dans la fenêtre JOURNAL à chaque application des règles de résolution des macro-variables (voir section 9.2.1.). Exécutez le programme 9.51 pour voir l’impact de SYMBOLGEN. Programme 9.51 %LET %LET %LET %LET bibli=lib; nombase=test; nombase1=toto; num=1; OPTIONS SYMBOLGEN; %PUT %PUT %PUT %PUT %PUT %PUT %PUT %PUT &nombase; &nombase.; &nombase1; &nombase.1; &bibli&nombase; &bibli.&nombase; &bibli..&nombase; &&nombase# L’option MPRINT n’est active que dans un macro-programme – elle permet de voir ce que le compilateur macro comprend de votre programme en le forçant à écrire sous la forme usuelle ce qu’il exécute. Pour voir les commentaires générés par cette option dans la fenêtre JOURNAL, vous pouvez exécuter à nouveau le macroprogramme famille2 présenté dans le programme 9.48. 1. Vous trouverez sûrement sur Internet des documents qui recommandent l’utilisation de l’option MACROGEN. Cette option n’est plus documentée et ne doit plus être utilisée : support.sas.com/kb/1/821.html Elle a été remplacée par les options MPRINT, MLOGIC et SYMBOLGEN. SAS Livre Page 431 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 431 Enfin, l’option MLOGIC n’agit, elle aussi, que dans le cadre d’un macro-programme. Si l’option est activée, SAS vous indique dans la fenêtre JOURNAL : • les valeurs des paramètres du macro-programme ; • les expressions évaluées dans les instructions %IF et si elles sont vraies ou fausses ; • le déroulement des boucles %DO. Si vous activez cette option et réactivez le macro-programme famille2, vous verrez simplement des commentaires sur le déroulement de la boucle %DO. Il est fortement conseillé de ne pas activer les trois options en même temps – vous risquez en effet d’être submergé d’informations parmi lesquelles il sera difficile de retrouver l’information pertinente. Pour désactiver ces options : OPTIONS NOSYMBOLGEN NOMPRINT NOMLOGIC; Si les commentaires créés dans votre fenêtre JOURNAL par l’option MPRINT sont trop importants, il pourra être intéressant d’envoyer les résultats générés par l’option MPRINT non pas vers la fenêtre JOURNAL mais vers un fichier texte que vous pourrez consulter ensuite. Vous pouvez dans ce cas utiliser l’option MFILE de la manière suivante : FILENAME MPRINT 'C:/intro_SAS/aide_debug.sas'; OPTIONS MPRINT MFILE; Un article tout à fait intéressant et complet sur le débogage des macro-programmes peut être consulté à l’adresse : www2.sas.com/proceedings/sugi29/128-29.pdf 9.9 Un cas pratique Ce chapitre doit être considéré comme une simple introduction au langage macro de SAS. De nombreux éléments restent absents de notre exposé et il conviendra d’approfondir vos connaissances par la suite, une fois que vous aurez une bonne maîtrise des concepts de base. Vous pourrez par exemple consulter les ouvrages suivants : BURLEW, Michelle M., SAS Macro Programming Made Easy, SAS Publishing, 2007, ISBN:1590478827. CARPENTER, Art, Carpenter’s Complete Guide to the SAS Macro Language, SAS Publishing, 2004, ISBN:1590473841. Si de nombreux utilisateurs de SAS ne s’aventurent pas dans la programmation macro, c’est peut-être simplement parce qu’ils n’ont pas idée des applications possibles avec ce langage. Les concepts de base exposés ici peuvent déjà vous aider à résoudre de nombreux cas dans lesquels la programmation avec le langage macro présente un intérêt. Pour vous en convaincre, prenons un exemple. Votre responsable vous convoque pour vous confier le travail suivant : « Vous savez que je joue en Bourse et je souhaiterais que vous puissiez me fournir certains graphiques me permettant de suivre l’évolution des cours de mes dix actions favorites. Ces graphiques pourront être de différents types. Je dois pouvoir : 1. Suivre l’évolution du cours d’une action ou de plusieurs actions. SAS Livre Page 432 Jeudi, 18. septembre 2008 6:03 18 432 ◆ SAS 2. Pouvoir comparer l’évolution d’un ou de plusieurs cours avec le CAC 40. En cas de comparaison du cours d’une action avec le CAC 40, je veux pouvoir connaître le bêta historique de cette action. 3. La date de début de la période d’observation peut être n’importe quelle date entre le 1er janvier 2004 et maintenant. 4. Les cours devront être mis à jour pour chacune de mes nouvelles demandes (je ne peux d’ailleurs pas vous fournir ces cours). Le vendredi soir, je vous indiquerai les graphiques que je souhaite trouver sur mon bureau, lundi matin à 9h30. Vous aurez le week-end pour préparer mes graphiques. » Vous indiquez à votre responsable qu’un graphique contenant plus de trois courbes est difficilement lisible et qu’en cas de comparaison du cours de différentes actions, il est très intéressant de recalculer des cours en base 100 à la date de début de la période d’observation. Il est d’accord avec vous. Maintenant, comment répondre à la question ? 9.9.1 Les données L’objet de cette section est de rédiger un macro-programme nous permettant de construire une table comprenant les cours journaliers de dix actions et le CAC depuis le 1er janvier 2004. Ces données sont disponibles et téléchargeables sur Internet. Sans macroprogramme, vous imaginez que la construction de cette table actualisée chaque semaine serait particulièrement longue aussi bien en temps qu’en lignes de code. Pour construire notre table, nous allons nous servir des données offertes par Yahoo! finance : http://fr.finance.yahoo.com À partir de ce site, vous avez la possibilité de télécharger des historiques de cours journaliers. Le début de la période de cet historique dépend du titre. (Vous pouvez ainsi suivre le cours de General Electric depuis 1962, mais pour la plupart des titres, les cours journaliers commencent en 2000.) Sur cette page sont proposés les cours journaliers de l’action Alcatel Lucent : http://fr.finance.yahoo.com/q/hp?s=ALU.PA Un lien, en bas de la page, vous permet de télécharger ces données : http://ichart.yahoo.com/table.csv?s=ALU.PA&d=0&e=10&f=2008&g=d&a=0&b= 3&c=2000&ignore=.csv ALU.PA est un code qui indique que l’action Alcatel Lucent (ALU) est cotée à Paris (PA). Les éléments qui suivent ce code constituent les informations qui définissent la période d’observation. En fait, nous ne nous occuperons pas de ces informations puisque, en suivant le lien http://ichart.yahoo.com/table.csv?s=ALU.PA, vous téléchargez l’intégralité des données journalières disponibles pour cette action dans un format CSV (fichier texte dans lequel les modalités sont séparées par des virgules). Ce fichier peut être directement transformé en une table SAS sans passer par les étapes de téléchargement et d’écriture sur votre disque dur : Programme 9.52 FILENAME Alcatelb URL "http://ichart.yahoo.com/table.csv?s=ALU.PA"; DATA alcatel; SAS Livre Page 433 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 433 INFILE Alcatelb DSD FIRSTOBS=2; INPUT date :yymmdd. cours; FORMAT date ddmmyy10.; RUN; L’instruction FILENAME permet cette construction d’une table SAS à partir d’un fichier présent sur Internet. Cette instruction, évoquée dans la section 2.1., présente d’autres nombreux intérêts. Pour plus de détails, consultez le lien suivant : www2.sas.com/proceedings/forum2007/007-2007.pdf Nous ne conservons ici que la date et le cours d’ouverture. Les autres informations ne sont pas conservées. Pour construire la table complète, il faut dans un premier temps récupérer les cours des dix actions à suivre. Nous avons sélectionné dix actions au hasard parmi celles présentes dans le CAC 40. Nous reprenons ici les codes de ces actions ainsi que le nom de la société. Résultat 9.7 AC.PA ACA.PA AF.PA AI.PA ALO.PA ALU.PA BN.PA BNP.PA CA.PA CAP.PA Accor Credit Agricole Air France – KLM Air liquide Alstom Alcatel Lucent Danone BNP Paribas Carrefour Cap Gemini Ces premières informations sont importantes puisqu’elles constituent d’une part des éléments essentiels à la construction des tables et, d’autre part, les intitulés exacts des sociétés pourraient être intéressants à employer dans les titres de nos graphiques. Nous allons donc, avec ces données, construire un premier ensemble de macro-variables globales qui seront réutilisées tout au long de notre programme complet composé de trois macro-programmes : Programme 9.53 DATA act; INPUT code $ libel $20.; CALL SYMPUT (COMPRESS('act'!!_N_),code); CALL SYMPUT (COMPRESS('lact'!!code),libel); CALL SYMPUT ('num',_N_); CARDS; AC Accor ACA Credit Agricole AF Air France – KLM AI Air liquide ALO Alstom ALU Alcatel Lucent BN Danone BNP BNP Paribas CA Carrefour CAP Cap Gemini ;RUN; SAS Livre Page 434 Jeudi, 18. septembre 2008 6:03 18 434 ◆ SAS Les suffixes PA, identiques pour toutes les actions, ne sont pas repris dans les macrovariables. Cette première phase de définition des macro-variables est essentielle et conditionne l’ensemble des programmes que vous pourriez écrire ensuite. Le macroprogramme qui va créer les 10 tables est une généralisation du programme 9.52. Programme 9.54 %MACRO recup; %DO i=1 %TO # FILENAME actt&i URL "http://ichart.yahoo.com/table.csv?s=%SYSFUNC(STRIP(&&act&i)).PA"; DATA c_act&i; INFILE actt&i DSD FIRSTOBS=2; INPUT date :yymmdd. &&act&i; FORMAT date ddmmyy10.; RUN; %END; %MEND; %recup; Deux remarques sur ce programme : %SYSFUNC(STRIP(&&act&i)) La fonction STRIP permet d’effectuer les tâches remplies par un LEFT (positionnement à gauche), puis un TRIM (suppression des espaces). Cette commande est nécessaire pour reproduire la chaîne de caractères AC.PA &&act&i -> &act1 -> AC Les variables mesurant les cours auront donc pour noms ceux qui sont stockés dans les macro-variables act_i_, soit AC, ACA, AF… Nous disposons maintenant de 10 tables qu’il faut réunir au sein d’une même table. Au cours de la phase de construction de la table BASE, nous créons une table CAC qui sera elle aussi intégrée à BASE, nous nettoyons la BASE (pas de cours les samedis et dimanches) et « bouchons les trous » en utilisant une procédure PROC EXPAND. Les rendements des actions et du CAC sont calculés. Des explications sont données dans le corps du programme. Programme 9.55 %MACRO merge; ** création de la table base – uniquement des dates pour l’instant allant du 1er janvier à la date où le macro-programme sera exécuté –utilisation de la macro-variable automatique sysdate9; DATA base; DO date='01jan2004’d TO "&sysdate9"d; OUTPUT; END; RUN; * ajout à la table base des cours des 10 actions sélectionnées; %DO i=1 %TO # PROC SORT DATA=c_act&i; SAS Livre Page 435 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 435 BY date; RUN; DATA base; MERGE base c_act&i; BY date; RUN; %END; ** création de CAC et réunion avec la table BASE; FILENAME cac URL " http://ichart.yahoo.com/table.csv?s=%5EFCHI"; DATA cac; INFILE cac DSD FIRSTOBS=2; INPUT date :YYMMDD. Cac; RUN; PROC SORT DATA=cac; BY date; RUN; DATA base; MERGE base cac; BY date; RUN; ** nettoyage de la table des informations antérieures au 01/01/2004 et des samedi et dimanche (puisque pas de cotation); DATA base; SET base; IF date<'01jan2004’d THEN DELETE; ctrl=STRIP(PUT(date,weekdatx9.)); IF ctrl='Saturday' OR ctrl='Sunday' THEN DELETE; RUN; ** correction de BASE pour ne pas avoir de valeurs manquantes; PROC EXPAND DATA=base OUT=base; ID date; RUN; ** calcul des rendements des actions – la table BASE va être ouverte et modifiée 10 fois de suite (nous avons 10 titres), à chaque fois pour créer une variable de rendement; %DO i=1 %TO # DATA base; SET base; r_&&act&i=DIF(&&act&i)/LAG(&&act&i); RUN; %END; ** calcul des rendements du CAC : vous disposez ici du programme initial de construction des rendements qui a été généralisé ensuite pour calculer les rendements des actions; DATA base; SET base; r_cac=DIF(cac)/LAG(cac); RUN; %MEND; %merge; SAS Livre Page 436 Jeudi, 18. septembre 2008 6:03 18 436 ◆ SAS À l’issue de ce programme, sont ajoutées à la table des variables de rendements appelées r_AC, r_ACA, r_AF… La construction de la table prend (si votre connexion Internet est rapide) 20 secondes. 9.9.2 Les différents graphiques Pour répondre à la demande de votre responsable, vous devez produire plusieurs types de graphiques : • Les graphiques avec un seul cours que l’on peut réaliser avec un PLOT simple. • Les graphiques représentant le cours de deux actions que l’on réalisera avec un PLOT allié avec PLOT2 pour éviter les problèmes d’échelle qui ne manqueraient pas de se poser si les cours de deux titres étaient à représenter sur un seul axe. • Les graphiques représentant trois cours. Ici, pour faciliter la lecture des évolutions, il faut ramener les cours en base 100 au début de la période à considérer pour le graphique. • Pour la présentation du bêta historique de l’action, nous allons procéder comme dans le programme 7.32. On présentera un graphique opposant rendement du titre et rendement de l’indice. Il est aussi possible de passer par une procédure PROC REG (régression linéaire), de créer un fichier de résultats pour récupérer le bêta via une macro-variable et l’intégrer au titre du graphique. La procédure PROC REG n’étant pas abordée dans cet ouvrage, le bêta sera calculé avec PROC GPLOT. Le macro-programme doit être paramétrable puisqu’il doit s’ajuster aux demandes de votre responsable. Parmi les paramètres à définir, vous avez : • Le nombre d’actions représentées : NBACTION. • Le nom de ces actions : ACTION=liste des actions saisies par leur code en deux ou trois lettres. • Faut-il représenter le CAC ? CAC=oui/non. • La date à laquelle commence le graphique : DATEDEBUT. %graphe %graphe %graphe %graphe (nbaction=1,action=BNP ,cac=non,datedebut=01jan2005); (nbaction=1,action=CAP ,cac=oui,datedebut=01jan2005); (nbaction=2,action=ALU BN,cac=oui,datedebut=01sep2006); (nbaction=3,action=BN CA CAP,cac=non,datedebut=01jan2004); Voici, par exemple, quelques demandes d’exécution du macro-programme que nous exécuterons lorsque le programme sera complet. Le programme est assez long. Nous le présenterons en plusieurs parties. Programme 9.56 (première partie du macro-programme %graphe) %MACRO graphe (nbaction=2,action=bnp aca ,cac=oui,datedebut=01aug2006); %DO i=1 %TO %EVAL(&num+1); SYMBOL&i I=j; %END; %LET date=%SYSFUNC(INPUTN(&datedebut,date9.)); %LET dateb=%SYSFUNC(PUTN(&date,fradfwdx.)); %LET datefoot=%SYSFUNC(TODAY(),fradfwkx.); SAS Livre Page 437 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 437 GOPTIONS DEVICE=gif htext=10pt FTEXT='verdana'; TITLE1 ' '; FOOTNOTE JUSTIFY=left " Graphique généré le &datefoot " J=r "Source des données : yahoo finance "; FOOTNOTE2 h=2 ' '; AXIS1 LABEL=none; Nous donnons ici des valeurs aux paramètres mais cela n’a pour l’instant pas d’importance. Cette première partie du programme va spécifier des informations qui seront valables quel que soit le graphique réalisé par le macro-programme. Nous devons construire des courbes : pour tous les SYMBOL allant de 1 à &num+1, nous demandons INTERPOL=JOIN. Les instructions : %LET date=%SYSFUNC(INPUTN(&datedebut,date9.)); %LET dateb=%SYSFUNC(PUTN(&date,fradfwkx.)); permettent de disposer, dans une macro-variable DATEB, de la date de début d’observation écrit avec le FORMAT FRADFWDX (1er janvier 2005). La commande est un peu particulière ici parce que la date de début est stockée comme une chaîne de caractères dans une macro-variable. Il faut donc dans un premier temps transformer cette chaîne de caractères en une date SAS (un nombre de jours qui séparent la date du 1er janvier 1960). Dans une étape DATA, vous utiliseriez la fonction INPUT mais celle-ci ne peut pas être émulée via %SYSFUNC ; il faut utiliser INPUTN. Ensuite, il faut transformer à nouveau la date (nombre de jours) en une date chaîne de caractères issue d’un FORMAT (ici, FRADFWDX). Étant donné que la commande PUT n’est pas disponible avec %SYSFUNC, il faut utiliser PUTN. Il est possible de remplacer ces deux commandes par une commande unique : %LET datec=%SYSFUNC(putn(%SYSFUNC(INPUTN(&datedebut,date9.)),FRADFWDX.)); Cette commande est cependant nettement plus compliquée à comprendre. Le pied de page sera identique quel que soit le graphique. Nous souhaitons pouvoir disposer de la date du jour écrite avec le FORMAT FRADFWKX (mardi 1er janvier 2008). Nous précisons ensuite quelques options graphiques communes à l’ensemble des graphiques. Programme 9.57 (deuxième partie du macro-programme %GRAPHE) %IF &nbaction=1 AND &cac=non %THEN %DO; TITLE2 h=16pt FONT='verdana/bold' "Evolution du cours de l’action %SYSFUNC(STRIP(&&lact&action))"; TITLE3 h=16pt FONT='verdana/bold' "depuis le &dateb"; PROC GPLOT DATA=base; PLOT &action*date / NOFRAME HAXIS=axis1 HMINOR=0; LABEL &action = "&&lact&action"; WHERE date>="&datedebut"d; RUN; %END; SAS Livre Page 438 Jeudi, 18. septembre 2008 6:03 18 438 ◆ SAS Ce programme traite le cas des demandes de graphique pour lesquelles il n’y a qu’un cours à représenter. Le nom de la variable à représenter est stocké dans la macrovariable ACTION (BNP, par exemple). Dans le titre, on reprend via l’instruction %SYSFUNC(STRIP(&&lact&action)) le nom complet de l’action – la fonction STRIP permet, en retirant les espaces qui pourraient apparaître dans la valeur de la macro-variable &&LACT&ACTION(-> &LACTBNP-> BNP Paribas), d’intégrer harmonieusement le nom de l’action en toutes lettres. Le LABEL sera appliqué à l’axe vertical et sera égal au nom de l’action en toutes lettres. Le graphique ne commencera qu’à partir de la date de début spécifiée. Programme 9.58 (troisième partie du macro-programme %GRAPHE) %ELSE %IF &nbaction=2 AND &cac=non %THEN %DO; %LET t1=%SCAN(&action,1); %LET t2=%SCAN(&action,2); TITLE2 h=16pt FONT='verdana/bold' "Evolution comparée des cours des titres"; TITLE3 h=16pt FONT='verdana/bold' "%SYSFUNC(STRIP(&&lact&t1)) et %SYSFUNC(STRIP(&&lact&t2))"; TITLE4 h=14pt FONT='verdana/bold' "depuis le &dateb"; PROC GPLOT DATA=base; PLOT &t1*date / NOFRAME HAXIS=axis1 PLOT2 &t2*date; LABEL &t1 = "&&lact&t1"; LABEL &t2 = "&&lact&t2"; WHERE date>="&datedebut"d; RUN; HMINOR=0; %END; Dans ce second cas, deux noms d’actions sont stockés dans la macro-variable ACTION. Il faut donc déterminer quelles actions représenter. C’est ce que font les commandes : %LET t1=%SCAN(&action,1); %LET t2=%SCAN(&action,2); T1 est le premier mot de la macro-variable ACTION, T2 est le second. Le reste du programme ne pose pas de difficulté si vous avez compris le programme 9.57. Programme 9.59 (quatrième partie du macro-programme %GRAPHE) %ELSE %IF &nbaction=1 AND &cac=oui %THEN %DO; SYMBOL; SYMBOL C=CXCC0099 I=rl V=circle; TITLE2 h=16pt FONT='verdana/bold' "Rendement du CAC et rendement de l’action %SYSFUNC(STRIP(&&lact&action))"; TITLE3 h=16pt FONT='verdana/bold' "depuis le &dateb"; PROC GPLOT DATA=base; PLOT r_&action*r_cac / VREF=0 HREF=0 NOFRAME REGEQN; WHERE date>="&datedebut"d; SAS Livre Page 439 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 439 LABEL r_cac=rendement du CAC; LABEL r_&action=%SYSFUNC(STRIP(&&lact&action)); RUN; TITLE2 h=16pt FONT='verdana/bold' "Evolution comparée du CAC et du cours de l’action %SYSFUNC(STRIP(&&lact&action))"; TITLE3 h=14pt FONT='verdana/bold' "depuis le &dateb"; SYMBOL; SYMBOL I=j; PROC GPLOT DATA=base; PLOT &action*date / NOFRAME HAXIS=axis1 HMINOR=0; PLOT2 cac*date; LABEL &action = "&&lact&action"; LABEL CAC = CAC (rouge); WHERE date>="&datedebut"d; RUN; %END; Deux graphiques seront proposés dans le cas où vous comparez l’évolution du CAC avec celle du cours de l’action. Le nom de l’action est stocké dans la macro-variable ACTION, nous pouvons donc l’utiliser sans retraitement. Le premier graphique est représentatif de l’opposition du rendement de l’action avec le rendement du CAC. SYMBOL1 est redéfini de façon à faire apparaître la droite de régression ; l’option REGEQN permettra de lire le bêta dans le pied de page. Le second graphique est proche de celui proposé par le programme 9.58. Programme 9.60 (cinquième partie du macro-programme %GRAPHE) %ELSE %IF &nbaction=3 | ( &nbaction=2 AND &cac=oui) %THEN %DO; ** calcul des cours et du cac en base 100 à la date spécifiée; DATA base; SET base; DROP b100:; RUN; DATA base; SET base; IF date<="&datedebut"d THEN b100cac=100; IF date>"&datedebut"d THEN b100cac+b100cac*r_cac; RUN; %DO i=1 %TO &nbaction; %LET t&i=%SCAN(&action,&i); DATA base; SET base; IF date<="&datedebut"d THEN b100&&t&i=100; IF date>"&datedebut"d THEN b100&&t&i+r_&&t&i*b100&&t&i; RUN; %END; %IF &cac=non %THEN %DO; TITLE2 H=16pt FONT='verdana/bold' "Evolution comparée des cours des actions"; SAS Livre Page 440 Jeudi, 18. septembre 2008 6:03 18 440 ◆ SAS TITLE3 H=16pt FONT='verdana/bold' "%SYSFUNC(STRIP(&&lact&t1)), %SYSFUNC(STRIP(&&lact&t2)) et %SYSFUNC(STRIP(&&lact&t3))"; TITLE4 H=16pt FONT='verdana/bold' "Base 100 au &dateb"; LEGEND1 LABEL=none VALUE=( TICK=1 JUSTIFY=c "%SYSFUNC(STRIP(&&lact&t1))" TICK=2 JUSTIFY=c "%SYSFUNC(STRIP(&&lact&t2))" TICK=3 JUSTIFY=c "%SYSFUNC(STRIP(&&lact&t3))"); PROC GPLOT DATA=base; PLOT (b100&t1 b100&t2 b100&t3)*date / OVERLAY NOFRAME LEGEND=legend1 HMINOR=0 VAXIS=axis1; WHERE date>="&datedebut"d; RUN; %END; %IF &cac=oui %THEN %DO; TITLE2 H=16pt FONT='verdana/bold' "Evolution comparée des cours des actions"; TITLE3 H=16pt FONT='verdana/bold' "%SYSFUNC(STRIP(&&lact&t1)), %SYSFUNC(STRIP(&&lact&t2)) et du CAC"; TITLE4 H=16pt FONT='verdana/bold' "Cours des actions et du CAC en base 100 au &dateb"; LEGEND1 LABEL=none VALUE=( TICK=1 JUSTIFY=c "%SYSFUNC(STRIP(&&lact&t1))" TICK=2 JUSTIFY=c "%SYSFUNC(STRIP(&&lact&t2))" TICK=3 JUSTIFY=c "CAC 40"); PROC GPLOT DATA=base; PLOT (b100&t1 b100&t2 b100cac)*date / OVERLAY NOFRAME LEGEND=legend1 HMINOR=0 VAXIS=axis1; WHERE date>="&datedebut"d; RUN; %END; %END; Le programme traite ici de deux cas : le cas où les cours de trois actions seront à comparer et le cas où les cours de deux actions seront à comparer avec le CAC. Puisque trois courbes sont représentées, nous choisissons de les représenter en base 100 à la date de début de la période d’observation. Dans la première partie du programme, on recalcule les cours en base 100 à la date de départ. Comme ces variables sont construites par incrémentations, dans un premier temps, il faut effacer les variables B100 qui pourraient exister dans la table BASE1. Si vous demandez à nouveau la construction d’une variable incrémentée (alors que la variable existe déjà), vous incrémentez l’incrémentée… 1. Pour ne pas multiplier les tables, j’ai choisi des commandes DATA BASE;SET BASE;. C’est ce choix qui oblige à effacer les variables de type B100 qui pourraient avoir été créées par d’autres invocations du macro-programme %GRAPHE. Des instructions de type DATA BASE2;SET BASE; auraient créé d’autres difficultés pour la construction de B100CAC puisqu’on ne peut pas créer cette variable au sein de la boucle qui crée les variables B100 de chaque action (elle serait recalculée alors dix fois). La solution consisterait à construire une troisième table BASE3 pour la construction de B100CAC, puis de la merger avec BASE2. SAS Livre Page 441 Jeudi, 18. septembre 2008 6:03 18 Le langage macro sous SAS ◆ 441 DATA base; SET base; DROP b100:; RUN; Le CAC en base 100 à la date de début est construit par cette partie du programme : DATA base; SET base; IF date<="&datedebut"d THEN b100cac=100; IF date>"&datedebut"d THEN b100cac+b100cac*r_cac; RUN; Puisque l’on dispose du taux de croissance du CAC, la construction de B100CAC ne pose pas de problème : avant la date de début, cette variable est égale à 100 ; elle augmente ensuite à chaque période du taux de croissance du CAC. Ensuite, pour les actions : %DO i=1 %TO &nbaction; %LET t&i=%SCAN(&action,&i); DATA base;SET base; IF date<="&datedebut"d THEN b100&&t&i=100; IF date>"&datedebut"d THEN b100&&t&i+r_&&t&i*b100&&t&i; RUN; %END; Il faut déjà déterminer les actions à traiter (deux ou trois actions selon les cas). Nous reprenons ici la programmation utilisant %SCAN vue dans le programme 9.58. Le programme de construction des cours base 100 est une généralisation de celui utilisé pour calculer le CAC en base 100. La construction des graphiques ne pose pas de réelles difficultés. Vous remarquerez l’introduction d’une légende rendue nécessaire par la présentation de trois courbes sur un même graphique. Une fois de plus, nos macro-variables nous permettent de paramétrer cette légende. Programme 9.61 (sixième partie du macro-programme %GRAPHE) %ELSE %DO; ODS PDF TEXT= "Ce macro-programme n’est pas prévu pour réaliser le graphe demandé."; ODS PDF TEXT= "Voici ce que vous demandez :"; ODS PDF TEXT= "-vous souhaitez une représentation de &nbaction actions-max=3"; ODS PDF TEXT= "-l’action ou les actions demandées sont les suivantes : &action"; ODS PDF TEXT= "-à la question : voulez-vous représenter le CAC, vous avez dit &cac"; %IF &cac=oui %THEN %DO; ODS PDF TEXT= "et dans ce cas, on ne peut représenter que deux actions"; %END; ODS PDF TEXT= "Votre date de début &datedebut correspond au &dateb"; %END; %MEND; Si les paramètres d’entrée ne peuvent être appliqués, un message sera envoyé vers ODS PDF (puisque nous allons rendre à notre responsable un fichier PDF). SAS Livre Page 442 Jeudi, 18. septembre 2008 6:03 18 442 ◆ SAS Nous demandons à présenter les valeurs des macro-variables NBACTION, ACTION, CAC et DATEDEBUT de façon à comprendre l’erreur de la requête. Programme 9.62 OPTIONS ODS PDF %graphe %graphe %graphe %graphe ODS PDF PRINTERPATH=postscript NODATE NONUMBER ORIENTATION=landscape; FILE='pgr_macro.pdf' NOTOC STYLE=gears; (nbaction=1,action=BNP ,cac=non,datedebut=01jan2005); (nbaction=1,action=CAP ,cac=oui,datedebut=01jan2005); (nbaction=2,action=ALU BN,cac=oui,datedebut=01sep2006); (nbaction=3,action=BN CA CAP,cac=non,datedebut=01jan2004); CLOSE; Le programme 9.62 permet de produire un rapport qui indiquera les différents types de graphiques construits par le macro-programme en fonction de la valeur des paramètres. À titre d’illustration, nous reproduisons dans le résultat 9.8 le graphique produit par l’instruction suivante : %graphe (nbaction=3,action=BN CA CAP,cac=non,datedebut=01jan2004); Résultat 9.8 Une fois les macro-programmes écrits1, la construction de la table mise à jour et celle des graphiques demandés prennent moins d’une minute, même avec une connexion Internet de faible débit : vous pourrez commencer à 9 h 25 le lundi matin et passer un week-end tranquille. 1. Ne soyez cependant pas effrayé par l’écriture d’un tel programme : beaucoup d’éléments sont répétitifs. Les trois macro programmes présentés dans cette dernière section ont été écrits en une journée. SAS Livre Page 443 Jeudi, 18. septembre 2008 6:03 18 Bibliographie BURLEW, Michelle M., SAS Macro Programming Made Easy, SAS Publishing, 2007, ISBN 1590478827. CARPENTER, Art, Carpenter’s Complete Guide to the SAS Macro Language, SAS Publishing, 2004, ISBN:1590473841. CARPENTER, Arthur L. et DELANEY, Kevin P., “SAS® Macro: Symbols of Frustration? %Let us help! A Guide to Debugging Macros”, Proceedings of the twenty ninth Annual SAS Users Group International Conference 2004, n˚ 128-29, www2.sas.com/proceedings/sugi29/128-29.pdf. CHAKRAVARTHY, Venky et ARBOR, Ann, “Have a Strange DATE? Create your own INFORMAT to Deal with Her”, Proceedings of the of the twenty-seventh Annual SAS Users Group International Conference 2002, n˚ 101-27, www2.sas.com/proceedings/sugi27/p101-27.pdf. CODY, Ronald P., et SMITH; Jeffrey K, Applied statistics and the SAS programming language, Fifth Edition, Pearson Prentice Hall, ISBN 0-13-146352-5. DEGUIRE, Yves, “The FILENAME Statement Revisited”, Proceeding of the SAS Global Forum 2007, n˚ 007-2007, www2.sas.com/proceedings/forum2007/007-2007.pdf. DELANEY, Kevin P., “ODS PDF: It’s not just for printing anymore”, Proceedings of the of the Twenty-eighth Annual SAS Users Group International Conference 2003, n˚ 146.28, www2.sas.com/proceedings/sugi28/146-28.pdf. DELWICHE, Lora D. et SLAUGHTER, Susan J., The little SAS book: a primer, third edition, SAS Publishing, n˚ 59216, ISBN 1-59047-333-7. DUGUET, Emmanuel, Introduction à SAS, 2004, Economica, ISBN 2-7178-4788-X. GEBHART, Eric, “The Beginners Guide to ODS MARKUP: Don’t Panic!”, Proceedings of the of the Thirty-first Annual SAS Users Group International Conference 2006, n˚ 23631, support.sas.com/rnd/base/ods/odsmarkup/p236-31.pdf. HAWORTH, Lauren E., Proc Tabulate by example, SAS Publishing, n˚ 56514, ISBN-13: 978-1580253581. HAWORTH, Lauren E., Output Delivery System, the basics, SAS Publishing, n˚ 58087, ISBN-X 978-1580258593. HAWORTH, Lauren E., “SAS with Style: Creating your own ODS Style Template for PDF Output”, Proceeding of the Thirtieth Annual SAS Users Group International Conference 2005, n˚ 132-30, www.laurenhaworth.com/publications/132-30.pdf. HAWORTH, Lauren E., “ODS for PRINT, REPORT and TABULATE”, Proceeding of the Twenty-sixth Annual SAS Users Group International Conference 2001, n˚ 003-26, www2.sas.com/proceedings/sugi26/p003-26.pdf. HAWORTH, Lauren E., “PROC TEMPLATE: The Basics”, Proceedings of the of the Thirtyfirst Annual SAS Users Group International Conference 2006, n˚ 112.31, www2.sas.com/proceedings/sugi31/112-31.pdf. HAWORTH, Lauren E., Output Delivery System, the basics, SAS publishing n˚ 58087, 2001, ISBN 1-58025-859-X. SAS Livre Page 444 Jeudi, 18. septembre 2008 6:03 18 444 ◆ SAS HAWORTH, Lauren E., Proc Tabulate by example, SAS Publishing n˚ 56014, 1999, ISBN 1-58025-359-X. KARP, Andrew H., “Getting in to the Picture (Format)”, Proceedings of the of the Thirtyfirst Annual SAS Users Group International Conference 2006, n˚ 243-31, www2.sas.com/proceedings/sugi31/243-31.pdf. KONTCHOU KOUOMEGNI, Hélène et DECOURT, Olivier, SAS, maîtriser SAS base et SAS macro, SAS 9 et versions antérieures, Dunod, 2004, ISBN 2-10-007622-1. LAFLER, Kirk Paul, Power SAS: A Survival Guide, 2002, Apress ed., ISBN 1-59059-066-X . LEVINE, Allison, “The What, When, Why and How of Proc Format”, Proceedings of the NorthEast SAS Users Group conference, 1997, www.nesug.info/Proceedings/nesug97/begtut/levine.pdf. LUND, Pete, “PDF Can be Pretty Darn Fancy – Tips and Tricks for the ODS PDF Destination”, Proceedings of the of the Thirty-first Annual SAS Users Group International Conference 2006, n˚ 092-31, www2.sas.com/proceedings/sugi31/092-31.pdf. MOORMAN, Denise J. et WARNER, Deanna, “Indexing in the SAS® System, Version 6”, SAS technical notes n˚obswww08, 1998, support.sas.com/techsup/technote/ts580.pdf. MUIR, Tim, “Character Function Fun, A voyage through character functions added in SAS 9”, Hartford Area SAS Users Group Newsletter, 2005, november, www.hasug.org/newsletters/hasug200511/Muir_Character_Function_Fun.pdf. SAS Institute, SAS 9.2 Online Doc, 2008, support.sas.com/cdlsearch?ct=80000. SAS Institute, SAS 9.1.3 Online Doc, 2005, support.sas.com/onlinedoc/913/docMainpage.jsp. SAS Institute, “Using TrueType Fonts with Universal Printing in SAS® 9.1”, SAS Publishing, support.sas.com/documentation/onlinedoc/base/91/freetype-hub.pdf. SAS Institute, SAS Certification prep guide, base programming for SAS® 9, SAS Publishing 2006, ISBN-13: 978-1-59047-922-3 . SCHLOTZHAUER Sandra D. et LITTELL Ramon C., SAS System for Elementary Statistical Analysis, second edition, SAS Publishing n˚ 55172, 2001, ISBN 1-58025-018-1. ZENDER, Cynthia, “Practically Perfect Presentations Using ODS and PROC REPORT”, Proceedings of the Pharmaceutical industry SAS Users Group conference 2007, Hands-On Workshop, n˚ 03, www.lexjansen.com/pharmasug/2007/hw/hw03.pdf. SAS Livre Page 445 Jeudi, 18. septembre 2008 6:03 18 Index Symboles %DO 423 %UNTIL 427 %WHILE 427 boucle 424 %EVAL 391, 408 %GLOBAL 419 %IF 423 %INDEX 406 %LEFT 413 %LENGTH 406 %LET 391 %LOCAL 418 %MACRO 391, 416 %MEND 391, 416 %NRSTR 409 %PUT 391 %QSCAN 428 %QSCAN, %QSUBSTR... 410 %SCAN 406, 428 %STR 409 %SUBSTR 407 %SYMDEL 397 %SYSEVALF 407 %SYSFUNC 405 %UPCASE 407 A ACCESS 35, 166 ACTIVEX 329 ARRAY 129 DIM 131 double 132 ATTRIB 174, 212 AUTOEXEC.SAS 182 AXIS 266 B bibliothèque 23 LIBNAME 24 MAPS 23 moteur 25 nom 25 SASHELP 23 SASUSER 23, 179, 364 sauvegarde FORMAT 169 temporaire Voir WORK WORK 23, 175, 179, 429 C CALL EXECUTE 398 CALL SYMPUT 398 exemple 209 CALL SYMPUTX 402 CARDS 18 CARDS4 38 COLUMN INPUT 39 concaténation 88, 102, 398 D DATA _NULL_ 75, 209, 400, 413, 415 DATALINES 18 DIF 97, 140 DMOPTLOAD 179 DMOPTSAVE 179 DMS, (Display Manager System) 14 DO boucle 52 itératif 72, 91, 115, 118, 126 simple 50, 93, 126 sur ARRAY 130 UNTIL 102, 127 WHILE 128 DROP 42, 108 SAS Livre Page 446 Jeudi, 18. septembre 2008 6:03 18 446 ◆ SAS E édition des graphiques 316 END= 119 ESCAPECHAR= ODS 377 EXCEL 18, 25, 35, 36, 47, 62, 75, 369, 370 F fenêtre caractères spéciaux 378 COMMANDE 77, 259, 330 DEVICES 327 DOCUMENT 334 EDITEUR 14, 18 EXPLORATEUR 14 GDEVICE 327 GRAPH 14 JOURNAL 14 Ln, Col 40 nouvelle bibliothèque 24 OPTIONS 180 PROC TEMPLATE SYNTAX 356, 365 registre 259 RESULTATS 14 RESULTS VIEWER 14, 326 SORTIE 14 pied de page 187 titre 186 VIEWTABLE 16 fichier AUTOEXEC.SAS 182 configuration 181 INFILE Voir INFILE SASV9.CFG 181 TXT, DAT, CSV 34 FILENAME 35 MPRINT 431 ODSOUT 338 URL 433 fonctions générateurs de nombres aléatoires 97 numériques 95 séries temporelles 97 statistiques 96 sur chaînes de caractères 98 sur dates 104 sur valeurs manquantes 108 FOOTNOTE 187, 264 FORMAT 64, 212 attribution 159 différences avec INFORMAT 161 entrelacés 170 spécifiques création 167 retrouver 168 variables alphanumériques 166 de dates 163 numériques 162 Voir aussi PROC FORMAT FSLIST 40, 77 G GIFANIM 328 GOPTIONS 262 annuler 265 DEVICE= 327 DEVMAP et KEYMAP 279 syntaxe 262 H HTML langage et ODS 351 PROC PRINT 205 sorties en format 205, 335 Voir aussi ODS HTML I IF 109 IF / GOTO 123 IF, THEN / ELSE IF, THEN 120 IF, THEN, ELSE 120 IFC 122 IFN 122 importation module d’ 35, 62 INDEX, sur table 156 INFILE 28, 34 CARDS 28 DLM 38, 53 DSD 37, 53 END= Voir END= EXPANDTABS 36, 46 FIRSTOBS 34 LRECL 34, 37, 78 MISSOVER 28 OBS 34 TRUNCOVER 43, 49, 79 SAS Livre Page 447 Jeudi, 18. septembre 2008 6:03 18 Index ◆ 447 INFORMAT 54 alphanumériques 54, 57 date 63, 66 différences avec FORMAT 161 erreur sur 79 INFORMAT() 55 numériques 57, 58 spécifier le W ? 60, 79 temps 68 TRUNCOVER 55 Voir aussi PROC FORMAT INPUT 17 #X 49 & (deux espaces) 46 +X 42 / 49 @ 50 @@ 47, 79 @X 44 colonne 41 curseur 61, 79 fonction 116 position du curseur 42 INPUT BUFFER 84 J JAVA 328 JAVA RUNTIME ENVIRONMENT 329 JAVAIMG 328, 381 K KEEP 85, 108 L LABEL 212 dans les FORMAT et INFORMAT 69 LAG 97, 139 langues 66, 166 LEGEND 294 LENGTH 86 et SCAN 100 modification 173 LIBNAME 24 Voir aussi bibliothèque LIST INPUT 39 longueur d’enregistrement 86 Voir aussi INFILE / LRECL M macro-fonction 390, 405 macro-instruction 390 macro-programme 391, 416 débugage 429 forcer l’arrêt 410 nom 416 sauvegarde 429 macro-variable 391, 393 automatique 395 GLOBAL 396 nom 392 résolution 394 suppression 397 _USER_ 396 MDY 64 MERGE 147 IN= 153 MISSING 30, 31, 48, 108 MOD 115 N NOTE 264 NOTEPAD 40, 77 O observation, nombre 18 ODS destinations 332 multiples 348 ESCAPECHAR= 377 EXCLUDE 346 format des images 328 GPATH= 326 graphiques et 324 IMAGE_DPI= 326 NOPROCTITLE 343 NOPTITLE 343 PATH= 326 polices 326 PROC PRINT 204 PROC REPORT 228 PROC TABULATE 250 PROCLABEL 342 SELECT 346 TEXT= 379 SAS Livre Page 448 Jeudi, 18. septembre 2008 6:03 18 448 ◆ SAS ODS DOCUMENT 333 ODS GRAPHICS 385 options 387 ODS HTML 338 fichiers 338 langage HTML 351 STYLE= 336 table des matières 341 ODS LISTING 333 ODS MARKUP 355 ODS OUTPUT 349 ODS PDF 373 ANCHOR= 384 ESCAPECHAR= 377 page de garde 381 PDFTOC= 383 STARTPAGE= 374 TEXT= 380 ODS PRINTER 372 ODS RTF 367 grands tableaux 369 modification du style 370 ODS TRACE 344 opérateurs étape DATA 94 macro-langage 423 OPTIONS de la fenêtre SORTIE 186 DFLANG= 73 fenêtre 180 FMTSEARCH= 169 MAUTOSOURCE 429 MFILE 431 MLOGIC 430 modifications 180 MPRINT 430 MSTORED 429 NOFMTERR 169 NOREPLACE/REPLACE 177 SASMSTORE= 429 SYMBOLGEN 430 WORKINIT 179 WORKTERM 179 YEARCUTOFF 67 TITLE, FOOTNOTE et NOTE 264 OUTPUT 50, 52, 72, 89, 90 Output Delivery System Voir ODS P paramétrage, macro-programme 421 PATTERN 269 PDV 84, 88, 137 percentiles 196 POINT= 115 positionnement absolu 42 relatif 42 PROC CONTENTS 142, 156 PROC EXPAND 295, 434 PROC FONTREG 327 PROC FORMAT création d’un FORMAT 167 d’un INFORMAT 69 FMTSEARCH (OPTIONS) 169 FORMAT entrelacés 170 LABEL 69 LIBRARY= 168 MULTILABEL 171 NOFMTERR (OPTIONS) 169 PICTURE 73 retrouver ses FORMAT spécifiques 168 PROC FREQ 81, 229 OUT= 234 syntaxe 229 PROC G3D 255 PROC GCHART 271 DESCRIPTION= 344 options 273 statistiques 275 sur axes 277 sur points centraux 276 PROC GCONTOUR 255 PROC GDEVICE 327 Voir aussi GDEVICE PROC GMAP 255 PROC GOPTIONS 262 PROC GPLOT 290 options 291 PLOT2 306 PROC MEANS 171, 187 CLASSDATA 194 instructions 188 MLF (FORMAT entrelacés) 171 options 188 OUTPUT 191 statistiques 190 SAS Livre Page 449 Jeudi, 18. septembre 2008 6:03 18 Index ◆ 449 PROC OPTIONS 178 GROUP= 179 LISTGROUPS 178 OPTION= 179 PROC OPTSAVE 179 PROC PRINT 22, 197 CONTENTS= 382 ODS 204 statistiques 216 STYLE (ODS) 206 syntaxe 197 PROC REPORT 210 ACROSS 218 ANALYSIS 214 COMPUTED 219 CONTENTS= 382 DEFINE 212 DISPLAY 214 GROUP 215 ODS 228 ORDER 214 PROC SORT 146 FIRST 135 LAST 135 PROC TABULATE 235 CONTENTS= 382 ODS 250 récapitulatifs 244 statistiques 236 syntaxe 235 PROC TEMPLATE 355 ajouts d’attributs 364 fenêtre PROC TEMPLATE SYNTAX 356 modification des couleurs 362 des polices 357 des tableaux 360 sauvegarde des styles 364 PROC UNIVARIATE OUTPUT 197 percentiles 196 PROGRAM DATA VECTOR Voir PDV programme BATCH 20 exécuter 20 interrompre 21 PUT commande 172 fonction 172 Q quoting 408 %QSCAN, %QSUBSTR... 410 R REGEDIT 327 règles affichage NOTEPAD et FSLIST 77 résolution macro-variables 394 RENAME 85, 144 RESET 90 RESOLVE 400 RETAIN 50, 134 FIRST 135 LAST 135 RETURN 90, 93 S SAS, exécution via Windows 181 SAS/GRAPH, couleurs 257 SASV9.CFG 181 SELECT 124 SELECT/WHEN/OTHERWISE 113 séparateur décimal 18 SET 143 sommaire, construction avec ODS 383 Voir aussi Table des matières STATEMENTS 256 AXIS 266 GOPTIONS 262 Voir aussi GOPTIONS LEGEND 294 PATTERN 269 SYMBOL 299 TITLE, FOOTNOTE et NOTE 264 STATISTICAL GRAPHICS 329 Statistical Graphics Editor 317, 386 STRIP 438 STYLE ODS 336, 370 PROC PRINT 206 PROC REPORT 228 PROC TABULATE 250 STYLE Voir aussi PROC TEMPLATE SYMBOL 299 INTERPOL 303 SYMGET 402 SAS Livre Page 450 Jeudi, 18. septembre 2008 6:03 18 450 ◆ SAS T table 17 définition 15 exporter 74 réunion MERGE 147, 151 SET 143 table des matières 366, 382 ODS HTML 341 tabulation 36, 46 TITLE 186, 264 titre, fenêtre SORTIE 186 traffic lightening 209 U unicodes 378 UPDATE 151 IN= 153 V variable alphanumérique 88 incrémentée 118, 124, 176 liste 141 nom 17 nombre 17 nouvelle 118 numérique 88 VMACRO 391 W WHERE 111, 212 fonctions spécifiques 112 PROC MEANS 193 SAS ® Version 9.2 Introduction au décisionnel : méthode et maîtrise du langage Sébastien Ringuedé Sébastien Ringuedé est maître de conférences en sciences économiques à l’université d’Orléans. Il utilise SAS depuis plus de 15 ans dans le cadre des recherches qu’il effectue au sein du Laboratoire d’Économie d’Orléans (LEO – UMR CNRS 6221) et enseigne SAS aux étudiants du master ESA (Économétrie et Statistique Appliquée) depuis sa création. Préface de Daniel Delorge, Directeur général SAS France SAS est le progiciel d’informatique décisionnelle le plus utilisé au monde. Ce livre présente de façon pédagogique et complète le socle de connaissances communes à tous les utilisateurs de SAS. Il peut servir aussi bien de guide d’initiation pour les utilisateurs débutants que d’ouvrage de référence pour les utilisateurs plus expérimentés. Les premiers chapitres traitent de Base SAS, le module au cœur du système SAS. La création des tables de données, leur manipulation, leur modification, leur gestion, ainsi que les procédures d’exploration des données (construction de tableaux, de rapports, etc.) y sont plus particulièrement développées. La suite du livre est consacrée à l’exploration du module SAS/GRAPH afin d’offrir au lecteur les connaissances nécessaires à la réalisation de graphiques d’excellente facture. Les derniers chapitres portent sur la production de documents au format HTML, RTF ou PDF au moyen d’ODS (Output Delivery System), ainsi que sur le langage macro spécifique à SAS. Pour vous aider à bien assimiler tous les concepts, il vous est proposé : • de nombreux exercices dans les premiers chapitres ; • de nombreux exemples d’application dans les chapitres suivants ; • un site compagnon (www.sas-sr.com), où vous trouverez les codes des programmes proposés dans le livre, les sorties générées par les programmes, les fichiers pour reproduire les exemples et réaliser les exercices, et les solutions des exercices. Le livre, qui s’adresse aux utilisateurs des versions 8 et 9 de SAS, traite les toutes dernières nouveautés de la version 9.2. Public : universités, écoles d’ingénieurs, écoles de commerce ; professionnels Cours : Introduction à SAS, SAS Niveau : L/M Pearson Education France 47 bis, rue des Vinaigriers 75010 Paris Tél. : 01 72 74 90 00 Fax : 01 42 05 22 17 www.pearson.fr ISBN : 978-2-7440-4167-9