cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Try the Materials Informatics Toolkit, which is designed to easily handle SMILES data. This and other helpful add-ins are available in the JMP® Marketplace
Choose Language Hide Translation Bar
Creating a phase control chart with historical limits for each phase

In my blog post "4 ways to use fixed/baseline (historical) control limits in Control Chart Builder", I discussed four different methods of entering historical control limits. In this particular blog post, I will specifically discuss setting historical limits for a control chart when there is a phase variable involved.

The column property, set control limits, and excluded row state methods will not work in this scenario because JMP only allows one set of control limits to be defined for the entire chart using these methods. The only method that works for a phase control chart in which you want different limits for each phase is the get limits method. This blog post goes into detail about the get limits method with respect to a phase control chart.

Example

In my blog post "Generating control limits using Control Chart Builder," I introduced a printing process. For the purposes of this blog post, the printing company wishes to reduce the variability of the force needed to break the bond between paper and the book spine. They want to do this for each of three different factories. A new process is decided upon based on a designed experiment. Data is gathered from the new process. The goal is to plot the new data on a control chart with historical limits from the old process. This way, the printing company can compare the new process to the old process limits. 

Each factory has different machines, different operators, and is also located in different countries; therefore, each factory has a unique set of historical limits and information. Historical control limits were calculated with old data (before the process change). This phase control chart can be seen below.

Figure 1: Phase control chart with historical dataFigure 1: Phase control chart with historical data

Limits Table

To use the get limits method, we must have a limits data table. Three columns are needed in this limits table:

  1. A _LimitsKey column, which defines the statistic.
  2. A column with the same name as the process variable that contains the value of the statistic listed in the _LimitsKey column.
  3. A column with the same name as the phase variable that contains identifying information about which phase the statistic applies to.

JMP 13.1 and above will create this table for you if you click on the red triangle next to Control Chart Builder and choose Save Limits -> in New Table. For versions of the software prior to JMP 13.1, you can easily create this table yourself from the Limit Summaries table of a Control Chart Builder report.  To create this table, right-click in the Force Limit Summaries table shown in Figure 1 and choose Make into Data Table.

Figure 2: Force Limits Summary tableFigure 2: Force Limits Summary table

You will need to perform some data table manipulations to get this table in the proper format.  Choose Tables->Stack. Select LCL, Avg, and UCL and click Stack Columns. In the box next to Output table name, type Force Limits. Change the Stacked Data Column name to Force.

Figure 3: Stack dialogFigure 3: Stack dialog

Click OK. We need to create the _LimitsKey column. JMP is looking for _LCL, _Avg, and _UCL rather than LCL, Avg, and UCL. For the dispersion chart, JMP is looking for _LCLR, _AvgR, and _UCLR.  We can do this using a formula. In the newly created Phase Limits Table, select Cols->New Column.  Name the Column _LimitsKey. Click Column Properties and select Formula. Enter the following formula.

Figure 4: Formula for the _LimitsKey columnFigure 4: Formula for the _LimitsKey column

Click OK.

Figure 5: New Column dialogFigure 5: New Column dialog

Click OK. Your new limits table should look like the following.

Figure 6: Force limits data tableFigure 6: Force limits data table

Phase control chart with historical limits

A change has been made in the process that the printing company hopes will reduce the variability of the force needed to break the bond between the pages and the spine of the book. We have a new data table that contains 70 rows of data that were recorded after this change was made. We would like to use the historical limits on the new graph so that we can see how the new data (after the process change) compares with our historical information (before the process change).

Figure 7: Data from new processFigure 7: Data from new process

To create the control chart, go to Analyze->Quality and Process->Control Chart Builder. Drag Site to the phase role. Drag Force to the Y role. Drag run to the x-axis.

Figure 8: Force control chart with new dataFigure 8: Force control chart with new data

To apply your historical limits to this graph, click on the red triangle next to Control Chart Builder and choose Get Limits. Pick the Force Limits.jmp table that you created in Figure 6.

Figure 9: Force control chart with historical limitsFigure 9: Force control chart with historical limits

Conclusions

None of the points fall outside of the control limits for either the location or dispersion chart. The goal was to reduce variability. Looking at the moving range chart, we see that most points fall below the average line. Especially for sites 1 and 2, it is clear that the variability of force needed to break the bond between pages and the book spine has been decreased. Site 3 is not as obvious as sites 1 and 2. It appears that the variability may have been reduced some. However, it is unclear if this is a significant change or not. The improvements to the printing process have succeeded in reducing the variability.

References

JMP Software: Statistical Process Control Course Notes

