On approche de la fin de notre série, et si vous avez suivi les épisodes précédents, vous savez désormais ingérer, nettoyer et fusionner vos données avec la dextérité d'un chef pâtissier. Mais il reste un ennemi redoutable dans le monde de la Data : le formatage.
Combien de fois avez-vous reçu un fichier Excel magnifique, parfait pour être lu par un humain, mais absolument catastrophique pour faire des statistiques ? Parfois, vous recevez les mois en colonnes (Janvier, Février, Mars...), alors que votre logiciel d'analyse a besoin d'une seule colonne "Mois" et d'une colonne "Valeur". En informatique, on appelle cela passer d'un format "Large" (Wide) à un format "Long", et inversement.
Si vous essayez de faire ça à la main ou avec des dizaines de IF / THEN, vous allez y passer la nuit. Le chapitre 5 du guide de Neil Spencer nous livre la solution ultime pour tordre nos datasets dans tous les sens : les Tableaux (Arrays) combinés aux boucles DO.
Sortez vos méninges, c'est l'heure de la gymnastique mentale !
1. Qu'est-ce qu'un "Array" en SAS ?
Si vous avez déjà fait du C, du Python ou du Java, oubliez tout. En SAS, un Array (Tableau) n'est pas une nouvelle structure de données qui existe en mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya.. C'est simplement un raccourci, un alias, qui permet de regrouper temporairement plusieurs variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. existantes sous un même nom.
Pourquoi faire ça ? Pour pouvoir utiliser une boucle DO et appliquer la même opération mathématique (ou restructuration) à 50 colonnes en seulement 3 lignes de code !
2. Du format "Large" au format "Long" (Le plus fréquent)
Imaginons que notre comptable nous envoie le bilan du premier trimestre. Il y a une ligne par produit, et trois colonnes pour les ventes de Janvier, Février et Mars.
SAS
2
3
4
5
6
7
8
9
10
11
12
Objectif : Transformer des colonnes en lignes */
* 1. Notre table de départ (Format Large) ;
DATA ventes_trimestre_large;
INPUT produit $15. ventes_jan ventes_fev ventes_mar;
DATALINES;
Baguette 3500 3200 3800
Croissant 1200 1150 1300
Pain_Chocolat 1100 1050 1200
;
RUN;
Pour faire des graphiques ou des analyses avec PROC MEANS, ce format est très mauvais. Nous voulons 3 lignes par produit (une pour chaque mois). Voici la magie de l'Array et de l'instruction OUTPUT (qui force SAS à écrire une ligne).
SAS
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
DATA ventes_format_long;
SET ventes_trimestre_large;
* On regroupe nos 3 colonnes de mois sous l'alias "tab_mois".
* Le (3) indique la taille du tableau ;
ARRAY tab_mois(3) ventes_jan ventes_fev ventes_mar;
* On lance une boucle qui va tourner 3 fois (de 1 à 3) ;
DO i = 1 TO 3;
* On crée une nouvelle variable qui prend la valeur de la case "i" du tableau ;
quantite_vendue = tab_mois(i);
* On garde une trace du numéro du mois ;
numero_mois = i;
* L'instruction magique : on force SAS à créer une nouvelle ligne de données
* à CHAQUE passage dans la boucle ! ;
OUTPUT;
END;
* On fait le ménage : on supprime les anciennes colonnes et notre compteur "i" ;
DROP ventes_jan ventes_fev ventes_mar i;
RUN;
PROC PRINT DATA = ventes_format_long;
TITLE "Ventes restructurées (Une ligne par mois et par produit)";
RUN;
Et boum ! Vous êtes passé de 3 lignes à 9 lignes. Votre dataset est désormais vertical et parfait pour l'analyse.
3. Le boss final : Du format "Long" au format "Large"
Parfois, c'est l'inverse. Vous avez un fichier "Long" (vertical), et vous voulez faire un tableau de synthèse "Large" (horizontal) pour l'imprimer au format paysage.
C'est beaucoup plus complexe, car l'étape DATA de SAS lit les lignes les unes après les autres et oublie la ligne précédente. Pour réaliser cet exploit, nous devons utiliser l'instruction RETAIN (qui force SAS à ne pas oublier les variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage.) et le traitement par groupe (BY).
SAS
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
PROC SORT DATA = ventes_format_long;
BY produit;
RUN;
* 3. La transformation inverse (Format Large) ;
DATA ventes_retour_large;
SET ventes_format_long;
BY produit; /* Active les variables FIRST.produit et LAST.produit */
* On recrée notre tableau, mais cette fois ce sont de NOUVELLES variables ;
ARRAY tab_mois(3) mois_1 mois_2 mois_3;
* RETAIN est vital : il empêche SAS d'effacer nos colonnes mois_1, mois_2, mois_3
* quand il passe à la ligne de lecture suivante ! ;
RETAIN mois_1 mois_2 mois_3;
* S'il s'agit du tout premier enregistrement pour un produit donné,
* on vide les variables du tableau pour repartir à zéro ;
IF FIRST.produit THEN DO i = 1 TO 3;
tab_mois(i) = .;
END;
* On injecte la quantité vendue dans la bonne case du tableau
* grâce à notre variable numero_mois ;
tab_mois(numero_mois) = quantite_vendue;
* On ne sauvegarde la ligne finale QUE lorsqu'on a fini de lire
* tous les mois pour le produit en cours ;
IF LAST.produit THEN OUTPUT;
* On fait le ménage ;
DROP quantite_vendue numero_mois i;
RUN;
PROC PRINT DATA = ventes_retour_large;
TITLE "Retour au format initial horizontal";
RUN;
Décryptage de la mécanique :
- SAS lit la Baguette du mois 1. Il la stocke dans
mois_1. Il n'écrit rien (OUTPUTn'est pas déclenché). - Il lit la Baguette du mois 2. Grâce au
RETAIN,mois_1existe toujours. Il remplitmois_2. - Il lit la Baguette du mois 3. Il remplit
mois_3. C'est le dernier enregistrement pour la Baguette (LAST.produitest vrai). Bingo, il lance leOUTPUTet écrit la ligne complète !
Le mot de la fin
Si vous avez réussi à comprendre la mécanique du RETAIN couplé aux FIRST. et LAST., félicitations : vous avez acquis la logique fondamentale du moteur SAS. Vous êtes capable de remodeler n'importe quelle source de données pour l'adapter à vos besoins.
Dans notre prochain article (le 8ème !), nous pourrons enfin arrêter de manipuler les données pour commencer à les analyser. Nous verrons comment générer des statistiques avec le trio de choc : PROC MEANS, PROC UNIVARIATE et PROC FREQ.






