قسمت چهارم – معرفی الگوریتم Apriori

Association Rule Mining (ARM) یکی از تکنیک‌های داده‌کاوی است که برای شناسایی روابط یا الگوهای معنادار بین متغیرها در داده‌ها مورد استفاده قرار می‌گیرد. این روش معمولاً در تجزیه و تحلیل داده‌های بزرگ، به‌ویژه در بازار یابی، خرید و فروش، و تحلیل سبد خرید مشتریان استفاده می‌شود.

Association Rule Mining (Apriori)

مقدمه

Association Rule Mining به طور کلی به شناسایی مجموعه‌های فرعی از داده‌ها که به طور معنادار با یکدیگر در ارتباط هستند، پرداخته می‌شود. در زمینه‌ی خرید و فروش، این روش به شناسایی الگوهایی می‌پردازد که نشان‌دهنده‌ی این هستند که مشتریان چه محصولات یا خدماتی را به طور همزمان خریداری می‌کنند. یکی از معروف‌ترین الگوریتم‌های این تکنیک، الگوریتم Apriori است که برای استخراج قوانین انجمنی از داده‌ها طراحی شده است.

الگوریتم Apriori

الگوریتم Apriori، الگوریتمی پرکاربرد در استخراج قوانین انجمنی است که به طور خاص برای داده‌های «بازیابی مجموعه‌های داده‌ای» طراحی شده است. اساس کار این الگوریتم بر این فرض استوار است که اگر یک مجموعه از آیتم‌ها (مثلاً محصولات) در یک تراکنش خاص یافت شود، احتمال اینکه مجموعه‌های فرعی آن مجموعه نیز در همان تراکنش حضور داشته باشند، زیاد است.

اصول اصلی Apriori

  1. حمایت (Support): حمایت یک مجموعه آیتم (Itemset) به معنای درصد تراکنش‌هایی است که شامل آن مجموعه آیتم هستند. این معیار کمک می‌کند تا مجموعه‌هایی که در داده‌ها به طور مکرر ظاهر می‌شوند شناسایی شوند.

  1. اعتماد (Confidence): اعتماد میزان احتمال وقوع یک آیتم (یا مجموعه آیتم‌ها) در حضور مجموعه دیگری است. به عبارت دیگر، اعتماد یک قانون انجمنی BA⇒B برابر است با احتمال اینکه اگر A در یک تراکنش وجود داشته باشد، B نیز وجود داشته باشد.

  1. بهینه‌سازی (Lift): معیار Lift نشان می‌دهد که آیا دو مجموعه آیتم به طور مستقل از یکدیگر در تراکنش‌ها ظاهر می‌شوند یا اینکه ارتباط قوی بین آن‌ها وجود دارد.

مراحل الگوریتم Apriori

الگوریتم Apriori به صورت تدریجی مجموعه‌های فرعی را از داده‌ها استخراج می‌کند. در ابتدا، تمام مجموعه‌های یک‌آیتمی (یعنی آیتم‌های منفرد) با حمایت بالا را شناسایی می‌کند. سپس، مجموعه‌های بزرگ‌تر از آن‌ها که از ترکیب مجموعه‌های قبلی به دست آمده‌اند، استخراج می‌شود و این روند ادامه می‌یابد تا زمانی که مجموعه‌هایی با حمایت کافی پیدا نشود.

  1. مرحله اول: استخراج مجموعه‌های یک‌آیتمی.
  2. مرحله دوم: ترکیب مجموعه‌های یک‌آیتمی برای تولید مجموعه‌های دو‌آیتمی و محاسبه حمایت آن‌ها.
  3. مرحله سوم: تکرار این فرایند برای ایجاد مجموعه‌های بزرگ‌تر تا زمانی که هیچ مجموعه جدیدی با حمایت بالا یافت نشود.
  4. مرحله چهارم: استخراج قوانین انجمنی از مجموعه‌های بزرگ‌تر که اعتماد و بهینه‌سازی کافی را دارند.

مزایا و معایب Apriori

  • مزایا:
    • الگوریتم ساده و مؤثر برای شناسایی مجموعه‌های پر تکرار در داده‌های بزرگ است.
    • برای داده‌هایی با مقیاس بزرگ و پیچیدگی‌های زیاد مناسب است.
  • معایب:
    • نیاز به تعداد زیادی محاسبات و زمان برای پردازش داده‌های بزرگ، به‌ویژه زمانی که تعداد آیتم‌ها زیاد باشد.
    • ممکن است به دلیل محدودیت‌های حافظه، در داده‌های بزرگ بهینه نباشد.

