Betreff: Wie schließe ich Zeilen aus, bis der Verteilungsmittelwert ein Kriterium erfüllt?Hallo @Neo ,
Ist es Ihr Ziel, diese Mittel gezielt innerhalb der Kontrollgrenzen zu halten, oder suchen Sie nach einer automatisierten Möglichkeit, Ihren Datensatz zu bereinigen?Im letzteren Fall könnten Sie die Plattform „Ausreißer erkunden“ im Menü „Analysieren“ > „Screening“ in Betracht ziehen.Ich verwende häufig die Quantilbereichsausreißer, und die Robust-PCA-Ausreißer sind dem, was ich normalerweise innerhalb der PCA-Plattform mache, sehr ähnlich.
Wenn Sie speziell versuchen, eine Reihe von Standorten (es gibt nur 5?) oder Zeilen zu finden, die die Bedingung erfüllen, dass sie alle innerhalb des Mittelwerts liegen, dann würde ich wahrscheinlich mit einer multivariaten Analyse beginnen, um Zeilen mit Extremwerten zu finden zuerst in mehreren Spalten.
Betreff: Wie schließe ich Zeilen aus, bis der Verteilungsmittelwert ein Kriterium erfüllt?@ich h
Ziel ist es, den Mittelwert für alle betroffenen Parameter innerhalb der Spezifikationsgrenzen zu halten und keine Ausreißer zu untersuchen.
Ja, in diesem Beispiel gibt es 5 Standorte pro Los/Wafer (>1000 in meinem tatsächlichen Fall), aber ich konnte in den Beispieldaten von JMP kein besseres Beispiel finden.
Ich werde einen Blick auf die multivariate Analyse werfen (ich verstehe nicht, warum ich mehrere Spalten zusammen betrachten muss, aber ich denke, das werde ich tun, wenn ich mir die multivariate Plattform anschaue).
Betreff: Wie schließe ich Zeilen aus, bis der Verteilungsmittelwert ein Kriterium erfüllt?Bist du mit solchen Situationen einverstanden? Der Mittelwert liegt immer noch zwischen den Spezifikationsgrenzen, auch wenn es innerhalb der Spezifikation kein einziges Ergebnis gibt


Betreff: Wie schließe ich Zeilen aus, bis der Verteilungsmittelwert ein Kriterium erfüllt?@jthi Vielen Dank für den Hinweis auf einen der möglichen Fälle, der die Anforderung, aber nicht das Ziel erfüllt. Ich verstehe das Oneway-Analysediagramm nicht, aber die Antwort lautet NEIN für das Verteilungsdiagramm. In meinem Beispiel habe ich Zeilen innerhalb der Verteilung, aber Sie weisen zu Recht auf eine Möglichkeit hin.
Ziel ist es, den Mittelwert einer Verteilung innerhalb der Spezifikationsgrenzen zu halten, indem ausgehend von den Extremen der Verteilung herausgefiltert wird (Sites/Wafer in meinem Beispielfall). Während ich dies manuell durchführte, schloss ich Zeilen (Standorte) aus, die am Verteilungsextrem auf der Seite begannen, auf der der Mittelwert außerhalb der Spezifikationsgrenze lag, und wie oben erwähnt musste ich zu zuvor analysierten Parametern zurückkehren, da das Herausfiltern von Standorten auf nachfolgenden Parametern zu dem Ergebnis führte Mittelwert der zuvor analysierten Parameter, die außerhalb der Spezifikationsgrenzen liegen.
Wie schließe ich Zeilen aus, bis der Verteilungsmittelwert ein Kriterium erfüllt?Unten ist ein Beispiel ähnlich meinem tatsächlichen Fall, in dem ich SITEs ausschließen möchte, bis der Verteilungsmittelwert für jeden Parameter (nur die unten dargestellten Fälle) innerhalb ihrer jeweiligen Spezifikationsgrenzen liegt.
Auszuschließende Standorte/Wafer beginnen am Verteilungsextrem auf der Seite, auf der der Mittelwert außerhalb der Spezifikationsgrenze (LSL oder USL) liegt.
Ich denke, man könnte mit einem beliebigen Parameter beginnen, Websites aus dem Verteilungsextrem entfernen, bis der neu berechnete Mittelwert >=LSL oder <= USL für diesen Parameter ist, dann zum nächsten Parameter übergehen und Websites überprüfen und bei Bedarf ausschließen.
Wie kann man dieses Problem mit JSL angehen?
Gibt es eine JMP-Plattform, die dies bereits leisten könnte, z. B. Prozessscreening?
Das Folgende gibt
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 ) )
);

während das gewünschte Endergebnis etwa so aussehen könnte (die Filterung erfolgt manuell, die nachstehende Darstellung zeigt die Durchführung für alle Wafer).

