پیشبینی قیمت کتاب‌های فیدیبو با کمک علم داده‌کاوی

در حال حاظر من دانشجوی ارشد صنایع هستم و در حال یادگیری علم تحلیل داده‌‌ها یا همون data analysis و در ادامه‌ش data science هستم (برای اینکه بیشتر با این علم با سرعت زیاد در حال توسعه آشنا بشید می‌تونید این لینک رو ببینید). در راه یادگیری این علم وقتی از پروژه‌های coursera و datacamp خسته شدم تصمیم گرفتم یک پروژه برای خودم تعریف کنم اول مقایسه کتاب‌های طاقچه و فیدیبو دو سرویس فروش کتاب دیجیتال رو خواستم با داده کاوی انجام بدم اما طی یک سریع اتفاقات به این نتیجه رسیدم که صرفا کتاب‌های فیدیبو رو تحلیل کنم.

جمع‌آوری دیتا

برای جمع‌آوری دیتا از فیدیبو ابتدا خواستم از خودشون درخواست داده بکنم اما به این پروسه طول می‌کشید (امیدوارم این شرکت که زیرمجموعه دیجیکالا هست مثل خود دیجیکالا داده‌هاش رو به اشتراک بگذاره) برای همین از web scraping کمک گرفتم برای داده کاوی که شاید روش این کار رو بعدا تو بلاگم بنویسم.به صورت خلاصه به جمع کردن داده‌ها از وبسایت‌ها وب اسکرپینگ می‌گن. با نوشتن یک spider توی لایبرری (بیشتر فریم‌ورک) scrapy اطلاعات قسمت سرچ فیدیبو با کلید واژه کتاب ( که کل کتاب‌های سایت رو لیست می‌کرد) اطلاعات دویست صفحه سرچ این سایت رو دراوردم و بعد از اجازه گرفتن از خودشون توی گیت‌هاب شیرکردم که این فایل csv رو توی این لینک می‌تونید ببینید.

این اطلاعات شامل این ستون‌هاست:

  • اسم کتاب
  • قیمت کتاب چاپی
  • قیمت کتاب در فیدیبو
  • شابک
  • امتیاز کتاب در فیدیبو
  • شماره صفحات
  • ناشر

از مرحله بررسی داده‌ها به بعد کد‌هایی که زدم رو توی یک jupyter notebook نوشتم که این رو هم توی گیت‌هاب شیر کردم که از این لینک می‌تونید ببینید.

بررسی داده‌ها

ابتدا بعد از اضافه کردن داده‌ها یک ستون اضافه کردم به عنوان تفاوت قیمت که تفاوت قیمت کتاب چاپی با کتاب توی سایت فیدیبو بود. سپس هیستوگرام چهار ستون این داده ها رو رسم کردم تا داده ها رو بررسی کنم.

اکثر ستون ها داده‌های بیرون از رنج معمول دارند اما این داده ها outlier به خاطر خطا نیستند چون اشتباه جمع‌اوری داده نداشتند. مثلا یک کتاب واقعا هشتاد هزار تومن بود.

اما ریتینگ کمی عجیب بود که انقدر ۵ داره برای همین هیستوگرام این ستون رو دوباره رسم کردم تا دقیق‌تر بشه دیدش.

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

کورلیشن بین ستون‌ها

از اونجایی که برای پیشبینی قیمت داده‌ها نیاز داشتم از رگرسیون کمک بگیرم باید همبستگی بین ستون‌ها رو بررسی می‌کردم. ستون‌های قیمت کتاب چاپی با قیمت فیدیبو همبستگی زیادی داشت که طبیعی بود. نکته جالب جدول همبستگی این بود که ستون تفاوت قیمت با قیمت چاپی همبستگی بیشتری داشت تا با قیمت فیدیبو. این نشون می‌ده که فیدیبو سعی می‌کنه قیمت‌های کتاب رو جوری بالانس که تقریبا تمام کتاب‌ها توی یک رنج قیمت باشند.

همبستگی بالا تفاوت قیمت با قیمت چاپی
همبستگی بالا تفاوت قیمت با قیمت چاپی


رگرسیون و تمرین مدل

از اینجا به بعد بهتره jupiter notebook رو باز کنید چون اکثرش کد هست.

از اونجایی که یک سری ستون‌های ما همبستگی بالایی دارند از رگرسیون معمولی نمی‌توانیم استفاده کنیم برای همین من دو کار انجام دادم یک اینکه با lasso regression رفتم و دو اینکه با PCA اول داده‌هام رو پروژکت کردم بعد رگرسیون رفتم. سپس دقت هر کدوم رو اندازه گرفتم.

من در ابتدا سه مولفه رو در نظر گرفتم قیمت کتاب چاپی، امتیاز و تعداد صفحات رو درنظر گرفتم که اشکالاتی داره که بهش می‌رسم.

با روش lasso که رفتم دقت مدل ۶۶ درصد شد که بدون درنظر گرفتن ناشر‌ها مقدار خوبی هست.

سپس با روش pca دو کامپوننت رفتم ولی دیدم که اگر یک کامپوننت در نظر بگیرم ۷۰ درصد مدل رو پوشش می‌ده پس می‌شد از یک کامپوننت نیز استفاده کرد. بعد از انجام این کار دقت مدل شد ۵۹ درصد که از روش lasso کمتر بود.

سپس ناشر‌ها رو اضافه کردم و آنها رو به متغیرهای باینری صفر و یک تبدیل کردم که بشه از اونها توی رگرسیون استفاده کرد نتیجه این شده که دقت lasso که قبلا ۶۶ درصد بود ۷۷ درصد شد و حدود ۱۰ درصد افزایش یافت و مدل که از روش pca رفتم به دقت ۷۶ درصد رسید ولی کامپونت‌هاش خیلی زیاد شد که باعث شد در آخر pca خیلی بدرد نخوره پس روش lasso بهتر بود.

اما نکته‌ای که وجود داره اینه که ما وقتی می‌خوایم یک کتاب به مدلمون اضافه کنیم امتیاز اون رو نمی‌دونیم پس نمی شه این مولفه رو توی مدل اضافه کرد پس باید این ستون رو حذف کنم یا باید از امتیاز سایت‌های دیگه مثل طاقچه یا goodreads استفاده کنم. نکته جالب این هست که با حذف این ستون خیلی دقت lasso پایین نیومد و همون ۷۷ درصد موند و مقدار کمی‌ نیز بهتر شد :)

در نتیجه می‌شه از این مدل برای اضافه کردن یک کتاب که قیمت چاپی‌اش رو داریم و تعداد صفحات و ناشرش معلومه قیمت حدودی اون رو برآورد کنیم که با احتمال ۷۷ درصد نزدیک قیمت واقعی برآورد می‌شود.



این تحلیل خیلی خام هست و تقریبا اولین تلاش من برای داده کاوی هست پس به علم بالای خودتون کم و کاستی‌هاش رو ببخشید و اگر جایی اشکالی دیدید خوشحال می‌شم که با من به اشتراک بگذارید. اگه دوست‌داشتید می‌تونید از قسمت تماس با من بلاگم استفاده کنید.