0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【ITパスポートなど】選択式試験の合格率計算【Python】

Last updated at Posted at 2023-08-21

この記事では、Python言語によるモンテカルロシミュレーションを用いて、選択肢問題の合格率を計算します。モンテカルロといっても、選択肢問題を勘で当てるか当てないかをしてるだけで簡単です。

概要

  • 【数式】6割合格試験は「100問中47問確実に正答すれば合格」
  • 【期待値】実は「100問中47問確実に正答すれば合格」する確率は50%
  • 【Python】「1000回受験したら何%で合格する?」
  • 【確実】合格率90%になる確実正答は52問
  • 【裏技】確実正答47問でも、勘問題を3択にしたら合格率93%

選択肢問題の合格率計算「何問確実に正解したら合格が期待できるか」

「何問を確実に正解して、何問を勘で答えたら、合格するだろう」

と考えることはないでしょうか。

以下の条件で数式を立ててみます。

  • 問題数 N
  • 確実に正解できる問題数 a
  • 選択肢は4個
    (たぶん聡明な方は、立てられる数式と「からくり」にこの時点で気づかれましたねw)

以下のように解くと「47%」。

a + (N - a) \times 0.25 \geqq N \times 0.6 \\
0.75a + 0.25N \geqq 0.6N \\
0.75a \geqq 0.35N
a \geqq 0.4666666… \times N

※(N - a) × 0.25は、勘で正答する問題数です。

つまりITパスポートは100問なので、

「47問確実に正解すれば、残り53問は勘で解けば合格」が期待されます。

「47問だから半分以下の正解で良いんだ!」とちょっと嬉しいですね。

しかし、

これが確率の落とし穴。

(「期待」って言葉でピンと来た方もいらっしゃることでしょう。ニヤニヤしましょw)

確率計算の落とし穴「47問確実に正解しても合格率は50%」

「期待」とわざわざ書いたのでお察しの通り「期待値」だからです。

なぜなら、「1/4の確率で当てる勘」が働く時と働かない時がありますよね。「1/4以上正答する勘」が働く確率は50%、「1/4未満しか正答しない勘」になる確率が50%なんです。

つまり、

「100問中47問確実に正解して、残り52問を勘で答えて、合格する確率は50%」です。

プログラムソース「1000回受験したら何%で合格する?」

Pythonでモンテカルロシミュレーションをしてみましょう。
(すでにこの一文が超カッコイイですw)

単に「正解を乱数で決めて、回答を乱数で決めて、一致したかしなかったか」を見てるだけです。

※すみません。プログラムを教える職業ですが、素人です。プロの方々から見ると、色々ヤバイと思いますがご容赦ください。入門者の方には悪くない例かなと思います。

### パラメータ
ANS_NUM =   4  # 選択肢
QUE_NUM = 100  # 問題数
KNO_NUM =  47  # 必ず正解する問題数
LOOP_NUM= 1000 # シミュレーション回数

import random as rand
def monte_ans():
  ans_num = ANS_NUM
  stu = rand.randint(1,ans_num)
  ans = rand.randint(1,ans_num)
  if stu == ans:
    result = 1
  else:
    result = 0
  return result
  
def calc_correct_num():
  const_que_num = QUE_NUM - KNO_NUM
  correct_cnt = 0
  for i in range(0, const_que_num):
    result = monte_ans()
    correct_cnt = correct_cnt+result
  return correct_cnt

def judge_pass():
  const_que_num = QUE_NUM
  const_kno_num = KNO_NUM
  correct_num = calc_correct_num()
  if correct_num + const_kno_num >= const_que_num * 0.6:
    result_pass = 1
  else:
    result_pass = 0
  return result_pass

def calc_pass_rate():
  const_loop_num = LOOP_NUM
  cnt_pass       = 0
  for i in range(1, const_loop_num):
    result_pass = judge_pass()
    if result_pass == 1:
      cnt_pass = cnt_pass + 1
  rate_pass = cnt_pass / const_loop_num
  return rate_pass

print(calc_pass_rate()*100)

google colaboratoryで実行してます。
「KNO_NUM = 47 # 必ず正解する問題数」としたときの実行結果

