記事一覧 · 公開日 2026-07-23

ハンディ990がTOEICスコアを推定する仕組み

好奇心旺盛な読者のための技術解説記事です。確率、平均、標準偏差といった確率・統計の基本的な概念を少し知っていることを前提としていますが、それ以上の知識は必要ありません。その他の概念はすべて一から解説します。

解決したい課題

練習問題を解くたびに、アプリには「正解」か「不正解」かという1ビットの情報が蓄積されます。TOEICの7つのパートにまたがる1と0の長いデータ列から、990点満点中の推定スコアという1つの数値を算出し、その数値を信頼性が高く、安定しており、自身の不確実性に対して誠実なものにしたいと考えています。

これは言葉で言うほど簡単ではありません。理由は4つあります。

  1. 回答にはノイズが含まれる。 実力が一定であっても、単なる偶然で正解や不正解が続くことがあります。優れた推定手法は、一度のケアレスミスで大きく変動するべきではありません。
  2. 能力は変化する。 学習を進めれば実力は上がります。3週間前のデータは、今日のデータよりも価値が低くなります。すべてのデータを均等に重み付けする推定では、実力の向上を追跡できません。
  3. コールドスタート。 3問しか解いていない段階でも何らかの数値を表示する必要がありますが、3問の情報量が300問と同等であるかのように装ってはなりません。
  4. 何が分かっていないかを把握すべき。 「Reading 320点」と「Reading 320点(ただし確信度は非常に低い)」はまったく異なる意味を持ち、アプリはこれらを明確に区別できる必要があります。

この記事では、私たちが採用している手法である減衰ベータ・ベルヌーイ事後分布 (decayed Beta–Bernoulli posterior) について解説します。この手法がどのように4つの課題を同時に解決するのか、そしてなぜ他の一般的な代替案ではなくこの手法を選んだのかを説明します。


初期の試みと、なぜそれらが不十分なのか

単純な累積平均

最もシンプルなアイデアは、各パートごとに (正解数) / (解答数) を追跡することです。

この方法はバイアスがなくきわめて単純ですが、記憶の減衰(メモリ減衰)がありません。500問解いた後では、1問の回答は推定値をほとんど動かしません。能力が変化しないなら問題ありませんが、変化する場合には役に立ちません。3週間前は正解率50%で今日75%になった学習者の場合、累積平均は長期間にわたって中間の数値にとどまってしまいます。また、昨日解いた1問とフル模試全体を全く同等に扱ってしまいます。必要なのは、遠い過去のデータを適切なペースで忘却する仕組みです。

固定アルファの指数移動平均(以前採用していた手法)

古典的な解決策は指数移動平均 (exponential moving average, EMA) です。推定値 m という1つの数値を保持し、回答ごとに最新の結果に向けて少しだけ引き寄せます:

mα·(100 if correct, else 0)+(1α)m,α=0.1

新しい回答が10%を占め、過去の全データが90%を占めます。これは過去を忘却する効果があり、実質的な記憶範囲はおよそ直近の 1/α ≈ 10–20 問分となります。ハンディ990も当初はこの手法を採用していました。しかし、これには3つの大きな欠点があります:

  • 学習率が変化しない。 3問目の解答でも3,000問目の解答でも、一貫して α = 0.1 です。初期段階では遅すぎ(せっかくの少ないデータの90%を捨ててしまう)、後々の段階では永遠に消えないノイズの原因となります。
  • 収束せず、永久にブレ続ける。 各回答が一定の割合で推定値を動かし続けるため、本当の実力が完全に一定であっても推定値は微振動を繰り返します。真の正解率が50%のパートにおいて、固定 α のEMAの長期的な標準偏差は概ね以下のようになります:
sdα2α·p(1p)·100±11 percentage points, forever.

これをセクション内の各パートに反映させると、990点スケールで数十分の振れ幅が生じることになり、これは学習の成果ではなく単なる運を反映したものになってしまいます。 - 確信度(信頼性)の情報を持たない。 m は単なる1つの数値です。それが3問の根拠に基づくものか3,000問に基づくものかを区別できないため、誠実な変動範囲を表示できず、データが少ないときに過剰反応するのを防げません。

