Ciao,
Devo gestire quotidianamente file di dati di grandi dimensioni (10.000 colonne x 20.000 righe).
Il mio obiettivo è ottenere statistiche di capacità da tutte le colonne con limiti, utilizzando il metodo del miglior adattamento (solo poche colonne sono distribuite normalmente).
Ho creato uno script rapido e approssimativo che:
- scorrere le colonne con limiti,
- distribuzione della trama > "si adatta a tutti" > capacità,
- seleziona le informazioni nella finestra del report e
- chiudere la finestra del report
Il codice "sembra" funzionare, ma quando grafico le metriche singolarmente per verificare se la nuova tabella corrisponde alle informazioni, a volte i risultati sono diversi (non lo stesso tipo di distribuzione, non gli stessi valori Ppk/Cpk). D'altro canto, USL, LSL e N sono sempre corretti (quindi lo script sceglie le informazioni dalla finestra giusta)
Non so da dove venga il problema:
- Ho aggiunto alcuni comandi Wait() per assicurarmi che il processore possa recuperare prima di iniziare un nuovo ciclo (ma è sufficiente? È il modo giusto?)
- È perché la funzione JMP Fits All non è precisa come mi aspetto?
- C'è qualcos'altro?
Ho allegato uno script che genera una tabella con 15.000 righe e formule casuali, seguito dal codice vero e proprio.
In questo esempio, il primo dovrebbe essere SHASH ma riporta Johnson Sl nella tabella (con capacità diversa). 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;
);Grazie Jim,
In effetti la soluzione funziona e ora visualizza la corrispondenza corretta nella nuova tabella.
Comunicherò con il gruppo di supporto JMP.
Esiste un modo intelligente in JSL per generare la Process Capability che meglio si adatta da quel punto? (Così posso popolare la nuova tabella con Cpk, Cpu...)
Potrei pensare a un modo poco pratico per farlo (trovare la soluzione giusta, chiudere il report, riaprirlo con la capacità di trovare la soluzione giusta), ma se esiste un modo più intelligente per farlo, lo preferirei.
Ho provato alcune varianti del codice sottostante, ma 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");Sono riuscito a replicare il problema. L'ho ristretto a un problema con "Fit Distribution( "All" )" specificato all'interno del comando Distribution. Sembra che spostare "Fit Distribution" in una chiamata separata corregga 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 rivolgerti al gruppo di supporto di JMP per questa questione