Ri: Come escludere le righe finché la media della distribuzione non soddisfa un criterio?CIAO @Neo ,
Il tuo obiettivo è portare questi mezzi specificamente entro i limiti di controllo o stai cercando un modo automatizzato per ripulire il tuo set di dati?In quest'ultimo caso, potresti prendere in considerazione la piattaforma Esplora valori anomali nel menu Analizza> Screening.Utilizzo spesso i valori anomali dell'intervallo quantile e i valori anomali Robust PCA sono molto simili a ciò che faccio normalmente all'interno della piattaforma PCA.
Se stai cercando specificamente di trovare un insieme di siti (ce ne sono solo 5?) o righe che soddisfano la condizione in cui rientrano tutti nella media, probabilmente inizierei con un'analisi multivariata per trovare righe con valori estremi prima in più colonne.
Ri: Come escludere le righe finché la media della distribuzione non soddisfa un criterio?@ih
L'obiettivo è ottenere la media entro i limiti delle specifiche per tutti i parametri interessati e non esplorare valori anomali.
Sì, in questo esempio ci sono 5 siti per lotto/wafer (>1000 nel mio caso reale) ma non sono riuscito a trovare un esempio migliore nei dati di esempio di JMP.
Darò un'occhiata all'analisi multivariata (non capisco perché devo guardare più colonne insieme, ma immagino che lo farò quando guarderò la piattaforma multivariata).
Ri: Come escludere le righe finché la media della distribuzione non soddisfa un criterio?Ti vanno bene situazioni come questa? La media è ancora entro i limiti delle specifiche anche se non esiste un singolo risultato all'interno delle specifiche


Ri: Come escludere le righe finché la media della distribuzione non soddisfa un criterio?@jthi Grazie per aver segnalato uno dei possibili casi che soddisfa il requisito ma non l'obiettivo. Non capisco il grafico di analisi Oneway ma la risposta è NO per il grafico di distribuzione. Nel mio esempio, ho delle righe all'interno della distribuzione ma hai ragione a indicare una possibilità.
L'obiettivo è portare la media di una distribuzione all'interno dei limiti delle specifiche filtrando (Siti/Wafer nel mio caso di esempio) a partire dagli estremi della distribuzione. Mentre lo facevo manualmente, ho escluso le righe (siti) iniziando dall'estremo della distribuzione sul lato in cui la media era al di fuori del limite delle specifiche e, come menzionato sopra, sono dovuto tornare ai parametri precedentemente analizzati poiché filtrando i siti sui parametri successivi risultava il risultato media dei parametri precedentemente analizzati che escono dai limiti delle specifiche.
Come escludere le righe finché la media della distribuzione non soddisfa un criterio?Di seguito è riportato un esempio simile al mio caso reale in cui vorrei escludere i SITI finché la media di distribuzione per ciascun parametro (solo quelli riportati di seguito) non rientra nei rispettivi limiti delle specifiche.
I siti/wafer da escludere iniziano dall'estremo della distribuzione sul lato in cui la media è al di fuori del limite delle specifiche (LSL o USL).
Penso che si potrebbe iniziare con qualsiasi parametro, rimuovere i siti dall'estremo della distribuzione finché la media ricalcolata non è >=LSL o <= USL per quel parametro, quindi passare al parametro successivo e controllare ed escludere i siti se necessario.
Come affrontare questo problema con JSL?
Esiste una piattaforma JMP che potrebbe già fare questo, ad esempio lo screening dei processi?
Quanto segue dà
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 ) )
);

mentre il risultato finale desiderato potrebbe assomigliare a qualcosa di simile (filtraggio eseguito manualmente, il grafico seguente è quello eseguito per tutti i wafer).

