Ist es möglich, das fehlende Datenmuster zu verwenden, um die Datenvorbereitung zu beschleunigen?Das Fehlen einer konsistenten Datenqualität behindert die Datenanalyse und hindert viele daran, eine Reise des maschinellen Lernens anzutreten.
In der Halbleiterindustrie wird erwartet, dass Prozesse kontinuierlich verbessert werden. Leider ist eine der Nebenwirkungen solcher Bemühungen eine Änderung der Datenstruktur. Ein Grund dafür könnte die Umbenennung des Prozessschritts sein.
Ich habe einen solchen Fall unten simuliert, in dem 20 Lose in 4 Prozessschritten mit Änderungen des Schrittnamens verarbeitet wurden.
Für die Ursachenanalyse müssen die Sondenergebnisse von Geräten verglichen werden, die einem bestimmten Schritt zugeordnet sind. Im folgenden Fall können wir sehen, dass die Daten geschichtet wurden.
Ich weiß, dass ich die Funktion "Spalten kombinieren" in JMP (Spalten \ Dienstprogramme \ Spalten kombinieren ...) weiterhin verwenden kann, aber in Wirklichkeit habe ich mehrere Hundert Spalten, die überprüft und kombiniert werden müssen.
Bei Verwendung der Funktion "Tabellen \ Fehlende Datenmuster" in JMP kann ich die zu kombinierenden Datenstrukturen und potenziellen Spalten leicht erkennen.
Ich habe mich gefragt, ob die Informationen aus dem Muster für fehlende Daten verwendet werden können, um die Anforderung für kombinierte Spalten zu skripten.
Vor der Automatisierung des Prozesses wären mehrere Überprüfungen erforderlich, z.
Stellen Spalten denselben Schritt im Prozess dar?
Sind die Inhalte beider Schritte ähnlich?
Ist das Muster für fehlende Daten und invers für gepaarte Spalten?
Gebrochene Daten sehen aus wie:

Fehlendes Datenmuster:

Rekonstruierte Daten:

- jpol
DatentabelleSkriptingBetreff: Ist es möglich, das fehlende Datenmuster zu verwenden, um die Datenvorbereitung zu beschleunigen?Ich denke, Sie können das fehlende Datenmuster verwenden, um die Spalten zu identifizieren, die Daten ohne Schnittpunkt für die nicht fehlenden Muster und die fehlenden Muster enthalten.Dieses Skript verwendet die Ausgabetabelle von der Missing Pattern-Plattform unter Verwendung einer leicht modifizierten Missing Data Pattern-Datentabelle aus den JMP-Beispieldatentabellen.Es findet alle umgekehrt übereinstimmenden Muster und zeigt sie dann in einem Anzeigefenster an

