この記事は、統計学習ツール StatPlay を開発する中で考えたことをまとめたものです。
統計検定2級の勉強をしていると、巻末の確率分布表をひたすら引きます。
z=1.96のとき、累積確率は0.9750。t分布、自由度10、両側5%なら、2.228。数字を引いて、答え合わせをして、次の問題へ。
ある日、ふと違和感を持ちました。自分はこの数字を、なぜ正しいと思っているんだろう。
参考書に書いてあるから。教科書で見たから。それくらいしか理由がない。深く考えずに、書いてある数字を正解として受け入れていた。
その違和感が、StatPlayにインタラクティブ確率分布表を作るきっかけになりました。
動的な分布表は世の中にある
最初に断っておくと、こういう動的な分布表は、世の中に存在します。技術的に新しいことをやっているわけではありません。
ただ、自分が統計を学びながら作っているという文脈で、「この数字は正しいのか」という問いに、自分なりに向き合ってみたかった。ある種の自己満足です。それでも、せっかく作るならやれるところまでやってみよう、と決めました。
ハードコードしないという選択
もっとも単純な実装は、参考書の巻末をそのままHTMLに転写することです。<td>0.9750</td> のような形で、数字を直接書き込む。
これはやらないことにしました。
「この値、本当に正しいの?」と聞かれたとき、「参考書から写しました」では存在価値が皆無です。コピペするときに桁を間違えていないかも怪しい。何より、自分が書き写した数字を「これが正解です」と提示することに納得がいかなかった。
そこで全部、動的に計算することにしました。ページが開かれるたびに normCDF() や tQuantile() といった関数を呼び出して、その場で表の値を生成する。
// 表のセルを動的に生成(イメージ)
for (let z1 = 0.0; z1 <= 3.4; z1 += 0.1) {
for (let z2 = 0.00; z2 <= 0.09; z2 += 0.01) {
const z = z1 + z2;
const p = normCDF(z); // utils.jsの関数を呼ぶ
// 計算結果をテーブルセルに入れる
}
}
これでグラフが使っている関数と表が使っている関数が同じものになります。値がズレようがない。
それでも残る問い
normCDF() の中身は、本当のところ何をやっているのか。
AIに聞きながらコードを追ってみたのですが、思っていたよりずっと深いところに連れていかれて、正直よくわからなくなりました。
normCDF() は「誤差関数」というものを使って計算されているらしい。その誤差関数も、何やら昔の数値計算の本に載っている近似式で計算されているらしい。係数が5つほど並んでいて、小数点以下の謎の数字が書かれている。なぜその値なのかは、私にはわからない。ガンマ関数のほうも前書いた通りで、Lanczos近似というものを使っているとAIに教わりました。またも、ヤバい方向です。
結果、参考書の数字を疑った先で、結局また別の数字を信じている。「信じる」ことから完全に逃れられたわけではなかった。
偉大な先人たちの上に立っている
私が信じている数字は、過去の数学者たちが時間をかけて導き出してくれた成果の上に成り立っています。誰かが「この近似式を使えばこれくらいの精度で計算できる」と発見してくれていなければ、コンピュータでこれらの値をまともに計算することはできない。
すべてを自分で検証することは不可能です。近似式の導出も、係数の最適性の証明も、私の数学力では追いつけない。
でも、過去の数学者たちも、当時利用できる先人の成果の上に立って、計算を進めてきたのだと思います。完全にゼロから一人で全部を組み立てた人なんていない。みんな、誰かの結果を「これは正しいはずだ」と信頼した上で、その先を考えていた。
「数字を信じるとはどういうことか」を突き詰めると、結局のところ、自分が確認できる範囲を確認した上で、その先は先人を信頼するしかない。検証できる層を1つでも厚くすることが、できることの全部です。
できる範囲で、3層の確認をする
その考えを受けて、StatPlayの分布表では3つの層で確認をしています。
1つ目は動的計算。表の値とグラフの値が、同じ関数から計算されている。だから絶対にズレない。
2つ目はオープンソースによる透明性。normCDF() がどう実装されているかは、GitHubで全部読めます。「コードを読んでください」と言える状態にしてあります。そもそもこんなコード誰にも読めないと思いきや、ここでもAIが登場。あなたのAIエージェントに取り込んで解析させることが出来るんです。便利な世の中です。
3つ目はサイト上での算出方法と精度の開示。分布表ページに「この表の仕組み」というセクションを置いて、各分布をどう計算しているか、その誤差がどれくらいかを書きました。
分布 算出方法 精度 正規分布 誤差関数の多項式近似(Abramowitz & Stegun 7.1.26) 最大誤差 ~1.5×10⁻⁷。表示4桁で市販の統計表と完全一致 t分布 確率密度関数を Simpson 法で数値積分、二分法で逆算 表示3桁は信頼できる。df=1–2 で末尾1桁が ±1 ずれる可能性あり
書いておいてなんですが、この表の中身を私自身が完璧に理解しているかというと、正直そうではありません。AIがこの方法で計算しているらしい、と教わったものを、自分なりにラインを頑張ってあげて調べながら書き起こしていいます。
正直、降参です。ここから先は私の能力を超えています。
それでも、ロジックや誤差の幅を伏せたまま数字だけ出すよりは、出すべきだと思いました。「ここまでは確認できた」「ここから先は私には追えない」という線を、できるだけ正直に引いておく。それくらいしか、自分にできることはありません。
これが本当に有益な開示なのか、自己満足の領域に留まっているのか、自分でも測りかねています。私一人が責任を持てる範疇では全くないので、含みを持たせた表現として読んでいただければと思います。
たまたまAIの力を借りているだけ
近似計算のコードを書いたのは、私ではなくAIです。誤差関数の近似式や、ガンマ関数の係数の存在を教えてくれたのもAIでした。
私がやったのは「表に書いてある数字を疑ってみよう」「動的に計算しよう」「精度を開示しよう」と決めたことくらいで、それ以外はほとんどAIに支えてもらっています。
過去の数学者たちも、当時の計算機や紙とペンや先人の論文に支えられて、同じように一歩ずつ確かさを積み上げてきたんだろうなと思います。手段が違うだけで、やっていることの構造はそんなに変わらない。
私は、たまたまAIという道具を借りて、その営みの末端をなぞっているにすぎない。そう考えると、「自分なりにやれるところまでやってみる」というのは、案外昔から続いている営みの続きなのかもしれません。
関連
- StatPlay 確率分布表 — この記事で紹介したインタラクティブ分布表
- StatPlay — 統計の概念をインタラクティブに体感する学習ツール
-
GitHub — コード全文(CC BY-NC 4.0)
StatPlay © 2026 Sasai Lab