測定誤差と確度の理論 — 系統誤差・偶然誤差から誤差伝播・計器の階級まで

同じ抵抗器の値を、同じテスターで10回続けて測ってみたとします。すると「100.2Ω、99.8Ω、100.1Ω、99.9Ω……」というふうに、10回とも少しずつ違う値が出ます。おかしなことに、テスターも抵抗器も何も変えていないのに、読みは毎回ぶれるのです。ここで素朴な疑問が生まれます。「本当の値はどれなのか?」「どれを信じればいいのか?」

この問いに正面から答えるのが、測定誤差の理論です。測定という行為には必ず誤差がつきまといます。誤差をゼロにはできません。しかし誤差の「正体」を分類し、その統計的な振る舞いを理解すれば、「本当の値をどれだけの確からしさで言い当てられるか」を定量的に語れるようになります。

この考え方は、あらゆる理工系の現場で土台になります。たとえば、実験レポートで測定値に「±0.3」のような不確かさを添えるとき、その数字がどこから来るのかを説明できます。あるいは、複数の測定量を掛け合わせて求めた電力や抵抗値が、元の測定の誤差からどれくらいの誤差を受け継ぐのかを予測できます。さらに、電圧計や電流計を選ぶとき「0.5級」といった階級表示の意味を理解し、目盛のどのあたりで読めば精度が良いのかを判断できます。

本記事の内容

  • 誤差の定義(誤差・誤差率・補正)と、系統誤差/偶然誤差/過失誤差の分類
  • 偶然誤差が正規分布に従う理由と、算術平均が「最確値」になる理由の導出
  • 誤差伝播の法則(テイラー展開1次から)と、和・差・積・商の具体式
  • 指示計器の階級が生む「目盛の下の方で使うと相対誤差が悪化する」現象
  • Pythonによる偶然誤差・誤差伝播・階級の数値実験

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

誤差とは — 定義から始める

まず言葉を正確にしておきましょう。日常語では「誤差」も「間違い」も似た意味に使いますが、測定の世界では厳密な定義があります。

ある量には、私たちには直接見えない真値(true value) $T$ があると考えます。真値とは「もし完璧な測定器で理想的に測れたら得られるはずの値」です。私たちが実際に読み取る測定値(measured value) を $M$ とすると、誤差(error) $\varepsilon$ は次のように定義されます。

$$ \begin{equation} \varepsilon = M – T \end{equation} $$

つまり誤差とは「測定値が真値からどれだけずれているか」です。符号を持つ量である点に注意してください。測定値が真値より大きければ誤差はプラス、小さければマイナスです。

誤差の絶対的な大きさだけを見ても、それがどれくらい深刻かは分かりません。1Vの誤差は、1Vを測るときには致命的ですが、1000Vを測るときにはごくわずかです。そこで、真値に対する誤差の割合を誤差率(relative error) と呼びます。

$$ \begin{equation} \text{誤差率} = \frac{\varepsilon}{T} = \frac{M – T}{T} \end{equation} $$

誤差率はしばしば百分率で表され、測定の質を分野を越えて比較するときの共通言語になります。

真値が分かっているなら、誤差を打ち消すこともできます。測定値に加えて真値に戻す量を補正(correction) $C$ と呼びます。

$$ \begin{equation} C = T – M = -\varepsilon \end{equation} $$

補正は誤差と符号が逆です。「測定値が真値より0.3大きい(誤差 $+0.3$)」なら、「$-0.3$ を補正すれば真値に戻る」というわけです。補正を真値で割った補正率 も同様に定義できます。ここで正直な疑問がわきます。真値 $T$ が分かっているなら、そもそも測定する必要はないのではないか、と。その通りで、真値は普通は分かりません。だからこそ、測定値の集まりから真値を「推定」する理論が必要になるのです。その推定の質を左右するのが、次に述べる誤差の種類です。

誤差の種類 — 系統誤差・偶然誤差・過失誤差

誤差は、その振る舞いによって大きく3種類に分けられます。この分類が測定誤差論の出発点であり、種類ごとに対処法がまったく違います。

まず全体像を、冒頭で約束した「的当て」のイメージでつかみましょう。ダーツの的を思い浮かべてください。的の中心が真値、放った矢が1回ごとの測定値です。

確度と精度の的当て図:系統誤差と偶然誤差の違い

この図には測定の質を表す2つの独立した軸が描かれています。ひとつは確度(accuracy、正確さ)、すなわち矢の集まりの中心(測定値の平均、図の×印)が的の中心(真値、図の+印)にどれだけ近いか。もうひとつは精度(precision、精密さ)、すなわち矢どうしがどれだけ密集しているか、つまりばらつきの小ささです。右上のパネルを見ると、矢は互いに密集している(精度は高い)のに、的の中心から大きく外れています。これが確度と精度が別物である何よりの証拠です。密集しているからといって正しいとは限らないのです。

この2軸に対応するのが、これから説明する2種類の誤差です。中心からの系統的なずれ(確度の悪さ)を生むのが系統誤差、ばらつき(精度の悪さ)を生むのが偶然誤差です。

