علی رضا نیک فرجام
علی رضا نیک فرجام
خواندن ۱۱ دقیقه·۴ سال پیش

معرفی و انتشار مجموعه داده کافه بازار

معرفی و پیش پردازش اولیه مجموعه داده کافه بازار
معرفی و پیش پردازش اولیه مجموعه داده کافه بازار

تقریبا یک سال پیش بود که با مجموعه داده ­های googleplaystore تو سایت Kaggle آشنا شدم. تو توضیحاتش گفته بود اگرچه دیتاست­ های زیادی برای اپ استور اپل هست، معادلش برای گوگل پلی نیست که یکی از دلایلش استفاده از تکنیک ­های پیشرفته مدرن (مثل بارگذاری پویای صفحات) با استفاده از JQuery بوده که فرآیند scrape کردنش رو چالش برانگیزتر کرده. از همون موقع به ذهنم رسیده بود که باید عینا معادل همین دیتاست رو برای مارکت کافه بازار هم داشته باشیم چون احتمالا تحلیل­ های جالبی ازش میشه درآورد. من تلاش کردم با اسکریپ صفحات وب کافه ­بازار، این مجموعه داده رو بسازم. تاریخ جمع آوری نتایج حدودا 30 اسفند شد و اعداد و نتایج و تحلیل ها همه تا اون تاریخ معتبر هستند. از اینجا می تونید این مجموعه داده رو دانلود کنید.

اول از همه به تفاوت­ های خیلی مهمی که بین این دو تا مارکت وجود داره بپردازیم و یه سری نکات دیگه که حین اسکریپ صفحات بهشون برخوردم:

1. تو دیتاست گوگل پلی تمام بازی­ ها در یک دسته ­بندی به اسم Game وجود دارند، ولی کافه­ بازار انواع مختلف بازی ­ها رو مثل بقیه دسته­ بندی ­ها در نظر گرفته. در عوض ما تو دیتاست گوگل پلی یک ستون دیگه به اسم Genres داریم که جدای از دسته­ بندی، ژانر اون اپلیکیشن رو نشون میده.

2. از نظر نوع، اپلیکیشن­ ها تو دیتاست گوگل پلی به 2 دسته رایگان و پولی تقسیم ­بندی شدن، در حالی که ما تو کافه بازار 3 دسته رایگان، پولی و پرداخت درون برنامه ای داریم. تفکیک بین این 3 دسته تو کافه بازار، تفکیک دقیق­ تری هست به نظر من

3. تاریخ آخرین به ­روزرسانی هر اپ رو تو اپلیکیشن موبایلی کافه بازار میشه دید ولی این قابلیت تو نسخه وبش وجود نداره.

4. یکی از قابلیت­ های فوق العاده خوب گوگل پلی، وجود هشدار و رتبه ­بندی محتوای اپلیکیشن­ ها بر اساس رده ­بندی سنی مخاطب هست. کافه بازار تا زمان نوشتن و انتشار این گزارش، چنین ویژگی رو به صفحه اپلیکیشن ­ها اضافه نکرده. بنابراین تو دیتاست کافه بازار خبری از ستون Content Rating نیست.

5. تو حین اسکریپ صفحات، به نتایج عجیبی میرسید. مثلا تعداد زیادی اپلیکیشن وجود داره که تو صفحه اختصاصی­شون، لوگو و نظراتی که روشون داده شده هست، اما پیغام "متاسفانه برنامه مورد نظر شما یافت نشد" هم بالای صفحه دیده میشه و بنابراین هیچ اطلاعاتی از قبیل اینکه این برنامه توسعه دهنده اش کی بوده، چقدر دانلود شده، تو چه دسته ای بوده، چه امتیازی از طرف کاربرا گرفته، چرا دیگه قابل دانلود نیست؟ و غیره قابل بازیابی نیست. یه مثالش رو تو تصویر زیر می بینید.

یک نمونه اپلیکیشن حذف شده با نظرات در دسترس
یک نمونه اپلیکیشن حذف شده با نظرات در دسترس

یا مثلا برای اپلیکیشنی که به درخواست توسعه ­دهنده از دسترس خارج شده ولی بازم فقط نظراتش در دسترسه:

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

