Аналітыкі часта сутыкаюцца з выкідамі ў дадзеных падчас сваёй працы, напрыклад падчас аналізу AB-тэсту, стварэння прагнастычных мадэляў або адсочвання тэндэнцый. Рашэнні звычайна прымаюцца на аснове выбарачнага сярэдняга, якое вельмі адчувальна да выкідаў і можа значна змяніць значэнне. Такім чынам, вельмі важна кіраваць выкідамі, каб прыняць правільнае рашэнне.
Разгледзім некалькі простых і хуткіх падыходаў для працы з незвычайнымі значэннямі.
Уявіце, што вам трэба правесці аналіз эксперыменту, выкарыстоўваючы сярэдняе значэнне замовы ў якасці асноўнага паказчыка. Скажам, наша метрыка звычайна мае нармальнае размеркаванне. Акрамя таго, мы ведаем, што размеркаванне паказчыкаў у доследнай групе адрозніваецца ад размеркавання ў кантрольнай групе. Іншымі словамі, сярэдняе значэнне размеркавання ў кантролі роўна 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())
Выяўленне выкідаў і апрацоўка важныя для прыняцця правільнага рашэння. Цяпер як мінімум тры хуткія і простыя падыходы могуць дапамагчы вам праверыць дадзеныя перад аналізам.
Аднак важна памятаць, што выяўленыя выкіды могуць быць незвычайнымі значэннямі і прыкметай эфекту навізны. Але гэта іншая гісторыя :)