系統誤差(かたより)

系統誤差(systematic error) は、同じ条件で測るたびに同じ向き・同じ大きさで現れる誤差です。「かたより(bias)」とも呼ばれます。的当ての図でいえば、矢の集まりの中心そのものが的の中心からずれている状態です。何回測っても、平均は真値に近づきません。系統誤差は、原因によってさらに次のように分けられます。

  • 計器誤差(instrumental error): 測定器そのものが持つ誤差。目盛の刻み方の狂い、ゼロ点のずれ、内部抵抗の影響などです。たとえば電圧計を回路につなぐと、電圧計自身にわずかな電流が流れ、測りたい電圧を少し変えてしまいます。
  • 環境誤差(environmental error): 温度・湿度・気圧・外部磁場など、測定環境が測定器や被測定物に及ぼす影響。金属尺は温度が上がれば伸びるので、暑い日には長さを短めに読んでしまいます。
  • 個人誤差(personal error): 測定者の癖に由来する誤差。アナログ計器の針を斜めから読む「視差」や、ストップウォッチを押すタイミングの遅れなどです。同じ人が測ると、いつも同じ向きにずれがちです。

系統誤差のやっかいなところは、何度測っても平均しても消えないことです。10回測って平均しても、10000回測って平均しても、ずれた中心は動きません。系統誤差を減らすには、原因を突き止めて補正するか(温度補正、ゼロ点調整など)、より正確な標準器と比べて校正するしかありません。

偶然誤差(ばらつき)

偶然誤差(random error) は、測るたびにプラスにもマイナスにも、大きさもまちまちに現れる誤差です。冒頭の「10回測ったら10通り」を生んでいる張本人がこれです。的当ての図でいえば、矢が中心のまわりに散らばっている状態に対応します。

偶然誤差の原因は、無数の小さくて制御しきれない要因の寄せ集めです。電子回路の熱雑音、空気のわずかな揺らぎ、測定器の機械的な微振動、読み取りの微妙な揺れなどが、それぞれ独立にプラスかマイナスに効いてきます。ひとつひとつは小さく、しかも向きがランダムなので、測定を繰り返して平均すると打ち消し合って小さくなっていきます。ここが系統誤差との決定的な違いです。系統誤差は平均しても消えませんが、偶然誤差は平均すれば減らせるのです。この「減り方」を定量化することが、後半の大きなテーマになります。

過失誤差(間違い)

3つ目の過失誤差(gross error / mistake) は、そもそも誤差論の枠の外にある「間違い」です。目盛を1桁読み違えた、記録するときに数字を取り違えた、単位を間違えた、といったものです。これは統計的に扱う対象ではなく、注意深さと確認によって取り除くべきものです。明らかに他とかけ離れた値(外れ値)が出たら、過失誤差を疑い、その測定は捨てます。

以上を1つの式にまとめると、系統誤差と過失誤差を取り除いたあとの1つの測定値は、次のように書けます。

$$ \begin{equation} M = T + b + e \end{equation} $$

ここで $b$ は系統誤差(一定のかたより)、$e$ は偶然誤差(ランダムに揺れる成分)です。この分解を数値で見てみましょう。

繰り返し測定の分解:真値・系統誤差・偶然誤差

真値 $T=10.0$ に対し、系統誤差 $b=0.6$ だけ全体が上に持ち上がり、そのまわりで偶然誤差がランダムに揺れています。緑の線(真値)と赤の破線(測定値の平均)の間の一定の隔たりが系統誤差で、これは点を増やしても縮みません。一方、青い両矢印で示した個々の点の平均からのずれが偶然誤差で、こちらは平均をとれば打ち消し合います。この図が示す最も大事なことは、「たくさん測って平均する」という作戦は偶然誤差にしか効かないという一点です。系統誤差を相手にするには、平均ではなく校正や補正が要ります。

系統誤差は原因の究明という個別の話になるので、ここからは統計的に扱える偶然誤差に焦点を当てます。まず、偶然誤差がなぜ正規分布に従うのかを見ていきましょう。

偶然誤差はなぜ正規分布に従うのか

偶然誤差のヒストグラムを描くと、多くの場合きれいな釣鐘型、すなわち正規分布(ガウス分布) になります。これは経験則であると同時に、深い数学的な理由があります。

その理由の中心にあるのが中心極限定理(central limit theorem) です。定理の主張は、大まかにいえば「たくさんの独立な確率変数を足し合わせると、個々の分布の形によらず、その和は正規分布に近づく」というものです。詳しい証明は中心極限定理の記事に譲りますが、ここで重要なのは、この定理が偶然誤差の生い立ちにぴったり当てはまるという事実です。

先に述べたように、偶然誤差は「無数の小さな要因の寄せ集め」でした。熱雑音、微振動、空気の揺らぎ……こうした要因それぞれを確率変数 $u_1, u_2, \dots, u_k$ とすれば、実際に観測される偶然誤差は、それらの和

$$ \begin{equation} e = u_1 + u_2 + \cdots + u_k \end{equation} $$

