![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
تحلیلگران اغلب در طول کار خود، مانند هنگام تجزیه و تحلیل AB-test، ایجاد مدل های پیش بینی، یا ردیابی روندها، با داده های پرت مواجه می شوند. تصمیمگیریها معمولاً بر اساس میانگین نمونه است که به مقادیر پرت بسیار حساس است و میتواند مقدار را بهطور چشمگیری تغییر دهد. بنابراین، مدیریت عوامل پرت برای تصمیم گیری صحیح بسیار مهم است.
بیایید چندین روش ساده و سریع را برای کار با مقادیر غیر معمول در نظر بگیریم.
تصور کنید که باید یک تجزیه و تحلیل آزمایشی را با استفاده از یک مقدار سفارش متوسط به عنوان معیار اصلی انجام دهید. فرض کنید متریک ما معمولاً دارای توزیع نرمال است. همچنین، می دانیم که توزیع متریک در گروه آزمایش با گروه کنترل متفاوت است. به عبارت دیگر میانگین توزیع در کنترل 10 و در آزمون 12 است. انحراف معیار در هر دو گروه 3 است.
با این حال، هر دو نمونه دارای نقاط پرت هستند که میانگین نمونه و انحراف استاندارد نمونه را تغییر می دهد.
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))
توجه داشته باشید که در نظر گرفتن متریک میتواند دارای مقادیر پرت از هر دو طرف باشد. اگر متریک شما فقط از یک طرف میتوانست مقادیر پرت داشته باشد، روشها به راحتی میتوانند برای این منظور تغییر کنند.
ساده ترین روش این است که تمام مشاهدات را قبل از صدک 5% و بعد از صدک 95% قطع کنید. در این مورد، ما 10٪ از اطلاعات را به عنوان یک اشتباه از دست دادیم. با این حال، توزیعها شکلگرفتهتر به نظر میرسند و ممانهای نمونه به ممانهای توزیع نزدیکتر هستند.
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]
راه دیگر حذف مشاهدات خارج از محدوده خاص است. باند پایین برابر با 25 درصد صدک منهای یک دوم محدوده بین چارکی است و باند بالا برابر با صدک 75 درصد به اضافه یک دوم است. در اینجا، ما تنها 0.7٪ از اطلاعات را از دست خواهیم داد. توزیع ها بیشتر از توزیع اولیه شکل گرفته اند. گشتاورهای نمونه حتی با گشتاورهای توزیع برابرتر هستند.
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]
روش دومی که در اینجا در نظر گرفتیم بوت استرپ است. در این رویکرد، میانگین مانند یک میانگین از نمونههای فرعی ساخته میشود. در مثال ما، میانگین در گروه کنترل برابر با 10.35 و گروه آزمون 11.78 است. در مقایسه با پردازش داده های اضافی، هنوز نتیجه بهتری است.
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())
تشخیص و پردازش پرت برای تصمیم گیری صحیح مهم است. در حال حاضر، حداقل سه رویکرد سریع و ساده می تواند به شما کمک کند داده ها را قبل از تجزیه و تحلیل بررسی کنید.
با این حال، مهم است که به یاد داشته باشید که نقاط پرت شناسایی شده می توانند مقادیر غیرعادی و یک ویژگی برای اثر جدید باشند. اما داستان دیگری است :)