Comment puis-je exclure automatiquement les lignes contenant des valeurs aberrantes identifiées par la fonction "Explorer les valeurs aberrantes" ?Bonjour à tous,
Je cherche à reproduire ce que je fais manuellement dans le script JSL.
Je sais comment exécuter la fonction "Explore Outliers" dans JSL mais je dois encore sélectionner manuellement les lignes avec des valeurs aberrantes identifiées par "Explore Outliers" puis appuyer sur "select rows" puis appuyer sur "exclude".
J'essaie de créer un script que j'exécute et exclut automatiquement les valeurs aberrantes identifiées sans que j'aie à faire autre chose (idéalement, n'ouvre même pas la fenêtre Explorer les valeurs aberrantes.
Quelqu'un a une idée?
Merci!
Automatisation et scriptFusion et nettoyage des donnéesRe : Comment puis-je exclure automatiquement les lignes contenant des valeurs aberrantes identifiées par la fonction "Explorer les valeurs aberrantes" ?Vous avez fait une erreur très courante.La première fois que tu cours
el = Explore Outliers(
il pointe vers la table de données "dt". Cependant, au moment de la deuxième exécution, vous avez créé une nouvelle table de données "dtQuant", qui n'est pas la table de données actuelle à la connaissance de JMP.Et bien sûr, il ne trouvera pas de valeurs aberrantes.Pour résoudre ce problème, il vous suffit de forcer JMP à s'assurer qu'il pointe vers la bonne table de données.
el = dt << Explore Outliers(
Sur un autre sujet, l'utilisation de "j" comme nom de variable peut parfois entraîner des problèmes.JMP a une fonction appelée j.Même si vous pouvez avoir une variable appelée j, cela peut compliquer la lecture du code.
Re : Comment puis-je exclure automatiquement les lignes contenant des valeurs aberrantes identifiées par la fonction "Explorer les valeurs aberrantes" ?J'ai cassé le code pendant que j'essayais de déboguer. Il semble que le problème soit que sur la deuxième boucle, il est incapable de sauvegarder les limites des valeurs aberrantes de la plage des quantiles.
Dans le journal, il est écrit "
Cette clause Where pour la table de données "Quantile Outlier Limits" n'a généré aucune ligne : dt:Grade == grades[j]"
Cependant, je sais que chaque grade de cette liste a des limites et existe. Je l'ai vérifié en commençant à différentes valeurs de J et cela fonctionne toujours sur la première boucle puis se bloque sur la 2ème boucle. Je suppose que cela a quelque chose à voir avec la façon dont je stocke les données dans la variable el ?
Names Default to here(1);
dt = current data table();
// Determine grades to loop through
dt1 = dt << summary(Group(:Grade));
dt1 << select where ( :Grade == "");
dt1 << delete rows;
dt1 << select where ( :Grade == "Check input");
dt1 << delete rows;
grades = dt1:Grade << get values;
Close (dt1, nosave);
For (j = 3, j<= N items ( grades ), J++,
show(grades[j]);
el = Explore Outliers(
Y( dt:Hardness, dt:UTS, dt:M100, dt:Elongation, dt:LCR, dt:Prof, dt:SG ),
Tail Quantile( 0.25 ),
Show only columns with outliers( 1 ),
Quantile Range Outliers,
Where( dt:Grade == grades[j]);
);
show (el);
dtQuant = el << Save Quantile Outlier Limits;
Report(el)<< close window;
);
Re : Comment puis-je exclure automatiquement les lignes contenant des valeurs aberrantes identifiées par la fonction "Explorer les valeurs aberrantes" ?Sans voir votre code, je ne peux que deviner quel est le problème.Il semble que vous ayez ajouté une colonne dans votre tableau de données, qui contient les colonnes sur lesquelles vous souhaitez baser votre analyse des valeurs aberrantes.Si je devine correctement, voici une modification de mon script précédent, qui a une nouvelle colonne ajoutée à la table de données, qui contient les colonnes à analyser.Le script lit les colonnes à analyser à partir de la colonne, puis utilise ces noms de colonne pour limiter les colonnes à évaluer
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Water Treatment.jmp" );
// Create a new column with the names of the columns to be used
// in the analysis
dt << New Column( "theColumns",
character,
set values(
{"Q-E", "ZN-E", "PH-E", "DBO-E", "DQO-E", "SS-E", "SSV-E", "SED-E", "COND-E", "PH-P", "DBO-P", "SS-P",
"SSV-P", "SED-P", "COND-P", "PH-D", "DBO-D", "DQO-D", "SS-D", "SSV-D", "SED-D", "COND-D", "PH-S"}
)
);
// Get the list of columns from the column that contains
// the columns to be analyzed
colNames = dt:theColumns << get values;
// Get rid of entries that have blank/null values
For( i = N Items( colNames ), i >= 1, i--,
If( colNames[i] == "",
Remove From( colNames, i, 1 )
)
);
// Run the analysis using the list of column extracted from the
// "theColumns" column
el = Explore Outliers(
Y( Eval( colNames ) ),
Quantile Range Outliers,
);
dtQuant = el << Save Quantile Outlier Limits;
dtQuant << show window( 0 );
Report( el ) << close window;
// Get rid of non involved columns
dtQuant << select where( :Number of Outliers == 0 );
dtQuant << delete rows;
// Loop through the remaining rows and set the affected rows in the dt table to selected
dt << clear row states;
For( i = 1, i <= N Rows( dtQuant ), i++,
dt << select where(
As Column( dt, dtQuant:Column[i] ) <= dtQuant:Low Threshold[i] | As Column( dt, dtQuant:Column[i] )
>= dtQuant:High Threshold[i],
current selection( "extend" )
)
);
// Hide and exclude the rows
dt << hide and exclude;
// Close the no longer needed data table
Close( dtQuant, nosave );Re : Comment puis-je exclure automatiquement les lignes contenant des valeurs aberrantes identifiées par la fonction "Explorer les valeurs aberrantes" ?Merci @txnelson pour la résolution.
J'ai essayé de le modifier afin de pouvoir boucler l'intégralité du code dans une liste de variables d'une colonne afin d'utiliser les valeurs aberrantes de la plage quantile avec une fonction "où" supplémentaire.
La boucle semble planter, ne pouvant pas enregistrer les limites des quantiles aberrants indiquant que l'objet n'est pas scriptable. Des idées?Re : Comment puis-je exclure automatiquement les lignes contenant des valeurs aberrantes identifiées par la fonction "Explorer les valeurs aberrantes" ?En plus de @txnelson , vous pourriez trouver quelque chose dans ce fil .
Re : Comment puis-je exclure automatiquement les lignes contenant des valeurs aberrantes identifiées par la fonction "Explorer les valeurs aberrantes" ?Oui, tu as raison, désolé pour cet oubli de ma part.Re : Comment puis-je exclure automatiquement les lignes contenant des valeurs aberrantes identifiées par la fonction "Explorer les valeurs aberrantes" ?@SDF1 la demande est pour Explore Outliers, pas Explore Missing
@JC7
Voici un exemple que j'ai travaillé qui utilise l'exemple de table de données de traitement de l'eau et masque et exclut toutes les lignes trouvées pour que toutes les colonnes aient été trouvées comme valeurs aberrantes.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Water Treatment.jmp" );
el = Explore Outliers(
Y(
:Name( "Q-E" ),
:Name( "ZN-E" ),
:Name( "PH-E" ),
:Name( "DBO-E" ),
:Name( "DQO-E" ),
:Name( "SS-E" ),
:Name( "SSV-E" ),
:Name( "SED-E" ),
:Name( "COND-E" ),
:Name( "PH-P" ),
:Name( "DBO-P" ),
:Name( "SS-P" ),
:Name( "SSV-P" ),
:Name( "SED-P" ),
:Name( "COND-P" ),
:Name( "PH-D" ),
:Name( "DBO-D" ),
:Name( "DQO-D" ),
:Name( "SS-D" ),
:Name( "SSV-D" ),
:Name( "SED-D" ),
:Name( "COND-D" ),
:Name( "PH-S" ),
:Name( "DBO-S" ),
:Name( "DQO-S" ),
:Name( "SS-S" ),
:Name( "SSV-S" ),
:Name( "SED-S" ),
:Name( "COND-S" ),
:Name( "RD-DBO-P" ),
:Name( "RD-SS-P" ),
:Name( "RD-SED-P" ),
:Name( "RD-DBO-S" ),
:Name( "RD-DQO-S" ),
:Name( "RD-DBO-G" ),
:Name( "RD-DQO-G" ),
:Name( "RD-SS-G" ),
:Name( "RD-SED-G" )
),
Quantile Range Outliers,
);
dtQuant = el << Save Quantile Outlier Limits;
dtQuant << show window( 0 );
Report( el ) << close window;
// Get rid of non involved columns
dtQuant << select where( :Number of Outliers == 0 );
dtQuant << delete rows;
// Loop through the remaining rows and set the affected rows in the dt table to selected
dt << clear row states;
For( i = 1, i <= N Rows( dtQuant ), i++,
dt << select where(
As Column( dt, dtQuant:Column[i] ) <= dtQuant:Low Threshold[i] | As Column( dt, dtQuant:Column[i] )
>= dtQuant:High Threshold[i],
current selection( "extend" )
)
);
// Hide and exclude the rows
dt << hide and exclude;
// Close the no longer needed data table
Close( dtQuant, nosave );
Re : Comment puis-je exclure automatiquement les lignes contenant des valeurs aberrantes identifiées par la fonction "Explorer les valeurs aberrantes" ?Salut @JC7 ,
Cela devrait être assez facile de suivre quelque chose comme ceci :
Names Default To Here( 1 );
dt = Current Data Table();
colnames = dt << Get column Names();
obj = dt << Explore Missing Values( Y( Eval( colnames ) ) );
obj << select rows( Eval( colnames ) );
DS
Re : Comment puis-je exclure automatiquement les lignes contenant des valeurs aberrantes identifiées par la fonction "Explorer les valeurs aberrantes" ?J'utilise la méthode des valeurs aberrantes de la gamme quantile - désolé j'ai oublié de le dire dans le message d'origine!Re : Comment puis-je exclure automatiquement les lignes contenant des valeurs aberrantes identifiées par la fonction "Explorer les valeurs aberrantes" ?Quelle méthode de valeurs aberrantes sélectionnez-vous lorsque vous exécutez Explorer les valeurs aberrantes ? Il apparaît que différentes solutions peuvent être requises pour les différentes méthodes.