だと考えられます。要因の数 $k$ が大きいので、中心極限定理により $e$ は正規分布に近づく、というわけです。各要因 $u_i$ がどんな分布であっても構いません。これを数値実験で確かめてみましょう。ひとつひとつの要因を「区間 $[-0.5, 0.5]$ の一様分布」という、正規分布とはまるで似ていない箱型の分布にとります。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(20260701)
M = 200000  # 試行回数

fig, axes = plt.subplots(1, 4, figsize=(15, 3.8))
for ax, k in zip(axes, [1, 2, 5, 20]):
    # k個の一様乱数の和(=k個の微小要因の重ね合わせ)
    s = rng.uniform(-0.5, 0.5, size=(M, k)).sum(axis=1)
    s = s / s.std()  # 分散を1に揃え、形の変化だけを見る
    ax.hist(s, bins=80, density=True, color="#5dade2")
    xs = np.linspace(-4, 4, 400)
    ax.plot(xs, np.exp(-xs**2 / 2) / np.sqrt(2 * np.pi), color="#c0392b", lw=2)
    ax.set_title(f"要因 {k} 個の和")
plt.show()

多数の微小要因の和が正規分布に近づく

要因が1個のときはただの箱型(一様分布)で、正規分布(赤い曲線)とは似ても似つきません。ところが2個足すと三角形に、5個で早くも釣鐘型に近づき、20個ではほとんど正規分布と見分けがつかなくなります。もとの分布が箱型でも、足し合わせるだけで正規分布が現れるのです。これが「偶然誤差が正規分布に従う」ことの数学的な裏づけです。

実際の測定でも同じことが起きます。真値 $5.000$ の量を、標準偏差 $0.02$ の偶然誤差つきで2万回測ったときの誤差の分布を見てみましょう。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(20260701)
true_val, sigma = 5.000, 0.02
x = rng.normal(true_val, sigma, 20000)   # 偶然誤差つきの測定値
err = x - true_val                        # 誤差 = 測定値 − 真値

plt.figure(figsize=(8.5, 5))
plt.hist(err, bins=60, density=True, color="#aed6f1", label="偶然誤差のヒストグラム")
xs = np.linspace(-0.08, 0.08, 400)
plt.plot(xs, np.exp(-xs**2 / (2*sigma**2)) / (sigma*np.sqrt(2*np.pi)),
         color="#c0392b", lw=2.2, label="正規分布")
plt.axvline(0, color="#1e8449", ls="--", label="誤差ゼロ(真値)")
plt.xlabel("誤差 = 測定値 − 真値"); plt.legend(); plt.show()

偶然誤差のヒストグラムと正規分布

ヒストグラムは0を中心に左右対称で、理論的な正規分布の曲線とぴったり重なります。ここから偶然誤差の2つの大切な性質が読み取れます。第一に、プラスの誤差とマイナスの誤差が同じくらいの頻度で起きる(対称性)。第二に、小さな誤差ほど起きやすく、大きな誤差ほどまれ(中央が高く裾が薄い)。この対称性こそが、「平均すれば偶然誤差は打ち消し合う」という直感の正体です。ではその「平均」は、真値の推定としてどれくらい正当なのでしょうか。次の節で正面から答えます。

算術平均はなぜ「最確値」なのか

複数回測ったとき、私たちはためらいなく算術平均を「代表値」にします。

$$ \begin{equation} \bar{x} = \frac{1}{N}\sum_{i=1}^{N} x_i \end{equation} $$

しかし、なぜ中央値でも最頻値でもなく、算術平均なのでしょうか。「みんながそうするから」ではなく、きちんとした理由があります。算術平均は、偶然誤差が正規分布に従うという前提のもとで、最も確からしい真値の推定値(最確値) になるのです。これを2つの角度から示しましょう。

最小二乗の観点

真値の推定値を $a$ と置きます。各測定値 $x_i$ と推定値 $a$ の食い違い(残差)は $x_i – a$ です。この残差はプラスもマイナスもあるので、そのまま足すと打ち消し合ってしまいます。そこで二乗して足し合わせた残差二乗和

$$ \begin{equation} S(a) = \sum_{i=1}^{N} (x_i – a)^2 \end{equation} $$

を「全体としてのずれの大きさ」の尺度とし、これを最小にする $a$ を最良の推定値と考えます。これが最小二乗法の発想です。$S(a)$ は $a$ の2次関数(下に凸の放物線)なので、最小値は微分してゼロと置けば求まります。$a$ で微分すると、

$$ \begin{equation} \frac{dS}{da} = \sum_{i=1}^{N} 2(x_i – a)(-1) = -2\sum_{i=1}^{N}(x_i – a) \end{equation} $$

これをゼロと置きます。両辺を $-2$ で割ると和の条件が残ります。

$$ \begin{equation} \sum_{i=1}^{N}(x_i – a) = 0 \end{equation} $$

和を分けて $\sum x_i – Na = 0$ とし、$a$ について解くと、

$$ \begin{equation} a = \frac{1}{N}\sum_{i=1}^{N} x_i = \bar{x} \end{equation} $$

