Analytikere støder ofte på outliers i data under deres arbejde, såsom under AB-testanalyse, oprettelse af prædiktive modeller eller sporing af tendenser. Beslutninger er normalt baseret på stikprøvegennemsnittet, som er meget følsomt over for afvigende værdier og kan ændre værdien dramatisk. Så det er afgørende at håndtere outliers for at træffe den rigtige beslutning.
Lad os overveje flere enkle og hurtige tilgange til at arbejde med usædvanlige værdier.
Forestil dig, at du skal udføre en eksperimentanalyse ved at bruge en gennemsnitlig ordreværdi som en primær metrik. Lad os sige, at vores metrik normalt har en normalfordeling. Vi ved også, at den metriske fordeling i testgruppen er forskellig fra den i kontrollen. Med andre ord er middelværdien af fordelingen i kontrol 10, og i testen er 12. Standardafvigelsen i begge grupper er 3.
Imidlertid har begge prøver afvigende værdier, der skæver prøvegennemsnittet og prøvens standardafvigelse.
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))
NB , at overvejelse af metrisk kan have udligninger fra begge sider. Hvis din metrik kun kunne have afvigere fra den ene side, kunne metoder nemt transformeres til det formål.
Den nemmeste metode er at afskære alle observationer før 5 % percentilen og efter 95 % percentilen . I dette tilfælde mistede vi 10% af oplysningerne som en con. Fordelingerne ser dog mere dannede ud, og prøvemomenterne er tættere på fordelingsmomenterne.
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]
En anden måde er at udelukke observationer uden for det specifikke interval . Det lave bånd er lig med 25 % percentilen minus halvdelen af interkvartilområdet, og det høje bånd er lig med 75 % percentilen plus halvdelen. Her vil vi kun miste 0,7 % af informationen. Fordelingerne ser mere dannede ud end initialerne. Prøvemomenterne er endnu mere lig med fordelingsmomenterne.
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 anden metode, vi overvejede her, er en bootstrap. I denne tilgang er middelværdien konstrueret som et middelværdi af delprøver. I vores eksempel er gennemsnittet i kontrolgruppen lig med 10,35, og testgruppen er 11,78. Det er stadig et bedre resultat sammenlignet med yderligere 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())
Outlier-detektering og -behandling er vigtig for at træffe den rigtige beslutning. Nu kan mindst tre hurtige og ligetil tilgange hjælpe dig med at tjekke dataene før analyse.
Det er dog vigtigt at huske, at detekterede outliers kan være usædvanlige værdier og en funktion for nyhedseffekten. Men det er en anden historie :)