分散と標準偏差
なぜ「バラつき」を測るか
期待値(平均)だけでは分布の形を説明できません。たとえばこんな2つの投資を考えてみてください:
- 投資A:毎年必ず10%のリターン
- 投資B:1/2で+30%、1/2で-10%(期待値=10%)
どちらも期待値は同じ 10% ですが、リスクが全く違います。Aは安定して10%。Bは「当たれば30%、はずれれば-10%」という賭けに近い——同じ「平均」でも、全然違う話なのです。この「バラつき」を数値化するのが分散と標準偏差です。
分散の定義
「各値が平均からどれくらい離れているか」——この「ズレの大きさ」を計算します。ズレは「プラスもマイナスもある」ので、そのまま足すとゼロになってしまいます。だから二乗してから平均します:
ここで 。各値が平均からどれだけ離れているかの「二乗の平均」です。
計算に便利な別形式——「二乗の期待値」から「期待値の二乗」を引くだけ:
標準偏差
分散は単位が「元の単位の二乗」になってしまうので、その平方根を取ったものが標準偏差(standard deviation)です。「お金の分散がお金の二乗になるのは直感的でない」——だから平方根を取って元の単位に戻します:
サイコロの場合:
「サイコロの目は平均3.5から大体1.7ほどずれる」という感覚です。
同じ平均・異なる分散のデモ
マウスを左右に動かすと分布の広がりが変わります。青い曲線(σが小さい)は細く高く、赤い曲線(σが大きい)は広く低く——「同じ平均でもバラつきは全然違う」を視覚的に確認できます。
function gaussian(x, mu, sigma) {
var exponent = -((x - mu) * (x - mu)) / (2 * sigma * sigma);
return Math.exp(exponent) / (sigma * Math.sqrt(2 * Math.PI));
}
function loop() {
ctx.clearRect(0, 0, W, H);
var sigma1 = 0.5 + (mx / W) * 2.5;
var sigma2 = sigma1 * 2.2;
var mu = 0;
var cx = W / 2, cy = 200;
var scaleX = 60, scaleY = 240;
var range = 5;
var steps = 200;
var dx = range * 2 / steps;
function drawCurve(sigma, color) {
ctx.strokeStyle = color;
ctx.lineWidth = 2.5;
ctx.beginPath();
for (var i = 0; i <= steps; i++) {
var xv = -range + i * dx;
var yv = gaussian(xv, mu, sigma);
var px = cx + xv * scaleX;
var py = cy - yv * scaleY;
if (i === 0) ctx.moveTo(px, py);
else ctx.lineTo(px, py);
}
ctx.stroke();
}
function fillUnder(sigma, color, lo, hi) {
ctx.fillStyle = color;
ctx.beginPath();
ctx.moveTo(cx + lo * scaleX, cy);
for (var i = 0; i <= steps; i++) {
var xv = -range + i * dx;
if (xv < lo || xv > hi) continue;
var yv = gaussian(xv, mu, sigma);
var px = cx + xv * scaleX;
var py = cy - yv * scaleY;
ctx.lineTo(px, py);
}
ctx.lineTo(cx + hi * scaleX, cy);
ctx.closePath();
ctx.fill();
}
fillUnder(sigma2, '#ef444422', -sigma2, sigma2);
fillUnder(sigma1, '#3b82f622', -sigma1, sigma1);
drawCurve(sigma2, '#ef4444');
drawCurve(sigma1, '#3b82f6');
ctx.strokeStyle = '#475569';
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(30, cy);
ctx.lineTo(W - 30, cy);
ctx.stroke();
function drawSigmaMarker(sigma, color, yOff) {
ctx.strokeStyle = color;
ctx.lineWidth = 1.5;
ctx.setLineDash([4, 3]);
ctx.beginPath();
ctx.moveTo(cx - sigma * scaleX, cy - 10);
ctx.lineTo(cx - sigma * scaleX, cy + 10);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(cx + sigma * scaleX, cy - 10);
ctx.lineTo(cx + sigma * scaleX, cy + 10);
ctx.stroke();
ctx.setLineDash([]);
ctx.fillStyle = color;
ctx.font = '11px monospace';
ctx.textAlign = 'center';
ctx.fillText('-σ', cx - sigma * scaleX, cy + 22 + yOff);
ctx.fillText('+σ', cx + sigma * scaleX, cy + 22 + yOff);
}
drawSigmaMarker(sigma1, '#3b82f6', 0);
drawSigmaMarker(sigma2, '#ef4444', 14);
ctx.fillStyle = '#3b82f6';
ctx.font = 'bold 13px sans-serif';
ctx.textAlign = 'left';
ctx.fillText('σ₁ = ' + sigma1.toFixed(2) + ' (狭い)', 20, 30);
ctx.fillStyle = '#ef4444';
ctx.fillText('σ₂ = ' + sigma2.toFixed(2) + ' (広い)', 20, 50);
ctx.fillStyle = '#94a3b8';
ctx.font = '12px sans-serif';
ctx.textAlign = 'center';
ctx.fillText('両者の平均 μ = 0 は同じ', W / 2, 328);
requestAnimationFrame(loop);
}
loop(); 分散の性質
注意: 定数 は分散に影響しない——「平行移動してもバラつきは変わらない」のは当然です。どれだけ全体を上下にずらしても、相互のズレは変わりません。定数倍 は 二乗で効く——「2倍にスケールアップすると、バラつきも2倍になる」のに分散は4倍になります(単位の二乗だから)。
2乗平均の式を使った計算
の使い方——「全ての(x-μ)²を計算するよりも楽」な計算手順です。
例: 確率変数 の確率分布:
| 0 | 1 | 2 | 3 | |
|---|---|---|---|---|
| 1/4 | 1/4 | 1/4 | 1/4 |
標準偏差のイメージ
正規分布(次回学ぶ)では、標準偏差が「どのくらいの範囲に人が集まるか」の目安になります:
- の範囲に全体の 68% が入る
- の範囲に 95% が入る
- の範囲に 99.7% が入る
「身長の平均170cm、標準偏差6cm」なら、「164〜176cmに全体の68%が入る」——標準偏差は「典型的なズレの大きさ」と考えると分かりやすいです。
まとめ
- 分散 :バラつきの二乗平均——「平均からどれだけ離れるか」
- 標準偏差 :元の単位でのバラつきの大きさ——「典型的なズレ幅」
- ——定数は無効、倍率は二乗で効く
- 独立な場合 ——「独立なバラつきは足し算できる」
- 同じ平均でもσが大きいほどリスクが高い——「投資のリスク評価」にも使われる考え方
次回は二項分布を詳しく見て、そのパラメータ np と np(1-p) を確認します。