見事に算術平均が出てきました。残差二乗和を最小にする点は、まさに算術平均なのです。この様子をグラフで確かめましょう。

import numpy as np
import matplotlib.pyplot as plt

data = np.array([4.98, 5.01, 4.97, 5.04, 5.00, 5.02, 4.99])
a = np.linspace(4.94, 5.06, 400)
S = np.array([np.sum((data - ai)**2) for ai in a])  # 残差二乗和

plt.figure(figsize=(8.5, 5))
plt.plot(a, S, lw=2.2, label="残差二乗和 S(a)")
plt.axvline(data.mean(), color="#c0392b", ls="--",
            label=f"算術平均 = {data.mean():.4f}")
plt.xlabel("推定値 a"); plt.ylabel("S(a)"); plt.legend(); plt.show()
print("算術平均:", data.mean())

残差二乗和を最小にする算術平均

放物線 $S(a)$ の底(最小点)が、ちょうど算術平均 $5.0014$ の位置に来ています。推定値をこの平均から少しでもずらすと、残差二乗和は必ず増えます。つまり算術平均は「全体としての食い違いが最小になる一点」であり、この意味で最良の代表値なのです。ちなみに最小二乗法をベクトルの射影として幾何学的にとらえる見方は射影行列と最小二乗法の記事で詳しく扱っています。

最尤推定の観点(正規分布のもとで)

もうひとつの角度は確率です。偶然誤差が標準偏差 $\sigma$ の正規分布に従うなら、真値が $a$ のとき測定値 $x_i$ が得られる確率密度は

$$ \begin{equation} p(x_i \mid a) = \frac{1}{\sqrt{2\pi}\,\sigma}\exp\!\left(-\frac{(x_i – a)^2}{2\sigma^2}\right) \end{equation} $$

です。各測定が独立なら、$N$ 個の測定値がまとめて得られる確率(尤度)はこれらの積になります。「観測されたデータが最も起こりやすくなるような $a$ を選ぶ」のが最尤推定です。積のままでは扱いにくいので対数をとると、指数がそのまま降りてきて、

$$ \begin{equation} \log L(a) = \text{定数} – \frac{1}{2\sigma^2}\sum_{i=1}^{N}(x_i – a)^2 \end{equation} $$

となります。$a$ を含む項は右辺の和だけで、しかもマイナス符号がついています。したがって $\log L(a)$ を最大にすることは、和 $\sum (x_i – a)^2$ を最小にすることと同じです。これはさきほどの最小二乗そのものです。こうして、正規分布のもとでは「最尤推定=最小二乗=算術平均」が一致するという美しい結論が得られます。算術平均を代表値に選ぶのは、単なる慣習ではなく、正規分布という前提のもとで最も確からしい選択なのです。

では、算術平均で真値を推定するとき、その推定はどれくらい信頼できるのでしょうか。測定回数を増やせば増やすほど良くなるはずですが、どのくらいの割合で良くなるのか。ここに有名な $1/\sqrt{N}$ の法則が登場します。

平均のばらつきは 1/√N で減る

1回の測定値のばらつき(標準偏差)が $\sigma$ だったとします。これを $N$ 回測って平均した $\bar{x}$ のばらつきは、どれくらいになるでしょうか。答えは $\sigma/\sqrt{N}$ です。導出は分散の性質だけで済みます。

独立な確率変数の和の分散は、分散の和になります。$N$ 個の測定値 $x_i$ がそれぞれ分散 $\sigma^2$ を持ち、互いに独立なら、その和の分散は $N\sigma^2$ です。平均は和を $N$ で割ったものなので、分散の性質「定数 $c$ を掛けると分散は $c^2$ 倍」を使うと、

$$ \begin{equation} V[\bar{x}] = V\!\left[\frac{1}{N}\sum_{i=1}^{N} x_i\right] = \frac{1}{N^2}\, V\!\left[\sum_{i=1}^{N} x_i\right] = \frac{1}{N^2}\cdot N\sigma^2 = \frac{\sigma^2}{N} \end{equation} $$

標準偏差はこの平方根なので、

$$ \begin{equation} \sigma_{\bar{x}} = \frac{\sigma}{\sqrt{N}} \end{equation} $$

を得ます。この $\sigma_{\bar{x}}$ は平均値の標準偏差、あるいは標準誤差(standard error) と呼ばれ、「平均で推定した真値がどれくらい信頼できるか」を表す量です。分散の性質については分散の記事を参照してください。なお、ここで使う $\sigma$ は普通は分かっていないので、標本から推定します。その際に $N$ ではなく $N-1$ で割る理由はベッセル補正の記事で解説しています。

この $1/\sqrt{N}$ という減り方には、実務上とても重要な意味があります。平均のばらつきを半分にするには、$\sqrt{N}$ を2倍、すなわち測定回数を4倍にしなければなりません。10分の1にするには100倍です。回数を増やせば精度は上がりますが、その見返りはだんだん割に合わなくなる、ということです。数値実験で確かめましょう。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(20260701)
sigma = 1.0
Ns = np.arange(1, 101)
trials = 4000

