paint-brush
Təcrübə Təhlili üçün Stratifikasiya Metodundan istifadətərəfindən@nataliaogneva
33,172 oxunuşlar
33,172 oxunuşlar

Təcrübə Təhlili üçün Stratifikasiya Metodundan istifadə

tərəfindən Natalia Ogneva8m2024/04/19
Read on Terminal Reader
Read this story w/o Javascript

Çox uzun; Oxumaq

Stratifikasiya edilmiş seçmə məlumatların təhlilində təcrübə səmərəliliyini və metrik həssaslığı artırmaq üçün güclü bir texnikadır. Auditoriyanızı qruplaşdırmaq və onları xüsusi çəkilərə bölməklə siz təcrübələri optimallaşdıra, fərqləri azalda və nəticələrin etibarlılığını artıra bilərsiniz.

Company Mentioned

Mention Thumbnail
featured image - Təcrübə Təhlili üçün Stratifikasiya Metodundan istifadə
Natalia Ogneva HackerNoon profile picture
0-item


İstənilən eksperiment sürətli nəticələr və metrik həssaslıq arasında uyğunlaşmanı nəzərdə tutur. Seçilmiş metrik dispersiya baxımından genişdirsə, təcrübənin nəticələrinin dəqiq olmasını təmin etmək üçün uzun müddət gözləməliyik. Analitiklərə çox vaxt və ya metrik həssaslıq itirmədən təcrübələrini artırmağa kömək etmək üçün bir üsula nəzər salaq.


Problemin Tərkibi

Tutaq ki, əsas metrik olaraq sessiya uzunluğu olan yeni sıralama alqoritmini sınaqdan keçirmək üçün standart təcrübə aparırıq. Əlavə olaraq nəzərə alın ki, auditoriyamızı təxminən üç qrupa bölmək olar: 1 milyon yeniyetmə, 2 milyon 18-45 yaşlı istifadəçi və 45 və yuxarı yaşda olan 3 milyon istifadəçi. Yeni sıralama alqoritminə cavab bu auditoriya qrupları arasında əhəmiyyətli dərəcədə fərqlənəcək. Bu geniş variasiya metrikanın həssaslığını azaldır.


Başqa sözlə desək, əhalini üç təbəqəyə bölmək olar, bunlar aşağıda təsvir edilmişdir:


Deyək ki, hər bir komponentin normal paylanması var. Sonra əhali üçün əsas metrik də normal paylanmaya malikdir.

Stratifikasiya üsulu

Biz istifadəçilərimiz arasındakı fərqləri nəzərə almadan klassik eksperiment dizaynında bütün istifadəçiləri təsadüfi olaraq əhalidən ayırırıq . Beləliklə, biz nümunəni aşağıdakı gözlənilən dəyər və dispersiya ilə nəzərdən keçiririk.


Başqa bir yol, ümumi populyasiyada təbəqənin ağırlığına görə hər təbəqənin içərisində təsadüfi bölünmədir .

Bu halda gözlənilən dəyər və fərq aşağıdakılardır.


Gözlənilən dəyər ilk seçimdə olduğu kimidir. Bununla belə, fərq daha azdır, bu da daha yüksək metrik həssaslığa zəmanət verir.

İndi Neymanın metoduna nəzər salaq. İstifadəçiləri xüsusi çəkilərlə hər bir təbəqəyə təsadüfi şəkildə bölməyi təklif edirlər.

Beləliklə, gözlənilən dəyər və dispersiya bu halda aşağıdakılara bərabərdir.

Gözlənilən dəyər birinci halda asimptotik olaraq gözlənilən dəyərə bərabərdir. Bununla belə, fərq daha azdır.

Empirik Test

Bu metodun effektivliyini nəzəri cəhətdən sübut etdik. Nümunələri simulyasiya edək və təbəqələşmə metodunu empirik şəkildə sınaqdan keçirək.

Üç halı nəzərdən keçirək:

  • bərabər vasitələrə və fərqlərə malik bütün təbəqələr,
  • müxtəlif vasitələrə və bərabər fərqlərə malik bütün təbəqələr,
  • bərabər vasitələrə və müxtəlif dispersiyaya malik bütün təbəqələr.

Biz bütün hallarda hər üç metodu tətbiq edəcəyik və onları müqayisə etmək üçün histoqram və qutu qrafiki çəkəcəyik.

Kodun hazırlanması

Əvvəlcə Python-da üç təbəqədən ibarət ümumi populyasiyamızı simulyasiya edən bir sinif yaradaq.

 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]


Sonra nəzəri hissədə təsvir olunan üç seçmə metodu üçün funksiyaları əlavə edək.

 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


Həmçinin, empirik hissə üçün bizə həmişə təcrübə prosesini simulyasiya etmək funksiyası lazımdır.

 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


Simulyasiya nəticələri

Bütün təbəqələrimizin eyni dəyərlərə və fərqlərə malik olduğu ümumi əhaliyə nəzər salsaq, hər üç metodun nəticələrinin az-çox bərabər olacağı gözlənilir.

Müxtəlif vasitələr və bərabər fərqlər daha maraqlı nəticələr əldə etdi. Stratifikasiyadan istifadə fərqi kəskin şəkildə azaldır.

Bərabər orta və fərqli dispersiyaya malik hallarda Neyman metodunda dispersiya azalmasını görürük.

Nəticə

İndi siz auditoriyanızı qruplaşdırsanız və onları xüsusi çəkilərlə hər bir çoxluqda təsadüfi olaraq texniki olaraq bölsəniz, metrik fərqi azaltmaq və təcrübəni artırmaq üçün təbəqələşmə metodunu tətbiq edə bilərsiniz!