SAS - Maîtriser les boucles explicites et implicites

Cet article en deux mots :

Découvrez comment transformer vos données avec les boucles explicites dans SAS. De la simulation de décote à la génération d'un tableau d'amortissement complet grâce à l'instruction OUTPUT, apprenez à automatiser vos calculs répétitifs et à démultiplier vos lignes pour des analyses prédictives puissantes.

Bienvenue dans la cinquième étape de notre parcours au cœur de l'étape DATA de SAS® !

Jusqu'à présent, nous avons trié, filtré et catégorisé nos véhicules. Mais aujourd'hui, nous allons faire un peu de "voyage dans le temps" (ou plutôt de la simulation financière) en abordant l'un des concepts les plus fondamentaux de la programmation : les boucles.

Sortez vos calculatrices, nous allons anticiper la décote de nos véhicules neufs pour les cinq prochaines années !

1. Le grand secret : L'étape DATA est déjà une boucle !

Avant de créer nos propres boucles, il est crucial de rappeler un concept vu dans l'Article 3 : la boucle implicite.

Sans même que vous ayez à l'écrire, l'étape DATA boucle naturellement sur votre ensemble de données. Quand SAS lit votre table parc_auto, il prend la première voiture, exécute le code, l'enregistre (c'est le fameux OUTPUT implicite à la fin de l'étape), puis boucle de lui-même pour passer à la deuxième voiture, et ainsi de suite.

C'est ce qu'on appelle la boucle implicite. Mais que se passe-t-il si, pour une seule voiture lue, nous voulons effectuer un calcul à plusieurs reprises ? C'est là qu'interviennent les boucles explicites.

2. La boucle itérative : DO ... TO ... END

Pour dire à SAS de répéter une action un nombre précis de fois à l'intérieur d'une observation, on utilise l'instruction DO, accompagnée d'une variable de comptage (souvent appelée i, j, ou tout autre nom explicite).

Imaginons que nous voulons simuler la dépréciation d'une voiture neuve de notre stock (achetée en cette belle année 2015). En moyenne, une voiture perd environ 10% de sa valeur chaque année.

Voici comment calculer sa valeur dans 5 ans :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
data simulation_decote_simple;
set parc_auto;

/* On ne garde que les véhicules neufs de l'année en cours */
if annee_fab = 2015;

valeur_residuelle = prix_ttc;

/* Début de la boucle explicite */
do annee = 1 to 5;
valeur_residuelle = valeur_residuelle * 0.90; /* Baisse de 10% */
end;
/* Fin de la boucle */
run;

Que s'est-il passé ici ? Pour chaque voiture neuve lue, SAS "met en pause" sa lecture du fichier. Il rentre dans la boucle DO, applique la baisse de 10%, recommence (pour l'année 2), applique encore 10% sur le nouveau montant, et ce, jusqu'à l'année 5. Une fois la boucle terminée, il passe au véhicule suivant.

3. La magie de l'instruction OUTPUT explicite

Le code précédent a un défaut : il ne nous donne que la valeur finale au bout de 5 ans. Mais si notre directeur commercial veut voir un tableau d'amortissement avec la valeur de la voiture pour l'année 1, puis l'année 2, puis l'année 3 ?

Nous allons devoir transformer une seule ligne de voiture en cinq lignes de prévisions !

Pour faire cela, nous allons "court-circuiter" le comportement par défaut de SAS en utilisant l'instruction OUTPUT directement à l'intérieur de notre boucle :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
data tableau_amortissement;
set parc_auto;
if annee_fab = 2015;

valeur_residuelle = prix_ttc;
annee_projete = 2015;

do i = 1 to 5;
annee_projete = annee_projete + 1; /* On avance d'un an */
valeur_residuelle = valeur_residuelle * 0.90; /* On applique la décote */

/* MAGIE : On force SAS à écrire la ligne MAINTENANT ! */
output;
end;
run;

Dès que vous écrivez OUTPUT; dans une étape DATA, SAS annule son écriture automatique de fin d'étape. Il n'écrira une ligne que lorsque vous lui en donnerez l'ordre. Dans notre exemple, la boucle tourne 5 fois, elle rencontre donc le mot OUTPUT; 5 fois. Résultat : une voiture en entrée = 5 lignes de prévisions en sortie !

"L'essence de l'informatique est d'automatiser les tâches répétitives. Pourquoi calculer manuellement la valeur de revente d'une voiture année après année, quand une boucle peut générer cinq ans de prévisions le temps d'un battement de cils ?"

Nicolas Housset

Passionné d'informatique, je suis Consultant et expert technique SAS VIYA, également co-fondateur de la société Flexcelite. Spécialisé dans les technologies SAS (Viya, 9.4) et les infrastructures associées (Linux, Hadoop, Azure), ce blog est mon espace pour partager mes mémos techniques et retours d'expérience.