Vous êtes sur la page 1sur 98

Notes de cours © – SAS

Logiciels statistiques pour l’analyse des donné es (6-613-11)

Par : Sarah Legendre Bilodeau


Dé partement des sciences de la dé cision
HEC Montré al

Version Hiver 2019


6-613-11 Logiciels statistiques pour l’analyse de données

Table des matières


1. Notions de base ..................................................................................................................................................7
1.1 Les différentes fenêtres de SAS ..................................................................................................................7
1.2 Tables de données, variables et observations ...........................................................................................8
1.3 Composantes d’un programme ..................................................................................................................8
1.3.1 Étape DATA .........................................................................................................................................9
1.3.2 Étape PROC .........................................................................................................................................9
1.4 Éléments spécifiques au langage et conventions .................................................................................... 10
1.5 Commentaires ......................................................................................................................................... 10
1.6 Types de variables ................................................................................................................................... 11
1.7 Valeurs manquantes ................................................................................................................................ 11
1.8 Librairie .................................................................................................................................................... 11
1.9 Validation du log...................................................................................................................................... 12
2. Les données ..................................................................................................................................................... 14
2.1 Saisie de données .................................................................................................................................... 14
2.2 Importation de données .......................................................................................................................... 15
2.2.1 Excel ................................................................................................................................................. 15
2.2.2 Autres formats ................................................................................................................................. 17
2.3 Exportation de données .......................................................................................................................... 18
2.4 Fonctions utiles........................................................................................................................................ 23
2.5 Opérateurs arithmétiques et logiques .................................................................................................... 20
2.6 Conditions dans la sélection d’observations ........................................................................................... 21
2.7 Création de variables ............................................................................................................................... 22
2.7.1 Énoncés conditionnels ..................................................................................................................... 25
2.7.2 Longueur des variables .................................................................................................................... 26
2.7.3 Les groupes DO ................................................................................................................................ 27
2.8 Conserver et supprimer des variables ..................................................................................................... 28
3. SAS : Manipulations de base ........................................................................................................................... 29

Sarah Legendre Bilodeau (2019) Page 2/98


6-613-11 Logiciels statistiques pour l’analyse de données

3.1 Trier une table de données ..................................................................................................................... 29


3.2 Fusion de tables de données ................................................................................................................... 29
3.2.1 Concaténation ................................................................................................................................. 30
3.2.2 Juxtaposition.................................................................................................................................... 31
3.3 Agréger des observations ........................................................................................................................ 32
3.4 Transposer une table de données ........................................................................................................... 33
3.5 Sorties de résultats .................................................................................................................................. 33
3.5.1 PROC PRINT ..................................................................................................................................... 34
3.5.2 PROC UNIVARIATE ........................................................................................................................... 35
3.5.3 PROC FREQ....................................................................................................................................... 35
3.6 Les formats dans SAS ............................................................................................................................... 35
3.7 Les dates SAS ........................................................................................................................................... 37
4. Manipulations avancées .................................................................................................................................. 40
4.1 Modifier des tables en entrée ou en sortie (options de tables de données) .......................................... 40
4.2 Modifier les types de variables................................................................................................................ 42
4.3 Formats sur mesure................................................................................................................................. 42
4.4 Liens entre les observations .................................................................................................................... 43
4.4.1 Énoncé RETAIN ................................................................................................................................ 44
4.4.2 Fonction LAG ................................................................................................................................... 45
4.4.3 Première et dernière observations d’un groupe ............................................................................. 45
5. SAS : Reporting ................................................................................................................................................ 47
5.1 Procédures de génération de tableaux ................................................................................................... 47
5.1.1 PROC TABULATE .............................................................................................................................. 47
5.1.2 PROC REPORT .................................................................................................................................. 51
5.2 ODS et interaction avec d’autres applications ........................................................................................ 54
5.2.1 ODS TAGSETS.EXCELXP et ODS EXCEL ............................................................................................. 55
5.2.2 ODS HTML ........................................................................................................................................ 59
5.2.3 ODS PDF ........................................................................................................................................... 60

Sarah Legendre Bilodeau (2019) Page 3/98


6-613-11 Logiciels statistiques pour l’analyse de données

5.2.4 ODS RTF ........................................................................................................................................... 60


6. SAS : Graphiques.............................................................................................................................................. 61
6.1 Procédures de génération de graphiques ............................................................................................... 61
6.1.1 Les énoncés globaux graphiques ..................................................................................................... 62
6.1.2 PROC GCHART.................................................................................................................................. 64
6.1.3 PROC BOXPLOT ................................................................................................................................ 66
6.1.4 PROC GPLOT .................................................................................................................................... 67
6.1.5 PROC SGPLOT .................................................................................................................................. 69
6.1.6 PROC GBARLINE ............................................................................................................................... 70
6.2 Mise en page dans SAS ............................................................................................................................ 71
6.2.1 ODS LAYOUT / ODS REGION ............................................................................................................ 71
7. SAS : Boucles et Arrays .................................................................................................................................... 74
7.1 Les boucles DO ........................................................................................................................................ 74
7.2 La simulation ........................................................................................................................................... 74
7.3 Array ........................................................................................................................................................ 75
7.4 DO UNTIL et DO WHILE ........................................................................................................................... 78
7.5 Autres éléments utiles pour les boucles ................................................................................................. 78
7.6 Transposer une table de données ........................................................................................................... 79
7.7 Transformer toutes les valeurs manquantes en 0................................................................................... 81
8. SAS : Le langage macro .................................................................................................................................... 82
8.1 Les bases du langage macro .................................................................................................................... 82
8.2 Les variables macro ................................................................................................................................. 82
8.2.1 Créer une variable macro avec %let ................................................................................................ 83
8.2.2 Créer une variable macro avec CALL SYMPUT................................................................................. 83
8.2.3 Variables macro globales et locales ................................................................................................ 84
8.2.4 Variables macro système................................................................................................................. 84
8.2.5 Autres éléments sur les variables macro......................................................................................... 85
8.3 Les fonctions macro................................................................................................................................. 85

Sarah Legendre Bilodeau (2019) Page 4/98


6-613-11 Logiciels statistiques pour l’analyse de données

8.4 Les macros SAS ........................................................................................................................................ 86


8.5 Les énoncés conditionnels macro ........................................................................................................... 87
8.6 Les boucles macro ................................................................................................................................... 88
8.7 Les commentaires dans les macros ......................................................................................................... 89
9. SAS : Introduction à la procédure SQL............................................................................................................. 90
9.1 Syntaxe de base ....................................................................................................................................... 90
9.2 L’énoncé GROUP BY................................................................................................................................. 91
9.3 Sélectionner des observations sur des données agrégées...................................................................... 91
9.4 Trier des données .................................................................................................................................... 92
9.5 Alimenter une variable macro ................................................................................................................. 92
9.6 Ajouter les observations dans une table de données ............................................................................. 93
9.7 Jointures horizontales de tables .............................................................................................................. 94
9.7.1 Jointure interne ............................................................................................................................... 94
9.7.2 Jointure à gauche............................................................................................................................. 95
9.7.3 Jointure à droite .............................................................................................................................. 96
9.7.4 Jointure produit cartésien ............................................................................................................... 96

Sarah Legendre Bilodeau (2019) Page 5/98


6-613-11 Logiciels statistiques pour l’analyse de données

Tableau des figures

Tableau 1 : Fonctions SAS courantes....................................................................................................................... 24


Tableau 2 : Priorité des opérateurs arithmétiques ................................................................................................. 20
Tableau 3 : Syntaxe des opérateurs logiques .......................................................................................................... 20
Tableau 4 : Opérateurs logiques spécifiques aux énoncés WHERE ........................................................................ 22
Tableau 5 : Exemples de formats selon les types de variables ............................................................................... 36
Tableau 6 : Statistiques pour la procédure TABULATE ............................................................................................ 48
Tableau 7 : Quelques options pour le TAGSETS.EXCELXP ....................................................................................... 56
Tableau 8 : Suggestions de procédures selon le type de graphique ....................................................................... 61
Tableau 9 : Énoncés globaux graphiques ................................................................................................................ 62
Tableau 10 : Options pour la procédure GCHART ................................................................................................... 65
Tableau 11 : Options pour la procédure BOXPLOT.................................................................................................. 67
Tableau 12 : Options pour la procédure GPLOT ...................................................................................................... 68

Sarah Legendre Bilodeau (2019) Page 6/98


6-613-11 Logiciels statistiques pour l’analyse de données

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 :

- des manipulations de données;


- des analyses descriptives;
- de la modélisation;
- de l’inférence;
- des graphiques;
- de l’optimisation;
- de l’analyse exploratoire;
- de la programmation matricielle.

Dans le cadre de ce cours, ce sont principalement les modules BASE, STAT et GRAPH qui seront abordés.

1.1 Les différentes fenêtres de SAS

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.

Fenêtre Results Viewer ou Output (selon les préférences de la session SAS):

Les résultats générés par certaines procédures sont affichés dans cette fenêtre.

Sarah Legendre Bilodeau (2019) Page 7/98


6-613-11 Logiciels statistiques pour l’analyse de données

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.

1.2 Tables de données, variables et observations

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).

1.3 Composantes d’un programme

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.

Sarah Legendre Bilodeau (2019) Page 8/98


6-613-11 Logiciels statistiques pour l’analyse de données

1.3.1 Étape DATA

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.

1.3.2 Étape PROC

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;.

Sarah Legendre Bilodeau (2019) Page 9/98


6-613-11 Logiciels statistiques pour l’analyse de données

1.4 Éléments spécifiques au langage et conventions

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 :