Last Modified: Apr 11, 2017 1:32 PM
Comments
tom_abramov
Level V
Hello Tonya, It was very helpful, thank you for your blog. Is it possible to create several control charts with "By" some category and "Get Limits" from table with different limits for phases of each category? If yes, how Limits table have to look like?
tonya_mauldin
Staff

Yes, you can do this.  You would need a separate table for each level of the by variable.  Each of the tables would look the same as in the blog post.

tom_abramov
Level V
OK. Thank you. I will do it in that way in scripting. It means, I will loop over all "by" categories in some table T1 and every iteration save limits table L1 from the file T1 to some temp directory. Then I will execute Control chart command and delete the file L1. Is there some more elegant way to run all this without saving limits table every iteration ?
tonya_mauldin
Staff

No, I do not know of a more elegant way.  Unfortunately the Get Limits command only uses a previously saved data table.

Audrey_Shull
Staff

Hi all - i'm pleased to let you know that with JMP 15.0 and later, the Get Limits command will now accept either a previously saved table OR a currently open data table.

Evan_Morris
Level IV

This is a GREAT feature that I think gets me 90% of where I want to be with something.  I have a system where I am monitoring a few hundred control charts.  The limits change as a benchmarking standard changes over time.  This will allow me to set the benchmarking standards as phases.

 

Now, here's the challenge.  My hope was to use a local data filter to switch around between the few hundred control charts.  This works great for if I am operating in graph builder, but I don't see a way I could filter my limits as well as the data.

 

Anyone see any easy way we could achieve this?

tonya_mauldin
Staff

@Evan_Morris I am not sure I understand your data set up or what you are trying to accomplish.  Perhaps the Process Screening platform would be better suited for your needs if you have hundreds of control charts.  I suggest taking a look at the following blog post, Process Specification Limits that Differ Based on a Grouping Column. If you take a look at the 4th screenshot in this blog post, you will see that you can enter the centerline and sigma for control limits.  The specification limits are not required for this platform.

Evan_Morris
Level IV

Tonya

 

I am monitoring a few hundred manufacturing processes where each has it's own mean that changes from time to time.  I'm using the phase chart to manage that mean change.  I have had luck using the local data filters in the normal graph structure to allow quick exploration through the 100+ data sets, but if I do that I can't bring in the the control limits.

 

That said, your point on Process Screening is EXCELLENT.   I think this is the route I should be looking at.

 

Thanks much

Evan

jan_kreuzmann
Level III

Hello,

the last question I had in the discussion group was to build a "Dashboard filter dynamic X-axis but fixed limits of control charts". This time I tried to enhance my dashboard by also implementing a phase to my control charts as I got three machines and four parameters I like to see in my dashboard. My plan was to follow your article here but I have some problems. I will explain my idea first. I have an excel table with four parameters in colum formate and one column defining on which machine the production was running. I import the table into jmp, run my 4 scripts to make a control chart for each parameter defining the machine column as phase. Then I go via red triangle and save limits into 4 tables (1). That way I have the limits saved for the situation untill new data arrives. Once my original excel table has new data I update my jmp table from the excel. I run my scripts for the 4 parameters and via red triangle I get my limits from the tables I saved earlier into these 4 control charts. Then I run my script for the dashboard containing all four control charts.
So now I can see if anything changed in terms of parameters or machines. What's missing at the moment for me is that I do not know how to rename the tables in (1) to a name like "Limits Parameter 1" , which would make it easier for me to put it all into a script. The tables I get from (1) do not include a script how they were built.
I could use the way you described getting the limits table and transforming it, but I did not succeed and thought there must be a new command maybe since your article is from 2017 and using JMP 13 and commands behind the red triangle menu must be somewhere. So with that command I could create my scrip I guess.

Best regards,

Jan

tonya_mauldin
Staff

@jan_kreuzmann I'm confused as to what you are asking for help with.  It sounds like you are still using Control Chart Builder rather than Process Screening.  It also sounds like you want to know how to rename your limits table.  You can do that with the set name command.  If I have misunderstood, please provide more information.  Some sample code and perhaps images of what you want would be helpful.

dt=Open("$SAMPLE_DATA/Quality Control/Coating.jmp");
obj=dt<<Control Chart Builder(
	Variables( Y( :Weight, :Weight 2 ), Phase( :Sample ) )
);
dtLimits=obj<<in New Table;
dtLimits<<Set Name("My Limits");
jan_kreuzmann
Level III

@tonya_mauldin  the script you sent worked well. Thanks. 

As I am not familiar with Process Screening I was trying to implement phases into my control charts (the ones I used to setup in the post "Dashboard filter dynamic X-axis but fixed limits of control charts"), which I then use to setup the dashboard.

I got as fare as this:

