Friction River Software

  • お問い合わせ

CakePHP5入門【WebAPI編⑧】統計情報を取得①

A子

結局大事なのは、当選番号を予想することなのよね

…ってなわけで、曜日(七曜)ごとや六曜ごとの出現数字の偏りを調査するよ

C菜

直接SQL文で試してみましょう~

mysql -u root -p numbersdb[Enter]

MATE端末」上で実行しますね~

A子

えっと、どういうコマンドを叩けば良いんだっけ?

B美

例えば、こんな感じで「各桁ごとの数字の出現回数」を数えられるわよ

select num3_place1,count(*)
  from numbers
  where lottery_week_int=1
  group by num3_place1
  order by num3_place1;[Enter]

上記の例は、ナンバーズ3の「一の位(num3_place1)」の数字の個数(count(*))を月曜日に絞って(lottery_week_int=1)数えたものね
(「group by」句がポイントよ)

A子

ふむ、月曜日って(一の位には)「3」や「4」が出にくいのかな?

てか、本当に正しいの?

B美

(全レコードではなく)レコード数を絞って検証してみれば分かるわよ

select num3_place1,count(*)
  from numbers
  where lottery_week_int=1
  and lottery_time between 6915 and 6929
  group by num3_place1
  order by num3_place1;[Enter]

これで2026年2月9日から2026年2月27日までの三週間分が集計されるわ

C菜

実際のデータ(Excelファイル)と見比べてみましたよ~

確かに、この範囲内において、月曜日のナンバーズ3の「一の位」の数字の出現回数は合ってました~
(「3」と「6」と「8」が一個ずつ出てます~)

A子

月曜日という条件をはずしてみよう

select num3_place1,count(*)
  from numbers
  where lottery_time between 6915 and 6929
  group by num3_place1
  order by num3_place1;[Enter]

C菜

これも大丈夫ですね~

合計で15回分の当選番号の「一の位」の数字の出現回数は、手作業で集計したものと全く同じでした~

A子

ふむふむ、B美が最初に提示したコマンドが正しい…ってことが検証できたわけだ
んじゃ、六曜についても同様だね

select num3_place1,count(*)
  from numbers
  where lottery_rokuyo_int=0
  group by num3_place1
  order by num3_place1;[Enter]

これは「大安(lottery_rokuyo_int=0)」である日の出現数字の傾向ね
「8」が突出してて、「2」と「9」もよく出てるってことだね

C菜

「七曜」と「六曜」を組み合わせた場合はどうなるでしょうか~?

例えば、2026年3月31日は(カレンダーによると)「火曜日(lottery_week_int=2)」で「友引(lottery_rokuyo_int=3)」なんですけど~

select num3_place1,count(*)
  from numbers
  where lottery_week_int=2
  and lottery_rokuyo_int=3
  group by num3_place1
  order by num3_place1;[Enter]

うーん、たしかに数字の偏りは見受けられますけど、サンプルが少なすぎて統計的に意味のある結果とは言えないかもしれませんね~

A子

よし、同じ条件で「十の位」と「百の位」も出してみよう

select num3_place10,count(*)
  from numbers
  where lottery_week_int=2
  and lottery_rokuyo_int=3
  group by num3_place10
  order by num3_place10;[Enter]

select num3_place100,count(*)
  from numbers
  where lottery_week_int=2
  and lottery_rokuyo_int=3
  group by num3_place100
  order by num3_place100;[Enter]


A子

確率が収束する方向へ進むのではなく、偏りが増大する方向へ進むのだと仮定した場合、2026年3月31日に購入すべきナンバーズ3の番号は…
013」または「053」ってことになるね

少なくとも左端の数字(百の位)に「7」は出ないし、真ん中の数字(十の位)に「2」は無いな

B美

いやいや、そんな簡単に当てられたら誰でも大金持ちになっちゃうんだけどね(苦笑)

まぁ、ある程度の目安にはなるでしょうけど…

C菜

確率って必ず収束していくものだと思うんですけど~

そういう意味では、最も出現回数が少ない数字が出るんじゃないですか~?
予想数字としては「726」か「727」ってことですね~

B美

うーん、どうかしらね
(多分、二人とも当たらないと思うけど…(苦笑))

ちなみに、各桁の数字は10通りあるから、十分に収束するためには1000回程度の試行回数が必要なのよね
(10通りの100倍ってこと)

つまり、これらの結果は全く収束状態には至っていないってことよ

「七曜」だけ、「六曜」だけって場合は(見かけ上は偏っているようにも見えるけど)収束していると言っていいんじゃないかな
(数学は得意じゃないから、間違ってるかもしれないけど…(苦笑))

A子

ナンバーズ3は「000」から「999」まで1,000通り、ナンバーズ4は「0000」から「9999」まで10,000通り…

ということは、ナンバーズ3の(各桁ではなくストレートの)確率が収束するためには100,000回、ナンバーズ4だと1,000,000回の試行が必要ってこと?

B美

多分、それで合ってるわ
(数学的には)組み合わせの数の100倍って、一般的には言われてるからね