- indenter les énoncés compris à l’intérieur d’une étape;


- un énoncé par ligne (si l’énoncé est trop long, il peut s’étaler sur plusieurs lignes);
- au moins une ligne vide entre chaque étape;
- documenter le code.

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

Il y a deux façons d’écrire des commentaires dans SAS :

* 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é.

Sarah Legendre Bilodeau (2019) Page 10/98


6-613-11 Logiciels statistiques pour l’analyse de données

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.

1.6 Types de variables

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.

1.7 Valeurs manquantes

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.

Sarah Legendre Bilodeau (2019) Page 11/98


6-613-11 Logiciels statistiques pour l’analyse de données

%let path = C:\Votre chemin complet;

libname logistat "&path.\FichiersSAS";

Data table1; *La table table1 est créée de façon temporaire;


test = 1;
Run;

Data logistat.table1; *La table table1 est créée de façon permanente;


test = 1;
Run;

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.

1.9 Validation du log

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

Sarah Legendre Bilodeau (2019) Page 12/98


6-613-11 Logiciels statistiques pour l’analyse de données

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.

Sarah Legendre Bilodeau (2019) Page 13/98


6-613-11 Logiciels statistiques pour l’analyse de données

2. Les données

2.1 Saisie de 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.

Lecture par liste :

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.

Sarah Legendre Bilodeau (2019) Page 14/98


6-613-11 Logiciels statistiques pour l’analyse de données

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;

Lecture par colonne :

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 Importation de données

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.

PROC IMPORT OUT= utilisation


DATAFILE= "&path.\STATS_DONNEES.xlsx"
DBMS=EXCEL REPLACE;
RANGE="STATS_DONNEES$";
GETNAMES=YES;
RUN;

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 :

Sarah Legendre Bilodeau (2019) Page 15/98


6-613-11 Logiciels statistiques pour l’analyse de données

PROC IMPORT OUT= utilisation


DATAFILE= "&path.\STATS_DONNEES.xlsx"
DBMS=EXCELCS REPLACE;
RANGE="STATS_DONNEES$";
RUN;

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 :

- DATAFILE : emplacement et nom du fichier de données à importer;


- OUT : nom de la table de données SAS en sortie;
- DBMS : type de fichier en entrée (EXCEL, CSV, DLM, …);
- REPLACE : si une table de données du même nom est déjà existante, indique si elle doit être remplacée;
- RANGE : indique quelle feuille EXCEL doit être importée;
- GETNAMES : YES si la première ligne du fichier de données contient les variables (ne fonctionne pas avec
DBMS=EXCELCS).

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.

LIBNAME libxls EXCEL "&path.\Sem6\STATS_DONNEES.xlsx";

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.

libname libxls clear;

Sarah Legendre Bilodeau (2019) Page 16/98


6-613-11 Logiciels statistiques pour l’analyse de données

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 :

LIBNAME libxls XLSX "&path.\STATS_DONNEES.xlsx";

data /*logistat.*/utilisation;
set libxls.stats_donnees;
run;

libname libxls clear;

2.2.2 Autres formats

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 :

- spécifier directement l’adresse d’un fichier dans l’énoncé INFILE;


- utiliser un énoncé FILENAME en dehors d’une étape data (un peu comme on le fait pour un LIBNAME) et
faire référence à ce fichier avec l’énoncé INFILE.

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.

filename arbres "&path.\ARBRES_EXCEPTION.csv";

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

Sarah Legendre Bilodeau (2019) Page 17/98


6-613-11 Logiciels statistiques pour l’analyse de données

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,

input type_lieu :$15.

En l’absence du «:», SAS continue la lecture du champ pendant 12 caractères malgré la présence de délimiteurs.

Quelques options permettent de personnaliser la lecture des données :

- 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.

2.3 Exportation de données

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.

Sarah Legendre Bilodeau (2019) Page 18/98


6-613-11 Logiciels statistiques pour l’analyse de données

PROC EXPORT DATA = logistat.arbres_remarquables


OUTFILE = "&path.\Export_txt.txt"
DBMS = DLM REPLACE;
DELIMITER = "09"x ; /* séparateur tabulation */
RUN;

PROC EXPORT data = logistat.arbres_remarquables


outfile="&path.\Export_xls.xls"
dbms=XLS replace;
sheet="tele_an";
run;

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.

libname expor EXCEL "&path.\Export_lib.xlsx";

data expor.arbresrem;
set logistat.arbres_remarquables;
run;

libname expor clear;

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).

Sarah Legendre Bilodeau (2019) Page 19/98


6-613-11 Logiciels statistiques pour l’analyse de données

DATA _null_;
FILE "&path.\Export_file.txt" DLM=",";
SET logistat.arbres_remarquables;
PUT nom_fr type_arbre diametre;
RUN;

2.4 Opérateurs arithmétiques et logiques

Les opérateurs arithmétiques de base obéissent à la priorité des opérations :

Tableau 1 : Priorité des opérateurs arithmétiques


Syntaxe SAS Définition Priorité
** Exponentiation 1
* Multiplication 2
/ Division 2
+ Addition 3
- Soustraction 3

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 :

Tableau 2 : Syntaxe des opérateurs logiques


Syntaxe SAS Définition
=, EQ égal à
^=, ¬=, ~=, NE n’est pas égal à
>, GT plus grand que
<, LT plus petit que
>=, GE plus grand ou égal
<=, LE plus petit ou égal

Sarah Legendre Bilodeau (2019) Page 20/98


6-613-11 Logiciels statistiques pour l’analyse de données

IN égal à un élément de la liste


&, AND et logique
|, OR ou logique
^, ¬, ~, NOT non logique
?, CONTAINS inclus une sous-chaîne

2.5 Conditions dans la sélection d’observations

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.

* Avec énoncé where;


data arbres1;
set logistat.arbres_remarquables;
where diametre >= 100;
run;

* Équivalent avec énoncé if;


data arbres2;
set logistat.arbres_remarquables;
if diametre >= 100;
run;

Dans une étape PROC, il est nécessaire d’utiliser l’énoncé WHERE, puisque IF n’est pas disponible.

proc print data = logistat.arbres_remarquables;


var nom_fr longitude latitude;
where 150 <= diametre <= 200;
run;

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 :

Sarah Legendre Bilodeau (2019) Page 21/98


6-613-11 Logiciels statistiques pour l’analyse de données

- 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.

Certains opérateurs sont spécifiques à un énoncé WHERE :

Tableau 3 : Opérateurs logiques spécifiques aux énoncés WHERE


Syntaxe Définition
BETWEEN – AND Sélection inclusive
WHERE SAME AND Augmentation d’une expression WHERE
IS NULL Valeur manquante
IS MISSING Valeur manquante
LIKE Respecte un patron

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;

2.6 Création de variables

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;

Sarah Legendre Bilodeau (2019) Page 22/98


6-613-11 Logiciels statistiques pour l’analyse de données

2.7 Fonctions utiles

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;

*** Variables numériques;


* Ajout de la valeur 10 à chaque diamètre;
diam_10 = sum(diametre, 10);

*** Variables caractères;


* Concaténer deux chaînes de caractère (création de variable);
concat = cat(type_lieu, type_arbre);
* Autre syntaxe pour obtenir le même résultat;
concat2 = type_lieu || type_arbre;
* Même chose, mais sans les blancs aux extrémités des deux variables
utilisées;
concat3 = cats(type_lieu, type_arbre);
* Même chose, mais en ajoutant un séparateur;
concat4 = catx("_", type_lieu, type_arbre);

* Convertir tous les caractères en majuscules;


maj = upcase(type_arbre);

* Extraire une partie d'une chaîne de caractères;


extract = substr(type_lieu, 1, 4); *À partir de la position 1, pendant 4;
* Extraire ce qui se retrouve entre parenthèses;
position_deb = index(nom_fr, "(");
position_fin = index(nom_fr, ")");
extract2 = substrn(nom_fr, position_deb+1, position_fin-position_deb);
run;

proc print data = logistat.arbres_remarquables;


where index(nom_fr, "(") ne 0;
var nom_fr;
run;

Sarah Legendre Bilodeau (2019) Page 23/98


6-613-11 Logiciels statistiques pour l’analyse de données

Tableau 4 : Fonctions SAS courantes


Fonction Description
Variables numériques
ABS Valeur absolue
MOD Reste de la division
SIGN Signe
SQRT Racine carrée
CEIL Plus petit entier >=
FLOOR Plus grand entier <=
INT Partie entière
ROUND Arrondit
EXP Valeur exponentielle
LOG Logarithme naturel
LOG10 Logarithme en base 10
MIN Valeur minimale
MAX Valeur maximale
SUM Somme des non manquants
MEAN Moyenne arithmétique
VAR Variance
Variables caractères
COMPBL Enlève les multiples caractères blancs d’une chaîne de caractères
COMPRESS Retourne les caractères spécifiés d’une chaîne de caractères
DEQUOTE Retrait de guillemets ou d’apostrophe
INDEX Recherche une expression de caractères et retourne sa position
LENGTH Longueur
LEFT Alignement vers la gauche
RICHT Alignement vers la droite
LOWCASE Conversion en minuscules
UPCASE Conversion en majuscules
SCAN Sélectionne un mot
SUBSTR Extraction d’une sous-chaîne de caractère
TRANSLATE Remplace des caractères
TRANSWRD Remplace ou enlève un mot
TRIM Enlève tous les blancs au début et à la fin
Variables dates
DATE Date courante dans le format SAS
DATEJUL Convertie la date julienne dans le format SAS
DATEPART Extraire une date à partir d’un format DATETIME
DAY Jour du mois
MONTH Mois
YEAR Année
JULDATE Retourne la date julienne
MDY Date en format SAS à partir de mois, jour, année
TODAY Date courante en format SAS
WEEKDAY Jour de la semaine

