dataPreprocess

binning

Description

L'action `dataPreprocess.binning` est un outil fondamental en préparation de données (Data Preprocessing) pour le Machine Learning. Elle permet de réaliser une discrétisation non supervisée, c'est-à-dire de transformer des variables continues en variables catégorielles (ou 'bins'). Cette technique est essentielle pour simplifier les modèles, gérer les non-linéarités et améliorer la robustesse des algorithmes face aux valeurs aberrantes (outliers).

dataPreprocess.binning result=results status=rc / binEnds={double-1, double-2, ...}, binMapping="LEFT" | "RIGHT", binMissing=TRUE | FALSE, binStarts={double-1, double-2, ...}, binWidths={double-1, double-2, ...}, casOut={caslib="string", compress=TRUE | FALSE, indexVars={"variable-name-1", "variable-name-2", ...}, 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", "string-2", ...}}, casOutBinDetails={caslib="string", compress=TRUE | FALSE, indexVars={"variable-name-1", "variable-name-2", ...}, 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", "string-2", ...}}, code={casOut={caslib="string", compress=TRUE | FALSE, indexVars={"variable-name-1", "variable-name-2", ...}, 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", "string-2", ...}}, comment=TRUE | FALSE, fmtWdth=integer, indentSize=integer, labelId=integer, lineSize=integer, noTrim=TRUE | FALSE, tabForm=TRUE | FALSE}, copyAllVars=TRUE | FALSE, copyVars={"variable-name-1", "variable-name-2", ...}, cutPoints={double-1, double-2, ...}, freq="variable-name", fuzzyCompare=double, includeInputVars=TRUE | FALSE, includeMissingGroup=TRUE | FALSE, inputs={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}, ...}, method="BUCKET" | "CUTPTS" | "QUANTILE", nBinsArray={integer-1, integer-2, ...} | integer, noDataLowerUpperBound=TRUE | FALSE, outputTableOptions={forceTableReturn=TRUE | FALSE, tableNames={"string-1", "string-2", ...}}, outVarsNamePrefix="string", outVarsNameSuffix="string", percentileDefinition=integer, percentileMaxIterations=integer, percentileTolerance=double, sasVarNameLength=TRUE | FALSE, table={caslib="string", computedOnDemand=TRUE | FALSE, computedVars={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}, ...}, computedVarsProgram="string", dataSourceOptions={key-1=any-list-or-data-type-1, key-2=any-list-or-data-type-2, ...}, groupBy={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}, ...}, groupByMode="NOSORT" | "REDISTRIBUTE", importOptions={fileType="ANY" | "AUDIO" | "AUTO" | "BASESAS" | "CSV" | "DELIMITED" | "DOCUMENT" | "DTA" | "ESP" | "EXCEL" | "FMT" | "HDAT" | "IMAGE" | "JMP" | "LASR" | "PARQUET" | "SOUND" | "SPSS" | "VIDEO" | "XLS", fileType-specific-parameters}, name="table-name", orderBy={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}, ...}, singlePass=TRUE | FALSE, vars={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}, ...}, where="where-expression", whereTable={casLib="string", dataSourceOptions={adls_noreq-parameters | bigquery-parameters | cas_noreq-parameters | clouddex-parameters | db2-parameters | dnfs-parameters | esp-parameters | fedsvr-parameters | gcs_noreq-parameters | hadoop-parameters | hana-parameters | impala-parameters | informix-parameters | jdbc-parameters | mongodb-parameters | mysql-parameters | odbc-parameters | oracle-parameters | path-parameters | postgres-parameters | redshift-parameters | s3-parameters | sapiq-parameters | sforce-parameters | singlestore_standard-parameters | snowflake-parameters | spark-parameters | spde-parameters | sqlserver-parameters | ss_noreq-parameters | teradata-parameters | vertica-parameters | yellowbrick-parameters}, importOptions={fileType="ANY" | "AUDIO" | "AUTO" | "BASESAS" | "CSV" | "DELIMITED" | "DOCUMENT" | "DTA" | "ESP" | "EXCEL" | "FMT" | "HDAT" | "IMAGE" | "JMP" | "LASR" | "PARQUET" | "SOUND" | "SPSS" | "VIDEO" | "XLS", fileType-specific-parameters}, name="table-name", vars={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}, ...}, where="where-expression"}}, weight="variable-name";
Paramètres
ParamètreDescription
binEnds Spécifie les valeurs de fin des classes. Si applicable, elles remplacent les valeurs maximales des données.
binMapping Contrôle comment mapper les valeurs qui tombent à la frontière entre des classes consécutives. 'LEFT' utilise la notation [], (], ..., (] tandis que 'RIGHT' utilise [), [), ..., [].
binMissing Lorsque défini sur True, regroupe les valeurs manquantes dans une classe distincte avec l'ID 0.
binStarts Spécifie les valeurs de début des classes. Si applicable, elles remplacent les valeurs minimales des données.
binWidths Spécifie la largeur des classes.
casOut Applique le scoring à la table d'entrée et sauvegarde les résultats dans une table de sortie CAS.
casOutBinDetails Spécifie les paramètres pour une table de sortie qui inclut des informations détaillées sur les résultats du binning.
code Spécifie les paramètres pour générer le code de scoring SAS DATA step, permettant de répliquer le binning en dehors de CAS.
copyAllVars Lorsque défini sur True, toutes les variables de la table d'entrée sont copiées dans la table de sortie scorée.
copyVars Spécifie une liste de variables à copier de la table d'entrée vers la table de sortie pour aider à l'identification des observations.
cutPoints Spécifie les points de coupe définis par l'utilisateur pour la méthode de binning 'CUTPTS'.
freq Spécifie la variable de fréquence à utiliser dans les calculs.
fuzzyCompare Spécifie le seuil de comparaison floue (epsilon) utilisé pour déterminer si des valeurs numériques sont distinctes.
includeInputVars Lorsque défini sur True, les variables d'analyse spécifiées dans le paramètre `inputs` sont incluses dans la table de sortie.
includeMissingGroup Lorsque défini sur True, les valeurs manquantes sont autorisées comme clés de regroupement (group-by).
inputs Spécifie les variables à analyser et à discrétiser.
method Spécifie la technique de binning à utiliser : 'BUCKET' (largeur égale), 'QUANTILE' (fréquence égale), ou 'CUTPTS' (points de coupe manuels).
nBinsArray Spécifie le nombre de classes à créer pour chaque variable. Peut être un entier unique (appliqué à toutes les variables) ou une liste d'entiers.
noDataLowerUpperBound Lorsque défini sur True, les bornes globales inférieure et supérieure du binset sont illimitées lors de la génération du code de scoring.
outputTableOptions Spécifie des options pour les tables de résultats, comme les noms des tables à générer.
outVarsNamePrefix Spécifie un préfixe à ajouter aux noms des nouvelles variables de binning créées.
outVarsNameSuffix Spécifie un suffixe à ajouter aux noms des nouvelles variables de binning créées.
percentileDefinition Spécifie la définition de percentile à utiliser (de 1 à 6) pour la méthode 'QUANTILE'.
percentileMaxIterations Spécifie le nombre maximum d'itérations pour le calcul des percentiles.
percentileTolerance Spécifie la tolérance pour le calcul des percentiles.
sasVarNameLength Lorsque défini sur True, la longueur des noms des variables de sortie est contrainte à 32 caractères ou moins, conformément aux conventions SAS.
table Spécifie la table d'entrée à traiter.
weight Spécifie la variable de pondération à utiliser dans les calculs.
Préparation des Données Voir la fiche de ce code dataprep
Création des données de test

Ce bloc DATA step crée une table simple nommée `sample_data` dans la caslib `mycas`. Cette table contient une variable `value` avec des nombres de 1 à 100, plus quelques valeurs manquantes, qui servira d'entrée pour les exemples de binning.

Copié !
1DATA mycas.sample_data;
2 DO i = 1 to 100;
3 value = i;
4 OUTPUT;
5 END;
6 DO i = 1 to 5;
7 value = .;
8 OUTPUT;
9 END;
10RUN;

Exemples

Ceci est l'utilisation la plus simple. L'action divise la variable `value` en 5 classes de largeur égale. Une nouvelle table `binned_data` est créée avec la variable `bin_value` contenant le numéro de la classe.

Code SAS® / CAS Code en attente de validation par la communauté
Copié !
1PROC CAS;
2 dataPreprocess.binning
3 TABLE={name='sample_data', caslib='mycas'},
4 inputs={{name='value'}},
5 method='BUCKET',
6 nBinsArray=5,
7 casOut={name='binned_data', caslib='mycas', replace=true};
8RUN;
Résultat :
Une table `binned_data` est créée dans la caslib `mycas`. Elle contient les données originales plus une nouvelle colonne `bin_value` qui assigne chaque observation à l'une des 5 classes.

Cette méthode crée des classes contenant approximativement le même nombre d'observations. Ici, nous créons 4 classes (quartiles) pour la variable `value`.

Code SAS® / CAS Code en attente de validation par la communauté
Copié !
1PROC CAS;
2 dataPreprocess.binning
3 TABLE={name='sample_data', caslib='mycas'},
4 inputs={{name='value'}},
5 method='QUANTILE',
6 nBinsArray=4,
7 casOut={name='binned_quantile', caslib='mycas', replace=true};
8RUN;
Résultat :
Une table `binned_quantile` est créée. La colonne `bin_value` contiendra les numéros de quartile (1 à 4) pour chaque observation.

Cette méthode permet de définir manuellement les frontières des classes. Utile pour appliquer une logique métier spécifique. Ici, nous définissons les classes 0-25, 26-50, 51-75, 76-100.

Code SAS® / CAS Code en attente de validation par la communauté
Copié !
1PROC CAS;
2 dataPreprocess.binning
3 TABLE={name='sample_data', caslib='mycas'},
4 inputs={{name='value'}},
5 method='CUTPTS',
6 cutPoints={25, 50, 75},
7 casOut={name='binned_cutpoints', caslib='mycas', replace=true};
8RUN;
Résultat :
Une table `binned_cutpoints` est créée. La colonne `bin_value` reflétera les classes définies manuellement : 1 pour les valeurs <= 25, 2 pour les valeurs > 25 et <= 50, etc.

Cet exemple montre comment isoler les valeurs manquantes dans leur propre classe (`binMissing=TRUE`) et comment personnaliser les noms des variables de sortie avec un préfixe et un suffixe.

Code SAS® / CAS Code en attente de validation par la communauté
Copié !
1PROC CAS;
2 dataPreprocess.binning
3 TABLE={name='sample_data', caslib='mycas'},
4 inputs={{name='value'}},
5 method='BUCKET',
6 nBinsArray=10,
7 binMissing=TRUE,
8 outVarsNamePrefix='DISC',
9 outVarsNameSuffix='_V1',
10 casOut={name='binned_missing', caslib='mycas', replace=true},
11 casOutBinDetails={name='bin_details', caslib='mycas', replace=true};
12RUN;
Résultat :
Une table `binned_missing` est créée avec une nouvelle colonne nommée `DISC_value_V1`. Les valeurs manquantes de `value` seront assignées à la classe 0. Une seconde table `bin_details` est également créée, contenant les métadonnées sur les classes (bornes, fréquences, etc.).

FAQ

À quoi sert l'action `binning` ?
Quelles sont les principales méthodes de binning disponibles ?
Comment sont gérées les valeurs manquantes ?
Comment spécifier le nombre d'intervalles (bins) ?
Comment sauvegarder les données transformées dans une nouvelle table ?
Est-il possible de générer du code SAS pour appliquer ce binning sur d'autres données ?

Scénarios associés

Cas d'usage
Scénario Standard : Segmentation Client pour une Campagne Marketing

Une équipe marketing souhaite transformer des variables démographiques continues (âge, revenu) en groupes catégoriels pour construire un modèle de ciblage. L'objectif est de cré...

Cas d'usage
Scénario Performance : Analyse de Risque sur un Grand Volume de Transactions

Une institution financière doit analyser des millions de transactions pour identifier des anomalies. Le montant de chaque transaction doit être discrétisé en 1000 petits interva...

Cas d'usage
Scénario Cas Limite : Nettoyage de Données Cliniques avec Valeurs Manquantes

Un data scientist prépare des données pour une étude clinique. La variable 'TAUX_CHOLESTEROL' est incomplète et doit être catégorisée selon des seuils cliniques précis (Normal, ...