تقریبا یک سال پیش بود که با مجموعه داده های 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 به مجموعه داده اضافه کردم که فقط تمایز بین دو دسته کلی "برنامه" و "بازی" رو بهمون نشون بده. خود مجموعه کافه بازار هم تو گزارش های تحلیلیش آمار این دو گروه رو کاملا جدا از هم گزارش میده البته.
تو گام بعدی خوبه که ببینیم چقدر داده پوچ تو مجموعه داده ثبت شده.
موقع اسکریپ صفحات هرجا که اپلیکیشنی نه رایگان بود و نه کاملا پولی، یعنی پرداخت درون برنامه ای داشت، من تو ستون قیمت مقدار پوچ گذاشتم. برای ادامه تحلیل هامون میتونیم قیمت اینها رو 0 فرض کنیم. همچنین تعداد زیادی از اپلیکیشن ها شماره نسخه نداشتن که اونا رو هم برای ادامه 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 رو پیشبینی کنن! ممکنه این ویژگی ها به هیچ دردی هم نخورن تعصبی روشون ندارم. در ادامه باید ببینیم چی پیش میاد.
در مقاله بعدی تحلیل اکتشافی خودم از این مجموعه داده رو هم منتشر خواهم کرد.
در اخر ممنون میشم از همه کسانی که اگر مایل بودن از این دیتاست استفاده کنند، یه جوری به بنده هم اطلاع بدن تا نتایج کارها و تحلیل هاشون رو با کمال میل و مشتاقانه مطالعه کنم. من در تلگرام و توییتر با آیدی arshin1989 در دسترس هستم.