paint-brush
宝くじの数字を計算する@alexthoughts
30,826 測定値
30,826 測定値

宝くじの数字を計算する

Alex6m2023/10/01
Read on Terminal Reader

長すぎる; 読むには

宝くじには予測不可能性がつきものですが、カーテンの後ろを覗いてこれらのゲームの特徴を探るのは楽しいものです。あなたがプレイヤーであっても、単なる好奇心旺盛な観察者であっても、数字の世界には常に驚きの 1 つや 2 つが隠されています。
featured image - 宝くじの数字を計算する
Alex HackerNoon profile picture


私の国では、参加者が 37 の数字の中から 6 つの数字を選択し、7 つの数字の中から別の数字を選択する毎週の宝くじゲームがあります。ゲームの最初の部分に焦点を当て、数字のプールから 1 つの追加の数字を選択することは無視しましょう。 7。


k/N 形式の宝くじの場合、k は合計 N 個の数字 (この例では 37) の中から希望する選択肢の数 (この例では 6) です。よくある質問は、それぞれの数字が正しいかどうかです。これらの数字が勝ちの組み合わせに含まれる可能性は等しいです。


この疑問について調べてみましょう。


私は彼らのウェブサイトから、2009 年から 2023 年までの 1609 枚の図面の統計を収集しました。


次に、CSV ファイルのデータをオブジェクトに変換しました。

 { '09/09/2023': [13, 17, 24, 30, 35, 37], '07/09/2023': [7, 17, 19, 25, 35, 37], '05/09/2023': [2, 3, 5, 9, 36, 37], '02/09/2023': [4, 12, 22, 27, 30, 34], '29/08/2023': [6, 8, 15, 19, 26, 31], '26/08/2023': [6, 7, 14, 21, 25, 34], '22/08/2023': [2, 6, 10, 23, 24, 29], ... }


オブジェクト内のキーは抽選の日付に対応し、関連付けられた値は、その特定の抽選の勝ちの組み合わせとして出現した数字の配列です。


その後、図面から取得したすべての数値を含む配列を作成しました。

 numbers = np.array(list(lotto.values())).flatten() [13, 17, 24, 30, 35, 37, 7, 17, 19, 25, 35, 37, 2, 3, 5, 9, 36, ...]


その後、配列内の各値の出現数 (頻度) を計算しました。

 count = np.bincount(numbers)[1:] [268, 256, 257, 242, 255, 273, 247, 277, 260, 267, 289, 294, 271, 239, 254, 255, 263, 243, 246, 271, 265, 254, 252, 243, 291, 271, 258, 264, 275, 258, 251, 244, 263, 256, 267, 251, 264]


これらの結果は、数字 1 が 268 回、数字 2 が 256 回描かれたことを示しています。


宝くじ結果の数字の分布は比較的均等であるようです。これをさらに確認するには、分布の均一性を検証するテストを実施します。


N 個の個別の数値の等確率をテストするには、次のアプローチに従います。


  • n 回の宝くじで各数値 i = 1, ..., N が発生した観測頻度 (Oi) を計算します。


  • 式Ei = (nk) / Nを使用して、各数字の期待カウント(Ei)を計算します。ここで、nは宝くじの抽選の合計数、kは各抽選で選択された数字の数(この場合は6)です。 N は可能な数値の合計数です (この場合は 37)。


  • ピアソン統計またはカイ二乗統計を使用して、観測されたカウント (Oi) と期待されるカウント (Ei) を比較します。ピアソン統計の式は、次のように表されることがよくあります。

  • 観測されたカウントと期待されるカウントを使用して、カイ二乗統計量を計算します。


  • カイ二乗検定などの統計検定を実行して、計算されたカイ二乗値が統計的に有意かどうかを判断します。これは、数値の分布が等確率の下で予想されるものと大きく異なるかどうかを評価するのに役立ちます。


計算されたカイ二乗値が統計的に有意でない場合は、数値が合理的に均等に分布していることを示唆し、等確率の仮説を裏付けます。ただし、X^2 値が有意な場合は、等確率からの逸脱を示します。


数値の等確率についてカイ二乗検定を実行する関数を作成しましょう。

 def chi2(data, size, expect, p_value = 0.05): pl = size * 1/expect df = expect - 1 x2_crit_1 = stats.chi2.ppf(p_value, df) x2_crit_2 = stats.chi2.ppf(1 - p_value, df) x2 = 0 for i in range(expect): x2 += ((data[i] - pl) ** 2)/pl accepted = x2_crit_1 < x2 < x2_crit_2 if x2_crit_1 < x2_crit_2 else x2_crit_2 < x2 < x2_crit_1 return x2, accepted


この関数は、カイ二乗統計量と、確率1 - 2 * p-valueで受け入れられる等確率の結果、つまり、この離散一様分布の極値の確率が低いタプルを返します。


 N = 37 chi2(count, len(numbers), N) (25.183136523720748, True)


