paint-brush
লটারি নম্বর ক্রাঞ্চ করুনদ্বারা@alexthoughts
30,826 পড়া
30,826 পড়া

লটারি নম্বর ক্রাঞ্চ করুন

দ্বারা Alex6m2023/10/01
Read on Terminal Reader
Read this story w/o Javascript

অতিদীর্ঘ; পড়তে

লটারিগুলি সবই অনির্দেশ্যতা সম্পর্কে, কিন্তু পর্দার আড়ালে উঁকি দেওয়া এবং এই গেমগুলির অদ্ভুততাগুলি অন্বেষণ করা মজাদার৷ আপনি একজন খেলোয়াড় বা শুধুমাত্র একজন কৌতূহলী পর্যবেক্ষকই হোন না কেন, সংখ্যার জগতে সর্বদা একটি চমক বা দুইটি চমক থাকে।
featured image - লটারি নম্বর ক্রাঞ্চ করুন
Alex HackerNoon profile picture


আমার দেশে, একটি সাপ্তাহিক লোটো গেম আছে যেখানে অংশগ্রহণকারীরা 37-এর পুল থেকে 6 নম্বর এবং 7-এর পুল থেকে অন্য একটি নম্বর নির্বাচন করে৷ আসুন গেমের প্রথম অংশে ফোকাস করি এবং একটি পুল থেকে একটি অতিরিক্ত নম্বর নির্বাচনকে উপেক্ষা করি৷ 7.


যখন k/N ফর্মের লটারির কথা আসে, যেখানে k হল N সংখ্যার মোট পুলের মধ্যে (আমাদের ক্ষেত্রে, 6) পছন্দসই নির্বাচনের সংখ্যা (আমাদের ক্ষেত্রে, 37), একটি সাধারণ প্রশ্ন হল প্রতিটি এই সংখ্যাগুলির বিজয়ী সংমিশ্রণের অংশ হওয়ার সমান সুযোগ রয়েছে।


আসুন এই প্রশ্নটি তদন্ত করি।


আমি তাদের ওয়েবসাইট থেকে 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 পৃথক সংখ্যার সমতা পরীক্ষা করতে, আপনি এই পদ্ধতিটি অনুসরণ করতে পারেন:


  • পর্যবেক্ষিত ফ্রিকোয়েন্সি (Oi) গণনা করুন যার সাথে প্রতিটি সংখ্যা i = 1, ..., N n লটারি ড্রতে ঘটেছে।


  • Ei = (nk) / N সূত্র ব্যবহার করে প্রতিটি সংখ্যার জন্য প্রত্যাশিত গণনা (Ei) গণনা করুন, যেখানে n হল লটারি ড্রয়ের মোট সংখ্যা, k হল প্রতিটি ড্রতে নির্বাচিত সংখ্যার সংখ্যা (এই ক্ষেত্রে, 6), এবং N হল সম্ভাব্য সংখ্যার মোট সংখ্যা (এই ক্ষেত্রে, 37)।


  • প্রত্যাশিত গণনা (Ei) এর সাথে পর্যবেক্ষিত গণনা (Oi) তুলনা করতে পিয়ারসন পরিসংখ্যান বা চি-স্কোয়ার পরিসংখ্যান ব্যবহার করুন। পিয়ারসন পরিসংখ্যানের সূত্রটি প্রায়শই প্রকাশ করা হয়:

  • পর্যবেক্ষিত এবং প্রত্যাশিত গণনা ব্যবহার করে চি-স্কোয়ার পরিসংখ্যান গণনা করুন।


  • কম্পিউটেড চি-স্কোয়ার মান পরিসংখ্যানগতভাবে তাৎপর্যপূর্ণ কিনা তা নির্ধারণ করতে একটি পরিসংখ্যানগত পরীক্ষা করুন, যেমন একটি চি-স্কোয়ার্ড পরীক্ষা। এটি আপনাকে মূল্যায়ন করতে সাহায্য করবে যে সংখ্যার বন্টন সমান সম্ভাবনার অধীনে যা আশা করা হবে তার থেকে উল্লেখযোগ্যভাবে আলাদা কিনা।


যদি গণনা করা চি-স্কয়ার মানটি পরিসংখ্যানগতভাবে তাৎপর্যপূর্ণ না হয়, তাহলে এটি প্রস্তাব করে যে সংখ্যাগুলি যুক্তিসঙ্গতভাবে সমানভাবে বিতরণ করা হয়েছে, যা সমতুল্যতার অনুমানকে সমর্থন করে। যাইহোক, যদি X^2 মান তাৎপর্যপূর্ণ হয়, তাহলে এটি সমতা থেকে প্রস্থান নির্দেশ করবে।


সংখ্যার সমান সম্ভাবনার জন্য chi-squared পরীক্ষা করার জন্য একটি ফাংশন তৈরি করা যাক:

 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


এই ফাংশনটি chi-squared পরিসংখ্যান সমন্বিত টিপল প্রদান করে এবং এর ফলে সম্ভাব্যতা 1 - 2 * p-value , অর্থাৎ, এই বিচ্ছিন্ন ইউনিফর্ম ডিস্ট্রিবিউশনের চরম মানগুলির সম্ভাবনা কম থাকে।


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


নিশ্চিতভাবে, আপনি সমান সম্ভাবনার জন্য chi-squared পরীক্ষা সম্পাদন করতে 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)


সম্ভবত ম্যাট্রিক্সের উচ্চ স্প্যার্সিটির কারণে কিছু ভুল হয়েছে। chi-squared মান নিম্ন সমালোচনামূলক chi-squared থ্রেশহোল্ডের নীচে পড়ে:

 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'] }


এটা লক্ষ্য করা মজার যে এই ঘটনাগুলি প্রায় পিছনে পিছনে ঘটেছে।


যখন আমরা লটারি ডেটার জগতে আমাদের যাত্রা শেষ করছি, এটি সংখ্যা এবং সম্ভাব্যতার মাধ্যমে একটি বন্য যাত্রা হয়েছে। আমরা কিছু আকর্ষণীয় টিডবিট উন্মোচন করেছি - জোড়া এবং ত্রিপল থেকে সবচেয়ে জনপ্রিয় সংখ্যা চিহ্নিত করা পর্যন্ত।


লটারিগুলি সবই অনির্দেশ্যতা সম্পর্কে, কিন্তু পর্দার আড়ালে উঁকি দেওয়া এবং এই গেমগুলির অদ্ভুততাগুলি অন্বেষণ করা মজাদার৷ আপনি একজন খেলোয়াড় বা শুধুমাত্র একজন কৌতূহলী পর্যবেক্ষকই হোন না কেন, সংখ্যার জগতে সর্বদা একটি চমক বা দুইটি থাকে।