1. はじめに
どうも、趣味でデータ分析している猫背なエンジニアです。
え~宝くじで一攫千金したくないですか?
宝くじの当選番号を予測するシステムを長年愛してやまない『新世紀エヴァンゲリオン』に登場するMAGIシステムをコンセプトに、つくりたい!そうしたい!と思って開発記録を書いていきます。この記事ではモデル構築編の第参弾と題し『CASPER』を紹介します。
2. これまでの「🎯Numbers3&4の当選番号を予測する『MAGI』システムを作る」
西暦2025年。
あるエンジニアは、繰り返される敗北の記録——「宝くじの外れ券」の山に終止符を打つべく、ひとつの意思決定機構を構築する決意を固めた。
その名は―― N-MAGIシステム。
モデル名はMELCHIOR、BALTHASAR、CASPER。
それぞれが異なる思考ロジックを持ち、合議によって“もっともらしい当選数字”を導き出す。
ベースとなったのは、かつて存在した神話と、そして…アニメ『新世紀エヴァンゲリオン』の意志決定AI。
過去のデータ、時系列学習、出現頻度、逆張りアルゴリズム。それらを融合させ、抽選数字の予測という“人類補完計画”にも似た夢を追い求める開発者の姿があった。
すべては「当てたい」という欲望と、「遊びたい」という本能のままに。
っていう茶番はおいといて...本編に入ります👍
3. CASPERのモデル選定(復習)
概要編の4.MAGIを構成する3つの『脳』の選定でモデルの説明をしました。振り返りですが、CASPERの人格は恋する女とされ、独自解釈では逆張りランダム型としていました。
< 設計モデルは? >
CASPERに採用した逆張りランダム型はBALTHASAR同様に既存のモデルはないので、専用に設計しました。
本モデルはBALTHASARの設計思想に似ていますが、「恋する女」というのを表現できるように工夫しました。
前回同様、一般的なランダム関数を使った数字出力をします。文字通り範囲が決まった中からランダムに出力しますが、本モデルでは、「各桁ごとの過去の出現頻度」に基づいて、「出現頻度の低い数字を優先的に選ぶ」というように過去データとランダムを使う合わせ技なモデルを設計しました。命名するならば「RandDownNUMBERS4 Model」です(TopをDownに変えただけというツッコミは受け付けていません(笑))
< 独自アルゴ RandDownNUMBERS4 Model の仕組み >
過去の数字の頻度という統計データを用いて、出現頻度が高い数字をランダムに選出するということはお分かり頂いたと思う。作成したソースコードを数式に示すと以下のようになる。
■ ステップ1:桁ごとの出現頻度を計算
各数字 $d \in {0,1,\dots,9}$ に対して、出現回数を数える:
$$
f(d) = \text{個数}(d \in A)
$$
■ ステップ2:出現頻度が小さい順にソート
出現頻度の昇順に並べ替えた数字のリスト:
$$
C = \text{sort}_{\text{asc}}([0,1,...,9], \text{by } f(d))
$$
つまり、
$$
f(C_1) \leq f(C_2) \leq \dots \leq f(C_{10})
$$
■ ステップ3:予測の生成
出現頻度が最も少ない6個からランダムに4つ選ぶ:
$$
P_k = \text{random_sample}(C_1, C_2, ..., C_6; \text{choose 4, without replacement})
$$
このような予測を2つ作る:
$$
\text{予測} = [P_1, P_2]
$$
各 $P_k$ は4桁の数字列(例:"1359")を表す。
■ 全体フロー
図で表現すると以下のような全体のフローになる。

4. いざ開発:CASPERによるNumbers4モデル(RandDownNUMBERS4 Model)の構築
Numbers4の過去当選データをもとに、LSTMを用いた予測モデル “CASPER” の設計および実装プロセスについて詳細に述べる。
■ データ前処理, 出現頻度確認
本モデル(CASPER)ではMELCHIOR/BALTHASAR同様に、Numbers4の各当選番号(4桁)を単なる整数値としてではなく、「千の位」「百の位」「十の位」「一の位」 という4つの桁情報に分解して処理を行う。この処理により、各桁ごとの数字の出現傾向や周期性を個別に扱うことができるようになる。
BALTHASAR同様の方法で[(数字, 頻度), ...]というように格納をしています。
for n in df['number4'].dropna():
all_digits.extend([int(d) for d in str(n).zfill(4)])
freq = pd.Series(all_digits).value_counts().sort_values()
■ 予測結果の出力
最終的な予測結果を格納するリストのソースコードは以下になっている。
各桁の出現頻度を少ない順に取得し、出題頻度が低い上位6つの数字を抽出する。各桁の上位6つの中からランダムに選んで、文字列として結合し、リストとして結果を返す。
def make_prediction():
return "".join(str(d) for d in random.sample(candidates[:6], 4))
■ 出力形式と実行回数
本モデルもBALTHASAR同様に、1回の関数実行に対して2件の4桁予測番号を生成する設計となっている。このループでは、1ループ=1つの4桁予測番号の生成を意味する。ループは固定で2回回すように設計しており、結果として ['0839', '2174'] のような2つの予測値リストが出力され、X上では上位1つを表示している。
return [make_prediction() for _ in range(2)]
5. 予測結果と考察 ~数字は逆張り思考に近づけたか?~
ここまでで、BALTHASARモデルの構築・設計思想・データ処理・構造について見てきました。実際に本モデルが出力する「未来の4桁予測番号」とは、どのようなものか?
以下に直近のものを提示します。(7/16に予測した次回(7/17)の当選番号)
CASPERの出力をどう扱うか
「絶対的な正解」ではなく、あくまで候補提示型AIとして捉えると、本モデルの意図が明確になります。
これはMELCHIOR/BALTHASARの際にも行ったことですが、決定権は人間にあります。
とはいえ、今回設計したモデルを確認してみると...NUMBERS4もNUMBERS3も驚異の50[%]正答してますね...あれ、CASPER(逆張り思考)って意外と路線的に当たってる?(笑)
今後の改善・拡張の方向性
本実装はBALTHASARに少し似ている思考性でランダム関数を組み合わせた構成を採用していますが、さらなる精度向上や面白さを追求します。
- ユーザ入力との連動機能(これは面白そうなのでやりたい)
- 連動機能に時事を追加した連動予測機能(ニュースや出来事など)
6. 次回予告
数字は揃った。補完計画をはじめよう。
すべては"当てたい"という欲望と、"遊びたい"という本能のままに。
7. 今後の記事予定(MAGI伝記)
1. 【作戦概要】:全体構想と設計方針
- 全体構想と設計方針
2. 【データ収集編】:過去の当選番号の収集
- 過去の当選番号をどう集める?
3. 【モデル構築編】:3種のモデル(CASPER / BALTHASAR / MELCHIOR)実装と精度比較
- CASPER / BALTHASAR / MELCHIORの実装と精度比較
4. 【投稿編】:X APIを用いた投稿
- X APIを用いて予測を自動投稿
5. 【UI&演出編】:MAGI風UIをTkinterで再現して、予測を視覚化!
- TkinterでMAGI風UIを構築
謝辞
今年の10月に30周年を記念すること、誠におめでたく思っております。前回の「庵野秀明展」に引き続き「30周年記念展ALL OF EVANGELION」にもぜひ行きたいと思っております。引き続き応援しています!



