![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Analytici sa počas svojej práce často stretávajú s odľahlými hodnotami v údajoch, napríklad počas analýzy AB-testu, vytvárania prediktívnych modelov alebo sledovania trendov. Rozhodnutia sú zvyčajne založené na priemernej hodnote vzorky, ktorá je veľmi citlivá na odľahlé hodnoty a môže dramaticky zmeniť hodnotu. Preto je dôležité riadiť odľahlé hodnoty, aby ste urobili správne rozhodnutie.
Zoberme si niekoľko jednoduchých a rýchlych prístupov pre prácu s neobvyklými hodnotami.
Predstavte si, že potrebujete vykonať analýzu experimentu s použitím priemernej hodnoty objednávky ako primárnej metriky. Povedzme, že naša metrika má zvyčajne normálne rozdelenie. Tiež vieme, že metrické rozdelenie v testovacej skupine je iné ako v kontrolnej skupine. Inými slovami, priemer distribúcie v kontrole je 10 a v teste je 12. Štandardná odchýlka v oboch skupinách je 3.
Obe vzorky však majú odľahlé hodnoty, ktoré skresľujú priemer vzorky a štandardnú odchýlku vzorky.
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))
Upozorňujeme , že zvažovanie metrických údajov môže mať odľahlé hodnoty na oboch stranách. Ak by vaša metrika mohla mať odľahlé hodnoty iba z jednej strany, metódy by sa na tento účel dali ľahko transformovať.
Najjednoduchším spôsobom je odrezať všetky pozorovania pred percentilom 5 % a po percentilom 95 % . V tomto prípade sme ako podvod stratili 10 % informácií. Distribúcie však vyzerajú formovanejšie a momenty vzorky sú bližšie k momentom distribúcie.
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]
Ďalším spôsobom je vylúčiť pozorovania mimo špecifického rozsahu . Nízke pásmo sa rovná percentilu 25 % mínus jedna polovica medzikvartilového rozsahu a vysoké pásmo sa rovná percentilu 75 % plus jedna polovica. Tu stratíme len 0,7 % informácií. Distribúcie vyzerajú viac formovane ako pôvodné. Ukážkové momenty sa ešte viac rovnajú distribučným momentom.
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]
Druhá metóda, ktorú sme tu zvažovali, je bootstrap. V tomto prístupe je priemer konštruovaný ako priemer čiastkových vzoriek. V našom príklade sa priemer v kontrolnej skupine rovná 10,35 a v testovacej skupine je 11,78. V porovnaní s dodatočným spracovaním údajov je to stále lepší výsledok.
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())
Detekcia a spracovanie odľahlých hodnôt sú dôležité pre správne rozhodnutie. Teraz vám môžu pomôcť skontrolovať údaje pred analýzou aspoň tri rýchle a priame prístupy.
Je však nevyhnutné pamätať na to, že zistené odľahlé hodnoty môžu byť nezvyčajné hodnoty a môžu byť znakom novosti. Ale to je už iný príbeh :)