मेरे देश में, एक साप्ताहिक लोट्टो खेल होता है जहां प्रतिभागी 37 के पूल से 6 संख्याएं चुनते हैं और 7 के पूल से एक और संख्या चुनते हैं। आइए खेल के पहले भाग पर ध्यान केंद्रित करें और एक पूल से एक अतिरिक्त संख्या के चयन की उपेक्षा करें 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 बार खींची गई, इत्यादि।
ऐसा प्रतीत होता है कि लॉटरी परिणामों में संख्याओं का वितरण अपेक्षाकृत समान है। इसकी और पुष्टि करने के लिए, हम वितरण की समता को मान्य करने के लिए एक परीक्षण कर सकते हैं।
एन व्यक्तिगत संख्याओं की समसंभाव्यता का परीक्षण करने के लिए, आप इस दृष्टिकोण का पालन कर सकते हैं:
यह निर्धारित करने के लिए कि गणना की गई ची-स्क्वायर मान सांख्यिकीय रूप से महत्वपूर्ण है या नहीं, एक सांख्यिकीय परीक्षण करें, जैसे कि ची-स्क्वायर परीक्षण। इससे आपको यह आकलन करने में मदद मिलेगी कि क्या संख्याओं का वितरण समसंभाव्यता के तहत अपेक्षित से काफी भिन्न है।
यदि परिकलित ची-वर्ग मान सांख्यिकीय रूप से महत्वपूर्ण नहीं है, तो यह सुझाव देता है कि संख्याएँ उचित रूप से समान रूप से वितरित की गई हैं, जो समसंभाव्यता की परिकल्पना का समर्थन करती हैं। हालाँकि, यदि 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))
इस चरण का अनुसरण करते हुए, हम एक 2डी मैट्रिक्स का निर्माण करते हैं जो इन जोड़ियों की घटनाओं को ट्रैक करता है:
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:]
यह एक त्रिकोणीय मैट्रिक्स बनाता है, क्योंकि यह इस तथ्य को ध्यान में रखता है कि जोड़े (ए, बी) और (बी, ए) समतुल्य हैं, और हम केवल जोड़े (ए, बी) की घटनाओं का मिलान करते हैं।
मेरा फ़ंक्शन उत्पन्न करता है:
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'] }
यह जानना मनोरंजक है कि ये घटनाएँ लगभग एक के बाद एक घटित हुईं।
जैसे ही हम लॉटरी डेटा की दुनिया में अपनी यात्रा समाप्त करते हैं, यह संख्याओं और संभावनाओं के माध्यम से एक जंगली यात्रा रही है। हमने कुछ दिलचस्प ख़बरें उजागर की हैं - जोड़ियों और त्रिक से लेकर सबसे लोकप्रिय संख्याओं की पहचान तक।
लॉटरी पूरी तरह से अप्रत्याशितता के बारे में है, लेकिन पर्दे के पीछे झाँकना और इन खेलों की विचित्रताओं का पता लगाना मज़ेदार है। चाहे आप एक खिलाड़ी हों या सिर्फ एक जिज्ञासु पर्यवेक्षक, संख्याओं की दुनिया में हमेशा एक या दो आश्चर्य होते हैं।