SAS base Introduction à SAS SQL SAS IML

Document Sample
scope of work template
							                                   SAS base
                            Introduction à SAS SQL
                                   SAS IML

Introduction
Le système SAS est un ensemble de modules logiciels pour la gestion et le traitement statistique des
données. À travers différents types d’interfaces utilisateur, il permet l’écriture de programmes SAS qui
exécutent :
    • les saisies, importations, interrogations, manipulations, transformations de données,
    • les éditions d’états, de rapports financiers, de graphiques,
    • les analyses statistiques, modélisation, prévision,
    • des applications spécifiques définies sous forme de macro-commandes et pouvant être
        pilotées par menu.

Il existe plusieurs modules qui permettent un traitement de l’information sans écrire une ligne de
programme : les modules Insight, Enterprise Guide et Enterprise Miner ont été élaborés en ce sens. Il
serait possible, en première approche, de se contenter de cette utilisation élémentaire mais l’usage
montre que ces solutions sont nécessairement limitées et qu’un usage professionnel, associé à des
contraintes spécifiques, rend incontournable l’usage d’une programmation basique.

SAS propose plusieurs langages de programmation, qui se complètent et s’enrichissent mutuellement.
   • le langage de base, qui couvre 95% des utilisations et des besoins quotidiens autour de SAS :
       extraction, transformation, croisement de plusieurs sources d’information, production et mise
       en forme de résultats.
   • Le langage macro, série d’instructions dédiées au paramétrage d’un programme.
   • Le SQL (Structured Query Language), commun à de nombreux logiciels de gestion de bases
       de données (SGBD), permettant également l’extraction, la transformation et l’appariement de
       données.
   • L’IML (Interactive Matrix Language), langage matriciel permettant de nombreux calculs
       mathématiques et statistiques.

Ce cours abordera ces 4 langages, en insistant tout particulièrement sur 2 d’entre eux : le langage de
base et le langage macro. A l’issue de cet enseignement, vous devrez être capable de manipuler les
données à travers le langage SAS de base, paramétrer les traitements avec le langage macro,
effectuer des traitements matriciels, et faire des traitements basiques de données avec SQL. Il est
fortement recommandé, surtout dans la période de prise en main du logiciel, de consulter les manuels
de SAS ou la documentation SAS en ligne afin notamment de prendre connaissance de la syntaxe et
de l’ensemble des options disponibles pour les procédures. La documentation SAS en ligne est
disponible à l’adresse : http://support.sas.com/onlinedoc/913/docMainpage.jsp

Ce cours abordera les points suivants :
   • l’import de fichiers textes en tables SAS et l’export de tables SAS en fichier texte, l’utilisation
       de la proc import et de la proc export pour l’import/export de différents types de
       fichiersl’appariement de fichiers SAS et la transformation des variables (étapes DATA).
   • les principales procédures d’édition de tables, d’analyse univariée et bivariée et de gestion de
       tables (étapes PROC).
   • le langage SQL (Structured Query Language) de gestion des données informatiques des
       SGBD relationnels.
   • le langage matriciel (module SAS IML).
   • les graphiques avec SAS GRAPH.
   • le macro langage SAS.




                                                                                                      1
Au cours du TP, nous reprendrons ces différents points du cours. En outre :
    • nous verrons comment utiliser le menu Import de données et Export de données de SAS pour
       importer et exporter des fichiers sans passer par la programmation dans l’éditeur.
    • nous aborderons le module SAS Insight.
    • nous aborderons d’autres procédures graphiques et statistiques couramment utilisées que
       nous n’évoquerons pas en cours, et notamment :
        PROC PRINCOMP (analyse en composantes principales)
        PROC CORRESP (analyse des correspondances)
        PROC REG (régressions simple ou multiple)




                                                                                            2
Préalables

1. Les fenêtres de SAS




   5 fenêtres s’ouvrent au démarrage de SAS (ci-dessus après avoir choisi Fenêtre / Mosaïque
   verticale) :
   •   la fenêtre de programmation (éditeur) : entrer, éditer, compiler les programmes de SAS.
       Deux fenêtres de programmation sont disponibles à partir de la version 8 de SAS : le Program
       Editor et l’Enhanced Editor.
       Dans l’Enhanced Editor, des lignes horizontales marquent les grandes étapes du programme.
       Les carrés contenant un signe moins ou plus situés en marge du programme permettent de
       visualiser uniquement la première ligne de chaque étape, ou l’intégralité du code de cette
       étape.
       Il est possible de condenser l’ensemble d’un programme via le menu Edit > Collapse all, et de
       le remettre en vue intégrale via Edit > Expand all.




                                                                                                  3
•   la fenêtre Journal (ou fenêtre Log) : analyse de la syntaxe du programme exécuté
    (messages SAS après compilation). Les principaux messages du Journal sont :
    les notes (en bleu dans SAS Windows) : aucune anomalie dans le traitement demandé,
    les avertissements (Warnings) : il est possible que des erreurs non fatales aient eu lieu
         pendant le traitement,
    et les erreurs (Error, en rouge) : des erreurs graves de traitement ont eu lieu.
    De plus, SAS recopie (en noir) le code qui lui a été soumis, précédé de numéros de lignes
    incrémentés à chaque nouveau programme exécuté dans la session.
    Le message Error signale une erreur qui a stoppé l’exécution de cette étape du programme.
    SAS traitant les étapes de manière indépendante, il a pu exécuter l’étape suivante en dépit
    des erreurs rencontrées. Il en découle souvent des erreurs successives dans la fenêtre Log,
    dues à une erreur dans une des premières étapes du programme. Il est donc conseillé de
    reprendre la Log depuis le début de l’exécution du code en question. C’est d’autant moins
    évident que SAS se positionne à la fin de la Log après exécution d’un programme.
    Le message Warning indique une erreur qui n’a pas stoppé l’exécution de l’étape parce que
    SAS sait gérer lui-même ce type d’erreur (qui consiste souvent à générer des valeurs
    manquantes).




    La fenêtre Log n’est pas purgée automatiquement pas SAS à l’exécution d’un nouveau
    programme. Les messages sont donc affichés à la suite de ceux concernant l’exécution du
    code précédent. Il est souvent pratique, pour retrouver le début des messages, d’effacer le
    contenu de la fenêtre (par le menu Edit > Clear all).

•   la fenêtre Sortie (ou fenêtre Output) : sorties, listings, résultats après compilation des
    programmes, rapports générés par les procédures SAS et les étapes DATA. Elle est
    complétée par deux autres fenêtres pour l’affichage des sorties : la fenêtre Graph pour les
    graphiques et la fenêtre Résultats (ou Results) qui montre sous forme arborescente les
    différentes sorties engendrées par le programme.




                                                                                             4
    Sur l’exemple précédent, on distingue :
         la fenêtre Output et sa police unique (SAS Monospace),
         la fenêtre Results qui montre sous forme arborescente les différentes sorties
             engendrées par un ou plusieurs programmes. La suppressions des sorties par
             morceaux est possible (faire un clic droit sur un des éléments de cette fenêtre et
             choisir Delete dans le menu contextuel),
         la fenêtre Graph qui montre la sortie d’une procédure graphique de SAS.
    La fenêtre Output, comme la fenêtre Log, ne se vide pas à l’exécution d’un nouveau
    programme, mais ajoute de nouvelles sorties à la suite de celles existantes. Il est donc
    possible de purger cette fenêtre (par le menu Edit > Clear all).

•   la fenêtre Explorer : emplacements physiques des répertoires, création de raccourcis,
    voir/ouvrir/déplacer/copier/supprimer des fichiers SAS. Elle permet de naviguer parmi les
    données SAS et en particulier de visualiser les tables SAS.




                                                                                             5
2. Les menus et les barres d’outils
   Les menus disponibles sont variables en fonction de la fenêtre active. Les menus disponibles sont
   FILE, EDIT, VIEW, TOOLS, SOLUTIONS, WINDOWS et HELP. S’y ajoute le menu RUN quand
   l’éditeur est actif.
   •   FILE contient les commandes nécessaires à l’ouverture d’un programme, sa sauvegarde,
       l’importation d’un fichier de données, son exportation, et la commande permettant de fermer la
       session SAS.
   •   EDIT regroupe les commande d’édition usuelles (couper/copier/coller, annuler) ainsi que
       celles pour le repli et le déploiement d’un programme. On y trouve aussi la commande CLEAR
       ALL pour purger une fenêtre.
   •   VIEW permet de basculer entre les différentes fenêtres de l’environnement de programmation,
       et également d’ouvrir à nouveau une fenêtre fermée.
   •   TOOLS regroupe l’appel à divers assistants SAS (retouches de graphiques, requêtes via une
       interface etc…). On y trouve également, dans un sous-menu OPTIONS, les réglages de la
       session SAS (aspect des fenêtres, préférences de l’utilisateur, tableau des options
       système…).
   •   RUN permet l’exécution du code tapé dans la fenêtre d’édition active.
   •   SOLUTIONS permet d’ouvrir diverses interfaces gravitant autour de SAS.
   •   WINDOW gère le fenêtrage de l’environnement et permet comme VIEW de basculer d’une
       fenêtre à une autre.
   •   HELP renvoie aux divers éléments de l’aide en ligne de SAS.
   La barre d’outils regroupe les icônes standards (nouveau, ouvrir, enregistrer, couper, copier,
   coller, annuler, imprimer, aperçu avant impression).
           Quand un éditeur est actif, l’icône ci-contre s’ajoute à la barre d’outils : il permet
           l’exécution du programme écrit dans la fenêtre active ; si une partie du programme est
           sélectionnée, alors seul ce morceau de code est soumis à SAS.
                              A gauche de la barre d’outils, une fenêtre rectangulaire, pouvant
                              accueillir une seule ligne, est appelée fenêtre de commande. Elle
                              trouve son intérêt dans les versions dépourvues de menus. Dans ces
                              versions, elle apparaît en première ligne de chaque fenêtre, sous la
                              forme d’une ligne blanche précédée de COMMAND. Elle permet, en y
                              tapant et soumettant des commandes, d’obtenir des manipulations
                              semblables à celles proposées par les icônes de la barre d’outils, et
                              par certains items des menus.
   Par exemple, une commande utile est KEYS, qui permet d’afficher la liste des raccourcis clavier
   de SAS.

3. Modules

   SAS est un logiciel organisé en modules qui sont des groupes de fonctionnalités. Ce système sert
   de base de tarification, mais aussi d’organisation logique. Les procédures sont rattachées à un
   module et ne sont donc pas toutes disponibles sur toutes les installations de SAS. Par exemple, la
   proc IML, qui permet d’utiliser le langage IML, n’est disponible que si le module IML a été installé.

   Le logiciel SAS est loué à l’année, sous forme de licence. Cette licence autorise l’emploi, pour une
   durée limitée, de certains modules. Dans la version 9, un fichier SAS Installation Data spécifie les
   modules contenus dans la licence. Il remplace le programme Setinit des versions antérieures.

   Les principaux modules de SAS :
   • SAS Base : pierre angulaire de SAS, ce module contient les instructions pour la manipulation
       de données, les statistiques descriptives élémentaires et l’édition de rapports. Ce module
       permet de programmer dans le langage SAS de base, ainsi que dans les langages SQL et
       macro.


                                                                                                      6
   •   SAS Stat : il regroupe les procédures de modélisation (régressions diverses), de classification
       (regroupement d’individus semblables) et de statistiques descriptives.
   •   SAS Graph : ce module permet l’édition de graphiques de toutes sortes : nuages de points,
       courbes, diagrammes circulaires et en bâtons, cartes géographiques.
   •   SAS Access : cette série de modules permet l’importation et l’exportation de données d’autres
       applications.
   •   SAS Connect : le module CONNECT permet de faire fonctionner SAS en mode client/serveur.
   •   SAS ETS : ce module statistique regroupe entre autres les fonctionnalités d’étude des
       données temporelles (ETS : Econometrics and Time Series).
   •   SAS FSP : ce module permet la manipulation de données en plein écran (FSP : Full Screen
       Products).
   •   SAS AF : ce module permet la construction d’interfaces clique-bouton par-dessus SAS, sur un
       mode de fonctionnement analogue à Visual Basic pour les applications Microsoft (AF =
       Application Facility).
   •   SAS EIS : il permet la constitution et la visualisation de tableaux de bords synthétiques
       regroupant des statistiques et des graphiques (EIS : Execuive Information System).
   •   SAS Assist : ce module est une interface clique-bouton pour la création de programmes SAS.
       Toutes les manipulations sont paramétrées par menus et fenêtres de dialogue.
   •   SAS IML : ce module permet d’utiliser un langage matriciel (IML : Interactive Matrix
       Language).
   •   SAS Insight : analyse statistique interactive.

4. SAS Enterprise Guide

   SAS Enterprise Guide (ou SEG) est un logiciel Windows permettant, par un système de menus et
   de fenêtres de dialogue, de réaliser des extractions, de croiser des sources de données
   hétérogènes, de produire des tableaux, des graphiques et des statistiques. Il génère des
   programmes SAS et intègre également un éditeur de programmes, afin d’ajouter ou d’amender du
   code.

   SEG produit des sorties dans les formats les plus courants : page Web, document PDF, document
   Word, feuille Excel.

   Enterprise Guide est un croisement entre SAS et Excel. Il a hérité du premier la puissance de
   calcul et le langage souple. SEG hérite d’Excel son ergonomie dans la présentation des données,
   la simplicité de fonctionnement, le rôle prééminent des fenêtres de dialogue.

   Il est possible de remplacer toute programmation par l’utilisation intensive de SAS Enterprise
   Guide, mais toute application constituée de menus et de fenêtres de dialogue trouve sa limite
   dans une opération non prévue initialement, qu’il faudra à nouveau programmer.


5. Session SAS

   Quand on démarre le logiciel SAS, on ouvre une « session SAS ». Cette session se termine par la
   fermeture du logiciel. Au sein d’une session SAS, de nombreux réglages sont temporaires. Ils
   durent le plus souvent jusqu’à la fermeture de la session.




                                                                                                    7
6. Sorties
   On parle de sorties en général pour désigner l’ensemble des résultats produits par SAS. Ces
   sorties peuvent prendre différents aspects selon les instructions du programme exécuté. Le
   programme peut produire :
   • une ou plusieurs table(s) SAS ;
   • du texte, appelé généralement listing, d’une mise en forme minimale (police de caractères
       unique, pas de gras ni d’italique). Le listing est le mode par défaut d’affichage de résultats par
       SAS ;
   • un ou plusieurs graphique(s) qui font l’objet d’un affichage séparé.

7. Les contraintes du langage SAS
   •   On ne doit pas couper une instruction par un retour de ligne,
   •   Les majuscules et minuscules, hormis quelques cas très précis, ne sont pas différenciés par
       SAS,
   •   Les commentaires, encadrés par les signes /* et */, peuvent être intégrés à n’importe quel
       endroit du programme, à la seule condition de ne pas couper une instruction,
   •   La contrainte la plus incontournable dans SAS est l’obligation de terminer chaque instruction
       par un point-virgule.


8. Concepts et vocabulaire

   Nous allons commencer par survoler les concepts qu’il est essentiel d’avoir intégrés avant de
   commencer la programmation dans SAS. Tout au long de ce cours, nous parlerons :
   • de bibliothèque (ou librairie),
   • de table,
   • de vue,
   • d’observation,
   • de variable,
   • de label,
   • de format,
   • d’une étape Data,
   • d’une étape Proc.

   Les premiers concepts font référence à la manière dont SAS stocke et accède aux données.
   Quelques instructions et manipulations sont nécessaires, comme : allouer une bibliothèque,
   visualiser son contenu, voir une table, voir les variables d’une table. Les concepts suivants traite
   du décalage qui existe – à travers les labels et les formats – entre les données vues à l’écran et la
   réalité qu’il faut programmer. Les derniers concepts concernent la programmation, et fait la
   distinction entre l’étape Data et les procédures, qui sont les deux grandes étapes de
   programmation de SAS.




                                                                                                       8
1. Deux étapes : DATA et PROC

  Un ensemble d’instructions constitue une étape. Dans SAS, on distingue deux grands types
  d’étapes de programmation : les étapes Data et les étapes procédures, également appelées
  « étapes proc ».

  Un programme SAS est un enchaînement d’étapes de gestion des données (étape DATA) et
  d’appels de procédures (étape PROC).

  On repère, dans un programme SAS, le début et la fin d’une étape par les mots-clés DATA ou
  PROC au début, et les instructions RUN, et/ou QUIT à la fin.

  1. 1. Etape DATA : création d’une table SAS et structuration des données

       Afin de pouvoir traiter des données avec SAS, il convient d’abord de les mettre sous un
       certain format, interne à SAS. SAS possède en effet son propre système de gestion de
       bases de données (étape DATA), bâti sur la notion de table (SAS DATA SET nommé par la
       suite TABLE SAS selon la terminologie en vigueur en France).

       Toute étape DATA débute par l’instruction DATA nom_de_table où nom_de_table est le
       nom de la table SAS créée. Si aucune table SAS n’est créée (cas par exemple de la recopie
       d’une table dans un fichier texte), alors l’étape DATA débutera par l’instruction
       DATA _NULL_. L’étape DATA se termine par l’instruction RUN.

       Syntaxe :
       DATA tableSAS ;
          instructions diverses ;
       RUN ;

       L’étape Data permet de manipuler, observation par observation, un jeu de données. Les
       données entrantes ou sortantes peuvent être une table SAS ou un fichier externe.

       Lors d’une étape DATA, on pourra en outre structurer les données et notamment :
       •     importer un fichier texte pour créer une table SAS,
       •     créer de nouvelles variables,
       •     exporter d’une table SAS vers un fichier texte,
       •     sélectionner une partie d’une table SAS et la stocker dans une autre table,
       •     fusionner plusieurs tables SAS
       •     faire une requête sur une table SAS,
       •     …

       On peut créer des tables SAS permanentes ou temporaires. Les tables temporaires sont
       effacées lorsqu’on quitte la session.

       On appelle table SAS la représentation la plus courante des données utilisées par ce
       logiciel. Ces données sont organisées en lignes et en colonnes, également appelées
       observations et variables.

  1. 2. Etape PROC : analyse d’une table SAS

       Une fois que les données ont été structurées sous la forme d’une table, elles peuvent être
       analysées au moyen de procédures (étape PROC). Les procédures sont des programmes
       déjà écrits de SAS, à la syntaxe beaucoup moins libre que celle de l’étape Data, où il faut
       surtout renseigner un certain nombre de paramètres et faire jouer certaines options. Les
       procédures, qui sont assez nombreuses (aux alentours de 200 sur l’ensemble des modules
       de SAS), accomplissent chacune une tâche spécialisée : tri des données, listing d’une table,
       création de formats, calcul de statistiques descriptives, analyse factorielle, etc.



                                                                                                 9
             Chaque procédure commence par une instruction PROC suivie de son nom, et s’achève sur
             une instruction RUN ; qui demande l’exécution de cette procédure. Certaines procédures,
             notamment les procédures graphiques, demandent de surcroît une instruction QUIT ; pour
             clore réellement leur syntaxe.

             Syntaxe :
             PROC nomProcédure <option(s)> ;
             instructions diverses ;
             RUN ;<QUIT> ;
             Pour la plupart des procédures, SAS propose de nombreuses options.

             L’exemple suivant distingue une étape, une instruction et une option. Cet exemple permet
             l’édition de statistiques sur les ventes.
             PROC MEANS DATA=base.ventes 
                  MEAN                   
                  MEDIAN                 
                  MIN                   
                  MAX ;                  
              VAR mt_der ;              
             RUN;                        
              est une étape (la procédure MEANS)
              sont des options
              est une instruction.



2. Différences entre une vue et une table

       Les fichiers de données lus et créés par SAS sont d’un type qui est spécifique à ce logiciel : ce
       sont des tables et des vues.

       Dans les deux cas, les données sont organisées sous forme tabulaire, avec des lignes
       (observations) et des colonnes (variables).

       Si on ouvre une vue à partir de la fenêtre Explorer, on constate la similitude d’aspect avec une
       table. C’est en fait le mode de stockage qui diverge entre vue et table.
       • Une table est une photo des données : elle stocke des données qui ne changeront plus
           jusqu’à la création d’une nouvelle version de la table.
       • Une vue est un lien vers un ensemble de données : elle ne contient qu’une requête, qui sera
           réexécutée à chaque accès à la vue.

       L’avantage d’une vue sur une table est double : place réduite pour le stockage et données
       perpétuellement à jour sans nécessiter d’intervention de l’utilisateur. La table, en revanche,
       permet un accès plus rapide aux données, et également de figer dans le temps un état : cela
       s’avère pratique pour conserver un historique à partir de données mouvantes.

       Le nom d’une table ou d’une vue SAS doit respecter les contraintes suivantes :
       • la longueur maximale du nom est de 32 caractères ;
       • le premier caractère est une lettre ou un blanc souligné _ .Les caractères suivants peuvent
           être des lettres, des blancs soulignés ou des chiffres ;
       • dans la plupart des cas, SAS ne distingue pas les minuscules et les majuscules. Ainsi, si par
           exemple on a défini la variable Gini, on peut la rappeler en écrivant GINI, gini, etc. ;
       • certains noms correspondent à des variables automatiques de SAS (exemple : _N_, qui
                                                                      1
           correspond au numéro d’observation dans la table SAS ) ou à un certain type de tables SAS

1
    _N_=1 pour la première observation de la table, 2 pour la deuxième observation, etc…


                                                                                                        10
           (exemple : data _NULL_) et ne peuvent pas être utilisés pour nommer des variables ou des
           tables créées par l’utilisateur.




3. Eléments d’une table

       3. 1. Les observations

             On désigne par ce nom les lignes d’une table ou d’une vue SAS. Chaque observation
             correspond à une unité de comptage ; en statistique, on parle d’ « individu statistique ».
             Chaque observation porte un numéro. Il est séquentiel et recalculé à chaque création de la
             table.

      3. 2. Les variables
             Les variables sont les colonnes d’une table ou d’une vue SAS. Chaque variable correspond
             à une information connue sur les observations.
             Toutes les variables requièrent obligatoirement trois attributs :
             • nom
             • type (numérique ou caractères)
             • longueur.
             Une variable peut également posséder un label, un format et un informat.
             Le nom d’une variable doit respecter les contraintes suivantes :
             • la longueur maximale du nom est de 32 caractères ;
             • le premier caractère est une lettre ou un blanc souligné _ .Les caractères suivants
                 peuvent être des lettres, des blancs soulignés ou des chiffres ;
             • dans la plupart des cas, SAS ne distingue pas les minuscules et les majuscules. Ainsi,
                 si par exemple on a défini la variable Gini, on peut la rappeler en écrivant GINI, gini,
                 etc. ;
             • certains noms correspondent à des variables automatiques de SAS (exemple : _N_, qui
                                                                          2
                 correspond au numéro d’observation dans la table SAS ) et ne peuvent pas être utilisés
                 pour nommer des variables ou créées par l’utilisateur.
             Variables caractères :
             On peut définir des variables caractères d’une longueur de 1 à 32 767 caractères. On leur
             affecte une valeur de la manière suivante :
             var1 = ‘Paris’ ; /*entre ‘*/
             var2 = "1990-1991" ; /*entre "*/
             var3 = ‘Ile de France’ ;
             var4 = ‘Côte d"Armor’ ;


2
    _N_=1 pour la première observation de la table, 2 pour la deuxième observation, etc…


                                                                                                      11
Variables numériques :
SAS reconnaît les nombres sous les formes suivantes :
entiers : 5683 ;
entiers relatifs : -5 ;
réels : 2.85 ;
notation scientifique : 5.4E-1 ;
dates : '24aug90'd. Une date est ainsi définie le plus souvent comme numérique. SAS
                                                      er
stocke les dates comme un nombre de jours depuis le 1 janvier 1960.

Le label
Le label d’une variable est un texte libre de 256 caractères maximum, qui permet de décrire
le contenu de la variable, de donner sa définition, de décrire éventuellement ses valeurs, de
manière plus complète et plus lisible que ne peut le faire le nom.

Le format
Le format est un masque d’affichage des données. Il permet d’assurer une transition entre
les valeurs telles qu’elles sont stockées (de manière parfois peu lisible : les dates sont
                                                   er
stockées comme un nombre de jours depuis le 1 janvier 1960) et les valeurs telles qu’elles
sont affichées. On trouvera en annexe 1 les formats les plus courants fournis par SAS. En
complément de ces formats, SAS propose, avec un programme (la procédure FORMAT que
l’on étudiera ultérieurement), de définir des formats personnalisés correspondant aux
différents besoins (tranches de revenus, libellés des départements français, etc…).

La longueur
La longueur (length) d’une variable est la place prévue pour le stockage de chacune de ses
valeurs. SAS prévoit par défaut d’utiliser 8 octets pour chaque valeur. Les longueurs
autorisées sont :
• de 1 à 32767 octets pour une variable caractères,
• de 2 à 8 octets pour une variable de type numérique. Sous Windows, les longueurs
    possibles sont comprises en 3 et 8 octets seulement.

L’informat
Un informat est un masque de saisie d’une variable. C’est le symétrique du format ; il
s’applique aux données telles qu’elles sont lues lors de la création de la table SAS à partir
d’un fichier externe.
Ainsi, pour reprendre l’exemple d’une date, on peut avoir une donnée stockée sous la forme
20010125 qui désignerait le 25/01/2001. SAS doit comprendre que c’est une date et stocker
                                                         ème                  er
le nombre 15000 (car le 25 janvier 2001 est le 15000         jour depuis le 1 janvier 1960).
L’informat permet d’indiquer comment faire cette transformation, et particulier le fait que,
dans la valeur lue, les quatre premiers chiffres sont ceux de l’année, les 2 suivants ceux du
mois, et enfin ceux du jour.




                                                                                          12
4. Manipulations de tables SAS

  Le but premier de SAS est la manipulation de données, avant même de commencer les
  traitements statistiques proprement dits. Ce chapitre est consacré à la création d’une table SAS à
  partir d’une ou de plusieurs sources de données, principalement à travers l’étape Data.

  L’étape Data permet entre autres :
  • la création de tables SAS,
  • la création de nouvelles variables,
  • la modification de variables existantes,
  • la fusion et la jointure de plusieurs tables,
  • l’importation et l’exportation de données.

  L’étape Data regroupe une série d’instructions permettant la manipulation ligne à ligne d’un jeu de
  données. L’étape Data n’affiche rien dans la fenêtre Output, sauf cas exceptionnels.


  4. 1. Structure et stockage des tables

        Une table se présente sous forme d’une matrice croisant en ligne les observations en en
        colonne les variables.

        Exemple :
        Les données de cet exemple (fichier PAYS), avec lequel nous travaillerons également en
        TP, proviennent d’un article de Russet (1964). Russet cherche à montrer que l’inégalité
        économique entraîne l’instabilité politique. Pour mesure l’inégalité économique, Russet
        utilise des variables décrivant la répartition des terres agricoles, le produit national brut par
        tête et le pourcentage de personnes actives travaillant dans l’agriculture :
        • la variable GINI représente l’indice de concentration de Gini qui mesure l’écart entre la
           courbe de Lorenz et la droite d’égalité,
        • la variable FARM correspond au pourcentage de fermiers possédant la moitié des terres,
           en commençant par les plus petites surfaces. Si FARM vaut 90%, alors la moitié des
           terres est possédée par 10% des fermiers,
        • la variable RENT mesure le pourcentage de fermiers locataires de leurs terres,
        • la variable GNPR (gross national product per capita) est la produit national brut par tête
           en dollars U.S. en 1955,
        • la variable LABO est égale au pourcentage de personnes actives travaillant dans
           l’agriculture.
        Il y a quatre mesures de l’instabilité politique :
        • la variable INST est une fonction du nombre de responsables du pouvoir exécutif et du
          nombre d’années pendant lesquelles le pays a été indépendant entre 1945 et 1961. Cet
          indice varie entre 0 (très stable) et 17 (très instable),
        • la variable ECKS est l’indice d’Eckstein calculé sur la période 1946-1961. Il mesure le
          nombre de conflits violents entre communautés sur cette période,
        • la variable DEAT est le nombre de personnes tuées lors de manifestations violentes sur la
          période 1950-1962,
        • la variable DEMO classe les pays en trois groupes : démocratie stable (1), démocratie
          instable (2) et dictature (3).
        Les données d’origine sont reproduites dans le tableau suivant :




                                                                                                      13
