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
binEndsSpécifie les valeurs de fin des classes. Si applicable, elles remplacent les valeurs maximales des données.
binMappingContrôle comment mapper les valeurs qui tombent à la frontière entre des classes consécutives. 'LEFT' utilise la notation [], (], ..., (] tandis que 'RIGHT' utilise [), [), ..., [].
binMissingLorsque défini sur True, regroupe les valeurs manquantes dans une classe distincte avec l'ID 0.
binStartsSpécifie les valeurs de début des classes. Si applicable, elles remplacent les valeurs minimales des données.
binWidthsSpécifie la largeur des classes.
casOutApplique le scoring à la table d'entrée et sauvegarde les résultats dans une table de sortie CAS.
casOutBinDetailsSpécifie les paramètres pour une table de sortie qui inclut des informations détaillées sur les résultats du binning.
codeSpé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.
copyAllVarsLorsque défini sur True, toutes les variables de la table d'entrée sont copiées dans la table de sortie scorée.
copyVarsSpécifie une liste de variables à copier de la table d'entrée vers la table de sortie pour aider à l'identification des observations.
cutPointsSpécifie les points de coupe définis par l'utilisateur pour la méthode de binning 'CUTPTS'.
freqSpécifie la variable de fréquence à utiliser dans les calculs.
fuzzyCompareSpécifie le seuil de comparaison floue (epsilon) utilisé pour déterminer si des valeurs numériques sont distinctes.
includeInputVarsLorsque défini sur True, les variables d'analyse spécifiées dans le paramètre `inputs` sont incluses dans la table de sortie.
includeMissingGroupLorsque défini sur True, les valeurs manquantes sont autorisées comme clés de regroupement (group-by).
inputsSpécifie les variables à analyser et à discrétiser.
methodSpécifie la technique de binning à utiliser : 'BUCKET' (largeur égale), 'QUANTILE' (fréquence égale), ou 'CUTPTS' (points de coupe manuels).
nBinsArraySpécifie le nombre de classes à créer pour chaque variable. Peut être un entier unique (appliqué à toutes les variables) ou une liste d'entiers.
noDataLowerUpperBoundLorsque 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.
outputTableOptionsSpécifie des options pour les tables de résultats, comme les noms des tables à générer.
outVarsNamePrefixSpécifie un préfixe à ajouter aux noms des nouvelles variables de binning créées.
outVarsNameSuffixSpécifie un suffixe à ajouter aux noms des nouvelles variables de binning créées.
percentileDefinitionSpécifie la définition de percentile à utiliser (de 1 à 6) pour la méthode 'QUANTILE'.
percentileMaxIterationsSpécifie le nombre maximum d'itérations pour le calcul des percentiles.
percentileToleranceSpécifie la tolérance pour le calcul des percentiles.
sasVarNameLengthLorsque défini sur True, la longueur des noms des variables de sortie est contrainte à 32 caractères ou moins, conformément aux conventions SAS.
tableSpécifie la table d'entrée à traiter.
weightSpé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, ...