paint-brush
تجرباتی تجزیہ کے لیے Stratification طریقہ استعمال کرناکی طرف سے@nataliaogneva
33,155 ریڈنگز
33,155 ریڈنگز

تجرباتی تجزیہ کے لیے Stratification طریقہ استعمال کرنا

کی طرف سے Natalia Ogneva8m2024/04/19
Read on Terminal Reader
Read this story w/o Javascript

بہت لمبا؛ پڑھنے کے لئے

اعداد و شمار کے تجزیہ میں تجرباتی کارکردگی اور میٹرک حساسیت کو بڑھانے کے لیے اسٹریٹیفائیڈ سیمپلنگ ایک طاقتور تکنیک ہے۔ اپنے سامعین کو کلسٹر کرکے اور انہیں مخصوص وزن کے ساتھ تقسیم کرکے، آپ تجربات کو بہتر بنا سکتے ہیں، تغیرات کو کم کر سکتے ہیں، اور نتائج کی بھروسے کو بڑھا سکتے ہیں۔

Company Mentioned

Mention Thumbnail
featured image - تجرباتی تجزیہ کے لیے Stratification طریقہ استعمال کرنا
Natalia Ogneva HackerNoon profile picture
0-item


کسی بھی تجربے میں تیز رفتار نتائج اور میٹرک حساسیت کے درمیان تجارت شامل ہوتی ہے۔ اگر منتخب کردہ میٹرک تغیر کے لحاظ سے وسیع ہے، تو ہمیں تجربہ کے نتائج کے درست ہونے کو یقینی بنانے کے لیے طویل انتظار کرنا چاہیے۔ آئیے تجزیہ کاروں کو بہت زیادہ وقت یا میٹرک حساسیت کھونے کے بغیر اپنے تجربات کو بڑھانے میں مدد کرنے کے لیے ایک طریقہ پر غور کریں۔


مسئلہ کی تشکیل

فرض کریں کہ ہم ایک نئے درجہ بندی الگورتھم کو جانچنے کے لیے ایک معیاری تجربہ کرتے ہیں، جس میں سیشن کی لمبائی بنیادی میٹرک کے طور پر ہوتی ہے۔ مزید برآں، اس بات پر غور کریں کہ ہمارے سامعین کو تقریباً تین گروہوں میں تقسیم کیا جا سکتا ہے: 1 ملین نوعمر، 2 ملین صارفین جن کی عمریں 18-45، اور 3 ملین صارفین جن کی عمریں 45 اور اس سے زیادہ ہیں۔ نئے درجہ بندی الگورتھم کا ردعمل ان سامعین گروپوں میں نمایاں طور پر مختلف ہوگا۔ یہ وسیع تغیر میٹرک کی حساسیت کو کم کرتا ہے۔


دوسرے الفاظ میں، آبادی کو تین حصوں میں تقسیم کیا جا سکتا ہے، جس کی تفصیل درج ذیل ہے:


ہم کہتے ہیں کہ ہر جزو کی ایک عام تقسیم ہوتی ہے۔ پھر، آبادی کے لیے مرکزی میٹرک کی بھی ایک عام تقسیم ہوتی ہے۔

استحکام کا طریقہ

ہم اپنے صارفین کے درمیان فرق پر غور کیے بغیر کلاسیکی تجرباتی ڈیزائن میں آبادی سے تمام صارفین کو تصادفی طور پر تقسیم کرتے ہیں ۔ اس طرح، ہم مندرجہ ذیل متوقع قدر اور تغیر کے ساتھ نمونے پر غور کرتے ہیں۔


ایک اور طریقہ یہ ہے کہ عام آبادی میں سٹریٹ کے وزن کے مطابق ہر اسٹریٹ کے اندر تصادفی طور پر تقسیم کیا جائے ۔

اس صورت میں، متوقع قدر اور تغیرات درج ذیل ہیں۔


متوقع قدر وہی ہے جو پہلے انتخاب میں ہے۔ تاہم، تغیر کم ہے، جو میٹرک کی اعلیٰ حساسیت کی ضمانت دیتا ہے۔

اب، Neyman کے طریقہ کار پر غور کریں. وہ صارفین کو مخصوص وزن کے ساتھ ہر اسٹریٹ کے اندر تصادفی طور پر تقسیم کرنے کا مشورہ دیتے ہیں۔

لہذا، متوقع قدر اور تغیر اس معاملے میں درج ذیل کے برابر ہیں۔

متوقع قدر غیر علامتی طور پر پہلی صورت میں متوقع قدر کے برابر ہے۔ تاہم، فرق بہت کم ہے.

تجرباتی جانچ

ہم نے اس طریقہ کار کی افادیت کو نظریاتی طور پر ثابت کیا ہے۔ آئیے نمونوں کی تقلید کرتے ہیں اور اسٹریٹیفکیشن کے طریقہ کار کو تجرباتی طور پر جانچتے ہیں۔

آئیے تین صورتوں پر غور کریں:

  • مساوی ذرائع اور تغیرات کے ساتھ تمام پٹیاں،
  • تمام اسٹریٹس مختلف ذرائع اور مساوی تغیرات کے ساتھ،
  • تمام اسٹریٹس مساوی ذرائع اور مختلف تغیرات کے ساتھ۔