Sarah Legendre Bilodeau (2019) Page 24/98


6-613-11 Logiciels statistiques pour l’analyse de données

2.8 Énoncés conditionnels

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 :

- créer une nouvelle variable en fonction de la valeur d’une autre variable;


- modifier le contenu d’une variable en fonction de ce qu’elle contient à la base.

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;

* Exemple d'utilisation de la fonction substr;


if substr(nom_fr, 1, 4) = "orme" then orme = 1;
else orme = 0;

* Création de la variable cat_diametre (première méthode);


if 0 <= diametre <= 50 then cat_diametre = 1;
else if diametre <= 100 then cat_diametre = 2;
else if diametre <= 150 then cat_diametre = 3;
else if diametre <= 200 then cat_diametre = 4;
else if diametre <= 250 then cat_diametre = 5;
else cat_diametre = 9;

* Même résultat à l'exception du nom de la variable créé (deuxième méthode);


select;
when (0 <= diametre <= 50) cat_diametre1 = 1;
when (50 < diametre <= 100) cat_diametre1 = 2;
when (100 < diametre <= 150) cat_diametre1 = 3;
when (150 < diametre <= 200) cat_diametre1 = 4;
when (200 < diametre <= 250) cat_diametre1 = 5;
otherwise cat_diametre1 = 9;
end;

run;

Sarah Legendre Bilodeau (2019) Page 25/98


6-613-11 Logiciels statistiques pour l’analyse de données

2.8.1 Longueur des variables

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.

* Avec ajout d'espaces;


data arbres6;
set logistat.arbres_remarquables;
if substr(nom_fr, 1, 4) = "orme" then categorie = "orme ";
else if substr(nom_fr, 1, 7) = "bouleau" then categorie = "bouleau";
else categorie = "autres";
run;

* Avec énoncé length;


data arbres7;
length categorie $8;
set logistat.arbres_remarquables;
if substr(nom_fr, 1, 4) = "orme" then categorie = "orme";
else if substr(nom_fr, 1, 7) = "bouleau" then categorie = "bouleau";
else categorie = "autres";

run;

Sarah Legendre Bilodeau (2019) Page 26/98


6-613-11 Logiciels statistiques pour l’analyse de données

2.8.2 Les groupes DO

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;

Sarah Legendre Bilodeau (2019) Page 27/98


6-613-11 Logiciels statistiques pour l’analyse de données

2.9 Conserver et supprimer des variables

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.

*** Supprimer des variables;


data arbres9;
set logistat.arbres_remarquables;
drop date_plante liaison direction;
run;

2.10 Renommer des variables

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;

Sarah Legendre Bilodeau (2019) Page 28/98


6-613-11 Logiciels statistiques pour l’analyse de données

3. SAS : Manipulations de base

3.1 Trier une table de données

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é.

proc sort data = logistat.arbres_remarquables;


by diametre;
run;

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.

proc sort data = logistat.arbres_remarquables (keep = nom_fr)


out = liste_arbres
nodupkey;
by nom_fr;
run;

3.2 Fusion de tables de données

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).

Sarah Legendre Bilodeau (2019) Page 29/98


6-613-11 Logiciels statistiques pour l’analyse de données

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.

Sarah Legendre Bilodeau (2019) Page 30/98


6-613-11 Logiciels statistiques pour l’analyse de données

proc sort data = table1; by identifiant; run;


proc sort data = table2; by identifiant; run;

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;

proc sort data = concate_tri; by identifiant; run;


proc sort data = table3; by identifiant; 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.

Sarah Legendre Bilodeau (2019) Page 31/98


6-613-11 Logiciels statistiques pour l’analyse de données

3.3 Agréger des observations

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, …

Les procédures SUMMARY et MEANS permettent d’agréger des données.

proc summary data = logistat.utilisation nway missing;


class titre format;
var nb_telechargements;
output out = sommaire_util1 (drop = _type_)
sum=;
run;

proc summary data = logistat.utilisation nway missing;


class titre;
var nb_telechargements;
output out = sommaire_util2 (drop = _type_ _freq_)
sum=somme_nb
mean=moy_nb;
run;

Dans la pratique, j’utilise presque toujours les options NWAY et MISSING :

- 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.

proc means data = logistat.utilisation /*sum*/ nway missing noprint;


class titre;
var nb_telechargements;
output out = sommaire_util3 (drop = _type_ _freq_)
sum=;
run;

Sarah Legendre Bilodeau (2019) Page 32/98


6-613-11 Logiciels statistiques pour l’analyse de données

3.4 Transposer une table de données

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.

* Étape préalable d'agrégation des données;


proc summary data = logistat.utilisation nway missing;
class titre format;
var nb_telechargements;
output out = util_ag (drop = _:)
sum=;
run;

proc transpose data = util_ag out = util_ag_transp (drop = _name_);


by titre;
id format;
var nb_telechargements;
run;

* Revenir à l'état initial;


proc transpose data = util_ag_transp out = retour;
var _CSV _JSON _XLS _XML _ZIP _KML _DWG _SHP _KMZ _GEOJSON;
by titre;
run;

3.5 Sorties de résultats

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.

Sarah Legendre Bilodeau (2019) Page 33/98


6-613-11 Logiciels statistiques pour l’analyse de données

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.

Sa forme la plus simple imprime la table de données telle quelle.

proc print data = util_ag_transp;


run;

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.

proc sort data = logistat.utilisation; by descending nb_telechargements; run;

title1 "Les 10 observations associées aux plus grands nombres de téléchargements";

proc print data = logistat.utilisation (obs = 10) noobs;


var DATE_CONSULTE FORMAT TITRE NB_TELECHARGEMENTS;
run;

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 :

Title1 "Mon texte";

En ne spécifiant pas l’indice, SAS assume que c’est le chiffre 1.

Title; footnote; * Permet d’annuler tous les titres et toutes les notes de bas de
page;

Sarah Legendre Bilodeau (2019) Page 34/98


6-613-11 Logiciels statistiques pour l’analyse de données

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.

proc univariate data = logistat.utilisation;


var nb_telechargements;
run;

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.

proc freq data = logistat.arbres_remarquables;


tables type_lieu;
run;

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.

proc freq data = logistat.arbres_remarquables;


tables type_lieu * type_arbre;
run;

3.6 Les formats de SAS

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) :

Sarah Legendre Bilodeau (2019) Page 35/98


6-613-11 Logiciels statistiques pour l’analyse de données

Tableau 5 : Exemples de formats selon les types de variables


Format Valeur Affichage
Variables alphanumériques
$4. Programme Prog
Variables numériques
12. 27134.5864 27135
12.2 27134.5864 27134.59
COMMA12.2 27134.5864 27,134.59
DOLLAR12.2 27134.5864 $27,134.59
COMMAX12.2 27134.5864 25.134,59
NUMX8.2 27134.5864 27134,59
NLNUM10.2 * 27134.5864 27 134,59
Dates
Date. 01jan15
Date9. 01jan2015
YYMMDD10. 2016-11-24
YYMMDD8. 16-11-24
DDMMYY10. 24/11/2006
MMDDYY6. 010160
MMDDYY8. 01/01/60
MMYYS7. 11/2006
YEAR4. 2006
FRADFWDX. 24 novembre 2006
FRADFWKX. vendredi 24 novembre 2006
FRADFMN. novembre
FRADFDWN. Vendredi
* Les formats NL s’adaptent à la langue de configuration de l’ordinateur

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;

proc print data = logistat.arbres_remarquables (obs = 10);


var nom_fr diametre specifique;
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.

Sarah Legendre Bilodeau (2019) Page 36/98


6-613-11 Logiciels statistiques pour l’analyse de données

3.7 Les libellés

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 libellés;


data ex_label;
set logistat.arbres_remarquables;
label type_lieu = "Type de lieu"
nom_lat = "Nom de l'arbre en latin"
nom_fr = "Nom de l'arbre en français"
;
keep type_lieu nom_lat nom_fr;
run;

* Pour retirer tous les libellés;


data ex_label2;
set ex_label;
attrib _all_ label = "";
run;

3.8 Les dates SAS

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

Sarah Legendre Bilodeau (2019) Page 37/98


6-613-11 Logiciels statistiques pour l’analyse de données

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;

annee = input(substr(DATE_CONSULTE, 1, 4), 8.);


mois = input(substr(DATE_CONSULTE, 6, 2), 8.);
jour = input(substr(DATE_CONSULTE, 9, 2), 8.);

date_sas = mdy(mois, jour, annee);

format date_sas yymmdd10.;


run;

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);

date_sas = mdy(mois, jour, annee);

format date_sas yymmdd10.;


run;

Sarah Legendre Bilodeau (2019) Page 38/98


6-613-11 Logiciels statistiques pour l’analyse de données

3. Utiliser l’INFORMAT connu avec la fonction INPUT :

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;

if '01jan2014'd <= date_sas <= '31dec2014'd;


run;

Sarah Legendre Bilodeau (2019) Page 39/98


6-613-11 Logiciels statistiques pour l’analyse de données

4. Manipulations avancées

