![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Analyytikot kohtaavat usein poikkeavia tiedoissa työnsä aikana, kuten AB-testianalyysin, ennakoivien mallien luomisen tai trendien seurannan aikana. Päätökset perustuvat yleensä otoskeskiarvoon, joka on erittäin herkkä poikkeaville arvoille ja voi muuttaa arvoa dramaattisesti. Joten on ratkaisevan tärkeää hallita poikkeavia arvoja oikean päätöksen tekemiseksi.
Tarkastellaan useita yksinkertaisia ja nopeita tapoja työskennellä epätavallisten arvojen kanssa.
Kuvittele, että sinun on suoritettava kokeiluanalyysi käyttämällä keskimääräistä tilausarvoa ensisijaisena mittarina. Oletetaan, että mittarillamme on yleensä normaalijakauma. Tiedämme myös, että testiryhmän metrijakauma on erilainen kuin vertailussa. Toisin sanoen jakauman keskiarvo kontrollissa on 10 ja testissä 12. Keskihajonna molemmissa ryhmissä on 3.
Molemmissa näytteissä on kuitenkin poikkeavuuksia, jotka vääristävät näytteen keskiarvoa ja näytteen keskihajontaa.
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))
Huomaa , että metriikassa voi olla poikkeavuuksia molemmilta puolilta. Jos mittarillasi voi olla poikkeavuuksia vain yhdeltä puolelta, menetelmät voidaan helposti muuntaa tähän tarkoitukseen.
Helpoin tapa on katkaista kaikki havainnot ennen 5 %:n prosenttipistettä ja 95 %:n prosenttipisteen jälkeen . Tässä tapauksessa menetimme 10 % tiedosta huijauksena. Jakaumat näyttävät kuitenkin muodostuneemmilta ja näytemomentit ovat lähempänä jakauman momentteja.
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]
Toinen tapa on sulkea pois havainnot tietyn alueen ulkopuolella . Alakaista on yhtä kuin 25 % prosenttipiste miinus puolet kvartiilien välisestä alueesta, ja yläkaista on 75 % prosenttipiste plus puolet. Tässä menetämme vain 0,7 % tiedosta. Jakaumat näyttävät muodostuneemmilta kuin alkuperäinen. Näytemomentit ovat vielä yhtä suuret kuin jakautumismomentit.
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]
Toinen tässä tarkastelemamme menetelmä on bootstrap. Tässä lähestymistavassa keskiarvo muodostetaan osanäytteiden keskiarvona. Esimerkissämme vertailuryhmän keskiarvo on 10,35 ja testiryhmän 11,78. Se on silti parempi tulos verrattuna lisätietojen käsittelyyn.
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())
Poikkeamien havaitseminen ja käsittely ovat tärkeitä oikean päätöksen tekemisen kannalta. Nyt ainakin kolme nopeaa ja suoraviivaista lähestymistapaa voivat auttaa sinua tarkistamaan tiedot ennen analysointia.
On kuitenkin tärkeää muistaa, että havaitut poikkeamat voivat olla epätavallisia arvoja ja uutuusvaikutuksen ominaisuus. Mutta se on toinen tarina :)