Python 计算期望值并显示列联表,预期的缺陷产出是一个组合概率。下面将计算轮换缺陷与缺陷类型概率的乘积,为此需要计算轮换和缺陷类型组合的所有12种概率。可以对观测到的数字进行加权,并计算缺陷的详细预期。
计算期望值的代码如下所示:
expected = {
(s, t): P_shift[s]*P_type[t]*total
for t in P_type
for s in P_shift
}
我们会创建一个与defectsCounter
对象相似的字典。该字典会有一个带有键值的二元组序列,其中键是轮换和缺陷类型的二元组。字典是通过一个生成器表达式构建而来的,它显式枚举了P_shift
和P_type
字典中所有键的组合。
字典expected
的值如下所示:
{('2', 'B'): Fraction(2208, 103),
('2', 'D'): Fraction(1216, 103),
('3', 'D'): Fraction(4522, 309),
('2', 'A'): Fraction(2368, 103),
('1', 'A'): Fraction(6956, 309),
('1', 'B'): Fraction(2162, 103),
('3', 'B'): Fraction(2737, 103),
('1', 'C'): Fraction(12032, 309),
('3', 'C'): Fraction(15232, 309),
('2', 'C'): Fraction(4096, 103),
('3', 'A'): Fraction(8806, 309),
('1', 'D'): Fraction(3572, 309)}
映射的每一项都以轮换和缺陷类型作为键,且它与一个Fraction
值相关联,这个值基于轮换次数的缺陷概率,以及缺陷类型乘以总缺陷次数的缺陷概率。一些分数约分了,例如值6624/309可以简化为2208/103。
大的数不适合用分数表示,将其呈现为float
值通常更容易。小数值(如概率)有时用分数表示则更易于理解。
然后将成对输出观测到的次数和预期的次数,这有助于可视化数据。我们将创建如下内容来汇总观测到的值和预期的值:
obs exp obs exp obs exp obs exp
15 22.51 21 20.99 45 38.94 13 11.56 94
26 22.99 31 21.44 34 39.77 5 11.81 96
33 28.50 17 26.57 49 49.29 20 14.63 119
74 69 128 38 309
这里显示了12个单元格。每个单元格的值都包含观测到的缺陷数量和预期的缺陷数量。每一行的最后是轮换总数,每一列的最下面是缺陷总数。
在某些情况下,可以将这种数据导出为CSV格式并构建一个电子表格。在其他一些情况下,可以构建一个HTML版本的列联表,并将布局细节留给浏览器去处理。这里显示的是纯文本版本。
以下代码包含的一系列语句用于创建如前所示的列联表:
print("obs exp "*len(type_totals))
for s in sorted(shift_totals):
pairs = [
f"{defects[s,t]:3d} {float(expected[s,t]):5.2f}"
for t in sorted(type_totals)
]
print(f"{' '.join(pairs)} {shift_totals[s]:3d}")
footers = [
f"{type_totals[t]:3d} "
for t in sorted(type_totals)]
print(f"{' '.join(footers)} {total:3d}")
这样会将缺陷类型展开成一行。前面已经编写了足够多的obsexp
列标题来涵盖所有缺陷类型。对于每个轮换,会生成一行观测值和实际值的配对,并在后面加上总的轮换数。底部将生成一行包含缺陷类型总数和总计数量的脚注。
这样的列联表有助于可视化对观测值和期望值的比较。可以计算这两组值的卡方值,以便于我们确定数据是随机的或是值得进一步研究。