计算机系统应用教程网站

网站首页 > 技术文章 正文

SPC分析中的能力分析PPM是怎么算的?

btikc 2024-09-25 15:12:39 技术文章 36 ℃ 0 评论

我们在做SPC分析的时候,看检测分布图,如下。

左下角的PPM这些数据是怎么计算的?如果用minitab我们只能知道结果,无法知道计算过程,那么我们就一步步来算一下。

先给定一组数据(子组大小为5)

flat_data =[74.030,74.002,74.019,73.992,74.008,73.995,73.992,74.001,74.011,74.004,73.988,74.024,74.021,74.005,74.002,74.002,73.996,73.993,74.015,74.009,73.992,74.007,74.015,73.989,74.014,74.009,73.994,73.997,73.985,73.993,73.995,74.006,73.994,74.000,74.005,73.985,74.003,73.993,74.015,73.988,74.008,73.995,74.009,74.005,74.004,73.998,74.000,73.990,74.007,73.995,73.994,73.998,73.994,73.995,73.990,74.004,74.000,74.007,74.000,73.996,73.983,74.002,73.998,73.997,74.012,74.006,73.967,73.994,74.000,73.984,74.012,74.014,73.998,73.999,74.007,74.000,73.984,74.005,73.998,73.996,73.994,74.012,73.986,74.005,74.007,74.006,74.010,74.018,74.003,74.000,73.984,74.002,74.003,74.005,73.997,74.000,74.010,74.013,74.020,74.003,73.982,74.001,74.015,74.005,73.996,74.004,73.999,73.990,74.006,74.009,74.010,73.989,73.990,74.009,74.014,74.015,74.008,73.993,74.000,74.010,73.982,73.984,73.995,74.017,74.013]




data = [flat_data[i:i + 5] for i in range(0, len(flat_data), 5)]


flat_data是一维数据,通过转换为二维的数据data(每5个一组)。

定义一个USL和LSL

USL= 74.05
LSL = 73.95


计算平均数、标准差

mean = numpy.mean(flat_data)
std = numpy.std(flat_data,ddof=1)
N = len(flat_data)

注意,上面的std函数的ddof=1表示计算标准差使用的分母是N-1。

ddof=1,那么将使用 N-1 作为分母,这是计算样本标准差的公式。样本标准差是在只有样本数据可用时估计总体标准差的最佳无偏估计。使用 N-1 而不是 N 作为分母的目的是为了修正由于仅使用样本数据而可能导致的方差估计偏低的问题。这种修正通常称为贝塞尔校正。简而言之,当您使用 ddof=1 时,您是在告诉 NumPy 使用样本标准差公式来计算标准差。


有了上面的数据就可以计算整体情况,但如果要计算组内情况还需要计算组内标准差。

计算组内标准差

def calculate_pooled_standard_deviation(groups):
    #这个是和minitab的组内合并标准差验证过的,算法结果一致
    means = [np.mean(group) for group in groups]
    sizes = [len(group) for group in groups]
    sums = [sum((x - mean) ** 2 for x in group) for group, mean in zip(groups, means)]
    total_sum = sum(sums)
    degrees_of_freedom = sum(size - 1 for size in sizes)
    pooled_std_dev = np.sqrt(total_sum/degrees_of_freedom)
    c4 = np.sqrt(2/degrees_of_freedom)*gamma((degrees_of_freedom+1)/2)/gamma(degrees_of_freedom/2)
    pooled_std_dev_unbiased = pooled_std_dev/c4
return pooled_std_dev_unbiased


pool_sd =calculate_pooled_standard_deviation(data)


如果你想进一步了解组内合并标准差的内容,请看《全网第一个讲清楚CPK如何计算的,Step by step,Excel和Python同时实现》,这篇文章里面cpk的计算就是需要用到合并标准差,并且里面详细介绍了合并标准差的计算过程。

计算观测值超限的比例(单位PPM)

percent_below_lsl = sum(1 for element in flat_data if element < LSL)/N*1000000
percent_above_usl = sum(1 for element in flat_data if element >USL)/N*1000000
print(f"观测值大于USL的比例{percent_above_usl}")
print(f"观测值小于于USL的比例{percent_below_lsl}")


计算整体和组内的预期

print('整体预期 PPM <规格下限',(norm.cdf(LSL,mean,std))*1000000)
print('整体预期 PPM >规格上限',(1-norm.cdf(USL,mean,std))*1000000)


print('组内预期 PPM <规格下限',(norm.cdf(LSL,mean,pool_sd))*1000000)
print('组内预期 PPM >规格上限',(1-norm.cdf(USL,mean,pool_sd))*1000000)


对上面的代码的说明

整体预期 PPM <规格下限:

计算总体数据在规格下限以下的累积概率,即正态分布中小于 LSL 的部分。

将这个概率乘以100万,得到每百万个单位中预期有多少个单位会低于规格下限。

整体预期 PPM >规格上限:

计算总体数据在规格上限以上的累积概率,即正态分布中大于 USL 的部分。

由于 norm.cdf 返回的是小于或等于 x 的概率,所以用 1 - norm.cdf(USL, mean, std) 来得到大于 USL 的概率。

同样,将这个概率乘以100万,得到每百万个单位中预期有多少个单位会超过规格上限。

组内预期 PPM <规格下限 和 组内预期 PPM >规格上限:

这两行与前两行类似,但这里使用的是组内标准差 pool_sd 而不是总体标准差 std。

这考虑了组内变异对于规格限制违规概率的影响,通常组内标准差小于总体标准差,因为它只衡量单一组内的变异而不包括组间的变异。

运行上面代码的结果如下:

完整代码下载,请在公众号回复“PPM”进行下载。

推荐文章

  • 如何选择合适的SPC软件
  • 简单好用的SPC分析为什么无法推广起来
  • SPC是什么意思?通俗一点告诉你
  • 一图看尽SPC分析报告
  • 简易SPC软件核心功能简介


如果你想体验我们的产品,扫码联系我们。

SPC控制图45

SPC软件40

过程能力7

minitab5

SPC控制图 · 目录

上一篇如何选择合适的SPC软件下一篇SPC判异规则系列一:1个点远离3倍标准差 的概率和原因

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表