Quelques éléments sur le logiciel SAS Introduction 1 Description

Transcription

Quelques éléments sur le logiciel SAS Introduction 1 Description
Master Ingénierie Mathématique M1
Université Paris-Sud 11
2008-2009
Calcul de risques et prédictions
Quelques éléments sur le logiciel SAS
Introduction
SAS - Statistical Analysis System - est un logiciel polyvalent qui traite de nombreux
domaines de la Statistique. De conception américaine, il est développé par la société SASInstitute basée à Cary, en Caroline du Nord. Il a acquis depuis la mise en route du projet
au début des années 60 une situation dominante dans de nombreuses branches d’activités
économiques. SAS est un logiciel multi-facettes capable de gérer de gros volumes de données
(tableaux de plusieurs gigaoctets) à des fins d’analyse ou de reporting automatisé. Un avantage
important sur d’autres logiciels de Statistique présents dans l’industrie est la possibilité de
programmer sous SAS ses propres procédures. Il s’attache à suivre le grand principe de la
compatibilité verticale, toute nouvelle version du logiciel doit accepter les applicatifs conçus
avec les versions antérieures. Malheureusement, SAS compte aussi certaines faiblesses : coût
élevé, langage de programmation peu avancé, graphiques moyens, ...
1
Description générale du logiciel SAS
1.1
Les fenêtres de SAS
A l’ouverture de SAS, 5 fenêtres apparaissent simultanément :
• Program editor : fenêtre servant à la rédaction du code qui sera exécuté. Cet éditeur
ne constitue pas le point fort de SAS ! On peut aussi utiliser un autre éditeur plus
pratique depuis lequel on copiera les programmes vers le Program editor.
• Log : fenêtre de contrôle qui permet de s’assurer du bon fonctionnement du programme.
Le programme y est écrit en noir avec ses commentaires en vert. On peut y lire les
messages d’avertissement de SAS en vert pour un problème non fatal, et en rouge,
précédé de «warning» lorsqu’une erreur fatale est détectée.
• Output : fenêtre affichant les sorties du programme SAS sous forme de listing.
• Results : fenêtre dressant l’historique des programmes successifs exécutés par SAS
depuis le début de la session en cours. Cette fenêtre permet d’accéder directement aux
résultats de la fenêtre Output.
• Explorer : fenêtre permettant de naviguer parmi les données SAS. Cet explorateur de
SAS permet d’accéder aux librairies SAS dont notamment la librairie «Work» associée
à la session courante .
Remarques :
• Pensez à organiser à l’écran les cinq fenêtres à l’ouverture de SAS.
• Les trois premières fenêtres sont les plus importantes. En particulier, prenez l’habitude
de contrôler le bon déroulement du programme dans la fenêtre Log.
1
• Pensez à purger les fenêtres Output et Log car elles ne se vident pas automatiquement
à l’execution d’un nouveau programme.
1.2
Articulation d’un programme SAS
Un programme SAS est un enchaı̂nement d’instructions de deux types :
• DATA : création, lecture et manipulation de tables SAS
• PROC : traitement, analyse, édition des résultats
Gestion des données
Pour pouvoir appliquer des procédures à un ensemble de données, celles-ci doivent être
préalablement enregistrées sous la forme d’un objet SAS, c’est à dire sous la forme d’une
table. Nous reviendrons plus longuement dans la section suivante sur la gestion des données.
Notons pour le moment qu’il existe trois principales façons de lire un fichier de données sous
SAS :
• Lecture directe des données, en les incluant dans le programme, au moyen de la commande DATALINES (ou CARDS).
• Lecture des données préalablement enregistrées dans un fichier .txt (ou .dbf) au moyen
de la commande INFILE.
• Utilisation du gestionnaire d’importation.
Dans tous les cas, n’oubliez pas de commencer par visionner les données avant de débuter
une étape DATA en SAS.
Les procédures SAS
Un programme SAS est un enchaı̂nement de procédures, chacune réalisant un traitement
sur les tables disponibles. Voici quelques exemples de procédures usuelles :
– PRINT : pour afficher le contenu d’une table dans la fenêtre Output,
– SORT : permet d’ordonner la table SAS selon les valeurs d’une variable quantitative,
– MEANS, UNIVARIATE : descriptions de variables quantitatives (nombre d’observations,
minimum, maximum, moyenne, écart-type...),
– FREQ : description de variables qualitatives (effectifs, fréquences...),
– CORR : étude des corrélations entre des variables quantitatives,
– PLOT et GPLOT : graphiques pour des variables quantitatives,
– CHART et GCHART : graphiques pour des variables qualitatives,
– BOXPLOT : création de boı̂tes à moustaches.
1.3
Remarques générales
• Toute instruction en SAS se termine par « ;»
• Chaque instruction DATA ou PROC se termine par RUN
PROC nomProcédure <option(s)>;
instructions diverses;
RUN;
DATA tableSortie;
instructions diverses;
RUN;
2
• Options générales : Des commandes peuvent être rajoutées au début d’un programme SAS
pour régler les options générales (elles continueront à s’appliquer jusqu’à la fin de la session
SAS, ou jusqu’à ce qu’elles soient modifiées). On les indique avec la commande OPTIONS (le s
est facultatif) :
? pagesize = nombre : impose le nombre de lignes dans une page de sortie output,
? linesize = nombre : impose le nombre de caractères par ligne,
? nodate : supprime l’impression de la date dans les sorties,
? nonumber : élimine la numérotation du listing,
? nocenter : aligne le texte à gauche.
Exemple d’instruction :
OPTIONS pagesize=40 linesize=64 nodate;
•Titre : la commande TITLE permet de placer un titre en haut de chaque page des sor ties.
TITLE ’ceci est un titre’;
•Pied-de-page : la commande FOOTNOTE permet de placer un titre en bas de chaque page
des sorties.
FOOTNOTE ’ceci appara^
ıtra en bas de page’;
• Commentaires : des commentaires peuvent être insérés n’importe où dans un programme
SAS de la façon suivante :
/* ceci est un commentaire */
Il est recommandé de ponctuer son programme de commentaires pour une meilleure lisibilité.
• Édition de rapport : il est possible de récupérer les sorties SAS en éditant un rapport à l’aide de ODS. Il suffit d’entourer la suite des procédures SAS d’un programme de la
façon suivante :
ODS RTF FILE= "NomFicher.doc"
encha^
ınement de phases DATA et de phases PROC générant des sorties
(listing ou graphiques)...
ODS RTF CLOSE;
Toutes les sorties des différentes procédures insérées entre les deux lignes ODS seront alors
copiées dans le fichier NomFichier.doc. Il est aussi possible d’éditer les sorties dans une page
html en remplaçant RTF par HTML dans l’instruction ODS.
Selon le format d’édition choisi, il peut être nécessaire de changer le format de sortie des
graphiques. Le nouveau format est signalé comme une option générale à l’aide de l’instruction
GOPTIONS DEVICE = JPEG ; ou tout autre format adapté (PS,GIF,...). Noter que le format
JPEG est préférable pour des sorties RTF et HTML.
Pensez à sauvegarder les programmes et les sorties (en .htlm ou en .doc) régulièrement pour
3
éviter de perdre le travail en cours en cas de bug !
• Impression (SAS sous Linux) :
Pour imprimer vos sorties ou vos codes SAS, choisissez dans le menu déroulant Files, Print
SetUp, Proprieties, et dans l’onglet «Destination», remplacez «Disk» par «Printer». Utilisez
l’option LINESIZE dans OPTIONS pour limiter la longueur des lignes de sorties et éviter ainsi
des problèmes à l’impression.
• Accès à l’aide (SAS sous Linux à Orsay)
L’utilisation des fichiers d’aide de SAS nécessite un paramétrage correct des proxies du
navigateur par défaut. Lancer le navigateur (Mozilla ou Firefox), et accéder au réglage des
proxies : Edit, Parameters, Advanced, Proxies. Dans la ligne de commande pas de proxies
pour, rajouter l’instruction suivante ,@pa14 si pa14 est la machine utilisée, puis confirmer sur
la case Ok.
2
Lecture de données
L’étape DATA permet de créer des tables SAS, qui est le seul format de données avec lequel
SAS peut travailler. Les tables sont créées dans la bibliothèque de travail WORK, à laquelle
on accède en naviguant depuis l’explorateur. Il existe trois façons majeures de créer une table
SAS à partir de données :
• Écriture à l’intérieur du fichier avec des données délimitées
• Importation de données depuis un fichier externe, à l’aide de l’instruction INFILE
• Utilisation du gestionnaire d’importation
La dernière méthode est la plus simple car automatisée mais elle nécessite que les données
soient enregistrées dans un fichier lisible par le gestionnaire de SAS. Il est donc indispensable
de bien maı̂triser les deux autres méthodes.
Dans les deux premiers cas, une déclaration des variables est obligatoire au moyen de la
commande INPUT. Une séquence DATA des données se présente en général de la façon suivante :
DATA <nom de la table SAS>;
....
INPUT Var1 Var2 Var3 ...;
....
RUN;
Le nom de la table est donné juste après l’instruction DATA. Les variables sont énumérées
après l’instruction INPUT, il faut évidemment les déclarer dans le bon ordre.
2.1
Le vecteur de travail
Le logiciel SAS est conçu pour travailler ligne par ligne, chaque ligne de la table correspondant à un individu dont nous avons une description à travers les différentes variables.
Au cours d’une étape DATA, SAS lit, crée ou modifie les données en extrayant l’une après
l’autre les lignes de la table (ou du fichier de données) pour les «placer» dans le vecteur de
travail où sont effectuées les opérations sur les variables. On appelle ce principe la «boucle
implicite». Ce type de fonctionnement permet une programmation très sobre, par exemple :
4
Var3 = Var2-Var1 pour créer une variable en fonction de variables existantes. En revanche,
il est compliqué (voir impossible dans certains cas) de faire des opérations entre des données
positionnées sur des lignes différentes.
L’extraction d’une ligne correspond à une phase de lecture. En sortie du vecteur de
travail, il s’agit cette fois d’une phase d’écriture des informations (i.e. des variables), dans
la table créée. Avoir à l’esprit cette représentation schématique éclaire de nombreux aspects
à première vue obscures de l’étape DATA de SAS. Par exemple, nous verrons que les formats
de données interviennent pendant les deux phases de lecture et d’écriture.
2.2
2.2.1
Lectures de données par programmation SAS
Données délimitées
Dans ce premier exemple, les données sont écrites dans le programme après l’instruction
DATALINES (ou CARDS).
Program editor
DATA table1;
INPUT nom$ age sexe$;
DATALINES;
Chris 36 M
Jane 21 F
Tom 30 M
Joe 49 M
Jerry 28 M
;
RUN;
Dans l’instruction INPUT, les variables alphanumérique (textuelles) doivent être suivies de
«$», c’est le cas ici des variables nom ou sexe.
Les données sont, dans cet exemple, séparées par un blanc et ne sont pas alignées (21 est en
position 6 sur la seconde ligne et 36 en position 7 sur la première ligne). Ce sont des données
de type délimitées (délimitées ici par un blanc). La table table1 sera créée dans la librairie par
défaut «WORK». Cette librairie temporaire n’existe que le temps de votre session SAS.
Pour exécuter ces commandes (ou étape DATA) depuis la fenêtre du Program editor, on
peut au choix :
– taper dans la command line «submit» puis enter ;
– ou à l’aide du menu déroulant dans «Run» cliquer sur «Submit» ;
– ou cliquer directement dans la barre tools sur l’icône représentant le personnage en train
de courir.
Cette étape ne produit pas de résultat dans la fenêtre «Output». Par contre, la fenêtre
«Log» peut être consultée car s’y inscrivent les messages du système indiquant le bon ou le
mauvais déroulement du programme. A ce stade, la table table1 est créée dans la librairie
«Work». On peut la visualiser à partir de la fenêtre de navigation SAS «Explorer SAS».
Pour visualiser dans la fenêtre «Output» les résultats de l’étape DATA, on utilise la procédure
PRINT :
5
Program editor
PROC PRINT DATA = table1;
RUN;
Obs
nom
1
2
3
4
5
Chris
Jane
Tom
Joe
Jerry
Output
age
36
21
30
49
28
sexe
M
F
M
M
M
On peut aussi utiliser d’autres séparateurs que le séparateur blanc pour agencer les données, il faut alors utiliser l’instruction INFILE. L’instruction INFILE sert généralement à importer des données depuis un fichier existant (voir plus loin). Combinée avec l’argument
DATALINES, elle peut être utilisée pour traiter des données définies dans le corps du programme. On peut alors utiliser les différentes options proposées par INFILE :
? FIRSTOBS=num : indique le numéro num de la première ligne lue.
? OBS=num : indique le numéro num de la dernière ligne lue.
? DLM="." : indique le caractère séparateur, la tabulation est notée ’09’x.
? DSD : indique que la succession de deux séparateurs sera interprétée comme une donnée
manquante.
? MISSOVER : permet de lire des enregistrements avec des données manquantes en fin
d’enregistrement, sans devoir compléter par des caractères indiquant les données manquantes et sans que SAS prenne l’enregistrement suivant pour compléter les données.
? TRUNCOVER : indique à SAS de lire les données jusqu’à la fin de l’enregistrement ou
jusqu’à la dernière colonne spécifiée par l’entrée colonne ou l’entrée formattée, lorsque
certains enregistrements sont plus courts que d’autres.
? LRECL=nb : indique le nombre maximum nb de caractères par ligne de données (par
défaut 256).
Par défaut, le délimiteur utilisé avec INFILE est la «,» mais il est possible d’en changer. Par
exemple, on peut utiliser le symbole «&» comme délimiteur :
Program editor
DATA table1;
INFILE datalines DLM="&";
INPUT nom$ age sexe$;
DATALINES;
Chris&36&M
Jane&21&F
Tom&30&M
Joe&49&M
Jerry&28&M
;
RUN;
PROC PRINT DATA =table1;
RUN;
6
Données manquantes : Il est important de pouvoir signaler à SAS l’existence de données
manquantes. Dans le programme suivant, la donnée manquante a perturbé l’agencement des
données dans la table :
Program editor
DATA table2;
INFILE datalines DLM="&";
INPUT nom$ age sexe$;
DATALINES;
Bob&m
Marie&25&f
Yves&45&m
;
RUN;
Obs
nom
1
2
Bob
Yves
Output
age
sexe
.
45
Marie
m
PROC PRINT DATA=table2;
RUN;
L’option DSD de l’instruction INFILE permet de donner la priorité au séparateur : SAS
interprète alors deux séparateurs successifs comme une donnée manquante, qu’il notera dans
la table par un point «.».
Program editor
DATA table2;
INFILE datalines DLM="&" DSD;
INPUT nom$ age sexe$;
DATALINES;
Bob&&m
Marie&25&f
Yves&45&m
;
RUN;
Obs
nom
1
2
3
Bob
Marie
Yves
Output
age
.
25
45
sexe
m
f
m
PROC PRINT DATA=table2;
RUN;
Utilisation des informats : Les informats sont des formats de lecture (nous verrons
plus loin les formats d’écriture). Bien qu’ils ne soient pas toujours obligatoires, les informats
permettent de préciser à SAS sous quels formats les données doivent être lues dans l’éditeur
ou dans le fichier externe. Les syntaxes principales sont :
? pour une variable numérique : Var :X. pour des variables entières et Var :X.Q pour
des variables décimales. Dans ce dernier cas, X indique le nombre total de caractères à
lire (point compris) et Q est le nombre total de décimales.
? pour une variable alphanumérique :Var :$X. où X indique le nombre de caractères (8
par défaut et donc au delà il faut le préciser).
? pour une date : Var :YYMMDD. ou Var :YYMMDD8. et d’autres formats sont encore possibles.
7
Les «:» sont là pour donner la priorité au délimiteur sur le format, ce qui signifie que le long
d’une ligne, SAS passera d’une variable à la suivante sans nécessairement atteindre le nombre
total de caractères déclarés.
Par exemple, SAS ne lit par défaut que les 8 premiers caractères des données de type
alpha-numérique.
Output
Program editor
DATA table3;
INPUT nom $ age sexe$;
DATALINES;
ChrisEvans 25 M
JaneTrulli 21 F
JoeStar 49 M
;
RUN;
PROC PRINT DATA=table3;
RUN;
Obs
nom
age
sexe
1
2
3
ChrisEva
JaneTrul
JoeStar
25
21
49
M
F
M
Obs
nom
age
sexe
1
2
3
ChrisEvans
JaneTrulli
JoeStar
25
21
49
M
F
M
La solution consiste à utiliser un informat :
Program editor
DATA table3;
INPUT nom : $10. age sexe$;
DATALINES;
ChrisEvans 25 M
JaneTrulli 21 F
JoeStar 49 M
;
RUN;
PROC PRINT DATA=table3;
RUN;
Output
Exercice : Créer un tableau SAS pour les 3 individus précédents où la première variable fait
apparaı̂tre à la fois le nom et le prénom de l’individu, séparés par un blanc (Chris Evans), et
en conservant les variables age et sexe.
2.2.2
Lecture de données délimitées en ligne
Il est possible de noter les données dans l’éditeur en ligne à l’aide de l’option @@ dans
l’instruction INPUT.
8
Program editor
DATA table4;
INFILE datalines DLM=",";
INPUT nom:$12. age sexe$ @@;
DATALINES;
Chris Evans,25,M,Jane Trulli,21,F,Tom Jones,30,M
Erik Truffaz,30,M,Miles Davis,7,M
;
RUN;
PROC PRINT DATA=table4;
RUN;
Output
2.2.3
Obs
nom
age
sexe
1
2
3
4
5
Chris Evans
Jane Trulli
Tom Jones
Erik Truffaz
Miles Davis
25
21
30
30
7
M
F
M
M
M
Données tabulées
Dans les exemples qui suivent, les données figurent toujours dans le programme. On parle
de données tabulées lorsqu’elles occupent toujours les mêmes positions dans le fichier. Puisque
que nous avons vu la notion de format de lecture (ou informat dans la terminologie SAS),
appliquons aux variables un format de lecture. Voici, quelques uns des formats de lecture
usuels de SAS :
Format
w.
w.d.
COMMAw.d
$w.
DDMMYYw.
Signification
Entier décimal
Décimal standard
Décimal avec virgule
Alphanumérique
Jour Mois Année
SAS permet de contrôler la colonne à partir de laquelle va se faire la lecture grâce à une
instruction de la forme :
INPUT [pointeur] nom de variable [$] format d’entrée ...;
Le pointeur permet de pointer sur une colonne précise. Le format précise le type de variables,
la longueur occupée sur le support et le type de représentation utilisée. Voici des exemples
d’instructions liées au pointeur
• @n : le pointeur se déplace à la colonne n de la ligne courante
9
• +n : le pointeur avance de n colonnes
• #n : va à la ligne n
Dans l’exemple suivant, les données sont tabulées selon le schéma suivant :
Program editor
DATA table6;
INPUT @1 prenom $5.
DATALINES;
Chris Evans
29 M
Jane Trulli 25 F
Joe
Star
55 M
;
RUN;
@7 nom $6. @15 age $2. @18 sexe $1. @21 naissance DDMMYY10.;
11/01/1976
17/03/1980
11/05/1950
PROC PRINT DATA = table6;
RUN;
On peut aussi utiliser le code équivalent dans l’instruction INPUT :
INPUT @1 prenom $5. +1 nom $6. +2 age $2. +1 sexe $1. +2 naissance DDMMYY10.;
Mais dans les deux cas, la table SAS n’a pas conservé le bon format pour la date de naissance :
Obs
prenom
nom
1
2
3
Chris
Jane
Joe
Evans
Trulli
Star
Output
age
29
25
55
sexe
naissance
M
F
M
5854
7381
-3522
Pour que ces formats soient conservés, on utilise l’instruction FORMAT (formats d’écriture)
qui permet de définir les formats souhaités pour chacune des variables au moment de l’écriture
de la table. Notons qu’il est donc possible d’appliquer des formats de lecture et d’écriture
différents à une même variable (voir la variable nom dans l’exemple qui suit).
10
Program editor
DATA table6;
INPUT @1 prenom $5. @7 nom $6. @15 age $2. @18 sexe $1. @21 naissance DDMMYY10.;
FORMAT prenom $5. nom $7. age $2. sexe $1. naissance DDMMYY10.;
DATALINES;
Chris Evans
29 M 11/01/1976
Jane Trulli 25 F 17/03/1980
Joe
Star
55 M 11/05/1950
;
RUN;
PROC PRINT DATA = table6;
RUN;
Cette fois on obtient les formats désirés :
Obs
prenom
nom
1
2
3
Chris
Jane
Joe
Evans
Trulli
Star
Output
age
29
25
55
sexe
naissance
M
F
M
11/01/1976
17/03/1980
11/05/1950
Ceci peut être vérifié avec la procédure CONTENTS qui décrit le contenu d’une table SAS :
Program editor
PROC CONTENTS DATA=table6;
RUN;
Log
Liste alphabétique des variables et attributs
#
Variable
Type
Len
3
5
2
1
4
age
naissance
nom
prenom
sexe
Alph
Num
Alph
Alph
Alph
2
8
6
5
1
Format
$2.
DDMMYY10.
$7.
$5.
$1.
Exercice : Comparez les formats de table6 avec ou sans l’instruction FORMAT.
Voici un exemple voisin, pour lequel les données sont sur plusieurs lignes. Le caractère «#»
permet d’organiser les variables d’une même observation sur plusieurs lignes :
11
Program editor
DATA table6;
INPUT #1 @1 prenom $5. @7 nom $6. @15 age $2.
#2 @1 sexe $1. +6 naissance DDMMYY10.;
FORMAT prenom $5. nom $6. age $2. sexe $1. naissance DDMMYY10.;
DATALINES;
Chris Evans
29
M
11/01/1976
Jane Trulli 25
F
17/03/1980
Joe
Star
55
M
11/05/1950
;
RUN;
PROC PRINT DATA = table6;
RUN;
2.3
Obs
prenom
nom
1
2
3
Chris
Jane
Joe
Evans
Trulli
Star
Output
age
29
25
55
sexe
naissance
M
F
M
11/01/1976
17/03/1980
11/05/1950
Lectures de données à partir d’un fichier externe
Les données sont maintenant disponibles dans un fichier externe qui se nomme ici individus.txt. La première chose à faire est de bien identifier le type de fichier à lire (tabulaire ou
délimité, et si c’est le cas, par quel délimiteur). Il faut aussi savoir quelles sont les données
contenues et quels sont les formats associés. Notez bien que cet exemple n’est pas représentatif
car le plus souvent les fichiers de données externes contiennent un grand nombre de données.
Ce fichier est extrait d’un tableur du type excel ou works. Le fichier texte est d’un format
particulier : Tab delimited file.
Program editor
DATA tableindiv;
INFILE ’individus.txt’ DSD DLM=’09’x TRUNCOVER;
INPUT prenom $ nom $ sexe $ anniversaire : DDMMYY10. age ville $10.;
FORMAT sexe $1. anniversaire : DDMMYY10. age 2. ville $15.;
RUN;
PROC PRINT DATA = tableindiv;
RUN;
L’option DSD est là pour prévenir les données manquantes et l’option TRUNCOVER permet de
lire des lignes non complètes sans passer automatiquement à la ligne suivante. Ici, «Londres»
n’occupe pas 10 caractères, et sans TRUNCOVER, SAS serait tenté d’aller à la ligne suivante et
12
créerait ainsi une confusion dans la lecture. Le plus souvent, il est donc conseillé d’associer
l’option TRUNCOVER à l’instruction INFILE. La sortie est bien celle désirée :
Output
sexe anniversaire
Obs
prenom
nom
1
2
3
4
5
6
7
Chris
Jane
Tom
Joe
Jim
Suzanne
Janis
Evans
Trulli
Jones
Star
Courrier
Vega
Poplin
M
F
M
M
M
F
F
11/01/1976
11/12/1980
11/07/1971
11/05/1952
11/05/1948
11/09/1992
11/05/1937
age
ville
25
21
30
49
53
9
64
Londres
Manchester
Milan
Paris
Monaco
New York
Boston
Pour que de bons formats soient conservés au moment de l’écriture de la table, il est parfois
nécessaire de préciser une nouvelle fois les formats (c’est par exemple le cas pour les dates et
le nombre de décimales conservés dans les variables numériques, qui sont de 4 par défaut).
Pour cela on peut indiquer directement les formats avec l’instruction FORMAT. On peut aussi
utiliser l’instruction ATTRIB qui permet en plus d’affecter des labels aux variables. Voici un
exemple de code utilisant cette instruction :
Program editor
DATA tableindiv1;
INFILE ’individus.txt’ DSD DLM=’09’x TRUNCOVER;
INPUT prenom $ nom $ sexe $ anniversaire : DDMMYY10. age ville $10.;
ATTRIB prenom LABEL = "Prénom de l’individu"
nom
LABEL = "Nom de l’individu"
sexe
LABEL = "Sexe de l’individu" FORMAT = $1.
anniversaire LABEL = "Date de naissance" FORMAT = DDMMYY10.
age LABEL = "Age de l’individu" FORMAT = 2.
ville LABEL = "Prénom de l’individu" FORMAT = $10.
;
RUN;
PROC CONTENTS DATA = tableindiv1;
RUN;
Output
Liste alphabétique des variables et attributs
#
Variable
Type
5
4
2
1
3
6
age
anniversaire
nom
prenom
sexe
ville
Num
Num
Alph
Alph
Alph
Alph
Len
8
8
8
8
8
10
Format
Label
2.
DDMMYY10.
Age de l’individu
Date de naissance
Nom de l’individu
Prénom de l’individu
Sexe de l’individu
Prénom de l’individu
$1.
$10.
13
De façon générale, retenir que pour modifier les formats obtenus dans la table SAS, il est
préférable des modifier les formats dans la phase d’écriture de la table (avec ATTRIB), plutôt
que dans la phase de lecture des données (avec les informats).
3
3.1
Manipulation de tables
Fusion verticale de tables
La fusion verticale consiste à empiler les données de plusieurs tables SAS. Elle est réalisée
dans une étape DATA avec l’instruction SET qui permet de charger des tables. SAS lit alors
l’une après l’autre les lignes de la première table avant de passer à la seconde table, ... Dans
ce type de fusion, on a généralement des ensembles de données avec des variables communes.
DATA tablecréée;
SET TableLue1 TableLue2 ...tableLuen;
RUN;
Dans l’exemple présenté en Figure 1, on empile les tables table1 et table2 pour obtenir une
troisième table combine.
Les données sont empilées dans la table résultante combine mais s’il existe des doublons
dans les données, ils ne sont pas pour autant éliminés. On appelle doublon la répétition d’un
individu avec les mêmes caractéristiques, c’est à dire les mêmes variables (dans notre exemple
l’individu Jane). Afin d’éliminer les doublons, il faut utiliser la procédure SORT avec l’option
NODUPRECS. La procédure SORT permet de trier des données selon les variables déclarées dans
l’instruction BY (en cas d’égalité sur la première variable, c’est la seconde qui sert de critère de
tri, puis la troisième, ...). Attention à l’utilisation de l’option NODUPRECS : dans la recherche
des doublons, seules les données déclarées dans l’instruction BY seront considérées.
Program editor
PROC SORT DATA=combine NODUPRECS;
BY prenom age;
RUN;
PROC PRINT DATA=combine;
RUN;
Obs
1
2
3
4
5
6
7
8
9
10
11
Output
prenom
Chris
Dan
Emma
Jane
Jerry
Jim
Joe
Joe
Sam
Sid
Tom
age
36
38
51
21
28
18
20
49
36
36
30
La répétition de l’individu «Jane» est éliminée alors que les deux individus distincts «Joe»
sont conservés.
14
Program editor
DATA table1;
INPUT prenom $ age;
DATALINES;
Chris 36
Jane 21
Tom 30
Joe 49
;
RUN;
DATA table2;
INPUT prenom $ age;
DATALINES;
Jerry 28
Dan 38
Jim 18
Sid 36
Emma 51
Jane 21
Joe 20
Sam 36
;
RUN;
DATA combine;
SET table1 table2;
RUN;
PROC PRINT DATA=combine;
RUN;
Obs
1
2
3
4
5
6
7
8
9
10
11
12
Output
prenom
Chris
Jane
Tom
Joe
Jerry
Dan
Jim
Sid
Emma
Jane
Joe
Sam
age
36
21
30
49
28
38
18
36
51
21
20
36
Fig. 1 – Fusion verticale des tables table1 et table2.
3.2
Fusion horizontale de tables
Pour réaliser la fusion horizontale de tables SAS, ces tables doivent posséder au moins une
variable commune qui servira à recoller les données. Attention, avant d’effectuer une fusion
horizontale de plusieurs tables, les données de chaque table doivent être triées selon la (les)
variable(s) de recollement. La procédure SORT permet de trier des tables :
PROC SORT DATA = tablelue;
BY Var1 Var2... Varp;
RUN;
La fusion horizontale est réalisée dans une étape DATA avec l’instruction MERGE. Il faut indiquer
à SAS, avec l’instruction BY, quelles sont les variables de recollement.
15
DATA tablecréee;
MERGE Tablelue1 Tablelue2;
BY Var1 Var2... Varp;
RUN;
Par exemple, la fusion des tables table1 et table2 en une troisième table combine selon la
variable prenom est obtenue grâce à la programmation suivante :
Program editor
DATA table1;
INPUT prenom $ age;
DATALINES;
Chris 36
Jane 21
Tom 30
Joe 49
;
RUN;
Obs
1
2
3
4
Output
prenom
age
Chris
Jane
Joe
Tom
36
21
49
30
sexe
M
F
M
M
DATA table2;
INPUT prenom $ sexe $;
DATALINES;
Tom M
Chris M
Jane F
Joe M
;
RUN;
PROC SORT DATA=table1;
BY prenom;
RUN;
PROC SORT DATA=table2;
BY prenom;
RUN;
DATA combine;
MERGE table1 table2;
BY prenom;
RUN;
PROC PRINT DATA=combine;
RUN;
Reprenons la même fusion mais cette fois-ci avec des données non communes dans les deux
tables. La table table1 contient l’individu Tom qui ne figure pas dans table2. A contrario, la
table table 2 contient l’individu Jerry ne figurant pas dans la table table1.
16
Program editor
DATA table1;
INPUT prenom $ age;
DATALINES;
Chris 36
Jane 21
Tom 30
Joe 49
;
RUN;
Obs
1
2
3
4
5
Output
prenom
age
Chris
Jane
Jerry
Joe
Tom
36
21
.
49
30
sexe
M
F
F
M
DATA table2;
INPUT prenom $ sexe $;
DATALINES;
Jerry F
Chris M
Jane F
Joe M
;
RUN;
PROC SORT DATA=table1;
BY prenom;
RUN;
PROC SORT DATA=table2;
BY prenom;
RUN;
DATA combine;
MERGE table1 table2;
BY prenom;
RUN;
PROC PRINT DATA=combine;
RUN;
L’individu Jerry qui est présent dans table 2 et absent de table1 prend la valeur F pour
la variable sexe et a une donnée manquante (représentée par le .) pour la variable age. A
contrario, l’individu Tom présent dans table1 et absent de table2 prend la valeur 30 pour la
variable age et a une donnée manquante (représentée par le blanc) pour la variable sexe. Pour
organiser la fusion horizontale, on utilise une boucle avec l’option IN. Dans le programme qui
suit on aura également l’occasion d’utiliser l’instruction OUTPUT (ordre d’écriture dans une
table) qu’il faut obligatoirement utiliser ici dans la boucle pour que SAS écrive dans la table
désirée.
17
Program editor
DATA combine1 combine2 combine3;
MERGE table1(in=a) table2(in=b);
BY prenom;
/*intersection de table1 et table2*/
IF a and b THEN OUTPUT combine1;
/*dans table2 et pas dans table1*/
IF not a and b THEN OUTPUT combine2;
/*dans table1 et pas dans table2*/
IF a and not b THEN OUTPUT combine3;
RUN;
PROC PRINT DATA=combine1;
RUN;
PROC PRINT DATA=combine2;
RUN;
PROC PRINT DATA=combine3;
RUN;
3.3
Output
(combine1)
Obs
prenom
age
sexe
1
2
3
Chris
Jane
Joe
36
21
49
M
F
M
(combine2)
Obs
prenom
age
sexe
1
Jerry
.
F
sexe
(combine3)
Obs
prenom
age
1
Tom
30
Création et sélection de variables utiles
On peut rajouter de nouvelles variables à l’intérieur d’une étape DATA en les définissant
directement, par exemple dans le code suivant :
Program editor
DATA Tablecréée;
SET Tablelue;
NouvelleVar = Var1 + Var2;
RUN;
Var1 et Var2 sont des variables de Tablelue et la table Tablecréée contient la variable
NouvelleVar en plus de toutes les variables de Tablelue.
Il est possible, au sein d’une étape DATA de supprimer certaines variables au moyen de
l’option DROP = Var1. On peut aussi utiliser l’option KEEP=Var1 ... VarN qui permet de ne
garder que certaines des variables de la table. Par exemple,
Program editor
DATA Tablecrée ;
SET Tablelue (KEEP = Var2);
RUN;
On peut aussi supprimer certaines observations à l’aide de l’instruction WHERE, comme
l’illustre l’exemple suivant. La table Homme est construit à partir de la table Indiv en ne
conservant que les individus de sexe masculin.
18
Program editor
DATA Indiv;
INPUT prenom $ sexe $;
DATALINES;
Chris M
Jane F
Tom M
Joe M
;
RUN;
DATA Homme;
SET Indiv (WHERE = (sexe = ’M’));
RUN;
PROC PRINT DATA = Indiv;
RUN;
PROC PRINT DATA = Homme;
RUN;
19
Output
(Indiv)
Obs
prenom
1
2
3
4
Chris
Jane
Tom
Joe
(Homme)
Obs
prenom
1
2
3
Chris
Tom
Joe
sexe
M
F
M
M
sexe
M
M
M