SAS 3 gestion des graphs
Comme d’habitude on charge les données dans SAS à partir d’un lien internet en suivant les procédures ci-dessous:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/*Pour charger les données en ligne*/ FILENAME website URL 'http://mickael-clevenot.fr/wp-content/uploads/2017/09/DJ.csv'; FILENAME COPY 'D:\Users\Mickael\Dropbox\Cours\INformatique L3\DJ.csv'; /* SAS a des problèmes pour charger les données externes, il copie ligne à ligne avec le code ci-dessous*/ data _NULL_; n=-1; infile website recfm=s nbyte=n length=len; file copy recfm=n; input; put _infile_ $varying32767. len; run; /*on vide la mémoire de l’adresse avec filename clear*/ filename copy clear; /* on a chargé les données sur le disque de notre PC, maintenant on charge dans SAS*/ PROC IMPORT OUT= WORK.DJ DATAFILE= "D:\Users\Mickael\Dropbox\Cours\INformatique L3\DJ.csv" DBMS=CSV REPLACE; GETNAMES=YES; DATAROW=2; RUN; |
On nettoie un peu la base en retirant les lignes vides :
1 2 3 4 5 |
/* SAS est faché car dans le dossier il y a des lignes sans information. On va retirer ces lignes avec la commande suivante*/ data DJ1; set DJ; if cmiss(of _all_) then delete; run; |
On poursuit le nettoyage de la base en ne conservant que ce dont on a besoin : fonction KEEP
1 2 3 4 5 6 7 |
/*fonction de suppression des lignes où l'on trouve un élément vide.*/ /*Avec set on va chercher les données dans le dossier CAC. Le résultat des opérations demandé sera porté dans une nouveau dossier appelé CAC1*/ /* Dans le dossier CAC1 on ne va conserver que ce qui nous intéresse : date et close*/ /* Inversent on aurait pu utiliser la fonction drop pour éliminer les variables superflus*/ DATA DJ10(keep = date close ); SET DJ1; RUN; |
On change le nom des variables pour éviter les confusions : fonction RENAME
1 2 3 4 5 6 7 8 9 10 |
/* ON renomme la variable close car elle est présente dans les deux fichiers qu'on souhaite fusionner*/ data DJ11; set DJ10 (rename=(close=DJ)); run; quit; /* ON renomme la variable close car elle est présente dans les deux fichiers qu'on souhaite fusionner*/ data CAC101; set CAC10 (rename=(close=CAC40)); run; quit; |
Avant de réaliser la fusion des tables, il est nécessaire faut définir un clé pour la jointure : fonction SORT
1 2 3 4 5 6 7 8 |
/* Pour fusionner, on doit organiser(ordonner[sort]) les fichiers par rapport à une règles commune aux 2 fichiers ici la date*/ proc sort data=DJ11; by Date; run; /* Pour fusionner on doit organiser(ordonner[sort]) les fichiers par rapport à une règles commune aux 2 fichiers ici la date*/ proc sort data=CAC101; by DAte ; run; |
On réalise la fusion à l’aide de la fonction MERGE :
1 2 3 4 5 |
/* Enfin on opère la fusion avec la fonction merge*/ data final; merge CAC101 DJ11; by Date ; run; |
Il existe comme toujours plusieurs manière de réaliser une manipulation, ici on prend le chemin long
1 2 3 4 5 6 7 |
/* Le problème au dessus est que l'on va prendre l'ensemble des données pour toutes les dates du CAC ou du DJ. Or les jours fériers et la longueur des données peuvent être différents ce qui va générer des lignes vides */ /* on retire les lignes vides*/ data THREE1; set Three; if cmiss(of _all_) then delete; run; |
Ici on prend le chemin le plus court :
1 2 3 4 5 6 7 |
/*avec la fonction ci-dessous, on ne retient que les dates qu'on trouve à la fois dans DJ et CAC. Cela nous permet de supprimer les vides en une fois*/ data THREE2; merge DJ11 (in=A) CAC101 (in=B); by Date; if A and B; run; |
1 2 3 4 5 6 7 |
/* Ici on retrouve les effets produits par la première fonction merge*/ data THREE3; merge DJ11 (in=A) CAC101 (in=B); by Date; if A or B; run; |
Ce qu’il faut noter ci-dessus, c’est la différence entre le and et le or.
1 2 3 4 5 6 7 8 |
/* De la même manière si on ne précise pas le dossier de sortie SAS place les résultats dans le dossier courant dans les colonnes suivantes. */ proc gplot data=THREE2; /* Joli graphique chronogramme du CAC40 et Dow Jones simultanément. On peut changer les couleurs, les formes, etc.*/ Symbol1 i=join,v=dot,c=red,h=0.1 ; Symbol2 i=join,v=dot,c=black,h=0.1 ; plot CAC40*Date ; plot2 DJ*Date ; run ; |
Le graphique n’est pas très pertinent car les données ont des évolutions sur des échelles assez différentes. Pour essayer d’y remédier, on va transformer les données et les mettre en base 100. Pour cela on prend une date. On regarde la valeur du CAC et du DJ et on divise l’ensemble des deux séries par ces valeur de références à la même date.
1 2 3 4 5 6 7 8 |
/*On voit que le graphique n'est pas très clair car les niveaux des deux indicateurs sont très différents.*/ /*ON va re-baser à 100 à partir de la première valeur*/ data THREE20; set THREE2; dj_100=DJ/2635.590088*100; cac_100=cac40/1832*100; run; |
Le graphique n’est toujours pas très satisfaisant car les échelles à droite et à gauche sont différentes. on ne parvient pas à bien évaluer les évolutions relatives des deux indices.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/*Ci-dessus le résultat n'est pas très satisfaisant car les échelles à droite et à gauche sont différentes.*/ proc gplot data=THREE20; /* Joli graphique chronogramme du CAC40. On peut changer les couleurs, les formes, etc.*/ title 'Indices CAC40 et Dow Jones en base 100 mars 1990'; AXIS1 order =0 to 900 by 50 LABEL=(ANGLE=90 "CAC40") ; AXIS2 Label=(); axis3 order =0 to 900 by 50 LABEL=(ANGLE=90 "Dow Jones"); Symbol1 i=join,v=dot,c=red,h=0.1 ; Symbol2 i=join,v=dot,c=blue,h=0.1 ; plot CAC_100*Date / haxis =axis2 vaxis=axis1; plot2 DJ_100*Date / haxis =axis2 vaxis=axis3; run ; |
Encore un peu plus joli avec la procédure SGPLOT:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
proc sgplot data=THREE20; /* Joli graphique chronogramme du CAC40. On peut changer les couleurs, les formes, etc.*/ title 'Indices CAC40 et Dow Jones en base 100 mars 1990'; title2 '(base 100 mars 1990)'; yaxis min=0 label='CAC 40' values=(0 to 900 by 50); y2axis min=0 label='DOw Jones' values=(0 to 900 by 50); Symbol1 i=join,v=dot,c=red,h=0.1 ; Symbol2 i=join,v=dot,c=blue,h=0.1 ; series x=date y=CAC_100 /legendlabel="CAC40" ; series x=date y=DJ_100 /legendlabel="Dow Jones" y2axis; format date year4.; keylegend / location=inside position=topleft across=1; xaxis display=(nolabel); run ; |
Un petit calcul de rendement sur la base fusionnée:
1 2 3 4 5 |
data THREE201; set THREE2; rend_dj=log(DJ/lag(dj))*100; rend_cac=log(cac40/lag(cac40))*100; run; |
Un très joli graphique avec de jolies couleurs:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
proc gplot data=THREE201; /* Joli graphique chronogramme des rendements du CAC40 et du DJ.*/ SYMBOL1 i = join c = blue v = dot ; SYMBOL2 i = join c = cyan v = dot ; axis1 label=(); AXIS2 LABEL=(ANGLE=90 "CAC40") order=-12 to 12 by 2 ; plot (rend_cac rend_dj ) *Date / overlay legend=legend1 haxis =axis1 vaxis=axis2 ; format date year4.; title 'Rendements du CAC40 et Dow Jones'; title2 'Echantillon de mars 1990 à Septembre 2017'; /* Define the legend */ legend1 repeat=1 shape=symbol(1,2.5) label=none frame; run ; |
Conclusion: les graphiques sous SAS c’est pas la panacée. C’est très lourd. Personnellement je vais préférer exporter les données obtenues grâce à SAS vers Excel pour ensuite réaliser plus facilement de jolis graphiques de manière plus intuitives. On voit ici les avantages comparatifs des deux outils. Le traitement de données va à l’avantage de SAS très nettement mais pour la production de travaux irréguliers, les graphiques seront plus faciles à manipuler sous Excel. Il n’en demeure pas moins que vous devrez savoir mobiliser les lignes de codes présentées ci-dessus.
Pour ressortir les données SAS et les renvoyer vers Excel il faut utiliser la fonction Export
1 2 3 4 5 |
PROC EXPORT DATA = THREE201 OUTFILE = "D:\Users\Mickael\Dropbox\Cours\INformatique L3\fin1.xls" DBMS = EXCEL REPLACE ; SHEET = "data" ; /* nom de la feuille Excel créée */ RUN ; |
Ensuite on va regarder l’outil de régression linéaire. Puis on regardera les graphiques moustachus !!!