令和7年度 科目B 問5
アルゴリズム
理論度数に関する問題
次の記述中の[a]と[b]に入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は1から始まる。
予防接種の病気Xに対する予防効果を調査するために集めたデータの集計結果を基に,病気Xにかかるかどうかが,予防接種の有無に影響されないと仮定した場合の人数を計算する。この人数を理論度数という。表1に集計結果の例を示し,表2に表1を基に計算した理論度数を示す。
関数fは,引数dataで受け取った集計結果を基に計算した理論度数を返す。引数と戻り値は二次元配列で,その行が表の行,その列が表の列に対応する。
表1 集計結果の例
単位 人
| 病気Xにかからなかった | 病気Xにかかった | |
|---|---|---|
| 予防接種を受けた | 82 | 6 |
| 予防接種を受けていない | 58 | 8 |
表2 表1を基に計算した理論度数
単位 人
| 病気Xにかからなかった | 病気Xにかかった | |
|---|---|---|
| 予防接種を受けた | [a] | (網掛け) |
| 予防接種を受けていない | (網掛け) | [b] |
注記 網掛けの部分は表示していない。
〔プログラム〕
○実数型の二次元配列: f(実数型の二次元配列: data)
実数型: t ← dataの要素の和
整数型: row ← dataの行数
整数型: col ← dataの列数
実数型の二次元配列: result ← {row行col列の 未定義の値}
整数型: r, c
for (r を 1 から row まで 1 ずつ増やす)
for (c を 1 から col まで 1 ずつ増やす)
result[r, c] ← (dataの行番号rの要素の和) ×
(dataの列番号cの要素の和) ÷ t
endfor
endfor
return result
解答群は原典では a・b の組合せの表。
- アa:44 / b:33
- イa:58 / b:8
- ウa:70 / b:7
- エa:75 / b:2
- オa:80 / b:6
- カa:80 / b:8
- キa:82 / b:6
答えと解説を見る
✓ これが正解オa:80 / b:6
解説
行の和×列の和÷総数で、aは88×140÷154=80、bは6です。
理論度数は、病気Xにかかるかどうかが予防接種の有無に影響されないと仮定したときの人数です。関数fは、それを各マスについて、そのマスがある行の和×そのマスがある列の和÷全体の和で求めています。軸は、表1の観測した人数をそのまま使うのではなく、行の合計と列の合計を先に求めてからこの式に当てはめることです。
まず表1から合計を出します。全体の和tは82+6+58+8=154です。行の和は、予防接種を受けた行が82+6=88、受けていない行が58+8=66です。列の和は、かからなかった列が82+58=140、かかった列が6+8=14です。
aは予防接種を受けた行と、かからなかった列が交わるマスなので、88×140÷154を計算します。88×140=12320で、これを154で割ると80になります。bは受けていない行と、かかった列が交わるマスなので、66×14÷154=924÷154=6です。よって、aは80、bは6の組合せです。検算として表2の4マスを全部出すと、80・8・60・6となり、行の和88と66、列の和140と14がどれも表1と一致します。
見分け方は、二次元配列のマスごとに対応する行番号と列番号を確かめ、行の和と列の和を掛けてから総数で割る順に計算することです。
ほかの選択肢はなぜ違うのか
- 項番a:aには80が入ります。82は表1の観測値をそのまま写した値で、影響が無いと仮定した計算をしていません。58は表1の別のマスの値です。44は行の和88を、70は列の和140を単純に2で割った値です。75はこの表の和の取り方からは導けません。
- 項番b:bには6が入ります。8は表1の同じ位置の観測値をそのまま写した値です。33は受けていない行の和66を、7はかかった列の和14を2で割った値で、行と列の和を掛け合わせていません。2はこの表の和の取り方からは導けません。
出典:令和7年度 基本情報技術者試験 科目B 問5
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)