غالبًا ما يواجه المحللون القيم المتطرفة في البيانات أثناء عملهم، مثل أثناء تحليل اختبار AB، أو إنشاء نماذج تنبؤية، أو تتبع الاتجاهات. وعادةً ما تستند القرارات إلى متوسط العينة، الذي يكون حساسًا للغاية للقيم المتطرفة ويمكن أن يغير القيمة بشكل كبير. لذا، من الأهمية بمكان إدارة القيم المتطرفة لاتخاذ القرار الصحيح.
دعونا نفكر في عدة طرق بسيطة وسريعة للعمل مع القيم غير المعتادة.
تخيل أنك بحاجة إلى إجراء تحليل تجريبي باستخدام قيمة ترتيب متوسط كمقياس أساسي. لنفترض أن المقياس لدينا عادةً ما يكون له توزيع طبيعي. كما نعلم أن توزيع المقياس في مجموعة الاختبار يختلف عن توزيعه في المجموعة الضابطة. بعبارة أخرى، متوسط التوزيع في المجموعة الضابطة هو 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())
يعد اكتشاف القيم المتطرفة ومعالجتها أمرًا مهمًا لاتخاذ القرار الصحيح. الآن، هناك ثلاثة أساليب سريعة ومباشرة على الأقل يمكنها مساعدتك في التحقق من البيانات قبل التحليل.
ومع ذلك، من الضروري أن نتذكر أن القيم المتطرفة التي تم اكتشافها قد تكون قيمًا غير عادية وميزة لتأثير الحداثة. ولكن هذه قصة أخرى :)