みさご解体新書

度数分布

解説/アルゴリズム

度数分布

86, 20, 71, 43, 39, 66, 59, 50, 83, 63
48, 31, 80, 79, 100, 92, 83, 44, 52, 56

上記は 1 組男子 20 人のテスト結果のデータ。

このようなデータの傾向を調べるためには、値を適当な区間に分け、その区間ごとにデータの個数を集計する。

階級(点) 以上~未満 度数(人)
0 ~ 20 0
20 ~ 40 3
40 ~ 60 7
60 ~ 80 4
80 ~ 100 5
100 ~ 120 1

集計して区間ごとにまとめた表を度数分布表といい、各区間を階級、区間の幅を階級の幅、階級の中央の値を階級値、各階級に入るデータの個数を度数と呼ぶ。

相対度数

25, 27, 38, 46, 52, 54, 66, 71, 76, 76
78, 82, 91, 96, 98

新たに 1 組女子 15 人のテスト結果のデータで度数分布表を作る。

階級(点) 以上~未満 度数(人)
0 ~ 20 0
20 ~ 40 3
40 ~ 60 3
60 ~ 80 5
80 ~ 100 4
100 ~ 120 0

男子と女子の度数分布表ができたので比較をするために 2 つの表を結合する。

階級(点) 以上~未満 度数(人/男子) 度数(人/女子)
0 ~ 20 0 0
20 ~ 40 3 3
40 ~ 60 7 3
60 ~ 80 4 5
80 ~ 100 5 4
100 ~ 120 1 0

男子と女子では人数が違うので単に比較しただけだとデータの傾向が分かりづらい。

このような場合は各階級の度数が全体のどれぐらい占めているか、つまり割合で表すとよい。

階級(点) 以上~未満 相対度数(男子) 相対度数(女子)
0 ~ 20 0 0
20 ~ 40 0.15 0.2
40 ~ 60 0.35 0.2
60 ~ 80 0.2 0.33
80 ~ 100 0.25 0.27
100 ~ 120 0.05 0

各階級の度数を、度数の合計で割った値を相対度数と呼ぶ。

コード解説

// 元データ
const data = [
  86, 20, 71, 43, 39, 66, 59, 50, 83, 63, 48, 31, 80, 79, 100, 92, 83, 44, 52,
  56,
];
// 度数分布表
const table: number[] = [];
// 階級の幅
const range = 20;
// テストの最大の点(100が100~120の範囲なので120)
const max = 120;
// 階級の数
const rMax = Math.ceil(max / range);

// 各階級の度数を0にしておく
for (let i = 0; i < rMax; i++) {
  table[i] = 0;
}

// 各データを階級の幅で割ることで階級を取得
// 該当の階級の値を増やす
data.forEach((v) => {
  const i = Math.floor(v / range);
  table[i]++;
});

// 度数分布表の出力
table.forEach((b, i) => {
  const rangeMin = range * i;
  const rangeMax = range * (i + 1);
  console.log(`${rangeMin}以上 ${rangeMax}未満: ${table[i]}`);
});
0以上 20未満: 0人
20以上 40未満: 3人
40以上 60未満: 7人
60以上 80未満: 4人
80以上 100未満: 5人
100以上 120未満: 1人

ソースコード

app.ts

関連記事