names default to here(1);
dt=New Table( "example",
Add Rows( 4 ),
New Column( "Count",
Numeric,
"Continuous",
Format( "Fixed Dec", 10, 0 ),
Preselect Role( Freq ),
Set Values( [1, 3, 1, 2] )
),
New Column( "Number of columns missing",
Numeric,
"Continuous",
Format( "Fixed Dec", 10, 0 ),
Set Values( [1, 2, 1, 2] )
),
New Column( "Patterns",
Character,
"Ordinal",
List Check( {"0010", "0011", "0100", "0101"} ),
Set Values( {"0010", "0011", "0100", "0101"} )
),
New Column( "Trial 1", Numeric( 1 ), "Nominal", Set Values( [0, 0, 0, 0] ) ),
New Column( "Trial 2", Numeric( 1 ), "Nominal", Set Values( [0, 0, 1, 1] ) ),
New Column( "Trial 3", Numeric( 1 ), "Nominal", Set Values( [1, 1, 0, 0] ) ),
New Column( "Trial 4", Numeric( 1 ), "Nominal", Set Values( [0, 1, 0, 1] ) )
);
cols1List = {};
cols2List = {};
For( i = 4, i <= N Cols( dt ), i++,
comp = Associative Array( dt << get rows where( As Column( dt, i ) == 1 ) );
compMissing = Associative Array( dt << get rows where( As Column( dt, i ) == 0 ) );
If( N Items( comp ) > 0,
For( k = i + 1, k <= N Cols( dt ), k++,
comp2 = Associative Array( dt << get rows where( As Column( dt, k ) == 1 ) );
comp2Missing = Associative Array( dt << get rows where( As Column( dt, k ) == 0 ) );
comp2 << intersect( comp );
comp2Missing << intersect( compMissing );
If( N Items( comp2 << get keys ) == 0 & N Items( comp2Missing << get keys ) == 0,
Insert Into( cols1List, Column( dt, i ) << get name );
Insert Into( cols2List, Column( dt, k ) << get name );
);
)
);
);
nw = New Window( "Results",
Outline Box( "Columns that can be combined",
Table Box( String Col Box( "Column", cols1List ), String Col Box( "With", cols2List ) )
)
);
Betreff: Ist es möglich, das fehlende Datenmuster zu verwenden, um die Datenvorbereitung zu beschleunigen?Vielen Dank an Jim für die sehr schnelle Antwort und Lösung.
Für diejenigen, die Ihr Skript in Aktion sehen möchten, füge ich das Datenerstellungsskript aus dem von mir bereitgestellten Beispiel und Ihre JSL hinzu, um die Spalten zu melden, die kombiniert werden könnten.
names default to here(1);
// Construct the initial data table
New Table( "Missing data initial",
Add Rows( 20 ),
New Column( "LOT_ID",
Character,
"Nominal",
Set Values(
{"AA_234_xx.1", "AA_234_xx.2", "AA_234_xx.3", "AA_234_xx.4",
"AA_234_xx.5", "AA_234_xx.6", "AA_234_xx.7", "AA_234_xx.8",
"AA_234_xx.9", "AA_234_xx.10", "AA_234_xx.11", "AA_234_xx.12",
"AA_234_xx.13", "AA_234_xx.14", "AA_234_xx.15", "AA_234_xx.16",
"AA_234_xx.17", "AA_234_xx.18", "AA_234_xx.19", "AA_234_xx.20"}
),
Set Display Width( 81 )
),
New Column( "Step1.v1",
Character( 6 ),
"Nominal",
Set Values(
{"SRD_01", "SRD_02", "SRD_01", "SRD_04", "SRD_02", "", "", "", "", "",
"SRD_01", "SRD_02", "SRD_01", "SRD_04", "SRD_02", "", "", "", "", ""}
),
Set Display Width( 58 )
),
New Column( "Step1.v2",
Character( 16 ),
"Nominal",
Set Values(
{"", "", "", "", "", "SRD_01", "SRD_02", "SRD_01", "SRD_04", "SRD_02",
"", "", "", "", "", "SRD_02", "SRD_02", "SRD_02", "SRD_02", "SRD_02"}
),
Set Display Width( 58 )
),
New Column( "Step2.v2",
Character( 16 ),
"Nominal",
Set Values(
{"COATER_02", "COATER_01", "", "", "COATER_02", "COATER_01", "COATER_02",
"COATER_02", "COATER_02", "COATER_01", "COATER_02", "COATER_02",
"COATER_01", "COATER_01", "COATER_01", "", "", "", "COATER_01",
"COATER_01"}
),
Set Display Width( 71 )
),
New Column( "Step2.v3",
Character( 16 ),
"Nominal",
Set Values(
{"", "", "COATER_01", "COATER_01", "", "", "", "", "", "", "", "", "",
"", "", "COATER_02", "COATER_02", "COATER_02", "", ""}
),
Set Display Width( 71 )
),
New Column( "Step3.v5",
Character( 16 ),
"Nominal",
Set Values(
{"DRIE_03", "DRIE_04", "DRIE_03", "", "", "", "", "", "", "DRIE_04",
"DRIE_03", "DRIE_04", "DRIE_03", "DRIE_04", "", "", "", "", "", ""}
),
Set Display Width( 58 )
),
New Column( "Step3.v6",
Character( 16 ),
"Nominal",
Set Values(
{"", "", "", "DRIE_04", "DRIE_03", "DRIE_04", "DRIE_03", "DRIE_04",
"DRIE_03", "", "", "", "", "", "DRIE_03", "DRIE_04", "DRIE_03",
"DRIE_04", "DRIE_03", "DRIE_04"}
),
Set Display Width( 58 )
),
New Column( "Step4.v1",
Character( 16 ),
"Nominal",
Set Values(
{"PRIME_06", "", "PRIME_07", "", "PRIME_06", "", "PRIME_07", "",
"PRIME_06", "", "PRIME_07", "", "PRIME_06", "", "PRIME_07", "",
"PRIME_06", "", "PRIME_07", ""}
),
Set Display Width( 61 )
),
New Column( "Step4.v2",
Character( 16 ),
"Nominal",
Set Values(
{"", "PRIME_06", "", "PRIME_07", "", "PRIME_06", "", "PRIME_07", "",
"PRIME_06", "", "PRIME_07", "", "PRIME_06", "", "PRIME_07", "",
"PRIME_06", "", "PRIME_07"}
),
Set Display Width( 61 )
)
);
// Check the Missings Data Patern
Data Table( "Missing data initial" ) <<
Missing Data Pattern(
columns(
:Step1.v1,
:Step1.v2,
:Step2.v2,
:Step2.v3,
:Step3.v5,
:Step3.v6,
:Step4.v1,
:Step4.v2
),
Output Table( "Missing Data Pattern" )
);
// Check for columns which could be combined
// *** JSL written by txnelson ***
dt=Data Table( "Missing Data Pattern");
cols1List = {};
cols2List = {};
For( i = 4, i <= N Cols( dt ), i++,
comp = Associative Array( dt << get rows where( As Column( dt, i ) == 1 ) );
compMissing = Associative Array( dt << get rows where( As Column( dt, i ) == 0 ) );
If( N Items( comp ) > 0,
For( k = i + 1, k <= N Cols( dt ), k++,
comp2 = Associative Array( dt << get rows where( As Column( dt, k ) == 1 ) );
comp2Missing = Associative Array( dt << get rows where( As Column( dt, k ) == 0 ) );
comp2 << intersect( comp );
comp2Missing << intersect( compMissing );
If( N Items( comp2 << get keys ) == 0 & N Items( comp2Missing << get keys ) == 0,
Insert Into( cols1List, Column( dt, i ) << get name );
Insert Into( cols2List, Column( dt, k ) << get name );
);
)
);
);
nw = New Window( "Results",
Outline Box( "Columns that can be combined",
Table Box( String Col Box( "Column", cols1List ), String Col Box( "With", cols2List ) )
)
);
- Philip
Betreff: Ist es möglich, das fehlende Datenmuster zu verwenden, um die Datenvorbereitung zu beschleunigen?Ging vielleicht ein bisschen zu schwer mit Skripten. Ich habe in dieser Lösung keine fehlenden Datenmuster verwendet, da möglicherweise mehr als 2 ähnliche Spalten vorhanden sind (nicht sicher, ob dies hier der Fall ist). Höchstwahrscheinlich konnten diese auch mit fehlenden Datenmustern erkannt werden, aber ich habe meine eigene Lösung gefunden.
Ergebnistabelle:

