![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Analiștii întâlnesc adesea valori aberante în date în timpul lucrului lor, cum ar fi în timpul analizei testului AB, creând modele predictive sau urmărind tendințele. Deciziile se bazează de obicei pe media eșantionului, care este foarte sensibilă la valori aberante și poate schimba dramatic valoarea. Prin urmare, este esențial să gestionați valorile aberante pentru a lua decizia corectă.
Să luăm în considerare câteva abordări simple și rapide pentru a lucra cu valori neobișnuite.
Imaginați-vă că trebuie să efectuați o analiză de experiment folosind o valoare medie a comenzii ca măsură principală. Să presupunem că metrica noastră are de obicei o distribuție normală. De asemenea, știm că distribuția metrică în grupul de testare este diferită de cea din control. Cu alte cuvinte, media distribuției în control este 10, iar în test este 12. Abaterea standard în ambele grupuri este 3.
Cu toate acestea, ambele eșantioane au valori aberante care obligă mediile eșantionului și abaterea standard a eșantionului.
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 că luarea în considerare a metricii ar putea avea valori aberante din ambele părți. Dacă valoarea dvs. ar putea avea valori aberante doar dintr-o parte, metodele ar putea fi ușor transformate în acest scop.
Cea mai ușoară metodă este să tăiați toate observațiile înainte de percentila de 5% și după percentila de 95% . În acest caz, am pierdut 10% din informații ca un escrocher. Cu toate acestea, distribuțiile par mai formate, iar momentele eșantionului sunt mai apropiate de momentele de distribuție.
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]
O altă modalitate este de a exclude observațiile din afara intervalului specific . Banda inferioară este egală cu percentila de 25% minus jumătate din intervalul intercuartil, iar banda superioară este egală cu percentila de 75% plus jumătate. Aici vom pierde doar 0,7% din informații. Distribuțiile par mai formate decât inițiale. Momentele eșantionului sunt și mai egale cu momentele de distribuție.
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]
A doua metodă pe care am luat-o în considerare aici este un bootstrap. În această abordare, media este construită ca o medie a subeșantioanelor. În exemplul nostru, media din grupul de control este egală cu 10,35, iar grupul de testare este 11,78. Este încă un rezultat mai bun în comparație cu prelucrarea suplimentară a datelor.
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())
Detectarea și procesarea valorii aberante sunt importante pentru luarea deciziei corecte. Acum, cel puțin trei abordări rapide și directe vă pot ajuta să verificați datele înainte de analiză.
Cu toate acestea, este esențial să ne amintim că valorile aberante detectate ar putea fi valori neobișnuite și o caracteristică pentru efectul de noutate. Dar e alta poveste :)