کاربردهای Apriori

  • بازاریابی و فروش: شناسایی محصولات یا خدماتی که معمولاً با یکدیگر خریداری می‌شوند.
  • سیستم‌های توصیه‌گر: برای ارائه پیشنهادات به مشتریان بر اساس تاریخچه خرید آن‌ها.
  • تحلیل سبد خرید: شناسایی الگوهای خرید مشتریان برای بهینه‌سازی نمایش محصولات در فروشگاه‌ها.

الگوریتم Apriori یکی از پرکاربردترین روش‌ها برای استخراج قوانین انجمنی در داده‌های بزرگ است. این الگوریتم به طور گسترده‌ای در صنعت بازاریابی، تحلیل رفتار مشتریان، و سایر حوزه‌هایی که داده‌های خرید و فروش وجود دارد، استفاده می‌شود. با این حال، برای داده‌های بسیار بزرگ، نیاز به بهینه‌سازی و الگوریتم‌های پیشرفته‌تر مانند FP-Growth نیز ممکن است ضروری باشد.

در ادامه از طریق پایتون با یک دیتافریم شامل محصول ، مشتری و خرید هر مشتری ، پیاده سازی روش Apriori را انجام خواهیم داد و در مقاله بعدی با یک دیتاست واقعی که حدودا اطلاعات ۷۰۰ هزاررکورد فروش را شامل می شود این موضوع را پیاده سازی خواهیم کرد.
اما قطعه کدی که پیاده سازی کردیم به صورت زیر می باشد :

import pandas as pd
from mlxtend.frequent_patterns import apriori, association_rules

# ۱. تعریف داده‌ها
products_data = {
    'ProductKey': [101, 102, 103, 104],
    'ProductName': ['شیر', 'نان', 'کره', 'پنیر']
}
customers_data = {
    'CustomerKey': [1, 2, 3, 4],
    'CustomerName': ['علی', 'زهرا', 'محمد', 'سارا']
}
sales_data = {
    'TransactionID': [1, 2, 3, 4, 5, 6],
    'CustomerKey': [1, 2, 3, 1, 4, 2],
    'ProductKey': [101, 102, 103, 104, 102, 101]
}

# ایجاد دیتافریم‌ها
products = pd.DataFrame(products_data)
customers = pd.DataFrame(customers_data)
sales = pd.DataFrame(sales_data)

# ۲. ترکیب داده‌های فروش با محصولات و مشتریان
merged_data = sales.merge(products, on='ProductKey', how='inner').merge(customers, on='CustomerKey', how='inner')

print("داده‌های ترکیب‌شده:")
print(merged_data)

# ۳. ایجاد ماتریس تراکنش‌ها
basket = pd.pivot_table(
    data=merged_data,
    values='TransactionID',
    index='CustomerName',
    columns='ProductName',
    aggfunc='count',
    fill_value=0
)
basket = basket.applymap(lambda x: 1 if x > 0 else 0)  # تبدیل به ۰ و ۱

print("\nماتریس تراکنش‌ها:")
print(basket)

# ۴. اجرای الگوریتم Apriori
frequent_itemsets = apriori(basket, min_support=0.3, use_colnames=True)

print("\nمجموعه‌های پرتکرار:")
print(frequent_itemsets)

# ۵. استخراج قوانین انجمنی
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1.0)

print("\nقوانین استخراج‌شده:")
print(rules)

# ۶. تحلیل قوانین استخراج‌شده
for _, row in rules.iterrows():
    antecedents = ", ".join(list(row['antecedents']))
    consequents = ", ".join(list(row['consequents']))
    print(f"\nقانون: اگر مشتری {antecedents} بخرد، احتمال خرید {consequents} وجود دارد.")
    print(f" - Confidence (اعتماد): {row['confidence']:.2f}")
    print(f" - Lift (اثربخشی): {row['lift']:.2f}")
  1. داده‌های ترکیب‌شده:

این داده‌ها شامل اطلاعات فروش، مشتریان، و محصولات است:

   TransactionID  CustomerKey  ProductKey ProductName CustomerName
۰              ۱            ۱        ۱۰۱         شیر          علی
۱              ۲            ۲        ۱۰۲         نان         زهرا
۲              ۳            ۳        ۱۰۳         کره       محمد
۳              ۴            ۱        ۱۰۴        پنیر          علی
۴              ۵            ۴        ۱۰۲         نان        سارا
۵              ۶            ۲        ۱۰۱         شیر         زهرا
  1. ماتریس تراکنش‌ها:

ماتریس نشان می‌دهد که هر مشتری چه محصولاتی را خریده است:

ProductName    پنیر  کره  نان  شیر
CustomerName                     
علی              ۱    ۰    ۰   ۱
زهرا             ۰    ۰    ۱   ۱
محمد             ۰    ۱    ۰   ۰
سارا             ۰    ۰    ۱   ۰

۳.مجموعه های پرتکرار:

خروجی Apriori مجموعه محصولاتی که حداقل در ۳۰٪ تراکنش‌ها ظاهر شده‌اند را نشان می‌دهد:

   support     itemsets
۰     ۰.۵         [شیر]
۱     ۰.۵         [نان]
  • شیر و نان در ۵۰٪ تراکنش‌ها دیده شده‌اند.
  1. قوانین استخراج‌شده:

این بخش روابط بین محصولات را نشان می‌دهد:

  antecedents consequents  confidence  lift
۰       [شیر]       [نان]        ۰.۵۰   ۱.۰۰
۱       [نان]       [شیر]        ۰.۵۰   ۱.۰۰
  1. تحلیل قوانین:

قانون ۱:

  • اگر مشتری شیر بخرد، احتمال خرید نان وجود دارد.
    • اعتماد ۰.۵۰ → ۵۰٪  :   (Confidence)   از مشتریانی که شیر خریده‌اند، نان نیز خریده‌اند.
    • اثربخشی → ۱.۰۰  :  (Lift)  این رابطه فقط تصادفی است و ارتباطی قوی‌تر از شانس ندارد.

قانون ۲:

  • اگر مشتری نان بخرد، احتمال خرید شیر وجود دارد.
    • اعتماد ۰.۵۰ → ۵۰٪  :(Confidence)   از مشتریانی که نان خریده‌اند، شیر نیز خریده‌اند.
    • اثربخشی ۱.۰۰  :  (Lif  →همان توضیح  که قبلا بیان شده است.

بررسی قطعه کد apriori

frequent_itemsets = apriori(basket, min_support=0.3, use_colnames=True)
  1. Apriori
  • تعریف: این تابع از کتابخانه mlxtend.frequent_patterns استفاده می‌شود و الگوریتم Apriori را اجرا می‌کند.
  • هدف: شناسایی مجموعه‌های آیتمی که فراوانی (حمایت) آن‌ها از یک مقدار حداقل مشخص (min_support) بیشتر است.
  1. پارامتر ها

basket

  • شرح: basket همان ماتریس تراکنش‌ها است که هر ردیف نشان‌دهنده مشتری و هر ستون نشان‌دهنده محصول است. مقادیر داخل ماتریس به صورت باینری (۰ و ۱) هستند:
    • مقدار ۱ نشان می‌دهد که مشتری آن محصول را خریده است.
    • مقدار ۰ نشان می‌دهد که مشتری آن محصول را نخریده است.
  • هدف: این ماتریس به الگوریتم Apriori می‌گوید که کدام آیتم‌ها (محصولات) در تراکنش‌های مختلف وجود دارند.

min_support=0.3

  • شرح: این پارامتر مقدار حداقل حمایت (Support) را مشخص می‌کند. حمایت نشان‌دهنده درصد تراکنش‌هایی است که شامل یک مجموعه آیتم خاص هستند:
    • در این مثال، min_support=0.3 یعنی فقط مجموعه آیتم‌هایی که در حداقل ۳۰٪ تراکنش‌ها ظاهر شده‌اند در خروجی قرار می‌گیرند.
  • هدف: حذف مجموعه‌های نادری که فراوانی کمی دارند و برای استخراج قوانین انجمنی مهم نیستند.

use_colnames=True

  • شرح: وقتی مقدار این پارامتر True باشد، به جای استفاده از ایندکس عددی ستون‌ها (مثل ۰، ۱، ۲)، از نام ستون‌ها (مثل نام محصولات) در خروجی استفاده می‌کند.
  • هدف: خروجی خواناتر می‌شود و به جای اعداد، نام آیتم‌ها (محصولات) نمایش داده می‌شود.
  1. خروجی Apriori

خروجی این تابع یک DataFrame است که شامل دو ستون مهم است:

  • support: مقدار حمایت هر مجموعه آیتم.
  • itemsets: مجموعه آیتم‌هایی که فراوانی آن‌ها از مقدار حداقل مشخص‌شده بیشتر است.فرض کنید ماتریس تراکنش‌ها (basket) به شکل زیر است:
    ProductName  شیر  نان  کره
    Customer1     1    1    0
    Customer2     0    1    1
    Customer3     1    0    1
    Customer4     1    1    0
    

    با اجرای خط زیر:

    frequent_itemsets = apriori(basket, min_support=0.3, use_colnames=True)
    

    : خروجی ممکن است به شکل زیر باشد

       support         itemsets
    ۰     ۰.۷۵            [شیر]
    ۱     ۰.۵۰            [نان]
    ۲     ۰.۵۰            [کره]
    ۳     ۰.۵۰      [شیر, نان]
    
    • [شیر] با حمایت ۰.۷۵: محصول “شیر” در ۷۵٪ تراکنش‌ها ظاهر شده است
    • [شیر, نان] با حمایت ۰.۵۰: ترکیب “شیر” و “نان” در ۵۰٪ تراکنش‌ها باهم ظاهر شده‌اند

بررسی قطعه کد association_rules

rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1.0)