4.1 Modifier des tables en entrée ou en sortie (options de tables de donné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.

* Table de données pour les feuillus;


data logistat.feuillus (drop = type_arbre);
set logistat.arbres_remarquables
(where = (type_arbre = "Feuillu")
keep = nom_fr type_arbre diametre type_prop type_lieu);
run;

* Table de données pour les conifères;


data logistat.Coniferes (drop = type_arbre);
set logistat.arbres_remarquables
(where = (type_arbre = "Conifère")
keep = nom_fr type_arbre diametre type_prop type_lieu);
run;

* Table de correspondances entre les noms français et latins;


proc sort data = logistat.arbres_remarquables
out = correspondances_noms (keep = nom_fr nom_lat)
nodupkey;
by nom_fr;
run;

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.

Sarah Legendre Bilodeau (2019) Page 40/98


6-613-11 Logiciels statistiques pour l’analyse de données

* Concaténation des tables sur les feuillus et les conifères;


data feuil_conif;
set logistat.feuillus (in=a)
logistat.coniferes (in=b);
if a then type_arbre = "F";
if b then type_arbre = "C";
run;

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é.

* Nouvelle table présentant les types d'arbres;


data groupe_diam;
input type $ nom $;
datalines;
F Feuillu
C Conifère
A Autre
;
run;

* Ajout des informations sur le type d'arbre;


proc sort data = feuil_conif; by type_arbre; run;
proc sort data = groupe_diam; by type; run;

data feuil_conif2 prob1 prob2;


merge feuil_conif (in=a)
groupe_diam (in=b rename = (type = type_arbre));
by type_arbre;
if a then output feuil_conif2;
if a and not b then output prob1;
if b and not a then output prob2;
run;

* Impressions de validations;
proc print data = prob1;
title "Problème: Un type d'arbre ne se retrouve pas dans groupe_diam";
run; title;

proc print data = prob2;


title "À vérifier: Un type d'arbre n'est pas représenté dans la table de
données de la ville";
run; title;

Sarah Legendre Bilodeau (2019) Page 41/98


6-613-11 Logiciels statistiques pour l’analyse de données

4.2 Modifier les types de variables

À 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).

*** Modifier les types de variables;


data modif_types;
set logistat.arbres_remarquables;

* Numérique vers caractère;


diametre_car = put(diametre, 8.);

* Caractère vers numérique;


diametre_num = input(diametre_car, 8.);
* ou;
diametre_num2 = diametre_car + 0;
run;

4.3 Formats sur mesure

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 $.

Sarah Legendre Bilodeau (2019) Page 42/98


6-613-11 Logiciels statistiques pour l’analyse de données

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;

proc freq data = formats_perso;


tables diametre type_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.

4.4 Liens entre les observations

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.

Sarah Legendre Bilodeau (2019) Page 43/98


6-613-11 Logiciels statistiques pour l’analyse de données

4.4.1 Énoncé RETAIN

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;

2. Conserver une valeur

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.

proc sort data = logistat.utilisation_datesas; by date_sas; run;

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;

Sarah Legendre Bilodeau (2019) Page 44/98


6-613-11 Logiciels statistiques pour l’analyse de données

4.4.2 Fonction LAG

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.

proc summary data = logistat.utilisation_datesas nway missing;


class annee date_sas;
var NB_TELECHARGEMENTS;
output out = utilisation_som (drop = _:) sum=;
run;

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.

4.4.3Première et dernière observations d’un groupe

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.

Sarah Legendre Bilodeau (2019) Page 45/98


6-613-11 Logiciels statistiques pour l’analyse de données

proc sort data = utilisation_som; by annee date_sas; run;

data utilisation_som1 deb_fin_annee;


set utilisation_som;
by annee date_sas;

if first.annee then premierjour_an = 1;


else premierjour_an = 0;

if last.annee then dernierjour_an = 1;


else dernierjour_an = 0;

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;

Sarah Legendre Bilodeau (2019) Page 46/98


6-613-11 Logiciels statistiques pour l’analyse de données

5. SAS : Reporting

5.1 Procédures de génération de tableaux

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.

5.1.1 PROC TABULATE

La syntaxe de base de la procédure TABULATE est la suivante :

PROC TABULATE DATA = table_en_entree;


CLASS var1;
VAR var2;
TABLE (var_lignes) ,
(var_colonnes) *
(cellules)
;
RUN;

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é :

- «,» : limite entre les lignes et les colonnes;


- « » : juxtaposition de deux éléments dans la même ligne ou dans la même colonne;
- «*» : deux éléments imbriqués dans la même ligne ou dans la même colonne.

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 :

Sarah Legendre Bilodeau (2019) Page 47/98


6-613-11 Logiciels statistiques pour l’analyse de données

Tableau 6 : Statistiques pour la procédure TABULATE


Mot-clé Description

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 :

Sarah Legendre Bilodeau (2019) Page 48/98


6-613-11 Logiciels statistiques pour l’analyse de données

proc tabulate data = logistat.arbres_remarquables;


var diametre;
table diametre * (mean median min max);
run;

proc tabulate data = logistat.arbres_remarquables;


class nom_fr;
var diametre;
table nom_fr, /* lignes */
diametre * (mean median min max); /* colonnes */
run;

proc tabulate data = logistat.arbres_remarquables;

class type_arbre nom_fr;


var diametre;
table type_arbre, /* pages */
nom_fr, /* lignes */
diametre * (mean median min max); /* colonnes */
run;

proc tabulate data = logistat.arbres_remarquables;


class type_arbre nom_fr;
var diametre;
table type_arbre * nom_fr, /* lignes */
diametre * (mean median min max); /* colonnes */
run;

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é.

proc tabulate data = logistat.arbres_remarquables;


class type_arbre nom_fr;
var diametre;
table type_arbre * (nom_fr ALL) ALL, /* lignes */
diametre * (mean median min max); /* colonnes */
run;

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.

Sarah Legendre Bilodeau (2019) Page 49/98


6-613-11 Logiciels statistiques pour l’analyse de données

proc tabulate data = logistat.arbres_remarquables;


class type_arbre nom_fr;
var diametre;
table type_arbre = "Type d'arbre" *
(nom_fr = "Nom de l'arbre" ALL = "Total type d'arbre")
ALL = "Grand total",

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.

proc tabulate data = logistat.arbres_remarquables;


class type_arbre nom_fr;
var diametre;
table type_arbre = "" *
(nom_fr = "" ALL = "Total type d'arbre")
ALL = "Grand total",

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=).

proc tabulate data = logistat.arbres_remarquables;


class type_arbre nom_fr;
var diametre;
table type_arbre = "" *
(nom_fr = "" (ALL = "Total type d'arbre")*{S={FONT_WEIGHT=BOLD}})
(ALL = "Grand total")*{S={FONT_WEIGHT=BOLD}},

diametre = "" *
(mean="Moyenne" median="Médiane" min="Minimum"
max="Maximum")*F=8.0
/ box = "Statistiques pour la mesure du diamètre";
run;

Sarah Legendre Bilodeau (2019) Page 50/98


6-613-11 Logiciels statistiques pour l’analyse de données

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.

La procédure REPORT comprend l’utilisation d’énoncés particuliers :

- 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.

Sarah Legendre Bilodeau (2019) Page 51/98


6-613-11 Logiciels statistiques pour l’analyse de données

proc summary data = logistat.utilisation_datesas nway missing;


class format annee mois;
var nb_telechargements;
output out = util_report (drop = _:) sum=;
run;

proc transpose data = util_report out = util_report1 (drop = _name_);


var nb_telechargements;
by format annee;
id mois;
run;

proc report data = util_report1 (where = (annee = 2014));


*columns format _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12;
columns format ("Trimestre 1" _1 _2 _3) ("Trimestre 2" _4 _5 _6)
("Trimestre 3" _7 _8 _9) ("Trimestre 4" _10 _11 _12);
define format / display "Type de fichier";
define _1 / analysis "Janvier";
define _2 / analysis "Février";
define _3 / analysis "Mars";
define _4 / analysis "Avril";
define _5 / analysis "Mai";
define _6 / analysis "Juin";
define _7 / analysis "Juillet";
define _8 / analysis "Août";
define _9 / analysis "Septembre";
define _10 / analysis "Octobre";
define _11 / analysis "Novembre";
define _12 / analysis "Décembre";

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.

Sarah Legendre Bilodeau (2019) Page 52/98


6-613-11 Logiciels statistiques pour l’analyse de données

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;

proc report data = util_report2 (where = (annee = 2014));


columns histo format ("Trimestre 1" _1 _2 _3) ("Trimestre 2" _4 _5 _6)
("Trimestre 3" _7 _8 _9) ("Trimestre 4" _10 _11 _12);
define histo / group "Historique du format";
define format / display "Type de fichier";
define _1 / analysis "Janvier" format = nlnum8.;
define _2 / analysis "Février" format = nlnum8.;
define _3 / analysis "Mars" format = nlnum8.;
define _4 / analysis "Avril" format = nlnum8.;
define _5 / analysis "Mai" format = nlnum8.;
define _6 / analysis "Juin" format = nlnum8.;
define _7 / analysis "Juillet" format = nlnum8.;
define _8 / analysis "Août" format = nlnum8.;
define _9 / analysis "Septembre" format = nlnum8.;
define _10 / analysis "Octobre" format = nlnum8.;
define _11 / analysis "Novembre" format = nlnum8.;
define _12 / analysis "Décembre" format = nlnum8.;

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.

Voici d’autres options de la procédure REPORT :

- SPLIT : Changer le symbole associé aux sauts de ligne

- 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.

Sarah Legendre Bilodeau (2019) Page 53/98


6-613-11 Logiciels statistiques pour l’analyse de données

proc report data = util_report2 (where = (annee = 2014))