L'atto di filtrare i SITI utilizzando la ricetta di cui sopra è probabile che porti la media dei parametri analizzati in precedenza fuori dai limiti delle specifiche. Questo è comunque quello che ho notato mentre eseguivo l'esercizio manualmente.Potrebbe essere necessario ripetere la ricetta per 5 volte sui parametri per un controllo o fino a quando tutti i SITI non sono stati filtrati. Questo è quello che vorrei sapere da questo esercizio. Apprezzerei un aiuto su come procedere.
Una volta controllati e completati tutti i parametri, i SITI esclusi devono essere contrassegnati come Esclusi in una nuova colonna (e rimanere come Non Esclusi).
Automazione e scriptingfinestreRi: Come escludere le righe finché la media della distribuzione non soddisfa un criterio?@jthi Di seguito è riportato uno script di prova di base che sembra funzionare come voglio. Adesso c'è solo un parametro scelto (dovrà ripeterlo per altri parametri).Faccio fatica a inserire i passaggi nel ciclo corretto.
Ho dei passaggi nelle fasi seguenti (due mostrati di seguito come testo commentato) che devo eseguire per ciascun wafer finché non viene visualizzata l'istruzione if (potrebbe esserci un modo migliore per farlo, ad esempio utilizzando While(), ma questo è ciò che ho ottenuto fino ad ora). Ho bisogno di aiuto per quanto segue
- Come posso eseguire il loop delle attività in modo che per la ricetta vengano utilizzati il valore minimo/massimo e la media per wafer e non i valori corrispondenti per l'intera colonna dei parametri.
- Una volta fatto questo per una colonna di parametri, vorrei passare a quella successiva (ad esempio, totale 6 nel post originale). Come farlo automaticamente tramite 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);
Ri: Come escludere le righe finché la media della distribuzione non soddisfa un criterio?Crea un'espressione/funzione per eseguire le tue esclusioni. Quindi ottieni l'elenco delle colonne di interesse e ripetile una per una. Non ho verificato che funzioni correttamente
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");Ri: Come escludere le righe finché la media della distribuzione non soddisfa un criterio?@jthi Grazie. La parte fondamentale che mi mancava nei miei tentativi di a Mentre il ciclo è
If(N Items(dt << Get Selected Rows) < 1,
continue_clean = 0;
);
dt << Clear Select;
quindi non funzionava come previsto.
Ora l'ho testato e modificato per funzionare con diverse colonne di parametri seguendo il tuo script. Sono necessari ancora alcuni test, ma penso che funzioni come richiesto.
Quello che devo fare dopo è ripetere questa analisi per ogni Wafer . Attualmente lo script viene eseguito su tutte le righe nella tabella dati per la colonna del parametro scelto. Non mi è chiaro come limitare l'analisi ad un wafer prima di procedere al successivo.
L'obiettivo finale è ottenere il numero di righe escluse per wafer (forse potrebbe essere utile aggiungere una nuova colonna come ExcludedRows & set =1 nella tabella dati come parte dell'analisi)
Ma prima di richiedere indicazioni su come scrivere lo script per ripetere l'analisi per Wafer .
Ri: Come escludere le righe finché la media della distribuzione non soddisfa un criterio?Data l'analisi che stai eseguendo, credo che il modo più efficiente di eseguire ciascun wafer sia suddividere la tabella dati in tabelle dati separate per ciascun wafer.Poi basta scorrere le tabelle una dopo l'altra.
Ri: Come escludere le righe finché la media della distribuzione non soddisfa un criterio?@txnelson OK. Grazie, so come sottoinsiemi per wafer (nel mio caso reale, questo genererà> 100 dati wafer) ma non so come eseguire lo script per eseguire l'analisi wafer per wafer, una volta che ho dati wafer separati. Potrei avere qualche indicazione per favore?
Ri: Come escludere le righe finché la media della distribuzione non soddisfa un criterio?Ecco un'illustrazione di come eseguirlo separatamente per ciascun wafer.sto usando @jthi codice di esempio.L'ho modificato per creare tabelle di dati per ciascun wafer e quindi per eseguire il codice su ciascuna tabella di dati.A scopo illustrativo, ho rimosso tutti i dati dei wafer ad eccezione dei wafer 1 e 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"
);
);