Ontleders kry dikwels uitskieters in data tydens hul werk, soos tydens AB-toets-analise, die skep van voorspellende modelle of die dop van neigings. Besluite word gewoonlik gebaseer op die steekproefgemiddelde, wat baie sensitief is vir uitskieters en die waarde dramaties kan verander. Dit is dus noodsaaklik om uitskieters te bestuur om die regte besluit te neem.
Kom ons kyk na verskeie eenvoudige en vinnige benaderings om met ongewone waardes te werk.
Stel jou voor dat jy 'n eksperimentanalise moet uitvoer deur 'n gemiddelde ordewaarde as 'n primêre maatstaf te gebruik. Kom ons sê dat ons metrieke gewoonlik 'n normale verspreiding het. Ons weet ook dat die metrieke verspreiding in die toetsgroep verskil van dié in die kontrole. Met ander woorde, die gemiddelde van die verspreiding in beheer is 10, en in die toets is 12. Die standaardafwyking in beide groepe is 3.
Beide steekproewe het egter uitskieters wat die steekproefgemiddeldes en die steekproefstandaardafwyking skeeftrek.
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 die oorweging van metrieke uitskieters van beide kante kan hê. As jou maatstaf slegs van een kant af uitskieters kan hê, kan metodes maklik vir daardie doel getransformeer word.
Die maklikste metode is om alle waarnemings voor die 5% persentiel en na die 95% persentiel af te sny. In hierdie geval het ons 10% van die inligting verloor as 'n nadeel. Die verdelings lyk egter meer gevorm, en die steekproefmomente is nader aan die verspreidingsmomente.
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]
'n Ander manier is om waarnemings buite die spesifieke reeks uit te sluit. Die lae band is gelyk aan die 25% persentiel minus die helfte van die interkwartielreeks, en die hoë band is gelyk aan die 75% persentiel plus die helfte. Hier sal ons slegs 0,7% van inligting verloor. Die verdelings lyk meer gevorm as die aanvanklike. Die steekproefmomente is selfs meer gelyk aan die verspreidingsmomente.
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]
Die tweede metode wat ons hier oorweeg het, is 'n bootstrap. In hierdie benadering word die gemiddelde gekonstrueer soos 'n gemiddelde van submonsters. In ons voorbeeld is die gemiddelde in die kontrolegroep gelyk aan 10,35, en die toetsgroep is 11,78. Dit is steeds 'n beter resultaat in vergelyking met bykomende dataverwerking.
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())
Uitskieteropsporing en -verwerking is belangrik om die regte besluit te neem. Nou kan ten minste drie vinnige en eenvoudige benaderings jou help om die data voor ontleding na te gaan.
Dit is egter noodsaaklik om te onthou dat bespeurde uitskieters ongewone waardes en 'n kenmerk vir die nuwigheidseffek kan wees. Maar dit is 'n ander storie :)