paint-brush
Menggunakan Metode Stratifikasi untuk Analisis Eksperimenoleh@nataliaogneva
33,172 bacaan
33,172 bacaan

Menggunakan Metode Stratifikasi untuk Analisis Eksperimen

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

Terlalu panjang; Untuk membaca

Pengambilan sampel berstrata merupakan teknik yang ampuh untuk meningkatkan efisiensi eksperimen dan sensitivitas metrik dalam analisis data. Dengan mengelompokkan audiens dan membaginya dengan bobot tertentu, Anda dapat mengoptimalkan eksperimen, mengurangi varians, dan meningkatkan keandalan hasil.

Company Mentioned

Mention Thumbnail
featured image - Menggunakan Metode Stratifikasi untuk Analisis Eksperimen
Natalia Ogneva HackerNoon profile picture
0-item


Setiap eksperimen melibatkan pilihan antara hasil yang cepat dan sensitivitas metrik. Jika metrik yang dipilih memiliki varians yang luas, kita harus menunggu lama untuk memastikan hasil eksperimen tersebut akurat. Mari kita pertimbangkan satu metode untuk membantu analis meningkatkan eksperimen mereka tanpa kehilangan terlalu banyak waktu atau sensitivitas metrik.


Perumusan Masalah

Misalkan kita melakukan eksperimen standar untuk menguji algoritme pemeringkatan baru, dengan durasi sesi sebagai metrik utama. Selain itu, pertimbangkan bahwa audiens kita dapat dikategorikan secara kasar menjadi tiga kelompok: 1 juta remaja, 2 juta pengguna berusia 18-45 tahun, dan 3 juta pengguna berusia 45 tahun ke atas. Respons terhadap algoritme pemeringkatan baru akan sangat bervariasi di antara kelompok audiens ini. Variasi yang luas ini mengurangi sensitivitas metrik.


Dengan kata lain, populasi dapat dibagi menjadi tiga strata, yang dijelaskan sebagai berikut:


Misalkan setiap komponen memiliki distribusi normal. Maka, metrik utama untuk populasi juga memiliki distribusi normal.

Metode stratifikasi

Kami membagi semua pengguna dari populasi secara acak dalam desain eksperimen klasik tanpa mempertimbangkan perbedaan antara pengguna kami. Jadi, kami mempertimbangkan sampel dengan nilai dan varians yang diharapkan sebagai berikut.


Cara lain adalah dengan membagi secara acak dalam setiap strat berdasarkan bobot strat dalam populasi umum.

Dalam kasus ini, nilai yang diharapkan dan variansnya adalah sebagai berikut.


Nilai yang diharapkan sama dengan pilihan pertama. Akan tetapi, variansnya lebih kecil, yang menjamin sensitivitas metrik yang lebih tinggi.

Sekarang, mari kita pertimbangkan metode Neyman . Mereka menyarankan untuk membagi pengguna secara acak di dalam setiap strategi dengan bobot tertentu.

Jadi, nilai yang diharapkan dan variansnya sama dengan yang berikut dalam kasus ini.

Nilai yang diharapkan sama dengan nilai yang diharapkan pada kasus pertama secara asimtotik. Akan tetapi, variansnya jauh lebih kecil.

Pengujian Empiris

Kami telah membuktikan efisiensi metode ini secara teoritis. Mari simulasikan sampel dan uji metode stratifikasi secara empiris.

Mari kita pertimbangkan tiga kasus:

  • semua strategi dengan rata-rata dan varians yang sama,
  • semua strategi dengan rata-rata yang berbeda dan varians yang sama,
  • semua strategi dengan rata-rata yang sama dan varians yang berbeda.

Kami akan menerapkan ketiga metode dalam semua kasus dan memplot histogram dan boxplot untuk membandingkannya.

Persiapan kode

Pertama, mari membuat kelas dalam Python yang mensimulasikan populasi umum kita yang terdiri dari tiga strategi.

 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]


Kemudian, mari tambahkan fungsi untuk tiga metode pengambilan sampel yang dijelaskan dalam bagian teoritis.

 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


Selain itu, untuk bagian empiris, kita selalu membutuhkan fungsi untuk mensimulasikan proses eksperimen.

 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


Hasil simulasi

Jika kita melihat populasi umum, di mana semua strategi kita memiliki nilai dan varians yang sama, hasil dari ketiga metode diharapkan kurang lebih sama.

Rata-rata yang berbeda dan varians yang sama menghasilkan hasil yang lebih menarik. Penggunaan stratifikasi secara drastis mengurangi varians.

Dalam kasus dengan rata-rata yang sama dan varians yang berbeda, kita melihat pengurangan varians dalam metode Neyman.

Kesimpulan

Sekarang, Anda dapat menerapkan metode stratifikasi untuk mengurangi varians metrik dan meningkatkan eksperimen jika Anda mengelompokkan audiens Anda dan secara teknis membaginya secara acak di dalam setiap kelompok dengan bobot tertentu!