一様分布の和は一様分布にはならない

一様分布の和がどのような分布になるか、実際に和の計算をしてみました。

目次

  1. 一様にばらつくものの組み合わせはどのようにばらつくのか
  2. 一様に分布する乱数を作ってシミュレーションする
    1. コード
    2. 結果

一様にばらつくものの組み合わせはどのようにばらつくのか

感覚的なイメージとして、ある部品の寸法が公差の範囲内で均等にばらついていたとき、その部品を2つ組み合わせたら、組み合わせの寸法も均等にばらつくような感じがします。

しかし、実際にはそうならないようです。

中心極限定理 だと思いますが、サンプルを増やしていくと正規分布に近似していきます。

一様に分布する乱数を作ってシミュレーションする

試しに、一様分布している1±0.1という寸法を足してヒストグラムを描いてみました。

コード

Jupyter NotebookでPythonを使います。コードはこんな感じ。

%matplotlib inline

import scipy
import matplotlib.pyplot as plt
import numpy as np

a = scipy.stats.uniform.rvs(loc=0.9, scale=0.2, size=1000000)

b = scipy.stats.uniform.rvs(loc=0.9, scale=0.2, size=1000000)

c = scipy.stats.uniform.rvs(loc=0.9, scale=0.2, size=1000000)

d = scipy.stats.uniform.rvs(loc=0.9, scale=0.2, size=1000000)

e = scipy.stats.uniform.rvs(loc=0.9, scale=0.2, size=1000000)

f = scipy.stats.uniform.rvs(loc=0.9, scale=0.2, size=1000000)

ave = scipy.average(a)
lower = min(a)
upper = max(a)
sig = scipy.std(a, ddof=1)
print('単独')
print('最小 : ', lower)
print('平均 : ' , ave)
print('最大 : ', upper)
print('3 σ : ' , 3 * sig)
print('不良率 ppm : ', len(a[a>(ave + 3 * sig)]) + len(a[a<(ave - 3 * sig)]))
print('4 σ : ' , 4 * sig)
print('不良率 ppm : ', len(a[a>(ave + 4 * sig)]) + len(a[a<(ave - 4 * sig)]))
plt.hist(a, bins=100)


j = a + b
ave = scipy.average(j)
lower = min(j)
upper = max(j)
sig = scipy.std(j, ddof=1)
print('\n組み合わせ 2個')
print('最小 : ', lower)
print('平均 : ' , ave)
print('最大 : ', upper)
print('3 σ : ' , 3 * sig)
print('不良率 ppm : ', len(j[j>(ave + 3 * sig)]) + len(j[j<(ave - 3 * sig)]))
print('4 σ : ' , 4 * sig)
print('不良率 ppm : ', len(j[j>(ave + 4 * sig)]) + len(j[j<(ave - 4 * sig)]))
plt.hist(j, bins=100)

k = a + b + c
ave = scipy.average(k)
lower = min(k)
upper = max(k)
sig = scipy.std(k, ddof=1)
print('\n組み合わせ 3個')
print('最小 : ', lower)
print('平均 : ' , ave)
print('最大 : ', upper)
print('3 σ : ' , 3 * sig)
print('不良率 ppm : ', len(k[k>(ave + 3 * sig)]) + len(k[k<(ave - 3 * sig)]))
print('4 σ : ' , 4 * sig)
print('不良率 ppm : ', len(k[k>(ave + 4 * sig)]) + len(k[k<(ave - 4 * sig)]))
plt.hist(k, bins=100)

l = a + b + c + d
ave = scipy.average(l)
lower = min(l)
upper = max(l)
sig = scipy.std(l, ddof=1)
print('\n組み合わせ 4個')
print('最小 : ', lower)
print('平均 : ' , ave)
print('最大 : ', upper)
print('3 σ : ' , 3 * sig)
print('不良率 ppm : ', len(l[l>(ave + 3 * sig)]) + len(l[l<(ave - 3 * sig)]))
print('4 σ : ' , 4 * sig)
print('不良率 ppm : ', len(l[l>(ave + 4 * sig)]) + len(l[l<(ave - 4 * sig)]))
plt.hist(l, bins=100)

m = a + b + c + d + e
ave = scipy.average(m)
lower = min(m)
upper = max(m)
sig = scipy.std(m, ddof=1)
print('\n組み合わせ 5個')
print('最小 : ', lower)
print('平均 : ' , ave)
print('最大 : ', upper)
print('3 σ : ' , 3 * sig)
print('不良率 ppm : ', len(m[m>(ave + 3 * sig)]) + len(m[m<(ave - 3 * sig)]))
print('4 σ : ' , 4 * sig)
print('不良率 ppm : ', len(m[m>(ave + 4 * sig)]) + len(m[m<(ave - 4 * sig)]))
plt.hist(m, bins=100)

n = a + b + c + d + e + f
ave = scipy.average(n)
lower = min(n)
upper = max(n)
sig = scipy.std(n, ddof=1)
print('\n組み合わせ 6個')
print('最小 : ', lower)
print('平均 : ' , ave)
print('最大 : ', upper)
print('3 σ : ' , 3 * sig)
print('不良率 ppm : ', len(n[n>(ave + 3 * sig)]) + len(n[n<(ave - 3 * sig)]))
print('4 σ : ' , 4 * sig)
print('不良率 ppm : ', len(n[n>(ave + 4 * sig)]) + len(n[n<(ave - 4 * sig)]))
plt.hist(n, bins=100)

plt.show()

長いですが、同じことを繰り返してるだけです。

結果

出力はこうなりました。

単独
最小 :  0.900000161172
平均 :  1.00001424807
最大 :  1.09999953451
3 σ :  0.173135090516
不良率 ppm :  0
4 σ :  0.230846787354
不良率 ppm :  0

組み合わせ 2個
最小 :  1.80053337515
平均 :  2.00004214804
最大 :  2.19979765037
3 σ :  0.24493860354
不良率 ppm :  0
4 σ :  0.326584804721
不良率 ppm :  0

組み合わせ 3個
最小 :  2.70206317823
平均 :  3.00004992458
最大 :  3.29526047756
3 σ :  0.299708781738
不良率 ppm :  0
4 σ :  0.399611708985
不良率 ppm :  0

組み合わせ 4個
最小 :  3.61232235934
平均 :  4.00008439622
最大 :  4.38590795726
3 σ :  0.34598543439
不良率 ppm :  401
4 σ :  0.46131391252
不良率 ppm :  0

組み合わせ 5個
最小 :  4.5231996112
平均 :  5.00006478921
最大 :  5.47455968231
3 σ :  0.386668919715
不良率 ppm :  947
4 σ :  0.515558559621
不良率 ppm :  0

組み合わせ 6個
最小 :  5.42511126991
平均 :  5.99999335256
最大 :  6.56214560043
3 σ :  0.423862621718
不良率 ppm :  1289
4 σ :  0.565150162291
不良率 ppm :  1
分布のグラフ

Cpk=1(3σ)のとき正規分布での不良率は2700ppmなので、分布を足すごとに正規分布に近づいているように見えます。

二乗和平方根で1±0.1を6個足すと6±0.24になります。二乗和平方根は、それぞれの分布が正規分布であることが前提ですが。

分布がわからない公差を足すときには、二乗和平方根よりもモンテカルロ法の方が安全です。

公開日