#12 ふれてみよう高校数学 確率・統計
データの整理
記述統計とは
「100人のテストの点数が手元にある。この集団はどんな特徴があるか?」——一人ひとりの数字を眺めていても全体像は掴めません。「平均は何点か」「バラつきはどのくらいか」「高得点と低得点はどのくらいいるか」——こうして集めたデータを整理・要約して特徴をつかむための統計を記述統計(descriptive statistics)といいます。
主な指標:
| 種類 | 指標 |
|---|---|
| 代表値 | 平均・中央値・最頻値 |
| 散布度 | 分散・標準偏差・範囲・四分位範囲 |
| グラフ | ヒストグラム・箱ひげ図・散布図 |
代表値
平均(mean)
「全員の点数を合計して人数で割る」——最もよく使われる代表値です:
すべての値を足して個数で割る。外れ値の影響を受けやすい——「1人の億万長者がいると、その村の平均所得が跳ね上がる」のが欠点です。
中央値(median)
データを昇順に並べたときの中央の値。外れ値に強い——「億万長者がいても中央値はほとんど変わらない」。
- 奇数個:ちょうど真ん中の値
- 偶数個:中央2つの平均
最頻値(mode)
最も頻繁に現れる値。カテゴリデータでも使える——「一番売れている服のサイズ」を知りたいときなど。
四分位数
「100人のデータを4つのグループに分けたときの境界線」——データの広がり方を詳しく知るための指標です:
- Q1(第1四分位数):下位 25% の境界——「下から25番目の人の位置」
- Q2(第2四分位数):中央値(50%)——「ちょうど真ん中の人の位置」
- Q3(第3四分位数):上位 25% の境界——「下から75番目の人の位置」
- IQR(四分位範囲):——「中央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 の範囲内の最小・最大値——「普通の範囲の端」
- 外れ値:ひげの外側の点(通常は別途プロット)——「普通から大きく外れた値」
ヒストグラムの作り方
- データの範囲を決める(最小値〜最大値)
- ビン(階級)の幅を決める(通常 5〜20 個のビンが目安)
- 各ビンに含まれるデータ数を数える
- 棒グラフとして描く
「どの幅でビンを切るか」によって見え方が変わるので、複数の幅を試してみるのが大切です。
歪みと外れ値
「平均と中央値の差を見ると、分布が偏っているかどうかが分かる」——これが歪みを検出する簡単な方法です:
| 分布の形状 | 平均と中央値の関係 |
|---|---|
| 左右対称 | 平均 ≈ 中央値 |
| 右に歪み(右裾が長い) | 平均 > 中央値 |
| 左に歪み(左裾が長い) | 平均 < 中央値 |
所得分布は典型的な「右に歪んだ」分布——少数の高所得者が平均を引き上げるため、「中央値所得」の方が「平均所得」より実態を反映します。「日本の平均年収より自分の年収が低い人が半数以上いる」のはこれが理由です。
まとめ
- 平均は外れ値に弱く、中央値は外れ値に頑健——「どちらが実態を表すかはデータによる」
- IQR(四分位範囲)は分布の中央50%の広がりを表す——「外れ値に騙されにくいバラつきの指標」
- ヒストグラムは分布の形を、箱ひげ図は5数要約を可視化する——「二つ合わせて見ると全体像が見える」
- 外れ値(Q3+1.5×IQR より大きい、または Q1-1.5×IQR より小さい)は注意が必要——「無視せず原因を調べる」
次回は相関と回帰——2つの変数の間の関係を定量化します。