6. قصد داشتم تعداد برنامه های فعالی که توسعه ­دهنده نوشته رو از پیج اختصاصیشون محاسبه کنم. اما به طرز عجیبی دیدم که برای خیلی از توسعه ­دهنده ها، بعضی از برنامه ­هایی که منتشر کردن تو صفحه شون ایندکس نشده! برای اثبات ادعام فقط یه مثال میارم. یه اپلیکیشن داریم به اسم "قانون (low)" (کم؟!!! ?) با اسم پکیج alireza.low. توسعه­ دهنده هم اسمش فاطمه96 هست.

حالا اگر وارد صفحه اختصاصی توسعه­ دهنده بشیم، میبینیم که اثری از این اپلیکیشن نیست!

در صفحه توسعه دهنده ها، همه اپلیکیشن هایشان ایندکس نمی شود
در صفحه توسعه دهنده ها، همه اپلیکیشن هایشان ایندکس نمی شود

بازهم تاکید می کنم، مشابه این مشکل بسیار زیاده و دوستان کافه بازار احتمالا پاسخی برای این مشکل دارند که چرا همه اپلیکیشن­ های یک توسعه ­دهنده تو صفحه اختصاصیش ایندکس نشده؟ به همین دلیل تو دیتاست فقط لینک صفحه توسعه دهنده رو گذاشتم تا بعدا از روی اون بشه شمارش شاید دقیق ­تری به دست آورد از تعداد اپلیکیشن­هایی که هر شخص تو کافه بازار منتشر کرده.

7. گوگل پلی، پایین ­ترین نسخه اندرویدی که برای نصب و کارایی هر اپلیکیشن نیاز هست رو به کاربر اطلاع میده. تو کافه بازار متاسفانه هنوز چنین چیزی وجود نداره.

8. توی دیتاست گوگل پلی علاوه بر فایلی که مربوط به اطلاعات اپلیکیشن هاست، یه فایل review هم هست که برای هر اپ حداکثر 100 کامنت مرتبط با اپلیکیشن با 3 ویژگی استخراج شده از اون کامنت شامل تحلیل احساس، قطبیت احساس(Sentiment Polarity) و ذهنیت احساس(Sentiment Subjectivity) رو شامل میشه. با این دیتاها کارهای فوق العاده ای میشه کرد. اما من از استخراج نظرات اپلیکیشن­ های کافه بازار چشم پوشی کردم. به عنوان کسی که حداقل یک بار یک اپلیکیشن رو توی این مارکت منتشر کرده، انجام هر تحلیلی روی نظرات اپلیکیشن­ ها در کافه بازار رو عبث و بیهوده میدونم، چراکه از روز اول انتشار اپلیکیشن، روزانه ده ها ایمیل از شرکت ­ها و افراد بعضا حتی شناخته­ شده و معتبر دریافت کردم (و هنوز دریافت می­کنم!) که با رقم ­های بسیار پایین اقدام به گذاشتن نظرات خوب، بعضا مرتب و دادن ستاره و امتیاز می­کنند. اگرچه طبق گزارش کافه بازار اخیرا مقدار زیادی از این نظرات و امتیازها پاک شدن، اما کماکان تحلیل نظرهای باقی­مونده ارزش فنی و معنایی نداره چون بساط خریدن انبوهِ نظرِ خوب، هنوز با همون قیمت ­ها پابرجاست. تا وقتی این کاسبی کثیف رونق داره، تحلیل نظرات از نظر من بی ارزش و شاید از نظر دوستانی که به اندازه من سخت­گیر نیستند، کم ارزش باشه.




تمیزکردن داده ­ها و مهندسی ویژگی­ ها:

تو این مرحله باید داده­ هایی که استخراج شدن رو تمیزکاری کنیم که آماده تحلیل بشن. اول از همه یه نگاهی به 10 تا از سطرها به صورت تصادفی بندازیم:

نگاهی کلیه به داده های اولیه
نگاهی کلیه به داده های اولیه

دیتاست خام ما از چه ستون­ هایی تشکیل شده؟

ویژگی های اولیه تشکیل دهنده مجموعه داده
ویژگی های اولیه تشکیل دهنده مجموعه داده

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

بطور کلی ما چندتا اپلیکیشن تو این مارکت پیدا کردیم و تو دیتاست آوردیم؟

