تشخیص عادت‌ خرید کاربران دیجی‌کالا


احتمالاً شما هم از آن دست کاربرانی باشید که یک سری محصول خاص را بصورت دوره‌ای مصرف می‌کنید و زمانی که آن محصول مصرف شد، نوبت خرید دوباره فرا می‌رسد. هدف ما در این مسأله تشخیص همین عادت‌های خرید (Purchase Habits) و پیشنهاد خرید بعدی به کاربران است. با این کار کاربران زمان کمتری را صرف پیدا کردن محصولات موردنظرشان می‌کنند.

صورت مسئله🔗

همان‌طور که گفته شد، هدف ما این است که دریابیم هر کاربر در دیجی‌کالا چه محصولاتی را بصورت دوره‌ای خریداری می‌کند. بصورت دقیق‌تر، می‌خواهیم بفهمیم که کاربر U کالای P را هر چند روز یک بار خریداری می‌کند و وقتی که موعد خرید بعدی‌اش رسید، به وی پیشنهاد خرید کالا را بدهیم. طبیعتاً برای این کار به تاریخچه‌ی خرید کاربرها نیاز داریم که در بخش بعدی در مورد آن صحبت خواهیم کرد.

شما ابتدا باید هر جفت «کاربر-محصول» را جدا کرده و سپس سعی کنید با تست کردن الگوریتم‌های مختلف پیش‌بینی کنید که تاریخ خرید بعدی این کاربر از همین محصول چه زمانی‌ست. روند مسأله ساده بوده و کار اصلی شما تلاش برای پیدا کردن دقیق دوره برای هر جفت «کاربر-محصول» و پیشنهاد تاریخ خرید بعدی است.

توجه

به عبارت «جفت» دقت کنید. در آخر شما باید به ازای هر جفت، یک تاریخ خروجی بدهید.


دادگان🔗

ابتدا فایل تاریخچه‌ی خرید و فرمت جوابی که باید آپلود کنید را از این لینک دریافت کنید. فایل purchase_history.csv بخشی از خریدهای کاربران و تاریخ‌شان را شامل می‌شود (البته آخرین خرید آنها حذف و برای ارزیابی نگهداری شده است). شما می‌بایست عملیاتتان را روی فایل purchase_history.csv انجام داده و خروجی را درون فایل answer.csv‍‍ ذخیره کنید. چند ردیف از فایل purchase_history.csv را در جدول زیر مشاهده می‌کنید:

user_id product_id created_at
6823506 1015421 2019-06-10
11886162 5622949 2019-11-27

ارزیابی🔗

در بخش قبلی اشاره شد که آخرین خرید هر جفت «کاربر-محصول» برای ارزیابی برداشته می‌شود و جواب شما نیز با همان آخرین خرید مقایسه خواهد شد. فرمول ارزیابی میانگین وزن‌دار تفاوت پیش‌بینی شما از تاریخ خرید بعدی و تاریخ اصلی خرید بعدی هر جفت «کاربر-محصول» در نظر گرفته شده و طبق روند زیر محاسبه می‌شود:

error=abs(predictediactuali) error = abs(predicted_i - actual_i) total_error=(error1.04error)(1.04error) total\_error = \frac{\sum(error * 1.04^{error})}{\sum(1.04^{error})} score=max(100total_error,0) score = max(100 - total\_error, 0)

در فرمول بالا:

  • مقدار nn تعداد نمونه‌های دادگان خروجی‌ست.
  • مقدار predictedipredicted_i تاریخ پیش‌بینی‌شده‌ی ردیف iiام توسط شماست.
  • مقدار actualiactual_i تاریخی‌ست که مشتری ردیف ii کالای ردیف ii را خریده است.
  • امتیاز شما در نهایت مقدار score است.
توضیحات
  • بهترین جواب (score=100) یعنی میانگین اختلاف روزهای پیش‌بینی‌شده ۰ بوده و بدترین جواب (score=0) یعنی شما به طور میانگین ۱۰۰ روز از حالت واقعی فاصله داشته‌اید. طبیعتاً شما باید تلاش کنید که score به بیشترین مقدار (۱۰۰) برسد.
  • میانگین تفاوت بیشتر از ۱۰۰ روز در واقع برای ما ارزشی نداشته و به همین دلیل لحاظ نمی‌شوند و شما به ازای آن جواب‌ها نمره‌ای دریافت نخواهید کرد.
  • برای اختلاف‌های بیشتر از ۱۰۰ (x > 100)، همان وزن عدد ۱۰۰ را دریافت خواهید کرد. به بیانی دیگر، ماکسیمم مقدار وزن هر اختلاف (x) برابر با 1.041001.04^{100} هست.
  • امتیاز شما برای این سوال دقیقاً همین مقدار score خواهد بود. برای مثال اگر فردی تمامی تاریخ‌ها را ۵ روز دیرتر پیش‌بینی کرده باشد، مقدار score وی برابر با ۹۵ خواهد بود.
  • منطق این نحوه‌ی وزن‌دهی بدین صورت است که برای اختلاف روزهای بیشتر، error شما وزن بیشتری دریافت کند (به اصطلاح بیشتر punish شوید).

خروجی🔗

برای ارسال جواب این سوال، شما می‌بایست تاریخ خرید بعدی هر جفت «کاربر-محصول» را درون جدول answer.csv ذخیره کرده (بدون دو ستون اول) و این فایل را zip کرده و آپلود کنید. به موارد زیر هنگام ساختن فایل خروجی دقت کنید:

  • پاسخ شما باید داخل ستون next_purchase نگهداری شود.
  • اسم فایل باید answer.csv باشد.
  • حتماً header ستون گذاشته شود.
  • از گذاشتن ستونی برای index خودداری کنید.
  • نام فایل نهایی zip اهمیتی ندارد.

نمونه‌ی فایل خروجی answer.csv🔗

next_purchase
2019-09-14
2019-10-28
2019-01-01
Plain text
توجه ویژه

فایل خروجی شما (answer.csv) باید دارای یک ستون و ۳۱۸,۰۵۰ ردیف (بدون احتساب header) باشد. همچنین ترتیب تاریخ‌های نوشته‌شده باید مثل همان ترتیب اولیه در فایل answer.csv باشد وگرنه نمره‌ی شما اشتباه محاسبه خواهد شد.

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.