paint-brush
Detekcija odstupanja: šta trebate znatiby@nataliaogneva
54,579 čitanja
54,579 čitanja

Detekcija odstupanja: šta trebate znati

by Natalia Ogneva4m2024/04/23
Read on Terminal Reader
Read this story w/o Javascript

Predugo; Citati

Analitičari se često susreću sa odstupnicima u podacima tokom svog rada. Odluke se obično zasnivaju na srednjoj vrijednosti uzorka, koja je vrlo osjetljiva na odstupanja. Za donošenje ispravne odluke ključno je upravljati izvanrednim vrijednostima. Razmotrimo nekoliko jednostavnih i brzih pristupa za rad s neobičnim vrijednostima.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Detekcija odstupanja: šta trebate znati
Natalia Ogneva HackerNoon profile picture

Analitičari se često susreću sa odstupanjima u podacima tokom svog rada, kao što je tokom analize AB testa, kreiranja prediktivnih modela ili praćenja trendova. Odluke se obično zasnivaju na srednjoj vrijednosti uzorka, koja je vrlo osjetljiva na vanjske vrijednosti i može dramatično promijeniti vrijednost. Dakle, ključno je upravljati izvanrednim vrijednostima kako biste donijeli ispravnu odluku.


Razmotrimo nekoliko jednostavnih i brzih pristupa za rad s neobičnim vrijednostima.

Formulacija problema

Zamislite da trebate provesti analizu eksperimenta koristeći prosječnu vrijednost narudžbe kao primarni pokazatelj. Recimo da naša metrika obično ima normalnu distribuciju. Također, znamo da se metrička distribucija u test grupi razlikuje od one u kontrolnoj. Drugim riječima, srednja vrijednost distribucije u kontroli je 10, au testu 12. Standardna devijacija u obje grupe je 3.


Međutim, oba uzorka imaju granične vrijednosti koje iskrivljuju srednje vrijednosti uzorka i standardnu devijaciju uzorka.

 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))

Napomena da bi s obzirom na metriku mogla imati odstupanja s obje strane. Ako bi vaša metrika mogla imati odstupanja samo s jedne strane, metode bi se lako mogle transformirati u tu svrhu.

Cut Off Tails

Najlakši metod je da odsečete sva opažanja pre 5% percentila i posle 95% percentila . U ovom slučaju smo izgubili 10% informacija kao prevaru. Međutim, distribucije izgledaju više oblikovane, a momenti uzorka su bliži momentima distribucije.

 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]


Drugi način je da se isključi zapažanja izvan određenog raspona . Niski opseg je jednak 25% percentila minus polovina interkvartilnog raspona, a visoki opseg jednak je 75% percentila plus jedna polovina. Ovdje ćemo izgubiti samo 0,7% informacija. Distribucije izgledaju oblikovanije od početne. Momenti uzorka su još jednakiji momentima distribucije.

 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]

Bootstrap

Druga metoda koju smo ovdje razmatrali je bootstrap. U ovom pristupu, srednja vrijednost je konstruirana kao srednja vrijednost poduzoraka. U našem primjeru srednja vrijednost u kontrolnoj grupi je 10,35, a u testnoj grupi 11,78. To je ipak bolji rezultat u odnosu na dodatnu obradu podataka.

 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())

Zaključak

Otkrivanje i obrada izvanrednih vrijednosti su značajni za donošenje ispravne odluke. Sada bi vam barem tri brza i jednostavna pristupa mogla pomoći da provjerite podatke prije analize.


Međutim, bitno je zapamtiti da otkriveni odstupnici mogu biti neobične vrijednosti i karakteristika efekta novosti. Ali to je druga prica :)