![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Analytiker stöter ofta på extremvärden i data under sitt arbete, till exempel under AB-testanalys, skapande av prediktiva modeller eller spårning av trender. Beslut baseras vanligtvis på urvalsmedelvärdet, som är mycket känsligt för extremvärden och kan dramatiskt förändra värdet. Så det är avgörande att hantera extremvärden för att fatta rätt beslut.
Låt oss överväga flera enkla och snabba metoder för att arbeta med ovanliga värden.
Föreställ dig att du behöver göra en experimentanalys med ett genomsnittligt ordervärde som primärt mått. Låt oss säga att vårt mått vanligtvis har en normalfördelning. Vi vet också att den metriska fördelningen i testgruppen skiljer sig från den i kontrollen. Med andra ord är medelvärdet av fördelningen i kontroll 10 och i testet 12. Standardavvikelsen i båda grupperna är 3.
Båda proverna har dock extremvärden som snedvrider provmedelvärdena och provets standardavvikelse.
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))
OBS att övervägande av metrisk kan ha extremvärden från båda sidor. Om ditt mått bara kunde ha extremvärden från en sida, skulle metoder lätt kunna omvandlas för det ändamålet.
Den enklaste metoden är att skära bort alla observationer före 5 % percentilen och efter 95 % percentilen . I det här fallet förlorade vi 10 % av informationen som en con. Emellertid ser fördelningarna mer bildade ut, och sampelmomenten är närmare fördelningsmomenten.
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]
Ett annat sätt är att utesluta observationer utanför det specifika intervallet . Det låga bandet är lika med 25 %-percentilen minus hälften av interkvartilintervallet, och det höga bandet är lika med 75 %-percentilen plus hälften. Här kommer vi bara att förlora 0,7 % av informationen. Fördelningarna ser mer bildade ut än initialerna. Sampelmomenten är ännu mer lika med fördelningsmomenten.
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]
Den andra metoden vi övervägde här är en bootstrap. I detta tillvägagångssätt är medelvärdet konstruerat som ett medelvärde av delprover. I vårt exempel är medelvärdet i kontrollgruppen 10,35, och testgruppen är 11,78. Det är fortfarande ett bättre resultat jämfört med ytterligare databehandling.
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())
Avvikande upptäckt och bearbetning är viktiga för att fatta rätt beslut. Nu kan åtminstone tre snabba och enkla metoder hjälpa dig att kontrollera data före analys.
Det är dock viktigt att komma ihåg att upptäckta extremvärden kan vara ovanliga värden och en funktion för nyhetseffekten. Men det är en annan historia :)