Publié le :
ETL CREATION_INTERNE

Génération de données simulées de défauts par vendeur

En attente de validation
Le script commence par créer deux tables de base : 'Rates' qui contient les taux de défauts par trimestre via des instructions DATALINES, et 'Weeks' qui établit un calendrier jour par jour de 2006 à 2008. Ces tables sont fusionnées pour associer un taux à chaque jour. Ensuite, pour chaque vendeur, une nouvelle table est créée en simulant le nombre de défauts quotidiens à l'aide d'une loi de Poisson (fonction RANPOI), basée sur les taux respectifs. Toutes les données de test sont ensuite consolidées dans 'Test_Results', triées, puis agrégées avec PROC MEANS pour calculer les totaux par trimestre et par vendeur. Un taux de défaut est calculé. Finalement, le script génère quatre tables persistantes dans une librairie 'JES' : une liste de vendeurs et trois tables de résultats, une pour chaque année. Les tables de travail intermédiaires sont supprimées à la fin du processus.
Analyse des données

Type : CREATION_INTERNE


Toutes les données sont générées en interne. La table 'Rates' est créée à partir de données fixes dans le code (DATALINES). La table 'Weeks' est générée de manière algorithmique avec une boucle 'DO'. Les données de défauts sont simulées à l'aide de fonctions de génération de nombres aléatoires.

