Académique Documents
Professionnel Documents
Culture Documents
SAS
Version 9.2
Introduction au décisionnel :
méthode et maîtrise du langage
®
http://www.free-livres.com/
Sébastien Ringuedé
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 Enter-
prise 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.
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 ques-
tions 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.
Remerciements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . III
Préface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XIII
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Présentation de l’ouvrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Progresser dans votre connaissance de SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Comment travailler avec cet ouvrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
La certification SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Aller plus loin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
SAS : une communauté active d’utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Les différentes versions de SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
SAS Windows, Unix, OpenVMS, z/OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Disposer du système SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Conventions typographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1. Créer une table SAS* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.1 Faisons connaissance avec SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2 Les tables SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.3 Cas simple : les informations sont séparées par un espace . . . . . . . . . . 16
1.3.1 Créons notre première table SAS. . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.3.2 L’éditeur SAS : une aide à la programmation . . . . . . . . . . . . . . . . 18
1.3.3 Demander l’exécution d’un programme. . . . . . . . . . . . . . . . . . . . 20
1.3.4 Les bibliothèques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.4 Comprenons bien le cas simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.5 Les valeurs manquantes sur variables numériques . . . . . . . . . . . . . . . . 28
1.5.1 Plus de deux modalités aux valeurs manquantes . . . . . . . . . . . . . 31
1.5.2 Cas des valeurs manquantes saisies par aucun signe . . . . . . . . . . 32
2. Pour aller plus loin dans la création de tables SAS* . . . . . . . . . . . 33
2.1 La création d’une table SAS à partir d’un fichier informatique . . . . 33
2.2 Autres indicateurs de séparation des modalités . . . . . . . . . . . . . . . . . . 36
2.2.1 Les modalités sont séparées par des tabulations. . . . . . . . . . . . . . 36
2.2.2 Les modalités sont séparées par des virgules. . . . . . . . . . . . . . . . . 37
2.2.3 Les modalités sont séparées par un caractère quelconque. . . . . . . . . 38
2.2.4 Les modalités sont séparées par un point-virgule . . . . . . . . . . . . 38
2.3 Les données présentées en colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.3.1 Premier cas : l’absence d’espace entre les modalités . . . . . . . . . . 39
2.3.2 Cas général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
SAS Livre Page VI Jeudi, 18. septembre 2008 6:03 18
VI ◆ SAS
VIII ◆ SAS
6.4.1 PROC PRINT pour des sorties dans la fenêtre SORTIE . . . . . . . 197
6.4.2 PROC PRINT et ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
a. La syntaxe de l’option STYLE . . . . . . . . . . . . . . . . . . . . . . . . 206
b. Premier exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
c. « Traffic lightening » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
6.5 PROC REPORT* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
6.5.1 Exemples simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
6.5.2 L’instruction DEFINE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
6.5.3 Les variables et leurs usages possibles . . . . . . . . . . . . . . . . . . . . . . 214
a. Les variables ORDER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
b. Les variables GROUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
c. Les variables ACROSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
d. Les variables COMPUTED . . . . . . . . . . . . . . . . . . . . . . . . . . 219
6.5.4 Les rapports intégrant des informations de type liste
et des informations de synthèse . . . . . . . . . . . . . . . . . . . . . . . . . . 221
a. Cas simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
b. Quelques précautions à prendre . . . . . . . . . . . . . . . . . . . . . . 223
6.5.5 Trois exemples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
a. 1er exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
b. Second exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
c. Un dernier exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
6.5.6 PROC REPORT et ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
6.6 PROC FREQ* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
6.6.1 Les tableaux de fréquences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
6.6.2 Les tableaux croisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
6.7 PROC TABULATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
6.7.1 Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
6.7.2 Exemples d’applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
a. Structures lignes-colonnes des tableaux . . . . . . . . . . . . . . . . 238
b. Les variables d’analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
c. Choix de la statistique éditée dans le tableau . . . . . . . . . . . . 242
d. L’introduction de récapitulatifs dans le tableau . . . . . . . . . . 244
e. L’introduction de pourcentage dans les tableaux . . . . . . . . 247
6.7.3 PROC TABULATE et ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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
XII ◆ SAS
* 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
XIV ◆ SAS
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’utili-
sations 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écessai-
res à 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 permet-
tre 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évelop-
pement 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
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éhen-
sion 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é à repro-
duire 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 Program-
ming. 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 pour-
rez 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 certifi-
cation. 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.
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/
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 exem-
ple 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/
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
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 pour-
rez é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 appa-
raissent 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’instruc-
tion 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 obser-
vations (cette construction est en fait conditionnée au respect de la condition énon-
cé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’informati-
que 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.
Introduction ◆ 11
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éri-
cains.
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
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.
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 signifi-
cation 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 docu-
ments 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.
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 person-
nalisation 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
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.
DATA 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;
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
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écu-
tera 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 invo-
cation 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’obser-
vations 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 (bleu-
vert 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.
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
%MACRO print ;
%LET texte=test;
PROC PRINT;RUN;
%MEND ;
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
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
22 ◆ SAS
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';
24 ◆ SAS
Vous pourrez aussi créer une bibliothèque en utilisant l’icône « Nouvelle bibliothèque »
située sur la barre d’outils :
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 biblio-
thè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éal-
louer à 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 enregis-
tré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 actuel-
lement 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 biblio-
thè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.
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.
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.
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 informa-
tions 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 obser-
vations, la modalité de la variable X5 est manquante.
SAS Livre Page 28 Jeudi, 18. septembre 2008 6:03 18
28 ◆ SAS
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.
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).
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 :
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.
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 effec-
tué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 non-
répondants.
SAS Livre Page 31 Jeudi, 18. septembre 2008 6:03 18
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. 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 traite-
ments possibles sur variables numériques tout en conservant votre information de
nature qualitative.
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.
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
Dans le cas présent, 200 variables numériques sont à créer. Elles ont toutes des moda-
lité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 vous-
mê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
DATA 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;
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 observa-
tions 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
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.
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 main-
tenant, 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 cepen-
dant 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 tabula-
tion 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)
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écessai-
rement que votre LRECL soit supérieur à la longueur maximale de votre enregistrement et que, simul-
tané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
DATA test;
INFILE 'c:\intro_SAS\fichiers\test29.txt' DLM='?';
INPUT X1 X2 X3 X4 X5 $;
RUN;
DATA test;
INFILE CARDS DLM='@#';
INPUT email $ com $;
CARDS;
a@esa.fr@#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 email com
1 a 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’à rechercher-
remplacer les deux (ou plus) caractères par le caractère que vous avez choisi.
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.
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;
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 Obs x1 x2 x3 x4
1 123 45 6789 abc
987654321def 2 987 65 4321 def
253698741ghi 3 253 69 8741 ghi
879654321jkl 4 879 65 4321 jkl
5 324 57 8961 lmn
324578961lmn 6 524 16 9387 opq
524169387opq
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
Résultat 2.1
1 la grande . . de .
2 le mur . . Jean .
3 le cercle . . Delon 20
4 le corniaud . . Funès 14
5 le chanteur . . Luis .
6 la traversé . . Jean .
Par défaut, SAS considère que les modalités sont séparées par des espaces et les carac-
téristiques de votre instruction INPUT font que SAS pense qu’il doit avoir une appro-
che 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’emplace-
ment 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
Programme 2.14
Résultat 2.2
Obs acteur note annee code ordre titre
1 Louis de Funès 16 1966 A V 7 Jean Poiret 14 19
2 Alain Delon 20 1970 Z A 8 Louis de Funès 14 19
3 Luis Mariano 12 1956 A B 5 Jean Gabin 19 19
44 ◆ SAS
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.
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;
DATA tabu;
INFILE 'C:\intro_SAS\fichiers\tabu.txt' EXPANDTABS;
INPUT X1 $ X2;
RUN;
1 aa 1
2 aa .
3 aa .
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
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.
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éci-
fier 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.
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;
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
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 retrou-
vent 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 informa-
tions 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
Programme 2.24
Résultat 2.4
Obs nom cle prenom age
1 Dupont 2 Pierre 38
2 Dupont 2 Sophie 37
3 Dupont 2 Théodore 6
4 Dupont 2 Marcelline 5
5 Dubois 2 Frédéric 42
6 Dubois 2 Michelle 37
7 Dubois 2 Marie 11
8 Durand 2 Jean 53
9 Dufour 2 Hervé 78
10 Dufour 2 Marie 75
SAS Livre Page 51 Jeudi, 18. septembre 2008 6:03 18
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 5
0 famille Dubois
3 Frédéric 42 Michelle 37 Marie 11
0 famille Durand
SAS Livre Page 52 Jeudi, 18. septembre 2008 6:03 18
52 ◆ SAS
1 Jean 53
0 famille Dufour
2 Hervé 78 Marie 75
;RUN;
Encore une fois, le programme présenté ci-dessus fait appel à des outils de program-
mation 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’obser-
vations 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.
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
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 égale-
ment 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;
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
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
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 choisi-
rez 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épa-
rateur 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
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.
58 ◆ SAS
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 moda-
lité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
Ainsi :
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 transfor-
mation 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,000) (-1,000.00) €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,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, 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
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;
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;
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 tabula-
tions 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
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 États-
Unis 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
64 ◆ SAS
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 1 1 1960 0
2 1 1 1900 -21914
3 10 10 1980 7588
4 20 12 2003 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;
Résultat 2.7
Obs JJ MM AA date
1 1 1 1960 1960-01-01
2 1 1 1900 1900-01-01
3 10 10 1980 1980-10-10
4 20 12 2003 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 trans-
former 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)
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 Dutch NLD Finnish FIN
French FRA German DEU Italian ITA
Norwegian NOR Portuguese PTG Spanish ESP
Swedish SVE Swiss_French FRS Swiss_German DES
Vous utiliserez pour cela les INFORMAT suivants : EURDFDE. (version internatio-
nale 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
Programme 2.472
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 YEAR-
CUTOFF, 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
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
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;
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’.
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 évo-
qué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----+----6-
521 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.
DATA infmt;
INPUT start $11. @13 label $;
FMTNAME="enq";
TYPE='J';
CARDS;
SAS Livre Page 71 Jeudi, 18. septembre 2008 6:03 18
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 INFOR-
MAT2. 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 espa-
ces 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;
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éces-
saire 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
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;
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 indi-
quez 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 INFOR-
MAT 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 » ?
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
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 cepen-
dant 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 exem-
ple, 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;
76 ◆ SAS
La modification de FORMAT, voire une imposition d’un nouveau FORMAT, est obli-
gatoire, 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
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.
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. Contrai-
rement à FSLIST, NOTEPAD permet la modification des fichiers bruts. L’enregis-
trement de votre fichier modifié avec NOTEPAD est automatique lorsque vous
quittez la fenêtre. Si vous utilisez la fonction rechercher-remplacer, les remplace-
ments 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.
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
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 enregis-
trement 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 conjonc-
tion 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 carac-
tè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).
Nom de fichier=C:\intro_SAS\fichiers\merg1.txt,
RECFM=V,LRECL=256
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 iden-
tifiant 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 renseigne-
ments, 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
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
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 logi-
ques : 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 utili-
sée) et les variables qu’elle contient (nombre, type, longueur de l’enregistre-
ment, 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
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
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
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;
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;
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 trans-
formé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 moda-
lité 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 carac-
té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 alpha-
numé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).
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.
$ num $ $ Type
Bloc
8 8 3 10 Longueur
1 2 3 4 Ordre
PDV
Puisque la table NEW2 est construite à partir de NEW, SAS va reprendre certaines
informations de la première observation pour commencer à remplir le PVD.
$ num $ $ Type
Bloc
8 8 3 10 Longueur
1 2 3 4 Ordre
PDV
Albert 1 A
La suite du programme permet de donner une valeur à X5, puis de modifier la valeur
prise par X1 pour l’individu 1 :
$ num $ $ Type
Bloc
8 8 3 10 Longueur
1 2 3 4 Ordre
PDV
Albert 10 A Groupe Z A
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
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
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 1000.00 0
2 1050.00 1
3 1102.50 2
4 1157.63 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 indi-
quer 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
Et vous obtiendrez :
Résultat 3.2
Obs nom annee x
1 Albert 1 1
2 Albert 2 2
3 Albert 3 3
4 Albert 4 4
5 Albert 5 5
6 Robert 1 6
7 Robert 2 7
8 Robert 3 8
9 Robert 4 9
10 Robert 5 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 Z w
1 1 10 . 1000
2 2 20 . 2000
3 3 30 . 3000
4 4 40 400 .
5 5 50 500 .
6 6 60 600 .
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.
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
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…;
Priorité 6
Et AND ou &
Priorité 7
Ou OR ou / ou |
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.
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).
98 ◆ SAS
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;
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élimi-
teur, 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;
• 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’apos-
trophe 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
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
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é.
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 X Y Z CB
1 a abc c a,abc,c
2 ab ab f ab,ab,f
3 abc a i 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 à conca-
té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 enregis-
tré comme modalité de W. Cette possibilité est aussi valable pour les autres fonc-
tions texte.
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.
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 date date2
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
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.
Programme 3.20
DATA petit;
SET gros;
KEEP X1 X2;
RUN;
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
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 passe-
ront 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 varia-
bles 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.
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;
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
b. WHERE
Contrairement à IF, WHERE ne peut être utilisé que pour sélectionner des observa-
tions 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;
DATA femme;
SET ensemble;
WHERE sexe=1 AND cheveux=1;
RUN;
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 ins-
truction WHERE ne sera peut-être pas facile à écrire. Vous pourrez passer dans ce cas par la construc-
tion 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 :
1
2
3
4
Figure 3.5 • Position des parenthèses et priorités dans la résolution des instructions.
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
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 troi-
siè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 conser-
ver 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 alpha-
numé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
114 ◆ SAS
des tables ne reprenant que les informations relatives aux clients de la région dont elle
a la charge.
Programme 3.30
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 conclu-
sion 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
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
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érati-
vement ê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;
DATA dollar;
SET lib.dollar;
ca_num=INPUT(ca,eurox12.2);
RUN;
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;
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
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
somme_
Obs etu note exc note nb_etudiant moyenne
. . .
26 26 6 0.19986 153 26 5.88462
27 27 2 0.99949 155 27 5.74074
28 28 . 0.02290 155 28 5.53571
29 29 . 0.01336 155 29 5.34483
30 30 . 0.11700 155 30 5.16667
31 31 16 0.95227 171 31 5.51613
32 32 3 0.34507 174 32 5.43750
33 33 13 0.30917 187 33 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.
120 ◆ SAS
DATA test;
SET test;
IF cheveux=1 THEN blond=1;ELSE blond=0;
IF cheveux=2 THEN brun=1;ELSE brun=0;
IF cheveux=3 THEN chatain=1;ELSE chatain=0;
IF cheveux=4 THEN autre=1;ELSE autre=0;
RUN;
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;
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
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;
122 ◆ SAS
Programme 3.45
DATA note_etudiant4;
SET note_etudiant;
resultat=IFN(note>=10,1,0);
resultat2=IFC(note>=10 ,'reçu','recalé');
RUN;
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;
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;
Résultat 3.8
Obs x1 x2 x3 x4 x5 x6 x7
1 1 1 10 . . -1 -1
2 1 2 10 . . -1 -2
3 1 3 10 . . -1 -3
4 2 1 20 -2 -1 -2 -1
5 2 2 20 -2 -2 -2 -2
6 2 3 20 -2 -3 -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
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;
DATA note_etudiant7;
SET note_etudiant;
IF note > 15 THEN compte+1;
RUN;
SAS Livre Page 125 Jeudi, 18. septembre 2008 6:03 18
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;
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;
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 obser-
vations 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
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’intro-
duire des lignes de programmes entre END et RUN : ces lignes, si elles sont parfaite-
ment 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 I=1 TO n;
DO I=n TO 1 BY -1;
DO I=k+1 TO n-1;
DO I=1 TO k-1,k+1 TO n;
DO 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;
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;
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.
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;
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 grou-
pé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 varia-
bles. 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éci-
ser 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.
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
result(i)=ROUND(RANNOR(25)*2+8+RANUNI(3)*4,0.1);
IF RANUNI(14)<0.05 THEN result(i)=.;
END;
OUTPUT;
END;
RUN;
Programme 3.58
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 donne-
rons à 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 revan-
che, 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
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) :
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
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
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’appli-
que et l’instruction PUT demande à SAS d’écrire dans la fenêtre JOURNAL un
message suivi de la valeur X problématique.
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.
136 ◆ SAS
À 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.
1 16 2 10 3 59
1 12 2 20 3 45
1 19 2 8 3 2
1 15 2 14 3 18
1 18 2 30
1 17
À 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
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
RETAIN x1-x3;
IF first.ind THEN DO;
x1 = .; x2 = .; x3 = .;
END;
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éci-
sons 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 impor-
tante 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 obser-
vations relatives à l’individu 1.
. . . Initialisation
1 16 16 . . (1) Puisque 16>., 16 est placé en X1
1 12 16 12 . (2) 12<16 et 12>., 12 est placé en X2
1 19 19 16 12 (1) 19>16 et décalage : 12 passe en X3,
16 passe en X2 et 19 est placé en X1
1 15 19 16 15 (3) 15<19 et 15<16 mais 15>12 :
remplacement
1 18 19 18 16 (2) idem
1 17 19 18 17 Nous sommes à last.ind=1 : le PDV
est envoyé vers la table et SAS peux
passer à l’individu 2
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 program-
mation analogue à celle examinée précédemment).
Programme 3.63
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
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
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 ;
DATA test;
SET test;
x_1=LAG(x);
y=x+x_1;
RUN;
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;
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 dif_Y
1 1 1 1
2 1 2 .
3 1 3 1
4 1 4 1
5 2 1 1
6 2 2 -2
7 2 3 1
8 2 4 1
9 3 1 1
10 3 2 -2
11 3 3 1
12 3 4 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 observa-
tion, 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
Programme 3.69
142 ◆ SAS
Merci de noter les « : » après le X. Toutes les variables dont le nom commence par X
seront traitées.
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
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 infor-
mations 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.
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
144 ◆ SAS
ID X1
1 A ID X1
TEST1
2 B
3 C 1 A
4 D 2 B
5 E 3 C
6 F 4 D
5 E
SET test1 test2 ; 6 F
ID X1 7 G
8 H
7 G 9 I
TEST2
8 H 10 J
9 I 11 K
10 J 12 L
11 K
12 L
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 A ID X1 X2
TEST1
2 B
3 C 1 A
4 D 2 B
5 E 3 C
6 F 4 D
5 E
SET test1 test2 ;
6 F
ID X2 7 G
8 H
7 G 9 I
TEST2
8 H 10 J
9 I 11 K
10 J 12 L
11 K
12 L
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
Programme 4.3
DATA test;
SET test1 (RENAME = (id=ident))
test2 (RENAME = (x2=x1 id=ident));
RUN;
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 A ID X1
TEST1
2 B
5 C 1 A
5 D 1 G
6 E 2 B
8 F 3 H
SET test1 test2 ; 5 C
BY id ; 5 D
ID X1 5 I
6 E
1 G 7 J
TEST2
3 H 8 F
5 I 10 K
7 J 10 L
10 K
10 L
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.
146 ◆ SAS
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 dange-
reuse 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
AN X1
2002 A
TEST1
2003 B
2004 C AN X1 X2
2006 D
2007 E 2001 1
2008 F 2002 A 2
MERGE test1 test2 ; 2003 B 3
BY an ; 2004 C 4
AN X2 2005 5
2006 D 6
2001 1 2007 E .
TEST2
2002 2 2008 F .
2003 3
2004 4
2005 5
2006 6
Programme 4.4
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 modali-
té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
AN X1
2002 A
TEST1
2003 B
2004 C
2006 D AN X1 X2
2007 E
2008 F 2001 A 1
MERGE test1 test2 ; 2002 B 2
BY an ; 2003 C 3
AN X2 2004 D 4
2005 E 5
2001 1 2006 F 6
TEST2
2002 2
2003 3
2004 4
2005 5
2006 6
Programme 4.5
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
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.
Programme 4.81
DATA table1b;
SET table1 (DROP=action1);
FORMAT date ddmmyy10.;
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 puis-
que 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’exer-
cice 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.
Résultat 4.1
Table MASTER Tables MAJ
Numm Mois CA Numm Mois CA
1 Janvier 30 5 Mai .
2 Février 35 6 Juin 39
3 Mars 37 7 Juillet 38
4 Avril 35 8 Aout 41
5 Mai 39
6 Juin 40
7 Juillet 36
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
DATA master;
UPDATE master maj;
BY numm;
RUN;
Numm X1 CA
1 Janvier 30
MASTER
2 Février 35
3 Mars 37 Numm X1 CA
4 avril 35
5 Mai 39 1 Janvier 30
6 Juin 40 2 Février 35
7 Juillet 36 UPDATE master maj ; 3 Mars 37
BY numm ; 4 avril 35
5 Mai 39
6 Juin 39
Numm X1 CA 7 Juillet 38
8 Aout 41
5 Mai .
MAJ
6 Juin 39
7 Juillet 38
8 Aout 41
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
Programme 4.10
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 indi-
vidus 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. Atten-
tion, 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
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
158 ◆ SAS
Les LABEL permettent d’expliciter les variables dont les noms n’évoquent pas grand-
chose 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
nombre de nombre de nbre de nbre de nbre de nbre de
personnes mentions reçus, reçus, reçus, reçus,
Obs reçues très bien groupe n°1 groupe n°2 groupe n°3 groupe n°4
1 92 13 24 39 18 11
% de reçus, % de % de % de % de
tous groupes reçus, reçus, reçus, reçus,
Obs confondus groupe n°1 groupe n°2 groupe n°3 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
Programme 5.2
DATA test;
SET test;
FORMAT prix 4.1;
RUN;
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écau-
tions. 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 affi-
chage 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 choi-
sira 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épa-
ration 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 x
1 1101
2 1101
3 1101
4 1101
5 1101
6 1102
7 1102
8 1102
9 1102
10 1102
11 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
Programme 5.5
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
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 mainte-
nant 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.
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 NLMNLJPY Japanese Yen NLMNLSEK Swedish Kronor
Programme 5.7
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 FORMAT
(forme générale) appliqué Exemple INTERNATIONAL/FRANÇAIS
DATEw. DATE7. 01OCT07 EURDFDE./FRADFDE.
DATE9. 01OCT2007 EURDFDD./FRADFDD.
DDMMYYw.a DDMMYY6. 011007
DDMMYY8. 01/10/07
DDMMYY10. 01/10/2007
DOWNAMEw. DOWNAME. Monday EURDFDWN./FRADFDWN.
DOWNAME3. Mon
JULDAYw. JULDAY 274
JULIANw. JULIAN. 07274
JULIAN7. 2007274
MMDDYYw. MMDDYY6. 100107
MMDDYY8. 10/01/07
MMDDYY10. 10/01/2007
MMYYxw. MMYYS5. 10/07
MMYYS7 10/2007
MONNAMEw. MONNAME. October EURDFMN./FRADFMN.
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
WEEKDATXw. WEEKDATX9. Monday EURDFWKX./FRADFWKX8.
WEEKDATX15. Mon, 1 oct 07 FRADFWKX15.
WEEKDATX. Monday, 1 FRADFWKX.
October 2007
WEEKDATX29. Monday, 1 FRADFWKX27.
October 2007
WEEKDAYw. WEEKDAY. 2 EURDFDN./FRADFDN.
SAS Livre Page 165 Jeudi, 18. septembre 2008 6:03 18
FORMAT FORMAT
(forme générale) appliqué Exemple INTERNATIONAL/FRANÇAIS
WORDATEw. WORDATE3. Oct
WORDATE9. October
WORDATE12. Oct 1, 2007
WORDATE. October 1, 2007
WORDATE18. October 1, 2007
WORDATXw. WORDATX3. Oct EURDFWDX./FRADFWDX3.
WORDATX9. October FRADFWDX9.
WORDATX12. 1 Oct 2007 FRADFWDX12.
WORDATX. 1 October 2007 FRADFWDX.
WORDATEX. 1 October 2007
YEARw. 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
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 date
1 1 1 1960 1er janvier 1960
2 1 1 1900 1er janvier 1900
3 10 10 1980 10 octobre 1980
4 20 12 2003 20 décembre 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 interna-
tionaux en remplaçant le préfixe EUR par le préfixe correspondant à votre langue1.
Langues disponibles dans SAS 9.1 :
Programme 5.9
PROC PRINT;
FORMAT date ptgdfwdx.;
RUN;
Résultat 5.7
Obs JJ MM AA date
1 1 1 1960 1 de janeiro de 1960
2 1 1 1900 1 de janeiro de 1900
3 10 10 1980 10 de outubro de 1980
4 20 12 2003 20 de dezembro de 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…)
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
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.
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éfec-
ture (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.
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
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 quel-
conque (ici MALIB), vous n’aurez pas besoin de la ligne d’OPTIONS : SAS ira de lui-
mê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ésul-
tat 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 traite-
ment 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 :
170 ◆ SAS
Programme 5.12
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);
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
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ète-
ment. 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
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
172 ◆ SAS
lisible, peuvent aussi être utilisés pour des analyses en provoquant des regroupements
de modalités.
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 alphanu-
mé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 alpha-
numé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 ordon-
nant 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 alphanu-
mé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 :
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;
DATA fmt;
SET fmt;
ager=PUT(age,ageb.);
RUN;
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 peu-
vent 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
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;
176 ◆ SAS
Au sein même des tables temporaires, les programmes qui demandent le remplace-
ment 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 X n
1 1 16
2 2 17
3 3 18
4 4 19
5 5 20
6 6 21
7 7 22
8 8 23
9 9 24
10 10 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 obser-
vation, 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
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.
178 ◆ SAS
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
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 Erase all files from WORK library at SAS invocation
WORKTERM Erase files from WORK library at SAS termination
Nous découvrons donc que les tables de la bibliothèque temporaire sont effacées lors-
que 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
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.
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.
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
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éci-
fier 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
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 aide-
ront à 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
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.
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
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 moda-
lité 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 com-
mun 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
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 mini-
male 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 trou-
verez 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;
190 ◆ SAS
Résultat 6.1
La procédure MEANS
Sur les variables numériques, SAS vous indique par défaut une moyenne, un écart-
type, le minimum et le maximum en plus du nombre de points sur lesquels il a effec-
tué 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
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
CLM RANGE
CSS SKEWNESS | SKEW
CV STDDEV | STD
SAS Livre Page 191 Jeudi, 18. septembre 2008 6:03 18
mots-clés quantiles :
MEDIAN | P50 Q3 | P75
P1 P90
P5 P95
P10 P99
Q1 | P25 QRANGE
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.
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_ _STAT_ qi taille poids
1 0 314 N 314.000 314.000 314.000
2 0 314 MIN 70.000 149.000 48.000
3 0 314 MAX 121.000 186.000 89.000
4 0 314 MEAN 100.220 164.201 66.672
5 0 314 STD 8.019 7.326 7.929
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
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 celle-
ci 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
Résultat 6.3
qi taille poids
Obs sexe _TYPE_ _FREQ_ _max _max _max Intelligent Grand Fort
1 0 314 121 186 89 Giang Laetitia Julian
2 F 1 132 114 186 87 Barbara Laetitia Laetitia
3 H 1 182 121 184 89 Giang Benoît Julian
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 nombreu-
ses 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
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
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éala-
ble 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 CLAS-
SDATA=. 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
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
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 don-
né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
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
1. 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
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 UNIVA-
RIATE procedure, puis output data sets).
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
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 comman-
des 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
Programme 6.20
200 ◆ SAS
Programme 6.21
Programme 6.22
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
Programme 6.24
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
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é ------------------------
1 DL-103 10 €1.550,00
1 Goldring Eroica LX 16 €4.400,00
1 Ortofon Nr 2 22 €4.400,00
2 DL-103 23 €3.565,00
2 Goldring Eroica LX 14 €3.850,00
2 Ortofon Nr 2 16 €3.200,00
3 DL-103 16 €2.480,00
3 Goldring Eroica LX 12 €3.300,00
3 Ortofon Nr 2 17 €3.400,00
------- -------- -----------
vendeur 146 €30.145,00
1 DL-103 19 €2.945,00
1 Goldring Eroica LX 15 €4.125,00
1 Ortofon Nr 2 10 €2.000,00
2 DL-103 15 €2.325,00
2 Goldring Eroica LX 23 €6.325,00
2 Ortofon Nr 2 17 €3.400,00
3 DL-103 15 €2.325,00
3 Goldring Eroica LX 19 €5.225,00
3 Ortofon Nr 2 18 €3.600,00
------- -------- -----------
vendeur 151 €32.270,00
======== ===========
686 €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
Le programme 6.27 permet la présentation des ventes de chaque vendeur par mois
(double BY) :
Programme 6.27
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
Programme 6.29
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;
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
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;
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.
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 éventuel-
lement 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;
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
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
Sur ces éléments (sauf sur TABLE) Sur TABLE, vous pouvez modifier les
vous pouvez modifier les caractéristiques caractéristiques suivantes :
suivantes : BACKGROUND=
ASIS= BACKGROUNDIMAGE=
BACKGROUND= BORDERCOLOR=
BACKGROUNDIMAGE= BORDERCOLORDARK=
BORDERCOLOR= BORDERCOLORLIGHT=
BORDERCOLORDARK= BORDERWIDTH=
BORDERCOLORLIGHT= CELLPADDING=
BORDERWIDTH= CELLSPACING=
CELLHEIGHT= FONT=*
CELLWIDTH= FONT_FACE=*
FLYOVER= FONT_SIZE=*
FONT= FONT_STYLE=*
FONT_FACE= FONT_WEIGHT=*
FONT_SIZE= FONT_WIDTH=*
FONT_STYLE= FOREGROUND=*
FONT_WEIGHT= FRAME=
FONT_WIDTH= HTMLCLASS=
HREFTARGET= JUST=
HTMLCLASS= OUTPUTWIDTH=
JUST= POSTHTML=
NOBREAKSPACE= POSTIMAGE=
POSTHTML= POSTTEXT=
POSTIMAGE= PREHTML=
POSTTEXT= PREIMAGE=
PREHTML= PRETEXT=
PREIMAGE= RULES=
PRETEXT= * : ce sont les textes (au-dessus (PRE) ou
PROTECTSPECIALCHARS= au-dessous du tableau (POST)) définis
par PRETEXT, POSTTEXT, PREHTML
TAGATTR=
et POSTHTML qui sont concernés par
URL= la modification de ces caractéristiques
VJUST=
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’instruc-
tion 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
Résultat 6.9
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 QUAN-
TITE) 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
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;
210 ◆ SAS
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.
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 environne-
ments 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 vous-
même votre rapport – une fois que vous serez habitué à la syntaxe, vous pourrez
découvrir de vous-même les modes fenêtrés1.
OPTIONS PAGESIZE=500;
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 prenom datenais cheveux Qi taille poids age
F Emilie 11136 2 98 170 68 17
H Damien 11773 3 93 158 61 15
H Fabien 11869 2 106 168 73 15
H Boris 11493 2 98 165 69 16
F Ingela 11004 4 107 172 73 17
H Rémy 11173 1 108 173 78 17
H Damien 11378 3 99 172 79 16
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
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 ;…
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 garçon 17 04/08/1990 173 78
Audrey fille 17 16/04/1990 165 65
Josselin garçon 16 04/08/1991 173 79
Baptiste garçon 17 06/08/1990 167 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
214 ◆ SAS
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
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 varia-
bles 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
Résultat 6.14
Date de
Age naissance Taille Poids
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
15 22/01/2285 1598 630
16 22/10/2838 4674 1949
17 01/12/2751 4281 1733
18 25/03/2284 1823 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 possi-
bilité de demander d’autres statistiques.
Depuis SAS 9.2, il est possible de demander le mode via le mot-clé MODE.
CSS Somme des écarts à la USS Somme des carrés non corrigés :
moyenne au carré Σ(xt – x̄ ) 2 Σ(xt)2
CV Coefficient de variation (100 * MAX Valeur maximale
STD / MEAN)
MEAN Moyenne MIN Valeur minimale
N Nombre d’observations non NMISS Nombre d’observations
manquantes 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 PCTSUM Pourcentage d’une ligne ou
d’une colonne sur un nombre d’une colonne sur la somme des
d’observations 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 MEDIAN Médiane
Student supérieur à la valeur
absolue de T
Résultat 6.15
Date de
naissance Taille Poids
Age moyenne moyenne moyen
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
15 03/07/1992 159.8 63
16 21/05/1991 166.929 69.607
17 16/06/1990 164.654 66.654
18 22/06/1989 165.727 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
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
Programme 6.46
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
Programme 6.471
Résultat 6.18
Une variable ACROSS et une variable GROUP
sexe
fille garçon
Age Taille Poids Taille Poids
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
15 163.6 63.6 162.3 66.8
16 164.3 65.0 165.0 68.7
17 163.6 63.6 164.6 69.4
18 165.1 65.7 164.2 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ési-
rez 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
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
220 ◆ SAS
Programme 6.48
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 03/07/1992 159.8 63 24.67
16 21/05/1991 166.929 69.607 24.98
17 16/06/1990 164.654 66.654 24.59
18 22/06/1989 165.727 68.727 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
a. Cas simple
Nous allons partir du rapport de type liste obtenu au moyen du programme 6.49.
Programme 6.49
Résultat 6.21
Date de Indice de
prenom sexe naissance Taille Poids masse corporelle
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
Benoît H 18/06/1989 184 84 24.81
Michael H 31/01/1989 179 81 25.28
Nikki F 11/11/1989 168 67 23.74
Sabrina F 21/12/1989 165 63 23.14
Frederic H 01/01/1989 164 65 24.17
Laurence F 12/12/1989 153 57 24.35
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 H 18/06/1989 184 84 24.81
Michael H 31/01/1989 179 81 25.28
Nikki F 11/11/1989 168 67 23.74
Sabrina F 21/12/1989 165 63 23.14
Frederic H 01/01/1989 164 65 24.17
Laurence F 12/12/1989 153 57 24.35
======= ====== ================
168.833 69.5 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 statisti-
ques synthétiques, DOL (Double OverLining) et DUL (Double Underlining). OL et
UL sont possibles.
Programme 6.50
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 F 11/11/1989 168 67 23.74
Sabrina 21/12/1989 165 63 23.14
Laurence 12/12/1989 153 57 24.35
======== ======= ====== ================
F 162 62.333 23.75
======== ======= ====== ================
Benoît H 18/06/1989 184 84 24.81
Michael 31/01/1989 179 81 25.28
Frederic 01/01/1989 164 65 24.17
======== ======= ====== ================
H 175.667 76.667 24.84
======== ======= ====== ================
SAS Livre Page 223 Jeudi, 18. septembre 2008 6:03 18
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 moyen-
nes de poids et de tailles des hommes et des femmes – ce n’est donc pas la moyenne
des indices calculés.
Programme 6.51
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.
224 ◆ SAS
a. 1er exemple
Programme 6.52
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 indi-
vidus 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 F 11/11/1989 67.00 107.49%
Sabrina 21/12/1989 63.00 101.07%
Laurence 12/12/1989 57.00 91.44%
ƒƒƒƒƒƒƒƒ ƒƒƒƒƒƒƒ ƒƒƒƒƒƒƒƒƒƒƒ
F 62.33 100.00%
ƒƒƒƒƒƒƒƒ ƒƒƒƒƒƒƒ ƒƒƒƒƒƒƒƒƒƒƒ
Benoît H 18/06/1989 84.00 109.57%
Michael 31/01/1989 81.00 105.65%
Frederic 01/01/1989 65.00 84.78%
ƒƒƒƒƒƒƒƒ ƒƒƒƒƒƒƒ ƒƒƒƒƒƒƒƒƒƒƒ
H 76.67 100.00%
ƒƒƒƒƒƒƒƒ ƒƒƒƒƒƒƒ ƒƒƒƒƒƒƒƒƒƒƒ
SAS Livre Page 225 Jeudi, 18. septembre 2008 6:03 18
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;
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 prenom / 'Prénom' WIDTH=20;
DEFINE taille / ANALYSIS FORMAT=8.2;
DEFINE taille_moy / MEAN NOPRINT;
DEFINE 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 permet-
tent 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
COMPUTE poids;
IF sexe='H' THEN DO;
SAS Livre Page 227 Jeudi, 18. septembre 2008 6:03 18
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;
228 ◆ SAS
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.
Pour commander un tableau dans PROC FREQ, les instructions TABLES et TABLE
sont équivalentes.
Programme 6.58
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
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
Ici, vous retirez les pourcentages colonnes (NOCOL), les pourcentages lignes
(NOROW) et les pourcentages indiquant la part dans la population totale (NOPER-
CENT). 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 utilise-
rez 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
Vous avez la possibilité, sans trier votre table, d’obtenir le même résultat avec le
programme 6.63.
Programme 6.63
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
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
234 ◆ SAS
Programme 6.65
Si, ensuite, vous demandez un PROC PRINT sur la table TOTO, vous obtiendrez le
résultat 6.28.
Résultat 6.28
Obs age cinema COUNT PERCENT
1 20 et moins 0 5 0.5488
2 20 et moins 1-5 21 2.3052
3 20 et moins 5-10 14 1.5368
4 20 et moins 10-20 22 2.4149
5 20 et moins 20-30 4 0.4391
6 20 et moins 30 et plus 12 1.3172
7 20-30 ans 0 8 0.8782
8 20-30 ans 1-5 61 6.6959
9 20-30 ans 5-10 42 4.6103
10 20-30 ans 10-20 54 5.9276
11 20-30 ans 20-30 35 3.8419
12 20-30 ans 30 et plus 18 1.9759
13 30-50 ans 0 31 3.4029
14 30-50 ans 1-5 140 15.3677
15 30-50 ans 5-10 78 8.5620
16 30-50 ans 10-20 107 11.7453
17 30-50 ans 20-30 56 6.1471
18 30-50 ans 30 et plus 32 3.5126
19 50-65 ans 0 8 0.8782
20 50-65 ans 1-5 41 4.5005
21 50-65 ans 5-10 30 3.2931
22 50-65 ans 10-20 38 4.1712
23 50-65 ans 20-30 16 1.7563
24 50-65 ans 30 et plus 18 1.9759
25 65 et plus 0 1 0.1098
26 65 et plus 1-5 5 0.5488
27 65 et plus 5-10 4 0.4391
28 65 et plus 10-20 5 0.5488
29 65 et plus 20-30 2 0.2195
30 65 et plus 30 et plus 3 0.3293
Programme 6.66
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
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 Somme des carrés corrigée pour la moyenne
CV Coefficient de variation
MAX Valeur maximale
MEAN Moyenne arithmétique
MIN Valeur minimale
N Nombre d’observations ayant une valeur non manquante pour la
variable d’analyse
NMISS Nombre d’observations ayant une valeur manquante pour la variable
d’analyse
PCTN Pourcentage des fréquences
PCTSUM Pourcentage de la somme
PRT Probabilité d’une valeur absolue plus grande pour la valeur t
RANGE Domaine des valeurs, MAX-MIN
STD Écart-type
STDERR Erreur type de la moyenne
SUM Somme
SUMWGT Somme pondérée
USS Somme des carrés non corrigée
T Valeur T de Student pour tester l’hypothèse d’une moyenne nulle de la
population
VAR Variance
SAS Livre Page 237 Jeudi, 18. septembre 2008 6:03 18
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 deman-
der dans l’étape de construction des tables).
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 classifi-
cation (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‚
탃ƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒŒ
Outre la répartition des factures par régions, vous obtiendrez la répartition des factu-
res par types de produits. Il est aussi possible de construire un vrai tableau croisé :
Programme 6.71
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
Ou encore deux variables de définition des lignes et deux variables de définition des
colonnes :
Programme 6.73
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‚
탃ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒƒƒƒŒ
240 ◆ SAS
Programme 6.74
Programme 6.77
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 chif-
fre d’affaires réalisé par type de produits vendus. Nous pouvons enrichir ce tableau en
ajoutant une seconde variable de classification :
Programme 6.78
242 ◆ SAS
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
Programme 6.81
Programme 6.82
Vous devinez maintenant que la commande de statistiques différentes sur des varia-
bles d’analyse différentes est tout à fait possible :
Programme 6.83
Ou encore :
Programme 6.84
244 ◆ SAS
Programme 6.85
Programme 6.86
É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
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 effec-
tuez 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
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
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 :
246 ◆ SAS
Programme 6.90
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
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
Programme 6.92
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
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‚
탃ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒŒ
248 ◆ SAS
Programme 6.94
Nous demandons un tableau avec, en lignes, les régions, avec une ligne supplémen-
taire 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 PAGEPCT-
SUM. 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
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
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
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‚
탃ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒ‹ƒƒƒƒƒƒƒŒ
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 varia-
ble 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
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 TABU-
LATE 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éci-
male). 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.
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
Programme 6.100
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
Résultat 6.39
4 3 6 2
2 1bis 1
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 appli-
quer à chacun des éléments de type 2 un style différent.
Zone 3 : STYLE appliqué à CLASSLEV. Nous avons multiplié les instructions CLASS-
LEV 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 souhai-
té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 graphi-
ques (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
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
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 possi-
ble 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.
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 modi-
fication 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;
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.
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 Lumino-
sité, 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
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 Alice-
Blue, 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.
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.
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 « varia-
tions ») et demander des couleurs websafe. Les codes couleurs RGB sont immédiate-
ment indiqués et peuvent être copiés-collés dans SAS. Ce site propose seulement
quatre couleurs assorties.
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éfinis-
sant 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 desti-
nation.
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
262 ◆ SAS
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 graphi-
que/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
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
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).
300
200
Valeurs d'axe
majeures
(VALUE,
ORDER)
Marques mineures d'axe (MINOR)
100
0
0 100 Consommation 200 300
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
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
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
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;
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 :
E 1 2 3 4 5 S
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;
Programme 7.2
DATA graph;
INFILE 'C:\intro_SAS\fichiers\graph.txt';
INPUT x1 x2;
RUN;
272 ◆ SAS
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 indi-
qué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 repre-
nant les fréquences, fréquences cumulées, pourcentages et pourcentages cumulés.
SAS Livre Page 273 Jeudi, 18. septembre 2008 6:03 18
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
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 consul-
ter 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/gchart-
bar.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éci-
fiez 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.
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.
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
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
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
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
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 remar-
querez 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';
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
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
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;
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 THORN-
DALE 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 :
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’instruc-
tion 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
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’inti-
tulé 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 à appli-
quer à 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 obser-
ver 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 appli-
quée. La largeur des barres doit être de 15. Enfin, via l’instruction COUT-
LINE=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 automatique-
ment 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
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;
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
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 »).
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;
Résultat 7.14
SAS crée un graphe sur lequel les axes sont bornés par des valeurs MAX et MIN déter-
miné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
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 sous-
pé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 sous-
pé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 AUTO-
HREF (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
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;
DATA bourse;
MERGE nikkei cac ftse dowjones;
BY date;
RUN;
SYMBOL1 INTERPOL=JOIN;
LEGEND1 VALUE=(TICK=1 'Dow Jones' TICK=2 'CAC 40' TICK=3 'FTSE 100')
LABEL=('Indice boursier') FRAME;
AXIS1 LABEL=NONE;
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
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 enca-
drement de la légende.
L’instruction AXIS1 indique à SAS de ne pas donner de LABEL à cet axe. Cette défini-
tion 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
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
298 ◆ SAS
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
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
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"
plus %
X &
À placer entre
star ' doubles quotes
square =
diamond -
triangle @
hash *
Y +
Z >
paw . Point
point <
dot , Virgule
circle /
_ Underscore ?
À placer entre
" simples quotes (
# )
$ :
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 graphi-
ques 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-using-
graph-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
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 maxi-
mum 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 indi-
quera 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
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.
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;
Résultat 7.17
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
DATA temp;
SET temp;
temp_moy=(temp_max+temp_min)/2;
RUN;
Résultat 7.18
SAS Livre Page 309 Jeudi, 18. septembre 2008 6:03 18
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 succes-
sion 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éris-
tiques 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;
310 ◆ SAS
Résultat 7.19
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
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;
Résultat 7.20
312 ◆ SAS
Programme 7.271
SYMBOL1 I=NEEDLE;
SYMBOL2 I=NEEDLE;
SYMBOL3 I=NEEDLE;
SYMBOL4 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 ' ';
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éfi-
nitions 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
Le trait horizontal passant par zéro est créé automatiquement par l’option d’interpo-
lation. 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;
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 observa-
tions. 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;
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
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 instruc-
tion, é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=('' ' Helsinki' '' ' Tunis')
LABEL=NONE;
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 posi-
tion 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.
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 chapi-
tre (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, puis-
COPY). 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
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;
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 journa-
liers du titre BNP à la Bourse de Paris, des volumes échangés de ce titre et du rende-
ment 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/';
SYMBOL2 INTERPOL=JOIN;
Résultat 7.25
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');
Résultat 7.26
Programme 7.33
Résultat 7.27
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
Programme 7.35
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
1. La photo utilisée pour ce graphique est une photo libre de droits téléchargée sur le site www.photo-
live.be
SAS Livre Page 324 Jeudi, 18. septembre 2008 6:03 18
324 ◆ SAS
Résultat 7.30
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;
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
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.
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 regis-
tre de SAS ne s’effectue pas automatiquement. Pour mettre à jour ce registre, vous
pouvez demander l’exécution de ce programme :
Programme 7.39
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.
328 ◆ SAS
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
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 Explo-
rer 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/
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 graphi-
que, 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 essen-
tielles à 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).
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 souhai-
tez faire apparaître vos résultats sur Internet ? ODS HTML vous y aidera. Vous souhai-
tez 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.
332 ◆ SAS
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
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 troi-
siè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.
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' 3=‘Pakistan'
4='Etats-Unis' 5='Camargue' 6='Népal'
;RUN;
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).
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 DOCU-
MENT 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
s’ouvrira dans le cadre dans lequel vous avez les fenêtres EXPLORATEUR et RESUL-
TATS. 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.
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
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.
338 ◆ SAS
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 fonc-
tionner 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.
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
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
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
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
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 UNIVA-
RIATE 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.
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
Résultat 8.4
Votre instruction ODS PROCLABEL ne s’applique qu’à la sortie qui vient immédia-
tement 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.
Programme 8.10
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
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.
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
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
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
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
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;
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 ◆ 349
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 desti-
nation 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';
…;
Programme 8.19
1. Cette commande ne sera pas utilisée dans cette section consacrée à ODS HTML et sera plus parti-
culiè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
Vous constaterez dans votre fenêtre JOURNAL que votre sortie de PROC UNIVA-
RIATE 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;
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 BasicMeasu-
res 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.
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;
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
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 ◆ 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 guille-
mets 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ésul-
tats, 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
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
Résultat 8.6
1. Utilisateurs de SAS 9.1 : c’est uniquement avec GOPTIONS=JAVAIMG que vous pourrez obtenir un gra-
phique auquel le STYLE que vous avez choisi sera appliqué. Sans cette option, votre graphique ressem-
blera toujours à un copier-coller de votre fenêtre GRAPH.
SAS Livre Page 355 Jeudi, 18. septembre 2008 6:03 18
ODS ◆ 355
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.
356 ◆ SAS
Programme 8.26
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).
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érale-
ment autoriser le navigateur à l’activer) votre fenêtre PROC TEMPLATE SYNTAX va
de nouveau vous donner tous les renseignements dont vous avez besoin. Ces rensei-
gnements 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.
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;
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
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 :
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. Cepen-
dant, 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.
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
362 ◆ SAS
Résultat 8.13
STYLE Contents /
FONT_FACE = "Arial, Helvetica, sans-serif"
FONT_SIZE = 3
FONT_WEIGHT = medium
FONT_STYLE = roman
FOREGROUND = cx0033aa
BACKGROUND = cxb0b0b0;
ODS ◆ 363
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
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 SYSTITLEAND-
FOOTERCONTAINER1. 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 :
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
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 appa-
raî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 PROCE-
DURE’ 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.
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)
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 carac-
té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.
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 automati-
que 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.
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éci-
mal 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
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.
Programme 8.38
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
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 impri-
mante 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 impriman-
tes 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 obte-
nir dans un format PostScript ne peuvent pas être modifiées par la suite (contraire-
ment à 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.
374 ◆ SAS
Programme 8.41
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 possibi-
lité 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
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
GOPTIONS RESET=ALL;
OPTIONS ORIENTATION=landscape PRINTERPATH=postscript
NODATE NONUMBER;
ODS ESCAPECHAR="^" NOPTITLE;
TITLE 'Les graphiques doivent être présentés sur des pages isolées';
GOPTIONS DEVICE=javaimg;
AXIS1 LABEL=NONE;
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.
378 ◆ SAS
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 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.
380 ◆ SAS
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
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 quelque-
fois des difficultés (principalement avec SAS 9.1). Avec SAS 9.2, nous vous recom-
mandons d’utiliser JAVAIMG comme DEVICE pour vos graphiques et de paramétrer
le moins possible ces derniers2.
Programme 8.46
GOPTIONS RESET=ALL;
OPTIONS ORIENTATION=landscape PRINTERPATH=postscript NODATE NONUMBER;
ODS ESCAPECHAR="^" NOPTITLE;
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
ODS ◆ 383
Vous pouvez ainsi aboutir à la table des matières reproduite par le résultat 8.31.
Résultat 8.31
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.
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;
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.
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
Programme 8.48
ODS GRAPHICS;
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 GRA-
PHICS 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, utili-
sez 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 comman-
des 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 graphi-
ques 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’appli-
quer 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
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, macro-
fonctions et macro-commandes débutent tous par le signe %.
Dans les macro-programmes que vous allez écrire, vous aurez besoin de macro-
commandes 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 macro-
commande 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
Programme 9.2
&x3
&x4
&x5;
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 macro-
variable X1) entre la fin de la modalité à stocker et le point-virgule qui clôt l’instruc-
tion %PUT. Les espaces situés à droite du dernier caractère de la modalité ne sont pas
stockés dans les 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
%LET bibli=lib;
%LET nombase=test;
SAS Livre Page 395 Jeudi, 18. septembre 2008 6:03 18
%LET nombase1=toto;
%LET num=1;
%LET a=b;
%LET b=c;
%LET c=d;
Si vous appelez vous obtiendrez
&nombase -> test
&nombase. -> test
&nombase1 -> toto
&nombase.1 -> test1
&bibli&nombase -> libtest
&bibli.&nombase -> libtest
&bibli..&nombase -> lib.test
&&nombase&num -> 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 vous obtiendrez
&a -> b
&&&a -> c
&&&&&&&a -> 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.
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 automati-
ques en donnant quelques explications.
%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 ;
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éna-
tion 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.
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
a b c d e f g h i
;RUN;
DATA test;
SET test;
CALL SYMPUT ("toto",x);
RUN;
DATA test;
SET test;
CALL SYMPUT(COMPRESS("toto"!!_N_),x);
RUN;
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;
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
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;
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éri-
ques, 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
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 testX=!&testX!;
%PUT xX=!&xX!;
%PUT testT2=!&testT2!;
%PUT 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.
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 ins-
tructions 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
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;
1. L’instruction LEFT(PUT(_N_,2.)) peut être remplacée par PUT(_N_,2.,-L) – cette dernière program-
mation 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
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;
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
jean B
luc A
rené B
tom A
;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.)
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
%LET toto=bonjour;
%LET toto2=%SYSFUNC(UPCASE(&toto));
%PUT &toto2;
%LET datefra=%SYSFUNC(TODAY(),fradfwkx.);
%PUT &datefra;
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;
Programme 9.21
%LET toto=un texte avec plusieurs mots;
%LET toto5=%SCAN(&toto,4);
%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;
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 ;
Blanc ) = LT
; ( | GE
¬ + AND GT
^ -- OR IN
~ * NOT %
, (virgule) / EQ &
‘ < NE #
" > LE
SAS Livre Page 409 Jeudi, 18. septembre 2008 6:03 18
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 FOOT-
NOTE 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’annu-
lerez 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
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.
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 utili-
serez 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 test=%STR(title;footnote;);
%PUT &test;
%LET test2=%UPCASE(&test);
%PUT &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
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;
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 »;
412 ◆ SAS
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");
%LET C=2;
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");
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;
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");
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;
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");
Programme 9.34
%LET C=2;
%LET cle=annee;
DATA _NULL_;
SET toto;
clee='A'!!LEFT(&cle);
CALL SYMPUT (clee,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");
L’étape DATA _NULL_ est ici particulière. Nous allons créer autant de macro-varia-
bles 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
%MACRO mp1;
PROC PRINT; Écriture
RUN;
%MEND mp1;
%mp1 Exécution
Tableau 9.3 • Les noms que vous ne pouvez pas donner aux macro-programmes
Tableau 9.3 • Les noms que vous ne pouvez pas donner aux macro-programmes (Suite)
%LET toto=glo;
%MACRO test;
%LET toto=loc;
%LET titi=loc;
%PUT &toto &titi;
%MEND;
%test
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
418 ◆ SAS
%LET toto=glo;
%MACRO test;
%LOCAL toto;
%LOCAL titi;
%LET toto=loc;
%LET titi=loc;
%PUT &toto &titi;
%MEND;
%test
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 obte-
nir 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
%LET toto=glo;
SAS Livre Page 419 Jeudi, 18. septembre 2008 6:03 18
%MACRO test;
%GLOBAL titi;
%LET toto=loc;
%LET titi=loc;
%PUT &toto &titi;
%MEND;
%test
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
%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
Programme 9.40
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
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;
Programme 9.43
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
%ELSE %DO;
lot d’instructions 2…;
%END;
On peut s’attendre à ce que les instructions à exécuter en cas de respect de la condi-
tion (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).
424 ◆ SAS
%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
%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;
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. Imagi-
nons 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
426 ◆ SAS
RUN;
DATA _null_;
SET temp;
CALL SYMPUT (COMPRESS('famille'!!_N_),famille);
CALL SYMPUT ('max',_N_);
RUN;
%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
%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 macro-
programme.
Programme 9.49
%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
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 utili-
ser 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
430 ◆ SAS
%LET bibli=lib;
%LET nombase=test;
%LET nombase1=toto;
%LET num=1;
OPTIONS SYMBOLGEN;
%PUT &nombase;
%PUT &nombase.;
%PUT &nombase1;
%PUT &nombase.1;
%PUT &bibli&nombase;
%PUT &bibli.&nombase;
%PUT &bibli..&nombase;
%PUT &&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 macro-
programme 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 : sup-
port.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
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 pour-
rez 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
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 ?
Programme 9.52
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 Accor
ACA.PA Credit Agricole
AF.PA Air France – KLM
AI.PA Air liquide
ALO.PA Alstom
ALU.PA Alcatel Lucent
BN.PA Danone
BNP.PA BNP Paribas
CA.PA Carrefour
CAP.PA Cap Gemini
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 macro-
variables. Cette première phase de définition des macro-variables est essentielle et
conditionne l’ensemble des programmes que vous pourriez écrire ensuite. Le macro-
programme 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;
Programme 9.55
%MACRO merge;
BY date;
RUN;
DATA base;
MERGE base c_act&i;
BY date;
RUN;
%END;
DATA base;
MERGE base cac;
BY date;
RUN;
%MEND;
%merge;
SAS Livre Page 436 Jeudi, 18. septembre 2008 6:03 18
436 ◆ SAS
%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
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 transfor-
mer 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’ensem-
ble des graphiques.
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 macro-
variable 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.
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)
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.
DATA base;
SET base;
IF date<="&datedebut"d THEN b100cac=100;
IF date>"&datedebut"d THEN b100cac+b100cac*r_cac;
RUN;
440 ◆ SAS
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. Puis-
que 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
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);
%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
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 para-
mè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éti-
tifs. 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/procee-
dings/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/procee-
dings/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˚ 236-
31, 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 Thirty-
first 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 Thirty-
first 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/Procee-
dings/nesug97/begtut/levine.pdf.
LUND, Pete, “PDF Can be Pretty Darn Fancy – Tips and Tricks for the ODS PDF Destina-
tion”, Proceedings of the of the Thirty-first Annual SAS Users Group International Confe-
rence 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 B
%DO 423 bibliothèque 23
%UNTIL 427 LIBNAME 24
%WHILE 427 MAPS 23
boucle 424 moteur 25
%EVAL 391, 408 nom 25
%GLOBAL 419 SASHELP 23
SASUSER 23, 179, 364
%IF 423
sauvegarde FORMAT 169
%INDEX 406
temporaire Voir WORK
%LEFT 413
WORK 23, 175, 179, 429
%LENGTH 406
%LET 391
%LOCAL 418 C
%MACRO 391, 416 CALL EXECUTE 398
%MEND 391, 416 CALL SYMPUT 398
%NRSTR 409 exemple 209
%PUT 391 CALL SYMPUTX 402
%QSCAN 428 CARDS 18
%QSCAN, %QSUBSTR... 410 CARDS4 38
%SCAN 406, 428 COLUMN INPUT 39
%STR 409 concaténation 88, 102, 398
%SUBSTR 407
%SYMDEL 397 D
%SYSEVALF 407
%SYSFUNC 405 DATA _NULL_ 75, 209, 400, 413, 415
DATALINES 18
%UPCASE 407
DIF 97, 140
DMOPTLOAD 179
A DMOPTSAVE 179
DMS, (Display Manager System) 14
ACCESS 35, 166
DO
ACTIVEX 329 boucle 52
ARRAY 129 itératif 72, 91, 115, 118, 126
DIM 131 simple 50, 93, 126
double 132 sur ARRAY 130
ATTRIB 174, 212 UNTIL 102, 127
AUTOEXEC.SAS 182 WHILE 128
AXIS 266 DROP 42, 108
SAS Livre Page 446 Jeudi, 18. septembre 2008 6:03 18
446 ◆ SAS
Index ◆ 447
INFORMAT 54 M
alphanumériques 54, 57
date 63, 66 macro-fonction 390, 405
différences avec FORMAT 161 macro-instruction 390
erreur sur 79 macro-programme 391, 416
INFORMAT() 55 débugage 429
numériques 57, 58 forcer l’arrêt 410
spécifier le W ? 60, 79 nom 416
temps 68 sauvegarde 429
TRUNCOVER 55 macro-variable 391, 393
Voir aussi PROC FORMAT automatique 395
INPUT 17 GLOBAL 396
#X 49 nom 392
& (deux espaces) 46 résolution 394
+X 42 suppression 397
/ 49 _USER_ 396
@ 50 MDY 64
@@ 47, 79 MERGE 147
@X 44 IN= 153
colonne 41 MISSING 30, 31, 48, 108
curseur 61, 79 MOD 115
fonction 116
position du curseur 42
INPUT BUFFER 84 N
NOTE 264
J NOTEPAD 40, 77
JAVA 328
JAVA RUNTIME ENVIRONMENT 329 O
JAVAIMG 328, 381
observation, nombre 18
ODS
K destinations 332
multiples 348
KEEP 85, 108
ESCAPECHAR= 377
EXCLUDE 346
L format des images 328
LABEL 212 GPATH= 326
dans les FORMAT et INFORMAT 69 graphiques et 324
LAG 97, 139 IMAGE_DPI= 326
langues 66, 166 NOPROCTITLE 343
LEGEND 294 NOPTITLE 343
LENGTH 86 PATH= 326
et SCAN 100 polices 326
modification 173 PROC PRINT 204
LIBNAME 24 PROC REPORT 228
Voir aussi bibliothèque PROC TABULATE 250
LIST INPUT 39 PROCLABEL 342
longueur d’enregistrement 86 SELECT 346
Voir aussi INFILE / LRECL TEXT= 379
SAS Livre Page 448 Jeudi, 18. septembre 2008 6:03 18
448 ◆ SAS
Index ◆ 449
450 ◆ SAS
T V
table 17 variable
définition 15 alphanumérique 88
exporter 74
réunion incrémentée 118, 124, 176
MERGE 147, 151 liste 141
SET 143 nom 17
table des matières 366, 382 nombre 17
ODS HTML 341
tabulation 36, 46 nouvelle 118
TITLE 186, 264 numérique 88
titre, fenêtre SORTIE 186 VMACRO 391
traffic lightening 209
U W
unicodes 378 WHERE 111, 212
UPDATE 151 fonctions spécifiques 112
IN= 153 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 SAS est le progiciel d’informatique décisionnelle le plus utilisé au
maître de conférences en monde. Ce livre présente de façon pédagogique et complète le socle
sciences économiques à
l’université d’Orléans.
de connaissances communes à tous les utilisateurs de SAS. Il peut servir
Il utilise SAS depuis plus aussi bien de guide d’initiation pour les utilisateurs débutants que d’ouvrage
de 15 ans dans le cadre des de référence pour les utilisateurs plus expérimentés.
recherches qu’il effectue
au sein du Laboratoire Les premiers chapitres traitent de Base SAS, le module au cœur du système
d’Économie d’Orléans SAS. La création des tables de données, leur manipulation, leur modification,
(LEO – UMR CNRS leur gestion, ainsi que les procédures d’exploration des données (construc-
6221) et enseigne SAS
tion de tableaux, de rapports, etc.) y sont plus particulièrement développées.
aux étudiants du master
ESA (Économétrie et La suite du livre est consacrée à l’exploration du module SAS/GRAPH afin
Statistique Appliquée) d’offrir au lecteur les connaissances nécessaires à la réalisation de graphiques
depuis sa création. d’excellente facture. Les derniers chapitres portent sur la production de docu-
Préface de Daniel ments au format HTML, RTF ou PDF au moyen d’ODS (Output Delivery
Delorge, Directeur System), ainsi que sur le langage macro spécifique à SAS.
général SAS France
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 pro-
grammes 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.