この記事は、学習や開発の中で私が試したことをまとめたものです。AIと協業しながら、気になった点や確認できたことを書いています。まだ学びの途中なので、誤りに気づいたら教えていただけると助かります。
統計検定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)