Obs Pays          gini farm rent gnpr labo inst ecks deat demo
 1 Argentine       86.3 98.2 32.9 374 25 13.6 57 217 2
 2 Australie     92.9 99.6     . 1215 14 11.3 0       0 1
 3 Autriche        74 97.4 10.7 532 32 12.8 4          0 2
 4 Belgique       58.7 85.8 62.3 1015 10 15.5 8          1 1
 5 Bolivie      93.8 97.7 20 66 72 15.3 53 663 3
 6 Brésil      83.7 98.5 9.1 262 61 15.5 49          1 3
 7 Canada         49.7 82.9 7.2 1667 12 11.3 22          0 1
 8 Chili      93.8 99.7 13.4 180 30 14.2 21         2 2
 9 Colombie        84.9 98.1 12.1 330 55 14.6 47 316 2
10 Costa Rica       88.1 99.1 5.4 307 55 14.6 19         24 2
11 Cuba          79.2 97.8 53.8 361 42 13.6 100 2900 3
12 Danemark          45.8 79.3 3.5 913 23 14.6 0          0 1
13 Rép. Dominic. 79.5 98.5 20.8 205 56 11.3 6              31 3
14 Equateur        86.4 99.3 14.6 204 53 15.1 41         18 3
15 Egypte          74 98.1 11.6 133 64 15.8 45          2 3
16 Espagne           78 99.5 43.7 254 50     0 22       1 3
17 Etats-Unis      70.5 95.4 20.4 2343 10 12.8 22          0 1
18 Finlande       59.9 86.3 2.4 941 46 15.6 4           0 2
19 France         58.3 86.1 26 1046 26 16.3 46           1 2
20 Guatemala          86 99.7 17 179 68 14.9 45           57 3
21 Grèce         74.7 99.4 17.7 239 48 15.8 9          2 2
22 Honduras         75.5 97.4 16.7 137 66 13.6 45 111 3
23 Inde         52.2 86.9 53 72 71         3 83    14 1
24 Irak        88.1 99.3 75 195 81 16.2 24 344 3
25 Irlande       59.8 85.9 2.5 509 40 14.2 9          0 1
26 Italie      80.3 98 23.8 442 29 15.5 51           1 2
27 Japon           47 81.5 2.9 240 40 15.7 22          1 2
28 Libye          70 93 8.5 90 75 14.8 8           0 3
29 Luxembourg         63.8 87.7 18.8 1194 23 12.8 0          0 1
30 Nicaragua         75.7 96.4   . 254 68 12.8 16 116 3
31 Norvège         66.9 87.5 7.5 969 26 12.8 .          0 1
32 Nlle Zélande 77.3 95.5 22.3 1259 16 12.8 0               0 1
33 Panama           73.7 95 12.3 350 54 15.6 29          25 3
34 Pays-Bas         60.5 86.2 53.3 708 11 13.6 2          0 1
35 Pérou         87.5 96.9     . 140 60 14.6 23     26 3
36 Philippines 56.4 88.2 37.3 201 59         14 15 292 3
37 Pologne           45 77.7    0 468 57 8.5 19       5 3
38 RFA          67.4 93 5.7 762 14         3 4     0 2
39 Royaume-Uni          71 93.4 44.5 998 5 13.6 12          0 1
40 Salvador        82.8 98.8 15.1 244 63 15.1 9          2 3
41 Sud Vietnam 67.1 94.6 20 133 65             10 50 1000 3
42 Suède          57.7 87.2 18.9 1165 13 8.5 0          0 1
43 Suisse        49.8 81.5 18.9 1229 10 8.5 0          0 1
44 Taiwan         65.2 94.1 40 132 50       0 3       0 3
45 Uruguay         81.7 96.6 34.7 569 37 14.6 1          1 1
46 Venezuela          90 99.3 20.6 762 42 14.9 36 111 3
47 Yougoslavie 43.7 79.8          0 297 67    0 9       0 3


            On peut stocker les tables de façon permanente ou temporaire. La table temporaire est
            détruite à la fin de la session SAS en cours.

            4. 1. 1. Les librairies, les tables permanentes et temporaires

                     Une table temporaire sera représentée par un simple nom_de_table.

                     Une table permanente se présentera de la manière suivante :
                     nom_de_librairie.nom_de_table où nom_de_librairie représentera la librairie (c’est à
                     dire le répertoire) où la table est stockée. La librairie est définie lors d’une
                     instruction LIBNAME assurant la correspondance entre le nom_de_librairie et le
                     nom physique (« réel ») de la librairie.




                                                                                                      14
Ainsi, là où d’autres logiciels comme Excel se contentent de demander à l’utilisateur
où aller chercher les données, SAS demande de lui définir au préalable le ou les
emplacements où aller lire et écrire des données avec le système des bibliothèques
(ou librairies).

Une fois définie, la librairie n’est allouée que pour la durée de la session.

Il est préférable d’utiliser cette instruction en tête de programme, de manière à la
retrouver facilement.
Exemple :
On tape l’instruction suivante dans la fenêtre Editeur :
libname pays 'c:\Cours SAS';

Le message suivant s’inscrit dans la fenêtre Journal :
NOTE: Libref PAYS attribué comme suit :
  Moteur :     V8
  Nom physique : c:\Cours SAS

48 libname pays 'c:\Cours SAS';


Le nom d’une librairie doit satisfaire à plusieurs contraintes :
• ne pas reprendre le nom d’une bibliothèque allouée automatiquement par SAS
    (WORK, SASUSER, SASHELP et MAPS),
• ne pas dépasser 8 caractères ;
                                                                               ère
• ne doit comporter que des lettres non accentuées, des chiffres (mais pas en 1
    position dans le nom) et le signe _ (underscore ou blanc souligné).

On peut visualiser le contenu d’une bibliothèque à l’aide de la fenêtre Explorer.
Nous y reviendrons en séance de TP.

Quelques informations complémentaires sur les librairies prédéfinies de SAS :
    WORK est une bibliothèque temporaire. Son contenu est effacé à la fin de la
     session SAS. Pour définir une table SAS temporaire, on peut ainsi écrire
     nom_de_table ou work.nom_de_table.
    SASHELP héberge des données fournies par SAS à des fins d’exercices
     (comme CLASS, AIR, SHOES, etc…).
    SASUSER est une bibliothèque personnelle (chaque utilisateur a sa propre
     SASUSER) permanente (au contraire de WORK). Son contenu n’est donc pas
     effacé à la fermeture de SAS. Cette bibliothèque contient entre autres les
     informations de personnalisation de la session SAS (barres d’outils par
     exemple). Il est possible d’y écrire ses données, même si, en général, il est
     préférable d’allouer une bibliothèque séparée pour le stockage des données.
    MAPS contient les fonds de cartes fournis par SAS, dont une carte
     départementale de la France.




                                                                                  15
4. 2. L’import et l’export des données

     4. 2. 1. Création d’une table SAS à partir d’un fichier texte externe

             Un fichier externe est copié en une table SAS au cours d’une étape DATA, à partir
             des instructions INFILE et INPUT :

             Syntaxe :
             DATA nom_de_table ;
                INFILE fichier_en_entrée ;
                INPUT format_de_lecture ;
             RUN ;
             L’instruction DATA permet de nommer la table SAS à créer.
             L’instruction INFILE indique le nom ou la référence du fichier à lire en entrée.
             L’instruction INPUT précise comment lire les données : en quelle position figure
             chaque variable, son type (caractère ou numérique), sa longueur, le nom à lui
             donner et le format de lecture (informat) des informations à importer.

             Instruction INFILE
             Principales options de l’instruction INFILE :
             FIRSTOBS=numéro_d’observation
                  Numéro de la première observation du fichier en entrée à prendre en compte
                  pour le déroulement de l’étape DATA. Cette instruction est utile lorsque la
                  première ligne comporte les noms des variables (surtout si les variables
                  excèdent 8 caractères).
                  Exemple : INFILE ‘c:\fichier.txt’ FIRSTOBS=2 ;
             OBS=numéro_d’observation
                 Numéro de la dernière observation du fichier en entrée à prendre en compte
                 pour le déroulement de l’étape DATA.
             MISSOVER
                 En cas d’enregistrements de longueur variable, si toutes les variables de
                 l’ordre INPUT n’ont pas été lues, les variables non renseignées sont mises à
                 valeur manquante.
                 En l’absence de cette option, SAS lit les valeurs restantes au début de
                 l’enregistrement suivant.
             DLM=
                    Caractère séparateur (espace par défaut).
                    La tabulation est notée ‘09’x
                    On peut avoir à lire un fichier de données brutes délimitées (sans passer par
                    le menu Import Data de SAS). Un des intérêts de ce type de fichier réside
                    dans le fait que les données ne doivent pas obligatoirement être organisées
                    en colonnes fixes. Les délimiteurs les plus fréquents sont les blancs, les
                    virgules, et les tabulations.
                    Après l’instruction INFILE, on précise l’option DLM=’caractères’. Ainsi, si par
                    exemple des virgules servent de délimiteurs, l’instruction infile sera la
                    suivante :
                         infile 'c:\Cours SAS\myfile.txt' dlm=’,’;
                    En fin de compte, si aucun délimiteur n’est spécifié avec l’option DLM=, le
                    délimiteur par défaut est un blanc.
                    On peut spécifier plus d’un délimiteur dans l’option DLM=. Dans ce cas,
                    n’importe quel de ces caractères et non une combinaison de ceux-ci, agit



                                                                                                16
         comme délimiteur. Par exemple, dlm=’, -’ indique que la virgule et le tiret
         peuvent tous deux servir de délimiteur.
DSD
         Indique que si deux séparateurs sont consécutifs, ils correspondent à une
         valeur manquante.
LRECL=
    Nombre maximum de caractères par ligne de données (par défaut, 256)
    Exemple : INFILE ‘c:\fichier.txt’ LRECL=500 ;

Exemple :
data pays.russet;
 infile 'c:\Cours SAS\Pays.txt' firstobs=2 obs=4;
    …
run;
Seules les lignes 2, 3 et 4 sont recopiées dans la tables SAS pays.russet :
Obs Pays              Gini    Farm    Rent    Gnpr   Labo   Inst    Ecks   Deat     Demo
1      Australie      92.9    99.6    .       1215   14     11.3    0      0        1
2      Autriche       74.0    97.4    10.7    532    32     12.8    4      0        2
3      Belgique       58.7    85.8    62.3    1015   10     15.5    8      1        1


Instruction INPUT
Dans l’instruction INPUT, la liste des variables lues doit respecter l’ordre dans
lequel les champs sont présents dans le fichier importé. Pour jouer sur cet ordre
dans la table SAS créée, on utilisera les déclarations d’attributs (instruction
ATTRIB) dans l’ordre voulu.
Il faudra distinguer les variables numériques et caractères, en faisant précéder les
variables caractères par un signe $.
Si on précise &, la variable à lire peut contenir un espace : la variable sera lue
jusqu’à ce que soient rencontrés deux espaces consécutifs.
Au fur et à mesure de l’exécution de l’instruction INPUT, un élément virtuel, appelé
pointeur de colonne est positionné afin de lire la variable suivante. Ce pointeur de
colonne peut être déplacé, avancé, positionné à la ligne suivante :
•       INPUT @n déplace le pointeur à la colonne n de l’enregistrement en cours.
•       INPUT +n déplace le pointeur de n colonnes vers la droite,
•       INPUT / déplace le pointeur de colonne à la ligne suivante.

On peut aussi préciser la colonne de début et la colonne de fin d’une variable.
L’instruction est alors la suivante :
     INPUT nom_de_variable <$> <colonne_de_début> <colonne_de_fin> ;
Si la variable n’occupe qu’une colonne, la colonne de fin peut être omise.
Avantages :
• les valeurs caractères peuvent contenir des espaces,
• les valeurs manquantes ne posent pas de problèmes. Un champ à blanc est
     considéré comme valeur manquante,
• les champs peuvent être lus dans n’importe quel ordre.

Les différentes variables sont séparées par des espaces.




                                                                                      17
      Exemple :
      Dans la fenêtre Editeur de SAS, on tape les instructions suivantes :
      data pays.russet;
       infile 'c:\Cours SAS\Pays.txt';
       input Pays $ 1-13 Gini 15-18 Farm 20-23 Rent 25-28 Gnpr 30-33
             Labo 35-36 Inst 38-41 Ecks 43-45 Deat 47-50 Demo 52;
      run;

      Informat
      On peut également devoir importer des données non standards. Le terme données
      standard se rapporte aux données de type numérique et caractère qui n’ont pas de
      qualités de données inhabituelles. Le terme données non standard se rapporte
      plutôt aux données de type caractère ou numérique inhabituelles.
      Exemple de données non standard :
          dates (12/12/2012, 29FEB2000)
          chiffres avec des milliers repérés par des virgules (4,242, $89,000).
      Par défaut, on ne peut lire que les données standard de type caractère ou
      numérique si on utilise l’entrée sous forme de liste. A la suite de chaque variable,
      les instructions permettent à SAS de lire correctement les valeurs :
      • pour une variable numérique stockée avec une virgule comme séparateur
           décimal, faire suivre le nom de la variable de l’informat : NUMX. ;
      • pour une variable date, faire suivre le nom de l’informat adéquat ( :DDMMYY.
           Ou YYMMDD.) ;
      • pour une variable caractère, faire suivre le nom de : $x., où x est le nombre de
           caractères (blancs compris) de la plus longue valeur lue.

                                  Informats les plus courants
                      Type de      Type de                          Exemple
     Informat        données       données        Données            Informat     Données
                        lues        créées          lues              utilisé      créées
x.                 Entiers        Numériques     123           3.                 123
                   Nombres
                   décimaux
x.d                               Numériques     123.45        6.2                123.45
                   (séparateur
                   point)
                   Nombres
                   décimaux
NUMXx.d                           Numériques     123,45        NUMX6.2            123.45
                   (séparateur
                   virgule)
$x.                Texte          Caractère      ABC DEF       $7.                ABC DEF
                                  Caractère
$UPCASEx.          Texte          (texte en      Abc dEf       $UPCASE5.          ABC D
                                  majuscules)
                   Date           Numérique
DDMMYYx.                                         25/01/2001    DDMMYY10.          15000
                   (jj/mm/aaaa)   (date)
                   Date           Numérique
YYMMDDx.                                         20010125      YYMMDD8.           15000
                   (aaaa/mm/jj)   (date)
                   Date                          2001-01-25
                                  Numérique
ANYDTDTEx.         (tous                         01/25/2001    ANYDTDTE10.        15000
                                  (date)
                   formats)                      25.01.2001




                                                                                           18
Exemple : on importe un fichier texte avec des dates :




On utilise le programme suivant :
data date;
 infile 'd:\SAS\Cours SAS\date.txt' firstobs=2;
 input date:anydtdte10.;
run;
On obtient le fichier suivant :
Obs date
 1 15000
 2 15548
 3 16372

Les deux points (:) qui précèdent l’informat assouplissent son comportement. Par
exemple, si on donne un informat $10. à une variable, 10 caractères seront lus,
même si un séparateur en fait partie. Dans la lecture d’un fichier à séparateur, ce
comportement est préjudiciable. L’informat :$10. permet de lire au maximum 10
caractères et s’arrête au séparateur.
Exercice 1 : on a un fichier de données brutes, séparées par des virgules, avec les
variables vol (identificateur du vol), cargo (capacité totale de l’avion), date (dernière
date d’utilisation de l’avion), nb_passagers (nombre total de passagers).
Voici les deux premières lignes d’enregistrement des données :
I001,213,09/12/2001,110
I002,89,09/12/2001,45
3 champs correspondent à des données standards (vol, cargo et nb_passagers), un
champ contient des données non standards (date). Ecrire une étape data
permettant de lire ces données et de créer la table temporaire avions.

Attributs des variables

Toutes les variables présentent un certain nombre de caractéristiques – nom, label,
type, format, informat et longueur -. L’instruction ATTRIB a pour but de centraliser
ces caractéristiques.
ATTRIB nomVariable
    LABEL='mon label'
    FORMAT=fmt.
    LENGTH=longueur
;
•   Le label est un texte libre de 256 caractères maximum,
•   Le format est choisi parmi ceux présentés en annexe 1 ou parmi des formats
    créés par l’utilisateur,
•   La longueur est le nombre d’octets affectés au stockage de chaque valeur. Pour
    une variable de type numérique, cette information peut généralement être
    laissée à la gestion de SAS. Pour une variable de type caractère, on donnera
    après un $ la longueur maximale que peuvent atteindre les valeurs.




                                                                                      19
Exemples d’ATTRIB à insérer dans une étape Data :
ATTRIB codePostal
     LABEL='code postal de résidence du client'
     FORMAT=$5.
     LENGTH=$ 5
;
ATTRIB dFinEff
     LABEL='date de fin d"effet du contrat'
     FORMAT=DDMMYY10.
;


Longueur
Lorsque vous utilisez des entrées sous forme de listes, la longueur par défaut d’une
variable est de 8, aussi bien pour les données de type caractère que numérique.
Pour modifier la longueur d’une donnée de type caractère. Pour modifier la longueur
d’une donnée de type caractère, on peut définir la longueur avec une instruction
LENGTH ou ATTRIB.

Exemple :
On a le fichier texte suivant (voitures.txt, dans le répertoire c:\Cours SAS) :
nom cylindree puissance longueur largeur poids vitesse origine finition prix
ALFASUD-TI-1350 1350 79 393 161 870 165 I B 30570
AUDI-100-L 1588 85 468 177 1110 160 D TB 39990
SIMCA-1307-GLS 1294 68 424 168 1050 152 F M 29600
CITROEN-GS-CLUB 1222 59 412 161 930 151 F M 28250
FIAT-132-1600GLS 1585 98 439 164 1105 165 I B 34900
LANCIA-BETA-1300 1297 82 429 169 1080 160 I TB 35480
PEUGEOT-504 1796 79 449 169 1160 154 F B 32300
RENAULT-16-TL 1565 55 424 163 1010 140 F B 32000
RENAULT-30-TS 2664 128 452 173 1320 180 F TB 47700
TOYOTA-COROLLA 1166 55 399 157 815 140 J M 26540
ALFETTA-1.66 1570 109 428 162 1060 175 I TB 42395
PRINCESS-1800-HL 1798 82 445 172 1160 158 GB B 33990
DATSUN-200L 1998 115 469 169 1370 160 J TB 43980
TAUNUS-2000-GL 1993 98 438 170 1080 167 D B 35010
RANCHO 1442 80 431 166 1129 144 F TB 39450
MAZDA-9295 1769 83 440 165 1095 165 J M 27900
OPEL-REKORD-L 1979 100 459 173 1120 173 D B 32700
LADA-1300 1294 68 404 161 955 140 U M 22100

On importe sous SAS ces données et on crée la table SAS temporaire voitures :
data voitures;
 infile 'd:\CoursSAS\voitures.txt' firstobs=2;
 length nom $ 16;
 input nom $ cylindree puissance longueur largeur
       poids vitesse origine $ finition $ prix;
run;

Remarque : on a précisé la longueur de la variable nom, sinon la longueur était
tronquée à 8 caractères (alors que certains noms de voiture comportent 16
caractères). L’instruction length doit précéder l’instruction input.




                                                                                  20
Exercice 2 :
On veut lire le fichiers de données brutes employes.csv, stocké dans le répertoire
c:\Cours SAS, et contenant les variables suivantes :
1/ la division de l’employé : DIV
2/ la date d’entrée en service de l’employé : DESE
3/ le salaire de l’employé : SE
4/ le nom de famille de l’employé : NFE
5/ le prénom de l’employé : PE
6/ le pays de l’employé : PAYS
7/ la localisation de l’employé : LE
8/ le numéro d’identification de l’employé : NIE
9/ le code d’emploi : CODE
Les premiers enregistrements de données se lisent comme suit :
FLIGHT OPTS,03/11/1992,25000,MILLS,DOROTHY E,USA,CARY,E0001,FLTAT3
FINANCE,12/19/1983,27000,BOWER,EILEEN A,USA,CARY,E0002,FINCLK
Questions :
quel délimiteur sera utilisé ?
______________________________________
quels champs sont lus sous forme de caractères ?
______________________________________
quelle est la longueur de chacun des champs de type caractère ?
______________________________________
Y a-t-il des champs qui contiennent des données non standard ? Dans l’affirmative,
de quels champs s’agit-il ?
______________________________________
Pour chaque champ identifié comme non standard, quel type d’informat le champ
requiert-il ?
______________________________________
Ecrire une étape DATA pour créer une table EMPLOYES qui contient toutes les
variables du fichier d’entrée.
NB : il faut spécifier par une instruction length la longueur de toutes les données qui
dépassent 8 caractères.

Exercice 3 :
Importez sous SAS le fichier ‘c:\temp\clients_sep.csv’
PRENOM ;NOM ;DAT_NAI ;VILLE ;DEPT ;NB_ACHATS ;ANNEES_ANCIENNETE
Anne Sophie ;Martineau ;14/08/1955 ;PARIS ;75 ;8 ;0,3
Marie-Anne ;Dupont ;01/12/1977 ;ORLEANS ;
Roger ;Martin du Gard ;18/01/1988 ; ;29 ;17 ;1,8 ;

Exercice 4 :
Importez sous SAS le fichier ‘c:\temp\clients_col.txt’
1                14            29           40               48      53             65
NOM              PRENOM        DAT_NAI      VILLE   DEPT              NB_ACHATS      AN_ANCIEN
Martineau        Anne Sophie   14/08/1955   PARIS   75                8              0,3
Dupont           Marie-Anne    01/12/1977   ORLEANS
Martin du Gard   Roger         18/01/1988           29                17             1,8
On utilisera un arrobas (@) suivi d’un nombre pour indiquer la colonne à laquelle
commencent les valeurs du champ.
                                                      ère
Par ailleurs, on souhaite que le prénom figure en 1         colonne dans la table SAS créée.



                                                                                               21
Format
On peut également préciser le format des données avec l’instruction format. Les
formats SAS ont la forme suivante :
<$> <w>.<d>
• $ réservé aux variables caractères. Si on omet $, la variable est numérique.
• w longueur de la variable. Si w=7, la variable prend 7 colonnes.
• .       nombre de décimales. Si d=1, on a 1 chiffre après la virgule.
Il n’est pas nécessaire que l’instruction format précède l’instruction input.

Exemple :
Dans le précédent exemple, on rajoute l’instruction suivante pour que le prix soit
codé avec deux décimales :
data voitures;
 infile 'd:\CoursSAS\voitures.txt';
 input nom $ cylindree puissance longueur largeur
       poids vitesse origine $ finition $ prix;
 length nom $ 16;
 format prix 8.2;
run;
L’instruction format aurait pu précéder l’instruction input. Dans le fichier d’origine, le
prix était codé sur 5 colonnes. On ajoute deux chiffres après la virgule, et une
colonne pour la virgule, soit un total de 8 colonnes.

Lecture conditionnelle de données
On se place maintenant dans le cas où :
• on souhaite lire seulement une partie de l’enregistrement,
• tester une valeur de données,
• continuer la lecture de l’enregistrement si les données testées respectent
   certains critères.

Exemple :
On reprend le fichier avion (cf. Exercice 1). Lorsque la capacité maximale de l’avion
est inférieure à 100, on ne veut lire que les deux premières variables (vol et cargo).
On lira également les variables date et nb_passagers uniquement lorsque la
capacité maximale de l’avion est supérieure à 100.
data avion;
 infile 'c:\:\Cours SAS\myfile.txt' dlm=',';
 length vol $ 4;
 input vol : $4. cargo : 3. @;
 if cargo gt 100 then input data : mmddyy10. nb_passagers : 3.;
run;
Si on n’utilise pas @, SAS passe directement à la deuxième ligne d’enregistrement
                         ème
lorsqu’il rencontre le 2     input. On utilise donc l’indicateur de retenue @ pour
garder :
•   la ligne de données courante dans le tampon d’entrée pour le traitement d’une
    autre instruction INPUT,
•   le pointeur de colonne à son emplacement actuel dans la ligne de données.




                                                                                       22
       Exercice 5 :
       On dispose d’un fichier aircraft.csv délimité par des virgules, décrivant les avions
       dont dispose une compagnie aérienne, et avec les variables suivantes :
       identificateur de l’avion : ID (variable caractère de longueur 6),
       modèle de l’avion : MODEL (variable caractère de longueur 20),
       date de mise en service : IN_SERVICE_DATE (date de format MM/JJ/AAAA, par
       exemple 12/31/1999),
       date de dernière utilisation : LAST_SERVICE_DATE (date de format MM/JJ/AAAA),
       capacité en première classe : CAPACITY_FIRSTCLASS
       capacité en classe affaire : CAPACITY_BUSINESS
       capacité en classe économique : CAPACITY_ECONOMY
                                                      er
       Pour les avions entrés en service après le 1 janvier 1990, on ne veut que les
       variables ID, MODEL et IN_SERVICE_DATE. On veut toutes les variables pour les
                                          er
       avions entrés en service avant le 1 janvier 1990. Ecrivez une étape DATA pour
       récupérer ces données.

4. 2. 2. La procédure Import

       La procédure IMPORT correspond au programme le plus souvent rédigé par
       l’assistant d’importation. Elle permet de traiter toute une gamme d’imports courants,
       dans les fichiers de formats réglementés : feuille Excel, tables Access, fichiers à
       séparateurs virgules, point-virgule ou tabulation.
       Pour l’import de certains types de fichiers, des classeurs Excel par exemple, la
       procédure IMPORT nécessite d’avoir une licence pour le module SAS/ACCESS TO
       PC FILES.

       Syntaxe :
       PROC IMPORT DATAFILE=’chemin et nom du fichier importé’
           OUT=tableSAScréée
           DBCS=typeFichierLu
           REPLACE ;
           <instructions optionnelles>
       RUN ;
       La table SAS créée est désignée par sa librairie et son nom. Le fichier importé est
       donné sous forme de chemin complet, avec le nom du fichier et son extension.
       L’option REPLACE permet à SAS d’écraser une table SAS existante par la version
       importée. En son absence, SAS renvoie un message d’erreur si l’on essaye de
       créer une table qui existe déjà.

       Les valeurs les plus courantes de l’option DBCS sont répertoriées dans le tableau
       suivant.




                                                                                         23
                     Principales valeurs possibles pour le type de fichier lu
                                                                            Nécessité
                 Mot-clé                    Type de fichier               ACCESS TO PC
                                                                             FILES
                                 Fichier à caractère délimiteur (blanc
           DLM                                                           Non
                                 par défaut)
           CSV                   Fichier à séparateur virgule            Non
           TAB                   Fichier à séparateur tabulation         Non
           EXCEL2002             Classeur excel 2002                     Oui
           EXCEL2000             Classeur excel 2000                     Oui
           EXCEL97               Classeur excel 97                       Oui
           EXCEL5                Classeur excel 5                        Oui
           EXCEL4                Classeur excel 4                        Oui
           ACCESS2002            Table Access 2002                       Oui
           ACCESS2000            Table Access 2000                       Oui
           ACCESS97              Table Access 97                         Oui
           WK1                   Classeur Lotus 1-2-3 version 2          Oui
           DBF                   Fichier Dbase                           Oui

        Les instructions optionnelles dépendent beaucoup du type de fichier lu. On
        retiendra en particulier GETNAMES=YES ou NO ; qui permet de lire en première
        ligne du fichier les noms des variables à importer. Sans cette option, les variables
        créées seront nommées F1, F2, F3 etc.
        SHEET=’nomFeuilleExcel$’ est utile pour l’import d’un classeur excel. Par défaut, la
        première feuille est importée. La procédure IMPORT ne propose pas de moyen
        automatique simple pour importer dans autant de tables toutes les feuilles d’un
        classeur Excel.
        Enfin, DELIMITER=’caractère’ permet de spécifier le caractère séparateur pour
        DBCS=DLM.
        Exemple :
        Pour importer la feuille ‘Ventes2003’ du classeur TableaudeBord.xls, situé dans le
        répertoire ‘c:\perso\tdb’, on utilisera la programme suivant :
        PROC IMPORT DATAFILE=’c:\perso\tdb\TableaudeBord.xls’
            OUT=base.ventes03
            REPLACE
            DCBS=EXCEL2002 ;
            GETNAMES=YES ;
            SHEET=’Ventes2003’ ;
        RUN ;

        Ces deux dernières méthodes sont plus simples que l’utilisation de l’étape Data
        pour importer des fichiers. Mais l’intérêt de l’importation par l’étape Data est de
        permettre d’importer exactement les données de la manière voulue (par exemple,
        sans erreur sur le type de variable : un numéro de département défini sous Excel
        sera importé comme variable numérique par la PROC IMPORT). L’étape Data
        permet également de ne pas commencer la lecture des données avant la nième
        ligne, et de donner aux variables créées toutes les caractéristiques voulues (nom,
        label, format) avec une instruction ATTRIB.

