Statistics lover
Аналитичари се често сусрећу са одступницима у подацима током свог рада, као што је током анализе АБ-теста, креирања предиктивних модела или праћења трендова. Одлуке се обично заснивају на средњој вредности узорка, која је веома осетљива на одступања и може драматично да промени вредност. Дакле, кључно је управљати изванредним вредностима да бисте донели исправну одлуку.
Хајде да размотримо неколико једноставних и брзих приступа за рад са необичним вредностима.
Замислите да треба да извршите анализу експеримента користећи просечну вредност поруџбине као примарни показатељ. Рецимо да наша метрика обично има нормалну дистрибуцију. Такође, знамо да се метричка дистрибуција у тест групи разликује од оне у контролној. Другим речима, средња вредност дистрибуције у контроли је 10, а у тесту је 12. Стандардна девијација у обе групе је 3.
Међутим, оба узорка имају изузетке који искривљују средње вредности узорка и стандардну девијацију узорка.
import numpy as np N = 1000 mean_1 = 10 std_1 = 3 mean_2 = 12 std_2 = 3 x1 = np.concatenate((np.random.normal(mean_1, std_1, N), 10 * np.random.random_sample(50) + 20)) x2 = np.concatenate((np.random.normal(mean_2, std_2, N), 4 * np.random.random_sample(50) + 1))
Имајте на уму да би разматрање метрике могло имати одступања са обе стране. Ако би ваша метрика могла да има одступања само са једне стране, методе би се лако могле трансформисати у ту сврху.
Најлакши метод је да одсечете сва посматрања пре 5% перцентила и после 95% перцентила . У овом случају, изгубили смо 10% информација као превару. Међутим, дистрибуције изгледају више обликоване, а моменти узорка су ближи моментима дистрибуције.
import numpy as np x1_5pct = np.percentile(x1, 5) x1_95pct = np.percentile(x1, 95) x1_cutted = [i for i in x1 if i > x1_5pct and i < x1_95pct] x2_5pct = np.percentile(x2, 5) x2_95pct = np.percentile(x2, 95) x2_cutted = [i for i in x2 if i > x2_5pct and i < x2_95pct]
Други начин је да се искључе запажања изван одређеног опсега . Ниски опсег је једнак 25% перцентила минус једна половина интерквартилног опсега, а високи опсег је једнак 75% перцентила плус једна половина. Овде ћемо изгубити само 0,7% информација. Дистрибуције изгледају више формиране од почетне. Моменти узорка су још једнакији моментима дистрибуције.
import numpy as np low_band_1 = np.percentile(x1, 25) - 1.5 * np.std(x1) high_band_1 = np.percentile(x1, 75) + 1.5 * np.std(x1) x1_cutted = [i for i in x1 if i > low_band_1 and i < high_band_1] low_band_2 = np.percentile(x2, 25) - 1.5 * np.std(x2) high_band_2 = np.percentile(x2, 75) + 1.5 * np.std(x2) x2_cutted = [i for i in x2 if i > low_band_2 and i < high_band_2]
Други метод који смо овде разматрали је боотстрап. У овом приступу, средња вредност је конструисана као средња вредност подузорака. У нашем примеру, средња вредност у контролној групи је 10,35, а у тест групи је 11,78. То је ипак бољи резултат у поређењу са додатном обрадом података.
import pandas as pd def create_bootstrap_samples( sample_list: np.array, sample_size: int, n_samples: int ): # create a list for sample means sample_means = [] # loop n_samples times for i in range(n_samples): # create a bootstrap sample of sample_size with replacement bootstrap_sample = pd.Series(sample_list).sample(n = sample_size, replace = True) # calculate the bootstrap sample mean sample_mean = bootstrap_sample.mean() # add this sample mean to the sample means list sample_means.append(sample_mean) return pd.Series(sample_means) (create_bootstrap_samples(x1, len(x1), 1000).mean(), create_bootstrap_samples(x2, len(x2), 1000).mean())
Откривање и обрада изванредних вредности су значајни за доношење праве одлуке. Сада би вам најмање три брза и једноставна приступа могла помоћи да проверите податке пре анализе.
Међутим, битно је запамтити да откривени одступници могу бити необичне вредности и карактеристика ефекта новости. Али то је друга прича :)