Analisten komen vaak outliers tegen in data tijdens hun werk, zoals tijdens AB-testanalyse, het maken van voorspellende modellen of het volgen van trends. Beslissingen worden meestal gebaseerd op het steekproefgemiddelde, dat erg gevoelig is voor outliers en de waarde drastisch kan veranderen. Het is dus cruciaal om outliers te beheren om de juiste beslissing te nemen.
Laten we eens een aantal eenvoudige en snelle benaderingen bekijken voor het werken met ongebruikelijke waarden.
Stel je voor dat je een experimentele analyse moet uitvoeren met een gemiddelde orderwaarde als primaire metriek. Laten we zeggen dat onze metriek doorgaans een normale verdeling heeft. Ook weten we dat de metrische verdeling in de testgroep anders is dan die in de controlegroep. Met andere woorden, het gemiddelde van de verdeling in de controlegroep is 10 en in de test is het 12. De standaarddeviatie in beide groepen is 3.
Beide steekproeven hebben echter uitschieters die de steekproefgemiddelden en de steekproefstandaarddeviatie scheeftrekken.
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 dat het overwegen van metric outliers van beide kanten kan hebben. Als uw metric alleen outliers van één kant kan hebben, kunnen methoden eenvoudig voor dat doel worden getransformeerd.
De makkelijkste methode is om alle observaties voor het 5% percentiel en na het 95% percentiel af te snijden. In dit geval verloren we 10% van de informatie als een con. De distributies zien er echter meer gevormd uit en de sample momenten liggen dichter bij de distributie momenten.
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]
Een andere manier is om observaties buiten het specifieke bereik uit te sluiten. De lage band is gelijk aan het 25% percentiel minus de helft van het interkwartielbereik, en de hoge band is gelijk aan het 75% percentiel plus de helft. Hier verliezen we slechts 0,7% van de informatie. De distributies zien er meer gevormd uit dan de initiële. De steekproefmomenten zijn zelfs meer gelijk aan de distributiemomenten.
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]
De tweede methode die we hier hebben overwogen is een bootstrap. In deze benadering wordt het gemiddelde geconstrueerd als een gemiddelde van subsamples. In ons voorbeeld is het gemiddelde in de controlegroep gelijk aan 10,35 en de testgroep is 11,78. Het is nog steeds een beter resultaat vergeleken met aanvullende gegevensverwerking.
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())
Outlierdetectie en -verwerking zijn belangrijk voor het nemen van de juiste beslissing. Nu kunnen ten minste drie snelle en eenvoudige benaderingen u helpen de gegevens te controleren vóór analyse.
Het is echter essentieel om te onthouden dat gedetecteerde outliers ongebruikelijke waarden kunnen zijn en een kenmerk voor het nieuwigheidseffect. Maar dat is een ander verhaal :)