emp = []
for N in Ns:
    samples = rng.normal(0, sigma, size=(trials, N))
    means = samples.mean(axis=1)   # N回平均を4000セット作る
    emp.append(means.std())        # 平均値のばらつきを測る
emp = np.array(emp)

plt.figure(figsize=(8.5, 5))
plt.plot(Ns, emp, "o", ms=4, label="平均の標準偏差(実測)")
plt.plot(Ns, sigma/np.sqrt(Ns), color="#c0392b", lw=2.2, label="σ/√N(理論)")
plt.xlabel("平均する測定回数 N"); plt.legend(); plt.show()
print("N=4 実測", emp[3], " 理論", sigma/np.sqrt(4))
print("N=100 実測", emp[99], " 理論", sigma/np.sqrt(100))

平均の標準偏差が1/√Nで減る

実測の点(丸)が理論曲線 $\sigma/\sqrt{N}$ の上にきれいに乗っています。$N=4$ で実測 $0.500$(理論 $0.5$)、$N=100$ で実測 $0.101$(理論 $0.1$)と、ぴたりと一致しました。曲線は最初は急に下がりますが、$N$ が大きくなるほど寝てきます。これが「回数を増やしても得られる精度改善は先細りになる」ことの視覚的な表れです。ただし繰り返しますが、この改善が効くのは偶然誤差だけです。系統誤差はこの曲線とは無関係に、一定のかたよりとして居座り続けます。

ここまでは1つの量を繰り返し測る話でした。しかし現実の測定では、いくつかの測定量を組み合わせて別の量を計算することがよくあります。抵抗 $R = V/I$ のように、測った電圧と電流から抵抗を求める、といった具合です。このとき、元の測定の誤差は計算結果にどう受け継がれるのでしょうか。それを扱うのが誤差伝播の法則です。

誤差伝播の法則

いくつかの測定量 $x_1, x_2, \dots, x_n$ から、関数 $y = f(x_1, x_2, \dots, x_n)$ で別の量 $y$ を計算するとします。各 $x_i$ にはそれぞれ偶然誤差(標準偏差 $\sigma_i$)があります。このとき $y$ の誤差はどうなるか、というのが問題です。

鍵になるのは、誤差は真値に比べて小さいという事実です。誤差が小さいなら、関数 $f$ を真値のまわりでテイラー展開し、1次の項だけ残す(線形近似する)ことが許されます。真値を $x_i^0$、誤差を $\Delta x_i = x_i – x_i^0$ とすると、

$$ \begin{equation} y \approx f(x_1^0, \dots, x_n^0) + \sum_{i=1}^{n} \frac{\partial f}{\partial x_i}\,\Delta x_i \end{equation} $$

第1項が $y$ の真値 $y^0$ です。したがって $y$ の誤差 $\Delta y = y – y^0$ は、各測定量の誤差の線形結合になります。

$$ \begin{equation} \Delta y \approx \sum_{i=1}^{n} \frac{\partial f}{\partial x_i}\,\Delta x_i \end{equation} $$

偏微分 $\partial f/\partial x_i$ は「$x_i$ の誤差が $y$ にどれだけの重みで効くか」を表す感度係数です。あとはこの式の分散をとります。各測定の誤差 $\Delta x_i$ が互いに独立なら、独立な確率変数の和の分散は分散の和になり、係数は二乗されて外に出ます。

$$ \begin{equation} \sigma_y^2 = \sum_{i=1}^{n} \left(\frac{\partial f}{\partial x_i}\right)^{2} \sigma_i^2 \end{equation} $$

これが誤差伝播の法則(law of propagation of error) です。標準偏差でいえば

$$ \begin{equation} \sigma_y = \sqrt{\sum_{i=1}^{n} \left(\frac{\partial f}{\partial x_i}\right)^{2} \sigma_i^2} \end{equation} $$

となります。誤差が二乗して足される(「二乗和平方根」で合成される)点が肝心です。単純な足し算ではありません。これは、独立にプラスマイナスに揺れる誤差どうしがある程度打ち消し合うため、最悪の場合ほどには誤差が膨らまないことを意味します。この一般式を、よく使う4つの演算に当てはめてみましょう。

和と差

$y = x_1 + x_2$ の場合、偏微分はどちらも $1$ です。$y = x_1 – x_2$ の場合は $+1$ と $-1$ ですが、二乗すればどちらも $1$ になります。したがって和でも差でも、

$$ \begin{equation} \sigma_y = \sqrt{\sigma_1^2 + \sigma_2^2} \end{equation} $$

となります。和・差では絶対誤差(標準偏差そのもの)が二乗和平方根で合成される、と覚えておきましょう。符号によらず誤差は必ず増える方向に働きます。

積と商

$y = x_1 x_2$ の場合、偏微分は $\partial y/\partial x_1 = x_2$、$\partial y/\partial x_2 = x_1$ です。代入すると $\sigma_y^2 = x_2^2\sigma_1^2 + x_1^2\sigma_2^2$。両辺を $y^2 = x_1^2 x_2^2$ で割って整理すると、相対誤差の形になります。

