تشخیص تقلب با تحلیل رفتار

Categories

در این مقاله روش تشخیص تقلب یا بهتر بگم تشخیص رفتار نامتعارف با تحلیل داده رو با کمک پایتون (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.

3 Ways to Find the IQR - wikiHow

کمترین مقدار مورد پذیرش می‌شه 1.5 برابر IQR کمتر از 25 درصد اولیه داده‌ها . مقداری که ریختیم توی Low
و بیشترین مقدار مورد پذیرش می‌شه 1.5 برابر IQR بیشتر از 25 درصد اولیه داده‌ها . مقداری که ریختیم توی High

قبلیای کمترین، می‌شن مد نظر ما. فراد کارای غیر محترم!!

نکته:‌ گفتم که بازدیدای طرف از ۲۵٪ بازدیدا بیشتر باشه. اگرنه بازدیدش زیاد نیست و محاسبه مشکل پیدا می‌کنه.

مقادیر زیر خط آبی و سبز مشکوک به تقلبن.

Leave a comment

Your email address will not be published. Required fields are marked *


The reCAPTCHA verification period has expired. Please reload the page.