Re: 分布平均が基準を満たすまで行を除外するにはどうすればよいですか?こんにちは@ネオ、
目標は、これらの手段を特に管理限界内に収めることですか? それとも、データセットをクリーンアップする自動化された方法を探していますか?後者の場合は、[分析] > [スクリーニング] メニューの [外れ値の探索] プラットフォームを検討してください。私は分位範囲の外れ値を頻繁に使用しますが、ロバスト PCA 外れ値は、PCA プラットフォーム内で通常行うものと非常によく似ています。
特に、一連のサイト (5 つしかない?) またはすべてが平均値内にあるという条件を満たす行を見つけようとしている場合は、極値を持つ行を見つけるために多変量解析から始めることになるでしょう。最初に複数の列で。
Re: 分布平均が基準を満たすまで行を除外するにはどうすればよいですか?@ih
目標は、関係するすべてのパラメータの仕様制限内の平均値を取得することであり、外れ値を調査することではありません。
はい、この例ではロット/ウェーハごとに 5 つのサイトがあります (実際のケースでは 1000 を超えています)。しかし、JMP のサンプル データにはこれより良い例が見つかりませんでした。
多変量分析について見ていきます (なぜ複数の列を一緒に見る必要があるのかわかりませんが、多変量プラットフォームを見るときにそうするでしょう)。
Re: 分布平均が基準を満たすまで行を除外するにはどうすればよいですか?このような状況でも大丈夫ですか? 仕様内の結果が 1 つも存在しないにもかかわらず、平均は依然として仕様の制限内にあります


Re: 分布平均が基準を満たすまで行を除外するにはどうすればよいですか?@jthi要件は満たしているが目的は満たしていない可能性のあるケースの 1 つをご指摘いただきありがとうございます。 一方向分析チャートがわかりませんが、答えは次のとおりです。いいえ分布図の場合。 私の例では、分布内に行が含まれていますが、可能性を指摘したのは正しいです。
目標は、分布の極端な部分からフィルタリングして (この例ではサイト/ウェーハ)、分布の平均をスペック制限内に収めることです。 これを手動で実行している間、平均が仕様制限の外側にある側の分布の極値から始まる行 (サイト) を除外しました。前述したように、後続のパラメーターでサイトをフィルターで除外すると、以前に分析したパラメーターに戻る必要がありました。以前に分析されたパラメータの平均値が仕様限界を超えています。
分布平均が基準を満たすまで行を除外するにはどうすればよいですか?以下は、実際のケースに似た例で、各パラメータの分布平均 (以下にプロットされたケースのみ) がそれぞれの仕様制限内に収まるまで SITE を除外したいと考えています。
除外されるサイト/ウェーハは、平均が仕様限界 (LSL または USL) の外側にある側の分布の極値から始まります。
任意のパラメーターから開始し、再計算された平均がそのパラメーターの >=LSL または <= USL になるまで分布の極値からサイトを削除し、その後次のパラメーターに移動して、必要に応じてサイトをチェックして除外することができると思います。
JSL でこの問題にどのように対処すればよいでしょうか?
プロセススクリーニングなど、これをすでに実行できるJMPプラットフォームはありますか?
以下は
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 ) )
);

一方、望ましい最終結果は次のようになります (フィルタリングは手動で行われ、以下のプロットはすべてのウェーハに対して行われた場合です)。

上記のレシピを使用して SITE をフィルタリングする行為により、以前に分析されたパラメータの平均が仕様限界を超えてしまう可能性があります。 とにかく手動で演習を行っているときに気づいたのがこれです。チェックのために、またはすべての SITE がフィルターで除外されるまで、レシピをパラメーターに対して 5 回ループする必要がある場合があります。 これがこの演習から私が知りたいことです。 今後の進め方についてアドバイスをいただければ幸いです。
すべてのパラメータをチェックして完了したら、除外された SITE を新しい列で除外としてタグ付けする必要があります (除外されないとして残ります)。
自動化とスクリプト作成ウィンドウズRe: 分布平均が基準を満たすまで行を除外するにはどうすればよいですか?@jthi以下は、私が望むように動作するように見えるスケルトンの予行演習スクリプトです。 これは現在選択されているパラメータの 1 つだけです (別のパラメータに対して繰り返す必要があります)。正しいループの下でステップを取得するのに苦労しています。
以下に段階的なステップがあります(以下にコメントテキストとして2つを示します)。ifステートメントが発生するまでウェーハごとに実行する必要があります(これを行うには、たとえば While() を使用するなど、より良い方法がある可能性がありますが、これが私が得たものです)ここまで)。 次の点で助けが必要です
- パラメータ列全体の対応する値ではなく、ウェーハごとの最小/最大と平均がレシピに使用されるようにタスクをループするにはどうすればよいですか。
- 1 つのパラメータ列に対してこれを実行したら、次のパラメータ列に移動したいと思います (たとえば、元の投稿では合計 6)。 これを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: 分布平均が基準を満たすまで行を除外するにはどうすればよいですか?除外を実行する式/関数を作成します。 次に、対象の列のリストを取得し、それらを 1 つずつループします。 これが正しく動作することを確認していません
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: 分布平均が基準を満たすまで行を除外するにはどうすればよいですか?@jthiありがとう。 私が試みた中で欠けていた重要な部分その間ループは
If(N Items(dt << Get Selected Rows) < 1,
continue_clean = 0;
);
dt << Clear Select;
そのため、期待どおりに実行されませんでした。
これをテストし、スクリプトに続くいくつかのパラメータ列で機能するように修正しました。 もう少しテストが必要ですが、必要どおりに機能すると思います。
次に行う必要があるのは、すべてのデータに対してこの分析を繰り返すことです。ウエハ。 現在、スクリプトは、選択したパラメータ列のデータ テーブル内のすべての行に対して実行されます。 次のウェーハに進む前に、分析を 1 つのウェーハに限定する方法がわかりません。
最終目標は、ウェーハごとに除外された行の数を取得することです (おそらく、分析の一部としてデータ テーブルに ExcludedRows & set =1 のような新しい列を追加すると役立つ可能性があります)
ただし、その前に、分析を繰り返すためのスクリプトの作成方法について指示を求めます。ウエハ。
Re: 分布平均が基準を満たすまで行を除外するにはどうすればよいですか?実行している分析を考えると、各ウェーハに対して実行する最も効率的な方法は、データ テーブルをウェーハごとに個別のデータ テーブルにサブセット化することだと思います。次に、テーブルを順番に通過するだけです。
Re: 分布平均が基準を満たすまで行を除外するにはどうすればよいですか?@txnelsonわかりました。 ありがとうございます。ウェーハごとにサブセット化する方法はわかっていますが(実際のケースでは、これにより 100 を超えるウェーハ データが生成されます)、個別のウェーハ データを取得した後、ウェーハごとに解析を実行するためのスクリプトの作成方法がわかりません。 方向性を教えていただけますか?
Re: 分布平均が基準を満たすまで行を除外するにはどうすればよいですか?これをウェーハごとに個別に実行する方法を以下に示します。使っています@jthiコード例。これを変更して、ウェーハごとにデータ テーブルを作成し、各データ テーブルでコードを実行しました。説明のために、ウェーハ 1 と 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"
);
);