Bonjour,
Je dois gérer quotidiennement des fichiers Big Data (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 la mieux adaptée (seules quelques colonnes sont normalement distribuées).
J'ai fait un script rapide et sale qui :
- parcourir les colonnes avec des limites,
- répartition des parcelles > "convient à tous" > capacité,
- sélectionne les informations dans la fenêtre du rapport et
- fermer la fenêtre du rapport
Le code "semble" fonctionner, mais lorsque je trace les métriques individuellement pour vérifier si le nouveau tableau correspond aux informations, les résultats diffèrent parfois (pas le même type de distribution, pas les mêmes valeurs Ppk/Cpk). Par contre, USL, LSL et N ont toujours raison (le script récupère donc les informations dans la fenêtre de droite)
Je ne sais pas d'où vient le problème :
- J'ai ajouté quelques commandes Wait() pour m'assurer que le processeur puisse 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'espérais ?
- 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 doit être SHASH mais indique Johnson Sl dans le tableau (avec des capacités différentes). 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;
);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 distinct 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 signaler ce problème au groupe de support de JMP.
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é de processus pour le meilleur ajustement à partir de ce point ? (Je peux donc remplir la nouvelle table avec le Cpk, Cpu...)
Je pourrais penser à une mauvaise façon de le faire (trouver l'ajustement, fermer le rapport, rouvrir le rapport avec la capacité appropriée), mais s'il existe une façon 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 des scripts, 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");