Neue Spalten werden erstellt und alte werden in Ruhe gelassen (können leicht gelöscht werden). Der Wert im neuen Spaltennamen in Klammern gibt an, wie viele Spalten kombiniert wurden, um die neue Spalte zu erstellen. Schritt 5.v1 und Schritt5.v2 werden nicht kombiniert, da Zeile 12 zweimal denselben Wert hat. Sollte leicht zu ändern sein, indem die Funktion F_checkForInversePatterns im Skript geändert wird, um Spalten mit übereinstimmenden Daten in derselben Zeile zuzulassen.
Diese Lösung berücksichtigt nicht, wie ähnlich die Daten in Spalten sind (würde eine zusätzliche Prüfung erfordern). Auch die Ähnlichkeit von Spaltennamen wird einfach überprüft, wenn der Schrittname vor dem Punkt zwischen den Spalten identisch ist.
Skript beigefügt.
Betreff: Ist es möglich, das fehlende Datenmuster zu verwenden, um die Datenvorbereitung zu beschleunigen?Bei der Auswertung des Skripts von txnelson anhand einer viel größeren Datentabelle aus der Fertigung wurde festgestellt (Jim fand heraus), dass das Skript keine Ausgabeliste liefert, wenn bestimmte Zeilen keine Daten in allen Zielspalten enthalten. Jim hat freundlicherweise eine Korrektur für das Skript bereitgestellt. Siehe unten:
Names Default To Here( 1 );
dtRaw = Current Data Table();
colNamesList = dtRaw << get column names( string );
Remove From( colNamesList, 1, 1 );
dt = dtRaw << Missing Data Pattern(
columns( Eval( colNamesList ) ),
Output Table( "Missing Data Pattern" )
);
// Get rid of all missing and all present patterns
dt << lock data table( 0 );
dt << select where( Contains( :patterns, "0" ) & !Contains( :Patterns, "1" ) );
Try( dt << delete rows );
dt << select where( Contains( :patterns, "1" ) & !Contains( :Patterns, "0" ) );
Try( dt << delete rows );
// Check for columns which could be combined
// *** JSL written by txnelson ***
cols1List = {};
cols2List = {};
For( i = 4, i <= N Cols( dt ), i++,
comp = Associative Array( dt << get rows where( As Column( dt, i ) == 1 ) );
compMissing = Associative Array( dt << get rows where( As Column( dt, i ) == 0 ) );
If( N Items( comp ) > 0,
For( k = i + 1, k <= N Cols( dt ), k++,
comp2 = Associative Array( dt << get rows where( As Column( dt, k ) == 1 ) );
comp2Missing = Associative Array( dt << get rows where( As Column( dt, k ) == 0 ) );
comp2 << intersect( comp );
comp2Missing << intersect( compMissing );
If( N Items( comp2 << get keys ) == 0 & N Items( comp2Missing << get keys ) == 0,
Insert Into( cols1List, Column( dt, i ) << get name );
Insert Into( cols2List, Column( dt, k ) << get name );
);
)
);
);
nw = New Window( "Results",
Outline Box( "Columns that can be combined",
Table Box( String Col Box( "Column", cols1List ), String Col Box( "With", cols2List ) )
)
);- Philip
Betreff: Ist es möglich, das fehlende Datenmuster zu verwenden, um die Datenvorbereitung zu beschleunigen?Hallo jthi,
Ich mag auch Ihre alternative Lösung. Insbesondere die Art und Weise, wie Sie die ursprünglichen Spalten unberührt lassen und neue Spalten in der Datentabelle erstellen. Ein weiteres Problem, das Sie ansprechen, ist die Möglichkeit, bei Bedarf aus mehr als zwei Spalten zu kombinieren. Ich hatte dieses Bedürfnis auch bei einigen Gelegenheiten.
Ich wäre daran interessiert, Ihr Skript weiterzuentwickeln, um die anderen von Ihnen erwähnten Pre-Combine-Prüfungen einzubeziehen.
Vielen Dank,
Philip
Betreff: Ist es möglich, das Muster für fehlende Daten zu verwenden, um die Datenaufbereitung zu beschleunigen?Hallo, für diejenigen unter Ihnen, die daran interessiert sind, das fehlende Datenmuster zur Verbesserung der Datenqualität zu verwenden, gebe ich hier ein kurzes Update:
Ich hatte das Skript von verwendet @ txnelson um bessere Datensätze zu erstellen, aber dann wurde mir klar, dass es einen Fall gibt, in dem ich Spalten kombinieren möchte, obwohl das jeweilige fehlende Datenmuster (und Komplement) nicht übereinstimmt. In beiden Spalten fehlen Daten in denselben Zeilen.
Hier ist ein Beispiel, das auf dem ursprünglichen Beispiel aufbaut:

Ich möchte die mit Step6 verknüpften Spalten wie oben dargestellt kombinieren.
Dann kam mir der Gedanke, dass es hilfreich sein würde, die prozentuale Übereinstimmung zwischen Spalten vor jeder Datenverarbeitung zu kennen. Dies würde die Möglichkeit geben, solche Informationen bei der Entscheidung zu verwenden, ob sie kombiniert werden sollen oder nicht.
Mit kommuniziert haben @ txnelson er hat freundlicherweise sein Drehbuch entwickelt.
Im Anhang befindet sich die endgültige Version.
Im Folgenden sind einige Beispiele für die Verwendung "echter" Daten aufgeführt, bei denen diese Methode zur Verbesserung der Datenqualität verwendet wurde:
Hinweis: Blau gefärbte Zellen kennzeichnen fehlende Daten
Fall 1:
Von

zu

Fall 2:
Von

zu

Es gibt eine enorme Reduzierung der Spalten und viel weniger "leere" Zellen
Wie Sie sich vorstellen können, ermöglicht dies verbesserte, schnellere und effizientere Ursachenanalysen.
Im Anhang finden Sie die Skripte für das simulierte Beispiel für fehlende Daten und das endgültige Skript, das "Prozent kombinierbar" und "Spalten, die kombiniert werden können" basierend auf fehlenden Datenmustern meldet.
- Philip