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

統計的推測の基本

母集団と標本

「日本人全員の平均身長を知りたい」——でも全員を測定するのは不可能です。そこで1000人を無作為に選んで測り、その平均から全体を推定します。これが統計的推測の基本発想です。

母集団(population):調べたい対象全体(例:日本人全員の身長)

標本(sample):母集団から取り出した一部(例:1000人を無作為抽出)

実際には母集団全体を調べることはほぼ不可能なので、標本から母集団の特徴を推定します。これが統計的推測(statistical inference)です。

母集団標本
平均μ\mu(母平均、未知)xˉ\bar{x}(標本平均、計算可能)
分散σ2\sigma^2(母分散、未知)s2s^2(標本分散、計算可能)
大きさNN(通常は未知)nn(既知)

標本平均の性質

「1000人を選んで身長の平均を計算する」——この「標本平均」は、どんな1000人を選ぶかによって毎回少し異なります。つまり標本平均 Xˉ\bar{X} 自体が確率変数なのです:

E[Xˉ]=μE[\bar{X}] = \mu

V[Xˉ]=σ2nV[\bar{X}] = \frac{\sigma^2}{n}

SD[Xˉ]=σn(標準誤差 SE)SD[\bar{X}] = \frac{\sigma}{\sqrt{n}} \quad \text{(標準誤差 SE)}

重要: 標本サイズ nn を4倍にすると、標準誤差は半分になります——「より多くのデータを取るほど推定は精密になるが、4倍のデータで精度は2倍」という関係です。


中心極限定理

統計学で最も重要な定理の一つです——「母集団がどんな形の分布でも、標本平均は正規分布に近づく」という驚きの定理です:

母集団がどんな分布でも、n が大きければ\text{母集団がどんな分布でも、} n \text{ が大きければ}

XˉN ⁣(μ,σ2n)\bar{X} \approx N\!\left(\mu,\, \frac{\sigma^2}{n}\right)

母集団が一様分布でも、指数分布でも、二峰性でも、標本平均を繰り返し取ると正規分布に近づくのです。「どんな形の元データでも、平均を繰り返し計算すると必ずベルカーブになる」——これが中心極限定理の神秘的な美しさです。

目安:n30n \geq 30 で多くの場合に十分な近似になります。


中心極限定理シミュレーション

上のグラフが「母集団(右に歪んだ分布)」、下が「同じ母集団から5個ずつサンプリングして平均を繰り返し計算した分布」です。最初は歪んでいた形が、繰り返すうちにだんだんと正規分布(黄色の曲線)に近づいていく様子を確認してください。

中心極限定理:一様分布(上)から標本サイズ n=5 のサンプルを繰り返し取り、標本平均の分布(下)が正規分布に近づく
var sampleSize = 5;
var sampleMeans = [];
var timer = 0;
var popBins = [];
var meanBins = [];
var numBins = 30;
var maxPop = 0, maxMean = 0;

for (var b = 0; b < numBins; b++) {
popBins.push(0);
meanBins.push(0);
}

var seed = 99;
function rand() {
seed = (seed * 1664525 + 1013904223) & 0x7fffffff;
return seed / 0x7fffffff;
}

function skewedRand() {
var u = rand();
return u * u;
}

function takeSample() {
var vals = [];
for (var i = 0; i < sampleSize; i++) {
  var v = skewedRand();
  vals.push(v);
  var bi = Math.floor(v * numBins);
  if (bi >= numBins) bi = numBins - 1;
  popBins[bi]++;
  if (popBins[bi] > maxPop) maxPop = popBins[bi];
}
var sum = 0;
for (var j = 0; j < vals.length; j++) sum += vals[j];
var mean = sum / vals.length;
sampleMeans.push(mean);

var bi2 = Math.floor(mean * numBins);
if (bi2 >= numBins) bi2 = numBins - 1;
meanBins[bi2]++;
if (meanBins[bi2] > maxMean) maxMean = meanBins[bi2];
}

function drawHistogram(bins, max, x0, y0, w, h, color) {
var bw = w / bins.length;
for (var i = 0; i < bins.length; i++) {
  var bh = max > 0 ? (bins[i] / max) * h : 0;
  ctx.fillStyle = color;
  ctx.fillRect(x0 + i * bw, y0 + h - bh, bw - 1, bh);
}
ctx.strokeStyle = '#334155';
ctx.lineWidth = 1;
ctx.strokeRect(x0, y0, w, h);
}

function gauss(x, mu, sigma) {
return Math.exp(-0.5 * ((x - mu) / sigma) ** 2) / (sigma * Math.sqrt(2 * Math.PI));
}

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