私たちが求めたのは、EMAの「利点」(限られた記憶範囲)を活かしつつ、これら3つの欠点を回避することでした。そのためのアプローチが、単一の数値を追跡するのをやめ、分布を追跡することです。


ベイズ的発想: 点ではなく「確信度(確率分布)」を追跡する

特定パートにおける正解率を、未知の確率 p(そのタイプのランダムな問題に正解する確率)として考えてみましょう。個々の回答はベルヌーイ試行 (Bernoulli trial)、すなわち確率 p で「正解」が出るコイントスにあたります。私たちは p の値を知らないため、試行結果からそれを推測したいと考えます。

ベイズ的手法のポイントは、p の値を1つの予想値に固定するのではなく、p が取り得る値全体の確率分布(信念)を保持し、証拠(データ)が得られるたびにその信念を更新していく点にあります。データが少ないときは分布の幅が広く(不確実)、データが蓄積するにつれて真の値の周りに集中していきます(確信度が高い)。この「幅の広さ」こそが、EMAに欠けていた確信度の情報なのです。

ベータ分布

0から1の間をとる確率 p に対する信念の形として自然なのが、Beta(a, b) と表されるベータ分布 (Beta distribution) です。2つのパラメータは疑似カウントとしてイメージできます:

  • a は正解数の累積カウントのように機能し、
  • b は不正解数の累積カウントのように機能します。

ベータ分布には、この用途に最適な2つの性質があります:

1. 平均値が直感と完全に一致する:

estimated accuracy=mean[Beta(a,b)]=aa+b

生の集計値ではなく疑似カウントを使用していますが、本質的には単なる「正解数 / 総数」です。

2. 更新が極めて簡単。 ベータ分布はベルヌーイ試行に対する共役事前分布 (conjugate prior) であり、数学的な好運により、更新後の分布も同じベータ分布の枠組みに収まります。正解が1つ得られれば新しい信念は単に Beta(a+1, b) となり、不正解なら Beta(a, b+1) となります。積分も近似計算も不要で、カウンターに1を加算するだけです。だからこそ、この手法全体が回答ごとにわずかな算術演算だけで済み、すべてデバイス上で完結して動作するのです。

初期状態(事前分布)

まだ1問も解答していない段階では、Beta(3, 3) からスタートします。平均値は 3/6 = 50%(中立的な初期推測)であり、合計 a + b = 6 は意図的に小さく設定されています。これは「50%と推測するが確信度は低いため、実際のデータによって素早く修正される」ことを意味します。数問解答すると、ユーザーがもたらす疑似カウントが事前分布 (prior) を圧倒し、50%という初期仮定は自然に消えていきます。

確信度が自然に手に入る

確率分布全体を保持しているため、特別な管理を追加することなく分散が得られます。ベータ分布の場合:

Var(mean)=m(1m)N+1,m=aa+b,N=a+b

この式の意味を考えてみましょう。分子の m(1−m) は一般的なコイントスの分散であり、分母は全証拠数である N とともに大きくなります。解答数が増える ⇒ 分散が小さくなる ⇒ 推定範囲が絞られる。アプリはこの分散の平方根(標準偏差)を、スコアの横に表示される「±」の範囲に変換しています。練習を重ねるにつれてこの幅が狭まっていくのは、誠実であると同時に学習のモチベーション向上にもつながると期待しています。


「減衰」部分: 適切なペースでの忘却

純粋なベイズ更新には、累積平均と同じ問題が再び発生します。つまり、過去のデータを決して忘れないという点です。500問解いた後では N = 506 となり、新しい1問の回答はほとんど反映されなくなります。これでは成長中の学習者を正しく評価できません。

解決策は一行の計算です。新しい回答を取り入れる前に、既存の疑似カウントに1よりわずかに小さい減衰因子 ρ を掛けて緩やかに縮小させます。各回答時(正解なら x = 1、不正解なら 0):

