Python 计算期望值

Python 计算期望值并显示列联表,预期的缺陷产出是一个组合概率。下面将计算轮换缺陷与缺陷类型概率的乘积,为此需要计算轮换和缺陷类型组合的所有12种概率。可以对观测到的数字进行加权,并计算缺陷的详细预期。

计算期望值的代码如下所示:

expected = {
    (s, t): P_shift[s]*P_type[t]*total
    for t in P_type
    for s in P_shift
}

我们会创建一个与defectsCounter对象相似的字典。该字典会有一个带有键值的二元组序列,其中键是轮换和缺陷类型的二元组。字典是通过一个生成器表达式构建而来的,它显式枚举了P_shiftP_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列标题来涵盖所有缺陷类型。对于每个轮换,会生成一行观测值和实际值的配对,并在后面加上总的轮换数。底部将生成一行包含缺陷类型总数和总计数量的脚注。

这样的列联表有助于可视化对观测值和期望值的比较。可以计算这两组值的卡方值,以便于我们确定数据是随机的或是值得进一步研究。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程