style(column)=[CELLWIDTH=3cm JUST=center]
split = "*";
columns histo format ("Trimestre 1" _1 _2 _3) ("Trimestre 2" _4 _5 _6)
("Trimestre 3" _7 _8 _9) ("Trimestre 4" _10 _11 _12);
define histo / group "Historique*du format" style = [cellwidth=4cm];
define format / display "Type de*fichier";
define _1 / analysis "Janvier" format = nlnum8.;
define _2 / analysis "Février" format = nlnum8.;
define _3 / analysis "Mars" format = nlnum8.;
define _4 / analysis "Avril" format = nlnum8.;
define _5 / analysis "Mai" format = nlnum8.;
define _6 / analysis "Juin" format = nlnum8.;
define _7 / analysis "Juillet" format = nlnum8.;
define _8 / analysis "Août" format = nlnum8.;
define _9 / analysis "Septembre" format = nlnum8.;
define _10 / analysis "Octobre" format = nlnum8.;
define _11 / analysis "Novembre" format = nlnum8.;
define _12 / analysis "Décembre" format = nlnum8.;

compute before;
line ' ';
endcomp;
compute after histo;
line ' ';
endcomp;
run;

5.2 ODS et interaction avec d’autres applications

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.

Sarah Legendre Bilodeau (2019) Page 54/98


6-613-11 Logiciels statistiques pour l’analyse de données

5.2.1ODS TAGSETS.EXCELXP et ODS EXCEL

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.

ODS TAGSETS.EXCELXP FILE = "lien complet du fichier xls"


options communes ODS
OPTIONS (nomOption="valeur");

PROC …;
…;
RUN;

ODS TAGSETS.EXCELXP CLOSE;

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.

Voici un aperçu de quelques options spécifiques au format XML vers EXCEL :

Sarah Legendre Bilodeau (2019) Page 55/98


6-613-11 Logiciels statistiques pour l’analyse de données

Tableau 7 : Quelques options pour le TAGSETS.EXCELXP


Option (valeur par défaut) Description
Contenu feuille
FROZEN_HEADERS (NO) Figer la ligne d’en-tête des colonnes
AUTOFILTERS (NONE) Filtres automatiques
FORMULAS (YES) Formules acceptées dans les valeurs proposées pour les cellules EXCEL
CONVERT_PERCENTAGES (YES) Conversion des pourcentages SAS en pourcentages EXCEL
MISSING_ALIGN (R) Justification des valeurs manquantes
Feuilles
SHEET_INTERVAL (TABLE) Moment du changement de feuille dans le classeur
SHEET_NAME (NONE) Nom de base des feuilles, auquel on applique un compteur
SHEET_LABEL (NONE) Remplacer la fin du nom automatique de la feuille
CONTENTS (NO) Feuille contenant une table des matières
INDEX (NO) Feuille contenant un index des autres feuilles
Impression
ORIENTATION (PORTRAIT) Orientation
ZOOM (100) Zoom d’affichage
SCALE (100) Zoom d’impression
GRIDLINES (NO) Quadrillage automatique à l’impression
FITTOPAGE (NO) Feuille dans une page à l’impression
EMBEDDED_TITLES (NO) Considérer les notes de bas de page comme des pieds de page EXCEL
SUPPRESS_BYLINES (NO) Suppression des lignes de séparation entre les blocs BY
ROW_REPEAT (NONE) Répéter le titre des colonnes sur chaque page

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 :

ODS tagsets.excelxp file="test.xml" options(doc="help");

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

Sarah Legendre Bilodeau (2019) Page 56/98


6-613-11 Logiciels statistiques pour l’analyse de données

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.

ods tagsets.excelxp file = "&path.\ODS1_excelxp.xls"


options(SHEET_NAME = "tabulate")
style = journal;

proc tabulate data = logistat.arbres_remarquables;


class type_arbre nom_fr;
var diametre;
table type_arbre = "" *
(nom_fr = "" (ALL = "Total type d'arbre")*{S={FONT_WEIGHT=BOLD}})
(ALL = "Grand total")*{S={FONT_WEIGHT=BOLD}},

diametre = "" *
(mean="Moyenne" median="Médiane" min="Minimum"
max="Maximum")*F=8.0
/ box = "Statistiques pour la mesure du diamètre";
run;

ods tagsets.excelxp options(SHEET_NAME = "report");

Sarah Legendre Bilodeau (2019) Page 57/98


6-613-11 Logiciels statistiques pour l’analyse de données

proc report data = util_report2 (where = (annee = 2014))


style(column)=[CELLWIDTH=3cm JUST=center]
split = "*" NOWD;
columns histo format ("Trimestre 1" _1 _2 _3) ("Trimestre 2" _4 _5 _6)
("Trimestre 3" _7 _8 _9) ("Trimestre 4" _10 _11 _12);
define histo / group "Historique*du format" style = [cellwidth=4cm];
define format / display "Type de*fichier";
define _1 / analysis "Janvier" format = nlnum8.;
define _2 / analysis "Février" format = nlnum8.;
define _3 / analysis "Mars" format = nlnum8.;
define _4 / analysis "Avril" format = nlnum8.;
define _5 / analysis "Mai" format = nlnum8.;
define _6 / analysis "Juin" format = nlnum8.;
define _7 / analysis "Juillet" format = nlnum8.;
define _8 / analysis "Août" format = nlnum8.;
define _9 / analysis "Septembre" format = nlnum8.;
define _10 / analysis "Octobre" format = nlnum8.;
define _11 / analysis "Novembre" format = nlnum8.;
define _12 / analysis "Décembre" format = nlnum8.;

compute before;
line ' ';
endcomp;
compute after histo;
line ' ';
endcomp;
run;

ods tagsets.excelxp close;

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.

ods excel file = "&path.\ODS2_excel.xlsx"


options(SHEET_NAME = "tabulate")
style = journal;

proc tabulate data = logistat.arbres_remarquables;


var diametre;
table diametre * (mean median min max);
run;

ods excel close;

Sarah Legendre Bilodeau (2019) Page 58/98


6-613-11 Logiciels statistiques pour l’analyse de données

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.

5.2.2 ODS HTML

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.

ods html file = "&path.\ODS3_html.xls"


style = journal;

proc tabulate data = logistat.arbres_remarquables;


var diametre;
table diametre * (mean median min max);
run;

ods html close;

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.

Pour un fichier en format html, il suffit de modifier l’extension :

ods html file = "&path.\ODS3_html.html"


style = journal;

proc tabulate data = logistat.arbres_remarquables;


var diametre;
table diametre * (mean median min max);
run;

ods html close;

Sarah Legendre Bilodeau (2019) Page 59/98


6-613-11 Logiciels statistiques pour l’analyse de données

5.2.3 ODS PDF

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.

ods pdf file = "&path.\ODS4_pdf.pdf"


style = journal;

proc tabulate data = logistat.arbres_remarquables;


var diametre;
table diametre * (mean median min max);
run;

ods pdf close;

5.2.4 ODS RTF

La destination RTF permet d’exporter les résultats dans des formats lisibles avec des éditeurs de texte tels que MS
WORD.

ods rtf file = "&path.\ODS5_doc.doc"


style = journal bodytitle;

title1 "Arbres remarquables: statistiques pour le diamètre";


footnote1 "HEC MONTRÉAL";
proc tabulate data = logistat.arbres_remarquables;
var diametre;
table diametre * (mean median min max);
run;
title1; footnote1;

ods rtf close;

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.

Sarah Legendre Bilodeau (2019) Page 60/98


6-613-11 Logiciels statistiques pour l’analyse de données

6. SAS : Graphiques

6.1 Procédures de génération de 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.

Tableau 8 : Suggestions de procédures selon le type de graphique


Type de Graphiques Procédure et mots-clés
Une variable catégorique ou numérique discrète
Diagramme en secteurs PROC GCHART (PIE)
Diagramme en bâtons PROC GCHART (HBAR ou VBAR)
PROC SGPLOT (HBAR ou VBAR)
Une variable numérique
Histogramme PROC UNIVARIATE (HISTOGRAM)
PROC SGPLOT (HISTOGRAM)
Diagramme arborescent PROC UNIVARIATE (PLOT)
Diagramme en boîte PROC BOXPLOT
PROC SGPLOT (VBOX ou HBOX)
Estimateur à noyau PROC SGPLOT (DENSITY et TYPE = KERNEL)
Diagramme quantile-quantile théorique PROC UNIVARIATE (QQPLOT)
Deux variables catégoriques ou numériques discrètes
Diagramme en bâtons empilés PROC GCHART (HBAR ou VBAR, avec SUBGROUP)
Diagramme en bâtons groupés PROC GCHART (HBAR ou VBAR, avec GROUP)
Une variable catégorique et une variable numérique
Histogramme groupé PROC UNIVARIATE (avec CLASS et HISTOGRAM)
Diagrammes en boîte groupés PROC BOXPLOT
Deux variables numériques
Diagramme de dispersion PROC GPLOT
PROC SGPLOT (avec SCATTER)
Diagramme temporel PROC GPLOT (avec SYMBOL, INTERPOL = JOIN)
PROC SGPLOT (avec SERIES)
Trois variables ou plus
Diagramme de dispersion groupé PROC GPLOT (OVERLAY ou variable de groupe)
PROC SGPLOT (avec SCATTER et GROUP)
Diagramme temporel groupé PROC GPLOT (OVERLAY ou variable de groupe, avec SYMBOL et INTERPOL
= JOIN)
PROC SGPLOT (avec SERIES et GROUP)
Matrice de diagrammes de dispersion PROC CORR avec ODS GRAPHICS

Sarah Legendre Bilodeau (2019) Page 61/98


6-613-11 Logiciels statistiques pour l’analyse de données

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.

