Ist es möglich, das Muster „Fehlende Daten“ zu verwenden, um die Datenaufbereitung zu beschleunigen?Eine mangelhafte Datenqualität erschwert die Datenanalyse und hält viele davon ab, sich auf die Reise des maschinellen Lernens zu begeben.
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 unten einen solchen Fall simuliert, bei dem 20 Lose durch 4 Prozessschritte mit geänderten Schrittnamen verarbeitet wurden.
Für die Ursachenanalyse ist es notwendig, die Untersuchungsergebnisse von Geräten zu vergleichen, die mit einem bestimmten Schritt in Zusammenhang stehen. Im folgenden Fall können wir sehen, dass die Daten geschichtet wurden.
Ich weiß, dass ich weiterhin die Funktion „Spalten kombinieren“ in JMP verwenden könnte (Spalten\Dienstprogramme\Spalten kombinieren …), aber in Wirklichkeit habe ich mehrere Hundert Spalten, die überprüft und kombiniert werden müssen.
Wenn ich die Funktion „Tabellen\Fehlende Datenmuster“ in JMP verwende, kann ich die Datenstrukturen und potenziell zu kombinierenden Spalten problemlos erkennen.
Ich habe mich gefragt, ob die Informationen aus dem Muster „Fehlende Daten“ zum Skripten der Anforderung zum Kombinieren von Spalten verwendet werden könnten.
Vor der Automatisierung des Prozesses wären mehrere Prüfungen erforderlich, beispielsweise:
Stellen die Spalten denselben Schritt im Prozess dar?
Sind die Inhalte beider Schritte ähnlich?
Ist das Muster „Fehlende Daten“ für gepaarte Spalten umgekehrt?
Beschädigte Daten sehen folgendermaßen aus:

Fehlendes Datenmuster:

Neu erstellte Daten:

- jpol
Erweiterte statistische ModellierungInhaltsorganisationMassenanpassungErgebnisse teilen und kommunizierenBetreff: Ist es möglich, das fehlende Datenmuster zu verwenden, um die Datenvorbereitung zu beschleunigen?Hallo, für diejenigen unter Ihnen, die daran interessiert sind, das fehlende Datenmuster zu verwenden, um die Datenqualität zu verbessern, 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 ihr jeweiliges fehlendes Datenmuster (und ihre Ergänzung) nicht übereinstimmt. Dies ist der Fall, wenn beide Spalten in denselben Zeilen fehlende Daten enthalten.
Hier ist ein Beispiel, das auf dem ursprünglichen Beispiel aufbaut:

Ich möchte Spalten kombinieren, die Step6 zugeordnet sind, wie oben gezeigt.
Dann kam mir der Gedanke, dass es hilfreich wäre, die prozentuale Übereinstimmung zwischen den Spalten vor der Datenverarbeitung zu kennen. Dies würde die Möglichkeit eröffnen, solche Informationen bei der Entscheidung zu verwenden, ob kombiniert werden soll oder nicht.
Mit kommuniziert @txnelson freundlicherweise hat er sein Drehbuch entwickelt.
Anbei die finale Version.
Ich füge auch unten einige Beispiele mit "echten" Daten hinzu, bei denen diese Methode zur Verbesserung der Datenqualität verwendet wurde:
Hinweis: Blau gefärbte Zellen weisen auf fehlende Daten hin
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 sind die Skripte zum Erstellen des simulierten Beispiels für fehlende Daten und das endgültige Skript, das „Prozent kombinierbar“ und „Spalten, die kombiniert werden können“ basierend auf fehlenden Datenmustern meldet.
- Philipp
Betreff: Ist es möglich, das fehlende Datenmuster zu verwenden, um die Datenvorbereitung zu beschleunigen?Hallo jti,
Deine Alternativlösung gefällt mir auch. Vor allem 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 2 Spalten zu kombinieren. Ich hatte dieses Bedürfnis auch bei einigen Gelegenheiten.
Ich wäre daran interessiert, Ihr Skript so weiterzuentwickeln, dass es die anderen von Ihnen erwähnten Pre-Combine-Prüfungen enthält.
Vielen Dank,
Philipp
Betreff: Ist es möglich, das fehlende Datenmuster zu verwenden, um die Datenvorbereitung zu beschleunigen?Beim Auswerten des Skripts von txnelson für eine viel größere Datentabelle aus der Fertigung wurde festgestellt (Jim fand), dass das Skript keine Ausgabeliste ausgibt, 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 ) )
)
);- Philipp
Betreff: Ist es möglich, das fehlende Datenmuster zu verwenden, um die Datenvorbereitung zu beschleunigen?Ging vielleicht ein bisschen zu schwer mit Scripting.. Ich habe in dieser Lösung keine fehlenden Datenmuster verwendet, da möglicherweise mehr als zwei ähnliche Spalten vorhanden sind (nicht sicher, ob dies hier der Fall ist). Höchstwahrscheinlich könnten diese auch mit Missing Data Patterns erkannt werden, aber ich habe meine eigene Lösung entwickelt.
Ergebnistabelle:

Neue Spalten werden erstellt und alte werden in Ruhe gelassen (könnten leicht gelöscht werden). Der Wert im neuen Spaltennamen in Klammern gibt an, wie viele Spalten kombiniert wurden, um die neue Spalte zu erstellen. Step5.v1 und Step5.v2 werden nicht kombiniert, da Zeile 12 zweimal denselben Wert hat. Sollte einfach 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 der Spaltennamen wird einfach überprüft, wenn der Schrittname vor dem Punkt zwischen den Spalten gleich ist.
Skript beigefügt.
Betreff: Ist es möglich, das fehlende Datenmuster zu verwenden, um die Datenvorbereitung zu beschleunigen?Danke 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 ) )
)
);
- Philipp
Betreff: 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 der Missing-Pattern-Plattform mit 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 ) )
)
);