Re: 분포 평균이 기준을 충족할 때까지 행을 제외하는 방법은 무엇입니까?안녕 @네오 ,
이러한 수단을 제어 한계 내로 구체적으로 확보하는 것이 목표입니까, 아니면 데이터 세트를 정리하는 자동화된 방법을 찾고 있습니까?후자의 경우 분석 > 선별 메뉴에서 이상값 탐색 플랫폼을 고려할 수 있습니다.나는 분위수 범위 이상값을 자주 사용하는데, Robust PCA 이상값은 PCA 플랫폼 내에서 일반적으로 수행하는 작업과 매우 유사합니다.
구체적으로 사이트 집합(5개만 있음)이나 모두 평균 내에 있는 조건을 충족하는 행을 찾으려는 경우 극단적인 값을 갖는 행을 찾기 위해 다변량 분석으로 시작할 것입니다. 먼저 여러 열에.
Re: 분포 평균이 기준을 충족할 때까지 행을 제외하는 방법은 무엇입니까?@ih
목표는 모든 관련 매개변수에 대한 사양 한계 내 평균을 얻는 것이며 이상값을 탐색하는 것이 아닙니다.
예, 이 예에는 로트/웨이퍼당 사이트가 5개 있지만(실제 사례에서는 1000개 초과) JMP 샘플 데이터에서 더 나은 예를 찾을 수 없습니다.
다변량 분석을 살펴보겠습니다(왜 여러 열을 함께 살펴봐야 하는지 이해가 안 되지만 다변량 플랫폼을 보면 알 것 같습니다).
Re: 분포 평균이 기준을 충족할 때까지 행을 제외하는 방법은 무엇입니까?이런 상황에도 괜찮으세요? 사양 내에 단일 결과가 없더라도 평균은 여전히 사양 한계 사이에 있습니다.


Re: 분포 평균이 기준을 충족할 때까지 행을 제외하는 방법은 무엇입니까?@jthi 요구 사항은 충족하지만 목표는 충족하지 않는 가능한 사례 중 하나를 지적해 주셔서 감사합니다. Oneway 분석 차트를 이해하지 못하지만 대답은 아니요 분포 차트의 경우. 내 예에서는 분포 내에 행이 있지만 가능성을 지적하는 것이 맞습니다.
목표는 분포의 극단부터 시작하여(제 예에서는 사이트/웨이퍼) 필터링하여 사양 제한 내로 분포의 평균을 가져오는 것입니다. 이 작업을 수동으로 수행하는 동안 평균이 사양 제한을 벗어난 쪽의 분포 극단에서 시작하는 행(사이트)을 제외했으며 위에서 언급한 대로 후속 매개변수에 대한 사이트를 필터링하면 다음과 같은 결과가 발생하므로 이전에 분석된 매개변수로 돌아가야 했습니다. 이전에 분석된 매개변수가 사양 한계를 벗어나는 평균입니다.
분포 평균이 기준을 충족할 때까지 행을 제외하는 방법은 무엇입니까?다음은 각 매개변수(아래에 표시된 사례만 해당)의 분포 평균이 해당 사양 제한 내에 포함될 때까지 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를 필터링하면 이전에 분석된 매개변수의 평균이 사양 한계를 벗어날 가능성이 높습니다. 이건 제가 수동으로 운동을 하면서 느낀 점입니다.확인을 위해 또는 모든 사이트가 필터링될 때까지 매개변수에 대해 레시피를 5회 반복해야 할 수도 있습니다. 이번 실습을 통해 제가 알고 싶은 것은 바로 이것입니다. 진행 방법에 대해 도움을 주시면 감사하겠습니다.
모든 매개변수를 확인하고 완료한 후에는 제외된 사이트를 새 열에서 제외됨으로 태그 지정해야 합니다(제외되지 않음으로 유지).
자동화 및 스크립팅윈도우Re: 분포 평균이 기준을 충족할 때까지 행을 제외하는 방법은 무엇입니까?@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);
Re: 분포 평균이 기준을 충족할 때까지 행을 제외하는 방법은 무엇입니까?제외를 수행하는 표현식/함수를 만듭니다. 그런 다음 관심 있는 열 목록을 가져와서 하나씩 반복합니다. 제대로 작동하는지 확인하지 못했습니다.
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;
그래서 예상대로 실행되지 않았습니다.
이제 이를 테스트하고 스크립트를 따르는 여러 매개변수 열에서 작동하도록 수정했습니다. 아직 더 많은 테스트가 필요하지만 필요에 따라 작동한다고 생각합니다.
다음에 해야 할 일은 매 시간마다 이 분석을 반복하는 것입니다. 웨이퍼 . 현재 스크립트는 선택한 매개변수 열에 대한 데이터 테이블의 모든 행에서 실행됩니다. 다음 웨이퍼로 진행하기 전에 분석을 하나의 웨이퍼로 제한하는 방법이 명확하지 않습니다.
최종 목표는 웨이퍼당 제외된 행 수를 얻는 것입니다(아마도 ExcludedRows와 같은 새 열을 추가하고 분석의 일부로 데이터 테이블에 =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"
);
);