Re : Comment exclure des lignes jusqu'à ce que la moyenne de distribution réponde à un critère ?Salut @Néo ,
Votre objectif est-il de placer spécifiquement ces moyens dans les limites de contrôle, ou recherchez-vous un moyen automatisé de nettoyer votre ensemble de données ?Dans ce dernier cas, vous pouvez envisager la plateforme Explorer les valeurs aberrantes dans le menu Analyser > Dépistage.J'utilise fréquemment les valeurs aberrantes de la plage quantile, et les valeurs aberrantes Robust PCA sont très similaires à ce que je fais habituellement au sein de la plate-forme PCA.
Si vous essayez spécifiquement de trouver un ensemble de sites (il n'y en a que 5 ?) ou des lignes qui satisfont à la condition où ils se situent tous dans la moyenne, alors je commencerais probablement par une analyse multivariée afin de trouver les lignes qui ont des valeurs extrêmes. dans plusieurs colonnes d'abord.
Re : Comment exclure des lignes jusqu'à ce que la moyenne de distribution réponde à un critère ?@ih
L'objectif est d'obtenir la moyenne à l'intérieur des limites de spécification pour tous les paramètres concernés et non d'explorer les valeurs aberrantes.
Oui, dans cet exemple, il y a 5 sites par lot/plaquette (> 1 000 dans mon cas actuel) mais je n'ai pas pu trouver de meilleur exemple dans les exemples de données JMP.
Je vais jeter un œil à l'analyse multivariée (je ne comprends pas pourquoi j'ai besoin de regarder plusieurs colonnes ensemble, mais je suppose que je le ferai lorsque je regarderai la plate-forme multivariée).
Re : Comment exclure des lignes jusqu'à ce que la moyenne de distribution réponde à un critère ?Êtes-vous d’accord avec des situations comme celle-ci ? La moyenne se situe toujours entre les limites des spécifications, même s'il n'y a pas un seul résultat dans la spécification.


Re : Comment exclure des lignes jusqu'à ce que la moyenne de distribution réponde à un critère ?@jthi Merci d'avoir signalé l'un des cas possibles qui satisfait à l'exigence mais pas à l'objectif. Je ne comprends pas le tableau d'analyse Oneway mais la réponse est Non pour le diagramme de distribution. Dans mon exemple, j'ai des lignes dans la distribution mais vous avez raison de signaler une possibilité.
L'objectif est d'amener la moyenne d'une distribution à l'intérieur des limites de spécification en filtrant (Sites/Wafer dans mon exemple de cas) en commençant par les extrêmes de la distribution. En faisant cela manuellement, j'ai exclu les lignes (sites) commençant à l'extrême de distribution du côté où la moyenne était en dehors de la limite de spécification et, comme mentionné ci-dessus, j'ai dû revenir aux paramètres analysés précédemment, car le filtrage des sites sur les paramètres suivants entraînait le résultat. moyenne des paramètres précédemment analysés sortant des limites des spécifications.
Comment exclure des lignes jusqu'à ce que la moyenne de distribution réponde à un critère ?Vous trouverez ci-dessous un exemple similaire à mon cas réel dans lequel je voudrais exclure les SITE jusqu'à ce que la moyenne de distribution de chaque paramètre (uniquement les cas tracés ci-dessous) tombe dans leurs limites de spécifications respectives.
Les sites/plaquettes à exclure partent de l'extrême de distribution du côté où la moyenne est en dehors de la limite de spécification (LSL ou USL).
Je pense que l'on pourrait commencer avec n'importe quel paramètre, supprimer les sites de l'extrême de distribution jusqu'à ce que la moyenne recalculée soit >=LSL ou <= USL pour ce paramètre, puis passer au paramètre suivant et vérifier et exclure les sites si nécessaire.
Comment aborder ce problème avec JSL ?
Existe-t-il une plateforme JMP qui pourrait déjà faire cela, par exemple le contrôle de processus ?
Ce qui suit donne
Names Default To Here( 1 );
Clear Log();
dt = Open( "$sample_data\Semiconductor Capability.jmp" );
obj = dt << Manage Spec Limits( Y( dt << Get Column Group( "Processes" ) ), Show Limits All, Save to Column Properties(1), );
obj << close window;
dist = Distribution(Stack( 0 ),
Continuous Distribution(Column( :IVP2 ), Outlier Box Plot( 0 ), Process Capability( 0 ) ),
Continuous Distribution(Column( :NPN4 ), Outlier Box Plot( 0 ), Process Capability( 0 ) ),
Continuous Distribution(Column( :IVP7 ), Outlier Box Plot( 0 ), Process Capability( 0 ) ),
Continuous Distribution(Column( :PLY1 ), Outlier Box Plot( 0 ), Process Capability( 0 ) ),
Continuous Distribution(Column( :VIA1 ), Outlier Box Plot( 0 ), Process Capability( 0 ) ),
Continuous Distribution(Column( :M1_M1 ), Outlier Box Plot( 0 ), Process Capability( 0 ) )
);