6.1.1Les énoncés globaux graphiques

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, …).

Tableau 9 : Énoncés globaux graphiques


Énoncé Description de l’énoncé Option Description de l’option
GOPTIONS Valeurs par défaut des RESET = ALL ou GLOBAL ou Réactiver les valeurs par défaut.
paramètres graphiques. certains énoncés spécifiques ALL : Tous les énoncés globaux
GLOBAL : Énoncés globaux graphiques
Pour TITLE : RESET = TITLE
FTEXT = police Déterminer la police de caractères (la police
Arial accepte les accents).
HTEXT = taille Taille du texte dans les graphiques.
CTEXT = couleur Couleur du texte dans les graphiques.
GUNIT = CELLS ou CM ou IN Spécifier l’unité par défaut des nombres
ou PT ou PCT reliés aux valeurs des paramètres.
CELLS : cellules de caractères
CM : centimètres
IN : pouces
PT : points
PCT : pourcentage de l’aire de la zone
graphique
TITLE Ajout d’un titre ou de COLOR = couleur Couleur du texte.
FOOTNOTE notes sous le graphique. FONT = police Police de caractères.
Les options doivent être HEIGHT = nombre Hauteur du texte.
mentionnées avant le JUSTIFY = LEFT ou CENTER Justification.
texte. ou RIGHT
ANGLE = nombre Angle du texte (en degrés).

Sarah Legendre Bilodeau (2019) Page 62/98


6-613-11 Logiciels statistiques pour l’analyse de données

AXIS Éléments reliés à un axe. LABEL = NONE ou argument Nom de l’axe.


ORDER = liste de valeurs Ordre d’apparition des valeurs.
VALUE = NONE ou argument Modifier les valeurs des marques de
graduation principales de l’axe.
MAJOR = NONE ou sous- Caractéristiques des marques de graduation
options (COLOR, HEIGHT, principales.
NUMBER et WIDTH)
MINOR = NONE ou sous- Caractéristiques des marques de graduation
options secondaires.
OFFSET = (numérique1, Première et dernière marque de graduation
numérique2) de l’axe et trait.
STYLE = 0 ou code Trait de l’axe (0 : aucun trait; 1 à 46 : type
de ligne)
LEGEND Aspect d’une légende. POSITION = BOTTOM ou Position
MIDDLE ou TOP, LEFT ou
CENTER ou RIGHT, INSIDE
ou OUTSIDE
MODE = PROTECT ou PROTECT : Réserve un espace autour de la
RESERVE ou SHARE légende; SHARE : Légende et éléments
graphiques superposés.
LABEL = NONE ou texte Nom de la légende
ORDER = liste de valeurs Ordre d’apparition des valeurs de la
variable de groupe.
VALUE = NONE ou texte Modifier les valeurs de la légende.
SHAPE = BAR(largeur, Dimension des éléments non textuels de la
hauteur) ou LINE(longueur) légende.
ou SYMBOL(largeur,
hauteur)
ACROSS = nombre Placer les éléments de la légende sur
plusieurs lignes, en spécifiant le nombre de
colonnes pour répartir les éléments.
SYMBOL Aspect des symboles pour COLOR ou CV et/ou CI = Couleur des symboles. CV : spécifier
la représentation des color séparément la couleur des points. CL :
données Couleur des lignes.
VALUE = NONE ou code Symbole utilisé pour représenter les points
symbole de données
INTERPOL = JOIN ou autre Relier les points.
LINE = code ligne Type de ligne si les points sont reliés.
PATTERN Remplissage d’éléments COLOR = color Couleur de remplissage.
de surface VALUE = motif Motif de remplissage (ex : EMPTY, SOLID)

Sarah Legendre Bilodeau (2019) Page 63/98


6-613-11 Logiciels statistiques pour l’analyse de données

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

6.1.2 PROC GCHART

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 :

PROC GCHART DATA = nom;


PIE variables / options;
VBAR variables / options;
HBAR variables / options;
RUN;

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 :

Sarah Legendre Bilodeau (2019) Page 64/98


6-613-11 Logiciels statistiques pour l’analyse de données

Tableau 10 : Options pour la procédure GCHART


Option Description
Diagrammes en secteurs (PIE)
NOHEADING Omettre le titre généré par défaut.
FREQ À utiliser seulement si une agrégation a été faite sur la table de données en entrée, pour spécifier le nom
de la variable de fréquences.
SUMVAR Spécifie une variable sur laquelle des sommes ou des moyennes doivent être calculées.
DISCRETE Pour traiter une variable numérique discrète comme une variable catégorique.
SLICE INSIDE : Placer les valeurs à l’intérieur des secteurs; OUTSIDE : Placer les valeurs à l’extérieur des
secteurs; ARROW : Lorsqu’elles sont à l’extérieur, permet de relier les valeurs avec un segment; NONE :
Ne pas afficher les valeurs.
TYPE Afficher une statistique dans l’identifiant des secteurs (FREQ : Fréquence; PERCENT : fréquence relative;
SUM : Somme)
VALUE Spécifier la position de la statistique (INSIDE, OUTSIDE, ARROW, NONE : voir SLICE).
OTHER Regrouper les classes dont la fréquence relative est ≤ à une valeur spécifiée (en %) dans une classe
nommée «Other» (par défaut, OTHER = 4).
OTHERLABEL Pour modifier le nom de la classe «Other».
Diagrammes en bâtons (HBAR, VBAR)
FREQ À utiliser seulement si une agrégation a été faite sur la table de données en entrée, pour spécifier le nom
de la variable de fréquences.
DISCRETE Pour traiter une variable numérique discrète comme une variable catégorique.
TYPE Ajuster la hauteur des bâtons (FREQ : Proportionnelle aux fréquences; PERCENT : Proportionnelle aux
fréquences relatives).
NOFRAME Retirer le cadre de la zone graphique.
NOSTAT Retirer le tableau de statistiques ajouté par défaut aux diagrammes en bâtons horizontaux.
WIDTH Largeur des bâtons.
COUTLINE Couleur des contours des bâtons.
SUBGROUP Bâtons empilés selon les modalités d’une variable.
GROUP Bâtons groupés (GROUP : Grands groupes).
RAXIS Spécifier l’axe des fréquences par un énoncé AXIS.
MAXIS Spécifier l’axe des modalités par un énoncé AXIS.
GAXIS Spécifier l’axe des groupes par un énoncé AXIS.
LEGEND Spécifier la légende par un énoncé LEGEND.
PATTERNID Spécifier pour quelle variable les motifs de remplissage sont attribués (MIDPOINT, GORUP, SUBGROUP
ou BY).
SPACE Espaces entre les bâtons.
GSPACE Espaces entre les bâtons de groupes différents.

Sarah Legendre Bilodeau (2019) Page 65/98


6-613-11 Logiciels statistiques pour l’analyse de données

goptions ftext="Arial" htext=12pt;


axis1 minor = NONE label = (angle=90);

title "Nombre de téléchargements par année";


proc gchart data = logistat.utilisation_datesas;
pie annee / sumvar = nb_telechargements
discrete
NOHEADING
slice = arrow
value = inside;

vbar annee / sumvar = nb_telechargements


discrete
width = 8
raxis = axis1;

format annee 8. nb_telechargements nlnum8.;


label nb_telechargements = "Nombre de téléchargements"
annee = "Année";
run; quit;
title;

SAS permet également de créer des diagrammes en secteurs et en bâtons trois dimensions, avec les énoncés
PIE3D, VBAR3D et HBAR3D.

6.1.3 PROC BOXPLOT

La procédure BOXPLOT permet de produire des diagrammes en boîte groupés. Cette procédure prend la forme
suivante :

PROC BOXPLOT DATA = table_en_entree;


PLOT (variable_analyse)*variable_groupe / options;
RUN;

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 :

Sarah Legendre Bilodeau (2019) Page 66/98


6-613-11 Logiciels statistiques pour l’analyse de données

Tableau 11 : Options pour la procédure BOXPLOT


Option Description
BOXSTYLE Type de diagramme en boîte (SCHEMATIC).
CBOXES Couleur du contour des diagrammes.
CBOXFILL Couleur de remplissage des diagrammes.
BOXWIDTH Largeur des diagrammes.
IDSYMBOL Symbol pour l’affichage des valeurs extrêmes.
HAXIS Spécifier l’axe horizontal par un énoncé AXIS.
VAXIS Spécifier l’axe vertical par un énoncé AXIS.

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.

proc sort data = logistat.arbres_remarquables; by type_arbre; run;

PROC BOXPLOT DATA = logistat.arbres_remarquables;


PLOT diametre*type_arbre / boxstyle = schematic;
label diametre = "Diamètre" type_arbre = "Type d'arbre";
RUN;

6.1.4 PROC GPLOT

La procédure GPLOT permet de mettre en relation le lien entre deux variables numériques. Cette procédure prend
la forme suivante :

PROC GPLOT DATA = table_en_entree;


PLOT y*x / options;
RUN;

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;

Sarah Legendre Bilodeau (2019) Page 67/98


6-613-11 Logiciels statistiques pour l’analyse de données

Avec l’option OVERLAY, deux diagrammes ayant la même abscisse peuvent être superposés :

PLOT var2*var1 var3*var1 / overlay;

Le tableau suivant présente les principales options reliées à la procédure GPLOT :

Tableau 12 : Options pour la procédure GPLOT


Option Description
OVERLAY Superposer des graphiques.
HAXIS Spécifier l’axe horizontal par un énoncé AXIS.
VAXIS Spécifier l’axe vertical par un énoncé AXIS.
LEGEND Spécifier une légende par un énoncé LEGEND.