این خط از کد برای استخراج قوانین انجمنی (Association Rules) از مجموعه‌های پرتکرار (Frequent Itemsets) استفاده می‌شود.

  1. association_rules

این تابع از کتابخانه mlxtend برای استخراج قوانین انجمنی استفاده می‌شود. ورودی اصلی آن مجموعه‌های پرتکرار مثل frequent_itemsets در اینجا است که با الگوریتم Apriori یا FP-Growth تولید شده‌اند.

  1. پارامترها

frequent_itemsets

  • شرح: این آرگومان شامل مجموعه‌های پرتکرار به همراه حمایت (Support) آن‌ها است. این داده‌ها قبلاً توسط الگوریتم Apriori تولید شده‌اند.
  • هدف: تابع قوانین انجمنی را بر اساس این داده‌ها استخراج می‌کند.

metric=”lift”

  • شرح: مشخص می‌کند که تابع از چه معیاری برای ارزیابی روابط استفاده کند. اینجا معیار Lift انتخاب شده است.
  • Lift چیست؟
    Lift معیاری است که نشان می‌دهد ارتباط بین دو آیتم چقدر قوی‌تر از شانس تصادفی است.

    • اگر Lift > 1 باشد، نشان می‌دهد که دو آیتم وابستگی مثبتی دارند.
    • اگر Lift = 1 باشد، نشان می‌دهد که رابطه صرفاً تصادفی است.
    • اگر Lift < 1 باشد، نشان می‌دهد که دو آیتم احتمالاً به‌طور منفی مرتبط هستند.

min_threshold=1.0

  • شرح: این پارامتر تعیین می‌کند که فقط قوانینی با مقدار Lift بزرگ‌تر یا مساوی با ۱.۰ استخراج شوند.
  • هدف: قوانین انجمنی که اثرگذاری کمتری دارند و صرفاً تصادفی هستند فیلتر می‌شوند.
  1. خروجی association_rules

خروجی این تابع یک DataFrame شامل تمامی قوانین انجمنی استخراج‌شده است. ستون‌های مهم در خروجی شامل موارد زیر هستند:

  • antecedents: مجموعه پیش‌نیاز (A)، یعنی آیتم‌هایی که خرید آن‌ها شرطی برای قانون است.
  • consequents: مجموعه نتیجه (B)، یعنی آیتم‌هایی که احتمال خرید آن‌ها افزایش می‌یابد.
  • support: حمایت مشترک مجموعه A و B.
  • confidence: احتمال شرطی P(B∣A))، نشان‌دهنده درصد تراکنش‌هایی که حاوی A و B هستند.
  • lift: قدرت ارتباط میان A و B.

اگر خروجی به شکل زیر باشد

  antecedents  consequents  support  confidence  lift
۰       [شیر]        [نان]     ۰.۵        ۰.۷۵   ۱.۵۰

این قانون می‌گوید:

قانون: اگر مشتری شیر بخرد، احتمال خرید نان وجود دارد.

اعتماد  (Confidence)  : : ۰.۷۵ → ۷۵٪ از مشتریانی که شیر خریده‌اند، نان هم خریده‌اند.

اثربخشی (Lift) :1.50 → خرید نان و شیر ۱.۵ برابر قوی‌تر از رابطه تصادفی است.

در مقاله بعدی خروجی را به صورت ویژوالی مشاهده خواهیم کرد :

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *