چه طور می تونیم نقاط پرت یا همون outlier ها را از داخل داده های خودمون حذف کنیم؟
28 مهر 1400
ارسال شده توسط گیلادمیا
1.5k بازدید
نقاط پرت یا خارج از محدوده به نقاطی گفته میشه که فاصله زیادی با نقاط دیگر از داده های ما داره که می تونه دلایل زیادی داشته باشه، ممکنه از نظر مشاهدات تجری با داده های دگیر متفاوت باشه و یا اینکه در محدوده نرمال نباشه بزارید با یک مثال برای شما توضیح بدم، فکر کنید مجموعه داده های فروش یک مجموعه فروشگاهی را در اختیار دارید از جمله قیمت محصولات، حالا می خواید در مرحله تحلیل داده ها میانگین قیمت خرید مشتریان را حساب کنید، فکر کنید در میان چند هزار سفارشی که دریافت شده بازه خرید مشتریان بین پنج میلیون تا ده میلیون بوده یعنی اغلب سفارشی که کسب و کار از مشتریان دریافت کرده بین این مقدار بوده ، حالا یه تعداد کمی هم سفارش از مشتریان داشتیم که مبلغ سفارششون خیلی کم مثلا چند صدهزار تومن و یا خیلی زیاد مثلا چند ده یا چند صد میلیون تومن بوده در واقع این نقاط از قیمت های ما فاصله زیادی با حالت نرمال خرید داره و ما اگر می خوایم میانگین قیمت خرید مشریان در هر سفارش و یا به اصطلاح average order value (aov)را حساب کنیم لازمه که این نقاط پرت را حذف کنیم چون اگر این کار را نکنیم میانگین به سمت بالا و پایین میره و باعث میشه نتایج تحلیل ما حالت طبیعی نداشته باشه به همین دلیل شما برای وردی بعضی از الگوریتم های پیش بینی هم لازم دارید که این نقاط پرت را از داده های خودتون تشخیص بدید و حذف کنید. اما چه طور باید این کار را کرد ؟
در ابتدا لازم هست که شما داده های خودتون را به شکل یک مدل رابطه ای مثل دیتا فریم با استفاده از کتابخانه pandas در پایتون در بیارید. در این مثال اسم دیتا فریم شما df هست و یا هر اسم دیگه که شامل ستون های مربوط به داده های شما هست و یک ستون به اسم price داره ستونی که قیمت خرید محصولات به ازای هر سفارش توسط مشتری ها در اونجا قرار داده شده.
out=df[df[‘Price’].notna()]
ابتدا با دستور بالا سطرها یا رکوردهایی را داخل دیتافریم خودتون انتخاب می کنید که مقدار قیمت اونها مقدار null نداشته باشه. df اسم دیتافریم اصلی ما هست بعد خروجی را داخل یک اسم دیگه به اسم out قرار میدیم که حاوی همون داده های قبلی هست با این تفاوت که سطرهایی که ستون قیمت مقدار ناشناخته داره حذف شده.
out[‘Price’] = out[‘Price’].astype(int)
در مرحله بعد با استفاده از دستور بالا نوع ستون مورد نظر اگر از نوع عدد صحیح نیست اون را تبدیل به عدد صحیح میکنیم به عنوان مثال ممکن هست قبلا از نوع رشته بوده البته اگر از نوع اعشاری هم باشه مشکلی پیش نمیاد.
: def Remove_Outlier_Indices(out)
Q1 = out[‘Price’].quantile(0.25)
Q3 = out[‘Price’].quantile(0.75)
IQR = Q3 – Q1
trueList = ~((out[‘Price’] < (Q1 – 1.5 * IQR)) |(out[‘Price’] > (Q3 + 1.5 * IQR)))
return trueList
در مرحله بعد تابع خودمون را تعریف کریم و یک وردودی برای اون درنظر گرفتیم این وردی می تونه هر اسمی باشه ما دراینجا اسم out را که اسم دیتافریم خودمون هست براش درنظر گرفتیم. درتابع مورد نظر تنها لازم هست که به جای out اسم دیتا فریم و به جای price اسم ستون مورد نظر را قرار بدید ستونی که انتظار دارید نقاط پرت را از اون حذف کنید بقیه قسمت های کد بالا ثابت هست و نیازی نیست درگیر جزئیات کد بشید تنها لازم هست بدونید چه طور ازش استفاده کنید.
nonOutlierList = Remove_Outlier_Indices(out)
در مرحله بعد لازم هست که تابع خودمون را فراخوانی کنیم و اسم دیتافریم خودمون را به عنوان پارامتر تابع برایش ارسال کنیم، بعد از این چیزی که تابع برمی گردونه یا همون truelist در داخل متغیر nonoutlierList قرار میگیره.
dfSubset = out[nonOutlierList]
در مرحله بعد هم اسم دیتا فریم را می نویسم و داخل براکت nonoutlierList را قرارمیدیم. با این کار دیتافریم ما به شکل اصلی خودش باز میگرده و اون را داخل یک متغیر دیگه با اسم dfSubset و یا هر اسمی دیگه ای قرار میدیم.
اگر می خواین متوجه بشید که چند تا سطر و یا رکورد ازداده های اصلی شما به عنوان نقاط پرت تشخیص داده شدند کافیه که کد های زیر را اعمال کنید.
removerows = out.shape[0] – dfSubset.shape[0]
removerows
تعداد رکوردهایی که حذف شدند در داخل removerows قرار می گیرند.
اگر مایل هستید مقادیری که حذف شدند را هم داشته باشد می تونید اونها را داخل یک آرایه numpy قرار بدید تا هم بتونید مقادیر را مشاهده کنید و هم چک کنید. برای این کار ابتدا در دستو زیر اسم دیتا فریم وستون مورد نظر را قرار میدید و اون را تبدیل می کنید به یک آرایه numpy و در داخل متغیرx قرار میدید.
x=np.array(df[‘Price’])
در مرحله بعد همین کار را روی دیتافریم حاصل از اعمال حذف نقاط پرت انجام میدیم و اون را دخل متغیرy قرار میدیم.
y=np.array(df[‘Price’])
ودر انتها هر دوتا را به ترتیب به عنوان پارامتر ورودی برای متد setdiff1d قرار میدیم ، این متد مقادیری را برمی گردونه که در پارامتر اول یا آرایه اول هستند و درپارامتر دوم یا آرایه دوم نیستند که میشه همون مقادیری که حذف شدند و اونها را به شکل یک آرایه numpy در اختیار ما قرار میده.
np.setdiff1d(x,y)
مطالب زیر را حتما مطالعه کنید
کلان داده ، اینترنت اشیاء و هوش مصنوعی
اینترنت اشیا در طول سال 2017 یک پیشرفت کلیدی در صنعت فناوری بوده، بسیاری از...
اینترنت اشیا چیه و چه کاربردهایی داره ؟
مقدمه اینترنت اشیا یا اصطلاحا IOT سیستمی از دستگاه های محاسباتی مرتبط، ماشینهای مکانیکی و...
چرا پایتون برای یادگیری ماشین و هوش مصنوعی مناسبه؟
مجله علمی گیلادمیا / رضا اکبری موحد / زبان برنامهنویسی پایتون یک زبان برنامهنویسی شیءگرا،...
جدیدترین کاربردهای هوش مصنوعی در پزشکی و مهندسی پزشکی
مجله علمی گیلادمیا / رضا اکبری موحد / هوش مصنوعی (AI) به شبیهسازی هوش انسان...
پنج مزیت تحلیل داده برای کسبوکارتون
مجله علمی گیلادمیا / هادی احمدی / تنوع غنی از دادههایی که شرکتها تولید میکنن،...
چطوری میشه به یک دانشمند داده تبدیل شد؟
مجله علمی گیلادمیا / هادی احمدی / آیا شما جزء تعداد زیاد افرادی هستین که...