simple

groupByInfo

##set_simple

Description

L'action technique simple.groupByInfo est une véritable pépite pour les data scientistsExperts extrayant des connaissances via des méthodes statistiques, algorithmes et IA. Ils transforment les données brutes en insights stratégiques pour résoudre des problèmes métier complexes.. Elle permet de calculer l'indexStructure de données accélérant la lecture des lignes d'une table en ciblant directement les valeurs des colonnes indexées, réduisant ainsi les entrées/sorties disque et le temps de traitement. et la fréquence de chaque groupe au sein d'une table, ainsi que la position (indexStructure de données accélérant la lecture des lignes d'une table en ciblant directement les valeurs des colonnes indexées, réduisant ainsi les entrées/sorties disque et le temps de traitement.) de chaque enregistrement dans son groupe. C'est l'outil parfait pour préparer des données partitionnéesLes données partitionnées sont des tables divisées en blocs (segments) distribués sur les nœuds d'un cluster CAS pour permettre un traitement massivement parallèle et accélérer les calculs., analyser la distribution de classesLa distribution de classes représente la proportion relative de chaque catégorie cible dans un jeu de données, permettant de détecter un éventuel déséquilibre impactant la performance du modèle. ou amorcer des modèles prédictifsAlgorithmes entraînés sur SAS Viya pour analyser des données historiques et estimer la probabilité de résultats futurs, facilitant ainsi la prise de décision proactive et automatisée. (oui, on fait les choses bien ici !). Les performances peuvent être optimisées grâce à l'utilisation de l'option algorithm2 pour un traitement parallèle massif sur les grilles contenant un très grand nombre de groupes.

Syntaxe Officielle
proc cas;
simple.groupByInfo /
algorithm2=TRUE | FALSE
attributes={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}, ...}
casOut={caslib="string", compress=TRUE | FALSE, indexVars={"variable-name-1", ...}, label="string", lifetime=64-bit-integer, maxMemSize=64-bit-integer, memoryFormat="DVR" | "INHERIT" | "STANDARD", name="table-name", promote=TRUE | FALSE, replace=TRUE | FALSE, replication=integer, tableRedistUpPolicy="DEFER" | "NOREDIST" | "REBALANCE", threadBlockSize=64-bit-integer, timeStamp="string", where={"string-1", ...}}
copyVars={"variable-name-1", ...}
cumFreqName="variable-name"
details=TRUE | FALSE
divider="string"
frequencyName="variable-name"
generatedColumns={"ALL", "CUMFREQ", "F", "FREQUENCY", "GROUPID", "NONE", "POSITION"}
groupByLimit=64-bit-integer
groupbyTable={casLib="string", dataSourceOptions={...}, importOptions={...}, name="table-name", where="where-expression"}
groupIDName="variable-name"
includeDuplicates=TRUE | FALSE
includeMissing=TRUE | FALSE
inputRegEx={"string-1", ...}
inputs={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}, ...}
journalTrace=TRUE | FALSE
keyModify={"string-1", ...}
maxFrequency=64-bit-integer
maxPosition=64-bit-integer
minFrequency=64-bit-integer
minGroupsLL=64-bit-integer
minPosition=64-bit-integer
noVars=TRUE | FALSE
nSubGroupVars=integer
position=64-bit-integer
positionName="variable-name"
sparse=TRUE | FALSE
subGroupCumFreqName="variable-name"
subGroupFrequencyName="variable-name"
subGroupIDName="variable-name"
subGroupPositionName="variable-name"
table={caslib="string", computedOnDemand=TRUE | FALSE, computedVars={{...}}, computedVarsProgram="string", dataSourceOptions={...}, groupBy={{...}}, groupByMode="NOSORT" | "REDISTRIBUTE", importOptions={...}, name="table-name", orderBy={{...}}, singlePass=TRUE | FALSE, vars={{...}}, where="where-expression"};
run;
quit;

Paramètres Clés

Nom du paramètre Description
table Spécifie la table d'entrée (CASTable) contenant les données à analyser. C'est ici que l'on définit l'argument clé groupBy.
casOut Définit les paramètres de la table de sortie en mémoire CAS (nom, remplacement, promotion).
inputs Liste des variables d'entrée supplémentaires à utiliser pour l'analyse et à inclure dans la table de sortie.
generatedColumns Indique quelles colonnes techniques générées (comme FREQUENCY, GROUPID, POSITION) doivent être incluses dans le résultat.
includeDuplicates Détermine si la table de sortie doit conserver tous les enregistrements dupliqués (TRUE) ou juste une ligne par groupe (FALSE).
algorithm2 Active un algorithme alternatif optimisé pour le traitement distribué massif. Particulièrement efficace quand on a un grand nombre de groupes sur de multiples nœuds de travail.
sparse Optimise le traitement sur un serveur distribué en forçant chaque thread à ne lire que quelques groupes. Magique pour traiter des dimensions très éparses !
details Spécifie si des messages détaillés comme le nombre de groupes doivent être inscrits dans le journal (log) SAS.

Préparation des données

Chargement des données de référence

Nous allons utiliser la célèbre table sashelp.cars pour avoir une bonne base de données avec différentes catégories à grouper.

1PROC CASUTIL;
2 load DATA=sashelp.cars casout='cars' replace;
3RUN;
4QUIT;

Exemples d'utilisation

Calcul basique des identifiants et fréquences de groupes

Dans cet exemple, on regroupe simplement les véhicules par origine (Origin). L'action générera toutes les colonnes de diagnostic par défaut.

1PROC CAS;
2 SIMPLE.groupByInfo /
3 TABLE={name='cars', groupBy={'Origin'}}
4 casOut={name='cars_groupinfo', replace=True}
5 generatedColumns={'ALL'};
6RUN;
7QUIT;
Résultat Attendu :
Une table CAS nommée 'cars_groupinfo' est créée en mémoire. Elle contient les différentes origines uniques, associées à un _GroupID_, une fréquence (_Frequency_) et la position cumulée.
Utilisation avancée avec Algorithm2, filtres et nommage sur-mesure

Passons aux choses sérieuses ! On combine plusieurs colonnes de regroupement, on active l'algorithme de haute performance, et on personnalise les noms des colonnes de métadonnées pour que la table de sortie soit immédiatement présentable.

1PROC CAS;
2 SIMPLE.groupByInfo /
3 TABLE={name='cars', groupBy={'Make', 'Type'}}
4 inputs={'MSRP', 'Invoice'}
5 casOut={name='cars_detailed_info', replace=True}
6 algorithm2=True
7 includeMissing=True
8 generatedColumns={'GROUPID', 'FREQUENCY'}
9 groupIDName='Identifiant_Groupe'
10 frequencyName='Frequence_Du_Groupe'
11 details=True;
12RUN;
13QUIT;
Résultat Attendu :
La procédure exécute le regroupement de manière distribuée optimisée. Elle écrit les détails dans la log SAS et génère une table fine incluant uniquement l'identifiant et la fréquence sous les noms 'Identifiant_Groupe' et 'Frequence_Du_Groupe'.