Hello.
I am using the Process Capability analysis to generate charts for my reports.
One of the summary tables is for 'Nonconformance', which can also be used to represent failure rate
I am interested in generating a table that shows yield numbers directly instead of having to interpret it from the Nonformance table. Is there a way to achieve that directly through the default options available within JMP?
Create a formula column that calculates yields for the parameters of interest.
If (parameter in spec) then yield = 1 else yield = 0
Then create a summary table which computes the mean of the yield columns.
Thanks. I was hoping to avoid having to manually create a yield column, but it does seem that that would be the only way. It's not quite what I was looking for, but it simple and direct.
Doing it in data table is the easiest option, but if you are willing to use some JSL you could manipulate the non-conformance table box to also include Yield % (might be a bit weird to have Yield % in nonconformance though) or add separate outlinebox+tablebox for conformance (placing can be annoying)
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
obj = dt << Process Capability(
Process Variables(:PNP1),
Individual Detail Reports(1),
{:PNP1 << Process Capability Analysis(Nonconformance(1))}
);
tb = Report(obj)["Nonconformance", TableBox(1)];
obsperc = tb[Number Col Box("Observed %")] << get as matrix;
yieldperc = J(3, 1, 100) - obsperc;
(Report(obj)["Nonconformance", TableBox(1)]) << Append(
Number Col Box("Yield %", yieldperc, << Set Format("Fixed Dec", 9, 4))
);

Actually this question comes up a lot so this will be helpful to many.
The script will prompt you to select the columns which have a spec property. So you need to make sure the spec property is set before running this. It also creates a graph summarizing the in spec rates for each column split by grouping variables.
Names Default To Here( 1 );
dt = Current Data Table();
dlg = Column Dialog(
spec_cols = ColList( "Spec Columns", MinCol( 1 ), MaxCol( 1000 ) ),
group_cols = ColList( "Group Columns", MinCol( 1 ), MaxCol( 20 ) )
);
If( dlg["Button"] != 1,
Beep();
Throw();
);
col_list = dlg["spec_cols"];
group_list = dlg["group_cols"];
for (i=1, i <= nitems(col_list), i++,
col_name = col_list[i] << Get Name;
specproperty = col_list[i] << Get Property( "Spec limits" );
if( (contains(char(specproperty), "LSL") > 0) & (contains(char(specproperty), "USL") > 0),
Eval(Eval Expr(
dt << New Column( col_name || " In Spec", Numeric, "Continuous", Format( "Best", 12 ),
Formula(if((Expr(col_list[i]) > Expr(specproperty["LSL"])) & (Expr(col_list[i]) < Expr(specproperty["USL"])), 1, 0 )))
));
);
if( (contains(char(specproperty), "LSL") == 0) & (contains(char(specproperty), "USL") > 0),
Eval(Eval Expr(
dt << New Column( col_name || " In Spec", Numeric, "Continuous", Format( "Best", 12 ),
Formula(if(Expr(col_list[i]) < Expr(specproperty["USL"]), 1, 0 )))
));
);
if( (contains(char(specproperty), "LSL") > 0) & (contains(char(specproperty), "USL") == 0),
Eval(Eval Expr(
dt << New Column( col_name || " In Spec", Numeric, "Continuous", Format( "Best", 12 ),
Formula(if(Expr(col_list[i]) > Expr(specproperty["LSL"]), 1, 0 )))
));
);
);
cols = dt << Get Column Names();
inspec_cols = {};
for (i=1, i <= nitems(cols), i++,
if (Contains(cols[i], "In Spec"),
Insert Into(inspec_cols, cols[i])
);
);
dt << Group Columns("In Spec Cols", inspec_cols);
dt_inspec_stack = dt << Stack(
columns( Column Group( "In Spec Cols" ) ),
Source Label Column( "Spec Columns" ),
Stacked Data Column( "In Spec" ),
Drop All Other Columns( 1 ),
"Non-stacked columns"n( Keep( group_list ) ),
Output Table("Stack of In Spec Columns")
);
summary_group = {};
for (i=1, i <= nitems(group_list), i++,
col_name = group_list[i] << Get Name;
Insert Into(summary_group, col_name);
);
Insert Into(summary_group,"Spec Columns");
dt_inspec_summary = dt_inspec_stack << Summary(
Group( summary_group ),
Mean( :In Spec ),
Freq( "None" ),
Weight( "None" ),
output table name(
"Summary of In Spec Columns"
)
);
dt_inspec_summary << New Column("CI", Numeric, "Continuous", Format("Best",12),
Formula(Root( (:"Mean(In Spec)"n * (1 - :"Mean(In Spec)"n)) / :N Rows ) * 1.96)
);
dt_inspec_summary << Graph Builder(
Size( 1280, 720 ),
Show Control Panel( 0 ),
Variables(
X( :Spec Columns ),
Y( :"Mean(In Spec)"n ),
Group X( :Reactor ),
Interval( :CI )
),
Elements(
Points( X, Y, Legend( 5 ), Error Interval( "Custom Interval" ) ),
Line( X, Y, Legend( 6 ) )
),
SendToReport(
Dispatch( {}, "Mean(In Spec)", ScaleBox,
{Format( "Percent", 12, 0 ), Min( 0 ), Inc( 0.2 ), Minor Ticks( 1 ),
Label Row( {Show Major Grid( 1 ), Show Minor Grid( 1 )} )}
),
Dispatch( {}, "Graph Builder", FrameBox, {Reference Line Order( 3 )} ),
Dispatch( {}, "Graph Builder", FrameBox( 2 ), {Reference Line Order( 3 )} ),
Dispatch( {}, "Graph Builder", FrameBox( 3 ), {Reference Line Order( 3 )} )
)
);
Hello,
These are all good answers, but I did also want to let everyone know that starting with JMP 19 there is a new option in the Process Capability platform and in process capability analysis within the Distribution platform that allows you to automatically save columns to the data table with In-Spec indicator formulas. See the JMP documentation here: Save In Spec Indicator Formulas.
You can find the option in the Process Capability platform under the red triangle menu Save submenu options.

In the process capability analysis report within the Distribution platform, you can find this option under the Process Capability red triangle menu.

Once you have the In Spec indicator formulas they are easy to analyze and manipulate. I hope you find this helpful
Laura