تعداد کل اپلیکیشن های موجود حتی تکراری ها
تعداد کل اپلیکیشن های موجود حتی تکراری ها

طبق تصویر بالا، 199737 تا. اما با توجه به روش اسکریپ من، ممکنه دیتای تکراری داشته باشیم؟ باید بررسی کنیم.

تعداد اپلیکیشن های تکراری
تعداد اپلیکیشن های تکراری

با توجه به یکتا بودن اسم پکیج برای هر اپلیکیشن، این ستون رو برای بررسی انتخاب می­کنیم. 20436 تا سطر تکراری داریم که باید پاکشون کنیم.

حذف اپلیکیشن های تکراری
حذف اپلیکیشن های تکراری

بنابراین، دیتاست ما اطلاعات مربوط به 179301 اپلیکیشن رو پوشش میده.

نکته: ذکر این نکته رو خالی از لطف نمیدونم که از روزی که من اسم تمام پکیج ­ها رو دریافت کردم تا روزی که کار اسکریپ صفحات به اتمام رسید، 1417 اپلیکیشن از کافه بازار حذف شد و 384 مورد هم به درخواست انتشاردهنده ­ها از دسترس خارج شد.

یه نگاه به اسم دسته­ بندی ­ها میندازیم.

در ادامه به دو تا سوال پاسخ میدیم. کلا چندتا دسته ­بندی مختلف و یکتا داریم و کلاس ­های نصب هر اپلیکیشن چندتاست؟ کافه بازار برای تعداد نصب فعال اپلیکیشن­ ها، تعداد دقیق نصب رو نمیده و به جاش کلاس ­هایی رو تعریف کرده مثل بیش از 50، بیش از 100 و غیره. هدف اینه تعداد این کلاس ­ها رو بشماریم.

تعداد دسته بندی ها و کلاس های نصب
تعداد دسته بندی ها و کلاس های نصب

کلا 28 دسته اپلیکیشن داریم که تو 39 کلاس مختلف نصبی قرار گرفتن. اگر به وب­سایت کافه­ بازار مراجعه کنید و از منوی بالا دسته مربوط به برنامه ­ها و بازی ­ها رو جداگونه بشمارید متوجه میشید که 30 دسته ­بندی مختلف وجود داره، اما باید به این نکته دقت کرد که دو دسته­ بندی "ورزشی" و "کودک" اسامی مشابهی رو هم در برنامه ­ها و هم در بازی ­ها دارن. چرا تو دیتاست ما این موارد به درستی تفکیک نشده؟ دلیلش اینه که ما صفحه هر اپلیکیشن رو جداگونه بررسی کردیم و از اون اطلاعات کشیدیم بیرون. یه نگاهی به دو تا اپلیکیشن مختلف از دسته ورزشیِ متعلق به برنامه­ ها و ورزشیِ متعلق به بازی ­ها میندازیم.

یک نمونه اپلیکیشن در دسته برنامه های ورزشی
یک نمونه اپلیکیشن در دسته برنامه های ورزشی
یک نمونه اپلیکیشن در دسته بازی های ورزشی
یک نمونه اپلیکیشن در دسته بازی های ورزشی

تو قسمت دسته، هر دو "ورزشی" نوشته شده که استخراج این عبارت باعث گمراهی ما شده. برای دسته کودک هم عینا مشابه همین مورد صدق می­کنه. اینجا جایی بود که من باید تصمیم می­ گرفتم که برگردم و این موارد رو اصلاح کنم یا اصولا این تشابه به تحلیل ­ها لطمه ­ای نمی­زنه. راستش اگر صفحه مربوط به کودک رو چه در برنامه­ ها و چه در بازی­ ها باز کنید، به تناوب اپلیکیشن­ های تکراری میبینید. این قضیه راجع به بخش ورزشی البته کمتر صدق می کنه. بنابراین سوال واضح ما اینه:

آیا می­تونیم جامعه مخاطبین بازی­ های ورزشی رو با جامعه مخاطبین برنامه­ های ورزشی یکی فرض کنیم؟ آیا تحلیل رفتار گروه اول با گروه دوم مشابه همدیگه ست؟ پاسخ این سوال قطعا خیر هست.

