#15 ふれてみよう高校数学 確率・統計

信頼区間と仮説検定

信頼区間とは

「この薬を飲んだ100人の平均血圧が5mmHg下がった」——でも「たまたまそういう100人を選んだだけで、全体ではどのくらいの効果があるの?」という疑問が残ります。これに答えるのが信頼区間です。

標本平均 xˉ\bar{x} は母平均 μ\mu点推定ですが、「どれくらい信用できるか」が分かりません。これを補うのが区間推定(信頼区間)——「真の平均はだいたいこの範囲にある」という幅を持った答えです:

xˉ±zα/2σn\bar{x} \pm z_{\alpha/2} \cdot \frac{\sigma}{\sqrt{n}}

母標準偏差 σ\sigma が既知のとき、95% 信頼区間z0.025=1.96z_{0.025} = 1.96):

[xˉ1.96σn,xˉ+1.96σn]\left[\bar{x} - 1.96\frac{\sigma}{\sqrt{n}},\quad \bar{x} + 1.96\frac{\sigma}{\sqrt{n}}\right]


「95% 信頼区間」の正確な意味

多くの人が誤解しているのが「95%信頼区間の意味」です:

同じ手順を繰り返したとき、作られる区間の 95% が真の母平均 μ を含む

注意:特定の区間が μ\mu を含む確率が 95% という意味ではありません——μ\mu は固定された値であり、「確率」の対象は「区間を生成する手順」の方です。「この区間に真の平均が入っている確率は95%」ではなく「この方法で区間を作り続けると、95%の確率で真の値を捕まえる」というのが正確な解釈です。


信頼区間シミュレーション

同じ手順で何度もサンプリングして信頼区間を作ります。青い区間は真の平均(黄色の縦線)を含んでいて、赤い区間は外れています。最終的に約95%が青(含む)になる様子を確認してください。

95%信頼区間の繰り返しサンプリング:約95%の区間(青)が真の平均μを含み、約5%(赤)は外れる
var MU = 50;
var SIGMA = 10;
var N = 25;
var SE = SIGMA / Math.sqrt(N);
var Z = 1.96;
var intervals = [];
var maxShow = 40;
var timer = 0;
var seed = 31;

function rand() {
seed = (seed * 1664525 + 1013904223) & 0x7fffffff;
return seed / 0x7fffffff;
}
function randNorm() {
var u1 = Math.max(rand(), 0.00001);
return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * rand());
}
function sampleMean() {
var sum = 0;
for (var i = 0; i < N; i++) sum += MU + SIGMA * randNorm();
return sum / N;
}

function addInterval() {
var xbar = sampleMean();
var lo = xbar - Z * SE;
var hi = xbar + Z * SE;
var contains = lo <= MU && MU <= hi;
intervals.push({ lo: lo, hi: hi, xbar: xbar, contains: contains });
if (intervals.length > maxShow) intervals.shift();
}

function loop() {
ctx.clearRect(0, 0, W, H);

timer += 0.016;
if (timer > 0.25 && intervals.length < maxShow * 3) {
  addInterval();
  timer = 0;
}

var chartL = 80, chartR = 520;
var dataMin = 30, dataMax = 70;
var rowH = 8;
var topY = 30;

function toX(v) {
  return chartL + (v - dataMin) / (dataMax - dataMin) * (chartR - chartL);
}

var muX = toX(MU);
ctx.strokeStyle = '#fbbf24';
ctx.lineWidth = 2;
ctx.setLineDash([6, 4]);
ctx.beginPath();
ctx.moveTo(muX, topY - 10);
ctx.lineTo(muX, topY + maxShow * rowH + 10);
ctx.stroke();
ctx.setLineDash([]);
ctx.fillStyle = '#fbbf24';
ctx.font = 'bold 12px monospace';
ctx.textAlign = 'center';
ctx.fillText('μ=' + MU, muX, topY - 16);

for (var i = 0; i < intervals.length; i++) {
  var iv = intervals[i];
  var y = topY + i * rowH + rowH / 2;
  var lox = toX(iv.lo), hix = toX(iv.hi), xbx = toX(iv.xbar);

  ctx.strokeStyle = iv.contains ? '#3b82f6' : '#ef4444';
  ctx.lineWidth = rowH - 2;
  ctx.lineCap = 'round';
  ctx.beginPath();
  ctx.moveTo(lox, y);
  ctx.lineTo(hix, y);
  ctx.stroke();
  ctx.lineCap = 'butt';

  ctx.fillStyle = '#fff';
  ctx.beginPath();
  ctx.arc(xbx, y, 2, 0, Math.PI * 2);
  ctx.fill();
}

var contains = intervals.filter(function(iv) { return iv.contains; }).length;
var pct = intervals.length > 0 ? (contains / intervals.length * 100).toFixed(1) : '---';

ctx.strokeStyle = '#334155';
ctx.lineWidth = 1;
var axisY = topY + maxShow * rowH + 14;
ctx.beginPath();
ctx.moveTo(chartL, axisY);
ctx.lineTo(chartR, axisY);
ctx.stroke();
for (var tick = dataMin; tick <= dataMax; tick += 10) {
  var tx = toX(tick);
  ctx.fillStyle = '#64748b';
  ctx.font = '10px monospace';
  ctx.textAlign = 'center';
  ctx.fillText(tick, tx, axisY + 14);
  ctx.strokeStyle = '#334155';
  ctx.beginPath();
  ctx.moveTo(tx, axisY);
  ctx.lineTo(tx, axisY + 5);
  ctx.stroke();
}

var statsY = axisY + 34;
ctx.fillStyle = '#e2e8f0';
ctx.font = 'bold 14px sans-serif';
ctx.textAlign = 'left';
ctx.fillText('区間数: ' + intervals.length, 20, statsY);
ctx.fillStyle = '#3b82f6';
ctx.fillText('含む (青): ' + contains, 20, statsY + 20);
ctx.fillStyle = '#ef4444';
ctx.fillText('外れ (赤): ' + (intervals.length - contains), 20, statsY + 40);
ctx.fillStyle = '#fbbf24';
ctx.font = 'bold 16px monospace';
ctx.fillText('含む割合: ' + pct + '%', 20, statsY + 65);

ctx.fillStyle = '#94a3b8';
ctx.font = '12px sans-serif';
ctx.textAlign = 'right';
ctx.fillText('n=' + N + ', σ=' + SIGMA + ', SE=' + SE.toFixed(2), W - 20, statsY);
ctx.fillText('95%CI: x̄ ± 1.96×SE', W - 20, statsY + 20);

requestAnimationFrame(loop);
}
loop();