$$ \begin{equation} \left(\frac{\sigma_y}{y}\right)^2 = \left(\frac{\sigma_1}{x_1}\right)^2 + \left(\frac{\sigma_2}{x_2}\right)^2 \end{equation} $$

商 $y = x_1/x_2$ でも、偏微分を計算して同じ手順を踏むと、まったく同じ式が出てきます。つまり積・商では相対誤差が二乗和平方根で合成されるのです。和差が「絶対誤差」で、積商が「相対誤差」で合成される、という対比が誤差伝播の要点です。これをモンテカルロ法で検証しましょう。積 $z = xy$ の場合です。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(20260701)
x_m, x_s = 10.0, 0.2   # x = 10, 相対誤差2%
y_m, y_s = 4.0, 0.12   # y = 4,  相対誤差3%
N = 400000

xs = rng.normal(x_m, x_s, N)
ys = rng.normal(y_m, y_s, N)
z = xs * ys                      # 積をそのまま乱数で計算
z_m = x_m * y_m
rel = np.sqrt((x_s/x_m)**2 + (y_s/y_m)**2)  # 相対誤差の理論値
z_s_analytic = z_m * rel

plt.figure(figsize=(8.5, 5))
plt.hist(z, bins=90, density=True, color="#d7bde2", label="モンテカルロ(z=xy)")
zz = np.linspace(z.min(), z.max(), 400)
plt.plot(zz, np.exp(-(zz-z_m)**2/(2*z_s_analytic**2))/(z_s_analytic*np.sqrt(2*np.pi)),
         color="#c0392b", lw=2.2, label="解析(誤差伝播則)")
plt.xlabel("z = x · y"); plt.legend(); plt.show()
print("MC std:", z.std(), " 解析:", z_s_analytic)
print("相対誤差 MC:", z.std()/z_m, " 解析:", rel)

積の誤差伝播:モンテカルロと解析式の一致

乱数を実際にたくさん掛け合わせて作ったヒストグラム(紫)が、誤差伝播則から計算した正規分布の曲線(赤)と見事に重なっています。標準偏差もモンテカルロの $1.442$ に対し解析値 $1.442$、相対誤差もモンテカルロ $3.60\%$ に対し解析値 $3.61\%$ とほぼ一致しました。相対誤差の合成を確かめると、$\sqrt{2^2 + 3^2} = \sqrt{13} \approx 3.61\%$ となり、確かに元の $2\%$ と $3\%$ が二乗和平方根で合わさっています。テイラー展開の1次近似で導いた式が、実際のランダムな計算をきちんと言い当てているのです。

4つの演算をまとめて比べてみましょう。$x = 10 \pm 2\%$、$y = 4 \pm 3\%$ に対して、和・差・積・商それぞれの合成相対誤差を、解析式とモンテカルロで並べます。

import numpy as np

rng = np.random.default_rng(20260701)
x_m, x_s, y_m, y_s = 10.0, 0.2, 4.0, 0.12
N = 400000
xs = rng.normal(x_m, x_s, N)
ys = rng.normal(y_m, y_s, N)

rel = np.sqrt((x_s/x_m)**2 + (y_s/y_m)**2)
print("和 x+y : 解析 %.2f%%  MC %.2f%%" %
      (np.sqrt(x_s**2+y_s**2)/(x_m+y_m)*100, (xs+ys).std()/(x_m+y_m)*100))
print("差 x-y : 解析 %.2f%%  MC %.2f%%" %
      (np.sqrt(x_s**2+y_s**2)/(x_m-y_m)*100, (xs-ys).std()/(x_m-y_m)*100))
print("積 x*y : 解析 %.2f%%  MC %.2f%%" % (rel*100, (xs*ys).std()/(x_m*y_m)*100))
print("商 x/y : 解析 %.2f%%  MC %.2f%%" % (rel*100, (xs/ys).std()/(x_m/y_m)*100))

四則演算の合成相対誤差:差で誤差が拡大

積と商はどちらも $3.61\%$ で相対誤差の二乗和平方根に一致し、和は $1.67\%$ にとどまっています。ところが差だけが $3.89\%$ と飛び抜けて大きくなっています。和も差も絶対誤差は同じ $\sqrt{0.2^2 + 0.12^2}$ なのに、なぜ差の相対誤差だけ大きいのでしょうか。答えは分母にあります。差 $x – y = 6$ は和 $x + y = 14$ よりずっと小さいので、同じ絶対誤差でも相対誤差は大きくなります。この現象は「差の測定」で深刻な問題を引き起こします。

差の測定で誤差が拡大する — 桁落ち

さきほどの差の例をもっと極端にすると、測定における落とし穴がはっきり見えてきます。近い大きさの2つの量の差をとると、相対誤差が爆発的に大きくなるのです。これは桁落ちと呼ばれ、数値計算でも測定でも避けたい現象です。

