paint-brush
Outlier-detektion: Hvad du behøver at videved@nataliaogneva
54,602 aflæsninger
54,602 aflæsninger

Outlier-detektion: Hvad du behøver at vide

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

For langt; At læse

Analytikere støder ofte på outliers i data under deres arbejde. Beslutninger er normalt baseret på stikprøvegennemsnittet, som er meget følsomt over for afvigende værdier. 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.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Outlier-detektion: Hvad du behøver at vide
Natalia Ogneva HackerNoon profile picture

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.

Problemformulering

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.

Afskårne haler

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]

Bootstrap

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

Konklusion

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