# How are the Control Limit Table constants calculated?

In a given set of manufacturing data, you can determine the control limits for 3-sigma confidence by the following equation: CL = Mean (X) +/- 3 * Standard deviation (population, sigma) / sqrt(# of samples). Now, if you don't have the population standard deviation, there's another way of calculating it: CL = X +/- (A2)*Range (R).

I'm trying to figure out how A2 (A constant from the given table) is calculated. What I have so far is a few things:

1) My google-fu has only demonstrated how to apply the process, not how the table is derived - too many results on "how to do it" makes it very difficult to actually find the derivation. Some mention that a derivation exists, but doesn't give the HOW.

2) X+/-3 *Sigma/(sqrt(n)) = X +/- (A2)*R 3*Sigma/(sqrt(n))=A2*R Given that A2 changes based off of N, but not at the rate of the sqrt(n), and that calculating a population standard deviation requires a lot more than we have, I've come up with a few guesses, and one sure-thing

Sure thing: This is an estimation, but a close enough one that it doesn't matter. Guess: There's a way to estimate population standard deviation based off of the range and the medium, that gets more and more accurate as we add more samples. Given that the standard deviation calculation requires more precise numbers.

I'm having trouble with the last step, putting it all together. I read the similar questions, but they don't quite get there. It'd also be nice to know with what confidence we have on the chart given.

Thank you

• The must be a text, which explains the table. Otherwise it is useless. To which exercise is the table related ? – calculus Oct 14 '15 at 16:42
• By adopting some assumptions, we can make reasonable guesses about what's in your table--but it would be better for you to describe this table in more detail. Could you at least provide a few example entries from it? – whuber Oct 15 '15 at 14:34
• Ok, so I have a set of data, say wight of a product produced. The weights for a run are 16.5 17.3 15.9 18.1 15.2 15.7 which average out to some number near 16. (call it A for now) A is the first run B is the second run C is the 3rd run Etc. – Selkie Oct 15 '15 at 16:47
• The average of A, B, C... = 16. The range is 1.5 16 is our X, the average of all of the runs. Lets say the population standard deviation is 1 Now, we can calculate our control limits, with our goal being 3-sigma production, with the following equation: CL= 16+/-3*1/sqrt(6) (where 6 was the number of weights from each set of measures). However, if we don't have the population standard deviation, we can also use CL = 16 +/- .483 (the A2 from the table) *1.5. – Selkie Oct 15 '15 at 16:57
• Granted in this example I was making some numbers up, so they're off a bit (and the more they're off, the better you can determine that your manufacturing is 'out of control' - but that's the application side). I'm trying to figure out how the A table values were generated. – Selkie Oct 15 '15 at 16:57

The math behind control limits like this can get quite deep without providing a lot of insight. You can confirm these limits for yourself with a simple Monte Carlo simulation. Generate a few random sets of data from a population with a known standard deviation, and compute the range. The range itself will exhibit a certain distribution. We want an unbiased range - that is, over the long run we would like our estimate of the standard deviation from this method to be neither larger nor smaller than the actual standard deviation.

Here is a simple Python program to demonstrate how you might go about this. You don't really need to understand Python to see what is going on here:

# compute standard deviation from sample range
# using simple Monte Carlo method

# the normal distribution we will use:
mu= 16.1
sigma = 3.45

# generate nx100 random samples from this population
# with different size n=2...15

# first we have to import some libraries we will use
import numpy as np

N = 10000
for n in range(2,16):
# generate n x N samples:
sample = np.random.normal(loc=mu, scale=sigma, size=(n,N))
# find the range of each sample
sampleMin = np.min(sample, 0) # take minimum of axis 0: once for each of N samples
sampleMax = np.max(sample, 0) # ditto for the max
sampleRange = sampleMax-sampleMin # the range - this is an array of N values
rangeMean = np.mean(sampleRange) # the mean of these N values
print 'n = %2d, scale factor %.3f'%\
(n, 3*sigma/(rangeMean*np.sqrt(n))) # print the calculated factor


This produces the following output:

n =  2, scale factor 1.893
n =  3, scale factor 1.021
n =  4, scale factor 0.733
n =  5, scale factor 0.578
n =  6, scale factor 0.485
n =  7, scale factor 0.419
n =  8, scale factor 0.372
n =  9, scale factor 0.337
n = 10, scale factor 0.308
n = 11, scale factor 0.287
n = 12, scale factor 0.267
n = 13, scale factor 0.249
n = 14, scale factor 0.235
n = 15, scale factor 0.224


As you can see, the numbers in the last column look an awful lot like the A2 values in your table. The difference will get smaller as you use a larger value for N - but it is practically insignificant.

UPDATE here is a histogram showing how the distribution of the range changes with n. For n=2, the distribution is extremely asymmetric: as n gets bigger, the distribution becomes (unsurprisingly) more Gaussian. 