58.9

「KNO_NUM = 46 # 必ず正解する問題数」としたときの実行結果

47.9

値はちょっと変動します。
「LOOP_NUM= 1000 # シミュレーション回数」を増やすと精度良くなります。

合格率90%を超える問題数は52問

「47問確実正解で合格率50%」は分かったとして、「じゃぁ合格率90%にするには、何問確実に正答すればいいの?」と気になります。

「KNO_NUM = 52 # 必ず正解する問題数」と数値を変えると、90%を確実に超えます。

ここで「52問だから結局半分超えるのか」と、「60問確実に正解すれば100%合格」なのに、なぜかガッカリしちゃいます。気持ちは分かりますよ。

次は、合格率をぐーーーーーーんと上げる方法を計算します。

勘で答える問題を3択にしたら

実際は、「勘で答える」と言っても「すべて4択から勘」ってわけではないですよね。

「ア か ウ のどっちだろう」「ウは絶対違うから、3択から選ぶか」なんて、択を減らすことはよくあります。

ここでは「勘で答える問題を3択」にして計算してみます。

### パラメータ
ANS_NUM =   3  # 選択肢 ←ここを変更!!!!!!
QUE_NUM = 100  # 問題数
KNO_NUM =  47  # 必ず正解する問題数
LOOP_NUM= 1000 # シミュレーション回数
93.3

「93%」を超えてきましたね。

つまり、

「100問中47問確実に正解して、残り52問を<<3択にして>>勘で答えて、合格する確率は93%超え」

という結果となりました。

夢のある話です。

とはいえ、実際は「4択勘」「3択勘」「2択勘」の混合ですけどね。

まとめ

この記事は、私がIT専門学校で学生さんを励ますために伝えていることです。

とはいえ難しい話ですし、「夢」も与えたいので、

最初は「47問正解すれば、残り勘で合格するよ!」だけしか伝えません。

みんなが理解するわけでも、あなたのように確率や計算に興味があるわけではないですからね。(めんどくせぇとか言われたことがあります・・・)

ある程度合格点が取れるようになってから、「賢い学生さん」「用心深い学生」だけに期待値の話をしています。

私の学生さんはなぁんかギリギリを狙います。ギリギリで落ちて凹んで、ギリギリで受かって喜んでます。

「60問確実に答えれば100%合格」するんだから、「70問や80問正解したるわ!」って意気込みが欲しいです。チキンレースでもギリギリ狙いゲームでもないので。

90点だろうが60点ギリギリだろうが、合格すれば履歴書に書けます。

「90点取って損した」と思うかは分かりませんが、

「勘込みで60点ギリギリってことは、確実に理解してるの半分切ってる、のに90点の人と同じ理解度だと見なされる」とピリピリして欲しいなぁとも思います。

以前「自分が電車に乗った後にドアが閉まると時間効率が良かった!満足!」って方がいました。ともすれば乗り遅れたかもしれないし、途中で人が倒れてたら助ける余裕もありません。

試験代は7,500円。合格したらしっかり理解したと見なされる。そんな試験に「ギリギリ合格したやったぁ!」と手離しに喜んで良いですが、ふと冷静になって振り返って「次」に向かって欲しいなぁといつも思って話しています。

お説教・愚痴になってごめんなさいでした。

余談

実は、ギリギリになってしまうのは「勉強不足」だけではありません。

実は「確実に正解する問題数」が増えると「勘で答える問題数」が減ります。「勘を働かせる回数が少なくなる」ため、確率がだんだん効かなくなります。もちろん、現実的には「難しい問題」が残っているってのもあります。

今回は解説は割愛しますが、「高得点になるほど、択を減らしても点数は伸びなくなります」。(プログラムの確実正答数をスイープさせるなどするとと分かります)

よって、100点は目指すけど、実現するまで頑張らないでください。

経験上85点ぐらいで安定しれば、当たれば90点後半、外れても75点前後で確実に合格します。

それではまた機会があれば。

p.s.
コードの書き方など、ご指摘・ご指導頂けましたら幸甚です。

p.s.
日頃は>>「専門学校やIT就職」のブログ<<をやってます。

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?