proc summary data = logistat.utilisation_datesas nway missing;


class annee format;
var nb_telechargements;
output out = util_sum (drop = _:) sum=;
run;

symbol1 I=join;
axis1 minor = NONE label = (angle=90);
axis2 minor = NONE;

proc gplot data = util_sum (where = (format in (".CSV", ".XLS", ".XML")));


plot nb_telechargements * annee = format / haxis = axis2
vaxis = axis1;
label nb_telechargements = "Nombre de téléchargements"
annee = "Année"
format = "Format";
run;

Sarah Legendre Bilodeau (2019) Page 68/98


6-613-11 Logiciels statistiques pour l’analyse de données

6.1.5 PROC SGPLOT

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
- …

La syntaxe générale de la procédure SGPLOT est la suivante :

PROC SGPLOT DATA = table_en_entree;


SCATTER Y = var1 X = var2 / GROUP = variable_de_groupe;
SERIES Y = var1 X = var2 / GROUP = variable_de_groupe;
HISTOGRAM var;
VBAR var / GROUP = variable_de_groupe;
HBAR var / GROUP = variable_de_groupe;
VBOX var / CATEGORY = variable_de_groupe;
HBOX var / CATEGORY = variable_de_groupe;
DENSITY var / TYPE = KERNEL;
RUN;

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 :

PROC SGPLOT DATA = logistat.arbres_remarquables;


histogram diametre;
density diametre;
RUN;

Sarah Legendre Bilodeau (2019) Page 69/98


6-613-11 Logiciels statistiques pour l’analyse de données

6.1.6 PROC GBARLINE

La procédure GBARLINE permet de superposer un diagramme en barres verticales avec un ou plusieurs


diagrammes permettant de mettre en relation deux variables. La syntaxe de base de cette procédure se présente
de la façon suivante :

proc gbarline data=table_en_entree;


bar var / sumvar=var_sum;
plot / sumvar=var_sum;
run;
quit;

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.

proc summary data = logistat.utilisation_datesas nway missing;


class annee mois;
var nb_telechargements;
output out = tele_graph (drop = _:) sum=;
run;

proc sort data = tele_graph; by mois; run;

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;

axis1 label = (angle=90);


axis2 minor = NONE label = (angle=90);
axis3 minor = NONE;

Sarah Legendre Bilodeau (2019) Page 70/98


6-613-11 Logiciels statistiques pour l’analyse de données

proc gbarline data=tele_graph1;


bar mois / discrete
sumvar = nb_telechargements
raxis = axis1;
plot / sumvar = telecum
axis = axis2;
label nb_telechargements = "Nombre de téléchargements"
telecum = "Croissance annuelle cumulative"
mois = "Mois";
run;
quit;

6.2 Mise en page dans SAS

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.

6.2.1ODS LAYOUT / ODS REGION

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 :

Sarah Legendre Bilodeau (2019) Page 71/98


6-613-11 Logiciels statistiques pour l’analyse de données

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.

options papersize = letter orientation = landscape nodate;


ods escapechar = '^';

ods pdf file = "&path.\Exemple_ODSLAYOUT..pdf"


style = sasweb
startpage = now
bookmarklist = hide;
ods listing close;

* Début de la zone d'utilisation de l'ods region;


ods layout start;

* Titre;
ods region width=10.5in height=.75in x=0in y=0in;

ods pdf text="(*ESC*)S={PREIMAGE = '&path.\logo_hec.jpg'}" ;

* région 1 (en haut à gauche);


ods region width=4.5in height=3in x=.5in y=1in;

goptions ftext="Arial" htext=12pt;

title "Nombre de téléchargements par année";


proc gchart data = logistat.utilisation_datesas;
pie annee / sumvar = nb_telechargements
discrete
NOHEADING
slice = arrow
value = inside;

format annee 8. nb_telechargements nlnum8.;


label nb_telechargements = "Nombre de téléchargements"
annee = "Année";
run; quit;
title;

Sarah Legendre Bilodeau (2019) Page 72/98


6-613-11 Logiciels statistiques pour l’analyse de données

* région 2 (en haut à droite);


ods region width=4.5in height=3in x=5.25in y=1in;

PROC BOXPLOT DATA = logistat.arbres_remarquables;


PLOT diametre*type_arbre / boxstyle = schematic;
label diametre = "Diamètre" type_arbre = "Type d'arbre";
RUN; quit;

* région 3 (en bas à gauche);


ods region width=4.5in height=3in x=.5in y=4.706667in;

PROC SGPLOT DATA = logistat.arbres_remarquables;


histogram diametre;
density diametre;
RUN;

* région 4 (en bas à droite);


ods region width=4.5in height=3in x=5.25in y=4.706667in;

axis1 label = (angle=90);


axis2 minor = NONE label = (angle=90);
axis3 minor = NONE;

proc gbarline data=tele_graph1;


bar mois / discrete
sumvar = nb_telechargements
raxis = axis1;
plot / sumvar = telecum
axis = axis2;
label nb_telechargements = "Nombre de téléchargements"
telecum = "Croissance annuelle cumulative"
mois = "Mois";
run;
quit;

ods layout end;

ods listing;
ods pdf close;

Sarah Legendre Bilodeau (2019) Page 73/98


6-613-11 Logiciels statistiques pour l’analyse de données

7. SAS : Boucles et Arrays

7.1 Les boucles DO

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 :

do mois = "janvier", "fevrier", "mars";



end;

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 :

- RANBIN(germe, n, p) : Binomiale de paramètres n et p


- RANEXP(germe) : Exponentielle standard
- RANNOR(germe) : Normale standard
- RANPOI(germe, m) : Poisson de paramètre m>0
- RANUNI(germe) : uniforme sur [0,1]

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 à

Sarah Legendre Bilodeau (2019) Page 74/98


6-613-11 Logiciels statistiques pour l’analyse de données

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)

La mention du nombre d’éléments peut se faire de plusieurs façons. Par exemple :

array an(4) annee2012 - annee2015;


array an(1:4) annee2012 - annee2015;
array an(2012:2015) annee2012 - annee2015;
array an(*) annee2012 - annee2015 (0 0 0 0);

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.

Sarah Legendre Bilodeau (2019) Page 75/98


6-613-11 Logiciels statistiques pour l’analyse de données

*** Créer une variable indicatrice;


data arbres_a;
set logistat.utilisation_datesas;
array moi(12) mois1 - mois12 (0 0 0 0 0 0 0 0 0 0 0 0);
do i = 1 to 12;
if mois = i then moi(i) = 1;
else moi(i) = 0;
end;
drop i;
run;

*** Alimenter une nouvelle variable à partir d'une autre;


data arbres_b;
set logistat.utilisation_datesas;
array moi(12) mois1 - mois12 (0 0 0 0 0 0 0 0 0 0 0 0);
do i = 1 to 12;
if mois = i then moi(i) = NB_TELECHARGEMENTS;
else moi(i) = 0;
end;
drop i;
run;

Plusieurs ARRAY peuvent être utilisés dans une même étape DATA, pour référence à l’intérieur d’une même
boucle.

*** Créer une nouvelle variable à partir d'une autre, 2 array;


data arbres_c;
set arbres_b;
array moi(12) mois1 - mois12;
array cout_mois(12) cout_mois1 - cout_mois12;
do i = 1 to 12;
cout_mois(i) = 3.2 * moi(i);
end;
drop i;
run;

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;

Sarah Legendre Bilodeau (2019) Page 76/98


6-613-11 Logiciels statistiques pour l’analyse de données

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.

*** Étape préparatoire;


proc summary data = logistat.utilisation_datesas nway missing;
class titre annee;
var nb_telechargements;
output out = tele_annee (drop = _:) sum=;
run;

proc transpose data = tele_annee out = tele_annee_transp (drop = _name_);


by titre;
id annee;
var nb_telechargements;
run;

* Calcul des différences pour chaque colonne;


data tele_anne_aug;
set tele_annee_transp;
array ann(4) _2012 - _2015;
array aug(4) aug_2012 - aug_2015;
do i = 1 to 4;
if i=1 then aug(i) = .;
else aug(i) = ann(i) - ann(i-1);
end;
drop i;
run;

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.

Sarah Legendre Bilodeau (2019) Page 77/98


6-613-11 Logiciels statistiques pour l’analyse de données

7.4 DO UNTIL et DO WHILE

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 :

Do i = 1 to 500 while (total < 100);

7.5 Autres éléments utiles pour les boucles

LEAVE : Arrêt de l’exécution de la boucle.

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;

Sarah Legendre Bilodeau (2019) Page 78/98


6-613-11 Logiciels statistiques pour l’analyse de données

7.6 Transposer une table de données

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.

*** Transposer des données;


* Étape de préparation;
proc summary data = logistat.utilisation_datesas nway missing;
class titre annee;
var nb_telechargements;
output out = tele_annee (drop = _:) sum=;
run;

*** Solution avec PROC TRANSPOSE;


proc transpose data = tele_annee out = tele_annee_transp (drop = _name_);
by titre;
id annee;
var nb_telechargements;
run;

*** Solution alternative à PROC TRANSPOSE;


* Les prochaines étapes sont nécessaires pour s'assurer que pour chaque titre, il y
ait une observation par
année, même s'il n'y a pas de valeur pour cette année.;
proc sort data = tele_annee (keep = titre) out = liste_titre nodupkey; by titre;
run;

data liste_titre1;
set liste_titre;
annee = 2012; output;
annee = 2013; output;
annee = 2014; output;
annee = 2015; output;
run;

proc sort data = liste_titre1; by titre annee; run;


