Statistics lover
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.
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.
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]
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())
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 :)