回复:如何排除行,直到分布均值满足条件?你好@尼奥,
您的目标是专门让这些方法在控制范围内,还是正在寻找一种自动化的方法来清理数据集?如果是后者,您可以考虑分析 > 筛选菜单下的探索离群值平台。我经常使用分位数范围异常值,而稳健的 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"
);
);