たとえば、ほぼ $100$ に近い2つの量 $a, b$ を、それぞれ絶対誤差 $0.1$ で測ったとします。差 $a – b$ の絶対誤差は $\sqrt{0.1^2 + 0.1^2} \approx 0.14$ で一定です。ところが差そのものが小さくなると、相対誤差 $0.14/(a-b)$ は急激に大きくなります。

import numpy as np
import matplotlib.pyplot as plt

a_s = b_s = 0.1                       # それぞれの絶対誤差
diffs = np.linspace(0.5, 40, 300)     # 差 a-b の大きさ
rel_diff = np.sqrt(a_s**2 + b_s**2) / diffs * 100

plt.figure(figsize=(8.5, 5))
plt.plot(diffs, rel_diff, color="#c0392b", lw=2.2)
plt.xlabel("差 (a − b) の大きさ"); plt.ylabel("差の相対誤差 [%]")
plt.show()
print("差=1 のとき相対誤差:", np.sqrt(a_s**2+b_s**2)/1.0*100, "%")

近い量の差では相対誤差が急拡大する

差が $40$ のときは相対誤差は $0.35\%$ 程度で問題ありませんが、差が $1$ まで縮むと相対誤差は $14\%$ にまで跳ね上がります。それぞれの量は $0.1\%$ の精度($0.1/100$)で測れているのに、その差は $14\%$ もの誤差を抱えてしまうのです。これは実務上とても重要な教訓を含んでいます。「大きな量どうしの小さな差」を測りたいときは、差を計算で求めるのではなく、差そのものを直接測る工夫をすべきだということです。たとえば温度差を測るなら、2点の温度を別々に測って引き算するより、2点をつないだ熱電対で温度差を直接測るほうが、はるかに精度が良くなります。

誤差伝播はここまでにして、最後に測定器そのものの誤差、とくにアナログ指示計器の「階級」の話に移ります。これは第一級陸上無線技術士など、計測を扱う資格試験でも頻出のテーマです。

指示計器の階級 — 目盛の下の方は精度が悪い

電圧計や電流計といったアナログ指示計器には、「0.2級」「0.5級」「1.0級」といった階級(accuracy class) が表示されています。この数字は、計器の確度を表す等級で、小さいほど高精度です。ここで決定的に重要なのが、その定義です。

階級の数字は、最大目盛(フルスケール)に対する百分率として最大許容誤差を定めています。たとえば最大目盛 $100\,\text{V}$ の $0.5$ 級電圧計なら、許容される絶対誤差は

$$ \begin{equation} \Delta = \frac{0.5}{100} \times 100\,\text{V} = 0.5\,\text{V} \end{equation} $$

です。ここがポイントで、この $0.5\,\text{V}$ という絶対誤差は、針が目盛のどこを指していても一定です。$100\,\text{V}$ を指しているときも、$20\,\text{V}$ を指しているときも、誤差の絶対値は同じ $0.5\,\text{V}$ なのです。

すると、読み値に対する相対誤差はどうなるでしょうか。読み値を $R$ とすれば、相対誤差は

$$ \begin{equation} \frac{\Delta}{R} = \frac{0.5\,\text{V}}{R} \end{equation} $$

です。分母の $R$ が小さいほど相対誤差は大きくなります。フルスケール $100\,\text{V}$ を指すなら相対誤差は $0.5\%$ ですが、$20\,\text{V}$ を指すなら $0.5/20 = 2.5\%$ にもなります。同じ計器なのに、目盛の下の方で使うと相対誤差が5倍も悪化するのです。これを階級ごとに描いてみましょう。

import numpy as np
import matplotlib.pyplot as plt

FS = 100.0
frac = np.linspace(0.1, 1.0, 300)   # 読み / フルスケール
reading = frac * FS

plt.figure(figsize=(8.5, 5))
for cls, color in [(0.2, "#1e8449"), (0.5, "#2874a6"), (1.0, "#c0392b")]:
    abs_err = cls/100 * FS           # 絶対誤差は一定
    plt.plot(frac*100, abs_err/reading*100, lw=2.2, color=color, label=f"{cls}級")
plt.xlabel("指示値 / 最大目盛 [%]"); plt.ylabel("相対誤差 [%]")
plt.ylim(0, 6); plt.legend(); plt.show()
for f in [0.2, 0.5, 1.0]:
    print("0.5級 読み%d%%FS -> 相対誤差 %.2f%%" % (f*100, 0.5/100*FS/(f*FS)*100))

指示計器の階級と目盛位置による相対誤差

どの階級でも、曲線は反比例のカーブを描いて、目盛の左(下の方)に行くほど急激に相対誤差が悪化します。$0.5$ 級で読むと、フルスケールなら $0.5\%$、$50\%$ の位置で $1.0\%$、$20\%$ の位置では $2.5\%$ です。ここから実務上の鉄則が導かれます。アナログ計器は、指針が最大目盛の $2/3$ 以上を指すレンジを選んで読むべきなのです。測りたい電圧が $20\,\text{V}$ なら、$100\,\text{V}$ レンジではなく $30\,\text{V}$ レンジに切り替えれば、針は目盛の上の方を指し、相対誤差がぐっと小さくなります。レンジ切り替えつまみは、単に振り切れを防ぐためだけにあるのではなく、精度を確保するための道具でもあるのです。

