回覆:如何排除行,直到分佈平均值滿足條件?你好@尼奧,
您的目標是專門讓這些方法在控制範圍內,還是正在尋找一種自動化的方法來清理資料集?如果是後者,您可以考慮分析 > 篩選選單下的探索離群值平台。我經常使用分位數範圍異常值,而穩健的 PCA 異常值與我通常在 PCA 平台內所做的非常相似。
如果您專門嘗試查找一組站點(只有 5 個?)或滿足均值範圍內條件的行,那麼我可能會從多變量分析開始,以便查找具有極值的行首先在多個列中。
回覆:如何排除行,直到分佈平均值滿足條件?@ih
目標是獲得所有相關參數在規格限制內的平均值,而不是探索異常值。
是的,在本例中,每批次/晶圓有 5 個站點(在我的實際情況下,>1000 個),但我在 JMP 樣本資料中找不到更好的範例。
我將看看多元分析(不明白為什麼我需要一起查看多個列,但我想當我查看多元平台時我會這樣做)。
回覆:如何排除行,直到分佈平均值滿足條件?你能接受這樣的情況嗎? 即使規格內沒有單一結果,平均值仍處於規格限制之間


回覆:如何排除行,直到分佈平均值滿足條件?@jthi感謝您指出滿足要求但不滿足目標的可能情況之一。 我不明白單向分析圖,但答案是不為分佈圖。 在我的範例中,我在分佈中有行,但您指出了一種可能性是正確的。
目標是透過從分佈的極值開始過濾掉(在我的範例中為站點/晶圓),使分佈的平均值處於規格限制內。 在手動執行此操作時,我排除了從平均值超出規格限制一側的分佈極值開始的行(站點),如上所述,我必須返回到先前分析的參數,因為過濾掉後續參數上的站點會導致先前分析的超出規格限制的參數的平均值。
如何排除行直到分佈平均值滿足條件?下面是一個與我的實際情況類似的範例,其中我想排除站點,直到每個參數的分佈平均值(僅下面繪製的情況)落在各自的規格限制內。
要排除的站點/晶圓從平均值超出規格限制(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 ) )
);

雖然所需的最終結果可能看起來像這樣(手動完成過濾,下圖是對所有晶圓進行過濾時的情況)。

使用上述方法過濾站點的行為可能會使早期分析的參數的平均值超出其規格限制。 無論如何,這是我在手動進行練習時注意到的。人們可能需要對參數進行 5 次循環以進行檢查,或直到所有站點都被過濾掉。 這就是我想從這次練習中了解的內容。 我希望獲得有關如何繼續的幫助。
檢查並完成所有參數後,排除的站點需要在新列中標記為「已排除」(並保持為「未排除」)。
自動化和腳本編寫視窗回覆:如何排除行,直到分佈平均值滿足條件?@jthi下面是一個骨架的空運行腳本,它看起來像我想要的那樣工作。 現在它只是一個選定的參數(需要對其他參數重複)。我正在努力讓這些步驟處於正確的循環下。
我在下面的階段中有步驟(下面顯示了兩個步驟作為註釋文字),我需要為每個晶圓運行這些步驟,直到if 語句爆發(可能有更好的方法來做到這一點,例如使用While(),但這就是我所得到的到目前為止)。 我需要以下方面的幫助
- 如何循環任務,以便將每個晶圓的最小/最大和平均值用於配方,而不是整個參數列的相應值。
- 一旦我對一個參數列完成了此操作,我想轉到下一個參數列(例如,原始帖子中總共有 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);
回覆:如何排除行,直到分佈平均值滿足條件?建立表達式/函數來執行排除。 然後取得感興趣的列列表並一一循環它們。 我沒有驗證這是否正確
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");回覆:如何排除行,直到分佈平均值滿足條件?@jthi謝謝。 我在嘗試中缺少的關鍵位儘管循環是
If(N Items(dt << Get Selected Rows) < 1,
continue_clean = 0;
);
dt << Clear Select;
所以它沒有按預期運行。
我現在已經測試了它並修改了它以適用於腳本後面的多個參數列。 還需要進行更多測試,但我認為它可以按要求工作。
接下來我需要做的是對每個重複此分析晶圓。 目前,該腳本在所選參數列的資料表中的所有行上執行。 我不清楚如何將分析限制在一個晶圓上,然後再進行下一個晶圓。
最終目標是取得每個晶圓排除的行數(也許在資料表中新增一個新列,例如 ExcludedRows & set =1 作為分析的一部分可能會很有用)
但在我請求一些關於如何編寫腳本以重複分析之前晶圓。
回覆:如何排除行,直到分佈平均值滿足條件?鑑於您正在執行的分析,我認為運行每個晶圓的最有效方法是將資料表子集為每個晶圓的單獨資料表。然後你只需逐一瀏覽表格即可。
回覆:如何排除行,直到分佈平均值滿足條件?@tx尼爾森好的。 謝謝,我知道如何按晶圓進行子集(在我的實際情況中,這將生成>100 個晶圓數據),但一旦我有了單獨的晶圓數據,我不知道如何編寫腳本以逐個晶圓運轉分析。 請問我可以得到一些指導嗎?
回覆:如何排除行,直到分佈平均值滿足條件?以下說明如何對每個晶圓單獨執行此操作。我在用@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"
);
);