paint-brush
Korištenje metode stratifikacije za analizu eksperimentaby@nataliaogneva
33,138 čitanja
33,138 čitanja

Korištenje metode stratifikacije za analizu eksperimenta

by Natalia Ogneva8m2024/04/19
Read on Terminal Reader
Read this story w/o Javascript

Predugo; Citati

Stratificirano uzorkovanje je moćna tehnika za povećanje efikasnosti eksperimenta i metričke osjetljivosti u analizi podataka. Grupiranjem vaše publike i dijeljenjem sa određenim težinama, možete optimizirati eksperimente, smanjiti varijansu i poboljšati pouzdanost rezultata.

Company Mentioned

Mention Thumbnail
featured image - Korištenje metode stratifikacije za analizu eksperimenta
Natalia Ogneva HackerNoon profile picture
0-item


Svaki eksperiment uključuje kompromis između brzih rezultata i metričke osjetljivosti. Ako je odabrana metrika široka u smislu varijanse, moramo čekati dugo da bismo bili sigurni da su rezultati eksperimenta tačni. Razmotrimo jednu metodu koja pomaže analitičarima da pojačaju svoje eksperimente bez gubljenja previše vremena ili metričke osjetljivosti.


Formulacija problema

Pretpostavimo da provodimo standardni eksperiment da testiramo novi algoritam za rangiranje, sa dužinom sesije kao primarnom metrikom. Uz to, uzmite u obzir da se naša publika može grubo kategorizirati u tri grupe: 1 milion tinejdžera, 2 miliona korisnika od 18 do 45 godina i 3 miliona korisnika od 45 i više godina. Odgovor na novi algoritam rangiranja značajno bi varirao među ovim grupama publike. Ova široka varijacija smanjuje osjetljivost metrike.


Drugim riječima, stanovništvo se može podijeliti u tri sloja, opisana u nastavku:


Recimo da svaka komponenta ima normalnu distribuciju. Zatim, glavna metrika za populaciju također ima normalnu distribuciju.

Metoda stratifikacije

Mi nasumično dijelimo sve korisnike iz populacije u klasičnom dizajnu eksperimenta, ne uzimajući u obzir razlike između naših korisnika. Stoga, razmatramo uzorak sa sljedećom očekivanom vrijednošću i varijansom.


Drugi način je nasumično dijeljenje unutar svakog strata prema težini strata u općoj populaciji.

U ovom slučaju, očekivana vrijednost i varijansa su sljedeće.


Očekivana vrijednost je ista kao u prvom odabiru. Međutim, varijansa je manja, što garantuje veću metričku osjetljivost.

Sada, hajde da razmotrimo Neymanovu metodu . Oni predlažu nasumično dijeljenje korisnika unutar svake strateške grupe sa određenim težinama.

Dakle, očekivana vrijednost i varijansa su u ovom slučaju jednake sljedećem.

Očekivana vrijednost je jednaka očekivanoj vrijednosti u prvom slučaju asimptotski. Međutim, varijansa je mnogo manja.

Empirijsko testiranje

Teoretski smo dokazali efikasnost ove metode. Hajde da simuliramo uzorke i empirijski testiramo metodu stratifikacije.

Razmotrimo tri slučaja:

  • svi stratovi s jednakim srednjim vrijednostima i varijacijama,
  • svi stratovi s različitim srednjim vrijednostima i jednakim varijacijama,
  • svi stratovi sa jednakim srednjim vrednostima i različitim varijacijama.

Primijenit ćemo sve tri metode u svim slučajevima i nacrtati histogram i boxplot da ih uporedimo.

Priprema koda

Prvo, napravimo klasu u Pythonu koja simulira našu opštu populaciju koja se sastoji od tri strata.

 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]


Zatim, dodajmo funkcije za tri metode uzorkovanja opisane u teoretskom dijelu.

 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


Također, za empirijski dio uvijek nam je potrebna funkcija za simulaciju procesa eksperimenta.

 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


Rezultati simulacije

Ako pogledamo opću populaciju, gdje svi naši stratovi imaju iste vrijednosti i varijanse, očekuje se da će rezultati sve tri metode biti manje-više jednaki.

Različite sredine i jednake varijacije dale su uzbudljivije rezultate. Korištenje stratifikacije dramatično smanjuje varijansu.

U slučajevima s jednakim srednjim vrijednostima i različitim varijacijama, vidimo smanjenje varijanse u Neymanovoj metodi.

Zaključak

Sada možete primijeniti metodu stratifikacije kako biste smanjili metričku varijansu i pojačali eksperiment ako grupišete svoju publiku i tehnički je podijelite nasumično unutar svakog klastera sa određenim težinama!