![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Az elemzők gyakran találkoznak kiugró adatokkal munkájuk során, például AB-teszt elemzés, prediktív modellek készítése vagy trendek követése során. A döntések általában a minta átlagán alapulnak, amely nagyon érzékeny a kiugró értékekre, és drámai módon megváltoztathatja az értéket. Ezért kulcsfontosságú a kiugró értékek kezelése a helyes döntés meghozatalához.
Nézzünk meg néhány egyszerű és gyors megközelítést a szokatlan értékekkel való munkavégzéshez.
Képzelje el, hogy egy kísérletelemzést kell végrehajtania, elsődleges mérőszámként egy átlagos rendelési értéket használva. Tegyük fel, hogy a metrikánk általában normális eloszlású. Azt is tudjuk, hogy a tesztcsoportban a metrika eloszlása eltér a kontrollétól. Vagyis az eloszlás átlaga a kontrollban 10, a tesztben pedig 12. A szórása mindkét csoportban 3.
Mindazonáltal mindkét mintában vannak kiugró értékek, amelyek torzítják a minta átlagát és a minta szórását.
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))
Megjegyzendő , hogy a metrika figyelembevételével mindkét oldalról lehetnek kiugró értékek. Ha a metrikájának csak az egyik oldalról lehet kiugró értéke, a metódusok könnyen átalakíthatók erre a célra.
A legegyszerűbb módszer az 5%-os percentilis előtti és a 95%-os percentilis utáni megfigyelések levágása. Ebben az esetben az információ 10%-át veszítettük el. Az eloszlások azonban formáltabbnak tűnnek, és a mintamomentumok közelebb állnak az eloszlási momentumokhoz.
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]
Egy másik módszer az adott tartományon kívüli megfigyelések kizárása. Az alsó sáv egyenlő a 25% percentilis mínusz az interkvartilis tartomány felével, a felső sáv pedig a 75% százalékos plusz fele. Itt csak az információ 0,7%-át veszítjük el. Az eloszlások formáltabbnak tűnnek, mint a kezdeti. A mintamomentumok még jobban megegyeznek az eloszlási nyomatékokkal.
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]
A második módszer, amelyet itt megvizsgáltunk, a bootstrap. Ebben a megközelítésben az átlagot részminták átlagaként állítják elő. Példánkban a kontrollcsoport átlaga 10,35, a tesztcsoporté pedig 11,78. Ez még mindig jobb eredmény a további adatfeldolgozáshoz képest.
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())
A kiugró értékek észlelése és feldolgozása fontos a helyes döntés meghozatalához. Most legalább három gyors és egyszerű megközelítés segíthet az adatok ellenőrzésében az elemzés előtt.
Fontos azonban emlékezni arra, hogy az észlelt kiugró értékek szokatlan értékek és az újdonság hatás jellemzői lehetnek. De ez egy másik történet :)