J'ai actuellement un script qui crée des graphiques de capacité de contrôle et de processus pour une variété de variables, les met dans un journal, puis enregistre le journal au format PDF. Le problème est que mon script fait 5 000 lignes et s'exécute plus lentement que la mélasse dans un congélateur. J'ai donc pensé qu'il serait plus logique de définir une fonction pour chaque type de graphique que je construis et de les assembler de cette façon. J'ai réussi à créer des fonctions pour les cartes de contrôle, mais je n'arrive pas à faire fonctionner la carte de capacité de processus.
Voici un script qui utilise les exemples de données de l'aéroport (ci-joint) pour créer un graphique qui ressemble à celui que j'essaie de créer :
Process Capability(
Process Variables( :Flight ), // select column for data
Spec Limits( :Flight( LSL( 0 ), /*Target( 30 ),*/ USL( 20 ) ) ), //Spec limits, dont need target
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ), // hide unnecessary info
{:Flight << Process Capability Analysis(
Overall Sigma Capability( 1 ),
Within Sigma Capability( 1 ),
Histogram( 1, Show Target( 1 ), Show Within Sigma Density( 1 ), Show Overall Sigma Density( 1 ) )
)},
);Je voudrais définir une fonction avec le nom de la colonne comme entrée. Voici ce que j'ai jusqu'à présent :
capability_chart = function({variable, low, up},
Process Capability(
Process Variables( eval(variable) ), // select column for data
Spec Limits( eval(variable)(LSL( low ), /*Target( 30 ),*/ USL( up )) ),
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ), // hide unnecessary info
{column(dt, element) << Process Capability Analysis(
Overall Sigma Capability( 1 ),
Within Sigma Capability( 1 ),
Histogram( 1, Show Target( 1 ), Show Within Sigma Density( 1 ), Show Overall Sigma Density( 1 ) )
)}
)
);
capability_chart("Flight", 0, 10)Lorsque j'exécute ceci, une fenêtre apparaît me demandant les limites des spécifications. Je souhaite que mon script remplisse automatiquement les limites des spécifications. J'ai également essayé d'utiliser column() et ascolumn() au lieu de eval() dans la ligne des limites des spécifications, mais ils ont fait la même chose. Idéalement, je n'aurais pas besoin de créer une table de spécifications ou d'ajouter des limites de spécifications en tant que propriété de colonne, mais je peux le faire s'il n'y a pas d'autre moyen. Je ne veux pas non plus parcourir toutes les colonnes et créer un tas de graphiques de capacités de processus, car il existe un format existant pour le rapport qui serait difficile à modifier. Toute aide est appréciée.
Si vous avez juste besoin de la capacité de processus pour une colonne à la fois, j'utiliserais la plateforme de distribution dans des cas comme celui-ci.
Names Default To Here(1);
capability_chart = function({dt, colname, lowlimit, highlimit}, {Default Local},
dist = dt << Distribution(
Continuous Distribution(
Column(:Flight),
Quantiles(0),
Summary Statistics(0),
Histogram(0),
Vertical(0),
Outlier Box Plot(0),
Process Capability(LSL(lowlimit), Target(.), USL(highlimit))
)
);
return(dist);
);
dt = Open("$SAMPLE_DATA/Quality Control/Airport.jmp");
pc = capability_chart(dt, "Flight", 0, 10);
Vous obtiendrez un rapport un peu différent en raison des zones de plan, mais celles-ci peuvent être "masquées" si nécessaire (ou simplement prendre la zone de plan qui vous intéresse dans votre rapport).

Voici une liste d'astuces pour faire fonctionner une expression JSL :
Gestion des expressions dans JMP : astuces et trappes
Astuces:
- la plupart des plateformes acceptent le nom de la colonne (= string, "Flight" ) en plus le nom de la colonne (=reference, :Flight ):)
donc la seule astuce dont nous avons besoin : remplacer la variable par le nom de la colonne (chaîne).
Le problème : dans la plupart des cas, Jmp n'évalue pas un argument avant d'appeler la fonction. Donc, si vous placez Eval() autour de l'argument de la fonction, cela ne vous aidera pas à l'évaluer.
-> Enveloppez le tout dans un Eval(Eval Expr(()) et remplacez vos Eval() par Expr() s
... pour dire à Jmp de les évaluer en premier.
capability_chart = function({variable, low, up},
Eval Expr(Process Capability(
Process Variables( Expr(variable), // select column for data
Spec Limits( Expr(variable)(LSL( low ), /*Target( 30 ),*/ USL( up )) ),
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ) // hide unnecessary info
))
));
capability_chart("Flight", 0, 10)
mais les Spec Limits("Flight"(LSL( low ), Target( . ), USL( up )) ) ne fonctionnent pas, elles sont converties en
Spec Limits( :Flight << {LSL( low ), Target( .), USL( up )} )
Alors, essayons l'astuce avec Name Expr(As column(column name)) :
Spec Limits(Expr(Name Expr(As column(variable)))(LSL( low ), Target( .), USL( up )) ),
... et encore une fois, on obtient :
Spec Limits( :Flight << {LSL( low ), Target( .), USL( up )} )Ouah! ... et argument !
Alors, utilisons le plan B : qui fonctionne toujours : utilisez Eval(Substitute())
L'idée originale : en combinaison avec Name Expr(As column(column_name)) comme expression de remplacement
... mais presque étonnamment, cela fonctionne même avec la corde nue (!) :
capability_chart = function({variable, low, up},
Eval(Substitute(Expr(Process Capability(
Process Variables( _var_ ), // select column for data
Spec Limits( _var_(LSL( low ), /*Target( 30 ),*/ USL( up )) ),
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ) // hide unnecessary info
)),Expr(_var_), variable
)));
capability_chart("Flight", 0, 10)