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

データの整理

記述統計とは

「100人のテストの点数が手元にある。この集団はどんな特徴があるか?」——一人ひとりの数字を眺めていても全体像は掴めません。「平均は何点か」「バラつきはどのくらいか」「高得点と低得点はどのくらいいるか」——こうして集めたデータを整理・要約して特徴をつかむための統計を記述統計(descriptive statistics)といいます。

主な指標:

種類指標
代表値平均・中央値・最頻値
散布度分散・標準偏差・範囲・四分位範囲
グラフヒストグラム・箱ひげ図・散布図

代表値

平均(mean)

「全員の点数を合計して人数で割る」——最もよく使われる代表値です:

xˉ=1ni=1nxi\bar{x} = \frac{1}{n}\sum_{i=1}^n x_i

すべての値を足して個数で割る。外れ値の影響を受けやすい——「1人の億万長者がいると、その村の平均所得が跳ね上がる」のが欠点です。

中央値(median)

データを昇順に並べたときの中央の値。外れ値に強い——「億万長者がいても中央値はほとんど変わらない」。

  • 奇数個:ちょうど真ん中の値
  • 偶数個:中央2つの平均

最頻値(mode)

最も頻繁に現れる値。カテゴリデータでも使える——「一番売れている服のサイズ」を知りたいときなど。


四分位数

「100人のデータを4つのグループに分けたときの境界線」——データの広がり方を詳しく知るための指標です:

  • Q1(第1四分位数):下位 25% の境界——「下から25番目の人の位置」
  • Q2(第2四分位数):中央値(50%)——「ちょうど真ん中の人の位置」
  • Q3(第3四分位数):上位 25% の境界——「下から75番目の人の位置」
  • IQR(四分位範囲):Q3Q1Q3 - Q1——「中央50%の人たちの幅」

IQR は外れ値に対して頑健な散布度の指標です。


ヒストグラム + 箱ひげ図デモ

上のヒストグラムで分布の形(どの点数帯に何人いるか)を、下の箱ひげ図でQ1・Q2・Q3・外れ値を同時に確認してみましょう。赤い点が外れ値です。

ヒストグラムと箱ひげ図:同じデータの分布を2種類のグラフで同時に可視化
var data = [];
var seed = 42;
function rand() {
seed = (seed * 1664525 + 1013904223) & 0x7fffffff;
return seed / 0x7fffffff;
}
function randNorm() {
var u1 = rand(), u2 = rand();
return Math.sqrt(-2 * Math.log(u1 + 0.0001)) * Math.cos(2 * Math.PI * u2);
}

for (var i = 0; i < 60; i++) {
var v = 50 + randNorm() * 12;
if (rand() < 0.1) v = 50 + (rand() < 0.5 ? -1 : 1) * (25 + rand() * 10);
data.push(Math.round(v));
}

data.sort(function(a, b) { return a - b; });

function quantile(arr, q) {
var idx = (arr.length - 1) * q;
var lo = Math.floor(idx), hi = Math.ceil(idx);
return arr[lo] + (arr[hi] - arr[lo]) * (idx - lo);
}

var q1 = quantile(data, 0.25);
var q2 = quantile(data, 0.5);
var q3 = quantile(data, 0.75);
var iqr = q3 - q1;
var lo_fence = q1 - 1.5 * iqr;
var hi_fence = q3 + 1.5 * iqr;
var whiskerLo = data[0];
var whiskerHi = data[data.length - 1];
for (var d = 0; d < data.length; d++) {
if (data[d] >= lo_fence) { whiskerLo = data[d]; break; }
}
for (var d2 = data.length - 1; d2 >= 0; d2--) {
if (data[d2] <= hi_fence) { whiskerHi = data[d2]; break; }
}

var sum = 0;
for (var d3 = 0; d3 < data.length; d3++) sum += data[d3];
var mean = sum / data.length;

var binSize = 5;
var minVal = 10, maxVal = 90;
var numBins = (maxVal - minVal) / binSize;
var bins2 = [];
for (var b = 0; b < numBins; b++) bins2.push(0);
for (var d4 = 0; d4 < data.length; d4++) {
var bi = Math.floor((data[d4] - minVal) / binSize);
if (bi >= 0 && bi < numBins) bins2[bi]++;
}
var maxCount = 0;
for (var b2 = 0; b2 < bins2.length; b2++) if (bins2[b2] > maxCount) maxCount = bins2[b2];

function scaleX(v) {
return 40 + (v - minVal) / (maxVal - minVal) * 520;
}

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

var histBase = 220, histH = 160;

for (var b3 = 0; b3 < numBins; b3++) {
  var bx = scaleX(minVal + b3 * binSize);
  var bw = scaleX(minVal + (b3 + 1) * binSize) - bx - 1;
  var bh = (bins2[b3] / maxCount) * histH;
  ctx.fillStyle = '#3b82f688';
  ctx.fillRect(bx, histBase - bh, bw, bh);
  ctx.strokeStyle = '#1e4d8c';
  ctx.lineWidth = 1;
  ctx.strokeRect(bx, histBase - bh, bw, bh);
}

ctx.strokeStyle = '#334155';
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(40, histBase);
ctx.lineTo(W - 30, histBase);
ctx.stroke();

for (var tick = minVal; tick <= maxVal; tick += 10) {
  var tx = scaleX(tick);
  ctx.fillStyle = '#64748b';
  ctx.font = '10px monospace';
  ctx.textAlign = 'center';
  ctx.fillText(tick, tx, histBase + 14);
  ctx.strokeStyle = '#334155';
  ctx.lineWidth = 0.5;
  ctx.beginPath();
  ctx.moveTo(tx, histBase);
  ctx.lineTo(tx, histBase + 5);
  ctx.stroke();
}

