Analītiķi darba laikā bieži sastopas ar novirzēm datos, piemēram, veicot AB testa analīzi, veidojot paredzamos modeļus vai izsekojot tendences. Lēmumi parasti ir balstīti uz izlases vidējo vērtību, kas ir ļoti jutīga pret novirzēm un var būtiski mainīt vērtību. Tāpēc ir ļoti svarīgi pārvaldīt novirzes, lai pieņemtu pareizo lēmumu.
Apsvērsim vairākas vienkāršas un ātras pieejas darbam ar neparastām vērtībām.
Iedomājieties, ka jums ir jāveic eksperimenta analīze, izmantojot vidējo pasūtījuma vērtību kā primāro metriku. Pieņemsim, ka mūsu metrikai parasti ir normāls sadalījums. Mēs arī zinām, ka metrikas sadalījums testa grupā atšķiras no kontroles grupas. Citiem vārdiem sakot, sadalījuma vidējais kontroles grupā ir 10, bet testā ir 12. Standarta novirze abās grupās ir 3.
Tomēr abos paraugos ir novirzes, kas sagroza izlases vidējos rādītājus un izlases standartnovirzi.
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))
Ņemiet vērā , ka, ņemot vērā metriku, var būt novirzes no abām pusēm. Ja jūsu metrikai var būt novirzes tikai no vienas puses, metodes var viegli pārveidot šim nolūkam.
Vienkāršākā metode ir pārtraukt visus novērojumus pirms 5% procentiles un pēc 95% procentiles . Šajā gadījumā mēs zaudējām 10% informācijas kā viltu. Tomēr sadalījumi izskatās vairāk veidoti, un izlases momenti ir tuvāk sadalījuma momentiem.
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]
Vēl viens veids ir izslēgt novērojumus ārpus noteiktā diapazona . Apakšējā josla ir vienāda ar 25% procentili mīnus puse no starpkvartiles diapazona, un augstākā josla ir vienāda ar 75% procentili plus viena puse. Šeit mēs zaudēsim tikai 0,7% informācijas. Izplatījumi izskatās vairāk veidoti nekā sākotnējie. Izlases momenti ir vēl vienādi ar sadales momentiem.
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]
Otrā metode, ko mēs šeit aplūkojām, ir sāknēšana. Šajā pieejā vidējais lielums tiek veidots kā apakšizlases vidējais lielums. Mūsu piemērā vidējais rādītājs kontroles grupā ir 10,35, un testa grupā ir 11,78. Tas joprojām ir labāks rezultāts salīdzinājumā ar papildu datu apstrādi.
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())
Noviržu noteikšana un apstrāde ir svarīga pareiza lēmuma pieņemšanai. Tagad vismaz trīs ātras un vienkāršas pieejas varētu palīdzēt pārbaudīt datus pirms analīzes.
Tomēr ir svarīgi atcerēties, ka konstatētās novirzes var būt neparastas vērtības un novitātes efekta iezīme. Bet tas ir cits stāsts :)