信頼区間の幅に影響する要素

=2×zα/2×σn\text{幅} = 2 \times z_{\alpha/2} \times \frac{\sigma}{\sqrt{n}}

要素大きくすると幅は
信頼水準(95%→99%)広くなる
標本サイズ nn狭くなる
母標準偏差 σ\sigma広くなる

「より確実な答えが欲しい(99%)」ほど幅が広くなり、「より多くデータを取る(n大)」ほど幅が狭くなる——「精度を上げたければデータを増やす」という直感と一致します。


仮説検定

「この薬に本当に効果はあるのか?」「この製品は規格通りの重量か?」——こうした問いに答えるのが仮説検定です。

帰無仮説 H0H_0(否定したい仮説)と対立仮説 H1H_1(主張したい仮説)を設定します。「効果はない」という仮説を立てて、それを否定することで「効果がある」を主張します——「無実を証明するのが難しいように、有罪を証明する戦略」です。

検定の手順:

  1. H0H_0 を仮定する
  2. 検定統計量(例:z=xˉμ0σ/nz = \frac{\bar{x}-\mu_0}{\sigma/\sqrt{n}})を計算する
  3. pp値(H0H_0 が正しいとした場合に今回以上に極端な結果が出る確率)を求める
  4. p<αp < \alpha(有意水準、通常 0.05)なら H0H_0 を棄却する

p値の意味

pp値は「帰無仮説が正しいとした場合に、観測された結果(またはそれ以上に極端な結果)が得られる確率」

p<0.05p < 0.05 のとき「統計的に有意」といいますが、それは「H0H_0 が正しい確率が 5%」という意味ではありません——「H0H_0 が正しいとしたら、こんな結果は5%以下の確率でしか起きない」という意味です。「めったに起きないことが起きた = H0はおかしいのでは」という論理です。


第一種・第二種の過誤

どんな検定でも「間違い」の可能性はゼロにできません——二種類の間違いがトレードオフの関係にあります:

H0H_0 が真H0H_0 が偽
H0H_0 を棄却第一種の過誤(偽陽性) P=αP = \alpha正解(検出力 1β1-\beta
H0H_0 を採択正解第二種の過誤(偽陰性) P=βP = \beta
  • 第一種の過誤α\alpha:有意水準):本当は正しい H0H_0 を間違って棄却——「無実の人を有罪にする」
  • 第二種の過誤β\beta):本当は偽の H0H_0 を見逃す——「犯人を無罪にしてしまう」
  • α\alpha を小さくすると β\beta は大きくなる(トレードオフ)——「冤罪を減らすと、見逃しが増える」

z検定の例

問い: ある工場で製品の重量の母平均が 100g で母標準偏差が 5g と主張されています。25個の標本を取ったところ平均 102g でした。有意水準 5% で検定せよ。

「100gのはずが102g出た。これは偶然か、本当にズレているのか?」——標準誤差の何倍ズレているかで判断します:

H0:μ=100H_0: \mu = 100H1:μ100H_1: \mu \neq 100(両側検定)

z=1021005/25=21=2.00z = \frac{102 - 100}{5/\sqrt{25}} = \frac{2}{1} = 2.00

棄却域:z>1.96|z| > 1.96(両側 5%)

z=2.00>1.96|z| = 2.00 > 1.96 なので H0H_0 を棄却。平均が 100g であるという主張は支持されない——「2g のズレは偶然とは言い切れない」と判断します。


まとめ

  • 信頼区間は「同じ手順で 95% の確率で μ\mu を含む区間が作られる」という長期頻度の解釈——「特定の区間への確率ではない」
  • 信頼区間の幅は nn を大きくすると狭くなる(1/n\propto 1/\sqrt{n})——「データを増やせば精度が上がる」
  • 仮説検定p<αp < \alpha なら H0H_0 を棄却——「まず否定したい仮説を立て、それが崩れたら主張を採用する」
  • ppH0H_0 が正しいとした場合の極端さの確率——「H0が正しい確率ではない」
  • 第一種の過誤(偽陽性)と第二種の過誤(偽陰性)はトレードオフ——「どちらを厳しくするかは目的による」

シリーズを終えて

「確率・統計」の全15回を通じて、場合の数から始まり、確率の基本、分布論、そして推測統計まで学びました。

実生活でデータを見るとき:「このサンプルサイズは十分か」「信頼区間はどれくらい広いか」「p値が低くても効果量は十分か」——こうした問いを立てる習慣が、データに騙されないリテラシーの核心です。

数学の目で世界を見ると、至る所に確率と統計が隠れています。