احتمالاً شما هم از آن دست کاربرانی باشید که یک سری محصول خاص را بصورت دورهای مصرف میکنید و زمانی که آن محصول مصرف شد، نوبت خرید دوباره فرا میرسد. هدف ما در این مسأله تشخیص همین عادتهای خرید (Purchase Habits) و پیشنهاد خرید بعدی به کاربران است. با این کار کاربران زمان کمتری را صرف پیدا کردن محصولات موردنظرشان میکنند.
# صورت مسئله
همانطور که گفته شد، هدف ما این است که دریابیم هر کاربر در دیجیکالا چه محصولاتی را بصورت دورهای خریداری میکند. بصورت دقیقتر، میخواهیم بفهمیم که کاربر `U` کالای `P` را **هر چند روز یک بار** خریداری میکند و وقتی که موعد خرید بعدیاش رسید، به وی پیشنهاد خرید کالا را بدهیم. طبیعتاً برای این کار به تاریخچهی خرید کاربرها نیاز داریم که در بخش بعدی در مورد آن صحبت خواهیم کرد.
شما ابتدا باید **هر جفت «کاربر-محصول»** را جدا کرده و سپس سعی کنید با تست کردن الگوریتمهای مختلف پیشبینی کنید که تاریخ خرید بعدی این کاربر از همین محصول چه زمانیست. روند مسأله ساده بوده و کار اصلی شما تلاش برای پیدا کردن دقیق دوره برای هر جفت «کاربر-محصول» و پیشنهاد تاریخ خرید بعدی است.
<details class="yellow">
<summary>توجه</summary>
به عبارت «جفت» دقت کنید. در آخر شما باید به ازای هر جفت، یک تاریخ خروجی بدهید.
</details>
----------
# دادگان
ابتدا فایل تاریخچهی خرید و فرمت جوابی که باید آپلود کنید را از [این لینک](/contest/assignments/39253/download_problem_initial_project/132516/) دریافت کنید. فایل `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(predicted_i - actual_i) $$
$$ total\_error = \frac{\sum(error * 1.04^{error})}{\sum(1.04^{error})} $$
$$ score = max(100 - total\_error, 0) $$
در فرمول بالا:
+ مقدار $n$ تعداد نمونههای دادگان خروجیست.
+ مقدار $predicted_i$ تاریخ پیشبینیشدهی ردیف $i$ام توسط شماست.
+ مقدار $actual_i$ تاریخیست که مشتری ردیف $i$ کالای ردیف $i$ را خریده است.
+ امتیاز شما در نهایت مقدار `score` است.
<details class="green">
<summary>توضیحات</summary>
+ بهترین جواب (`score=100`) یعنی میانگین اختلاف روزهای پیشبینیشده ۰ بوده و بدترین جواب (`score=0`) یعنی شما به طور میانگین ۱۰۰ روز از حالت واقعی فاصله داشتهاید. طبیعتاً شما باید تلاش کنید که `score` به بیشترین مقدار (۱۰۰) برسد.
+ میانگین تفاوت بیشتر از ۱۰۰ روز در واقع برای ما ارزشی نداشته و به همین دلیل لحاظ نمیشوند و شما به ازای آن جوابها نمرهای دریافت نخواهید کرد.
+ برای اختلافهای بیشتر از ۱۰۰ (x > 100)، همان وزن عدد ۱۰۰ را دریافت خواهید کرد. به بیانی دیگر، ماکسیمم مقدار وزن هر اختلاف (x) برابر با $1.04^{100}$ هست.
+ امتیاز شما برای این سوال دقیقاً همین مقدار `score` خواهد بود. برای مثال اگر فردی تمامی تاریخها را ۵ روز دیرتر پیشبینی کرده باشد، مقدار `score` وی برابر با ۹۵ خواهد بود.
+ منطق این نحوهی وزندهی بدین صورت است که برای اختلاف روزهای بیشتر، `error` شما وزن بیشتری دریافت کند (به اصطلاح بیشتر punish شوید).
</details>
----------
# خروجی
برای ارسال جواب این سوال، شما میبایست تاریخ خرید بعدی هر جفت «کاربر-محصول» را درون جدول `answer.csv` ذخیره کرده (**بدون دو ستون اول**) و این فایل را `zip` کرده و آپلود کنید. به موارد زیر هنگام ساختن فایل خروجی دقت کنید:
+ پاسخ شما باید داخل ستون `next_purchase` نگهداری شود.
+ اسم فایل باید `answer.csv` باشد.
+ حتماً `header` ستون گذاشته شود.
+ از گذاشتن ستونی برای `index` خودداری کنید.
+ نام فایل نهایی `zip` اهمیتی ندارد.
----------
# نمونهی فایل خروجی `answer.csv`
```
next_purchase
2019-09-14
2019-10-28
2019-01-01
```
<details class="red">
<summary>توجه ویژه</summary>
فایل خروجی شما (`answer.csv`) باید دارای یک ستون و ۳۱۸,۰۵۰ ردیف (بدون احتساب `header`) باشد. همچنین ترتیب تاریخهای نوشتهشده باید **مثل همان ترتیب اولیه** در فایل `answer.csv` باشد وگرنه نمرهی شما اشتباه محاسبه خواهد شد.
</details>
تشخیص عادت خرید کاربران دیجیکالا