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.
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é !
DATA Weeks;
FORMAT Year $4. Qtr $9. Test_Date DATE9.;
DO i = 0 TO 1095;
Test_Date = '01JAN2006'd +i;
Qtr=PUT(Year(Test_Date), 4.0)||"_Q"||PUT(QTR(Test_Date), Z1.);
Year = PUT(Year(Test_Date), 4.0);
N_Test = 30;
OUTPUT;
END;
RUN;
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é !
DATA Weeks; MERGE Weeks Rates; BY Qtr; DROP i; RUN;
1
2
DATA Weeks;
3
MERGE Weeks Rates;
4
BY Qtr;
5
DROP i;
6
7
RUN;
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é !
DATA ChiTronix; LENGTH Vendor $9.; SET Weeks; RETAIN SEED ;
FORMAT Defects 8.0 ;
Vendor="ChiTronix";
IF _N_=1 THEN SEED=12345;
CALL RANPOI(SEED, RateC*N_Test, Defects);
DROP RateC RateD RateE SEED;
RUN;
DATA Duality; LENGTH Vendor $9.; SET Weeks; RETAIN SEED ;
FORMAT Defects 8.0 ;
Vendor="Duality";
IF _N_=1 THEN SEED=23456;
CALL RANPOI(SEED, RateD*N_Test, Defects);
IF Year < "2008";
DROP RateC RateD RateE SEED;
RUN;
DATA Empirical; LENGTH Vendor $9.; SET Weeks; RETAIN SEED ;
FORMAT Defects 8.0 ;
Vendor="Empirical";
IF _N_=1 THEN SEED=34567;
CALL RANPOI(SEED, RateE*N_Test, Defects);
DROP RateC RateD RateE SEED;
RUN;
1
DATA ChiTronix; LENGTH Vendor $9.; SET Weeks; RETAIN SEED ;
2
FORMAT Defects 8.0 ;
3
Vendor="ChiTronix";
4
IF _N_=1THEN SEED=12345;
5
CALL RANPOI(SEED, RateC*N_Test, Defects);
6
DROP RateC RateD RateE SEED;
7
RUN;
8
9
DATA Duality; LENGTH Vendor $9.; SET Weeks; RETAIN SEED ;
10
FORMAT Defects 8.0 ;
11
Vendor="Duality";
12
IF _N_=1THEN SEED=23456;
13
CALL RANPOI(SEED, RateD*N_Test, Defects);
14
IF Year < "2008";
15
DROP RateC RateD RateE SEED;
16
RUN;
17
18
DATA Empirical; LENGTH Vendor $9.; SET Weeks; RETAIN SEED ;
19
FORMAT Defects 8.0 ;
20
Vendor="Empirical";
21
IF _N_=1THEN SEED=34567;
22
CALL RANPOI(SEED, RateE*N_Test, Defects);
23
24
DROP RateC RateD RateE SEED;
25
RUN;
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é !
DATA Test_Results; SET ChiTronix Duality Empirical;
RUN;
PROC SORT DATA=Test_Results; BY Test_Date Vendor; RUN;
1
DATA Test_Results; SET ChiTronix Duality Empirical;
2
RUN;
3
4
PROC SORTDATA=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é !
PROC MEANS DATA=Test_Results NOPRINT;
CLASS Year Qtr Vendor;
OUTPUT OUT=Tab SUM(N_Test Defects)=N_Test Defects;
RUN;
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é !
DATA Tab; SET Tab;
FORMAT Defect_Rate 8.3;
Defect_Rate=Defects/N_Test;
RUN;
DATA Defect_Rates; SET Tab;
IF _TYPE_=7;
LABEL Qtr="Quarter" N_Test="Number Tested" Defects="Number Defects"
Defect_Rate="Defect Rate";
KEEP Year Qtr Vendor N_Test Defects Defect_Rate;
RUN;
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é !
DATA JES.Vendor_List; LENGTH Vendor $9. ;
N=1; Vendor="ChiTronix"; OUTPUT;
N=2; Vendor="Duality"; OUTPUT;
N=3; Vendor="Empirical"; OUTPUT;
RUN;
DATA JES.Rates_2006; SET Defect_Rates; IF Year=2006; RUN;
DATA JES.Rates_2007; SET Defect_Rates; IF Year=2007; RUN;
DATA JES.Rates_2008; SET Defect_Rates; IF Year=2008; RUN;
1
DATA JES.Vendor_List; LENGTH Vendor $9. ;
2
N=1; Vendor="ChiTronix"; OUTPUT;
3
N=2; Vendor="Duality"; OUTPUT;
4
N=3; Vendor="Empirical"; OUTPUT;
5
RUN;
6
DATA JES.Rates_2006; SET Defect_Rates; IF Year=2006; RUN;
7
DATA JES.Rates_2007; SET Defect_Rates; IF Year=2007; RUN;
8
DATA 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.
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.
« 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 »
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.