Ciao,
Devo gestire quotidianamente file di big data (10.000 colonne x 20.000 righe).
Il mio obiettivo è ottenere statistiche sulla capacità da tutte le colonne con limiti, utilizzando il metodo più adatto (solo poche colonne sono normalmente distribuite).
Ho creato uno script veloce e sporco che:
- scorrere le colonne con limiti,
- distribuzione della trama > "adatto a tutti" > capacità,
- seleziona le informazioni nella finestra del rapporto e
- chiudere la finestra del report
Il codice "sembra" funzionare, ma quando traccio le metriche individualmente per verificare se la nuova tabella corrisponde alle informazioni, a volte i risultati differiscono (non lo stesso tipo di distribuzione, non gli stessi valori Ppk/Cpk). D'altra parte, USL, LSL e N hanno sempre ragione (quindi lo script prende le informazioni dalla finestra di destra)
Non so da dove derivi il problema:
- Ho aggiunto alcuni comandi Wait() per assicurarmi che il processore possa recuperare il ritardo prima di iniziare un nuovo ciclo (ma è sufficiente? È il modo giusto?)
- È perché la funzione JMP Fits all non è precisa come mi aspettavo?
- E' qualcos'altro?
Ho allegato uno script che genera una tabella con 15.000 righe e formule casuali, seguita dal codice vero e proprio.
In questo esempio, il primo dovrebbe essere SHASH ma riporta Johnson Sl nella tabella (con capacità diverse). gli altri 2x sono simili.
Grazie mille per il tuo aiuto 
Predicatore
//Create table with random distribution
dt = New Table( "tabletest",
Add Rows( 15000 ),
New Column( "Normal 10,1", Numeric, "Continuous", formula( Random Normal( 10, 1 ) ) ),
New Column( "LogNormal 10,1", Numeric, "Continuous", formula( Random Lognormal( 10, 1 ) ) ),
New Column( "Gamma 10,1", Numeric, "Continuous", formula( Random Gamma( 10, 1 ) ) ),
New Column( "Normal 10,2", Numeric, "Continuous", formula( Random Normal( 10, 2 ) ) );
);
Column( dt, "Normal 10,1" ) << set property( "spec limits", {LSL( 6 ), USL( 14 ), Show Limits( 0 )} );
Column( dt, "LogNormal 10,1" ) << set property( "spec limits", {LSL( 0 ), USL( 400000 ), Show Limits( 0 )} );
Column( dt, "Gamma 10,1" ) << set property( "spec limits", {LSL( 0 ), USL( 40 ), Show Limits( 0 )} );
dt << save( "$Desktop\tabletest.jmp" );
//Get Column only with limits (At east LSL or USL, I don't care about target)
MetricCols = dt << Get Column Names( numeric, continuous );
Show( MetricCols );
For( i = N Items( MetricCols ), i >= 1, i--,
Q = Column( MetricCols[i] ) << Get Property( "Spec limits" );
Show( Q );
spec_x = Eval List( {Arg( Q, 1 )/*, Arg( Q, 2 ), Arg( Q, 3 )*/} );
Show( spec_x );
If( N Row( Loc( spec_x, Empty() ) ),
Remove From( MetricCols, i )
);
);
//Create a new table to collect the stats from the "Test" table
CpkTable = New Table( "Capability Best Fit",
Add Rows( N Items( MetricCols ) ),
New Column( "Metric", "Character", "Nominal" ),
New Column( "N", "Numeric", "Continuous" ),
New Column( "LSL", "Numeric", "Continuous" ),
New Column( "USL", "Numeric", "Continuous" ),
New Column( "Best Fit", "Character", "Nominal" ),
New Column( "Cpk", "Numeric", "Continuous" ),
New Column( "Cpl", "Numeric", "Continuous" ),
New Column( "Cpu", "Numeric", "Continuous" )
);
//Loop to run Distribution > Fit ALL > Capability and collect the stats
For( i = 1, i <= N Items( MetricCols ), i++,
Show( i );
dt = Open( "$Desktop\tabletest.jmp" );
dis = dt << Distribution(
Continuous Distribution( Column( As Column( MetricCols[i] ) ), Fit Distribution( "All" ), Process Capability( 0 ), invisible )
);
Wait( 0 );
// Point to the first capability analysis and create a data table from it
dtCpk = dis << report;
Wait( 0 );
// Fill USL and LSL in the new table
Limits = Column( MetricCols[i] ) << Get Property( "Spec limits" );
Try( CpkTable:LSL[i] = Limits["LSL"] );
Try( CpkTable:USL[i] = Limits["USL"] );
// Find N and fill the new table
Try(
FindN = dtCpk["Summary Statistics"][Number Col Box( 1 )] << get;
CpkTable:N[i] = FindN[6];
);
// find the best fit and fill the new table
Try(
var = dtCpk["Compare Distributions"][String Col Box( "Distribution" )] << get;
CpkTable:Best Fit[i] = var[1];
CpkTable:Metric[i] = Char( MetricCols[i] );
);
// get CPK parameters from best fit capability analysis and fill the new table
Try(
cpk = dtCpk["Fitted " || var[1]]["Quantile Sigma"][Number Col Box( "Index" )] << get;
CpkTable:Cpk[i] = cpk[2];
CpkTable:Cpl[i] = cpk[4];
CpkTable:Cpu[i] = cpk[5];
Show( MetricCols[i] );
Show( var[1] );
Show( cpk );
);
Wait( 0 );
dtCpk << close window;
);Sono stato in grado di replicare il problema. Ho ristretto il campo a un problema relativo alla specificazione di "Adatta distribuzione("Tutto")" nel comando Distribuzione. Sembra che lo spostamento della "Distribuzione adatta" in una chiamata separata risolva la discrepanza.
dis = dt << Distribution(
Continuous Distribution( Column( As Column( MetricCols[i] ) )/*, Fit Distribution( "All" ), Process Capability( 0 )*/, invisible )
);
dis << Fit All;
Ti suggerisco di sottoporre questo problema al gruppo di supporto di JMP
Grazie Jim,
In effetti la soluzione funziona e ora mostra il corretto adattamento nella nuova tabella.
Comunicherò con il gruppo di supporto JMP.
Esiste un modo intelligente in JSL per generare la capacità del processo per adattarla al meglio da quel punto? (Così posso popolare la nuova tabella con Cpk, Cpu...)
Potrei pensare a un modo sporco per farlo (trovare l'adattamento, chiudere il report, riaprire il report con le funzionalità dell'adattamento giusto) ma se esiste un modo più intelligente per farlo, preferirei.
Ho provato alcune varianti del codice qui sotto, non funziona e non sono riuscito a trovare nulla nell'indice degli script o nelle discussioni.
Grazie in anticipo,
Predicatore
dis = dt << Distribution(
Continuous Distribution( Column( As Column( MetricCols[i] ) ),/*, Fit Distribution( "All" ),*/ Process Capability( 0 ), invisible )
);
dis << Fit All;
dis << Process Capability ("Lognormal");