1 Bloc de code
DATA STEP Data
Explication :
Crée la table 'Rates' contenant les taux de défauts (RateC, RateD, RateE) pour chaque trimestre de 2006 à 2008. Les données sont lues directement depuis le code.
Copié !
1DATA Rates;
2 INPUT Qtr $9. RateC RateD RateE 5.2;
3 DATALINES;
42006_Q1 .05 .03 .07
52006_Q2 .06 .03 .07
62006_Q3 .12 .03 .07
72006_Q4 .06 .03 .07
82007_Q1 .05 .03 .07
92007_Q2 .05 .03 .07
102007_Q3 .04 .03 .07
112007_Q4 .03 .03 .07
122008_Q1 .02 .03 .07
132008_Q2 .10 .03 .07
142008_Q3 .02 .03 .07
152008_Q4 .02 .03 .07
16 ;
17RUN;
2 Bloc de code
DATA STEP Data
Explication :
Génère la table 'Weeks' avec une ligne par jour pour 1096 jours à partir du 1er janvier 2006. Pour chaque jour, le trimestre ('Qtr'), l'année ('Year') et un nombre de tests fixe ('N_Test') sont déterminés.
Copié !
1DATA Weeks;
2 FORMAT Year $4. Qtr $9. Test_Date DATE9.;
3 DO i = 0 TO 1095;
4 Test_Date = '01JAN2006'd +i;
5 Qtr=PUT(Year(Test_Date), 4.0)||"_Q"||PUT(QTR(Test_Date), Z1.);
6 Year = PUT(Year(Test_Date), 4.0);
7 N_Test = 30;
8 OUTPUT;
9 END;
10RUN;
3 Bloc de code
DATA STEP
Explication :
Fusionne la table 'Weeks' avec la table 'Rates' en utilisant le trimestre ('Qtr') comme clé. Chaque jour se voit ainsi attribuer les taux de défauts correspondants.
Copié !
1 
2DATA Weeks;
3MERGE Weeks Rates;
4BY Qtr;
5DROP i;
6 
7RUN;
8 
4 Bloc de code
DATA STEP Data
Explication :
Crée trois tables distinctes, une pour chaque vendeur. Dans chaque table, le nombre de défauts ('Defects') est simulé pour chaque jour en utilisant la fonction RANPOI, qui génère un nombre aléatoire selon une loi de Poisson. La moyenne de la loi est le produit du taux du vendeur par le nombre de tests.
Copié !
1DATA ChiTronix; LENGTH Vendor $9.; SET Weeks; RETAIN SEED ;
2 FORMAT Defects 8.0 ;
3 Vendor="ChiTronix";
4 IF _N_=1 THEN SEED=12345;
5 CALL RANPOI(SEED, RateC*N_Test, Defects);
6 DROP RateC RateD RateE SEED;
7RUN;
8 
9DATA Duality; LENGTH Vendor $9.; SET Weeks; RETAIN SEED ;
10 FORMAT Defects 8.0 ;
11 Vendor="Duality";
12 IF _N_=1 THEN SEED=23456;
13 CALL RANPOI(SEED, RateD*N_Test, Defects);
14 IF Year < "2008";
15 DROP RateC RateD RateE SEED;
16RUN;
17 
18DATA Empirical; LENGTH Vendor $9.; SET Weeks; RETAIN SEED ;
19 FORMAT Defects 8.0 ;
20 Vendor="Empirical";
21 IF _N_=1 THEN SEED=34567;
22 CALL RANPOI(SEED, RateE*N_Test, Defects);
23 
24 DROP RateC RateD RateE SEED;
25RUN;
5 Bloc de code
DATA STEP
Explication :
Concatène les tables des trois vendeurs en une seule, 'Test_Results', puis la trie par date de test et par nom de vendeur.
Copié !
1DATA Test_Results; SET ChiTronix Duality Empirical;
2RUN;
3 
4PROC SORT DATA=Test_Results; BY Test_Date Vendor; RUN;
6 Bloc de code
PROC MEANS Data
Explication :
Agrège les données de 'Test_Results' pour obtenir des statistiques par Année, Trimestre et Vendeur. La procédure calcule la somme des tests ('N_Test') et des défauts ('Defects') pour chaque groupe et écrit les résultats dans la table 'Tab'.
Copié !
1PROC MEANS DATA=Test_Results NOPRINT;
2 CLASS Year Qtr Vendor;
3 OUTPUT OUT=Tab SUM(N_Test Defects)=N_Test Defects;
4RUN;
7 Bloc de code
DATA STEP Data
Explication :
Calcule le taux de défaut ('Defect_Rate') dans la table 'Tab'. Ensuite, crée la table 'Defect_Rates' en ne conservant que les lignes correspondant à l'agrégation la plus fine (Year*Qtr*Vendor, indiqué par _TYPE_=7), et sélectionne les colonnes pertinentes.
Copié !
1DATA Tab; SET Tab;
2 FORMAT Defect_Rate 8.3;
3 Defect_Rate=Defects/N_Test;
4RUN;
5 
6DATA Defect_Rates; SET Tab;
7 IF _TYPE_=7;
8 LABEL Qtr="Quarter" N_Test="Number Tested" Defects="Number Defects"
9 Defect_Rate="Defect Rate";
10 KEEP Year Qtr Vendor N_Test Defects Defect_Rate;
11RUN;
8 Bloc de code
DATA STEP Data
Explication :
Crée les tables de sortie finales dans la librairie JES. 'JES.Vendor_List' est créée manuellement pour lister les vendeurs. Les tables 'JES.Rates_2006', 'JES.Rates_2007', et 'JES.Rates_2008' sont créées en filtrant la table 'Defect_Rates' pour chaque année respective.
Copié !
1DATA JES.Vendor_List; LENGTH Vendor $9. ;
2 N=1; Vendor="ChiTronix"; OUTPUT;
3 N=2; Vendor="Duality"; OUTPUT;
4 N=3; Vendor="Empirical"; OUTPUT;
5RUN;
6DATA JES.Rates_2006; SET Defect_Rates; IF Year=2006; RUN;
7DATA JES.Rates_2007; SET Defect_Rates; IF Year=2007; RUN;
8DATA JES.Rates_2008; SET Defect_Rates; IF Year=2008; RUN;
9 Bloc de code
PROC DATASETS
Explication :
Nettoie la librairie de travail ('WORK') en supprimant toutes les tables intermédiaires créées pendant l'exécution du script.
Copié !
1 
2PROC DATASETS LIBRARY=WORK GENNUM=ALL NOLIST;
3DELETE Rates Weeks Chitronix Duality Empirical Test_Results Tab Defect_Rates ;
4RUN;
5 
6QUIT;
7 
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Banner
Le Conseil de l'Expert
Expert
Simon
Expert SAS et fondateur.
« La construction de ce script suit les meilleures pratiques de l'ingénierie de données SAS. La création d'une table de référence temporelle (Weeks) couplée à un calendrier de taux (Rates) garantit l'intégrité du référentiel avant la phase de simulation.

On notera l'utilisation judicieuse des instructions RETAIN et du contrôle des graines aléatoires (SEED), essentiels pour assurer la reproductibilité des simulations. Enfin, l'étape finale de nettoyage via PROC DATASETS témoigne d'une gestion rigoureuse des ressources : en supprimant les tables de travail intermédiaires, on optimise l'espace disque de la bibliothèque WORK et on assure la clarté de l'environnement de production »