ہم تینوں طریقوں کو تمام صورتوں میں لاگو کریں گے اور ان کا موازنہ کرنے کے لیے ایک ہسٹوگرام اور باکس پلاٹ بنائیں گے۔

کوڈ کی تیاری

سب سے پہلے، آئیے Python میں ایک کلاس بناتے ہیں جو ہماری عام آبادی کو تین اسٹریٹس پر مشتمل بناتا ہے۔

 class GeneralPopulation: def __init__(self, means: [float], stds: [float], sizes: [int], random_state: int = 15 ): """ Initializes our General Population and saves the given distributions :param means: List of expectations for normal distributions :param stds: List of standard deviations for normal distributions :param sizes: How many objects will be in each strata :param random_state: Parameter fixing randomness. Needed so that when conducting experiment repeatedly with the same input parameters, the results remained the same """ self.strats = [st.norm(mean, std) for mean, std in zip(means, stds)] self._sample(sizes) self.random_state = random_state def _sample(self, sizes): """Creates a general population sample as a mixture of strata :param sizes: List with sample sizes of the corresponding normal distributions """ self.strats_samples = [rv.rvs(size) for rv, size in zip(self.strats, sizes)] self.general_samples = np.hstack(self.strats_samples) self.N = self.general_samples.shape[0] # number of strata self.count_strats = len(sizes) # ratios for every strata in GP self.ws = [size/self.N for size in sizes] # ME and Std for GP self.m = np.mean(self.general_samples) self.sigma = np.std(self.general_samples) # ME and std for all strata self.ms = [np.mean(strat_sample) for strat_sample in self.strats_samples] self.sigmas = [np.std(strat_sample) for strat_sample in self.strats_samples]


پھر، آئیے نظریاتی حصے میں بیان کردہ تین نمونے لینے کے طریقوں کے لیے افعال شامل کریں۔

 def random_subsampling(self, size): """Creates a random subset of the entire population :param sizes: subsample size """ rc = np.random.choice(self.general_samples, size=size) return rc def proportional_subsampling(self, size): """Creates a subsample with the number of elements, proportional shares of strata :param sizes: subsample size """ self.strats_size_proport = [int(np.floor(size*w)) for w in self.ws] rc = [] for k in range(len(self.strats_size_proport)): rc.append(np.random.choice(self.strats_samples[k], size=self.strats_size_proport[k])) return rc def optimal_subsampling(self, size): """Creates a subsample with the optimal number of elements relative to strata :param sizes: subsample size """ sum_denom = 0 for k in range(self.count_strats): sum_denom += self.ws[k] * self.sigmas[k] self.strats_size_optimal = [int(np.floor((size*w*sigma)/sum_denom)) for w, sigma in zip(self.ws, self.sigmas)] if 0 in self.strats_size_optimal: raise ValueError('Strats size is 0, please change variance of smallest strat!') rc = [] for k in range(len(self.strats_size_optimal)): rc.append(np.random.choice(self.strats_samples[k], size=self.strats_size_optimal[k])) return rc


اس کے علاوہ، تجرباتی حصے کے لیے، ہمیں ہمیشہ تجرباتی عمل کی تقلید کے لیے ایک فنکشن کی ضرورت ہوتی ہے۔

 def run_experiments(self, n_sub, subsampling_method, n_experiments=1000): """Conducts a series of experiments and saves the results :param n_sub: size of sample :param subsampling_method: method for creating a subsample :param n_experiments: number of experiment starts """ means_s = [] if(len(self.general_samples)<100): n_sub = 20 if(subsampling_method == 'random_subsampling'): for n in range(n_experiments): rc = self.random_subsampling(n_sub) mean = rc.sum()/len(rc) means_s.append(mean) else: for n in range(n_experiments): if(subsampling_method == 'proportional_subsampling'): rc = self.proportional_subsampling(n_sub) elif(subsampling_method == 'optimal_subsampling'): rc = self.optimal_subsampling(n_sub) strats_mean = [] for k in range(len(rc)): strats_mean.append(sum(rc[k])/len(rc[k])) # Mean for a mixture means_s.append(sum([w_k*mean_k for w_k, mean_k in zip(self.ws, strats_mean)])) return means_s


نقلی نتائج

اگر ہم عام آبادی پر نظر ڈالیں، جہاں ہمارے تمام طبقوں کی قدریں اور تغیرات یکساں ہیں، تینوں طریقوں کے نتائج کم و بیش برابر ہونے کی توقع ہے۔

مختلف ذرائع اور مساوی تغیرات نے مزید دلچسپ نتائج حاصل کیے۔ استحکام کا استعمال ڈرامائی طور پر تغیر کو کم کرتا ہے۔

مساوی ذرائع اور مختلف تغیرات والے معاملات میں، ہم Neyman کے طریقہ کار میں تغیرات میں کمی دیکھتے ہیں۔

نتیجہ

اب، اگر آپ اپنے سامعین کو کلسٹر کرتے ہیں اور تکنیکی طور پر انہیں مخصوص وزن کے ساتھ ہر کلسٹر کے اندر تصادفی طور پر تقسیم کرتے ہیں تو آپ میٹرک تغیر کو کم کرنے اور تجربے کو فروغ دینے کے لیے درجہ بندی کا طریقہ استعمال کر سکتے ہیں!