// get the open table as current one
dt = current data table();
// make control charts for all parameters with machine as phase and save the limits into data table
obj=dt<<Control Chart Builder(
Size( 528, 464 ),
Show Two Shewhart Charts( 0 ),
Test Excluded Subgroups( 0 ),
Show Control Panel( 0 ),
Include Missing Categories( 0 ),
Show Excluded Region( 0 ),
Show Limit Summaries( 0 ),
Variables( Subgroup( :Lot Nr. ), Y( :Parameter 1 ), Phase( :Machine ) ),
Chart(
Points( Statistic( "Individual" ) ),
Limits( Sigma( "Moving Range" ), Zones( 1 ), Shade Zones( 1 ) )
),
SendToReport(
Dispatch(
{},
"Control Chart Builder",
FrameBox,
{DispatchSeg(
TextSeg( 1 ),
{Line Color( "None" ), Fill Color( "None" )}
), DispatchSeg(
TextSeg( 2 ),
{Line Color( "None" ), Fill Color( "None" )}
), DispatchSeg(
TextSeg( 3 ),
{Line Color( "None" ), Fill Color( "None" )}
)}
)
)
);
dtLimits=obj<<in New Table;
dtLimits<<Set Name("Limits Parameter 1");

I would do this for all my parameters.

Then I was thinking:

With the control charts I setup a Dashboard, 

then update my jmp table.

dt1 = Current Data Table();
n_rows = N Rows();
dt2 = Open(
	"//Dashoardtest.xlsx",
	Worksheets( "Tabelle1" ),
	Use for all sheets( 1 ),
	Concatenate Worksheets( 1 ),
	Create Concatenation Column( 0 ),
	Worksheet Settings(
		1,
		Has Column Headers( 1 ),
		Number of Rows in Headers( 1 ),
		Headers Start on Row( 1 ),
		Data Starts on Row( 2 ),
		Data Starts on Column( 1 ),
		Data Ends on Row( 0 ),
		Data Ends on Column( 0 ),
		Replicated Spanned Rows( 1 ),
		Replicated Spanned Headers( 0 ),
		Suppress Hidden Rows( 1 ),
		Suppress Hidden Columns( 1 ),
		Suppress Empty Columns( 0 ),
		Treat as Hierarchy( 0 ),
		Multiple Series Stack( 0 ),
		Import Cell Colors( 0 ),
		Limit Column Detect( 0 ),
		Column Separator String( "-" )
	)
);
dt2 << DeleteRows( Index( 1, n_rows ) );
dt1 << Concatenate( dt2, Append to first table );
Close( dt2 );
Names Default To Here( 1 );
dt = Current Data Table();

this would automatically update my dashbaord which in turn will calculated new limits.

In this dashboard I now have the same problem I had with the earlier one, as limits will be calculated according to the Lot number I choose. Last time you help with the command to save the limits into the column properties, but this only works without a phase. 

jan_kreuzmann_0-1623250521195.png

 

I can still get the old limits from the tables into the control chart of my open dashboard manually using the red triangle menu, but I have not see the possibility to do it with a script.

I other words how can I get the limits from the first control charts into my now updated dashboard?

And how can I get the dashboard to keep the limits no matter what lot number I pick? like I had it running in the other dashboard:

jan_kreuzmann_0-1623251019596.png

Here you can see I only picked one lot and still have all limits shown.

Maybe you have an idea what I could do.

 

Best regards

 

Jan

 

 

 

 

tonya_mauldin
Staff

@jan_kreuzmann You have to use the Get Limits command as shown in the blog post.  You can find an example of how to script this in the Object Scripting Index.

dt = Open(
"$SAMPLE_DATA/Quality Control/Coating.jmp"
);
obj = dt <<
Control Chart Builder(
Variables( Subgroup( :Sample ), Y( :Weight ) ),
Chart(
Position( 1 ),
Points( Statistic( "Average" ) ),
Limits( Sigma( "Range" ) )
),
Chart(
Position( 2 ),
Points( Statistic( "Range" ) ),
Limits( Sigma( "Range" ) )
),
Get Limits(
"$SAMPLE_DATA/Quality Control/CoatingLimits.jmp"
)
);

Since you named your table dtLimits, you can use 

Get Limits(dtLimits)
Florian_Vogt
Staff

@jan_kreuzmann not sure I understood correct, but maybe this way helps to get the limits table including phases:

 

obj = Open( "$SAMPLE_DATA/Cities.jmp" ) << Control Chart Builder(
	Test Excluded Subgroups( 1 ),
	Variables( Y( :OZONE ), Phase( :Region ) )
);

obj << Save Limits ( in New Table);

Is that (one of the things) what you need?