var bpCy = 295, bpH = 30;

ctx.strokeStyle = '#475569';
ctx.lineWidth = 1.5;
ctx.beginPath();
ctx.moveTo(scaleX(whiskerLo), bpCy);
ctx.lineTo(scaleX(whiskerHi), bpCy);
ctx.stroke();

ctx.fillStyle = '#3b82f644';
ctx.fillRect(scaleX(q1), bpCy - bpH / 2, scaleX(q3) - scaleX(q1), bpH);
ctx.strokeStyle = '#3b82f6';
ctx.lineWidth = 2;
ctx.strokeRect(scaleX(q1), bpCy - bpH / 2, scaleX(q3) - scaleX(q1), bpH);

ctx.strokeStyle = '#fbbf24';
ctx.lineWidth = 2.5;
ctx.beginPath();
ctx.moveTo(scaleX(q2), bpCy - bpH / 2);
ctx.lineTo(scaleX(q2), bpCy + bpH / 2);
ctx.stroke();

ctx.strokeStyle = '#ef4444';
ctx.lineWidth = 2;
ctx.setLineDash([4, 3]);
ctx.beginPath();
ctx.moveTo(scaleX(mean), histBase - histH - 10);
ctx.lineTo(scaleX(mean), bpCy + bpH / 2);
ctx.stroke();
ctx.setLineDash([]);

var labelItems = [
  { label: 'Q1=' + q1.toFixed(1), x: scaleX(q1), color: '#60a5fa', y: bpCy + bpH / 2 + 18 },
  { label: 'Q2=' + q2.toFixed(1), x: scaleX(q2), color: '#fbbf24', y: bpCy + bpH / 2 + 18 },
  { label: 'Q3=' + q3.toFixed(1), x: scaleX(q3), color: '#60a5fa', y: bpCy + bpH / 2 + 18 },
  { label: '平均=' + mean.toFixed(1), x: scaleX(mean), color: '#ef4444', y: histBase - histH - 16 }
];
for (var lb = 0; lb < labelItems.length; lb++) {
  ctx.fillStyle = labelItems[lb].color;
  ctx.font = '11px monospace';
  ctx.textAlign = 'center';
  ctx.fillText(labelItems[lb].label, labelItems[lb].x, labelItems[lb].y);
}

var outliers = data.filter(function(v) { return v < lo_fence || v > hi_fence; });
for (var o = 0; o < outliers.length; o++) {
  ctx.fillStyle = '#ef4444';
  ctx.beginPath();
  ctx.arc(scaleX(outliers[o]), bpCy, 4, 0, Math.PI * 2);
  ctx.fill();
}

ctx.fillStyle = '#e2e8f0';
ctx.font = 'bold 13px sans-serif';
ctx.textAlign = 'left';
ctx.fillText('n=' + data.length + '  IQR=' + iqr.toFixed(1) + '  外れ値=' + outliers.length + '個', 40, 22);

ctx.fillStyle = '#94a3b8';
ctx.font = '11px sans-serif';
ctx.fillText('上: ヒストグラム  下: 箱ひげ図(赤点が外れ値)', 40, 378);

requestAnimationFrame(loop);
}
loop();

箱ひげ図の読み方

  |----[------|---------]-----------|
whiskerLo  Q1  Q2(中央値)  Q3  whiskerHi
                              ○ ← 外れ値
  • (ボックス):Q1〜Q3(データの中央50%)——「真ん中の半分の人たちの範囲」
  • 中央線:中央値 Q2——「ちょうど真ん中の人の値」
  • ひげ:Q1 - 1.5×IQR から Q3 + 1.5×IQR の範囲内の最小・最大値——「普通の範囲の端」
  • 外れ値:ひげの外側の点(通常は別途プロット)——「普通から大きく外れた値」

ヒストグラムの作り方

  1. データの範囲を決める(最小値〜最大値)
  2. ビン(階級)の幅を決める(通常 5〜20 個のビンが目安)
  3. 各ビンに含まれるデータ数を数える
  4. 棒グラフとして描く

「どの幅でビンを切るか」によって見え方が変わるので、複数の幅を試してみるのが大切です。


歪みと外れ値

「平均と中央値の差を見ると、分布が偏っているかどうかが分かる」——これが歪みを検出する簡単な方法です:

分布の形状平均と中央値の関係
左右対称平均 ≈ 中央値
右に歪み(右裾が長い)平均 > 中央値
左に歪み(左裾が長い)平均 < 中央値

所得分布は典型的な「右に歪んだ」分布——少数の高所得者が平均を引き上げるため、「中央値所得」の方が「平均所得」より実態を反映します。「日本の平均年収より自分の年収が低い人が半数以上いる」のはこれが理由です。


まとめ

  • 平均は外れ値に弱く、中央値は外れ値に頑健——「どちらが実態を表すかはデータによる」
  • IQR(四分位範囲)は分布の中央50%の広がりを表す——「外れ値に騙されにくいバラつきの指標」
  • ヒストグラムは分布の形を、箱ひげ図は5数要約を可視化する——「二つ合わせて見ると全体像が見える」
  • 外れ値(Q3+1.5×IQR より大きい、または Q1-1.5×IQR より小さい)は注意が必要——「無視せず原因を調べる」

次回は相関と回帰——2つの変数の間の関係を定量化します。