4. 2. 3. Utilisation de l’assistant d’importation

        En TP, on utilisera également l’assistant d’importation (menu Fichier > Importer des
        données) pour créer une table SAS à partir d’un fichier externe. Le choix des types
        de fichiers importés est plus ou moins riche selon que le module SAS/ACCESS TO
        PC FILES est sous licence ou non. Dans le cas où ce module n’est pas sous
        licence, la liste se réduit à :



                                                                                         24
             •   fichier à séparateur dans le cas général (*.*) ;
             •   fichier à séparateur virgule (*.csv) ;
             •   fichier à séparateur tabulation (*.txt).
             Sinon, la liste s’enrichit de formats de fichiers tels qu’Excel, dBase, Access ou
             Lotus.


4. 3. Saisie des données sous SAS

     Si les données sont saisies sous SAS, elles doivent :
     suivre directement l’étape DATA,
     être précédées du mot clé CARDS,
     être suivies d’un caractère ; placé en début de ligne.

     Exemple :
     Dans la fenêtre Editeur de SAS, on saisit des données relatives aux caractéristiques
     physiques d’un parc national. Il s’agira, au cours du TP, d’étudier la relation entre la
     présence d’herbivores et l’environnement dans le parc. Dans la table SAS suivante, on
     trouve les caractéristiques des 10 zones étudiées.
     • la variable ZONE identifie la zone étudiée,
     • la variable HERB correspond au niveau de l’herbe,
     • la variable BOSQUET indique la présence de bosquets,
     • la variable EAU renseigne sur la proximité de l’eau,
     • la variable HIPPO renseigne sur l’existence d’un programme de contrôle du nombre des
         hippopotames du site.
     Dans la fenêtre Editeur de SAS, on tape les instructions suivantes :
     data parc;
      input ZONE HERB $ BOSQUET $ EAU $ HIPPO $;
      cards;
      1 courte oui proche moyen
      2 haute oui éloignée aucun
      3 courte oui proche aucun
      4 courte oui proche important
      5 courte oui moyenne aucun
      6 courte oui proche aucun
      7 courte non éloignée aucun
      8 courte oui moyenne important
      9 courte non éloignée aucun
      10 courte non éloignée aucun
      ;
     run;


4. 4. L’export de tables SAS

     L’export peut se faire à travers trois types de manipulations :
     • avec l’assistant d’export (disponible dans le menu FILE>EXPORT), identique dans son
         principe et son ergonomie à l’assistant d’import. Nous aborderons cette possibilité en
         TP.
     • avec la procédure EXPORT qui est le pendant de la procédure IMPORT.
     • Avec une étape Data et deux instructions FILE et PUT qui sont le pendant des
         instructions INFILE et INPUT vues précédemment.




                                                                                            25
4. 4. 1. Création d’un fichier texte à partir d’une table SAS

        Lorsque l’on copie une table SAS dans un fichier texte, aucune table n’est créée au
        cours de l’étape DATA. Puisque la sortie attendue est un fichier externe et non table
        SAS, il est inutile d’indiquer un nom de série de données dans l’instruction DATA.
        On emploie alors une instruction DATA _NULL_;

        Pour créer un fichier texte à partir d’une table SAS, il faut :
        • assigner un fichier de sortie par une instruction FILENAME,
        • créer une étape DATA _NULL_ (puisque l’objectif n’est pas de construire une
           table SAS, mais de se servir d’éléments existants, afin de les présenter dans un
           fichier externe),
        • utiliser les possibilités de la fonction PUT, notamment en matière de formatage
           des variables.

        Chaque observation soumise à une instruction PUT sera ainsi copiée dans le fichier
        texte identifié par l’instruction FILE.
        La syntaxe de l’instruction FILE est la suivante :
              FILE ‘nom_de_fichier’ ;
        ou
              FILE nom_logique ;
        où le nom logique représente un fichier précédemment défini par une instruction
        FILENAME.

        Options de l’instruction FILE

        Pour créer un fichier dont les champs sont séparés par un délimiteur, on utilise
        l’option DLM= dans l’instruction FILE.
        Syntaxe :
        DATA _NULL_ ;
         SET nom_de_table ;
         FILE ‘nom_de_fichier’ DLM=’délimiteur’ ;

        Option DSD
        Supposons qu’on exporte le fichier comportant des données sur les salaires, où les
        milliers sont séparés par une virgule.
        Par exemple, une ligne de données serait la suivante :
                                    IA00100,04JUL2001,124, 000
        Certains logiciels liront ces données comme quatre champs et non trois. Pour
        indiquer que les valeurs de données contenant des virgules doivent être présentées
        entre guillemets, on utilise l’option DSD dans l’instruction FILE.
        data _null_;
         set table_SAS;
         file 'c:\Cours SAS\myfile' dlm=',' dsd;
         put flight data : date9.
             revenue : comma7.;
        run ;
        On obtiendra le résultat suivant :
                                   IA00100,04JUL2001, “124, 000”




                                                                                          26
Quand le pointeur d’écriture dépasse la largeur de page :
Par défaut, la largeur de page est définie par l’option générale LINESIZE=. Si une
spécification est envoyée au pointeur d’écriture pour écrire au delà de cette limite, le
système cherchera à écrire la valeur correspondante au début de la ligne suivante.
Ce peut être le cas d’une variable dont la longueur dépasse le nombre de
caractères séparant la position courante de la fin de la ligne.
Cependant, ce mécanisme peut être géré par une option de l’instruction FILE :
• DROPOVER : la variable correspondante n’est pas écrite
• STOPOVER : l’étape DATA est arrêtée, et un message d’erreur envoyé dans le
   fichier LOG
• FLOWOVER : la variable est écrite au début de la ligne suivante (défaut).

Pour contrôler la taille d’une page (en nombre de lignes) :
Syntaxe : FILE nom_logique PAGESIZE=nombre_de_lignes ;

Utilisation de l’instruction PUT
L’instruction PUT s’utilise avec la même logique que l’instruction INPUT.
Cependant, au lieu de lire les données, elle permettra d’écrire les données en
utilisant un FORMAT d’écriture. Ce format pourra aussi bien être un format SAS
prédéfini qu’un format utilisateur préalablement défini par une PROC FORMAT, ou
lu dans une librairie de formats utilisateur. La valeur exportée sera lors la valeur
formatée, au lieu du comportement par défaut de SAS qui exporte la valeur stockée.
Par rapport à INPUT, il n’est pas nécessaire de signaler le type des variables
caractère par un $. En effet, lors de l’export, le type des variables SAS est déjà
connu.
La syntaxe de l’instruction PUT est la suivante :
PUT
   <contrôle du pointeur d’écriture> <nom_de_variable1> <format_d’écriture>
   …
   <contrôle du pointeur d’écriture> <nom_de_variableN> <format_d’écriture>
Il est possible de :
• se déplacer de n colonnes par rapport à la position actuelle :
     Opérateur +      Exemple : PUT +n var1 2. ;
• se déplacer au début de la ligne suivante :
     Opérateur /      Exemple : PUT / var 1 2. ;
• se déplacer à une colonne en position absolue sur la ligne courante :
     Opérateur @      Exemple : PUT @n var1 2. ;
• écrire une variable à un emplacement déterminé en indiquant la colonne de
     début et la colonne de fin. On ne peut pas dans ce cas indiquer de format
     d’écriture :
     Exemple : PUT var1 5-7 ;

Exemple :
filename russet 'c:\Cours SAS\Russet.txt';

data _NULL_;
 set pays.russet;
 file russet;
 put pays @15 Gini @20 Farm @25 Rent @30 Gnpr @35 Labo
     @38 Inst @43 Ecks @47 Deat @52 Demo;
run;
ou de façon équivalente :




                                                                                     27
       data _NULL_;
        set pays.russet;
        file 'c:\Cours SAS\Russet.txt';
        put pays $ @15 Gini @20 Farm @25 Rent @30 Gnpr @35 Labo
            @38 Inst @43 Ecks @47 Deat @52 Demo;
       run;

       Le nom de la variable peut être suivi d’un format ; la valeur exportée sera alors la
       valeur formatée, au lieu du comportement par défaut de SAS qui exporte la valeur
       stockée.

       Exemple :
       PUT date DDMMYY10. ;

       Exercice 6 :
       On dispose d’une table SAS qui décrit 27 chiens selon des variables de taille, poids,
       vélocité, intelligence, affection, agressivité et fonction (1 : compagnie, 2 : chasse, 3 :
       garde).




       Exportez ces données dans un fichier texte chien.txt, dans le répertoire c:/cours
       SAS. La variable nom sera codée sur les colonnes 1 à 23, la variable taille sera
       codée à partir de la colonne 24 (de sorte que dans le fichier texte, toutes les
       variables seront alignées).


4. 4. 2. La procédure EXPORT

       Cette procédure reprend le principe et la syntaxe de la procédure IMPORT déjà
       citée. Comme pour celle-ci, l’export de certains types de fichiers comme les
       classeurs Excel nécessite d’avoir une licence pour le module SAS/ACCESS
       correspondant. Si aucun module SAS/ACCESS n’est disponible, alors la procédure
       EXPORT ne saura produire que des fichiers textes.

       Syntaxe :
       PROC EXPORT DATA=tableSASlue
           OUTFILE=’chemin et nom du fichier exporté’
           DCBS=typeFichierCréé
           DELIMITER=délimiteur ;
           <SHEET<nomFeuilleExcel ;>
       RUN ;




                                                                                              28
            La table SAS lue est désignée par sa bibliothèque et par son nom. Le fichier
            exporté est donné sous forme de chemin complet, avec le nom du fichier et son
            extension. Par exemple ‘c:\mes documents\données\import\ca_1999.txt’.
            L’instruction SHEET optionnelle permet de préciser, dans le cas d’un export vers un
            classeur Excel (avec l’option DBCS=EXCEL) quelle est la feuille Excel du classeur
            dans laquelle la table SAS est exportée.


4. 5. Manipulation des données au sein de l’étape DATA

     4. 5. 1. Epuration de données existantes

            On peut utilement modifier les données à l’aide des fonctions :
            • UPCASE : convertit toutes les lettres d’une valeur donnée en majuscules.
            • COMPBL : comprime plusieurs blancs consécutifs apparaissant dans une
               valeur de données en un seul blanc.
            • TRANWRD : remplace dans une valeur de données toutes les occurrences
               d’une modèle de caractères par un autre modèle de caractères.
               Attention : si on crée une nouvelle variable à l’aide de la fonction TRANWRD, la
               longueur de cette nouvelle variable est 200 (sauf si on utilise l’instruction
               LENGTH).

            Exemple : un chasseur de tête d’une compagnie aérienne dispose d’une table SAS
            applicants sur les candidats. Les premières lignes sont les suivantes :
            Applicant Last Name   Applicant First name    Applicant country   Job Code
            CHASE      JR         MARJORIE J.            USA                  FLTAT1
            RIGHENZI              NICOLAS                France               MECH01
            DE PABLOS             MARIA                  Spain                FINCLK.
            Afin de retrouver plus facilement les candidats dans la base de données on va
            procéder aux transformations suivantes :
            • on place un point après JR,
            • on écrit en majuscules le pays,
            • on élimine les blancs inutiles dans le nom de famille.

            data applicants ;
              set applicants ;
              lastname=tranwrd(lastname,’JR’,’JR.’);
              country=upcase(country) ;
              lastname=compbl(lastname);
            run;

     4. 5. 2. Création de nouvelles variables

            La gestion des attributs est la première chose à faire lors de la création de
            nouvelles variables. On peut utiliser les instructions ATTRIB et LENGTH vue
            précédemment. Vient ensuite la nécessité de définir la formule qui va permettre le
            calcul des valeurs de cette nouvelle variable.
            Lors de la création de variables, un certain nombre de formules et de fonctions
            peuvent être utilisées. Ces fonctions peuvent être arithmétiques, statistiques,
            mathématiques ou effectuer des transformations sur des variables caractères.

            Les formules simples et les fonctions
            La seconde étape consiste à faire le lien entre le nom d’une variable et le mode de
            calcul de ses valeurs (formule). Cette formule est constituée :
            • de constantes (nombres, texte, dates) citées entre guillemets pour le texte,
                entre guillemets et avec un d pour les dates;



                                                                                              29
•   de noms de variables existantes ;
•   de fonctions SAS et d’opérations.

Création de nouvelles variables de type caractère avec les fonctions SUBSTR,
TRIM, SCAN et l’opérateur de concaténation ||

La fonction SUBSTR extrait une partie d’une valeur de données de type caractères
d’après le nombre de caractères indiqués.
Syntaxe
   var1=SUBSTR(var,début,nombre-de-car)
Exemple : si la variable name=’Dorothy’, substr(name,1,3) extrait les 3 premiers
caractères de la variable name et est égal à ‘Dor’.

La fonction SCAN extrait une partie d’une valeur de données de type caractère
d’après le numéro d’ordre du mot à récupérer.
Syntaxe
   var1=SCAN(var,numéro-de-mot<,délimiteur(s)>)
Exemple : soit la variable name qui prend pour une observation la valeur ‘Dorothy
E’. scan(name,2,’ ‘) extrait le deuxième nom, soit ‘E’.
Si la variable créée n’a pas été définie auparavant avec une instruction LENGTH, la
longueur de la nouvelle variable est 200.
S’il n’y a pas de troisième argument, les délimiteurs par défaut sont :
ASCII (par exemple, UNIX) :                  blanc . < ( + & $ * ) ^ - / , % | ~
EBCDIC (par exemple OS/390, CMS) : blanc . < ( + | & $ * ) - / , %

L’opérateur de concaténation || unit des valeurs de données de type caractère.
Syntaxe
   var2=var||var1
Si la variable créée n’a pas été définie auparavant avec l’instruction LENGTH, la
longueur de la nouvelle variable est la somme des longueurs de toutes les variables
et du texte constant concaténés.
On peut aussi utiliser !! comme opérateur de concaténation.

La fonction TRIM élimine les blancs à droite dans les valeurs de données de type
caractère au cours de l’exécution.
Var2=TRIM(var)||var1
La fonction TRIM par elle-même n’a pas d’effet visible sur un résultat. Par exemple,
on n’utilisera pas name1=trim(name).

Exemple
Une société a décidé de mettre en œuvre une nouvelle structure d’adresse
électronique sous la forme
InitialeprénomInitialemédianeNomfamille@IA.COM
La première initiale est suivie de l’initiale médiane (s’il y a lieu), du nom de famille et
de @IA.COM.
Données partielles
emp_lastname                    emp_firstname
MILLS                           DOROTHY E
BOWER                           EILEEN A
READING                         TONY R
JUDD                            CAROL A



                                                                                        30
La première étape consiste à extraire la première lettre du prénom de l’employé
first_initial=substr(emp_firstname,1,1) ;
On utilise ensuite la function substr pour extraire l’initiale médiane
middle_initial=substr(scan(emp_firstname,2,’ ‘),1,1) ;

Enfin, on utilise l’opérateur de concatenation et la fonction TRIM pour créer la
variable email
email=first_initial||middle_initial||trim(lastname)||’@IA.COM’

             Principales fonctions sur les variables de type caractère
         Fonction                   Description                     Exemples
                                                          NUMSECU=NUM_INSEE ! !CLE
                             Concaténation de deux        Si NUMSECU=2750986345776
VarCar1 ! !varCar2
                             chaînes de caractères        et CLE=33, alors NUMSECU=
                                                          275098634577633
                             Extraction d’un morceau
SUBSTR(varCar,début,                                      SEXE=SUBSTR(NUMSECU,1,1)
                             d’une chaîne de
longueur)                                                 _’2’
                             caractères
                             Mise en majuscule d’une      UPCASE(VILLE)_
UPCASE(varCar)
                             chaîne de caractères         ’ PARIS CEDEX 03 ’
                             Mise en minuscules d’une     LOWCASE(VILLE)_
LOWCASE(varCar)
                             chaîne de caractères         ‘ paris cedex 03 ’
                             Suppression des blancs à
                                                          LEFT(VILLE)_
LEFT(varCar)                 gauche d’une chaîne de
                                                          ‘Paris CEDEX 03 ’
                             caractères
                             Suppression des blancs à
                                                          TRIM(VILLE)_
TRIM(varCar)                 droite d’une chaîne de
                                                          ‘Paris CEDEX 03’
                             caractères
                             Suppression des blancs à
                                                          STRIP(VILLE)_
STRIP(varCar)                droite et à gauche d’une
                                                          ‘Paris CEDEX 03’
                             chaîne de caractères
                             Suppression des blancs
                                                          COMPRESS(VILLE)_
COMPRESS(varCar)             dans une chaîne de
                                                          ‘ParisCEDEX03’
                             caractères
                             Suppression des blancs
                                                          COMPBL(VILLE) _
COMPBL(varCar)               consécutifs dans une
                                                          ‘Paris CEDEX 03’
                             chaîne de caractères

Création de nouvelles variables de type numérique à partir des fonctions INT,
SUM, MEAN et ROUND

Certaines fonctions telles que sum et mean permettent de calculer des statistiques
sur plusieurs variables. Ces statistiques sont calculées sur chaque observation et
sur les valeurs non manquantes des variables concernées. Elles permettent de
synthétiser plusieurs variables numériques.

La fonction SUM additionne des valeurs de variables, et ignore les valeurs
manquantes. Elle renvoie toujours un résultat (zéro si toutes les valeurs concernées
sont non renseignées), alors que l’addition avec l’opération + générera une valeur
manquante si une des variables n’est pas renseignée.
Syntaxe
   var=SUM(var1,var2,…,varN)
Exemple
var1 var2 var3        var=sum(var1,var2,var3);         var
12   .    6                                          18
On peut aussi utiliser la liste implicite de variables, en utilisant le mot clé OF devant
le premier nom de variable pour éviter la soustraction.
     Var=SUM(OF var1-varN) ;




                                                                                      31
Exemple : précédemment, on aurait pu utiliser l’instruction suivante :
var=sum(of var1-var3);

La fonction M E A N retourne la moyenne arithmétique et ignore les valeurs
manquantes. Elle ne prend en compte, comme dénominateur, que le nombre de
variables renseignées pour cette observation.
Syntaxe :
   var=MEAN(var1,var2,…,varN) ;
Exemple
var1 var2 var3           var=mean(var1,var2,var3);                   var
12   .    6                                                      9

La fonction ROUND retourne une valeur arrondie à l’unité la plus proche. Si l’unité
la plus proche n’est pas désignée, la variable est arrondie au nombre entier le plus
près.
var=ROUND(var1<,unité d’arrondissement>)
Tout nombre ou valeur fractionnaire peut être désigné comme unité
d’arrondissement.
Exemples
var1     var2          var3        var4
12.12    42.54         6.472       -6.47
var1a=round(var1) ;
var2a=round(var2) ;
var3a=round(var3,.1);
var4a=round(var4,.1);
var1 var2       var3      var4
12 43           6.5       -6.5

La function INT retourne la partie entière d’un argument.
var=INT(var1) ;
Exemple
var1 var2       var3      var4
12.1242.54      6.472     -6.47
var1a=int(var1) ;
var2a=int(var2) ;
var3a=int(var3);
var4a=int(var4);
var1 var2       var3      var4
12 42           6         -6

Exemple : on dispose pour chaque employé du montant des primes reçues au
cours des 9 dernières années. Voici un aperçu des données partielles :
EMP_ID    Prime1    Prime2     Prime3     Prim4     Prim5      Prim6        Prim7      Prim8      Prim9
E00002       .         .       2704.07   2705.43   2706.78    2708.14      2709.50    2710.85    2712.21
E00003       .         .          .          .     12030.15   12036.18     12042.21   12048.24   12054.27
E00004       .         .          .          .         .          .            .          .      4218.99
E00005    1900.95   1901.91    1902.86   1903.82   1904.77    1905.73      1906.68    1907.64    1908.59
E00007                         2904.37   2905.83   2907.29    2908.74      2910.20    2911.66    2913.12

On souhaite avoir un rapport affichant les ID des employés, le total des primes qu’ils
ont reçues au cours des neuf dernières années, ainsi que le montant moyen cumulé
pendant la même période arrondi à l’euro.




                                                                                                     32
  data sum_avg_prime;
   set prime;
   sum_prime=sum(of prime1-prime9);
   avg_bonus=round(mean(of bonus1-bonus9));
  run;
  Sortie partielle
                EMP_ID               Sum_prim            Avg_bonu
                                     e                   s
                E00002                18956.98               2708
                E00003                60211.06              12042
                E00004                 4218.99               4219
                E00005                17142.96               1905
                E00007                20361.21               2909
              Opérations sur les variables numériques (dates comprises)
                             Opération               Description
                                +                      Addition
                                 -                   Soustraction
                                 *                   Multiplication
                                 /                     Division
  Ces opérations ne s’effectuent pas quand une des variables concernées est
  manquante. Le résultat généré est alors une valeur manquante. Un message
  s’affiche dans la fenêtre Log pour rendre compte de ce problème.
                         Principales fonctions numériques
         Fonction                     Description                 Exemples
ROUND(varNum,                                               ROUND(CA)_125
                               Arrondi à une précision
précision)                                                  ROUND(CA,0.1)_124.6
                               donnée
ou ROUND(varNum                                             ROUND(CA,10)_120
                               Génération d’un nombre
RANUNI(0)                      au hasard entre 0 et 1       RANUNI(0)_0.63562536741
                               (inclus)
LOG(varNum)                    Logarithme naturel           LOG(CA)_4.8247875
EXP(varNum)                    Exponentielle                EXP(CA/100)_3.475019
SQRT(varNum)                   Racine carrée                SQRT(CA)_11.160645
ABS(varNum)                    Valeur absolue               ABS(-1*CA)_124.56

              Principales fonctions statistiques de l’étape Data
                      Fonction                                Description
      SUM(varNum1, varNum2, varNum3…) ou                 Somme de plusieurs
      SUM(of varNum1-varNum3)                            variables
      MEAN(varNum1, varNum2, varNum3…) ou                Moyenne de plusieurs
      MEAN(of varNum1-varNum3)                           variables
      MIN(varNum1, varNum2, varNum3…) ou                 Minimum de plusieurs
      MIN(of varNum1-varNum3)                            variables
      MAX(varNum1, varNum2, varNum3…) ou                 Maximum de
      MAX(of varNum1-varNum3)                            plusieurs variables
      MEDIAN(varNum1, varNum2, varNum3…) ou              Médiane de plusieurs
      MEDIAN(of varNum1-varNum3)                         variables

  Création de nouvelles variables de type numérique en fonction des dates

  La fonction INTNX avance une date, une heure ou une combinaison de date-heure
  par une valeur entière donnée, puis retourne une date, une heure ou une
  combinaison de date-heure.




                                                                                   33
Syntaxe
   Var=INTNX(‘intervalle’,début,incrément)
‘intervalle’ indique une variable ou une constante de type caractère. L’argument
intervalle peut apparaître en lettres minuscules ou majuscules.
La fonction INTNX avance au début de l’intervalle : par exemple 01JAN pour
l’intervalle YEAR.
Le premier argument de la fonction INTNX doit être un de ceux qui sont énumérés
dans ce tableau
   Intervalle de date         Intervalle de date-heure         Intervalle d’heure
DAY                           DTDAY                         HOUR
WEEKDAY                       DTWEEKDAY                     MINUTE
WEEK                          DTWEEK                        SECOND
TENDAY                        DTTENDAY
SEMIMONTH                     DTSEMIMONTH
MONTH                         DTMONTH
QTR                           DTQTR
SEMIYEAR                      DTSEMIYEAR
YEAR                          DTYEAR
début       spécifie une expression SAS qui représente une valeur de date, d’heure
            et de date-heure SAS et qui identifie un point de départ.
incrément   spécifie un entier positif ou négatif qui représente le nombre spécifique
            d’intervalles de temps.
Exemple
Supposons que la variable date_today soit égale au 05/11/2004.
format date2 mmddyy10.;
date2=intnx('year',date_today,1);
date2 est alors égale à 01/01/2005.

La fonction TODAY retourne la date courante sous la forme d’une date SAS.
Var=TODAY()
La fonction DATE est synonyme de la fonction TODAY.

Il y a d’autres fonctions qui retournent des valeurs à partir de dates SAS :
Var=YEAR(date_SAS) ;
Var=MONTH(date_SAS) ;
Var=DAY(date_SAS);
Exemple :
Présumons que nous soyons le 10 Novembre 2004.
THISYEAR=YEAR(TODAY()) ;
THISMONTH=MONTH(TODAY()) ;
THISDAY=DAY(TODAY());
THISYEAR prend la valeur 2004.
THISMONTH prend la valeur 11.
THISDAY prend la valeur 10.




                                                                                    34
                       Principales fonctions sur les dates
        Fonction                      Description                  Exemples
  TODAY()                       Date du jour                TODAY()_16436
                                                            (31 décembre 2004)
  DAY(varDate)                  Jour extrait d’une date     DAY(16436)_31
  MONTH(varDate)                Mois extrait d’une date     MONTH(16436)_12
  YEAR(varDate)                 Année extraite d’une        YEAR(16436)_2004
                                date
  WEEKDAY(varDate)              Jour de la semaine          WEEKDAY(16436)_6
                                extrait d’une date
                                1=dimanche, 2=lundi,
                                3=mardi…
  MDY(mois,jour,année)          Construction d’une date     MDY(12,31,2004)_16436
                                SAS à partir des
                                éléments jour, mois et
                                année
  INTCK(‘période’,début,fin)    Nombre de débuts de         INTCK('‘eek'’16436,
                                période écoulés entre       16512)_11
                                deux dates. La période      (11 dimanche entre les
                                est un mot-clé à choisir    deux dates)
                                entre ‘week’, ‘month’ et
                                ‘year’. Les débuts de
                                période sont le
                                                er
                                dimanche, le 1 du
                                           er
                                mois, le 1 janvier
                                respectivement.
  INTNX(‘période’,début,        Décalage d’une date de      INTNX(‘week’,16436,11)_
  nbPériodes)                   n périodes dans le          16508
                                temps. La date en sortie    (le résultat est forcément
                                de cette fonction est       un dimanche. 16512 est
                                calquée sur le début de     un jeudi, 16508 est un
                                la période                  dimanche)
                                correspondante.

                                   Fonction de retard
         Fonction                    Description                    Exemple
  LAG(var)                     Valeur lue à l’observation   var1=lag(_N_)_
                               précédente                   Obs     var1
                                                            1     .
                                                            2     1
                                                            3     2
                                                            4     3

Les formules conditionnelles : IF…THEN…ELSE
Les nouvelles variables peuvent prendre certaines valeurs conditionnellement à
d’autres variables. Le choix de la formule à utiliser se fera à travers une série
d’instructions IF…THEN…ELSE.
IF condition THEN DO ;
      nouvelleVariable=formule ;
END ;
ELSE DO ;
      nouvelleVariable=formule ;
END ;

Exemple :
IF x=1 THEN y=x+(2*z) ;ELSE y=3+x ;

                 Opérateurs supportés par les IF et les WHERE


                                                                                   35
                           Opérateur                       Signification
                                =                             Egalité
                               NE
                                                            Différent de
                          (ou ^= ou !=)
                                >                     Supérieur strictement à
                                <                      Inférieur strictement à
                               >=                       Supérieur ou égal à
                               <=                        Inférieur ou égal à
                               IN                  Prend une valeur dans un liste
                               =:
                                                    Commence par une certaine
                 (sur les variables caractères
                                                      chaîne de caractères
                          uniquement)
                              NOT                    Contraire d’une condition
                                                  Les deux conditions doivent être
                             AND
                                                     vérifiées par l’observation
                                                      Au moins une des deux
                              OR                   conditions doit être vérifiée par
                                                            l’observation

       L'instruction ARRAY
       L'instruction ARRAY vectnom (n) listevar ; permet de définir des synonymes
       (vectnom) pour gérer des noms de variables (listevar) de manière rapide,
       notamment lorsqu'on doit manipuler des variables différentes en quantité. Cela
       sera très utile avec l'instruction DO pour traiter chaque élément de la même façon.
       Les variables peuvent être alphabétiques ; dans ce cas, on écrira ARRAY vectnom
       (n) $ listevar ;
       Par exemple, l’instruction :
           ARRAY temp(12) x1-x12 ;
       indique que la variable TEMP est le vecteur synonyme des 12 valeurs x1 à x12. On
       peut donc les écrire indifféremment x1 ou temp(1) pour identifier la première
       variable, x2 ou temp(2) pour identifier la seconde,… dans l’étape DATA où cette
       instruction a été précisée.

       Exemple : on dispose d’une table de corrélations entre 5 variables. On définit un
       indice de distance entre ces variables : distance(v1,v2)=1-corrélation(v1,v2).
       data distvar;
        set corvar;
        array dis(5) X1-X5;
        array cor(5) COR1 COR2 COR3 COR4 COR5;
        do i=1 to 5;
         dis(i)=1-cor(i);
        end;
       run;

4. 5. 3. Sélection de certaines observations : instructions IF et WHERE

       IF condition THEN OUTPUT;
       ou
       IF condition;

       L’instruction IF filtre les observations en ne prenant en compte l’observation que si
       et seulement si la condition à vérifier est vraie. Cette condition peut contenir des
       expressions et opérateurs de comparaison :




                                                                                         36
< ou LT     inférieur
> ou GT     supérieur
=< ou LE    inférieur ou égal
=> ou GE    supérieur ou égal
NE différent de.

La condition peut être par exemple :
• une comparaison entre une variable et une valeur : IF age>30
• une comparaison entre deux variables : IF date2>date1.

L’instruction IF peut aussi comprendre des opérateurs logiques :
IF condition1 AND condition2 ;
IF condition 1 OR (condition2 and condition3);

Par exemple, on ne veut sélectionner que les démocraties (variable DEMO), dans
lesquelles des manifestations violentes ont entraîné des morts sur la période 1950-
1962 (variable DEAT) :
data demo;
 set pays.russet;
 if (demo=1 or demo=2) and deat>0;
run;

Si on veut éliminer certaines observations, on utilise l’instruction DELETE :
IF condition THEN DELETE ;

Exemple : on veut créer deux fichiers , un fichier des démocraties et un fichier des
dictatures :
data demo
     dict;
 set d.russet;
 if demo in (1,2) then output demo;
 else output dict;
 drop demo;
run;

L’instruction WHERE sélectionne les observations d’une table SAS remplissant
certaines conditions. Chaque condition met généralement en jeu une variable et
une valeur. Enfin, des opérateurs sont nécessaires pour compléter la condition.
La valeur est énoncée de manière différente selon le type de la variable testée –
caractère, numérique ou date - :
•   pour une variable numérique, la valeur sera indiquée telle quelle,
•   pour une variable de type caractère, la valeur apparaîtra entre guillemets. Une
    attention particulière sera accordée à la casse,
•   une date sera explicitée de la manière suivante : deux chiffres pour le jour du
    mois, trois lettres pour le nom du mois en anglais et deux ou quatre chiffres
    pour l’année. Cette description de la date est proposée entre guillemets (bien
    que la variable soit de type numérique), et un « d » est accolé au guillemet
    fermant. Par exemple, "16APR2003"d.
Plusieurs clauses peuvent être testées simultanément en utilisant les opérateurs
logiques OR et AND.




                                                                                 37
       Exemple :
       data demo;
        set pays.russet;
        where (demo=1 or demo=2) and (deat>0);
       run;

                                   Opérateurs pour l’option WHERE
                    Opérateur                                Signification
                         =                                      Egalité
                        NE
                                                              Différent de
                   (ou ^= ou !=)
                         >                               Supérieur strictement à
                         <                                Inférieur strictement à
                        >=                                 Supérieur ou égal à
                        <=                                  Inférieur ou égal à
                                                     Prend une valeur dans un liste
                                                    Ex. : dept IN ("22","29","35","56")
                        IN
                                                                      ou
                                                       dept IN ("22" "29" "35" "56")
                                               Egalité sur une partie de la valeur : dans la
                                            valeur testée, % remplace une chaîne inconnue,
                       LIKE                   _ remplace un et un seul caractère inconnu
           (sur les variables caractère                 Ex. : prenom LIKE ‘AN_E’
                   uniquement)                                _ ANNE, ANGE
                                                           prenom LIKE ‘%N%’
                                                   _ANNE, ANGE, NOEMIE, JULIEN
                         =:                     Commence par une certaine chaîne de
           (sur les variables caractères                          caractères
                    uniquement)                     Ex. : num_securite_sociale= :"2"
                     BETWEEN                     Compris entre deux bornes (incluses)
                    IS MISSING                             N’est pas renseigné
                        NOT                             Contraire d’une condition
                                             Les deux conditions doivent être vérifiées par
                       AND
                                                                l’observation
                                              Au moins une des deux conditions doit être
                       OR
                                                         vérifiée par l’observation

4. 5. 4. Sélection de certaines variables : instructions DROP, KEEP et RENAME

       Ces mots-clés peuvent être utilisés soit :
       comme option de l’instruction DATA ou de l’instruction SET,
       comme instruction à part entière.

       On peut ainsi dans la table SAS à créer :

       •    ne stocker qu’une partie des variables utilisées dans l’étape DATA :
            3 syntaxes possibles :
                DATA nom_de_table(KEEP=liste_de_variables) ;
            ou
                DATA nom_de_table ;
                SET nom_de_table(KEEP=liste_de_variables) ;
            ou
                DATA nom_de_table ;
                SET nom_de_table ;
                …
                KEEP liste_de_variables.



                                                                                         38
       •   ne pas stocker des variables créées au cours de l’étape DATA :
           3 syntaxes possibles :
               DATA nom_de_table(DROP=liste_de_variables) ;
           ou
               DATA nom_de_table ;
               SET nom_de_table(DROP=liste_de_variables) ;
           ou
               DATA nom_de_table ;
               SET nom_de_table ;
               …
               DROP liste_de_variables.

       Il est possible d’utiliser certaines « abréviations » pour raccourcir l’énumération d’un
       grand nombre de variables :
       •   KEEP = dt :
           correspond à l’ensemble des variables dont le nom commence par « DT »,
       •   DROP = ca1997-ca2002
           correspond à la séquence de variables dont le nom commence par « CA » et se
           termine par un nom compris entre 1997 et 2002 inclus,
       •   DROP = _NUMERIC_
           correspond à l’ensemble des variables numériques de la table, quel que soit
           leur nom. Il existe, à l’identique, des mots-clés _ALL_ et _CHARACTER_
           (toutes les variables de la table, ou seulement les variables de type caractère).

       •   renommer une ou plusieurs variables utilisées au cours de l’étape DATA :
           3 syntaxes possibles :
               DATA nom_de_table(RENAME=(ancien_nom=nouveau_nom)) ;
           ou
               DATA nom_de_table ;
               SET nom_de_table(RENAME=(ancien_nom=nouveau_nom)) ;
           ou
               DATA nom_de_table ;
               SET nom_de_table ;
               …
               RENAME ancien_nom1=nouveau_nom1…..ancien_nomn=nouveau_nomn ;

       Exemple :
       On souhaite créer un fichier voitures2 qui ne comporte que le nom de la voiture, et
       les variables cylindree puissance longueur largeur poids vitesse. La variable nom
       est renommée voiture.
       data voitures2(drop=origine finition prix
                      rename=(nom=voiture));
        set voitures;
       run;

4. 5. 5. Création de plusieurs séries de données SAS

       Pour créer plusieurs séries de données, on nomme chaque série de données dans
       l’instruction DATA. Les noms sont séparés par un espace.
           DATA nom_de_table1 nom_de_table2….nom_de_tablen ;

       On utilise également l’instruction OUTPUT. Si l’instruction OUTPUT ne contient
       aucun nom de série de données, l’observation est écrite dans toutes les tables



                                                                                            39
énumérées à l’instruction DATA. Mais on peut également décider des tables dans
lesquelles sont écrites les observations en indiquant le nom des séries de données
dans l’instruction OUTPUT.
    OUTPUT nom_de_tablei ;
On peut aussi indiquer plus d’une table SAS dans une instruction OUTPUT en
séparant les noms des séries de données par un espace, par exemple :
    OUTPUT nom_de_tablei nom_de_tablej ;

Enfin, on va devoir utilise un traitement conditionnel. On a déjà vu le traitement
conditionnel IF/THEN/ELSE. Un autre choix est possible, en utilisant l’instruction
SELECT, dont la syntaxe exacte est :
    SELECT <(expression-select)> ;
     WHEN (expression-when) instruction ;
     …
     WHEN (expression-when) instruction;
     <OTHERWISE instruction;>
    END;
Si plusieurs instructions doivent être exécutées lorsqu’une expression est vraie, on
encadre le groupe d’instructions d’un bloc DO/END.
    SELECT <(expression-select)> ;
     WHEN (expression-when) DO ;
       instructions;
     END;
     …
     WHEN (expression-when) DO ;
       instructions;
     END;
     <OTHERWISE DO;
       instructions;
     END;>
    END;

Exemple :
On dispose du PIB de la France pour les années 1970 à 2003. On veut effectuer
une prévision du PIB pour les années 2004 2005 et 2006. D’une année sur l’autre,
on prévoit une croissance de 2%.




Le programme suivant permet de récupérer les prévisions pour les années 2004 à
2006 :




                                                                                 40
data PIB_prevision;
 set PIB_France;
 if annee=2003;
 drop annee;
 year=2004;
 PIB=PIB*1.02;
 output;
 year=2005;
 PIB=PIB*1.02;
 output;
 year=2006;
 PIB=PIB*1.02;
 output;
run;




Exemple : à partir du fichier russet, on veut créer plusieurs tables distinctes pour
chaque continent. La syntaxe sera la suivante :
data amerique_nord amerique_latine europe_est
     europe_ouest asie moyen_orient oceanie afrique;
 set russet;
 select(pays);
  when ('Argentine','Bolivie','Brésil','Chili','Colombie',
        'Costa Rica','Cuba','Rép. Dominic.','Equateur',
        'Guatemala','Honduras','Nicaragua','Panama',
        'Salvador','Uruguay','Venezuela')
  output amerique_latine;
  when ('Canada','Etats-Unis')
  output amerique_nord;
  …
  otherwise
  output europe_ouest;
 end;
run;
Pour générer les mêmes résultats que ceux de l’étape DATA ci-dessus avec la
logique IF/THEN, on utilise le code suivant :




                                                                                 41
data amerique_nord amerique_latine europe_est
     europe_ouest asie moyen_orient oceanie afrique;
 set russet;
 if pays in ('Argentine','Bolivie','Brésil','Chili',
             'Colombie','Costa Rica','Cuba','Rép.Dominic.',
             'Equateur','Guatemala','Honduras','Nicaragua',
             'Panama','Salvador','Uruguay','Venezuela')
 then output amerique_latine;
 else if pays in ('Canada','Etats-Unis')
 then output amerique_nord;
 …
 else
 output europe_ouest;
run;

Exercice 7 : le service de planification d’une compagnie aérienne doit transmettre
une série de données SAS au service de fabrication pour chacun des types
d’avions.
Ecrivez une étape DATA de manière à créer une série de données SAS pour
chaque type d’avion : SMALL, MEDIUM et LARGE (variable MODEL). L’information
courante se trouve dans la table AIRCRAFT.
Les modèles de type LARGE sont : LF5000, LF5100, LF5200, LF8000, LF8100.
Les modèles de type MEDIUM sont : MF2000, MF2100, MF4000, MF4100,
MF6000.
Les autres modèles sont de type SMALL.

Exercice 8
Un fichier de données brutes renferme des renseignements sur les employés
retraités d’une compagnie. Vous devez transformer et écrire les données dans une
table SAS conformément aux directives énoncées ci-dessous.
Le fichier à importer est le suivants : ‘c:\Cours SAS\retraites.csv’.
Le fichier de données brutes est délimité par la virgule et se présente comme suit :
  Champ 1           ID de l’employé
  Champ 2           Date de naissance de l’employé stocké sous la forme mm/jj/aaaa
  Champ 3           Nom complet de l’employé (prénom et nom) (47 caractères de long)
  Champ 4           Année de retraite
                                                   ère
  Champ 5           Avantages monétaires pour la 1 année de retraite
                                                   ème
  Champ 6           Avantages monétaires pour la 2     année de retraite
                                                   ème
  Champ 7           Avantages monétaires pour la 3     année de retraite
                                                   ème
  Champ 8           Avantages monétaires pour la 4     année de retraite
Fichier partiel :
E02837,09/17/1937,Alexander     SERTUCHE,1997,5925,6221.25,6470.1,6793.61
E01062,07/28/1922,Alice         ROBERSON,1982,9850,10342.5,10756.2,11294.01
E01417,02/11/1944,Allen         OSWALD,2004,6999,7348.95,7642.91,8025.06
E00356,11/03/1937,Amy           FULKERSON,1992,6297,6611.85,6876.32,7220.14
E02129,11/07/1945,Angela        GILLMOR,2005,9608,10088.4,10491.94,11016.54
1. Lisez tous les champs. Ne conservez que les observations des employés nés
              er
   avant le 1 janvier 1940.
2. Convertissez le nom des employés en lettres majuscules, puis retirez tous les
   blancs sauf un entre le prénom et le nom.
3. Créez une nouvelle variable ne contenant que le nom de famille de l’employé.
4. Changez l’ID de l’employé, en remplaçant le E en début de code par un R (pour
   retraité).




                                                                                       42
5. Calculez la prestation de retraite moyenne pour les quatre années, en
   arrondissant au centième d’euro.
6. Créez une nouvelle variable correspondant à la date de naissance de l’employé
                     er
   plus 60 ans au 1 janvier. Par exemple, si un employé est né le 09/17/1937, la
   nouvelle valeur de date est 01/01/1997.
7. Comparez la partie année de la nouvelle variable à l’année de retraite. Si
   l’année de retraite correspond à la portion année de la nouvelle variable,
   écrivez l’observation dans une table SAS appelée RETIRE_AT_60. Sinon,
   écrivez l’observation dans une table appelée EARLY_RETIRE.
Sortie partielle de retire_at_60 :
 Obs     Fullname                Emp_birth_rate   Emp_ID    Year1    Year2      Year3      Year4

 1       ALEXANDER               09/17/1937       R02837    5925     6221.25    6470.10    6793.61
         SERTUCHE
 2       ALICE                   07/28/1922       R01062    9850     10342.50   10756.20   11294.01
         ROBERSON
         Lastname                Avg_retire       Retire_year   Birth_60

         SERTUCHE                6352.49          1997          01/01/1997
         ROBERSON                10560.68         1982          01/01/1982


Exercice 9 :
Les données de la série TARIFS incluent le tarif du billet demandé pour chaque
trajet et chaque classe de service (première, affaires et économique) pendant
quatre années consécutives.
Données de TARIFS :
Obs trajet firstclass_ bus_year1 econ_year1
       year1
 1 0000001 $1,600 $1,090 $531
 2 0000002 $1,600 $1,090 $531
 3 0000003 $1,761 $1,201 $585
 4 0000004 $1,761 $1,201 $585
 5 0000005 $176       $120 $58

       firstclass_ bus_year2 econ_year2
       year2
       $1,942 $1,323 $645
       $1,942 $1,323 $645
       $2,139 $1,458 $711
       $2,139 $1,458 $711
         $213     $145 $71

       firstclass_ bus_year3 econ_year3
       year3
       $2,285 $1,557 $759
       $2,285 $1,557 $759
       $2,516 $1,715 $836
       $2,516 $1,715 $836
         $251     $171 $83

       firstclass_ bus_year4 econ_year4
       year4
       $1,808 $1,232 $600
       $1,808 $1,232 $600
       $1,990 $1,357 $661
       $1,990 $1,357 $661
         $199     $136 $66

Écrire une étape DATA pour créer une série de données SAS appelée
TARIFS_1ERE renfermant une observation par année pour les tarifs de première
classe. La série résultante contient les variables TRAJET, YEAR et TARIF.

La sortie prévue est la suivante :



                                                                                                   43
             Obs TRAJET       YEAR TARIF

               1   0000001   1    1600
               2   0000001   2    1942
               3   0000001   3    2285
               4   0000001   4    1808
               5   0000002   1    1600
               6   0000002   2    1942
               7   0000002   3    2285
               8   0000002   4    1808
               9   0000003   1    1761
              10   0000003    2    2139
              11   0000003    3    2516
              12   0000003    4    1990
              13   0000004    1    1761
              14   0000004    2    2139
              15   0000004    3    2516
              16   0000004    4    1990
              17   0000005    1     176
              18   0000005    2     213
              19   0000005    3     251
              20   0000005    4     199


4. 6. Lecture de tables SAS
     Parmi les instructions disponibles dans l’étape Data, certaines sont quasiment
     indispensables : il s’agit d’instructions de lecture. Sans l’une d’elles, l’étape Data travaille
     sans repartir d’une quelconque source de données, et créera donc un table contenant 0 ou
     1 observation.
     Les principales instructions de lecture sont SET pour la lecture d’une seule table SAS à la
     fois et MERGE…BY pour la lecture simultanée de plusieurs tables.

     4. 6. 1. Concaténation et chargement d’une table : instruction SET

             Syntaxe :
                SET <nom_de_table1>…<nom_de_tablen> ;
             La table résultante contiendra toutes les variables provenant des tables en entrée et
             des variables créées au cours de l’étape.

             Exemple :
                          A                  data NEW ;                      B
                         ID                    set A B ;                    ID
                          1                  run ;                           2
                          3                                                  5
                          4                                                  6
                                                NEW
                                                 ID
                                                  1
                                                  3
                                                  4
                                                  2
                                                  5
                                                  6

             Dans la table résultante, les séries de données ne sont pas triées. Une
             concaténation par l’instruction SET empile les observations de tables SAS en
             fonction de la position relative des tables dans l’instruction SET.

             Imbrication




                                                                                                   44
Une imbrication intercale verticalement les observations à partir de deux ou
plusieurs tables SAS en fonction d’une ou plusieurs variables communes. Ce qui
signifie que les données sont empilées verticalement et qu’elles conservent leur
ordre de tri d’origine.
Exemple :
          A                    data NEW ;                      B
         ID                      set A B ;                    ID
          1                      by ID ;                       2
          3                    run ;                           5
          4                                                    6
                                  NEW
                                   ID
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6
NB : il faudra trier préalablement les données par une PROC SORT (thème abordé
ultérieurement).

Exemple : on veut imbriquer deux tables SAS pour lesquelles les variables ne sont
pas identiques (excepté la variable identifiant LNAME).
                 A                                    B
LNAME         DIVS    DATE       LNAME       DIV   MONTH     DAY     YEAR
ALLEN         A1   01DEC1998     ANDER       B1    1         16      2000
BADGE         A2   16JUN1997     BASH        B2    12        16      1999
CARR          A3   01SEP1998     COX         B3    12        16      1999
On va utiliser l’option RENAME pour renommer DIV dans le fichier B.
On va par ailleurs créer une date à partir des valeurs MONTH, DAY et YEAR en
utilisant la fonction MDY. Le format général de cette fonction est le suivant :
  MDY(mois,jour,année)
  mois : indique une expression numérique représentant un nombre entier de 1 à
  12.
  jour : indique une expression numérique représentant un nombre entier de 1 à 31.
  année : indique une expression numérique représentant un nombre entier qui
  identifie une année en particulier.
Enfin, on va utiliser l’option IN= pour détecter quelle table SAS a contribué à la
création de l’observation courante. Le format général de l’option IN= est le suivant :
    Table_SAS (IN=variable)
    variable est une variable numérique temporaire avec une valeur de :
    0 : pour indiquer faux ; la série de données n’a pas contribué à l’observation
    courante.
    1 : pour indiquer vrai ; la série de données a contribué à l’observation courante.
data combine;
 set a(in=ina)
     b(in=inb rename=(DIV=DIVS));
 by lname,
 if inb=1 then date=MDY(MONTH,DAY,YEAR);
run;
Résultats :
LNAME          DIVS   DATE
ALLEN          A1     01DEC1998
ANDER          B1     16JAN2000



                                                                                   45
BADGE       A2        16JUN1998
BASH        B2        16DEC2000
CARR        A3        01SEP1998
COX         B3        16DEC1999

Regroupement : utilisation des variables FIRST. et LAST.

Si par exemple un fichier contient des observations au niveau individu, et que
chaque individu contient un identifiant ménage, il peut être utile de créer une autre
table, au niveau ménage, synthétisant une partie de l’information disponible au
niveau individu.
On change alors le niveau d’observation entre la table d’entrée (niveau=individu) et
le niveau de sortie (niveau=ménage).
Après tri d’une table par une procédure SORT (voir plus loin), l’appel de cette table
par une instruction
    SET nom_de_table ;BY liste_de_variables ;
génère automatiquement, pour chaque observation une variable FIRST.variable_clé
mise à 1 s’il y a eu changement de clé depuis l’observation précédente, et une
variable LAST.variable_clé mise à 1 s’il y a changement de valeur, pour la variable
considérée, entre l’observation courante et l’observation suivante. Ces deux
variables ne sont pas stockées dans la table de sortie.

Par exemple, on a un fichier contenant les caractéristiques des logements
successifs occupés par des ménages. Ces ménages sont repérés par le variable
IDENTet le logement par la variable CN. On veut conserver uniquement les
                      er
caractéristiques du 1 logement renseigné dans la base (la variable CN est classé
par ordre croissant, dans l’ordre de l’occupation des logements) :
proc sort data=logement;
 by ident cn;
run;

data loge1;
 set logement;
 by ident;
 if first.ident;
run;

On verra en TP l’utilisation des variables FIRST et LAST sur plusieurs clés.

On peut également par une procédure assez proche, et en utilisant le mot-clé
RETAIN, compter le nombre de logements successifs occupés par les ménages :




                                                                                  46
       data loge;
        set logement;
        by ident;
        retain nb_log 0;
        if first.ident then nb_log=0;
        nb_log=nb_log+1;
        if last.ident;
       run;

4. 6. 2. JOINTURES : instruction MERGE

       L’instruction MERGE permet d’apparier des tables selon une clé, qui est un
       identifiant commun aux différentes tables. Cette clé doit porter le même nom dans
       chacune des tables à apparier. Les tables indiquées après MERGE sont lues
       simultanément.
       Syntaxe :
       MERGE nom_de_table1 <(IN=nom_de_variable)>
         ….
               nom_de_tablen <(IN=nom_de_variable)> ;
         BY <liste_de_variables> ;
       En l’absence d’instruction BY, l’appariement se fait ligne à ligne, ce qui dans la
       plupart des cas n’a que peu d’intérêt. En fait, l’appariement est surtout utile quand il
       est fait relativement à une clé commune aux différentes tables en entrée. Cette clé
       est inscrite dans l’instruction BY.
       Les fichiers en entrée doivent être triés, dans le même ordre, selon la liste de
       variables énoncées dans l’instruction BY.
       Exemple
       Pour l’étude de la relation herbivores-environnement, on dispose également d’une
       autre table indiquant la densité au km_ de neuf gros herbivores dans dix zones. Les
       herbivores sont étiquetés comme suit : A=Elephant, B=Warthog, C=Hippopotame,
       D=Reebuck, E=Watrbuck, F=Kob, G=Topi, H=Bushbuck et I=Buffle.
       Obs    Zone    A     B       C D E     F G H    I
        1    1 1     1     15      0 7 9     0 0 12
        2    2 2     0      0     0 0 1     0 0 5
        3    3 3     3     28      0 3 2     0 1 7
        4    4 3     8      1     0 10 0     0 3 25
        5    5 1     1     13      0 1 6     0 0 21
        6    6 4     3     21      0 4 0     0 1 18
        7    7 2     1      1     0 2 44     0 0 13
        8    8 2     1      4     0 1 10     0 0 18
        9    9 0     4      2     1 0 78    30 0 22
       10    10 0      2      6    0 0 71    83 0 17
       On apparie les tables présentant les caractéristiques physiques des zones étudiées
       et la densité au km_ des herbivores des 10 zones.
       proc sort data=parc1;
        by Zone;
       run;

       proc sort data=parc2;
        by Zone;
       run;

       data parc;
        merge parc1 parc2;
        by Zone;
       run;




                                                                                            47
On obtient la table SAS suivante:
Obs   ZONE   HERB     BOSQUET   EAU        HIPPO      A       B   C     D   E        F    G    H    I
 1    1      courte   oui       proche     moyen      1       1   15    0   7        9    0    0    12
 2    2      haute    oui       éloignée   aucun      2   0       0 0   0   1    0   0    5
 3    3      courte   oui       proche     aucun      3   3       28    0   3    2   0    1    7
 4    4      courte   oui       proche     importan   3   8       1     0   10   0   0    3    25
 5    5      courte   oui       moyenne    aucun      1   1       13    0   1    6   0    0    21
 6    6      courte   oui       proche     aucun      4   3       21    0   4        0    0    1    18
 7    7      courte   non       éloignée   aucun      2   1       1     0   2        44   0    0    13
 8    8      courte   oui       moyenne    importan   2   1       4     0   1        10   0    0    18
 9    9      courte   non       éloignée   aucun      0   4       2     1   0        78   30   0    22
10    10     courte   non       éloignée   aucun      0   2       6     0   0        71   83   0    17


L’option IN= n’est pas indispensable. Elle permet de sélectionner des observations
selon le fichier d’origine. Si par exemple on ne veut sélectionner que les
observations de la table1, les instructions seront les suivantes :
MERGE         nom_de_table1(IN=A)
              ….
              nom_de_tablen;
      BY <liste_de_variables> ;
      IF A ;
Les observations absentes de la table 1 seront exclues de la table résultante.

On a ainsi 4 types de jointures possibles :
      Jointure complète                     Jointure à gauche
        (Jointure sans                            (IF A)
          condition)




      Jointure à droite                    Jointure interne (ou
           (IF B)                            jointure stricte)
                                               (IF A ; IF B)




Lorsqu’on utilise l’instruction BY avec l’instruction MERGE, la table doit être
préalablement triée ou indexée en fonction d’une ou plusieurs variables BY. On doit
alors trier les données à l’aide de la procédure SORT, dont la syntaxe est :
PROC SORT DATA=table_SAS1 OUT=table_SAS2 ;
 BY <DESCENDING> variable(s);
RUN;
La procedure SORT :
• réorganise les observations dans une table SAS
• crée une nouvelle table SAS comprenant les observations réorganisées
• remplace la table SAS d’origine par la table par défaut
• peut trier en ordre croissant ou décroissant
• ne génère pas de sorties imprimées
• traite les valeurs manquantes comme la plus petite valeur possible.




                                                                                                         48
       Exemple : On veut fusionner les tables les tables EMPLOYES et SALAIRES et ne
       garder que les observations communes aux deux tables.
              EMPLOYES                            SALAIRES
         EMP_ID  FIRSTNAME               EMP_ID      EMP_SALARY
       1         RONALD                 2           28 605
       2         ALICE                  4           51 690
       4         JORN                   6           84 542

       data STAFF;
        merge EMPLOYES(IN=EMPS) SALAIRES(IN=SAL);
        by EMP_ID;
        if EMPS=1 and SAL=1 then output;
       run;

4. 6. 3. Résolution de conflits de données

       SAS convertit automatiquement une valeur de type caractère en une valeur de type
       numérique lorsque la valeur de type caractère est utilisée dans un contexte
       numérique tel que :
       • affectation à une variable numérique,
       • opération arithmétique,
       • comparaisons logiques avec une valeur de type numérique,
       • fonction qui accepte un argument de type numérique.

       Exemple : On a 7 fichiers correspondant à la classification des fonctions de santé :
       •   fichier H1 : capital formation of health care provider institutions
       •   fichier H2 : education and training of health personnel
       •   fichier H3 : research and development in health
       •   fichier H4 : food, hygiene and drinking water control
       •   fichier H5 : environmental health
       •   fichier H6 : administration and provision of social services in kind to assist living
           with diseases and impairments
       •   fichier H7 : administration and provision of health-related cash-benefits.
       Dans chacun des fichiers, on a deux variables caractères : le code au 2ème niveau
       (CODE) et l’intitulé de la fonction (LIBELLE). Par exemple, pour le fichier H1 :
       1. In-patient curative care
       2. Day cases of curative care
       3. Out-patient curative care.
       En fait, le code de ces fonctions est respectivement 11, 12, et 13.
       Donc si on envisage de fusionner ces 7 fichiers, il faut alors préalablement
       transformer les codes dans chaque fichier. Pour le fichier 1 par exemple, il suffit de
       faire :
       CODE = CODE+10 ;
       La variable code sera alors automatiquement convertie en variable numérique.

       Utilisation de la fonction INPUT pour convertir des données de type caractère
       en données de type numérique
       On peut effectuer une conversion explicite de type caractère à numérique grâce à
       l’option INPUT :
       INPUT(variable,nom-informat)
       Le nom-informat doit contenir un point dans le nom (exemple : mmddyy10.).
       En fait, on procèdera en deux étapes :
       1. On renomme la variable.




                                                                                              49
            2. On crée une nouvelle variable avec le même nom que celui de la variable
               originale à l’aide de la fonction INPUT.

                                          Fonctions de conversion
                    Fonction                  Description                  Exemples
                                       Conversion d’une
                                                               ‘Année ’!!PUT(YEAR(16436),4.)
             PUT(varNum,format.)       variable numérique en
                                                               _’Année 2004’
                                       variable caractère
                                       Conversion d’une
                                                               INPUT(‘2004/12/31’,yymmdd10.)
             INPUT(varCar,informat.)   variable caractère en
                                                               _16436
                                       variable numérique


4. 7. Procédures connexes à la manipulation de données avec l’étape Data

     Nous allons maintenant aborder des procédures connexes à la manipulation de données
     avec l’étape Data :
     • la PROC FORMAT (qui permet de définir des formats personnalisés),
     • la PROC SQL (où l’on programme en langage SQL des fonctionnalités assez analogues
        à l’étape Data ou à d’autres procédures),
     • la PROC CONTENTS (qui produit la liste des caractéristiques d’une table et le
        dictionnaire de ses variables),
     • la PROC SORT (qui trie une table),
     • la PROC PRINT (qui permet d’éditer des listings),
     • la PROC DATASETS (qui permet d’effectuer des opérations globales sur les tables :
        copie, destruction, attribution d’un nouveau nom…).

     4. 7. 1. Notion de format

            Le logiciel SAS propose une large palette de formats prédéfinis. Mais il arrive
            souvent que l’on ait besoin de définir des formats personnalisés. Ces types de
            formats sont créés et gérés par la procédure format.
            Un format permet de regrouper plusieurs modalités sous un même libellé. On
            distingue des formats caractères, appliqués à des variables caractères, et des
            formats numériques, appliqués à des variables numériques.
            On aura donc deux étapes distinctes :
            • création et gestion de formats : PROC FORMAT
            • utilisation de formats : instructions de FORMAT existants dans de nombreuses
               PROC.
            Syntaxe :
                 PROC FORMAT <LIB=bibliothequeDeSTockage> <liste d’options> ;
                    VALUE nom_de_format
                    liste_de_valeurs=’valeur1 formatée’
                    …
                    liste_de_valeurs=’valeurn formatée’
                    ;
                 RUN ;
            Plusieurs instructions VALUE peuvent être utilisées dans la même procédure
            FORMAT.
            Tous les formats sont stockés dans un catalogue FORMATS de la bibliothèque
            précisée via l’option LIB. Par défaut, ce catalogue est dans la bibliothèque WORK.
            Les formats créés ne sont alors disponibles que le temps de la session SAS, et la
            procédure doit être réexécutée lors d’une autre session pour recréer les formats.
            Le nom du format doit s’écrire avec au maximum 8 caractères ($ inclus), sauf à
            partir de la version 9, où cette longueur maximale passe à 32 caractères ($ inclus).



                                                                                               50
Les caractères autorisés dans le nom d’un format sont les mêmes que pour les
noms de variables. Les chiffres ne sont pas autorisés ni comme premier, ni comme
dernier caractère. Le point terminant le nom du format n’est pas cité dans
l’instruction VALUE.
Dans les valeurs à formater, majuscules et minuscules doivent être respectée.
Chaque liste de valeurs peut être composée :
   d’une valeur simple : exemple :75=’Paris’
   d’une liste continue de valeurs :exemple :92-94=’Petite couronne’
   d’une liste exhaustive de valeurs :exemple :92.93.94=’Petite couronne’
   d’une liste discontinue de valeurs :exemple :75.77.78.91-95=’région Parisienne’

Format de type numérique
Par exemple, pour créer un format permettant le regroupement d’âges en classes
quinquennales, un masque serait créé de la manière suivante :
PROC FORMAT ;
      VALUE FQUIN
           15-19=’15 à 19 ans’
           20-24=’20 à 24 ans’
           25-29=’25 à 29 ans’
           30-34=’30 à 34 ans’
           35-39=’35 à 39 ans’
           40-HIGH=’40 ans et plus’
           ;
RUN ;
L’application de ce masque à toute variable permet de regrouper les modalités 15,
16, 17, 18 et 19 au sein d’une même modalité étiquetée « 15 à 19 ans ».
La valeur de gauche doit être inférieure à celle de droite. Pour exclure une borne de
l’intervalle, un signe < sera placé immédiatement à gauche ou à droite du tiret. On
peut utiliser en guise de borne pour les intervalles les mots-clés HIGH et LOW. Ces
mots-clés sont sans guillemets.
• valeur1 – valeur 2        les deux bornes de l’intervalle sont incluses
• valeur1 <- valeur 2 la borne inférieure est exclue, tandis que la borne
                            supérieure est incluse
• valeur1 -< valeur 2       la borne inférieure est incluse, la borne supérieure exclue
• valeur1 <-< valeur 2 les deux bornes de l’intervalle sont exclues

PROC FORMAT LIBRARY=base.formats;
  VALUE Fnbenf
       LOW-2=’Moins de 2 enfants’
      3<-<5=’De 3 à 4 enfants’
      5-HIGH=’Plus de 5 enfants’
;
RUN ;
Cet exemple crée un format pouvant être appliqué au nombre d’enfants. La valeur 3
sera affichée telle qu’elle car elle n’appartient à aucune tranche du format Fnbenf
défini ici.

Format de type caractère
Pour créer un format caractère, il faut faire précéder le nom du format par le signe $
et mettre les valeurs définies entre quotes. Le regroupement de modalités
qualitatives s’effectuera de la manière suivante :




                                                                                    51
PROC FORMAT ;
   VALUE $ REGION
   ‘Paris’,‘Hauts-de-Seine’,’Seine-Saint-Denis’,’Val-de-Marne’,’Yvelines’,‘Val
   d’Oise’,’Seine et Marne’=’Ile-de-France’
   ‘Morbihan’,’Ile et Villaine’,’Côtes d’Armor’,’Finistère’=’Bretagne’
   …
;
Mots clés réservés :
• la valeur LOW désigne la plus petite valeur rencontrée dans la table
• la valeur HIGH désigne la plus grande
• la modalité OTHER désigne toutes les valeurs non prévues par les autres
   classes.

Description de formats existants
Lorsqu’on dispose d’un catalogue de formats assez volumineux, il est fréquent que
l’on souhaite visualiser le codage d’un format donné (passage des valeurs initiales
aux valeurs formatées). Pour cela, il suffit d’utiliser la procédure FORMAT avec
l’instruction SELECT ou EXCLUDE en conjonction de l’option FMTLIB. La fenêtre
Output contient alors des tableaux récapitulatifs des formats créés. Ils sont affichés
par ordre alphabétique de leurs noms.
Exemples :
proc format lib=a fmtlib;
 select quin;
run;




proc format lib=a fmtlib;
 exclude quin;
run;




Utilisation des formats personnalisés

Les formats personnalisés sont utilisables au même titre que les formats prédéfinis.
Ils peuvent être utilisés pour formater l’affichage des données dans les tables ou
dans certaines procédures.
Si les formats que l’on souhaite utiliser sont stockés dans une bibliothèque autre
que WORK, alors l’instruction OPTION FMTSEARCH = (mabib1 mabib2 WORK) ;
est nécessaire pour y accéder. SAS ne recherche des formats que dans les
bibliothèques énumérées : il est indispensable donc de préciser également la
librairie WORK.




                                                                                   52
       Exemple
       option fmtsearch=(a WORK);

       proc print data=recensement;
        var age;
        format age fqui.;
       run;

       Le format appliqué à la variable age a pour effet de la transformer en 6 classes (si
       tous les âges sont compris sont supérieurs ou égaux à 15).

       Si un même format s’applique à plusieurs variables, on indiquera la liste des
       variables sur lesquelles il s’applique (séparées par des blancs), suivi du nom du
       format (suivi de .). S’il s’agit d’un format pour une variable caractère, il sera
       précédé de $, comme par exemple : format dpt $region. ; pour appliquer le format
       region aux départements.

4. 7. 2. Une alternative à l’étape Data : la procédure SQL

       Le SQL (Structured Query Language) est le langage universel de gestion des
       données informatiques des SGBD relationnels. La procédure SQL permet d’obtenir
       un bon nombre de résultats similaires à ceux d’une étape Data.
       Elle permet entre autres de :
       • créer une vue logique ou une table
       • lister le contenu d’une table en se restreignant à certaines variables et certaines
            observations
       • réaliser des fusions et des jointures entre des tables
       • trier une table
       • synthétiser une table à l’aide de statistiques.
       Syntaxe :
       PROC SQL <option(s)> ;
        Instructions en langage SQL ;
       QUIT ;
       Entre les deux instructions PROC SQL et QUIT, le seul langage autorisé est le
       SQL.

       Extraction de données
       Une table SAS peut être créée par la commande CREATE TABLE. La table SAS
       reçoit ainsi un nom et des variables. La table existe physiquement mais elle est vide
       de données.
       Syntaxe :
       PROC SQL ;
       CREATE TABLE nom_de_table (
           variable1 type1(long1) <LABEL=’label1’ FORMAT=fmt1 INFORMAT=inf1>,
           variable2 type2(long2) <LABEL=’label2’ FORMAT=fmt1 INFORMAT=inf1>,
           variable3 type3(long3) <LABEL=’label3’ FORMAT=fmt1 INFORMAT=inf1>,
           );
       QUIT ;
       Le type peut être :
       • CHAR : alphanumérique
       • NUM : numérique
       • INTEGER : entier (pas besoin de préciser la longueur).
       L’instruction INFORMAT indique quel est le format de lecture, l’instruction FORMAT
       quel est le format de sortie (écriture).




                                                                                         53
Exemple : créer la table PARC avec les variables :
   Zone (ZONE), entier
   Hauteur de l’herbe (HERB), caractère (longueur 6)
   Présence de bosquets (BOSQUET), caractère (longueur 3)
   Accès à l’eau (EAU), caractère (longueur 8)
   Présence d’hippopotames (HIPPO), caractère (longueur 8)
proc sql;
 create table parc(
 ZONE integer label='zone',
 HERB char(6) label='hauteur de l"herbe',
 BOSQUET char(3) label='présence de bosquets',
 EAU char(8) label='accès à l"eau',
 HIPPO char(8) label='présence d"hippopotames');
quit;

Chaque définition de variable est séparée par une virgule.

La commande SELECT

Syntaxe :
SELECT variable <,variable>…
     FROM nom_de_table ou nom_de_vue <,nom_de_table ou nom_de_vue>…
     <WHERE expression>
     <GROUP BY variable <,variable…>…>
     <HAVING expression>
     <ORDER BY variable <,variable>…>;
La commande SELECT permet de rechercher des informations par une sélection
selon différents critères : on liste les variables (séparées par des virgules) dans
l’ordre d’apparence voulu.
Pour sélectionner toutes les variables d’une table, l’astérisque (*) peut être utilisée à
la place de la liste de toutes les variables. Il faut préciser dans quelle table les
données sont stockées avec FROM suivi du nom de la table.
Exemple
proc sql;
 select ZONE, HERB
 from parc3
 where ZONE>6;
quit;
Le résultat d’une requête SELECT est par défaut affiché dans l’OUTPUT :
                                    ZONE HERB
                                    ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
                                    7       courte
                                    8       courte
                                    9       courte
                                    10      courte
                                    11      courte
                                    12      haute
                                    13      courte

Mais elle peut aussi être une table SAS en utilisant la syntaxe suivante :
    CREATE TABLE nom_de_table
    AS SELECT…




                                                                                      54
Exemple : on sélectionne toutes les variables pour les zones 7 et plus.
proc sql;
 create table extract
 as select *
 from parc3
 where ZONE>6;
quit;

La commande WHERE

La clause WHERE permet de spécifier un critère de sélection, appelé prédicat.
Le prédicat est une expression logique composée d’une suite de conditions
combinées entre elles par les opérateurs logiques AND, OR ou NOT et des
parenthèses.
Un élément d’une expression logique peut prendre les formes suivantes :
• comparaison à une valeur
• comparaison à une fourchette de valeurs (BETWEEN)
• comparaison à une liste de valeurs (IN)
• comparaison à un filtre (LIKE) : _ remplace 1 caractère, % remplace 1 ou
   plusieurs caractères.
Exemple : créer une table EXTRACT des zones 7 et plus et dont l’accès à l’eau
contient la chaîne de caractère « loig ».
proc sql;
 create table extract
 as select *
 from parc3
 where ZONE>6 and
       EAU like '%loig%';
run;

On obtient la table EXTRACT suivante :
Obs ZONE HERB        BOSQUET EAU     HIPPO

1    7 courte                         non     éloignée    aucun
2    9 courte                         non     éloignée    aucun
3   10 courte                         non     éloignée    aucun
4   12 haute                          oui    éloignée    aucun


La clause ORDER BY
La clause ORDER BY permet de trier le résultat de la requête d’après la valeur
d’une ou plusieurs variables. En ajoutant DESC, on précise l’ordre décroissant. Par
défaut, le tri se fait par ordre croissant.
Syntaxe :
    ORDER BY variable1 <DESC>, variable2 <DESC>…

Les options suivantes de la proc SQL permettent de restreindre le nombre
d’observations traitées :
INOBS=n         restreint à n le nombre d’observations de chaque table à incorporer
                (les n premières). Ceci est utile pour tester des requêtes sur des
                fichiers très longs. Il suffit alors de choisir un n petit… puis d’ôter cette
                option si la requête donne satisfaction.
OUTOBS=n        restreint à n le nombre d’observations en sortie (les n dernières).




                                                                                          55
Exemple : trier la table parc3 par la variable ZONE (ordre descendant) et ne
conserver que les variables ZONE, HIPPO, EAU et la dernière observation pour
laquelle il existe un bosquet.
proc sql outobs=1;
 select ZONE,HIPPO,EAU
 from parc3
 where BOSQUET='oui'
 order by ZONE desc;
run;

Il s’affiche dans la fenêtre OUTPUT :
                       ZONE HIPPO EAU
                       ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
                       13 aucun proche


Supprimer les doublons : option DISTINCT
Par défaut, la procédure SQL affiche le résultat d’une requête sans éliminer les
doublons. Il est possible de ne garder qu’un exemplaire de chaque ligne en ajoutant
DISTINCT dans la clause SELECT.
Exemple :
proc sql;
 select distinct HERB, BOSQUET, EAU
 from parc3
 order by HERB desc;
run;
Elimine les doublons sur les variables HERB, BOSQUET et EAU.
Dans la fenêtre OUTPUT s’affiche le résultat suivant :
                  HERB BOSQUET EAU
                  ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
                  haute oui     éloignée
                  courte non     éloignée
                  courte oui    moyenne
                  courte oui    proche


Regrouper les modalités d’une variable : la clause GROUP BY

La clause GROUP BY permet de regrouper les modalités d’une variable. Cette
clause est utilisée uniquement lorsque la requête utilise une fonction de groupe.
Sans la clause GROUP BY, la somme est effectuée sur la totalité de la table.
SELECT fonction (variable)
    FROM table
    GROUP BY variable1, variable2…
L’expression HAVING permet d’opérer sur un sous-ensemble d’observations de la
table. C’est l’équivalent du WHERE appliqué au groupe. La clause GROUP BY doit
toujours précéder une expression HAVING et définit le groupe sur lequel
l’expression HAVING va opérer. On utilise l’expression HAVING lorsque la requête
utilise une fonction de groupe (AVG, COUNT…).
Exemple : HAVING expression sur le résultat d’une fonction somme
SELECT fonction(variable) AS nomvar
    FROM table
    GROUP BY variable1, variable2…
    HAVING nomvar expression




                                                                                56
Exemple

proc sql;
 select mean(Gini) as Mgini
 from pays.russet
 group by Demo
 having Mgini>70;
quit;
Regroupement par type de régime (Demo) et calcul de la moyenne des coefficients
de gini. Sélection des observations pour lesquelles la moyenne (Mgini) est
supérieure à 70.

Les fonctions

Les fonctions de groupe effectuent un calcul sur l’ensemble des observations d’une
table spécifiée après la clause FROM ou sur chaque groupe défini par une clause
GROUP BY.
Ces fonctions sont les suivantes :
        MEAN, AVG : moyenne
        COUNT, N : compte le nombre de valeurs non manquantes
        CV : coefficient de variation
        MAX : donne la plus grande valeur d’une variable
        MIN : donne la plus petite valeur d’une variable
        SUM : somme
        VAR : variance
Syntaxe :
SELECT      fonction1(variable) <AS nomvar1 LABEL=’label’>,
            fonction2(variable) <AS nomvar2 LABEL=’label’>,
    FROM table
    GROUP BY variable
AS permet de donner un nom à la variable résultat lorsque l’on crée une table en
sortie (CREATE TABLE).
LABEL permet d’associer un label à la colonne.
Exemple : calculer la moyenne du coefficient de gini, les coefficients minimal et
maximal de gini par type de régime pour la table pays.russet.
proc sql;
 select Demo,
 avg(Gini) LABEL='Moyenne des coefficients de Gini',
 min(Gini) LABEL='Coefficient minimal',
 max(Gini) LABEL='Coefficient maximal'
 from pays.russet
 group by Demo;
quit;
On obtient la sortie suivante :
           Moyenne des
          coefficients Coefficient Coefficient
       Demo      de Gini minimal maximal
     ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
                  1 63.88667       45.8      92.9
                  2 74.06364         47     93.8
                  3     75.3     43.7     93.8




                                                                               57
L’expression when

Cette expression permet de changer la représentation des données en donnant un
code chiffré à une chaîne de caractères ou inversement, en donnant à un code un
intitulé plus significatif.
SELECT variables,
    CASE WHEN expression THEN valeur1
            WHEN expression THEN valeur2
            …
            ELSE valeurn
    END
    <AS sortie LABEL=’Libellé’>
AS permet de donner un nom à la nouvelle colonne.
Exemple : on recode en binaire la variable HIPPO : 1 si présence d’hippopotames,
0 sinon.
proc sql;
 select *,
 case when HIPPO='aucun' THEN 0
 else 1
 end
 as BIN_HIP
 from parc3;
run;
On obtient la sortie suivante :
     ZONE HERB BOSQUET EAU            HIPPO BIN_HIP
   ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
       1 courte oui    proche moyen 1
       2 haute oui    éloignée aucun 0
       3 courte oui    proche aucun 0
       4 courte oui    proche importan 1
       5 courte oui    moyenne aucun 0
       6 courte oui    proche aucun 0
       7 courte non     éloignée aucun 0
       8 courte oui    moyenne importan 1
       9 courte non     éloignée aucun 0
      10 courte non     éloignée aucun 0
      11 courte oui    proche importan 1
      12 haute oui     éloignée aucun 0
      13 courte oui    proche aucun 0


Les jointures

Pour écrire une jointure, il suffit de citer les variables recherchées dans la clause
SELECT, et de préciser dans la clause WHERE (ou ON) la condition d’égalité entre
les variables qui réalisent la jointure entre les tables. La clause FROM doit contenir
le nom de toutes les tables à lier.
Dans la clause FROM, il est possible de donner un alias à une table :
   FROM nom de la table AS alias
Ceci est utile lorsque les tables à joindre ont des variables qui ont le même nom. On
désigne alors la variable par alias.variable.
1/ La condition de fusion des tables est exprimée dans une clause WHERE. Elle
   peut porter sur plusieurs variables.
    FROM table1, table2
    WHERE condition
    Cette jointure correspond au cas IF A AND IF B du merge en SAS de base. On
    sélectionne uniquement les observations communes.



                                                                                   58
    PROC SQL ;
     SELECT a.*, b.*
     FROM table1 AS a,
           table2 AS b
     WHERE a.var1=b.var1;
    QUIT;
2/ Jointure à gauche : la condition de fusion des tables est exprimée dans une
   clause ON.
    FROM table1 LEFT JOIN table2
    ON condition
    Elle correspond au cas IF A du merge.
    On sélectionne toutes les observations de la table A et les observations de la
    table B qui correspondent (ON).
    PROC SQL ;
     SELECT a.*, b.*
     FROM table1 AS a
            LEFT JOIN
            table2 AS b
     ON a.var1=b.var1;
    QUIT;
3/ Jointure à droite :
    FROM table1 RIGHTJOIN table2
    ON condition
    Elle correspond au cas IF B du merge.
    On sélectionne toutes les observations de la table B et les observations de la
    table A qui correspondent (ON).
    PROC SQL ;
     SELECT a.*, b.*
     FROM table1 AS a
            RIGHT JOIN
            table2 AS b
     ON a.var1=b.var1;
    QUIT;
4/ Jointure « full »
    FROM table1 FULL JOIN table2
    ON condition
    Elle correspond au merge by sans condition.
    On sélectionne toutes les observations de la table A et toutes les observations
    de la table B en mettant les observations communes en correspondance.
    PROC SQL ;
     SELECT a.*, b.*
     FROM table1 AS a
            FULL JOIN
            table2 AS b
     ON a.var1=b.var1;
    QUIT;
    Cette méthode de jointure pose en fait un problème. Pour les observations de
    table2 qui n’étaient pas dans table1, var1 n’est pas renseignée dans la table ou
    la sélection résultante. Aussi, la jointure full n’est intéressante que si les deux
    tables contiennent les mêmes observations. Sinon, il est préférable d’effectuer
    la fusion à partir d’une étape data, avec l’instruction merge.




                                                                                    59
5/ Produit cartésien
   On fusionne chaque observation de la table A avec chaque observation de la
   table B. Si A contient na observations et B nb observations, le résultat contient
   naXnb lignes.
   PROC SQL ;
    SELECT a.*, b.*
    FROM table1 AS a
          table2 AS b;
   QUIT;
6/ Jointure d’une table avec elle-même
   Il est possible de faire une jointure d’une table avec elle-même pour obtenir
   davantage d’informations.
   Exemple : Nous avons la table EMPLOI avec les variables
   Empnum (numéro de l’employé)
   Empnom (nom de l’employé)
   Emptitre (titre de l’employé)
   Numsup (numéro du supérieur)
   EMPNUM              EMPNOM                  EMPTITRE        NUMSUP
   101                 John           head man.       .
   201                 Betty          manager 101
   213                 Joe            respvent 201
   214                 Jeff           respvent 201
   401                 Sam            manager 101
   412                 Nick           respvent 401

   Construire une table avec pour chaque employé le nom de son supérieur
   hiérarchique (nomsup) et son titre (titresup).
   proc sql;
    select a.*,
    b.EMPNOM as SUPNOM,
    b.EMPTITRE as SUPTITRE
    from emploi as a,
      emploi as b
    where a.NUMSUP=b.EMPNUM;
   quit;

   EMPNUM    EMPNOM       EMPTITRE    NUMSUP          SUPNOM            SUPTITRE
   101       John         head man.   .
   201       Betty        manager     101             John              head man.
   213       Joe          respvent    201             Betty             manager
   214       Jeff         respvent    201             Betty             manager
   401       Sam          manager     101             John              head man.
   412       Nick         respvent    401             Sam               manager




                                                                                    60
L’union

L’opérateur UNION est un opérateur ensembliste. Il effectue l’union des résultats de
deux requêtes SELECT, c’est à dire qu’à partir de deux tables résultats, il en crée
une troisième comportant l’ensemble des observations des deux tables de départ,
en éliminant les doublons parfaits et en triant selon l’ordre des variables dans la
commande select.
PROC SQL ;
     SELECT variables
     FROM table1
     UNION
     SELECT variables
     FROM table2 ;
QUIT ;
Exemple :
PROC SQL ;
     CREATE TABLE table3 AS
     SELECT *
     FROM table1
     UNION
     SELECT *
     FROM table2 ;
QUIT ;
Cette étape correspond dans ce cas à :
DATA table3 ;
     SET table1 table2 ;
RUN;
PROC SORT DATA=table3 noduplicates;
     BY _ALL_;
RUN;

La commande INSERT INTO
Cette commande est utilisée pour insérer des observations dans une table. Elle
nécessite le nom de la table, le nom des variables à initialiser et la valeur à leur
assigner.
INSERT INTO table
    SET variable1=valeur1, variable2=valeur2…
Exemple : insérer une observation dans la table parc
proc sql;
 insert into parc3
 set ZONE=14, HERB='haute', BOSQUET='non', EAU='éloignée',
 HIPPO='moyen' ;
quit;

Associée à une clause SELECT, cette commande permet de copier un sous-
ensemble d’une table dans une autre. La table cible doit exister préalablement, et
les types de données doivent correspondre de façon très précise.




                                                                                 61
Exemple : insérer des observations de la table parc4 (zone 14 à 20) dans la table
parc3
proc sql;
 insert into parc3
 select *
 from parc4
 where ZONE>13;
quit;
On peut également insérer les valeurs de chaque observation avec l’instruction
VALUES.
INSERT INTO table
    VALUES (valeur1, valeur2, valeur3…)
Exemple : insérer 5 observations dans la table parc3
proc sql;
 insert into parc3
 values(15,'haute','oui','proche','moyen')
 values(16,'courte','non','proche','moyen')
 values(17,'haute','oui','proche','aucun')
 values(18,'haute','non','éloignée','moyen')
 values(19,'courte','non','éloignée','importan');
quit;

La commande UPDATE
La commande UPDATE spécifie le nom de la table qui va être modifiée, suivi d’une
clause SET définissant les modifications à apporter, et d’une clause WHERE avec
le critère précisant les observations à modifier.
UPDATE TABLE
    SET variable1=valeur1, variable2=valeur2…
    WHERE condition
Pour modifier toutes les observations d’une table, il n’est pas nécessaire d’inclure
une clause WHERE.
Exemple : remplacer la modalité ‘éloignée’ de la variable EAU par ‘loin’ :
proc sql;
 update parc3
 set EAU='loin'
 where EAU='éloignée';
quit;

La commande DELETE

Cette commande consiste en une clause DELETE FROM spécifiant le nom de la
table concernée, et d’une clause WHERE avec le critère précisant les observations
à supprimer.
DELETE FROM table
    WHERE condition
Exemple : détruire les observations des zones 14 et plus.
proc sql;
 delete
 from parc3
 where ZONE>13;
quit;




                                                                                 62
4. 7. 3. La procédure CONTENTS : afficher le contenu d’une table

       PROC CONTENTS affiche la description d’une table : nombre d’observations,
       nombre de variables, liste et position des variables.
       Syntaxe :
       PROC CONTENTS <DATA=nom_de_table> ;
             <OUT=> ;
       RUN ;
       OUT= : stocke le résultat de la demande dans une table SAS.
       Le listing qui en résulte se présente en quatre grandes parties. L’exemple suivant
       est la description de la table chien1.
       La première partie recense les grandes caractéristiques de la table. On y retrouve
       son nom, la version de SAS qui l’a créée, sa date de création et sa date de dernière
       modification, son nombre d’observations et de variables, si la table présente un tri,
       etc.
        Data Set Name      WORK.CHIEN1                Observations    27
        Member Type        DATA                 Variables        8
        Engine        V9                 Indexes          0
        Created       jeudi 30 décembre 2004 18 h 43 Observation Length 80
        Last Modified    jeudi 30 décembre 2004 18 h 43 Deleted Observations 0
        Protection                       Compressed          NO
        Data Set Type                       Sorted          YES

       La deuxième partie traite des caractéristiques physiques de cette table. Cette partie
       présente peu d’intérêt.
           Data Set Page Size        8192
           Number of Data Set Pages 1
           First Data Page        1
           Max Obs per Page           101
           Obs in First Data Page 27
           Number of Data Set Repairs 0
           File Name            C:\DOCUME~1\WOLBER_O\LOCALS~1\Temp\SAS Temporary Files\_TD1256\chien1.sas7bdat
           Release Created          9.0101M3
           Host Created          XP_PRO

       La partie suivante présente les caractéristiques des différentes variables.
               Alphabetic List of Variables and Attributes

       # Variable      Type Len Format Informat Label

       6   AFFECTION    Num     8                AFFECTION
       7   AGRESSIVITE Num        8                AGRESSIVITE
       8   FONCTION     Num    8                 FONCTION
       5   INTELLIGENCE Num       8                INTELLIGENCE
       1   NOM       Char 22 $22.         $22.    NOM
       3   POIDS     Num    8                  POIDS
       2   TAILLE    Num    8                  TAILLE
       4   VELOCITE    Num    8                 VELOCITE

       Enfin, une dernière partie, facultative, décrit le tri dont la table fait éventuellement
       l’objet :
                          Sort Information

       Sortedby    NOM TAILLE POIDS VELOCITE INTELLIGENCE AFFECTION AGRESSIVITE FONCTION
       Validated YES
       Character Set ANSI
       Sort Option NODUPKEY

       PROC CONTENTS peut également afficher la liste de toutes les variables
       présentes dans une librairie.
       Il suffit alors de coder PROC CONTENTS DATA=nom_de_librairie._ALL _;




                                                                                                            63
4. 7. 4. La procédure SORT : trier une table selon une clé

       PROC SORT est utilisée afin de trier les observations d’une table SAS selon une ou
       plusieurs variables. Les observations, une fois triées, peuvent être stockées dans
       une nouvelle table ou remplacer la table originale.
       Syntaxe :
            PROC SORT DATA=nom_de_table OUT=nom_de_table ;
               BY <DESCENDING> variable1…<DESCENDING> variablen;
       DATA=nom_de_table              Table SAS en entrée à trier.
       OUT=nom_de_table               Table SAS en sortie. Si cette option est absente, la table
                                      d’origine est remplacée par la table triée.
       La spécification des clés de tris (variables selon les valeurs desquelles la table sera
       ordonnée) se fait dans l’instruction BY : les noms des variables y sont énumérés à
       la suite, séparés par au moins un espace. La première variable citée servira à
       ordonner les observations ; en cas d’ex aequo, la deuxième variable (si l’instruction
       en compte plusieurs) servira à les ordonner et ainsi de suite…
       Par défaut, le tri selon chacune de ces variables est ascendant. Pour préciser que
       l’ordre de tri est décroissant selon une des variables, son nom doit être précédé du
       mot-clé DESCENDING.
       Exemple : on veut trier les pays par régime politique, puis par ordre alphabétique :
       proc sort data=pays.russet;
        by demo pays;
       run;

       L’option NODUPKEY
       L’option NODUPKEY ajoute à l’opération de tri une suppression des doublons
       observés sur les variables de tris. Ces observations en doublon étant éliminées de
       la table créée par la procédure SORT, il est recommandé de combiner
       systématiquement l’emploi des options NODUPKEY et OUT.
       Cette option ne recherche que les doublons sur les variables citées dans
       l’instruction BY. Si on veut éliminer les observations exactement identiques, on
       utilisera l’instruction BY _ALL_.
       Exemple :
       proc sort data=chien out=chien1 nodupkey;
        by _all_;
       run;
       La procédure SORT avec l’option NODUPKEY génère un message supplémentaire
       dans la fenêtre Log, indiquant le nombre de doublons expurgés :
       NOTE: There were 30 observations read from the data set WORK.CHIEN.
       NOTE: 3 observations with duplicate key values were deleted.
       NOTE: The data set WORK.CHIEN1 has 27 observations and 8 variables.




                                                                                              64
4. 7. 5. La procédure PRINT : éditer des listings

       Cette procédure est utilisée pour imprimer tout ou une partie des valeurs d’une table
       SAS. Elle permet aussi d’imprimer des totaux et sous totaux pour des variables
       numériques.
       Syntaxe :
       PROC PRINT DATA=nom_de_la_table <liste d’options> ;
          VAR liste_de_variables ;
          ID liste_de_variables ;
          BY liste_de_variables ;
          PAGEBY variable ;
          SUMBY variable ;
          SUM liste_de_variables ;
       Le mot clé DATA= permet de spécifier la table à traiter (la dernière si aucun nom de
       table n’est précisé). Ce mot clé se retrouve dans la totalité des procédures. Si la
       table est temporaire, on précisera uniquement son nom, si elle a été stockée de
       manière permanente, on la fera précéder du nom logique de la librairie de stockage
       (défini dans l’instruction LIBNAME).
       Instructions :
       VAR    liste de variables à imprimer. Toutes par défaut.
       BY     des impressions séparées sont effectuées pour chaque modalité des
              groupes BY. Le fichier doit avoir été auparavant trié ou indexé selon ces
              variables.
       ID     permet l’identification des observations sur le listing par une variable
              définie à la place du numéro d’observation.
       PAGEBY permet de contrôler les variables indiquées en BY pour lesquelles
              s’effectue la rupture de page.
       SUM    affiche le total de la (des) variable(s) citées dans l’instruction SUM. S’il y a
              également une instruction BY, un sous-total sera édité à la fin de chaque
              bloc.
       SUMBY s’utilise uniquement avec les instructions SUM et BY. Affiche un sous-
              total de la (ou des) variable(s) totalisée(s) pour chaque groupe.
       La procédure PRINT peut s’utiliser sans aucune instruction. Dans ce cas, SAS
       imprime toutes les variables et toutes les observations de la table en entrée (la
       dernière table modifiée dans la session courante si aucune table n’est spécifiée) et
       les formats d’affichage des variables sont ceux préalablement attribués aux
       variables de la table SAS.
       Ainsi, pour lister entièrement une table SAS, le programme de base est très simple.
       Par exemple, pour lister entièrement la table pays.russet :
       proc print data=pays.russet;
       run;




                                                                                           65
Les en-têtes des colonnes sont affichées avec les noms SAS des variables ;
Une colonne Obs donné le numéro de ligne des observations sur la gauche du
listing.
Quelques options de l’instruction PROC PRINT :
LABEL                   affiche le label des variables plutôt que leur nom en tête du
                        listing.
NOOBS                   supprime du listing la colonne « OBS ».
N="libellé1"…"libellén" avec l’instruction BY, on pourra préciser un libellé différent
                        par bloc. Il existe aussi un option N sans texte derrière : elle
                        ajoute en bas de listing le nombre d’observations affichées.
DOUBLE                  affiche la table avec une ligne vierge entre 2 observations.
HEADING=H ou V          spécifie l’orientation des en-têtes de colonne.
ROWS=PAGE               permet de n’imprimer qu’une liste de variables par page. Si
                        les variables ne peuvent toutes figurer sur la largeur de
                        page, le nombre maximum d’observations sera imprimé
                        pour une même série de variables sur une page, puis ces
                        mêmes observations seront inscrites pour une autre série
                        de variables sur une autre page.
L’option OUT= n’est pas valide ici.

Listing d’extraits de tables
On sélectionne des informations sur la table pays.russet (lignes et colonnes). Par
exemple, on ne veut que les démocraties stables :
proc print data=pays.russet
           (where=(demo=1)) noobs;
 id pays;
run;




                                                                                     66
Listing avec totalisation
On veut imprimer le nombre de tués lors de manifestations violentes et les sommer
en fonction de l’instabilité politique (démocratie stable, démocratie instable,
dictature). On utilise l’instruction SUM (affichage du total d’une variable) et comme
l’on souhaite simultanément obtenir des sous-totaux selon les modalités d’une
variable en catégories, on utilise simultanément l’instruction BY. L’instruction BY
demande un tri préalable de la table.
proc sort data=pays.russet;
 by demo;
run;

proc print;
 var pays deat;
 by demo;
 sum deat;
run;

On obtient dans la fenêtre Sortie l’impression suivante (on a tronqué quelques
observations) :
             The SAS System           11:15 Friday, December 31, 2004 3

--------------------------- Demo=1 ------------------------------------------

           Obs Pays            Deat

            1 Australie      0
            2 Belgique        1
            ...
           14 Suisse         0
           15 Uruguay          1
          ----          ----
          Demo              16

--------------------------- Demo=2 ------------------------------------------

            Obs Pays           Deat

            16 Argentine 217
            17 Autriche       0
            ...
            25 Japon         1
            26 RFA         0
           ----       ----
           Demo           564

--------------------------- Demo=3 ------------------------------------------

           Obs Pays              Deat

            27 Bolivie       663
            28 Brésil         1
            ...
            46 Venezuela        111
            47 Yougoslavie       0
           ----         ----
           Demo            5705
                       ====

                          6285
Exemple : on veut imprimer les recettes et les dépenses d’une multinationale par
région et par Etat. On veut les sommes par région, mais pas par Etat.
proc sort data=ventes;
 by Region Etat;
run;


                                                                                  67
       proc print data=ventes noobs;
        by Region Etat;
        sum Depenses Recettes;
        sumby Region;
        label Region='Ventes Région';
        format Recettes Depenses comma10.;
        title 'Revenue et Dépenses par Région';
       run;
       ----------------- Ventes Région=Nord Etat=Allemagne --------------------------------
                          Mois      Depenses      Recettes
                         MAR95         9,800        13,500
       ------------------ Ventes Région=Nord Etat=Italie ---------------------------------
                          Mois      Depenses      Recettes
                         FEB95         3,000         4,000
                         MAR95         6,000         5,000
                        ------    ----------    ----------
                        Region        18,800        22,500
       ------------------ Ventes Région=Sud Etat=Allemagne --------------------------------
                          Mois      Depenses      Recettes
                         FEB95         8,500        11,000
       ------------------- Ventes Région=Sud Etat=France ---------------------------------
                          Mois      Depenses      Recettes
                         JAN95         2,000         8,000
                         FEB95         1,200         6,000
                        ------    ----------    ----------
                        Region        11,700        25,000
                                  ==========    ==========
                                      30,500        47,500


4. 7. 5. La procédure DATASETS : effectuer des opérations globales sur les tables

       PROC DATASETS permet d’effectuer des opérations globales sur les tables :
       copie, destruction, attribution d’un nouveau nom…
       Syntaxe :
            PROC DATASETS LIBRARY=nom_de_librairie ;
            <DELETE> ;
       Les principales opérations couvertes par cette procédure sont :
       CONTENTS :             lister la description d’une table (analogue à PROC
                              CONTENTS)
       CHANGE ou AGE : renommer une table
       COPY :                 copier ou déplacer un ensemble de tables d’une librairie à
                              une autre
       DELETE :               détruire un ensemble de tables
       APPEND :               concaténer deux tables

       Copie de tables
            COPY OUT=librairie <IN=librairie> <MOVE> ; SELECT liste_de_tables ;
       ou
            COPY OUT=librairie <IN=librairie> <MOVE> ;EXCLUDE liste_de_tables ;
       SELECT      permet de ne recopier que certaines tables de la librairie.
       EXCLUDE indique les tables à ne pas recopier.
       IN          indique la librairie source, où se trouvent les tables à recopier.
       OUT         indique la librairie destination.
       Si le mot clé MOVE est présent, les tables seront détruites du répertoire origine
       (indiqué dans le IN), après copie.




                                                                                              68
Destruction de tables
DELETE liste_de_tables ;
Les tables mentionnées sont détruites de la librairie.

Attribuer un nouveau nom aux tables
Instruction CHANGE :
CHANGE      ancien_nom_table1=nouveau_nom_table1…
            <ancien_nom_table2=nouveau_nom_table2…> ;

Instruction AGE
AGE nom1 nom2 nom3…nomn ;
La table nom1 est renommée nom2, la table nom2 est renommée nom3, …la table
nomn est détruite.

Concaténation de tables
Deux tables ayant la même structure peuvent être mises bout à bout, la table
résultante ayant un nombre d’observations égal à la somme des observations des
deux tables existantes.
APPEND BASE=table_SAS DATA=table_SAS <FORCE>;
Par défaut, seules les variables présentes dans chacune des deux tables (même
nom, même type, même longueur) sont prises en compte dans l’opération de
concaténation.
Le mot clé FORCE permet de prendre aussi en compte :
• les variables présentes dans la table de base. Celles uniquement présentes
    dans la table mentionnée dans DATA= ne seront pas prises en compte.
• Les variables n’ayant pas le même type dans chacune des deux tables, le type
    résultant est le type de la variable présente dans la table de BASE.
• Les variables de longueur différentes, la longueur résultante est la longueur de
    la variable dans la table de BASE.




                                                                               69
5. Autres procédures
  On détaillera maintenant quelques procédures usuelles :
  •   PROC TABULATE (pour les tableaux croisés statistiques),
  •   PROC MEANS (pour le calcul de statistiques descriptives),
  •   PROC FREQ (pour l’édition de tableaux de fréquence et les tests du Chi-2 et assimilés),
  •   PROC CORR (calculs de corrélations),
  •   PROC UNIVARIATE (description de la distribution d’une variable)
  •   et PROC IML (calculs matriciels).
  On abordera en TP les principales procédures nécessaires à une analyse statistique poussée
  (régressions, ACP…).

  5. 1. Les points communs des procédures d’analyse statistique

        5. 1. 1. La sélection de l’échantillon d’étude
                Pour effectuer une sélection des observations de la table SAS spécifiée en entrée
                d’une procédure SAS, on peut utiliser l’option WHERE= :
                    PROC NOMPROC DATA=nomlib.nomtableentree (WHERE=(expression));
                      Instructions;
                    RUN;

        5. 1. 2. La sélection des variables d’analyse
                Pour sélectionner les variables analysées dans les procédures de statistique, on
                utilise généralement l’instruction VAR. Elle est valable dans un grand nombre de
                procédures statistiques, en particulier MEANS, UNIVARIATE et CORR. Les
                variables numériques sont les seules autorisées dans une instruction VAR ou les
                procédures statistiques.
                    VAR variable(s)Numérique(s) ;
                En l’absence d’une instruction VAR dans les procédures où cette dernière est
                valide, la procédure utilisera toutes les variables numériques de la table SAS en
                entrée.

        5. 1. 3. L’analyse statistique par sous-groupes
                Pour mener une analyse sur plusieurs sous-groupes d’observations, on dispose des
                instructions CLASS et BY.
                    BY <DESCENDING> variable(s) ;
                    CLASS variable(s) ;
                On obtient des résultats par sous-groupe étudié mais l’affichage des sorties de
                résultats diffère généralement selon l’emploi des instructions BY ou CLASS.




                                                                                                70
                       Différences entre les instructions BY et CLASS
                              dans les procédures de statistique
                     Instruction BY                          Instruction CLASS
         Valable dans toutes les procédures        Valable uniquement dans les
         d’analyse statistique                     procédures MEANS, UNIVARIATE et
                                                   TTEST.
         Les valeurs manquantes de chaque          Par défaut, les valeurs manquantes
         variable du BY constituent un sous-       des variables de classe ne sont pas
         groupe qui est pris en compte dans        prises en compte dans l’analyse.
         l’analyse.
         Nécessite un tri préalable de la table    Ne nécessite pas de tri préalable de la
         en entrée : tri par la même liste de      table en entrée.
         variables que celle de l’instruction BY
         et dans le même ordre.
         Pendant la phase de calcul, SAS ne        Toutes les observations de la table
         garde en mémoire que les                  sont conservées pendant la phase de
         observations d’un sous-groupe à la        calculs. On évitera CLASS pour les
         fois.                                     tables volumineuses.

5. 1. 4. Le regroupement des valeurs d’une variable
       Pour créer des sous-groupes d’observations en n’utilisant pas toutes les valeurs
       distinctes d’une variable, mais en faisant des regroupements, il est possible
       d’utiliser une instruction FORMAT combinée avec la présence d’une instruction BY,
       CLASS ou TABLE.
       Cette démarche sera utile pour mettre une variable quantitative en classes sans
       avoir à créer une nouvelle variable.

5. 1. 5. La pondération des observations
       Dans certains cas de figure, il peut s’avérer nécessaire de pondérer les
       observations de la table en entrée par les valeurs d’une variable numérique. Pour
       cela, on dispose des instructions WEIGHT ou FREQ. Les deux instructions ne
       peuvent pas être utilisées simultanément.
           WEIGHT|FREQ variableNumérique ;
       Avec ces deux instructions, les observations ayant un poids négatif ou nul sont
       ignorées dans les calculs. En outre, avec FREQ, les valeurs non entières sont
       tronquées au nombre entier inférieur.
       La principale différence est la suivante :
       • chaque valeur de l’instruction WEIGHT est considérée comme le poids de
           l’observation correspondante : le nombre d’observations renseignées considéré
           ne change pas.
       • Chaque valeur de l’instruction FREQ est considérée comme le nombre
           d’occurrences de l’observation correspondante : le nombre d’observations
           renseignées considéré est égal à la somme des pondérations données dans
           l’instruction FREQ.




                                                                                        71
5. 2. La procédure TABULATE : créer des tableaux de synthèse

     La procédure TABULATE permet de créer des tableaux de synthèse à une dimension ou
     des tableaux croisés à plusieurs dimensions.
     La procédure TABULATE s’appuie sur trois instructions particulières : CLASS, VAR et
     TABLE.
     Syntaxe :
          PROC TABULATE DATA=tableSAS <options> ;
                CLASS variable(s) ;
                VAR variable(s)_de_calcul ;
                TABLE (structure des lignes du tableau),
                       (structure des colonnes du tableau)*
                       (calculs apparaissant dans les cases du tableau)
                ;
          RUN ;
     •   CLASS permet de lister les variables qui spécifient des catégories. Ces catégories
         constituent des lignes et/ou des colonnes du tableau. Par défaut, les valeurs
         manquantes de ces variables n’apparaissent pas dans le tableau ;
     •   VAR identifie une ou plusieurs variables numériques comme étant celles sur lesquelles
         des statistiques seront calculées. Les valeurs manquantes de ces variables ne
         participent pas aux calculs des statistiques.
         En l’absence de statistiques et de variables numériques citées dans VAR, la procédure
         TABULATE produit des comptages d’observations (N).
     •   TABLE est une instruction obligatoire. Elle permet de spécifier l’organisation du tableau
         ainsi que son aspect. On y décrit les variables à mettre dans le tableau, les statistiques
         à afficher et éventuellement d’autres caractéristiques comme les formats, les libellés ou
         le style à appliquer à un élément du tableau.
         En l’absence d’éléments en ligne dans l’instruction TABLE, tout le tableau est organisé
         en colonnes.
         En présence d’au moins une variable de calcul (citée dans VAR) et en l’absence de
         statistique, des sommes sont calculées par défaut.

     Exemple :
     Dans le tableau suivant, les variables ANNEE et SEXE sont des variables de l’instruction
     CLASS : chacune de leurs valeurs constitue une ligne ou une colonne du tableau. La
     variable REVENU_BRUT est citée, elle, dans l’instruction VAR, car on calcule des
     statistiques (minimum, moyenne) sur ses valeurs.
                                                  ANNEE
                                        2003                    2004
                              Revenu brut Revenu brut Revenu brut Revenu brut
                               MINIMUM     MOYENNE     MINIMUM     MOYENNE
                          F
                 SEXE
                          H
             Ensemble




                                                                                                72
                  Structures de tableaux possibles (lignes ou colonnes)
                         Juxtaposition (A B)                  Imbrication (A * B)


                                                                  B
                     A
    En lignes                                           A         B
                     B
                                                                  B




                                A           B

                                                                      B     B       B
  En colonnes




La dernière partie de l’instruction TABLE concerne les calculs à effectuer. L’écriture
générale est de la forme nomVariabledeCalcul*statistique, où la variable de calcul a son
nom cité dans l’instruction VAR et la statistique est l’une des suivantes :
• N
   Nombre total d’observations ;
• PCTN, ROWPCTN, COLPCTN
   Pourcentages d’un nombre d’observations (pourcentage de l’ensemble, pourcentage-
   ligne et pourcentage-colonne respectivement) ;
• SUM, MEAN STD, MAX, MIN, RANGE, MEDIAN, Q1, Q3, P1, P5, P10, P90, P95, P99
   Somme, moyenne, écart-type, maximum, minimum, étendue, médiane, quartiles,
   centiles ;
• NMISS
   Nombre d’observations manquantes de la variable de calcul ;
• PCTSUM, ROWPCTSUM, COLPCTSUM
   Pourcentage de la somme d’une variable de calcul (respectivement pourcentage du
   total, pourcentage du total-ligne et pourcentage du total-colonne).
Il est possible d’effectuer, avec cette instruction TABLE, des factorisations ou mises en
commun : par exemple, au lieu d’écrire VAR1*SUM VAR2*SUM, on pourra écrire (VAR1
VAR2)*SUM pour un résultat semblable.
Pour changer l’intitulé d’une case du tableau, qu’il corresponde au nom ou au label d’une
variable ou à un mot-clé (ALL ou une statistique), il suffit d’ajouter à côté de l’élément
concerné="texte de remplacement".

Exemple : répartition d’une variable qualitative entre ses différentes modalités.
proc tabulate data=pays.russet;
 class Demo;
 table (Demo ALL="Tous")*(N="Effectif" PCTN="%");
run;

Les statistiques affichées dans les cellules sont les effectifs (N) et les pourcentages (PCTN).
Le mot-clé ALL crée une colonne récapitulative : il s’agit ici du total des effectifs.




                                                                                            73
Pour obtenir le tableau transposé du précédent, on remplace l’instruction TABLE
précédente par l’instruction :
table (Demo ALL="Tous"),(N="Effectif" PCTN="%");




Exemple : tableau de synthèse d’une variable quantitative.
On utilise l’instruction VAR pour lister les variables d’analyse.
On peut en outre utiliser une instruction CLASS pour faire des statistiques par groupe.
proc tabulate data=pays.russet;
 class Demo;
 var Gini;
 table (Demo ALL="Tous"),Gini*MEAN="Moyenne";
run;




Exemple : tableaux croisés de deux variables qualitatives. Ces deux variables doivent être
spécifiées dans une instruction CLASS.
Cet exemple génère, à partir de la table chien, un tableau croisé de la variable affection en
lignes avec la variable agressivité en colonnes. Les statistiques sont les effectifs (N) et les
pourcentages (PCTN). L’utilisation du mot ALL à la suite des deux variables du tableau
donne un total en ligne et un autre en colonne.
proc tabulate data=chien;
 class affection agressivite;
 table (affection ALL="Total"),
       (agressivite ALL="Total")*
       (N PCTN);
run;




                                                                                            74
     Exemple avec l’instruction FORMAT et pourcentage lignes.
     On peut réaliser plusieurs variantes du tableau précédent en jouant sur les options de la
     procédure TABULATE et sur les éléments de l’instruction TABLE.
     proc tabulate data=chien format=4.1;
      class affection agressivite;
      table affection,
            agressivite*
            ROWPCTN="%";
     run;




     Avec l’option FORMAT, le format d’affichage par défaut du contenu de toutes les cellules du
     tableau est modifié : on passe de deux décimales à une seule. Avec le mot-clé ROWPCTN,
     on obtient dans les cellules les pourcentages-lignes.
     De manière similaire, on pourrait obtenir un tableau avec des pourcentages colonnes. Il
     suffirait d’utiliser l’instruction TABLE suivante :
     table affection,
           agressivite*
           COLPCTN="%";

     Il est possible de mettre en forme les tableaux obtenus par cette procédure à l’aide des
     options STYLE, que nous ne détaillerons pas ici.


5. 3. La procédure FREQ : analyser la distribution de variables qualitatives

     Cette procédure est à la fois :
      • une procédure descriptive dans le sens où elle produit des tableaux de fréquences
           unidimensionnelles ou des tris croisés multidimensionnels. Elle permet de calculer les
           effectifs et les fréquences de chaque valeur prise par une variable ;
      • une procédure statistique permettant de faire certains tests comme le test du chi2.
     Syntaxe :
     PROC FREQ DATA=tableSAS ORDER=ordreValeurs <liste d’options> ;
        BY liste_de_variables ;
        TABLES requête </liste d’options> ;
        WEIGHT variable ;
     RUN ;

     Instruction TABLES
     TABLES permet de définir la liste des distributions souhaitées. Plusieurs distributions
     peuvent être demandées simultanément, chacune pouvant être unidimensionnelle ou
     multidimensionnelle.
     Dans le cas de demande de plusieurs distributions simultanées, il suffit de séparer chaque
     distribution par un espace. Par exemple, TABLES a b correspond à la demande de la
     distribution simple de la variable a, puis celle de la variable b.
     Si on veut croiser plusieurs variables entre elles, il suffit de les séparer par des astérisques.
     Par exemple, TABLE a*b correspond à la demande de tri croisé, affichant une modalité de a
     à chaque ligne et une modalité de b à chaque colonne.




                                                                                                   75
On peut utiliser les facilités d’écriture résumées sur les exemples suivants :
a*(b c) correspond à a*b a*c
(a b)*(c d) correspond à a*c b*c a*d b*d
(a b c)*d correspond à a*d b*d c*d
a - - c correspond a b c
(a - - c)*d correspond à a*d b*d c*d.

Exemple : dans l’étude de la relation herbivores-environnement, on veut croiser la densité
au km_ des éléphants et la proximité de l’eau :
proc freq data=parc;
 tables A*EAU;
run;

Pour une table unidimensionnelle, PROC FREQ calcule :
   l’effectif
   l’effectif cumulé
   le pourcentage
   le pourcentage cumulé.
Pour une table multidimensionnelle, PROC FREQ calcule :
   le pourcentage ligne
   le pourcentage colonne
   le pourcentage total
   l’effectif.

Option ORDER
L’instruction ORDER= permet de spécifier l’ordre dans lequel SAS devra éditer les valeurs
des variables en lignes dans les tableaux produits par la procédure FREQ :
• ORDER=DATA pour éditer les valeurs dans l’ordre d’apparition dans la table ;
• ORDER=FORMATTED pour éditer les valeurs dans l’ordre croissant du format
    d’affichage ;
• ORDER=FREQ pour éditer les valeurs dans l’ordre de leurs fréquences décroissantes ;
• ORDER=INTERNAL pour éditer les valeurs dans l’ordre croissant des valeurs non
    formatées. C’est l’ordre utilisé par défaut.

Exemple :
proc freq data=voiture order=internal;
 table origine*finition;
run;




                                                                                       76
Extrait de la table obtenue :
       The FREQ Procedure

    Table of Origine by Finition

Origine(Origine)   Finition(Finition)

Frequency‚
Percent ‚
Row Pct ‚
Col Pct ‚B      ‚M     ‚TB ‚ Total
ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ
D      ‚ 2‚ 0‚ 1‚ 3
     ‚ 11.11 ‚ 0.00 ‚ 5.56 ‚ 16.67
     ‚ 66.67 ‚ 0.00 ‚ 33.33 ‚
     ‚ 28.57 ‚ 0.00 ‚ 16.67 ‚
ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ
F     ‚ 2‚ 2‚ 2‚ 6
     ‚ 11.11 ‚ 11.11 ‚ 11.11 ‚ 33.33
     ‚ 33.33 ‚ 33.33 ‚ 33.33 ‚
     ‚ 28.57 ‚ 40.00 ‚ 33.33 ‚
ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ
GB      ‚ 1‚ 0‚ 0‚ 1
     ‚ 5.56 ‚ 0.00 ‚ 0.00 ‚ 5.56
     ‚ 100.00 ‚ 0.00 ‚ 0.00 ‚
     ‚ 14.29 ‚ 0.00 ‚ 0.00 ‚
ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ
Total        7    5      6     18
        38.89 27.78 33.33 100.00

(Continued)

  On aurait obtenu le même résultat avec ORDER=FORMATTED puisqu’on n’a pas utilisé
  l’option format.

  Exercice 10 : utilisation d’un format d’affichage
  Editez la répartition des voitures en fonction de l’origine et de la finition, en ayant
  préalablement regroupé les voitures européennes dans une seule catégorie ‘Europe ‘, et
  les autres voitures dans la catégorie ‘Autres’ (utiliser une procédure Format, puis une
  instruction format dans la procédure Freq). Le listing obtenu sera le suivant :
          The FREQ Procedure

       Table of Origine by Finition

   Origine(Origine)   Finition(Finition)

   Frequency‚
   Percent ‚
   Row Pct ‚
   Col Pct ‚B      ‚M     ‚TB ‚ Total
   ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ
   Europe ‚ 7 ‚ 2 ‚ 5 ‚ 14
        ‚ 38.89 ‚ 11.11 ‚ 27.78 ‚ 77.78
        ‚ 50.00 ‚ 14.29 ‚ 35.71 ‚
        ‚ 100.00 ‚ 40.00 ‚ 83.33 ‚
   ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ
   Autres ‚ 0 ‚ 3 ‚ 1 ‚ 4
        ‚ 0.00 ‚ 16.67 ‚ 5.56 ‚ 22.22
        ‚ 0.00 ‚ 75.00 ‚ 25.00 ‚
        ‚ 0.00 ‚ 60.00 ‚ 16.67 ‚
   ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ
   Total        7    5      6     18
           38.89 27.78 33.33 100.00




                                                                                      77
  Exercice 11 : utiliser une option ORDER pour obtenir la sortie ci-dessous :
         The FREQ Procedure

      Table of Origine by Finition

  Origine(Origine)   Finition(Finition)

  Frequency‚
  Percent ‚
  Row Pct ‚
  Col Pct ‚B      ‚M     ‚TB ‚ Total
  ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ
  Autres ‚ 0 ‚ 3 ‚ 1 ‚ 4
       ‚ 0.00 ‚ 16.67 ‚ 5.56 ‚ 22.22
       ‚ 0.00 ‚ 75.00 ‚ 25.00 ‚
       ‚ 0.00 ‚ 60.00 ‚ 16.67 ‚
  ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ
  Europe ‚ 7 ‚ 2 ‚ 5 ‚ 14
       ‚ 38.89 ‚ 11.11 ‚ 27.78 ‚ 77.78
       ‚ 50.00 ‚ 14.29 ‚ 35.71 ‚
       ‚ 100.00 ‚ 40.00 ‚ 83.33 ‚
  ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ
  Total        7    5      6     18
          38.89 27.78 33.33 100.00


Options principales de l’instruction TABLES
Concernant les distributions croisées :
       NOCOL :           supprime l’impression des pourcentages colonne
       NOROW :           supprime l’impression des pourcentages lige
       NOFREQ :          supprime l’impression des fréquences croisées
       NOPERCENT : supprime l’impression des pourcentages croisés
       NOCUM :           supprime l’impression des fréquences et des pourcentages
                         cumulés
       CUMCOL :          imprime les pourcentages colonne cumulés.
Concernant les distributions à dimension >2 :
       TOTPCT :          affiche les pourcentages totaux par rapport à l’ensemble de la
                         distribution, et non plus par rapport aux critères page.
Concernant l’aspect général du tableau de sortie :
       NOPRINT :       supprime l’impression des tables mais permet l’impression de
                       statistiques
       OUT= :          stocke les résultats de la demande dans la table SAS
       MISSING :       traite les valeurs manquantes comme des modalités renseignées
                       dans les calculs et tous les tableaux.
       MISSPRINT : permet d’éditer les valeurs manquantes dans les tableaux
                       demandés dans l’instruction TABLE, mais elles ne sont pas prise
                       en compte dans les calculs statistiques effectués par la procédure.
Concernant le calcul des valeurs attendues par rapport aux valeurs observées :
       EXPECTED : imprime les fréquences attendues sous l’hypothèse
                        d’indépendance
       DEVIATION : édite les écarts entre les effectifs observés et théoriques
       LIST :           imprime des tables de dimension 2 sous forme de liste plutôt que
                        de tableaux
       CELLCHI2 :       imprime la contribution de chaque case à la statistique du chi2
                        totale
       CHISQ :          calcule le test du chi2 d’homogénéité ou d’indépendance de
                        chaque strate et calcule les mesures associées au chi2.
D’autres options non détaillées ici permettent de calculer d’autres statistiques.

Résultat en « liste »




                                                                                       78
L’option LIST édite les tableaux croisés demandés dans l’instruction TABLE sous forme de
liste. Cette option n’est pas valide si des indicateurs de liaison (options EXPECTED,
DEVIATION) sont demandés.
L’option SPARSE permet d’obtenir toutes les combinaisons possibles des modalités des
variables, même celles d’effectifs nul dans le cas où l’on demande un affichage du tableau
sous forme de liste (option LIST).
Exemple
proc freq data=voiture order=internal;
 table origine*finition/list sparse;
run;
             The FREQ Procedure

                           Cumulative Cumulativ
Origine Finition Frequency Percent Frequency Percent
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
D      B         2     11.11        2   11.11
D      M          0      0.00       2   11.11
D      TB          1     5.56       3    16.67
F      B         2    11.11        5    27.78
F      M          2    11.11        7    38.89
F      TB         2    11.11        9    50.00
GB      B          1     5.56      10     55.56
GB      M           0     0.00      10     55.56
GB      TB          0     0.00       10    55.56
I     B         2     11.11      12     66.67
I     M          0     0.00      12     66.67
I     TB         2     11.11      14     77.78
J      B         0     0.00      14     77.78
J      M          2    11.11       16     88.89
J      TB         1     5.56      17     94.44
U      B         0      0.00      17    94.44
U      M          1      5.56      18   100.00
U      TB         0     0.00       18   100.00

En l’absence de l’option SPARSE, les lignes correspondant aux sous-groupes d’effectif nul
(ex. : voitures allemandes notées M) n’auraient pas été listées.

Stockage du résultat dans une table SAS
Syntaxe
     TABLES requête / OUT=nom_de_table OUTPCT ;
Les résultats de la procédure peuvent être stockés dans une table SAS. La table en sortie
contiendra une observation par croisement des modalités des différentes variables. Les
variables présentes dans cette table, outre les variables origine de la demande TABLES
sont :
       COUNT, l’effectif
       et PERCENT, le pourcentage par rapport à l’ensemble des observations.
De plus, si l’option OUTPCT est activée, les variables suivantes sont conservées :
      PCT_COL : pourcentage colonne
      PCT_ROW : pourcentage ligne
      PCT_TABL : pourcentage par rapport à l’ensemble de la table de dimension 2 (cas
      des tables de dimension>2).
De la même manière l’option OUTEXPECT permet d’inclure les effectifs théoriques.
En outre, si une instruction BY est activée, les variables correspondantes seront ajoutées à
la table de sortie.
Tous les autres éléments obtenus par une PROC FREQ, notamment tous les indicateurs
statistiques peuvent être sauvegardés dans une autre table SAS, par l’adjonction d’une
autre instruction :
OUTPUT OUT=nom_de_table <liste_de_statistiques_à_sauvegarder> ;




                                                                                         79
     Les test d’indépendance
     L’utilisation de l’option CHISQ permet de réaliser des tests d’indépendance. L’hypothèse
     nulle testée est l’indépendance de deux variables.
     Exemple : on va tester l’indépendance de l’origine des voitures et la qualité de la finition.
     proc format;
      value $ note
      'B','TB'='B-TB'
      ;
     run;

     proc freq data=voiture order=internal;
      table origine*finition/CHISQ;
      format finition $note.;
     run;
               The FREQ Procedure

        Statistics for Table of Origine by Finition

     Statistic           DF    Value Prob
     ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
     Chi-Square             5 8.0308 0.1545
     Likelihood Ratio Chi-Square 5 9.8131 0.0807
     Mantel-Haenszel Chi-Square 1 2.4445 0.1179
     Phi Coefficient            0.6679
     Contingency Coefficient         0.5554
     Cramer's V                0.6679

      WARNING: 100% of the cells have expected counts less
         than 5. Chi-Square may not be a valid test.

                Sample Size = 18

     On a effectué l’analyse sur un échantillon très petit, aussi le test du Chi-2 n’est pas très
     fiable. Cette réserve mise à part, le test du Chi-2 montre une probabilité d’accepter
     l’hypothèse d’indépendance des deux variables de 15% (0,1545), ce qui est assez faible :
     on peut rejeter cette hypothèse. Cette conclusion est corroborée par les valeurs des trois
     derniers coefficients, phi, contingence et V de Cramer : pour ce dernier, par exemple, la
     liaison observée correspond à 67% à une liaison parfaite entre les deux variables.

5. 4. La procédure MEANS : analyser la distribution de variables quantitatives (calcul de
      statistiques simples)

     PROC MEANS permet d’analyser la distribution d’une variable numérique sur une
     population donnée. Cette procédure pourra notamment servir à :
     • calculer la somme de la variable ;
     • calculer la moyenne et la médiane ;
     • calculer l’écart-type, l’étendue et l’intervalle inter quantiles (caractéristiques de
       dispersion) ;
     • étudier la répartition de la variable (médiane, quartiles d’ordre 1 et 3, centiles d’ordre 1, 5,
       10, 25, 50, 75, 90, 95, 99) ;
     • étudier la forme de la distribution (coefficients d’aplatissement et d’asymétrie) ;
     • identifier les valeurs extrêmes de la variable.




                                                                                                     80
Syntaxe :
PROC MEANS <DATA=nom_de_table STAT1…STATm <liste d’options> ;
 CLASS liste_de_variables ;
 VAR liste_de_variables_numériques ;
 BY liste_de_variables ;
 FREQ variable ;
 WEIGHT variable ;
 ID variable;
 OUTPUT OUT=nom_de_table;
Seule l’instruction VAR est obligatoire. Si on ne précise aucune option ni instruction
spécifique, la procédure MEANS va calculer par défaut, pour chaque variable numérique :
• le nombre d’observations renseignées (N) ;
• la moyenne (Mean) ;
• l’écart-type (Std Dev) ;
• le minimum ;
• le maximum.
Sinon, on précise sur la première ligne (STAT1…STATm) les statistiques descriptives à
calculer.

Exemple : comparaison des sorties obtenues avec CLASS et BY, lorsque l’on veut calculer
la moyenne du PNB par tête des pays en fonction du régime politique.
Avec l’instruction CLASS :
proc means data=pays.russet mean;
 var gnpr;
 class demo;
run;

    The MEANS Procedure

  Analysis Variable : Gnpr

         Nb
    Demo obs.       Moyenne
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
      1 15      1055.00

     2   11   490.2727273

      3 21 241.2857143
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ

Avec l’instruction BY :
proc sort data=pays.russet;
 by demo;
run;

proc means mean;
 var gnpr;
 by demo;
run;




                                                                                    81
---------- Demo=1 ---------

  The MEANS Procedure

 Analysis Variable : Gnpr

       Moyenne
    ƒƒƒƒƒƒƒƒƒƒƒƒ
       1055.00
    ƒƒƒƒƒƒƒƒƒƒƒƒ


---------- Demo=2 ---------

 Analysis Variable : Gnpr

       Moyenne
    ƒƒƒƒƒƒƒƒƒƒƒƒ
     490.2727273
    ƒƒƒƒƒƒƒƒƒƒƒƒ


---------- Demo=3 ---------

 Analysis Variable : Gnpr

       Moyenne
    ƒƒƒƒƒƒƒƒƒƒƒƒ
     241.2857143
    ƒƒƒƒƒƒƒƒƒƒƒƒ


Choix de croisements des variables de classes
La présence de l’instruction CLASS avec plusieurs variables construit des groupes
correspondant au croisement de toutes les variables citées dans cette instruction. Avec
l’instruction TYPES, on peut préciser les croisements voulus. Les combinaisons se
spécifient avec le nom d’une variable de l’instruction CLASS, éventuellement séparée de
celle avec laquelle elle est croisée par un astérisque (*). Le niveau le plus agrégé, n’utilisant
aucune variable de l’instruction CLASS, se note ().

Exemple : on souhaite obtenir la moyenne des cylindrées et de la puissance de 18 voitures
sur les deux combinaisons origine*tranche_de_prix et origine*finition.
proc means data=voiture mean;
 class origine finition tranche_prix;
 types origine*finition origine*tranche_prix ();
 var cylindree puissance;
run;

            The MEANS Procedure

          N
        Obs Variable        Mean
        ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
         18 Cylindree     1631.67
            Puissance 84.6111111
        ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ




                                                                                              82
               N
Origine Tranche_prix Obs Variable         Mean
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
D           1 1 Cylindree       1979.00
                 Puissance 100.0000000

                 2       2 Cylindree     1790.50
                          Puissance    91.5000000

F                1       4 Cylindree     1469.25
                          Puissance    65.2500000

                 2       2 Cylindree     2053.00
                          Puissance    104.0000000

GB                   2    1 Cylindree   1798.00
                          Puissance 82.0000000

I                1       1 Cylindree     1350.00
                          Puissance    79.0000000

                 2       3 Cylindree     1484.00
                          Puissance    96.3333333

J                1        2 Cylindree   1467.50
                           Puissance 69.0000000
                 2       1 Cylindree   1998.00
                           Puissance 115.0000000

U               1 Cylindree
                 1              1294.00
                 Puissance 68.0000000
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ


                 N
    Origine Finition Obs Variable        Mean
    ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
    D      B       2 Cylindree    1986.00
                    Puissance 99.0000000

         TB              1 Cylindree   1588.00
                          Puissance 85.0000000

    F    B               2 Cylindree   1680.50
                          Puissance 67.0000000

         M               2 Cylindree   1258.00
                          Puissance 63.5000000

         TB              2 Cylindree   2053.00
                          Puissance 104.0000000

    GB       B            1 Cylindree   1798.00
                          Puissance 82.0000000

    I    B        2 Cylindree     1467.50
                   Puissance 88.5000000
    ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ




                                                              83
Le traitement des valeurs manquantes
Les valeurs manquantes d’une variable d’analyse sont toujours exclues des calculs.
Concernant les variables de classes, les observations ayant des valeurs manquantes sont
gardées dans l’analyse si l’on utilise l’instruction BY. Si l’on utilise CLASS, SAS ne prend
pas en compte par défaut le groupe constitué des valeurs manquantes de la variable de
classe ; l’option MISSING dans l’instruction PROC MEANS permet de considérer que dans
une variable de l’instruction CLASS, la valeur manquante définit un groupe à part entière.

Autres instructions
VAR :       variables (numériques) pour lesquelles on sollicite la procédure
BY :        la procédure s’exécute pour chaque groupe d’observation
WEIGHT :    variable de pondération
OUTPUT :    permet de stocker les résultats dans une table
ID :        la valeur maximum de la variable mentionnée, au niveau de chaque groupe
            défini par l’instruction CLASS, sera conservée dans la table de sortie.
Options
DESCENDING :      inverse l’ordre des observations dans la table en sortie
NOPRINT :         empêche PROC MEANS de produire un état dans la fenêtre OUTPUT.
IDMIN :           pour retenir la valeur minimum de la variable ID au lieu de son maximum.
VARDEF :          diviseur calculé pour les variances et les covariances
DF :              degrés de liberté (n-1)
N:                nombre d’observations
WDF :             somme des poids – 1 (variance corrigée – estimateur non biaisé)
WEIGHT :          somme des poids.
ALPHA :           seuil pour les intervalles de confiance.

PROC MEANS peut également calculer d’autres statistiques, parmi lesquelles :
KURTOSIS :  coefficient de KURTOSIS (compare la forme de la courbe de distribution
            des observations à celle de la loi normale : un coefficient positif indique une
            plus forte concentration des observations ; un coefficient négatif indique
            une courbe plus « aplatie »).
PRT :       probabilité de nullité de la moyenne (test de Student)
RANGE :     étendue
SKEWNESS : coefficient de symétrie (indique sur les observations sont réparties
            équitablement autour de la moyenne (le coefficient est alors nul) ou si elles
            sont plutôt concentrées vers les valeurs les plus faibles (coefficient positif)
            ou vers les valeurs les plus élevées (coefficient négatif).
SUM :       somme
T:          valeur de Student
VAR :       variance

La création d’une table SAS de résultats
Tous les résultats issus de la PROC MEANS peuvent être sauvegardés dans une table.
Alors qu’à l’écran ne sont affichées que les statistiques au niveau le plus fin, toutes les
statistiques au niveau agrégé sont conservées dans la table de sortie.
Syntaxe :
    OUTPUT OUT=nom_de_table <statistiques_à_conserver> / <AUTONAME>
OUT= : nom de la table créée
Statistiques : statistiques à conserver.
Il existe trois formes de demandes statistiques :
statistique=
calculera les statistiques décrites plus haut pour les variables précisées dans VAR= et
donne les mêmes noms aux variables en sortie que les variables en entrée. Une seule
statistique peut être sauvegardée par ce biais.




                                                                                         84
statistique=nom1…nomn
calcule les statistiques sur toutes les variables de VAR mais les stocke sous un nom
différent. Les noms de la liste sont attribués dans l’ordre des variables de VAR.
statistique(var1…varn)=nom1…nomn
applique les statistiques à un sous-ensemble des variables de VAR.
L’option AUTONAME construit automatiquement les noms des variables.

La table SAS créée par l’instruction OUTPUT contient systématiquement deux variables :
_TYPE_ et _FREQ_. _FREQ_ contient le nombre d’observations renseignées ayant servi
au calcul des statistiques énumérées à cette ligne de la table en sortie. La variable _TYPE_
représente le niveau auquel se trouve chaque information et permet de savoir si une
variable est agrégée à ce niveau.

Exemple dans le cas de 3 variables :
CLASS A B C :
         A                      B                      C                   _TYPE_
   niveau agrégé          niveau agrégé          niveau agrégé                0
   niveau agrégé          niveau agrégé          niveau détaillé              1
   niveau agrégé          niveau détaillé        niveau agrégé                2
   niveau agrégé          niveau détaillé        niveau détaillé              3
   niveau détaillé        niveau agrégé          niveau agrégé                4
   niveau détaillé        niveau agrégé          niveau détaillé              5
   niveau détaillé        niveau détaillé        niveau agrégé                6
   niveau détaillé        niveau détaillé        niveau détaillé              7

Exemple : on calcule la moyenne et la variance des variables gini, famr et gnpr.
proc means data=pays.russet noprint;
 class demo;
 var gini farm gnpr;
 output out=m_russet
        mean=
        var= / autoname;
run;




Exercice 12 : établissez la table m_russet suivante en créant les variables à partir de
l’instruction :
statistique=nom1…nomn,
puis de l’instruction statistique(var1…varn)=nom1…nomn.




On peut enfin combiner le choix du nom de certaines variables et l’attribution automatique
des noms.




                                                                                         85
     Exemple
     proc means data=a.pays noprint;
      class demo;
      var gini farm gnpr;
      output out=m_russet
             mean=
             var(gini farm gnpr)=v_gini v_farm v_gnpr / autoname;
     run;




5. 5. La procédure UNIVARIATE : analyser la distribution de variables quantitatives
      (analyse en détail d’une variable)

     Cette procédure calcule des statistiques simples sur des variables numériques. Plus
     complète que la procédure MEANS, elle fournit :
     •    des détails sur les valeurs extrêmes d’une variable
     •    le calcul de n’importe quel quantile de la distribution
     •    plus de tests : 2 tests pour l’égalité de la moyenne à une constante donnée, 1 pour le
          même test avec la médiane, 4 pour la normalité de la distribution… ;
     •    la création de graphiques pour étudier la distribution (box-plot, stem-and-leaf,
          histogrammes, courbes de densité).
     Syntaxe :
           PROC UNIVARIATE DATA=nom_de_table_SAS <options> ;
                 VAR liste_de_variables ;
                 ID variable ;
                 HISTOGRAM liste_de_variables / <options> ;
                 PROBLPLOT liste_de_variables / <options> ;
           RUN ;
     VAR       spécifie les variables numériques à analyser. Si l’instruction VAR est omise,
               toutes les variables numériques de la table en entrée sont analysées.
     ID        variable d’identification pour les 5 plus petites et 5 plus grandes valeurs en
               sortie.
     HISTOGRAM trace un histogramme pour les variables spécifiées.
     PROBPLOT trace la distribution des variables, en la comparant à une distribution
               théorique spécifiée par l’utilisateur.

     La procédure UNIVARIATE fournit par défaut une large gamme de statistiques descriptives
     classées par thème.

     Exemple :
     proc univariate data=demography;
      var pop_1996;
      id country;
     run;




                                                                                             86
                The UNIVARIATE Procedure
              Variable: Pop_1996 (Pop_1996)

                    Moments

  N              150 Sum Weights          150
  Mean          38.3126667 Sum Observations     5746.9
  Std Deviation 129.595069 Variance         16794.8818
  Skewness         7.7041216 Kurtosis     64.0665621
  Uncorrected SS 2722616.45 Corrected SS        2502437.39
  Coeff Variation 338.256456 Std Error Mean     10.581393

Le premier tableau, intitulé “Moments” donne plusieurs moments empiriques de la variable
étudiée. On y reconnaît la somme, la moyenne, l’écart-type, la variance ainsi que le
coefficient de variation de la variable. Les coefficients de forme (skewness et kurtosis) sont
également indiqués.

               Basic Statistical Measures

       Location              Variability

     Mean 38.31267 Std Deviation       129.59507
     Median 9.80000 Variance            16795
     Mode 1.10000 Range                1231
               Interquartile Range 19.60000

 NOTE: The mode displayed is the smallest of 2 modes with a count of 4.

Le deuxième tableau présente les statistiques descriptives les plus usuelles : à gauche, des
indicateurs de tendance centrale (moyenne, médiane, mode) ; et à droite, des indicateurs
de dispersion (écart-type, variance, étendue et intervalle inter-quartile).

               Tests for Location: Mu0=0

       Test        -Statistic- -----p Value------

       Student's t t 3.620758 Pr > |t| 0.0004
       Sign       M     75 Pr >= |M| <.0001
       Signed Rank S 5662.5 Pr >= |S| <.0001

Le troisième tableau contient des éléments permettant de réaliser deux tests de nullité de la
moyenne (Student : test de Student et Signed Rank : test des rangs signés de Wilcoxon) et
un test de nullité de la médiane (Sign : test des signes). Dans la colonne de gauche, SAS
édite les statistiques caractéristiques de chaque test, et à droite, les probabilités d’accepter
l’hypothèse de nullité.
Les trois probabilités (p Value) sont inférieures à 0,0001. On en conclut que la moyenne et
la médiane des populations sont significativement non nulles (l’intérêt d’une telle information
est limitée), car on peut rejeter l’hypothèse de nullité avec une très forte probabilité (1-p
value).
Il est possible de remplacer la valeur MuO=0 prise par défaut pour ces tests par une valeur
réelle quelconque grâce à l’option Mu0=valeur. On écrirait par exemple :
proc univariate data=demography MU0=38;
 var pop_1996;
 id country;
run;




                                                                                             87
               Quantiles (Definition 5)

                Quantile     Estimate

                100% Max      1232.1
                99%       944.6
                95%       125.4
                90%        66.3
                75% Q3       23.9
                50% Median        9.8
                25% Q1        4.3
                10%         2.3
                5%         1.6
                1%         1.1
                0% Min        1.1

Le quatrième tableau fournit l’estimation de plusieurs quantiles (quartiles, déciles et centiles)
de la distribution de la variable étudiée.

                Extreme Observations

 -------------Lowest------------   -------------Highest-------------

 Value Country             Obs     Value Country           Obs

  1.1   Mauritius      134      161.1 Brazil        59
  1.1   Guinea-Bissau     126      200.4 Indonesia           100
  1.1   Gambia         123      269.4 U.S.A.        80
  1.1   Gabon         122      944.6 India         87
  1.3   Trinidad      76      1232.1 China         15

Le cinquième tableau fournit une liste qui permet d’identifier les 10 observations extrêmes
de la variable étudiée.
Quelques précisions sur le premier tableau
N                       nombre d’observations
Mean                    moyenne
Std Deviation           écart-type
Skewness                coefficient d’asymétrie
                        Si le coefficient d’asymétrie est proche de 0, la distribution est symétrique.
                        Si le coefficient d’asymétrie est supérieur à 0, les observations sont
                        concentrées à gauche (la moyenne est inférieure à la médiane). On a un
                        histogramme de la forme :




                                  F
                                  r         100
                                  e
                                  q
                        Si le coefficient d’asymétrie est inférieur à 0, les observations sont
                        concentrées à droite (la moyenne est supérieure à la médiane). On a un

                                  u
                        histogramme de la forme :


                                  e           50
                                  n
                                  c                                                         88

                                  y
                                          40
                               F
                               r
                               e
                               q
                Si le coefficient est inférieur à -1 ou supérieure à 1, on a une distribution
                très asymétrique.
                               u          20
Uncorrected SS Somme des carrés non corrigés : Σ x _        i

Coeff variation                e
                   (écart-type) / moyenne
Kurtosis           Permet de comparer l’étalement d’une distribution par rapport à la loi
                               n
                   normale. Le coefficient est proche de 0 si on a une distribution proche de
                   la loi normale. Si la distribution est plus concentrée autour de la moyenne,
                               c
                   le coefficient est négatif. Si la distribution est plus étalée, le coefficient est
                   positif.
Corrected SS
                               y
                   Somme des carrés corrigés : Σ (x – m)_
Std Error Mean (écart-type) / √(n)
                                                       i



Quelques précisions sur le deuxième tableau
Mode                                         0
                      Valeur la plus fréquente. Si on ne retrouve pas plusieurs fois la même

                                                           33       39          45 51 57 6
                      valeur, on prend la plus petite.
Range                 Différence entre la plus grande et la plus petite valeur

                                                                                 Life_expect_1
Interquartile range   Différence entre Q3 et Q1 (dans l’exemple ci-dessous, Q3-Q1=41)




Option PLOT
SI on précise l’option plot, on obtient 3 sortes de graphiques : un diagramme stem-and-leaf,
une boîte à moustaches (box and wilker plot), et un diagramme de normalité (normal
probability plot).
Le diagramme stem-and-leaf
Il s’agit d’un histogramme qui fournit certaines informations sur les valeurs numériques des
données.
Par exemple, supposons qu’on ait les valeurs suivantes :
14 20 39 58 60 63 65 66 68 70 70 71 73 74 75 75 76 76 77 77 79 79 80 80
81 82 83 84 87 87 88 89 90 91 93 93 98



                                                                                                  89
On va obtenir le diagramme suivant :

9   01338
8   0012347799
7   0013455667799
6   03568
5   8
4
3   9
2   0
1   4
On a ainsi la forme de la distribution ainsi que les valeurs des données. Dans l’exemple
précédent, la première colonne correspond à la dizaine et les valeurs de la deuxième
colonne à l’unité.
Le diagramme à moustaches
Le diagramme à moustaches fournit des informations sur la variabilité des données et sur
les valeurs extrêmes.




Dans l’exemple ci-dessus, la médiane est égale à 18,3.
Q1 est égal à 8,8. 25% des observations prennent une valeur inférieure à Q1.
Q3 est égal à 29,5. 75% des observations ont une valeur inférieure à Q3.
L’écart interquartile est égal à Q=Q3-Q1=20,7.
La limite supérieure de la boîte à moustache est égale à Q3+1,5Q = 60,5. La limite
inférieure de la boîte à moustache est égale à Q3-1,5Q = -22,2. On a donc deux valeurs
« aberrantes » : 62,3 et 75,0.

La courbe de normalité
Exemple : on trace la courbe de normalité de la variable rent.
proc univariate data=a.pays plot;
 var rent;
 id pays;
 probplot rent/normal (mu=est
                       sigma=est
                       color=blue
                       w=1);
run;
Sorties partielles obtenues par l’option PLOT :




                                                                                     90
     Stem Leaf                 #       Boxplot
      75                1          0
      7
      6
      62                1          0
      5
      5 334               3          |
      4                          |
      4 044               3          |
      3 57               2          |
      33                1          |
      26                1        +-----+
      2 0001124               7       | + |
      1 55778999               8       *-----*
      1 12223               5       | |
      0 567889               6       +-----+
      0 002234               6          |
        ----+----+----+----+
     Multiply Stem.Leaf by 10**+1

Le premier graphique est le stem and leaf qui reprend la distribution des valeurs de la
variable rent. Pour passer des valeurs du stem-and-leaf plot aux valeurs de l’échantillon, il
                                                           1
suffit de multiplier les valeurs du diagramme par 10 (10 ). Ainsi, une seule observation à
                                       ème
une valeur de l’ordre de 75. A la 6        ligne, on lit que 3 observations ont les valeurs
respectives 53, 53 et 54.
La boîte à moustache indique que la moyenne est supérieure à la médiane et que la
distribution de cette variable est très étirée vers les valeurs basses.
On obtient également la courbe de normalité suivante :
            The UNIVARIATE Procedure
              Variable: Rent

              Normal Probability Plot
  77.5+                              *
     |
     |                              +
  62.5+                           * +++
     |                           +++
     |                       ** *++
  47.5+                         ++
     |                    ***++
     |                    +*+
  32.5+                    ++**
     |                +++ *
     |               ++*****
  17.5+               +****
     |           ****
     |         *****
   2.5+ * * * **+*+
      +----+----+----+----+----+----+----+----+----+----+

       -2      -1     0     +1     +2

Les signes + indiquent les valeurs attendues d’une distribution normale. Les astérisques
représentent les valeurs observées.




                                                                                          91
Les courbes de normalité permettent de vérifier visuellement que les données suivent une
distribution approximativement normale. L’axe vertical représente les données réelles et
l’axe horizontal les percentiles attendus d’une distribution normale. Les diagrammes
suivants illustrent les courbes types que l’on peut obtenir :
1. les données suivent une distribution normale
2. les données sont concentrées à gauche
3. les données sont concentrées à droite
4. la distribution est plus étalée qu’une distribution normale
5. la distribution est plus concentrée qu’une distribution normale.




Avec l’instruction PROBPLOT, on peut obtenir un graphique plus précis qui sera affiché
dans une fenêtre graphique :




Ce graphique met en évidence une concentration à gauche des observations.
Avec PROBPLOT, on peut tracer avec SAS Graph une courbe qui compare les valeurs
observées de la variable avec les percentiles d’une distribution théorique spécifiée. Si on
spécifie normal, on obtient le tracé d’une ligne de référence correspondant à la distribution
normale (estimée avec les paramètres mu – moyenne - et sigma – écart-type – des valeurs
observées). Dans l’exemple précédent, cette ligne de référence est tracée en bleu avec une
épaisseur de trait de 2.
HISTOGRAM trace un histogramme avec SAS Graph, auquel on peut superposer la courbe
de densité d’une loi normale de mêmes moyenne et variance.


                                                                                          92
     Test de normalité
     SAS permet de réaliser quatre tests de normalité d’une distribution : les tests de Shapiro-
     Wilk, Kolmogorov-Smirnov, Cramer-von Mises et Anderson-Darling.
     La statistique de test de Shapiro-Wilk (W) est comprise entre 0 et 1 et une valeur faible
     conduit à rejeter l’hypothèse de normalité. A l’inverse, pour les statistiques des tests de
     Kolmogorov-Smirnov (D), Cramer-von Mises (W-sq) et Anderson-Darling (A-sq), une valeur
     élevée conduit à rejeter l’hypothèse de normalité.
     Il est conseillé d’interpréter les tests de Kolmogorov-Smirnov, Cramer-von Mises et
     Anderson-Darling lorsque le nombre d’observations renseignées est supérieur à 2000.
     Pour obtenir les résultats des quatre tests de normalité, il suffit d’utiliser l’option NORMAL
     dans l’instruction PROC UNIVARIATE.
     PROC UNIVARIATE DATA=tableSAS NORMAL ;
      VAR variable ;
     RUN ;

5. 6. La procédure CORR : calculer des coefficients de corrélation

     PROC CORR permet le calcul des coefficients de corrélation entre les variables (de
     PEARSON, de SPEARMAN, de KENDALL ou de HOEFFDING) et peut produire des
     matrices de produits croisés ainsi que des matrices de variance-covariance. PROC CORR
     calcule aussi des statistiques univariées simples et crée de nouveaux tableaux contenant
     ces statistiques univariées et les corrélations. Elle permet enfin de calculer des coefficients
     de corrélation partiels entre un couple de variables en éliminant l’influence d’une liste de
     variables.
     De plus, à partir de la version 9 de SAS, cette procédure peut produire des graphiques de
     type « nuages de points » sans nécessité d’utiliser la procédure GPLOT.
     Syntaxe :
     PROC CORR DATA=nom_de_table <liste d’options> ;
      BY liste_de_variables ;
      FREQ variable ;
      PARTIAL liste_de_variables ;
      VAR liste_de_variables ;
      WEIGHT variable ;
      WITH liste_de_variables ;

     BY :      la procédure est exécutée pour chaque sous groupe.
     PARTIAL : permet de mesurer les corrélations partielles entre les combinaisons 2 à 2
               d’une liste de variables numériques (instruction VAR) en éliminant l’influence
               des variables de l’instruction PARTIAL.
     VAR :     variables pour lesquelles les coefficients sont calculés.
     WITH :    utilisé pour obtenir les corrélations uniquement pour certaines combinaisons de
               variables. Indiquer dans l’instruction WITH les variables dont on veut les
               corrélations avec les variables de VAR.
     WEIGHT : variable de pondération. A utiliser uniquement pour le calcul du coefficient de
               Pearson.
     FREQ :    spécifie la variable numérique dont la valeur représente la fréquence de
               l’observation.
     Quelques options disponibles :
     KENDALL : sélection du type de corrélation KENDALL (pour les variables ordinales).
     PEARSON : sélection du type de corrélation PEARSON (par défaut) (pour les variables
                métriques).
     SPEARMAN : sélection du type de corrélation SPEARMAN (pour les variables ordinales).
     OUTP =:    stockage des résultats dans un tableau de TYPE CORR. Il contient les
                moyennes, écarts-types, nombre d’observations et corrélations.
     OUTS= :    idem avec les corrélations de SPEARMAN.


                                                                                                 93
     OUTK :                  idem avec les corrélations de KENDALL.
     NOMISS :                exclusion des observations à valeur manquante de tous les calculs.
     VARDEF :                spécifie le diviseur utilisé pour les variances.
     COV :                   impression de la matrice de variances covariances.
     NOSIMPLE :              supprime l’édition des statistiques univariées.
     Exemple
     proc corr data=voiture;
      var cylindree puissance;
     run;

                                                                           The CORR Procedure

                        2 Variables: Cylindree Puissance


                            Simple Statistics

      Variable    N        Mean     Std Dev         Sum     Minimum   Maximum Label

      Cylindree   18       1632 373.92985         29370      1166    2664 Cylindrée
      Puissance    18     84.61111 20.37628         1523    55.00000 128.00000 Puissance


                      Pearson Correlation Coefficients, N = 18
                         Prob > |r| under H0: Rho=0

                              Cylindree    Puissance

                      Cylindree     1.00000       0.79663
                      Cylindrée                <.0001

                      Puissance      0.79663      1.00000
                      Puissance      <.0001


     On a d’abord la liste des variables d’analyse, puis des statistiques descriptives usuelles
     pour chaque variable utilisée. Ensuite, SAS édite dans chaque case hors diagonale le
     coefficient de corrélation, et édite en dessous la probabilité de rejeter l’hypothèse de nullité
     du coefficient de corrélation. Ici, la probabilité est inférieure à 0.0001, on peut donc conclure
     sur l’existence d’une corrélation linéaire entre les deux variables.

5. 7. La procédure TTEST : test de comparaison d’échantillons

     Pour réaliser des tests d’égalité de la variance et de la moyenne de deux échantillons, on
     peut utiliser la procédure TTEST. On peut obtenir des résultats comparables avec la
     procédure NPAR1WAY si l’on travaille sur de petits échantillons, en utilisant alors des
     statistiques dites non-paramétriques.
     Syntaxe :
     PROC TTEST DATA=tableSAS ;
          VAR variable(s)Numérique(s) ;
          CLASS variableDeClasse ;
     RUN ;
     La procédure TTEST va réaliser un test d’égalité des moyennes de deux échantillons.
     L’instruction VAR permet de citer les variables dont les moyennes seront comparées.
     L’instruction CLASS permet de spécifier une variable dont les valeurs constituent les
     groupes d’observations à comparer. Cette variable ne doit avoir que deux valeurs.




                                                                                                   94
Exemple : on veut tester la différence des PIB (Gnpr) entre démocraties et dictatures :
proc format;
 value $ regim
 '1','2'='Democratie'
 '3'='Dictature'
 ;
run;

proc ttest data=pays.russet;
 var gnpr;
 class demo;
 format demo $regim.;
run;
Les résultats commencent par des statistiques descriptives par groupe sur la variable gini.
On y retrouve la moyenne avec un intervalle de confiance à 95% (LOWER CL et UPPER CL
pour MEANS) et l’écart-type (STD DEV) avec son intervalle de confiance, ainsi que le
minimum, le maximum et l’effectif de chaque groupe.
                         The TTEST Procedure

                           Statistics

                Lower CL     Upper CL Lower CL     Upper CL
Variable Demo      N     Mean Mean      Mean Std Dev Std Dev   Std Dev Std Err Minimum Maximum

Gnpr   Democratie   26    606.6 816.08 1025.6 406.74 518.63 715.92 101.71    72    2343
Gnpr   Dictature  21 171.28 241.29 311.29 117.66 153.79 222.09 33.561       66    762
Gnpr   Diff (1-2)    338.46 574.79 811.12 331.72 399.93 503.72 117.34



                       T-Tests

Variable Method                   Variances        DF t Value Pr > |t|

Gnpr        Pooled       Equal   45  4.90 <.0001
Gnpr        Satterthwaite Unequal 30.3   5.37 <.0001


                  Equality of Variances

   Variable Method               Num DF Den DF F Value Pr > F

   Gnpr         Folded F          25      20     11.37 <.0001


La procédure TTEST fournit les résultats d’un test d’égalité des moyennes sous deux
hypothèses : variances égales (equal) et variances différentes (unequal). La lecture des
sorties commence par le dernier tableau, qui correspond à un test d’égalité des variances.
Si la colonne PR>F de ce tableau contient un nombre inférieur au risque accepté
(généralement 5%), alors on rejette l’hypothèse de variances égales, et on lira, dans l’avant-
dernier tableau (intitulé T-Tests), la ligne UNEQUAL (c’est notre cas). Si le nombre est
supérieur à 0,05, alors la ligne à lire est EQUAL.
Le seuil de significativité du test de Student d’égalité des moyennes est inférieur à 1%. Au
seuil 1%, les PIB ne sont pas significativement égaux en moyenne.




                                                                                                 95
5. 8. La procédure STANDARD : réduction de variables quantitatives

     PROC STANDARD permet de réduire ou « standardiser » les variables quantitatives.
     Syntaxe :
     PROC STANDARD <liste d’options> ;
        BY <descending> liste_de_variables ;
        VAR liste_de_variables ;
        WEIGHT variables ;

     BY :     suivi du nom d’une variable qualitative indique que les statistiques sont
              calculées par groupe d’observations ; la table doit être préalablement triée.
     VAR :    variables standardisées et recopiées dans la table de sortie (instruction OUT=).
              Par défaut, toutes les variables numériques sont traitées.
     WEIGHT : nom de la variable contenant les pondérations des observations.


5. 9. La procédure TRANSPOSE : transposition des matrices

     PROC TRANSPOSE lit tout ou partie d’une table SAS et la recopie après transposition : les
     lignes deviennent des colonnes et les colonnes des lignes. Une nouvelle variable _name_
     contient alors, en sortie, les noms des variables transposées qui désignent maintenant les
     observations.
     Syntaxe :
     PROC TRANSPOSE<liste d’options> ;
        VAR liste_de_variables ;
        COPY liste_de_variables ;
        BY liste_de_variables ;

     BY :        une observation est créée pour chaque variable transposée et pour chaque
                 groupe ; la variable de groupe est incluse en sortie mais non transposée. La table
                 doit être préalablement triée.
     COPY :      les variables de la liste sont recopiées dans la table de sortie sans transposition.
     VAR :       les variables de la sliste sont transposées et recopiées dans la table de sortie ;
                 par défaut, toutes les variables numériques sont traitées.
     Options principales :
     OUT =  TABLE SAS spécifie le nom de la tables créée
     NAME = spécifie le nom de la variable créée qui contiendra les noms des anciennes
            variables pour désigner les observations (par défaut _name_).




                                                                                                  96
5. 10. La procédure IML : le langage matriciel

      SAS IML est un module spécialisé interprétant un langage de calcul matriciel.
      L’objet de base de manipulation du langage est une matrice, un tableau bidimensionnel
      (nrow X ncolumn) de valeurs numériques ou de caractères. Une table SAS peut être lue
      dans une matrice ou, inversement, créée à partir d’une matrice.
      SAS IML est une procédure SAS commençant par l’instruction PROC IML et se terminant
      par QUIT.

      5.10. 1. Lire les colonnes d’une table SAS et les mettre en matrice

              Syntaxe :
              Pour copier les variables var1 var2 … varn dans la matrice X :
              PROC IML ;
                    USE nom_de_table ;
                    READ ALL VAR {var1 var2 … varn} INTO X;
              QUIT;
              Pour copier toutes les variables dans la matrice X :
              PROC IML ;
                    USE table SAS ;
                    READ ALL VAR _ALL_ INTO X;
              QUIT;

      5.10. 2. Créer une table SAS à partir d’une matrice

              Syntaxe :
              Pour copier la matrice X dans une table SAS :
              PROC IML ;
                    … ;
                    CREATE nom_de_table FROM matrice_X ;
                    APPEND FROM matrice_X ;
                    CLOSE nom_de_table ;
              QUIT;

      5.10. 3. Définir un vecteur colonne ou une matrice

              Pour définir un vecteur colonne au cours d’une procédure IML :
              X={1 2 3} ;
              Pour définir une matrice 2X3 :
              A = {2 1 9, 1 3 4} ;
              ou :
              A = {2 1 9,
                   1 3 4}
              Pour transposer une matrice X :
                      Y=X` ;
                      ou :
                      Y=T(X) ;




                                                                                        97
5.10. 4. Les fonctions matricielles

        La fonction j(n1,n2,val) peut être utilisée pour créer une matrice de n1 lignes et n2
        colonnes dont tous les éléments prennent la valeur val :
              A=j(1,5,1)
        crée un vecteur ligne de 5 colonnes prenant la valeur 1.

        Pour créer la matrice identité, on utilise la fonction I :
              Ident=I(4)
        crée une matrice identité 4X4.

        La fonction DIAG permet de créer une matrice diagonale dont les éléments sont les
        termes diagonaux de la matrice argument. Les éléments hors de la diagonale sont
        nuls.

        La fonction VECDIAG permet de créer un vecteur dont les éléments sont les
        éléments diagonaux de la matrice argument.

        Le calcul des vecteurs et des valeurs propres d’une matrice s’effectue à partir des
        fonctions EIGVEC et EIGVAL.
               La fonction EIGVAL retourne le vecteur colonne des valeurs propres, triées
               dans leur ordre décroissant.
               La fonction EIGVEC retourne la matrice des vecteurs propres.

        La fonction TRACE retourne la trace de la matrice.

        La fonction DET calcule le déterminant d’une matrice.

        L’inverse d’une matrice peut être utilisée à partir de la fonction INV :
              Y=INV(X)

        Le calcul d’une puissance α d’une matrice s’effectue à partir de l’opérateur ** :
              Y=X**α




                                                                                            98
5.10. 4. Inversion des matrices
       Les résultats obtenus par la fonction INV ne sont pas toujours très stables. Ils ne le
       sont pas non plus lorsque l’on calcule une puissance négative d’une matrice.
       C’est pourquoi il est préférable de procéder à la diagonalisation de la matrice X
       (X=ULU` => Xα= ULαU`, avec _ négatif)
       selon les étapes ci-dessous :
       PROC IML ;
            USE nom_de_table1 ;
            READ ALL VAR {var1 var2 var3} INTO X ;
            L=DIAG(EIGVAL(X)) ;
            CREATE nom_de_table2 FROM L ;
            APPEND FROM L ;
            CLOSE L ;
       QUIT ;
       DATA nom_de_table2 ;
             SET nom_de_table2(KEEP=COL1-COL3) ;
             COL1=COL1**α ;
             COL2=COL2**α ;
             COL3=COL3**α ;
       RUN ;
       PROC IML;
             USE nom_de_table2;
             READ ALL VAR _ALL_ INTO Lα;
             USE nom_de_table1;
             READ ALL VAR {var1 var2 var3} INTO X;
             U=EIGVEC(X);
             Xα=U*Lα*U` ;
       QUIT;




                                                                                           99
Annexe 1 : formats disponibles sous SAS

Character   $ASCIIw.         Converts native format character data to ASCII representation

            $BINARYw.        Converts character data to binary representation

            $CHARw.          Writes standard character data

            $EBCDICw.        Converts native format character data to EBCDIC representation

            $HEXw.           Converts character data to hexadecimal representation

            $MSGCASEw.       Writes character data in uppercase when the MSGCASE system
                             option is in effect

            $OCTALw.         Converts character data to octal representation

            $QUOTEw.         Writes data values that are enclosed in double quotation marks

            $REVERJw.        Writes character data in reverse order and preserves blanks

            $REVERSw.        Writes character data in reverse order and left aligns

            $UPCASEw.        Converts character data to uppercase

            $VARYINGw.       Writes character data of varying length

            $w.              Writes standard character data

DBCS        $KANJIw.         Adds shift-code data to DBCS data

            $KANJIXw.        Removes shift code data from DBCS data

Date and    DATEw.           Writes date values in the form ddmmmyy or ddmmmyyyy
Time

            DATEAMPMw.d      Writes datetime values in the form ddmmmyy:hh:mm:ss.ss with
                             AM or PM

            DATETIMEw.d      Writes datetime values in the form ddmmmyy:hh:mm:ss.ss

            DAYw.            Writes date values as the day of the month

            DDMMYYw.         Writes date values in the form ddmmyy or ddmmyyyy

            DDMMYYxw.        Writes date values in the form ddmmyy or ddmmyyyy with a
                             specified separator

            DOWNAMEw.        Writes date values as the name of the day of the week

            EURDFDDw.        Writes international date values in the form dd.mm.yy or
                             dd.mm.yyyy

            EURDFDEw.        Writes international date values in the form ddmmmyy or
                             ddmmmyyyy

            EURDFDNw.        Writes international date values as the day of the week




                                                                                              100
Date and   EURDFDTw.d    Writes international datetime values in the form
Time                     ddmmmyy:hh:mm:ss.ss or ddmmmyyyy hh:mm:ss.ss

           EURDFDWNw.    Writes international date values as the name of the day

           EURDFMNw.     Writes international date values as the name of the month

           EURDFMYw.     Writes international date values in the form mmmyy or mmmyyyy

           EURDFWDXw.    Writes international date values as the name of the month, the day,
                         and the year in the form dd month-name yy (or yyyy )

           EURDFWKXw.    Writes international date values as the name of the day and date in
                         the form day-of-week, dd month-name yy (or yyyy)

           HHMMw.d       Writes time values as hours and minutes in the form hh:mm

           HOURw.d       Writes time values as hours and decimal fractions of hours

           JULDAYw.      Writes date values as the Julian day of the year

           JULIANw.      Writes date values as Julian dates in the form yyddd or yyyyddd

           MINGUOw.      Writes date values as Taiwanese dates in the form yyymmdd

           MMDDYYw.      Writes date values in the form mmddyy or mmddyyyy

           MMDDYYxw.     Writes date values in the form mmddyy or mmddyyyy with a
                         specified separator

           MMSSw.d       Writes time values as the number of minutes and seconds since
                         midnight

           MMYYxw.       Writes date values as the month and the year and separates them
                         with a character

           MONNAMEw.     Writes date values as the name of the month

           MONTHw.       Writes date values as the month of the year

           MONYYw        Writes date values as the month and the year in the form mmmyy or
                         mmmyyyy

           NENGOw.       Writes date values as Japanese dates in the form e.yymmdd

           PDJULGw.      Writes packed Julian date values in the hexadecimal format
                         yyyydddF for IBM

           PDJULIw.      Writes packed Julian date values in the hexadecimal format
                         ccyydddF for IBM

           QTRw.         Writes date values as the quarter of the year

           QTRRw.        Writes date values as the quarter of the year in Roman numerals

           TIMEw.        Writes time values as hours, minutes, and seconds in the form
                         hh:mm:ss.ss

           TIMEAMPMw.d   Writes time values as hours, minutes, and seconds in the form
                         hh:mm:ss.ss with AM or PM

           TODw.d        Writes the time portion of datetime values in the form hh:mm:ss.ss



                                                                                           101
Date and   WEEKDATEw.   Writes date values as the day of the week and the date in the form
Time                    day-of-week, month-name dd, yy (or yyyy)

           WEEKDATXw.   Writes date values as day of week and date in the form day-of-
                        week, dd month-name yy (or yyyy)

           WEEKDAYw.    Writes date values as the day of the week

           WORDDATEw.   Writes date values as the name of the month, the day, and the year
                        in the form month-name dd, yyyy

           WORDDATXw.   Writes date values as the day, the name of the month, and the year
                        in the form dd month-name yyyy

           YEARw.       Writes date values as the year

           YYMMxw.      Writes date values as the year and month and separates them with a
                        character

           YYMMDDw.     Writes date values in the form yymmdd or yyyymmdd

           YYMMDDxw.    Writes date values in the form yymmdd or yyyymmdd with a
                        specified separator

           YYMONw.      Writes date values as the year and the month abbreviation

           YYQxw.       Writes date values as the year and the quarter and separates them
                        with a character

           YYQRxw.      Writes date values as the year and the quarter in Roman numerals
                        and separates them with characters

Numeric    BESTw.       SAS chooses the best notation

           BINARYw.     Converts numeric values to binary representation

           COMMAw.d     Writes numeric values with commas and decimal points

           COMMAXw.d    Writes numeric values with periods and commas

           Dw.s         Prints variables, possibly with a great range of values, lining up
                        decimal places for values of similar magnitude

           DOLLARw.d    Writes numeric values with dollar signs, commas, and decimal points

           DOLLARXw.d   Writes numeric values with dollar signs, periods, and commas

           Ew.          Writes numeric values in scientific notation

           FLOATw.d     Generates a native single-precision, floating-point value by
                        multiplying a number by 10 raised to the dth power

           FRACTw.      Converts numeric values to fractions

           HEXw.        Converts real binary (floating-point) values to hexadecimal
                        representation

           IBw.d        Writes native integer binary (fixed-point) values, including negative
                        values

           IBRw.d       Writes integer binary (fixed-point) values in Intel and DEC formats




                                                                                              102
Numeric   IEEEw.d       Generates an IEEE floating-point value by multiplying a number by
                        10 raised to the dth power

          NEGPARENw.d   Writes negative numeric values in parentheses

          NUMXw.d       Writes numeric values with a comma in place of the decimal point

          OCTALw.       Converts numeric values to octal representation

          PDw.          Writes data in packed decimal format

          PERCENTw.d    Writes numeric values as percentages

          PIBw.d        Writes positive integer binary (fixed-point) values

          PIBRw.d       Writes positive integer binary (fixed-point) values in Intel and DEC
                        formats

          PKw.d         Writes data in unsigned packed decimal format

          PVALUEw.d     Writes p-values

          RBw.d         Writes real binary data (floating-point) in real binary format

          ROMANw.       Writes numeric values as Roman numerals

          SSNw.         Writes Social Security numbers

          S370FFw.d     Writes native standard numeric data in IBM mainframe format

          S370FIBw.d    Writes integer binary (fixed-point) values, including negative values,
                        in IBM mainframe format

          S370FIBUw.d   Writes unsigned integer binary (fixed-point) values in IBM mainframe
                        format

          S370FPDw.     Writes packed decimal data in IBM mainframe format

          S370FPDUw.    Writes unsigned packed decimal data in IBM mainframe format

          S370FPIBw.d   Writes positive integer binary (fixed-point) values in IBM mainframe
                        format

          S370FRBw.d    Writes real binary (floating-point) data in IBM mainframe format

          S370FZDw.d    Writes zoned decimal data in IBM mainframe format

          S370FZDLw.d   Writes zoned decimal leading sign data in IBM mainframe format

          S370FZDSw.d   Writes zoned decimal separate leading-sign data in IBM mainframe
                        format

          S370FZDTw.d   Writes zoned decimal separate trailing-sign data in IBM mainframe
                        format

          S370FZDUw.d   Writes unsigned zoned decimal data in IBM mainframe format

          w.d           Writes standard numeric data one digit per byte

          WORDFw.       Writes numeric values as words with fractions that are shown
                        numerically




                                                                                               103
Numeric   WORDSw.   Writes numeric values as words

          YENw.d    Writes numeric values with yen signs, commas, and decimal points

          Zw.d      Writes standard numeric data with leading 0s

          ZDw.d     Writes numeric data in zoned decimal format




                                                                                   104

						
Related docs
Other docs by slappypappy125