![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Analistek sarritan topatzen dituzte datuen kanpo-saioak beren lanean zehar, hala nola AB-testaren azterketan, eredu prediktiboak sortzen edo joeren jarraipena egiten. Erabakiak, normalean, laginaren batez bestekoan oinarritzen dira, hau da, abereekiko oso sentikorra da eta balioa nabarmen alda dezake. Beraz, ezinbestekoa da outliers kudeatzea erabaki zuzena hartzeko.
Azter ditzagun balio ezohikoekin lan egiteko hainbat ikuspegi sinple eta azkar.
Imajinatu esperimentu-analisi bat egin behar duzula batez besteko eskaeraren balio bat neurri nagusi gisa erabiliz. Demagun gure metrik normalean banaketa normala duela. Gainera, badakigu proba-taldeko banaketa metrikoa kontrolekoaren desberdina dela. Beste era batera esanda, kontroleko banaketaren batez bestekoa 10 da, eta proban 12. Bi taldeetako desbideratze estandarra 3 da.
Hala ere, bi laginek laginaren batezbestekoa eta laginaren desbideratze estandarra okertzen dituzten outliers dituzte.
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))
Kontuan izan metrikoa kontuan hartuta bi aldeetatik kanpoak izan ditzakeela. Zure metrikak alde batetik bakarrik izan badezakete kanpoan, metodoak erraz eraldatu litezke horretarako.
Metodorik errazena behaketa guztiak % 5eko pertzentilaren aurretik eta % 95eko pertzentilaren ondoren moztea da. Kasu honetan, informazioaren %10 galdu dugu iruzur gisa. Hala ere, banaketak eratuagoak dirudite, eta lagin-momentuak banaketa-momentuetatik hurbilago daude.
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]
Beste modu bat tarte zehatzetik kanpoko behaketak baztertzea da. Behe-banda % 25 pertzentila ken kuartil arteko tartearen erdia da, eta banda altua % 75 pertzentila gehi erdia. Hemen, informazioaren % 0,7 baino ez dugu galduko. Banaketak hasierakoak baino eratuagoak dirudite. Lagin-momentuak are gehiago berdintzen dira banaketa-momentuekin.
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]
Hemen kontuan hartu dugun bigarren metodoa bootstrap bat da. Ikuspegi honetan, batezbestekoa azpilaginen batez besteko gisa eraikitzen da. Gure adibidean, kontrol-taldeko batez bestekoa 10,35 da, eta proba-taldea 11,78. Emaitza hobea da oraindik datuen tratamendu gehigarriarekin alderatuta.
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())
Ezustekoak hautematea eta prozesatzea garrantzitsuak dira erabaki egokia hartzeko. Orain, gutxienez hiru hurbilketa azkar eta zuzenek datuak egiaztatzen lagunduko dizute azterketa egin aurretik.
Hala ere, ezinbestekoa da gogoratzea detektatutako outliers ezohiko balioak izan daitezkeela eta berritasun efekturako ezaugarri bat. Baina beste istorio bat da :)