うーん、そうねぇ
約7,000回抽選されているナンバーズ3って、(ストレートで)1,000通りあるそれぞれの当選番号の出現回数ってどのくらいだと思う?

C菜

7,000回÷1,000通りなので、平均7回ですね~

少しは偏りがあるとしても、少ないのが5回、多いものでも9回というところじゃないですか~?

A子

いやいや、もっと範囲は狭いんじゃないかな?

6回から8回くらいだと思うけどね

B美

正解は、1回から18回

しかも、1回しか出現していない当選番号って9個もあるの
(当選番号は「056」「083」「120」「248」「255」「285」「380」「467」「541」)

さすがに18回というのは突出していて、一つだけ(当選番号は「355」)しかないけどね
(次が15回で、やはり1個だけ…当選番号は「638」)

でも、14回出現したものについては、こちらも9個ほどあるのよ
(当選番号は「199」「271」「372」「458」「461」「589」「802」「928」「943」)

【2026年3月13日までの集計】

C菜

すっごく偏ってますねぇ~

A子

ナンバーズ4も?

B美

7,000回÷10,000通りは平均0.7回だから、「最も多くて2回くらい、まだ出現していない当選番号も多くある」って思うでしょ?
ところが、実態はこうよ

出現回数の最も多いものは、驚きの6回なの
(もちろん、一度も出ていない番号もかなり多い…)

まぁ、6回出現したものはさすがに1個だけ(当選番号は「1564」)なんだけど、5回出現したものは4個もあるわ
さらに、4回出現の当選番号については、なんと47個もあるという…

【2026年3月13日までの集計】

A子

偏ってるなぁ(苦笑)

C菜

「確率の収束は、はるか先」…って感じですね~

A子

まぁ、統計データを元に当選番号を考察(予想)するのは各人に任せるとして、我々が行うのはそのデータの提供だけだよ

…ってなわけで、『WebAPI』と『JSON』を設計していこう

C菜

まずは『WebAPI』ですけど、「ナンバーズ3」と「ナンバーズ4」は分けましょう~

で、それぞれごとに「曜日(七曜)のみ」「六曜のみ」「七曜と六曜の組み合わせ」の三つに関して、各桁の数字の出現回数を取得できるようにしたいです~
(指定した「年月日」の集計データとして~)

A子

ふむ
…ってことは

 WebAPIメソッド名機能
ナンバーズ3get3_week_ymd/Y-m-dget3WeekYmd($ymd)年月日を引数に「曜日(七曜)」ごとの集計を行う
get3_rokuyo_ymd/Y-m-dget3RokuyoYmd($ymd)年月日を引数に「六曜」ごとの集計を行う
get3_six_seven_ymd/Y-m-dget3SixSevenYmd($ymd)年月日を引数に「七曜」と「六曜」の組み合わせで集計を行う
ナンバーズ4get4_week_ymd/Y-m-dget4WeekYmd($ymd)年月日を引数に「曜日(七曜)」ごとの集計を行う
get4_rokuyo_ymd/Y-m-dget4RokuyoYmd($ymd)年月日を引数に「六曜」ごとの集計を行う
get4_six_seven_ymd/Y-m-dget4SixSevenYmd($ymd)年月日を引数に「七曜」と「六曜」の組み合わせで集計を行う

これでどう?

あ、引数については「年-月-日」一つだけで良いよね?
(日付選択のフォーム部品から使いやすいし…)

B美

まぁ、良いんじゃない?

それじゃ、次は『JSON』設計ね

C菜

ナンバーズ3で「七曜」と「六曜」の組み合わせだと、URL(の後半)は下記のようになりますね~
(2026年3月31日の場合)

・・・/get3_six_seven_ymd/2026-03-31

そのときの(成功時の)JSONって、こんな感じでいかがでしょうか~?

{
    "status":{
        "code":200,
        "message":"Success"
    },
    "result":{
        "lottery_date_str":"2026年3月31日",
        "lottery_week_str1":"火曜日",
        "lottery_week_str2":"火",
        "lottery_rokuyo_str":"友引",
        "num3_place1":[22,17,25,35,17,24,14,14,16,21],
        "num3_place10":[21,27,11,21,20,27,16,17,21,24],
        "num3_place100":[28,22,25,21,25,16,18,13,21,16]
    }
}

集計結果である「num3_place1」(「一の位」の数字)等の内容を配列にして、インデックス(添字)がその桁の数字に対応しているわけです~
(例えば、「十の位(num3_place10)」に「4」の数字が出現した回数は(num3_place10[4]で)20回という感じですね~)

A子

カレンダーで「土・日」が指定された場合はこうしよう
(「平日ではない」というエラーね)

{
    "status":{
        "code":500,
        "message":"Not a Weekday"
    },
    "result":null
}

なぜって、平日には抽選が無いから…

C菜

良いと思いますよ~

それでは、「ApiController」クラスに六つのメソッドを実装していきましょう~

B美

長くなっちゃったから、それについては次回にしましょう

少し疲れたわ

A子

脳疲労だね
(頭を使いすぎた…(苦笑))