![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())
זיהוי ועיבוד חריגים הם משמעותיים לקבלת ההחלטה הנכונה. כעת, לפחות שלוש גישות מהירות ופשוטות יכולות לעזור לך לבדוק את הנתונים לפני הניתוח.
עם זאת, חשוב לזכור שחריגים שזוהו יכולים להיות ערכים יוצאי דופן ותכונה לאפקט החידוש. אבל זה כבר סיפור אחר :)