SAS base Introduction à SAS SQL SAS IML
Transcription
SAS base Introduction à SAS SQL SAS IML
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 1 Australie 2 Autriche 3 Belgique Gini 92.9 74.0 58.7 Farm 99.6 97.4 85.8 Rent . 10.7 62.3 Gnpr 1215 532 1015 Labo 14 32 10 Inst 11.3 12.8 15.5 Ecks 0 4 8 Deat 0 0 1 Demo 1 2 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 $x. Type de données lues Entiers Nombres décimaux (séparateur point) Nombres décimaux (séparateur virgule) Texte $UPCASEx. Texte Informat x. x.d NUMXx.d DDMMYYx. YYMMDDx. ANYDTDTEx. Date (jj/mm/aaaa) Date (aaaa/mm/jj) Date (tous formats) Type de données créées Numériques Données lues 123 3. Données créées 123 Numériques 123.45 6.2 123.45 Numériques 123,45 NUMX6.2 123.45 Caractère Caractère (texte en majuscules) Numérique (date) Numérique (date) ABC DEF $7. ABC DEF Abc dEf $UPCASE5. ABC D 25/01/2001 DDMMYY10. 15000 20010125 YYMMDD8. 15000 2001-01-25 01/25/2001 25.01.2001 ANYDTDTE10. 15000 Numérique (date) Exemple Informat utilisé 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 NOM Martineau Dupont Martin du Gard PRENOM Anne Sophie Marie-Anne Roger DAT_NAI 14/08/1955 01/12/1977 18/01/1988 VILLE DEPT PARIS 75 ORLEANS 29 53 65 NB_ACHATS 8 AN_ANCIEN 0,3 17 1,8 On utilisera un arrobas (@) suivi d’un nombre pour indiquer la colonne à laquelle commencent les valeurs du champ. Par ailleurs, on souhaite que le prénom figure en 1 ère 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 Mot-clé DLM CSV TAB EXCEL2002 EXCEL2000 EXCEL97 EXCEL5 EXCEL4 ACCESS2002 ACCESS2000 ACCESS97 WK1 DBF Type de fichier Fichier à caractère délimiteur (blanc par défaut) Fichier à séparateur virgule Fichier à séparateur tabulation Classeur excel 2002 Classeur excel 2000 Classeur excel 97 Classeur excel 5 Classeur excel 4 Table Access 2002 Table Access 2000 Table Access 97 Classeur Lotus 1-2-3 version 2 Fichier Dbase Nécessité ACCESS TO PC FILES Non Non Non Oui Oui Oui Oui Oui Oui Oui Oui Oui 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 CHASE JR RIGHENZI DE PABLOS Applicant First name MARJORIE J. NICOLAS MARIA Applicant country USA France Spain Job Code FLTAT1 MECH01 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 MILLS BOWER READING JUDD emp_firstname DOROTHY E EILEEN A TONY R 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 Concaténation de deux chaînes de caractères VarCar1 ! !varCar2 SUBSTR(varCar,début, longueur) UPCASE(varCar) LOWCASE(varCar) LEFT(varCar) TRIM(varCar) STRIP(varCar) COMPRESS(varCar) COMPBL(varCar) Exemples NUMSECU=NUM_INSEE ! !CLE Si NUMSECU=2750986345776 et CLE=33, alors NUMSECU= 275098634577633 Extraction d’un morceau d’une chaîne de caractères Mise en majuscule d’une chaîne de caractères Mise en minuscules d’une chaîne de caractères Suppression des blancs à gauche d’une chaîne de caractères Suppression des blancs à droite d’une chaîne de caractères Suppression des blancs à droite et à gauche d’une chaîne de caractères Suppression des blancs dans une chaîne de caractères Suppression des blancs consécutifs dans une chaîne de caractères SEXE=SUBSTR(NUMSECU,1,1) _’2’ UPCASE(VILLE)_ ’ PARIS CEDEX 03 ’ LOWCASE(VILLE)_ ‘ paris cedex 03 ’ LEFT(VILLE)_ ‘Paris CEDEX 03 ’ TRIM(VILLE)_ ‘Paris CEDEX 03’ STRIP(VILLE)_ ‘Paris CEDEX 03’ COMPRESS(VILLE)_ ‘ParisCEDEX03’ COMPBL(VILLE) _ ‘Paris CEDEX 03’ 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 12 . 6 var=sum(var1,var2,var3); var 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 12 . 6 var=mean(var1,var2,var3); var 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 12.12 var2 42.54 var3 6.472 var4 -6.47 var1a=round(var1) ; var2a=round(var2) ; var3a=round(var3,.1); var4a=round(var4,.1); var1 var2 12 43 var3 6.5 var4 -6.5 La function INT retourne la partie entière d’un argument. var=INT(var1) ; Exemple var1 var2 12.1242.54 var3 6.472 var4 -6.47 var1a=int(var1) ; var2a=int(var2) ; var3a=int(var3); var4a=int(var4); var1 var2 12 42 var3 6 var4 -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 E00002 E00003 E00004 E00005 E00007 Prime1 . . . 1900.95 Prime2 . . . 1901.91 Prime3 2704.07 . . 1902.86 2904.37 Prim4 2705.43 . . 1903.82 2905.83 Prim5 2706.78 12030.15 . 1904.77 2907.29 Prim6 2708.14 12036.18 . 1905.73 2908.74 Prim7 2709.50 12042.21 . 1906.68 2910.20 Prim8 2710.85 12048.24 . 1907.64 2911.66 Prim9 2712.21 12054.27 4218.99 1908.59 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 E00002 E00003 E00004 E00005 E00007 Sum_prim e Avg_bonu s 18956.98 60211.06 4218.99 17142.96 20361.21 2708 12042 4219 1905 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 ROUND(varNum, précision) ou ROUND(varNum RANUNI(0) LOG(varNum) EXP(varNum) SQRT(varNum) ABS(varNum) Description Arrondi à une précision donnée Génération d’un nombre au hasard entre 0 et 1 (inclus) Logarithme naturel Exponentielle Racine carrée Valeur absolue Exemples ROUND(CA)_125 ROUND(CA,0.1)_124.6 ROUND(CA,10)_120 RANUNI(0)_0.63562536741 LOG(CA)_4.8247875 EXP(CA/100)_3.475019 SQRT(CA)_11.160645 ABS(-1*CA)_124.56 Principales fonctions statistiques de l’étape Data Fonction SUM(varNum1, varNum2, varNum3…) ou SUM(of varNum1-varNum3) MEAN(varNum1, varNum2, varNum3…) ou MEAN(of varNum1-varNum3) MIN(varNum1, varNum2, varNum3…) ou MIN(of varNum1-varNum3) MAX(varNum1, varNum2, varNum3…) ou MAX(of varNum1-varNum3) MEDIAN(varNum1, varNum2, varNum3…) ou MEDIAN(of varNum1-varNum3) Description Somme de plusieurs variables Moyenne de plusieurs variables Minimum de plusieurs variables Maximum de plusieurs variables Médiane de plusieurs 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 DAY WEEKDAY WEEK TENDAY SEMIMONTH MONTH QTR SEMIYEAR YEAR Intervalle de date-heure DTDAY DTWEEKDAY DTWEEK DTTENDAY DTSEMIMONTH DTMONTH DTQTR DTSEMIYEAR DTYEAR Intervalle d’heure HOUR MINUTE SECOND 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 TODAY() Description Date du jour DAY(varDate) MONTH(varDate) YEAR(varDate) Jour extrait d’une date Mois extrait d’une date Année extraite d’une date Jour de la semaine extrait d’une date 1=dimanche, 2=lundi, 3=mardi… Construction d’une date SAS à partir des éléments jour, mois et année Nombre de débuts de période écoulés entre deux dates. La période est un mot-clé à choisir entre ‘week’, ‘month’ et ‘year’. Les débuts de période sont le er dimanche, le 1 du er mois, le 1 janvier respectivement. Décalage d’une date de n périodes dans le temps. La date en sortie de cette fonction est calquée sur le début de la période correspondante. WEEKDAY(varDate) MDY(mois,jour,année) INTCK(‘période’,début,fin) INTNX(‘période’,début, nbPériodes) Exemples TODAY()_16436 (31 décembre 2004) DAY(16436)_31 MONTH(16436)_12 YEAR(16436)_2004 WEEKDAY(16436)_6 MDY(12,31,2004)_16436 INTCK('‘eek'’16436, 16512)_11 (11 dimanche entre les deux dates) INTNX(‘week’,16436,11)_ 16508 (le résultat est forcément un dimanche. 16512 est un jeudi, 16508 est un dimanche) Fonction de retard Fonction LAG(var) Description Valeur lue à l’observation précédente Exemple var1=lag(_N_)_ Obs 1 2 3 4 var1 . 1 2 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 = NE (ou ^= ou !=) > < >= <= IN =: (sur les variables caractères uniquement) NOT AND OR Signification Egalité Différent de Supérieur strictement à Inférieur strictement à Supérieur ou égal à Inférieur ou égal à Prend une valeur dans un liste Commence par une certaine chaîne de caractères Contraire d’une condition Les deux conditions doivent être vérifiées par l’observation Au moins une des deux 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 19501962 (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 = NE (ou ^= ou !=) > < >= <= IN LIKE (sur les variables caractère uniquement) =: (sur les variables caractères uniquement) BETWEEN IS MISSING NOT AND OR Signification Egalité Différent de 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") ou dept IN ("22" "29" "35" "56") Egalité sur une partie de la valeur : dans la valeur testée, % remplace une chaîne inconnue, _ remplace un et un seul caractère inconnu Ex. : prenom LIKE ‘AN_E’ _ ANNE, ANGE prenom LIKE ‘%N%’ _ANNE, ANGE, NOEMIE, JULIEN Commence par une certaine chaîne de caractères Ex. : num_securite_sociale= :"2" Compris entre deux bornes (incluses) N’est pas renseigné Contraire d’une condition Les deux conditions doivent être vérifiées par l’observation Au moins une des deux conditions doit être 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 Champ 2 Champ 3 Champ 4 Champ 5 Champ 6 Champ 7 Champ 8 ID de l’employé Date de naissance de l’employé stocké sous la forme mm/jj/aaaa Nom complet de l’employé (prénom et nom) (47 caractères de long) Année de retraite ère Avantages monétaires pour la 1 année de retraite ème Avantages monétaires pour la 2 année de retraite ème Avantages monétaires pour la 3 année de retraite ème Avantages monétaires pour la 4 année de retraite Fichier partiel : E02837,09/17/1937,Alexander E01062,07/28/1922,Alice E01417,02/11/1944,Allen E00356,11/03/1937,Amy E02129,11/07/1945,Angela SERTUCHE,1997,5925,6221.25,6470.1,6793.61 ROBERSON,1982,9850,10342.5,10756.2,11294.01 OSWALD,2004,6999,7348.95,7642.91,8025.06 FULKERSON,1992,6297,6611.85,6876.32,7220.14 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 SERTUCHE ALICE ROBERSON 09/17/1937 R02837 5925 6221.25 6470.10 6793.61 07/28/1922 R01062 9850 10342.50 10756.20 11294.01 Lastname Avg_retire Retire_year Birth_60 SERTUCHE ROBERSON 6352.49 10560.68 1997 1982 01/01/1997 01/01/1982 2 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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 0000001 0000001 0000001 0000001 0000002 0000002 0000002 0000002 0000003 0000003 0000003 0000003 0000004 0000004 0000004 0000004 0000005 0000005 0000005 0000005 YEAR TARIF 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1600 1942 2285 1808 1600 1942 2285 1808 1761 2139 2516 1990 1761 2139 2516 1990 176 213 251 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 ID 1 3 4 data NEW ; set A B ; run ; B ID 2 5 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 ID 1 3 4 data NEW ; set A B ; by ID ; run ; B ID 2 5 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). LNAME ALLEN BADGE CARR A DIVS DATE A1 01DEC1998 A2 16JUN1997 A3 01SEP1998 LNAME ANDER BASH COX DIV B1 B2 B3 B MONTH 1 12 12 DAY 16 16 16 YEAR 2000 1999 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 ALLEN ANDER DIVS A1 B1 DATE 01DEC1998 16JAN2000 45 BADGE BASH CARR COX A2 B2 A3 B3 16JUN1998 16DEC2000 01SEP1998 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 1 2 3 4 5 6 7 8 9 10 Zone 1 1 2 2 3 3 4 3 5 1 6 4 7 2 8 2 9 0 10 0 A 1 0 3 8 1 3 1 1 4 2 B 15 0 28 1 13 21 1 4 2 6 C D E 0 7 9 0 0 1 0 3 2 0 10 0 0 1 6 0 4 0 0 2 44 0 1 10 1 0 78 0 0 71 F G H 0 0 12 0 0 5 0 1 7 0 3 25 0 0 21 0 1 18 0 0 13 0 0 18 30 0 22 83 0 17 I 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 1 2 3 4 5 6 7 8 9 10 ZONE 1 2 3 4 5 6 7 8 9 10 HERB courte haute courte courte courte courte courte courte courte courte BOSQUET oui oui oui oui oui oui non oui non non EAU proche éloignée proche proche moyenne proche éloignée moyenne éloignée éloignée HIPPO moyen aucun aucun importan aucun aucun aucun importan aucun aucun A 1 2 3 3 1 4 2 2 0 0 0 3 8 1 3 1 1 4 2 B 1 C 15 0 0 28 1 13 21 1 4 2 6 D 0 0 0 0 0 0 0 0 1 0 E 7 1 3 10 1 4 2 1 0 0 0 2 0 6 F 9 0 0 0 0 0 44 10 78 71 G 0 5 1 3 0 0 0 0 30 83 H 0 I 12 7 25 21 1 0 0 0 0 18 13 18 22 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 sans condition) Jointure à gauche (IF A) Jointure à droite (IF B) Jointure interne (ou 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 EMP_ID FIRSTNAME 1 RONALD 2 ALICE 4 JORN EMP_ID 2 4 6 SALAIRES EMP_SALARY 28 605 51 690 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 PUT(varNum,format.) INPUT(varCar,informat.) Description Conversion d’une variable numérique en variable caractère Conversion d’une variable caractère en variable numérique Exemples ‘Année ’!!PUT(YEAR(16436),4.) _’Année 2004’ INPUT(‘2004/12/31’,yymmdd10.) _16436 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 1 2 3 4 BOSQUET EAU 7 courte 9 courte 10 courte 12 haute HIPPO non non non oui éloignée éloignée éloignée éloignée aucun aucun aucun 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 101 201 213 214 401 412 John Betty Joe Jeff Sam Nick EMPTITRE head man. manager 101 respvent 201 respvent 201 manager 101 respvent 401 NUMSUP . 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 201 213 214 401 412 John Betty Joe Jeff Sam Nick head man. manager respvent respvent manager respvent . 101 201 201 101 401 John Betty Betty John Sam head man. manager manager head man. 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 sousensemble 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 6 7 8 5 1 3 2 4 Type Len Format Informat Label AFFECTION Num 8 AGRESSIVITE Num 8 FONCTION Num 8 INTELLIGENCE Num 8 NOM Char 22 $22. POIDS Num 8 TAILLE Num 8 VELOCITE Num 8 AFFECTION AGRESSIVITE FONCTION INTELLIGENCE $22. NOM POIDS TAILLE 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 OUT=nom_de_table Table SAS en entrée à trier. 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 BY liste de variables à imprimer. Toutes par défaut. 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 soustotal 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 Valable dans toutes les procédures d’analyse statistique Les valeurs manquantes de chaque variable du BY constituent un sousgroupe qui est pris en compte dans l’analyse. Nécessite un tri préalable de la table en entrée : tri par la même liste de variables que celle de l’instruction BY et dans le même ordre. Pendant la phase de calcul, SAS ne garde en mémoire que les observations d’un sous-groupe à la fois. Instruction CLASS Valable uniquement dans les procédures MEANS, UNIVARIATE et TTEST. Par défaut, les valeurs manquantes des variables de classe ne sont pas prises en compte dans l’analyse. Ne nécessite pas de tri préalable de la table en entrée. Toutes les observations de la table sont conservées pendant la phase de calculs. On évitera CLASS pour les 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 SEXE F H Ensemble 72 Structures de tableaux possibles (lignes ou colonnes) Juxtaposition (A B) Imbrication (A * B) B En lignes A A B B A En colonnes B B B B B 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, pourcentageligne 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 F 2 2 Cylindree Puissance 1790.50 91.5000000 1 4 Cylindree Puissance 1469.25 65.2500000 2 2 Cylindree Puissance 2053.00 104.0000000 GB 2 I J 1 1 Cylindree Puissance 1350.00 79.0000000 2 3 Cylindree Puissance 1484.00 96.3333333 1 2 Cylindree 1467.50 Puissance 69.0000000 1 Cylindree 1998.00 Puissance 115.0000000 2 U 1 Cylindree 1798.00 Puissance 82.0000000 1 1 Cylindree 1294.00 Puissance 68.0000000 ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ N Origine Finition Obs Variable Mean ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ D B 2 Cylindree 1986.00 Puissance 99.0000000 F TB 1 Cylindree 1588.00 Puissance 85.0000000 B 2 Cylindree 1680.50 Puissance 67.0000000 M 2 Cylindree 1258.00 Puissance 63.5000000 TB 2 Cylindree 2053.00 Puissance 104.0000000 B 1 Cylindree 1798.00 Puissance 82.0000000 GB 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 : BY : WEIGHT : OUTPUT : ID : variables (numériques) pour lesquelles on sollicite la procédure la procédure s’exécute pour chaque groupe d’observation variable de pondération permet de stocker les résultats dans une table 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 : NOPRINT : IDMIN : VARDEF : DF : N: WDF : WEIGHT : ALPHA : inverse l’ordre des observations dans la table en sortie empêche PROC MEANS de produire un état dans la fenêtre OUTPUT. pour retenir la valeur minimum de la variable ID au lieu de son maximum. diviseur calculé pour les variances et les covariances degrés de liberté (n-1) nombre d’observations somme des poids – 1 (variance corrigée – estimateur non biaisé) somme des poids. 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 niveau agrégé niveau agrégé niveau agrégé niveau agrégé niveau détaillé niveau détaillé niveau détaillé niveau détaillé B niveau agrégé niveau agrégé niveau détaillé niveau détaillé niveau agrégé niveau agrégé niveau détaillé niveau détaillé C niveau agrégé niveau détaillé niveau agrégé niveau détaillé niveau agrégé niveau détaillé niveau agrégé niveau détaillé _TYPE_ 0 1 2 3 4 5 6 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 Value Country 1.1 1.1 1.1 1.1 1.3 Obs Mauritius 134 161.1 Brazil 59 Guinea-Bissau 126 200.4 Indonesia Gambia 123 269.4 U.S.A. 80 Gabon 122 944.6 India 87 Trinidad 76 1232.1 China 15 Obs 100 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 Mean Std Deviation Skewness nombre d’observations moyenne écart-type 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 100 r e Si le coefficient q d’asymétrie est inférieur à 0, les observations sont concentrées à droite (la moyenne est supérieure à la médiane). On a un histogramme de la forme : u e 50 n 88 c y 40 F r e q est inférieur à -1 ou supérieure à 1, on a une distribution Si le coefficient très asymétrique. u 20 Uncorrected SS Somme des carrés non corrigés : Σ x _ Coeff variation (écart-type) e/ moyenne Kurtosis Permet de comparer l’étalement d’une distribution par rapport à la loi normale. Le ncoefficient 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, le coefficient est négatif. Si la distribution est plus étalée, le coefficient est c positif. Corrected SS Somme des carrés corrigés : Σ (x – m)_ y Std Error Mean (écart-type) / √(n) i i Quelques précisions sur le deuxième tableau Mode Range Interquartile range 0 Valeur la plus fréquente. Si on ne retrouve pas plusieurs fois la même valeur, on prend la plus petite. Différence entre la plus grande et la plus petite valeur Différence entre Q3 et Q1 (dans l’exemple ci-dessous, Q3-Q1=41) 33 39 45 51 57 6 Life_expect_1 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 ShapiroWilk, 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 : NOMISS : VARDEF : COV : NOSIMPLE : idem avec les corrélations de KENDALL. exclusion des observations à valeur manquante de tous les calculs. spécifie le diviseur utilisé pour les variances. impression de la matrice de variances covariances. 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 Cylindree Puissance 18 18 1632 373.92985 84.61111 20.37628 Std Dev Sum 29370 1523 Minimum Maximum Label 1166 2664 Cylindrée 55.00000 128.00000 Puissance Pearson Correlation Coefficients, N = 18 Prob > |r| under H0: Rho=0 Cylindree Cylindree Cylindrée Puissance Puissance Puissance 1.00000 0.79663 <.0001 0.79663 <.0001 1.00000 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 Variable Demo Gnpr Gnpr Gnpr Lower CL Upper CL Lower CL Upper CL N Mean Mean Mean Std Dev Std Dev Std Dev Std Err Minimum Maximum Democratie 26 606.6 816.08 1025.6 406.74 518.63 715.92 101.71 Dictature 21 171.28 241.29 311.29 117.66 153.79 222.09 33.561 Diff (1-2) 338.46 574.79 811.12 331.72 399.93 503.72 117.34 72 66 2343 762 T-Tests Variable Method Gnpr Gnpr Variances DF t Value Pr > |t| Pooled Equal 45 4.90 <.0001 Satterthwaite Unequal 30.3 5.37 <.0001 Equality of Variances Variable Method Num DF Den DF F Value Pr > F Gnpr 25 Folded F 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’avantdernier 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 : COPY : VAR : 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. les variables de la liste sont recopiées dans la table de sortie sans transposition. 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 DBCS Date and Time $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 $KANJIw. Adds shift-code data to DBCS data $KANJIXw. Removes shift code data from DBCS data DATEw. Writes date values in the form ddmmmyy or ddmmmyyyy 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 Time EURDFDTw.d Writes international datetime values in the form 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 Time Numeric WEEKDATEw. Writes date values as the day of the week and the date in the form day-of-week, month-name dd, yy (or yyyy) WEEKDATXw. Writes date values as day of week and date in the form day-ofweek, 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 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 Annexe 2 : quelques procédures pour les statistiques Toutes ne sont pas rattachées au module SAS/STAT : • • • • • PRINT, MEANS, SUMMARY, FREQ, CORR, UNIVARIATE sont dans SAS/Base, ARIMA, SPECTRA et FORECAST sont dans SAS/ETS, HPF dans le module SAS/HPF, IML dans le module SAS/IML, GPLOT, GCHART et GBARLINE sont dans SAS/GRAPH. Catégorie Procédure PRINT Statistique descriptive Vu en cours / TP Cours / TP MEANS / SUMMARY Cours / TP FREQ Cours / TP TABULATE Cours / TP REPORT / UNIVARIATE Cours / TP FREQ Cours / TP CORR UNIVARIATE Cours / TP Cours / TP TTEST / GLM Cours NPAR1WAY / Tests statistiques Rôle Liste les données avec des totaux et des sous-totaux. Calcule des statistiques descriptives (moyenne, somme, min et max, écart-type…) sur un jeu de données, éventuellement par groupe d’observations. SUMMARY est identique à MEANS, sauf qu’elle ne produit, par défaut, aucun résultat dans la fenêtre Output. Fournit les répartitions d’individus selon une ou deux variables qualitatives. Propose les statistiques des procédures MEANS / SUMMARY et FREQ dans un tableau dont la mise en forme est plus aisément contrôlable. Combine les possibilités des procédures PRINT et TABULATE. Reprend les sorties fournies par MEANS ou SUMMARY et ajoute d’autres statistiques plus complètes, ainsi que des graphiques (histogramme, adéquation à une loi). Propose des tests de liaison entre deux variables qualitatives (chi-2, V de Cramer, tests exacts associés) ainsi que des tests de tendance (Cochran-Armitage). Calcule des corrélations entre variables quantitatives et teste la nullité du coefficient de corrélation. Propose des tests de normalité et de nullité de la moyenne. Compare avec un test statistique les moyennes de groupes d’observations. La procédure TTEST se limite à l’étude de deux groupes, tandis que GLM permet les études à plusieurs groupes et propose davantage de tests. Cependant, l’hypothèse statistique pour l’utilisation de la procédure GLM (égalité des variances) est plus contraignante que pour TTEST. Dans les deux procédures, les tests sont paramétriques. Réalise des tests non-paramétriques de comparaison de moyennes à deux groupes ou davantage. 105 GLM / ANOVA Analyse variance de TP la GLM /MIXED / Graphiques GCHART GPLOT GBARLINE BOXPLOT Echantillonnage SURVEYSELECT / RANK / STDIZE / TRANSREG / GLMMOD / KDE / STDIZE / MI / MIANALYZE / Préparation des données Données manquantes Cours Cours / TP / / Permet l’étude de l’impact de facteurs qualitatifs et quantitatifs contrôlés sur une donnée quantitative. La procédure GLM reprend et enrichit les fonctionnalités de la procédure ANOVA, plus ancienne. Cette dernière fournit des résultats plus rapidement dans le cas de plans d’expérience équilibrés. Permet l’étude de l’impact de facteurs qualitatifs et quantitatifs contrôlés et non contrôlés sur une donnés quantitative. La procédure GLM contient une instruction RANDOM dont les fonctionnalités sont plus étendues dans la procédure MIXED, construite expressément pour ce type d’analyse et plus récente. Trace des histogrammes, des diagrammes en bâtons et des diagrammes circulaires. Trace des nuages de points, des courbes et des nuages où les points sont de taille variable. Superpose un histogramme et une courbe (procédure disponible à partir de la version 9). Trace des graphiques « boîtes à moustaches ». Tire des échantillons d’observations à partir d’une table SAS en proposant de nombreux modes d’échantillonnage. ème Remplace les valeurs par leur rang (1 pour le minimum, 2 pour la 2 plus petite valeur, etc…) ce qui permet des analyses non-paramétriques. Centre (=rend la moyenne nulle) et réduit (=rend la variance égale à 1) une ou plusieurs variable quantitatives. Construit des indicatrices (variables valant 0 ou 1) à partie de variables qualitatives. La procédure TRANSREG construit des macro-variables contenant la liste des indicatrices créées, et gère mieux labels et formats que la procédure GLMMOD. Complète la répartition des valeurs d’une variable quantitative à l’aide d’un « noyau » nonparamétrique ; cela permet l’édition d’une courbe de densité lissée. Permet le remplacement de données manquantes par la moyenne, éventuellement par la moyenne du groupe d’observations si l’on utilise son instruction BY. Permettent de remplacer les valeurs manquantes par des valeurs simulées pour l’analyse statistique. Ces deux procédures travaillent de pair (MI en amont de l’analyse statistique, MIANALYZE en aval). 106 PRINCOMP TP CORRESP TP FACTOR CLUSTER TREE / / / FASTCLUST / LOGISTIC / CATMOD / DISCRIM STEPDISC / / Fournit les résultats de l’estimation d’un modèle de régression linéaire. On peut y étudier et y prédire les valeurs d’une variable quantitative en fonction de variables quantitatives seulement (procédure REG), ou de variables de toutes natures (procédure GLM, plus récente). Effectue une régression robuste (=qui minimise l’impact d’individus atypiques) par diverses méthodes. Effectue une régression PLS (régression sur des facteurs pouvant traiter des données multicorrélées). Construit des modèles de régression sur des variables dont la distribution ne correspond pas à une loi normale (Gamma, Log-normale, Poisson, etc.). La procédure CATMOD ne traite que les cas de données qualitatives. Construit des modèles à équations structurelles (variables latentes). Construit un modèle de régression sur des données censurées à droite (appelées également données de survie). Calcule des indicateurs usuels sur les données « de survie », dont la fonction de survie et le produit-limite de Kaplan-Meier. Construit un modèle de régression sur des données censurées à droite avec une hypothèse de hasards proportionnels. La procédure TPHREG permet d’intégrer des variables explicatives qualitatives au modèle. Fournit les résultats et les aides à l’interprétation d’une analyse en composantes principales (ACP). Fournit les résultats et les aides à l’interprétation d’une analyse des correspondances simple (AFC) ou multiple (ACM). Fournit les résultats et les aides à l’interprétation de plusieurs méthodes d’analyse factorielle. Fournit les résultats et les aides à l’interprétation d’une classification ascendante hiérarchique. Fournit le dendogramme à l’issue d’une classification hiérarchique. Fournit les résultats et les aides à l’interprétation d’une classification par centres mobiles (Kmoyennes ou nuées dynamiques). Fournit les résultats de l’estimation d’un modèle de régression logistique, où une variable qualitative est expliquée par des variables quantitatives ou qualitatives. La procédure LOGISTIC reprend toutes les fonctionnalités de la procédure CATMOD, plus ancienne, et les enrichit de sorties plus orientées vers les modèles réellement décisionnels ou datamining. Fournit les résultats et les aides à l’interprétation d’une analyse discriminante. Choisit le modèle le plus approprié pour la constitution d’une analyse discriminante. PLAN / Effectue des ventilations d’individus dans des plans d’expériences. REG / GLM Régression Données « de survie » Analyses factorielles Typologies Modèles décisionnels Plans d’expérience TP ROBUSTREG / PLS / GENMOD / CATMOD / CALIS / LIFEREG / LIFETEST / PHREG / TPHREG / 107 Séries temporelles Autres méthodes statistiques ARIMA / HPF / FORECAST / SPECTRA / IML Cours / TP Effectue des ajustements de séries chronologiques et des prévisions à l’aide du modèle ARIMA de Box et Jenkins. Propose la prévision de données quantitatives suite à l’analyse d’une série chronologique de valeurs par diverses méthodes. La procédure HPF apparaît avec la version 9 en reprenant de nombreuses fonctionnalités de la procédure FORECAST. Conduit l’analyse spectrale de données temporelles. Propose un langage matriciel très complet sachant traiter les tables SAS et produire des graphiques et des listings. D’après : SAS – Maîtriser SAS Base et SAS Macro – Hélène Kontchou Kouomegni et Olivier Decourt – Dunod. 108