{aρa+xbρb+(1x)ρ=1140=0.975

毎ステップで ab をわずかに減衰させることで、総証拠数が無制限に増加するのを防ぎます。総証拠数は定常状態の上限値へと収束します:

steady-state total evidenceN*=11ρ=40 answers.

そのため、何千問解答したとしても、各パートは直近の約40問分を記憶し、最新のデータにより大きな重み付けをするよう機能します。これこそがEMAの魅力であった「限定された記憶範囲」であり、さらに2つのボーナスが加わります。

ボーナス1: 学習率が自動調整される

ここが最もエレガントな部分です。1回の回答で平均値がどれだけ移動するかを計算してみましょう。回答前の証拠数を N = a + b、直後の証拠数を N′ = ρN + 1 とおくと、数行の代数計算により次のようにまとめられます:

mnew=m+xmN

これはまさにEMAそのものです。しかし、ステップサイズ 1/N′固定されていませんN が小さいとき(開始直後)は N′ も小さく、最初の回答直後では約7となるため、ステップサイズは約 1/7 ≈ 0.15 となり、少ないデータを積極的に活用して推定値が素早く動きます。N が上限に向かって増加するにつれて N′ は40に落ち着き、ステップサイズも 1/40 = 0.025 へと小さくなって推定値は落ち着いた安定したものになります。言い換えれば:

減衰ベータ事後分布は本質的に指数移動平均ですが、学習率が自動的に高値から低値へと減衰し、かつ証拠数カウンターを保持しているため常に自らの確信度を把握しています。

固定アルファのEMAは、この適応性をあえて捨て去った特殊なケースに過ぎません。

ボーナス2: ノイズが半減し、安定して収束する

安定後の学習率(≈ 0.025)は以前の固定 α = 0.1 よりもはるかに小さいため、長期的なブレ(標準偏差)はほぼ半減し、分散は約4分の1に減少します。偶然によるブレがなくなるため、トレンドチャートや「今セッションで獲得したスコア」の数値はノイズではなく実質的な変化を反映するようになります。それでも減衰機能のおかげで完全に固定化することはありません。過度な偽の精度を排除しつつ、真の実力向上を確実に捉えることができます。


「すべての証拠が等価ではない」ことに関するさらなる2つの考慮

この同じ仕組みを使うことで、単純なEMAでは表現しきれなかったいくつかの調整を自然に取り入れることができます。

経過時間による風化(経時減衰)

制限付きメモリは回答数をカウントしますが、2ヶ月間学習を休止した場合、その間に何も解答していなくても確信度は低下するはずです。そのため、あるパートが1週間の猶予期間を超えて放置された場合、放置日数1日ごとに疑似カウントをわずかに縮小させます(1日あたり 0.99 の係数)。重要なのは、abまったく同じ係数で縮小させる点です。これにより平均値 a/(a+b) は変化しませんが、総量 N が減少します。結果として、表示されるスコアは変わりませんが、±の範囲が広がり、復帰後の最初の回答の重みが大きくなります。「以前の実力を忘れたわけではないが、今もそれが維持されているかの確信度は下がった」という状態を、たった1回の掛け算で表現しているのです。

1枚めくれたカレンダーの横で Happysaur が杭の周りのロープを緩める。杭は動かず輪が広がり、休止後も推定値は変わらず不確実性が増すことを表す。

個々の回答の重み付け

すべての回答が同じ情報量を持つわけではないため、回答ごとに重み w をもたせて更新を行います(更新式: a ← ρa + w·xb ← ρb + w·(1−x)):

  • 過去に解いたことのある問題は重みを半分に減らします。解き直しで正解できた場合は実力というより記憶に依存している側面があるため、初見の問題ほど推定値を動かすべきではありません。これはカテゴリの問題を解き切った後に、過去に間違えた問題が再出題されて推定値が不当に下がってしまうという微妙なバイアスを防ぐ効果もあります。
  • 出題元(ソース)による違い。 実際の試験環境(時間制限ありのフル模試)での回答は、気軽なドリルよりも価値が高いため、より高い重み(最大2倍)で組み込まれます。記憶の上限が約40であるため、完走した模試のデータは翌日に埋もれてしまうことなく、直近の証拠としてしっかりと支配的な影響を持ちます。
  • 公式スコアの報告(ユーザーが入力した場合)は、対応する正解率における約25問分の確信度を持つ強い事前分布としてセットされます。これにより、その後の1問の練習問題で公式スコアが消し飛ぶことはありませんが、数十問解けば徐々に新しいデータへ上書きされていきます。

これらいずれも新しいアーキテクチャを必要としませんでした。すべて重み w と2つのカウンターだけで実現できます。この柔軟性は、単一の不透明な数値ではなく、「証拠がどれだけあるか」という明確な概念を持つモデルを選択した直接の恩恵です。


パートごとの確信度から990点満点スコアへの集計

10個の出題カテゴリそれぞれが独自の減衰ベータ事後分布を保持しています。これらをセクションスコアに変換するため、実際の試験で出題される各カテゴリの出題数(各セクション合計100問)で各平均値を重み付けし、100問換算の推定正解数を算出します。その数値を公式TOEIC素点→換算点対応表に照らし合わせることで5〜495点のセクションスコアを算出し、2つのセクションを足し合わせて990点満点の推定スコアを求めます。

不確実性の情報も同様に引き継がれます。各カテゴリは独立しているため、それらの分散は二乗和(各試験出題数の2乗で重み付け)で合算され、統合された標準誤差がセクションおよびトータルスコアの「±」範囲となります。

Readingセクション独自の現実的調整

TOEIC Readingは時間との勝負です。75分間で100問、1問あたり平均45秒で解く必要があり、時間を延長する手段はありません。そのため時間制限なしの練習で測定された正解率は、読むのが遅い受講者にとっては過大評価となります。本番の制限時間内では最後の問題までたどり着けず、解けなかった問題は練習通りの正解率ではなく、ランダムな勘(4択なので25%)と同じスコアになってしまうためです。

そこでアプリは簡単なシミュレーションを実行します。Readingの各パートで測定された1問あたりの解答ペースに基づき、本番の順番(Part 5 → 6 → 7)に従って75分の制限時間を消費していきます。時間が尽きた時点で到達できなかった問題については、本来の実力ではなく0.25の正解率としてスコアを計算します。

具体例を挙げましょう。Part 5を1問30秒、Part 6を45秒、Part 7を80秒で解くとします。Part 5と6(30問+16問)で 30×30 + 16×45 = 1,620 秒を消費し、Part 7に残される時間は2,880秒となります。1問80秒の場合、Part 7の54問のうち 2,880 / 80 ≈ 36 問しか解けず、残り18問は未解答になります。仮にPart 7の本来の正解率が70%だとすると、これら18問の正解率は0.70から0.25へと下がり、素点で約 0.45 × 18 ≈ 8 点分、換算点にしておよそ30〜40点分の失点となります。解答スピードが上がれば本質的な実力のまま解ける問題が増えるためペナルティは小さくなり、十分なペースになればペナルティは完全に消滅します。

解答スピードがこのようにスコアに影響する場合、アプリは「本番ペース換算」として明確な数値を表示し、Readingは正解率だけでなくスピードも重要であることを再認識させます。(Listeningは音声ペースで進行するため、このような調整は不要です。)

Happysaur が練習用の紙を読み終えた山へ移しながら、砂の残り少ない砂時計を気にしている。試験での見通しには解答ペースも関わることを示す。


なぜこの手法が他の代替案より優れているのか

一般的な代替手法も検討しました。以下が正直な比較結果です。

アプローチ 得られるメリット これだけで不十分な理由
単純な累積平均 バイアスがなく極めて単純 過去を忘却しない。成長を追跡できない。すべての回答を均等に扱う
固定αのEMA 制限された記憶範囲、低計算コスト 学習率が一定。永久に微振動する。不確実性の情報がない。重み付けを追加する場所がない
減衰ベータ事後分布(当アプリの手法) 適応的な学習率、制限された記憶範囲、組み込みの確信度、自然な重み付け
項目応答理論 (Item-Response Theory, IRT) 能力モデルの「デファクトスタンダード」 数千人の受講者データから較正された問題難易度が必要だが、デバイス上にはそのデータがない
Elo / Glicko レーティング (Elo / Glicko ratings) 洗練されており適応的 信頼できる問題ごとの難易度が必要。不確実性の管理は当アプリの減衰機能と重複する
カルマンフィルター (Kalman filter) 不確実性を伴う変化量を追跡 正解/不正解のような2値データでは当アプリのモデルと実質同じになるが、尤度の扱いが複雑。ベータ分布の形が最も自然にフィットする

決定的な違いはここにあります。より「高度な」2つのモデル(IRT と Elo)は、その能力のすべてを問題ごとの難易度パラメータに依存しており、それを信頼性高く推定するには同じ問題を解く大勢の受講者データが必要です。ハンディ990はデバイス上でプライベートに動作するため、そのような全体統計データはありません。未較正の難易度ラベルをこれらのモデルに投入しても、あやふやな入力の上に構築された複雑な仕掛けにしかなりません。

一方で、ユーザーが実際に感じる課題(推定値のブレ、忘却、確信度範囲の欠如、模試とウォーミングアップの均等扱い)は、問題の難易度ではなく更新ルールの中に存在します。減衰ベータ事後分布は、これらすべての課題を同時に解決する最もシンプルで理にかなったモデルです:

  • 本質的にベイズ的 (Bayesian) であり、推定値とその不確実性が後付けではなく同じ明確なルールから算出されます。
  • 適応ゲイン型EMA であるため、初期は素早く動き、その後安定し、決して固定化しません。
  • 共役性 (conjugacy) を持つため、各更新は数回の加算と乗算だけで済み、高速かつ正確でオフライン動作します。
  • 明確な証拠数カウントを持つため、最新性、復習、出題元による重み付けが自然に導き出されます。

手元にあるデータに対して、まさに適切な統計的アプローチであると言えます。


留意点

  • 本手法は学習の補助ツールであり、公式スコアではありません。 実際のTOEICでは非公開の問題に対してIRTによるスケーリングが行われており、練習データからはあくまで近似値を求めることしかできません。
  • 各定数は論理的根拠に基づくものであり、大量のデータ調整によるものではありません。 記憶上限(約40問)、事前分布の強度、減衰率、回答の重みなどは妥当なデフォルト値であり、大規模なデータセットでフィッティングした値ではありません。公式スコアが入力された際、アプリは推定値と実際のスコアの差分を(プライベートに)記録し、これらの定数を将来的に改善できるよう設計されています。
  • データが少ない段階では精度も低くなります。 初期段階では多くのパートが50%の事前分布にとどまっているため、最初の推定値は大まかなものになります。アプリが十分なデータを得るまで広い「±」範囲を表示するのはそのためです。

すべての要素を網羅できているわけではありません。 上記の要素は、日々の練習データからモデル化できたもの(最新性、復習、模擬試験重み、Readingの解答速度)です。しかし実際の試験結果は、当日の緊張や疲労、配られた問題フォーム、見慣れない表現、当アプリ問題集と本番の難易度差、当日の運など、アプリからは把握できない要素にも大きく左右されます。多くの要素を考慮していますが、すべてを網羅しているわけではないため、推定値が完全な精度を持つことはありません。本番のTOEICを受験し、アプリの推定値と大きく異なる結果(上ぶれ・下ぶれ問わず)が出た場合は、アプリ内のフィードバック機能からぜひご意見をお寄せください。スコア変動の要因を共有していただくことで、見落としていた要素を特定し、すべてのユーザーに向けた推定精度の向上に役立てることができます。

私たちが約束できる誠実な姿は次のとおりです。より多くのパートで、より多くの問題を、より実践的な環境で解くほど、推定値は真の実力へと近づき、同時により確信度が高まったことを示します。これこそが、減衰ベイズ推定器がもたらすように設計された機能です。


続編を公開しました。実際の公式認定証が届いたとき、この推定器はそれをどう活かすのか——そして多くの人が読み飛ばすABILITIES MEASUREDに何ができるのか?〈TOEIC公式認定証はスコアだけではない〉をお読みください。

← 記事一覧