paint-brush
სტრატიფიკაციის მეთოდის გამოყენება ექსპერიმენტის ანალიზისთვისმიერ@nataliaogneva
33,172 საკითხავი
33,172 საკითხავი

სტრატიფიკაციის მეთოდის გამოყენება ექსპერიმენტის ანალიზისთვის

მიერ Natalia Ogneva8m2024/04/19
Read on Terminal Reader
Read this story w/o Javascript

Ძალიან გრძელი; Წაკითხვა

სტრატიფიცირებული ნიმუშის აღება მძლავრი ტექნიკაა ექსპერიმენტის ეფექტურობისა და მონაცემთა ანალიზის მეტრულ მგრძნობელობის გასაძლიერებლად. თქვენი აუდიტორიის დაჯგუფებით და მათი სპეციფიკური წონებით დაყოფით, შეგიძლიათ ექსპერიმენტების ოპტიმიზაცია, დისპერსიის შემცირება და შედეგების სანდოობის გაზრდა.

Company Mentioned

Mention Thumbnail
featured image - სტრატიფიკაციის მეთოდის გამოყენება ექსპერიმენტის ანალიზისთვის
Natalia Ogneva HackerNoon profile picture
0-item


ნებისმიერი ექსპერიმენტი მოიცავს კომპრომისს სწრაფ შედეგებსა და მეტრულ მგრძნობელობას შორის. თუ არჩეული მეტრიკა ფართოა დისპერსიის თვალსაზრისით, ჩვენ უნდა დაველოდოთ დიდხანს, რათა ექსპერიმენტის შედეგები ზუსტი იყოს. მოდით განვიხილოთ ერთი მეთოდი, რომელიც ანალიტიკოსებს დაეხმარება გააძლიერონ თავიანთი ექსპერიმენტები ზედმეტი დროის ან მეტრიკული მგრძნობელობის დაკარგვის გარეშე.


პრობლემის ფორმულირება

დავუშვათ, ჩვენ ვატარებთ სტანდარტულ ექსპერიმენტს ახალი რეიტინგის ალგორითმის შესამოწმებლად, სესიის სიგრძით, როგორც პირველადი მეტრიკა. გარდა ამისა, გაითვალისწინეთ, რომ ჩვენი აუდიტორია შეიძლება უხეშად დაიყოს სამ ჯგუფად: 1 მილიონი მოზარდი, 2 მილიონი მომხმარებელი 18-45 წლის ასაკში და 3 მილიონი მომხმარებელი 45 წლის და ზემოთ. ახალი რეიტინგის ალგორითმის პასუხი მნიშვნელოვნად განსხვავდებოდა ამ აუდიტორიის ჯგუფებში. ეს ფართო ვარიაცია ამცირებს მეტრიკის მგრძნობელობას.


სხვა სიტყვებით რომ ვთქვათ, მოსახლეობა შეიძლება დაიყოს სამ ფენად, რომლებიც აღწერილია შემდეგში:


ვთქვათ, რომ ყველა კომპონენტს აქვს ნორმალური განაწილება. შემდეგ, მოსახლეობის ძირითადი მეტრიკა ასევე ნორმალური განაწილებაა.

სტრატიფიკაციის მეთოდი

ჩვენ შემთხვევით ვყოფთ ყველა მომხმარებელს პოპულაციიდან კლასიკურ ექსპერიმენტის დიზაინში, ჩვენს მომხმარებლებს შორის განსხვავებების გათვალისწინების გარეშე. ამრიგად, ჩვენ განვიხილავთ ნიმუშს შემდეგი მოსალოდნელი მნიშვნელობით და დისპერსიით.


სხვა გზა არის შემთხვევითი დაყოფა ყველა სტრატის შიგნით ფენის წონის მიხედვით ზოგადად პოპულაციაში.

ამ შემთხვევაში, მოსალოდნელი მნიშვნელობა და განსხვავება შემდეგია.


მოსალოდნელი მნიშვნელობა იგივეა, რაც პირველ შერჩევაში. თუმცა, დისპერსია ნაკლებია, რაც უზრუნველყოფს უფრო მაღალ მეტრულ მგრძნობელობას.

ახლა განვიხილოთ ნეიმანის მეთოდი . ისინი გვთავაზობენ მომხმარებლების შემთხვევით დაყოფას თითოეული სტრატის შიგნით კონკრეტული წონებით.

ასე რომ, მოსალოდნელი მნიშვნელობა და განსხვავება ამ შემთხვევაში უდრის შემდეგს.

მოსალოდნელი მნიშვნელობა უდრის მოსალოდნელ მნიშვნელობას პირველ შემთხვევაში ასიმპტომურად. თუმცა, განსხვავება გაცილებით ნაკლებია.

ემპირიული ტესტირება

ჩვენ დავამტკიცეთ ამ მეთოდის ეფექტურობა თეორიულად. მოვახდინოთ ნიმუშების სიმულაცია და ემპირიულად შევამოწმოთ სტრატიფიკაციის მეთოდი.

განვიხილოთ სამი შემთხვევა:

  • ყველა სტრატი თანაბარი საშუალებებითა და განსხვავებებით,
  • ყველა სტრატი განსხვავებული საშუალებებით და თანაბარი განსხვავებებით,
  • ყველა სტრატი თანაბარი საშუალებებით და განსხვავებული ვარიაციებით.

ჩვენ გამოვიყენებთ სამივე მეთოდს ყველა შემთხვევაში და გამოვსახავთ ჰისტოგრამას და ყუთს მათ შესადარებლად.

კოდის მომზადება

პირველი, მოდით შევქმნათ კლასი 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


სიმულაციის შედეგები

თუ გადავხედავთ ზოგად პოპულაციას, სადაც ყველა ჩვენს სტრატს აქვს იგივე მნიშვნელობები და ვარიაციები, სამივე მეთოდის შედეგები მეტ-ნაკლებად თანაბარი იქნება.

სხვადასხვა საშუალებებმა და თანაბარმა დისპერსიებმა უფრო საინტერესო შედეგები მიიღო. სტრატიფიკაციის გამოყენება მკვეთრად ამცირებს დისპერსიას.

თანაბარი საშუალო და განსხვავებული ვარიაციების შემთხვევაში, ჩვენ ვხედავთ დისპერსიის შემცირებას ნეიმანის მეთოდში.

დასკვნა

ახლა თქვენ შეგიძლიათ გამოიყენოთ სტრატიფიკაციის მეთოდი მეტრიკული დისპერსიის შესამცირებლად და ექსპერიმენტის გასაძლიერებლად, თუ დააჯგუფებთ თქვენს აუდიტორიას და ტექნიკურად დაყოფთ მათ შემთხვევით თითოეულ კლასტერში კონკრეტული წონებით!