計器の誤差に関連して、もうひとつ日常的に生じる誤差があります。数値を有限の桁で表すときの丸めです。最後にこれを見ておきましょう。

有効数字と丸め誤差

測定値を記録するとき、無限の桁を書くことはできません。「$5.0\,\text{V}$」と書けば、それは「$4.95$ から $5.05$ の間のどこか」を意味します。この、意味のある桁のことを有効数字(significant figures) と呼びます。有効数字は、その測定がどこまで信頼できるかを暗黙のうちに伝える約束事です。$5.0$ と $5.00$ は数としては同じでも、後者のほうが1桁細かく測れたことを主張しています。

有効数字を意識するうえで大切なのが、計算結果の桁数です。おおまかな指針として、掛け算・割り算では有効数字の最も少ない値に桁数をそろえ、足し算・引き算では小数点以下の桁数の最も少ない値にそろえます。誤差を持つ測定値から、元の精度を超える細かい結果を導くことはできないからです。

数値を有限の桁に丸めると、必ず丸め誤差(rounding error) が生じます。ある値を刻み幅 $h$ で丸めると、真の値と丸めた値の差は $-h/2$ から $+h/2$ の範囲に入ります。しかも、その範囲のどこになるかはほぼ均等(一様分布)です。一様分布 $[-h/2, h/2]$ の標準偏差は $h/\sqrt{12}$ なので、丸め誤差の標準偏差は

$$ \begin{equation} \sigma_{\text{round}} = \frac{h}{\sqrt{12}} \end{equation} $$

となります。これを数値実験で確かめましょう。$0$ から $10$ の一様な値を、小数第1位(刻み $0.1$)まで丸めたときの誤差の分布です。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(20260701)
N = 200000
true_vals = rng.uniform(0, 10, N)
step = 0.1
rounded = np.round(true_vals/step) * step
err = rounded - true_vals

plt.figure(figsize=(8.5, 5))
plt.hist(err, bins=60, density=True, color="#f5cba7", label="丸め誤差の分布")
plt.axhline(1/step, color="#c0392b", lw=2, label="一様分布 ±(刻み/2)")
plt.xlabel("丸め誤差"); plt.legend(); plt.show()
print("丸め誤差の標準偏差:", err.std(), " 理論 h/√12:", step/np.sqrt(12))

丸め誤差は一様分布に従う

丸め誤差のヒストグラムは $\pm 0.05$(刻みの半分)の範囲に平らに広がり、まさに一様分布になっています。標準偏差は実測 $0.0289$ に対し理論値 $h/\sqrt{12} = 0.0289$ と一致しました。この事実は誤差伝播と組み合わせて使えます。デジタル計器の最小桁による丸めも、$h/\sqrt{12}$ の標準偏差を持つ誤差源として、ほかの偶然誤差と二乗和平方根で合成できるのです。丸めは避けられませんが、その大きさは正確に見積もれる、というわけです。

まとめ

本記事では、測定誤差と確度の理論を、定義から計器の階級まで一貫した流れで解説しました。

  • 誤差の定義: 誤差 $= M – T$(測定値 $-$ 真値)。真値に対する割合が誤差率、真値に戻す量が補正。
  • 誤差の分類: 何度測っても消えない系統誤差(計器・環境・個人)と、平均すれば打ち消し合う偶然誤差、そして枠外の過失誤差。確度(かたよりの小ささ)と精度(ばらつきの小ささ)は別物。
  • 偶然誤差と正規分布: 無数の微小要因の和なので、中心極限定理により正規分布に従う。
  • 算術平均が最確値: 残差二乗和を最小にする点が算術平均であり、正規分布のもとでは最尤推定とも一致する。
  • $1/\sqrt{N}$ の法則: 平均のばらつきは $\sigma/\sqrt{N}$ で減る。ばらつきを半分にするには回数を4倍必要。ただし系統誤差には効かない。
  • 誤差伝播の法則: テイラー展開1次から $\sigma_y^2 = \sum (\partial f/\partial x_i)^2\sigma_i^2$。和差は絶対誤差、積商は相対誤差が二乗和平方根で合成される。近い量の差では相対誤差が拡大する(桁落ち)。
  • 指示計器の階級: 最大目盛に対する百分率なので、目盛の下の方で使うと相対誤差が悪化する。針が $2/3$ 以上を指すレンジで読むのが鉄則。
  • 丸め誤差: 刻み幅 $h$ の一様分布で、標準偏差は $h/\sqrt{12}$。

これらは電気計測にとどまらず、物理実験、機械計測、信号処理まで共通の土台です。とくに系統誤差と偶然誤差を分けて考える視点、そして誤差伝播の二乗和平方根の合成は、どんな測定にも顔を出します。なお、これらの誤差論は測定を扱う各種の資格試験(第一級陸上無線技術士の「無線工学の基礎」など)でも頻出のテーマなので、定義と階級の考え方は押さえておくと役立ちます。

次のステップとして、以下の記事も参考にしてください。