一様分布の和は一様分布にはならない¶
一様分布の和がどのような分布になるか、実際に和の計算をしてみました。
目次
一様にばらつくものの組み合わせはどのようにばらつくのか¶
感覚的なイメージとして、ある部品の寸法が公差の範囲内で均等にばらついていたとき、その部品を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になります。二乗和平方根は、それぞれの分布が正規分布であることが前提ですが。
分布がわからない公差を足すときには、二乗和平方根よりもモンテカルロ法の方が安全です。
公開日