Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
1. Notions de base
SAS (Statistical Analysis System) est un progiciel qui a été conçu dans les années 1970 dans le but d’effectuer
l’analyse statistique des données. Ses différents modules permettent, entre autres, de faire :
Dans le cadre de ce cours, ce sont principalement les modules BASE, STAT et GRAPH qui seront abordés.
Fenêtre Editor :
C’est dans cette fenêtre que les programmes sont écrits et soumis. Un programme SAS peut être exécuté en
totalité ou en partie (en sélectionnant la partie du programme à exécuter). L’exécution se fait par le menu Run
Submit, en cliquant sur le bouton raccourci présentant la silhouette d’un coureur ou par clic droit Submit
Selection (ou Submit All).
Fenêtre Log :
C’est dans cette fenêtre que les résultats d’une exécution sont présentés. Cette fenêtre est indispensable pour
valider le succès de l’exécution d’un programme et pour détecter la présence d’éventuelles erreurs ou
d’avertissements.
Les résultats générés par certaines procédures sont affichés dans cette fenêtre.
Fenêtre Explorer :
Dans cette fenêtre, il est possible de naviguer dans le contenu de l’environnement de la session SAS, dont les
librairies et tables de données assignées, importées ou créées.
Fenêtre Results :
Une table des matières des sorties affichées dans la fenêtre Output est présentée et permet d’accéder
directement à ces sorties.
Le langage SAS permet la manipulation et l’analyse de données contenues principalement dans des tables de
données, qui sont des structures d’entreposage bidimensionnelles (ligne et colonne). Dans ce document, il sera
souvent question de variables (colonnes) et d’observations (lignes, enregistrements).
L’écriture d’un programme SAS se fait principalement par l’utilisation de deux types d’étapes : les étapes DATA
et les étapes PROC (procédures).
C’est dans les étapes DATA que les principales manipulations de données sont effectuées. Cette étape permet
de créer de nouvelles tables de données, soit à partir d’une table existante, en important des données brutes,
en saisissant des données directement ou en générant des données.
Les étapes PROC permettent d’effectuer des traitements à partir des données, comme des tris, des sommaires,
des analyses, des graphiques et des tableaux. Certaines étapes PROC permettent également de modifier le
format de tables de données, comme dans le cas de la procédure TRANSPOSE.
En plus de ces étapes, des énoncés globaux peuvent s’ajouter, comme les énoncés FILENAME, LIBNAME,
OPTIONS ou TITLES. Les effets de ces énoncés demeurent actifs pour toute la durée de la session SAS, à moins de
les modifier.
Une étape DATA est constituée de plusieurs énoncés, qui doivent tous se terminer par un «;». La fin d’une étape
DATA est identifiée par un énoncé RUN (non obligatoire, mais fortement recommandé !).
DATA nom_table;
…;
RUN;
Pour créer une nouvelle table de données à partir d’une table SAS existante, l’énoncé SET est utilisé. Nous
verrons plus loin comment créer une table SAS à partir de plus d’une table SAS.
DATA table_en_sortie;
SET table_en_entree;
RUN;
L’étape DATA précédente constitue un exemple très simple. Nous verrons plus loin qu’il est possible d’utiliser
plusieurs types d’énoncés à l’intérieur d’une même étape DATA. Ces énoncés permettront souvent de modifier
les données en entrée pour produire une nouvelle table de données en sortie. Pour le moment, il importe de
retenir que dans la très grande majorité des cas, les manipulations qui seront faites par SAS selon les énoncés
seront exécutées de la première à la dernière observation (ligne par ligne) sur la table de données en entrée.
Les étapes PROC permettent d’utiliser des procédures déjà établies par SAS. Une très grande variété de tâches
peut être effectuée, que ce soit pour manipuler des données, effectuer des analyses, produire des tableaux ou
construire des graphiques.
PROC …;
…;
RUN;
Dans le cas de certaines procédures, il est nécessaire d’ajouter un énoncé QUIT; après le RUN;.
Un énoncé SAS débute par un mot clé et se termine par un «;». Les mots-clés identifient le type d’énoncé.
Afin d’assurer une certaine uniformité dans la programmation SAS, il est recommandé de respecter quelques
conventions :
Dans SAS, les colonnes sont des variables et les lignes (enregistrements) sont des observations.
Chaque variable et chaque table de données doit être nommée en tenant compte des règles suivantes :
- 1 à 32 caractères;
- majuscules et/ou minuscules;
- débute par une lettre ou le caractère « _ »;
- contient des lettres, des chiffres ou le caractère « _ »;
- aucun caractère spécial ou lettre accentuée.
Il n’est pas nécessaire de respecter la casse lorsque vous faites référence à des noms de variables ou de tables
de données. SAS ne fait pas la distinction entre les majuscules et les minuscules, à l’exception du contenu des
variables (chaînes de caractères).
Dans les nombres, la partie décimale est séparée par un point et non une virgule.
1.5 Commentaires
* Mes commentaires;
/* Mes commentaires */
La première façon est utile pour mettre certains énoncés spécifiques en commentaires afin d’évider de les
soumettre. En effet, puisque chaque énoncé se termine par un «;», il suffit d’ajouter le symbole * pour que
l’énoncé soit ignoré.
La seconde façon est utile pour mettre des sections complètes en commentaires. Il n’y a pas de longueur
maximale pour ce type de commentaires et des «;» peuvent se retrouver dans le texte.
SAS reconnaît deux types de variables, sur lesquels différents formats peuvent être appliqués :
- Numérique
- Caractère (alphanumérique)
Il est à noter que les dates sont des variables numériques, sur lesquelles sont appliqués des formats particuliers.
Nous reviendrons sur les formats et les dates un peu plus tard.
En SAS, les valeurs manquantes sont identifiées de façon différente en fonction de leur type. Voici la
représentation des valeurs manquantes en fonction du type :
- Numérique : .
- Caractère : " " ou MISSING
1.8 Librairie
Le plus haut niveau d’organisation des données dans SAS est la librairie. Il s’agit d’un regroupement de plusieurs
tables SAS, qui peut être permanent ou temporaire. Dans le cas des librairies permanentes, les tables SAS
doivent toutes se retrouver dans un même dossier sur votre ordinateur ou lecteur réseau. Les tables de données
SAS contenues dans la librairie temporaire WORK (par défaut dans SAS) existent pour la durée de la session SAS
seulement. Lorsque la librairie n’est pas spécifiée au moment de la création d’une table SAS, c’est dans le WORK
que cette table est créée. L’assignation à une librairie se fait par un énoncé libname, qui est un type d’énoncé
global (pour toute la durée de la session). Dans un programme, il est possible d’utiliser autant d’énoncés
libname que nécessaire.
Le nom d’une librairie doit avoir entre 1 et 8 caractères et ce nom ne peut pas débuter par un chiffre.
Une référence à une librairie peut être modifiée par l’utilisation d’un nouvel énoncé libname avec le même nom
de librairie, alors que cette référence peut être supprimée par l’utilisation de l’option CLEAR dans l’énoncé. Pour
supprimer les références à toutes les librairies de la session SAS courante, le mot-clé _all_ est utile.
libname logistat"&path.";
libname logistat clear;
libname _all_ clear;
Une fois les librairies assignées, il est possible de visualiser leur contenu dans la fenêtre explorateur.
Il est impératif de valider le log lorsque des instructions sont soumises, afin de vérifier si l’exécution s’est bien
déroulée. Ainsi, il faut rechercher la présence d’erreurs ou d’avertissements qui témoignent la plupart du temps
d’un problème. En plus des erreurs et des avertissements, certaines notes peuvent attirer l’attention sur d’autres
types de problèmes plus subtils. Pour le moment, voici quelques expressions que je cherche de façon systématique
dans le log afin de vérifier si tout s’est bien déroulé :
- ERROR
- WARN
- UNIN
- MERGE ST
Lorsque plusieurs étapes sont soumises simultanément et que des erreurs sont mentionnées dans le log, il est
inutile de vérifier chacun des messages d’erreurs, puisque c’est uniquement le premier qui fait du sens. En effet,
les autres erreurs ne sont en général qu’une conséquence de la première erreur.
2. Les données
Pour créer une nouvelle table de données sans table ou fichier en entrée, les énoncés DATALINES ou CARDS
seront utiles, en combinaison avec l’énoncé INPUT, qui permet de nommer les variables, de spécifier le type de
ces variables, l’endroit où se trouvent leurs valeurs et la façon de les lire (informat). Les variables
alphanumériques sont désignées en faisant suivre leur nom d’un espace et d’un $.
Il y a deux façons d’entrer des données avec l’énoncé DATALINES. La première façon est une lecture par liste et
la seconde façon est une lecture par colonne.
Les valeurs des variables sont écrites l’une après l’autre et séparées par un ou plusieurs espaces (sur une ligne)
ou par un retour de chariot (sur deux lignes différentes). Les règles suivantes doivent être respectées :
- maximum de 8 caractères pour les variables alphanumériques, sans espace (les accents sont permis,
mais non les caractères spéciaux);
- représenter une valeur manquante par un «.».
data liste1;
input nom $ age poids;
datalines;
Amélie 12 100
Ema 9 70
Loic 17 130
Justin 15 .
;
run;
Pour écrire plus d’une observation par ligne, les symboles «@@» doivent être ajoutés à la fin de l’énoncé INPUT.
Il s’agit d’un type de lecture très simple, qui ne convient pas à toutes les données (dates, valeurs avec espaces,
nombres à virgule, …), mais qui peut s’avérer utile dans le cas d’un vecteur de valeurs.
data liste2;
input a @@;
datalines;
3 7 2 8 133 2 6 5 8 2 6 10
5 8 3 1 5 14 5 7 29 2 5 9
;
run;
Les numéros des colonnes pour chacune des variables sont spécifiés dans l’énoncé INPUT. Dans ce cas, la saisie
des valeurs doit respecter l’emplacement des colonnes de façon rigoureuse.
data colonne;
input nom $ 1-6 age 7-8 poids 9-12;
datalines;
Amélie12 100
Ema 9 70
Loic 17 130
Justin15 .
;
run;
2.2.1 Excel
La procédure IMPORT permet d’importer des données EXCEL dans SAS et de créer une table de données SAS avec
ces données.
Il est possible que la procédure précédente génère des erreurs selon l’installation de votre ordinateur (ex :
version de Windows). Dans ce cas, vous pouvez utiliser d’autres variantes de la procédure IMPORT, comme
celle-ci :
Voir à la fin du document pour la source des données utilisées dans les exemples. i
Avec la procédure IMPORT, plusieurs options sont possibles, mais les plus courantes sont les suivantes :
Il est possible d’importer des données provenant d’un classeur EXCEL directement par la création d’une librairie
référant au classeur. Dans ce cas, il est nécessaire de spécifier l’engin à utiliser, dans ce cas EXCEL. Chaque feuille
du fichier sera considérée comme une table de données distincte.
data logistat.utilisation;
set libxls.'stats_donnees$'n;
run;
Il est important de mettre fin au lien avec le classeur EXCEL dès qu’il n’est plus requis, car en conservant la librairie,
c’est comme si le classeur était toujours ouvert. Dans ce cas, il n’est accessible qu’en lecture seule par les autres
utilisateurs, s’il y a lieu.
Comme c’était le cas pour la procédure IMPORT, il est possible que cette dernière version génère également une
erreur. Dans ce cas, vous pouvez remplacer EXCEL par XLSX dans l’énoncé LIBNAME, en adaptant le code de la
façon suivante :
data /*logistat.*/utilisation;
set libxls.stats_donnees;
run;
Pour créer une nouvelle table de données avec des données brutes en entrée, par exemple sous forme de fichier
texte, l’énoncé INFILE est utilisé. Deux méthodes sont possibles :
Dans les deux cas, l’énoncé INFILE précède l’énoncé INPUT. Plusieurs options sont possibles pour spécifier le
format du fichier à importer.
data logistat.arbres_remarquables;
infile arbres dsd missover dlm=";" firstobs = 2;
input type_lieu :$15. nom_lat :$30. nom_fr :$50. type_arbre :$10.
diametre pos_mesure :$3. multi_trinc :$1. date_plante $
type_prop :$20. longitude :$15. latitude :$15. generique :$15.
liaison :$10. specifique :$50. direction :$5. nom_topo :$50.;
run;
Voir à la fin du document pour la source des données utilisées dans les exemples. ii
Lorsqu’il y a un informat (façon de lire les données) spécifié pour une variable dans l’énoncé INPUT, il faut faire
attention à la façon dont SAS va l’interpréter. Par exemple,
En l’absence du «:», SAS continue la lecture du champ pendant 12 caractères malgré la présence de délimiteurs.
- DSD : indique que les valeurs sont séparées par des délimiteurs autres que des espaces; permet de
considérer une donnée manquante lorsque deux délimiteurs de suite sont lus; ignore des guillemets
encadrant des valeurs alphanumériques.
- MISSOVER : permet de traiter une valeur manquante à la toute fin d’un enregistrement correctement.
- DLM= : permet de spécifier des délimiteurs différents des espaces ou des virgules. Dans le cas d’un «;»,
l’option s’écrit de cette façon : DLM=";". Dans le cas d’une tabulation, il faut utiliser sa représentation
hexadécimale : DLM="09"x.
- FIRSTOBS= : permet d’éviter de considérer la ou les premières lignes comme étant des données.
FIRSTOBS=2 indique que la lecture doit débuter à partir de la deuxième ligne.
Pour importer des données facilement dans SAS, vous pouvez utiliser l’assistant d’importation, accessible par le
menu File Import data. Un menu permet de choisir des options d’importation. Comme SAS construit une étape
PROC IMPORT, il est possible d’enregistrer ce code pour l’ajouter directement à notre programme. Par contre, il
est toujours nécessaire de valider les données importées, afin de s’assurer qu’elles respectent en tous points leur
format d’origine.
Plusieurs méthodes sont possibles pour exporter des données dans un autre format que celui de SAS, notamment
vers Excel. Certaines méthodes nécessitent des composantes ou installations particulières, alors que d’autres sont
accessibles à partir d’une licence SAS Base. Avec l’utilisation de Windows 10, plusieurs problèmes ont été
rencontrés. Les exemples présentés ici fonctionnent dans mon cas, mais il est possible que vous deviez ajuster
certaines options.
La procédure EXPORT permet d’exporter des données dans différents formats : .txt, .csv ou .xls.
Il est à noter que lors de l’exportation vers un fichier plat, par exemple de format .csv, les valeurs exportées
correspondent aux formats SAS affichés lors de la consultation de la table SAS (le concept de format est abordé
plus loin dans le document). Il peut donc être utile de modifier ces formats au préalable, dans une étape DATA
par exemple.
Comme dans le cas de l’importation de données depuis EXCEL, il est possible d’exporter des données vers EXCEL
à l’aide de l’énoncé LIBNAME.
Cette méthode est pratique, mais son principal inconvénient réside dans le fait qu’il n’est pas possible d’écraser
une feuille ou un fichier du même nom par une nouvelle version.
data expor.arbresrem;
set logistat.arbres_remarquables;
run;
Finalement, il est possible d’exporter des données dans un fichier texte externe à l’aide des énoncés FILE et PUT,
dans une étape DATA. Pour ce faire, un énoncé FILENAME peut être utilisé, exactement comme dans le cas de
l’énoncé INFILE. L’énoncé PUT sert à l’énumération des variables sélectionnées (toutes les variables de la table en
entrée ne sont pas nécessaires).
DATA _null_;
FILE "&path.\Export_file.txt" DLM=",";
SET logistat.arbres_remarquables;
PUT nom_fr type_arbre diametre;
RUN;
Ces opérateurs arithmétiques sont souvent utilisés dans la construction de nouvelles variables ou pour vérifier
une condition. Par exemple, on pourrait vouloir construire une nouvelle variable en additionnant les valeurs de
deux autres variables. Attention toutefois à la présence de valeurs manquantes ! Les opérateurs + et – retournent
une valeur manquante dès qu’il y a une valeur manquante dans l’un des termes de l’addition. Pour ignorer les
valeurs manquantes ou les considérer comme des 0, c’est la fonction SUM() qui doit être utilisée (voir section sur
les fonctions plus loin).
Plusieurs opérateurs logiques sont disponibles dans SAS et peuvent être utilisés pour sélectionner des données
ou lors de la création de variables :
Autant dans les étapes DATA que les étapes PROC, il peut être nécessaire de sélectionner un sous-ensemble des
observations d’une table de données. Deux types d’énoncés permettent de sélectionner un sous-ensemble
d’observations : les énoncés IF et WHERE. Ces deux énoncés s’utilisent de façon similaire, mais ont des
particularités qui leurs sont propres. Certains opérateurs sont disponibles avec l’énoncé WHERE, mais pas avec
l’énoncé IF.
Dans une étape PROC, il est nécessaire d’utiliser l’énoncé WHERE, puisque IF n’est pas disponible.
Toutefois, dans une étape DATA, les deux types d’énoncés sont possibles et donnent les mêmes résultats, à
l’exception de deux cas :
- lorsqu’une conséquence explicite découle de l’énoncé (IF … THEN …), il est nécessaire d’utiliser le IF;
- lorsqu’il y a plus d’une table en entrée et que la variable d’intérêt pour la sélection ne se retrouve pas
dans toutes les tables.
En plus de ces opérateurs, les symboles % et _ permettent de simplifier beaucoup l’écriture de la sélection. Le
symbole % remplace n’importe quel nombre de caractères. Le symbole _ permet de remplacer un seul caractère.
data arbres3;
set logistat.arbres_remarquables;
where nom_lat like '%ameri%';
run;
data arbres4;
set logistat.arbres_remarquables;
where pos_mesure like 'DH_';
run;
La création de variables se fait dans une étape DATA. C’est le signe = qui permet d’assigner une valeur à une
nouvelle variable. Il est possible de créer des variables numériques, alphanumériques ou de dates.
data arbres;
set logistat.arbres_remarquables;
ville = "Québec";
run;
Dans SAS, il existe un grand nombre de fonctions qui peuvent être utilisées, souvent pour créer de nouvelles
variables (étapes DATA) ou dans des énoncés conditionnels (étapes DATA ou PROC). Certaines fonctions s’utilisent
sur les variables numériques, alors que d’autres sur des variables caractères. Il existe aussi un grand nombre de
fonctions qui peuvent être utilisées pour le traitement des dates SAS. Dans le tableau suivant, les plus courantes
sont présentées. N’hésitez pas à faire des recherches sur le web à ce sujet ! Voici quelques exemples d’utilisation :
data ex_fonctions;
set logistat.arbres_remarquables;
Dans une étape DATA, il est possible de faire des opérations sur des données de façon conditionnelle. Les énoncés
conditionnels permettent notamment de :
Deux types de syntaxe, qui permettent d’arriver au même résultat, sont présentées dans l’exemple qui suit :
data arbres5;
set logistat.arbres_remarquables;
run;
Lors de la création d’une variable alphanumérique de façon conditionnelle, il faut porter attention à la longueur
de la variable. En effet, c’est la première valeur assignée qui détermine la longueur de la variable. Afin d’éviter
d’avoir des chaînes de caractères tronquées dans la table de données créée, deux méthodes sont possibles :
- ajouter des espaces à la fin de la chaîne de caractères (entre les guillemets) pour créer une variable plus
longue;
- ajouter un énoncé LENGTH en début d’étape DATA pour spécifier la longueur de la variable qui sera créée.
run;
Le concept des énoncés conditionnels peut être élargi en considérant les groupes DO…END, qui permettent de
regrouper plusieurs énoncés (conséquences) pour une même condition. Ces groupes sont principalement utilisés
en combinaison avec les énoncés IF…THEN et ELSE…THEN.
data arbres8;
set logistat.arbres_remarquables;
if type_prop = "Privés" then do;
type_niv1 = "Privés";
type_niv2 = "s.o. ";
end;
else if type_prop = "Privés:S.I.Q." then do;
type_niv1 = "Privés";
type_niv2 = "S.I.Q.";
end;
else if type_prop = "Public" then do;
type_niv1 = "Public";
type_niv2 = "s.o.";
end;
else if type_prop = "Public:Arbre mitoyen" then do;
type_niv1 = "Public";
type_niv2 = "Arbre mitoyen";
end;
else if type_prop = "Public:Entretenu Par" then do;
type_niv1 = "Public";
type_niv2 = "Entretenu Par";
end;
else if type_prop = "Public:Terrain Privé" then do;
type_niv1 = "Public";
type_niv2 = "Terrain Privé";
end;
run;
Dans une étape data, il est possible de n’utiliser qu’un sous-ensemble des variables de la table de données en
entrée. Pour ce faire, il est nécessaire d’utiliser les énoncés DROP ou KEEP. Ces énoncés ne modifient pas la table
en entrée, puisqu’ils agissent sur l’utilisation qu’on en fait.
Modifier le nom de variables lors de la création d’une nouvelle table de donnée se fait en utilisant un énoncé
RENAME dans l’étape DATA. Un seul énoncé suffit pour plusieurs variables à renommer. Voici un exemple :
data arbres10;
set logistat.arbres_remarquables;
rename pos_mesure = position_mes
nom_fr = nom_francais
;
run;
Le tri de données en SAS se fait en utilisant la procédure SORT. Dans cette procédure, il est nécessaire de spécifier
la table en entrée, de même que la ou les variables selon lesquelles le tri doit être effectué.
Il est parfois utile de ne pas écraser la table en entrée. Par exemple, vous pourriez vouloir avoir plusieurs versions
d’une même table, mais avec des tris différents. Dans ce cas, l’utilisation de l’option OUT= est nécessaire et permet
de nommer la nouvelle table de données qui sera créée.
L’option NODUPKEY de cette procédure permet, en fonction de la ou des variables de tri mentionnées dans le BY,
de ne conserver qu’une ligne par valeur de la variable de tri ou par combinaison de valeurs des variables de tri.
Cette option permet, par exemple, de créer une liste d’identifiants sans doublons. Il est à noter que l’option
NODUP ne donne pas le même résultat. En effet, avec cette option, c’est toute l’observation qui doit être
dédoublée (toutes les valeurs des variables similaires) pour qu’elle soit supprimée.
Par défaut, la table de données est triée en fonction de l’ordre croissant (ASCII pour des variables
alphanumériques) de la ou des variables spécifiées dans l’énoncé BY. En utilisation l’option DESCENDING devant
une variable, l’ordre de tri est inversé pour cette variable.
La fusion de tables de données peut se faire de deux façons : la première en combinant les observations de plus
d’une table de données les unes à la suite des autres (concaténation) et la seconde en combinant des variables
pour des observations de plus d’une table de données selon une ou des variables pour lesquelles les valeurs sont
les mêmes (juxtaposition).
3.2.1Concaténation
La concaténation de tables de données se fait à l’aide de l’énoncé SET. Il est possible d’utiliser dans cet énoncé
autant de tables de données qu’il est nécessaire de fusionner en une seule. La nouvelle table produite aura donc
autant d’observations que la somme du nombre d’observations de chaque table de données à concaténer, s’il n’y
a pas de conditions particulières. De plus, le nombre de variables de la nouvelle table de données sera égal au
nombre de variables différentes présentes dans toutes les tables de données utilisées. Il n’est donc pas nécessaire
que toutes les tables de données contiennent les mêmes variables. Dans le cas de variables différentes d’une table
de données à l’autre, des valeurs manquantes seront générées pour les observations provenant des tables qui ne
contenaient pas les variables en question.
data table1;
input identifiant resultats;
datalines;
1 90
2 55
3 80
;
run;
data table2;
input identifiant resultats;
datalines;
5 88
6 40
7 82
8 99
4 100
;
run;
data concate;
set table1 table2;
run;
Lorsque l’énoncé SET est utilisé sans énoncé BY, les observations apparaissent dans la nouvelle table de données
dans l’ordre des deux tables concaténées. En utilisation un énoncé BY, les observations apparaitront dans la table
de données créée dans l’ordre de la ou les variables spécifiées dans l’énoncé BY. Lorsqu’un énoncé BY est utilisé,
il est indispensable de trier les données dans les tables utilisées en entrée.
data concate_tri;
set table1 table2;
by identifiant;
run;
3.2.2Juxtaposition
Dans une étape DATA, l’énoncé MERGE permet de juxtaposer des données. Dans la presque totalité des cas
d’utilisation, il doit être utilisé en combinaison avec un énoncé BY, afin de fusionner les données en fonction des
valeurs que prennent une ou plusieurs variables. Il est nécessaire de trier les données avant d’utiliser un énoncé
MERGE avec un BY.
data table3;
input identifiant groupe $ @@;
datalines;
1 A 2 A 3 A 5 B 6 B 7 B 8 B 4 B
;
run;
data juxta;
merge concate_tri table3;
by identifiant;
run;
En omettant le BY, c’est la première observation de la première table de données qui est juxtaposée avec la
première observation de la seconde table de données, la seconde juxtaposée avec la seconde, et ainsi de suite.
Une telle utilisation est risquée et non recommandée.
Il n’est pas recommandé de faire un MERGE avec plus de deux tables dans une même étape DATA. Si vous devez
juxtaposer plusieurs tables de données, il est préférable de faire une juxtaposition à la fois.
Effectuer des agrégations est une pratique très courante en manipulation de données. En effet, on peut vouloir
calculer différentes statistiques en fonction d’une ou de plusieurs variables de classification (catégories) d’une
table de données, comme la somme, la moyenne, le minimum, le maximum, …
- NWAY : limite l’utilisation des différentes statistiques calculées pour la table en sortie (niveau d’agréation
le plus fin relié aux variables de classification conservé seulement);
- MISSING : indique à SAS que les valeurs manquantes seront utilisées dans la création des combinaisons
de variables de classification.
Il est à noter que la procédure MEANS permet de produire des résultats similaires et s’utilise sensiblement de la
même façon. Par contre, une sortie de résultats est imprimée par défaut, mais l’option NOPRINT permet d’éviter
cette impression. Dans la procédure MEANS, il est possible d’omettre l’énoncé OUTPUT, alors que dans la
procédure SUMMARY, cet énoncé est nécessaire.
Les tables de données ne se présentent pas toujours de la façon la plus optimale pour effectuer les manipulations
requises sur les données. Ainsi, dans certains cas, il peut être nécessaire de modifier la structure de présentation
des observations et des variables, par exemple, de mettre en colonne des valeurs qui se retrouvent sur des lignes
différentes pour un même identifiant. La procédure TRANSPOSE permet de faire ce type de manipulations, mais
nous verrons plus tard comment effectuer la même opération avec le concept de boucle.
Plusieurs procédures permettent l’impression de résultats dans la fenêtre Results Viewer (ou Output). Nous en
voyons trois ici, mais quelques autres seront abordées un peu plus tard dans la session.
3.5.1PROC PRINT
La procédure PRINT permet l’impression dans la fenêtre Results Viewer (ou Output) d’une table de données ou
d’une sélection d’observations provenant d’une table de données.
Dans la pratique, cette utilisation n’est pas recommandée, puisque les tables de données sont souvent
volumineuses. Ainsi, pour visualiser un sous-ensemble d’une table de données à l’aide de la procédure PRINT,
l’option (obs=) est pertinente. De plus, il peut être approprié de vouloir visualiser le contenu de certaines variables
seulement, en utilisant l’énoncé VAR.
title1;
L’utilisation de l’énoncé BY dans plusieurs procédures (comme la procédure PRINT) permet de produire des
résultats par valeur d’une certaine variable (catégories, identifiants). Pour utiliser cet énoncé, les données doivent
obligatoirement avoir été triées au préalable en fonction des variables mentionnés dans l’énoncé BY dans la table
de données en entrée.
En plus de l’énoncé BY, plusieurs autres énoncés sont disponibles, comme les énoncés WHERE ou SUM.
Pour améliorer l’apparence d’une sortie SAS et pour identifier de quoi il s’agit, il est pertinent d’utiliser les énoncés
globaux TITLE et FOOTNOTE. SAS permet un maximum de 10 énoncés TITLE actifs et de 10 énoncés FOOTNOTE
actifs dans une session. Un indice permet d’identifier de quel titre ou note de bas de page il s’agit. Par exemple :
Title; footnote; * Permet d’annuler tous les titres et toutes les notes de bas de
page;
3.5.2PROC UNIVARIATE
La procédure UNIVARIATE est utilisée pour explorer les données. En effet, elle permet de produire plusieurs
statistiques descriptives pour des variables numériques.
Plusieurs options sont disponibles avec cette procédure. Les plus courantes sont ALL (analyse très détaillée),
NORMAL (test de normalité sur les valeurs) et PLOT (diagramme arborescent, diagramme en boîtes et droite de
Henry). L’énoncé BY est souvent nécessaire, afin de faire une analyse distincte par sous-groupes d’observations.
3.5.3PROC FREQ
La procédure FREQ permet de produire des tableaux de fréquences, en incluant des fréquences relatives
exprimées en pourcentages.
Cette même procédure permet également de produire des tableaux de fréquences croisées. Il est à noter que des
options permettent d’effectuer des tests statistiques, comme des tests d’indépendance entre deux variables.
Il existe de nombreux formats dans SAS pour des variables numériques et alphanumériques. Plus spécifiquement
pour les dates, de nombreux formats adaptés sont disponibles. Les formats ne modifient pas les valeurs, mais la
façon d’afficher ces valeurs. Voici quelques exemples de formats (il y en a beaucoup d’autres) :
Un format peut être appliqué dans une étape DATA sur une variable d’une table de données en sortie pour
utilisation générale ou dans une étape PROC pour un besoin particulier pour cette étape seulement.
data exemple_format;
set logistat.arbres_remarquables;
format diametre numx8.2;
run;
Il est possible de créer des formats personnalisés dans SAS. Nous reviendrons sur ce sujet un peu plus tard.
Il peut être utilise d’associer un libellé à un nom de variable. Pour ce faire, on utilise l’énoncé LABEL. Les libellés
permettent d’ajouter des précisions visibles en entête de colonnes concernant les variables. Toutefois, il
important de comprendre qu’ils ne modifient pas les noms de variables. Ainsi, lorsqu’il faut faire référence à des
variables sur lesquelles il y a un libellé, il faut toujours utiliser le nom de variable et non le libellé.
Les dates dans SAS peuvent sembler difficiles à manipuler à première vue. Il est important de comprendre
comment SAS entrepose les dates et comment il faut y faire référence.
Les dates sont numériques dans SAS, avec comme valeur de référence 0 pour le 1er janvier 1960. Avant cette date,
les valeurs sont négatives et après cette date, les valeurs sont positives. Pour illustrer ce concept, voici les valeurs
associées à certaines dates :
- 01jan1960 : 0
- 01jan1959 : -365
- 01jan1961 : 366
Souvent, des données représentant des dates importées dans SAS depuis un format autre que le format SAS ne
sont pas traitées par SAS comme étant des dates. Ainsi, il peut être utile de modifier le format de ces données.
Dans ce cas, différentes méthodes peuvent être appropriées. Voici quelques suggestions :
1. Extraire les information d’année, mois et jour d’une chaîne de caractères pour utilisation avec la
fonction MDY :
data logistat.utilisation_datesas;
set logistat.utilisation;
2. Utiliser les opérateurs arithmétiques pour extraire les valeurs d’année, mois et jour pour utilisation avec
la fonction MDY :
data date1;
input date_init;
datalines;
20161212
20170111
20170226
;
run;
data date2;
set date1;
annee = floor(date_init/10000);
mois = floor(sum(date_init, -(annee*10000))/100);
jour = sum(date_init, -floor(date_init/100)*100);
data date3;
input date_init $10.;
datalines;
2016-12-12
2017-01-11
2017-02-26
;
run;
data date4;
set date3;
date_sas = input(date_init, yymmdd10.);
format date_sas date.;
run;
Il y a une façon bien particulière permettant de faire référence à une date dans la programmation SAS. Il faut
utiliser l’affichage du format «date9.».
data selection_date;
set utilisation_datesas;
4. Manipulations avancées
Dans une étape DATA, nous avons vu précédemment comment utiliser les énoncés KEEP et DROP pour conserver
un sous-ensemble de variables dans une table en sortie ou l’énoncé WHERE pour sélectionner conditionnellement
des observations. Ces mots-clés peuvent aussi être utilisés directement lors de la lecture des données en entrée
ou lors de l’écriture de la table en sortie, tout comme d’autres mots-clés, autant dans les étapes DATA que les
étapes PROC. Les plus fréquemment utilisés sont KEEP, DROP, RENAME et WHERE. L’utilisation de ces mots-clés
permet souvent de rendre le code plus efficient.
Le mot-clé IN est un peu différent, puisqu’il est utilisé seulement dans des étapes DATA. Il est associé à une
utilisation bien spéciale : il permet de faire référence au contenu de l’une ou l’autre des tables de données en
entrée. En général, son utilisation permet d’éviter la répétition de plusieurs étapes DATA.
Le mot-clé IN agit en créant une variable (dans les exemples a ou b) qui ne sera disponible que pour la durée de
l’étape DATA. Cette variable ne sera pas conservée dans la table de données en sortie.
Une utilisation intéressante de cette option est de créer des tables de données en sortie conditionnellement au
résultat d’une juxtaposition de plusieurs tables de données, par exemple pour valider le traitement effectué.
* Impressions de validations;
proc print data = prob1;
title "Problème: Un type d'arbre ne se retrouve pas dans groupe_diam";
run; title;
À plusieurs occasions, il peut être nécessaire de modifier les types de variables. En effet, certaines fonctions
s’utilisent sur des variables numériques et d’autres sur des variables caractères. Ce sont les fonctions PUT et INPUT
qui permettent d’effectuer ce type de changements.
Dans une étape DATA, il est nécessaire de nommer différemment la variable dont on modifie le type. Ainsi, dans
le cas où la variable convertie devrait porter le même nom que la variable initiale, il est nécessaire de renommer
la variable initiale au préalable (par exemple à l’aide d’une option de table de données vue précédemment).
Nous avons vu précédemment que les formats permettent de présenter les données d’une façon différente de la
façon dont elles sont conservées. Parfois, l’utilisation d’un format peut éviter le recodage d’une variable.
Effectivement, plusieurs procédures statistiques s’appliquent sur les variables formatées, comme le montre
l’exemple suivant avec la procédure FREQ. C’est la procédure FORMAT qui permet la création de formats
personnalisés. Cette procédure permet de définir autant des formats applicables sur des variables numériques
que caractères. Lors de formats caractères, le nom du format doit débuter par le signe $.
proc format;
value diam
0 - 50 = "Diam cat 1 (très petit)"
51 - 100 = "Diam cat 2 (petit)"
101 - 150 = "Diam cat 3 (moyen)"
151 - 200 = "Diam cat 4 (grand)"
201 - 250 = "Diam cat 5 (très grand)"
251 - high = "Diam cat 6 (hors norme)";
value $ prop
"Privés",
"Privés:S.I.Q." = "Privé"
"Public:Arbre mitoyen",
"Public:Entretenu Par",
"Public:Terrain Privé",
"Public" = "Public";
run;
data formats_perso;
set logistat.arbres_remarquables;
format diametre diam. type_prop $prop.;
run;
Nous verrons plus tard que les formats peuvent être très utiles lors de la présentation de résultats dans des
tableaux ou des graphiques. Ils permettent en effet d’améliorer l’apparence de l’élément produit et la lisibilité des
résultats.
La lecture des données dans SAS se fait ligne par ligne. Dans certains cas, il peut être nécessaire de faire référence
à des valeurs associées à d’autres observations que la ligne en cours de traitement. Quelques fonctions et mots-
clés permettent de telles opérations dans SAS.
Dans une étape DATA, les observations sont traitées l’une après l’autre et elles sont stockées l’une après l’autre
de manière temporaire dans le PDV (Vecteur de Travail; voir e-learning de SAS pour plus de détails). L’énoncé
RETAIN permet de conserver une valeur dans le PDV même en passant à l’observation suivante. Ainsi, il est
possible de conserver la valeur de la dernière observation traitée pour l’utiliser lors du traitement de l’observation
suivante. Alors que la fonction LAG s’appliquera préférablement à une variable lue dans une table SAS en entrée,
l’énoncé RETAIN s’applique principalement à de nouvelles variables. Deux utilités à l’énoncé RETAIN sont
présentées ici : l’incrémentation et la conservation d’une valeur.
1. Incrémentation
Dans l’exemple qui suit, une nouvelle variable présentant le numéro d’observation est créée.
data util;
set logistat.utilisation;
retain no_obs;
if _N_ = 1 then no_obs = 0;
no_obs = no_obs + 1;
run;
Pour ajouter les numéros d’observations à la table de données en sortie, une façon plus simple serait :
data util1;
set logistat.utilisation;
no_obs = _N_;
run;
Dans l’exemple qui suit, la date de la première observation de la table de données triée est conservée pour toutes
les observations afin de calculer un délai.
data util2;
set logistat.utilisation_datesas;
by date_sas;
retain date_debut;
format date_debut yymmdd10.;
if _N_ = 1 then date_debut = date_sas;
delai = sum(date_sas, -date_debut);
run;
Lors de l’utilisation de la fonction LAG, un concept de file d’attente s’exécute. Ainsi, LAG réfère à l’observation
précédente, LAG2 à deux observations précédentes, LAG3 à trois observations précédentes, … Cette fonction est
pertinente dans un contexte de projections dans des séries chronologiques, par exemple, où chaque observation
correspond à un temps t.
data util3;
set utilisation_som;
delai_import = date_sas - lag(date_sas);
run;
Il est à noter que dans le cas où la fonction LAG est exécutée de façon conditionnelle, ce n’est pas la valeur de la
dernière observation qui est utilisée, mais bien celle de la dernière observation pour laquelle la condition était
vérifiée.
Parfois, il peut être nécessaire de repérer la première et la dernière observation d’un sous-ensemble de données.
Pour ce faire, les mots-clés FIRST et LAST utilisés conditionnellement dans une étape DATA sont utiles. Il est à
noter que ces mots-clés sont utilisés en combinaison avec un énoncé BY et qu’il est fortement recommandé de
les utiliser avec un énoncé SET pour lequel il n’y a qu’une seule table de données en entrée.
output utilisation_som1;
if premierjour_an = 1 or dernierjour_an = 1 then output deb_fin_annee;
run;
Dans d’autres cas, il peut être utile de générer une variable compteur. Dans l’exemple qui suit, les observations
sont ordonnées par date et une variable compteur s’incrémente de 1 pour chaque nouvelle date dans une année
donnée. Lors d’un changement d’année, le compteur recommence à 1.
data utilisation_som2;
set utilisation_som1;
by annee date_sas;
if first.annee then compteur = 1;
else compteur + 1; *Retain implicite;
run;
5. SAS : Reporting
Précédemment, nous avons vu qu’il est possible de produire des tableaux de fréquences et de fréquences croisées
avec la procédure FREQ. Cette procédure est utilisée pour des tableaux simples. Toutefois, pour des cas plus
complexes, les procédures TABULATE et REPORT sont indiquées, puisqu’elles sont beaucoup plus flexibles.
Comme dans le cas de plusieurs procédures, les énoncés CLASS et VAR sont disponibles. L’énoncé CLASS permet
de spécifier les catégories d’observations sur lesquelles les statistiques sont calculées, alors que l’énoncé VAR
permet de définir les variables sur lesquelles les statistiques sont calculées.
L’énoncé TABLE est souvent plus élaboré. Il permet de définir la forme du tableau. Plusieurs symboles sont utilisés
dans cet énoncé :
Pour les cellules, plusieurs statistiques peuvent être calculées. Ce sont des mots-clés qui permettent de spécifier
les statistiques d’intérêt pour le tableau :
N Nombre d’observations
PCTN % du nombre total d’observations
ROWPCTN % du nombre d’observations sur la ligne
COLPCTN % du nombre d’observations sur la colonne
NMISS Nombre de valeurs manquantes
PCTSUM % du total d’une variable
ROWPCTSUM % du total de la ligne d’une variable
COLPCTSUM % du total de la colonne d’une variable
MEAN Moyenne arithmétique
SUM Somme
MIN et MAX Minimum et maximum
Px (où x=1, 5, 10, 25, 50, Centiles à x%
75, 90, 95, 99)
Q1, Q3 Quartiles
MEDIAN Médiane
STD Écart-type
VAR Variance
SKEWNESS Coefficient d’asymétrie
KURTOSIS Coefficient d’aplatissement
LCLM Borne inférieure d’un intervalle de confiance à 95%
UCLM Borne supérieure d’un intervalle de confiance à 95%
CV Coefficient de variation
Les exemples suivants montrent quelques possibilités de tableaux obtenus en faisant varier l’emplacement des
noms des variables et l’utilisation des symboles :
Il est possible d’ajouter des totaux en utilisant le mot-clé ALL. C’est l’emplacement de ce mot-clé qui détermine
sur quelle variable le total est calculé et le niveau de total calculé.
Pour améliorer l’apparence du tableau, il peut être souhaitable d’ajouter des labels sur les noms de variables.
Dans la procédure TABULATE, cette étape se fait directement dans l’énoncé table.
diametre = "Diamètre" *
(mean = "Moyenne" median = "Médiane" min = "Minimum"
max = "Maximum");
run;
Afin d’alléger le tableau, il peut être nécessaire de masquer le nom de certaines variables. C’est par l’utilisation
d’un LABEL vide que ce résultat s’obtient.
diametre = "Diamètre" *
(mean = "Moyenne" median = "Médiane" min = "Minimum"
max = "Maximum");
run;
Finalement, l’exemple suivant illustre l’utilisation de formats spécifiques (F=), de l’espace disponible dans la case
du coin supérieur gauche (BOX=) et d’options de police de caractère (S=).
diametre = "" *
(mean="Moyenne" median="Médiane" min="Minimum"
max="Maximum")*F=8.0
/ box = "Statistiques pour la mesure du diamètre";
run;
Les possibilités vues dans les exemples précédents ne sont que la pointe de l’iceberg ! La procédure TABULATE
offre de nombreuses autres possibilités, quelquefois en combinaison avec l’utilisation des ODS, comme la mise en
forme conditionnelle des données en fonction de leur valeur, l’ajout de couleurs dans les cellules, l’ajout d’images
dans les cases de noms de variables, des indentations particulières et une justification différente des valeurs dans
les cellules. Beaucoup d’exemples sont disponibles sur Internet.
5.1.2PROC REPORT
La procédure REPORT est flexible pour créer des tableaux, mais la syntaxe peut devenir rapidement compliquée.
Au contraire de la procédure TABULATE où il est aisé de calculer des statistiques d’agrégation au sein même de la
procédure, je recommande de calculer les statistiques et de préparer les données dans une étape DATA avant une
utilisation de la procédure REPORT.
- COLUMN : Permet d’identifier les variables à publier dans l’ordre souhaité. Il est possible de définir un
titre général pour plusieurs colonnes, en regroupant ces noms de colonnes entre parenthèses et en
spécifiant le nom général entre guillemets en premier entre les parenthèses.
- DEFINE : Permet de personnaliser les colonnes. Un énoncé DEFINE par colonne est requis. Il est possible
de regrouper des variables sous une même catégorie par l’utilisation des parenthèses et du nom de la
catégorie entre guillemets.
run;
Les variables peuvent être considérées en mode DISPLAY (texte), en mode ANALYSIS (numérique sur lesquelles
des opérations pourraient éventuellement être appliquées), en mode ORDER (ordre de tri), GROUP (n’afficher
qu’une seule fois la valeur d’un groupe) ou COMPUTED (dans le cas où des valeurs sont créées à même la
procédure). Le mode ORDER peut être utilisé avec l’option NOPRINT de cet énoncé, afin de spécifier une variable
d’ordre qui ne sera pas imprimée dans le tableau. En utilisant le mode GROUP, il est possible de définir des
séparations entre les groupes, avec l’instruction BREAK AFTER. Avec certains ODS (expliqués plus loin), cette
instruction ne fonctionne pas. C’est pourquoi il est pertinent de connaître une alternative à cette instruction :
COMPUTE BEFORE et COMPUTE AFTER.
data util_report2;
set util_report1;
if format in (".JSON", ".GEOJSON") then histo = "Nouveau";
else if format = ".SHP" then histo = "Ancien";
else histo = "Courant";
run;
compute before;
line ' ';
endcomp;
compute after histo;
line ' ';
endcomp;
run;
Il est possible de modifier l’apparence des colonnes, par exemple en ajustant la largeur des colonnes, l’alignement
des valeurs ou des noms de variables ou certains formats. Tous ces ajustements sont possibles avec l’utilisation
de l’option STYLE(COLUMN) dans l’énoncé REPORT si toutes les colonnes sont visées. Pour des modifications
différentes selon les colonnes, l’option est ajoutée dans chaque énoncé DEFINE.
- MISSING : À utiliser notamment avec les modes GROUP et ORDER pour tenir compte des valeurs manquantes,
puisque les valeurs manquantes sont ignorées par SAS par défaut avec ces modes.
compute before;
line ' ';
endcomp;
compute after histo;
line ' ';
endcomp;
run;
L’utilisation de l’ODS (Output Delivery System) est une solution intéressante et souple pour exporter les résultats
générés par des procédures dans différentes destinations. Ainsi, il est possible de produire des rapports dans des
formats tels que HTML, PDF, XML, XLS et bien d’autres. En utilisant une solution ODS, beaucoup de souplesse est
possible au niveau de la mise en forme des résultats, des formats et des labels. Il est également possible d’ajouter
du texte, des images et des liens hypertextes. Il faut porter attention à la version de SAS utilisée lors de l’utilisation
des ODS, puisque les possibilités se sont élargies avec les versions récentes.
L’ODS TAGSETS.EXCELXP est disponible en SAS depuis la version 9, de façon expérimentale. Il permet de produire
un fichier dans un format XML, que les versions récentes d’EXCEL sont en mesure de lire. Il est donc possible que
la référence à certaines options soit différente en fonction des versions de SAS. Ainsi, la prudence est de mise et
il est recommandé de valider le traitement au moment de changer de version ou d’environnement de travail. De
plus, l’interaction avec EXCEL pourrait changer lors d’un changement de version d’OFFICE. Malgré ces mises en
garde, l’utilisation de cet ODS est fortement recommandée dans les cas d’interactions avec EXCEL, puisqu’il offre
de nombreuses possibilités et beaucoup de flexibilité. En termes de flexibilité, mentionnons la possibilité d’ajouter
les labels des variables, définir la largeur des colonnes, ajouter des filtres aux colonnes et créer plusieurs feuilles
par fichier EXCEL.
PROC …;
…;
RUN;
Deux types d’options sont disponibles : les premières associées à tous les types de XML produits par l’ODS et les
secondes associées spécifiquement au format XML vers EXCEL.
Une liste plus exhaustive des options disponibles avec ce TAGSETS est disponible sur le site de SAS :
http://support.sas.com/rnd/base/ods/odsmarkup/excelxp_help.html
Cette fonctionnalité est en constante évolution dans SAS. Ainsi, en fonction de votre version de SAS, il est possible
qu’une mise à jour soit de mise ou même qu’une installation soit requise. La commande suivante vous permet de
vérifier la version qui est installée et les différentes options disponibles :
Au moment d’écrire ces notes, la dernière version à télécharger sur le site était la version 1.131, en date du 23
avril 2015. Cette version peut être téléchargée sur le site de SAS :
http://support.sas.com/rnd/base/ods/odsmarkup/index.html
L’installation simple peut se faire avec cette ligne de commande, où vous devez spécifier l’emplacement du fichier
téléchargé :
%include "mon_chemin_complet\excltags.tpl";
De nombreux styles d’impressions sont disponibles dans SAS par défaut. Il est possible de modifier le style par
défaut de la sortie ODS avec l’option STYLE. La liste des styles de SAS s’obtient par la procédure suivante :
PROC TEMPLATE;
LIST STYLES;
RUN;
Ces styles peuvent être utilisés dans les énoncés ODS de la section suivante, afin d’adapter l’apparence de la sortie.
Même si de nombreux styles sont déjà créés dans SAS, il peut être nécessaire de créer un nouveau style, par
exemple pour adapter la présentation à l’entreprise pour laquelle vous travaillez. Dans ce cas, la procédure
TEMPLATE servira à définir ce nouveau style. Cette partie n’est pas abordée dans le cadre du cours.
diametre = "" *
(mean="Moyenne" median="Médiane" min="Minimum"
max="Maximum")*F=8.0
/ box = "Statistiques pour la mesure du diamètre";
run;
compute before;
line ' ';
endcomp;
compute after histo;
line ' ';
endcomp;
run;
Afin d’éviter l’ouverture par défaut d’une fenêtre d’impression de résultats, il est pertinent d’utiliser l’option
NOWD dans l’énoncé REPORT.
Il est à noter que l’ODS TAGSETS.EXCELXP ne permet pas de produire des fichiers .xlsx. Toutefois, avec la version
9.4 de SAS, un nouvel ODS est disponible à titre expérimental. Il s’agit de l’ODS EXCEL.
Cette nouvelle destination est très récente et n’a pas beaucoup été testée. Elle semble toutefois très prometteuse,
notamment pour la possibilité d’exporter également des graphiques SAS.
Avant l’arrivée de l’ODS TAGSETS.EXCELXP, l’ODS HTML était beaucoup utilisé pour la production de tableaux
EXCEL, en plus de sa principale fonction, qui est de créer les fichiers en format html. Pour ce faire, il suffit de
nommer le fichier en utilisant l’extension .XLS, pour permettre à EXCEL de le reconnaître.
Il est important de savoir que, même dans EXCEL, le fichier est reconnu en tant que page web. Il est donc
recommandé, à partir de ce fichier ouvert en EXCEL, d’enregistrer le fichier en format EXCEL.
La production de rapports PDF est fréquente en entreprises. Ces rapports ont l’avantage d’être accessibles à tous,
sans possibilité de modifications aisée et le format obtenu peut être très professionnel.
L’ODS PDF peut être utilisé avec des procédures de génération de tableaux, de graphiques et permet même l’ajout
de zones de texte ou d’images. Quelques notions de mise en page sont abordées un peu plus loin.
La destination RTF permet d’exporter les résultats dans des formats lisibles avec des éditeurs de texte tels que MS
WORD.
Pour s’assurer que les titres et notes de bas de page s’insèrent dans le corps du document, par exemple pour
nommer un tableau, l’option BODYTITLE est requise.
6. SAS : Graphiques
Plusieurs procédures en SAS permettent de produire des graphiques. Le tableau suivant permet d’associer les
principaux types de graphiques avec une procédure SAS.
Dans les procédures graphiques de SAS, plusieurs éléments de mise en forme sont définis par défaut. Pour
modifier ces éléments, il faut utiliser certaines options et énoncés globaux.
Les énoncés graphiques globaux permettent de déterminer certains paramètres graphiques, qui seront tenus en
compte lors de l’utilisation de procédures graphiques par SAS. Le tableau suivant présente quelques énoncés
graphiques globaux. Chacun de ces énoncés globaux peut être utilisé plus d’une fois, avec l’utilisation d’un indice
combiné au mot-clé (ex : AXIS1, AXIS2, …).
Il est possible d’ajouter des éléments de texte ou de segments de droite à l’intérieur des graphiques, avec l’énoncé
NOTE. Cet énoncé doit s’utiliser à l’intérieur d’une procédure graphique.
L’utilisation de très nombreuses couleurs est possible dans les différentes procédures graphiques de SAS. Pour en
savoir plus sur les codes de couleurs disponibles, je vous invite à consulter le document suivant :
http://support.sas.com/publishing/authors/extras/62007_Appendix.pdf
La procédure GCHART permet la création de diagrammes en secteurs et en bâtons. La syntaxe de base de cette
procédure est la suivante :
Pour produire un diagramme en secteurs, l’énoncé PIE doit être utilisé. Pour des diagrammes en bâtons verticaux
ou horizontaux, ce sont les énoncés VBAR et HBAR respectivement qui doivent être utilisés. En fonction de
l’énoncé utilisé, différentes options peuvent être précisées :
SAS permet également de créer des diagrammes en secteurs et en bâtons trois dimensions, avec les énoncés
PIE3D, VBAR3D et HBAR3D.
La procédure BOXPLOT permet de produire des diagrammes en boîte groupés. Cette procédure prend la forme
suivante :
La variable de groupe est obligatoire dans cette procédure. Si un seul BOXPLOT est requis, il faut créer une variable
dans la table de données qui prend toujours la même valeur (un seul groupe). Le tableau suivant résume les
principales options pour cette procédure :
Il est à noter qu’il est nécessaire de trier les données selon la variable de groupe avant d’utiliser la procédure
BOXPLOT.
La procédure GPLOT permet de mettre en relation le lien entre deux variables numériques. Cette procédure prend
la forme suivante :
Il peut être nécessaire de modifier le symbole associé à un point avec l’utilisation d’un énoncé SYMBOL ou en
spécifiant le code de symbole directement dans l’énoncé PLOT :
PLOT y*x="code_symbole";
Il est possible d’utiliser un symbole différent pour une valeur, en fonction de la valeur d’une variable de groupe :
PLOT y*x=variable_de_groupe;
Avec l’option OVERLAY, deux diagrammes ayant la même abscisse peuvent être superposés :
symbol1 I=join;
axis1 minor = NONE label = (angle=90);
axis2 minor = NONE;
La procédure SGPLOT permet la création de graphiques superposés. Plusieurs types de graphiques sont possibles
avec cette procédure :
- Diagrammes de dispersion
- Droites de régression
- Histogrammes
- Diagrammes en bandes
- Séries temporelles
- Estimateur à noyau
- Bandes de confiance
- …
Avec cette procédure, toutes les combinaisons ne sont pas possibles. En effet, il faut que les graphiques
superposés soient compatibles. La superposition d’un histogramme et d’un diagramme de densité est tout à fait
indiquée :
Comme pour les autres procédures graphiques, plusieurs options sont disponibles, notamment l’option SUMVAR,
qui permet de spécifier une variable graphique, autant en lien avec l’énoncé BAR qu’avec l’énoncé PLOT. Dans
cette procédure, l’énoncé PLOT doit toujours suivre l’énoncé BAR, mais il n’est pas un énoncé obligatoire. Dans
les cas où SUMVAR n’est pas utilisé, il est possible d’utiliser l’option TYPE pour indiquer la statistique qui doit être
présentée dans la partie en barre du graphique.
data tele_graph1;
set tele_graph (where = (annee = 2014));
retain telecum;
by mois;
if _N_ = 1 then telecum = nb_telechargements;
else telecum = telecum + nb_telechargements;
run;
Lorsque des destinations comme ODS PDF sont utilisées pour produire des rapports ou tableaux de bord, il peut
être intéressant d’utiliser des ODS qui permettent d’améliorer la présentation des fichiers produits.
Les énoncés ODS LAYOUT et ODS REGION, en utilisation conjointe, permettent de diviser l’espace d’une page pour
y présenter différents résultats de sorties SAS dans des régions spécifiques. Par exemple, l’espace de la page peut
être divisée de cette façon :
Lors de l’utilisation de ces deux ODS, ODS REGION, qui permet de définir une région en particulier, est toujours
précédé de ODS LAYOUT, qui permet de définir la page. Dans les deux cas, ce sont les positions exactes dans la
page, en pouces, en centimètres ou en pourcentages, qui doivent être spécifiées.
L’utilisation d’énoncés ODS PDF TEXT permet d’ajouter du texte ou des images à la présentation. Ainsi, ces énoncés
peuvent être utilisés dans certaines régions définies par un énoncé ODS REGION, par exemple. Dans certains cas,
ils sont préférables à l’utilisation d’énoncés TITLE ou FOOTNOTE, puisqu’ils sont flexibles quant à l’emplacement
voulu sur la page.
* Titre;
ods region width=10.5in height=.75in x=0in y=0in;
ods listing;
ods pdf close;
Les boucles dans SAS permettent d’exécuter plus d’une fois un ou des énoncés à l’intérieur d’une étape DATA. Les
boucles DO peuvent être exécutées sur un intervalle en particulier, qui est spécifié par l’utilisation d’un indice.
DO indice = a TO b BY c;
…
END;
Si on omet le BY, la valeur par défaut est de 1. L’indice des itérations peut être alphanumérique. Par exemple :
7.2 La simulation
La simulation de données est possible dans SAS avec les boucles. Différentes fonctions de SAS permettent de
générer des nombres pseudos aléatoires comme les fonctions suivantes :
data simulation;
do i = 1 to 500;
X=15*rannor(4321)+100; * Loi normale de moyenne 100 et d'écart-type 15;
output;
end;
run;
Pour écrire le résultat de chaque itération de la boucle dans une table de données en sortie, il faut utiliser l’énoncé
OUTPUT à l’intérieur de la boucle. À chaque fois que l’énoncé OUTPUT sera exécuté dans la boucle, c’est-à-dire à
chaque itération, une ligne sera écrite dans la table de données en sortie. Ainsi, sans l’énoncé OUTPUT à l’intérieur
de la boucle, la table de données ne contiendrait que la dernière valeur générée.
7.3 Array
Les énoncés ARRAY sont pertinents lorsqu’une même opération doit être effectuée sur plusieurs variables. Le nom
d’un énoncé ARRAY réfère à une liste de variables. De plus, le concept de ARRAY est utilisé à l’intérieur d’une
étape DATA. La référence à une variable en particulier se fait en utilisant le nom du ARRAY combiné à un indice
(la position de la variable dans le ARRAY). L’énoncé ARRAY est composé de quatre parties :
- Son nom
- Le nombre de variables (nombre d’éléments)
- Le nom des variables
- La valeur des variables (partie optionnelle)
Il est possible de définir des valeurs par défaut dans un ARRAY par l’utilisation des parenthèses.
En omettant les zéros dans l’énoncé ARRAY, ceux-ci sont remplacés par des valeurs manquantes dans la table de
données en sortie.
L’utilisation d’un énoncé ARRAY combiné à une boucle permet de créer plusieurs variables (parfois un nombre
important), en réutilisant toujours les mêmes énoncés. Les boucles sont pertinentes ici afin d’itérer sur des
colonnes et non sur des observations, comme c’était le cas en début de chapitre.
Plusieurs ARRAY peuvent être utilisés dans une même étape DATA, pour référence à l’intérieur d’une même
boucle.
L’utilisation de plus d’un ARRAY peut également être remplacée par un ARRAY à deux dimensions.
data arbres_d;
set arbres_b;
array moi(2, 12) mois1 - mois12 cout_mois1 - cout_mois12;
do i = 1 to 12;
moi(2, i) = 3.2 * moi(1, i);
end;
drop i;
run;
Il est parfois nécessaire de faire référence à un indice précédent pour créer une variable correspondant à un
certain indice dans ce type de traitement de données. C’est le cas lorsqu’il est nécessaire de comparer deux valeurs
de deux années se suivants, qui se retrouvent dans des colonnes différentes pour une même observation. Dans
l’exemple qui suit, à partir d’une table de données où chaque observation correspond à un type de données et
chaque colonne correspond au nombre de téléchargements pour une année, quatre nouvelles colonnes sont
créées et contiennent la différence entre le nombre de téléchargements d’une année donnée et le nombre de
l’année précédente.
L’utilisation d’un énoncé ARRAY combiné à une boucle permet de créer plusieurs variables (parfois un nombre
important), en réutilisant toujours les mêmes énoncés.
Les boucles de type DO UNTIL et DO WHILE permettent d’exécuter un bloc d’énoncés un certain nombre de fois,
mais inconnu à l’avance et dépendant d’un certain critère. Par exemple, on pourrait vouloir exécuter un bloc
d’énoncés jusqu’à ce qu’une valeur calculée atteigne un certain nombre.
Pour la boucle DO UNTIL, une condition entre parenthèses de l’énoncé DO est vérifiée à la fin de la boucle. Cette
boucle est donc répétée jusqu’à ce que la condition soit vraie.
Pour la boucle DO WHILE, une condition entre parenthèses de l’énoncé DO est vérifiée dès le début de la boucle.
Cette boucle est donc répétée tant que la condition est vraie.
Avec ces types de boucles, attention aux boucles infinies ! En guise de prévention, vous pouvez intégrer un nombre
fixe d’itérations maximal à ne pas dépasser. Par exemple :
data option1;
do i = 1 to 500;
valeur = RANEXP(9292) ;
Total = sum(total, valeur);
output;
if total > 500 then leave;
end;
run;
CONTINUE : Saut d’énoncés qui se suivent dans une boucle pour passer à la prochaine itération.
data option2;
do while (total < 500);
valeur = RANEXP(9292) ;
Total = sum(total, valeur);
if total <= 200 then continue;
output;
end;
run;
Nous avons vu que la procédure TRANSPOSE est très utile pour transposer une table de données, soit de passer
en colonne des informations qui se retrouvent sur des lignes différentes en fonction d’une clé. Ce type de
manipulations est également possible avec l’utilisation de boucles et d’énoncés ARRAY.
data liste_titre1;
set liste_titre;
annee = 2012; output;
annee = 2013; output;
annee = 2014; output;
annee = 2015; output;
run;
data tele_annee1;
merge tele_annee liste_titre1;
by titre annee;
run;
Certains mots-clés peuvent avoir une grande utilité dans un énoncé ARRAY, comme les mots-clés _ALL_,
_NUMERIC_ et _CHARACTER_. Un exemple intéressant d’utilisation du mot-clé _NUMERIC_ permet de
transformer toutes les valeurs manquantes de toutes les variables numériques d’une table de données par des 0.
data non_manquant;
set tele_annee_transp;
data non_manquant;
set tele_annee_transp;
array change _numeric_;
do over change;
if change=. then change=0;
end;
run ;
Les macros en SAS permettent l’automatisation et la réutilisation de sections de code. Des éléments de langage
sont spécifiquement destinés à des utilisations dans le contexte de macros. Les macros sont des outils très
puissants ! Il est donc important de connaître les bases de ce langage.
% : Symbole relié à l’utilisation de fonctions ou d’instructions macro. Le nom de l’élément macro utilisé doit suivre
le symbole %.
& : Caractère devant précéder le nom d’une variable macro lors de son utilisation. Le nom de la variable macro
doit être suivi par un «.».
Les variables macro, même si elles ne s’utilisent pas obligatoirement dans un contexte de macro SAS, constituent
une bonne introduction aux bases de ce langage. Elles permettent, entre autres, de définir des paramètres qui
seront considérés tout au long d’un programme SAS (ou d’une session SAS).
Il existe deux types de variables macro dans SAS : les variables macro créées automatiquement par SAS et les
variables macro créées par programmation. Pour le second type, la définition de variables macro peut se faire de
plusieurs façons, notamment par l’utilisation d’un énoncé global %LET ou d’un énoncé local CALL SYMPUT dans
une étape DATA.
Les variables macro permettent de stocker du texte ou des nombres, afin de les passer en paramètres à différentes
étapes du programme. Elles n’ont pas de type (sont toujours considérées comme du texte) et ne sont pas reliées
à une table de données.
Une variable macro est appelée en précédant son nom par & et en le suivant d’un «.».
Les valeurs contenues dans les variables macro peuvent être très longues, allant jusqu’à 65 534 caractères pour
la version 9 de SAS.
Avec l’énoncé global %LET, les variables macro sont créées à l’extérieur des étapes DATA. Ce type d’énoncé
global est souvent utilisé en début de programme pour donner une valeur à un paramètre (variable macro) qui
sera utilisé à plusieurs endroits dans le programme SAS. Des fonctions macro sont disponibles pour manipuler
des valeurs ou des chaînes de caractères. Nous en verrons quelques exemples plus loin.
L’énoncé CALL SYMPUT permet de créer une ou plusieurs variables macro à l’intérieur d’une étape DATA, souvent
à partir de valeurs contenues dans une table de données.
data _null_;
set logistat.utilisation_datesas (where = (annee = &annee.));
if _N_ = 1 then do;
call symput ("deb_annee", put(date_sas, yymmdd10.));
call symput ("note", "Résultats de " || compress(put(date_sas,
FRADFMN.)) || " " || compress(put(year(date_sas), 4.)));
end;
run;
Les variables macro peuvent être créées dans un environnement global ou dans un environnement local. Une
variable macro créée dans l’environnement global peut être utilisée dans toute la session SAS, en incluant les
macros. Les variables macro créées en dehors d’une macro sont créées dans cet environnement. Une variable
macro créée dans l’environnement local est créée à l’intérieur d’une macro. La variable macro créée de cette
façon ne peut être utilisée que dans le cadre de la macro qui s’exécute. Pour utiliser une variable macro locale en
dehors de l’exécution de la macro, il faut la transformer en variable globale en utilisant la syntaxe suivante :
%global nom_variable;
Il est important de savoir que cette instruction doit précéder la définition de la variable macro dans la macro.
À l’inverse, il est possible de rendre une variable macro locale. De cette façon, la valeur n’est pas mise à jour dans
l’environnement global, mais seulement dans l’environnement local. Il est donc possible d’avoir, à un certain
moment, deux variables macro de même nom, qui ont des valeurs différentes. Comme pour l’énoncé GLOBAL,
l’énoncé LOCAL doit précéder la création de la variable macro dans la macro.
Il existe plusieurs variables macro créées automatiquement par SAS. Ces variables macro ont des noms débutant
par SYS. La variable macro automatique SYSDATE peut être utile si vous produisez une publication de façon
automatique sur laquelle est inscrite une note comme « Rapport produit le 23 novembre 2015 ».
data _null_;
date = "&sysdate."d;
call symput ("descrip", "Rapport produit le " ||
compbl(put(date, FRADFWKX.)));
run;
La variable macro automatique SYSERR permet quant à elle d’obtenir de l’information sur l’exécution de la
dernière étape exécutée :
Les variables MACRO peuvent être supprimées à l’aide de l’énoncé macro %SYMDEL.
Le contenu d’une variable macro peut être affiché dans le LOG par l’énoncé macro %PUT. Cet énoncé est utile lors
de la validation de variables macro créées dans une étape DATA avec l’énoncé CALL SYMPUT, par exemple.
Habituellement, les variables macro pour lesquelles les valeurs doivent être validées sont spécifiées dans l’énoncé
%PUT. Toutefois, il est possible de sélectionner des ensembles déjà établis par l’utilisation des mots-clés _ALL_
(toutes les variables macro), _AUTOMATIC_ (toutes les variables macro automatiques) et _USER_ (toutes les
variables macro créées par l’utilisateur). L’énoncé macro %PUT permet également d’afficher n’importe quel texte
dans la fenêtre LOG.
Les fonctions macro sont des fonctions spécifiques au langage macro et servent à manipuler des variables macro.
Dans plusieurs cas, les fonctions macro portent le même nom que des fonctions utilisées dans des étapes DATA,
à la différence que ce nom est précédé du symbole %.
%INDEX(&variable., chaîne) : Rechercher une chaîne de caractères dans une variable macro.
%LENGTH(&variable.) : Longueur de la variable macro.
%SCAN(&variable., n, délimiteur) : Ne mot d’une variable macro.
%SUBSTR(&variable., i, n) : Extraction de n caractères à partir du ie d’une variable macro.
%UPCASE(&variable.) : Transformer toutes les minuscules en majuscules.
%EVAL(expression) : Évaluer les calculs.
%SYSEVALF(expression, conversion) : Évaluer les calculs, en considérant des décimales. CONVERSION = boolean,
ceil, floor ou integer.
Pour les fonctions qui ne sont existantes qu’en langage standard (étapes DATA), il est possible de les utiliser en
langage macro à l’aide de la fonction %SYSFUNC.
Les macros regroupent différentes instructions, qui débutent par l’instruction %MACRO et qui terminent par
l’instruction %MEND. C’est dans l’instruction %MACRO que la macro est nommée, ainsi que les paramètres
spécifiés, si applicables. En soumettant un tel bloc d’instructions, la macro est définie, mais non utilisée. Pour
l’utiliser, il faut l’appeler en faisant précéder son nom par le symbole %.
Si aucun paramètre n’est requis dans la définition de la macro, les parenthèses ne sont pas nécessaires. En
revanche, il est possible de définir autant de paramètres que nécessaire.
Pour utiliser (appeler) une macro définie au préalable, la syntaxe est la suivante :
data &nom_fich.;
set logistat.utilisation_datesas;
if format = &choix_format.;
run;
%mend select_formats;
%select_formats(choix_format=".CSV", nom_fich=util_csv);
%select_formats(choix_format=".KML", nom_fich=util_kml);
Tout comme les énoncés conditionnels utilisés dans une étape DATA, les énoncés conditionnels MACRO
permettent d’exécuter une certaine partie de code uniquement si une condition est validée. Toutefois, à la
différence des énoncés conditionnels standards, les énoncés conditionnels MACRO peuvent être utilisés à
n’importe quel endroit à l’intérieur d’une macro, que ce soit à l’intérieur d’une étape PROC ou DATA ou à
l’extérieur. Les énoncés conditionnels macro peuvent même être rencontrés en plein milieu d’un énoncé.
%mend agg;
%agg(choix_format=".CSV", nom_fich=agg_csv, type_agg=0);
Nous avons vu précédemment que les boucles peuvent être requises à l’intérieur d’une étape DATA, afin d’utiliser
les mêmes énoncés plusieurs fois. De la même façon, les boucles macro permettent d’utiliser plus d’une fois des
énoncés, des parties à l’intérieur d’énoncés et même des étapes PROC ou DATA. Les boucles macro permettent
plus de possibilités que les boucles d’une étape DATA, mais fonctionnent sur le même principe. Les boucles
MACRO se distinguent facilement par l’utilisation du symbole % avant chacun des mots-clés mentionnés dans la
boucle.
Ce type de boucle crée une variable macro (dans le cas en exemple : i), et lui affecte successivement des valeurs
(dans le cas en exemple : 1 à 10). Les types de boucles vus dans le cadre d’une utilisation à l’intérieur d’une étape
DATA sont tous possibles en langage macro. La logique est similaire dans les deux cas.
%macro agg1;
%mend agg1;
%agg1;
Les deux méthodes de mises en commentaires abordées en début de session sont valables à l’intérieur de macros.
Toutefois, il faut être prudent avec l’utilisation des guillemets simples (apostrophes). En effet, lorsque SAS
rencontre un guillemet simple à l’intérieur d’une macro, il considère ce qui suit comme étant une chaîne de
caractères, jusqu’à ce qu’un nouveau guillemet simple (apostrophe) soit rencontré. Cette particularité peut
conduire à des résultats désastreux ! Il est donc fortement recommandé de ne pas utiliser de guillemet simple ou
d’apostrophe dans un texte de commentaires à l'intérieur d’une macro. De plus, le type de commentaires « *…; »
doit être précédé d’un symbole %.
Il est à noter qu’il est possible d’utiliser le langage macro pour mettre une partie de programme en commentaires,
en n’appelant pas la macro créée. De cette façon, toute la partie de code située entre %MACRO et %MEND n’est
pas exécutée.
Le langage SQL (Structured Query Language) est un langage très utilisé pour l’interrogation et la manipulation de
bases de données relationnelles. Il est commun à plusieurs logiciels et peut donc être réutilisé dans plusieurs
logiciels, sans trop de modifications. Ce langage standardisé est accepté dans SAS par le biais de la procédure SQL.
Il est notamment apprécié pour ses possibilités de fusions de tables de données et pour l’ajout d’observations
directement dans une table de données.
PROC SQL;
CREATE TABLE table_en_sortie as
SELECT var1, var2,…
FROM table_en_entree,…
WHERE condition1
;
quit;
Dans la procédure SQL, les différents énoncés ne se terminent pas par un «;». C’est plutôt l’arrivée d’un nouveau
mot-clé qui détermine la fin de l’énoncé. C’est seulement après tous les énoncés pertinents à la requête qu’un «;»
doit être placé. La fin de la procédure est délimitée par l’énoncé QUIT;.
proc sql;
create table util_2012 as
select format, titre, nb_telechargements, annee, mois, jour, date_sas
from logistat.utilisation_datesas
where annee = 2012
;
quit;
En omettant l’énoncé CREATE TABLE, le résultat obtenu est équivalent à celui qui aurait été obtenu avec la
procédure PRINT.
L’énoncé GROUP BY permet de faire des agrégations, un peu comme nous le faisions avec la procédure SUMMARY.
L’avantage principal découlant de l’utilisation de la procédure SQL pour effectuer une agrégation est que la table
de données en sortie est automatiquement triée en fonction de la variable de regroupement, ce qui permet
d’éviter l’utilisation de la procédure SORT avant une fusion prochaine avec une autre table de données.
Lorsque l’énoncé GROUP BY est utilisé, il faut que toutes les variables mentionnées dans l’énoncé SELECT soient
compatibles avec une agrégation : variables de regroupement, variables provenant d’une agrégation.
proc sql;
create table regroup as
select format, sum(nb_telechargements) as nb_tot, annee
from logistat.utilisation_datesas
group by format, annee
;
quit;
Plusieurs fonctions peuvent être utilisées dans l’énoncé SELECT en combinaison avec l’énoncé GROUP BY :
- Mean()
- Min()
- Max()
- Sum()
- Count()
- Std()
- …
Il peut être pertinent de sélectionner des observations à partir de données qui viennent tout juste d’être agrégées.
Pour ce faire, l’énoncé HAVING de la procédure SQL est requis et permet de vérifier des conditions sur une variable
créée avec une fonction en combinaison avec l’énoncé GROUP BY.
proc sql;
create table regroup2 as
select format, sum(nb_telechargements) as nb_tot, annee
from logistat.utilisation_datesas
group by format, annee
having nb_tot > 1000
;
quit;
La procédure SQL permet de trier des données sans l’ajout d’une procédure supplémentaire. Ainsi, en créant une
table de données, il est possible de la trier en même temps. Il s’agit d’un avantage non négligeable lorsque les
tables de données sont volumineuses, car une telle option permet de sauver du temps de traitement.
proc sql;
create table trier as
select *
from logistat.utilisation_datesas
where annee = 2012
order by date_sas
;
quit;
La fonction INTO : permet d’alimenter une variable macro très simplement dans une procédure SQL. Par exemple,
pour obtenir le nombre d’observations contenues dans une table de données :
Une utilisation un peu plus complexe permet de placer plusieurs valeurs dans une même variable macro, en
choisissant un séparateur :
La procédure SQL permet l’ajout aisé d’observations dans une table de données sans devoir faire une copie de la
table comme dans le cas d’une étape DATA. Deux méthodes sont disponibles :
proc sql;
insert into copie
values ('test', 'test', 'test', 0, 9999, 0, 99, '01jan9999'd)
;
quit;
proc sql;
insert into copie
set format = 'test1', titre = 'test1'
;
quit;
L’utilisation de la procédure SQL pour réaliser des jointures de tables de données est associée à certains
avantages :
Une jointure interne permet de conserver les observations dont la clé de fusion est commune aux deux tables
de données. C’est la jointure INNER JOIN dans la procédure SQL qui permet cette opération.
proc sql;
create table sql_inner as
select *
from feuil_conif a
inner join
groupe_diam b
on a.type_arbre = b.type
;
quit;
data equiv_inner;
merge feuil_conif (in=a)
groupe_diam (in=b rename = (type = type_arbre));
by type_arbre;
if a and b then output equiv_inner;
run;
Une jointure à gauche permet de conserver les observations dont la valeur de la clé de fusion est présente dans
la première table, peu importe si la valeur est présente ou non dans la seconde. C’est la jointure LEFT JOIN dans
la procédure SQL qui permet cette opération.
* LEFT JOIN;
proc sql;
create table sql_left as
select *
from feuil_conif a
left join
groupe_diam b
on a.type_arbre = b.type
;
run;
Une jointure à droite permet de conserver les observations dont la valeur de la clé de fusion est présente dans la
seconde table, peu importe si la valeur est présente ou non dans la première. C’est la jointure RIGHT JOIN dans
la procédure SQL qui permet cette opération.
proc sql;
create table sql_right as
select *
from feuil_conif a
right join
groupe_diam b
on a.type_arbre = b.type
;
run;
L’énoncé MERGE dans une étape DATA permet plusieurs types de fusions, surtout en combinaison avec l’option
de tables de données IN=. Toutefois, les fusions de tables de données en produit cartésien (les deux tables de
données contiennent plusieurs observations pour une même clé) ne sont possibles qu’avec la procédure SQL.
data liste_prod;
data liste_jours;
input no_lecture jour $;
datalines;
1 lundi
2 lundi
1 mardi
2 mardi
1 mercredi
2 mercredi
1 jeudi
2 jeudi
1 vendredi
2 vendredi
;
run;
proc sql;
create table fusion as
select *
from liste_prod a
full join
liste_jours b
on a.no_lecture = b.no_lecture
;
quit;
i
Les données présentent des «statistiques d'utilisation des jeux de données disponibles sur le portail des Données
ouvertes de la Ville de Québec.» Le jeu de données a pour objectif de «diffuser le nombre de téléchargements des
jeux de données disponibles sur le portail de Données ouvertes de la Ville de Québec.» Les données ont été
téléchargées en août 2015.
Source : http://donnees.ville.quebec.qc.ca/donne_details.aspx?jdid=51
ii
Les données utilisées en entrée dans ces exemples proviennent du portail des données ouvertes de la ville de
Québec. Il s’agit d’une «cartographie de l’inventaire des arbres « potentiellement remarquables » sur le territoire
de la ville de Québec. L’inventaire cartographique des arbres « potentiellement remarquables » permet
d’identifier les arbres sur propriétés privées présentant des attributs exceptionnels et fournit pour chacun
l’essence (en français et en latin) et son diamètre.»
Source : http://donnees.ville.quebec.qc.ca/donne_details.aspx?jdid=82