proc sort data = tele_annee; by titre annee; run;

data tele_annee1;
merge tele_annee liste_titre1;
by titre annee;
run;

Sarah Legendre Bilodeau (2019) Page 79/98


6-613-11 Logiciels statistiques pour l’analyse de données

* Transposer la table de données;


data tele_annee_transp1 (drop = i nb_telechargements annee);
array an(2012:2015) annee2012 - annee2015;
do i = 2012 to 2015 until (last.titre);
set tele_annee1;
by titre;
an(i) = nb_telechargements;
end;
run;

*** Transposition inverse;


data retour;
set tele_annee_transp1;
ARRAY an(2012:2015) annee2012 - annee2015;
DO I=2012 TO 2015;
IF an(i) > . THEN DO;
annee = i;
nb_telechargements = an(i);
OUTPUT;
END;
end;
run;

Sarah Legendre Bilodeau (2019) Page 80/98


6-613-11 Logiciels statistiques pour l’analyse de données

7.7 Transformer toutes les valeurs manquantes en 0

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;

array A_VarNum[*] _NUMERIC_ ;


do _i=1 to dim( A_VarNum ) ;
If A_VarNum (_i)=. then A_VarNum (_i)=0 ;
end;
drop _i;
run;

Il est à noter que l’étape suivante donne des résultats équivalents :

data non_manquant;
set tele_annee_transp;
array change _numeric_;
do over change;
if change=. then change=0;
end;
run ;

Sarah Legendre Bilodeau (2019) Page 81/98


6-613-11 Logiciels statistiques pour l’analyse de données

8. SAS : Le langage macro

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.

8.1 Les bases du langage macro

% : 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 «.».

8.2 Les variables macro

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.

Sarah Legendre Bilodeau (2019) Page 82/98


6-613-11 Logiciels statistiques pour l’analyse de données

8.2.1Créer une variable macro avec %let

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.

%let annee = 2014;

%let annee_suiv = &annee. + 1;


%put annee_suiv = &annee_suiv.;

%let annee_suiv = %eval(&annee. + 1);


%put annee_suiv = &annee_suiv.;

8.2.2Créer une variable macro avec CALL SYMPUT

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.

La syntaxe de base est la suivante :

CALL SYMPUT (nom_variable_macro, valeur_variable_macro);

* Trier les données par date;


proc sort data = logistat.utilisation_datesas; by descending date_sas; run;

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;

%put deb_annee = &deb_annee.;


%put note = &note.;

Sarah Legendre Bilodeau (2019) Page 83/98


6-613-11 Logiciels statistiques pour l’analyse de données

8.2.3Variables macro globales et locales

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.

8.2.4Variables macro système

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;

%put descrip= &descrip.;

Sarah Legendre Bilodeau (2019) Page 84/98


6-613-11 Logiciels statistiques pour l’analyse de données

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 :

0 : Exécution bien effectuée, sans avertissement


1 : Exécution interrompue par l’utilisation (CANCEL)
2 : Exécution interrompue par l’utilisation (ATTN ou BREAK)
4 : Exécution complète, mais avec des messages d’avertissement
> 4 : Erreur produite

8.2.5Autres éléments sur les variables macro

Les variables MACRO peuvent être supprimées à l’aide de l’énoncé macro %SYMDEL.

%SYMDEL var1 var2 var3;

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.

8.3 Les fonctions macro

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.

Sarah Legendre Bilodeau (2019) Page 85/98


6-613-11 Logiciels statistiques pour l’analyse de données

%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.

%let annee_suiv1 = %SYSFUNC(sum(&annee., 1));


%put annee_suiv1 = &annee_suiv1.;

8.4 Les macros SAS

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 %.

La syntaxe de base pour la définition d’une macro est la suivante :

%macro nom_macro (parametre1 = , parametre2 = , ...);


...
%mend nom_macro;

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 :

%nom_macro (parametre1 = valeur1, parametre2 = valeur2, ...);

Sarah Legendre Bilodeau (2019) Page 86/98


6-613-11 Logiciels statistiques pour l’analyse de données

Voici un exemple simple :

%macro select_formats (choix_format=, nom_fich=);

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);

8.5 Les énoncés conditionnels macro

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é.

Des éléments de syntaxe comme ceux-ci sont possibles :

%if ... %then %do;


...
%end;
%else %if ... %then %do;
...
%end;

%macro agg (choix_format=, nom_fich=, type_agg=/* 1 si agrégation en fonction de


annee, 0 sinon */);

proc summary data = logistat.utilisation_datesas nway missing;


%if &type_agg. = 1 %then %do;
class annee;
%end;
var nb_telechargements;
where format = &choix_format.;
output out = &nom_fich. (drop = _:) sum=;
run;

%mend agg;
%agg(choix_format=".CSV", nom_fich=agg_csv, type_agg=0);

Sarah Legendre Bilodeau (2019) Page 87/98


6-613-11 Logiciels statistiques pour l’analyse de données

8.6 Les boucles macro

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.

%do i = 1 %to 10;



%end;

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;

%do i = 2012 %to 2015;

%* Agrégation complète pour l année i;


proc summary data = logistat.utilisation_datesas nway missing;
var nb_telechargements;
where annee = &i.;
output out = agg_&i. (drop = _:) sum=;
run;

%* On nomme la table de données avec l indice i et on crée une variable pour l


année;
data agg_&i.;
set agg_&i.;
annee = &i.;
run;
%end;

%mend agg1;

%agg1;

Sarah Legendre Bilodeau (2019) Page 88/98


6-613-11 Logiciels statistiques pour l’analyse de données

8.7 Les commentaires dans les macros

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.

Sarah Legendre Bilodeau (2019) Page 89/98


6-613-11 Logiciels statistiques pour l’analyse de données

9. SAS : Introduction à la procédure SQL

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.

9.1 Syntaxe de base

La syntaxe de base de la procédure SQL est la suivante :

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.

Sarah Legendre Bilodeau (2019) Page 90/98


6-613-11 Logiciels statistiques pour l’analyse de données

9.2 L’énoncé GROUP BY

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()
- …

9.3 Sélectionner des observations sur des données agrégées

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.

Sarah Legendre Bilodeau (2019) Page 91/98


6-613-11 Logiciels statistiques pour l’analyse de données

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;

9.4 Trier des données

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;

9.5 Alimenter une variable macro

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 :

PROC SQL noprint;


SELECT count(*) INTO: NB_OBS
FROM logistat.utilisation_datesas
;
quit;

%PUT nombre observations = &NB_OBS. ;

Sarah Legendre Bilodeau (2019) Page 92/98


6-613-11 Logiciels statistiques pour l’analyse 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 :

proc sql noprint;


select distinct format into: liste_fmt separated by ','
from logistat.utilisation_datesas
;
quit;

%put liste : &liste_fmt.;

9.6 Ajouter les observations dans une table de données

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 :

- VALUE : indiquer les valeurs pour toutes les variables


- SET : ajouter des valeurs pour certaines variables seulement

* Ajout d'observations dans une table de données;


data copie;
set logistat.utilisation_datesas;
run;

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;

Sarah Legendre Bilodeau (2019) Page 93/98


6-613-11 Logiciels statistiques pour l’analyse de données

9.7 Jointures horizontales de tables

L’utilisation de la procédure SQL pour réaliser des jointures de tables de données est associée à certains
avantages :

- Les données n’ont pas à être triées à l’avance


- La correspondance des noms de variables selon lesquelles la jointure est réalisée n’est pas requise
(variables du BY dans l’étape DATA; variables du ON dans la procédure SQL)
- Possibilité de jointures en produit cartésien (toutes les combinaisons possibles)

9.7.1 Jointure interne

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.

* Exemple d'une semaine précédente;


data feuil_conif;
set logistat.feuillus (in=a)
logistat.coniferes (in=b);
if a then type_arbre = "F";
if b then type_arbre = "C";
run;

* Nouvelle table présentant les types d'arbres;


data groupe_diam;
input type $ nom $;
datalines;
F Feuillu
C Conifère
A Autre
;
run;

proc sql;
create table sql_inner as
select *
from feuil_conif a
inner join
groupe_diam b
on a.type_arbre = b.type
;
quit;

Sarah Legendre Bilodeau (2019) Page 94/98


6-613-11 Logiciels statistiques pour l’analyse de données

* Équivalent étape DATA;


proc sort data = feuil_conif; by type_arbre; run;
proc sort data = groupe_diam; by type; run;

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;

9.7.2 Jointure à gauche

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;

*Équivalent étape DATA;


data equiv_left;
merge feuil_conif (in=a)
groupe_diam (in=b rename = (type = type_arbre));
by type_arbre;
if a then output equiv_left;
run;

Sarah Legendre Bilodeau (2019) Page 95/98


6-613-11 Logiciels statistiques pour l’analyse de données

9.7.3 Jointure à droite

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;

*Équivalent étape DATA;


data equiv_right;
merge feuil_conif (in=a)
groupe_diam (in=b rename = (type = type_arbre));
by type_arbre;
if b then output equiv_right;
run;

9.7.4 Jointure produit cartésien

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;

input no_lecture produit $;


datalines;
1 prod1
2 prod1
1 prod2
2 prod2
1 prod3
2 prod3
1 prod4
2 prod4
;
run;

Sarah Legendre Bilodeau (2019) Page 96/98


6-613-11 Logiciels statistiques pour l’analyse de données

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;

Sarah Legendre Bilodeau (2019) Page 97/98


6-613-11 Logiciels statistiques pour l’analyse de données

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

Sarah Legendre Bilodeau (2019) Page 98/98

Vous aimerez peut-être aussi