timer += 0.016;
if (timer > 0.06 && sampleMeans.length < 800) {
  for (var k = 0; k < 5; k++) takeSample();
  timer = 0;
}

var histX = 40, histW = W - 60;

ctx.fillStyle = '#94a3b8';
ctx.font = 'bold 12px sans-serif';
ctx.textAlign = 'left';
ctx.fillText('母集団(右歪み分布 x²型)', histX, 16);
drawHistogram(popBins, maxPop, histX, 22, histW, 100, '#8b5cf655');

ctx.fillStyle = '#94a3b8';
ctx.font = 'bold 12px sans-serif';
ctx.fillText('標本平均の分布(n=' + sampleSize + ')', histX, 140);
drawHistogram(meanBins, maxMean, histX, 148, histW, 140, '#3b82f6');

if (sampleMeans.length > 10) {
  var s2 = 0;
  for (var i = 0; i < sampleMeans.length; i++) s2 += sampleMeans[i];
  var meanOfMeans = s2 / sampleMeans.length;
  var varOfMeans = 0;
  for (var i2 = 0; i2 < sampleMeans.length; i2++) {
    varOfMeans += (sampleMeans[i2] - meanOfMeans) * (sampleMeans[i2] - meanOfMeans);
  }
  varOfMeans /= sampleMeans.length;
  var stdOfMeans = Math.sqrt(varOfMeans);

  ctx.strokeStyle = '#fbbf24';
  ctx.lineWidth = 2;
  ctx.beginPath();
  for (var step = 0; step <= 100; step++) {
    var xv = step / 100;
    var yv = gauss(xv, meanOfMeans, stdOfMeans);
    var px = histX + xv * histW;
    var py = 148 + 140 - yv * (maxMean > 0 ? (140 / maxMean) * (sampleMeans.length / numBins * 2) : 1);
    if (step === 0) ctx.moveTo(px, py);
    else ctx.lineTo(px, py);
  }
  ctx.stroke();

  ctx.fillStyle = '#fbbf24';
  ctx.font = '12px monospace';
  ctx.textAlign = 'right';
  ctx.fillText('正規分布フィット(黄線)', W - 20, 305);

  ctx.fillStyle = '#e2e8f0';
  ctx.font = '13px monospace';
  ctx.textAlign = 'left';
  ctx.fillText('標本数: ' + sampleMeans.length + '  平均の平均: ' + meanOfMeans.toFixed(3) + '  SE: ' + stdOfMeans.toFixed(3), histX, 330);
}

ctx.fillStyle = '#64748b';
ctx.font = '12px sans-serif';
ctx.textAlign = 'center';
ctx.fillText('母集団の形にかかわらず、標本平均は正規分布に近づく(中心極限定理)', W / 2, 378);

requestAnimationFrame(loop);
}
loop();

標準誤差と信頼区間(予告)

標本平均 xˉ\bar{x} の標準誤差 SE=σ/nSE = \sigma/\sqrt{n} を使うと、母平均 μ\mu の推定区間を作れます(次回詳しく学ぶ)。「この標本平均から、真の平均はこの範囲にあると95%の確信を持って言える」というのが信頼区間の意味です:

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

z0.025=1.96z_{0.025} = 1.96 を使うと 95% 信頼区間になります。


不偏推定量

母分散の推定では、標本分散 s2=1n1(xixˉ)2s^2 = \frac{1}{n-1}\sum(x_i - \bar{x})^2 を使います(n1n-1 で割る)。

「なぜ nn ではなく n1n-1 で割るの?」——nn で割ると系統的に小さく推定してしまうため(偏り)、n1n-1 で割ることで不偏推定量になります。これをベッセルの補正といいます。「平均を計算するのに1個のデータを使い切ってしまう、だから自由度は n1n-1」というのが直感的な理解です。


まとめ

  • 母集団:調べたい全体(通常は観測不能)、標本:取り出した一部(観測可能)——「部分から全体を推測する」
  • 標本平均の期待値は母平均 μ\mu、標準誤差は σ/n\sigma/\sqrt{n}——「サンプルを増やすほど精密になる」
  • 中心極限定理nn が大きければ Xˉ\bar{X} は正規分布に近づく(母集団の形によらず)——「統計学最大の定理」
  • 標本サイズを大きくするほど推定の精度は上がる(1/n\propto 1/\sqrt{n})——「4倍取れば誤差が半分」

最終回は信頼区間と仮説検定——推測統計の実践的な使い方を学びます。