مشابه سوال بالا، آیا می­تونیم جامعه مخاطبین بازی­ های کودکانه رو با جامعه مخاطبین برنامه­ های کودکانه یکی فرض کنیم؟ آیا تحلیل رفتار گروه اول با گروه دوم مشابه همدیگه ست؟ پاسخ این سوال تا حد زیادی بله هست.

اما من ریسک انتقادات احتمالی بعدی رو نپذیرفتم و این فرآیندِ دردناک و زمان­برِ استخراجِ مجددِ اطلاعاتِ این 4 دسته مختلف رو از اول انجام دادم. در نهایت:

تعداد صحیح دسته اپلیکیشن ها
تعداد صحیح دسته اپلیکیشن ها

حالا تعدادشون به 30 تا رسید.

دسته های مختلف اپلیکیشن ها
دسته های مختلف اپلیکیشن ها

تفاوت خروجی مرحله بالا با قبلش، اضافه شدن دو دسته "بازی ورزشی" و "بازی کودکانه" به دسته ­های قبلیه که با برنامه ­های موجود تو شاخه "ورزشی" و "کودک" تداخل نداشته باشه.

همینجا این فکر به ذهنم رسید که مقایسه خیلی از شاخصه ­های برنامه ­ها و بازی­ ها در کنار هم شاید خیلی عادلانه نباشه گرچه یه جاهایی ممکنه لازم باشه. بنابراین یه ستون دیگه به اسم Kind به مجموعه داده اضافه کردم که فقط تمایز بین دو دسته کلی "برنامه" و "بازی" رو بهمون نشون بده. خود مجموعه کافه بازار هم تو گزارش­ های تحلیلیش آمار این دو گروه رو کاملا جدا از هم گزارش میده البته.

تقسیم بندی اپلیکیشن ها به برنامه و بازی
تقسیم بندی اپلیکیشن ها به برنامه و بازی

تو گام بعدی خوبه که ببینیم چقدر داده پوچ تو مجموعه داده ثبت شده.

شمردن تعداد داده های null
شمردن تعداد داده های null

موقع اسکریپ صفحات هرجا که اپلیکیشنی نه رایگان بود و نه کاملا پولی، یعنی پرداخت درون برنامه ­ای داشت، من تو ستون قیمت مقدار پوچ گذاشتم. برای ادامه تحلیل­ هامون می­تونیم قیمت این­ها رو 0 فرض کنیم. همچنین تعداد زیادی از اپلیکیشن ­ها شماره نسخه نداشتن که اونا رو هم برای ادامه 0 میزاریم.

پر کردن داده های null با 0
پر کردن داده های null با 0

اما با توجه به خطایی که در طول کار برام پیش اومد، 2 تا اپلیکیشن داریم که اسم توسعه ­دهنده تو صفحه اختصاصی برنامه درج نشده و بجاش یه کاراکتر خالی بوده فقط!

دو اپلیکیشن نمونه که نام توسعه دهنده آن ها مشخص نیست!
دو اپلیکیشن نمونه که نام توسعه دهنده آن ها مشخص نیست!

که این دو اپلیکیشن هستند:

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

کلاس های مختلف نصب اپلیکیشن ها
کلاس های مختلف نصب اپلیکیشن ها

ما فقط به عدد این ستون نیاز داریم و بنابراین باید کاراکترهای + و > رو پاک کنیم. اگرچه با این کار در حق اپلیکیشن ­هایی که تعداد نصب فعال بیشتر از 10 تا و کمتر از 50 تا دارن ظلم میشه و اونا رو معادل اپلیکیشن­ هایی در نظر میگیریم که تعداد نصب کمتر از 10 تا دارند، اما این تغییر خیلی تو تحلیل­ های ما اثر جدی نداره. از طرفی اعداد فارسی هستند و باید اونا رو به انگلیسی تبدیل کنیم. همچنین کلماتی مثل "هزار" و "میلیون" در کنار عددها به درد ما نمیخوره و باید اونا رو با صفرهای معادلشون جایگزین کنیم. از اونجایی که من انسان راحت­ طلبی هستم (جایگزین بهتر واژه تنبلی) همه این کارها رو توی Power Query خیلی راحت ­تر از پایتون میشه انجام داد. نهایتا با 4 یا 5 تا کلیک.

کلاس بندی جدید برای تعداد نصب اپلیکیشن ها
کلاس بندی جدید برای تعداد نصب اپلیکیشن ها

