Bonjour,
Je dois gérer quotidiennement de gros fichiers de données (10 000 colonnes x 20 000 lignes).
Mon objectif est d'obtenir des statistiques de capacité de toutes les colonnes avec des limites, en utilisant la méthode du meilleur ajustement (seules quelques colonnes sont normalement distribuées).
J'ai créé un script rapide et sale qui :
- boucle à travers les colonnes avec des limites,
- distribution des parcelles > « convient à tous » > capacité,
- sélectionne les informations dans la fenêtre de rapport et
- fermer la fenêtre du rapport
Le code « semble » fonctionner, mais lorsque je trace les métriques individuellement pour vérifier si la nouvelle table correspond aux informations, les résultats diffèrent parfois (pas le même type de distribution, pas les mêmes valeurs Ppk/Cpk). En revanche, USL, LSL et N sont toujours corrects (donc le script récupère les informations dans la bonne fenêtre)
Je ne sais pas d'où vient le problème :
- J'ai ajouté quelques commandes Wait() pour m'assurer que le processeur peut rattraper son retard avant de démarrer une nouvelle boucle (mais est-ce suffisant ? est-ce la bonne façon ?)
- Est-ce parce que la fonction JMP Fits all n'est pas aussi précise que je l'attends ?
- C'est autre chose ?
J'ai joint un script qui génère un tableau avec 15 000 lignes et des formules aléatoires, suivi du code réel.
Dans cet exemple, le premier devrait être SHASH mais indique Johnson Sl dans la table (avec une capacité différente). les 2x autres sont similaires.
Merci beaucoup pour votre aide 
Prédicateur
//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;
);Merci Jim,
En effet, la solution fonctionne et affiche désormais le bon ajustement dans le nouveau tableau.
Je communiquerai avec le groupe de support JMP.
Existe-t-il un moyen intelligent dans JSL de générer la capacité du processus pour obtenir le meilleur ajustement à partir de ce point ? (Afin que je puisse remplir la nouvelle table avec le Cpk, le Cpu...)
Je pourrais penser à une manière simple de le faire (trouver l'ajustement, fermer le rapport, rouvrir le rapport avec la capacité de l'ajustement approprié), mais s'il existe une manière plus intelligente de le faire, je préférerais.
J'ai essayé quelques variantes du code ci-dessous, cela ne fonctionne pas et je n'ai rien trouvé dans l'index de script, ni dans les discussions.
Merci d'avance,
Prédicateur
dis = dt << Distribution(
Continuous Distribution( Column( As Column( MetricCols[i] ) ),/*, Fit Distribution( "All" ),*/ Process Capability( 0 ), invisible )
);
dis << Fit All;
dis << Process Capability ("Lognormal");J'ai pu reproduire le problème. Je l'ai réduit à un problème avec « Fit Distribution( "All" ) » spécifié dans la commande Distribution. Il semble que le déplacement de « Fit Distribution » vers un appel séparé corrige l'écart.
dis = dt << Distribution(
Continuous Distribution( Column( As Column( MetricCols[i] ) )/*, Fit Distribution( "All" ), Process Capability( 0 )*/, invisible )
);
dis << Fit All;
Je vous suggère de soumettre ce problème au groupe de soutien de JMP.