tandis que le résultat final souhaité peut ressembler à quelque chose comme (filtrage effectué manuellement, le tracé ci-dessous est une fois terminé pour toutes les tranches).

Le fait de filtrer les SITE à l'aide de la recette ci-dessus est susceptible de faire sortir la moyenne des paramètres analysés précédemment hors de leurs limites de spécifications. C'est de toute façon ce que j'ai remarqué en faisant l'exercice manuellement.Il faudra peut-être boucler la recette, par exemple 5 fois, sur les paramètres pour une vérification ou jusqu'à ce que tous les SITES aient été filtrés. C'est ce que j'aimerais savoir de cet exercice. J'apprécierais de l'aide sur la façon de procéder.
Une fois vérifiés et effectués pour tous les paramètres, les SITES exclus doivent être étiquetés comme exclus dans une nouvelle colonne (et rester comme non exclus).
Automatisation et scriptsles fenêtresRe : Comment exclure des lignes jusqu'à ce que la moyenne de distribution réponde à un critère ?@jthi Vous trouverez ci-dessous un squelette de script d'exécution à sec qui semble fonctionner comme je le souhaite. Ce n'est qu'un seul paramètre choisi maintenant (il faudra répéter pour un autre paramètre).J'ai du mal à placer les étapes dans la bonne boucle.
J'ai les étapes par étapes ci-dessous (deux présentées ci-dessous sous forme de texte commenté) que je dois exécuter pour chaque tranche jusqu'à ce que l'instruction if éclate (il pourrait y avoir une meilleure façon de le faire, par exemple en utilisant While(), mais c'est ce que j'ai jusqu'à présent). J'ai besoin d'aide sur les points suivants
- Comment boucler les tâches afin que le min/max et la moyenne par tranche soient utilisés pour la recette et non les valeurs correspondantes pour toute la colonne de paramètres.
- Une fois que j'ai fait cela pour une colonne de paramètres, j'aimerais passer à la suivante (par exemple, un total de 6 dans le message d'origine). Comment faire cela automatiquement via JSL ?
Names Default To Here( 1 );
Clear Log();
dt = Open( "$sample_data\Semiconductor Capability.jmp" ); // get data table
//get spec limits into column properties
obj = dt << Manage Spec Limits( Y( dt << Get Column Group( "Processes" ) ), Show Limits All, Save to Column Properties(1));
obj << close window; // close Manage Spec Limits window
dt << clear row states(); // clear any excluded or hidden rows
colName = "IVP7"; // choose column to operate on
specs = dt:colName << get property("spec limits"); //get spec limits for chosen column
_LSL = specs["LSL"]; //show (lsl); // get LSL
_USL = specs["USL"]; //show (usl); // get USL
/////// Stage 1 Start //////
colMean = Col Mean(dt:colName); show (colMean); // get col mean
colMin = Col Minimum(dt:colName); show (colMin); // get col min
colMax = Col Maximum (dt:colName); show (colMax); // get col max
del_LSL = _LSL - colMean; show (del_LSL); // get delta of mean wrt to LSL, +ve if colMean < LSL
del_USL = _USL - colMean; show (del_USL); // get delta of mean wrt to USL, -ve if colMean > USL
if (del_LSL >0, dt << select where( dt:colName == colMin)<< Hide and Exclude, // hide and exclude colMin
del_USL <0, dt << select where( dt:colName == colMax)<< Hide and Exclude, // hide and exclude colMax
break () // break if del_LSL<=0 or if del_USL >=0
);
/////// Stage 1 End/////
/////// Stage 2 Start //////
colMeanNew = Col Mean( If( Excluded(Row State(Row())), ., dt:colName ) ); show (colMeanNew);
colMinNew = Col Minimum( If( Excluded(Row State(Row())), ., dt:colName ) ); show (colMinNew);
colMaxNew = Col Maximum( If( Excluded(Row State(Row())), ., dt:colName ) ); show (colMaxNew);
del_LSL_New = _LSL - colMeanNew; show (del_LSL); // get new delta of mean wrt to LSL, +ve if colMean < LSL
del_USL_New = _USL - colMeanNew; show (del_USL); // get new delta of mean wrt to USL, -ve if colMean > USL
if (del_LSL_New >0, dt << select where( dt:colName == colMinNew)<< Hide and Exclude, // hide and exclude colMin
del_USL_New <0, dt << select where( dt:colName == colMaxNew)<< Hide and Exclude, // hide and exclude colMax
break () // break if del_LSL<=0 or if del_USL >=0
);
/////// Stage 2 End //////
/////// Stage 3 Start and so on//////
colMeanNew2 = Col Mean( If( Excluded( Row State(Row())), ., dt:colName ) ); show (colMeanNew2);
colMinNew2 = Col Minimum( If( Excluded( Row State(Row())), ., dt:colName ) ); show (colMinNew2);
colMaxNew2 = Col Maximum( If( Excluded( Row State(Row())), ., dt:colName ) ); show (colMaxNew2);
Re : Comment exclure des lignes jusqu'à ce que la moyenne de distribution réponde à un critère ?Créez une expression/fonction pour effectuer vos exclusions. Obtenez ensuite la liste des colonnes qui vous intéressent et parcourez-les une par une. Je n'ai pas vérifié que cela fonctionnait correctement
Names Default To Here(1);
Clear Log();
dt = Open("$sample_data\Semiconductor Capability.jmp");
dt << clear row states();
obj = dt << Manage Spec Limits(
Y(dt << Get Column Group("Processes")),
Show Limits All,
Save to Column Properties(1)
);
obj << close window;
expr_exclude_rows = Expr(
Summarize(dt, colMean = Mean(dt:colName), colMin = Min(dt:colName), colMax = Max(dt:colName));
del_LSL = _LSL - colMean;
del_USL = _USL - colMean;
If(del_LSL > 0,
dt << select where(dt:colName == colMin) << Hide and Exclude;
);
If(del_USL < 0,
dt << select where(dt:colName == colMax) << Hide and Exclude;
);
If(N Items(dt << Get Selected Rows) < 1,
continue_clean = 0;
);
dt << Clear Select;
);
dt << Show Window(0);
dt << Begin Data Update;
duration = 0;
cols_of_interest = {"IVP7"};
For Each({colName}, cols_of_interest,
start = Tick Seconds();
specs = dt:colName << get property("spec limits");
_LSL = specs["LSL"];
_USL = specs["USL"];
continue_clean = 1;
While(continue_clean,
expr_exclude_rows;
);
end = Tick Seconds();
cur_dur = end - start;
duration += cur_dur;
Write("colName: ", colName, " took ", Round(cur_dur, 2), " seconds.\!N");
);
dt << End Data Update;
dt << Show Window(1);
total_end = Tick Seconds();
rows_excluded = dt << Get Excluded Rows;
Write("Total run time for ", N Items(cols_of_interest), " columns was " , Round(duration, 2), " seconds with ", N items(rows_excluded), " rows excluded\!N");Re : Comment exclure des lignes jusqu'à ce que la moyenne de distribution réponde à un critère ?@jthi Merci. L'élément clé qui me manquait dans mes tentatives de Alors que la boucle est
If(N Items(dt << Get Selected Rows) < 1,
continue_clean = 0;
);
dt << Clear Select;
donc ça ne fonctionnait pas comme prévu.
Je l'ai maintenant testé et modifié pour qu'il fonctionne pour plusieurs colonnes de paramètres suivant votre script. Encore quelques tests nécessaires, mais je pense que cela fonctionne comme requis.
Ce que je dois faire ensuite, répéter cette analyse pour chaque Tranche . Actuellement, le script s'exécute sur toutes les lignes de la table de données pour la colonne de paramètres choisie. Je ne sais pas comment limiter l'analyse à une plaquette avant de passer à la suivante.
L'objectif final est d'obtenir le nombre de lignes exclues par tranche (peut-être que l'ajout d'une nouvelle colonne comme ExcludeRows & set = 1 dans le tableau de données dans le cadre de l'analyse pourrait être utile)
Mais avant de demander des instructions sur la façon de créer un script pour répéter l'analyse par Tranche .
Re : Comment exclure des lignes jusqu'à ce que la moyenne de distribution réponde à un critère ?Compte tenu de l'analyse que vous effectuez, je pense que le moyen le plus efficace d'exécuter chaque tranche est de sous-ensembler la table de données en tables de données distinctes pour chaque tranche.Ensuite, vous parcourez simplement les tables les unes après les autres.
Re : Comment exclure des lignes jusqu'à ce que la moyenne de distribution réponde à un critère ?@txnelson D'accord. Merci, je sais comment créer un sous-ensemble par tranche (dans mon cas actuel, cela générera> 100 données de tranche) mais je ne sais pas comment créer un script pour exécuter l'analyse tranche par tranche, une fois que j'ai des données de tranche séparées. Puis-je avoir des indications s'il vous plaît ?
Re : Comment exclure des lignes jusqu'à ce que la moyenne de distribution réponde à un critère ?Voici une illustration de la façon de l'exécuter séparément pour chaque tranche.j'utilise @jthi exemple de code.Je l'ai modifié pour créer des tables de données pour chaque plaquette, puis pour exécuter le code sur chaque table de données.À des fins d'illustration, j'ai supprimé toutes les données des plaquettes, à l'exception des plaquettes 1 et 2.
Names Default To Here( 1 );
Clear Log();
dtAll = Open( "$sample_data\Semiconductor Capability.jmp" );
dtAll << clear row states();
obj = dtAll << Manage Spec Limits(
Y( dtAll << Get Column Group( "Processes" ) ),
Show Limits All,
Save to Column Properties( 1 )
);
obj << close window;
Window( "Consistency Problem" ) << close window;
// For illustration remove all data except for wafers 1 & 2
dtAll << select where( :wafer > 2 );
dtAll << delete rows;
expr_exclude_rows = Expr(
Summarize( dt, colMean = Mean( dt:colName ), colMin = Min( dt:colName ), colMax = Max( dt:colName ) );
del_LSL = _LSL - colMean;
del_USL = _USL - colMean;
If( del_LSL > 0,
dt << select where( dt:colName == colMin ) << Hide and Exclude
);
If( del_USL < 0,
dt << select where( dt:colName == colMax ) << Hide and Exclude
);
If( N Items( dt << Get Selected Rows ) < 1,
continue_clean = 0
);
dt << Clear Select;
);
// Create all data tables based on wafer
dtList = dtAll << Subset( By( :wafer ), All rows, Selected columns only( 0 ) );
// Run the analysis for each data table
For Each( {dt}, dtList,
dt << Show Window( 0 );
dt << Begin Data Update;
duration = 0;
cols_of_interest = {"IVP7"};
For Each( {colName}, cols_of_interest,
start = Tick Seconds();
specs = dt:colName << get property( "spec limits" );
_LSL = specs["LSL"];
_USL = specs["USL"];
continue_clean = 1;
While( continue_clean, expr_exclude_rows );
end = Tick Seconds();
cur_dur = end - start;
duration += cur_dur;
Write( "colName: ", colName, " took ", Round( cur_dur, 2 ), " seconds.\!N" );
);
dt << End Data Update;
dt << Show Window( 1 );
total_end = Tick Seconds();
rows_excluded = dt << Get Excluded Rows;
Write(
"Total run time for ",
N Items( cols_of_interest ),
" columns was ",
Round( duration, 2 ),
" seconds with ",
N Items( rows_excluded ),
" rows excluded\!N"
);
);