Das Herausfiltern von SITEs mithilfe des obigen Rezepts führt wahrscheinlich dazu, dass der Mittelwert für zuvor analysierte Parameter außerhalb ihrer Spezifikationsgrenzen liegt. Das ist mir jedenfalls bei der manuellen Ausführung der Übung aufgefallen.Zur Überprüfung oder bis alle SITEs herausgefiltert wurden, muss das Rezept möglicherweise fünfmal über die Parameter durchlaufen werden. Das möchte ich aus dieser Übung wissen. Ich würde mich über Hilfe bei der weiteren Vorgehensweise freuen.
Nachdem alle Parameter überprüft und abgeschlossen wurden, müssen die ausgeschlossenen SITEs in einer neuen Spalte als „Ausgeschlossen“ gekennzeichnet werden (und als „Nicht ausgeschlossen“ verbleiben).
Automatisierung und SkripterstellungWindowsBetreff: Wie schließe ich Zeilen aus, bis der Verteilungsmittelwert ein Kriterium erfüllt?@jthi Unten finden Sie ein Skelett-Probelaufskript, das anscheinend so funktioniert, wie ich es möchte. Es ist jetzt nur noch ein ausgewählter Parameter (muss für weitere Parameter wiederholt werden).Ich habe Mühe, die Schritte in die richtige Schleife zu bringen.
Ich habe unten Schritte in Etappen (zwei werden unten als kommentierter Text angezeigt), die ich für jeden Wafer ausführen muss, bis die if-Anweisung ausbricht (es könnte eine bessere Möglichkeit geben, dies z. B. mit While() zu tun, aber das ist, was ich habe bis jetzt). Ich brauche Hilfe zu Folgendem
- Wie führe ich die Aufgaben in einer Schleife aus, sodass für das Rezept die Min/Max-Werte und der Mittelwert pro Wafer verwendet werden und nicht die entsprechenden Werte für die gesamte Parameterspalte?
- Sobald ich dies für eine Parameterspalte getan habe, möchte ich zur nächsten wechseln (z. B. insgesamt 6 im ursprünglichen Beitrag). Wie geht das automatisch über 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);
Betreff: Wie schließe ich Zeilen aus, bis der Verteilungsmittelwert ein Kriterium erfüllt?Erstellen Sie einen Ausdruck/eine Funktion, um Ihre Ausschlüsse auszuführen. Rufen Sie dann eine Liste der interessierenden Spalten ab und durchlaufen Sie sie nacheinander. Ich habe nicht überprüft, ob das richtig funktioniert
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");Betreff: Wie schließe ich Zeilen aus, bis der Verteilungsmittelwert ein Kriterium erfüllt?@jthi Danke. Der Schlüsselbart, der mir bei meinen Versuchen gefehlt hat Während Schleife ist
If(N Items(dt << Get Selected Rows) < 1,
continue_clean = 0;
);
dt << Clear Select;
Es lief also nicht wie erwartet.
Ich habe es jetzt getestet und so geändert, dass es für mehrere Parameterspalten funktioniert, die Ihrem Skript folgen. Es sind noch einige weitere Tests erforderlich, aber ich denke, es funktioniert wie erforderlich.
Als nächstes muss ich diese Analyse für jeden wiederholen Wafer . Derzeit wird das Skript für alle Zeilen in der Datentabelle für die ausgewählte Parameterspalte ausgeführt. Mir ist nicht klar, wie ich die Analyse auf einen Wafer beschränken kann, bevor ich mit dem nächsten fortfahre.
Endziel ist es, die Anzahl der ausgeschlossenen Zeilen pro Wafer zu ermitteln (Vielleicht könnte das Hinzufügen einer neuen Spalte wie ExcludedRows & set =1 in der Datentabelle als Teil der Analyse nützlich sein)
Aber bevor ich um eine Anleitung zum Erstellen eines Skripts für die Wiederholung der Analyse bitte Wafer .
Betreff: Wie schließe ich Zeilen aus, bis der Verteilungsmittelwert ein Kriterium erfüllt?Angesichts der von Ihnen durchgeführten Analyse glaube ich, dass die effizienteste Vorgehensweise für jeden Wafer darin besteht, die Datentabelle in separate Datentabellen für jeden Wafer aufzuteilen.Dann gehen Sie einfach eine nach der anderen durch die Tabellen.
Betreff: Wie schließe ich Zeilen aus, bis der Verteilungsmittelwert ein Kriterium erfüllt?@txnelson OK. Danke, ich weiß, wie eine Teilmenge pro Wafer funktioniert (in meinem tatsächlichen Fall werden dadurch mehr als 100 Wafer-Daten generiert), aber ich weiß nicht, wie ich ein Skript erstellen kann, um die Analyse auf Wafer-für-Wafer-Basis auszuführen, sobald ich separate Wafer-Daten habe. Könnte ich bitte eine Wegbeschreibung bekommen?
Betreff: Wie schließe ich Zeilen aus, bis der Verteilungsmittelwert ein Kriterium erfüllt?Hier ist eine Illustration, wie dies für jeden Wafer separat ausgeführt wird.ich benutze @jthi Beispielcode.Ich habe es geändert, um Datentabellen für jeden Wafer zu erstellen und dann den Code für jede Datentabelle auszuführen.Zur Veranschaulichung habe ich alle Waferdaten mit Ausnahme der Wafer 1 und 2 entfernt.
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"
);
);