paint-brush
Ārkārtu noteikšana: kas jums jāzinaautors@nataliaogneva
54,602 lasījumi
54,602 lasījumi

Ārkārtu noteikšana: kas jums jāzina

autors Natalia Ogneva4m2024/04/23
Read on Terminal Reader
Read this story w/o Javascript

Pārāk ilgi; Lasīt

Analītiķi darba laikā bieži sastopas ar datu novirzēm. Lēmumi parasti tiek pieņemti, pamatojoties uz izlases vidējo rādītāju, kas ir ļoti jutīgs pret novirzēm. Lai pieņemtu pareizo lēmumu, ir ļoti svarīgi pārvaldīt novirzes. Apsvērsim vairākas vienkāršas un ātras pieejas darbam ar neparastām vērtībām.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Ārkārtu noteikšana: kas jums jāzina
Natalia Ogneva HackerNoon profile picture

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.

Problēmas formulējums

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.

Nogrieztas astes

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]

Bootstrap

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())

Secinājums

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 :)