確かに、SciPy ライブラリの組み込み機能を使用して、等確率のカイ二乗検定を実行できます。

 from scipy import stats chi2_statistic, p_value = stats.chisquare(count) (25.18313652372074, 0.9115057832606053)


ペアから始めて、これらの数字の組み合わせを調べてみましょう。

 from itertools import combinations pairs = list(combinations(range(1, N), 2))


このステップに続いて、これらのペアの発生を追跡する 2D マトリックスを構築します。

 pairs_count = np.zeros([N] * 2, dtype=int) for pair in pairs: for draw in lotto.values(): if pair[0] in draw and pair[1] in draw: pairs_count[pair[0]][pair[1]] += 1 pairs_count = pairs_count[1:, 1:] 



これは、ペア (a, b) と (b, a) が同等であり、ペア (a, b) の出現のみを集計するという事実を考慮して、三角行列を形成します。


私の関数では次の結果が得られます。

 counts = pairs_count.flatten() counts = counts[counts > 0] chi2(counts, sum(counts), len(counts)) (589.2721893491138, True)


SciPy は以下を提供します。

 chi2_statistic, p_value = stats.chisquare(counts) (589.2721893491124, 0.8698507423203673)


三つ子を検討してみてはいかがでしょうか:

 comb3 = list(combinations(range(1, N), 3)) comb3_count = np.zeros([N] * 3, dtype=int) for comb in comb3: for draw in lotto.values(): contains = comb[0] in draw and comb[1] in draw and comb[2] in draw if contains: comb3_count[comb[0]][comb[1]][comb[2]] += 1 comb3_count = comb3_count[1:, 1:, 1:] counts = comb3_count.flatten() counts = counts[counts > 0] chi2(counts, sum(counts), len(counts)) (6457.575829383709, False)


おそらくマトリックスの高いスパース性が原因で、何かがうまくいかなくなりました。カイ二乗値が下限カイ二乗しきい値を下回ります。

 6457.575829383709 < 6840.049842653838


ただし、SciPy を使用すると、結果は次のようになります。

 chi2_statistic, p_value = stats.chisquare(counts) (6457.575829383886, 0.9999997038479482)


次に、最も頻繁に描かれた数字を特定してみましょう。

 count.argmax() or list(count).index(max(count)) 11


まだ結論を急ぐのはやめましょう。この数値が長年にわたってどのように変化したかを調べることができます。

 year_result = dict() for year in range(2009, 2024): new_dict = {k:v for (k,v) in lotto.items() if str(year) in k} year_result[year] = np.bincount(np.array(list(new_dict.values())).flatten())[1:].argmax() { 2009: 16, 2010: 10, 2011: 11, 2012: 24, 2013: 32, 2014: 34, 2015: 21, 2016: 25, 2017: 5, 2018: 10, 2019: 24, 2020: 11, 2021: 12, 2022: 14, 2023: 11 }


または、時間の経過に伴う累積的な変化を分析することもできます。

 year_result = dict() arr = [] for year in range(2009, 2024): new_dict = {k:v for (k,v) in lotto.items() if str(year) in k} arr += list(np.array(list(new_dict.values())).flatten()) year_result['2009 - ' + str(year) if year > 2009 else str(year)] = np.bincount(arr)[1:].argmax() { '2009': 16, '2009 - 2010': 10, '2009 - 2011': 11, '2009 - 2012': 20, '2009 - 2013': 20, '2009 - 2014': 20, '2009 - 2015': 34, '2009 - 2016': 20, '2009 - 2017': 10, '2009 - 2018': 10, '2009 - 2019': 10, '2009 - 2020': 10, '2009 - 2021': 10, '2009 - 2022': 24, '2009 - 2023': 11 }


最後に、同一の描画がこれまでに発生したかどうかを調査することもできます。

 lotto_counts = {} for k, v in lotto.items(): v_str = str(v) if v_str in lotto_counts: lotto_counts[v_str] += [k] else: lotto_counts[v_str] = [k] result = {k: v for k, v in lotto_counts.items() if len(lotto_counts[k]) > 1} { '[13, 14, 26, 32, 33, 36]': ['16/10/2010', '21/09/2010'] }


これらの出来事がほぼ立て続けに起こったことに注目するのは面白いことです。


宝くじデータの世界への旅を終えるにあたり、数字と確率を巡るワイルドな旅になりました。ペアやトリプレットから最も人気のある数字を見つけるまで、いくつかの興味深い豆知識を発見しました。


宝くじには予測不可能性がつきものですが、カーテンの後ろを覗いてこれらのゲームの特徴を探るのは楽しいものです。あなたがプレイヤーであっても、単なる好奇心旺盛な観察者であっても、数字の世界には常に驚きの一つや二つが隠されています。