ستونی رو به اسم InstallsNum اضافه کردیم که خروجیش رو در بالا می بینید.

اما هنوز ستون Type مجموعه داده ما مقادیر مناسبی نداره. هدف ما از این ستون اینه که بدونیم اپلیکیشن از نظر رایگان بودن یا پولی بودن یا پرداخت درون برنامه ­ای جزو کدوم یک از این سه دسته قرار می­گیره. بنابراین با قطعه کد زیر مقادیر این ستون رو هم معنادار می­ کنیم. اگر اپلیکیشنی رایگان باشه فقط عبارت "نصب از بازار" تو این ستون دیده میشه. اگر پولی باشه کلمه "تومان" توش هست و در غیر اینصورت پرداخت درون برنامه­ ای میشه. چون این عمل وقت ­گیره نتایج رو ذخیره می ­کنیم تا سری بعد نخوایم هربار این عمل تکرار شه.

ویرایش ویژگی نوع اپلیکیشن ها از نظر قیمت گذاری
ویرایش ویژگی نوع اپلیکیشن ها از نظر قیمت گذاری

اما من قصد دارم 3 تا ویژگی دیگه رو از روی همین مجموعه داده خام محاسبه کنم. با این پیش ­زمینه ذهنی که هر اپلیکیشنی ممکنه مدتی خوب نصب بشه و بعد از یه مدت تعداد نصب ­های فعالش کاهش پیدا کنه، این 3 ویژگی رو به داده ­ها اضافه می­ کنم:

ویژگی DataFlow: سایز اپلیکیشن که به مگابایت هست رو در تعداد دفعات نصبش ضرب می ­کنیم. میخوایم بدونیم حداقل چقدر حجم و پهنای باند بابت دانلود این اپلیکیشن صرف شده!

ویژگی Review-Install-Ratio: تعداد نظرات رو تقسیم بر تعداد دفعات نصب می­ کنیم تا تعداد کاربرای فعالی که عملکرد هر اپلیکیشنی که دانلود کرده بودن براشون مهم بوده رو به دست بیاریم.

ویژگی SellAmount: این ویژگی هم عملا فقط برای اپلیکیشن­ های پولی محاسبه میشه. میخوایم بدونیم از محل فروش اپلیکیشن ­های پولی حداقل چقدر درآمد کسب شده. البته خیلی جذاب میشد اگر این اطلاعات رو راجع به اپلیکیشن­ های با پرداخت درون برنامه­ ای هم داشتیم چه تحلیل­ های جالبی که ازش استخراج میشد! ولی فعلا به همین داشته ­هامون قناعت می­کنیم.

هیچکدوم از این 3تا ویژگی چیزی نبوده که به ذهن شخص من رسیده باشه. راستش تو تحلیل­ های مختلف روی مجموعه داده گوگل پلی دیده بودم بعضی ­ها این 3 تا رو محاسبه می­کنن و منم عینا تقلید کردم. البته اون­ ها بعدش باهاش کارای یادگیری ماشینی انجام میدن، مثلا سعی می­کنن میزان Review_Install_Ration رو پیش­بینی کنن! ممکنه این ویژگی­ ها به هیچ دردی هم نخورن تعصبی روشون ندارم. در ادامه باید ببینیم چی پیش میاد.

محاسبه و افزودن 3 ویژگی جدید به مجموعه داده
محاسبه و افزودن 3 ویژگی جدید به مجموعه داده
اطلاعات کلی ویژگی های مجموعه داده
اطلاعات کلی ویژگی های مجموعه داده
تحلیل آماری ابتدایی روی ویژگی های عددی مجموعه داده
تحلیل آماری ابتدایی روی ویژگی های عددی مجموعه داده

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

در اخر ممنون میشم از همه کسانی که اگر مایل بودن از این دیتاست استفاده کنند، یه جوری به بنده هم اطلاع بدن تا نتایج کارها و تحلیل­ هاشون رو با کمال میل و مشتاقانه مطالعه کنم. من در تلگرام و توییتر با آیدی arshin1989 در دسترس هستم.

کافه بازارپیش پردازش دادهتحلیل دادهدادهdata scraping
شاید از این پست‌ها خوشتان بیاید