در این مقاله روش تشخیص تقلب یا بهتر بگم تشخیص رفتار نامتعارف با تحلیل داده رو با کمک پایتون (Python) توضیح میدم.
برای این منظور از مثال تقلب فروشندگان در یک وبگاه بازار آنلاین (Market place) استفاده میکنم.
فرض کنیم در این وبگاه، یک عده فروشنده هستند و مشتری بعد از اینکه محصولات یا خدماتشون رو دید، باهاشون تماس میگیره م وطمئن میشه که خدمات موجوده یا … و بعد اقدام به اضافه کردن محصول یا خدمت به سبد خریدش میکنه و بعد اقدام به پرداخت.
حالا این وسط یه عده هستند که بعد از تماس مشتری ازش میخوان که آنلاین پرداخت نکنه و بریزه به حساب خودشون یا بره تو سایت خودشون و یه تخفیف بهش میدن. اینجوری به سایت ما، کمیسیون پرداخت نمیکنن. در اصل ما رو دور میزنن.
داده هایی که داریم، کد فروشندگان، تعداد بازدید از صفحشون، تعداد کلیک روی دکمه «نمایش تلفن»، تعداد «اضافه به سبد خرید»، و «تعداد سفارشه».
برای سادگی فرض می کنیم همه فروشندگان یک صفحه دارن و همه در یک دسته قرار دارن.
ما از ۲ روش استفاده میکنیم. یکی روش آماری و یکی رگرسیون خطی.
اول کتابخانهها رو اضافه میکنیم.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import metrics
%matplotlib inline
دادهها رو از فایل اکسل وارد میکنیم. دو سطر اول فایل اکسل خالیه. بعد ۵ تا سطر اولیه رو میبینیم.
df = pd.read_excel('FileName.xlsx',skiprows=2)
df.sort_values('VendorID').head()
اون سطرهایی که داده ندارن رو حذف میکنیم. و همچنین سطوری که AddToCatd کمتر مساوی صفر دارن رو.
دقت بفرمایید قبل از حذف مواردی که به نظرمون بی معنی هستند، مثل «اضافه به سبد خرید» کمتر از ۰ یا «OrderPerPhone» بیشتر از ۱، از تعدادشون و درصدشون نسبت به کل دادهها مطلع بشید. اگر درصد قابل توجهی بودن، یعنی نمیشه از این شاخص برای تعیین رفتار استفاده کرد.
df.dropna(subset= ['AddToCart'] , inplace = True)
df = df[df['AddToCart'] > 0 ]
df.shape
خوب دادهها آمادهاند. وقت بررسی دادههاست.
df.describe()
فرمول کلی اینه:
df= df[df['OrderPerPhone'] < 1]
IQR = df['CartPerPhone'].quantile(0.75) - df['CartPerPhone'].quantile(0.25)
low = df['CartPerPhone'].quantile(0.25) - 1.5*IQR
high = df['CartPerPhone'].quantile(0.75) + 1.5*IQR
plt.figure(figsize = (12, 8))
sns.kdeplot(df[(df['Sum of View'] > df['Sum of View'].quantile(0.25)) & (df['CartPerPhone'] <1)]['CartPerPhone']);
plt.axvline(low, color = 'red')
plt.axvline(high, color = 'red')
plt.axvline(df['CartPerPhone'].quantile(0.20), color = 'g')
plt.axvline(df['CartPerPhone'].quantile(0.05), color = 'b');
print(df['CartPerPhone'].quantile(0.20))
print(df['CartPerPhone'].quantile(0.05))
print(high)
print(low)

مقدار IQR
In descriptive statistics, the interquartile range (IQR), also called the midspread, middle 50%, or H‑spread, is a measure of statistical dispersion, being equal to the difference between 75th and 25th percentiles, or between upper and lower quartiles, IQR = Q3 − Q1.

کمترین مقدار مورد پذیرش میشه 1.5 برابر IQR کمتر از 25 درصد اولیه دادهها . مقداری که ریختیم توی Low
و بیشترین مقدار مورد پذیرش میشه 1.5 برابر IQR بیشتر از 25 درصد اولیه دادهها . مقداری که ریختیم توی High
قبلیای کمترین، میشن مد نظر ما. فراد کارای غیر محترم!!
نکته: گفتم که بازدیدای طرف از ۲۵٪ بازدیدا بیشتر باشه. اگرنه بازدیدش زیاد نیست و محاسبه مشکل پیدا میکنه.
مقادیر زیر خط آبی و سبز مشکوک به تقلبن.