![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Ang anumang eksperimento ay nagsasangkot ng isang trade-off sa pagitan ng mabilis na mga resulta at sensitivity ng sukatan. Kung ang napiling sukatan ay malawak sa mga tuntunin ng pagkakaiba, kailangan nating maghintay ng mahabang panahon upang matiyak na tumpak ang mga resulta ng eksperimento. Isaalang-alang natin ang isang paraan upang matulungan ang mga analyst na palakasin ang kanilang mga eksperimento nang hindi nawawalan ng masyadong maraming oras o sensitivity ng sukatan.
Ipagpalagay na nagsasagawa kami ng karaniwang eksperimento upang subukan ang isang bagong algorithm sa pagraranggo, na may haba ng session bilang pangunahing sukatan. Bukod pa rito, isaalang-alang na ang aming audience ay maaaring halos ikategorya sa tatlong pangkat: 1 milyong teenager, 2 milyong user na may edad 18-45, at 3 milyong user na may edad 45 pataas. Ang tugon sa isang bagong algorithm sa pagraranggo ay mag-iiba-iba nang malaki sa mga pangkat ng audience na ito. Binabawasan ng malawak na variation na ito ang sensitivity ng sukatan.
Sa madaling salita, ang populasyon ay maaaring nahahati sa tatlong strata, na inilarawan sa mga sumusunod:
Sabihin nating ang bawat bahagi ay may normal na distribusyon. Pagkatapos, ang pangunahing sukatan para sa populasyon ay mayroon ding normal na distribusyon.
Random naming hinahati ang lahat ng user mula sa populasyon sa isang klasikal na disenyo ng eksperimento nang hindi isinasaalang-alang ang mga pagkakaiba sa pagitan ng aming mga user. Kaya, isinasaalang-alang namin ang sample na may sumusunod na inaasahang halaga at pagkakaiba.
Ang isa pang paraan ay ang random na paghahati sa loob ng bawat strat ayon sa bigat ng strat sa pangkalahatang populasyon.
Sa kasong ito, ang inaasahang halaga at pagkakaiba ay ang mga sumusunod.
Ang inaasahang halaga ay kapareho ng sa unang pagpili. Gayunpaman, mas mababa ang pagkakaiba, na ginagarantiyahan ang mas mataas na sensitivity ng sukatan.
Ngayon, isaalang-alang natin ang pamamaraan ni Neyman . Iminumungkahi nila na random na hatiin ang mga user sa loob ng bawat strat na may mga partikular na timbang.
Kaya, ang inaasahang halaga at pagkakaiba ay katumbas ng mga sumusunod sa kasong ito.
Ang inaasahang halaga ay katumbas ng inaasahang halaga sa unang kaso nang asymptotically. Gayunpaman, ang pagkakaiba ay mas mababa.
Napatunayan namin ang kahusayan ng pamamaraang ito ayon sa teorya. Gayahin natin ang mga sample at subukan ang stratification method sa empirically.
Isaalang-alang natin ang tatlong kaso:
Ilalapat namin ang lahat ng tatlong pamamaraan sa lahat ng kaso at mag-plot ng histogram at boxplot upang ihambing ang mga ito.
Una, gumawa tayo ng klase sa Python na ginagaya ang ating pangkalahatang populasyon na binubuo ng tatlong strats.
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]
Pagkatapos, magdagdag tayo ng mga function para sa tatlong pamamaraan ng sampling na inilarawan sa teoretikal na bahagi.
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
Gayundin, para sa empirical na bahagi, palagi kaming nangangailangan ng isang function para sa pagtulad sa proseso ng eksperimento.
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
Kung titingnan natin ang pangkalahatang populasyon, kung saan ang lahat ng ating mga strats ay may parehong mga halaga at pagkakaiba, ang mga resulta ng lahat ng tatlong mga pamamaraan ay inaasahan na higit pa o hindi gaanong pantay.
Ang iba't ibang paraan at pantay na pagkakaiba ay nakakuha ng mas kapana-panabik na mga resulta. Ang paggamit ng stratification ay kapansin-pansing binabawasan ang pagkakaiba-iba.
Sa mga kaso na may pantay na paraan at magkakaibang mga pagkakaiba, nakikita namin ang pagbawas ng pagkakaiba sa pamamaraan ni Neyman.
Ngayon, maaari mong ilapat ang paraan ng stratification upang bawasan ang pagkakaiba-iba ng sukatan at palakasin ang eksperimento kung i-cluster mo ang iyong audience at sa teknikal na paraan ay hahatiin sila nang random sa loob ng bawat cluster na may mga partikular na timbang!